From 16cc0007ed4233d069997b5ee8b0441aa3384bd7 Mon Sep 17 00:00:00 2001 From: Matthias Bisping Date: Tue, 10 Jan 2023 11:30:36 +0100 Subject: [PATCH] Refactoring --- cv_analysis/utils/merging.py | 44 ++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 24 deletions(-) diff --git a/cv_analysis/utils/merging.py b/cv_analysis/utils/merging.py index d9c5067..6ddd622 100644 --- a/cv_analysis/utils/merging.py +++ b/cv_analysis/utils/merging.py @@ -2,6 +2,8 @@ from functools import reduce from itertools import combinations from typing import List, Tuple, Set +from funcy import all + from cv_analysis.utils import until, make_merger_sentinel from cv_analysis.utils.rectangle import Rectangle from cv_analysis.utils.spacial import related @@ -18,35 +20,29 @@ def merge_related_rectangles(rectangles: List[Rectangle]) -> List[Rectangle]: def merge_rectangles_once(rectangles: List[Rectangle]) -> List[Rectangle]: """Merges rectangles that are related to each other, but does not iterate on the results.""" - def merge_if_related( - acc: Tuple[Set[Rectangle], Set[Rectangle]], - pair: Tuple[Rectangle, Rectangle], - ) -> Tuple[Set[Rectangle], Set[Rectangle]]: - """Merges two rectangles if they are related, otherwise returns the accumulator unchanged.""" - alpha, beta = pair - merged, used = acc - - def unused(*args) -> bool: - return not used & {*args} - - if unused(alpha) and unused(beta) and related(alpha, beta): - return merged | {bounding_rect(alpha, beta)}, used | {alpha, beta} - - else: - return merged, used - rectangles = set(rectangles) merged, used = reduce(merge_if_related, combinations(rectangles, 2), (set(), set())) return list(merged | rectangles - used) - # for alpha, beta in combinations(rectangles, 2): - # if related(alpha, beta): - # rectangles.remove(alpha) - # rectangles.remove(beta) - # rectangles.append(bounding_rect(alpha, beta)) - # return rectangles - # return rectangles + +T = Tuple[Set[Rectangle], Set[Rectangle]] +V = Tuple[Rectangle, Rectangle] + + +def merge_if_related(acc: T, pair: V) -> T: + """Merges two rectangles if they are related, otherwise returns the accumulator unchanged.""" + alpha, beta = pair + merged, used = acc + + def unused(*args) -> bool: + return not used & {*args} + + if all(unused, (alpha, beta)) and related(alpha, beta): + return merged | {bounding_rect(alpha, beta)}, used | {alpha, beta} + + else: + return merged, used def bounding_rect(alpha: Rectangle, beta: Rectangle) -> Rectangle: