From 6e20ee9feaa491119443c947aae37dd70b140e69 Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Fri, 21 Feb 2025 15:31:19 +0500 Subject: [PATCH] remove_deep2 - also_considered_inverses optimization 1) replaced walk with traverse(max_levels=1) 2) early return if there total_inverses == 0 3) early return if also_considered_inverses is enough to cover total_inverses --- .../ifcopenshell/util/element.py | 22 +++++++++++-------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/src/ifcopenshell-python/ifcopenshell/util/element.py b/src/ifcopenshell-python/ifcopenshell/util/element.py index f3865bdc7e..5e011b525f 100644 --- a/src/ifcopenshell-python/ifcopenshell/util/element.py +++ b/src/ifcopenshell-python/ifcopenshell/util/element.py @@ -1466,18 +1466,22 @@ def remove_deep2( :param element: The starting element that defines the subgraph """ # ifc_file.batch() - also_considered_inverses = 0 + total_inverses = ifc_file.get_total_inverses(element) + if total_inverses > 0: - def increment_considered_inverses(_): - nonlocal also_considered_inverses - also_considered_inverses += 1 + def are_inverses_contained() -> bool: + also_considered_inverses = 0 - for considered_element in also_consider: - for attribute in considered_element: - considered_element.walk(lambda x: x == element, increment_considered_inverses, attribute) + for considered_element in also_consider: + traverse = ifc_file.traverse(considered_element, max_levels=1) + if element in traverse: + also_considered_inverses += 1 + if total_inverses == also_considered_inverses: + return True + return False - if ifc_file.get_total_inverses(element) > 0 + also_considered_inverses: - return + if not are_inverses_contained(): + return to_delete = set() subgraph = list(ifc_file.traverse(element, breadth_first=True))