Commit a55332e0 by Josh Guice

fix(solver): skip already "seen" PackageNodes

sharply decreases slowness :)
parent 38949f82
...@@ -263,7 +263,7 @@ class Solver: ...@@ -263,7 +263,7 @@ class Solver:
# NOTE passing explicit empty array for seen to reset between invocations during update + install cycle # NOTE passing explicit empty array for seen to reset between invocations during update + install cycle
results = dict( results = dict(
depth_first_search( 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): ...@@ -374,6 +374,7 @@ class PackageNode(DFSNode):
self, self,
package: Package, package: Package,
packages: List[Package], packages: List[Package],
seen: List[Package],
previous: Optional["PackageNode"] = None, previous: Optional["PackageNode"] = None,
previous_dep: Optional[ previous_dep: Optional[
Union[ Union[
...@@ -393,10 +394,10 @@ class PackageNode(DFSNode): ...@@ -393,10 +394,10 @@ class PackageNode(DFSNode):
"Dependency", "Dependency",
] ]
] = None, ] = None,
seen: seen,
) -> None: ) -> None:
self.package = package self.package = package
self.packages = packages self.packages = packages
self.seen = seen
self.previous = previous self.previous = previous
self.previous_dep = previous_dep self.previous_dep = previous_dep
...@@ -420,10 +421,10 @@ class PackageNode(DFSNode): ...@@ -420,10 +421,10 @@ class PackageNode(DFSNode):
children: List[PackageNode] = [] children: List[PackageNode] = []
# skip already traversed packages # skip already traversed packages
if self.package in seen: if self.package in self.seen:
return [] return []
else: else:
seen.append(self.package) self.seen.append(self.package)
if ( if (
...@@ -462,10 +463,10 @@ class PackageNode(DFSNode): ...@@ -462,10 +463,10 @@ class PackageNode(DFSNode):
PackageNode( PackageNode(
pkg, pkg,
self.packages, self.packages,
self.seen,
self, self,
dependency, dependency,
self.dep or dependency, self.dep or dependency,
seen
) )
) )
......
...@@ -815,21 +815,21 @@ def test_solver_with_dependency_in_both_main_and_dev_dependencies( ...@@ -815,21 +815,21 @@ def test_solver_with_dependency_in_both_main_and_dev_dependencies(
check_solver_result( check_solver_result(
ops, ops,
[ [
{"job": "install", "package": package_d},
{"job": "install", "package": package_b}, {"job": "install", "package": package_b},
{"job": "install", "package": package_a},
{"job": "install", "package": package_c}, {"job": "install", "package": package_c},
{"job": "install", "package": package_d}, {"job": "install", "package": package_a},
], ],
) )
b = ops[0].package d = ops[0].package
a = ops[1].package b = ops[1].package
c = ops[2].package c = ops[2].package
d = ops[3].package a = ops[3].package
assert d.category == "dev" assert d.category == "dev"
assert c.category == "dev"
assert b.category == "main" assert b.category == "main"
assert c.category == "dev"
assert a.category == "main" assert a.category == "main"
...@@ -872,24 +872,24 @@ def test_solver_with_dependency_in_both_main_and_dev_dependencies_with_one_more_ ...@@ -872,24 +872,24 @@ def test_solver_with_dependency_in_both_main_and_dev_dependencies_with_one_more_
check_solver_result( check_solver_result(
ops, ops,
[ [
{"job": "install", "package": package_a},
{"job": "install", "package": package_b}, {"job": "install", "package": package_b},
{"job": "install", "package": package_c},
{"job": "install", "package": package_d}, {"job": "install", "package": package_d},
{"job": "install", "package": package_a},
{"job": "install", "package": package_c},
{"job": "install", "package": package_e}, {"job": "install", "package": package_e},
], ],
) )
a = ops[0].package b = ops[0].package
b = ops[1].package d = ops[1].package
c = ops[2].package a = ops[2].package
d = ops[3].package c = ops[3].package
e = ops[4].package e = ops[4].package
assert d.category == "dev"
assert c.category == "dev"
assert b.category == "main" assert b.category == "main"
assert d.category == "dev"
assert a.category == "main" assert a.category == "main"
assert c.category == "dev"
assert e.category == "main" 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