]>
Commit | Line | Data |
---|---|---|
54a0048b SL |
1 | #!/bin/sh |
2 | # | |
3 | # Generate a discrete lookup table for a sigmoid function in the smoothstep | |
4 | # family (https://en.wikipedia.org/wiki/Smoothstep), where the lookup table | |
5 | # entries correspond to x in [1/nsteps, 2/nsteps, ..., nsteps/nsteps]. Encode | |
6 | # the entries using a binary fixed point representation. | |
7 | # | |
8 | # Usage: smoothstep.sh <variant> <nsteps> <bfp> <xprec> <yprec> | |
9 | # | |
10 | # <variant> is in {smooth, smoother, smoothest}. | |
11 | # <nsteps> must be greater than zero. | |
12 | # <bfp> must be in [0..62]; reasonable values are roughly [10..30]. | |
13 | # <xprec> is x decimal precision. | |
14 | # <yprec> is y decimal precision. | |
15 | ||
16 | #set -x | |
17 | ||
18 | cmd="sh smoothstep.sh $*" | |
19 | variant=$1 | |
20 | nsteps=$2 | |
21 | bfp=$3 | |
22 | xprec=$4 | |
23 | yprec=$5 | |
24 | ||
25 | case "${variant}" in | |
26 | smooth) | |
27 | ;; | |
28 | smoother) | |
29 | ;; | |
30 | smoothest) | |
31 | ;; | |
32 | *) | |
33 | echo "Unsupported variant" | |
34 | exit 1 | |
35 | ;; | |
36 | esac | |
37 | ||
38 | smooth() { | |
39 | step=$1 | |
40 | y=`echo ${yprec} k ${step} ${nsteps} / sx _2 lx 3 ^ '*' 3 lx 2 ^ '*' + p | dc | tr -d '\\\\\n' | sed -e 's#^\.#0.#g'` | |
41 | h=`echo ${yprec} k 2 ${bfp} ^ ${y} '*' p | dc | tr -d '\\\\\n' | sed -e 's#^\.#0.#g' | tr '.' ' ' | awk '{print $1}' ` | |
42 | } | |
43 | ||
44 | smoother() { | |
45 | step=$1 | |
46 | y=`echo ${yprec} k ${step} ${nsteps} / sx 6 lx 5 ^ '*' _15 lx 4 ^ '*' + 10 lx 3 ^ '*' + p | dc | tr -d '\\\\\n' | sed -e 's#^\.#0.#g'` | |
47 | h=`echo ${yprec} k 2 ${bfp} ^ ${y} '*' p | dc | tr -d '\\\\\n' | sed -e 's#^\.#0.#g' | tr '.' ' ' | awk '{print $1}' ` | |
48 | } | |
49 | ||
50 | smoothest() { | |
51 | step=$1 | |
52 | y=`echo ${yprec} k ${step} ${nsteps} / sx _20 lx 7 ^ '*' 70 lx 6 ^ '*' + _84 lx 5 ^ '*' + 35 lx 4 ^ '*' + p | dc | tr -d '\\\\\n' | sed -e 's#^\.#0.#g'` | |
53 | h=`echo ${yprec} k 2 ${bfp} ^ ${y} '*' p | dc | tr -d '\\\\\n' | sed -e 's#^\.#0.#g' | tr '.' ' ' | awk '{print $1}' ` | |
54 | } | |
55 | ||
56 | cat <<EOF | |
57 | /* | |
58 | * This file was generated by the following command: | |
59 | * $cmd | |
60 | */ | |
61 | /******************************************************************************/ | |
62 | #ifdef JEMALLOC_H_TYPES | |
63 | ||
64 | /* | |
65 | * This header defines a precomputed table based on the smoothstep family of | |
66 | * sigmoidal curves (https://en.wikipedia.org/wiki/Smoothstep) that grow from 0 | |
67 | * to 1 in 0 <= x <= 1. The table is stored as integer fixed point values so | |
68 | * that floating point math can be avoided. | |
69 | * | |
70 | * 3 2 | |
71 | * smoothstep(x) = -2x + 3x | |
72 | * | |
73 | * 5 4 3 | |
74 | * smootherstep(x) = 6x - 15x + 10x | |
75 | * | |
76 | * 7 6 5 4 | |
77 | * smootheststep(x) = -20x + 70x - 84x + 35x | |
78 | */ | |
79 | ||
80 | #define SMOOTHSTEP_VARIANT "${variant}" | |
81 | #define SMOOTHSTEP_NSTEPS ${nsteps} | |
82 | #define SMOOTHSTEP_BFP ${bfp} | |
83 | #define SMOOTHSTEP \\ | |
84 | /* STEP(step, h, x, y) */ \\ | |
85 | EOF | |
86 | ||
87 | s=1 | |
88 | while [ $s -le $nsteps ] ; do | |
89 | $variant ${s} | |
90 | x=`echo ${xprec} k ${s} ${nsteps} / p | dc | tr -d '\\\\\n' | sed -e 's#^\.#0.#g'` | |
91 | printf ' STEP(%4d, UINT64_C(0x%016x), %s, %s) \\\n' ${s} ${h} ${x} ${y} | |
92 | ||
93 | s=$((s+1)) | |
94 | done | |
95 | echo | |
96 | ||
97 | cat <<EOF | |
98 | #endif /* JEMALLOC_H_TYPES */ | |
99 | /******************************************************************************/ | |
100 | #ifdef JEMALLOC_H_STRUCTS | |
101 | ||
102 | ||
103 | #endif /* JEMALLOC_H_STRUCTS */ | |
104 | /******************************************************************************/ | |
105 | #ifdef JEMALLOC_H_EXTERNS | |
106 | ||
107 | ||
108 | #endif /* JEMALLOC_H_EXTERNS */ | |
109 | /******************************************************************************/ | |
110 | #ifdef JEMALLOC_H_INLINES | |
111 | ||
112 | ||
113 | #endif /* JEMALLOC_H_INLINES */ | |
114 | /******************************************************************************/ | |
115 | EOF |