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 116