@@ -375,6 +375,7 @@ def compare_events(event1, event2):
375
375
else : # at the same time, but different tracks => any order is fine
376
376
return 1
377
377
events .sort (key = cmp_to_key (compare_events ))
378
+ event_count = len (events )
378
379
379
380
# The result will be a list of intervals produced by
380
381
# interval_constructor.
@@ -389,15 +390,6 @@ def add_segment(start, end, original_intervals):
389
390
result .append (interval )
390
391
previous_end = end
391
392
392
- def no_gap_between_points_in_time (end_time , start_time ):
393
- # Since points in time for intervals are quantized to whole
394
- # seconds and intervals are closed (inclusive) for both start
395
- # and end points, two adjacent intervals like
396
- # [START_TIME1, 10:59:59] [11:00:00, END_TIME2]
397
- # have no gap between them and can be considered a single
398
- # continuous interval [START_TIME1, END_TIME2].
399
- return (end_time == start_time ) or (end_time == start_time - 1 )
400
-
401
393
def is_same_result (active_intervals1 , active_intervals2 ):
402
394
# When we have to decide whether to extend a result interval
403
395
# or start a new one, we compare the state for the existing
@@ -408,28 +400,34 @@ def is_same_result(active_intervals1, active_intervals2):
408
400
== interval_constructor (0 ,0 ,active_intervals2 ))
409
401
410
402
active_intervals = [None ] * track_count
411
- def process_event_for_point_in_time (index , point_time ):
412
- nonlocal active_intervals
403
+ def process_events_for_point_in_time (index , point_time ):
413
404
high_time = point_time
414
405
any_open = False
415
- for i in range (index , len ( events ) ):
406
+ for i in range (index , event_count ):
416
407
time , open_ , interval , track = events [i ]
417
- if no_gap_between_points_in_time (point_time , time ):
418
- high_time = max (high_time , time )
408
+ # Since points in time for intervals are quantized to whole
409
+ # seconds and intervals are closed (inclusive) for both start
410
+ # and end points, two adjacent intervals like
411
+ # [START_TIME1, 10:59:59] [11:00:00, END_TIME2]
412
+ # have no gap between them and can be considered a single
413
+ # continuous interval [START_TIME1, END_TIME2].
414
+ if (point_time == time ) or (point_time == time - 1 ):
415
+ if time > high_time :
416
+ high_time = time
419
417
any_open |= open_
420
418
else :
421
419
return i , time , active_intervals .copy (), high_time if any_open else high_time + 1
422
420
active_intervals [track ] = interval if open_ else None
423
421
return None , None , None , None
424
422
425
- if not len ( events ) == 0 :
423
+ if not event_count == 0 :
426
424
# Step through event "clusters" with a common point in time and
427
425
# emit result intervals with unchanged interval "payload".
428
426
index , time = 0 , events [0 ][0 ]
429
427
interval_start_time = time
430
- index , time , interval_start_state , high_time = process_event_for_point_in_time (index , time )
428
+ index , time , interval_start_state , high_time = process_events_for_point_in_time (index , time )
431
429
while index :
432
- new_index , new_time , maybe_end_state , high_time = process_event_for_point_in_time (index , time )
430
+ new_index , new_time , maybe_end_state , high_time = process_events_for_point_in_time (index , time )
433
431
# Diagram for this program point:
434
432
# |___potential_result_interval___|| |
435
433
# index new_index
0 commit comments