mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-09-12 14:33:28 +00:00
ifcpatch: use stdlib graphlib for Optimise topological sort (#4399)
The Optimise recipe imported `toposort`, a third-party PyPI package that
is not bundled with Bonsai, so running the recipe there raised
`ModuleNotFoundError: No module named 'toposort'`.
Replace it with the standard library `graphlib.TopologicalSorter`
(available since Python 3.9), which provides the same dependencies-first
ordering guarantee the recipe relies on: forward-referenced instances are
mapped before the instances that reference them. The dependency-graph
dict format ({node: {predecessors}}) is identical between the two, so the
graph construction is unchanged. Drop `toposort` from ifcpatch's
dependencies since it is no longer used.
Verified with toposort NOT installed: the Optimise recipe now runs and
deduplicates correctly (IfcParseExamples_test.ifc 88 -> 63 instances, all
6 products preserved, output reopens cleanly).
Generated with the assistance of an AI coding tool.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -25,18 +25,18 @@ def _toposort(graph: dict[int, set[int]], logger: logging.Logger) -> list[int]:
|
|||||||
"""Flatten a dependency graph of entity ids into dependency order.
|
"""Flatten a dependency graph of entity ids into dependency order.
|
||||||
|
|
||||||
Uses igraph's C-backed topological sort when available, otherwise falls
|
Uses igraph's C-backed topological sort when available, otherwise falls
|
||||||
back to the pure python toposort package with a warning.
|
back to the stdlib graphlib topological sort with a warning.
|
||||||
"""
|
"""
|
||||||
try:
|
try:
|
||||||
import igraph
|
import igraph
|
||||||
except ImportError:
|
except ImportError:
|
||||||
logger.warning(
|
logger.warning(
|
||||||
"igraph is not installed, falling back to the slower pure python toposort. "
|
"igraph is not installed, falling back to the slower stdlib graphlib. "
|
||||||
"Install python-igraph for better performance."
|
"Install python-igraph for better performance."
|
||||||
)
|
)
|
||||||
from toposort import toposort_flatten
|
from graphlib import TopologicalSorter
|
||||||
|
|
||||||
return toposort_flatten(graph)
|
return list(TopologicalSorter(graph).static_order())
|
||||||
|
|
||||||
ids = list(graph)
|
ids = list(graph)
|
||||||
index = {id_: i for i, id_ in enumerate(ids)}
|
index = {id_: i for i, id_ in enumerate(ids)}
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ classifiers = [
|
|||||||
"Programming Language :: Python :: 3",
|
"Programming Language :: Python :: 3",
|
||||||
"License :: OSI Approved :: GNU Lesser General Public License v3 or later (LGPLv3+)",
|
"License :: OSI Approved :: GNU Lesser General Public License v3 or later (LGPLv3+)",
|
||||||
]
|
]
|
||||||
dependencies = ["ifcopenshell", "toposort", "numpy"]
|
dependencies = ["ifcopenshell", "numpy"]
|
||||||
|
|
||||||
[project.optional-dependencies]
|
[project.optional-dependencies]
|
||||||
advanced = [
|
advanced = [
|
||||||
|
|||||||
Reference in New Issue
Block a user