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.overlays_interaction_latency_tuning
							parent
							
								
									4a6339ffc2
								
							
						
					
					
						commit
						5ced05aab0
					
				|  | @ -91,6 +91,14 @@ def ds_m4( | |||
|         x_end = x[-1]  # x end value/highest in domain | ||||
|         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 | ||||
|     # lnx = len(x) | ||||
|     # uppx *= max(4 / (1 + math.log(uppx, 2)), 1) | ||||
|  |  | |||
|  | @ -63,20 +63,27 @@ def xy_downsample( | |||
|     # downsample whenever more then 1 pixels per datum can be shown. | ||||
|     # always refresh data bounds until we get diffing | ||||
|     # working properly, see above.. | ||||
|     bins, x, y, ymn, ymx = ds_m4( | ||||
|     m4_out = ds_m4( | ||||
|         x, | ||||
|         y, | ||||
|         uppx, | ||||
|     ) | ||||
| 
 | ||||
|     # flatten output to 1d arrays suitable for path-graphics generation. | ||||
|     x = np.broadcast_to(x[:, None], y.shape) | ||||
|     x = (x + np.array( | ||||
|         [-x_spacer, 0, 0, x_spacer] | ||||
|     )).flatten() | ||||
|     y = y.flatten() | ||||
|     if m4_out is not None: | ||||
|         bins, x, y, ymn, ymx = m4_out | ||||
|         # flatten output to 1d arrays suitable for path-graphics generation. | ||||
|         x = np.broadcast_to(x[:, None], y.shape) | ||||
|         x = (x + np.array( | ||||
|             [-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( | ||||
|  |  | |||
|  | @ -211,17 +211,19 @@ class Renderer(msgspec.Struct): | |||
| 
 | ||||
|             elif should_ds and uppx > 1: | ||||
| 
 | ||||
|                 x_1d, y_1d, ymn, ymx = xy_downsample( | ||||
|                 ds_out = xy_downsample( | ||||
|                     x_1d, | ||||
|                     y_1d, | ||||
|                     uppx, | ||||
|                 ) | ||||
|                 self.viz.yrange = ymn, ymx | ||||
|                 # print(f'{self.viz.name} post ds: ymn, ymx: {ymn},{ymx}') | ||||
|                 if ds_out is not None: | ||||
|                     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 | ||||
|                 profiler(f'FULL PATH downsample redraw={should_ds}') | ||||
|                 self._in_ds = True | ||||
|                     reset = True | ||||
|                     profiler(f'FULL PATH downsample redraw={should_ds}') | ||||
|                     self._in_ds = True | ||||
| 
 | ||||
|             path = self.draw_path( | ||||
|                 x=x_1d, | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue