ASP-based solver: split heuristic for duplicate nodes (#39593)
The heuristic for duplicate nodes contains a few typos, and apparently slows down the solve for specs that have a lot of sub-optimal choices to be taken. This is likely because with a lot of sub-optimal choices, the low priority, flawed heuristic is being used by clingo. Here I split the heuristic, so complex rules that matter only if we allow multiple nodes from the same package are used only in that case.
This commit is contained in:
		 Massimiliano Culpo
					Massimiliano Culpo
				
			
				
					committed by
					
						 GitHub
						GitHub
					
				
			
			
				
	
			
			
			 GitHub
						GitHub
					
				
			
						parent
						
							7d9fad9576
						
					
				
				
					commit
					e0059ef961
				
			| @@ -808,6 +808,8 @@ def visit(node): | ||||
|         # Load the file itself | ||||
|         self.control.load(os.path.join(parent_dir, "concretize.lp")) | ||||
|         self.control.load(os.path.join(parent_dir, "heuristic.lp")) | ||||
|         if spack.config.CONFIG.get("concretizer:duplicates:strategy", "none") != "none": | ||||
|             self.control.load(os.path.join(parent_dir, "heuristic_separate.lp")) | ||||
|         self.control.load(os.path.join(parent_dir, "os_compatibility.lp")) | ||||
|         self.control.load(os.path.join(parent_dir, "display.lp")) | ||||
|         if not setup.concretize_everything: | ||||
|   | ||||
| @@ -4,7 +4,7 @@ | ||||
| % SPDX-License-Identifier: (Apache-2.0 OR MIT) | ||||
|  | ||||
| %============================================================================= | ||||
| % Heuristic to speed-up solves | ||||
| % Heuristic to speed-up solves (node with ID 0) | ||||
| %============================================================================= | ||||
|  | ||||
|  | ||||
| @@ -27,18 +27,3 @@ | ||||
| % Providers | ||||
| #heuristic attr("node", node(0, Package)) : default_provider_preference(Virtual, Package, 0), possible_in_link_run(Package). [30, true] | ||||
|  | ||||
| % node(ID, _) | ||||
| #heuristic attr("version", node(ID, Package), Version) : pkg_fact(Package, version_declared(Version, ID)), attr("node", node(ID, Package)). [25-5*ID, true] | ||||
| #heuristic version_weight(node(ID, Package), ID) : pkg_fact(Package, version_declared(Version, ID)), attr("node", node(ID, Package)). [25-5*ID, true] | ||||
| #heuristic attr("variant_value", node(ID, Package), Variant, Value) : variant_default_value(Package, Variant, Value), attr("node", node(ID, Package)). [25-5*ID, true] | ||||
| #heuristic attr("node_target", node(ID, Package), Target) : pkg_fact(Package, target_weight(Target, ID)), attr("node", node(ID, Package)). [25-5*ID, true] | ||||
| #heuristic node_target_weight(node(ID, Package), ID) : attr("node", node(ID, Package)). [25-5*ID, true] | ||||
| #heuristic node_compiler(node(ID, Package), CompilerID) : default_compiler_preference(ID, ID), compiler_id(ID), attr("node", node(ID, Package)). [25-5*ID, true] | ||||
|  | ||||
| % node(ID, _), split build dependencies | ||||
| #heuristic attr("version", node(ID, Package), Version) : pkg_fact(Package, version_declared(Version, ID)), attr("node", node(ID, Package)), multiple_unification_sets(Package). [25, true] | ||||
| #heuristic version_weight(node(ID, Package), ID) : pkg_fact(Package, version_declared(Version, ID)), attr("node", node(ID, Package)), multiple_unification_sets(Package). [25, true] | ||||
| #heuristic attr("variant_value", node(ID, Package), Variant, Value) : variant_default_value(Package, Variant, Value), attr("node", node(ID, Package)), multiple_unification_sets(Package). [25, true] | ||||
| #heuristic attr("node_target", node(ID, Package), Target) : pkg_fact(Package, target_weight(Target, ID)), attr("node", node(ID, Package)), multiple_unification_sets(Package). [25, true] | ||||
| #heuristic node_target_weight(node(ID, Package), ID) : attr("node", node(ID, Package)), multiple_unification_sets(Package). [25, true] | ||||
| #heuristic node_compiler(node(ID, Package), CompilerID) : default_compiler_preference(ID, ID), compiler_id(ID), attr("node", node(ID, Package)), multiple_unification_sets(Package). [25, true] | ||||
|   | ||||
							
								
								
									
										24
									
								
								lib/spack/spack/solver/heuristic_separate.lp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								lib/spack/spack/solver/heuristic_separate.lp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,24 @@ | ||||
| % Copyright 2013-2023 Lawrence Livermore National Security, LLC and other | ||||
| % Spack Project Developers. See the top-level COPYRIGHT file for details. | ||||
| % | ||||
| % SPDX-License-Identifier: (Apache-2.0 OR MIT) | ||||
|  | ||||
| %============================================================================= | ||||
| % Heuristic to speed-up solves (node with ID > 0) | ||||
| %============================================================================= | ||||
|  | ||||
| % node(ID, _) | ||||
| #heuristic attr("version", node(ID, Package), Version) : pkg_fact(Package, version_declared(Version, 0)), attr("node", node(ID, Package)), ID > 0. [25-5*ID, true] | ||||
| #heuristic version_weight(node(ID, Package), 0) : pkg_fact(Package, version_declared(Version, 0)), attr("node", node(ID, Package)), ID > 0. [25-5*ID, true] | ||||
| #heuristic attr("variant_value", node(ID, Package), Variant, Value) : variant_default_value(Package, Variant, Value), attr("node", node(ID, Package)), ID > 0. [25-5*ID, true] | ||||
| #heuristic attr("node_target", node(ID, Package), Target) : pkg_fact(Package, target_weight(Target, 0)), attr("node", node(ID, Package)), ID > 0. [25-5*ID, true] | ||||
| #heuristic node_target_weight(node(ID, Package), 0) : attr("node", node(ID, Package)), ID > 0. [25-5*ID, true] | ||||
| #heuristic node_compiler(node(ID, Package), CompilerID) : default_compiler_preference(CompilerID, 0), compiler_id(CompilerID), attr("node", node(ID, Package)), ID > 0. [25-5*ID, true] | ||||
|  | ||||
| % node(ID, _), split build dependencies | ||||
| #heuristic attr("version", node(ID, Package), Version) : pkg_fact(Package, version_declared(Version, 0)), attr("node", node(ID, Package)), multiple_unification_sets(Package), ID > 0. [25, true] | ||||
| #heuristic version_weight(node(ID, Package), 0) : pkg_fact(Package, version_declared(Version, 0)), attr("node", node(ID, Package)), multiple_unification_sets(Package), ID > 0. [25, true] | ||||
| #heuristic attr("variant_value", node(ID, Package), Variant, Value) : variant_default_value(Package, Variant, Value), attr("node", node(ID, Package)), multiple_unification_sets(Package), ID > 0. [25, true] | ||||
| #heuristic attr("node_target", node(ID, Package), Target) : pkg_fact(Package, target_weight(Target, 0)), attr("node", node(ID, Package)), multiple_unification_sets(Package), ID > 0. [25, true] | ||||
| #heuristic node_target_weight(node(ID, Package), 0) : attr("node", node(ID, Package)), multiple_unification_sets(Package), ID > 0. [25, true] | ||||
| #heuristic node_compiler(node(ID, Package), CompilerID) : default_compiler_preference(CompilerID, 0), compiler_id(CompilerID), attr("node", node(ID, Package)), multiple_unification_sets(Package), ID > 0. [25, true] | ||||
		Reference in New Issue
	
	Block a user