| #!/bin/sh |
| # |
| # Generate a discrete lookup table for a sigmoid function in the smoothstep |
| # family (https://en.wikipedia.org/wiki/Smoothstep), where the lookup table |
| # entries correspond to x in [1/nsteps, 2/nsteps, ..., nsteps/nsteps]. Encode |
| # the entries using a binary fixed point representation. |
| # |
| # Usage: smoothstep.sh <variant> <nsteps> <bfp> <xprec> <yprec> |
| # |
| # <variant> is in {smooth, smoother, smoothest}. |
| # <nsteps> must be greater than zero. |
| # <bfp> must be in [0..62]; reasonable values are roughly [10..30]. |
| # <xprec> is x decimal precision. |
| # <yprec> is y decimal precision. |
| |
| #set -x |
| |
| cmd="sh smoothstep.sh $*" |
| variant=$1 |
| nsteps=$2 |
| bfp=$3 |
| xprec=$4 |
| yprec=$5 |
| |
| case "${variant}" in |
| smooth) |
| ;; |
| smoother) |
| ;; |
| smoothest) |
| ;; |
| *) |
| echo "Unsupported variant" |
| exit 1 |
| ;; |
| esac |
| |
| smooth() { |
| step=$1 |
| y=`echo ${yprec} k ${step} ${nsteps} / sx _2 lx 3 ^ '*' 3 lx 2 ^ '*' + p | dc | tr -d '\\\\\n' | sed -e 's#^\.#0.#g'` |
| h=`echo ${yprec} k 2 ${bfp} ^ ${y} '*' p | dc | tr -d '\\\\\n' | sed -e 's#^\.#0.#g' | tr '.' ' ' | awk '{print $1}' ` |
| } |
| |
| smoother() { |
| step=$1 |
| 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'` |
| h=`echo ${yprec} k 2 ${bfp} ^ ${y} '*' p | dc | tr -d '\\\\\n' | sed -e 's#^\.#0.#g' | tr '.' ' ' | awk '{print $1}' ` |
| } |
| |
| smoothest() { |
| step=$1 |
| 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'` |
| h=`echo ${yprec} k 2 ${bfp} ^ ${y} '*' p | dc | tr -d '\\\\\n' | sed -e 's#^\.#0.#g' | tr '.' ' ' | awk '{print $1}' ` |
| } |
| |
| cat <<EOF |
| /* |
| * This file was generated by the following command: |
| * $cmd |
| */ |
| /******************************************************************************/ |
| #ifdef JEMALLOC_H_TYPES |
| |
| /* |
| * This header defines a precomputed table based on the smoothstep family of |
| * sigmoidal curves (https://en.wikipedia.org/wiki/Smoothstep) that grow from 0 |
| * to 1 in 0 <= x <= 1. The table is stored as integer fixed point values so |
| * that floating point math can be avoided. |
| * |
| * 3 2 |
| * smoothstep(x) = -2x + 3x |
| * |
| * 5 4 3 |
| * smootherstep(x) = 6x - 15x + 10x |
| * |
| * 7 6 5 4 |
| * smootheststep(x) = -20x + 70x - 84x + 35x |
| */ |
| |
| #define SMOOTHSTEP_VARIANT "${variant}" |
| #define SMOOTHSTEP_NSTEPS ${nsteps} |
| #define SMOOTHSTEP_BFP ${bfp} |
| #define SMOOTHSTEP \\ |
| /* STEP(step, h, x, y) */ \\ |
| EOF |
| |
| s=1 |
| while [ $s -le $nsteps ] ; do |
| $variant ${s} |
| x=`echo ${xprec} k ${s} ${nsteps} / p | dc | tr -d '\\\\\n' | sed -e 's#^\.#0.#g'` |
| printf ' STEP(%4d, UINT64_C(0x%016x), %s, %s) \\\n' ${s} ${h} ${x} ${y} |
| |
| s=$((s+1)) |
| done |
| echo |
| |
| cat <<EOF |
| #endif /* JEMALLOC_H_TYPES */ |
| /******************************************************************************/ |
| #ifdef JEMALLOC_H_STRUCTS |
| |
| |
| #endif /* JEMALLOC_H_STRUCTS */ |
| /******************************************************************************/ |
| #ifdef JEMALLOC_H_EXTERNS |
| |
| |
| #endif /* JEMALLOC_H_EXTERNS */ |
| /******************************************************************************/ |
| #ifdef JEMALLOC_H_INLINES |
| |
| |
| #endif /* JEMALLOC_H_INLINES */ |
| /******************************************************************************/ |
| EOF |