#! /bin/bash -e
# Last edited on 2025-08-31 22:34:53 by stolfi

parms="vlo = 2.0; vhi = 5.0; cmin = 1.5; clo = 4.0; chi = 8.0; cmax = 10.0"

python3 <<EOF > .test
import sys
def err(v): 
  sys.stderr.write(f" {v}\n")
  return
def main():
  import sys
  from vms_linear_gray_image_funcs import map_value_squashed as vmap
  ${parms}
  # Basic tests:
  ct = vmap(vlo-0.5, vlo, vhi, clo, chi, cmin, cmax); err(ct); assert cmin < ct and ct < clo 
  ct = vmap(vlo , vlo, vhi, clo, chi, cmin, cmax); err(ct); assert abs(ct - clo) < 1.0e-5
  ct = vmap((2*vlo+vhi)/3 , vlo, vhi, clo, chi, cmin, cmax); err(ct); assert abs(ct - (2*clo + chi)/3) < 1.0e-5
  ct = vmap(vhi , vlo, vhi, clo, chi, cmin, cmax); err(ct); assert abs(ct - chi) < 1.0e-5
  ct = vmap(vhi+0.5 , vlo, vhi, clo, chi, cmin, cmax); err(ct); assert chi < ct and ct < cmax
  # Plot ranges:
  plo = vlo - 0.5*(vhi - vlo); phi = vhi + 0.5*(vhi - vlo);
  N = 200
  eps = 0.00001
  for k in range(N+1):
    fr = k/N
    val = plo + fr*(phi - plo)
    res0 = vmap(val-eps, vlo, vhi, clo, chi, cmin, cmax)
    res1 = vmap(val+eps, vlo, vhi, clo, chi, cmin, cmax)
    res = (res0 + res1)/2
    der = (res1 - res0)/(2*eps)
    sys.stdout.write(f"{val:10.6f} {res:10.6f} {der:10.7f}\n");
  sys.stdout.flush()
  resa = vmap(vlo-eps, vlo, vhi, clo, chi, cmin, cmax)
  sys.stderr.write(f"resa = {resa:10.6f}\n")
  return 0
main()
EOF

gnuplot <<EOF
  set term X11 size 800,400
  ${parms}
  debugr = 0
  if (debugr) {
    cmin = -1.0 - 2*(clo - cmin)/(chi - clo); 
    cmax = +1.0 + 2*(cmax - chi)/(chi - clo); 
    clo = -1.0; chi = +1.0;
  }
  set yrange [(cmin-4):(cmax+4)]
  set xtics add ( "vlo" (vlo) 0, "vhi" (vhi) 0 )
  set ytics add ( "cmin" (cmin) 0, "clo" (clo) 0, "chi" (chi) 0, "cmax" (cmax) 0 )
  set grid xtics lt 1
  set grid ytics lt 1
  plot \
    ".test" using 1:2 title "map" with lines lw 2 lc rgb '#008800', \
    ".test" using 1:3 title "d(map)" with lines lw 2 lc rgb '#ff0000'
  pause mouse
EOF
 
