#! /usr/bin/python3
# Last edited on 2019-08-26 02:13:30 by jstolfi

import math

def quantize(fval, maxval, isMask):
  assert type(maxval) is int and maxval >= 1
  if fval == None or math.isnan(fval):
    return None
  elif fval <= 0.0:
    return 0
  elif fval >= 1.0:
    return maxval
  elif maxval == 1:
    # Binary thresholding:
    return (0 if fval < 0.5 else 1)
  elif isMask:
    # Map {fval} to interval {[ival-1,ival]/(maxval-1)}, indexed from 1:
    sval = fval*(maxval-1)
    if fval < 0.5:
      # Round ties down:
      ival = int(math.ceil(sval))
    else:
      # Round ties up:
      ival = int(math.floor(sval))+1
    assert ival > 0 and ival < maxval
    return ival
  else:
    # Map {fval} to interval {[ival,ival+1]/(maxval+1)}, indexed from 0:
    ival = int(math.floor(fval*(maxval + 1)))
    # Should not happen, but...:
    if ival >= maxval: ival = maxval
    return ival
  # ----------------------------------------------------------------------

def floatize(ival, maxval, isMask):
  assert type(maxval) is int and maxval >= 1
  if ival == None:
    return math.nan
  elif isMask:
    if ival <= 0:
      return 0.0
    elif ival >= maxval:
      return 1.0
    else:
      # Convert to {[0_1]} scale assuming {ival} means {[ival-1,ival]/(maxval-1)}
      fval = (ival - 0.5)/(maxval - 1)
      return fval
  else:
    # Convert to {[0_1]} scale assuming {ival} means {[ival,ival+1]/(maxval+1)}:
    fval = (ival + 0.5)/(maxval + 1.0);
    return fval
  # ----------------------------------------------------------------------

