Commit a55332e0 by Josh Guice

fix(solver): skip already "seen" PackageNodes

sharply decreases slowness :)
parent 38949f82
......@@ -263,7 +263,7 @@ class Solver:
# NOTE passing explicit empty array for seen to reset between invocations during update + install cycle
results = dict(
depth_first_search(
PackageNode(self._package, packages), aggregate_package_nodes, seen=[]
PackageNode(self._package, packages, seen=[]), aggregate_package_nodes
)
)
......@@ -374,6 +374,7 @@ class PackageNode(DFSNode):
self,
package: Package,
packages: List[Package],
seen: List[Package],
previous: Optional["PackageNode"] = None,
previous_dep: Optional[
Union[
......@@ -393,10 +394,10 @@ class PackageNode(DFSNode):
"Dependency",
]
] = None,
seen: seen,
) -> None:
self.package = package
self.packages = packages
self.seen = seen
self.previous = previous
self.previous_dep = previous_dep
......@@ -420,10 +421,10 @@ class PackageNode(DFSNode):
children: List[PackageNode] = []
# skip already traversed packages
if self.package in seen:
if self.package in self.seen:
return []
else:
seen.append(self.package)
self.seen.append(self.package)
if (
......@@ -462,10 +463,10 @@ class PackageNode(DFSNode):
PackageNode(
pkg,
self.packages,
self.seen,
self,
dependency,
self.dep or dependency,
seen
)
)
......
......@@ -815,21 +815,21 @@ def test_solver_with_dependency_in_both_main_and_dev_dependencies(
check_solver_result(
ops,
[
{"job": "install", "package": package_d},
{"job": "install", "package": package_b},
{"job": "install", "package": package_a},
{"job": "install", "package": package_c},
{"job": "install", "package": package_d},
{"job": "install", "package": package_a},
],
)
b = ops[0].package
a = ops[1].package
d = ops[0].package
b = ops[1].package
c = ops[2].package
d = ops[3].package
a = ops[3].package
assert d.category == "dev"
assert c.category == "dev"
assert b.category == "main"
assert c.category == "dev"
assert a.category == "main"
......@@ -872,24 +872,24 @@ def test_solver_with_dependency_in_both_main_and_dev_dependencies_with_one_more_
check_solver_result(
ops,
[
{"job": "install", "package": package_a},
{"job": "install", "package": package_b},
{"job": "install", "package": package_c},
{"job": "install", "package": package_d},
{"job": "install", "package": package_a},
{"job": "install", "package": package_c},
{"job": "install", "package": package_e},
],
)
a = ops[0].package
b = ops[1].package
c = ops[2].package
d = ops[3].package
b = ops[0].package
d = ops[1].package
a = ops[2].package
c = ops[3].package
e = ops[4].package
assert d.category == "dev"
assert c.category == "dev"
assert b.category == "main"
assert d.category == "dev"
assert a.category == "main"
assert c.category == "dev"
assert e.category == "main"
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment