Hipshot, use uppx to drive theoretical px w

pre_flow
Tyler Goodlet 2022-04-05 14:54:13 -04:00
parent 621cbdd015
commit 88ba1765ba
1 changed files with 36 additions and 8 deletions

View File

@ -181,6 +181,7 @@ def ds_m4(
# in display-device-local pixel units. # in display-device-local pixel units.
px_width: int, px_width: int,
uppx: Optional[float] = None, uppx: Optional[float] = None,
xrange: Optional[float] = None,
log_scale: bool = True, log_scale: bool = True,
) -> tuple[int, np.ndarray, np.ndarray]: ) -> tuple[int, np.ndarray, np.ndarray]:
@ -212,6 +213,7 @@ def ds_m4(
# as the units-per-px (uppx) get's large. # as the units-per-px (uppx) get's large.
if log_scale: if log_scale:
assert uppx, 'You must provide a `uppx` value to use log scaling!' assert uppx, 'You must provide a `uppx` value to use log scaling!'
# uppx = uppx * math.log(uppx, 2)
# scaler = 2**7 / (1 + math.log(uppx, 2)) # scaler = 2**7 / (1 + math.log(uppx, 2))
scaler = round( scaler = round(
@ -223,37 +225,63 @@ def ds_m4(
1 1
) )
) )
px_width *= scaler # px_width *= scaler
# else:
# px_width *= 16
assert px_width > 1 # width of screen in pxs? assert px_width > 1 # width of screen in pxs?
assert uppx > 0
# NOTE: if we didn't pre-slice the data to downsample # NOTE: if we didn't pre-slice the data to downsample
# you could in theory pass these as the slicing params, # you could in theory pass these as the slicing params,
# do we care though since we can always just pre-slice the # do we care though since we can always just pre-slice the
# input? # input?
x_start = x[0] # x value start/lowest in domain x_start = x[0] # x value start/lowest in domain
if xrange is None:
x_end = x[-1] # x end value/highest in domain x_end = x[-1] # x end value/highest in domain
xrange = (x_end - x_start)
# XXX: always round up on the input pixels # XXX: always round up on the input pixels
px_width = math.ceil(px_width) # lnx = len(x)
# uppx *= max(4 / (1 + math.log(uppx, 2)), 1)
x_range = x_end - x_start pxw = math.ceil(xrange / uppx)
px_width = math.ceil(px_width)
# ratio of indexed x-value to width of raster in pixels. # ratio of indexed x-value to width of raster in pixels.
# this is more or less, uppx: units-per-pixel. # this is more or less, uppx: units-per-pixel.
w = x_range / float(px_width) # w = xrange / float(px_width)
# uppx = uppx * math.log(uppx, 2)
w2 = px_width / uppx
# scale up the width as the uppx get's large
w = uppx# * math.log(uppx, 666)
# ensure we make more then enough # ensure we make more then enough
# frames (windows) for the output pixel # frames (windows) for the output pixel
frames = px_width frames = pxw
# if we have more and then exact integer's # if we have more and then exact integer's
# (uniform quotient output) worth of datum-domain-points # (uniform quotient output) worth of datum-domain-points
# per windows-frame, add one more window to ensure # per windows-frame, add one more window to ensure
# we have room for all output down-samples. # we have room for all output down-samples.
pts_per_pixel, r = divmod(len(x), frames) pts_per_pixel, r = divmod(xrange, frames)
if r: if r:
while r:
frames += 1 frames += 1
pts_per_pixel, r = divmod(xrange, frames)
print(
f'uppx: {uppx}\n'
f'xrange: {xrange}\n'
f'px_width: {px_width}\n'
f'pxw: {pxw}\n'
f'WTF w:{w}, w2:{w2}\n'
f'frames: {frames}\n'
)
assert frames >= (xrange / uppx)
# call into ``numba`` # call into ``numba``
nb, i_win, y_out = _m4( nb, i_win, y_out = _m4(