Breakpoint bad (-ve or too large) x-ranges to m4

This should never really happen but when it does it appears to be a race
with writing startup pre-graphics-formatter array data where we get
`x_end` epoch value subtracting some really small offset value (like
`-/+0.5`) or the opposite where the `x_start` is epoch and `x_end` is
small.

This adds a warning msg and `breakpoint()` as well as guards around the
entire code downsampling code path so that when resumed the downsampling
cycle should just be skipped and avoid a crash.
multichartz
Tyler Goodlet 2023-01-12 16:03:19 -05:00
parent e1e52e9130
commit 36f1edead0
3 changed files with 31 additions and 14 deletions

View File

@ -91,6 +91,14 @@ def ds_m4(
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) xrange = (x_end - x_start)
if xrange < 0:
log.error(f'-VE M4 X-RANGE: {x_start} -> {x_end}')
# XXX: broken x-range calc-case, likely the x-end points
# are wrong and have some default value set (such as
# x_end -> <some epoch float> while x_start -> 0.5).
breakpoint()
return None
# XXX: always round up on the input pixels # XXX: always round up on the input pixels
# lnx = len(x) # lnx = len(x)
# uppx *= max(4 / (1 + math.log(uppx, 2)), 1) # uppx *= max(4 / (1 + math.log(uppx, 2)), 1)

View File

@ -63,20 +63,27 @@ def xy_downsample(
# downsample whenever more then 1 pixels per datum can be shown. # downsample whenever more then 1 pixels per datum can be shown.
# always refresh data bounds until we get diffing # always refresh data bounds until we get diffing
# working properly, see above.. # working properly, see above..
bins, x, y, ymn, ymx = ds_m4( m4_out = ds_m4(
x, x,
y, y,
uppx, uppx,
) )
# flatten output to 1d arrays suitable for path-graphics generation. if m4_out is not None:
x = np.broadcast_to(x[:, None], y.shape) bins, x, y, ymn, ymx = m4_out
x = (x + np.array( # flatten output to 1d arrays suitable for path-graphics generation.
[-x_spacer, 0, 0, x_spacer] x = np.broadcast_to(x[:, None], y.shape)
)).flatten() x = (x + np.array(
y = y.flatten() [-x_spacer, 0, 0, x_spacer]
)).flatten()
y = y.flatten()
return x, y, ymn, ymx return x, y, ymn, ymx
# XXX: we accept a None output for the case where the input range
# to ``ds_m4()`` is bad (-ve) and we want to catch and debug
# that (seemingly super rare) circumstance..
return None
@njit( @njit(

View File

@ -211,17 +211,19 @@ class Renderer(msgspec.Struct):
elif should_ds and uppx > 1: elif should_ds and uppx > 1:
x_1d, y_1d, ymn, ymx = xy_downsample( ds_out = xy_downsample(
x_1d, x_1d,
y_1d, y_1d,
uppx, uppx,
) )
self.viz.yrange = ymn, ymx if ds_out is not None:
# print(f'{self.viz.name} post ds: ymn, ymx: {ymn},{ymx}') x_1d, y_1d, ymn, ymx = ds_out
self.viz.yrange = ymn, ymx
# print(f'{self.viz.name} post ds: ymn, ymx: {ymn},{ymx}')
reset = True reset = True
profiler(f'FULL PATH downsample redraw={should_ds}') profiler(f'FULL PATH downsample redraw={should_ds}')
self._in_ds = True self._in_ds = True
path = self.draw_path( path = self.draw_path(
x=x_1d, x=x_1d,