Handle last-in-view time slicing edge case

Whenever the last datum is in view `slice_from_time()` need to always
spec the final array index (i.e. the len - 1 value we set as
`read_i_max`) to avoid a uniform-step arithmetic error where gaps in the
underlying time series causes an index that's too low to be returned.
overlays_interaction_latency_tuning
Tyler Goodlet 2023-01-05 17:05:56 -05:00
parent 12c6d58c2a
commit 7afc9301ac
1 changed files with 26 additions and 10 deletions

View File

@ -17,6 +17,11 @@
Super fast ``QPainterPath`` generation related operator routines. Super fast ``QPainterPath`` generation related operator routines.
""" """
from math import (
ceil,
floor,
)
import numpy as np import numpy as np
from numpy.lib import recfunctions as rfn from numpy.lib import recfunctions as rfn
from numba import ( from numba import (
@ -308,22 +313,32 @@ def slice_from_time(
) )
times = arr['time'] times = arr['time']
t_first = round(times[0]) t_first = floor(times[0])
t_last = ceil(times[-1])
# the greatest index we can return which slices to the
# end of the input array.
read_i_max = arr.shape[0] read_i_max = arr.shape[0]
# TODO: require this is always passed in?
if step is None: if step is None:
step = round(times[-1] - times[-2]) step = round(t_last - times[-2])
if step == 0: if step == 0:
# XXX: HOW TF is this happening?
step = 1 step = 1
# compute (presumed) uniform-time-step index offsets # compute (presumed) uniform-time-step index offsets
i_start_t = round(start_t) i_start_t = floor(start_t)
read_i_start = round(((i_start_t - t_first) // step)) - 1 read_i_start = floor(((i_start_t - t_first) // step)) - 1
i_stop_t = round(stop_t) i_stop_t = ceil(stop_t)
read_i_stop = round((i_stop_t - t_first) // step) + 1
# XXX: edge case -> always set stop index to last in array whenever
# the input stop time is detected to be greater then the equiv time
# stamp at that last entry.
if i_stop_t >= t_last:
read_i_stop = read_i_max
else:
read_i_stop = ceil((i_stop_t - t_first) // step) + 1
# always clip outputs to array support # always clip outputs to array support
# for read start: # for read start:
@ -367,7 +382,7 @@ def slice_from_time(
# up_to_arith_start = index[:read_i_start] # up_to_arith_start = index[:read_i_start]
if ( if (
new_read_i_start < read_i_start new_read_i_start <= read_i_start
): ):
# t_diff = t_iv_start - start_t # t_diff = t_iv_start - start_t
# print( # print(
@ -391,14 +406,15 @@ def slice_from_time(
# ) # )
new_read_i_stop = np.searchsorted( new_read_i_stop = np.searchsorted(
times[read_i_start:], times[read_i_start:],
# times,
i_stop_t, i_stop_t,
side='left', side='left',
) )
if ( if (
new_read_i_stop < read_i_stop new_read_i_stop <= read_i_stop
): ):
read_i_stop = read_i_start + new_read_i_stop read_i_stop = read_i_start + new_read_i_stop + 1
# sanity checks for range size # sanity checks for range size
# samples = (i_stop_t - i_start_t) // step # samples = (i_stop_t - i_start_t) // step