ASP-based solve: minimize compiler mismatches (#23016)
fixes #22718 Instead of trying to maximize the number of matches (preferred behavior), try to minimize the number of mismatches (unwanted behavior).
This commit is contained in:
		 Massimiliano Culpo
					Massimiliano Culpo
				
			
				
					committed by
					
						 GitHub
						GitHub
					
				
			
			
				
	
			
			
			 GitHub
						GitHub
					
				
			
						parent
						
							9a473d6ab3
						
					
				
				
					commit
					3325eff486
				
			| @@ -603,32 +603,19 @@ node_compiler_version(Package, Compiler, Version) :- node_compiler_version_set(P | |||||||
|    not compiler_supports_os(Compiler, Version, OS), |    not compiler_supports_os(Compiler, Version, OS), | ||||||
|    not allow_compiler(Compiler, Version). |    not allow_compiler(Compiler, Version). | ||||||
|  |  | ||||||
| % If the compiler is what was prescribed from command line etc. | % If a package and one of its dependencies don't have the | ||||||
| % or is the same as a root node, there is a version match | % same compiler there's a mismatch. | ||||||
|  | compiler_mismatch(Package, Dependency) | ||||||
| % Compiler prescribed in the root spec |  | ||||||
| node_compiler_version_match_pref(Package, Compiler, V) |  | ||||||
|  :- node_compiler_set(Package, Compiler), |  | ||||||
|     node_compiler_version(Package, Compiler, V), |  | ||||||
|     not external(Package). |  | ||||||
|  |  | ||||||
| % Compiler inherited from a parent node |  | ||||||
| node_compiler_version_match_pref(Dependency, Compiler, V) |  | ||||||
|   :- depends_on(Package, Dependency), |   :- depends_on(Package, Dependency), | ||||||
|     node_compiler_version_match_pref(Package, Compiler, V), |      node_compiler_version(Package, Compiler1, _), | ||||||
|     node_compiler_version(Dependency, Compiler, V), |      node_compiler_version(Dependency, Compiler2, _), | ||||||
|     not node_compiler_set(Dependency, Compiler). |      Compiler1 != Compiler2. | ||||||
|  |  | ||||||
| % Compiler inherited from the root package | compiler_mismatch(Package, Dependency) | ||||||
| node_compiler_version_match_pref(Dependency, Compiler, V) |  | ||||||
|   :- depends_on(Package, Dependency), |   :- depends_on(Package, Dependency), | ||||||
|     node_compiler_version(Package, Compiler, V), root(Package), |      node_compiler_version(Package, Compiler, Version1), | ||||||
|     node_compiler_version(Dependency, Compiler, V), |      node_compiler_version(Dependency, Compiler, Version2), | ||||||
|     not node_compiler_set(Dependency, Compiler). |      Version1 != Version2. | ||||||
|  |  | ||||||
| compiler_version_match(Package, 1) |  | ||||||
|  :- node_compiler_version(Package, Compiler, V), |  | ||||||
|     node_compiler_version_match_pref(Package, Compiler, V). |  | ||||||
|  |  | ||||||
| #defined node_compiler_set/2. | #defined node_compiler_set/2. | ||||||
| #defined node_compiler_version_set/3. | #defined node_compiler_version_set/3. | ||||||
| @@ -772,14 +759,10 @@ opt_criterion(8, "count of non-root multi-valued variants"). | |||||||
|     not root(Package) |     not root(Package) | ||||||
| }. | }. | ||||||
|  |  | ||||||
| % Try to maximize the number of compiler matches in the DAG, | % Try to minimize the number of compiler mismatches in the DAG. | ||||||
| % while minimizing the number of nodes. This is done because | opt_criterion(7, "compiler mismatches"). | ||||||
| % a maximization on the number of matches for compilers is highly |  | ||||||
| % correlated to a preference to have as many nodes as possible |  | ||||||
| opt_criterion(7, "compiler matches + number of nodes"). |  | ||||||
| #minimize{ 0@7 : #true }. | #minimize{ 0@7 : #true }. | ||||||
| #minimize{ 1@7,Package : node(Package) }. | #minimize{ 1@7,Package,Dependency : compiler_mismatch(Package, Dependency) }. | ||||||
| #maximize{ Weight@7,Package : compiler_version_match(Package, Weight) }. |  | ||||||
|  |  | ||||||
| % Choose more recent versions for nodes | % Choose more recent versions for nodes | ||||||
| opt_criterion(6, "version badness"). | opt_criterion(6, "version badness"). | ||||||
|   | |||||||
| @@ -1199,3 +1199,14 @@ def test_os_selection_when_multiple_choices_are_possible( | |||||||
| 
 | 
 | ||||||
|         for node in s.traverse(): |         for node in s.traverse(): | ||||||
|             assert node.satisfies(expected_os) |             assert node.satisfies(expected_os) | ||||||
|  | 
 | ||||||
|  |     @pytest.mark.regression('22718') | ||||||
|  |     @pytest.mark.parametrize('spec_str,expected_compiler', [ | ||||||
|  |         ('mpileaks', '%gcc@4.5.0'), | ||||||
|  |         ('mpileaks ^mpich%clang@3.3', '%clang@3.3') | ||||||
|  |     ]) | ||||||
|  |     def test_compiler_is_unique(self, spec_str, expected_compiler): | ||||||
|  |         s = Spec(spec_str).concretized() | ||||||
|  | 
 | ||||||
|  |         for node in s.traverse(): | ||||||
|  |             assert node.satisfies(expected_compiler) | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user