Skip to content

Commit ddde099

Browse files
committed
refactor: omit empty results in rectangle.find_rectangles
And handle empty inputs slightly better in rectangle_[pc]ython.find_rectangles.
1 parent 160a47b commit ddde099

File tree

3 files changed

+62
-58
lines changed

3 files changed

+62
-58
lines changed

execution_engine/task/process/rectangle.py

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -713,13 +713,15 @@ def find_rectangles(
713713
return {}
714714
else:
715715
keys: Set[int] = set()
716+
result: Dict[int, List[GeneralizedInterval]] = dict()
716717
for track in data:
717718
keys |= track.keys()
718-
return {
719-
key: _impl.find_rectangles(
719+
for key in keys:
720+
key_result = _impl.find_rectangles(
720721
[intervals.get(key, []) for intervals in data],
721722
interval_constructor,
722723
is_same_result=is_same_result,
723724
)
724-
for key in keys
725-
}
725+
if len(key_result) > 0:
726+
result[key] = key_result
727+
return result

execution_engine/task/process/rectangle_cython.pyx

Lines changed: 28 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -385,6 +385,9 @@ def find_rectangles(all_intervals: list[list[AnyInterval]],
385385
for interval in intervals # intervals_to_events(intervals, closing_offset=0)
386386
for (time,event) in [(interval.lower, True), (interval.upper, False)]
387387
]
388+
event_count = len(events)
389+
if event_count == 0:
390+
return []
388391
def compare_events(event1, event2):
389392
if event1[0] < event2[0]: # event1 is earlier
390393
return -1
@@ -398,7 +401,6 @@ def find_rectangles(all_intervals: list[list[AnyInterval]],
398401
else: # at the same time, but different tracks => any order is fine
399402
return 1
400403
events.sort(key = cmp_to_key(compare_events))
401-
event_count = len(events)
402404
active_intervals = [None] * track_count
403405
def process_events_for_point_in_time(index, point_time):
404406
high_time = point_time
@@ -420,32 +422,31 @@ def find_rectangles(all_intervals: list[list[AnyInterval]],
420422
active_intervals[track] = interval if open_ else None
421423
return None, None, None, None
422424
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
449450
result = []
450451
for (start, end, intervals) in result_intervals:
451452
interval = interval_constructor(start, end, intervals)

execution_engine/task/process/rectangle_python.py

Lines changed: 28 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -295,6 +295,9 @@ def find_rectangles(all_intervals: list[list[AnyInterval]],
295295
for interval in intervals # intervals_to_events(intervals, closing_offset=0)
296296
for (time,event) in [(interval.lower, True), (interval.upper, False)]
297297
]
298+
event_count = len(events)
299+
if event_count == 0:
300+
return []
298301
def compare_events(event1, event2):
299302
if event1[0] < event2[0]: # event1 is earlier
300303
return -1
@@ -308,7 +311,6 @@ def compare_events(event1, event2):
308311
else: # at the same time, but different tracks => any order is fine
309312
return 1
310313
events.sort(key = cmp_to_key(compare_events))
311-
event_count = len(events)
312314
active_intervals = [None] * track_count
313315
def process_events_for_point_in_time(index, point_time):
314316
high_time = point_time
@@ -330,32 +332,31 @@ def process_events_for_point_in_time(index, point_time):
330332
active_intervals[track] = interval if open_ else None
331333
return None, None, None, None
332334
result_intervals = []
333-
if not event_count == 0:
334-
# Step through event "clusters" with a common point in time and
335-
# emit result intervals with unchanged interval "payload".
336-
index, time = 0, events[0][0]
337-
interval_start_time = time
338-
index, time, interval_start_state, high_time = process_events_for_point_in_time(index, time)
339-
interval_start_state = interval_start_state.copy() if interval_start_state is not None else None
340-
while index:
341-
new_index, new_time, maybe_end_state, high_time = process_events_for_point_in_time(index, time)
342-
# Diagram for this program point:
343-
# |___potential_result_interval___|| |
344-
# index new_index
345-
# interval_start_time time new_time
346-
# interval_start_state maybe_end_state
347-
# high_time
348-
if (maybe_end_state is None) or (not is_same_result(interval_start_state, maybe_end_state)):
349-
# Add info for one result interval.
350-
if len(result_intervals) > 0:
351-
previous_result = result_intervals[-1]
352-
if previous_result[1] == interval_start_time:
353-
result_intervals[-1] = (previous_result[0], previous_result[1] - 1, previous_result[2])
354-
result_intervals.append((interval_start_time, time, interval_start_state))
355-
# Update interval start info.
356-
interval_start_time = high_time
357-
interval_start_state = maybe_end_state.copy() if maybe_end_state is not None else None
358-
index, time = new_index, new_time
335+
# Step through event "clusters" with a common point in time and
336+
# emit result intervals with unchanged interval "payload".
337+
index, time = 0, events[0][0]
338+
interval_start_time = time
339+
index, time, interval_start_state, high_time = process_events_for_point_in_time(index, time)
340+
interval_start_state = interval_start_state.copy() if interval_start_state is not None else None
341+
while index:
342+
new_index, new_time, maybe_end_state, high_time = process_events_for_point_in_time(index, time)
343+
# Diagram for this program point:
344+
# |___potential_result_interval___|| |
345+
# index new_index
346+
# interval_start_time time new_time
347+
# interval_start_state maybe_end_state
348+
# high_time
349+
if (maybe_end_state is None) or (not is_same_result(interval_start_state, maybe_end_state)):
350+
# Add info for one result interval.
351+
if len(result_intervals) > 0:
352+
previous_result = result_intervals[-1]
353+
if previous_result[1] == interval_start_time:
354+
result_intervals[-1] = (previous_result[0], previous_result[1] - 1, previous_result[2])
355+
result_intervals.append((interval_start_time, time, interval_start_state))
356+
# Update interval start info.
357+
interval_start_time = high_time
358+
interval_start_state = maybe_end_state.copy() if maybe_end_state is not None else None
359+
index, time = new_index, new_time
359360
result = []
360361
for (start, end, intervals) in result_intervals:
361362
interval = interval_constructor(start, end, intervals)

0 commit comments

Comments
 (0)