@@ -385,6 +385,9 @@ def find_rectangles(all_intervals: list[list[AnyInterval]],
385
385
for interval in intervals # intervals_to_events(intervals, closing_offset=0)
386
386
for (time,event) in [(interval.lower, True), (interval.upper, False)]
387
387
]
388
+ event_count = len(events)
389
+ if event_count == 0:
390
+ return []
388
391
def compare_events(event1, event2):
389
392
if event1[0] < event2[0]: # event1 is earlier
390
393
return -1
@@ -398,7 +401,6 @@ def find_rectangles(all_intervals: list[list[AnyInterval]],
398
401
else: # at the same time, but different tracks => any order is fine
399
402
return 1
400
403
events.sort(key = cmp_to_key(compare_events))
401
- event_count = len(events)
402
404
active_intervals = [None] * track_count
403
405
def process_events_for_point_in_time(index, point_time):
404
406
high_time = point_time
@@ -420,32 +422,31 @@ def find_rectangles(all_intervals: list[list[AnyInterval]],
420
422
active_intervals[track] = interval if open_ else None
421
423
return None, None, None, None
422
424
result_intervals = []
423
- if not event_count == 0:
424
- # Step through event "clusters" with a common point in time and
425
- # emit result intervals with unchanged interval "payload".
426
- index, time = 0, events[0][0]
427
- interval_start_time = time
428
- index, time, interval_start_state, high_time = process_events_for_point_in_time(index, time)
429
- interval_start_state = interval_start_state.copy() if interval_start_state is not None else None
430
- while index:
431
- new_index, new_time, maybe_end_state, high_time = process_events_for_point_in_time(index, time)
432
- # Diagram for this program point:
433
- # |___potential_result_interval___|| |
434
- # index new_index
435
- # interval_start_time time new_time
436
- # interval_start_state maybe_end_state
437
- # high_time
438
- if (maybe_end_state is None) or (not is_same_result(interval_start_state, maybe_end_state)):
439
- # Add info for one result interval.
440
- if len(result_intervals) > 0:
441
- previous_result = result_intervals[-1]
442
- if previous_result[1] == interval_start_time:
443
- result_intervals[-1] = (previous_result[0], previous_result[1] - 1, previous_result[2])
444
- result_intervals.append((interval_start_time, time, interval_start_state))
445
- # Update interval start info.
446
- interval_start_time = high_time
447
- interval_start_state = maybe_end_state.copy() if maybe_end_state is not None else None
448
- index, time = new_index, new_time
425
+ # Step through event "clusters" with a common point in time and
426
+ # emit result intervals with unchanged interval "payload".
427
+ index, time = 0, events[0][0]
428
+ interval_start_time = time
429
+ index, time, interval_start_state, high_time = process_events_for_point_in_time(index, time)
430
+ interval_start_state = interval_start_state.copy() if interval_start_state is not None else None
431
+ while index:
432
+ new_index, new_time, maybe_end_state, high_time = process_events_for_point_in_time(index, time)
433
+ # Diagram for this program point:
434
+ # |___potential_result_interval___|| |
435
+ # index new_index
436
+ # interval_start_time time new_time
437
+ # interval_start_state maybe_end_state
438
+ # high_time
439
+ if (maybe_end_state is None) or (not is_same_result(interval_start_state, maybe_end_state)):
440
+ # Add info for one result interval.
441
+ if len(result_intervals) > 0:
442
+ previous_result = result_intervals[-1]
443
+ if previous_result[1] == interval_start_time:
444
+ result_intervals[-1] = (previous_result[0], previous_result[1] - 1, previous_result[2])
445
+ result_intervals.append((interval_start_time, time, interval_start_state))
446
+ # Update interval start info.
447
+ interval_start_time = high_time
448
+ interval_start_state = maybe_end_state.copy() if maybe_end_state is not None else None
449
+ index, time = new_index, new_time
449
450
result = []
450
451
for (start, end, intervals) in result_intervals:
451
452
interval = interval_constructor(start, end, intervals)
0 commit comments