Home | History | Annotate | Download | only in internal
      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