pax_global_header00006660000000000000000000000064123255261270014517gustar00rootroot0000000000000052 comment=7a75df69ae482768b439a28ab5e237459c6fa263 dep-selector-1.0.3/000077500000000000000000000000001232552612700141065ustar00rootroot00000000000000dep-selector-1.0.3/.gitignore000066400000000000000000000002201232552612700160700ustar00rootroot00000000000000*.o *.gem *.dSym *.log *.bundle *.dylib *.jar tmp save ext/dep_gecode/Makefile *.dsc *.deb *.gz *.changes *.build pkg/* Gemfile.lock *.so *.def dep-selector-1.0.3/.rspec000066400000000000000000000000401232552612700152150ustar00rootroot00000000000000--colour --format documentation dep-selector-1.0.3/.travis.yml000066400000000000000000000002251232552612700162160ustar00rootroot00000000000000rvm: - 1.9.3 - 2.0.0 - 2.1.0 - jruby-19mode script: - bundle exec rake compile - bundle exec rake spec branches: only: - master dep-selector-1.0.3/Gemfile000066400000000000000000000000461232552612700154010ustar00rootroot00000000000000source "https://rubygems.org" gemspec dep-selector-1.0.3/LICENSE000066400000000000000000000251421232552612700151170ustar00rootroot00000000000000 Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright [yyyy] [name of copyright owner] Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. dep-selector-1.0.3/README.md000066400000000000000000000331131232552612700153660ustar00rootroot00000000000000Background ========== The dep_selector gem contains the native Ruby bindings for solving dependency graphs with Gecode. It accepts a representation of packages and their dependencies and finds a binding of packages to versions that satisfies desired constraints. Installation ------------ Install the gem from Rubygems: gem install dep_selector Or add it to your `Gemfile`: ```ruby gem 'dep_selector' ``` Learn by Example ---------------- ```ruby require 'dep_selector' # This example corresponds to the following dependency graph: # A has versions: 1, 2 # B has versions: 1, 2, 3 # C has versions: 1, 2 # D has versions: 1, 2 # A1 -> B=1 (v1 of package A depends on v1 of package B) # A2 -> B>=2, C=1 (v2 of package A depends on B at v2 or greater and v1 of C) # B3 -> D=1 (v3 of package B depends on v1 of package D) # C2 -> D=2 (v2 of package C depends on v2 of package D) include DepSelector # create dependency graph dep_graph = DependencyGraph.new # package A has versions 1 and 2 a = dep_graph.package('A') a1 = a.add_version(Version.new('1.0.0')) a2 = a.add_version(Version.new('2.0.0')) # package B has versions 1, 2, and 3 b = dep_graph.package('B') b1 = b.add_version(Version.new('1.0.0')) b2 = b.add_version(Version.new('2.0.0')) b3 = b.add_version(Version.new('3.0.0')) # package C only has versions 1 and 2 c = dep_graph.package('C') c1 = c.add_version(Version.new('1.0.0')) c2 = c.add_version(Version.new('2.0.0')) # package D only has versions 1 and 2 d = dep_graph.package('D') d1 = d.add_version(Version.new('1.0.0')) d2 = d.add_version(Version.new('2.0.0')) # package A version 1 has a dependency on package B at exactly 1.0.0 # Note: Though we reference the variable b in the Dependency, packages # do not have to be created before being referenced. # DependencyGraph#package looks up the package based on the name or # auto-vivifies it if it doesn't yet exist, so referring to the # variable b or calling dep_graph.package('B') before or after b is # assigned are all equivalent. a1.dependencies << Dependency.new(b, VersionConstraint.new('= 1.0.0')) a1.dependencies << Dependency.new(d, VersionConstraint.new('= 2.0.0')) # package A version 2 has dependencies on package B >= 2.0.0 and C at exactly 1.0.0 a2.dependencies << Dependency.new(b, VersionConstraint.new('>= 2.0.0')) a2.dependencies << Dependency.new(c, VersionConstraint.new('= 1.0.0')) # package B version 3 has a dependency on package D at exactly 1.0.0 b3.dependencies << Dependency.new(d, VersionConstraint.new('= 1.0.0')) # package C version 2 has a dependency on package D at exactly 2.0.0 c2.dependencies << Dependency.new(d, VersionConstraint.new('= 2.0.0')) # create a Selector from the dependency graph selector = Selector.new(dep_graph) # define the solution constraints and find a solution # simple solution: any version of A as long as B is at exactly 1.0.0 solution_constraints_1 = [ SolutionConstraint.new(dep_graph.package('A')), SolutionConstraint.new(dep_graph.package('B'), VersionConstraint.new('= 1.0.0')) ] puts selector.find_solution(solution_constraints_1) ``` This will yield a hash solution: ```ruby { "A" => 1.0.0, "B" => 1.0.0, "D" => 2.0.0 } ``` Or solving the for the following solution constraints: ```ruby # more complex solution, which uses a range constraint (>=) and # demonstrates the assignment of induced transitive dependencies solution_constraints_2 = [ SolutionConstraint.new(dep_graph.package('A')), SolutionConstraint.new(dep_graph.package('B'), VersionConstraint.new('>= 2.1')) ] puts selector.find_solution(solution_constraints_2) ``` yields ```ruby { "A" => 2.0.0, "B" => 3.0.0, "D" => 1.0.0, "C" => 1.0.0 } ``` But not all (dependency graph, solution constraint) systems are satisfiable, so we must return useful error information: ```ruby # When the solution constraints are unsatisfiable, a NoSolutionExists # exception is raised. It identifies what the first solution # constraint that makes the system unsatisfiable is. It also # identifies the package(s) (either direct solution constraints or # induced dependencies) whose constraints caused the # unsatisfiability. The exception's message contains the name of one # of the packages, as well as paths through the dependency graph that # result in constraints on the package to hint at places to debug. unsatisfiable_solution_constraints_1 = [ SolutionConstraint.new(dep_graph.package('B'), VersionConstraint.new('= 3.0.0')), SolutionConstraint.new(dep_graph.package('C'), VersionConstraint.new('= 2.0.0')) ] # Note that package D is identified as the most constrained package # and the paths from from solution constraints to constraints on D are # returned in the message begin selector.find_solution(unsatisfiable_solution_constraints_1) rescue Exceptions::NoSolutionExists => nse puts nse.message end ``` yields ```text Unable to satisfy constraints on package D due to solution constraint (C = 2.0.0). Solution constraints that may result in a constraint on D: [(B = 3.0.0) -> (D = 1.0.0)], [(C = 2.0.0) -> (D = 2.0.0)] ``` Another cause for unsatisfiability is a dependency on a non-existent package: ```ruby # Now, let's create a package, depends_on_nosuch, that has a # dependency on a non-existent package, nosuch, and see that nosuch is # identified as the problematic package. Note that because Package # objects are auto-vivified by DependencyGraph#Package, non-existent # packages are any packages that have no versions. depends_on_nosuch = dep_graph.package('depends_on_nosuch') depends_on_nosuch_v1 = depends_on_nosuch.add_version(Version.new('1.0')) depends_on_nosuch_v1.dependencies << Dependency.new(dep_graph.package('nosuch')) unsatisfiable_solution_constraints_2 = [ SolutionConstraint.new(depends_on_nosuch) ] # Note that package D is identified as the most constrained package # and the paths from from solution constraints to constraints on D are # returned in the message begin selector.find_solution(unsatisfiable_solution_constraints_2) rescue Exceptions::NoSolutionExists => nse puts nse.message end ``` yields ```text Unable to satisfy constraints on package nosuch, which does not exist, due to solution constraint (depends_on_nosuch >= 0.0.0). Solution constraints that may result in a constraint on nosuch: [(depends_on_nosuch = 1.0.0) -> (nosuch >= 0.0.0)] ``` DepSelector also raises an exception if there are invalid solution constraints: ```ruby # Invalid solution constraints are those that reference a non-existent # package, or constrain an extant package to no versions. All invalid # solution constraints are raised in an InvalidSolutionConstraints # exception. invalid_solution_constraints = [ SolutionConstraint.new(dep_graph.package('nosuch')), SolutionConstraint.new(dep_graph.package('nosuch2')), SolutionConstraint.new(dep_graph.package('A'), VersionConstraint.new('>= 10.0.0')), SolutionConstraint.new(dep_graph.package('B'), VersionConstraint.new('>= 50.0.0')) ] begin selector.find_solution(invalid_solution_constraints) rescue Exceptions::InvalidSolutionConstraints => isc puts "non-existent solution constraints: #{isc.non_existent_packages.join(', ')}" puts "solution constraints whose constraints match no versions of the package: #{isc.constrained_to_no_versions.join(', ')}" end ``` yields ```text non-existent solution constraints: (nosuch >= 0.0.0), (nosuch2 >= 0.0.0) solution constraints whose constraints match no versions of the package: (A >= 10.0.0), (B >= 50.0.0) ``` The Model --------- The dep_selector model involves the following constructs: * DependencyGraph, which is populated with Packages * Package, which has a name that is unique within a DependencyGraph and contains a set of PackageVersions * PackageVersion, which has a Version that is unique within its Package and contains a set of Dependencies * Version, which is any object that implements Comparable and abides the hashing contract * The implementation included with the library, DepSelector::Version, implements versions of the form X.Y.Z, where X, Y, and Z are integers and compared numerically instead of lexicographically * Dependency, which has a Package and a VersionConstraint * VersionConstraint, which is any object that responds to include?(version) with whether the specified Version matches the VersionConstraint * The implementation included with the library, DepSelector::VersionConstraint, implements: * `=`: strict equality, e.g., VersionConstraint.new("= 1.0.0") will only match 1.0.0 * `>`: greater than, e.g., VersionConstraint.new("> 1.3.10") will match 1.3.11, 1.4.0, etc. but not 1.3.9 or 1.3.10 * `<`: less than, e.g., VersionConstraint.new("< 1.3.10") will match 1.3.9, 1.2.0, etc. but not 1.3.10 or 1.3.11 * `<=` or `>=`: same as the two above but unioned with equality * `~>`: pessimistic version constraint (described at http://docs.rubygems.org/read/chapter/16#page74) * Selector, which contains a DependencyGraph and exposes a method, find_solution, which takes an array of solution constraints (Package-VersionConstraint pairs) and determines a valid assignment of Packages to Versions More Examples! -------------- Suppose that there are three packages, A, B, and C, and that the notation XY denotes version Y of package X (so A1 means version 1 of package A) and that "A1 -> B=1" means that A1 depends exactly on B1 and that "A2 -> B>=2" means that A2 depends on B>=2. Consider the dependency graph represented as: ```text A has versions: 1, 2 B has versions: 1, 2, 3 C has versions: 1 D has versions: 1 A1 -> B=1 A2 -> B>=2, C=1 B3 -> D=1 ``` Given a series of constraints, we can then select exact versions of packages that satisfy the dependency graph and the constraints. ### Simple For example: [(A), (B=1)] We are searching for a solution where we must have some version A selected and that B must be set to version 1. The only solution is: {A=>1, B=>1} because the constraint on B trivially constrains A to 1. ### Multiple solutions, including induced dependencies With the constraints [(A), (C=1)], we could choose any one of: ```text { A => 1, B => 1, C => 1 } { A => 2, B => 2, C => 1 } { A => 2, B => 3, C => 1, D => 1 } ``` Note that B is not explicitly constrained or required to be bound but is selected anyway--it is an induced dependency of every version of A. Likewise, D does not show up in the solution constraints, but it is an induced, transitive dependency of A2 given B3. In the absence of an objective function (see next section), any one of these solutions will be returned. Objective functions ------------------- Objective functions do not modify what solutions are satisfiable; they merely rank solutions, which necessarily satisfy the constraints, so that the solution with the highest value for an objective function is selected. TODO: example What if a solution does not exist? ---------------------------------- When generating a solution, we first try to solve the entire system of constraints, but it may be the case that there is no assignment of packages to versions that satisfies all the constraints. In this case, we fall back to starting at the dependency graph and adding the solution constraints one at a time until the constraint that makes a solution impossible is determined and returned along with the most constrained variable in order to hint at where the user can look to resolve the incompatibility. For example, given the example dependency graph, if we tried to solve for [(A=1), (B=2)], as in solution_constraints_3, it's not until we add the B=2 constraint that the system becomes unsatisfiable, so we indicate that the unsatisfiability is introduced at that constraint and that B is the most constrained variable (this is a simple system of constraints, but if the most constrained variable were a transitive dependency of the explicitly-defined solution constraints, it would be much less obvious to the user where to look without providing the most constrained variable). The nitty-gritty ---------------- Choosing satisfying versions of packages with backtracking and accounting for the addition and removal of induced transitive dependencies is hard, so we decided to go shopping... for a CSP solver. We re-formulated the dependency graph and the solution constraints as a CSP and off-loaded the hard work to Gecode, a fast, license-friendly solver written in C++. There are a lot of corner cases, and we're doing a lot of modeling under the hood with objective functions to identify problematic packages and to select the latest possible versions, but the basic modeling is as follows: ### Example ```text Back to our original example: Dependency graph: A has versions: 1, 2 B has versions: 1, 2, 3 C has versions: 1 D has versions: 1 A1 -> B=1 A2 -> B>=2, C=1 B3 -> D1 Solution constraints: [(A), (B=1)] This effectively gets transformed into the following boolean expressions: Dependency graph: ( (A=1 ^ B=1) V ~(A=1) ) ^ ( (A=2 ^ B>=2 ^ C=1) V ~(A=2) ) ^ ( (B=3 ^ D=1) V ~(B=3) ) Solution constraints: ( A=1 V A=2 ) ^ ( B=1 ) ``` License & Authors ----------------- - Author: Dan Deleo () - Author: Chris Walters () ```text Copyright 2014 Chef Software, Inc Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. ``` dep-selector-1.0.3/Rakefile000066400000000000000000000032021232552612700155500ustar00rootroot00000000000000# # Author:: Christopher Walters () # Author:: Mark Anderson () # Copyright:: Copyright (c) 2010-2011 Opscode, Inc. # License:: Apache License, Version 2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # require 'rubygems' require 'rake' require 'rubygems/package_task' require 'rubygems/specification' require 'date' gemspec = eval(File.read('dep_selector.gemspec')) Gem::PackageTask.new(gemspec) do |pkg| pkg.need_zip = true pkg.need_tar = true end desc "install the gem locally" task :install => :package do sh %{gem install pkg/#{gemspec.name}-#{gemspec.version}} end task :compile do cd("ext/dep_gecode") ruby("extconf.rb") sh("make clean") sh("make") end begin require 'rspec/core/rake_task' RSpec::Core::RakeTask.new(:spec) do |spec| spec.rspec_opts = ['--options', "\"#{File.dirname(__FILE__)}/spec/spec.opts\""] spec.pattern = 'spec/**/*_spec.rb' end RSpec::Core::RakeTask.new(:rcov) do |spec| spec.pattern = 'spec/**/*_spec.rb' spec.rcov = true end rescue LoadError task :spec do abort "RSpec is not available. (sudo) gem install rspec to run unit tests" end end dep-selector-1.0.3/bin/000077500000000000000000000000001232552612700146565ustar00rootroot00000000000000dep-selector-1.0.3/bin/problem_reader.rb000077500000000000000000000040631232552612700201730ustar00rootroot00000000000000#!/usr/bin/ruby # # Reads the logging format generated by the debug log method and generates/runs a problem # # require 'rubygems' require 'dep_selector/gecode_wrapper' def read_process_file(name) file = File.open(name) problem = nil file.each do |line| next if line =~ /^\s*$/ if line =~ /Creating VersionProblem inst\# (\d+) with (\d+) packages, (\d+) stats, (\d+) debug/ then instance, pkg_count, stats, debug = $1,$2.to_i,$3.to_i,($4 == '0' ? false : true) # puts "Cr #{instance} #{pkg_count} #{stats} #{debug}" problem = DepSelector::GecodeWrapper.new(pkg_count, debug) next end if line =~ /DepSelector inst\# (\d+) - Adding package id (\d+)\/(\d+): min = (-?\d+), max = (-?\d+), current version (-?\d+)/ then instance, pkg_id, pkg_count, min, max, cur = [$1,$2,$3,$4,$5,$6].map { |x| x.to_i } # puts "Add #{instance} #{pkg_id} #{pkg_count} #{min} #{max} #{cur}" problem.add_package(min, max, cur) next end if line =~ /DepSelector inst\# (\d+) - Adding VC for (\d+) @ (\d+) depPkg\s+(\d+)\s+\[\s*(\d+),\s*(\d+)\s+\]/ then instance, pkg_id, pkg_ver, depPkg_id, constraint_min, constraint_max = [$1, $2, $3, $4, $5, $6].map { |x| x.to_i } # puts "VC #{instance} #{pkg_id} #{depPkg_id} #{pkg_ver}, #{constraint_min}, #{constraint_max}" problem.add_version_constraint(pkg_id, pkg_ver, depPkg_id, constraint_min, constraint_max) next end if line =~ /DepSelector inst\# (\d+) - Marking Package Required (\d+)/ then instance, pkg_id = $1.to_i, $2.to_i puts "Req #{instance} #{pkg_id}" problem.mark_required(pkg_id) next end if line =~ /DepSelector inst\# (\d+) - Marking Package Preferred Latest (\d+) weight (\d+)/ then instance, pkg_id, weight = [$1, $2, $3].map { |x| x.to_i } # puts "Prf #{instance} #{pkg_id} #{weight}" problem.mark_preferred_to_be_at_latest(pkg_id, weight); next end puts "Unmatched #{line}" end problem.solve end if __FILE__ == $0 read_process_file(ARGV[0]) else # setup_interactive end dep-selector-1.0.3/dep_selector.gemspec000066400000000000000000000020671232552612700201300ustar00rootroot00000000000000$:.unshift(File.expand_path("../lib", __FILE__)) require 'dep_selector/dep_selector_version' Gem::Specification.new do |s| s.name = "dep_selector" s.version = DepSelector::VERSION s.platform = Gem::Platform::RUBY s.has_rdoc = false s.summary = "Given packages, versions, and a dependency graph, find a valid assignment of package versions" s.description = s.summary s.license = 'Apache v2' s.authors = ["Christopher Walters", "Mark Anderson"] s.email = ["dev@getchef.com"] s.homepage = %q{http://github.com/opscode/dep-selector} s.require_path = 'lib' s.requirements << 'gecode, version 3.5 or greater' s.requirements << 'g++' s.files = Dir.glob("lib/**/*.{rb}") + Dir.glob("ext/**/*.{i,c,cxx,h,cpp,rb,def}") s.extensions = Dir["ext/**/extconf.rb"] s.required_ruby_version = ">= 1.9.2" s.add_runtime_dependency "ffi", "~> 1.9" s.add_runtime_dependency "dep-selector-libgecode", "~> 1.0" s.add_development_dependency "rake", "~> 10.0" s.add_development_dependency "rspec", "~> 2.14" s.add_development_dependency "solve", "~> 0.8" end dep-selector-1.0.3/example/000077500000000000000000000000001232552612700155415ustar00rootroot00000000000000dep-selector-1.0.3/example/07be9e47-6f42-4a5d-b8b5-1d2eae1ad83b000066400000000000000000000201651232552612700225500ustar00rootroot00000000000000Creating VersionProblem inst# 3471 with 27 packages, 1 stats, 1 debug DepSelector inst# 3471 - Adding package id 0/27: min = -1, max = 0, current version 0 DepSelector inst# 3471 - Adding package id 1/27: min = -1, max = 0, current version 0 DepSelector inst# 3471 - Adding package id 2/27: min = -1, max = 0, current version 0 DepSelector inst# 3471 - Adding VC for 1 @ 0 depPkg 2 [ 0, 0 ] DepSelector inst# 3471 - Adding package id 3/27: min = -1, max = 0, current version 0 DepSelector inst# 3471 - Adding package id 4/27: min = -1, max = 0, current version 0 DepSelector inst# 3471 - Adding package id 5/27: min = -1, max = 0, current version 0 DepSelector inst# 3471 - Adding package id 6/27: min = -1, max = 0, current version 0 DepSelector inst# 3471 - Adding package id 7/27: min = -1, max = 0, current version 0 DepSelector inst# 3471 - Adding package id 8/27: min = -1, max = 0, current version 0 DepSelector inst# 3471 - Adding VC for 8 @ 0 depPkg 2 [ 0, 0 ] DepSelector inst# 3471 - Adding package id 9/27: min = -1, max = 0, current version 0 DepSelector inst# 3471 - Adding package id 10/27: min = -1, max = 0, current version 0 DepSelector inst# 3471 - Adding package id 11/27: min = -1, max = 0, current version 0 DepSelector inst# 3471 - Adding package id 12/27: min = -1, max = 0, current version 0 DepSelector inst# 3471 - Adding package id 13/27: min = -1, max = 0, current version 0 DepSelector inst# 3471 - Adding package id 14/27: min = -1, max = 0, current version 0 DepSelector inst# 3471 - Adding package id 15/27: min = -1, max = 0, current version 0 DepSelector inst# 3471 - Adding package id 16/27: min = -1, max = 0, current version 0 DepSelector inst# 3471 - Adding package id 17/27: min = -1, max = 0, current version 0 DepSelector inst# 3471 - Adding VC for 16 @ 0 depPkg 17 [ 0, 0 ] DepSelector inst# 3471 - Adding package id 18/27: min = -1, max = 0, current version 0 DepSelector inst# 3471 - Adding package id 19/27: min = -1, max = 0, current version 0 DepSelector inst# 3471 - Adding VC for 19 @ 0 depPkg 17 [ 0, 0 ] DepSelector inst# 3471 - Adding package id 20/27: min = -1, max = 0, current version 0 DepSelector inst# 3471 - Adding VC for 19 @ 0 depPkg 20 [ 0, 0 ] DepSelector inst# 3471 - Adding package id 21/27: min = -1, max = 0, current version 0 DepSelector inst# 3471 - Adding VC for 21 @ 0 depPkg 20 [ 0, 0 ] DepSelector inst# 3471 - Adding package id 22/27: min = -1, max = 0, current version 0 DepSelector inst# 3471 - Adding package id 23/27: min = -1, max = 0, current version 0 DepSelector inst# 3471 - Adding VC for 23 @ 0 depPkg 2 [ 0, 0 ] DepSelector inst# 3471 - Adding package id 24/27: min = -1, max = 0, current version 0 DepSelector inst# 3471 - Adding VC for 24 @ 0 depPkg 2 [ 0, 0 ] DepSelector inst# 3471 - Adding package id 25/27: min = -1, max = 0, current version 0 DepSelector inst# 3471 - Adding VC for 25 @ 0 depPkg 24 [ 0, 0 ] DepSelector inst# 3471 - Adding VC for 25 @ 0 depPkg 17 [ 0, 0 ] DepSelector inst# 3471 - Adding package id 26/27: min = 0, max = 0, current version 0 DepSelector inst# 3471 - Marking Package Preferred Latest 0 weight 10 DepSelector inst# 3471 - Marking Package Required 0 DepSelector inst# 3471 - Adding VC for 26 @ 0 depPkg 0 [ 0, 0 ] DepSelector inst# 3471 - Marking Package Preferred Latest 0 weight 10 DepSelector inst# 3471 - Marking Package Required 0 DepSelector inst# 3471 - Adding VC for 26 @ 0 depPkg 0 [ 0, 0 ] DepSelector inst# 3471 - Marking Package Preferred Latest 0 weight 10 DepSelector inst# 3471 - Marking Package Required 0 DepSelector inst# 3471 - Adding VC for 26 @ 0 depPkg 0 [ 0, 0 ] DepSelector inst# 3471 - Marking Package Preferred Latest 1 weight 10 DepSelector inst# 3471 - Marking Package Required 1 DepSelector inst# 3471 - Adding VC for 26 @ 0 depPkg 1 [ 0, 0 ] DepSelector inst# 3471 - Marking Package Preferred Latest 3 weight 10 DepSelector inst# 3471 - Marking Package Required 3 DepSelector inst# 3471 - Adding VC for 26 @ 0 depPkg 3 [ 0, 0 ] DepSelector inst# 3471 - Marking Package Preferred Latest 4 weight 10 DepSelector inst# 3471 - Marking Package Required 4 DepSelector inst# 3471 - Adding VC for 26 @ 0 depPkg 4 [ 0, 0 ] DepSelector inst# 3471 - Marking Package Preferred Latest 5 weight 10 DepSelector inst# 3471 - Marking Package Required 5 DepSelector inst# 3471 - Adding VC for 26 @ 0 depPkg 5 [ 0, 0 ] DepSelector inst# 3471 - Marking Package Preferred Latest 6 weight 10 DepSelector inst# 3471 - Marking Package Required 6 DepSelector inst# 3471 - Adding VC for 26 @ 0 depPkg 6 [ 0, 0 ] DepSelector inst# 3471 - Marking Package Preferred Latest 7 weight 10 DepSelector inst# 3471 - Marking Package Required 7 DepSelector inst# 3471 - Adding VC for 26 @ 0 depPkg 7 [ 0, 0 ] DepSelector inst# 3471 - Marking Package Preferred Latest 8 weight 10 DepSelector inst# 3471 - Marking Package Required 8 DepSelector inst# 3471 - Adding VC for 26 @ 0 depPkg 8 [ 0, 0 ] DepSelector inst# 3471 - Marking Package Preferred Latest 8 weight 10 DepSelector inst# 3471 - Marking Package Required 8 DepSelector inst# 3471 - Adding VC for 26 @ 0 depPkg 8 [ 0, 0 ] DepSelector inst# 3471 - Marking Package Preferred Latest 9 weight 10 DepSelector inst# 3471 - Marking Package Required 9 DepSelector inst# 3471 - Adding VC for 26 @ 0 depPkg 9 [ 0, 0 ] DepSelector inst# 3471 - Marking Package Preferred Latest 10 weight 10 DepSelector inst# 3471 - Marking Package Required 10 DepSelector inst# 3471 - Adding VC for 26 @ 0 depPkg 10 [ 0, 0 ] DepSelector inst# 3471 - Marking Package Preferred Latest 11 weight 10 DepSelector inst# 3471 - Marking Package Required 11 DepSelector inst# 3471 - Adding VC for 26 @ 0 depPkg 11 [ 0, 0 ] DepSelector inst# 3471 - Marking Package Preferred Latest 12 weight 10 DepSelector inst# 3471 - Marking Package Required 12 DepSelector inst# 3471 - Adding VC for 26 @ 0 depPkg 12 [ 0, 0 ] DepSelector inst# 3471 - Marking Package Preferred Latest 13 weight 10 DepSelector inst# 3471 - Marking Package Required 13 DepSelector inst# 3471 - Adding VC for 26 @ 0 depPkg 13 [ 0, 0 ] DepSelector inst# 3471 - Marking Package Preferred Latest 14 weight 10 DepSelector inst# 3471 - Marking Package Required 14 DepSelector inst# 3471 - Adding VC for 26 @ 0 depPkg 14 [ 0, 0 ] DepSelector inst# 3471 - Marking Package Preferred Latest 15 weight 10 DepSelector inst# 3471 - Marking Package Required 15 DepSelector inst# 3471 - Adding VC for 26 @ 0 depPkg 15 [ 0, 0 ] DepSelector inst# 3471 - Marking Package Preferred Latest 16 weight 10 DepSelector inst# 3471 - Marking Package Required 16 DepSelector inst# 3471 - Adding VC for 26 @ 0 depPkg 16 [ 0, 0 ] DepSelector inst# 3471 - Marking Package Preferred Latest 18 weight 10 DepSelector inst# 3471 - Marking Package Required 18 DepSelector inst# 3471 - Adding VC for 26 @ 0 depPkg 18 [ 0, 0 ] DepSelector inst# 3471 - Marking Package Preferred Latest 19 weight 10 DepSelector inst# 3471 - Marking Package Required 19 DepSelector inst# 3471 - Adding VC for 26 @ 0 depPkg 19 [ 0, 0 ] DepSelector inst# 3471 - Marking Package Preferred Latest 21 weight 10 DepSelector inst# 3471 - Marking Package Required 21 DepSelector inst# 3471 - Adding VC for 26 @ 0 depPkg 21 [ 0, 0 ] DepSelector inst# 3471 - Marking Package Preferred Latest 22 weight 10 DepSelector inst# 3471 - Marking Package Required 22 DepSelector inst# 3471 - Adding VC for 26 @ 0 depPkg 22 [ 0, 0 ] DepSelector inst# 3471 - Marking Package Preferred Latest 23 weight 10 DepSelector inst# 3471 - Marking Package Required 23 DepSelector inst# 3471 - Adding VC for 26 @ 0 depPkg 23 [ 0, 0 ] DepSelector inst# 3471 - Marking Package Preferred Latest 24 weight 10 DepSelector inst# 3471 - Marking Package Required 24 DepSelector inst# 3471 - Adding VC for 26 @ 0 depPkg 24 [ 0, 0 ] DepSelector inst# 3471 - Marking Package Preferred Latest 24 weight 10 DepSelector inst# 3471 - Marking Package Required 24 DepSelector inst# 3471 - Adding VC for 26 @ 0 depPkg 24 [ 0, 0 ] DepSelector inst# 3471 - Marking Package Preferred Latest 25 weight 10 DepSelector inst# 3471 - Marking Package Required 25 DepSelector inst# 3471 - Adding VC for 26 @ 0 depPkg 25 [ 0, 0 ] DepSelector inst# 3471 - Marking Package Preferred Latest 25 weight 10 DepSelector inst# 3471 - Marking Package Required 25 DepSelector inst# 3471 - Adding VC for 26 @ 0 depPkg 25 [ 0, 0 ] dep-selector-1.0.3/example/183998c1-2ada-4214-b308-e480345c42f2000066400000000000000000001726231232552612700220320ustar00rootroot00000000000000Creating VersionProblem inst# 4558 with 84 packages, 1 stats, 1 debug DepSelector inst# 4558 - Adding package id 0/84: min = -1, max = 3, current version 0 DepSelector inst# 4558 - Adding package id 1/84: min = -1, max = 1, current version 0 DepSelector inst# 4558 - Adding VC for 0 @ 3 depPkg 1 [ 0, 1 ] DepSelector inst# 4558 - Adding package id 2/84: min = -1, max = 0, current version 0 DepSelector inst# 4558 - Adding VC for 0 @ 3 depPkg 2 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 0 @ 2 depPkg 1 [ 0, 1 ] DepSelector inst# 4558 - Adding VC for 0 @ 2 depPkg 2 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 0 @ 1 depPkg 1 [ 0, 1 ] DepSelector inst# 4558 - Adding VC for 0 @ 1 depPkg 2 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 0 @ 0 depPkg 1 [ 0, 1 ] DepSelector inst# 4558 - Adding VC for 0 @ 0 depPkg 2 [ 0, 0 ] DepSelector inst# 4558 - Adding package id 3/84: min = -1, max = 2, current version 0 DepSelector inst# 4558 - Adding package id 4/84: min = -1, max = 5, current version 0 DepSelector inst# 4558 - Adding package id 5/84: min = -1, max = 5, current version 0 DepSelector inst# 4558 - Adding VC for 4 @ 5 depPkg 5 [ 0, 5 ] DepSelector inst# 4558 - Adding package id 6/84: min = -1, max = 5, current version 0 DepSelector inst# 4558 - Adding VC for 4 @ 5 depPkg 6 [ 0, 5 ] DepSelector inst# 4558 - Adding VC for 4 @ 4 depPkg 5 [ 0, 5 ] DepSelector inst# 4558 - Adding VC for 4 @ 3 depPkg 5 [ 0, 5 ] DepSelector inst# 4558 - Adding VC for 4 @ 2 depPkg 5 [ 0, 5 ] DepSelector inst# 4558 - Adding VC for 4 @ 1 depPkg 5 [ 0, 5 ] DepSelector inst# 4558 - Adding VC for 4 @ 0 depPkg 5 [ 0, 5 ] DepSelector inst# 4558 - Adding package id 7/84: min = -1, max = 3, current version 0 DepSelector inst# 4558 - Adding VC for 5 @ 5 depPkg 7 [ 0, 3 ] DepSelector inst# 4558 - Adding package id 8/84: min = -1, max = 0, current version 0 DepSelector inst# 4558 - Adding VC for 5 @ 5 depPkg 7 [ 0, 3 ] DepSelector inst# 4558 - Adding VC for 5 @ 5 depPkg 8 [ 0, 0 ] DepSelector inst# 4558 - Adding package id 8/84: min = -1, max = 0, current version 0 DepSelector inst# 4558 - Adding VC for 5 @ 4 depPkg 8 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 5 @ 5 depPkg 8 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 5 @ 5 depPkg 7 [ 0, 3 ] DepSelector inst# 4558 - Adding package id 8/84: min = -1, max = 0, current version 0 DepSelector inst# 4558 - Adding VC for 5 @ 5 depPkg 8 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 5 @ 4 depPkg 7 [ 0, 3 ] DepSelector inst# 4558 - Adding VC for 5 @ 4 depPkg 8 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 5 @ 3 depPkg 7 [ 0, 3 ] DepSelector inst# 4558 - Adding VC for 5 @ 2 depPkg 7 [ 0, 3 ] DepSelector inst# 4558 - Adding VC for 5 @ 2 depPkg 8 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 5 @ 1 depPkg 7 [ 0, 3 ] DepSelector inst# 4558 - Adding VC for 5 @ 1 depPkg 8 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 5 @ 0 depPkg 7 [ 0, 3 ] DepSelector inst# 4558 - Adding package id 10/84: min = -1, max = 0, current version 0 DepSelector inst# 4558 - Adding package id 11/84: min = -1, max = 0, current version 0 DepSelector inst# 4558 - Adding package id 12/84: min = -1, max = 0, current version 0 DepSelector inst# 4558 - Adding package id 13/84: min = -1, max = 1, current version 0 DepSelector inst# 4558 - Adding package id 14/84: min = -1, max = 0, current version 0 DepSelector inst# 4558 - Adding package id 15/84: min = -1, max = 1, current version 0 DepSelector inst# 4558 - Adding package id 16/84: min = -1, max = 0, current version 0 DepSelector inst# 4558 - Adding package id 17/84: min = -1, max = 1, current version 0 DepSelector inst# 4558 - Adding package id 18/84: min = -1, max = 0, current version 0 DepSelector inst# 4558 - Adding package id 19/84: min = -1, max = 0, current version 0 DepSelector inst# 4558 - Adding package id 20/84: min = -1, max = 2, current version 0 DepSelector inst# 4558 - Adding package id 21/84: min = -1, max = 0, current version 0 DepSelector inst# 4558 - Adding package id 22/84: min = -1, max = 1, current version 0 DepSelector inst# 4558 - Adding package id 23/84: min = -1, max = 0, current version 0 DepSelector inst# 4558 - Adding package id 24/84: min = -1, max = 2, current version 0 DepSelector inst# 4558 - Adding package id 25/84: min = -1, max = 3, current version 0 DepSelector inst# 4558 - Adding package id 26/84: min = -1, max = 1, current version 0 DepSelector inst# 4558 - Adding VC for 26 @ 1 depPkg 7 [ 0, 3 ] DepSelector inst# 4558 - Adding VC for 26 @ 0 depPkg 7 [ 0, 3 ] DepSelector inst# 4558 - Adding VC for 26 @ 0 depPkg 6 [ 0, 5 ] DepSelector inst# 4558 - Adding package id 27/84: min = -1, max = 3, current version 0 DepSelector inst# 4558 - Adding package id 28/84: min = -1, max = 5, current version 0 DepSelector inst# 4558 - Adding package id 29/84: min = -1, max = 0, current version 0 DepSelector inst# 4558 - Adding package id 30/84: min = -1, max = 2, current version 0 DepSelector inst# 4558 - Adding package id 31/84: min = -1, max = 0, current version 0 DepSelector inst# 4558 - Adding VC for 30 @ 2 depPkg 31 [ 0, 0 ] DepSelector inst# 4558 - Adding package id 32/84: min = -1, max = 2, current version 0 DepSelector inst# 4558 - Adding package id 33/84: min = -1, max = 0, current version 0 DepSelector inst# 4558 - Adding package id 34/84: min = -1, max = 0, current version 0 DepSelector inst# 4558 - Adding VC for 33 @ 0 depPkg 34 [ 0, 0 ] DepSelector inst# 4558 - Adding package id 35/84: min = -1, max = 24, current version 0 DepSelector inst# 4558 - Adding package id 36/84: min = -1, max = 0, current version 0 DepSelector inst# 4558 - Adding VC for 35 @ 24 depPkg 36 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 35 @ 24 depPkg 6 [ 0, 5 ] DepSelector inst# 4558 - Adding VC for 35 @ 23 depPkg 36 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 35 @ 23 depPkg 6 [ 0, 5 ] DepSelector inst# 4558 - Adding VC for 35 @ 22 depPkg 36 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 35 @ 22 depPkg 6 [ 0, 5 ] DepSelector inst# 4558 - Adding VC for 35 @ 21 depPkg 36 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 35 @ 21 depPkg 6 [ 0, 5 ] DepSelector inst# 4558 - Adding VC for 35 @ 20 depPkg 36 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 35 @ 20 depPkg 6 [ 0, 5 ] DepSelector inst# 4558 - Adding VC for 35 @ 19 depPkg 36 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 35 @ 19 depPkg 6 [ 0, 5 ] DepSelector inst# 4558 - Adding VC for 35 @ 18 depPkg 6 [ 0, 5 ] DepSelector inst# 4558 - Adding VC for 35 @ 17 depPkg 36 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 35 @ 17 depPkg 6 [ 0, 5 ] DepSelector inst# 4558 - Adding VC for 35 @ 16 depPkg 36 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 35 @ 16 depPkg 6 [ 0, 5 ] DepSelector inst# 4558 - Adding VC for 35 @ 16 depPkg 36 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 35 @ 16 depPkg 6 [ 0, 5 ] DepSelector inst# 4558 - Adding VC for 35 @ 15 depPkg 36 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 35 @ 15 depPkg 6 [ 0, 5 ] DepSelector inst# 4558 - Adding VC for 35 @ 14 depPkg 36 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 35 @ 14 depPkg 6 [ 0, 5 ] DepSelector inst# 4558 - Adding VC for 35 @ 13 depPkg 36 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 35 @ 13 depPkg 6 [ 0, 5 ] DepSelector inst# 4558 - Adding VC for 35 @ 12 depPkg 36 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 35 @ 12 depPkg 6 [ 0, 5 ] DepSelector inst# 4558 - Adding VC for 35 @ 11 depPkg 36 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 35 @ 11 depPkg 6 [ 0, 5 ] DepSelector inst# 4558 - Adding VC for 35 @ 10 depPkg 36 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 35 @ 10 depPkg 6 [ 0, 5 ] DepSelector inst# 4558 - Adding VC for 35 @ 9 depPkg 36 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 35 @ 9 depPkg 6 [ 0, 5 ] DepSelector inst# 4558 - Adding VC for 35 @ 8 depPkg 36 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 35 @ 8 depPkg 6 [ 0, 5 ] DepSelector inst# 4558 - Adding VC for 35 @ 7 depPkg 36 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 35 @ 7 depPkg 6 [ 0, 5 ] DepSelector inst# 4558 - Adding VC for 35 @ 6 depPkg 36 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 35 @ 6 depPkg 6 [ 0, 5 ] DepSelector inst# 4558 - Adding VC for 35 @ 5 depPkg 36 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 35 @ 5 depPkg 6 [ 0, 5 ] DepSelector inst# 4558 - Adding VC for 35 @ 4 depPkg 36 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 35 @ 4 depPkg 6 [ 0, 5 ] DepSelector inst# 4558 - Adding VC for 35 @ 3 depPkg 36 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 35 @ 3 depPkg 6 [ 0, 5 ] DepSelector inst# 4558 - Adding VC for 35 @ 2 depPkg 36 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 35 @ 2 depPkg 6 [ 0, 5 ] DepSelector inst# 4558 - Adding VC for 35 @ 1 depPkg 6 [ 0, 5 ] DepSelector inst# 4558 - Adding package id 37/84: min = -1, max = 0, current version 0 DepSelector inst# 4558 - Adding VC for 36 @ 0 depPkg 37 [ 0, 0 ] DepSelector inst# 4558 - Adding package id 38/84: min = -1, max = 4, current version 0 DepSelector inst# 4558 - Adding VC for 37 @ 0 depPkg 38 [ 0, 4 ] DepSelector inst# 4558 - Adding VC for 38 @ 4 depPkg 4 [ 0, 5 ] DepSelector inst# 4558 - Adding VC for 38 @ 3 depPkg 4 [ 0, 5 ] DepSelector inst# 4558 - Adding VC for 38 @ 2 depPkg 4 [ 0, 5 ] DepSelector inst# 4558 - Adding package id 39/84: min = -1, max = 3, current version 0 DepSelector inst# 4558 - Adding VC for 39 @ 3 depPkg 38 [ 0, 4 ] DepSelector inst# 4558 - Adding VC for 39 @ 2 depPkg 38 [ 0, 4 ] DepSelector inst# 4558 - Adding VC for 39 @ 1 depPkg 38 [ 0, 4 ] DepSelector inst# 4558 - Adding VC for 39 @ 0 depPkg 38 [ 0, 4 ] DepSelector inst# 4558 - Adding package id 40/84: min = -1, max = 2, current version 0 DepSelector inst# 4558 - Adding package id 41/84: min = -1, max = 2, current version 0 DepSelector inst# 4558 - Adding package id 42/84: min = -1, max = 1, current version 0 DepSelector inst# 4558 - Adding VC for 42 @ 1 depPkg 10 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 42 @ 0 depPkg 10 [ 0, 0 ] DepSelector inst# 4558 - Adding package id 43/84: min = -1, max = 7, current version 0 DepSelector inst# 4558 - Adding package id 44/84: min = -1, max = 1, current version 0 DepSelector inst# 4558 - Adding VC for 44 @ 1 depPkg 5 [ 0, 5 ] DepSelector inst# 4558 - Adding VC for 44 @ 0 depPkg 5 [ 0, 5 ] DepSelector inst# 4558 - Adding package id 45/84: min = -1, max = 1, current version 0 DepSelector inst# 4558 - Adding package id 46/84: min = -1, max = 2, current version 0 DepSelector inst# 4558 - Adding VC for 45 @ 1 depPkg 46 [ 0, 2 ] DepSelector inst# 4558 - Adding package id 47/84: min = -1, max = 4, current version 0 DepSelector inst# 4558 - Adding VC for 45 @ 1 depPkg 47 [ 0, 4 ] DepSelector inst# 4558 - Adding VC for 45 @ 1 depPkg 34 [ 0, 0 ] DepSelector inst# 4558 - Adding package id 48/84: min = -1, max = 1, current version 0 DepSelector inst# 4558 - Adding VC for 45 @ 1 depPkg 48 [ 0, 1 ] DepSelector inst# 4558 - Adding package id 49/84: min = -1, max = 0, current version 0 DepSelector inst# 4558 - Adding VC for 45 @ 1 depPkg 49 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 45 @ 0 depPkg 46 [ 0, 2 ] DepSelector inst# 4558 - Adding VC for 45 @ 0 depPkg 47 [ 0, 4 ] DepSelector inst# 4558 - Adding VC for 45 @ 0 depPkg 34 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 45 @ 0 depPkg 48 [ 0, 1 ] DepSelector inst# 4558 - Adding VC for 45 @ 0 depPkg 49 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 46 @ 2 depPkg 7 [ 0, 3 ] DepSelector inst# 4558 - Adding VC for 46 @ 2 depPkg 5 [ 0, 5 ] DepSelector inst# 4558 - Adding VC for 46 @ 2 depPkg 6 [ 0, 5 ] DepSelector inst# 4558 - Adding VC for 46 @ 1 depPkg 6 [ 0, 5 ] DepSelector inst# 4558 - Adding VC for 46 @ 0 depPkg 6 [ 0, 5 ] DepSelector inst# 4558 - Adding package id 50/84: min = -1, max = 2, current version 0 DepSelector inst# 4558 - Adding VC for 48 @ 1 depPkg 50 [ 0, 2 ] DepSelector inst# 4558 - Adding package id 51/84: min = -1, max = 3, current version 0 DepSelector inst# 4558 - Adding VC for 48 @ 1 depPkg 51 [ 0, 3 ] DepSelector inst# 4558 - Adding VC for 48 @ 1 depPkg 6 [ 0, 5 ] DepSelector inst# 4558 - Adding VC for 48 @ 1 depPkg 49 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 48 @ 0 depPkg 51 [ 0, 3 ] DepSelector inst# 4558 - Adding VC for 48 @ 0 depPkg 6 [ 0, 5 ] DepSelector inst# 4558 - Adding VC for 48 @ 0 depPkg 49 [ 0, 0 ] DepSelector inst# 4558 - Adding package id 52/84: min = -1, max = 0, current version 0 DepSelector inst# 4558 - Adding VC for 51 @ 3 depPkg 52 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 51 @ 2 depPkg 52 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 51 @ 1 depPkg 52 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 51 @ 0 depPkg 52 [ 0, 0 ] DepSelector inst# 4558 - Adding package id 53/84: min = -1, max = 1, current version 0 DepSelector inst# 4558 - Adding VC for 53 @ 1 depPkg 38 [ 0, 4 ] DepSelector inst# 4558 - Adding package id 54/84: min = -1, max = 0, current version 0 DepSelector inst# 4558 - Adding VC for 54 @ 0 depPkg 7 [ 0, 3 ] DepSelector inst# 4558 - Adding VC for 54 @ 0 depPkg 38 [ 0, 4 ] DepSelector inst# 4558 - Adding package id 55/84: min = -1, max = 4, current version 0 DepSelector inst# 4558 - Adding VC for 55 @ 4 depPkg 7 [ 0, 3 ] DepSelector inst# 4558 - Adding VC for 55 @ 4 depPkg 38 [ 0, 4 ] DepSelector inst# 4558 - Adding VC for 55 @ 3 depPkg 7 [ 0, 3 ] DepSelector inst# 4558 - Adding VC for 55 @ 3 depPkg 38 [ 0, 4 ] DepSelector inst# 4558 - Adding VC for 55 @ 2 depPkg 7 [ 0, 3 ] DepSelector inst# 4558 - Adding VC for 55 @ 2 depPkg 38 [ 0, 4 ] DepSelector inst# 4558 - Adding VC for 55 @ 1 depPkg 7 [ 0, 3 ] DepSelector inst# 4558 - Adding VC for 55 @ 1 depPkg 38 [ 0, 4 ] DepSelector inst# 4558 - Adding VC for 55 @ 0 depPkg 7 [ 0, 3 ] DepSelector inst# 4558 - Adding VC for 55 @ 0 depPkg 38 [ 0, 4 ] DepSelector inst# 4558 - Adding package id 56/84: min = -1, max = 3, current version 0 DepSelector inst# 4558 - Adding VC for 56 @ 3 depPkg 7 [ 0, 3 ] DepSelector inst# 4558 - Adding VC for 56 @ 2 depPkg 7 [ 0, 3 ] DepSelector inst# 4558 - Adding VC for 56 @ 1 depPkg 7 [ 0, 3 ] DepSelector inst# 4558 - Adding VC for 56 @ 0 depPkg 7 [ 0, 3 ] DepSelector inst# 4558 - Adding package id 57/84: min = -1, max = 5, current version 0 DepSelector inst# 4558 - Adding package id 58/84: min = -1, max = 2, current version 0 DepSelector inst# 4558 - Adding VC for 57 @ 5 depPkg 58 [ 0, 2 ] DepSelector inst# 4558 - Adding package id 59/84: min = -1, max = 0, current version 0 DepSelector inst# 4558 - Adding VC for 57 @ 5 depPkg 59 [ 0, 0 ] DepSelector inst# 4558 - Adding package id 60/84: min = -1, max = 0, current version 0 DepSelector inst# 4558 - Adding VC for 57 @ 5 depPkg 60 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 57 @ 5 depPkg 6 [ 0, 5 ] DepSelector inst# 4558 - Adding VC for 57 @ 5 depPkg 22 [ 0, 1 ] DepSelector inst# 4558 - Adding package id 61/84: min = -1, max = 6, current version 0 DepSelector inst# 4558 - Adding VC for 57 @ 5 depPkg 61 [ 0, 6 ] DepSelector inst# 4558 - Adding package id 62/84: min = -1, max = 4, current version 0 DepSelector inst# 4558 - Adding VC for 57 @ 5 depPkg 62 [ 0, 4 ] DepSelector inst# 4558 - Adding VC for 57 @ 4 depPkg 58 [ 0, 2 ] DepSelector inst# 4558 - Adding VC for 57 @ 4 depPkg 59 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 57 @ 4 depPkg 60 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 57 @ 4 depPkg 6 [ 0, 5 ] DepSelector inst# 4558 - Adding VC for 57 @ 4 depPkg 22 [ 0, 1 ] DepSelector inst# 4558 - Adding VC for 57 @ 4 depPkg 61 [ 0, 6 ] DepSelector inst# 4558 - Adding VC for 57 @ 4 depPkg 62 [ 0, 4 ] DepSelector inst# 4558 - Adding VC for 57 @ 3 depPkg 58 [ 0, 2 ] DepSelector inst# 4558 - Adding VC for 57 @ 3 depPkg 59 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 57 @ 3 depPkg 60 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 57 @ 3 depPkg 6 [ 0, 5 ] DepSelector inst# 4558 - Adding VC for 57 @ 3 depPkg 22 [ 0, 1 ] DepSelector inst# 4558 - Adding VC for 57 @ 3 depPkg 62 [ 0, 4 ] DepSelector inst# 4558 - Adding VC for 57 @ 2 depPkg 58 [ 0, 2 ] DepSelector inst# 4558 - Adding VC for 57 @ 2 depPkg 59 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 57 @ 2 depPkg 60 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 57 @ 2 depPkg 6 [ 0, 5 ] DepSelector inst# 4558 - Adding VC for 57 @ 2 depPkg 22 [ 0, 1 ] DepSelector inst# 4558 - Adding VC for 57 @ 2 depPkg 62 [ 0, 4 ] DepSelector inst# 4558 - Adding VC for 57 @ 1 depPkg 58 [ 0, 2 ] DepSelector inst# 4558 - Adding VC for 57 @ 1 depPkg 59 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 57 @ 1 depPkg 60 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 57 @ 1 depPkg 6 [ 0, 5 ] DepSelector inst# 4558 - Adding VC for 57 @ 1 depPkg 22 [ 0, 1 ] DepSelector inst# 4558 - Adding VC for 57 @ 1 depPkg 62 [ 0, 4 ] DepSelector inst# 4558 - Adding package id 63/84: min = -1, max = 2, current version 0 DepSelector inst# 4558 - Adding VC for 58 @ 2 depPkg 63 [ 0, 2 ] DepSelector inst# 4558 - Adding package id 64/84: min = -1, max = 2, current version 0 DepSelector inst# 4558 - Adding VC for 58 @ 2 depPkg 64 [ 0, 2 ] DepSelector inst# 4558 - Adding package id 65/84: min = -1, max = 0, current version 0 DepSelector inst# 4558 - Adding VC for 58 @ 2 depPkg 65 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 58 @ 2 depPkg 6 [ 0, 5 ] DepSelector inst# 4558 - Adding VC for 58 @ 1 depPkg 63 [ 0, 2 ] DepSelector inst# 4558 - Adding VC for 58 @ 1 depPkg 64 [ 0, 2 ] DepSelector inst# 4558 - Adding VC for 58 @ 1 depPkg 65 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 58 @ 1 depPkg 6 [ 0, 5 ] DepSelector inst# 4558 - Adding VC for 58 @ 0 depPkg 63 [ 0, 2 ] DepSelector inst# 4558 - Adding VC for 58 @ 0 depPkg 64 [ 0, 2 ] DepSelector inst# 4558 - Adding VC for 58 @ 0 depPkg 65 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 58 @ 0 depPkg 6 [ 0, 5 ] DepSelector inst# 4558 - Adding VC for 63 @ 2 depPkg 65 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 63 @ 2 depPkg 6 [ 0, 5 ] DepSelector inst# 4558 - Adding VC for 63 @ 1 depPkg 65 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 63 @ 1 depPkg 6 [ 0, 5 ] DepSelector inst# 4558 - Adding VC for 63 @ 0 depPkg 65 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 63 @ 0 depPkg 6 [ 0, 5 ] DepSelector inst# 4558 - Adding package id 66/84: min = -1, max = 1, current version 0 DepSelector inst# 4558 - Adding VC for 60 @ 0 depPkg 66 [ 0, 1 ] DepSelector inst# 4558 - Adding VC for 62 @ 4 depPkg 7 [ 0, 3 ] DepSelector inst# 4558 - Adding VC for 62 @ 4 depPkg 38 [ 0, 4 ] DepSelector inst# 4558 - Adding VC for 62 @ 4 depPkg 6 [ 0, 5 ] DepSelector inst# 4558 - Adding VC for 62 @ 3 depPkg 7 [ 0, 3 ] DepSelector inst# 4558 - Adding VC for 62 @ 3 depPkg 38 [ 0, 4 ] DepSelector inst# 4558 - Adding VC for 62 @ 3 depPkg 6 [ 0, 5 ] DepSelector inst# 4558 - Adding VC for 62 @ 2 depPkg 7 [ 0, 3 ] DepSelector inst# 4558 - Adding VC for 62 @ 2 depPkg 38 [ 0, 4 ] DepSelector inst# 4558 - Adding VC for 62 @ 2 depPkg 6 [ 0, 5 ] DepSelector inst# 4558 - Adding VC for 62 @ 1 depPkg 7 [ 0, 3 ] DepSelector inst# 4558 - Adding VC for 62 @ 1 depPkg 38 [ 0, 4 ] DepSelector inst# 4558 - Adding VC for 62 @ 1 depPkg 6 [ 0, 5 ] DepSelector inst# 4558 - Adding VC for 62 @ 0 depPkg 7 [ 0, 3 ] DepSelector inst# 4558 - Adding VC for 62 @ 0 depPkg 38 [ 0, 4 ] DepSelector inst# 4558 - Adding VC for 62 @ 0 depPkg 6 [ 0, 5 ] DepSelector inst# 4558 - Adding package id 67/84: min = -1, max = 7, current version 0 DepSelector inst# 4558 - Adding VC for 67 @ 7 depPkg 58 [ 0, 2 ] DepSelector inst# 4558 - Adding VC for 67 @ 7 depPkg 59 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 67 @ 7 depPkg 60 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 67 @ 7 depPkg 6 [ 0, 5 ] DepSelector inst# 4558 - Adding VC for 67 @ 7 depPkg 22 [ 0, 1 ] DepSelector inst# 4558 - Adding VC for 67 @ 7 depPkg 61 [ 0, 6 ] DepSelector inst# 4558 - Adding VC for 67 @ 7 depPkg 62 [ 0, 4 ] DepSelector inst# 4558 - Adding VC for 67 @ 6 depPkg 58 [ 0, 2 ] DepSelector inst# 4558 - Adding VC for 67 @ 6 depPkg 59 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 67 @ 6 depPkg 60 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 67 @ 6 depPkg 6 [ 0, 5 ] DepSelector inst# 4558 - Adding VC for 67 @ 6 depPkg 22 [ 0, 1 ] DepSelector inst# 4558 - Adding VC for 67 @ 6 depPkg 61 [ 0, 6 ] DepSelector inst# 4558 - Adding VC for 67 @ 6 depPkg 62 [ 0, 4 ] DepSelector inst# 4558 - Adding VC for 67 @ 5 depPkg 58 [ 0, 2 ] DepSelector inst# 4558 - Adding VC for 67 @ 5 depPkg 59 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 67 @ 5 depPkg 60 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 67 @ 5 depPkg 6 [ 0, 5 ] DepSelector inst# 4558 - Adding VC for 67 @ 5 depPkg 22 [ 0, 1 ] DepSelector inst# 4558 - Adding VC for 67 @ 5 depPkg 61 [ 0, 6 ] DepSelector inst# 4558 - Adding VC for 67 @ 5 depPkg 62 [ 0, 4 ] DepSelector inst# 4558 - Adding VC for 67 @ 4 depPkg 58 [ 0, 2 ] DepSelector inst# 4558 - Adding VC for 67 @ 4 depPkg 59 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 67 @ 4 depPkg 60 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 67 @ 4 depPkg 6 [ 0, 5 ] DepSelector inst# 4558 - Adding VC for 67 @ 4 depPkg 22 [ 0, 1 ] DepSelector inst# 4558 - Adding VC for 67 @ 4 depPkg 61 [ 0, 6 ] DepSelector inst# 4558 - Adding VC for 67 @ 4 depPkg 62 [ 0, 4 ] DepSelector inst# 4558 - Adding VC for 67 @ 3 depPkg 58 [ 0, 2 ] DepSelector inst# 4558 - Adding VC for 67 @ 3 depPkg 59 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 67 @ 3 depPkg 60 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 67 @ 3 depPkg 6 [ 0, 5 ] DepSelector inst# 4558 - Adding VC for 67 @ 3 depPkg 22 [ 0, 1 ] DepSelector inst# 4558 - Adding VC for 67 @ 3 depPkg 61 [ 0, 6 ] DepSelector inst# 4558 - Adding VC for 67 @ 3 depPkg 62 [ 0, 4 ] DepSelector inst# 4558 - Adding VC for 67 @ 2 depPkg 58 [ 0, 2 ] DepSelector inst# 4558 - Adding VC for 67 @ 2 depPkg 59 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 67 @ 2 depPkg 60 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 67 @ 2 depPkg 6 [ 0, 5 ] DepSelector inst# 4558 - Adding VC for 67 @ 2 depPkg 22 [ 0, 1 ] DepSelector inst# 4558 - Adding VC for 67 @ 2 depPkg 62 [ 0, 4 ] DepSelector inst# 4558 - Adding VC for 67 @ 1 depPkg 58 [ 0, 2 ] DepSelector inst# 4558 - Adding VC for 67 @ 1 depPkg 59 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 67 @ 1 depPkg 60 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 67 @ 1 depPkg 6 [ 0, 5 ] DepSelector inst# 4558 - Adding VC for 67 @ 1 depPkg 22 [ 0, 1 ] DepSelector inst# 4558 - Adding VC for 67 @ 1 depPkg 62 [ 0, 4 ] DepSelector inst# 4558 - Adding VC for 67 @ 0 depPkg 58 [ 0, 2 ] DepSelector inst# 4558 - Adding VC for 67 @ 0 depPkg 59 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 67 @ 0 depPkg 60 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 67 @ 0 depPkg 6 [ 0, 5 ] DepSelector inst# 4558 - Adding VC for 67 @ 0 depPkg 22 [ 0, 1 ] DepSelector inst# 4558 - Adding VC for 67 @ 0 depPkg 62 [ 0, 4 ] DepSelector inst# 4558 - Adding package id 68/84: min = -1, max = 1, current version 0 DepSelector inst# 4558 - Adding package id 69/84: min = -1, max = 0, current version 0 DepSelector inst# 4558 - Adding package id 70/84: min = -1, max = 1, current version 0 DepSelector inst# 4558 - Adding package id 71/84: min = -1, max = 1, current version 0 DepSelector inst# 4558 - Adding VC for 70 @ 1 depPkg 71 [ 0, 1 ] DepSelector inst# 4558 - Adding VC for 70 @ 1 depPkg 6 [ 0, 5 ] DepSelector inst# 4558 - Adding VC for 70 @ 0 depPkg 71 [ 0, 1 ] DepSelector inst# 4558 - Adding VC for 70 @ 0 depPkg 6 [ 0, 5 ] DepSelector inst# 4558 - Adding package id 72/84: min = -1, max = 0, current version 0 DepSelector inst# 4558 - Adding VC for 72 @ 0 depPkg 7 [ 0, 3 ] DepSelector inst# 4558 - Adding package id 73/84: min = -1, max = 11, current version 0 DepSelector inst# 4558 - Adding VC for 73 @ 11 depPkg 50 [ 0, 2 ] DepSelector inst# 4558 - Adding VC for 73 @ 11 depPkg 71 [ 0, 1 ] DepSelector inst# 4558 - Adding VC for 73 @ 11 depPkg 60 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 73 @ 11 depPkg 22 [ 0, 1 ] DepSelector inst# 4558 - Adding VC for 73 @ 11 depPkg 34 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 73 @ 11 depPkg 61 [ 0, 6 ] DepSelector inst# 4558 - Adding VC for 73 @ 10 depPkg 50 [ 0, 2 ] DepSelector inst# 4558 - Adding VC for 73 @ 10 depPkg 71 [ 0, 1 ] DepSelector inst# 4558 - Adding VC for 73 @ 10 depPkg 60 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 73 @ 10 depPkg 22 [ 0, 1 ] DepSelector inst# 4558 - Adding VC for 73 @ 10 depPkg 34 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 73 @ 10 depPkg 61 [ 0, 6 ] DepSelector inst# 4558 - Adding VC for 73 @ 9 depPkg 50 [ 0, 2 ] DepSelector inst# 4558 - Adding VC for 73 @ 9 depPkg 71 [ 0, 1 ] DepSelector inst# 4558 - Adding VC for 73 @ 9 depPkg 60 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 73 @ 9 depPkg 22 [ 0, 1 ] DepSelector inst# 4558 - Adding VC for 73 @ 9 depPkg 34 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 73 @ 9 depPkg 61 [ 0, 6 ] DepSelector inst# 4558 - Adding VC for 73 @ 8 depPkg 50 [ 0, 2 ] DepSelector inst# 4558 - Adding VC for 73 @ 8 depPkg 71 [ 0, 1 ] DepSelector inst# 4558 - Adding VC for 73 @ 8 depPkg 60 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 73 @ 8 depPkg 22 [ 0, 1 ] DepSelector inst# 4558 - Adding VC for 73 @ 8 depPkg 34 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 73 @ 8 depPkg 61 [ 0, 6 ] DepSelector inst# 4558 - Adding VC for 73 @ 7 depPkg 50 [ 0, 2 ] DepSelector inst# 4558 - Adding VC for 73 @ 7 depPkg 71 [ 0, 1 ] DepSelector inst# 4558 - Adding VC for 73 @ 7 depPkg 60 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 73 @ 7 depPkg 22 [ 0, 1 ] DepSelector inst# 4558 - Adding VC for 73 @ 7 depPkg 34 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 73 @ 7 depPkg 61 [ 0, 6 ] DepSelector inst# 4558 - Adding VC for 73 @ 6 depPkg 50 [ 0, 2 ] DepSelector inst# 4558 - Adding VC for 73 @ 6 depPkg 71 [ 0, 1 ] DepSelector inst# 4558 - Adding VC for 73 @ 6 depPkg 60 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 73 @ 6 depPkg 22 [ 0, 1 ] DepSelector inst# 4558 - Adding VC for 73 @ 6 depPkg 34 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 73 @ 5 depPkg 50 [ 0, 2 ] DepSelector inst# 4558 - Adding VC for 73 @ 5 depPkg 71 [ 0, 1 ] DepSelector inst# 4558 - Adding VC for 73 @ 5 depPkg 60 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 73 @ 5 depPkg 22 [ 0, 1 ] DepSelector inst# 4558 - Adding VC for 73 @ 5 depPkg 34 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 73 @ 4 depPkg 71 [ 0, 1 ] DepSelector inst# 4558 - Adding VC for 73 @ 4 depPkg 60 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 73 @ 4 depPkg 22 [ 0, 1 ] DepSelector inst# 4558 - Adding VC for 73 @ 4 depPkg 34 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 73 @ 3 depPkg 71 [ 0, 1 ] DepSelector inst# 4558 - Adding VC for 73 @ 3 depPkg 60 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 73 @ 3 depPkg 22 [ 0, 1 ] DepSelector inst# 4558 - Adding VC for 73 @ 3 depPkg 34 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 73 @ 2 depPkg 71 [ 0, 1 ] DepSelector inst# 4558 - Adding VC for 73 @ 2 depPkg 60 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 73 @ 2 depPkg 22 [ 0, 1 ] DepSelector inst# 4558 - Adding VC for 73 @ 1 depPkg 71 [ 0, 1 ] DepSelector inst# 4558 - Adding VC for 73 @ 1 depPkg 60 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 73 @ 1 depPkg 22 [ 0, 1 ] DepSelector inst# 4558 - Adding VC for 73 @ 0 depPkg 71 [ 0, 1 ] DepSelector inst# 4558 - Adding VC for 73 @ 0 depPkg 60 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 73 @ 0 depPkg 22 [ 0, 1 ] DepSelector inst# 4558 - Adding package id 74/84: min = -1, max = 7, current version 0 DepSelector inst# 4558 - Adding VC for 74 @ 7 depPkg 47 [ 0, 4 ] DepSelector inst# 4558 - Adding package id 75/84: min = -1, max = 32, current version 0 DepSelector inst# 4558 - Adding VC for 74 @ 7 depPkg 75 [ 0, 32 ] DepSelector inst# 4558 - Adding VC for 74 @ 7 depPkg 22 [ 0, 1 ] DepSelector inst# 4558 - Adding VC for 74 @ 7 depPkg 61 [ 0, 6 ] DepSelector inst# 4558 - Adding VC for 74 @ 6 depPkg 47 [ 0, 4 ] DepSelector inst# 4558 - Adding VC for 74 @ 6 depPkg 75 [ 0, 32 ] DepSelector inst# 4558 - Adding VC for 74 @ 6 depPkg 22 [ 0, 1 ] DepSelector inst# 4558 - Adding VC for 74 @ 6 depPkg 61 [ 0, 6 ] DepSelector inst# 4558 - Adding VC for 74 @ 5 depPkg 47 [ 0, 4 ] DepSelector inst# 4558 - Adding VC for 74 @ 5 depPkg 22 [ 0, 1 ] DepSelector inst# 4558 - Adding VC for 74 @ 5 depPkg 61 [ 0, 6 ] DepSelector inst# 4558 - Adding VC for 74 @ 4 depPkg 47 [ 0, 4 ] DepSelector inst# 4558 - Adding VC for 74 @ 4 depPkg 22 [ 0, 1 ] DepSelector inst# 4558 - Adding VC for 74 @ 4 depPkg 61 [ 0, 6 ] DepSelector inst# 4558 - Adding VC for 74 @ 3 depPkg 47 [ 0, 4 ] DepSelector inst# 4558 - Adding VC for 74 @ 3 depPkg 22 [ 0, 1 ] DepSelector inst# 4558 - Adding VC for 74 @ 2 depPkg 47 [ 0, 4 ] DepSelector inst# 4558 - Adding VC for 74 @ 2 depPkg 22 [ 0, 1 ] DepSelector inst# 4558 - Adding VC for 74 @ 1 depPkg 47 [ 0, 4 ] DepSelector inst# 4558 - Adding VC for 74 @ 1 depPkg 22 [ 0, 1 ] DepSelector inst# 4558 - Adding VC for 74 @ 0 depPkg 22 [ 0, 1 ] DepSelector inst# 4558 - Adding VC for 75 @ 32 depPkg 59 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 75 @ 32 depPkg 47 [ 0, 4 ] DepSelector inst# 4558 - Adding VC for 75 @ 32 depPkg 22 [ 0, 1 ] DepSelector inst# 4558 - Adding package id 76/84: min = -1, max = 0, current version 0 DepSelector inst# 4558 - Adding VC for 75 @ 32 depPkg 76 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 75 @ 32 depPkg 34 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 75 @ 32 depPkg 61 [ 0, 6 ] DepSelector inst# 4558 - Adding package id 77/84: min = -1, max = 0, current version 0 DepSelector inst# 4558 - Adding VC for 75 @ 32 depPkg 77 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 75 @ 31 depPkg 59 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 75 @ 31 depPkg 47 [ 0, 4 ] DepSelector inst# 4558 - Adding VC for 75 @ 31 depPkg 22 [ 0, 1 ] DepSelector inst# 4558 - Adding VC for 75 @ 31 depPkg 76 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 75 @ 31 depPkg 34 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 75 @ 31 depPkg 61 [ 0, 6 ] DepSelector inst# 4558 - Adding VC for 75 @ 31 depPkg 77 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 75 @ 30 depPkg 59 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 75 @ 30 depPkg 47 [ 0, 4 ] DepSelector inst# 4558 - Adding VC for 75 @ 30 depPkg 6 [ 0, 5 ] DepSelector inst# 4558 - Adding VC for 75 @ 30 depPkg 22 [ 0, 1 ] DepSelector inst# 4558 - Adding VC for 75 @ 30 depPkg 76 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 75 @ 30 depPkg 34 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 75 @ 30 depPkg 61 [ 0, 6 ] DepSelector inst# 4558 - Adding VC for 75 @ 30 depPkg 62 [ 0, 4 ] DepSelector inst# 4558 - Adding VC for 75 @ 29 depPkg 59 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 75 @ 29 depPkg 47 [ 0, 4 ] DepSelector inst# 4558 - Adding VC for 75 @ 29 depPkg 6 [ 0, 5 ] DepSelector inst# 4558 - Adding VC for 75 @ 29 depPkg 22 [ 0, 1 ] DepSelector inst# 4558 - Adding VC for 75 @ 29 depPkg 76 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 75 @ 29 depPkg 34 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 75 @ 29 depPkg 61 [ 0, 6 ] DepSelector inst# 4558 - Adding VC for 75 @ 29 depPkg 62 [ 0, 4 ] DepSelector inst# 4558 - Adding VC for 75 @ 28 depPkg 59 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 75 @ 28 depPkg 47 [ 0, 4 ] DepSelector inst# 4558 - Adding VC for 75 @ 28 depPkg 6 [ 0, 5 ] DepSelector inst# 4558 - Adding VC for 75 @ 28 depPkg 22 [ 0, 1 ] DepSelector inst# 4558 - Adding VC for 75 @ 28 depPkg 76 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 75 @ 28 depPkg 34 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 75 @ 28 depPkg 61 [ 0, 6 ] DepSelector inst# 4558 - Adding VC for 75 @ 28 depPkg 62 [ 0, 4 ] DepSelector inst# 4558 - Adding VC for 75 @ 27 depPkg 59 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 75 @ 27 depPkg 47 [ 0, 4 ] DepSelector inst# 4558 - Adding VC for 75 @ 27 depPkg 6 [ 0, 5 ] DepSelector inst# 4558 - Adding VC for 75 @ 27 depPkg 22 [ 0, 1 ] DepSelector inst# 4558 - Adding VC for 75 @ 27 depPkg 76 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 75 @ 27 depPkg 34 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 75 @ 27 depPkg 61 [ 0, 6 ] DepSelector inst# 4558 - Adding VC for 75 @ 27 depPkg 62 [ 0, 4 ] DepSelector inst# 4558 - Adding VC for 75 @ 26 depPkg 59 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 75 @ 26 depPkg 47 [ 0, 4 ] DepSelector inst# 4558 - Adding VC for 75 @ 26 depPkg 6 [ 0, 5 ] DepSelector inst# 4558 - Adding VC for 75 @ 26 depPkg 22 [ 0, 1 ] DepSelector inst# 4558 - Adding VC for 75 @ 26 depPkg 76 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 75 @ 26 depPkg 34 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 75 @ 26 depPkg 61 [ 0, 6 ] DepSelector inst# 4558 - Adding VC for 75 @ 26 depPkg 62 [ 0, 4 ] DepSelector inst# 4558 - Adding VC for 75 @ 25 depPkg 59 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 75 @ 25 depPkg 47 [ 0, 4 ] DepSelector inst# 4558 - Adding VC for 75 @ 25 depPkg 6 [ 0, 5 ] DepSelector inst# 4558 - Adding VC for 75 @ 25 depPkg 22 [ 0, 1 ] DepSelector inst# 4558 - Adding VC for 75 @ 25 depPkg 76 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 75 @ 25 depPkg 34 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 75 @ 25 depPkg 61 [ 0, 6 ] DepSelector inst# 4558 - Adding VC for 75 @ 25 depPkg 62 [ 0, 4 ] DepSelector inst# 4558 - Adding VC for 75 @ 24 depPkg 59 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 75 @ 24 depPkg 47 [ 0, 4 ] DepSelector inst# 4558 - Adding VC for 75 @ 24 depPkg 6 [ 0, 5 ] DepSelector inst# 4558 - Adding VC for 75 @ 24 depPkg 22 [ 0, 1 ] DepSelector inst# 4558 - Adding VC for 75 @ 24 depPkg 76 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 75 @ 24 depPkg 34 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 75 @ 24 depPkg 61 [ 0, 6 ] DepSelector inst# 4558 - Adding VC for 75 @ 24 depPkg 62 [ 0, 4 ] DepSelector inst# 4558 - Adding VC for 75 @ 23 depPkg 59 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 75 @ 23 depPkg 47 [ 0, 4 ] DepSelector inst# 4558 - Adding VC for 75 @ 23 depPkg 6 [ 0, 5 ] DepSelector inst# 4558 - Adding VC for 75 @ 23 depPkg 22 [ 0, 1 ] DepSelector inst# 4558 - Adding VC for 75 @ 23 depPkg 76 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 75 @ 23 depPkg 34 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 75 @ 23 depPkg 61 [ 0, 6 ] DepSelector inst# 4558 - Adding VC for 75 @ 23 depPkg 62 [ 0, 4 ] DepSelector inst# 4558 - Adding VC for 75 @ 22 depPkg 59 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 75 @ 22 depPkg 47 [ 0, 4 ] DepSelector inst# 4558 - Adding VC for 75 @ 22 depPkg 6 [ 0, 5 ] DepSelector inst# 4558 - Adding VC for 75 @ 22 depPkg 22 [ 0, 1 ] DepSelector inst# 4558 - Adding VC for 75 @ 22 depPkg 76 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 75 @ 22 depPkg 34 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 75 @ 22 depPkg 61 [ 0, 6 ] DepSelector inst# 4558 - Adding VC for 75 @ 22 depPkg 62 [ 0, 4 ] DepSelector inst# 4558 - Adding VC for 75 @ 21 depPkg 59 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 75 @ 21 depPkg 47 [ 0, 4 ] DepSelector inst# 4558 - Adding VC for 75 @ 21 depPkg 6 [ 0, 5 ] DepSelector inst# 4558 - Adding VC for 75 @ 21 depPkg 22 [ 0, 1 ] DepSelector inst# 4558 - Adding VC for 75 @ 21 depPkg 76 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 75 @ 21 depPkg 34 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 75 @ 21 depPkg 61 [ 0, 6 ] DepSelector inst# 4558 - Adding VC for 75 @ 21 depPkg 62 [ 0, 4 ] DepSelector inst# 4558 - Adding VC for 75 @ 20 depPkg 59 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 75 @ 20 depPkg 47 [ 0, 4 ] DepSelector inst# 4558 - Adding VC for 75 @ 20 depPkg 6 [ 0, 5 ] DepSelector inst# 4558 - Adding VC for 75 @ 20 depPkg 22 [ 0, 1 ] DepSelector inst# 4558 - Adding VC for 75 @ 20 depPkg 76 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 75 @ 20 depPkg 34 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 75 @ 20 depPkg 61 [ 0, 6 ] DepSelector inst# 4558 - Adding VC for 75 @ 20 depPkg 62 [ 0, 4 ] DepSelector inst# 4558 - Adding VC for 75 @ 19 depPkg 59 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 75 @ 19 depPkg 47 [ 0, 4 ] DepSelector inst# 4558 - Adding VC for 75 @ 19 depPkg 6 [ 0, 5 ] DepSelector inst# 4558 - Adding VC for 75 @ 19 depPkg 22 [ 0, 1 ] DepSelector inst# 4558 - Adding VC for 75 @ 19 depPkg 76 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 75 @ 19 depPkg 34 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 75 @ 19 depPkg 61 [ 0, 6 ] DepSelector inst# 4558 - Adding VC for 75 @ 19 depPkg 62 [ 0, 4 ] DepSelector inst# 4558 - Adding VC for 75 @ 18 depPkg 59 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 75 @ 18 depPkg 47 [ 0, 4 ] DepSelector inst# 4558 - Adding VC for 75 @ 18 depPkg 6 [ 0, 5 ] DepSelector inst# 4558 - Adding VC for 75 @ 18 depPkg 22 [ 0, 1 ] DepSelector inst# 4558 - Adding VC for 75 @ 18 depPkg 76 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 75 @ 18 depPkg 34 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 75 @ 18 depPkg 61 [ 0, 6 ] DepSelector inst# 4558 - Adding VC for 75 @ 18 depPkg 62 [ 0, 4 ] DepSelector inst# 4558 - Adding VC for 75 @ 17 depPkg 59 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 75 @ 17 depPkg 47 [ 0, 4 ] DepSelector inst# 4558 - Adding VC for 75 @ 17 depPkg 6 [ 0, 5 ] DepSelector inst# 4558 - Adding VC for 75 @ 17 depPkg 22 [ 0, 1 ] DepSelector inst# 4558 - Adding VC for 75 @ 17 depPkg 76 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 75 @ 17 depPkg 34 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 75 @ 17 depPkg 61 [ 0, 6 ] DepSelector inst# 4558 - Adding VC for 75 @ 17 depPkg 62 [ 0, 4 ] DepSelector inst# 4558 - Adding VC for 75 @ 16 depPkg 59 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 75 @ 16 depPkg 47 [ 0, 4 ] DepSelector inst# 4558 - Adding VC for 75 @ 16 depPkg 6 [ 0, 5 ] DepSelector inst# 4558 - Adding VC for 75 @ 16 depPkg 22 [ 0, 1 ] DepSelector inst# 4558 - Adding VC for 75 @ 16 depPkg 76 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 75 @ 16 depPkg 34 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 75 @ 16 depPkg 61 [ 0, 6 ] DepSelector inst# 4558 - Adding VC for 75 @ 16 depPkg 62 [ 0, 4 ] DepSelector inst# 4558 - Adding VC for 75 @ 15 depPkg 59 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 75 @ 15 depPkg 47 [ 0, 4 ] DepSelector inst# 4558 - Adding VC for 75 @ 15 depPkg 6 [ 0, 5 ] DepSelector inst# 4558 - Adding VC for 75 @ 15 depPkg 22 [ 0, 1 ] DepSelector inst# 4558 - Adding VC for 75 @ 15 depPkg 76 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 75 @ 15 depPkg 34 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 75 @ 15 depPkg 61 [ 0, 6 ] DepSelector inst# 4558 - Adding VC for 75 @ 15 depPkg 62 [ 0, 4 ] DepSelector inst# 4558 - Adding VC for 75 @ 14 depPkg 59 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 75 @ 14 depPkg 47 [ 0, 4 ] DepSelector inst# 4558 - Adding VC for 75 @ 14 depPkg 6 [ 0, 5 ] DepSelector inst# 4558 - Adding VC for 75 @ 14 depPkg 22 [ 0, 1 ] DepSelector inst# 4558 - Adding VC for 75 @ 14 depPkg 76 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 75 @ 14 depPkg 34 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 75 @ 14 depPkg 61 [ 0, 6 ] DepSelector inst# 4558 - Adding VC for 75 @ 14 depPkg 62 [ 0, 4 ] DepSelector inst# 4558 - Adding VC for 75 @ 13 depPkg 59 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 75 @ 13 depPkg 47 [ 0, 4 ] DepSelector inst# 4558 - Adding VC for 75 @ 13 depPkg 6 [ 0, 5 ] DepSelector inst# 4558 - Adding VC for 75 @ 13 depPkg 22 [ 0, 1 ] DepSelector inst# 4558 - Adding VC for 75 @ 13 depPkg 76 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 75 @ 13 depPkg 34 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 75 @ 13 depPkg 61 [ 0, 6 ] DepSelector inst# 4558 - Adding VC for 75 @ 13 depPkg 62 [ 0, 4 ] DepSelector inst# 4558 - Adding VC for 75 @ 12 depPkg 59 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 75 @ 12 depPkg 47 [ 0, 4 ] DepSelector inst# 4558 - Adding VC for 75 @ 12 depPkg 6 [ 0, 5 ] DepSelector inst# 4558 - Adding VC for 75 @ 12 depPkg 22 [ 0, 1 ] DepSelector inst# 4558 - Adding VC for 75 @ 12 depPkg 76 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 75 @ 12 depPkg 34 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 75 @ 12 depPkg 61 [ 0, 6 ] DepSelector inst# 4558 - Adding VC for 75 @ 12 depPkg 62 [ 0, 4 ] DepSelector inst# 4558 - Adding VC for 75 @ 11 depPkg 59 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 75 @ 11 depPkg 47 [ 0, 4 ] DepSelector inst# 4558 - Adding VC for 75 @ 11 depPkg 6 [ 0, 5 ] DepSelector inst# 4558 - Adding VC for 75 @ 11 depPkg 22 [ 0, 1 ] DepSelector inst# 4558 - Adding VC for 75 @ 11 depPkg 76 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 75 @ 11 depPkg 34 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 75 @ 11 depPkg 61 [ 0, 6 ] DepSelector inst# 4558 - Adding VC for 75 @ 11 depPkg 62 [ 0, 4 ] DepSelector inst# 4558 - Adding VC for 75 @ 10 depPkg 59 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 75 @ 10 depPkg 47 [ 0, 4 ] DepSelector inst# 4558 - Adding VC for 75 @ 10 depPkg 6 [ 0, 5 ] DepSelector inst# 4558 - Adding VC for 75 @ 10 depPkg 22 [ 0, 1 ] DepSelector inst# 4558 - Adding VC for 75 @ 10 depPkg 76 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 75 @ 10 depPkg 34 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 75 @ 10 depPkg 61 [ 0, 6 ] DepSelector inst# 4558 - Adding VC for 75 @ 10 depPkg 62 [ 0, 4 ] DepSelector inst# 4558 - Adding VC for 75 @ 9 depPkg 59 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 75 @ 9 depPkg 47 [ 0, 4 ] DepSelector inst# 4558 - Adding VC for 75 @ 9 depPkg 6 [ 0, 5 ] DepSelector inst# 4558 - Adding VC for 75 @ 9 depPkg 22 [ 0, 1 ] DepSelector inst# 4558 - Adding VC for 75 @ 9 depPkg 76 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 75 @ 9 depPkg 34 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 75 @ 9 depPkg 62 [ 0, 4 ] DepSelector inst# 4558 - Adding VC for 75 @ 8 depPkg 59 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 75 @ 8 depPkg 47 [ 0, 4 ] DepSelector inst# 4558 - Adding VC for 75 @ 8 depPkg 6 [ 0, 5 ] DepSelector inst# 4558 - Adding VC for 75 @ 8 depPkg 22 [ 0, 1 ] DepSelector inst# 4558 - Adding VC for 75 @ 8 depPkg 76 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 75 @ 8 depPkg 34 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 75 @ 8 depPkg 62 [ 0, 4 ] DepSelector inst# 4558 - Adding VC for 75 @ 7 depPkg 59 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 75 @ 7 depPkg 47 [ 0, 4 ] DepSelector inst# 4558 - Adding VC for 75 @ 7 depPkg 6 [ 0, 5 ] DepSelector inst# 4558 - Adding VC for 75 @ 7 depPkg 22 [ 0, 1 ] DepSelector inst# 4558 - Adding VC for 75 @ 7 depPkg 76 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 75 @ 7 depPkg 34 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 75 @ 7 depPkg 62 [ 0, 4 ] DepSelector inst# 4558 - Adding VC for 75 @ 6 depPkg 59 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 75 @ 6 depPkg 47 [ 0, 4 ] DepSelector inst# 4558 - Adding VC for 75 @ 6 depPkg 6 [ 0, 5 ] DepSelector inst# 4558 - Adding VC for 75 @ 6 depPkg 22 [ 0, 1 ] DepSelector inst# 4558 - Adding VC for 75 @ 6 depPkg 76 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 75 @ 6 depPkg 34 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 75 @ 6 depPkg 62 [ 0, 4 ] DepSelector inst# 4558 - Adding VC for 75 @ 5 depPkg 59 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 75 @ 5 depPkg 47 [ 0, 4 ] DepSelector inst# 4558 - Adding VC for 75 @ 5 depPkg 6 [ 0, 5 ] DepSelector inst# 4558 - Adding VC for 75 @ 5 depPkg 22 [ 0, 1 ] DepSelector inst# 4558 - Adding VC for 75 @ 5 depPkg 76 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 75 @ 5 depPkg 34 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 75 @ 5 depPkg 62 [ 0, 4 ] DepSelector inst# 4558 - Adding VC for 75 @ 4 depPkg 59 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 75 @ 4 depPkg 47 [ 0, 4 ] DepSelector inst# 4558 - Adding VC for 75 @ 4 depPkg 6 [ 0, 5 ] DepSelector inst# 4558 - Adding VC for 75 @ 4 depPkg 22 [ 0, 1 ] DepSelector inst# 4558 - Adding VC for 75 @ 4 depPkg 76 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 75 @ 4 depPkg 34 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 75 @ 4 depPkg 62 [ 0, 4 ] DepSelector inst# 4558 - Adding VC for 75 @ 3 depPkg 59 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 75 @ 3 depPkg 47 [ 0, 4 ] DepSelector inst# 4558 - Adding VC for 75 @ 3 depPkg 6 [ 0, 5 ] DepSelector inst# 4558 - Adding VC for 75 @ 3 depPkg 22 [ 0, 1 ] DepSelector inst# 4558 - Adding VC for 75 @ 3 depPkg 76 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 75 @ 3 depPkg 34 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 75 @ 3 depPkg 62 [ 0, 4 ] DepSelector inst# 4558 - Adding VC for 75 @ 2 depPkg 59 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 75 @ 2 depPkg 47 [ 0, 4 ] DepSelector inst# 4558 - Adding VC for 75 @ 2 depPkg 6 [ 0, 5 ] DepSelector inst# 4558 - Adding VC for 75 @ 2 depPkg 22 [ 0, 1 ] DepSelector inst# 4558 - Adding VC for 75 @ 2 depPkg 76 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 75 @ 2 depPkg 34 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 75 @ 2 depPkg 62 [ 0, 4 ] DepSelector inst# 4558 - Adding VC for 75 @ 1 depPkg 59 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 75 @ 1 depPkg 47 [ 0, 4 ] DepSelector inst# 4558 - Adding VC for 75 @ 1 depPkg 6 [ 0, 5 ] DepSelector inst# 4558 - Adding VC for 75 @ 1 depPkg 22 [ 0, 1 ] DepSelector inst# 4558 - Adding VC for 75 @ 1 depPkg 76 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 75 @ 1 depPkg 34 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 75 @ 1 depPkg 62 [ 0, 4 ] DepSelector inst# 4558 - Adding VC for 75 @ 0 depPkg 59 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 75 @ 0 depPkg 47 [ 0, 4 ] DepSelector inst# 4558 - Adding VC for 75 @ 0 depPkg 6 [ 0, 5 ] DepSelector inst# 4558 - Adding VC for 75 @ 0 depPkg 22 [ 0, 1 ] DepSelector inst# 4558 - Adding VC for 75 @ 0 depPkg 76 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 75 @ 0 depPkg 34 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 75 @ 0 depPkg 62 [ 0, 4 ] DepSelector inst# 4558 - Adding VC for 77 @ 0 depPkg 7 [ 0, 3 ] DepSelector inst# 4558 - Adding VC for 77 @ 0 depPkg 38 [ 0, 4 ] DepSelector inst# 4558 - Adding package id 78/84: min = -1, max = 4, current version 0 DepSelector inst# 4558 - Adding VC for 78 @ 4 depPkg 75 [ 0, 32 ] DepSelector inst# 4558 - Adding VC for 78 @ 4 depPkg 22 [ 0, 1 ] DepSelector inst# 4558 - Adding VC for 78 @ 4 depPkg 61 [ 0, 6 ] DepSelector inst# 4558 - Adding VC for 78 @ 3 depPkg 75 [ 0, 32 ] DepSelector inst# 4558 - Adding VC for 78 @ 3 depPkg 22 [ 0, 1 ] DepSelector inst# 4558 - Adding VC for 78 @ 3 depPkg 61 [ 0, 6 ] DepSelector inst# 4558 - Adding VC for 78 @ 2 depPkg 22 [ 0, 1 ] DepSelector inst# 4558 - Adding VC for 78 @ 2 depPkg 61 [ 0, 6 ] DepSelector inst# 4558 - Adding VC for 78 @ 1 depPkg 22 [ 0, 1 ] DepSelector inst# 4558 - Adding VC for 78 @ 0 depPkg 22 [ 0, 1 ] DepSelector inst# 4558 - Adding package id 79/84: min = -1, max = 2, current version 0 DepSelector inst# 4558 - Adding VC for 79 @ 2 depPkg 22 [ 0, 1 ] DepSelector inst# 4558 - Adding VC for 79 @ 2 depPkg 61 [ 0, 6 ] DepSelector inst# 4558 - Adding VC for 79 @ 1 depPkg 22 [ 0, 1 ] DepSelector inst# 4558 - Adding VC for 79 @ 1 depPkg 61 [ 0, 6 ] DepSelector inst# 4558 - Adding VC for 79 @ 0 depPkg 22 [ 0, 1 ] DepSelector inst# 4558 - Adding package id 80/84: min = -1, max = 1, current version 0 DepSelector inst# 4558 - Adding VC for 80 @ 1 depPkg 71 [ 0, 1 ] DepSelector inst# 4558 - Adding VC for 80 @ 1 depPkg 60 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 80 @ 1 depPkg 22 [ 0, 1 ] DepSelector inst# 4558 - Adding VC for 80 @ 1 depPkg 34 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 80 @ 1 depPkg 61 [ 0, 6 ] DepSelector inst# 4558 - Adding VC for 80 @ 0 depPkg 71 [ 0, 1 ] DepSelector inst# 4558 - Adding VC for 80 @ 0 depPkg 60 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 80 @ 0 depPkg 22 [ 0, 1 ] DepSelector inst# 4558 - Adding VC for 80 @ 0 depPkg 34 [ 0, 0 ] DepSelector inst# 4558 - Adding VC for 80 @ 0 depPkg 61 [ 0, 6 ] DepSelector inst# 4558 - Adding package id 81/84: min = -1, max = 0, current version 0 DepSelector inst# 4558 - Adding VC for 81 @ 0 depPkg 38 [ 0, 4 ] DepSelector inst# 4558 - Adding package id 82/84: min = -1, max = 0, current version 0 DepSelector inst# 4558 - Adding VC for 82 @ 0 depPkg 38 [ 0, 4 ] DepSelector inst# 4558 - Adding package id 83/84: min = 0, max = 0, current version 0 DepSelector inst# 4558 - Marking Package Preferred Latest 0 weight 10 DepSelector inst# 4558 - Marking Package Required 0 DepSelector inst# 4558 - Adding VC for 83 @ 0 depPkg 0 [ 0, 3 ] DepSelector inst# 4558 - Marking Package Preferred Latest 3 weight 10 DepSelector inst# 4558 - Marking Package Required 3 DepSelector inst# 4558 - Adding VC for 83 @ 0 depPkg 3 [ 0, 2 ] DepSelector inst# 4558 - Marking Package Preferred Latest 4 weight 10 DepSelector inst# 4558 - Marking Package Required 4 DepSelector inst# 4558 - Adding VC for 83 @ 0 depPkg 4 [ 0, 5 ] DepSelector inst# 4558 - Marking Package Preferred Latest 9 weight 10 DepSelector inst# 4558 - Marking Package Required 9 DepSelector inst# 4558 - Adding VC for 83 @ 0 depPkg 9 [ 0, 2 ] DepSelector inst# 4558 - Marking Package Preferred Latest 10 weight 10 DepSelector inst# 4558 - Marking Package Required 10 DepSelector inst# 4558 - Adding VC for 83 @ 0 depPkg 10 [ 0, 0 ] DepSelector inst# 4558 - Marking Package Preferred Latest 11 weight 10 DepSelector inst# 4558 - Marking Package Required 11 DepSelector inst# 4558 - Adding VC for 83 @ 0 depPkg 11 [ 0, 0 ] DepSelector inst# 4558 - Marking Package Preferred Latest 12 weight 10 DepSelector inst# 4558 - Marking Package Required 12 DepSelector inst# 4558 - Adding VC for 83 @ 0 depPkg 12 [ 0, 0 ] DepSelector inst# 4558 - Marking Package Preferred Latest 13 weight 10 DepSelector inst# 4558 - Marking Package Required 13 DepSelector inst# 4558 - Adding VC for 83 @ 0 depPkg 13 [ 0, 1 ] DepSelector inst# 4558 - Marking Package Preferred Latest 14 weight 10 DepSelector inst# 4558 - Marking Package Required 14 DepSelector inst# 4558 - Adding VC for 83 @ 0 depPkg 14 [ 0, 0 ] DepSelector inst# 4558 - Marking Package Preferred Latest 15 weight 10 DepSelector inst# 4558 - Marking Package Required 15 DepSelector inst# 4558 - Adding VC for 83 @ 0 depPkg 15 [ 0, 1 ] DepSelector inst# 4558 - Marking Package Preferred Latest 16 weight 10 DepSelector inst# 4558 - Marking Package Required 16 DepSelector inst# 4558 - Adding VC for 83 @ 0 depPkg 16 [ 0, 0 ] DepSelector inst# 4558 - Marking Package Preferred Latest 17 weight 10 DepSelector inst# 4558 - Marking Package Required 17 DepSelector inst# 4558 - Adding VC for 83 @ 0 depPkg 17 [ 0, 1 ] DepSelector inst# 4558 - Marking Package Preferred Latest 18 weight 10 DepSelector inst# 4558 - Marking Package Required 18 DepSelector inst# 4558 - Adding VC for 83 @ 0 depPkg 18 [ 0, 0 ] DepSelector inst# 4558 - Marking Package Preferred Latest 19 weight 10 DepSelector inst# 4558 - Marking Package Required 19 DepSelector inst# 4558 - Adding VC for 83 @ 0 depPkg 19 [ 0, 0 ] DepSelector inst# 4558 - Marking Package Preferred Latest 20 weight 10 DepSelector inst# 4558 - Marking Package Required 20 DepSelector inst# 4558 - Adding VC for 83 @ 0 depPkg 20 [ 0, 2 ] DepSelector inst# 4558 - Marking Package Preferred Latest 21 weight 10 DepSelector inst# 4558 - Marking Package Required 21 DepSelector inst# 4558 - Adding VC for 83 @ 0 depPkg 21 [ 0, 0 ] DepSelector inst# 4558 - Marking Package Preferred Latest 22 weight 10 DepSelector inst# 4558 - Marking Package Required 22 DepSelector inst# 4558 - Adding VC for 83 @ 0 depPkg 22 [ 0, 1 ] DepSelector inst# 4558 - Marking Package Preferred Latest 22 weight 10 DepSelector inst# 4558 - Marking Package Required 22 DepSelector inst# 4558 - Adding VC for 83 @ 0 depPkg 22 [ 0, 1 ] DepSelector inst# 4558 - Marking Package Preferred Latest 23 weight 10 DepSelector inst# 4558 - Marking Package Required 23 DepSelector inst# 4558 - Adding VC for 83 @ 0 depPkg 23 [ 0, 0 ] DepSelector inst# 4558 - Marking Package Preferred Latest 24 weight 10 DepSelector inst# 4558 - Marking Package Required 24 DepSelector inst# 4558 - Adding VC for 83 @ 0 depPkg 24 [ 0, 2 ] DepSelector inst# 4558 - Marking Package Preferred Latest 25 weight 10 DepSelector inst# 4558 - Marking Package Required 25 DepSelector inst# 4558 - Adding VC for 83 @ 0 depPkg 25 [ 0, 3 ] DepSelector inst# 4558 - Marking Package Preferred Latest 26 weight 10 DepSelector inst# 4558 - Marking Package Required 26 DepSelector inst# 4558 - Adding VC for 83 @ 0 depPkg 26 [ 0, 1 ] DepSelector inst# 4558 - Marking Package Preferred Latest 27 weight 10 DepSelector inst# 4558 - Marking Package Required 27 DepSelector inst# 4558 - Adding VC for 83 @ 0 depPkg 27 [ 0, 3 ] DepSelector inst# 4558 - Marking Package Preferred Latest 28 weight 10 DepSelector inst# 4558 - Marking Package Required 28 DepSelector inst# 4558 - Adding VC for 83 @ 0 depPkg 28 [ 0, 5 ] DepSelector inst# 4558 - Marking Package Preferred Latest 29 weight 10 DepSelector inst# 4558 - Marking Package Required 29 DepSelector inst# 4558 - Adding VC for 83 @ 0 depPkg 29 [ 0, 0 ] DepSelector inst# 4558 - Marking Package Preferred Latest 29 weight 10 DepSelector inst# 4558 - Marking Package Required 29 DepSelector inst# 4558 - Adding VC for 83 @ 0 depPkg 29 [ 0, 0 ] DepSelector inst# 4558 - Marking Package Preferred Latest 30 weight 10 DepSelector inst# 4558 - Marking Package Required 30 DepSelector inst# 4558 - Adding VC for 83 @ 0 depPkg 30 [ 0, 2 ] DepSelector inst# 4558 - Marking Package Preferred Latest 32 weight 10 DepSelector inst# 4558 - Marking Package Required 32 DepSelector inst# 4558 - Adding VC for 83 @ 0 depPkg 32 [ 0, 2 ] DepSelector inst# 4558 - Marking Package Preferred Latest 32 weight 10 DepSelector inst# 4558 - Marking Package Required 32 DepSelector inst# 4558 - Adding VC for 83 @ 0 depPkg 32 [ 0, 2 ] DepSelector inst# 4558 - Marking Package Preferred Latest 32 weight 10 DepSelector inst# 4558 - Marking Package Required 32 DepSelector inst# 4558 - Adding VC for 83 @ 0 depPkg 32 [ 0, 2 ] DepSelector inst# 4558 - Marking Package Preferred Latest 32 weight 10 DepSelector inst# 4558 - Marking Package Required 32 DepSelector inst# 4558 - Adding VC for 83 @ 0 depPkg 32 [ 0, 2 ] DepSelector inst# 4558 - Marking Package Preferred Latest 32 weight 10 DepSelector inst# 4558 - Marking Package Required 32 DepSelector inst# 4558 - Adding VC for 83 @ 0 depPkg 32 [ 0, 2 ] DepSelector inst# 4558 - Marking Package Preferred Latest 32 weight 10 DepSelector inst# 4558 - Marking Package Required 32 DepSelector inst# 4558 - Adding VC for 83 @ 0 depPkg 32 [ 0, 2 ] DepSelector inst# 4558 - Marking Package Preferred Latest 32 weight 10 DepSelector inst# 4558 - Marking Package Required 32 DepSelector inst# 4558 - Adding VC for 83 @ 0 depPkg 32 [ 0, 2 ] DepSelector inst# 4558 - Marking Package Preferred Latest 32 weight 10 DepSelector inst# 4558 - Marking Package Required 32 DepSelector inst# 4558 - Adding VC for 83 @ 0 depPkg 32 [ 0, 2 ] DepSelector inst# 4558 - Marking Package Preferred Latest 32 weight 10 DepSelector inst# 4558 - Marking Package Required 32 DepSelector inst# 4558 - Adding VC for 83 @ 0 depPkg 32 [ 0, 2 ] DepSelector inst# 4558 - Marking Package Preferred Latest 32 weight 10 DepSelector inst# 4558 - Marking Package Required 32 DepSelector inst# 4558 - Adding VC for 83 @ 0 depPkg 32 [ 0, 2 ] DepSelector inst# 4558 - Marking Package Preferred Latest 32 weight 10 DepSelector inst# 4558 - Marking Package Required 32 DepSelector inst# 4558 - Adding VC for 83 @ 0 depPkg 32 [ 0, 2 ] DepSelector inst# 4558 - Marking Package Preferred Latest 32 weight 10 DepSelector inst# 4558 - Marking Package Required 32 DepSelector inst# 4558 - Adding VC for 83 @ 0 depPkg 32 [ 0, 2 ] DepSelector inst# 4558 - Marking Package Preferred Latest 32 weight 10 DepSelector inst# 4558 - Marking Package Required 32 DepSelector inst# 4558 - Adding VC for 83 @ 0 depPkg 32 [ 0, 2 ] DepSelector inst# 4558 - Marking Package Preferred Latest 32 weight 10 DepSelector inst# 4558 - Marking Package Required 32 DepSelector inst# 4558 - Adding VC for 83 @ 0 depPkg 32 [ 0, 2 ] DepSelector inst# 4558 - Marking Package Preferred Latest 33 weight 10 DepSelector inst# 4558 - Marking Package Required 33 DepSelector inst# 4558 - Adding VC for 83 @ 0 depPkg 33 [ 0, 0 ] DepSelector inst# 4558 - Marking Package Preferred Latest 33 weight 10 DepSelector inst# 4558 - Marking Package Required 33 DepSelector inst# 4558 - Adding VC for 83 @ 0 depPkg 33 [ 0, 0 ] DepSelector inst# 4558 - Marking Package Preferred Latest 35 weight 10 DepSelector inst# 4558 - Marking Package Required 35 DepSelector inst# 4558 - Adding VC for 83 @ 0 depPkg 35 [ 0, 24 ] DepSelector inst# 4558 - Marking Package Preferred Latest 39 weight 10 DepSelector inst# 4558 - Marking Package Required 39 DepSelector inst# 4558 - Adding VC for 83 @ 0 depPkg 39 [ 0, 3 ] DepSelector inst# 4558 - Marking Package Preferred Latest 40 weight 10 DepSelector inst# 4558 - Marking Package Required 40 DepSelector inst# 4558 - Adding VC for 83 @ 0 depPkg 40 [ 0, 2 ] DepSelector inst# 4558 - Marking Package Preferred Latest 41 weight 10 DepSelector inst# 4558 - Marking Package Required 41 DepSelector inst# 4558 - Adding VC for 83 @ 0 depPkg 41 [ 0, 2 ] DepSelector inst# 4558 - Marking Package Preferred Latest 41 weight 10 DepSelector inst# 4558 - Marking Package Required 41 DepSelector inst# 4558 - Adding VC for 83 @ 0 depPkg 41 [ 0, 2 ] DepSelector inst# 4558 - Marking Package Preferred Latest 42 weight 10 DepSelector inst# 4558 - Marking Package Required 42 DepSelector inst# 4558 - Adding VC for 83 @ 0 depPkg 42 [ 0, 1 ] DepSelector inst# 4558 - Marking Package Preferred Latest 43 weight 10 DepSelector inst# 4558 - Marking Package Required 43 DepSelector inst# 4558 - Adding VC for 83 @ 0 depPkg 43 [ 0, 7 ] DepSelector inst# 4558 - Marking Package Preferred Latest 44 weight 10 DepSelector inst# 4558 - Marking Package Required 44 DepSelector inst# 4558 - Adding VC for 83 @ 0 depPkg 44 [ 0, 1 ] DepSelector inst# 4558 - Marking Package Preferred Latest 45 weight 10 DepSelector inst# 4558 - Marking Package Required 45 DepSelector inst# 4558 - Adding VC for 83 @ 0 depPkg 45 [ 0, 1 ] DepSelector inst# 4558 - Marking Package Preferred Latest 47 weight 10 DepSelector inst# 4558 - Marking Package Required 47 DepSelector inst# 4558 - Adding VC for 83 @ 0 depPkg 47 [ 0, 4 ] DepSelector inst# 4558 - Marking Package Preferred Latest 53 weight 10 DepSelector inst# 4558 - Marking Package Required 53 DepSelector inst# 4558 - Adding VC for 83 @ 0 depPkg 53 [ 0, 1 ] DepSelector inst# 4558 - Marking Package Preferred Latest 54 weight 10 DepSelector inst# 4558 - Marking Package Required 54 DepSelector inst# 4558 - Adding VC for 83 @ 0 depPkg 54 [ 0, 0 ] DepSelector inst# 4558 - Marking Package Preferred Latest 54 weight 10 DepSelector inst# 4558 - Marking Package Required 54 DepSelector inst# 4558 - Adding VC for 83 @ 0 depPkg 54 [ 0, 0 ] DepSelector inst# 4558 - Marking Package Preferred Latest 54 weight 10 DepSelector inst# 4558 - Marking Package Required 54 DepSelector inst# 4558 - Adding VC for 83 @ 0 depPkg 54 [ 0, 0 ] DepSelector inst# 4558 - Marking Package Preferred Latest 54 weight 10 DepSelector inst# 4558 - Marking Package Required 54 DepSelector inst# 4558 - Adding VC for 83 @ 0 depPkg 54 [ 0, 0 ] DepSelector inst# 4558 - Marking Package Preferred Latest 55 weight 10 DepSelector inst# 4558 - Marking Package Required 55 DepSelector inst# 4558 - Adding VC for 83 @ 0 depPkg 55 [ 0, 4 ] DepSelector inst# 4558 - Marking Package Preferred Latest 56 weight 10 DepSelector inst# 4558 - Marking Package Required 56 DepSelector inst# 4558 - Adding VC for 83 @ 0 depPkg 56 [ 0, 3 ] DepSelector inst# 4558 - Marking Package Preferred Latest 57 weight 10 DepSelector inst# 4558 - Marking Package Required 57 DepSelector inst# 4558 - Adding VC for 83 @ 0 depPkg 57 [ 0, 5 ] DepSelector inst# 4558 - Marking Package Preferred Latest 57 weight 10 DepSelector inst# 4558 - Marking Package Required 57 DepSelector inst# 4558 - Adding VC for 83 @ 0 depPkg 57 [ 0, 5 ] DepSelector inst# 4558 - Marking Package Preferred Latest 67 weight 10 DepSelector inst# 4558 - Marking Package Required 67 DepSelector inst# 4558 - Adding VC for 83 @ 0 depPkg 67 [ 0, 7 ] DepSelector inst# 4558 - Marking Package Preferred Latest 68 weight 10 DepSelector inst# 4558 - Marking Package Required 68 DepSelector inst# 4558 - Adding VC for 83 @ 0 depPkg 68 [ 0, 1 ] DepSelector inst# 4558 - Marking Package Preferred Latest 69 weight 10 DepSelector inst# 4558 - Marking Package Required 69 DepSelector inst# 4558 - Adding VC for 83 @ 0 depPkg 69 [ 0, 0 ] DepSelector inst# 4558 - Marking Package Preferred Latest 69 weight 10 DepSelector inst# 4558 - Marking Package Required 69 DepSelector inst# 4558 - Adding VC for 83 @ 0 depPkg 69 [ 0, 0 ] DepSelector inst# 4558 - Marking Package Preferred Latest 70 weight 10 DepSelector inst# 4558 - Marking Package Required 70 DepSelector inst# 4558 - Adding VC for 83 @ 0 depPkg 70 [ 0, 1 ] DepSelector inst# 4558 - Marking Package Preferred Latest 72 weight 10 DepSelector inst# 4558 - Marking Package Required 72 DepSelector inst# 4558 - Adding VC for 83 @ 0 depPkg 72 [ 0, 0 ] DepSelector inst# 4558 - Marking Package Preferred Latest 73 weight 10 DepSelector inst# 4558 - Marking Package Required 73 DepSelector inst# 4558 - Adding VC for 83 @ 0 depPkg 73 [ 0, 11 ] DepSelector inst# 4558 - Marking Package Preferred Latest 74 weight 10 DepSelector inst# 4558 - Marking Package Required 74 DepSelector inst# 4558 - Adding VC for 83 @ 0 depPkg 74 [ 0, 7 ] DepSelector inst# 4558 - Marking Package Preferred Latest 78 weight 10 DepSelector inst# 4558 - Marking Package Required 78 DepSelector inst# 4558 - Adding VC for 83 @ 0 depPkg 78 [ 0, 4 ] DepSelector inst# 4558 - Marking Package Preferred Latest 79 weight 10 DepSelector inst# 4558 - Marking Package Required 79 DepSelector inst# 4558 - Adding VC for 83 @ 0 depPkg 79 [ 0, 2 ] DepSelector inst# 4558 - Marking Package Preferred Latest 80 weight 10 DepSelector inst# 4558 - Marking Package Required 80 DepSelector inst# 4558 - Adding VC for 83 @ 0 depPkg 80 [ 0, 1 ] DepSelector inst# 4558 - Marking Package Preferred Latest 75 weight 10 DepSelector inst# 4558 - Marking Package Required 75 DepSelector inst# 4558 - Adding VC for 83 @ 0 depPkg 75 [ 0, 32 ] DepSelector inst# 4558 - Marking Package Preferred Latest 75 weight 10 DepSelector inst# 4558 - Marking Package Required 75 DepSelector inst# 4558 - Adding VC for 83 @ 0 depPkg 75 [ 0, 32 ] DepSelector inst# 4558 - Marking Package Preferred Latest 81 weight 10 DepSelector inst# 4558 - Marking Package Required 81 DepSelector inst# 4558 - Adding VC for 83 @ 0 depPkg 81 [ 0, 0 ] DepSelector inst# 4558 - Marking Package Preferred Latest 81 weight 10 DepSelector inst# 4558 - Marking Package Required 81 DepSelector inst# 4558 - Adding VC for 83 @ 0 depPkg 81 [ 0, 0 ] DepSelector inst# 4558 - Marking Package Preferred Latest 82 weight 10 DepSelector inst# 4558 - Marking Package Required 82 DepSelector inst# 4558 - Adding VC for 83 @ 0 depPkg 82 [ 0, 0 ] DepSelector inst# 4558 - Marking Package Preferred Latest 75 weight 10 DepSelector inst# 4558 - Marking Package Required 75 DepSelector inst# 4558 - Adding VC for 83 @ 0 depPkg 75 [ 0, 32 ] dep-selector-1.0.3/example/311a15e7-3378-4c5b-beb7-86a1b9cf0ea9000066400000000000000000001207011232552612700224060ustar00rootroot00000000000000 Creating VersionProblem inst# 5893 with 64 packages, 1 stats, 1 debug DepSelector inst# 5893 - Adding package id 0/64: min = -1, max = 2, current version 0 DepSelector inst# 5893 - Adding package id 1/64: min = -1, max = 5, current version 0 DepSelector inst# 5893 - Adding package id 2/64: min = -1, max = 5, current version 0 DepSelector inst# 5893 - Adding VC for 1 @ 5 depPkg 2 [ 0, 5 ] DepSelector inst# 5893 - Adding package id 3/64: min = -1, max = 5, current version 0 DepSelector inst# 5893 - Adding VC for 1 @ 5 depPkg 3 [ 0, 5 ] DepSelector inst# 5893 - Adding VC for 1 @ 4 depPkg 2 [ 0, 5 ] DepSelector inst# 5893 - Adding VC for 1 @ 3 depPkg 2 [ 0, 5 ] DepSelector inst# 5893 - Adding VC for 1 @ 2 depPkg 2 [ 0, 5 ] DepSelector inst# 5893 - Adding VC for 1 @ 1 depPkg 2 [ 0, 5 ] DepSelector inst# 5893 - Adding VC for 1 @ 0 depPkg 2 [ 0, 5 ] DepSelector inst# 5893 - Adding package id 4/64: min = -1, max = 3, current version 0 DepSelector inst# 5893 - Adding VC for 2 @ 5 depPkg 4 [ 0, 3 ] DepSelector inst# 5893 - Adding package id 5/64: min = -1, max = 0, current version 0 DepSelector inst# 5893 - Adding VC for 2 @ 5 depPkg 5 [ 0, 0 ] DepSelector inst# 5893 - Adding VC for 2 @ 4 depPkg 4 [ 0, 3 ] DepSelector inst# 5893 - Adding VC for 2 @ 4 depPkg 5 [ 0, 0 ] DepSelector inst# 5893 - Adding VC for 2 @ 3 depPkg 4 [ 0, 3 ] DepSelector inst# 5893 - Adding VC for 2 @ 3 depPkg 5 [ 0, 0 ] DepSelector inst# 5893 - Adding VC for 2 @ 2 depPkg 4 [ 0, 3 ] DepSelector inst# 5893 - Adding VC for 2 @ 2 depPkg 5 [ 0, 0 ] DepSelector inst# 5893 - Adding VC for 2 @ 1 depPkg 4 [ 0, 3 ] DepSelector inst# 5893 - Adding VC for 2 @ 1 depPkg 5 [ 0, 0 ] DepSelector inst# 5893 - Adding VC for 2 @ 0 depPkg 4 [ 0, 3 ] DepSelector inst# 5893 - Adding VC for 2 @ 0 depPkg 5 [ 0, 0 ] DepSelector inst# 5893 - Adding package id 6/64: min = -1, max = 2, current version 0 DepSelector inst# 5893 - Adding package id 7/64: min = -1, max = 0, current version 0 DepSelector inst# 5893 - Adding package id 8/64: min = -1, max = 0, current version 0 DepSelector inst# 5893 - Adding package id 9/64: min = -1, max = 0, current version 0 DepSelector inst# 5893 - Adding package id 10/64: min = -1, max = 1, current version 0 DepSelector inst# 5893 - Adding package id 11/64: min = -1, max = 0, current version 0 DepSelector inst# 5893 - Adding package id 12/64: min = -1, max = 1, current version 0 DepSelector inst# 5893 - Adding package id 13/64: min = -1, max = 0, current version 0 DepSelector inst# 5893 - Adding package id 14/64: min = -1, max = 1, current version 0 DepSelector inst# 5893 - Adding package id 15/64: min = -1, max = 0, current version 0 DepSelector inst# 5893 - Adding package id 16/64: min = -1, max = 0, current version 0 DepSelector inst# 5893 - Adding package id 17/64: min = -1, max = 2, current version 0 DepSelector inst# 5893 - Adding package id 18/64: min = -1, max = 0, current version 0 DepSelector inst# 5893 - Adding package id 19/64: min = -1, max = 1, current version 0 DepSelector inst# 5893 - Adding package id 20/64: min = -1, max = 0, current version 0 DepSelector inst# 5893 - Adding package id 21/64: min = -1, max = 2, current version 0 DepSelector inst# 5893 - Adding package id 22/64: min = -1, max = 3, current version 0 DepSelector inst# 5893 - Adding package id 23/64: min = -1, max = 1, current version 0 DepSelector inst# 5893 - Adding VC for 23 @ 1 depPkg 4 [ 0, 3 ] DepSelector inst# 5893 - Adding VC for 23 @ 0 depPkg 4 [ 0, 3 ] DepSelector inst# 5893 - Adding VC for 23 @ 0 depPkg 3 [ 0, 5 ] DepSelector inst# 5893 - Adding package id 24/64: min = -1, max = 3, current version 0 DepSelector inst# 5893 - Adding package id 25/64: min = -1, max = 5, current version 0 DepSelector inst# 5893 - Adding package id 26/64: min = -1, max = 0, current version 0 DepSelector inst# 5893 - Adding package id 27/64: min = -1, max = 2, current version 0 DepSelector inst# 5893 - Adding package id 28/64: min = -1, max = 0, current version 0 DepSelector inst# 5893 - Adding VC for 27 @ 2 depPkg 28 [ 0, 0 ] DepSelector inst# 5893 - Adding package id 29/64: min = -1, max = 2, current version 0 DepSelector inst# 5893 - Adding package id 30/64: min = -1, max = 0, current version 0 DepSelector inst# 5893 - Adding package id 31/64: min = -1, max = 0, current version 0 DepSelector inst# 5893 - Adding VC for 30 @ 0 depPkg 31 [ 0, 0 ] DepSelector inst# 5893 - Adding package id 32/64: min = -1, max = 24, current version 0 DepSelector inst# 5893 - Adding package id 33/64: min = -1, max = 0, current version 0 DepSelector inst# 5893 - Adding VC for 32 @ 24 depPkg 33 [ 0, 0 ] DepSelector inst# 5893 - Adding VC for 32 @ 24 depPkg 3 [ 0, 5 ] DepSelector inst# 5893 - Adding VC for 32 @ 23 depPkg 33 [ 0, 0 ] DepSelector inst# 5893 - Adding VC for 32 @ 23 depPkg 3 [ 0, 5 ] DepSelector inst# 5893 - Adding VC for 32 @ 22 depPkg 33 [ 0, 0 ] DepSelector inst# 5893 - Adding VC for 32 @ 22 depPkg 3 [ 0, 5 ] DepSelector inst# 5893 - Adding VC for 32 @ 21 depPkg 33 [ 0, 0 ] DepSelector inst# 5893 - Adding VC for 32 @ 21 depPkg 3 [ 0, 5 ] DepSelector inst# 5893 - Adding VC for 32 @ 20 depPkg 33 [ 0, 0 ] DepSelector inst# 5893 - Adding VC for 32 @ 20 depPkg 3 [ 0, 5 ] DepSelector inst# 5893 - Adding VC for 32 @ 19 depPkg 33 [ 0, 0 ] DepSelector inst# 5893 - Adding VC for 32 @ 19 depPkg 3 [ 0, 5 ] DepSelector inst# 5893 - Adding VC for 32 @ 18 depPkg 33 [ 0, 0 ] DepSelector inst# 5893 - Adding VC for 32 @ 18 depPkg 3 [ 0, 5 ] DepSelector inst# 5893 - Adding VC for 32 @ 17 depPkg 33 [ 0, 0 ] DepSelector inst# 5893 - Adding VC for 32 @ 17 depPkg 3 [ 0, 5 ] DepSelector inst# 5893 - Adding VC for 32 @ 16 depPkg 33 [ 0, 0 ] DepSelector inst# 5893 - Adding VC for 32 @ 16 depPkg 3 [ 0, 5 ] DepSelector inst# 5893 - Adding VC for 32 @ 15 depPkg 33 [ 0, 0 ] DepSelector inst# 5893 - Adding VC for 32 @ 15 depPkg 3 [ 0, 5 ] DepSelector inst# 5893 - Adding VC for 32 @ 14 depPkg 33 [ 0, 0 ] DepSelector inst# 5893 - Adding VC for 32 @ 14 depPkg 3 [ 0, 5 ] DepSelector inst# 5893 - Adding VC for 32 @ 13 depPkg 33 [ 0, 0 ] DepSelector inst# 5893 - Adding VC for 32 @ 13 depPkg 3 [ 0, 5 ] DepSelector inst# 5893 - Adding VC for 32 @ 12 depPkg 33 [ 0, 0 ] DepSelector inst# 5893 - Adding VC for 32 @ 12 depPkg 3 [ 0, 5 ] DepSelector inst# 5893 - Adding VC for 32 @ 11 depPkg 33 [ 0, 0 ] DepSelector inst# 5893 - Adding VC for 32 @ 11 depPkg 3 [ 0, 5 ] DepSelector inst# 5893 - Adding VC for 32 @ 10 depPkg 33 [ 0, 0 ] DepSelector inst# 5893 - Adding VC for 32 @ 10 depPkg 3 [ 0, 5 ] DepSelector inst# 5893 - Adding VC for 32 @ 9 depPkg 33 [ 0, 0 ] DepSelector inst# 5893 - Adding VC for 32 @ 9 depPkg 3 [ 0, 5 ] DepSelector inst# 5893 - Adding VC for 32 @ 8 depPkg 33 [ 0, 0 ] DepSelector inst# 5893 - Adding VC for 32 @ 8 depPkg 3 [ 0, 5 ] DepSelector inst# 5893 - Adding VC for 32 @ 7 depPkg 33 [ 0, 0 ] DepSelector inst# 5893 - Adding VC for 32 @ 7 depPkg 3 [ 0, 5 ] DepSelector inst# 5893 - Adding VC for 32 @ 6 depPkg 33 [ 0, 0 ] DepSelector inst# 5893 - Adding VC for 32 @ 6 depPkg 3 [ 0, 5 ] DepSelector inst# 5893 - Adding VC for 32 @ 5 depPkg 33 [ 0, 0 ] DepSelector inst# 5893 - Adding VC for 32 @ 5 depPkg 3 [ 0, 5 ] DepSelector inst# 5893 - Adding VC for 32 @ 4 depPkg 33 [ 0, 0 ] DepSelector inst# 5893 - Adding VC for 32 @ 4 depPkg 3 [ 0, 5 ] DepSelector inst# 5893 - Adding VC for 32 @ 3 depPkg 33 [ 0, 0 ] DepSelector inst# 5893 - Adding VC for 32 @ 3 depPkg 3 [ 0, 5 ] DepSelector inst# 5893 - Adding VC for 32 @ 2 depPkg 33 [ 0, 0 ] DepSelector inst# 5893 - Adding VC for 32 @ 2 depPkg 3 [ 0, 5 ] DepSelector inst# 5893 - Adding VC for 32 @ 1 depPkg 3 [ 0, 5 ] DepSelector inst# 5893 - Adding package id 34/64: min = -1, max = 0, current version 0 DepSelector inst# 5893 - Adding VC for 33 @ 0 depPkg 34 [ 0, 0 ] DepSelector inst# 5893 - Adding package id 35/64: min = -1, max = 4, current version 0 DepSelector inst# 5893 - Adding VC for 34 @ 0 depPkg 35 [ 0, 4 ] DepSelector inst# 5893 - Adding VC for 35 @ 4 depPkg 1 [ 0, 5 ] DepSelector inst# 5893 - Adding VC for 35 @ 3 depPkg 1 [ 0, 5 ] DepSelector inst# 5893 - Adding VC for 35 @ 2 depPkg 1 [ 0, 5 ] DepSelector inst# 5893 - Adding package id 36/64: min = -1, max = 3, current version 0 DepSelector inst# 5893 - Adding VC for 36 @ 3 depPkg 35 [ 0, 4 ] DepSelector inst# 5893 - Adding VC for 36 @ 2 depPkg 35 [ 0, 4 ] DepSelector inst# 5893 - Adding VC for 36 @ 1 depPkg 35 [ 0, 4 ] DepSelector inst# 5893 - Adding VC for 36 @ 0 depPkg 35 [ 0, 4 ] DepSelector inst# 5893 - Adding package id 37/64: min = -1, max = 2, current version 0 DepSelector inst# 5893 - Adding package id 38/64: min = -1, max = 2, current version 0 DepSelector inst# 5893 - Adding package id 39/64: min = -1, max = 0, current version 0 DepSelector inst# 5893 - Adding package id 40/64: min = -1, max = 1, current version 0 DepSelector inst# 5893 - Adding package id 41/64: min = -1, max = 2, current version 0 DepSelector inst# 5893 - Adding VC for 40 @ 1 depPkg 41 [ 0, 2 ] DepSelector inst# 5893 - Adding package id 42/64: min = -1, max = 3, current version 0 DepSelector inst# 5893 - Adding VC for 40 @ 1 depPkg 42 [ 0, 3 ] DepSelector inst# 5893 - Adding VC for 40 @ 1 depPkg 3 [ 0, 5 ] DepSelector inst# 5893 - Adding package id 43/64: min = -1, max = 0, current version 0 DepSelector inst# 5893 - Adding VC for 40 @ 1 depPkg 43 [ 0, 0 ] DepSelector inst# 5893 - Adding VC for 40 @ 0 depPkg 42 [ 0, 3 ] DepSelector inst# 5893 - Adding VC for 40 @ 0 depPkg 3 [ 0, 5 ] DepSelector inst# 5893 - Adding VC for 40 @ 0 depPkg 43 [ 0, 0 ] DepSelector inst# 5893 - Adding package id 44/64: min = -1, max = 0, current version 0 DepSelector inst# 5893 - Adding VC for 42 @ 3 depPkg 44 [ 0, 0 ] DepSelector inst# 5893 - Adding VC for 42 @ 2 depPkg 44 [ 0, 0 ] DepSelector inst# 5893 - Adding VC for 42 @ 1 depPkg 44 [ 0, 0 ] DepSelector inst# 5893 - Adding VC for 42 @ 0 depPkg 44 [ 0, 0 ] DepSelector inst# 5893 - Adding package id 45/64: min = -1, max = 22, current version 0 DepSelector inst# 5893 - Adding VC for 45 @ 22 depPkg 41 [ 0, 2 ] DepSelector inst# 5893 - Adding package id 46/64: min = -1, max = 2, current version 0 DepSelector inst# 5893 - Adding VC for 45 @ 22 depPkg 46 [ 0, 2 ] DepSelector inst# 5893 - Adding package id 47/64: min = -1, max = 1, current version 0 DepSelector inst# 5893 - Adding VC for 45 @ 22 depPkg 47 [ 0, 1 ] DepSelector inst# 5893 - Adding package id 48/64: min = -1, max = 0, current version 0 DepSelector inst# 5893 - Adding VC for 45 @ 22 depPkg 48 [ 0, 0 ] DepSelector inst# 5893 - Adding package id 49/64: min = -1, max = 0, current version 0 DepSelector inst# 5893 - Adding VC for 45 @ 22 depPkg 49 [ 0, 0 ] DepSelector inst# 5893 - Adding VC for 45 @ 22 depPkg 31 [ 0, 0 ] DepSelector inst# 5893 - Adding VC for 45 @ 22 depPkg 19 [ 0, 1 ] DepSelector inst# 5893 - Adding VC for 45 @ 22 depPkg 3 [ 0, 5 ] DepSelector inst# 5893 - Adding package id 50/64: min = -1, max = 6, current version 0 DepSelector inst# 5893 - Adding VC for 45 @ 22 depPkg 50 [ 0, 6 ] DepSelector inst# 5893 - Adding VC for 45 @ 21 depPkg 41 [ 0, 2 ] DepSelector inst# 5893 - Adding VC for 45 @ 21 depPkg 46 [ 0, 2 ] DepSelector inst# 5893 - Adding VC for 45 @ 21 depPkg 47 [ 0, 1 ] DepSelector inst# 5893 - Adding VC for 45 @ 21 depPkg 48 [ 0, 0 ] DepSelector inst# 5893 - Adding VC for 45 @ 21 depPkg 49 [ 0, 0 ] DepSelector inst# 5893 - Adding VC for 45 @ 21 depPkg 31 [ 0, 0 ] DepSelector inst# 5893 - Adding VC for 45 @ 21 depPkg 19 [ 0, 1 ] DepSelector inst# 5893 - Adding VC for 45 @ 21 depPkg 3 [ 0, 5 ] DepSelector inst# 5893 - Adding VC for 45 @ 21 depPkg 50 [ 0, 6 ] DepSelector inst# 5893 - Adding VC for 45 @ 20 depPkg 41 [ 0, 2 ] DepSelector inst# 5893 - Adding VC for 45 @ 20 depPkg 46 [ 0, 2 ] DepSelector inst# 5893 - Adding VC for 45 @ 20 depPkg 47 [ 0, 1 ] DepSelector inst# 5893 - Adding VC for 45 @ 20 depPkg 48 [ 0, 0 ] DepSelector inst# 5893 - Adding VC for 45 @ 20 depPkg 49 [ 0, 0 ] DepSelector inst# 5893 - Adding VC for 45 @ 20 depPkg 31 [ 0, 0 ] DepSelector inst# 5893 - Adding VC for 45 @ 20 depPkg 19 [ 0, 1 ] DepSelector inst# 5893 - Adding VC for 45 @ 20 depPkg 3 [ 0, 5 ] DepSelector inst# 5893 - Adding VC for 45 @ 20 depPkg 50 [ 0, 6 ] DepSelector inst# 5893 - Adding VC for 45 @ 19 depPkg 41 [ 0, 2 ] DepSelector inst# 5893 - Adding VC for 45 @ 19 depPkg 46 [ 0, 2 ] DepSelector inst# 5893 - Adding package id 51/64: min = -1, max = 2, current version 0 DepSelector inst# 5893 - Adding VC for 45 @ 19 depPkg 51 [ 0, 2 ] DepSelector inst# 5893 - Adding VC for 45 @ 19 depPkg 47 [ 0, 1 ] DepSelector inst# 5893 - Adding VC for 45 @ 19 depPkg 48 [ 0, 0 ] DepSelector inst# 5893 - Adding VC for 45 @ 19 depPkg 49 [ 0, 0 ] DepSelector inst# 5893 - Adding VC for 45 @ 19 depPkg 31 [ 0, 0 ] DepSelector inst# 5893 - Adding VC for 45 @ 19 depPkg 19 [ 0, 1 ] DepSelector inst# 5893 - Adding VC for 45 @ 19 depPkg 3 [ 0, 5 ] DepSelector inst# 5893 - Adding VC for 45 @ 19 depPkg 50 [ 0, 6 ] DepSelector inst# 5893 - Adding VC for 45 @ 18 depPkg 41 [ 0, 2 ] DepSelector inst# 5893 - Adding VC for 45 @ 18 depPkg 46 [ 0, 2 ] DepSelector inst# 5893 - Adding VC for 45 @ 18 depPkg 51 [ 0, 2 ] DepSelector inst# 5893 - Adding VC for 45 @ 18 depPkg 47 [ 0, 1 ] DepSelector inst# 5893 - Adding VC for 45 @ 18 depPkg 48 [ 0, 0 ] DepSelector inst# 5893 - Adding VC for 45 @ 18 depPkg 49 [ 0, 0 ] DepSelector inst# 5893 - Adding VC for 45 @ 18 depPkg 31 [ 0, 0 ] DepSelector inst# 5893 - Adding VC for 45 @ 18 depPkg 19 [ 0, 1 ] DepSelector inst# 5893 - Adding VC for 45 @ 18 depPkg 3 [ 0, 5 ] DepSelector inst# 5893 - Adding VC for 45 @ 18 depPkg 50 [ 0, 6 ] DepSelector inst# 5893 - Adding VC for 45 @ 17 depPkg 41 [ 0, 2 ] DepSelector inst# 5893 - Adding VC for 45 @ 17 depPkg 46 [ 0, 2 ] DepSelector inst# 5893 - Adding VC for 45 @ 17 depPkg 51 [ 0, 2 ] DepSelector inst# 5893 - Adding VC for 45 @ 17 depPkg 47 [ 0, 1 ] DepSelector inst# 5893 - Adding VC for 45 @ 17 depPkg 48 [ 0, 0 ] DepSelector inst# 5893 - Adding VC for 45 @ 17 depPkg 49 [ 0, 0 ] DepSelector inst# 5893 - Adding VC for 45 @ 17 depPkg 31 [ 0, 0 ] DepSelector inst# 5893 - Adding VC for 45 @ 17 depPkg 19 [ 0, 1 ] DepSelector inst# 5893 - Adding VC for 45 @ 17 depPkg 3 [ 0, 5 ] DepSelector inst# 5893 - Adding VC for 45 @ 17 depPkg 50 [ 0, 6 ] DepSelector inst# 5893 - Adding VC for 45 @ 16 depPkg 41 [ 0, 2 ] DepSelector inst# 5893 - Adding VC for 45 @ 16 depPkg 46 [ 0, 2 ] DepSelector inst# 5893 - Adding VC for 45 @ 16 depPkg 51 [ 0, 2 ] DepSelector inst# 5893 - Adding VC for 45 @ 16 depPkg 47 [ 0, 1 ] DepSelector inst# 5893 - Adding VC for 45 @ 16 depPkg 48 [ 0, 0 ] DepSelector inst# 5893 - Adding VC for 45 @ 16 depPkg 49 [ 0, 0 ] DepSelector inst# 5893 - Adding VC for 45 @ 16 depPkg 31 [ 0, 0 ] DepSelector inst# 5893 - Adding VC for 45 @ 16 depPkg 19 [ 0, 1 ] DepSelector inst# 5893 - Adding VC for 45 @ 16 depPkg 3 [ 0, 5 ] DepSelector inst# 5893 - Adding VC for 45 @ 16 depPkg 50 [ 0, 6 ] DepSelector inst# 5893 - Adding VC for 45 @ 15 depPkg 41 [ 0, 2 ] DepSelector inst# 5893 - Adding VC for 45 @ 15 depPkg 46 [ 0, 2 ] DepSelector inst# 5893 - Adding VC for 45 @ 15 depPkg 51 [ 0, 2 ] DepSelector inst# 5893 - Adding VC for 45 @ 15 depPkg 47 [ 0, 1 ] DepSelector inst# 5893 - Adding VC for 45 @ 15 depPkg 48 [ 0, 0 ] DepSelector inst# 5893 - Adding VC for 45 @ 15 depPkg 49 [ 0, 0 ] DepSelector inst# 5893 - Adding VC for 45 @ 15 depPkg 31 [ 0, 0 ] DepSelector inst# 5893 - Adding VC for 45 @ 15 depPkg 19 [ 0, 1 ] DepSelector inst# 5893 - Adding VC for 45 @ 15 depPkg 3 [ 0, 5 ] DepSelector inst# 5893 - Adding VC for 45 @ 15 depPkg 50 [ 0, 6 ] DepSelector inst# 5893 - Adding VC for 45 @ 14 depPkg 41 [ 0, 2 ] DepSelector inst# 5893 - Adding VC for 45 @ 14 depPkg 46 [ 0, 2 ] DepSelector inst# 5893 - Adding VC for 45 @ 14 depPkg 51 [ 0, 2 ] DepSelector inst# 5893 - Adding VC for 45 @ 14 depPkg 47 [ 0, 1 ] DepSelector inst# 5893 - Adding VC for 45 @ 14 depPkg 48 [ 0, 0 ] DepSelector inst# 5893 - Adding VC for 45 @ 14 depPkg 49 [ 0, 0 ] DepSelector inst# 5893 - Adding VC for 45 @ 14 depPkg 31 [ 0, 0 ] DepSelector inst# 5893 - Adding VC for 45 @ 14 depPkg 19 [ 0, 1 ] DepSelector inst# 5893 - Adding VC for 45 @ 14 depPkg 3 [ 0, 5 ] DepSelector inst# 5893 - Adding VC for 45 @ 14 depPkg 50 [ 0, 6 ] DepSelector inst# 5893 - Adding VC for 45 @ 13 depPkg 41 [ 0, 2 ] DepSelector inst# 5893 - Adding VC for 45 @ 13 depPkg 46 [ 0, 2 ] DepSelector inst# 5893 - Adding VC for 45 @ 13 depPkg 51 [ 0, 2 ] DepSelector inst# 5893 - Adding VC for 45 @ 13 depPkg 47 [ 0, 1 ] DepSelector inst# 5893 - Adding VC for 45 @ 13 depPkg 48 [ 0, 0 ] DepSelector inst# 5893 - Adding VC for 45 @ 13 depPkg 49 [ 0, 0 ] DepSelector inst# 5893 - Adding VC for 45 @ 13 depPkg 31 [ 0, 0 ] DepSelector inst# 5893 - Adding VC for 45 @ 13 depPkg 19 [ 0, 1 ] DepSelector inst# 5893 - Adding VC for 45 @ 13 depPkg 3 [ 0, 5 ] DepSelector inst# 5893 - Adding VC for 45 @ 13 depPkg 50 [ 0, 6 ] DepSelector inst# 5893 - Adding VC for 45 @ 12 depPkg 41 [ 0, 2 ] DepSelector inst# 5893 - Adding VC for 45 @ 12 depPkg 46 [ 0, 2 ] DepSelector inst# 5893 - Adding VC for 45 @ 12 depPkg 51 [ 0, 2 ] DepSelector inst# 5893 - Adding VC for 45 @ 12 depPkg 47 [ 0, 1 ] DepSelector inst# 5893 - Adding VC for 45 @ 12 depPkg 48 [ 0, 0 ] DepSelector inst# 5893 - Adding VC for 45 @ 12 depPkg 49 [ 0, 0 ] DepSelector inst# 5893 - Adding VC for 45 @ 12 depPkg 31 [ 0, 0 ] DepSelector inst# 5893 - Adding VC for 45 @ 12 depPkg 19 [ 0, 1 ] DepSelector inst# 5893 - Adding VC for 45 @ 12 depPkg 3 [ 0, 5 ] DepSelector inst# 5893 - Adding VC for 45 @ 12 depPkg 50 [ 0, 6 ] DepSelector inst# 5893 - Adding VC for 45 @ 11 depPkg 41 [ 0, 2 ] DepSelector inst# 5893 - Adding VC for 45 @ 11 depPkg 46 [ 0, 2 ] DepSelector inst# 5893 - Adding VC for 45 @ 11 depPkg 51 [ 0, 2 ] DepSelector inst# 5893 - Adding VC for 45 @ 11 depPkg 47 [ 0, 1 ] DepSelector inst# 5893 - Adding VC for 45 @ 11 depPkg 48 [ 0, 0 ] DepSelector inst# 5893 - Adding VC for 45 @ 11 depPkg 49 [ 0, 0 ] DepSelector inst# 5893 - Adding VC for 45 @ 11 depPkg 31 [ 0, 0 ] DepSelector inst# 5893 - Adding VC for 45 @ 11 depPkg 19 [ 0, 1 ] DepSelector inst# 5893 - Adding VC for 45 @ 11 depPkg 3 [ 0, 5 ] DepSelector inst# 5893 - Adding VC for 45 @ 11 depPkg 50 [ 0, 6 ] DepSelector inst# 5893 - Adding VC for 45 @ 10 depPkg 41 [ 0, 2 ] DepSelector inst# 5893 - Adding VC for 45 @ 10 depPkg 46 [ 0, 2 ] DepSelector inst# 5893 - Adding VC for 45 @ 10 depPkg 51 [ 0, 2 ] DepSelector inst# 5893 - Adding VC for 45 @ 10 depPkg 47 [ 0, 1 ] DepSelector inst# 5893 - Adding VC for 45 @ 10 depPkg 48 [ 0, 0 ] DepSelector inst# 5893 - Adding VC for 45 @ 10 depPkg 49 [ 0, 0 ] DepSelector inst# 5893 - Adding VC for 45 @ 10 depPkg 31 [ 0, 0 ] DepSelector inst# 5893 - Adding VC for 45 @ 10 depPkg 19 [ 0, 1 ] DepSelector inst# 5893 - Adding VC for 45 @ 10 depPkg 3 [ 0, 5 ] DepSelector inst# 5893 - Adding VC for 45 @ 10 depPkg 50 [ 0, 6 ] DepSelector inst# 5893 - Adding VC for 45 @ 9 depPkg 41 [ 0, 2 ] DepSelector inst# 5893 - Adding VC for 45 @ 9 depPkg 46 [ 0, 2 ] DepSelector inst# 5893 - Adding VC for 45 @ 9 depPkg 51 [ 0, 2 ] DepSelector inst# 5893 - Adding VC for 45 @ 9 depPkg 47 [ 0, 1 ] DepSelector inst# 5893 - Adding VC for 45 @ 9 depPkg 48 [ 0, 0 ] DepSelector inst# 5893 - Adding VC for 45 @ 9 depPkg 49 [ 0, 0 ] DepSelector inst# 5893 - Adding VC for 45 @ 9 depPkg 31 [ 0, 0 ] DepSelector inst# 5893 - Adding VC for 45 @ 9 depPkg 19 [ 0, 1 ] DepSelector inst# 5893 - Adding VC for 45 @ 9 depPkg 3 [ 0, 5 ] DepSelector inst# 5893 - Adding VC for 45 @ 9 depPkg 50 [ 0, 6 ] DepSelector inst# 5893 - Adding VC for 45 @ 8 depPkg 41 [ 0, 2 ] DepSelector inst# 5893 - Adding VC for 45 @ 8 depPkg 46 [ 0, 2 ] DepSelector inst# 5893 - Adding VC for 45 @ 8 depPkg 51 [ 0, 2 ] DepSelector inst# 5893 - Adding VC for 45 @ 8 depPkg 47 [ 0, 1 ] DepSelector inst# 5893 - Adding VC for 45 @ 8 depPkg 48 [ 0, 0 ] DepSelector inst# 5893 - Adding VC for 45 @ 8 depPkg 49 [ 0, 0 ] DepSelector inst# 5893 - Adding VC for 45 @ 8 depPkg 31 [ 0, 0 ] DepSelector inst# 5893 - Adding VC for 45 @ 8 depPkg 19 [ 0, 1 ] DepSelector inst# 5893 - Adding VC for 45 @ 8 depPkg 3 [ 0, 5 ] DepSelector inst# 5893 - Adding VC for 45 @ 8 depPkg 50 [ 0, 6 ] DepSelector inst# 5893 - Adding VC for 45 @ 7 depPkg 41 [ 0, 2 ] DepSelector inst# 5893 - Adding VC for 45 @ 7 depPkg 46 [ 0, 2 ] DepSelector inst# 5893 - Adding VC for 45 @ 7 depPkg 51 [ 0, 2 ] DepSelector inst# 5893 - Adding VC for 45 @ 7 depPkg 47 [ 0, 1 ] DepSelector inst# 5893 - Adding VC for 45 @ 7 depPkg 48 [ 0, 0 ] DepSelector inst# 5893 - Adding VC for 45 @ 7 depPkg 49 [ 0, 0 ] DepSelector inst# 5893 - Adding VC for 45 @ 7 depPkg 31 [ 0, 0 ] DepSelector inst# 5893 - Adding VC for 45 @ 7 depPkg 19 [ 0, 1 ] DepSelector inst# 5893 - Adding VC for 45 @ 7 depPkg 3 [ 0, 5 ] DepSelector inst# 5893 - Adding VC for 45 @ 6 depPkg 41 [ 0, 2 ] DepSelector inst# 5893 - Adding VC for 45 @ 6 depPkg 46 [ 0, 2 ] DepSelector inst# 5893 - Adding VC for 45 @ 6 depPkg 51 [ 0, 2 ] DepSelector inst# 5893 - Adding VC for 45 @ 6 depPkg 47 [ 0, 1 ] DepSelector inst# 5893 - Adding VC for 45 @ 6 depPkg 48 [ 0, 0 ] DepSelector inst# 5893 - Adding VC for 45 @ 6 depPkg 49 [ 0, 0 ] DepSelector inst# 5893 - Adding VC for 45 @ 6 depPkg 31 [ 0, 0 ] DepSelector inst# 5893 - Adding VC for 45 @ 6 depPkg 19 [ 0, 1 ] DepSelector inst# 5893 - Adding VC for 45 @ 6 depPkg 3 [ 0, 5 ] DepSelector inst# 5893 - Adding VC for 45 @ 5 depPkg 41 [ 0, 2 ] DepSelector inst# 5893 - Adding VC for 45 @ 5 depPkg 46 [ 0, 2 ] DepSelector inst# 5893 - Adding VC for 45 @ 5 depPkg 51 [ 0, 2 ] DepSelector inst# 5893 - Adding VC for 45 @ 5 depPkg 47 [ 0, 1 ] DepSelector inst# 5893 - Adding VC for 45 @ 5 depPkg 48 [ 0, 0 ] DepSelector inst# 5893 - Adding VC for 45 @ 5 depPkg 49 [ 0, 0 ] DepSelector inst# 5893 - Adding VC for 45 @ 5 depPkg 31 [ 0, 0 ] DepSelector inst# 5893 - Adding VC for 45 @ 5 depPkg 19 [ 0, 1 ] DepSelector inst# 5893 - Adding VC for 45 @ 5 depPkg 3 [ 0, 5 ] DepSelector inst# 5893 - Adding VC for 45 @ 4 depPkg 41 [ 0, 2 ] DepSelector inst# 5893 - Adding VC for 45 @ 4 depPkg 46 [ 0, 2 ] DepSelector inst# 5893 - Adding VC for 45 @ 4 depPkg 51 [ 0, 2 ] DepSelector inst# 5893 - Adding VC for 45 @ 4 depPkg 47 [ 0, 1 ] DepSelector inst# 5893 - Adding VC for 45 @ 4 depPkg 48 [ 0, 0 ] DepSelector inst# 5893 - Adding VC for 45 @ 4 depPkg 49 [ 0, 0 ] DepSelector inst# 5893 - Adding VC for 45 @ 4 depPkg 31 [ 0, 0 ] DepSelector inst# 5893 - Adding VC for 45 @ 4 depPkg 19 [ 0, 1 ] DepSelector inst# 5893 - Adding VC for 45 @ 4 depPkg 3 [ 0, 5 ] DepSelector inst# 5893 - Adding VC for 45 @ 3 depPkg 41 [ 0, 2 ] DepSelector inst# 5893 - Adding VC for 45 @ 3 depPkg 46 [ 0, 2 ] DepSelector inst# 5893 - Adding VC for 45 @ 3 depPkg 51 [ 0, 2 ] DepSelector inst# 5893 - Adding VC for 45 @ 3 depPkg 47 [ 0, 1 ] DepSelector inst# 5893 - Adding VC for 45 @ 3 depPkg 48 [ 0, 0 ] DepSelector inst# 5893 - Adding VC for 45 @ 3 depPkg 49 [ 0, 0 ] DepSelector inst# 5893 - Adding VC for 45 @ 3 depPkg 31 [ 0, 0 ] DepSelector inst# 5893 - Adding VC for 45 @ 3 depPkg 19 [ 0, 1 ] DepSelector inst# 5893 - Adding VC for 45 @ 3 depPkg 3 [ 0, 5 ] DepSelector inst# 5893 - Adding VC for 45 @ 2 depPkg 41 [ 0, 2 ] DepSelector inst# 5893 - Adding VC for 45 @ 2 depPkg 46 [ 0, 2 ] DepSelector inst# 5893 - Adding VC for 45 @ 2 depPkg 51 [ 0, 2 ] DepSelector inst# 5893 - Adding VC for 45 @ 2 depPkg 47 [ 0, 1 ] DepSelector inst# 5893 - Adding VC for 45 @ 2 depPkg 48 [ 0, 0 ] DepSelector inst# 5893 - Adding VC for 45 @ 2 depPkg 49 [ 0, 0 ] DepSelector inst# 5893 - Adding VC for 45 @ 2 depPkg 31 [ 0, 0 ] DepSelector inst# 5893 - Adding VC for 45 @ 2 depPkg 19 [ 0, 1 ] DepSelector inst# 5893 - Adding VC for 45 @ 2 depPkg 3 [ 0, 5 ] DepSelector inst# 5893 - Adding VC for 45 @ 1 depPkg 41 [ 0, 2 ] DepSelector inst# 5893 - Adding VC for 45 @ 1 depPkg 46 [ 0, 2 ] DepSelector inst# 5893 - Adding VC for 45 @ 1 depPkg 51 [ 0, 2 ] DepSelector inst# 5893 - Adding VC for 45 @ 1 depPkg 47 [ 0, 1 ] DepSelector inst# 5893 - Adding VC for 45 @ 1 depPkg 48 [ 0, 0 ] DepSelector inst# 5893 - Adding VC for 45 @ 1 depPkg 49 [ 0, 0 ] DepSelector inst# 5893 - Adding VC for 45 @ 1 depPkg 31 [ 0, 0 ] DepSelector inst# 5893 - Adding VC for 45 @ 1 depPkg 19 [ 0, 1 ] DepSelector inst# 5893 - Adding VC for 45 @ 1 depPkg 3 [ 0, 5 ] DepSelector inst# 5893 - Adding VC for 45 @ 0 depPkg 41 [ 0, 2 ] DepSelector inst# 5893 - Adding VC for 45 @ 0 depPkg 46 [ 0, 2 ] DepSelector inst# 5893 - Adding VC for 45 @ 0 depPkg 51 [ 0, 2 ] DepSelector inst# 5893 - Adding VC for 45 @ 0 depPkg 47 [ 0, 1 ] DepSelector inst# 5893 - Adding VC for 45 @ 0 depPkg 48 [ 0, 0 ] DepSelector inst# 5893 - Adding VC for 45 @ 0 depPkg 49 [ 0, 0 ] DepSelector inst# 5893 - Adding VC for 45 @ 0 depPkg 31 [ 0, 0 ] DepSelector inst# 5893 - Adding VC for 45 @ 0 depPkg 19 [ 0, 1 ] DepSelector inst# 5893 - Adding VC for 45 @ 0 depPkg 3 [ 0, 5 ] DepSelector inst# 5893 - Adding VC for 46 @ 2 depPkg 39 [ 0, 0 ] DepSelector inst# 5893 - Adding VC for 46 @ 2 depPkg 3 [ 0, 5 ] DepSelector inst# 5893 - Adding VC for 46 @ 1 depPkg 39 [ 0, 0 ] DepSelector inst# 5893 - Adding VC for 46 @ 1 depPkg 3 [ 0, 5 ] DepSelector inst# 5893 - Adding VC for 46 @ 0 depPkg 39 [ 0, 0 ] DepSelector inst# 5893 - Adding VC for 46 @ 0 depPkg 3 [ 0, 5 ] DepSelector inst# 5893 - Adding package id 52/64: min = -1, max = 1, current version 0 DepSelector inst# 5893 - Adding VC for 47 @ 1 depPkg 52 [ 0, 1 ] DepSelector inst# 5893 - Adding VC for 47 @ 1 depPkg 3 [ 0, 5 ] DepSelector inst# 5893 - Adding VC for 47 @ 0 depPkg 52 [ 0, 1 ] DepSelector inst# 5893 - Adding VC for 47 @ 0 depPkg 3 [ 0, 5 ] DepSelector inst# 5893 - Adding package id 53/64: min = -1, max = 1, current version 0 DepSelector inst# 5893 - Adding VC for 49 @ 0 depPkg 53 [ 0, 1 ] DepSelector inst# 5893 - Adding VC for 51 @ 2 depPkg 46 [ 0, 2 ] DepSelector inst# 5893 - Adding package id 54/64: min = -1, max = 2, current version 0 DepSelector inst# 5893 - Adding VC for 51 @ 2 depPkg 54 [ 0, 2 ] DepSelector inst# 5893 - Adding VC for 51 @ 2 depPkg 39 [ 0, 0 ] DepSelector inst# 5893 - Adding VC for 51 @ 2 depPkg 3 [ 0, 5 ] DepSelector inst# 5893 - Adding VC for 51 @ 1 depPkg 46 [ 0, 2 ] DepSelector inst# 5893 - Adding VC for 51 @ 1 depPkg 54 [ 0, 2 ] DepSelector inst# 5893 - Adding VC for 51 @ 1 depPkg 39 [ 0, 0 ] DepSelector inst# 5893 - Adding VC for 51 @ 1 depPkg 3 [ 0, 5 ] DepSelector inst# 5893 - Adding VC for 51 @ 0 depPkg 46 [ 0, 2 ] DepSelector inst# 5893 - Adding VC for 51 @ 0 depPkg 54 [ 0, 2 ] DepSelector inst# 5893 - Adding VC for 51 @ 0 depPkg 39 [ 0, 0 ] DepSelector inst# 5893 - Adding VC for 51 @ 0 depPkg 3 [ 0, 5 ] DepSelector inst# 5893 - Adding package id 55/64: min = -1, max = 4, current version 0 DepSelector inst# 5893 - Adding package id 56/64: min = -1, max = 0, current version 0 DepSelector inst# 5893 - Adding VC for 56 @ 0 depPkg 3 [ 0, 5 ] DepSelector inst# 5893 - Adding VC for 56 @ 0 depPkg 40 [ 0, 1 ] DepSelector inst# 5893 - Adding package id 57/64: min = -1, max = 0, current version 0 DepSelector inst# 5893 - Adding VC for 57 @ 0 depPkg 51 [ 0, 2 ] DepSelector inst# 5893 - Adding VC for 57 @ 0 depPkg 49 [ 0, 0 ] DepSelector inst# 5893 - Adding VC for 57 @ 0 depPkg 40 [ 0, 1 ] DepSelector inst# 5893 - Adding package id 58/64: min = -1, max = 1, current version 0 DepSelector inst# 5893 - Adding VC for 58 @ 1 depPkg 35 [ 0, 4 ] DepSelector inst# 5893 - Adding package id 59/64: min = -1, max = 0, current version 0 DepSelector inst# 5893 - Adding VC for 59 @ 0 depPkg 4 [ 0, 3 ] DepSelector inst# 5893 - Adding VC for 59 @ 0 depPkg 35 [ 0, 4 ] DepSelector inst# 5893 - Adding package id 60/64: min = -1, max = 0, current version 0 DepSelector inst# 5893 - Adding package id 61/64: min = -1, max = 1, current version 0 DepSelector inst# 5893 - Adding package id 62/64: min = -1, max = 2, current version 0 DepSelector inst# 5893 - Adding VC for 61 @ 1 depPkg 62 [ 0, 2 ] DepSelector inst# 5893 - Adding VC for 61 @ 1 depPkg 55 [ 0, 4 ] DepSelector inst# 5893 - Adding VC for 61 @ 1 depPkg 31 [ 0, 0 ] DepSelector inst# 5893 - Adding VC for 61 @ 1 depPkg 40 [ 0, 1 ] DepSelector inst# 5893 - Adding VC for 61 @ 1 depPkg 43 [ 0, 0 ] DepSelector inst# 5893 - Adding VC for 61 @ 0 depPkg 62 [ 0, 2 ] DepSelector inst# 5893 - Adding VC for 61 @ 0 depPkg 55 [ 0, 4 ] DepSelector inst# 5893 - Adding VC for 61 @ 0 depPkg 31 [ 0, 0 ] DepSelector inst# 5893 - Adding VC for 61 @ 0 depPkg 40 [ 0, 1 ] DepSelector inst# 5893 - Adding VC for 61 @ 0 depPkg 43 [ 0, 0 ] DepSelector inst# 5893 - Adding VC for 62 @ 2 depPkg 4 [ 0, 3 ] DepSelector inst# 5893 - Adding VC for 62 @ 2 depPkg 2 [ 0, 5 ] DepSelector inst# 5893 - Adding VC for 62 @ 2 depPkg 3 [ 0, 5 ] DepSelector inst# 5893 - Adding VC for 62 @ 1 depPkg 3 [ 0, 5 ] DepSelector inst# 5893 - Adding VC for 62 @ 0 depPkg 3 [ 0, 5 ] DepSelector inst# 5893 - Adding package id 63/64: min = 0, max = 0, current version 0 DepSelector inst# 5893 - Marking Package Preferred Latest 0 weight 10 DepSelector inst# 5893 - Marking Package Required 0 DepSelector inst# 5893 - Adding VC for 63 @ 0 depPkg 0 [ 0, 2 ] DepSelector inst# 5893 - Marking Package Preferred Latest 1 weight 10 DepSelector inst# 5893 - Marking Package Required 1 DepSelector inst# 5893 - Adding VC for 63 @ 0 depPkg 1 [ 0, 5 ] DepSelector inst# 5893 - Marking Package Preferred Latest 6 weight 10 DepSelector inst# 5893 - Marking Package Required 6 DepSelector inst# 5893 - Adding VC for 63 @ 0 depPkg 6 [ 0, 2 ] DepSelector inst# 5893 - Marking Package Preferred Latest 7 weight 10 DepSelector inst# 5893 - Marking Package Required 7 DepSelector inst# 5893 - Adding VC for 63 @ 0 depPkg 7 [ 0, 0 ] DepSelector inst# 5893 - Marking Package Preferred Latest 8 weight 10 DepSelector inst# 5893 - Marking Package Required 8 DepSelector inst# 5893 - Adding VC for 63 @ 0 depPkg 8 [ 0, 0 ] DepSelector inst# 5893 - Marking Package Preferred Latest 9 weight 10 DepSelector inst# 5893 - Marking Package Required 9 DepSelector inst# 5893 - Adding VC for 63 @ 0 depPkg 9 [ 0, 0 ] DepSelector inst# 5893 - Marking Package Preferred Latest 10 weight 10 DepSelector inst# 5893 - Marking Package Required 10 DepSelector inst# 5893 - Adding VC for 63 @ 0 depPkg 10 [ 0, 1 ] DepSelector inst# 5893 - Marking Package Preferred Latest 11 weight 10 DepSelector inst# 5893 - Marking Package Required 11 DepSelector inst# 5893 - Adding VC for 63 @ 0 depPkg 11 [ 0, 0 ] DepSelector inst# 5893 - Marking Package Preferred Latest 12 weight 10 DepSelector inst# 5893 - Marking Package Required 12 DepSelector inst# 5893 - Adding VC for 63 @ 0 depPkg 12 [ 0, 1 ] DepSelector inst# 5893 - Marking Package Preferred Latest 13 weight 10 DepSelector inst# 5893 - Marking Package Required 13 DepSelector inst# 5893 - Adding VC for 63 @ 0 depPkg 13 [ 0, 0 ] DepSelector inst# 5893 - Marking Package Preferred Latest 14 weight 10 DepSelector inst# 5893 - Marking Package Required 14 DepSelector inst# 5893 - Adding VC for 63 @ 0 depPkg 14 [ 0, 1 ] DepSelector inst# 5893 - Marking Package Preferred Latest 15 weight 10 DepSelector inst# 5893 - Marking Package Required 15 DepSelector inst# 5893 - Adding VC for 63 @ 0 depPkg 15 [ 0, 0 ] DepSelector inst# 5893 - Marking Package Preferred Latest 16 weight 10 DepSelector inst# 5893 - Marking Package Required 16 DepSelector inst# 5893 - Adding VC for 63 @ 0 depPkg 16 [ 0, 0 ] DepSelector inst# 5893 - Marking Package Preferred Latest 17 weight 10 DepSelector inst# 5893 - Marking Package Required 17 DepSelector inst# 5893 - Adding VC for 63 @ 0 depPkg 17 [ 0, 2 ] DepSelector inst# 5893 - Marking Package Preferred Latest 18 weight 10 DepSelector inst# 5893 - Marking Package Required 18 DepSelector inst# 5893 - Adding VC for 63 @ 0 depPkg 18 [ 0, 0 ] DepSelector inst# 5893 - Marking Package Preferred Latest 19 weight 10 DepSelector inst# 5893 - Marking Package Required 19 DepSelector inst# 5893 - Adding VC for 63 @ 0 depPkg 19 [ 0, 1 ] DepSelector inst# 5893 - Marking Package Preferred Latest 19 weight 10 DepSelector inst# 5893 - Marking Package Required 19 DepSelector inst# 5893 - Adding VC for 63 @ 0 depPkg 19 [ 0, 1 ] DepSelector inst# 5893 - Marking Package Preferred Latest 20 weight 10 DepSelector inst# 5893 - Marking Package Required 20 DepSelector inst# 5893 - Adding VC for 63 @ 0 depPkg 20 [ 0, 0 ] DepSelector inst# 5893 - Marking Package Preferred Latest 21 weight 10 DepSelector inst# 5893 - Marking Package Required 21 DepSelector inst# 5893 - Adding VC for 63 @ 0 depPkg 21 [ 0, 2 ] DepSelector inst# 5893 - Marking Package Preferred Latest 22 weight 10 DepSelector inst# 5893 - Marking Package Required 22 DepSelector inst# 5893 - Adding VC for 63 @ 0 depPkg 22 [ 0, 3 ] DepSelector inst# 5893 - Marking Package Preferred Latest 23 weight 10 DepSelector inst# 5893 - Marking Package Required 23 DepSelector inst# 5893 - Adding VC for 63 @ 0 depPkg 23 [ 0, 1 ] DepSelector inst# 5893 - Marking Package Preferred Latest 24 weight 10 DepSelector inst# 5893 - Marking Package Required 24 DepSelector inst# 5893 - Adding VC for 63 @ 0 depPkg 24 [ 0, 3 ] DepSelector inst# 5893 - Marking Package Preferred Latest 25 weight 10 DepSelector inst# 5893 - Marking Package Required 25 DepSelector inst# 5893 - Adding VC for 63 @ 0 depPkg 25 [ 0, 5 ] DepSelector inst# 5893 - Marking Package Preferred Latest 26 weight 10 DepSelector inst# 5893 - Marking Package Required 26 DepSelector inst# 5893 - Adding VC for 63 @ 0 depPkg 26 [ 0, 0 ] DepSelector inst# 5893 - Marking Package Preferred Latest 26 weight 10 DepSelector inst# 5893 - Marking Package Required 26 DepSelector inst# 5893 - Adding VC for 63 @ 0 depPkg 26 [ 0, 0 ] DepSelector inst# 5893 - Marking Package Preferred Latest 27 weight 10 DepSelector inst# 5893 - Marking Package Required 27 DepSelector inst# 5893 - Adding VC for 63 @ 0 depPkg 27 [ 0, 2 ] DepSelector inst# 5893 - Marking Package Preferred Latest 29 weight 10 DepSelector inst# 5893 - Marking Package Required 29 DepSelector inst# 5893 - Adding VC for 63 @ 0 depPkg 29 [ 0, 2 ] DepSelector inst# 5893 - Marking Package Preferred Latest 29 weight 10 DepSelector inst# 5893 - Marking Package Required 29 DepSelector inst# 5893 - Adding VC for 63 @ 0 depPkg 29 [ 0, 2 ] DepSelector inst# 5893 - Marking Package Preferred Latest 29 weight 10 DepSelector inst# 5893 - Marking Package Required 29 DepSelector inst# 5893 - Adding VC for 63 @ 0 depPkg 29 [ 0, 2 ] DepSelector inst# 5893 - Marking Package Preferred Latest 29 weight 10 DepSelector inst# 5893 - Marking Package Required 29 DepSelector inst# 5893 - Adding VC for 63 @ 0 depPkg 29 [ 0, 2 ] DepSelector inst# 5893 - Marking Package Preferred Latest 29 weight 10 DepSelector inst# 5893 - Marking Package Required 29 DepSelector inst# 5893 - Adding VC for 63 @ 0 depPkg 29 [ 0, 2 ] DepSelector inst# 5893 - Marking Package Preferred Latest 29 weight 10 DepSelector inst# 5893 - Marking Package Required 29 DepSelector inst# 5893 - Adding VC for 63 @ 0 depPkg 29 [ 0, 2 ] DepSelector inst# 5893 - Marking Package Preferred Latest 29 weight 10 DepSelector inst# 5893 - Marking Package Required 29 DepSelector inst# 5893 - Adding VC for 63 @ 0 depPkg 29 [ 0, 2 ] DepSelector inst# 5893 - Marking Package Preferred Latest 29 weight 10 DepSelector inst# 5893 - Marking Package Required 29 DepSelector inst# 5893 - Adding VC for 63 @ 0 depPkg 29 [ 0, 2 ] DepSelector inst# 5893 - Marking Package Preferred Latest 29 weight 10 DepSelector inst# 5893 - Marking Package Required 29 DepSelector inst# 5893 - Adding VC for 63 @ 0 depPkg 29 [ 0, 2 ] DepSelector inst# 5893 - Marking Package Preferred Latest 29 weight 10 DepSelector inst# 5893 - Marking Package Required 29 DepSelector inst# 5893 - Adding VC for 63 @ 0 depPkg 29 [ 0, 2 ] DepSelector inst# 5893 - Marking Package Preferred Latest 29 weight 10 DepSelector inst# 5893 - Marking Package Required 29 DepSelector inst# 5893 - Adding VC for 63 @ 0 depPkg 29 [ 0, 2 ] DepSelector inst# 5893 - Marking Package Preferred Latest 29 weight 10 DepSelector inst# 5893 - Marking Package Required 29 DepSelector inst# 5893 - Adding VC for 63 @ 0 depPkg 29 [ 0, 2 ] DepSelector inst# 5893 - Marking Package Preferred Latest 29 weight 10 DepSelector inst# 5893 - Marking Package Required 29 DepSelector inst# 5893 - Adding VC for 63 @ 0 depPkg 29 [ 0, 2 ] DepSelector inst# 5893 - Marking Package Preferred Latest 29 weight 10 DepSelector inst# 5893 - Marking Package Required 29 DepSelector inst# 5893 - Adding VC for 63 @ 0 depPkg 29 [ 0, 2 ] DepSelector inst# 5893 - Marking Package Preferred Latest 30 weight 10 DepSelector inst# 5893 - Marking Package Required 30 DepSelector inst# 5893 - Adding VC for 63 @ 0 depPkg 30 [ 0, 0 ] DepSelector inst# 5893 - Marking Package Preferred Latest 30 weight 10 DepSelector inst# 5893 - Marking Package Required 30 DepSelector inst# 5893 - Adding VC for 63 @ 0 depPkg 30 [ 0, 0 ] DepSelector inst# 5893 - Marking Package Preferred Latest 32 weight 10 DepSelector inst# 5893 - Marking Package Required 32 DepSelector inst# 5893 - Adding VC for 63 @ 0 depPkg 32 [ 0, 24 ] DepSelector inst# 5893 - Marking Package Preferred Latest 36 weight 10 DepSelector inst# 5893 - Marking Package Required 36 DepSelector inst# 5893 - Adding VC for 63 @ 0 depPkg 36 [ 0, 3 ] DepSelector inst# 5893 - Marking Package Preferred Latest 37 weight 10 DepSelector inst# 5893 - Marking Package Required 37 DepSelector inst# 5893 - Adding VC for 63 @ 0 depPkg 37 [ 0, 2 ] DepSelector inst# 5893 - Marking Package Preferred Latest 38 weight 10 DepSelector inst# 5893 - Marking Package Required 38 DepSelector inst# 5893 - Adding VC for 63 @ 0 depPkg 38 [ 0, 2 ] DepSelector inst# 5893 - Marking Package Preferred Latest 38 weight 10 DepSelector inst# 5893 - Marking Package Required 38 DepSelector inst# 5893 - Adding VC for 63 @ 0 depPkg 38 [ 0, 2 ] DepSelector inst# 5893 - Marking Package Preferred Latest 3 weight 10 DepSelector inst# 5893 - Marking Package Required 3 DepSelector inst# 5893 - Adding VC for 63 @ 0 depPkg 3 [ 0, 5 ] DepSelector inst# 5893 - Marking Package Preferred Latest 3 weight 10 DepSelector inst# 5893 - Marking Package Required 3 DepSelector inst# 5893 - Adding VC for 63 @ 0 depPkg 3 [ 0, 5 ] DepSelector inst# 5893 - Marking Package Preferred Latest 39 weight 10 DepSelector inst# 5893 - Marking Package Required 39 DepSelector inst# 5893 - Adding VC for 63 @ 0 depPkg 39 [ 0, 0 ] DepSelector inst# 5893 - Marking Package Preferred Latest 35 weight 10 DepSelector inst# 5893 - Marking Package Required 35 DepSelector inst# 5893 - Adding VC for 63 @ 0 depPkg 35 [ 0, 4 ] DepSelector inst# 5893 - Marking Package Preferred Latest 40 weight 10 DepSelector inst# 5893 - Marking Package Required 40 DepSelector inst# 5893 - Adding VC for 63 @ 0 depPkg 40 [ 0, 1 ] DepSelector inst# 5893 - Marking Package Preferred Latest 45 weight 10 DepSelector inst# 5893 - Marking Package Required 45 DepSelector inst# 5893 - Adding VC for 63 @ 0 depPkg 45 [ 0, 22 ] DepSelector inst# 5893 - Marking Package Preferred Latest 45 weight 10 DepSelector inst# 5893 - Marking Package Required 45 DepSelector inst# 5893 - Adding VC for 63 @ 0 depPkg 45 [ 0, 22 ] DepSelector inst# 5893 - Marking Package Preferred Latest 45 weight 10 DepSelector inst# 5893 - Marking Package Required 45 DepSelector inst# 5893 - Adding VC for 63 @ 0 depPkg 45 [ 0, 22 ] DepSelector inst# 5893 - Marking Package Preferred Latest 55 weight 10 DepSelector inst# 5893 - Marking Package Required 55 DepSelector inst# 5893 - Adding VC for 63 @ 0 depPkg 55 [ 0, 4 ] DepSelector inst# 5893 - Marking Package Preferred Latest 56 weight 10 DepSelector inst# 5893 - Marking Package Required 56 DepSelector inst# 5893 - Adding VC for 63 @ 0 depPkg 56 [ 0, 0 ] DepSelector inst# 5893 - Marking Package Preferred Latest 57 weight 10 DepSelector inst# 5893 - Marking Package Required 57 DepSelector inst# 5893 - Adding VC for 63 @ 0 depPkg 57 [ 0, 0 ] DepSelector inst# 5893 - Marking Package Preferred Latest 58 weight 10 DepSelector inst# 5893 - Marking Package Required 58 DepSelector inst# 5893 - Adding VC for 63 @ 0 depPkg 58 [ 0, 1 ] DepSelector inst# 5893 - Marking Package Preferred Latest 59 weight 10 DepSelector inst# 5893 - Marking Package Required 59 DepSelector inst# 5893 - Adding VC for 63 @ 0 depPkg 59 [ 0, 0 ] DepSelector inst# 5893 - Marking Package Preferred Latest 59 weight 10 DepSelector inst# 5893 - Marking Package Required 59 DepSelector inst# 5893 - Adding VC for 63 @ 0 depPkg 59 [ 0, 0 ] DepSelector inst# 5893 - Marking Package Preferred Latest 59 weight 10 DepSelector inst# 5893 - Marking Package Required 59 DepSelector inst# 5893 - Adding VC for 63 @ 0 depPkg 59 [ 0, 0 ] DepSelector inst# 5893 - Marking Package Preferred Latest 59 weight 10 DepSelector inst# 5893 - Marking Package Required 59 DepSelector inst# 5893 - Adding VC for 63 @ 0 depPkg 59 [ 0, 0 ] DepSelector inst# 5893 - Marking Package Preferred Latest 60 weight 10 DepSelector inst# 5893 - Marking Package Required 60 DepSelector inst# 5893 - Adding VC for 63 @ 0 depPkg 60 [ 0, 0 ] DepSelector inst# 5893 - Marking Package Preferred Latest 60 weight 10 DepSelector inst# 5893 - Marking Package Required 60 DepSelector inst# 5893 - Adding VC for 63 @ 0 depPkg 60 [ 0, 0 ] DepSelector inst# 5893 - Marking Package Preferred Latest 61 weight 10 DepSelector inst# 5893 - Marking Package Required 61 DepSelector inst# 5893 - Adding VC for 63 @ 0 depPkg 61 [ 0, 1 ] dep_selector solve: SOLVED 64 packages, 422 constraints, Time: 21.8ms Stats: 1 steps, 2309619 bytes, 2542 props, 108 nodes, 107 depth dep-selector-1.0.3/example/382cfe5b-0ac2-48b8-83d1-717cb4620990000066400000000000000000000125251232552612700221740ustar00rootroot00000000000000Creating VersionProblem inst# 3445 with 20 packages, 1 stats, 1 debug DepSelector inst# 3445 - Adding package id 0/20: min = -1, max = 0, current version 0 DepSelector inst# 3445 - Adding package id 1/20: min = -1, max = 0, current version 0 DepSelector inst# 3445 - Adding package id 2/20: min = -1, max = 1, current version 0 DepSelector inst# 3445 - Adding package id 3/20: min = -1, max = 0, current version 0 DepSelector inst# 3445 - Adding package id 4/20: min = -1, max = 0, current version 0 DepSelector inst# 3445 - Adding package id 5/20: min = -1, max = 0, current version 0 DepSelector inst# 3445 - Adding package id 6/20: min = -1, max = 0, current version 0 DepSelector inst# 3445 - Adding package id 7/20: min = -1, max = 0, current version 0 DepSelector inst# 3445 - Adding package id 8/20: min = -1, max = 0, current version 0 DepSelector inst# 3445 - Adding VC for 7 @ 0 depPkg 8 [ 0, 0 ] DepSelector inst# 3445 - Adding package id 9/20: min = -1, max = 1, current version 0 DepSelector inst# 3445 - Adding VC for 7 @ 0 depPkg 9 [ 0, 1 ] DepSelector inst# 3445 - Adding package id 10/20: min = -1, max = 0, current version 0 DepSelector inst# 3445 - Adding package id 11/20: min = -1, max = 0, current version 0 DepSelector inst# 3445 - Adding VC for 10 @ 0 depPkg 11 [ 0, 0 ] DepSelector inst# 3445 - Adding VC for 10 @ 0 depPkg 8 [ 0, 0 ] DepSelector inst# 3445 - Adding package id 12/20: min = -1, max = 0, current version 0 DepSelector inst# 3445 - Adding VC for 10 @ 0 depPkg 12 [ 0, 0 ] DepSelector inst# 3445 - Adding package id 13/20: min = -1, max = 0, current version 0 DepSelector inst# 3445 - Adding VC for 11 @ 0 depPkg 13 [ 0, 0 ] DepSelector inst# 3445 - Adding package id 14/20: min = -1, max = 0, current version 0 DepSelector inst# 3445 - Adding VC for 14 @ 0 depPkg 10 [ 0, 0 ] DepSelector inst# 3445 - Adding package id 15/20: min = -1, max = 1, current version 0 DepSelector inst# 3445 - Adding package id 16/20: min = -1, max = 0, current version 0 DepSelector inst# 3445 - Adding VC for 15 @ 1 depPkg 16 [ 0, 0 ] DepSelector inst# 3445 - Adding VC for 15 @ 0 depPkg 2 [ 0, 1 ] DepSelector inst# 3445 - Adding VC for 15 @ 0 depPkg 13 [ 0, 0 ] DepSelector inst# 3445 - Adding VC for 15 @ 0 depPkg 16 [ 0, 0 ] DepSelector inst# 3445 - Adding package id 17/20: min = -1, max = 0, current version 0 DepSelector inst# 3445 - Adding VC for 17 @ 0 depPkg 12 [ 0, 0 ] DepSelector inst# 3445 - Adding VC for 17 @ 0 depPkg 16 [ 0, 0 ] DepSelector inst# 3445 - Adding package id 18/20: min = -1, max = 0, current version 0 DepSelector inst# 3445 - Adding VC for 18 @ 0 depPkg 12 [ 0, 0 ] DepSelector inst# 3445 - Adding package id 19/20: min = 0, max = 0, current version 0 DepSelector inst# 3445 - Marking Package Preferred Latest 0 weight 10 DepSelector inst# 3445 - Marking Package Required 0 DepSelector inst# 3445 - Adding VC for 19 @ 0 depPkg 0 [ 0, 0 ] DepSelector inst# 3445 - Marking Package Preferred Latest 1 weight 10 DepSelector inst# 3445 - Marking Package Required 1 DepSelector inst# 3445 - Adding VC for 19 @ 0 depPkg 1 [ 0, 0 ] DepSelector inst# 3445 - Marking Package Preferred Latest 2 weight 10 DepSelector inst# 3445 - Marking Package Required 2 DepSelector inst# 3445 - Adding VC for 19 @ 0 depPkg 2 [ 0, 1 ] DepSelector inst# 3445 - Marking Package Preferred Latest 3 weight 10 DepSelector inst# 3445 - Marking Package Required 3 DepSelector inst# 3445 - Adding VC for 19 @ 0 depPkg 3 [ 0, 0 ] DepSelector inst# 3445 - Marking Package Preferred Latest 4 weight 10 DepSelector inst# 3445 - Marking Package Required 4 DepSelector inst# 3445 - Adding VC for 19 @ 0 depPkg 4 [ 0, 0 ] DepSelector inst# 3445 - Marking Package Preferred Latest 5 weight 10 DepSelector inst# 3445 - Marking Package Required 5 DepSelector inst# 3445 - Adding VC for 19 @ 0 depPkg 5 [ 0, 0 ] DepSelector inst# 3445 - Marking Package Preferred Latest 6 weight 10 DepSelector inst# 3445 - Marking Package Required 6 DepSelector inst# 3445 - Adding VC for 19 @ 0 depPkg 6 [ 0, 0 ] DepSelector inst# 3445 - Marking Package Preferred Latest 7 weight 10 DepSelector inst# 3445 - Marking Package Required 7 DepSelector inst# 3445 - Adding VC for 19 @ 0 depPkg 7 [ 0, 0 ] DepSelector inst# 3445 - Marking Package Preferred Latest 10 weight 10 DepSelector inst# 3445 - Marking Package Required 10 DepSelector inst# 3445 - Adding VC for 19 @ 0 depPkg 10 [ 0, 0 ] DepSelector inst# 3445 - Marking Package Preferred Latest 14 weight 10 DepSelector inst# 3445 - Marking Package Required 14 DepSelector inst# 3445 - Adding VC for 19 @ 0 depPkg 14 [ 0, 0 ] DepSelector inst# 3445 - Marking Package Preferred Latest 15 weight 10 DepSelector inst# 3445 - Marking Package Required 15 DepSelector inst# 3445 - Adding VC for 19 @ 0 depPkg 15 [ 0, 1 ] DepSelector inst# 3445 - Marking Package Preferred Latest 15 weight 10 DepSelector inst# 3445 - Marking Package Required 15 DepSelector inst# 3445 - Adding VC for 19 @ 0 depPkg 15 [ 0, 1 ] DepSelector inst# 3445 - Marking Package Preferred Latest 17 weight 10 DepSelector inst# 3445 - Marking Package Required 17 DepSelector inst# 3445 - Adding VC for 19 @ 0 depPkg 17 [ 0, 0 ] DepSelector inst# 3445 - Marking Package Preferred Latest 18 weight 10 DepSelector inst# 3445 - Marking Package Required 18 DepSelector inst# 3445 - Adding VC for 19 @ 0 depPkg 18 [ 0, 0 ] dep_selector solve: SOLVED 20 packages, 28 constraints, Time: 0.343ms Stats: 1 steps, 70191 bytes, 183 props, 243459 nodes, 23 depth dep-selector-1.0.3/example/README000066400000000000000000000047471232552612700164350ustar00rootroot00000000000000In this directory are dumps from the problem setup in the dep_selector interface to gecode. We've abstracted out a lot of the problem domain in the ruby wrapper above, to keep things as simple as possible. Packages are mapped to simple id numbers. The set of valid versions of packages (e.g. 1.0, etc) are mapped to a dense array of integers. The ~> operator designates a range of package versions; if our dense map had 1.0 -> 1, 1.1 -> 2, 1.2 -> 3 and 2.0 -> 4, the constraint version -> 1 would map to [1,3] (inclusive set) We have some special versions designated (see gecode_wrapper.rb for more information. We use -1 to indicate packages that might be optional If a constraint matches no versions, we will constrain the package to the range [-2,-2], so that if a branch requires a package Version Constraints (VC) are added as dependencies on a particular version of a package; if package 1 is at version 0, then we constraint the dependent package 2 to be in the range [X, Y] The solver then attempts to maximize the number of packages at the latest version available. That pretty much comprises the simple part of the problem. Error feedback: The fast majority of the work done by the system is to provide error feedback for overconstrained systems. Debugging which constraint is at fault in that case is something of a black art. To at least provide some support for this, we try to find a solution with some packages disabled, and provide feedback on which ones were chosen. This is posed as a minimization problem, where we generate a cost function with the packages weighted in three tiers. * Some packages are marked as required; these are the packages explicity specified on the runlist. * Some packages are marked as suspicious; there are heuristics such as whether any available versions exist to choose those. * The remaining packages are 'normal' priority. The cost function minimizes the number of required packages disabled first, then minimizes the number of normal packages disabled, then minimizes the number of suspicious packages disabled. This greatly expands the problem space to be solved. Right now we solve the whole problem in one try for simplicity's sake. This proved to still be faster than the couchdb accesses required to set up the problem in the first place, and we never got around to implementing it. However if the time to solve the problem ever became excessive, we would attempt to solve the simple problem, and only provide error diagnostics for the more complex problem. dep-selector-1.0.3/example/d3564ef6-6437-41e7-90b6-dbdb849551a6_mod000066400000000000000000001642021232552612700230530ustar00rootroot00000000000000 Creating VersionProblem inst# 0 with 84 packages, 1 stats, 1 debug DepSelector inst# 0 - Adding package id 0/84: min = -1, max = 3, current version 0 DepSelector inst# 0 - Adding package id 1/84: min = -1, max = 1, current version 0 DepSelector inst# 0 - Adding VC for 0 @ 3 depPkg 1 [ 0, 1 ] DepSelector inst# 0 - Adding package id 2/84: min = -1, max = 0, current version 0 DepSelector inst# 0 - Adding VC for 0 @ 3 depPkg 2 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 0 @ 2 depPkg 1 [ 0, 1 ] DepSelector inst# 0 - Adding VC for 0 @ 2 depPkg 2 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 0 @ 1 depPkg 1 [ 0, 1 ] DepSelector inst# 0 - Adding VC for 0 @ 1 depPkg 2 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 0 @ 0 depPkg 1 [ 0, 1 ] DepSelector inst# 0 - Adding VC for 0 @ 0 depPkg 2 [ 0, 0 ] DepSelector inst# 0 - Adding package id 3/84: min = -1, max = 2, current version 0 DepSelector inst# 0 - Adding package id 4/84: min = -1, max = 5, current version 0 DepSelector inst# 0 - Adding package id 5/84: min = -1, max = 5, current version 0 DepSelector inst# 0 - Adding VC for 4 @ 5 depPkg 5 [ 0, 5 ] DepSelector inst# 0 - Adding package id 6/84: min = -1, max = 5, current version 0 DepSelector inst# 0 - Adding VC for 4 @ 5 depPkg 6 [ 0, 5 ] DepSelector inst# 0 - Adding VC for 4 @ 4 depPkg 5 [ 0, 5 ] DepSelector inst# 0 - Adding VC for 4 @ 3 depPkg 5 [ 0, 5 ] DepSelector inst# 0 - Adding VC for 4 @ 2 depPkg 5 [ 0, 5 ] DepSelector inst# 0 - Adding VC for 4 @ 1 depPkg 5 [ 0, 5 ] DepSelector inst# 0 - Adding VC for 4 @ 0 depPkg 5 [ 0, 5 ] DepSelector inst# 0 - Adding package id 7/84: min = -1, max = 3, current version 0 DepSelector inst# 0 - Adding VC for 5 @ 5 depPkg 7 [ 0, 3 ] DepSelector inst# 0 - Adding package id 8/84: min = -1, max = 0, current version 0 DepSelector inst# 0 - Adding VC for 5 @ 5 depPkg 8 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 5 @ 4 depPkg 7 [ 0, 3 ] DepSelector inst# 0 - Adding VC for 5 @ 4 depPkg 8 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 5 @ 3 depPkg 7 [ 0, 3 ] DepSelector inst# 0 - Adding VC for 5 @ 3 depPkg 8 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 5 @ 2 depPkg 7 [ 0, 3 ] DepSelector inst# 0 - Adding VC for 5 @ 2 depPkg 8 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 5 @ 1 depPkg 7 [ 0, 3 ] DepSelector inst# 0 - Adding VC for 5 @ 1 depPkg 8 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 5 @ 0 depPkg 7 [ 0, 3 ] DepSelector inst# 0 - Adding VC for 5 @ 0 depPkg 8 [ 0, 0 ] DepSelector inst# 0 - Adding package id 9/84: min = -1, max = 2, current version 0 DepSelector inst# 0 - Adding package id 10/84: min = -1, max = 0, current version 0 DepSelector inst# 0 - Adding package id 11/84: min = -1, max = 0, current version 0 DepSelector inst# 0 - Adding package id 12/84: min = -1, max = 0, current version 0 DepSelector inst# 0 - Adding package id 13/84: min = -1, max = 1, current version 0 DepSelector inst# 0 - Adding package id 14/84: min = -1, max = 0, current version 0 DepSelector inst# 0 - Adding package id 15/84: min = -1, max = 1, current version 0 DepSelector inst# 0 - Adding package id 16/84: min = -1, max = 0, current version 0 DepSelector inst# 0 - Adding package id 17/84: min = -1, max = 1, current version 0 DepSelector inst# 0 - Adding package id 18/84: min = -1, max = 0, current version 0 DepSelector inst# 0 - Adding package id 19/84: min = -1, max = 0, current version 0 DepSelector inst# 0 - Adding package id 20/84: min = -1, max = 2, current version 0 DepSelector inst# 0 - Adding package id 21/84: min = -1, max = 0, current version 0 DepSelector inst# 0 - Adding package id 22/84: min = -1, max = 1, current version 0 DepSelector inst# 0 - Adding package id 23/84: min = -1, max = 0, current version 0 DepSelector inst# 0 - Adding package id 24/84: min = -1, max = 2, current version 0 DepSelector inst# 0 - Adding package id 25/84: min = -1, max = 3, current version 0 DepSelector inst# 0 - Adding package id 26/84: min = -1, max = 1, current version 0 DepSelector inst# 0 - Adding VC for 26 @ 1 depPkg 7 [ 0, 3 ] DepSelector inst# 0 - Adding VC for 26 @ 0 depPkg 7 [ 0, 3 ] DepSelector inst# 0 - Adding VC for 26 @ 0 depPkg 6 [ 0, 5 ] DepSelector inst# 0 - Adding package id 27/84: min = -1, max = 3, current version 0 DepSelector inst# 0 - Adding package id 28/84: min = -1, max = 5, current version 0 DepSelector inst# 0 - Adding package id 29/84: min = -1, max = 0, current version 0 DepSelector inst# 0 - Adding package id 30/84: min = -1, max = 2, current version 0 DepSelector inst# 0 - Adding package id 31/84: min = -1, max = 0, current version 0 DepSelector inst# 0 - Adding VC for 30 @ 2 depPkg 31 [ 0, 0 ] DepSelector inst# 0 - Adding package id 32/84: min = -1, max = 2, current version 0 DepSelector inst# 0 - Adding package id 33/84: min = -1, max = 0, current version 0 DepSelector inst# 0 - Adding package id 34/84: min = -1, max = 0, current version 0 DepSelector inst# 0 - Adding VC for 33 @ 0 depPkg 34 [ 0, 0 ] DepSelector inst# 0 - Adding package id 35/84: min = -1, max = 24, current version 0 DepSelector inst# 0 - Adding package id 36/84: min = -1, max = 0, current version 0 DepSelector inst# 0 - Adding VC for 35 @ 24 depPkg 36 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 35 @ 24 depPkg 6 [ 0, 5 ] DepSelector inst# 0 - Adding VC for 35 @ 23 depPkg 36 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 35 @ 23 depPkg 6 [ 0, 5 ] DepSelector inst# 0 - Adding VC for 35 @ 22 depPkg 36 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 35 @ 22 depPkg 6 [ 0, 5 ] DepSelector inst# 0 - Adding VC for 35 @ 21 depPkg 36 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 35 @ 21 depPkg 6 [ 0, 5 ] DepSelector inst# 0 - Adding VC for 35 @ 20 depPkg 36 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 35 @ 20 depPkg 6 [ 0, 5 ] DepSelector inst# 0 - Adding VC for 35 @ 19 depPkg 36 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 35 @ 19 depPkg 6 [ 0, 5 ] DepSelector inst# 0 - Adding VC for 35 @ 18 depPkg 36 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 35 @ 18 depPkg 6 [ 0, 5 ] DepSelector inst# 0 - Adding VC for 35 @ 17 depPkg 36 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 35 @ 17 depPkg 6 [ 0, 5 ] DepSelector inst# 0 - Adding VC for 35 @ 16 depPkg 36 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 35 @ 16 depPkg 6 [ 0, 5 ] DepSelector inst# 0 - Adding VC for 35 @ 15 depPkg 36 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 35 @ 15 depPkg 6 [ 0, 5 ] DepSelector inst# 0 - Adding VC for 35 @ 14 depPkg 36 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 35 @ 14 depPkg 6 [ 0, 5 ] DepSelector inst# 0 - Adding VC for 35 @ 13 depPkg 36 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 35 @ 13 depPkg 6 [ 0, 5 ] DepSelector inst# 0 - Adding VC for 35 @ 12 depPkg 36 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 35 @ 12 depPkg 6 [ 0, 5 ] DepSelector inst# 0 - Adding VC for 35 @ 11 depPkg 36 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 35 @ 11 depPkg 6 [ 0, 5 ] DepSelector inst# 0 - Adding VC for 35 @ 10 depPkg 36 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 35 @ 10 depPkg 6 [ 0, 5 ] DepSelector inst# 0 - Adding VC for 35 @ 9 depPkg 36 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 35 @ 9 depPkg 6 [ 0, 5 ] DepSelector inst# 0 - Adding VC for 35 @ 8 depPkg 36 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 35 @ 8 depPkg 6 [ 0, 5 ] DepSelector inst# 0 - Adding VC for 35 @ 7 depPkg 36 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 35 @ 7 depPkg 6 [ 0, 5 ] DepSelector inst# 0 - Adding VC for 35 @ 6 depPkg 36 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 35 @ 6 depPkg 6 [ 0, 5 ] DepSelector inst# 0 - Adding VC for 35 @ 5 depPkg 36 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 35 @ 5 depPkg 6 [ 0, 5 ] DepSelector inst# 0 - Adding VC for 35 @ 4 depPkg 36 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 35 @ 4 depPkg 6 [ 0, 5 ] DepSelector inst# 0 - Adding VC for 35 @ 3 depPkg 36 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 35 @ 3 depPkg 6 [ 0, 5 ] DepSelector inst# 0 - Adding VC for 35 @ 2 depPkg 36 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 35 @ 2 depPkg 6 [ 0, 5 ] DepSelector inst# 0 - Adding VC for 35 @ 1 depPkg 6 [ 0, 5 ] DepSelector inst# 0 - Adding package id 37/84: min = -1, max = 0, current version 0 DepSelector inst# 0 - Adding VC for 36 @ 0 depPkg 37 [ 0, 0 ] DepSelector inst# 0 - Adding package id 38/84: min = -1, max = 4, current version 0 DepSelector inst# 0 - Adding VC for 37 @ 0 depPkg 38 [ 0, 4 ] DepSelector inst# 0 - Adding VC for 38 @ 4 depPkg 4 [ 0, 5 ] DepSelector inst# 0 - Adding VC for 38 @ 3 depPkg 4 [ 0, 5 ] DepSelector inst# 0 - Adding VC for 38 @ 2 depPkg 4 [ 0, 5 ] DepSelector inst# 0 - Adding package id 39/84: min = -1, max = 3, current version 0 DepSelector inst# 0 - Adding VC for 39 @ 3 depPkg 38 [ 0, 4 ] DepSelector inst# 0 - Adding VC for 39 @ 2 depPkg 38 [ 0, 4 ] DepSelector inst# 0 - Adding VC for 39 @ 1 depPkg 38 [ 0, 4 ] DepSelector inst# 0 - Adding VC for 39 @ 0 depPkg 38 [ 0, 4 ] DepSelector inst# 0 - Adding package id 40/84: min = -1, max = 2, current version 0 DepSelector inst# 0 - Adding package id 41/84: min = -1, max = 2, current version 0 DepSelector inst# 0 - Adding package id 42/84: min = -1, max = 1, current version 0 DepSelector inst# 0 - Adding VC for 42 @ 1 depPkg 10 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 42 @ 0 depPkg 10 [ 0, 0 ] DepSelector inst# 0 - Adding package id 43/84: min = -1, max = 7, current version 0 DepSelector inst# 0 - Adding package id 44/84: min = -1, max = 1, current version 0 DepSelector inst# 0 - Adding VC for 44 @ 1 depPkg 5 [ 0, 5 ] DepSelector inst# 0 - Adding VC for 44 @ 0 depPkg 5 [ 0, 5 ] DepSelector inst# 0 - Adding package id 45/84: min = -1, max = 1, current version 0 DepSelector inst# 0 - Adding package id 46/84: min = -1, max = 2, current version 0 DepSelector inst# 0 - Adding VC for 45 @ 1 depPkg 46 [ 0, 2 ] DepSelector inst# 0 - Adding package id 47/84: min = -1, max = 4, current version 0 DepSelector inst# 0 - Adding VC for 45 @ 1 depPkg 47 [ 0, 4 ] DepSelector inst# 0 - Adding VC for 45 @ 1 depPkg 34 [ 0, 0 ] DepSelector inst# 0 - Adding package id 48/84: min = -1, max = 1, current version 0 DepSelector inst# 0 - Adding VC for 45 @ 1 depPkg 48 [ 0, 1 ] DepSelector inst# 0 - Adding package id 49/84: min = -1, max = 0, current version 0 DepSelector inst# 0 - Adding VC for 45 @ 1 depPkg 49 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 45 @ 0 depPkg 46 [ 0, 2 ] DepSelector inst# 0 - Adding VC for 45 @ 0 depPkg 47 [ 0, 4 ] DepSelector inst# 0 - Adding VC for 45 @ 0 depPkg 34 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 45 @ 0 depPkg 48 [ 0, 1 ] DepSelector inst# 0 - Adding VC for 45 @ 0 depPkg 49 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 46 @ 2 depPkg 7 [ 0, 3 ] DepSelector inst# 0 - Adding VC for 46 @ 2 depPkg 5 [ 0, 5 ] DepSelector inst# 0 - Adding VC for 46 @ 2 depPkg 6 [ 0, 5 ] DepSelector inst# 0 - Adding VC for 46 @ 1 depPkg 6 [ 0, 5 ] DepSelector inst# 0 - Adding VC for 46 @ 0 depPkg 6 [ 0, 5 ] DepSelector inst# 0 - Adding package id 50/84: min = -1, max = 2, current version 0 DepSelector inst# 0 - Adding VC for 48 @ 1 depPkg 50 [ 0, 2 ] DepSelector inst# 0 - Adding package id 51/84: min = -1, max = 3, current version 0 DepSelector inst# 0 - Adding VC for 48 @ 1 depPkg 51 [ 0, 3 ] DepSelector inst# 0 - Adding VC for 48 @ 1 depPkg 6 [ 0, 5 ] DepSelector inst# 0 - Adding VC for 48 @ 1 depPkg 49 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 48 @ 0 depPkg 51 [ 0, 3 ] DepSelector inst# 0 - Adding VC for 48 @ 0 depPkg 6 [ 0, 5 ] DepSelector inst# 0 - Adding VC for 48 @ 0 depPkg 49 [ 0, 0 ] DepSelector inst# 0 - Adding package id 52/84: min = -1, max = 0, current version 0 DepSelector inst# 0 - Adding VC for 51 @ 3 depPkg 52 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 51 @ 2 depPkg 52 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 51 @ 1 depPkg 52 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 51 @ 0 depPkg 52 [ 0, 0 ] DepSelector inst# 0 - Adding package id 53/84: min = -1, max = 1, current version 0 DepSelector inst# 0 - Adding VC for 53 @ 1 depPkg 38 [ 0, 4 ] DepSelector inst# 0 - Adding package id 54/84: min = -1, max = 0, current version 0 DepSelector inst# 0 - Adding VC for 54 @ 0 depPkg 7 [ 0, 3 ] DepSelector inst# 0 - Adding VC for 54 @ 0 depPkg 38 [ 0, 4 ] DepSelector inst# 0 - Adding package id 55/84: min = -1, max = 4, current version 0 DepSelector inst# 0 - Adding VC for 55 @ 4 depPkg 7 [ 0, 3 ] DepSelector inst# 0 - Adding VC for 55 @ 4 depPkg 38 [ 0, 4 ] DepSelector inst# 0 - Adding VC for 55 @ 3 depPkg 7 [ 0, 3 ] DepSelector inst# 0 - Adding VC for 55 @ 3 depPkg 38 [ 0, 4 ] DepSelector inst# 0 - Adding VC for 55 @ 2 depPkg 7 [ 0, 3 ] DepSelector inst# 0 - Adding VC for 55 @ 2 depPkg 38 [ 0, 4 ] DepSelector inst# 0 - Adding VC for 55 @ 1 depPkg 7 [ 0, 3 ] DepSelector inst# 0 - Adding VC for 55 @ 1 depPkg 38 [ 0, 4 ] DepSelector inst# 0 - Adding VC for 55 @ 0 depPkg 7 [ 0, 3 ] DepSelector inst# 0 - Adding VC for 55 @ 0 depPkg 38 [ 0, 4 ] DepSelector inst# 0 - Adding package id 56/84: min = -1, max = 3, current version 0 DepSelector inst# 0 - Adding VC for 56 @ 3 depPkg 7 [ 0, 3 ] DepSelector inst# 0 - Adding VC for 56 @ 2 depPkg 7 [ 0, 3 ] DepSelector inst# 0 - Adding VC for 56 @ 1 depPkg 7 [ 0, 3 ] DepSelector inst# 0 - Adding VC for 56 @ 0 depPkg 7 [ 0, 3 ] DepSelector inst# 0 - Adding package id 57/84: min = -1, max = 5, current version 0 DepSelector inst# 0 - Adding package id 58/84: min = -1, max = 2, current version 0 DepSelector inst# 0 - Adding VC for 57 @ 5 depPkg 58 [ 0, 2 ] DepSelector inst# 0 - Adding package id 59/84: min = -1, max = 0, current version 0 DepSelector inst# 0 - Adding VC for 57 @ 5 depPkg 59 [ 0, 0 ] DepSelector inst# 0 - Adding package id 60/84: min = -1, max = 0, current version 0 DepSelector inst# 0 - Adding VC for 57 @ 5 depPkg 60 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 57 @ 5 depPkg 6 [ 0, 5 ] DepSelector inst# 0 - Adding VC for 57 @ 5 depPkg 22 [ 0, 1 ] DepSelector inst# 0 - Adding package id 61/84: min = -1, max = 6, current version 0 DepSelector inst# 0 - Adding VC for 57 @ 5 depPkg 61 [ 0, 6 ] DepSelector inst# 0 - Adding package id 62/84: min = -1, max = 4, current version 0 DepSelector inst# 0 - Adding VC for 57 @ 5 depPkg 62 [ 0, 4 ] DepSelector inst# 0 - Adding VC for 57 @ 4 depPkg 58 [ 0, 2 ] DepSelector inst# 0 - Adding VC for 57 @ 4 depPkg 59 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 57 @ 4 depPkg 60 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 57 @ 4 depPkg 6 [ 0, 5 ] DepSelector inst# 0 - Adding VC for 57 @ 4 depPkg 22 [ 0, 1 ] DepSelector inst# 0 - Adding VC for 57 @ 4 depPkg 61 [ 0, 6 ] DepSelector inst# 0 - Adding VC for 57 @ 4 depPkg 62 [ 0, 4 ] DepSelector inst# 0 - Adding VC for 57 @ 3 depPkg 58 [ 0, 2 ] DepSelector inst# 0 - Adding VC for 57 @ 3 depPkg 59 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 57 @ 3 depPkg 60 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 57 @ 3 depPkg 6 [ 0, 5 ] DepSelector inst# 0 - Adding VC for 57 @ 3 depPkg 22 [ 0, 1 ] DepSelector inst# 0 - Adding VC for 57 @ 3 depPkg 62 [ 0, 4 ] DepSelector inst# 0 - Adding VC for 57 @ 2 depPkg 58 [ 0, 2 ] DepSelector inst# 0 - Adding VC for 57 @ 2 depPkg 59 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 57 @ 2 depPkg 60 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 57 @ 2 depPkg 6 [ 0, 5 ] DepSelector inst# 0 - Adding VC for 57 @ 2 depPkg 22 [ 0, 1 ] DepSelector inst# 0 - Adding VC for 57 @ 2 depPkg 62 [ 0, 4 ] DepSelector inst# 0 - Adding VC for 57 @ 1 depPkg 58 [ 0, 2 ] DepSelector inst# 0 - Adding VC for 57 @ 1 depPkg 59 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 57 @ 1 depPkg 60 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 57 @ 1 depPkg 6 [ 0, 5 ] DepSelector inst# 0 - Adding VC for 57 @ 1 depPkg 22 [ 0, 1 ] DepSelector inst# 0 - Adding VC for 57 @ 1 depPkg 62 [ 0, 4 ] DepSelector inst# 0 - Adding package id 63/84: min = -1, max = 2, current version 0 DepSelector inst# 0 - Adding VC for 58 @ 2 depPkg 63 [ 0, 2 ] DepSelector inst# 0 - Adding package id 64/84: min = -1, max = 2, current version 0 DepSelector inst# 0 - Adding VC for 58 @ 2 depPkg 64 [ 0, 2 ] DepSelector inst# 0 - Adding package id 65/84: min = -1, max = 0, current version 0 DepSelector inst# 0 - Adding VC for 58 @ 2 depPkg 65 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 58 @ 2 depPkg 6 [ 0, 5 ] DepSelector inst# 0 - Adding VC for 58 @ 1 depPkg 63 [ 0, 2 ] DepSelector inst# 0 - Adding VC for 58 @ 1 depPkg 64 [ 0, 2 ] DepSelector inst# 0 - Adding VC for 58 @ 1 depPkg 65 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 58 @ 1 depPkg 6 [ 0, 5 ] DepSelector inst# 0 - Adding VC for 58 @ 0 depPkg 63 [ 0, 2 ] DepSelector inst# 0 - Adding VC for 58 @ 0 depPkg 64 [ 0, 2 ] DepSelector inst# 0 - Adding VC for 58 @ 0 depPkg 65 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 58 @ 0 depPkg 6 [ 0, 5 ] DepSelector inst# 0 - Adding VC for 63 @ 2 depPkg 65 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 63 @ 2 depPkg 6 [ 0, 5 ] DepSelector inst# 0 - Adding VC for 63 @ 1 depPkg 65 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 63 @ 1 depPkg 6 [ 0, 5 ] DepSelector inst# 0 - Adding VC for 63 @ 0 depPkg 65 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 63 @ 0 depPkg 6 [ 0, 5 ] DepSelector inst# 0 - Adding package id 66/84: min = -1, max = 1, current version 0 DepSelector inst# 0 - Adding VC for 60 @ 0 depPkg 66 [ 0, 1 ] DepSelector inst# 0 - Adding VC for 62 @ 4 depPkg 7 [ 0, 3 ] DepSelector inst# 0 - Adding VC for 62 @ 4 depPkg 38 [ 0, 4 ] DepSelector inst# 0 - Adding VC for 62 @ 4 depPkg 6 [ 0, 5 ] DepSelector inst# 0 - Adding VC for 62 @ 3 depPkg 7 [ 0, 3 ] DepSelector inst# 0 - Adding VC for 62 @ 3 depPkg 38 [ 0, 4 ] DepSelector inst# 0 - Adding VC for 62 @ 3 depPkg 6 [ 0, 5 ] DepSelector inst# 0 - Adding VC for 62 @ 2 depPkg 7 [ 0, 3 ] DepSelector inst# 0 - Adding VC for 62 @ 2 depPkg 38 [ 0, 4 ] DepSelector inst# 0 - Adding VC for 62 @ 2 depPkg 6 [ 0, 5 ] DepSelector inst# 0 - Adding VC for 62 @ 1 depPkg 7 [ 0, 3 ] DepSelector inst# 0 - Adding VC for 62 @ 1 depPkg 38 [ 0, 4 ] DepSelector inst# 0 - Adding VC for 62 @ 1 depPkg 6 [ 0, 5 ] DepSelector inst# 0 - Adding VC for 62 @ 0 depPkg 7 [ 0, 3 ] DepSelector inst# 0 - Adding VC for 62 @ 0 depPkg 38 [ 0, 4 ] DepSelector inst# 0 - Adding VC for 62 @ 0 depPkg 6 [ 0, 5 ] DepSelector inst# 0 - Adding package id 67/84: min = -1, max = 7, current version 0 DepSelector inst# 0 - Adding VC for 67 @ 7 depPkg 58 [ 0, 2 ] DepSelector inst# 0 - Adding VC for 67 @ 7 depPkg 59 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 67 @ 7 depPkg 60 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 67 @ 7 depPkg 6 [ 0, 5 ] DepSelector inst# 0 - Adding VC for 67 @ 7 depPkg 22 [ 0, 1 ] DepSelector inst# 0 - Adding VC for 67 @ 7 depPkg 61 [ 0, 6 ] DepSelector inst# 0 - Adding VC for 67 @ 7 depPkg 62 [ 0, 4 ] DepSelector inst# 0 - Adding VC for 67 @ 6 depPkg 58 [ 0, 2 ] DepSelector inst# 0 - Adding VC for 67 @ 6 depPkg 59 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 67 @ 6 depPkg 60 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 67 @ 6 depPkg 6 [ 0, 5 ] DepSelector inst# 0 - Adding VC for 67 @ 6 depPkg 22 [ 0, 1 ] DepSelector inst# 0 - Adding VC for 67 @ 6 depPkg 61 [ 0, 6 ] DepSelector inst# 0 - Adding VC for 67 @ 6 depPkg 62 [ 0, 4 ] DepSelector inst# 0 - Adding VC for 67 @ 5 depPkg 58 [ 0, 2 ] DepSelector inst# 0 - Adding VC for 67 @ 5 depPkg 59 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 67 @ 5 depPkg 60 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 67 @ 5 depPkg 6 [ 0, 5 ] DepSelector inst# 0 - Adding VC for 67 @ 5 depPkg 22 [ 0, 1 ] DepSelector inst# 0 - Adding VC for 67 @ 5 depPkg 61 [ 0, 6 ] DepSelector inst# 0 - Adding VC for 67 @ 5 depPkg 62 [ 0, 4 ] DepSelector inst# 0 - Adding VC for 67 @ 4 depPkg 58 [ 0, 2 ] DepSelector inst# 0 - Adding VC for 67 @ 4 depPkg 59 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 67 @ 4 depPkg 60 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 67 @ 4 depPkg 6 [ 0, 5 ] DepSelector inst# 0 - Adding VC for 67 @ 4 depPkg 22 [ 0, 1 ] DepSelector inst# 0 - Adding VC for 67 @ 4 depPkg 61 [ 0, 6 ] DepSelector inst# 0 - Adding VC for 67 @ 4 depPkg 62 [ 0, 4 ] DepSelector inst# 0 - Adding VC for 67 @ 3 depPkg 58 [ 0, 2 ] DepSelector inst# 0 - Adding VC for 67 @ 3 depPkg 59 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 67 @ 3 depPkg 60 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 67 @ 3 depPkg 6 [ 0, 5 ] DepSelector inst# 0 - Adding VC for 67 @ 3 depPkg 22 [ 0, 1 ] DepSelector inst# 0 - Adding VC for 67 @ 3 depPkg 61 [ 0, 6 ] DepSelector inst# 0 - Adding VC for 67 @ 3 depPkg 62 [ 0, 4 ] DepSelector inst# 0 - Adding VC for 67 @ 2 depPkg 58 [ 0, 2 ] DepSelector inst# 0 - Adding VC for 67 @ 2 depPkg 59 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 67 @ 2 depPkg 60 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 67 @ 2 depPkg 6 [ 0, 5 ] DepSelector inst# 0 - Adding VC for 67 @ 2 depPkg 22 [ 0, 1 ] DepSelector inst# 0 - Adding VC for 67 @ 2 depPkg 62 [ 0, 4 ] DepSelector inst# 0 - Adding VC for 67 @ 1 depPkg 58 [ 0, 2 ] DepSelector inst# 0 - Adding VC for 67 @ 1 depPkg 59 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 67 @ 1 depPkg 60 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 67 @ 1 depPkg 6 [ 0, 5 ] DepSelector inst# 0 - Adding VC for 67 @ 1 depPkg 22 [ 0, 1 ] DepSelector inst# 0 - Adding VC for 67 @ 1 depPkg 62 [ 0, 4 ] DepSelector inst# 0 - Adding VC for 67 @ 0 depPkg 58 [ 0, 2 ] DepSelector inst# 0 - Adding VC for 67 @ 0 depPkg 59 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 67 @ 0 depPkg 60 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 67 @ 0 depPkg 6 [ 0, 5 ] DepSelector inst# 0 - Adding VC for 67 @ 0 depPkg 22 [ 0, 1 ] DepSelector inst# 0 - Adding VC for 67 @ 0 depPkg 62 [ 0, 4 ] DepSelector inst# 0 - Adding package id 68/84: min = -1, max = 1, current version 0 DepSelector inst# 0 - Adding package id 69/84: min = -1, max = 0, current version 0 DepSelector inst# 0 - Adding package id 70/84: min = -1, max = 1, current version 0 DepSelector inst# 0 - Adding package id 71/84: min = -1, max = 1, current version 0 DepSelector inst# 0 - Adding VC for 70 @ 1 depPkg 71 [ 0, 1 ] DepSelector inst# 0 - Adding VC for 70 @ 1 depPkg 6 [ 0, 5 ] DepSelector inst# 0 - Adding VC for 70 @ 0 depPkg 71 [ 0, 1 ] DepSelector inst# 0 - Adding VC for 70 @ 0 depPkg 6 [ 0, 5 ] DepSelector inst# 0 - Adding package id 72/84: min = -1, max = 0, current version 0 DepSelector inst# 0 - Adding package id 73/84: min = -1, max = 11, current version 0 DepSelector inst# 0 - Adding VC for 73 @ 11 depPkg 50 [ 0, 2 ] DepSelector inst# 0 - Adding VC for 73 @ 11 depPkg 71 [ 0, 1 ] DepSelector inst# 0 - Adding VC for 73 @ 11 depPkg 60 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 73 @ 11 depPkg 22 [ 0, 1 ] DepSelector inst# 0 - Adding VC for 73 @ 11 depPkg 34 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 73 @ 11 depPkg 61 [ 0, 6 ] DepSelector inst# 0 - Adding VC for 73 @ 10 depPkg 50 [ 0, 2 ] DepSelector inst# 0 - Adding VC for 73 @ 10 depPkg 71 [ 0, 1 ] DepSelector inst# 0 - Adding VC for 73 @ 10 depPkg 60 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 73 @ 10 depPkg 22 [ 0, 1 ] DepSelector inst# 0 - Adding VC for 73 @ 10 depPkg 34 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 73 @ 10 depPkg 61 [ 0, 6 ] DepSelector inst# 0 - Adding VC for 73 @ 9 depPkg 50 [ 0, 2 ] DepSelector inst# 0 - Adding VC for 73 @ 9 depPkg 71 [ 0, 1 ] DepSelector inst# 0 - Adding VC for 73 @ 9 depPkg 60 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 73 @ 9 depPkg 22 [ 0, 1 ] DepSelector inst# 0 - Adding VC for 73 @ 9 depPkg 34 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 73 @ 9 depPkg 61 [ 0, 6 ] DepSelector inst# 0 - Adding VC for 73 @ 8 depPkg 50 [ 0, 2 ] DepSelector inst# 0 - Adding VC for 73 @ 8 depPkg 71 [ 0, 1 ] DepSelector inst# 0 - Adding VC for 73 @ 8 depPkg 60 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 73 @ 8 depPkg 22 [ 0, 1 ] DepSelector inst# 0 - Adding VC for 73 @ 8 depPkg 34 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 73 @ 8 depPkg 61 [ 0, 6 ] DepSelector inst# 0 - Adding VC for 73 @ 7 depPkg 50 [ 0, 2 ] DepSelector inst# 0 - Adding VC for 73 @ 7 depPkg 71 [ 0, 1 ] DepSelector inst# 0 - Adding VC for 73 @ 7 depPkg 60 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 73 @ 7 depPkg 22 [ 0, 1 ] DepSelector inst# 0 - Adding VC for 73 @ 7 depPkg 34 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 73 @ 7 depPkg 61 [ 0, 6 ] DepSelector inst# 0 - Adding VC for 73 @ 6 depPkg 50 [ 0, 2 ] DepSelector inst# 0 - Adding VC for 73 @ 6 depPkg 60 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 73 @ 6 depPkg 22 [ 0, 1 ] DepSelector inst# 0 - Adding VC for 73 @ 6 depPkg 34 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 73 @ 5 depPkg 50 [ 0, 2 ] DepSelector inst# 0 - Adding VC for 73 @ 5 depPkg 71 [ 0, 1 ] DepSelector inst# 0 - Adding VC for 73 @ 5 depPkg 60 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 73 @ 5 depPkg 22 [ 0, 1 ] DepSelector inst# 0 - Adding VC for 73 @ 5 depPkg 34 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 73 @ 4 depPkg 71 [ 0, 1 ] DepSelector inst# 0 - Adding VC for 73 @ 4 depPkg 60 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 73 @ 4 depPkg 22 [ 0, 1 ] DepSelector inst# 0 - Adding VC for 73 @ 4 depPkg 34 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 73 @ 3 depPkg 71 [ 0, 1 ] DepSelector inst# 0 - Adding VC for 73 @ 3 depPkg 60 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 73 @ 3 depPkg 22 [ 0, 1 ] DepSelector inst# 0 - Adding VC for 73 @ 3 depPkg 34 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 73 @ 2 depPkg 71 [ 0, 1 ] DepSelector inst# 0 - Adding VC for 73 @ 2 depPkg 60 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 73 @ 2 depPkg 22 [ 0, 1 ] DepSelector inst# 0 - Adding VC for 73 @ 1 depPkg 71 [ 0, 1 ] DepSelector inst# 0 - Adding VC for 73 @ 1 depPkg 60 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 73 @ 1 depPkg 22 [ 0, 1 ] DepSelector inst# 0 - Adding VC for 73 @ 0 depPkg 71 [ 0, 1 ] DepSelector inst# 0 - Adding VC for 73 @ 0 depPkg 60 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 73 @ 0 depPkg 22 [ 0, 1 ] DepSelector inst# 0 - Adding package id 74/84: min = -1, max = 7, current version 0 DepSelector inst# 0 - Adding VC for 74 @ 7 depPkg 47 [ 0, 4 ] DepSelector inst# 0 - Adding package id 75/84: min = -1, max = 32, current version 0 DepSelector inst# 0 - Adding VC for 74 @ 7 depPkg 75 [ 0, 32 ] DepSelector inst# 0 - Adding VC for 74 @ 7 depPkg 22 [ 0, 1 ] DepSelector inst# 0 - Adding VC for 74 @ 7 depPkg 61 [ 0, 6 ] DepSelector inst# 0 - Adding VC for 74 @ 6 depPkg 47 [ 0, 4 ] DepSelector inst# 0 - Adding VC for 74 @ 6 depPkg 75 [ 0, 32 ] DepSelector inst# 0 - Adding VC for 74 @ 6 depPkg 22 [ 0, 1 ] DepSelector inst# 0 - Adding VC for 74 @ 6 depPkg 61 [ 0, 6 ] DepSelector inst# 0 - Adding VC for 74 @ 5 depPkg 47 [ 0, 4 ] DepSelector inst# 0 - Adding VC for 74 @ 5 depPkg 22 [ 0, 1 ] DepSelector inst# 0 - Adding VC for 74 @ 5 depPkg 61 [ 0, 6 ] DepSelector inst# 0 - Adding VC for 74 @ 4 depPkg 47 [ 0, 4 ] DepSelector inst# 0 - Adding VC for 74 @ 4 depPkg 22 [ 0, 1 ] DepSelector inst# 0 - Adding VC for 74 @ 4 depPkg 61 [ 0, 6 ] DepSelector inst# 0 - Adding VC for 74 @ 3 depPkg 47 [ 0, 4 ] DepSelector inst# 0 - Adding VC for 74 @ 3 depPkg 22 [ 0, 1 ] DepSelector inst# 0 - Adding VC for 74 @ 2 depPkg 47 [ 0, 4 ] DepSelector inst# 0 - Adding VC for 74 @ 2 depPkg 22 [ 0, 1 ] DepSelector inst# 0 - Adding VC for 74 @ 1 depPkg 47 [ 0, 4 ] DepSelector inst# 0 - Adding VC for 74 @ 1 depPkg 22 [ 0, 1 ] DepSelector inst# 0 - Adding VC for 74 @ 0 depPkg 22 [ 0, 1 ] DepSelector inst# 0 - Adding VC for 75 @ 32 depPkg 59 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 75 @ 32 depPkg 47 [ 0, 4 ] DepSelector inst# 0 - Adding VC for 75 @ 32 depPkg 22 [ 0, 1 ] DepSelector inst# 0 - Adding package id 76/84: min = -1, max = 0, current version 0 DepSelector inst# 0 - Adding VC for 75 @ 32 depPkg 76 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 75 @ 32 depPkg 34 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 75 @ 32 depPkg 61 [ 0, 6 ] DepSelector inst# 0 - Adding package id 77/84: min = -1, max = 0, current version 0 DepSelector inst# 0 - Adding VC for 75 @ 32 depPkg 77 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 75 @ 31 depPkg 59 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 75 @ 31 depPkg 47 [ 0, 4 ] DepSelector inst# 0 - Adding VC for 75 @ 31 depPkg 22 [ 0, 1 ] DepSelector inst# 0 - Adding VC for 75 @ 31 depPkg 76 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 75 @ 31 depPkg 34 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 75 @ 31 depPkg 61 [ 0, 6 ] DepSelector inst# 0 - Adding VC for 75 @ 31 depPkg 77 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 75 @ 30 depPkg 59 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 75 @ 30 depPkg 47 [ 0, 4 ] DepSelector inst# 0 - Adding VC for 75 @ 30 depPkg 6 [ 0, 5 ] DepSelector inst# 0 - Adding VC for 75 @ 30 depPkg 22 [ 0, 1 ] DepSelector inst# 0 - Adding VC for 75 @ 30 depPkg 76 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 75 @ 30 depPkg 34 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 75 @ 30 depPkg 61 [ 0, 6 ] DepSelector inst# 0 - Adding VC for 75 @ 30 depPkg 62 [ 0, 4 ] DepSelector inst# 0 - Adding VC for 75 @ 29 depPkg 59 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 75 @ 29 depPkg 47 [ 0, 4 ] DepSelector inst# 0 - Adding VC for 75 @ 29 depPkg 6 [ 0, 5 ] DepSelector inst# 0 - Adding VC for 75 @ 29 depPkg 22 [ 0, 1 ] DepSelector inst# 0 - Adding VC for 75 @ 29 depPkg 76 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 75 @ 29 depPkg 34 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 75 @ 29 depPkg 61 [ 0, 6 ] DepSelector inst# 0 - Adding VC for 75 @ 29 depPkg 62 [ 0, 4 ] DepSelector inst# 0 - Adding VC for 75 @ 28 depPkg 59 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 75 @ 28 depPkg 47 [ 0, 4 ] DepSelector inst# 0 - Adding VC for 75 @ 28 depPkg 6 [ 0, 5 ] DepSelector inst# 0 - Adding VC for 75 @ 28 depPkg 22 [ 0, 1 ] DepSelector inst# 0 - Adding VC for 75 @ 28 depPkg 76 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 75 @ 28 depPkg 34 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 75 @ 28 depPkg 61 [ 0, 6 ] DepSelector inst# 0 - Adding VC for 75 @ 28 depPkg 62 [ 0, 4 ] DepSelector inst# 0 - Adding VC for 75 @ 27 depPkg 59 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 75 @ 27 depPkg 47 [ 0, 4 ] DepSelector inst# 0 - Adding VC for 75 @ 27 depPkg 6 [ 0, 5 ] DepSelector inst# 0 - Adding VC for 75 @ 27 depPkg 22 [ 0, 1 ] DepSelector inst# 0 - Adding VC for 75 @ 27 depPkg 76 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 75 @ 27 depPkg 34 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 75 @ 27 depPkg 61 [ 0, 6 ] DepSelector inst# 0 - Adding VC for 75 @ 27 depPkg 62 [ 0, 4 ] DepSelector inst# 0 - Adding VC for 75 @ 26 depPkg 59 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 75 @ 26 depPkg 47 [ 0, 4 ] DepSelector inst# 0 - Adding VC for 75 @ 26 depPkg 6 [ 0, 5 ] DepSelector inst# 0 - Adding VC for 75 @ 26 depPkg 22 [ 0, 1 ] DepSelector inst# 0 - Adding VC for 75 @ 26 depPkg 76 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 75 @ 26 depPkg 34 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 75 @ 26 depPkg 61 [ 0, 6 ] DepSelector inst# 0 - Adding VC for 75 @ 26 depPkg 62 [ 0, 4 ] DepSelector inst# 0 - Adding VC for 75 @ 25 depPkg 59 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 75 @ 25 depPkg 47 [ 0, 4 ] DepSelector inst# 0 - Adding VC for 75 @ 25 depPkg 6 [ 0, 5 ] DepSelector inst# 0 - Adding VC for 75 @ 25 depPkg 22 [ 0, 1 ] DepSelector inst# 0 - Adding VC for 75 @ 25 depPkg 76 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 75 @ 25 depPkg 34 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 75 @ 25 depPkg 61 [ 0, 6 ] DepSelector inst# 0 - Adding VC for 75 @ 25 depPkg 62 [ 0, 4 ] DepSelector inst# 0 - Adding VC for 75 @ 24 depPkg 59 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 75 @ 24 depPkg 47 [ 0, 4 ] DepSelector inst# 0 - Adding VC for 75 @ 24 depPkg 6 [ 0, 5 ] DepSelector inst# 0 - Adding VC for 75 @ 24 depPkg 22 [ 0, 1 ] DepSelector inst# 0 - Adding VC for 75 @ 24 depPkg 76 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 75 @ 24 depPkg 34 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 75 @ 24 depPkg 61 [ 0, 6 ] DepSelector inst# 0 - Adding VC for 75 @ 24 depPkg 62 [ 0, 4 ] DepSelector inst# 0 - Adding VC for 75 @ 23 depPkg 59 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 75 @ 23 depPkg 47 [ 0, 4 ] DepSelector inst# 0 - Adding VC for 75 @ 23 depPkg 6 [ 0, 5 ] DepSelector inst# 0 - Adding VC for 75 @ 23 depPkg 22 [ 0, 1 ] DepSelector inst# 0 - Adding VC for 75 @ 23 depPkg 76 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 75 @ 23 depPkg 34 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 75 @ 23 depPkg 61 [ 0, 6 ] DepSelector inst# 0 - Adding VC for 75 @ 23 depPkg 62 [ 0, 4 ] DepSelector inst# 0 - Adding VC for 75 @ 22 depPkg 59 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 75 @ 22 depPkg 47 [ 0, 4 ] DepSelector inst# 0 - Adding VC for 75 @ 22 depPkg 6 [ 0, 5 ] DepSelector inst# 0 - Adding VC for 75 @ 22 depPkg 22 [ 0, 1 ] DepSelector inst# 0 - Adding VC for 75 @ 22 depPkg 76 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 75 @ 22 depPkg 34 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 75 @ 22 depPkg 61 [ 0, 6 ] DepSelector inst# 0 - Adding VC for 75 @ 22 depPkg 62 [ 0, 4 ] DepSelector inst# 0 - Adding VC for 75 @ 21 depPkg 59 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 75 @ 21 depPkg 47 [ 0, 4 ] DepSelector inst# 0 - Adding VC for 75 @ 21 depPkg 6 [ 0, 5 ] DepSelector inst# 0 - Adding VC for 75 @ 21 depPkg 22 [ 0, 1 ] DepSelector inst# 0 - Adding VC for 75 @ 21 depPkg 76 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 75 @ 21 depPkg 34 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 75 @ 21 depPkg 61 [ 0, 6 ] DepSelector inst# 0 - Adding VC for 75 @ 21 depPkg 62 [ 0, 4 ] DepSelector inst# 0 - Adding VC for 75 @ 20 depPkg 59 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 75 @ 20 depPkg 47 [ 0, 4 ] DepSelector inst# 0 - Adding VC for 75 @ 20 depPkg 6 [ 0, 5 ] DepSelector inst# 0 - Adding VC for 75 @ 20 depPkg 22 [ 0, 1 ] DepSelector inst# 0 - Adding VC for 75 @ 20 depPkg 76 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 75 @ 20 depPkg 34 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 75 @ 20 depPkg 61 [ 0, 6 ] DepSelector inst# 0 - Adding VC for 75 @ 20 depPkg 62 [ 0, 4 ] DepSelector inst# 0 - Adding VC for 75 @ 19 depPkg 59 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 75 @ 19 depPkg 47 [ 0, 4 ] DepSelector inst# 0 - Adding VC for 75 @ 19 depPkg 6 [ 0, 5 ] DepSelector inst# 0 - Adding VC for 75 @ 19 depPkg 22 [ 0, 1 ] DepSelector inst# 0 - Adding VC for 75 @ 19 depPkg 76 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 75 @ 19 depPkg 34 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 75 @ 19 depPkg 61 [ 0, 6 ] DepSelector inst# 0 - Adding VC for 75 @ 19 depPkg 62 [ 0, 4 ] DepSelector inst# 0 - Adding VC for 75 @ 18 depPkg 59 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 75 @ 18 depPkg 47 [ 0, 4 ] DepSelector inst# 0 - Adding VC for 75 @ 18 depPkg 6 [ 0, 5 ] DepSelector inst# 0 - Adding VC for 75 @ 18 depPkg 22 [ 0, 1 ] DepSelector inst# 0 - Adding VC for 75 @ 18 depPkg 76 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 75 @ 18 depPkg 34 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 75 @ 18 depPkg 61 [ 0, 6 ] DepSelector inst# 0 - Adding VC for 75 @ 18 depPkg 62 [ 0, 4 ] DepSelector inst# 0 - Adding VC for 75 @ 17 depPkg 59 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 75 @ 17 depPkg 47 [ 0, 4 ] DepSelector inst# 0 - Adding VC for 75 @ 17 depPkg 6 [ 0, 5 ] DepSelector inst# 0 - Adding VC for 75 @ 17 depPkg 22 [ 0, 1 ] DepSelector inst# 0 - Adding VC for 75 @ 17 depPkg 76 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 75 @ 17 depPkg 34 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 75 @ 17 depPkg 61 [ 0, 6 ] DepSelector inst# 0 - Adding VC for 75 @ 17 depPkg 62 [ 0, 4 ] DepSelector inst# 0 - Adding VC for 75 @ 16 depPkg 59 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 75 @ 16 depPkg 47 [ 0, 4 ] DepSelector inst# 0 - Adding VC for 75 @ 16 depPkg 6 [ 0, 5 ] DepSelector inst# 0 - Adding VC for 75 @ 16 depPkg 22 [ 0, 1 ] DepSelector inst# 0 - Adding VC for 75 @ 16 depPkg 76 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 75 @ 16 depPkg 34 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 75 @ 16 depPkg 61 [ 0, 6 ] DepSelector inst# 0 - Adding VC for 75 @ 16 depPkg 62 [ 0, 4 ] DepSelector inst# 0 - Adding VC for 75 @ 15 depPkg 59 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 75 @ 15 depPkg 47 [ 0, 4 ] DepSelector inst# 0 - Adding VC for 75 @ 15 depPkg 6 [ 0, 5 ] DepSelector inst# 0 - Adding VC for 75 @ 15 depPkg 22 [ 0, 1 ] DepSelector inst# 0 - Adding VC for 75 @ 15 depPkg 76 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 75 @ 15 depPkg 34 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 75 @ 15 depPkg 61 [ 0, 6 ] DepSelector inst# 0 - Adding VC for 75 @ 15 depPkg 62 [ 0, 4 ] DepSelector inst# 0 - Adding VC for 75 @ 14 depPkg 59 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 75 @ 14 depPkg 47 [ 0, 4 ] DepSelector inst# 0 - Adding VC for 75 @ 14 depPkg 6 [ 0, 5 ] DepSelector inst# 0 - Adding VC for 75 @ 14 depPkg 22 [ 0, 1 ] DepSelector inst# 0 - Adding VC for 75 @ 14 depPkg 76 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 75 @ 14 depPkg 34 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 75 @ 14 depPkg 61 [ 0, 6 ] DepSelector inst# 0 - Adding VC for 75 @ 14 depPkg 62 [ 0, 4 ] DepSelector inst# 0 - Adding VC for 75 @ 13 depPkg 59 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 75 @ 13 depPkg 47 [ 0, 4 ] DepSelector inst# 0 - Adding VC for 75 @ 13 depPkg 6 [ 0, 5 ] DepSelector inst# 0 - Adding VC for 75 @ 13 depPkg 22 [ 0, 1 ] DepSelector inst# 0 - Adding VC for 75 @ 13 depPkg 76 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 75 @ 13 depPkg 34 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 75 @ 13 depPkg 61 [ 0, 6 ] DepSelector inst# 0 - Adding VC for 75 @ 13 depPkg 62 [ 0, 4 ] DepSelector inst# 0 - Adding VC for 75 @ 12 depPkg 59 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 75 @ 12 depPkg 47 [ 0, 4 ] DepSelector inst# 0 - Adding VC for 75 @ 12 depPkg 6 [ 0, 5 ] DepSelector inst# 0 - Adding VC for 75 @ 12 depPkg 22 [ 0, 1 ] DepSelector inst# 0 - Adding VC for 75 @ 12 depPkg 76 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 75 @ 12 depPkg 34 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 75 @ 12 depPkg 61 [ 0, 6 ] DepSelector inst# 0 - Adding VC for 75 @ 12 depPkg 62 [ 0, 4 ] DepSelector inst# 0 - Adding VC for 75 @ 11 depPkg 59 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 75 @ 11 depPkg 47 [ 0, 4 ] DepSelector inst# 0 - Adding VC for 75 @ 11 depPkg 6 [ 0, 5 ] DepSelector inst# 0 - Adding VC for 75 @ 11 depPkg 22 [ 0, 1 ] DepSelector inst# 0 - Adding VC for 75 @ 11 depPkg 76 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 75 @ 11 depPkg 34 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 75 @ 11 depPkg 61 [ 0, 6 ] DepSelector inst# 0 - Adding VC for 75 @ 11 depPkg 62 [ 0, 4 ] DepSelector inst# 0 - Adding VC for 75 @ 10 depPkg 59 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 75 @ 10 depPkg 47 [ 0, 4 ] DepSelector inst# 0 - Adding VC for 75 @ 10 depPkg 6 [ 0, 5 ] DepSelector inst# 0 - Adding VC for 75 @ 10 depPkg 22 [ 0, 1 ] DepSelector inst# 0 - Adding VC for 75 @ 10 depPkg 76 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 75 @ 10 depPkg 34 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 75 @ 10 depPkg 61 [ 0, 6 ] DepSelector inst# 0 - Adding VC for 75 @ 10 depPkg 62 [ 0, 4 ] DepSelector inst# 0 - Adding VC for 75 @ 9 depPkg 59 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 75 @ 9 depPkg 47 [ 0, 4 ] DepSelector inst# 0 - Adding VC for 75 @ 9 depPkg 6 [ 0, 5 ] DepSelector inst# 0 - Adding VC for 75 @ 9 depPkg 22 [ 0, 1 ] DepSelector inst# 0 - Adding VC for 75 @ 9 depPkg 76 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 75 @ 9 depPkg 34 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 75 @ 9 depPkg 62 [ 0, 4 ] DepSelector inst# 0 - Adding VC for 75 @ 8 depPkg 59 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 75 @ 8 depPkg 47 [ 0, 4 ] DepSelector inst# 0 - Adding VC for 75 @ 8 depPkg 6 [ 0, 5 ] DepSelector inst# 0 - Adding VC for 75 @ 8 depPkg 22 [ 0, 1 ] DepSelector inst# 0 - Adding VC for 75 @ 8 depPkg 76 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 75 @ 8 depPkg 34 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 75 @ 8 depPkg 62 [ 0, 4 ] DepSelector inst# 0 - Adding VC for 75 @ 7 depPkg 59 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 75 @ 7 depPkg 47 [ 0, 4 ] DepSelector inst# 0 - Adding VC for 75 @ 7 depPkg 6 [ 0, 5 ] DepSelector inst# 0 - Adding VC for 75 @ 7 depPkg 22 [ 0, 1 ] DepSelector inst# 0 - Adding VC for 75 @ 7 depPkg 76 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 75 @ 7 depPkg 34 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 75 @ 7 depPkg 62 [ 0, 4 ] DepSelector inst# 0 - Adding VC for 75 @ 6 depPkg 59 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 75 @ 6 depPkg 47 [ 0, 4 ] DepSelector inst# 0 - Adding VC for 75 @ 6 depPkg 6 [ 0, 5 ] DepSelector inst# 0 - Adding VC for 75 @ 6 depPkg 22 [ 0, 1 ] DepSelector inst# 0 - Adding VC for 75 @ 6 depPkg 76 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 75 @ 6 depPkg 34 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 75 @ 6 depPkg 62 [ 0, 4 ] DepSelector inst# 0 - Adding VC for 75 @ 5 depPkg 59 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 75 @ 5 depPkg 47 [ 0, 4 ] DepSelector inst# 0 - Adding VC for 75 @ 5 depPkg 6 [ 0, 5 ] DepSelector inst# 0 - Adding VC for 75 @ 5 depPkg 22 [ 0, 1 ] DepSelector inst# 0 - Adding VC for 75 @ 5 depPkg 76 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 75 @ 5 depPkg 34 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 75 @ 5 depPkg 62 [ 0, 4 ] DepSelector inst# 0 - Adding VC for 75 @ 4 depPkg 59 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 75 @ 4 depPkg 47 [ 0, 4 ] DepSelector inst# 0 - Adding VC for 75 @ 4 depPkg 6 [ 0, 5 ] DepSelector inst# 0 - Adding VC for 75 @ 4 depPkg 22 [ 0, 1 ] DepSelector inst# 0 - Adding VC for 75 @ 4 depPkg 76 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 75 @ 4 depPkg 34 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 75 @ 4 depPkg 62 [ 0, 4 ] DepSelector inst# 0 - Adding VC for 75 @ 3 depPkg 59 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 75 @ 3 depPkg 47 [ 0, 4 ] DepSelector inst# 0 - Adding VC for 75 @ 3 depPkg 6 [ 0, 5 ] DepSelector inst# 0 - Adding VC for 75 @ 3 depPkg 22 [ 0, 1 ] DepSelector inst# 0 - Adding VC for 75 @ 3 depPkg 76 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 75 @ 3 depPkg 34 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 75 @ 3 depPkg 62 [ 0, 4 ] DepSelector inst# 0 - Adding VC for 75 @ 2 depPkg 59 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 75 @ 2 depPkg 47 [ 0, 4 ] DepSelector inst# 0 - Adding VC for 75 @ 2 depPkg 6 [ 0, 5 ] DepSelector inst# 0 - Adding VC for 75 @ 2 depPkg 22 [ 0, 1 ] DepSelector inst# 0 - Adding VC for 75 @ 2 depPkg 76 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 75 @ 2 depPkg 34 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 75 @ 2 depPkg 62 [ 0, 4 ] DepSelector inst# 0 - Adding VC for 75 @ 1 depPkg 59 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 75 @ 1 depPkg 47 [ 0, 4 ] DepSelector inst# 0 - Adding VC for 75 @ 1 depPkg 6 [ 0, 5 ] DepSelector inst# 0 - Adding VC for 75 @ 1 depPkg 22 [ 0, 1 ] DepSelector inst# 0 - Adding VC for 75 @ 1 depPkg 76 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 75 @ 1 depPkg 34 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 75 @ 1 depPkg 62 [ 0, 4 ] DepSelector inst# 0 - Adding VC for 75 @ 0 depPkg 59 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 75 @ 0 depPkg 47 [ 0, 4 ] DepSelector inst# 0 - Adding VC for 75 @ 0 depPkg 6 [ 0, 5 ] DepSelector inst# 0 - Adding VC for 75 @ 0 depPkg 22 [ 0, 1 ] DepSelector inst# 0 - Adding VC for 75 @ 0 depPkg 76 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 75 @ 0 depPkg 34 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 75 @ 0 depPkg 62 [ 0, 4 ] DepSelector inst# 0 - Adding VC for 77 @ 0 depPkg 7 [ 0, 3 ] DepSelector inst# 0 - Adding VC for 77 @ 0 depPkg 38 [ 0, 4 ] DepSelector inst# 0 - Adding package id 78/84: min = -1, max = 4, current version 0 DepSelector inst# 0 - Adding VC for 78 @ 4 depPkg 75 [ 0, 32 ] DepSelector inst# 0 - Adding VC for 78 @ 4 depPkg 22 [ 0, 1 ] DepSelector inst# 0 - Adding VC for 78 @ 3 depPkg 75 [ 0, 32 ] DepSelector inst# 0 - Adding VC for 78 @ 3 depPkg 22 [ 0, 1 ] DepSelector inst# 0 - Adding VC for 78 @ 3 depPkg 61 [ 0, 6 ] DepSelector inst# 0 - Adding VC for 78 @ 2 depPkg 22 [ 0, 1 ] DepSelector inst# 0 - Adding VC for 78 @ 2 depPkg 61 [ 0, 6 ] DepSelector inst# 0 - Adding VC for 78 @ 1 depPkg 22 [ 0, 1 ] DepSelector inst# 0 - Adding VC for 78 @ 0 depPkg 22 [ 0, 1 ] DepSelector inst# 0 - Adding package id 79/84: min = -1, max = 2, current version 0 DepSelector inst# 0 - Adding VC for 79 @ 2 depPkg 22 [ 0, 1 ] DepSelector inst# 0 - Adding VC for 79 @ 2 depPkg 61 [ 0, 6 ] DepSelector inst# 0 - Adding VC for 79 @ 1 depPkg 22 [ 0, 1 ] DepSelector inst# 0 - Adding VC for 79 @ 1 depPkg 61 [ 0, 6 ] DepSelector inst# 0 - Adding VC for 79 @ 0 depPkg 22 [ 0, 1 ] DepSelector inst# 0 - Adding package id 80/84: min = -1, max = 1, current version 0 DepSelector inst# 0 - Adding VC for 80 @ 1 depPkg 71 [ 0, 1 ] DepSelector inst# 0 - Adding VC for 80 @ 1 depPkg 60 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 80 @ 1 depPkg 22 [ 0, 1 ] DepSelector inst# 0 - Adding VC for 80 @ 1 depPkg 34 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 80 @ 1 depPkg 61 [ 0, 6 ] DepSelector inst# 0 - Adding VC for 80 @ 0 depPkg 71 [ 0, 1 ] DepSelector inst# 0 - Adding VC for 80 @ 0 depPkg 60 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 80 @ 0 depPkg 22 [ 0, 1 ] DepSelector inst# 0 - Adding VC for 80 @ 0 depPkg 34 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 80 @ 0 depPkg 61 [ 0, 6 ] DepSelector inst# 0 - Adding package id 81/84: min = -1, max = 0, current version 0 DepSelector inst# 0 - Adding VC for 81 @ 0 depPkg 38 [ 0, 4 ] DepSelector inst# 0 - Adding package id 82/84: min = -1, max = 0, current version 0 DepSelector inst# 0 - Adding VC for 82 @ 0 depPkg 38 [ 0, 4 ] DepSelector inst# 0 - Adding package id 83/84: min = 0, max = 0, current version 0 DepSelector inst# 0 - Marking Package Preferred Latest 0 weight 10 DepSelector inst# 0 - Marking Package Required 0 DepSelector inst# 0 - Adding VC for 83 @ 0 depPkg 0 [ 0, 3 ] DepSelector inst# 0 - Marking Package Preferred Latest 3 weight 10 DepSelector inst# 0 - Marking Package Required 3 DepSelector inst# 0 - Adding VC for 83 @ 0 depPkg 3 [ 0, 2 ] DepSelector inst# 0 - Marking Package Preferred Latest 4 weight 10 DepSelector inst# 0 - Marking Package Required 4 DepSelector inst# 0 - Adding VC for 83 @ 0 depPkg 4 [ 0, 5 ] DepSelector inst# 0 - Marking Package Preferred Latest 9 weight 10 DepSelector inst# 0 - Marking Package Required 9 DepSelector inst# 0 - Adding VC for 83 @ 0 depPkg 9 [ 0, 2 ] DepSelector inst# 0 - Marking Package Preferred Latest 10 weight 10 DepSelector inst# 0 - Marking Package Required 10 DepSelector inst# 0 - Adding VC for 83 @ 0 depPkg 10 [ 0, 0 ] DepSelector inst# 0 - Marking Package Preferred Latest 11 weight 10 DepSelector inst# 0 - Marking Package Required 11 DepSelector inst# 0 - Adding VC for 83 @ 0 depPkg 11 [ 0, 0 ] DepSelector inst# 0 - Marking Package Preferred Latest 12 weight 10 DepSelector inst# 0 - Marking Package Required 12 DepSelector inst# 0 - Adding VC for 83 @ 0 depPkg 12 [ 0, 0 ] DepSelector inst# 0 - Marking Package Preferred Latest 13 weight 10 DepSelector inst# 0 - Marking Package Required 13 DepSelector inst# 0 - Adding VC for 83 @ 0 depPkg 13 [ 0, 1 ] DepSelector inst# 0 - Marking Package Preferred Latest 14 weight 10 DepSelector inst# 0 - Marking Package Required 14 DepSelector inst# 0 - Adding VC for 83 @ 0 depPkg 14 [ 0, 0 ] DepSelector inst# 0 - Marking Package Preferred Latest 15 weight 10 DepSelector inst# 0 - Marking Package Required 15 DepSelector inst# 0 - Adding VC for 83 @ 0 depPkg 15 [ 0, 1 ] DepSelector inst# 0 - Marking Package Preferred Latest 16 weight 10 DepSelector inst# 0 - Marking Package Required 16 DepSelector inst# 0 - Adding VC for 83 @ 0 depPkg 16 [ 0, 0 ] DepSelector inst# 0 - Marking Package Preferred Latest 17 weight 10 DepSelector inst# 0 - Marking Package Required 17 DepSelector inst# 0 - Adding VC for 83 @ 0 depPkg 17 [ 0, 1 ] DepSelector inst# 0 - Marking Package Preferred Latest 18 weight 10 DepSelector inst# 0 - Marking Package Required 18 DepSelector inst# 0 - Adding VC for 83 @ 0 depPkg 18 [ 0, 0 ] DepSelector inst# 0 - Marking Package Preferred Latest 19 weight 10 DepSelector inst# 0 - Marking Package Required 19 DepSelector inst# 0 - Adding VC for 83 @ 0 depPkg 19 [ 0, 0 ] DepSelector inst# 0 - Marking Package Preferred Latest 20 weight 10 DepSelector inst# 0 - Marking Package Required 20 DepSelector inst# 0 - Adding VC for 83 @ 0 depPkg 20 [ 0, 2 ] DepSelector inst# 0 - Marking Package Preferred Latest 21 weight 10 DepSelector inst# 0 - Marking Package Required 21 DepSelector inst# 0 - Adding VC for 83 @ 0 depPkg 21 [ 0, 0 ] DepSelector inst# 0 - Marking Package Preferred Latest 22 weight 10 DepSelector inst# 0 - Marking Package Required 22 DepSelector inst# 0 - Adding VC for 83 @ 0 depPkg 22 [ 0, 1 ] DepSelector inst# 0 - Marking Package Preferred Latest 22 weight 10 DepSelector inst# 0 - Marking Package Required 22 DepSelector inst# 0 - Adding VC for 83 @ 0 depPkg 22 [ 0, 1 ] DepSelector inst# 0 - Marking Package Preferred Latest 23 weight 10 DepSelector inst# 0 - Marking Package Required 23 DepSelector inst# 0 - Adding VC for 83 @ 0 depPkg 23 [ 0, 0 ] DepSelector inst# 0 - Marking Package Preferred Latest 24 weight 10 DepSelector inst# 0 - Marking Package Required 24 DepSelector inst# 0 - Adding VC for 83 @ 0 depPkg 24 [ 0, 2 ] DepSelector inst# 0 - Marking Package Preferred Latest 25 weight 10 DepSelector inst# 0 - Marking Package Required 25 DepSelector inst# 0 - Adding VC for 83 @ 0 depPkg 25 [ 0, 3 ] DepSelector inst# 0 - Marking Package Preferred Latest 26 weight 10 DepSelector inst# 0 - Marking Package Required 26 DepSelector inst# 0 - Adding VC for 83 @ 0 depPkg 26 [ 0, 1 ] DepSelector inst# 0 - Marking Package Preferred Latest 27 weight 10 DepSelector inst# 0 - Marking Package Required 27 DepSelector inst# 0 - Adding VC for 83 @ 0 depPkg 27 [ 0, 3 ] DepSelector inst# 0 - Marking Package Preferred Latest 28 weight 10 DepSelector inst# 0 - Marking Package Required 28 DepSelector inst# 0 - Adding VC for 83 @ 0 depPkg 28 [ 0, 5 ] DepSelector inst# 0 - Marking Package Preferred Latest 29 weight 10 DepSelector inst# 0 - Marking Package Required 29 DepSelector inst# 0 - Adding VC for 83 @ 0 depPkg 29 [ 0, 0 ] DepSelector inst# 0 - Marking Package Preferred Latest 29 weight 10 DepSelector inst# 0 - Marking Package Required 29 DepSelector inst# 0 - Adding VC for 83 @ 0 depPkg 29 [ 0, 0 ] DepSelector inst# 0 - Marking Package Preferred Latest 30 weight 10 DepSelector inst# 0 - Marking Package Required 30 DepSelector inst# 0 - Adding VC for 83 @ 0 depPkg 30 [ 0, 2 ] DepSelector inst# 0 - Marking Package Preferred Latest 32 weight 10 DepSelector inst# 0 - Marking Package Required 32 DepSelector inst# 0 - Adding VC for 83 @ 0 depPkg 32 [ 0, 2 ] DepSelector inst# 0 - Marking Package Preferred Latest 32 weight 10 DepSelector inst# 0 - Marking Package Required 32 DepSelector inst# 0 - Adding VC for 83 @ 0 depPkg 32 [ 0, 2 ] DepSelector inst# 0 - Marking Package Preferred Latest 32 weight 10 DepSelector inst# 0 - Marking Package Required 32 DepSelector inst# 0 - Adding VC for 83 @ 0 depPkg 32 [ 0, 2 ] DepSelector inst# 0 - Marking Package Preferred Latest 32 weight 10 DepSelector inst# 0 - Marking Package Required 32 DepSelector inst# 0 - Adding VC for 83 @ 0 depPkg 32 [ 0, 2 ] DepSelector inst# 0 - Marking Package Preferred Latest 32 weight 10 DepSelector inst# 0 - Marking Package Required 32 DepSelector inst# 0 - Adding VC for 83 @ 0 depPkg 32 [ 0, 2 ] DepSelector inst# 0 - Marking Package Preferred Latest 32 weight 10 DepSelector inst# 0 - Marking Package Required 32 DepSelector inst# 0 - Adding VC for 83 @ 0 depPkg 32 [ 0, 2 ] DepSelector inst# 0 - Marking Package Preferred Latest 32 weight 10 DepSelector inst# 0 - Marking Package Required 32 DepSelector inst# 0 - Adding VC for 83 @ 0 depPkg 32 [ 0, 2 ] DepSelector inst# 0 - Marking Package Preferred Latest 32 weight 10 DepSelector inst# 0 - Marking Package Required 32 DepSelector inst# 0 - Adding VC for 83 @ 0 depPkg 32 [ 0, 2 ] DepSelector inst# 0 - Marking Package Preferred Latest 32 weight 10 DepSelector inst# 0 - Marking Package Required 32 DepSelector inst# 0 - Adding VC for 83 @ 0 depPkg 32 [ 0, 2 ] DepSelector inst# 0 - Marking Package Preferred Latest 32 weight 10 DepSelector inst# 0 - Marking Package Required 32 DepSelector inst# 0 - Adding VC for 83 @ 0 depPkg 32 [ 0, 2 ] DepSelector inst# 0 - Marking Package Preferred Latest 32 weight 10 DepSelector inst# 0 - Marking Package Required 32 DepSelector inst# 0 - Adding VC for 83 @ 0 depPkg 32 [ 0, 2 ] DepSelector inst# 0 - Marking Package Preferred Latest 32 weight 10 DepSelector inst# 0 - Marking Package Required 32 DepSelector inst# 0 - Adding VC for 83 @ 0 depPkg 32 [ 0, 2 ] DepSelector inst# 0 - Marking Package Preferred Latest 32 weight 10 DepSelector inst# 0 - Marking Package Required 32 DepSelector inst# 0 - Adding VC for 83 @ 0 depPkg 32 [ 0, 2 ] DepSelector inst# 0 - Marking Package Preferred Latest 32 weight 10 DepSelector inst# 0 - Marking Package Required 32 DepSelector inst# 0 - Adding VC for 83 @ 0 depPkg 32 [ 0, 2 ] DepSelector inst# 0 - Marking Package Preferred Latest 33 weight 10 DepSelector inst# 0 - Marking Package Required 33 DepSelector inst# 0 - Adding VC for 83 @ 0 depPkg 33 [ 0, 0 ] DepSelector inst# 0 - Marking Package Preferred Latest 33 weight 10 DepSelector inst# 0 - Marking Package Required 33 DepSelector inst# 0 - Adding VC for 83 @ 0 depPkg 33 [ 0, 0 ] DepSelector inst# 0 - Marking Package Preferred Latest 35 weight 10 DepSelector inst# 0 - Marking Package Required 35 DepSelector inst# 0 - Adding VC for 83 @ 0 depPkg 35 [ 0, 24 ] DepSelector inst# 0 - Marking Package Preferred Latest 39 weight 10 DepSelector inst# 0 - Marking Package Required 39 DepSelector inst# 0 - Adding VC for 83 @ 0 depPkg 39 [ 0, 3 ] DepSelector inst# 0 - Marking Package Preferred Latest 40 weight 10 DepSelector inst# 0 - Marking Package Required 40 DepSelector inst# 0 - Adding VC for 83 @ 0 depPkg 40 [ 0, 2 ] DepSelector inst# 0 - Marking Package Preferred Latest 41 weight 10 DepSelector inst# 0 - Marking Package Required 41 DepSelector inst# 0 - Adding VC for 83 @ 0 depPkg 41 [ 0, 2 ] DepSelector inst# 0 - Marking Package Preferred Latest 41 weight 10 DepSelector inst# 0 - Marking Package Required 41 DepSelector inst# 0 - Adding VC for 83 @ 0 depPkg 41 [ 0, 2 ] DepSelector inst# 0 - Marking Package Preferred Latest 42 weight 10 DepSelector inst# 0 - Marking Package Required 42 DepSelector inst# 0 - Adding VC for 83 @ 0 depPkg 42 [ 0, 1 ] DepSelector inst# 0 - Marking Package Preferred Latest 43 weight 10 DepSelector inst# 0 - Marking Package Required 43 DepSelector inst# 0 - Adding VC for 83 @ 0 depPkg 43 [ 0, 7 ] DepSelector inst# 0 - Marking Package Preferred Latest 44 weight 10 DepSelector inst# 0 - Marking Package Required 44 DepSelector inst# 0 - Adding VC for 83 @ 0 depPkg 44 [ 0, 1 ] DepSelector inst# 0 - Marking Package Preferred Latest 45 weight 10 DepSelector inst# 0 - Marking Package Required 45 DepSelector inst# 0 - Adding VC for 83 @ 0 depPkg 45 [ 0, 1 ] DepSelector inst# 0 - Marking Package Preferred Latest 47 weight 10 DepSelector inst# 0 - Marking Package Required 47 DepSelector inst# 0 - Adding VC for 83 @ 0 depPkg 47 [ 0, 4 ] DepSelector inst# 0 - Marking Package Preferred Latest 53 weight 10 DepSelector inst# 0 - Marking Package Required 53 DepSelector inst# 0 - Adding VC for 83 @ 0 depPkg 53 [ 0, 1 ] DepSelector inst# 0 - Marking Package Preferred Latest 54 weight 10 DepSelector inst# 0 - Marking Package Required 54 DepSelector inst# 0 - Adding VC for 83 @ 0 depPkg 54 [ 0, 0 ] DepSelector inst# 0 - Marking Package Preferred Latest 54 weight 10 DepSelector inst# 0 - Marking Package Required 54 DepSelector inst# 0 - Adding VC for 83 @ 0 depPkg 54 [ 0, 0 ] DepSelector inst# 0 - Marking Package Preferred Latest 54 weight 10 DepSelector inst# 0 - Marking Package Required 54 DepSelector inst# 0 - Adding VC for 83 @ 0 depPkg 54 [ 0, 0 ] DepSelector inst# 0 - Marking Package Preferred Latest 54 weight 10 DepSelector inst# 0 - Marking Package Required 54 DepSelector inst# 0 - Adding VC for 83 @ 0 depPkg 54 [ 0, 0 ] DepSelector inst# 0 - Marking Package Preferred Latest 55 weight 10 DepSelector inst# 0 - Marking Package Required 55 DepSelector inst# 0 - Adding VC for 83 @ 0 depPkg 55 [ 0, 4 ] DepSelector inst# 0 - Marking Package Preferred Latest 56 weight 10 DepSelector inst# 0 - Marking Package Required 56 DepSelector inst# 0 - Adding VC for 83 @ 0 depPkg 56 [ 0, 3 ] DepSelector inst# 0 - Marking Package Preferred Latest 57 weight 10 DepSelector inst# 0 - Marking Package Required 57 DepSelector inst# 0 - Adding VC for 83 @ 0 depPkg 57 [ 0, 5 ] DepSelector inst# 0 - Marking Package Preferred Latest 57 weight 10 DepSelector inst# 0 - Marking Package Required 57 DepSelector inst# 0 - Adding VC for 83 @ 0 depPkg 57 [ 0, 5 ] DepSelector inst# 0 - Marking Package Preferred Latest 67 weight 10 DepSelector inst# 0 - Marking Package Required 67 DepSelector inst# 0 - Adding VC for 83 @ 0 depPkg 67 [ 0, 7 ] DepSelector inst# 0 - Marking Package Preferred Latest 68 weight 10 DepSelector inst# 0 - Marking Package Required 68 DepSelector inst# 0 - Adding VC for 83 @ 0 depPkg 68 [ 0, 1 ] DepSelector inst# 0 - Marking Package Preferred Latest 69 weight 10 DepSelector inst# 0 - Marking Package Required 69 DepSelector inst# 0 - Adding VC for 83 @ 0 depPkg 69 [ 0, 0 ] DepSelector inst# 0 - Marking Package Preferred Latest 69 weight 10 DepSelector inst# 0 - Marking Package Required 69 DepSelector inst# 0 - Adding VC for 83 @ 0 depPkg 69 [ 0, 0 ] DepSelector inst# 0 - Marking Package Preferred Latest 70 weight 10 DepSelector inst# 0 - Marking Package Required 70 DepSelector inst# 0 - Adding VC for 83 @ 0 depPkg 70 [ 0, 1 ] DepSelector inst# 0 - Marking Package Preferred Latest 72 weight 10 DepSelector inst# 0 - Marking Package Required 72 DepSelector inst# 0 - Adding VC for 83 @ 0 depPkg 72 [ 0, 0 ] DepSelector inst# 0 - Marking Package Preferred Latest 73 weight 10 DepSelector inst# 0 - Marking Package Required 73 DepSelector inst# 0 - Adding VC for 83 @ 0 depPkg 73 [ 0, 11 ] DepSelector inst# 0 - Marking Package Preferred Latest 74 weight 10 DepSelector inst# 0 - Marking Package Required 74 DepSelector inst# 0 - Adding VC for 83 @ 0 depPkg 74 [ 0, 7 ] DepSelector inst# 0 - Marking Package Preferred Latest 78 weight 10 DepSelector inst# 0 - Marking Package Required 78 DepSelector inst# 0 - Adding VC for 83 @ 0 depPkg 78 [ 0, 4 ] DepSelector inst# 0 - Marking Package Preferred Latest 79 weight 10 DepSelector inst# 0 - Marking Package Required 79 DepSelector inst# 0 - Adding VC for 83 @ 0 depPkg 79 [ 0, 2 ] DepSelector inst# 0 - Marking Package Preferred Latest 80 weight 10 DepSelector inst# 0 - Marking Package Required 80 DepSelector inst# 0 - Adding VC for 83 @ 0 depPkg 80 [ 0, 1 ] DepSelector inst# 0 - Marking Package Preferred Latest 75 weight 10 DepSelector inst# 0 - Marking Package Required 75 DepSelector inst# 0 - Adding VC for 83 @ 0 depPkg 75 [ 0, 32 ] DepSelector inst# 0 - Marking Package Preferred Latest 75 weight 10 DepSelector inst# 0 - Marking Package Required 75 DepSelector inst# 0 - Adding VC for 83 @ 0 depPkg 75 [ 0, 32 ] DepSelector inst# 0 - Marking Package Preferred Latest 81 weight 10 DepSelector inst# 0 - Marking Package Required 81 DepSelector inst# 0 - Adding VC for 83 @ 0 depPkg 81 [ 0, 0 ] DepSelector inst# 0 - Marking Package Preferred Latest 81 weight 10 DepSelector inst# 0 - Marking Package Required 81 DepSelector inst# 0 - Adding VC for 83 @ 0 depPkg 81 [ 0, 0 ] DepSelector inst# 0 - Marking Package Preferred Latest 82 weight 10 DepSelector inst# 0 - Marking Package Required 82 DepSelector inst# 0 - Adding VC for 83 @ 0 depPkg 82 [ 0, 0 ] DepSelector inst# 0 - Marking Package Preferred Latest 75 weight 10 DepSelector inst# 0 - Marking Package Required 75 DepSelector inst# 0 - Adding VC for 83 @ 0 depPkg 75 [ 0, 32 ] dep-selector-1.0.3/example/ea2d264b-003e-4611-94ed-14efc7732083000066400000000000000000000117761232552612700221700ustar00rootroot00000000000000Creating VersionProblem inst# 4477 with 20 packages, 1 stats, 1 debug DepSelector inst# 4477 - Adding package id 0/20: min = -1, max = 1, current version 0 DepSelector inst# 4477 - Adding package id 1/20: min = -1, max = 0, current version 0 DepSelector inst# 4477 - Adding package id 2/20: min = -1, max = 0, current version 0 DepSelector inst# 4477 - Adding package id 3/20: min = -1, max = 0, current version 0 DepSelector inst# 4477 - Adding package id 4/20: min = -1, max = 0, current version 0 DepSelector inst# 4477 - Adding package id 5/20: min = -1, max = 0, current version 0 DepSelector inst# 4477 - Adding package id 6/20: min = -1, max = 0, current version 0 DepSelector inst# 4477 - Adding package id 7/20: min = -1, max = 0, current version 0 DepSelector inst# 4477 - Adding VC for 6 @ 0 depPkg 7 [ 0, 0 ] DepSelector inst# 4477 - Adding package id 8/20: min = -1, max = 2, current version 0 DepSelector inst# 4477 - Adding package id 9/20: min = -1, max = 1, current version 0 DepSelector inst# 4477 - Adding package id 10/20: min = -1, max = 1, current version 0 DepSelector inst# 4477 - Adding package id 11/20: min = -1, max = 0, current version 0 DepSelector inst# 4477 - Adding VC for 10 @ 1 depPkg 11 [ 0, 0 ] DepSelector inst# 4477 - Adding package id 12/20: min = -1, max = 0, current version 0 DepSelector inst# 4477 - Adding VC for 10 @ 1 depPkg 12 [ 0, 0 ] DepSelector inst# 4477 - Adding VC for 10 @ 0 depPkg 11 [ 0, 0 ] DepSelector inst# 4477 - Adding package id 13/20: min = -1, max = 1, current version 0 DepSelector inst# 4477 - Adding package id 14/20: min = -1, max = 0, current version 0 DepSelector inst# 4477 - Adding package id 15/20: min = -1, max = 0, current version 0 DepSelector inst# 4477 - Adding package id 16/20: min = -1, max = 0, current version 0 DepSelector inst# 4477 - Adding package id 17/20: min = -1, max = 0, current version 0 DepSelector inst# 4477 - Adding VC for 17 @ 0 depPkg 1 [ 0, 0 ] DepSelector inst# 4477 - Adding package id 18/20: min = -1, max = 1, current version 0 DepSelector inst# 4477 - Adding package id 19/20: min = 0, max = 0, current version 0 DepSelector inst# 4477 - Marking Package Preferred Latest 0 weight 10 DepSelector inst# 4477 - Marking Package Required 0 DepSelector inst# 4477 - Adding VC for 19 @ 0 depPkg 0 [ 0, 1 ] DepSelector inst# 4477 - Marking Package Preferred Latest 1 weight 10 DepSelector inst# 4477 - Marking Package Required 1 DepSelector inst# 4477 - Adding VC for 19 @ 0 depPkg 1 [ 0, 0 ] DepSelector inst# 4477 - Marking Package Preferred Latest 2 weight 10 DepSelector inst# 4477 - Marking Package Required 2 DepSelector inst# 4477 - Adding VC for 19 @ 0 depPkg 2 [ 0, 0 ] DepSelector inst# 4477 - Marking Package Preferred Latest 3 weight 10 DepSelector inst# 4477 - Marking Package Required 3 DepSelector inst# 4477 - Adding VC for 19 @ 0 depPkg 3 [ 0, 0 ] DepSelector inst# 4477 - Marking Package Preferred Latest 4 weight 10 DepSelector inst# 4477 - Marking Package Required 4 DepSelector inst# 4477 - Adding VC for 19 @ 0 depPkg 4 [ 0, 0 ] DepSelector inst# 4477 - Marking Package Preferred Latest 5 weight 10 DepSelector inst# 4477 - Marking Package Required 5 DepSelector inst# 4477 - Adding VC for 19 @ 0 depPkg 5 [ 0, 0 ] DepSelector inst# 4477 - Marking Package Preferred Latest 6 weight 10 DepSelector inst# 4477 - Marking Package Required 6 DepSelector inst# 4477 - Adding VC for 19 @ 0 depPkg 6 [ 0, 0 ] DepSelector inst# 4477 - Marking Package Preferred Latest 8 weight 10 DepSelector inst# 4477 - Marking Package Required 8 DepSelector inst# 4477 - Adding VC for 19 @ 0 depPkg 8 [ 0, 2 ] DepSelector inst# 4477 - Marking Package Preferred Latest 9 weight 10 DepSelector inst# 4477 - Marking Package Required 9 DepSelector inst# 4477 - Adding VC for 19 @ 0 depPkg 9 [ 0, 1 ] DepSelector inst# 4477 - Marking Package Preferred Latest 10 weight 10 DepSelector inst# 4477 - Marking Package Required 10 DepSelector inst# 4477 - Adding VC for 19 @ 0 depPkg 10 [ 0, 1 ] DepSelector inst# 4477 - Marking Package Preferred Latest 13 weight 10 DepSelector inst# 4477 - Marking Package Required 13 DepSelector inst# 4477 - Adding VC for 19 @ 0 depPkg 13 [ 0, 1 ] DepSelector inst# 4477 - Marking Package Preferred Latest 14 weight 10 DepSelector inst# 4477 - Marking Package Required 14 DepSelector inst# 4477 - Adding VC for 19 @ 0 depPkg 14 [ 0, 0 ] DepSelector inst# 4477 - Marking Package Preferred Latest 15 weight 10 DepSelector inst# 4477 - Marking Package Required 15 DepSelector inst# 4477 - Adding VC for 19 @ 0 depPkg 15 [ 0, 0 ] DepSelector inst# 4477 - Marking Package Preferred Latest 16 weight 10 DepSelector inst# 4477 - Marking Package Required 16 DepSelector inst# 4477 - Adding VC for 19 @ 0 depPkg 16 [ 0, 0 ] DepSelector inst# 4477 - Marking Package Preferred Latest 17 weight 10 DepSelector inst# 4477 - Marking Package Required 17 DepSelector inst# 4477 - Adding VC for 19 @ 0 depPkg 17 [ 0, 0 ] DepSelector inst# 4477 - Marking Package Preferred Latest 18 weight 10 DepSelector inst# 4477 - Marking Package Required 18 DepSelector inst# 4477 - Adding VC for 19 @ 0 depPkg 18 [ 0, 0 ] dep-selector-1.0.3/example/example_1.txt000066400000000000000000000146661232552612700201720ustar00rootroot00000000000000 Creating VersionProblem inst# 0 with 18 packages, 1 stats, 1 debug DepSelector inst# 0 - Adding package id 0/18: min = -1, max = 9, current version 0 DepSelector inst# 0 - Adding package id 1/18: min = -1, max = 0, current version 0 DepSelector inst# 0 - Adding package id 2/18: min = -1, max = 1, current version 0 DepSelector inst# 0 - Adding package id 3/18: min = -1, max = 6, current version 0 DepSelector inst# 0 - Adding package id 4/18: min = -1, max = 0, current version 0 DepSelector inst# 0 - Adding VC for 3 @ 0 depPkg 4 [ 0, 0 ] DepSelector inst# 0 - Adding package id 5/18: min = -1, max = 1, current version 0 DepSelector inst# 0 - Adding package id 6/18: min = -1, max = 0, current version 0 DepSelector inst# 0 - Adding package id 7/18: min = -1, max = 0, current version 0 DepSelector inst# 0 - Adding package id 8/18: min = -1, max = 3, current version 0 DepSelector inst# 0 - Adding package id 9/18: min = -1, max = 1, current version 0 DepSelector inst# 0 - Adding package id 10/18: min = -1, max = 0, current version 0 DepSelector inst# 0 - Adding VC for 9 @ 1 depPkg 10 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 9 @ 1 depPkg 1 [ 0, 0 ] DepSelector inst# 0 - Adding package id 11/18: min = -1, max = 0, current version 0 DepSelector inst# 0 - Adding VC for 9 @ 1 depPkg 11 [ 0, 0 ] DepSelector inst# 0 - Adding package id 12/18: min = -1, max = 0, current version 0 DepSelector inst# 0 - Adding VC for 9 @ 1 depPkg 12 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 9 @ 0 depPkg 10 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 9 @ 0 depPkg 1 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 9 @ 0 depPkg 11 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 9 @ 0 depPkg 12 [ 0, 0 ] DepSelector inst# 0 - Adding package id 13/18: min = -1, max = -1, current version 0 DepSelector inst# 0 - Adding VC for 9 @ 0 depPkg 13 [ -2, -2 ] DepSelector inst# 0 - Marking Package Suspicious 13 DepSelector inst# 0 - Adding package id 14/18: min = -1, max = 0, current version 0 DepSelector inst# 0 - Adding package id 15/18: min = -1, max = 16, current version 0 DepSelector inst# 0 - Adding package id 16/18: min = -1, max = 8, current version 0 DepSelector inst# 0 - Adding package id 17/18: min = 0, max = 0, current version 0 DepSelector inst# 0 - Marking Package Preferred Latest 0 weight 10 DepSelector inst# 0 - Marking Package Required 0 DepSelector inst# 0 - Adding VC for 17 @ 0 depPkg 0 [ 0, 9 ] DepSelector inst# 0 - Marking Package Preferred Latest 0 weight 10 DepSelector inst# 0 - Marking Package Required 0 DepSelector inst# 0 - Adding VC for 17 @ 0 depPkg 0 [ 0, 9 ] DepSelector inst# 0 - Marking Package Preferred Latest 1 weight 10 DepSelector inst# 0 - Marking Package Required 1 DepSelector inst# 0 - Adding VC for 17 @ 0 depPkg 1 [ 0, 0 ] DepSelector inst# 0 - Marking Package Preferred Latest 2 weight 10 DepSelector inst# 0 - Marking Package Required 2 DepSelector inst# 0 - Adding VC for 17 @ 0 depPkg 2 [ 0, 1 ] DepSelector inst# 0 - Marking Package Preferred Latest 3 weight 10 DepSelector inst# 0 - Marking Package Required 3 DepSelector inst# 0 - Adding VC for 17 @ 0 depPkg 3 [ 0, 6 ] DepSelector inst# 0 - Marking Package Preferred Latest 5 weight 10 DepSelector inst# 0 - Marking Package Required 5 DepSelector inst# 0 - Adding VC for 17 @ 0 depPkg 5 [ 0, 1 ] DepSelector inst# 0 - Marking Package Preferred Latest 6 weight 10 DepSelector inst# 0 - Marking Package Required 6 DepSelector inst# 0 - Adding VC for 17 @ 0 depPkg 6 [ 0, 0 ] DepSelector inst# 0 - Marking Package Preferred Latest 7 weight 10 DepSelector inst# 0 - Marking Package Required 7 DepSelector inst# 0 - Adding VC for 17 @ 0 depPkg 7 [ 0, 0 ] DepSelector inst# 0 - Marking Package Preferred Latest 8 weight 10 DepSelector inst# 0 - Marking Package Required 8 DepSelector inst# 0 - Adding VC for 17 @ 0 depPkg 8 [ 0, 3 ] DepSelector inst# 0 - Marking Package Preferred Latest 9 weight 10 DepSelector inst# 0 - Marking Package Required 9 DepSelector inst# 0 - Adding VC for 17 @ 0 depPkg 9 [ 0, 1 ] DepSelector inst# 0 - Marking Package Preferred Latest 9 weight 10 DepSelector inst# 0 - Marking Package Required 9 DepSelector inst# 0 - Adding VC for 17 @ 0 depPkg 9 [ 0, 1 ] DepSelector inst# 0 - Marking Package Preferred Latest 14 weight 10 DepSelector inst# 0 - Marking Package Required 14 DepSelector inst# 0 - Adding VC for 17 @ 0 depPkg 14 [ 0, 0 ] DepSelector inst# 0 - Marking Package Preferred Latest 15 weight 10 DepSelector inst# 0 - Marking Package Required 15 DepSelector inst# 0 - Adding VC for 17 @ 0 depPkg 15 [ 0, 16 ] DepSelector inst# 0 - Marking Package Preferred Latest 16 weight 10 DepSelector inst# 0 - Marking Package Required 16 DepSelector inst# 0 - Adding VC for 17 @ 0 depPkg 16 [ 0, 8 ] Finalization Started disabled_required_weights: {1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0} total_required_disabled: [0..12] disabled_induced_weights: {0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1} total_induced_disabled: [0..5] disabled_suspicious_weights: {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0} total_suspicious_disabled: [0..1] total_disabled: [0..18] preferred_at_latest_weights_args: {-10, -10, -10, -10, 0, -10, -10, -10, -10, -10, 0, 0, 0, 0, -10, -10, -10, 0} total_preferred_at_latest: [-120..0] not_preferred_at_latest_weights_args: {0, 0, 0, 0, -1, 0, 0, 0, 0, 0, -1, -1, -1, -1, 0, 0, 0, -1} total_not_preferred_at_latest: [-6..-2] Adding branching (BEST) Finalization Done Before solve Version problem dump: 18/18 packages used/allocated Disabled Variables: {[0..1], [0..1], [0..1], [0..1], [0..1], [0..1], [0..1], [0..1], [0..1], [0..1], [0..1], [0..1], [0..1], [0..1], [0..1], [0..1], [0..1], [0..1]} Total Disabled variables (required): [0..12] Total Disabled variables: (induced): [0..5] Total Disabled variables: (suspicious): [0..1] Total Disabled variables: [0..18] at_latest: {[0..1], [0..1], [0..1], [0..1], [0..1], [0..1], [0..1], [0..1], [0..1], [0..1], [0..1], [0..1], [0..1], 1, [0..1], [0..1], [0..1], 1} total_preferred_at_latest: [-120..0] total_not_preferred_at_latest: [-6..-2] #011PackageId: 0 Sltn: [-1..9] disabled: [0..1] at latest: [0..1] #011PackageId: 1 Sltn: [-1..0] disabled: [0..1] at latest: [0..1] #011PackageId: 2 Sltn: [-1..1] disabled: [0..1] at latest: [0..1] Takes about .5 seconds on an ec2 m1.small dep-selector-1.0.3/example/example_2.txt000066400000000000000000000154641232552612700201700ustar00rootroot00000000000000Creating VersionProblem inst# 0 with 27 packages, 1 stats, 1 debug DepSelector inst# 0 - Adding package id 0/27: min = -1, max = 0, current version 0 DepSelector inst# 0 - Adding package id 1/27: min = -1, max = 0, current version 0 DepSelector inst# 0 - Adding VC for 0 @ 0 depPkg 1 [ 0, 0 ] DepSelector inst# 0 - Adding package id 2/27: min = -1, max = 2, current version 0 DepSelector inst# 0 - Adding VC for 0 @ 0 depPkg 2 [ 0, 2 ] DepSelector inst# 0 - Adding package id 3/27: min = -1, max = 4, current version 0 DepSelector inst# 0 - Adding VC for 0 @ 0 depPkg 3 [ 0, 4 ] DepSelector inst# 0 - Adding package id 4/27: min = -1, max = 0, current version 0 DepSelector inst# 0 - Adding VC for 0 @ 0 depPkg 4 [ 0, 0 ] DepSelector inst# 0 - Adding package id 5/27: min = -1, max = 0, current version 0 DepSelector inst# 0 - Adding VC for 0 @ 0 depPkg 5 [ 0, 0 ] DepSelector inst# 0 - Adding package id 6/27: min = -1, max = 0, current version 0 DepSelector inst# 0 - Adding VC for 0 @ 0 depPkg 6 [ 0, 0 ] DepSelector inst# 0 - Adding package id 7/27: min = -1, max = 1, current version 0 DepSelector inst# 0 - Adding VC for 0 @ 0 depPkg 7 [ 0, 1 ] DepSelector inst# 0 - Adding package id 8/27: min = -1, max = 0, current version 0 DepSelector inst# 0 - Adding VC for 3 @ 4 depPkg 8 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 3 @ 4 depPkg 6 [ 0, 0 ] DepSelector inst# 0 - Adding package id 9/27: min = -1, max = 0, current version 0 DepSelector inst# 0 - Adding VC for 3 @ 4 depPkg 9 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 3 @ 3 depPkg 8 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 3 @ 3 depPkg 6 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 3 @ 3 depPkg 9 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 3 @ 2 depPkg 8 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 3 @ 2 depPkg 6 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 3 @ 2 depPkg 9 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 3 @ 1 depPkg 8 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 3 @ 1 depPkg 9 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 3 @ 0 depPkg 8 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 3 @ 0 depPkg 9 [ 0, 0 ] DepSelector inst# 0 - Adding package id 10/27: min = -1, max = 0, current version 0 DepSelector inst# 0 - Adding VC for 6 @ 0 depPkg 10 [ 0, 0 ] DepSelector inst# 0 - Adding package id 11/27: min = -1, max = 2, current version 0 DepSelector inst# 0 - Adding VC for 6 @ 0 depPkg 11 [ 0, 2 ] DepSelector inst# 0 - Adding VC for 6 @ 0 depPkg 8 [ 0, 0 ] DepSelector inst# 0 - Adding package id 12/27: min = -1, max = 1, current version 0 DepSelector inst# 0 - Adding VC for 6 @ 0 depPkg 12 [ 0, 1 ] DepSelector inst# 0 - Adding package id 13/27: min = -1, max = 0, current version 0 DepSelector inst# 0 - Adding VC for 6 @ 0 depPkg 13 [ 0, 0 ] DepSelector inst# 0 - Adding package id 14/27: min = -1, max = 0, current version 0 DepSelector inst# 0 - Adding VC for 6 @ 0 depPkg 14 [ 0, 0 ] DepSelector inst# 0 - Adding package id 15/27: min = -1, max = 0, current version 0 DepSelector inst# 0 - Adding VC for 6 @ 0 depPkg 15 [ 0, 0 ] DepSelector inst# 0 - Adding package id 16/27: min = -1, max = 0, current version 0 DepSelector inst# 0 - Adding VC for 6 @ 0 depPkg 16 [ 0, 0 ] DepSelector inst# 0 - Adding package id 17/27: min = -1, max = 0, current version 0 DepSelector inst# 0 - Adding VC for 6 @ 0 depPkg 17 [ 0, 0 ] DepSelector inst# 0 - Adding package id 18/27: min = -1, max = 0, current version 0 DepSelector inst# 0 - Adding VC for 6 @ 0 depPkg 18 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 6 @ 0 depPkg 9 [ 0, 0 ] DepSelector inst# 0 - Adding package id 19/27: min = -1, max = 0, current version 0 DepSelector inst# 0 - Adding VC for 6 @ 0 depPkg 19 [ 0, 0 ] DepSelector inst# 0 - Adding package id 20/27: min = -1, max = 0, current version 0 DepSelector inst# 0 - Adding VC for 12 @ 1 depPkg 20 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 12 @ 1 depPkg 9 [ 0, 0 ] DepSelector inst# 0 - Adding package id 21/27: min = -1, max = 0, current version 0 DepSelector inst# 0 - Adding VC for 12 @ 1 depPkg 21 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 12 @ 0 depPkg 20 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 12 @ 0 depPkg 9 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 12 @ 0 depPkg 21 [ 0, 0 ] DepSelector inst# 0 - Adding package id 22/27: min = -1, max = 0, current version 0 DepSelector inst# 0 - Adding VC for 20 @ 0 depPkg 22 [ 0, 0 ] DepSelector inst# 0 - Adding package id 23/27: min = -1, max = 0, current version 0 DepSelector inst# 0 - Adding VC for 20 @ 0 depPkg 23 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 20 @ 0 depPkg 9 [ 0, 0 ] DepSelector inst# 0 - Adding package id 24/27: min = -1, max = 0, current version 0 DepSelector inst# 0 - Adding VC for 23 @ 0 depPkg 24 [ 0, 0 ] DepSelector inst# 0 - Adding package id 25/27: min = -1, max = 0, current version 0 DepSelector inst# 0 - Adding VC for 14 @ 0 depPkg 25 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 15 @ 0 depPkg 8 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 16 @ 0 depPkg 8 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 5 @ 0 depPkg 8 [ 0, 0 ] DepSelector inst# 0 - Adding package id 26/27: min = 0, max = 0, current version 0 DepSelector inst# 0 - Marking Package Preferred Latest 0 weight 10 DepSelector inst# 0 - Marking Package Required 0 DepSelector inst# 0 - Adding VC for 26 @ 0 depPkg 0 [ 0, 0 ] DepSelector inst# 0 - Marking Package Preferred Latest 0 weight 10 DepSelector inst# 0 - Marking Package Required 0 DepSelector inst# 0 - Adding VC for 26 @ 0 depPkg 0 [ 0, 0 ] Finalization Started disabled_required_weights: {1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} total_required_disabled: [0..1] disabled_induced_weights: {0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1} total_induced_disabled: [0..26] disabled_suspicious_weights: {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} total_suspicious_disabled: 0 total_disabled: [0..27] preferred_at_latest_weights_args: {-10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} total_preferred_at_latest: [-10..0] not_preferred_at_latest_weights_args: {0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1} total_not_preferred_at_latest: [-26..-1] Adding branching (BEST) Finalization Done Before solve Version problem dump: 27/27 packages used/allocated Disabled Variables: {[0..1], [0..1], [0..1], [0..1], [0..1], [0..1], [0..1], [0..1], [0..1], [0..1], [0..1], [0..1], [0..1], [0..1], [0..1], [0..1], [0..1], [0..1], [0..1], [0..1], [0..1], [0..1], [0..1], [0..1], [0..1], [0..1], [0..1]} Total Disabled variables (required): [0..1] Total Disabled variables: (induced): [0..26] Takes about .5 seconds on an ec2 m1.small dep-selector-1.0.3/example/example_3.txt000066400000000000000000000147061232552612700201670ustar00rootroot00000000000000Creating VersionProblem inst# 0 with 27 packages, 1 stats, 1 debug DepSelector inst# 0 - Adding package id 0/27: min = -1, max = 0, current version 0 DepSelector inst# 0 - Adding package id 1/27: min = -1, max = 0, current version 0 DepSelector inst# 0 - Adding VC for 0 @ 0 depPkg 1 [ 0, 0 ] DepSelector inst# 0 - Adding package id 2/27: min = -1, max = 0, current version 0 DepSelector inst# 0 - Adding package id 3/27: min = -1, max = 0, current version 0 DepSelector inst# 0 - Adding package id 4/27: min = -1, max = 0, current version 0 DepSelector inst# 0 - Adding VC for 3 @ 0 depPkg 4 [ 0, 0 ] DepSelector inst# 0 - Adding package id 5/27: min = -1, max = 0, current version 0 DepSelector inst# 0 - Adding VC for 3 @ 0 depPkg 5 [ 0, 0 ] DepSelector inst# 0 - Adding VC for 3 @ 0 depPkg 2 [ 0, 0 ] DepSelector inst# 0 - Adding package id 6/27: min = -1, max = 0, current version 0 DepSelector inst# 0 - Adding package id 7/27: min = -1, max = 0, current version 0 DepSelector inst# 0 - Adding package id 8/27: min = -1, max = 1, current version 0 DepSelector inst# 0 - Adding package id 9/27: min = -1, max = 0, current version 0 DepSelector inst# 0 - Adding VC for 9 @ 0 depPkg 1 [ 0, 0 ] DepSelector inst# 0 - Adding package id 10/27: min = -1, max = 1, current version 0 DepSelector inst# 0 - Adding package id 11/27: min = -1, max = 0, current version 0 DepSelector inst# 0 - Adding package id 12/27: min = -1, max = 0, current version 0 DepSelector inst# 0 - Adding package id 13/27: min = -1, max = 0, current version 0 DepSelector inst# 0 - Adding package id 14/27: min = -1, max = 0, current version 0 DepSelector inst# 0 - Adding package id 15/27: min = -1, max = 1, current version 0 DepSelector inst# 0 - Adding package id 16/27: min = -1, max = 1, current version 0 DepSelector inst# 0 - Adding package id 17/27: min = -1, max = 0, current version 0 DepSelector inst# 0 - Adding VC for 16 @ 1 depPkg 17 [ 0, 0 ] DepSelector inst# 0 - Adding package id 18/27: min = -1, max = 0, current version 0 DepSelector inst# 0 - Adding VC for 18 @ 0 depPkg 17 [ 0, 0 ] DepSelector inst# 0 - Adding package id 19/27: min = -1, max = 0, current version 0 DepSelector inst# 0 - Adding package id 20/27: min = -1, max = 0, current version 0 DepSelector inst# 0 - Adding VC for 20 @ 0 depPkg 14 [ 0, 0 ] DepSelector inst# 0 - Adding package id 21/27: min = -1, max = 0, current version 0 DepSelector inst# 0 - Adding package id 22/27: min = -1, max = 0, current version 0 DepSelector inst# 0 - Adding package id 23/27: min = -1, max = 0, current version 0 DepSelector inst# 0 - Adding package id 24/27: min = -1, max = 1, current version 0 DepSelector inst# 0 - Adding package id 25/27: min = -1, max = 1, current version 0 DepSelector inst# 0 - Adding VC for 25 @ 1 depPkg 2 [ 0, 0 ] DepSelector inst# 0 - Adding package id 26/27: min = 0, max = 0, current version 0 DepSelector inst# 0 - Marking Package Preferred Latest 0 weight 10 DepSelector inst# 0 - Marking Package Required 0 DepSelector inst# 0 - Adding VC for 26 @ 0 depPkg 0 [ 0, 0 ] DepSelector inst# 0 - Marking Package Preferred Latest 2 weight 10 DepSelector inst# 0 - Marking Package Required 2 DepSelector inst# 0 - Adding VC for 26 @ 0 depPkg 2 [ 0, 0 ] DepSelector inst# 0 - Marking Package Preferred Latest 3 weight 10 DepSelector inst# 0 - Marking Package Required 3 DepSelector inst# 0 - Adding VC for 26 @ 0 depPkg 3 [ 0, 0 ] DepSelector inst# 0 - Marking Package Preferred Latest 3 weight 10 DepSelector inst# 0 - Marking Package Required 3 DepSelector inst# 0 - Adding VC for 26 @ 0 depPkg 3 [ 0, 0 ] DepSelector inst# 0 - Marking Package Preferred Latest 3 weight 10 DepSelector inst# 0 - Marking Package Required 3 DepSelector inst# 0 - Adding VC for 26 @ 0 depPkg 3 [ 0, 0 ] DepSelector inst# 0 - Marking Package Preferred Latest 3 weight 10 DepSelector inst# 0 - Marking Package Required 3 DepSelector inst# 0 - Adding VC for 26 @ 0 depPkg 3 [ 0, 0 ] DepSelector inst# 0 - Marking Package Preferred Latest 3 weight 10 DepSelector inst# 0 - Marking Package Required 3 DepSelector inst# 0 - Adding VC for 26 @ 0 depPkg 3 [ 0, 0 ] DepSelector inst# 0 - Marking Package Preferred Latest 3 weight 10 DepSelector inst# 0 - Marking Package Required 3 DepSelector inst# 0 - Adding VC for 26 @ 0 depPkg 3 [ 0, 0 ] DepSelector inst# 0 - Marking Package Preferred Latest 3 weight 10 DepSelector inst# 0 - Marking Package Required 3 DepSelector inst# 0 - Adding VC for 26 @ 0 depPkg 3 [ 0, 0 ] DepSelector inst# 0 - Marking Package Preferred Latest 6 weight 10 DepSelector inst# 0 - Marking Package Required 6 DepSelector inst# 0 - Adding VC for 26 @ 0 depPkg 6 [ 0, 0 ] DepSelector inst# 0 - Marking Package Preferred Latest 3 weight 10 DepSelector inst# 0 - Marking Package Required 3 DepSelector inst# 0 - Adding VC for 26 @ 0 depPkg 3 [ 0, 0 ] DepSelector inst# 0 - Marking Package Preferred Latest 3 weight 10 DepSelector inst# 0 - Marking Package Required 3 DepSelector inst# 0 - Adding VC for 26 @ 0 depPkg 3 [ 0, 0 ] DepSelector inst# 0 - Marking Package Preferred Latest 2 weight 10 DepSelector inst# 0 - Marking Package Required 2 DepSelector inst# 0 - Adding VC for 26 @ 0 depPkg 2 [ 0, 0 ] DepSelector inst# 0 - Marking Package Preferred Latest 7 weight 10 DepSelector inst# 0 - Marking Package Required 7 DepSelector inst# 0 - Adding VC for 26 @ 0 depPkg 7 [ 0, 0 ] DepSelector inst# 0 - Marking Package Preferred Latest 8 weight 10 DepSelector inst# 0 - Marking Package Required 8 DepSelector inst# 0 - Adding VC for 26 @ 0 depPkg 8 [ 0, 1 ] DepSelector inst# 0 - Marking Package Preferred Latest 9 weight 10 DepSelector inst# 0 - Marking Package Required 9 DepSelector inst# 0 - Adding VC for 26 @ 0 depPkg 9 [ 0, 0 ] DepSelector inst# 0 - Marking Package Preferred Latest 10 weight 10 DepSelector inst# 0 - Marking Package Required 10 DepSelector inst# 0 - Adding VC for 26 @ 0 depPkg 10 [ 0, 1 ] DepSelector inst# 0 - Marking Package Preferred Latest 11 weight 10 DepSelector inst# 0 - Marking Package Required 11 DepSelector inst# 0 - Adding VC for 26 @ 0 depPkg 11 [ 0, 0 ] DepSelector inst# 0 - Marking Package Preferred Latest 2 weight 10 DepSelector inst# 0 - Marking Package Required 2 DepSelector inst# 0 - Adding VC for 26 @ 0 depPkg 2 [ 0, 0 ] DepSelector inst# 0 - Marking Package Preferred Latest 2 weight 10 DepSelector inst# 0 - Marking Package Required 2 DepSelector inst# 0 - Adding VC for 26 @ 0 depPkg 2 [ 0, 0 ] DepSelector inst# 0 - Marking Package Preferred Latest 2 weight 10 DepSelector inst# 0 - Marking Package Required 2 Finalization Started This one takes about 5 secs on an m1.small dep-selector-1.0.3/example/example_usage.rb000066400000000000000000000141551232552612700207130ustar00rootroot00000000000000require 'pp' require 'dep_selector' # This example corresponds to the following dependency graph: # A has versions: 1, 2 # B has versions: 1, 2, 3 # C has versions: 1, 2 # D has versions: 1, 2 # A1 -> B=1 (v1 of package A depends on v1 of package B) # A2 -> B>=2, C=1 (v2 of package A depends on B at v2 or greater and v1 of C) # B3 -> D=1 (v3 of package B depends on v1 of package D) # C2 -> D=2 (v2 of package C depends on v2 of package D) include DepSelector # create dependency graph dep_graph = DependencyGraph.new # package A has versions 1 and 2 a = dep_graph.package('A') a1 = a.add_version(Version.new('1.0.0')) a2 = a.add_version(Version.new('2.0.0')) # package B has versions 1, 2, and 3 b = dep_graph.package('B') b1 = b.add_version(Version.new('1.0.0')) b2 = b.add_version(Version.new('2.0.0')) b3 = b.add_version(Version.new('3.0.0')) # package C only has versions 1 and 2 c = dep_graph.package('C') c1 = c.add_version(Version.new('1.0.0')) c2 = c.add_version(Version.new('2.0.0')) # package D only has versions 1 and 2 d = dep_graph.package('D') d1 = d.add_version(Version.new('1.0.0')) d2 = d.add_version(Version.new('2.0.0')) # package A version 1 has a dependency on package B at exactly 1.0.0 # Note: Though we reference the variable b in the Dependency, packages # do not have to be created before being referenced. # DependencyGraph#package looks up the package based on the name or # auto-vivifies it if it doesn't yet exist, so referring to the # variable b or calling dep_graph.package('B') before or after b is # assigned are all equivalent. a1.dependencies << Dependency.new(b, VersionConstraint.new('= 1.0.0')) a1.dependencies << Dependency.new(d, VersionConstraint.new('= 2.0.0')) # package A version 2 has dependencies on package B >= 2.0.0 and C at exactly 1.0.0 a2.dependencies << Dependency.new(b, VersionConstraint.new('>= 2.0.0')) a2.dependencies << Dependency.new(c, VersionConstraint.new('= 1.0.0')) # package B version 3 has a dependency on package D at exactly 1.0.0 b3.dependencies << Dependency.new(d, VersionConstraint.new('= 1.0.0')) # package C version 2 has a dependency on package D at exactly 2.0.0 c2.dependencies << Dependency.new(d, VersionConstraint.new('= 2.0.0')) # create a Selector from the dependency graph selector = Selector.new(dep_graph) # define the solution constraints and find a solution # simple solution: any version of A as long as B is at exactly 1.0.0 solution_constraints_1 = [ SolutionConstraint.new(dep_graph.package('A')), SolutionConstraint.new(dep_graph.package('B'), VersionConstraint.new('= 1.0.0')) ] pp selector.find_solution(solution_constraints_1) # more complex solution, which uses a range constraint (>=) and # demonstrates the assignment of induced transitive dependencies solution_constraints_2 = [ SolutionConstraint.new(dep_graph.package('A')), SolutionConstraint.new(dep_graph.package('B'), VersionConstraint.new('>= 2.1')) ] pp selector.find_solution(solution_constraints_2) # When the solution constraints are unsatisfiable, a NoSolutionExists # exception is raised. It identifies what the first solution # constraint that makes the system unsatisfiable is. It also # identifies the package(s) (either direct solution constraints or # induced dependencies) whose constraints caused the # unsatisfiability. The exception's message contains the name of one # of the packages, as well as paths through the dependency graph that # result in constraints on the package to hint at places to debug. unsatisfiable_solution_constraints_1 = [ SolutionConstraint.new(dep_graph.package('B'), VersionConstraint.new('= 3.0.0')), SolutionConstraint.new(dep_graph.package('C'), VersionConstraint.new('= 2.0.0')) ] # Note that package D is identified as the most constrained package # and the paths from from solution constraints to constraints on D are # returned in the message begin selector.find_solution(unsatisfiable_solution_constraints_1) rescue Exceptions::NoSolutionExists => nse pp nse.message end # Now, let's create a package, depends_on_nosuch, that has a # dependency on a non-existent package, nosuch, and see that nosuch is # identified as the problematic package. Note that because Package # objects are auto-vivified by DependencyGraph#Package, non-existent # packages are any packages that have no versions. depends_on_nosuch = dep_graph.package('depends_on_nosuch') depends_on_nosuch_v1 = depends_on_nosuch.add_version(Version.new('1.0')) depends_on_nosuch_v1.dependencies << Dependency.new(dep_graph.package('nosuch')) unsatisfiable_solution_constraints_2 = [ SolutionConstraint.new(depends_on_nosuch) ] # Note that package D is identified as the most constrained package # and the paths from from solution constraints to constraints on D are # returned in the message begin selector.find_solution(unsatisfiable_solution_constraints_2) rescue Exceptions::NoSolutionExists => nse pp nse.message end # Invalid solution constraints are those that reference a non-existent # package, or constrain an extant package to no versions. All invalid # solution constraints are raised in an InvalidSolutionConstraints # exception. invalid_solution_constraints = [ SolutionConstraint.new(dep_graph.package('nosuch')), SolutionConstraint.new(dep_graph.package('nosuch2')), SolutionConstraint.new(dep_graph.package('A'), VersionConstraint.new('>= 10.0.0')), SolutionConstraint.new(dep_graph.package('B'), VersionConstraint.new('>= 50.0.0')) ] begin selector.find_solution(invalid_solution_constraints) rescue Exceptions::InvalidSolutionConstraints => isc puts "non-existent solution constraints: #{isc.non_existent_packages.join(', ')}" puts "solution constraints whose constraints match no versions of the package: #{isc.constrained_to_no_versions.join(', ')}" end dep-selector-1.0.3/ext/000077500000000000000000000000001232552612700147065ustar00rootroot00000000000000dep-selector-1.0.3/ext/dep_gecode/000077500000000000000000000000001232552612700167645ustar00rootroot00000000000000dep-selector-1.0.3/ext/dep_gecode/define_dummy_init.cxx000066400000000000000000000002221232552612700231740ustar00rootroot00000000000000// On some platforms, the ruby compile process really wants to export an // Init_dep_gecode function. extern "C" void Init_dep_gecode(void) { } dep-selector-1.0.3/ext/dep_gecode/dep_gecode-all.def000066400000000000000000000004611232552612700222710ustar00rootroot00000000000000EXPORTS VersionProblemCreate VersionProblemDestroy AddPackage VersionProblemSize MarkPackagePreferredToBeAtLatest MarkPackageRequired AddVersionConstraint Solve GetDisabledVariableCount GetPackageVersion MarkPackageSuspicious GetPackageDisabledState VersionProblemPackageCount GetPackageMax GetPackageMin dep-selector-1.0.3/ext/dep_gecode/dep_selector_swig.i000066400000000000000000000047131232552612700226440ustar00rootroot00000000000000// // Author:: Christopher Walters () // Author:: Mark Anderson () // Copyright:: Copyright (c) 2010-2011 Opscode, Inc. // License:: Apache License, Version 2.0 // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // // // swig -c++ -ruby dep_selector_swig.i // %module "dep_gecode" %{ #include "dep_selector_to_gecode_interface.h" %} class VersionProblem; VersionProblem * VersionProblemCreate(int packageCount, bool dumpStats, bool debug, const char * log_id); void VersionProblemDestroy(VersionProblem * vp); int VersionProblemSize(VersionProblem *p); int VersionProblemPackageCount(VersionProblem *p); // Return ID # int AddPackage(VersionProblem *problem, int min, int max, int currentVersion); // Add constraint for package pkg @ version, // that dependentPackage is at version [minDependentVersion,maxDependentVersion] // // This used to return a boolean value describing when the problem // became insoluble. This was never used, and didn't appear to work // at all, and so has been replaced with returning void. void AddVersionConstraint(VersionProblem *problem, int packageId, int version, int dependentPackageId, int minDependentVersion, int maxDependentVersion); void MarkPackageSuspicious(VersionProblem *problem, int packageId); void MarkPackageRequired(VersionProblem *problem, int packageId); void MarkPackagePreferredToBeAtLatest(VersionProblem *problem, int packageId, int weight); int GetPackageVersion(VersionProblem *problem, int packageId); bool GetPackageDisabledState(VersionProblem *problem, int packageId); int GetPackageMax(VersionProblem *problem, int packageId); int GetPackageMin(VersionProblem *problem, int packageId); int GetDisabledVariableCount(VersionProblem *problem); void VersionProblemDump(VersionProblem * problem); void VersionProblemPrintPackageVar(VersionProblem * problem, int packageId); VersionProblem * Solve(VersionProblem * problem); dep-selector-1.0.3/ext/dep_gecode/dep_selector_to_gecode.cpp000066400000000000000000000705011232552612700241530ustar00rootroot00000000000000// // Author:: Christopher Walters () // Author:: Mark Anderson () // Copyright:: Copyright (c) 2010-2011 Opscode, Inc. // License:: Apache License, Version 2.0 // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // #include #include #include #include #include #include "dep_selector_to_gecode.h" #include #include #include #include //#define MEMORY_DEBUG //#define DEBUG #define DEBUG_STREAM std::cerr //#define USE_DUMB_BRANCHING #define VECTOR_CONSTRAIN using namespace Gecode; const int VersionProblem::UNRESOLVED_VARIABLE = INT_MIN; const int VersionProblem::MIN_TRUST_LEVEL = 0; const int VersionProblem::MAX_TRUST_LEVEL = 10; const int VersionProblem::MAX_PREFERRED_WEIGHT = 10; VersionProblemPool::VersionProblemPool() : elems() { } VersionProblemPool::~VersionProblemPool() { DeleteAll(); } void VersionProblemPool::Add(VersionProblem * vp) { vp->pool = this; #ifdef MEMORY_DEBUG DEBUG_STREAM << "Pool add\t" << vp << std::endl << std::flush; #endif // MEMORY_DEBUG elems.insert(vp); } void VersionProblemPool::Delete(VersionProblem *vp) { if (vp->pool != 0) { #ifdef MEMORY_DEBUG DEBUG_STREAM << "Pool del\t" << vp << std::endl << std::flush; #endif // MEMORY_DEBUG elems.erase(vp); vp->pool = 0; } } void VersionProblemPool::ShowAll() { DEBUG_STREAM << "ShowAll =====================================================" << std::endl << std::flush; std::set::iterator i; for(i = elems.begin(); i != elems.end(); i++) { #ifdef MEMORY_DEBUG DEBUG_STREAM << "ShowAll has\t\t\t" << *i << std::endl << std::flush; #endif // MEMORY_DEBUG } DEBUG_STREAM << "ShowAll =====================================================" << std::endl << std::flush; } void VersionProblemPool::DeleteAll() { #ifdef MEMORY_DEBUG ShowAll(); #endif std::set::iterator i; for(i = elems.begin(); i != elems.end(); i++) { VersionProblem *vp = *i; vp->pool = 0; delete *i; } elems.clear(); #ifdef MEMORY_DEBUG DEBUG_STREAM << "DeleteAll ===================================================" << std::endl << std::flush; #endif } int VersionProblem::instance_counter = 0; VersionProblem::VersionProblem(int packageCount, bool dumpStats, bool debug, const char * logId) : size(packageCount), version_constraint_count(0), dump_stats(dumpStats), debugLogging(debug), finalized(false), cur_package(0), package_versions(*this, packageCount), disabled_package_variables(*this, packageCount, 0, 1), total_disabled(*this, 0, packageCount*MAX_TRUST_LEVEL), total_required_disabled(*this, 0, packageCount), total_induced_disabled(*this, 0, packageCount), total_suspicious_disabled(*this, 0, packageCount), is_required(new int[packageCount]), is_suspicious(new int[packageCount]), at_latest(*this, packageCount, 0, 1), // These domains could be narrowed a bit; check later total_preferred_at_latest(*this, -packageCount*MAX_PREFERRED_WEIGHT, packageCount*MAX_PREFERRED_WEIGHT), total_not_preferred_at_latest(*this, -packageCount, packageCount), preferred_at_latest_weights(new int[packageCount]), pool(0), instance_id(instance_counter++) { char * end = strncpy(debugPrefix, logId, DEBUG_PREFIX_LENGTH); strncat(end, ": ", DEBUG_PREFIX_LENGTH-(debugPrefix-end)); for (int i = 0; i < packageCount; i++) { preferred_at_latest_weights[i] = 0; is_required[i] = 0; is_suspicious[i] = 0; } if (debugLogging) { DEBUG_STREAM << std::endl; DEBUG_STREAM << debugPrefix << "Creating VersionProblem inst# " << instance_id << " with " << packageCount << " packages, " << dumpStats << " stats, " << debug << " debug" << std::endl; DEBUG_STREAM.flush(); } } VersionProblem::VersionProblem(bool share, VersionProblem & s) : Space(share, s), size(s.size), version_constraint_count(s.version_constraint_count), dump_stats(s.dump_stats), debugLogging(s.debugLogging), finalized(s.finalized), cur_package(s.cur_package), disabled_package_variables(s.disabled_package_variables), total_disabled(s.total_disabled), total_required_disabled(s.total_required_disabled), total_induced_disabled(s.total_induced_disabled), total_suspicious_disabled(s.total_suspicious_disabled), is_required(NULL), is_suspicious(NULL), at_latest(s.at_latest), total_preferred_at_latest(s.total_preferred_at_latest), total_not_preferred_at_latest(s.total_preferred_at_latest), preferred_at_latest_weights(NULL), pool(s.pool), instance_id(s.instance_id) { strncpy(debugPrefix, s.debugPrefix, DEBUG_PREFIX_LENGTH), package_versions.update(*this, share, s.package_versions); disabled_package_variables.update(*this, share, s.disabled_package_variables); total_disabled.update(*this, share, s.total_disabled); total_required_disabled.update(*this, share, s.total_required_disabled); total_induced_disabled.update(*this, share, s.total_induced_disabled); total_suspicious_disabled.update(*this, share, s.total_suspicious_disabled); at_latest.update(*this, share, s.at_latest); total_preferred_at_latest.update(*this, share, s.total_preferred_at_latest); total_not_preferred_at_latest.update(*this, share, s.total_not_preferred_at_latest); pool->Add(this); #ifdef MEMORY_DEBUG DEBUG_STREAM << "C VersionProblem(bool, VP)\t" << this << std::endl << std::flush; #endif } // Support for gecode Space* VersionProblem::copy(bool share) { return new VersionProblem(share,*this); } VersionProblem::~VersionProblem() { delete[] preferred_at_latest_weights; delete[] is_required; delete[] is_suspicious; if (pool!= 0) { pool->Delete(this); } #ifdef MEMORY_DEBUG DEBUG_STREAM << "D VersionProblem\t\t" << this << std::endl << std::flush; #endif } int VersionProblem::Size() { return size; } int VersionProblem::PackageCount() { return cur_package; } int VersionProblem::AddPackage(int minVersion, int maxVersion, int currentVersion) { if (cur_package == size) { return -1; } if (debugLogging) { sprintf(outputBuffer, "%s DepSelector inst# %d - Adding package id %d/%d: min = %d, max = %d, current version %d", debugPrefix, instance_id, cur_package, size, minVersion, maxVersion, currentVersion); DEBUG_STREAM << outputBuffer; // DEBUG_STREAM << debugPrefix << "DepSelector inst# " << instance_id // << " - Adding package id " << cur_package << '/' << size << ": min = " << minVersion << ", max = " << maxVersion << ", current version " << currentVersion << std::endl; DEBUG_STREAM.flush(); } int index = cur_package; cur_package++; // IntVar version(*this, minVersion, maxVersion); package_versions[index] = IntVar(*this, minVersion, maxVersion); // register the binding of package to version that corresponds to the package's latest rel(*this, package_versions[index], IRT_EQ, maxVersion, at_latest[index]); return index; } void VersionProblem::AddVersionConstraint(int packageId, int version, int dependentPackageId, int minDependentVersion, int maxDependentVersion) { BoolVar version_match(*this, 0, 1); BoolVar depend_match(*this, 0, 1); BoolVar predicated_depend_match(*this, 0, 1); version_constraint_count++; if (debugLogging) { sprintf(outputBuffer, "%sDepSelector inst# %d - Adding VC for %d @ %d depPkg %d [%d, %d]", debugPrefix, instance_id, packageId, version, dependentPackageId, minDependentVersion, maxDependentVersion); DEBUG_STREAM << outputBuffer; // DEBUG_STREAM << debugPrefix << "DepSelector inst# " << instance_id // << " - Adding VC for " << packageId << " @ " << version << " depPkg " << dependentPackageId // << " [ " << minDependentVersion << ", " << maxDependentVersion << " ]" << std::endl; DEBUG_STREAM.flush(); } //version_flags << version_match; // Constrain pred to reify package @ version rel(*this, package_versions[packageId], IRT_EQ, version, version_match); // Add the predicated version constraints imposed on dependent package // package_versions[dependendPackageId] in domain [minDependentVersion,maxDependentVersion] <=> depend_match dom(*this, package_versions[dependentPackageId], minDependentVersion, maxDependentVersion, depend_match); // disabled_package_variables[dependentPackageId] OR depend_match <=> predicated_depend_match // rel(*this, disabled_package_variables[dependentPackageId], BOT_OR, depend_match, version_match); rel(*this, disabled_package_variables[dependentPackageId], BOT_OR, depend_match, predicated_depend_match); rel(*this, version_match, BOT_IMP, predicated_depend_match, 1); // This used to return a boolean value describing when the problem // became insoluble. This was never used, and didn't appear to work // at all, and so has been replaced with returning void. } void VersionProblem::MarkPackageSuspicious(int packageId) { is_suspicious[packageId] = 1; if (debugLogging) { sprintf(outputBuffer, "%sDepSelector inst# %d - Marking Package Suspicious %d", debugPrefix, instance_id, packageId); DEBUG_STREAM << outputBuffer; // DEBUG_STREAM << debugPrefix << "DepSelector inst# " << instance_id // << " - Marking Package Suspicious " << packageId << std::endl; DEBUG_STREAM.flush(); } } void VersionProblem::MarkPackageRequired(int packageId) { is_required[packageId] = 1; if (debugLogging) { sprintf(outputBuffer, "%sDepSelector inst# %d - Marking Package Required %d", debugPrefix, instance_id, packageId); DEBUG_STREAM << debugPrefix << "DepSelector inst# " << instance_id << " - Marking Package Required " << packageId << std::endl; DEBUG_STREAM.flush(); } } void VersionProblem::MarkPackagePreferredToBeAtLatest(int packageId, int weight) { preferred_at_latest_weights[packageId] = std::max(MAX_PREFERRED_WEIGHT, std::min(0, weight)); if (debugLogging) { sprintf(outputBuffer, "%sDepSelector inst# %d - Marking Package Preferred Latest %d weight %d", debugPrefix, instance_id, packageId, weight); DEBUG_STREAM << debugPrefix << "DepSelector inst# " << instance_id << " - Marking Package Preferred Latest " << packageId << " weight " << weight << std::endl; DEBUG_STREAM.flush(); } } void VersionProblem::Finalize() { if (debugLogging) { DEBUG_STREAM << debugPrefix << "Finalization Started for inst# " << instance_id << std::endl; DEBUG_STREAM.flush(); } finalized = true; // Setup constraint for cost // We wish to minimize the total number of disabled packages, by priority ranks IntArgs disabled_required_weights(size, is_required); linear(*this, disabled_required_weights, disabled_package_variables, IRT_EQ, total_required_disabled); if (debugLogging) { DEBUG_STREAM << debugPrefix << " disabled_required_weights: " << disabled_required_weights << std::endl; DEBUG_STREAM << debugPrefix << " total_required_disabled: " << total_required_disabled << std::endl; } IntArgs disabled_induced_weights(size); for (int i = 0; i < size; i++) { disabled_induced_weights[i] = !(is_required[i] || is_suspicious[i]); } linear(*this, disabled_induced_weights, disabled_package_variables, IRT_EQ, total_induced_disabled); if (debugLogging) { DEBUG_STREAM << debugPrefix << " disabled_induced_weights: " << disabled_induced_weights << std::endl; DEBUG_STREAM << debugPrefix <<" total_induced_disabled: " << total_induced_disabled << std::endl; } IntArgs disabled_suspicious_weights(size, is_suspicious); linear(*this, disabled_suspicious_weights, disabled_package_variables, IRT_EQ, total_suspicious_disabled); if (debugLogging) { DEBUG_STREAM << debugPrefix << " disabled_suspicious_weights: " << disabled_suspicious_weights << std::endl; DEBUG_STREAM << debugPrefix << " total_suspicious_disabled: " << total_suspicious_disabled << std::endl; } linear(*this, disabled_package_variables, IRT_EQ, total_disabled); if (debugLogging) { DEBUG_STREAM << debugPrefix <<" total_disabled: " << total_disabled << std::endl; } // Setup computation for total_preferred_at_latest // We wish to maximize the total number of packages at their latest versions in the preferred tier of packages // We negate the weights in the cost function to make it fit into the context of a minimization problem. for (int i = 0; i < size; i++) { preferred_at_latest_weights[i] = -preferred_at_latest_weights[i]; } IntArgs preferred_at_latest_weights_args(size, preferred_at_latest_weights); linear(*this, preferred_at_latest_weights_args, at_latest, IRT_EQ, total_preferred_at_latest); if (debugLogging) { DEBUG_STREAM << debugPrefix << " preferred_at_latest_weights_args: " << preferred_at_latest_weights_args << std::endl; DEBUG_STREAM << debugPrefix << " total_preferred_at_latest: " << total_preferred_at_latest << std::endl; } // Setup computation for remaining variables // We wish to maximize the total number of packages at their latest version in the non-preferred tier of packages // We negate the weights in the cost function to make it fit into the context of a minimization problem. IntArgs not_preferred_at_latest_weights_args = IntArgs::create(size, 0, 0); for (int i = 0; i < size; i++) { if (preferred_at_latest_weights[i] == 0) { not_preferred_at_latest_weights_args[i] = -1; } } linear(*this, not_preferred_at_latest_weights_args, at_latest, IRT_EQ, total_not_preferred_at_latest); if (debugLogging) { DEBUG_STREAM << debugPrefix << " not_preferred_at_latest_weights_args: " << not_preferred_at_latest_weights_args << std::endl; DEBUG_STREAM << debugPrefix << " total_not_preferred_at_latest: " << total_not_preferred_at_latest << std::endl; } // Cleanup // Assign a dummy variable to elements greater than actually used. for (int i = cur_package; i < size; i++) { package_versions[i] = IntVar(*this, -1, -1); disabled_package_variables[i] = BoolVar(*this, 1, 1); } #ifdef USE_DUMB_BRANCHING if (debugLogging) { DEBUG_STREAM << debugPrefix << " Adding branching (POOR)" << std::endl; DEBUG_STREAM.flush(); } // This branching starts as far as possible from the solution, in order to exercise the optimization functions. branch(*this, disabled_package_variables, INT_VAR_SIZE_MIN, INT_VAL_MAX); branch(*this, package_versions, INT_VAR_SIZE_MIN, INT_VAL_MIN); branch(*this, total_required_disabled, INT_VAL_MAX); branch(*this, total_induced_disabled, INT_VAL_MAX); branch(*this, total_suspicious_disabled, INT_VAL_MAX); branch(*this, total_disabled, INT_VAL_MAX); branch(*this, at_latest, INT_VAR_SIZE_MIN, INT_VAL_MIN); branch(*this, total_preferred_at_latest, INT_VAL_MIN); branch(*this, total_not_preferred_at_latest, INT_VAL_MIN); #else // USE_DUMB_BRANCHING if (debugLogging) { DEBUG_STREAM << debugPrefix << " Adding branching (BEST)" << std::endl; DEBUG_STREAM.flush(); } // This branching is meant to start with most probable solution branch(*this, disabled_package_variables, INT_VAR_SIZE_MIN, INT_VAL_MIN); branch(*this, package_versions, INT_VAR_SIZE_MIN, INT_VAL_MAX); branch(*this, total_required_disabled, INT_VAL_MIN); branch(*this, total_induced_disabled, INT_VAL_MIN); branch(*this, total_suspicious_disabled, INT_VAL_MIN); branch(*this, total_disabled, INT_VAL_MIN); branch(*this, at_latest, INT_VAR_SIZE_MIN, INT_VAL_MAX); branch(*this, total_preferred_at_latest, INT_VAL_MAX); branch(*this, total_not_preferred_at_latest, INT_VAL_MAX); #endif // USE_DUMB_BRANCHING if (debugLogging) { DEBUG_STREAM << debugPrefix << "Finalization Done" << std::endl; DEBUG_STREAM.flush(); } } //////////////////////////////////////////////////////////////////////// // A general note about constrain functions //////////////////////////////////////////////////////////////////////// // // Constrain functions take a space ('best_known_solution') that is has an assignment of variables // and operate in the context of a fresh space, not yet fully assigned. Their purpose is to add // constraints such that the assignments in the fresh space will either yield a better solution, or // none at all if the best_known_solution is the best possible. // #ifdef TOTAL_DISABLED_COST // // Very simple constraint function that only minimizes total disabled packages. This is left here // for debugging purposes. Turn this on to test that the basic system can be solved. // void VersionProblem::constrain(const Space & _best_known_solution) { const VersionProblem& best_known_solution = static_cast(_best_known_solution); // add first-level objective function minimization (failing packages, weighted) // new constraint: total_disabled < best_known_total_disabled_value) int best_known_total_disabled_value = best_known_solution.total_disabled.val(); rel(*this, total_disabled, IRT_LE, best_known_total_disabled_value); if (debugLogging) { DEBUG_STREAM << debugPrefix; PrintVarAligned("Con strain: total_disabled: ", total_disabled); } } #endif // TOTAL_DISABLED_COST // _best_known_soln is the most recent satisfying assignment of // variables that Gecode has found. This method examines the solution // and adds additional constraints that are applied after restarting // the search, which means that the next time a solution that's found // must be strictly better than the current best known solution. // // Our model requires us to have a series of objective functions where // each successive objective function is evaluated if and only if all // higher precedent objective functions are tied. // // [TODO: DESCRIBE WHAT THE ACTUAL SERIES OF OBJECTIVE FUNCTIONS IS] // // Lower precedent objective functions are modeled as the consequent // of an implication whose antecedent is the conjunction of all the // higher precedent objective functions being assigned to their best // known value; thus, the optimal value of an objection function // "activates" the next highest objective function. This has the // effect of isolating the logic of each objective function such that // it is only applied to the set of equally preferable solutions under // the higher precedent objective functions. The objective function // then applies its constraints, the solution space is restarted and // walks the space until it finds another, more constrained solution. #ifdef VECTOR_CONSTRAIN // // The vector constrain function assembles multiple cost functions into a vector cost, and then // constrains the vector cost to be less than the vector cost of the current best_known_solution. // The less than operation here is a pairwise comparison in order of decreasing precedence; only if // higher precedence elements are tied will the lower precedence elements be consulted. The elements // are in increasing order of precedence. // // In this case the lowest precedence cost is total_not_preferred_at_latest, followed by total_preferred_at_latest // and finally total_disabled. // void VersionProblem::constrain(const Space & _best_known_solution) { const VersionProblem& best_known_solution = static_cast(_best_known_solution); IntVarArgs current(5); IntVarArgs best(5); BuildCostVector(current); best_known_solution.BuildCostVector(best); ConstrainVectorLessThanBest(current, best); } #endif // VECTOR_CONSTRAIN void VersionProblem::BuildCostVector(IntVarArgs & costVector) const { costVector[0] = total_not_preferred_at_latest; costVector[1] = total_preferred_at_latest; costVector[2] = total_suspicious_disabled; costVector[3] = total_induced_disabled; costVector[4] = total_required_disabled; } IntVar * VersionProblem::GetPackageVersionVar(int packageId) { if (packageId < cur_package) { return &package_versions[packageId]; } else { if (debugLogging) { DEBUG_STREAM << debugPrefix << "Bad package Id " << packageId << " >= " << cur_package << std::endl; DEBUG_STREAM.flush(); } return NULL; } } int VersionProblem::GetPackageVersion(int packageId) { IntVar *var = GetPackageVersionVar(packageId); if (1 == var->size()) return var->val(); return UNRESOLVED_VARIABLE; } bool VersionProblem::GetPackageDisabledState(int packageId) { return disabled_package_variables[packageId].val() == 1; } int VersionProblem::GetMax(int packageId) { return GetPackageVersionVar(packageId)->max(); } int VersionProblem::GetMin(int packageId) { return GetPackageVersionVar(packageId)->min(); } int VersionProblem::GetDisabledVariableCount() { if (total_disabled.min() == total_disabled.max()) { return total_disabled.min(); } else { return UNRESOLVED_VARIABLE; } } // Utility void VersionProblem::Print(std::ostream & out) { out << debugPrefix << "Version problem dump: " << cur_package << "/" << size << " packages used/allocated" << std::endl; out << debugPrefix << "Disabled Variables: " << disabled_package_variables << std::endl; out << debugPrefix << "Total Disabled variables (required): " << total_required_disabled << std::endl; out << debugPrefix << "Total Disabled variables: (induced): " << total_induced_disabled << std::endl; out << debugPrefix << "Total Disabled variables: (suspicious): " << total_suspicious_disabled << std::endl; out << debugPrefix << "Total Disabled variables: " << total_disabled << std::endl; out << debugPrefix << "at_latest: " << at_latest << std::endl; out << debugPrefix << "total_preferred_at_latest: " << total_preferred_at_latest << std::endl; out << debugPrefix << "total_not_preferred_at_latest: " << total_not_preferred_at_latest << std::endl; for (int i = 0; i < cur_package; i++) { out << debugPrefix << "\t"; PrintPackageVar(out, i); out << std::endl; } out.flush(); } // TODO: Validate package ids ! void VersionProblem::PrintPackageVar(std::ostream & out, int packageId) { IntVar *var = GetPackageVersionVar(packageId); out << "PackageId: " << packageId << " Sltn: " << *var << " disabled: " << disabled_package_variables[packageId] << " at latest: " << at_latest[packageId]; } bool VersionProblem::CheckPackageId(int id) { return (id < size); } // We want to sort vectors // This constrains current to be less than best by a process analogous to subtraction // we compute current - best, pairwise with borrows from less significant elements. We require it to be less than zero by requiring the most // significant element to generate a borrow. // void VersionProblem::ConstrainVectorLessThanBest(IntVarArgs & current, IntVarArgs & best) { BoolVarArray borrow(*this, current.size()+1, 0, 1); // No borrows can happen at the least significant element. rel(*this, borrow[0], IRT_EQ, 0); for (int i = 0; i < current.size(); i++) { // If best+borrow is greater than current (equivalently current-(best+borrow) is < 0) then a more significant element // must have decreased, so we propagate a borrow to the next most significant element. int best_val = best[i].val(); IntVar delta = expr(*this, current[i] - best_val - borrow[i]); // (delta < 0) <=> borrow[i+1] rel(*this, delta, IRT_LE, 0, borrow[i+1]); if (debugLogging) { DEBUG_STREAM << debugPrefix << " ConstrainVector: borrow[" << i+1 << "] " << borrow[i+1] << ",\tdelta " << delta << std::endl; DEBUG_STREAM << debugPrefix << " ConstrainVector: current[" << i << "] " << current[i] << ",\tbest_val " << best_val << std::endl; } } // must borrow off past the most significant element. rel(*this, borrow[current.size()], IRT_EQ, 1); } VersionProblem * VersionProblem::InnerSolve(VersionProblem * problem, int &itercount) { Gecode::Support::Timer timer; timer.start(); #ifdef MEMORY_DEBUG DEBUG_STREAM << "Creating solver" << std::endl << std::flush; #endif VersionProblem *best_solution = NULL; Restart solver(problem); #ifdef MEMORY_DEBUG DEBUG_STREAM << "Starting Solve" << std::endl << std::flush; #endif while (VersionProblem *solution = solver.next()) { #ifdef MEMORY_DEBUG DEBUG_STREAM << "Solver Next " << solution << std::endl << std::flush; #endif if (best_solution != NULL) { delete best_solution; } best_solution = solution; ++itercount; if (problem->debugLogging) { DEBUG_STREAM << problem->debugPrefix << "Trial Solution #" << itercount << "===============================" << std::endl; const Search::Statistics & stats = solver.statistics(); DEBUG_STREAM << problem->debugPrefix << "Solver stats: Prop:" << stats.propagate << " Fail:" << stats.fail << " Node:" << stats.node; DEBUG_STREAM << " Depth:" << stats.depth << " memory:" << stats.memory << std::endl; solution->Print(DEBUG_STREAM); } } double elapsed_time = timer.stop(); if (problem->dump_stats) { if (problem->debugLogging) std::cerr << problem->debugPrefix; std::cerr << "dep_selector solve: "; std::cerr << (best_solution ? "SOLVED" : "FAILED") << " "; std::cerr << problem->size << " packages, " << problem->version_constraint_count << " constraints, "; std::cerr << "Time: " << elapsed_time << "ms "; const Search::Statistics & final_stats = solver.statistics(); std::cerr << "Stats: " << itercount << " steps, "; std::cerr << final_stats.memory << " bytes, "; std::cerr << final_stats.propagate << " props, " << final_stats.node << " nodes, " << final_stats.depth << " depth "; std::cerr << std::endl << std::flush; } return best_solution; } VersionProblem * VersionProblem::Solve(VersionProblem * problem) { problem->Finalize(); problem->status(); VersionProblemPool *pool = new VersionProblemPool(); problem->pool = pool; if (problem->debugLogging) { DEBUG_STREAM << problem->DebugPrefix() << " Before solve" << std::endl; problem->Print(DEBUG_STREAM); } int itercount = 0; VersionProblem *best_solution = InnerSolve(problem, itercount); if (problem->debugLogging) { DEBUG_STREAM << problem->DebugPrefix() << "Solver Best Solution " << best_solution << std::endl << std::flush; } pool->Delete(best_solution); problem->pool = 0; pool->DeleteAll(); delete pool; return best_solution; } // // Debug output // template void PrintVarAligned(const char * message, T & var) { DEBUG_STREAM.width(40); DEBUG_STREAM << std::left << message << var << std::endl; DEBUG_STREAM.width(0); } template void PrintVarAligned(const char * message, S & var1, T & var2) { DEBUG_STREAM.width(40); DEBUG_STREAM << std::left << message << var1 << " " << var2 << std::endl; DEBUG_STREAM.width(0); } //template void PrintVarAligned(const char * message, int & var); // // Version Problem // // // // dep-selector-1.0.3/ext/dep_gecode/dep_selector_to_gecode.h000066400000000000000000000113151232552612700236160ustar00rootroot00000000000000// // Author:: Christopher Walters () // Author:: Mark Anderson () // Copyright:: Copyright (c) 2010-2011 Opscode, Inc. // License:: Apache License, Version 2.0 // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // #ifndef dep_selector_to_gecode_h #define dep_selector_to_gecode_h #include "dep_selector_to_gecode_interface.h" #include #include #include #include #include #include using namespace Gecode; // TODO: // Allow retrieval of multiple solutions // Understand how assign versions where necessary, and not assign unnecessary versions. // Understand how to assign empty versions // // Extend: // Add optimization functions // Allow non-contiguous ranges in package dependencies. // TODO: Add locking struct VersionProblemPool { std::set elems; VersionProblemPool(); ~VersionProblemPool(); void Add(VersionProblem * vp); void Delete(VersionProblem *vp); void ShowAll(); void DeleteAll(); }; #define DEBUG_PREFIX_LENGTH 40 class VersionProblem : public Space { public: static const int UNRESOLVED_VARIABLE; static const int MIN_TRUST_LEVEL; static const int MAX_TRUST_LEVEL; static const int MAX_PREFERRED_WEIGHT; static int instance_counter; VersionProblem(int packageCount, bool dumpStats = true, bool debug = false, const char * logId = 0); // Clone constructor; check gecode rules for this... VersionProblem(bool share, VersionProblem & s); virtual ~VersionProblem(); int Size(); int PackageCount(); IntVar * GetPackageVersionVar(int packageId); virtual int AddPackage(int minVersion, int maxVersion, int currentVersion); virtual void AddVersionConstraint(int packageId, int version, int dependentPackageId, int minDependentVersion, int maxDependentVersion); // We may wish to indicate that some packages have suspicious constraints, and when chosing packages to disable we // would disable them first. void MarkPackageSuspicious(int packageId); void MarkPackageRequired(int packageId); // Packages marked by this method are preferentially chosen at // latest according to weights void MarkPackagePreferredToBeAtLatest(int packageId, int weight); void Finalize(); virtual void constrain(const Space & _best_known_solution); int GetPackageVersion(int packageId); bool GetPackageDisabledState(int packageId); int GetMax(int packageId); int GetMin(int packageId); int GetDisabledVariableCount(); // Support for gecode virtual Space* copy(bool share); // Debug and utility functions void Print(std::ostream &out); void PrintPackageVar(std::ostream & out, int packageId) ; const char * DebugPrefix() const { return debugPrefix; } static VersionProblem *InnerSolve(VersionProblem * problem, int & itercount); static VersionProblem *Solve(VersionProblem *problem); protected: int instance_id; int size; int version_constraint_count; int cur_package; bool dump_stats; bool debugLogging; char debugPrefix[DEBUG_PREFIX_LENGTH]; char outputBuffer[1024]; bool finalized; BoolVarArgs version_flags; IntVarArray package_versions; BoolVarArray disabled_package_variables; IntVar total_disabled; IntVar total_required_disabled; IntVar total_induced_disabled; IntVar total_suspicious_disabled; BoolVarArray at_latest; IntVar total_preferred_at_latest; IntVar total_not_preferred_at_latest; int * preferred_at_latest_weights; int * is_required; int * is_suspicious; VersionProblemPool *pool; bool CheckPackageId(int id); void AddPackagesPreferredToBeAtLatestObjectiveFunction(const VersionProblem & best_known_solution); void ConstrainVectorLessThanBest(IntVarArgs & current, IntVarArgs & best); void BuildCostVector(IntVarArgs & costVector) const; friend class VersionProblemPool; }; template void PrintVarAligned(const char * message, T & var); template void PrintVarAligned(const char * message, S & var1, T & var2); class Solver { public: Solver(VersionProblem *s); VersionProblem GetNextSolution(); private: Restart solver; }; #endif // dep_selector_to_gecode_h dep-selector-1.0.3/ext/dep_gecode/dep_selector_to_gecode_interface.cpp000066400000000000000000000063671232552612700262040ustar00rootroot00000000000000// // Author:: Christopher Walters () // Author:: Mark Anderson () // Copyright:: Copyright (c) 2010-2011 Opscode, Inc. // License:: Apache License, Version 2.0 // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // #include #include "dep_selector_to_gecode_interface.h" #include "dep_selector_to_gecode.h" //#include "version_problem_oc_ih.h" // // TODO: // Trap all exceptions // insure proper memory behaviour // FFI friendly VersionProblem * VersionProblemCreate(int packageCount, bool dump_stats, bool debug, const char * logId) { return new VersionProblem(packageCount, dump_stats, debug, logId); } void VersionProblemDestroy(VersionProblem * p) { delete p; } int VersionProblemSize(VersionProblem *p) { return p->Size(); } int VersionProblemPackageCount(VersionProblem *p) { return p->PackageCount(); } void VersionProblemDump(VersionProblem *p) { p->Print(std::cout); std::cout.flush(); } void VersionProblemPrintPackageVar(VersionProblem *p, int packageId) { p->PrintPackageVar(std::cout, packageId); std::cout.flush(); } // Return ID # int AddPackage(VersionProblem *problem, int min, int max, int currentVersion) { return problem->AddPackage(min,max,currentVersion); } // Add constraint for package pkg @ version, // that dependentPackage is at version [minDependentVersion,maxDependentVersion] // Returns false if system becomes insoluble. void AddVersionConstraint(VersionProblem *problem, int packageId, int version, int dependentPackageId, int minDependentVersion, int maxDependentVersion) { return problem->AddVersionConstraint(packageId, version, dependentPackageId, minDependentVersion, maxDependentVersion); } void MarkPackageSuspicious(VersionProblem *problem, int packageId) { return problem->MarkPackageSuspicious(packageId); } void MarkPackagePreferredToBeAtLatest(VersionProblem *problem, int packageId, int weight) { return problem->MarkPackagePreferredToBeAtLatest(packageId, weight); } void MarkPackageRequired(VersionProblem *problem, int packageId) { return problem->MarkPackageRequired(packageId); } int GetPackageVersion(VersionProblem *problem, int packageId) { return problem->GetPackageVersion(packageId); } bool GetPackageDisabledState(VersionProblem *problem, int packageId) { return problem->GetPackageDisabledState(packageId); } int GetPackageMax(VersionProblem *problem, int packageId) { return problem->GetMax(packageId); } int GetPackageMin(VersionProblem *problem, int packageId) { return problem->GetMin(packageId); } int GetDisabledVariableCount(VersionProblem *problem) { return problem->GetDisabledVariableCount(); } VersionProblem * Solve(VersionProblem * problem) { return VersionProblem::Solve(problem); } dep-selector-1.0.3/ext/dep_gecode/dep_selector_to_gecode_interface.h000066400000000000000000000050531232552612700256400ustar00rootroot00000000000000// // Author:: Christopher Walters () // Author:: Mark Anderson () // Copyright:: Copyright (c) 2010-2011 Opscode, Inc. // License:: Apache License, Version 2.0 // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // #ifndef dep_selector_to_gecode_interface_h #define dep_selector_to_gecode_interface_h // Conceptual Api #ifdef __cplusplus extern "C" { #endif // __cplusplus #ifdef __cplusplus class VersionProblem; #else typedef struct VersionProblem VersionProblem; #endif // __cplusplus VersionProblem * VersionProblemCreate(int packageCount, bool dumpStats, bool debug, const char * logId); void VersionProblemDestroy(VersionProblem * vp); int VersionProblemSize(VersionProblem *p); int VersionProblemPackageCount(VersionProblem *p); // Return ID # int AddPackage(VersionProblem *problem, int min, int max, int currentVersion); // Add constraint for package pkg @ version, // that dependentPackage is at version [minDependentVersion,maxDependentVersion] // Returns false if system becomes insoluble. void AddVersionConstraint(VersionProblem *problem, int packageId, int version, int dependentPackageId, int minDependentVersion, int maxDependentVersion); void MarkPackageSuspicious(VersionProblem *problem, int packageId); void MarkPackageRequired(VersionProblem *problem, int packageId); void MarkPackagePreferredToBeAtLatest(VersionProblem *problem, int packageId, int weight); int GetPackageVersion(VersionProblem *problem, int packageId); bool GetPackageDisabledState(VersionProblem *problem, int packageId); int GetPackageMax(VersionProblem *problem, int packageId); int GetPackageMin(VersionProblem *problem, int packageId); int GetDisabledVariableCount(VersionProblem *problem); void VersionProblemDump(VersionProblem * problem); void VersionProblemPrintPackageVar(VersionProblem * problem, int packageId); VersionProblem * Solve(VersionProblem * problem); #ifdef __cplusplus } #endif // __cplusplus #endif // dep_selector_to_gecode_interface_h dep-selector-1.0.3/ext/dep_gecode/extconf.rb000066400000000000000000000177011232552612700207650ustar00rootroot00000000000000# # Author:: Christopher Walters () # Author:: Mark Anderson () # Copyright:: Copyright (c) 2010-2011 Opscode, Inc. # License:: Apache License, Version 2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # # Ruby that supports C extensions. Our library isn't an extension, but we piggyback on ruby's C extension build system if !defined?(RUBY_ENGINE) || RUBY_ENGINE == 'ruby' || RUBY_ENGINE == 'rbx' # # GECODE needs to be built with # ./configure --with-architectures=i386,x86_64 # to work properly here. require 'mkmf' require 'dep-selector-libgecode' opt_path = DepSelectorLibgecode.opt_path include_path = DepSelectorLibgecode.include_path if find_library("gecodesupport", nil, opt_path) # Ruby sometimes has a blank RPATHFLAG, even though it's on a system that # really should be setting rpath flags. If there _is_ an rpath flag we'll # honor it, but if not, we'll assume that ruby is lying and set it # ourselves. # # See also: https://github.com/opscode/dep-selector/issues/23 ruby_rpathflag = RbConfig::MAKEFILE_CONFIG["RPATHFLAG"] if ruby_rpathflag.nil? || ruby_rpathflag.empty? hax_rpath_flags = " -Wl,-rpath,%1$-s" % [opt_path] $DLDFLAGS << hax_rpath_flags end end # find_header doesn't seem to work for stuff like `gecode/thing.hh` $INCFLAGS << " -I#{include_path}" gecode_installed = # Gecode documentation notes: # "Some linkers require the list of libraries to be sorted such that # libraries appear before all libraries they depend on." # http://www.gecode.org/doc-latest/MPG.pdf # # This appears to be true of the version of mingw that ships with Ruby 1.9.3. # The correct order of `-l` flags according to the docs is: # # 1. -lgecodeflatzinc # 2. -lgecodedriver # 3. -lgecodegist # 4. -lgecodesearch, # 5. -lgecodeminimodel # 6. -lgecodeset # 7. -lgecodefloat # 8. -lgecodeint # 9. -lgecodekernel # 10. -lgecodesupport # # Ruby `mkmf` will add `-l` flags in the _REVERSE_ order that they appear here. have_library('gecodesupport') && have_library('gecodekernel') && have_library('gecodeint') && have_library('gecodeminimodel') && have_library('gecodesearch') unless gecode_installed STDERR.puts <3.5 must be installed (http://www.gecode.org/). OSX: cd $( brew --prefix ) git checkout 3c5ca25 Library/Formula/gecode.rb brew install gecode Debian and Ubuntu: sudo apt-get install libgecode-dev Build from source: Get gecode 3.7.3 source: curl -O http://www.gecode.org/download/gecode-3.7.3.tar.gz Unpack it: tar zxvf gecode-3.7.3.tar.gz Build: ./configure --disable-doc-dot \ --disable-doc-search \ --disable-doc-tagfile \ --disable-doc-chm \ --disable-doc-docset \ --disable-qt \ --disable-examples make (sudo) make install ========================================================================================= EOS raise "Gecode not installed" end if RUBY_PLATFORM =~ /mswin|mingw|windows/ # By default, ruby will generate linker options that will not export the # symbols we need to export. We pass an extra def file to the linker to # make it export the symbols we need. $DLDFLAGS << " -Wl,--enable-auto-image-base,--enable-auto-import dep_gecode-all.def" # When compiling with devkit, mingw/bin is added to the PATH only for # compilation, but not at runtime. Windows uses PATH for shared library # path and has no rpath feature. This means that dynamic linking to # libraries in mingw/bin will succeed at compilation but cause runtime # loading failures. To fix this we static link libgcc and libstdc++ # See: https://github.com/opscode/dep-selector/issues/17 $libs << " -static-libgcc -static-libstdc++" end create_makefile('dep_gecode') else # JRUBY require 'rbconfig' require 'ffi/platform' incflags = "-I." libpath = "-L." require 'dep-selector-libgecode' opt_path = DepSelectorLibgecode.opt_path include_path = DepSelectorLibgecode.include_path libpath << " -L#{opt_path}" # On MRI, RbConfig::CONFIG["RPATHFLAG"] == "" when using clang/llvm, but this # isn't set on JRuby so we need to detect llvm manually and set rpath on gcc unless `gcc -v` =~ /LLVM/ rpath_flag = (" -Wl,-R%1$-s" % [opt_path]) libpath << rpath_flag end incflags << " -I#{include_path}" cflags = ENV['CFLAGS'] cppflags = ENV['CPPFLAGS'] cxxflags = ENV['CXXFLAGS'] ldflags = ENV['LDFLAGS'] cc = ENV['CC'] cxx = ENV['CXX'] ldsharedxx = RbConfig::MAKEFILE_CONFIG["LDSHAREDXX"] # use the CC that ruby was compiled with by default cc ||= RbConfig::MAKEFILE_CONFIG['CC'] cxx ||= RbConfig::MAKEFILE_CONFIG["CXX"] cppflags ||= RbConfig::MAKEFILE_CONFIG["CPPFLAGS"] cxxflags ||= RbConfig::MAKEFILE_CONFIG["CXXFLAGS"] cflags ||= "" ldflags ||= "" # then ultimately default back to gcc cc ||= "gcc" cxx ||= "g++" # JRuby reports that the compiler is "CC" no matter what, so we can't detect # if we're using anything other than gcc/llvm. Therefore we just assume # that's the compiler we're on. cflags << "-Wno-error=shorten-64-to-32 -pipe" cflags << " -O3" unless cflags =~ /-O\d/ cflags << " -Wall -fPIC" cppflags << " -O3" unless cppflags =~ /-O\d/ cppflags << " -fno-common -fPIC" cxxflags << " -O3" unless cppflags =~ /-O\d/ cxxflags << " -fno-common -fPIC" ENV['CFLAGS'] = cflags ENV['LDFLAGS'] = ldflags ENV['CC'] = cc ENV['CXX'] = cxx ENV["CPPFLAGS"] = cppflags ENV["CXXFLAGS"] = cxxflags ENV['INCFLAGS'] = incflags ENV['LIBPATH'] = libpath dlext = FFI::Platform::LIBSUFFIX headers = "$(srcdir)/dep_selector_to_gecode.h $(srcdir)/dep_selector_to_gecode_interface.h" install = RbConfig::MAKEFILE_CONFIG["INSTALL"] File.open("Makefile", "w") do |mf| mf.puts(<<-EOH) # Makefile for building dep_gecode # V=0 quiet, V=1 verbose. other values don't work. V = 1 Q1 = $(V:1=) Q = $(Q1:0=@) ECHO1 = $(V:1=@:) ECHO = $(ECHO1:0=@echo) srcdir = . CFLAGS = #{ENV['CFLAGS']} LDFLAGS = #{ENV['LDFLAGS']} CPPFLAGS = #{ENV['CPPFLAGS']} CXXFLAGS = #{ENV['CXXFLAGS']} INCFLAGS = #{ENV['INCFLAGS']} LIBPATH = #{ENV['LIBPATH']} LDSHAREDXX = #{ldsharedxx} empty = OUTFLAG = -o $(empty) COUTFLAG = -o $(empty) CC = #{ENV['CC']} CXX = #{ENV["CXX"]} TARGET = dep_gecode TARGET_NAME = dep_gecode DLLIB = $(TARGET).#{dlext} LIBS = -lgecodesearch -lgecodeminimodel -lgecodeint -lgecodekernel -lgecodesupport CLEANLIBS = $(DLLIB) OBJS = dep_selector_to_gecode.o dep_selector_to_gecode_interface.o CLEANOBJS = *.o *.bak HDRS = #{headers} INSTALL = #{install} INSTALL_PROG = $(INSTALL) -m 0755 INSTALL_DATA = $(INSTALL) -m 644 all:\t$(DLLIB) install: clean: \t$(Q)$(RM) $(CLEANLIBS) $(CLEANOBJS) $(CLEANFILES) .*.time .SUFFIXES: .c .m .cc .mm .cxx .cpp .C .o .cc.o: $(ECHO) compiling $(<) $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -c $< .cxx.o: $(ECHO) compiling $(<) $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -c $< .cpp.o: $(ECHO) compiling $(<) $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -c $< $(DLLIB): $(OBJS) Makefile $(ECHO) linking shared-object $(DLLIB) -$(Q)$(RM) $(@) $(Q) $(LDSHAREDXX) -o $@ $(OBJS) $(LIBPATH) $(DLDFLAGS) $(LOCAL_LIBS) $(LIBS) $(Q) test -z '$(RUBY_CODESIGN)' || codesign -s '$(RUBY_CODESIGN)' -f $@ $(OBJS): $(HDRS) EOH end end dep-selector-1.0.3/lib/000077500000000000000000000000001232552612700146545ustar00rootroot00000000000000dep-selector-1.0.3/lib/dep_selector.rb000066400000000000000000000023131232552612700176500ustar00rootroot00000000000000# # Author:: Christopher Walters () # Author:: Mark Anderson () # Copyright:: Copyright (c) 2010-2011 Opscode, Inc. # License:: Apache License, Version 2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # require 'dep_selector/dep_selector_version' require 'dep_selector/selector' require 'dep_selector/dependency_graph' require 'dep_selector/package' require 'dep_selector/package_version' require 'dep_selector/dependency' require 'dep_selector/solution_constraint' require 'dep_selector/version' require 'dep_selector/version_constraint' require 'dep_selector/exceptions' # error reporting require 'dep_selector/error_reporter' require 'dep_selector/error_reporter/simple_tree_traverser' dep-selector-1.0.3/lib/dep_selector/000077500000000000000000000000001232552612700173245ustar00rootroot00000000000000dep-selector-1.0.3/lib/dep_selector/densely_packed_set.rb000066400000000000000000000035711232552612700235040ustar00rootroot00000000000000# # Author:: Christopher Walters () # Author:: Mark Anderson () # Copyright:: Copyright (c) 2010-2011 Opscode, Inc. # License:: Apache License, Version 2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # require 'dep_selector/exceptions' module DepSelector class DenselyPackedSet attr_reader :sorted_elements def initialize(elements) @sorted_elements = elements.sort @element_to_index = {} @sorted_elements.each_with_index{|elt, idx| @element_to_index[elt] = idx} end def range Range.new(0, @sorted_elements.size-1) end def index(element) unless @element_to_index.has_key?(element) msg = "#{element} is not a valid version for this package" raise Exceptions::InvalidVersion.new(msg) end @element_to_index[element] end def [](constraint) # TODO [cw/mark,2010/11/22]: don't actually need an array here, re-write range = [] started = false done = false sorted_elements.each_with_index do |element, idx| if constraint.include?(element) raise "Currently only handle continuous gap between #{range.last} and #{idx} for #{constraint.to_s} over #{@sorted_elements.join(', ')}" if (range.any? && range.last+1 != idx) range << idx end end range.empty? ? [] : Range.new(range.first, range.last) end end end dep-selector-1.0.3/lib/dep_selector/dep_gecode.rb000066400000000000000000000067521232552612700217410ustar00rootroot00000000000000# # Author:: Daniel DeLeo () # Copyright:: Copyright (c) 2014 Chef Software, Inc. # License:: Apache License, Version 2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # require 'ffi' module Dep_gecode extend FFI::Library lib_dir = File.expand_path("../../", __FILE__) lib_dir_path = Dir["#{lib_dir}/dep_gecode.*"].first ext_dir = File.expand_path("../../../ext/dep_gecode/", __FILE__) ext_dir_path = Dir["#{ext_dir}/dep_gecode.*"].first path = lib_dir_path || ext_dir_path # FFI will load the library by calling LoadLibraryExA. The docs for this # function advise not to use forward slashes (though this does work at least # in at least some cases). # See: http://msdn.microsoft.com/en-us/library/windows/desktop/ms684179(v=vs.85).aspx path.gsub!('/', '\\') if RUBY_PLATFORM =~ /mswin|mingw|windows/ ffi_lib path # VersionProblem * VersionProblemCreate(int packageCount, bool dumpStats, # bool debug, const char * log_id); attach_function :VersionProblemCreate, [:int, :bool, :bool, :string], :pointer # void VersionProblemDestroy(VersionProblem * vp); attach_function :VersionProblemDestroy, [:pointer], :void # int AddPackage(VersionProblem *problem, int min, int max, int currentVersion); attach_function :AddPackage, [:pointer, :int, :int, :int], :int # int VersionProblemSize(VersionProblem *p); attach_function :VersionProblemSize, [:pointer], :int # void MarkPackagePreferredToBeAtLatest(VersionProblem *problem, int packageId, int weight); attach_function :MarkPackagePreferredToBeAtLatest, [:pointer, :int, :int], :void # void MarkPackageRequired(VersionProblem *problem, int packageId); attach_function :MarkPackageRequired, [:pointer, :int], :void # void AddVersionConstraint(VersionProblem *problem, int packageId, int version, # int dependentPackageId, int minDependentVersion, int maxDependentVersion); attach_function :AddVersionConstraint, [:pointer, :int, :int, :int, :int, :int], :void # VersionProblem * Solve(VersionProblem * problem); attach_function :Solve, [:pointer], :pointer # int GetDisabledVariableCount(VersionProblem *problem); attach_function :GetDisabledVariableCount, [:pointer], :int # int GetPackageVersion(VersionProblem *problem, int packageId); attach_function :GetPackageVersion, [:pointer, :int], :int # void MarkPackageSuspicious(VersionProblem *problem, int packageId); attach_function :MarkPackageSuspicious, [:pointer, :int], :void # bool GetPackageDisabledState(VersionProblem *problem, int packageId); attach_function :GetPackageDisabledState, [:pointer, :int], :bool # int VersionProblemPackageCount(VersionProblem *p); attach_function :VersionProblemPackageCount, [:pointer], :int # int GetPackageMax(VersionProblem *problem, int packageId); attach_function :GetPackageMax, [:pointer, :int], :int # int GetPackageMin(VersionProblem *problem, int packageId); attach_function :GetPackageMin, [:pointer, :int], :int end dep-selector-1.0.3/lib/dep_selector/dep_selector_version.rb000066400000000000000000000000531232552612700240640ustar00rootroot00000000000000module DepSelector VERSION = "1.0.3" end dep-selector-1.0.3/lib/dep_selector/dependency.rb000066400000000000000000000027111232552612700217700ustar00rootroot00000000000000# # Author:: Christopher Walters () # Author:: Mark Anderson () # Copyright:: Copyright (c) 2010-2011 Opscode, Inc. # License:: Apache License, Version 2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # require 'dep_selector/version_constraint' module DepSelector class Dependency attr_reader :package, :constraint def initialize(package, constraint=nil) @package = package @constraint = constraint || VersionConstraint.new end def to_s(incl_densely_packed_versions = false) range = package.densely_packed_versions[constraint] "(#{package.name} #{constraint.to_s}#{incl_densely_packed_versions ? " (#{range})" : ''})" end def ==(o) o.respond_to?(:package) && package == o.package && o.respond_to?(:constraint) && constraint == o.constraint end def eql?(o) self.class == o.class && self == o end def hash @hashcode ||= to_s.hash end end end dep-selector-1.0.3/lib/dep_selector/dependency_graph.rb000066400000000000000000000065651232552612700231640ustar00rootroot00000000000000# # Author:: Christopher Walters () # Author:: Mark Anderson () # Copyright:: Copyright (c) 2010-2011 Opscode, Inc. # License:: Apache License, Version 2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # require 'dep_selector/package' require 'dep_selector/gecode_wrapper' # DependencyGraphs contain Packages, which in turn contain # PackageVersions. Packages are created at access-time through # #package module DepSelector class DependencyGraph DebugOptionFile = "/tmp/DepSelectorDebugOn" attr_reader :packages def initialize @packages = {} end def package(name) packages.has_key?(name) ? packages[name] : (packages[name]=Package.new(self, name)) end def each_package packages.each do |name, pkg| yield pkg end end def gecode_wrapper raise "Must invoke generate_gecode_wrapper_constraints before attempting to access gecode_wrapper" unless @gecode_wrapper @gecode_wrapper end # Note: only invoke this method once all Packages and # PackageVersions have been added. def generate_gecode_wrapper_constraints(packages_to_include_in_solve=nil) unless @gecode_wrapper packages_in_solve = if packages_to_include_in_solve packages_to_include_in_solve else packages.map{ |name, pkg| pkg } end debugFlag = DebugOptionFile && File::exists?(DebugOptionFile) # In addition to all the packages that the user specified, # there is a "ghost" package that contains the solution # constraints. See Selector#solve for more information. @gecode_wrapper = GecodeWrapper.new(packages_in_solve.size + 1, debugFlag) packages_in_solve.each{ |pkg| pkg.generate_gecode_wrapper_constraints } end end def gecode_model_vars packages.inject({}){|acc, elt| acc[elt.first] = elt.last.gecode_model_var ; acc } end def to_s(incl_densely_packed_versions = false) packages.keys.sort.map{|name| packages[name].to_s(incl_densely_packed_versions)}.join("\n") end # Does a mostly deep copy of this graph, creating new Package, # PackageVersion, and Dependency objects in the copy graph. Version and # VersionConstraint objects are re-used from the existing graph. def clone copy = self.class.new @packages.each do |name, package| copy_package = copy.package(name) package.versions.each do |package_version| copy_pkg_version = copy_package.add_version(package_version.version) package_version.dependencies.each do |pkg_vers_dep| dep_pkg_name = pkg_vers_dep.package.name copy_dependency = DepSelector::Dependency.new(copy.package(dep_pkg_name), pkg_vers_dep.constraint) copy_pkg_version.dependencies << copy_dependency end end end copy end end end dep-selector-1.0.3/lib/dep_selector/error_reporter.rb000066400000000000000000000016661232552612700227350ustar00rootroot00000000000000# # Author:: Christopher Walters () # Author:: Mark Anderson () # Copyright:: Copyright (c) 2010-2011 Opscode, Inc. # License:: Apache License, Version 2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # module DepSelector class ErrorReporter def give_feedback(workspace, solution_constraints, unsatisfiable_constraint_idx, most_constrained_package) raise "Sub-class must implement" end end end dep-selector-1.0.3/lib/dep_selector/error_reporter/000077500000000000000000000000001232552612700223775ustar00rootroot00000000000000dep-selector-1.0.3/lib/dep_selector/error_reporter/simple_tree_traverser.rb000066400000000000000000000166331232552612700273420ustar00rootroot00000000000000# # Author:: Christopher Walters () # Author:: Mark Anderson () # Copyright:: Copyright (c) 2010-2011 Opscode, Inc. # License:: Apache License, Version 2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # require 'dep_selector/error_reporter' # This error reporter simply maps the versions of packages explicitly # included in the list of solution constraints to the restrictions # placed on the most constrained package. module DepSelector class ErrorReporter class SimpleTreeTraverser < ErrorReporter def give_feedback(dep_graph, soln_constraints, unsatisfiable_constraint_idx, most_constrained_pkg) unsatisfiable_soln_constraint = soln_constraints[unsatisfiable_constraint_idx] feedback = "Unable to satisfy constraints on package #{most_constrained_pkg.name}" feedback << ", which does not exist," unless most_constrained_pkg.valid? feedback << " due to solution constraint #{unsatisfiable_soln_constraint}. " all_paths = paths_from_soln_constraints_to_pkg_constraints(dep_graph, soln_constraints, most_constrained_pkg) collapsed_paths = collapse_adjacent_paths(all_paths).map{|collapsed_path| "[#{print_path(collapsed_path).join(' -> ')}]"} feedback << "Solution constraints that may result in a constraint on #{most_constrained_pkg.name}: #{collapsed_paths.join(', ')}" end private def paths_from_soln_constraints_to_pkg_constraints(dep_graph, soln_constraints, most_constrained_pkg) all_paths = [] soln_constraints.each do |soln_constraint| paths_to_pkg(dep_graph, soln_constraint.package, soln_constraint.constraint, most_constrained_pkg, [], all_paths) end all_paths end def paths_to_pkg(dep_graph, curr_pkg, version_constraint, target_pkg, curr_path, all_paths) if curr_pkg == target_pkg # register the culminating constraint all_paths.push(Array.new(curr_path).push(SolutionConstraint.new(curr_pkg, version_constraint))) return end # curr_pkg has no versions, it is invalid so don't recurse if curr_pkg.versions.empty? # TODO [cw, 2011/2/17]: find a way to track these invalid # packages and return as potential conflict-causing # constraints. return end if curr_path.select{|elt| elt.package == curr_pkg}.any? # TODO [cw, 2011/2/18]: this indicates a circular dependency # in the dependency graph. This might be useful warning # information to report to the user. return end # determine all versions of curr_pkg that match # version_constraint and recurse into them seen_dep_trees = {} curr_pkg[version_constraint].each do |curr_pkg_ver| dep_key = curr_pkg_ver.dependencies next if seen_dep_trees.has_key?(dep_key) curr_path.push(curr_pkg_ver) curr_pkg_ver.dependencies.each do |dep| next if curr_pkg.name == dep.package.name paths_to_pkg(dep_graph, dep.package, dep.constraint, target_pkg, curr_path, all_paths) end seen_dep_trees[dep_key] = true curr_path.pop end end # This is a simple collapsing function. For each adjacent path, # if there is only one element different between the two paths # and their packages are the same (meaning only the version # binding is different), then the elements are considered # collasable. The merged path has all the common elements and a # set containing the two version bindings in place of the # contentious path item. def collapse_adjacent_paths(paths) return paths if paths.length < 2 paths.inject([]) do |collapsed_paths, path| merge_path_into_collapsed_paths(collapsed_paths, path) end end def print_path(path) path.map do |step| if step.respond_to? :version "(#{step.package.name} = #{step.version})" elsif step.respond_to? :constraint step.to_s elsif step.kind_of?(Array) # TODO [cw, 2011/2/23]: consider detecting complete # ranges here instead of calling each out individually "(#{step.first.package.name} = {#{step.map{|elt| "#{elt.version}"}.join(',')}})" else raise "don't know how to print step" end end end # collapses path_under_consideration onto the end of # collapsed_paths or adds a new path to be used in the next # round(s) of collapsing. # # Note: collapsed_paths is side-effected def merge_path_into_collapsed_paths(collapsed_paths, path_under_consideration) curr_collapsed_path = collapsed_paths.last # if there is no curr_collapsed_path or it isn't the same # length as path_under_consideration, then they cannot # possibly be mergeable if curr_collapsed_path.nil? || curr_collapsed_path.length != path_under_consideration.length # TODO [cw.2011/2/7]: do we need this to be a new array, or # can we save ourselves a little memory and work by just # pushing the reference to path_under_consideration? return collapsed_paths << Array.new(path_under_consideration) end # lengths are equal, so find the first path element where # curr_collapsed_path and path_under_consideration diverge, if # that is the only unequal element, it's for the same package, # and they are both PackageVersion objects then merge; # otherwise, this is a new path # # TODO [cw,2011/2/7]: should we merge even if they're not for # the same package? unequal_idx = nil merged_set = nil mergeable = true path_under_consideration.each_with_index do |path_element, curr_idx| if path_element != curr_collapsed_path[curr_idx] unless unequal_idx merged_set = [curr_collapsed_path[curr_idx]].flatten if merged_set.first.package == path_element.package && merged_set.first.is_a?(PackageVersion) && path_element.is_a?(PackageVersion) merged_set << path_element else mergeable = false break end unequal_idx = curr_idx else # this is the second place they are unequal. fast-fail, # because we know we can't merge the paths. mergeable = false break end end end if unequal_idx && mergeable curr_collapsed_path[unequal_idx] = merged_set else collapsed_paths << Array.new(path_under_consideration) end collapsed_paths end end end end dep-selector-1.0.3/lib/dep_selector/exceptions.rb000066400000000000000000000054211232552612700220340ustar00rootroot00000000000000# # Author:: Christopher Walters () # Author:: Mark Anderson () # Copyright:: Copyright (c) 2010-2011 Opscode, Inc. # License:: Apache License, Version 2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # module DepSelector module Exceptions # This exception is what the client of dep_selector should # catch. It contains the solution constraint that introduces # unsatisfiability, as well as the set of packages that are # required to be disabled due to class NoSolutionExists < StandardError attr_reader :message, :unsatisfiable_solution_constraint, :disabled_non_existent_packages, :disabled_most_constrained_packages def initialize(message, unsatisfiable_solution_constraint, disabled_non_existent_packages = [], disabled_most_constrained_packages = []) @message = message @unsatisfiable_solution_constraint = unsatisfiable_solution_constraint @disabled_non_existent_packages = disabled_non_existent_packages @disabled_most_constrained_packages = disabled_most_constrained_packages end end class TimeBoundExceeded < StandardError end class TimeBoundExceededNoSolution < StandardError end # This exception is thrown by gecode_wrapper and only used # internally class NoSolutionFound < StandardError attr_reader :unsatisfiable_problem def initialize(unsatisfiable_problem=nil) @unsatisfiable_problem = unsatisfiable_problem end end # This exception is thrown during Selector#find_solution if any of # the solution constraints make finding solution impossible. The # two cases are if a solution constraint references a package that # doesn't exist or if the constraint on an extant package matches # no versions. class InvalidSolutionConstraints < ArgumentError attr_reader :non_existent_packages, :constrained_to_no_versions def initialize(non_existent_packages, constrained_to_no_versions) @non_existent_packages = non_existent_packages @constrained_to_no_versions = constrained_to_no_versions end end class InvalidVersion < ArgumentError ; end class InvalidVersionConstraint < ArgumentError; end end end dep-selector-1.0.3/lib/dep_selector/gecode_wrapper.rb000066400000000000000000000151701232552612700226430ustar00rootroot00000000000000# # Author:: Christopher Walters () # Author:: Mark Anderson () # Copyright:: Copyright (c) 2010-2011 Opscode, Inc. # License:: Apache License, Version 2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # require 'securerandom' require 'dep_selector/dep_gecode' require 'dep_selector/exceptions' module DepSelector @dump_statistics = false def self.dump_statistics @dump_statistics end def self.dump_statistics=(dump_statistics) @dump_statistics = dump_statistics end class GecodeWrapper attr_reader :gecode_problem attr_reader :debug_logs_on DontCareConstraint = -1 NoMatchConstraint = -2 # This insures that we properly deallocate the c++ class at the heart of dep_gecode. # modeled after http://www.mikeperham.com/2010/02/24/the-trouble-with-ruby-finalizers/ def initialize(problem_or_package_count, debug=false) if (problem_or_package_count.is_a?(Numeric)) logId = SecureRandom.uuid dump_statistics = DepSelector.dump_statistics || debug @debug_logs_on = debug @gecode_problem = Dep_gecode.VersionProblemCreate(problem_or_package_count, dump_statistics, debug, logId) else @gecode_problem = problem_or_package_count end ObjectSpace.define_finalizer(self, self.class.finalize(@gecode_problem)) end def self.finalize(gecode_problem) proc { Dep_gecode.VersionProblemDestroy(gecode_problem) } end def check_package_id(package_id, param_name) raise "Gecode #{param_name} is out of range #{package_id}" unless (package_id >= 0 && package_id < self.size()) end def size() raise "Gecode internal failure" if gecode_problem.nil? Dep_gecode.VersionProblemSize(gecode_problem) end def package_count() raise "Gecode internal failure" if gecode_problem.nil? Dep_gecode.VersionProblemPackageCount(gecode_problem) end def add_package(min, max, current_version) raise "Gecode internal failure" if gecode_problem.nil? Dep_gecode.AddPackage(gecode_problem, min, max, current_version) end def add_version_constraint(package_id, version, dependent_package_id, min_dependent_version, max_dependent_version) raise "Gecode internal failure" if gecode_problem.nil? check_package_id(package_id, "package_id") check_package_id(dependent_package_id, "dependent_package_id") # Valid package versions are between -1 and its max (-1 means # don't care, meaning it doesn't need to be assigned). To # indicate constraints that match no versions, -2 is used, since # it's not a valid assignment of the variable; thus, any branch # that assigns -2 will fail. # # This mechanism is also used when a dependent package has no # versions, which only happens if the dependency's package is # auto-vivified when creating the parent PackageVersion's # dependency but with no corresponding set of PackageVersions # (i.e. it's an invalid deendency, because it does not exist in # the dependency graph). Again, we won't abort immediately, but # we'll add a constraint to the package that makes exploring # that portion of the solution space unsatisfiable. Thus it is # impossible to find solutions dependent on non-existent # packages. min = min_dependent_version || NoMatchConstraint max = max_dependent_version || NoMatchConstraint Dep_gecode.AddVersionConstraint(gecode_problem, package_id, version, dependent_package_id, min, max) # if the package was constrained to no versions, hint to the # solver that in the event of failure, it should prefer to # indicate constraints on dependent_package_id as the culprit if min == NoMatchConstraint && max == NoMatchConstraint Dep_gecode.MarkPackageSuspicious(gecode_problem, dependent_package_id) end end def get_package_version(package_id) raise "Gecode internal failure" if gecode_problem.nil? check_package_id(package_id, "package_id") Dep_gecode.GetPackageVersion(gecode_problem, package_id) end def is_package_disabled?(package_id) raise "Gecode internal failure" if gecode_problem.nil? check_package_id(package_id, "package_id") Dep_gecode.GetPackageDisabledState(gecode_problem, package_id); end def get_package_max(package_id) raise "Gecode internal failure" if gecode_problem.nil? check_package_id(package_id, "package_id") Dep_gecode.GetPackageMax(gecode_problem, package_id) end def get_package_min(package_id) raise "Gecode internal failure" if gecode_problem.nil? check_package_id(package_id, "package_id") Dep_gecode.GetPackageMin(gecode_problem, package_id) end def dump() raise "Gecode internal failure" if gecode_problem.nil? Dep_gecode.VersionProblemDump(gecode_problem) end def dump_package_var(package_id) raise "Gecode internal failure" if gecode_problem.nil? check_package_id(package_id, "package_id") Dep_gecode.VersionProblemPrintPackageVar(gecode_problem, package_id) end def package_disabled_count raise "Gecode internal failure (package disabled count)" if gecode_problem.nil? Dep_gecode.GetDisabledVariableCount(gecode_problem) end def mark_required(package_id) raise "Gecode internal failure (mark_required)" if gecode_problem.nil? check_package_id(package_id, "package_id") Dep_gecode.MarkPackageRequired(gecode_problem, package_id); end def mark_preferred_to_be_at_latest(package_id, weight) raise "Gecode internal failure (mark_preferred_to_be_at_latest)" if gecode_problem.nil? check_package_id(package_id, "package_id") Dep_gecode.MarkPackagePreferredToBeAtLatest(gecode_problem, package_id, weight); end def solve() raise "Gecode internal failure (solve)" if gecode_problem.nil? solution = GecodeWrapper.new(Dep_gecode.Solve(gecode_problem), debug_logs_on) raise "Gecode internal failure (no solution found)" if (solution.nil?) raise Exceptions::NoSolutionFound.new(solution) if solution.package_disabled_count > 0 solution end end end dep-selector-1.0.3/lib/dep_selector/package.rb000066400000000000000000000106361232552612700212520ustar00rootroot00000000000000# # Author:: Christopher Walters () # Author:: Mark Anderson () # Copyright:: Copyright (c) 2010-2011 Opscode, Inc. # License:: Apache License, Version 2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # require 'dep_selector/package_version' require 'dep_selector/densely_packed_set' module DepSelector class Package attr_reader :dependency_graph, :name, :versions def initialize(dependency_graph, name) @dependency_graph = dependency_graph @name = name @versions = [] end def add_version(version) versions << (pv = PackageVersion.new(self, version)) pv end # Note: only invoke this method after all PackageVersions have been added def densely_packed_versions @densely_packed_versions ||= DenselyPackedSet.new(versions.map{|pkg_version| pkg_version.version}) end # Given a version, this method returns the corresonding # PackageVersion. Given a version constraint, this method returns # an array of matching PackageVersions. #-- # TODO [cw,2011/2/4]: rationalize this with DenselyPackedSet#[] def [](version_or_constraint) # version constraints must abide the include? contract if version_or_constraint.respond_to?(:include?) versions.select do |ver| version_or_constraint.include?(ver.version) end else versions.find{|pkg_version| pkg_version.version == version_or_constraint} end end # A Package is considered valid if it has at least one version def valid? versions.any? end def to_s(incl_densely_packed_versions = false) components = [] components << "Package #{name}" if incl_densely_packed_versions components << " (#{densely_packed_versions.range})" end versions.each{|version| components << "\n #{version.to_s(incl_densely_packed_versions)}"} components.flatten.join end # Note: only invoke this method after all PackageVersions have been added def gecode_package_id # Note: gecode does naive bounds propagation at every post, # which means that any package with exactly one version is # considered bound and its dependencies propagated even though # there might not be a solution constraint that requires that # package to be bound, which means that otherwise-irrelevant # constraints (e.g. A1->B1 when the solution constraint is B=2 # and there is nothing to induce a dependency on A) can cause # unsatisfiability. Therefore, we want every package to have at # least two versions, one of which is neither the target of # other packages' dependencies nor induces other # dependencies. Package version id -1 serves this purpose. # # TODO [cw, 2011/2/22]: Do we likewise want to leave packages # with no versions (the target of an invalid dependency) with # two versions in order to allow the solver to explore the # invalid portion of the state space instead of naively limiting # it for the purposes of having failure count heuristics? max = densely_packed_versions.range.max || -1 @gecode_package_id ||= dependency_graph.gecode_wrapper.add_package(-1, max, 0) end def generate_gecode_wrapper_constraints # if this is a valid package (has versions), we don't need to # explicitly call gecode_package_id, because they will do it for # us; however, if this package isn't valid (it only exists as an # invalid dependency and thus has no versions), the solver gets # confused, because we won't have generated its package id by # the time it starts solving. gecode_package_id versions.each{|version| version.generate_gecode_wrapper_constraints } end def eql?(o) # TODO [cw,2011/2/7]: this is really shallow. should implement # == for DependencyGraph self.class == o.class && name == o.name end alias :== :eql? end end dep-selector-1.0.3/lib/dep_selector/package_version.rb000066400000000000000000000041721232552612700230150ustar00rootroot00000000000000# # Author:: Christopher Walters () # Author:: Mark Anderson () # Copyright:: Copyright (c) 2010-2011 Opscode, Inc. # License:: Apache License, Version 2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # module DepSelector class PackageVersion attr_accessor :package, :version, :dependencies def initialize(package, version) @package = package @version = version @dependencies = [] end def generate_gecode_wrapper_constraints pkg_densely_packed_version = package.densely_packed_versions.index(version) dependencies.each do |dep| dep_pkg_range = dep.package.densely_packed_versions[dep.constraint] package.dependency_graph.gecode_wrapper.add_version_constraint(package.gecode_package_id, pkg_densely_packed_version, dep.package.gecode_package_id, dep_pkg_range.min, dep_pkg_range.max) end end def to_s(incl_densely_packed_versions = false) components = [] components << "#{version}" if incl_densely_packed_versions components << " (#{package.densely_packed_versions.index(version)})" end components << " -> [#{dependencies.map{|d|d.to_s(incl_densely_packed_versions)}.join(', ')}]" components.join end def hash # Didn't put any thought or research into this, probably can be # done better to_s.hash end def eql?(o) o.class == self.class && package == o.package && version == o.version && dependencies == o.dependencies end alias :== :eql? def to_hash { :package_name => package.name, :version => version } end end end dep-selector-1.0.3/lib/dep_selector/selector.rb000066400000000000000000000277501232552612700215040ustar00rootroot00000000000000# # Author:: Christopher Walters () # Author:: Mark Anderson () # Copyright:: Copyright (c) 2010-2011 Opscode, Inc. # License:: Apache License, Version 2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # require 'timeout' require 'dep_selector/dependency_graph' require 'dep_selector/exceptions' require 'dep_selector/error_reporter' require 'dep_selector/error_reporter/simple_tree_traverser' # A Selector contains the a DependencyGraph, which is populated with # the dependency relationships, and an array of solution # constraints. When a solution is asked for (via #find_solution), # either a valid assignment is returned or the first solution # constraint that makes a solution impossible. module DepSelector class Selector attr_accessor :dep_graph, :error_reporter, :time_bound DEFAULT_ERROR_REPORTER = ErrorReporter::SimpleTreeTraverser.new def initialize(dep_graph, time_bound = 5, error_reporter = DEFAULT_ERROR_REPORTER) @dep_graph = dep_graph @time_bound = time_bound @error_reporter = error_reporter end # Based on solution_constraints, this method tries to find an # assignment of PackageVersions that is compatible with the # DependencyGraph. If one cannot be found, the constraints are # added one at a time until the first unsatisfiable constraint is # detected. Once the unsatisfiable solution constraint is # identified, required non-existent packages and the most # constrained packages are identified and thrown in a # NoSolutionExists exception. # # If a solution constraint refers to a package that doesn't exist # or the constraint matches no versions, it is considered # invalid. All invalid solution constraints are collected and # raised in an InvalidSolutionConstraints exception. If # valid_packages is non-nil, it is considered the authoritative # list of extant Packages; otherwise, Package#valid? is used. This # is useful if the dependency graph represents an already filtered # set of packages such that a Package actually exists in your # domain but is added to the dependency graph with no versions, in # which case Package#valid? would return false even though we # don't want to report that the package is non-existent. def find_solution(solution_constraints, valid_packages = nil) # this is a performance optimization so that packages that are # completely unreachable by the solution constraints don't get # added to the CSP packages_to_include_in_solve = trim_unreachable_packages(dep_graph, solution_constraints) begin Timeout::timeout(@time_bound, Exceptions::TimeBoundExceeded) do # first, try to solve the whole set of constraints solve(dep_graph.clone, solution_constraints, valid_packages, packages_to_include_in_solve) end rescue Exceptions::NoSolutionFound # since we're here, solving the whole system failed, so add # the solution_constraints one-by-one and try to solve in # order to find the constraint that breaks the system in order # to give helpful debugging info # # TODO [cw,2010/11/28]: for an efficiency gain, instead of # continually re-building the problem and looking for a # solution, turn solution_constraints into a Generator and # iteratively add and solve in order to re-use # propagations. This will require separating setting up the # constraints from searching for the solution. Timeout::timeout(@time_bound, Exceptions::TimeBoundExceededNoSolution) do solution_constraints.each_index do |idx| workspace = dep_graph.clone begin solve(workspace, solution_constraints[0..idx], valid_packages, packages_to_include_in_solve) rescue Exceptions::NoSolutionFound => nsf disabled_packages = packages_to_include_in_solve.inject([]) do |acc, elt| pkg = workspace.package(elt.name) acc << pkg if nsf.unsatisfiable_problem.is_package_disabled?(pkg.gecode_package_id) acc end # disambiguate between packages disabled becuase they # don't exist and those that have otherwise problematic # constraints disabled_non_existent_packages = [] disabled_most_constrained_packages = [] disabled_packages.each do |disabled_pkg| disabled_collection = if disabled_pkg.valid? || (valid_packages && valid_packages.include?(disabled_pkg)) disabled_most_constrained_packages else disabled_non_existent_packages end disabled_collection << disabled_pkg end # Pick the first non-existent or most-constrained package # that was required or the package whose constraints had # to be disabled in order to find a solution and generate # feedback for it. We only report feedback for one # package, because it is in fact actionable and dispalying # feedback for every disabled package would probably be # too long. The full set of disabled packages is # accessible in the NoSolutionExists exception. disabled_package_to_report_on = disabled_non_existent_packages.first || disabled_most_constrained_packages.first feedback = error_reporter.give_feedback(dep_graph, solution_constraints, idx, disabled_package_to_report_on) raise Exceptions::NoSolutionExists.new(feedback, solution_constraints[idx], disabled_non_existent_packages, disabled_most_constrained_packages) end end end end end private # Given a workspace (a clone of the dependency graph) and an array # of SolutionConstraints, this method attempts to find a # satisfiable set of pairs. def solve(workspace, solution_constraints, valid_packages, packages_to_include_in_solve) # map packages in packages_to_include_in_solve into # corresponding workspace packages and generate constraints # imposed by the dependency graph packages_in_solve = packages_to_include_in_solve.map{|pkg| workspace.package(pkg.name)} workspace.generate_gecode_wrapper_constraints(packages_in_solve) # validate solution_constraints and generate its constraints process_soln_constraints(workspace, solution_constraints, valid_packages) # solve and trim the solution down to only the soln = workspace.gecode_wrapper.solve trim_solution(solution_constraints, soln, workspace) end # This method validates SolutionConstraints and adds their # corresponding constraints to the workspace. def process_soln_constraints(workspace, solution_constraints, valid_packages) gecode = workspace.gecode_wrapper # create shadow package whose dependencies are the solution constraints soln_constraints_pkg_id = gecode.add_package(0, 0, 0) soln_constraints_on_non_existent_packages = [] soln_constraints_that_match_no_versions = [] # generate constraints imposed by solution_constraints solution_constraints.each do |soln_constraint| # look up the package in the cloned dep_graph that corresponds to soln_constraint pkg_name = soln_constraint.package.name pkg = workspace.package(pkg_name) constraint = soln_constraint.constraint # record invalid solution constraints and raise an exception # afterwards unless pkg.valid? || (valid_packages && valid_packages.include?(pkg)) soln_constraints_on_non_existent_packages << soln_constraint next end if pkg[constraint].empty? soln_constraints_that_match_no_versions << soln_constraint next end pkg_id = pkg.gecode_package_id gecode.mark_preferred_to_be_at_latest(pkg_id, 10) gecode.mark_required(pkg_id) if constraint acceptable_versions = pkg.densely_packed_versions[constraint] gecode.add_version_constraint(soln_constraints_pkg_id, 0, pkg_id, acceptable_versions.min, acceptable_versions.max) else # this restricts the domain of the variable to >= 0, which # means -1, the shadow package, cannot be assigned, meaning # the package must be bound to an actual version gecode.add_version_constraint(soln_constraints_pkg_id, 0, pkg_id, 0, pkg.densely_packed_versions.range.max) end end if soln_constraints_on_non_existent_packages.any? || soln_constraints_that_match_no_versions.any? raise Exceptions::InvalidSolutionConstraints.new(soln_constraints_on_non_existent_packages, soln_constraints_that_match_no_versions) end end # Given an assignment of versions to packages, filter down to only # the required assignments def trim_solution(soln_constraints, soln, workspace) trimmed_soln = {} soln_constraints.each do |soln_constraint| package = workspace.package(soln_constraint.package.name) expand_package(trimmed_soln, package, soln) end trimmed_soln end def expand_package(trimmed_soln, package, soln) # don't expand packages that we've already expanded return if trimmed_soln.has_key?(package.name) # add the package's assignment to the trimmed solution densely_packed_version = soln.get_package_version(package.gecode_package_id) version = package.densely_packed_versions.sorted_elements[densely_packed_version] trimmed_soln[package.name] = version # expand the package's dependencies pkg_version = package[version] pkg_version.dependencies.each do |pkg_dep| expand_package(trimmed_soln, pkg_dep.package, soln) end end # Given a workspace and solution constraints, this method returns # an array that includes only packages that can be induced by the # solution constraints. def trim_unreachable_packages(workspace, soln_constraints) reachable_packages = [] soln_constraints.each do |soln_constraint| find_reachable_packages(workspace, soln_constraint.package, soln_constraint.constraint, reachable_packages) end reachable_packages end def find_reachable_packages(workspace, curr_pkg, version_constraint, reachable_packages) # TODO [cw, 2011/3/11]: if we really want to minimize the number # of packages we add to reachable_packages, we should go back to # expanding only the versions of curr_pkg that meet # version_constraint and modify the early exit in this method to # trigger on PackageVersions, not just Package. # don't follow circular paths or duplicate work return if reachable_packages.include?(curr_pkg) # add curr_pkg to reachable_packages and expand its versions' # dependencies reachable_packages << curr_pkg curr_pkg.versions.each do |curr_pkg_ver| curr_pkg_ver.dependencies.each do |dep| find_reachable_packages(workspace, dep.package, dep.constraint, reachable_packages) end end end end end dep-selector-1.0.3/lib/dep_selector/solution_constraint.rb000066400000000000000000000015141232552612700237720ustar00rootroot00000000000000# # Author:: Christopher Walters () # Author:: Mark Anderson () # Copyright:: Copyright (c) 2010-2011 Opscode, Inc. # License:: Apache License, Version 2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # require 'dep_selector/dependency' class DepSelector::SolutionConstraint < DepSelector::Dependency ; end dep-selector-1.0.3/lib/dep_selector/version.rb000066400000000000000000000034671232552612700213500ustar00rootroot00000000000000# # Author:: Seth Falcon () # Author:: Christopher Walters () # Copyright:: Copyright 2010-2011 Opscode, Inc. # License:: Apache License, Version 2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # require 'dep_selector/exceptions' module DepSelector class Version include Comparable attr_reader :major, :minor, :patch def initialize(str="") @major, @minor, @patch = parse(str) end def inspect "#{@major}.#{@minor}.#{@patch}" end def to_s "#{@major}.#{@minor}.#{@patch}" end def <=>(v) [:major, :minor, :patch].each do |method| ans = (self.send(method) <=> v.send(method)) return ans if ans != 0 end 0 end def hash # Didn't put any thought or research into this, probably can be # done better to_s.hash end # For hash def eql?(other) other.is_a?(Version) && self == other end private def parse(str="") @major, @minor, @patch = case str.to_s when /^(\d+)\.(\d+)\.(\d+)$/ [ $1.to_i, $2.to_i, $3.to_i ] when /^(\d+)\.(\d+)$/ [ $1.to_i, $2.to_i, 0 ] else msg = "'#{str.to_s}' does not match 'x.y.z' or 'x.y'" raise Exceptions::InvalidVersion.new msg end end end end dep-selector-1.0.3/lib/dep_selector/version_constraint.rb000066400000000000000000000066641232552612700236160ustar00rootroot00000000000000# # Author:: Seth Falcon () # Copyright:: Copyright 2010-2011 Opscode, Inc. # License:: Apache License, Version 2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # require 'dep_selector/version' require 'dep_selector/exceptions' module DepSelector class VersionConstraint DEFAULT_CONSTRAINT = ">= 0.0.0" STANDARD_OPS = %w(< > <= >=) OPS = %w(< > = <= >= ~>) PATTERN = /^(#{OPS.join('|')}) (.+)$/ attr_reader :op, :version def initialize(constraint_spec=nil) constraint_spec ||= DEFAULT_CONSTRAINT case constraint_spec when nil parse(DEFAULT_CONSTRAINT) when Array parse_from_array(constraint_spec) when String parse(constraint_spec) else msg = "VersionConstraint should be created from a String. You gave: #{constraint_spec.inspect}" raise Exceptions::InvalidVersionConstraint, msg end end def include?(v) version = if v.kind_of?(Version) v elsif v.respond_to? :version Version.new(v.version.to_s) else Version.new(v.to_s) end do_op(version) end def inspect "(#{@op} #{@version})" end def to_s "#{@op} #{@version}" end def eql?(o) o.class == self.class && @op == o.op && @version == o.version end alias_method :==, :eql? private def do_op(other_version) if STANDARD_OPS.include? @op other_version.send(@op.to_sym, @version) elsif @op == '=' other_version == @version elsif @op == '~>' if @missing_patch_level (other_version.major == @version.major && other_version.minor >= @version.minor) else (other_version.major == @version.major && other_version.minor == @version.minor && other_version.patch >= @version.patch) end else # should never happen raise "bad op #{@op}" end end def parse_from_array(constraint_spec) if constraint_spec.empty? parse(DEFAULT_CONSTRAINT) elsif constraint_spec.size == 1 parse(constraint_spec.first) else msg = "only one version constraint operation is supported, but you gave #{constraint_spec.size} " msg << "['#{constraint_spec.join(', ')}']" raise Exceptions::InvalidVersionConstraint, msg end end def parse(str) @missing_patch_level = false if str.index(" ").nil? && str =~ /^[0-9]/ # try for lone version, implied '=' @version = Version.new(str) @op = "=" elsif PATTERN.match str @op = $1 raw_version = $2 @version = Version.new(raw_version) if raw_version.split('.').count == 2 @missing_patch_level = true end else raise Exceptions::InvalidVersionConstraint, "'#{str}'" end end end end dep-selector-1.0.3/nativecode/000077500000000000000000000000001232552612700162275ustar00rootroot00000000000000dep-selector-1.0.3/nativecode/simple_dependency.cpp000066400000000000000000000132561232552612700224310ustar00rootroot00000000000000/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ #include #include #include using namespace Gecode; // // g++ -g simple_dependency.cpp -lgecodesupport -lgecodekernel -lgecodeint -lgecodesearch -lgecodedriver -lpthread -ldl -lstdc++ -o simple_dependency // class SimpleDependency : public MinimizeScript { protected: static const int PKG_COUNT = 11; IntVarArray package_versions; IntArgs disabled_package_weights; BoolVarArray disabled_package_variables; IntVar total_disabled; public: /// Actual model SimpleDependency(const Options& opt) : package_versions(*this, PKG_COUNT, -1, 10), disabled_package_variables(*this, PKG_COUNT, 0, 1), total_disabled(*this, 0, 10*PKG_COUNT) { Problem2(); branch(*this, disabled_package_variables, INT_VAR_SIZE_MIN, INT_VAL_MIN); branch(*this, package_versions, INT_VAR_SIZE_MIN, INT_VAL_MAX); branch(*this, total_disabled, INT_VAL_MIN); } void SetupDomain1() { dom(*this, package_versions[0], -1, 0); dom(*this, package_versions[1], -1, 1); dom(*this, package_versions[2], -1, 0); dom(*this, package_versions[3], -1, 1); dom(*this, package_versions[4], -1, 0); dom(*this, package_versions[5], -1, 0); dom(*this, package_versions[6], -1, 2); dom(*this, package_versions[7], -1, 0); dom(*this, package_versions[8], -1, 0); dom(*this, package_versions[9], -1, -1); dom(*this, package_versions[10], 0, 0); } void SetupDependencies1() { AddVersionConstraint(0, 0, 1, 0, 1); AddVersionConstraint(2, 0, 1, 0, 0); AddVersionConstraint(1, 0, 3, 0, 1); AddVersionConstraint(1, 0, 4, 0, 0); AddVersionConstraint(1, 1, 3, 1, 1); AddVersionConstraint(1, 1, 5, 0, 0); AddVersionConstraint(7, 0, 3, -2, -2); AddVersionConstraint(8, 0, 9, -2, -2); AddVersionConstraint(10, 0, 7, 0, 0); } void Problem1() { std::cout << "Setting up " << __FUNCTION__ << std::endl; SetupDomain1(); SetupDependencies1(); IntArgs package_weights(PKG_COUNT, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10); linear(*this, package_weights, disabled_package_variables, IRT_EQ, total_disabled); std::cout << "Package versions: " << package_versions << std::endl; std::cout << "Disabled package variables: " << disabled_package_variables << std::endl; std::cout << "Package weights " << package_weights << std::endl; std::cout << "Total disabled: " << total_disabled << std::endl; } void Problem2() { std::cout << "Setting up " << __FUNCTION__ << std::endl; SetupDomain1(); SetupDependencies1(); // IntArgs package_weights(PKG_COUNT, 10, 10, 10, 10, 10, 10, 10, 5, 10, 10 ); // 0 1 2 3 4 5 6 7 8 9 10 IntArgs package_weights(PKG_COUNT, 10, 10, 10, 01, 10, 10, 10, 10, 10, 01, 10 ); linear(*this, package_weights, disabled_package_variables, IRT_EQ, total_disabled); std::cout << "Package versions: " << package_versions << std::endl; std::cout << "Disabled package variables: " << disabled_package_variables << std::endl; std::cout << "Package weights " << package_weights << std::endl; std::cout << "Total disabled: " << total_disabled << std::endl; } bool AddVersionConstraint(int packageId, int version, int dependentPackageId, int minDependentVersion, int maxDependentVersion) { BoolVar version_match(*this, 0, 1); BoolVar depend_match(*this, 0, 1); BoolVar predicated_depend_match(*this, 0, 1); std::cout << "Add VC for " << packageId << " @ " << version << " depPkg " << dependentPackageId; std::cout << " [ " << minDependentVersion << ", " << maxDependentVersion << " ]" << std::endl; std::cout.flush(); //version_flags << version_match; // Constrain pred to reify package @ version rel(*this, package_versions[packageId], IRT_EQ, version, version_match); // Add the predicated version constraints imposed on dependent package dom(*this, package_versions[dependentPackageId], minDependentVersion, maxDependentVersion, depend_match); // disabled_package_variables[dependentPackageId] OR depend_match <=> version_match rel(*this, disabled_package_variables[dependentPackageId], BOT_OR, depend_match, predicated_depend_match); rel(*this, version_match, BOT_IMP, predicated_depend_match, 1); } /// Print solution virtual void print(std::ostream& os) const { os << "\t" << package_versions << std::endl; os << "\t" << disabled_package_variables << std::endl; os << "\t" << total_disabled << std::endl; } virtual IntVar cost() const { return total_disabled; } /// Constructor for cloning \a s SimpleDependency(bool share, SimpleDependency& s) : MinimizeScript(share,s), package_versions(s.package_versions), disabled_package_variables(s.disabled_package_variables), total_disabled(s.total_disabled) { package_versions.update(*this, share, s.package_versions); disabled_package_variables.update(*this, share, s.disabled_package_variables); total_disabled.update(*this, share, s.total_disabled); } /// Copy during cloning virtual Space* copy(bool share) { return new SimpleDependency(share,*this); } }; /** \brief Main-function * \relates Money */ int main(int argc, char* argv[]) { Options opt("Solve dependency"); opt.solutions(0); opt.iterations(20000); opt.parse(argc,argv); for (int i = 0; i < 1; i++) // MinimizeScript::run(opt); MinimizeScript::run(opt); return 0; } // STATISTICS: example-any dep-selector-1.0.3/nativecode/simple_dependency_opt.cpp000066400000000000000000000135041232552612700233070ustar00rootroot00000000000000/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ #include #include #include using namespace Gecode; // // g++ -g simple_dependency.cpp -lgecodesupport -lgecodekernel -lgecodeint -lgecodesearch -lgecodedriver -lpthread -ldl -lstdc++ -o simple_dependency // class SimpleDependency : public Script { protected: static const int PKG_COUNT = 11; IntVarArray package_versions; IntArgs disabled_package_weights; BoolVarArray disabled_package_variables; IntVar total_disabled; public: /// Actual model SimpleDependency(const Options& opt) : package_versions(*this, PKG_COUNT, -1, 10), disabled_package_variables(*this, PKG_COUNT, 0, 1), total_disabled(*this, 0, 10*PKG_COUNT) { Problem2(); branch(*this, disabled_package_variables, INT_VAR_SIZE_MIN, INT_VAL_MIN); branch(*this, package_versions, INT_VAR_SIZE_MIN, INT_VAL_MAX); branch(*this, total_disabled, INT_VAL_MIN); } void SetupDomain1() { dom(*this, package_versions[0], -1, 0); dom(*this, package_versions[1], -1, 1); dom(*this, package_versions[2], -1, 0); dom(*this, package_versions[3], -1, 1); dom(*this, package_versions[4], -1, 0); dom(*this, package_versions[5], -1, 0); dom(*this, package_versions[6], -1, 2); dom(*this, package_versions[7], -1, 0); dom(*this, package_versions[8], -1, 0); dom(*this, package_versions[9], -1, -1); dom(*this, package_versions[10], 0, 0); } void SetupDependencies1() { AddVersionConstraint(0, 0, 1, 0, 1); AddVersionConstraint(2, 0, 1, 0, 0); AddVersionConstraint(1, 0, 3, 0, 1); AddVersionConstraint(1, 0, 4, 0, 0); AddVersionConstraint(1, 1, 3, 1, 1); AddVersionConstraint(1, 1, 5, 0, 0); AddVersionConstraint(7, 0, 3, -2, -2); AddVersionConstraint(8, 0, 9, -2, -2); AddVersionConstraint(10, 0, 7, 0, 0); } void Problem1() { std::cout << "Setting up " << __FUNCTION__ << std::endl; SetupDomain1(); SetupDependencies1(); IntArgs package_weights(PKG_COUNT, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10); linear(*this, package_weights, disabled_package_variables, IRT_EQ, total_disabled); std::cout << "Package versions: " << package_versions << std::endl; std::cout << "Disabled package variables: " << disabled_package_variables << std::endl; std::cout << "Package weights " << package_weights << std::endl; std::cout << "Total disabled: " << total_disabled << std::endl; } void Problem2() { std::cout << "Setting up " << __FUNCTION__ << std::endl; SetupDomain1(); SetupDependencies1(); // IntArgs package_weights(PKG_COUNT, 10, 10, 10, 10, 10, 10, 10, 5, 10, 10 ); // 0 1 2 3 4 5 6 7 8 9 10 IntArgs package_weights(PKG_COUNT, 10, 10, 10, 01, 10, 10, 10, 10, 10, 01, 10 ); linear(*this, package_weights, disabled_package_variables, IRT_EQ, total_disabled); std::cout << "Package versions: " << package_versions << std::endl; std::cout << "Disabled package variables: " << disabled_package_variables << std::endl; std::cout << "Package weights " << package_weights << std::endl; std::cout << "Total disabled: " << total_disabled << std::endl; } bool AddVersionConstraint(int packageId, int version, int dependentPackageId, int minDependentVersion, int maxDependentVersion) { BoolVar version_match(*this, 0, 1); BoolVar depend_match(*this, 0, 1); BoolVar predicated_depend_match(*this, 0, 1); std::cout << "Add VC for " << packageId << " @ " << version << " depPkg " << dependentPackageId; std::cout << " [ " << minDependentVersion << ", " << maxDependentVersion << " ]" << std::endl; std::cout.flush(); //version_flags << version_match; // Constrain pred to reify package @ version rel(*this, package_versions[packageId], IRT_EQ, version, version_match); // Add the predicated version constraints imposed on dependent package dom(*this, package_versions[dependentPackageId], minDependentVersion, maxDependentVersion, depend_match); // disabled_package_variables[dependentPackageId] OR depend_match <=> version_match rel(*this, disabled_package_variables[dependentPackageId], BOT_OR, depend_match, predicated_depend_match); rel(*this, version_match, BOT_IMP, predicated_depend_match, 1); } /// Print solution virtual void print(std::ostream& os) const { os << "\t" << package_versions << std::endl; os << "\t" << disabled_package_variables << std::endl; os << "\t" << total_disabled << std::endl; } virtual void constrain(const Space & _b) { const SimpleDependency& b = static_cast(_b); int total_disabled_value = b.total_disabled.val(); rel(*this, total_disabled, IRT_LE, total_disabled_value); } /// Constructor for cloning \a s SimpleDependency(bool share, SimpleDependency& s) : Script(share,s), package_versions(s.package_versions), disabled_package_variables(s.disabled_package_variables), total_disabled(s.total_disabled) { package_versions.update(*this, share, s.package_versions); disabled_package_variables.update(*this, share, s.disabled_package_variables); total_disabled.update(*this, share, s.total_disabled); } /// Copy during cloning virtual Space* copy(bool share) { return new SimpleDependency(share,*this); } }; /** \brief Main-function * \relates Money */ int main(int argc, char* argv[]) { Options opt("Solve dependency"); opt.solutions(0); opt.iterations(20000); opt.parse(argc,argv); for (int i = 0; i < 1; i++) // Script::run(opt); Script::run(opt); return 0; } // STATISTICS: example-any dep-selector-1.0.3/nativecode/test.cpp000066400000000000000000000112601232552612700177120ustar00rootroot00000000000000#include #include "ext/dep_gecode/dep_selector_to_gecode_interface.h" // build: g++ test.cpp -o test ext/gecode/dep_selector_to_gecode_interface.o ext/gecode/dep_selector_to_gecode.o -lgecodesupport -lgecodekernel -lgecodeint -lgecodesearch using namespace std; int problem_nosol() { VersionProblem* problem = VersionProblemCreate(10); // package A has versions 0, 1v int pkg_a = AddPackage(problem, 0, 1, 1); // package B has versions 0, 1 int pkg_b = AddPackage(problem, 0, 1, 1); // package C has versions 0, 1 int pkg_c = AddPackage(problem, 0, 1, 0); // A0 depends on B1 AddVersionConstraint(problem, pkg_a, 0, pkg_b, 1, 1); // A1 depends on B0, C0 AddVersionConstraint(problem, pkg_a, 0, pkg_b, 0, 0); AddVersionConstraint(problem, pkg_a, 0, pkg_c, 0, 0); // B1 depends on C10, which doesn't even exist... AddVersionConstraint(problem, pkg_b, 1, pkg_c, 10, 10); // metapackage is a "ghost" package whose dependencies are the // solution constraints; thereby forcing packages to be // appropriately constrained int metapkg = AddPackage(problem, 0, 0, 0); cout << "before adding solution constraints" << endl; VersionProblemPrintPackageVar(problem, pkg_a); cout << endl; VersionProblemPrintPackageVar(problem, pkg_b); cout << endl; VersionProblemPrintPackageVar(problem, pkg_c); cout << endl; VersionProblemPrintPackageVar(problem, metapkg); cout << endl; // solution constraints: [A,(B=0)], which is satisfiable as A=1, B=0 // AddVersionConstraint(problem, metapkg, 0, pkg_a, 0, 1); //AddVersionConstraint(problem, metapkg, 0, pkg_b, 0, 0); // solution constraints: [(A=0),(B=0)], which is not satisfiable AddVersionConstraint(problem, metapkg, 0, pkg_a, 0, 0); AddVersionConstraint(problem, metapkg, 0, pkg_b, 0, 0); cout << "after adding solution constraints" << endl; VersionProblemPrintPackageVar(problem, pkg_a); cout << endl; VersionProblemPrintPackageVar(problem, pkg_b); cout << endl; VersionProblemPrintPackageVar(problem, pkg_c); cout << endl; VersionProblemPrintPackageVar(problem, metapkg); cout << endl; VersionProblem *solution = Solve(problem); if (solution != NULL) { // solve and interrogate problem cout << "after running solve" << endl; VersionProblemDump(solution); VersionProblemDestroy(solution); } else { cout << "No solution" << endl; } VersionProblemDestroy(problem); } int problem_sol() { VersionProblem* problem = VersionProblemCreate(10); // package A has versions 0, 1v int pkg_a = AddPackage(problem, 0, 1, 1); // package B has versions 0, 1 int pkg_b = AddPackage(problem, 0, 1, 1); // package C has versions 0 int pkg_c = AddPackage(problem, 0, 0, 0); // A0 depends on B1 AddVersionConstraint(problem, pkg_a, 0, pkg_b, 1, 1); // A1 depends on B0, C0 AddVersionConstraint(problem, pkg_a, 0, pkg_b, 0, 0); AddVersionConstraint(problem, pkg_a, 0, pkg_c, 0, 0); // metapackage is a "ghost" package whose dependencies are the // solution constraints; thereby forcing packages to be // appropriately constrained int metapkg = AddPackage(problem, 0, 0, 0); cout << "before adding solution constraints" << endl; VersionProblemPrintPackageVar(problem, pkg_a); cout << endl; VersionProblemPrintPackageVar(problem, pkg_b); cout << endl; VersionProblemPrintPackageVar(problem, pkg_c); cout << endl; VersionProblemPrintPackageVar(problem, metapkg); cout << endl; // solution constraints: [A,(B=0)], which is satisfiable as A=1, B=0 AddVersionConstraint(problem, metapkg, 0, pkg_a, 0, 1); AddVersionConstraint(problem, metapkg, 0, pkg_b, 0, 0); // solution constraints: [(A=0),(B=0)], which is not satisfiable //AddVersionConstraint(problem, metapkg, 0, pkg_a, 0, 0); //AddVersionConstraint(problem, metapkg, 0, pkg_b, 0, 0); cout << "after adding solution constraints" << endl; VersionProblemPrintPackageVar(problem, pkg_a); cout << endl; VersionProblemPrintPackageVar(problem, pkg_b); cout << endl; VersionProblemPrintPackageVar(problem, pkg_c); cout << endl; VersionProblemPrintPackageVar(problem, metapkg); cout << endl; VersionProblem *solution = Solve(problem); if (solution != NULL) { // solve and interrogate problem cout << "after running solve" << endl; VersionProblemPrintPackageVar(solution, pkg_a); cout << endl; VersionProblemPrintPackageVar(solution, pkg_b); cout << endl; VersionProblemPrintPackageVar(solution, pkg_c); cout << endl; VersionProblemPrintPackageVar(solution, metapkg); cout << endl; VersionProblemDestroy(solution); } else { cout << "No solution" << endl; } VersionProblemDestroy(problem); } int main() { problem_nosol(); problem_sol(); } dep-selector-1.0.3/scripts/000077500000000000000000000000001232552612700155755ustar00rootroot00000000000000dep-selector-1.0.3/scripts/dep_selector_perf.rb000066400000000000000000000064051232552612700216130ustar00rootroot00000000000000# # Author:: Christopher Walters () # Author:: Mark Anderson () # Copyright:: Copyright (c) 2010-2011 Opscode, Inc. # License:: Apache License, Version 2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # require 'dep_selector' Base_Constraint = { "A_001"=>{ "1.0"=>{"B_001"=>"= 2.0"}, "2.0"=>{"B_001"=>"= 1.0", "D_001"=>"= 1.0", "E_001"=>"= 1.0"} }, "B_001"=> { "1.0"=>{"C_001"=>"= 2.0"}, "2.0"=>{"C_001"=>"= 1.0"} }, "C_001"=> { "1.0"=>{}, "2.0"=>{} }, "D_001"=> { "1.0"=>{}, "2.0"=>{} }, "E_001"=> { "1.0"=>{}, "2.0"=>{} }, } def gen_next(base) base_succ = {} return base unless base.is_a?(Hash) base.each_pair do |key,value| if key =~ /^[A-Z]/ base_succ[key.succ] = gen_next(value) else base_succ[key] = gen_next(value) end end base_succ end def build_ugly_constraint(base,count) constraint = {} cur = base; (1..count).each do |x| constraint.merge!(cur) cur = gen_next(cur) end constraint end def setup_constraint(dep_graph, cset) cset.keys.sort.each do |package_name| version_spec = cset[package_name] version_spec.keys.sort.each do |cb_version| dependencies = version_spec[cb_version] version = DepSelector::Version.new(cb_version) pv = dep_graph.package(package_name).add_version(version) dependencies.keys.sort.each do |dep_name| constraint_str = dependencies[dep_name] constraint = DepSelector::VersionConstraint.new(constraint_str) pv.dependencies << DepSelector::Dependency.new(dep_graph.package(dep_name), constraint) end end end end def setup_soln_constraints(dep_graph, soln_constraints) soln_constraints.map do |elt| pkg = dep_graph.package(elt.shift) constraint = DepSelector::VersionConstraint.new(elt.shift) DepSelector::SolutionConstraint.new(pkg, constraint) end end # def verify_solution(observed, expected) # versions = expected.inject({}){|acc, elt| acc[elt.first]=DepSelector::Version.new(elt.last) ; acc} # observed.should == versions # end def run_test_simple_ugly rep_count = 500 dep_graph = DepSelector::DependencyGraph.new ugly_constraint = build_ugly_constraint(Base_Constraint, rep_count) setup_constraint(dep_graph, ugly_constraint) selector = DepSelector::Selector.new(dep_graph) run_list_length = 500 run_list = 0.upto(run_list_length-2).inject([["A_001"]]) { |acc, arr| acc << [acc.last.first.next] } # pp :run_list=>run_list # pp :ugly_constraint=>ugly_constraint solution_constraints = setup_soln_constraints(dep_graph, run_list ) soln = selector.find_solution(solution_constraints) # puts soln end require 'benchmark' puts Benchmark.measure { 5.times { run_test_simple_ugly } } dep-selector-1.0.3/scripts/speed_test.rb000066400000000000000000000032511232552612700202620ustar00rootroot00000000000000require 'benchmark' require File.expand_path(File.join(File.dirname(__FILE__), 'spec','spec_helper')) def my_verify_solution(observed, expected) versions = expected.inject({}){|acc, elt| acc[elt.first]=DepSelector::Version.new(elt.last) ; acc} if (observed != versions) raise "Failed Comparison" end end Moderate_cookbook_version_constraint = [{"key"=>["A", "1.0.0"], "value"=>{"B"=>"= 2.0.0", "C"=>">= 2.0.0"}}, {"key"=>["A", "2.0.0"], "value"=>{"B"=>"= 1.0.0", "C"=>"= 1.0.0"}}, {"key"=>["B", "1.0.0"], "value"=>{}}, {"key"=>["B", "2.0.0"], "value"=>{}}, {"key"=>["C", "1.0.0"], "value"=>{"D"=>">= 1.0.0"}}, {"key"=>["C", "2.0.0"], "value"=>{"D"=>">= 2.0.0"}}, {"key"=>["C", "3.0.0"], "value"=>{"D"=>">= 3.0.0"}}, {"key"=>["C", "4.0.0"], "value"=>{"D"=>">= 4.0.0"}}, {"key"=>["D", "1.0.0"], "value"=>{}}, {"key"=>["D", "2.0.0"], "value"=>{}}, {"key"=>["D", "3.0.0"], "value"=>{}}, {"key"=>["D", "4.0.0"], "value"=>{}} ] def test dep_graph = DepSelector::DependencyGraph.new setup_constraint(dep_graph, Moderate_cookbook_version_constraint) selector = DepSelector::Selector.new(dep_graph) solution_constraints = setup_soln_constraints(dep_graph, [ ["A"], ["C", "= 4.0"], ]) soln = selector.find_solution(solution_constraints) my_verify_solution(soln, { "A" => "1.0.0", "B" => "2.0.0", "C" => "4.0.0", "D" => "4.0.0" }) end def run x = Benchmark.measure do 10000.times do test end end puts x end run dep-selector-1.0.3/scripts/tree_traverser_benchmark.rb000066400000000000000000000054431232552612700231760ustar00rootroot00000000000000$:.unshift File.expand_path("../../lib", __FILE__) require 'dep_selector' require 'benchmark' N = 1000 require 'pp' $transitive_deps_1 = [{"key"=>["A", "1.0.0"], "value"=>{"X"=>">= 1.0.0"}}, {"key"=>["A", "2.0.0"], "value"=>{"X"=>"= 2.0.0"}}, {"key"=>["B", "1.0.0"], "value"=>{}}, {"key"=>["C", "1.0.0"], "value"=>{"A"=>nil}}, {"key"=>["D", "1.0.0"], "value"=>{"A"=>"= 2.0.0", "X"=>"= 1.0.0"}}, {"key"=>["X", "1.0.0"], "value"=>{}}, {"key"=>["X", "2.0.0"], "value"=>{}} ] $transitive_deps_2 = [{"key"=>["A", "1.0.0"], "value"=>{"L"=>">= 1.0.0"}}, {"key"=>["A", "2.0.0"], "value"=>{"L"=>"= 2.0.0"}}, {"key"=>["A", "3.0.0"], "value"=>{"X"=>nil}}, {"key"=>["B", "1.0.0"], "value"=>{"X"=>">= 1.0.0"}}, {"key"=>["B", "2.0.0"], "value"=>{}}, {"key"=>["C", "1.0.0"], "value"=>{"X"=>"= 3.0.0"}}, {"key"=>["D", "1.0.0"], "value"=>{"X"=>nil}}, {"key"=>["L", "1.0.0"], "value"=>{"X"=>"= 1.0.0"}}, {"key"=>["L", "2.0.0"], "value"=>{"X"=>"= 2.0.0"}}, {"key"=>["X", "1.0.0"], "value"=>{}}, {"key"=>["X", "2.0.0"], "value"=>{}}, {"key"=>["X", "3.0.0"], "value"=>{}}, ] $dependency_on_non_existent_package = [{"key"=>["depends_on_nosuch", "1.0.0"], "value"=>{"nosuch"=>"= 2.0.0"}}, {"key"=>["transitive_dep_on_nosuch", "1.0.0"], "value"=>{"depends_on_nosuch"=>nil}} ] def setup_soln_constraints(dep_graph, soln_constraints) soln_constraints.map do |elt| pkg = dep_graph.package(elt.shift) constraint = DepSelector::VersionConstraint.new(elt.shift) DepSelector::SolutionConstraint.new(pkg, constraint) end end def setup_constraint(dep_graph, cset) cset.each do |cb_version| package_name = cb_version["key"].first version = DepSelector::Version.new(cb_version["key"].last) dependencies = cb_version['value'] pv = dep_graph.package(package_name).add_version(version) dependencies.each_pair do |dep_name, constraint_str| constraint = DepSelector::VersionConstraint.new(constraint_str) pv.dependencies << DepSelector::Dependency.new(dep_graph.package(dep_name), constraint) end end end def setup dep_graph = DepSelector::DependencyGraph.new setup_constraint(dep_graph, $transitive_deps_1) solution_constraints = setup_soln_constraints(dep_graph, [ ["X", "> 1.0.0"], ["D"] ]) [dep_graph, solution_constraints] end def run_error_reporter(dep_graph, solution_constraints) er = DepSelector::ErrorReporter::SimpleTreeTraverser.new er.give_feedback(dep_graph, solution_constraints, 1, dep_graph.package('X')) end $dep_graph, $solution_constraints = setup Benchmark.bm(10) do |x| x.report("report:") do #require 'profile' N.times { run_error_reporter($dep_graph, $solution_constraints) } end end dep-selector-1.0.3/spec/000077500000000000000000000000001232552612700150405ustar00rootroot00000000000000dep-selector-1.0.3/spec/dep_gecode_spec.rb000066400000000000000000000335171232552612700204660ustar00rootroot00000000000000# # Author:: Christopher Walters () # Author:: Mark Anderson () # Copyright:: Copyright (c) 2010-2011 Opscode, Inc. # License:: Apache License, Version 2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # require File.expand_path(File.join(File.dirname(__FILE__), 'spec_helper')) require 'version_constraints' VersionProblemDebug = true # so that we can use test data that's already written in other tests, # we're accepting the same format but adapting it for our C++ wrapper # for gecode, which is exposed in Dep_gecode def setup_problem_for_dep_gecode(relationships) # pp :relationships=>relationships dep_graph = DepSelector::DependencyGraph.new setup_constraint(dep_graph, relationships) dep_gecode_packages = {} problem = Dep_gecode.VersionProblemCreate(dep_graph.packages.size+1, true, VersionProblemDebug, "test_slug") # extra for runlist meta package # all packages must be created before dependencies using them can be created dep_graph.each_package do |package| versions = package.densely_packed_versions.range dep_gecode_packages[package.name] = Dep_gecode.AddPackage(problem, versions.min, versions.max, versions.max) end # register dependencies of each package version dep_graph.each_package do |package| pkg_id = dep_gecode_packages[package.name] package.versions.each do |pkg_ver| pkg_ver_id = package.densely_packed_versions.index(pkg_ver.version) pkg_ver.dependencies.each do |dep| matching_ver_ids = dep.package.densely_packed_versions[dep.constraint] Dep_gecode.AddVersionConstraint(problem, pkg_id, pkg_ver_id, dep_gecode_packages[dep.package.name], matching_ver_ids.min, matching_ver_ids.max) end end end [ problem, dep_graph, dep_gecode_packages ] end def setup_soln_constraints_for_dep_gecode(soln_constraints, problem, pkg_name_to_id, dep_graph) # metapackage is a "ghost" package whose dependencies are the # solution constraints; thereby forcing packages to be appropriately # constrained metapkg = Dep_gecode.AddPackage(problem, 0, 0, 0) # we go through the expense of calling setup_soln_constraints, # because ultimately we're after the densely-packed ids of each # package and constraint, which we get for free by using the # dep_graph. setup_soln_constraints(dep_graph, soln_constraints).each do |soln_constraint| matching_ver_ids = soln_constraint.package.densely_packed_versions[soln_constraint.constraint] Dep_gecode.AddVersionConstraint(problem, metapkg, 0, pkg_name_to_id[soln_constraint.package.name], matching_ver_ids.min, matching_ver_ids.max) end end def print_human_readable_solution(problem, pkg_name_to_id, dep_graph) dep_graph.each_package do |package| package_id = pkg_name_to_id[package.name] package_version = Dep_gecode.GetPackageVersion(problem,package_id) version_text = package.densely_packed_versions.sorted_elements[package_version] puts "#{package.name} @ #{version_text} (#{package_id} @ #{package_version})" end end def check_solution(problem, pkg_name_to_id, dep_graph, expected_solution) if (problem.nil?) expected_solution.should be_nil return end passed = true; dep_graph.each_package do |package| package_id = pkg_name_to_id[package.name] package_version = Dep_gecode.GetPackageVersion(problem,package_id) version_text = package.densely_packed_versions.sorted_elements[package_version] expected_version = expected_solution.nil? ? "NA" : expected_solution[package.name] if (expected_version == "disabled") Dep_gecode.GetPackageDisabledState(problem,package_id).should be_true else version_text.to_s.should == expected_version.to_s end end end def print_bindings(problem, vars) vars.each do |var| Dep_gecode.VersionProblemPrintPackageVar(problem, var) puts "\n" end end describe Dep_gecode do it "Can be created and destroyed" do problem = Dep_gecode.VersionProblemCreate(1, true, VersionProblemDebug, "test_slug_1") Dep_gecode.VersionProblemDestroy(problem) end it "Can be created, and have packages added to it" do problem = Dep_gecode.VersionProblemCreate(2, true, VersionProblemDebug, "test_slug_2") Dep_gecode.VersionProblemSize(problem).should == 2 Dep_gecode.VersionProblemPackageCount(problem).should == 0 packageId = Dep_gecode.AddPackage(problem, 0, 2, 8) packageId.should == 0 Dep_gecode.GetPackageVersion(problem, packageId).should == -(2**31) Dep_gecode.GetPackageMax(problem,packageId).should == 2 Dep_gecode.GetPackageMin(problem,packageId).should == 0 Dep_gecode.VersionProblemSize(problem).should == 2 Dep_gecode.VersionProblemPackageCount(problem).should == 1 packageId = Dep_gecode.AddPackage(problem, 1, 6, 8) packageId.should == 1 Dep_gecode.GetPackageVersion(problem, packageId).should == -(2**31) Dep_gecode.GetPackageMax(problem,packageId).should == 6 Dep_gecode.GetPackageMin(problem,packageId).should == 1 Dep_gecode.VersionProblemSize(problem).should == 2 Dep_gecode.VersionProblemPackageCount(problem).should == 2 Dep_gecode.VersionProblemDestroy(problem) end end describe Dep_gecode do before do @problem, @dep_graph, @pkg_name_to_id = setup_problem_for_dep_gecode(VersionConstraints::Simple_cookbook_version_constraint) end after do Dep_gecode.VersionProblemDestroy(@problem) end it "solves a simple set of constraints" do # solution constraints: [A,(B=0)], which is satisfiable as A=1, B=0 solution_constraints = [ ["A"], ["B", "= 1.0.0"] ] setup_soln_constraints_for_dep_gecode(solution_constraints, @problem, @pkg_name_to_id, @dep_graph) # solve and interrogate problem new_problem = Dep_gecode.Solve(@problem) # print_human_readable_solution(new_problem, @pkg_name_to_id, @dep_graph) check_solution(new_problem, @pkg_name_to_id, @dep_graph, {'A'=>'2.0.0', 'B'=>'1.0.0', 'C'=>'1.0.0'}) Dep_gecode.VersionProblemDestroy(new_problem); end it "fails to solve a simple, unsatisfiable set of constraints" do # solution constraints: [(A=1.0.0),(B=1.0.0)], which is not satisfiable solution_constraints = [ ["A", "= 1.0.0"], ["B", "= 1.0.0"] ] setup_soln_constraints_for_dep_gecode(solution_constraints, @problem, @pkg_name_to_id, @dep_graph) # solve and interrogate problem new_problem = Dep_gecode.Solve(@problem) new_problem.should_not == nil check_solution(new_problem, @pkg_name_to_id, @dep_graph, {'A'=>'1.0.0', 'B'=>'disabled', 'C'=>'1.0.0'} ) Dep_gecode.VersionProblemDestroy(new_problem); end # Friendlier, more abstracted tests # it VersionConstraints::SimpleProblem_2_insoluble[:desc] do # problem_system = VersionConstraints::SimpleProblem_2_insoluble # setup_soln_constraints_for_dep_gecode(problem_system[:runlist_constraint], @problem, @pkg_name_to_id, @dep_graph) # # solve and interrogate problem # new_problem = Dep_gecode.Solve(@problem) # check_solution(new_problem, @pkg_name_to_id, @dep_graph, problem_system[:solution]).should == true # Dep_gecode.VersionProblemDestroy(@problem); # end it VersionConstraints::SimpleProblem_3_soluble[:desc] do @problem_system = VersionConstraints::SimpleProblem_3_soluble @problem, @dep_graph, @pkg_name_to_id = setup_problem_for_dep_gecode(@problem_system[:version_constraint]) setup_soln_constraints_for_dep_gecode(@problem_system[:runlist_constraint], @problem, @pkg_name_to_id, @dep_graph) # solve and interrogate problem new_problem = Dep_gecode.Solve(@problem) check_solution(new_problem, @pkg_name_to_id, @dep_graph, @problem_system[:solution]) Dep_gecode.VersionProblemDestroy(new_problem) end it "should prefer to disable suspicious packages" do # Note: this test is a lower-level version of the test in # selector_spec titled "should indicate that the problematic # package is the dependency that is constrained to no versions" problem = Dep_gecode.VersionProblemCreate(11, true, VersionProblemDebug, "test_slug_3") # setup dep graph Dep_gecode.AddPackage(problem, -1, 0, 0); Dep_gecode.AddPackage(problem, -1, 1, 0); Dep_gecode.AddPackage(problem, -1, 0, 0); Dep_gecode.AddPackage(problem, -1, 1, 0); Dep_gecode.AddPackage(problem, -1, 0, 0); Dep_gecode.AddPackage(problem, -1, 0, 0); Dep_gecode.AddPackage(problem, -1, 2, 0); Dep_gecode.AddPackage(problem, -1, 0, 0); Dep_gecode.AddPackage(problem, -1, 0, 0); Dep_gecode.AddPackage(problem, -1, -1, 0); Dep_gecode.AddPackage(problem, 0, 0, 0); Dep_gecode.AddVersionConstraint(problem, 0, 0, 1, 0, 1); Dep_gecode.AddVersionConstraint(problem, 2, 0, 1, 0, 0); Dep_gecode.AddVersionConstraint(problem, 1, 0, 3, 0, 1); Dep_gecode.AddVersionConstraint(problem, 1, 0, 4, 0, 0); Dep_gecode.AddVersionConstraint(problem, 1, 1, 3, 1, 1); Dep_gecode.AddVersionConstraint(problem, 1, 1, 5, 0, 0); Dep_gecode.AddVersionConstraint(problem, 7, 0, 3, -2, -2); Dep_gecode.AddVersionConstraint(problem, 8, 0, 9, -2, -2); # hint suspicious packages Dep_gecode.MarkPackageSuspicious(problem, 3) Dep_gecode.MarkPackageSuspicious(problem, 9) # add solution constraints Dep_gecode.AddVersionConstraint(problem, 10, 0, 7, 0, 0); soln = Dep_gecode.Solve(problem) # check that disabled packages are correct expected_disabled_packages = [false, false, false, true, false, false, false, false, false, false, false].inject({}) do |acc, is_disabled| acc["id #{acc.size}"] = is_disabled acc end observed_disabled_packages = 0.upto(10).inject({}) do |acc, package_id| acc["id #{package_id}"] = Dep_gecode.GetPackageDisabledState(soln, package_id) acc end observed_disabled_packages.should == expected_disabled_packages Dep_gecode.VersionProblemDestroy(problem) Dep_gecode.VersionProblemDestroy(soln) end describe "maximization of latestness of solution constraints" do before do # setup dep graph # since @problem was already created, first free it Dep_gecode.VersionProblemDestroy(@problem) @problem = Dep_gecode.VersionProblemCreate(4, true, VersionProblemDebug, "test_slug_4") @pkg_a = Dep_gecode.AddPackage(@problem, -1, 1, 0); @pkg_b = Dep_gecode.AddPackage(@problem, -1, 1, 0); @pkg_c = Dep_gecode.AddPackage(@problem, -1, 1, 0); soln_constraints = Dep_gecode.AddPackage(@problem, 0, 0, 0); Dep_gecode.AddVersionConstraint(@problem, @pkg_a, 1, @pkg_b, 0, 0); Dep_gecode.AddVersionConstraint(@problem, @pkg_a, 1, @pkg_c, 0, 0); Dep_gecode.AddVersionConstraint(@problem, soln_constraints, 0, @pkg_a, 0, 1); Dep_gecode.AddVersionConstraint(@problem, soln_constraints, 0, @pkg_b, 0, 1); Dep_gecode.AddVersionConstraint(@problem, soln_constraints, 0, @pkg_c, 0, 1); end it "should maximize latestness of solution constraints not marked with MarkPackagePreferredToBeAtLatest" do Dep_gecode.MarkPackagePreferredToBeAtLatest(@problem, @pkg_a, 10); soln = Dep_gecode.Solve(@problem) soln.should_not == nil # since we haven't indicated that a, b, and c should be # preferred to be latest and a was added first, it should find a # satisfiable solution at a=1, b=0, c=0 Dep_gecode.GetPackageVersion(soln, @pkg_a).should == 1 Dep_gecode.GetPackageVersion(soln, @pkg_b).should == 0 Dep_gecode.GetPackageVersion(soln, @pkg_c).should == 0 Dep_gecode.VersionProblemDestroy(soln) end it "Should select lastest if we don't mark any at all" do soln = Dep_gecode.Solve(@problem) soln.should_not == nil # since we haven't indicated that a, b, and c should be # preferred to be latest and a was added first, it should find a # satisfiable solution at a=1, b=0, c=0 Dep_gecode.GetPackageVersion(soln, @pkg_a).should == 0 Dep_gecode.GetPackageVersion(soln, @pkg_b).should == 1 Dep_gecode.GetPackageVersion(soln, @pkg_c).should == 1 Dep_gecode.VersionProblemDestroy(soln) end # Note: this is the actual test of latestness maximization it "If everything is marked with MarkPackagePreferredToBeAtLatest should act the same as if nothing were due to the default latestness objective function" do Dep_gecode.MarkPackagePreferredToBeAtLatest(@problem, @pkg_a, 1); Dep_gecode.MarkPackagePreferredToBeAtLatest(@problem, @pkg_b, 1); Dep_gecode.MarkPackagePreferredToBeAtLatest(@problem, @pkg_c, 1); # now, mark a, b, and c as preferred to be at latest and observe # that a=0, b=1, and c=1 is chosen soln = Dep_gecode.Solve(@problem) soln.should_not == nil Dep_gecode.GetPackageVersion(soln, @pkg_a).should == 0 Dep_gecode.GetPackageVersion(soln, @pkg_b).should == 1 Dep_gecode.GetPackageVersion(soln, @pkg_c).should == 1 Dep_gecode.VersionProblemDestroy(soln) end end end dep-selector-1.0.3/spec/dep_selector/000077500000000000000000000000001232552612700175105ustar00rootroot00000000000000dep-selector-1.0.3/spec/dep_selector/densely_packed_set_spec.rb000066400000000000000000000111241232552612700246730ustar00rootroot00000000000000# # Author:: Christopher Walters () # Author:: Mark Anderson () # Copyright:: Copyright (c) 2010-2011 Opscode, Inc. # License:: Apache License, Version 2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # require File.expand_path(File.join(File.dirname(__FILE__), '..','spec_helper')) describe DepSelector::DenselyPackedSet do describe "[]" do it "can create a simple set of versions and pick a version by equality" do dpt_set = DepSelector::DenselyPackedSet.new ["1.0.0", "2.0.0", "3.0.0", "4.0.0"] constraint = DepSelector::VersionConstraint.new("= 2.0.0") range = dpt_set[constraint] range.first.should == 1 range.last.should == 1 end it "can create a simple set of versions and pick a version by greater than equal" do dpt_set = DepSelector::DenselyPackedSet.new ["1.0.0", "2.0.0", "3.0.0", "4.0.0"] constraint = DepSelector::VersionConstraint.new(">= 2.0.0") range = dpt_set[constraint] range.first.should == 1 range.last.should == 3 end it "can create a simple set of versions and pick a version by greater than" do dpt_set = DepSelector::DenselyPackedSet.new ["1.0.0", "2.0.0", "3.0.0", "4.0.0"] constraint = DepSelector::VersionConstraint.new("> 2.0.0") range = dpt_set[constraint] range.first.should == 2 range.last.should == 3 end it "can create a simple set of versions and pick a version by less than equal" do dpt_set = DepSelector::DenselyPackedSet.new ["1.0.0", "2.0.0", "3.0.0", "4.0.0"] constraint = DepSelector::VersionConstraint.new("<= 3.0.0") range = dpt_set[constraint] range.first.should == 0 range.last.should == 2 end it "can create a simple set of versions and pick a version by less than equal" do dpt_set = DepSelector::DenselyPackedSet.new ["1.0.0", "2.0.0", "3.0.0", "4.0.0"] constraint = DepSelector::VersionConstraint.new("<= 3.0.0") range = dpt_set[constraint] range.first.should == 0 range.last.should == 2 end it "can create a more complex set of versions and pick a version by >~ x.y" do dpt_set = DepSelector::DenselyPackedSet.new ["0.1.0", "1.0.0", "1.1", "1.1.1", "1.2", "1.2.1", "1.2.2", "2.0.0", "3.0.0", "4.0.0"] constraint = DepSelector::VersionConstraint.new("~> 1.1") range = dpt_set[constraint] range.first.should == 2 range.last.should == 6 end it "can create a more complex set of versions and pick a version by ~> x.y.z" do dpt_set = DepSelector::DenselyPackedSet.new ["0.1.0", "1.0.0", "1.1", "1.1.1", "1.2", "1.2.1", "1.2.2", "2.0.0", "3.0.0", "4.0.0"] constraint = DepSelector::VersionConstraint.new("~> 1.1.0") range = dpt_set[constraint] range.first.should == 2 range.last.should == 3 end it "returns an empty range if the densely packed version is requested for a constraint that matches none of the versions" do dpt_set = DepSelector::DenselyPackedSet.new ["1.0.0", "0.0.1"] constraint = DepSelector::VersionConstraint.new("> 1.0.0") dpt_set[constraint].to_a.should be_empty end end describe "index" do it "should return the correct index given a version" do versions = ["1.0.0", "2.0.0", "3.0.0"].map{|ver_str| DepSelector::Version.new(ver_str)} dpt_set = DepSelector::DenselyPackedSet.new(versions) dpt_set.index(DepSelector::Version.new("1.0")).should == 0 dpt_set.index(DepSelector::Version.new("1.0.0")).should == 0 dpt_set.index(DepSelector::Version.new("2.0")).should == 1 dpt_set.index(DepSelector::Version.new("2.0.0")).should == 1 dpt_set.index(DepSelector::Version.new("3.0")).should == 2 dpt_set.index(DepSelector::Version.new("3.0.0")).should == 2 end it "errors if the densely packed version is requested for an invalid element" do dpt_set = DepSelector::DenselyPackedSet.new ["1.0.0"] lambda{ dpt_set.index("2.0.0") }.should raise_error(DepSelector::Exceptions::InvalidVersion) end end end dep-selector-1.0.3/spec/dep_selector/dependency_graph_spec.rb000066400000000000000000000053031232552612700243470ustar00rootroot00000000000000# # Author:: Christopher Walters () # Author:: Mark Anderson () # Copyright:: Copyright (c) 2010-2011 Opscode, Inc. # License:: Apache License, Version 2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # require File.expand_path(File.join(File.dirname(__FILE__), '..','spec_helper')) describe DepSelector::DependencyGraph do describe "package" do it "creates a package based on the name and returns the same object on subsequent accesses" do dep_graph = DepSelector::DependencyGraph.new pkg = dep_graph.package("A") pkg.name.should == "A" dep_graph.package("A").should === pkg end end describe "clone" do it "performs a deep copy" do dg1 = DepSelector::DependencyGraph.new dg2 = dg1.clone dg2.package("should only exist in dg2") dg1.packages.should be_empty dg1.package("foo") dg2 = dg1.clone dg2.packages.should have_key("foo") dg2.package("foo").add_version("1.0.0") dg1.package("foo").versions.should be_empty end it "creates correct references in package, version, and dependency objects" do dg1 = DepSelector::DependencyGraph.new original_pkg_a = dg1.package("A").add_version("1.0.0") b_v2 = dg1.package("B").add_version("2.0.0") dep = DepSelector::Dependency.new(dg1.package("A"), ">= 0.0.0") b_v2.dependencies << dep copy = dg1.clone copied_package_a = copy.package("A") copied_package_b = copy.package("B") copied_package_a.should_not equal(original_pkg_a) copy.package("A").dependency_graph.should equal(copy) copy.package("A").should have(1).versions copied_pkg_a_v1_0_0 = copy.package("A").versions.first copied_pkg_a_v1_0_0.package.should equal(copied_package_a) copied_package_b_v2_0_0 = copied_package_b.versions.first copied_package_b_v2_0_0.should have(1).dependencies copied_dependency = copied_package_b_v2_0_0.dependencies.first copied_dependency.package.should equal(copied_package_a) # Object equality isn't strictly necessary for the implementation, but # object reuse improves perf. copied_dependency.constraint.should equal(dep.constraint) end end end dep-selector-1.0.3/spec/dep_selector/error_reporter/000077500000000000000000000000001232552612700225635ustar00rootroot00000000000000dep-selector-1.0.3/spec/dep_selector/error_reporter/simple_tree_traverser_spec.rb000066400000000000000000000210011232552612700305210ustar00rootroot00000000000000# # Author:: Christopher Walters () # Author:: Mark Anderson () # Copyright:: Copyright (c) 2010-2011 Opscode, Inc. # License:: Apache License, Version 2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # require File.expand_path(File.join(File.dirname(__FILE__), '..', '..', 'spec_helper')) transitive_deps_1 = [{"key"=>["A", "1.0.0"], "value"=>{"X"=>">= 1.0.0"}}, {"key"=>["A", "2.0.0"], "value"=>{"X"=>"= 2.0.0"}}, {"key"=>["B", "1.0.0"], "value"=>{}}, {"key"=>["C", "1.0.0"], "value"=>{"A"=>nil}}, {"key"=>["D", "1.0.0"], "value"=>{"A"=>"= 2.0.0", "X"=>"= 1.0.0"}}, {"key"=>["X", "1.0.0"], "value"=>{}}, {"key"=>["X", "2.0.0"], "value"=>{}} ] transitive_deps_2 = [{"key"=>["A", "1.0.0"], "value"=>{"L"=>">= 1.0.0"}}, {"key"=>["A", "2.0.0"], "value"=>{"L"=>"= 2.0.0"}}, {"key"=>["A", "3.0.0"], "value"=>{"X"=>nil}}, {"key"=>["B", "1.0.0"], "value"=>{"X"=>">= 1.0.0"}}, {"key"=>["B", "2.0.0"], "value"=>{}}, {"key"=>["C", "1.0.0"], "value"=>{"X"=>"= 3.0.0"}}, {"key"=>["D", "1.0.0"], "value"=>{"X"=>nil}}, {"key"=>["L", "1.0.0"], "value"=>{"X"=>"= 1.0.0"}}, {"key"=>["L", "2.0.0"], "value"=>{"X"=>"= 2.0.0"}}, {"key"=>["X", "1.0.0"], "value"=>{}}, {"key"=>["X", "2.0.0"], "value"=>{}}, {"key"=>["X", "3.0.0"], "value"=>{}}, ] dependency_on_non_existent_package = [{"key"=>["depends_on_nosuch", "1.0.0"], "value"=>{"nosuch"=>"= 2.0.0"}}, {"key"=>["transitive_dep_on_nosuch", "1.0.0"], "value"=>{"depends_on_nosuch"=>nil}} ] describe DepSelector::ErrorReporter::SimpleTreeTraverser do describe "give_feedback" do it "finds constraints on the target package in the solution constraints" do dep_graph = DepSelector::DependencyGraph.new setup_constraint(dep_graph, transitive_deps_1) solution_constraints = setup_soln_constraints(dep_graph, [ ["X", "> 1.0.0"], ["D"] ]) er = DepSelector::ErrorReporter::SimpleTreeTraverser.new er.give_feedback(dep_graph, solution_constraints, 1, dep_graph.package('X')).should == "Unable to satisfy constraints on package X due to solution constraint (D >= 0.0.0). Solution constraints that may result in a constraint on X: [(X > 1.0.0)], [(D = 1.0.0) -> (A = 2.0.0) -> (X = 2.0.0)], [(D = 1.0.0) -> (X = 1.0.0)]" end it "finds constraints on the target package in first-level dependencies" do dep_graph = DepSelector::DependencyGraph.new setup_constraint(dep_graph, transitive_deps_1) solution_constraints = setup_soln_constraints(dep_graph, [ ["A"], ["D"] ]) er = DepSelector::ErrorReporter::SimpleTreeTraverser.new er.give_feedback(dep_graph, solution_constraints, 1, dep_graph.package('X')).should == "Unable to satisfy constraints on package X due to solution constraint (D >= 0.0.0). Solution constraints that may result in a constraint on X: [(A = 1.0.0) -> (X >= 1.0.0)], [(A = 2.0.0) -> (X = 2.0.0)], [(D = 1.0.0) -> (A = 2.0.0) -> (X = 2.0.0)], [(D = 1.0.0) -> (X = 1.0.0)]" end it "finds constraints on the target package in transitive dependencies" do dep_graph = DepSelector::DependencyGraph.new setup_constraint(dep_graph, transitive_deps_1) solution_constraints = setup_soln_constraints(dep_graph, [ ["C"], ["D"] ]) er = DepSelector::ErrorReporter::SimpleTreeTraverser.new er.give_feedback(dep_graph, solution_constraints, 1, dep_graph.package("X")).should == "Unable to satisfy constraints on package X due to solution constraint (D >= 0.0.0). Solution constraints that may result in a constraint on X: [(C = 1.0.0) -> (A = 1.0.0) -> (X >= 1.0.0)], [(C = 1.0.0) -> (A = 2.0.0) -> (X = 2.0.0)], [(D = 1.0.0) -> (A = 2.0.0) -> (X = 2.0.0)], [(D = 1.0.0) -> (X = 1.0.0)]" end it "should construct all paths from the solution constraint packages to the most constrained package and collapse paths that have exactly one difference on the version selected of the same package" do dep_graph = DepSelector::DependencyGraph.new setup_constraint(dep_graph, transitive_deps_2) solution_constraints = setup_soln_constraints(dep_graph, [ ["A", "<= 2.0.0"], ["B"], ["C"], ["D"] ]) er = DepSelector::ErrorReporter::SimpleTreeTraverser.new er.give_feedback(dep_graph, solution_constraints, 2, dep_graph.package("X")).should == "Unable to satisfy constraints on package X due to solution constraint (C >= 0.0.0). Solution constraints that may result in a constraint on X: [(A = 1.0.0) -> (L = 1.0.0) -> (X = 1.0.0)], [(A = {1.0.0,2.0.0}) -> (L = 2.0.0) -> (X = 2.0.0)], [(B = 1.0.0) -> (X >= 1.0.0)], [(C = 1.0.0) -> (X = 3.0.0)], [(D = 1.0.0) -> (X >= 0.0.0)]" end it "should report failures that are caused by non-existent dependencies" do dep_graph = DepSelector::DependencyGraph.new setup_constraint(dep_graph, dependency_on_non_existent_package) solution_constraints = setup_soln_constraints(dep_graph, [ ["depends_on_nosuch"] ]) er = DepSelector::ErrorReporter::SimpleTreeTraverser.new er.give_feedback(dep_graph, solution_constraints, 0, dep_graph.package('nosuch')).should == "Unable to satisfy constraints on package nosuch, which does not exist, due to solution constraint (depends_on_nosuch >= 0.0.0). Solution constraints that may result in a constraint on nosuch: [(depends_on_nosuch = 1.0.0) -> (nosuch = 2.0.0)]" end it "should report failures that are caused by non-existent transitive dependencies" do dep_graph = DepSelector::DependencyGraph.new setup_constraint(dep_graph, dependency_on_non_existent_package) solution_constraints = setup_soln_constraints(dep_graph, [ ["transitive_dep_on_nosuch"] ]) er = DepSelector::ErrorReporter::SimpleTreeTraverser.new er.give_feedback(dep_graph, solution_constraints, 0, dep_graph.package('nosuch')).should == "Unable to satisfy constraints on package nosuch, which does not exist, due to solution constraint (transitive_dep_on_nosuch >= 0.0.0). Solution constraints that may result in a constraint on nosuch: [(transitive_dep_on_nosuch = 1.0.0) -> (depends_on_nosuch = 1.0.0) -> (nosuch = 2.0.0)]" end it "should not report non-existent cookbooks when they are not deemed to be the most constrained package" do dep_graph = DepSelector::DependencyGraph.new setup_constraint(dep_graph, transitive_deps_1) setup_constraint(dep_graph, dependency_on_non_existent_package) solution_constraints = setup_soln_constraints(dep_graph, [ ["X", "> 1.0.0"], ["D"] ]) er = DepSelector::ErrorReporter::SimpleTreeTraverser.new er.give_feedback(dep_graph, solution_constraints, 1, dep_graph.package('X')).should == "Unable to satisfy constraints on package X due to solution constraint (D >= 0.0.0). Solution constraints that may result in a constraint on X: [(X > 1.0.0)], [(D = 1.0.0) -> (A = 2.0.0) -> (X = 2.0.0)], [(D = 1.0.0) -> (X = 1.0.0)]" end end describe "collapse" do it "should collapse two neighbors that have only one difference in the path" do pending end it "should not collapse neighbors that are only different at the constraint on the target package" do pending end end end dep-selector-1.0.3/spec/dep_selector/package_spec.rb000066400000000000000000000064641232552612700224540ustar00rootroot00000000000000# # Author:: Christopher Walters () # Copyright:: Copyright (c) 2011 Opscode, Inc. # License:: Apache License, Version 2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # require File.expand_path(File.dirname(__FILE__) + '/../spec_helper') require 'dep_selector/package' require 'dep_selector/version' describe DepSelector::Package do before do @dep_graph = DepSelector::DependencyGraph.new @test_pkg1 = DepSelector::Package.new(@dep_graph, "test_pkg") end describe "[]" do context "when using dep-selector's version and constraint types" do before do @tp1v1_0 = @test_pkg1.add_version(DepSelector::Version.new("1.0.0")) @tp1v1_1 = @test_pkg1.add_version(DepSelector::Version.new("1.1.0")) @tp1v2_0 = @test_pkg1.add_version(DepSelector::Version.new("2.0.0")) end it "should select the correct PackageVersion given a Version" do @test_pkg1[DepSelector::Version.new("1.0.0")].should == @tp1v1_0 end it "should select all PackageVersions that match a given constraint" do @test_pkg1[DepSelector::VersionConstraint.new("= 1.0.0")].should == [ @tp1v1_0 ] @test_pkg1[DepSelector::VersionConstraint.new("~> 1.0")].should == [ @tp1v1_0, @tp1v1_1 ] @test_pkg1[DepSelector::VersionConstraint.new("> 1.0.0")].should == [ @tp1v1_1, @tp1v2_0 ] end end context "when using duck types of version and constraint objects" do let(:version_1_0_0) { double("A version type") } let(:constraint) { double("A constraint type") } it "selects versions that match the constraints" do constraint.stub(:respond_to?).with(:include?).and_return(true) constraint.should_receive(:include?).with(version_1_0_0).and_return(true) test_pkg_version_1_0_0 = @test_pkg1.add_version(version_1_0_0) @test_pkg1[constraint].should == [test_pkg_version_1_0_0] end end end describe "valid?" do it "should return false if the package has no versions" do @test_pkg1.valid?.should == false end it "should return true if the package has at least one version" do @test_pkg1.add_version(DepSelector::Version.new("1.0.0")) @test_pkg1.valid?.should == true end end end dep-selector-1.0.3/spec/dep_selector/package_version_spec.rb000066400000000000000000000033311232552612700242070ustar00rootroot00000000000000# # Author:: Christopher Walters () # Copyright:: Copyright (c) 2011 Opscode, Inc. # License:: Apache License, Version 2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # require File.expand_path(File.dirname(__FILE__) + '/../spec_helper') require 'dep_selector/package_version' describe DepSelector::PackageVersion do describe "equality testing" do before do @pv1_1 = DepSelector::PackageVersion.new(DepSelector::Package.new(nil, 'A'), DepSelector::Version.new("1.0.0")) @pv1_2 = DepSelector::PackageVersion.new(DepSelector::Package.new(nil, 'A'), DepSelector::Version.new("1.0.0")) end it "should be true when the objects are equal" do @pv1_1.should == @pv1_2 end it "should implement the ability to be hashed correctly" do # the objects' references are not equal @pv1_1.should_not equal(@pv1_2) # the contract with hash is that pv1_1.eql?(pv1_2) implies that # pv1_1.hash == pv1_2.hash @pv1_1.should eql(@pv1_2) @pv1_1.hash.should == @pv1_2.hash # putting it all together, inserting by pv1_1 and accessing by # pv1_2 should succeed hash = {} hash[@pv1_1] = @pv1_1 hash[@pv1_2].should equal(@pv1_1) end end end dep-selector-1.0.3/spec/dep_selector/selector_spec.rb000066400000000000000000001010061232552612700226650ustar00rootroot00000000000000require File.expand_path(File.join(File.dirname(__FILE__), '..','spec_helper')) simple_cookbook_version_constraint = [{"key"=>["A", "1.0.0"], "value"=>{"B"=>"= 2.0.0"}}, {"key"=>["A", "2.0.0"], "value"=>{"B"=>"= 1.0.0", "C"=>"= 1.0.0"}}, {"key"=>["B", "1.0.0"], "value"=>{}}, {"key"=>["B", "2.0.0"], "value"=>{}}, {"key"=>["C", "1.0.0"], "value"=>{}}, ] simple_cookbook_version_constraint_2 = [{"key"=>["A", "1.0.0"], "value"=>{"B"=>"= 2.0.0", "C"=>"= 2.0.0"}}, {"key"=>["A", "2.0.0"], "value"=>{"B"=>"= 1.0.0", "C"=>"= 1.0.0"}}, {"key"=>["B", "1.0.0"], "value"=>{}}, {"key"=>["B", "2.0.0"], "value"=>{}}, {"key"=>["C", "1.0.0"], "value"=>{}}, {"key"=>["C", "2.0.0"], "value"=>{}}, {"key"=>["C", "3.0.0"], "value"=>{}} ] # simple_cookbook_version_constraint_3 = # [{"key"=>["A", "1.0.0"], "value"=>{"B"=>">= 1.0.0"}}, # {"key"=>["B", "1.0.0"], "value"=>{}}, # {"key"=>["B", "2.0.0"], "value"=>{}}, # ] moderate_cookbook_version_constraint = [{"key"=>["A", "1.0.0"], "value"=>{"B"=>"= 2.0.0", "C"=>">= 2.0.0"}}, {"key"=>["A", "2.0.0"], "value"=>{"B"=>"= 1.0.0", "C"=>"= 1.0.0"}}, {"key"=>["B", "1.0.0"], "value"=>{}}, {"key"=>["B", "2.0.0"], "value"=>{}}, {"key"=>["C", "1.0.0"], "value"=>{"D"=>">= 1.0.0"}}, {"key"=>["C", "2.0.0"], "value"=>{"D"=>">= 2.0.0"}}, {"key"=>["C", "3.0.0"], "value"=>{"D"=>">= 3.0.0"}}, {"key"=>["C", "4.0.0"], "value"=>{"D"=>">= 4.0.0"}}, {"key"=>["D", "1.0.0"], "value"=>{}}, {"key"=>["D", "2.0.0"], "value"=>{}}, {"key"=>["D", "3.0.0"], "value"=>{}}, {"key"=>["D", "4.0.0"], "value"=>{}} ] # moderate_cookbook_version_constraint_2 = # [{"key"=>["A", "1.0"], "value"=>{"C"=>"< 4.0"}}, # {"key"=>["B", "1.0"], "value"=>{"C"=>"< 3.0"}}, # {"key"=>["C", "2.0"], "value"=>{"D"=>"> 1.0", "F"=>">= 0.0.0"}}, # {"key"=>["C", "3.0"], "value"=>{"D"=>"> 2.0", "E"=>">= 0.0.0"}}, # {"key"=>["D", "1.1"], "value"=>{}}, # {"key"=>["D", "2.1"], "value"=>{}}, # {"key"=>["E", "1.0"], "value"=>{}}, # {"key"=>["F", "1.0"], "value"=>{}}, # ] moderate_cookbook_version_constraint_3 = [{"key"=>["a", "1.0"], "value"=>{"c"=>"< 4.0"}}, {"key"=>["b", "1.0"], "value"=>{"c"=>"< 3.0"}}, {"key"=>["c", "2.0"], "value"=>{"d"=>"> 1.0", "f"=>nil}}, {"key"=>["c", "3.0"], "value"=>{"d"=>"> 2.0", "e"=>nil}}, {"key"=>["d", "1.1"], "value"=>{}}, {"key"=>["d", "2.1"], "value"=>{}}, {"key"=>["e", "1.0"], "value"=>{}}, {"key"=>["f", "1.0"], "value"=>{}}, {"key"=>["g", "1.0"], "value"=>{"d"=>"> 5.0"}}, {"key"=>["n", "1.1"], "value"=>{}}, {"key"=>["n", "1.2"], "value"=>{}}, {"key"=>["n", "1.10"], "value"=>{}}, {"key"=>["depends_on_nosuch", "1.0"], "value"=>{"nosuch"=>nil}} ] # big_cookbook_version_constraint_0 = # [{"key"=>["A", "1.0"], "value"=>{"B"=>"= 1.0"}}] # # big_cookbook_version_constraint_1 = # [{"key"=>["A", "0.0.0"], "value"=>{"B"=>"<= 0.0.0"}}, # {"key"=>["B", "0.0.0"], "value"=>{}}, # {"key"=>["C", "0.0.0"], "value"=>{}}, # {"key"=>["D", "0.0.0"], "value"=>{"E"=>"<= 0.0.0", "F"=>"<= 0.0.0", "C"=>"<= 0.0.0"}}, # {"key"=>["E", "0.0.0"], "value"=>{}}, # {"key"=>["F", "0.0.0"], "value"=>{}}, # {"key"=>["G", "0.0.0"], "value"=>{}}, # {"key"=>["H", "0.0.0"], "value"=>{}}, # {"key"=>["I", "0.0.0"], "value"=>{}}, # {"key"=>["I", "1.0.0"], "value"=>{}}, # {"key"=>["J", "0.0.0"], "value"=>{"B"=>"<= 0.0.0"}}, # {"key"=>["K", "0.0.0"], "value"=>{}}, # {"key"=>["K", "1.0.0"], "value"=>{}}, # {"key"=>["L", "0.0.0"], "value"=>{}}, # {"key"=>["M", "0.0.0"], "value"=>{}}, # {"key"=>["N", "0.0.0"], "value"=>{}}, # {"key"=>["O", "0.0.0"], "value"=>{}}, # {"key"=>["P", "0.0.0"], "value"=>{}}, # {"key"=>["P", "1.0.0"], "value"=>{}}, # {"key"=>["Q", "0.0.0"], "value"=>{}}, # {"key"=>["Q", "1.0.0"], "value"=>{"R"=>"<= 0.0.0"}}, # {"key"=>["R", "0.0.0"], "value"=>{}}, # {"key"=>["S", "0.0.0"], "value"=>{"R"=>"<= 0.0.0"}}, # {"key"=>["T", "0.0.0"], "value"=>{}}, # {"key"=>["U", "0.0.0"], "value"=>{"O"=>"<= 0.0.0"}}, # {"key"=>["V", "0.0.0"], "value"=>{}}, # {"key"=>["W", "0.0.0"], "value"=>{}}, # {"key"=>["X", "0.0.0"], "value"=>{}}, # {"key"=>["Y", "0.0.0"], "value"=>{}}, # {"key"=>["Y", "1.0.0"], "value"=>{}}, # {"key"=>["Z", "0.0.0"], "value"=>{}}, # {"key"=>["Z", "1.0.0"], "value"=>{"C"=>"<= 0.0.0"}}, # {"key"=>["AA", "0.0.0"], # "value"=> # { "A"=>"<= 0.0.0", # "C"=>"<= 0.0.0", # "D"=>"<= 0.0.0", # "G"=>"<= 0.0.0", # "H"=>"<= 0.0.0", # "I"=>"<= 1.0.0", # "J"=>"<= 0.0.0", # "K"=>"<= 1.0.0", # "L"=>"<= 0.0.0"}}] big_cookbook_version_constraint_2 = [{"key"=>["A", "0.0"], "value"=>{"B"=>"<= 0.0", "C"=>"<= 12.0"}}, {"key"=>["A", "1.0"], "value"=>{"B"=>"<= 0.0", "C"=>"<= 12.0"}}, {"key"=>["B", "0.0"], "value"=>{"D"=>"<= 0.0", "E"=>"<= 0.0"}}, {"key"=>["C", "0.0"], "value"=> {"F"=>"<= 1.0", "G"=>"<= 2.0", "H"=>"<= 0.0", "E"=>"<= 0.0", "J"=>"<= 0.0", "I"=>"<= 2.0", "K"=>"<= 1.0"}}, {"key"=>["C", "1.0"], "value"=> {"F"=>"<= 1.0", "G"=>"<= 2.0", "H"=>"<= 0.0", "E"=>"<= 0.0", "I"=>"<= 2.0", "J"=>"<= 0.0", "K"=>"<= 1.0"}}, {"key"=>["C", "2.0"], "value"=> {"F"=>"<= 1.0", "G"=>"<= 2.0", "H"=>"<= 0.0", "E"=>"<= 0.0", "I"=>"<= 2.0", "J"=>"<= 0.0", "K"=>"<= 1.0"}}, {"key"=>["C", "3.0"], "value"=> {"F"=>"<= 1.0", "G"=>"<= 2.0", "H"=>"<= 0.0", "E"=>"<= 0.0", "I"=>"<= 2.0", "J"=>"<= 0.0", "K"=>"<= 1.0"}}, {"key"=>["C", "4.0"], "value"=> {"F"=>"<= 1.0", "G"=>"<= 2.0", "H"=>"<= 0.0", "E"=>"<= 0.0", "I"=>"<= 2.0", "J"=>"<= 0.0", "K"=>"<= 1.0"}}, {"key"=>["C", "5.0"], "value"=> {"F"=>"<= 1.0", "G"=>"<= 2.0", "H"=>"<= 0.0", "E"=>"<= 0.0", "I"=>"<= 2.0", "J"=>"<= 0.0", "K"=>"<= 1.0"}}, {"key"=>["C", "6.0"], "value"=> {"F"=>"<= 1.0", "G"=>"<= 2.0", "H"=>"<= 0.0", "E"=>"<= 0.0", "I"=>"<= 2.0", "J"=>"<= 0.0", "K"=>"<= 1.0"}}, {"key"=>["C", "7.0"], "value"=> {"F"=>"<= 1.0", "G"=>"<= 2.0", "H"=>"<= 0.0", "E"=>"<= 0.0", "I"=>"<= 2.0", "J"=>"<= 0.0", "K"=>"<= 1.0"}}, {"key"=>["C", "8.0"], "value"=> {"F"=>"<= 1.0", "G"=>"<= 2.0", "H"=>"<= 0.0", "E"=>"<= 0.0", "I"=>"<= 2.0", "J"=>"<= 0.0", "K"=>"<= 1.0"}}, {"key"=>["C", "9.0"], "value"=> {"F"=>"<= 1.0", "G"=>"<= 2.0", "H"=>"<= 0.0", "E"=>"<= 0.0", "I"=>"<= 2.0", "J"=>"<= 0.0", "K"=>"<= 1.0"}}, {"key"=>["C", "10.0"], "value"=> {"F"=>"<= 1.0", "G"=>"<= 2.0", "H"=>"<= 0.0", "E"=>"<= 0.0", "I"=>"<= 2.0", "J"=>"<= 0.0", "K"=>"<= 1.0"}}, {"key"=>["C", "11.0"], "value"=> {"F"=>"<= 1.0", "G"=>"<= 2.0", "H"=>"<= 0.0", "E"=>"<= 0.0", "I"=>"<= 2.0", "J"=>"<= 0.0", "K"=>"<= 1.0"}}, {"key"=>["C", "12.0"], "value"=> {"F"=>"<= 1.0", "G"=>"<= 2.0", "H"=>"<= 0.0", "E"=>"<= 0.0", "I"=>"<= 2.0", "J"=>"<= 0.0", "K"=>"<= 1.0"}}, {"key"=>["D", "0.0"], "value"=>{}}, {"key"=>["E", "0.0"], "value"=>{}}, {"key"=>["F", "0.0"], "value"=>{"A"=>"<= 1.0"}}, {"key"=>["F", "1.0"], "value"=>{"A"=>"<= 1.0"}}, {"key"=>["G", "0.0"], "value"=>{"E"=>"<= 0.0", "C"=>"<= 12.0"}}, {"key"=>["G", "1.0"], "value"=>{"E"=>"<= 0.0", "C"=>"<= 12.0"}}, {"key"=>["G", "2.0"], "value"=>{"E"=>"<= 0.0", "C"=>"<= 12.0"}}, {"key"=>["H", "0.0"], "value"=>{"L"=>"<= 1.0"}}, {"key"=>["I", "0.0"], "value"=>{"J"=>"<= 0.0"}}, {"key"=>["I", "1.0"], "value"=>{"J"=>"<= 0.0"}}, {"key"=>["I", "2.0"], "value"=>{"J"=>"<= 0.0"}}, {"key"=>["J", "0.0"], "value"=>{"T"=>"<= 0.0", "A"=>"<= 1.0"}}, {"key"=>["K", "0.0"], "value"=>{}}, {"key"=>["K", "1.0"], "value"=>{}}, {"key"=>["L", "0.0"], "value"=>{"M"=>"<= 0.0", "B"=>"<= 0.0", "N"=>"<= 8.0", "C"=>"<= 12.0"}}, {"key"=>["L", "1.0"], "value"=>{"M"=>"<= 0.0", "B"=>"<= 0.0", "C"=>"<= 12.0", "N"=>"<= 8.0"}}, {"key"=>["M", "0.0"], "value"=>{"O"=>"<= 0.0", "C"=>"<= 12.0"}}, {"key"=>["N", "0.0"], "value"=> {"P"=>"<= 0.0", "Q"=>"<= 0.0", "R"=>"<= 6.0", "J"=>"<= 0.0", "A"=>"<= 1.0", "C"=>"<= 12.0"}}, {"key"=>["N", "1.0"], "value"=> {"P"=>"<= 0.0", "Q"=>"<= 0.0", "R"=>"<= 6.0", "J"=>"<= 0.0", "A"=>"<= 1.0", "C"=>"<= 12.0"}}, {"key"=>["N", "2.0"], "value"=> {"P"=>"<= 0.0", "Q"=>"<= 0.0", "R"=>"<= 6.0", "J"=>"<= 0.0", "A"=>"<= 1.0", "C"=>"<= 12.0"}}, {"key"=>["N", "3.0"], "value"=> {"P"=>"<= 0.0", "Q"=>"<= 0.0", "R"=>"<= 6.0", "J"=>"<= 0.0", "A"=>"<= 1.0", "C"=>"<= 12.0"}}, {"key"=>["N", "4.0"], "value"=> {"P"=>"<= 0.0", "Q"=>"<= 0.0", "R"=>"<= 6.0", "J"=>"<= 0.0", "A"=>"<= 1.0", "C"=>"<= 12.0"}}, {"key"=>["N", "5.0"], "value"=> {"O"=>"<= 0.0", "P"=>"<= 0.0", "Q"=>"<= 0.0", "R"=>"<= 6.0", "J"=>"<= 0.0", "A"=>"<= 1.0", "C"=>"<= 12.0"}}, {"key"=>["N", "6.0"], "value"=> {"O"=>"<= 0.0", "P"=>"<= 0.0", "Q"=>"<= 0.0", "R"=>"<= 6.0", "J"=>"<= 0.0", "A"=>"<= 1.0", "C"=>"<= 12.0"}}, {"key"=>["N", "7.0"], "value"=> {"O"=>"<= 0.0", "P"=>"<= 0.0", "Q"=>"<= 0.0", "R"=>"<= 6.0", "J"=>"<= 0.0", "A"=>"<= 1.0", "C"=>"<= 12.0"}}, {"key"=>["N", "8.0"], "value"=> {"O"=>"<= 0.0", "P"=>"<= 0.0", "Q"=>"<= 0.0", "R"=>"<= 6.0", "S"=>"<= 2.0", "J"=>"<= 0.0", "A"=>"<= 1.0", "C"=>"<= 12.0"}}, {"key"=>["O", "0.0"], "value"=>{}}, {"key"=>["P", "0.0"], "value"=>{"E"=>"<= 0.0", "A"=>"<= 1.0", "C"=>"<= 12.0"}}, {"key"=>["Q", "0.0"], "value"=>{"A"=>"<= 1.0"}}, {"key"=>["R", "0.0"], "value"=> {"G"=>"<= 2.0", "Q"=>"<= 0.0", "E"=>"<= 0.0", "L"=>"<= 1.0", "A"=>"<= 1.0", "C"=>"<= 12.0"}}, {"key"=>["R", "1.0"], "value"=> {"G"=>"<= 2.0", "Q"=>"<= 0.0", "E"=>"<= 0.0", "L"=>"<= 1.0", "A"=>"<= 1.0", "C"=>"<= 12.0"}}, {"key"=>["R", "2.0"], "value"=> {"G"=>"<= 2.0", "Q"=>"<= 0.0", "E"=>"<= 0.0", "L"=>"<= 1.0", "A"=>"<= 1.0", "C"=>"<= 12.0"}}, {"key"=>["R", "3.0"], "value"=> {"G"=>"<= 2.0", "Q"=>"<= 0.0", "E"=>"<= 0.0", "L"=>"<= 1.0", "A"=>"<= 1.0", "C"=>"<= 12.0"}}, {"key"=>["R", "4.0"], "value"=> {"G"=>"<= 2.0", "Q"=>"<= 0.0", "E"=>"<= 0.0", "L"=>"<= 1.0", "A"=>"<= 1.0", "C"=>"<= 12.0"}}, {"key"=>["R", "5.0"], "value"=> {"G"=>"<= 2.0", "Q"=>"<= 0.0", "E"=>"<= 0.0", "L"=>"<= 1.0", "A"=>"<= 1.0", "C"=>"<= 12.0"}}, {"key"=>["R", "6.0"], "value"=> {"G"=>"<= 2.0", "Q"=>"<= 0.0", "E"=>"<= 0.0", "L"=>"<= 1.0", "A"=>"<= 1.0", "C"=>"<= 12.0"}}, {"key"=>["S", "0.0"], "value"=>{"H"=>"<= 0.0", "E"=>"<= 0.0"}}, {"key"=>["S", "1.0"], "value"=>{"H"=>"<= 0.0", "E"=>"<= 0.0"}}, {"key"=>["S", "2.0"], "value"=>{"H"=>"<= 0.0", "E"=>"<= 0.0"}}, {"key"=>["T", "0.0"], "value"=>{}}, {"key"=>["U", "0.0"], "value"=>{"E"=>"<= 0.0", "U"=>"<= 11.0"}}, {"key"=>["U", "1.0"], "value"=>{"E"=>"<= 0.0", "U"=>"<= 11.0"}}, {"key"=>["U", "2.0"], "value"=>{"E"=>"<= 0.0", "U"=>"<= 11.0"}}, {"key"=>["U", "3.0"], "value"=>{"E"=>"<= 0.0", "U"=>"<= 11.0"}}, {"key"=>["U", "4.0"], "value"=>{"E"=>"<= 0.0", "U"=>"<= 11.0"}}, {"key"=>["U", "5.0"], "value"=>{"E"=>"<= 0.0", "U"=>"<= 11.0"}}, {"key"=>["U", "6.0"], "value"=>{"E"=>"<= 0.0", "U"=>"<= 11.0"}}, {"key"=>["U", "7.0"], "value"=>{"E"=>"<= 0.0", "U"=>"<= 11.0"}}, {"key"=>["U", "8.0"], "value"=>{"E"=>"<= 0.0", "U"=>"<= 11.0"}}, {"key"=>["U", "9.0"], "value"=>{"E"=>"<= 0.0", "U"=>"<= 11.0"}}, {"key"=>["U", "10.0"], "value"=>{"E"=>"<= 0.0", "U"=>"<= 11.0"}}, {"key"=>["U", "11.0"], "value"=>{"E"=>"<= 0.0", "U"=>"<= 11.0"}}, {"key"=>["V", "0.0"], "value"=> {"W"=>"<= 0.0", "X"=>"<= 0.0", "E"=>"<= 0.0", "L"=>"<= 1.0", "A"=>"<= 1.0", "C"=>"<= 12.0", "Y"=>"<= 0.0"}}, {"key"=>["V", "1.0"], "value"=> {"W"=>"<= 0.0", "X"=>"<= 0.0", "E"=>"<= 0.0", "J"=>"<= 0.0", "L"=>"<= 1.0", "A"=>"<= 1.0", "C"=>"<= 12.0", "Y"=>"<= 0.0"}}, {"key"=>["W", "0.0"], "value"=>{}}, {"key"=>["X", "0.0"], "value"=>{"C"=>"<= 12.0"}}, {"key"=>["Y", "0.0"], "value"=>{"E"=>"<= 0.0", "A"=>"<= 1.0", "C"=>"<= 12.0"}}, {"key"=>["Z", "0.0"], "value"=>{}}, {"key"=>["AA", "0.0"], "value"=>{"C"=>"<= 12.0"}}, {"key"=>["AB", "0.0"], "value"=>{"E"=>"<= 0.0"}}, {"key"=>["AC", "0.0"], "value"=>{"E"=>"<= 0.0", "U"=>"<= 11.0"}}, {"key"=>["AD", "0.0"], "value"=>{}}, {"key"=>["AE", "0.0"], "value"=>{"E"=>"<= 0.0"}}, {"key"=>["AF", "0.0"], "value"=>{"X"=>"<= 0.0", "E"=>"<= 0.0", "C"=>"<= 12.0"}}, {"key"=>["AG", "0.0"], "value"=>{}}, {"key"=>["AH", "0.0"], "value"=>{"E"=>"<= 0.0"}}, {"key"=>["AI", "0.0"], "value"=>{"X"=>"<= 0.0", "U"=>"<= 11.0"}}, {"key"=>["AI", "1.0"], "value"=>{"X"=>"<= 0.0", "U"=>"<= 11.0"}}, {"key"=>["AI", "2.0"], "value"=>{"X"=>"<= 0.0", "U"=>"<= 11.0"}}, {"key"=>["AI", "3.0"], "value"=>{"X"=>"<= 0.0", "U"=>"<= 11.0"}}, {"key"=>["AI", "4.0"], "value"=>{"X"=>"<= 0.0", "U"=>"<= 11.0"}}, {"key"=>["AI", "5.0"], "value"=>{"X"=>"<= 0.0", "U"=>"<= 11.0"}}, {"key"=>["AJ", "0.0"], "value"=> {"AK"=>"<= 2.0", "E"=>"<= 0.0", "J"=>"<= 0.0", "AI"=>"<= 5.0", "U"=>"<= 11.0", "Y"=>"<= 0.0"}}, {"key"=>["AK", "0.0"], "value"=>{"J"=>"<= 0.0", "U"=>"<= 11.0", "AI"=>"<= 5.0"}}, {"key"=>["AK", "1.0"], "value"=>{"J"=>"<= 0.0", "AI"=>"<= 5.0", "U"=>"<= 11.0"}}, {"key"=>["AK", "2.0"], "value"=>{"J"=>"<= 0.0", "AI"=>"<= 5.0", "U"=>"<= 11.0"}}, {"key"=>["AL", "0.0"], "value"=> {"A"=>"<= 1.0", "U"=>"<= 11.0", "H"=>"<= 0.0", "V"=>"<= 1.0", "Z"=>"<= 0.0", "AA"=>"<= 0.0", "AB"=>"<= 0.0", "AC"=>"<= 0.0", "AD"=>"<= 0.0", "X"=>"<= 0.0", "AE"=>"<= 0.0", "O"=>"<= 0.0", "M"=>"<= 0.0", "AF"=>"<= 0.0", "AG"=>"<= 0.0", "C"=>"<= 12.0", "B"=>"<= 0.0", "N"=>"<= 8.0", "Y"=>"<= 0.0", "AH"=>"<= 0.0", "AI"=>"<= 5.0", "Q"=>"<= 0.0", "J"=>"<= 0.0", "AJ"=>"<= 0.0"}}] padding_packages = [{"key"=>["padding1", "1.0"], "value"=>{}}, {"key"=>["padding2", "1.0"], "value"=>{}} ] dependencies_whose_constraints_match_no_versions = [{"key"=>["A", "1.0"], "value"=>{}}, {"key"=>["B", "1.0"], "value"=>{"A"=>"> 1.0"}}, {"key"=>["C", "1.0"], "value"=>{"B"=>nil}}, *padding_packages ] dependency_on_non_existent_package = [{"key"=>["depends_on_nosuch", "1.0.0"], "value"=>{"nosuch"=>"= 2.0.0"}}, {"key"=>["transitive_dep_on_nosuch", "1.0.0"], "value"=>{"depends_on_nosuch"=>nil}}, *padding_packages ] satisfiable_circular_dependency_graph = [{"key"=>["A", "1.0.0"], "value"=>{"B"=>"= 1.0.0"}}, {"key"=>["B", "1.0.0"], "value"=>{"A"=>"= 1.0.0"}} ] unsatisfiable_circular_dependency_graph = [{"key"=>["A", "1.0.0"], "value"=>{"B"=>"= 1.0.0"}}, {"key"=>["A", "2.0.0"], "value"=>{"B"=>"= 2.0.0"}}, {"key"=>["B", "1.0.0"], "value"=>{"A"=>"= 2.0.0"}}, {"key"=>["B", "2.0.0"], "value"=>{"A"=>"= 1.0.0"}}, *padding_packages ] describe DepSelector::Selector do describe "find_solution" do it "a simple set of constraints and includes transitive dependencies" do dep_graph = DepSelector::DependencyGraph.new setup_constraint(dep_graph, simple_cookbook_version_constraint) selector = DepSelector::Selector.new(dep_graph) solution_constraints = setup_soln_constraints(dep_graph, [ ["A"], ["B", "= 1.0.0"] ]) soln = selector.find_solution(solution_constraints) verify_solution(soln, { "A" => "2.0.0", "B" => "1.0.0", "C" => "1.0.0" }) end it "a simple set of constraints and doesn't include unnecessary dependencies" do dep_graph = DepSelector::DependencyGraph.new setup_constraint(dep_graph, simple_cookbook_version_constraint) selector = DepSelector::Selector.new(dep_graph) solution_constraints = setup_soln_constraints(dep_graph, [ ["A"], ["B", "= 2.0.0"] ]) soln = selector.find_solution(solution_constraints) verify_solution(soln, { "A" => "1.0.0", "B" => "2.0.0" }) end it "a simple set of constraints and does not include unnecessary assignments" do dep_graph = DepSelector::DependencyGraph.new setup_constraint(dep_graph, simple_cookbook_version_constraint) selector = DepSelector::Selector.new(dep_graph) solution_constraints = setup_soln_constraints(dep_graph, [ ["A"], ["B", "= 2.0.0"] ]) soln = selector.find_solution(solution_constraints) verify_solution(soln, { "A" => "1.0.0", "B" => "2.0.0" }) end it "and indicates which solution constraint makes the system unsatisfiable if there is no solution" do dep_graph = DepSelector::DependencyGraph.new setup_constraint(dep_graph, simple_cookbook_version_constraint_2) setup_constraint(dep_graph, padding_packages) selector = DepSelector::Selector.new(dep_graph) unsatisfiable_solution_constraints = setup_soln_constraints(dep_graph, [ ["A"], ["C", "= 3.0.0"], ["padding1"] ]) begin selector.find_solution(unsatisfiable_solution_constraints) fail "Should have failed to find a solution" rescue DepSelector::Exceptions::NoSolutionExists => nse nse.unsatisfiable_solution_constraint.should == unsatisfiable_solution_constraints[1] nse.disabled_non_existent_packages.should == [] nse.disabled_most_constrained_packages.should == [dep_graph.package('C')] end end it "can solve a moderately complex system with a unique solution" do dep_graph = DepSelector::DependencyGraph.new setup_constraint(dep_graph, moderate_cookbook_version_constraint) selector = DepSelector::Selector.new(dep_graph) solution_constraints = setup_soln_constraints(dep_graph, [ ["A"], ["C", "= 4.0"], ]) soln = selector.find_solution(solution_constraints) verify_solution(soln, { "A" => "1.0.0", "B" => "2.0.0", "C" => "4.0.0", "D" => "4.0.0" }) end it "should find a solution regardless of the dependency graph having a package with a dependency constrained to a range that includes no packages" do dep_graph = DepSelector::DependencyGraph.new setup_constraint(dep_graph, simple_cookbook_version_constraint) setup_constraint(dep_graph, dependencies_whose_constraints_match_no_versions) selector = DepSelector::Selector.new(dep_graph) solution_constraints = setup_soln_constraints(dep_graph, [ ["A"], ["B", "= 1.0.0"] ]) soln = selector.find_solution(solution_constraints) verify_solution(soln, { "A" => "2.0.0", "B" => "1.0.0", "C" => "1.0.0" }) end it "should fail to find a solution when one or more solution constraints are invalid and respect the authoritative list of extant packages" do dep_graph = DepSelector::DependencyGraph.new setup_constraint(dep_graph, dependencies_whose_constraints_match_no_versions) setup_constraint(dep_graph, padding_packages) selector = DepSelector::Selector.new(dep_graph) invalid_solution_constraints = setup_soln_constraints(dep_graph, [ ["padding1"], # these don't exist ["nosuch1", "> 1.0.0"], ["nosuch2", "> 1.0.0"], # these match no versions ["A", "> 1.0"], ["B", "> 1.0"], # this is passed into find_solutions as valid but will have no versions ["really_does_exist"], ["padding2"] ]) begin selector.find_solution(invalid_solution_constraints, [dep_graph.package("really_does_exist")]) fail "Should have failed to find a solution" rescue DepSelector::Exceptions::InvalidSolutionConstraints => isc isc.non_existent_packages.should == [ invalid_solution_constraints[1], invalid_solution_constraints[2] ] isc.constrained_to_no_versions.should == [ invalid_solution_constraints[3], invalid_solution_constraints[4], invalid_solution_constraints[5] ] end end it "should fail to find a solution when a solution constraint's dependency is constrained to a range that includes no packages" do dep_graph = DepSelector::DependencyGraph.new setup_constraint(dep_graph, dependencies_whose_constraints_match_no_versions) selector = DepSelector::Selector.new(dep_graph) unsatisfiable_solution_constraints = setup_soln_constraints(dep_graph, [ ["padding1"], ["B"], ["padding2"], ]) begin selector.find_solution(unsatisfiable_solution_constraints) fail "Should have failed to find a solution" rescue DepSelector::Exceptions::NoSolutionExists => nse nse.unsatisfiable_solution_constraint.should == unsatisfiable_solution_constraints[1] nse.disabled_non_existent_packages.should == [] nse.disabled_most_constrained_packages.should == [dep_graph.package('A')] end end it "should fail to find a solution when a solution constraint's transitive dependency is constrained to a range that includes no packages" do dep_graph = DepSelector::DependencyGraph.new setup_constraint(dep_graph, dependencies_whose_constraints_match_no_versions) selector = DepSelector::Selector.new(dep_graph) unsatisfiable_solution_constraints = setup_soln_constraints(dep_graph, [ ["padding1"], ["C"], ["padding2"], ]) begin selector.find_solution(unsatisfiable_solution_constraints) fail "Should have failed to find a solution" rescue DepSelector::Exceptions::NoSolutionExists => nse nse.unsatisfiable_solution_constraint.should == unsatisfiable_solution_constraints[1] nse.disabled_non_existent_packages.should == [] nse.disabled_most_constrained_packages.should == [dep_graph.package('A')] end end it "should find a solution if one can be found regardless of invalid dependencies" do dep_graph = DepSelector::DependencyGraph.new setup_constraint(dep_graph, simple_cookbook_version_constraint) setup_constraint(dep_graph, dependency_on_non_existent_package) selector = DepSelector::Selector.new(dep_graph) solution_constraints = setup_soln_constraints(dep_graph, [ ["A"], ["B", "= 1.0.0"] ]) soln = selector.find_solution(solution_constraints) verify_solution(soln, { "A" => "2.0.0", "B" => "1.0.0", "C" => "1.0.0" }) end it "should fail to find a solution if a package with an invalid dependency is a direct dependency of one of the solution constraints" do dep_graph = DepSelector::DependencyGraph.new setup_constraint(dep_graph, dependency_on_non_existent_package) selector = DepSelector::Selector.new(dep_graph) solution_constraints = setup_soln_constraints(dep_graph, [ ["padding1"], ["depends_on_nosuch"], ["padding2"] ]) begin selector.find_solution(solution_constraints) fail "Should have failed to find a solution" rescue DepSelector::Exceptions::NoSolutionExists => nse nse.unsatisfiable_solution_constraint.should == solution_constraints[1] nse.disabled_non_existent_packages.should == [dep_graph.package('nosuch')] nse.disabled_most_constrained_packages.should == [] end end it "should respect the authoritative list of extant packages in the case of failure" do dep_graph = DepSelector::DependencyGraph.new setup_constraint(dep_graph, dependency_on_non_existent_package) selector = DepSelector::Selector.new(dep_graph) solution_constraints = setup_soln_constraints(dep_graph, [ ["padding1"], ["depends_on_nosuch"], ["padding2"] ]) begin selector.find_solution(solution_constraints, [dep_graph.package('nosuch')]) fail "Should have failed to find a solution" rescue DepSelector::Exceptions::NoSolutionExists => nse nse.unsatisfiable_solution_constraint.should == solution_constraints[1] nse.disabled_non_existent_packages.should == [] nse.disabled_most_constrained_packages.should == [dep_graph.package('nosuch')] end end it "should fail to find a solution if a package with an invalid dependency is a transitive dependency of one of the solution constraints" do dep_graph = DepSelector::DependencyGraph.new setup_constraint(dep_graph, dependency_on_non_existent_package) selector = DepSelector::Selector.new(dep_graph) solution_constraints = setup_soln_constraints(dep_graph, [ ["padding1"], ["transitive_dep_on_nosuch"], ["padding2"] ]) begin selector.find_solution(solution_constraints) fail "Should have failed to find a solution" rescue DepSelector::Exceptions::NoSolutionExists => nse nse.unsatisfiable_solution_constraint.should == solution_constraints[1] nse.disabled_non_existent_packages.should == [dep_graph.package('nosuch')] nse.disabled_most_constrained_packages.should == [] end end it "should solve a circular dependency graph that has a valid solution" do dep_graph = DepSelector::DependencyGraph.new setup_constraint(dep_graph, satisfiable_circular_dependency_graph) selector = DepSelector::Selector.new(dep_graph) solution_constraints = setup_soln_constraints(dep_graph, [ ["A"], ]) soln = selector.find_solution(solution_constraints) verify_solution(soln, { "A" => "1.0.0", "B" => "1.0.0" }) end it "should fail to find a solution for (and not infinitely recurse on) a dependency graph that does not have a valid solution" do dep_graph = DepSelector::DependencyGraph.new setup_constraint(dep_graph, unsatisfiable_circular_dependency_graph) selector = DepSelector::Selector.new(dep_graph) solution_constraints = setup_soln_constraints(dep_graph, [ ["padding1"], ["A", "= 1.0.0"], ["padding2"] ]) begin selector.find_solution(solution_constraints) fail "Should have failed to find a solution" rescue DepSelector::Exceptions::NoSolutionExists => nse nse.unsatisfiable_solution_constraint.should == solution_constraints[1] nse.disabled_non_existent_packages.should == [] nse.disabled_most_constrained_packages.should == [dep_graph.package('B')] end end it "should indicate that the problematic package is the dependency that is constrained to no versions" do dep_graph = DepSelector::DependencyGraph.new setup_constraint(dep_graph, moderate_cookbook_version_constraint_3) selector = DepSelector::Selector.new(dep_graph) unsatisfiable_solution_constraints = setup_soln_constraints(dep_graph, [ ["g"] ]) begin selector.find_solution(unsatisfiable_solution_constraints) fail "Should have failed to find a solution" rescue DepSelector::Exceptions::NoSolutionExists => nse nse.message.should == "Unable to satisfy constraints on package d due to solution constraint (g >= 0.0.0). Solution constraints that may result in a constraint on d: [(g = 1.0.0) -> (d > 5.0.0)]" nse.disabled_non_existent_packages.should == [] nse.disabled_most_constrained_packages.should == [dep_graph.package('d')] end end it "solves moderately complex dependency graph #3" do dep_graph = DepSelector::DependencyGraph.new setup_constraint(dep_graph, moderate_cookbook_version_constraint_3) selector = DepSelector::Selector.new(dep_graph) unsatisfiable_solution_constraints = setup_soln_constraints(dep_graph, [ ["b", "= 1.0"], ["a", "= 1.0"], ]) soln = selector.find_solution(unsatisfiable_solution_constraints) verify_solution(soln, { "a" => "1.0.0", "b" => "1.0.0", "c" => "2.0.0", "d" => "2.1.0", "f" => "1.0.0", }) end end it "solves moderately complex dependency graph #3 and times out", :volatile do # This test does not reliably trigger timeout. pending("test unreliable, investigate") dep_graph = DepSelector::DependencyGraph.new setup_constraint(dep_graph, big_cookbook_version_constraint_2) selector = DepSelector::Selector.new(dep_graph, 0.001) constraints = setup_soln_constraints(dep_graph, [["A"], ["B"], ["C"], ["N"], ["R"], ["AL"] ]) expect do selector.find_solution(constraints) end.to raise_error(DepSelector::Exceptions::TimeBoundExceeded) end # TODO [cw,2011/2/4]: Add a test for a set of solution constraints # that contains multiple restrictions on the same package. Do the # same for a PackageVersion that has several Dependencies on the # same package, some satisfiable, some not. end dep-selector-1.0.3/spec/dep_selector/solution_constraint_spec.rb000066400000000000000000000037051232552612700251740ustar00rootroot00000000000000# # Author:: Christopher Walters () # Copyright:: Copyright (c) 2011 Opscode, Inc. # License:: Apache License, Version 2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # require File.expand_path(File.dirname(__FILE__) + '/../spec_helper') require 'dep_selector/solution_constraint' # This also tests Dependency describe DepSelector::SolutionConstraint do describe "equality testing" do before do @sc1_1 = DepSelector::SolutionConstraint.new(DepSelector::Package.new(nil, 'A'), DepSelector::Version.new("1.0.0")) @sc1_2 = DepSelector::SolutionConstraint.new(DepSelector::Package.new(nil, 'A'), DepSelector::Version.new("1.0.0")) @dep1_1 = DepSelector::Dependency.new(DepSelector::Package.new(nil, 'A'), DepSelector::Version.new("1.0.0")) @dep1_2 = DepSelector::Dependency.new(DepSelector::Package.new(nil, 'A'), DepSelector::Version.new("1.0.0")) end describe "==" do it "should be true when the objects are equal" do @sc1_1.should == @sc1_2 @sc1_1.should == @dep1_1 @dep1_1.should == @sc1_1 @dep1_1.should == @dep1_2 end end describe "eql?" do it "should be true when an object of the same type is ==" do @sc1_1.should eql(@sc1_2) @dep1_1.should eql(@dep1_2) end it "should be false when comparing to an object of a different type" do @sc1_1.should_not eql(@dep1) @dep1.should_not eql(@sc1_1) end end end end dep-selector-1.0.3/spec/dep_selector/version_constraint_spec.rb000066400000000000000000000102171232552612700250010ustar00rootroot00000000000000# # Author:: Seth Falcon () # Copyright:: Copyright 2010 Opscode, Inc. # License:: Apache License, Version 2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # require File.expand_path(File.dirname(__FILE__) + '/../spec_helper') describe DepSelector::VersionConstraint do describe "==" do it "should be true if the constraints are equal" do DepSelector::VersionConstraint.new("= 1.0.0").should == DepSelector::VersionConstraint.new("= 1.0.0") end end describe "validation" do bad_version = ["> >", ">= 1.2.z", "> 1.2.3 < 5.0", "> 1.2.3, < 5.0"] bad_op = ["<3.0.1", ">$ 1.2.3", "! 3.4"] o_error = DepSelector::Exceptions::InvalidVersionConstraint v_error = DepSelector::Exceptions::InvalidVersion bad_version.each do |s| it "should raise #{v_error} when given #{s}" do lambda { DepSelector::VersionConstraint.new s }.should raise_error(v_error) end end bad_op.each do |s| it "should raise #{o_error} when given #{s}" do lambda { DepSelector::VersionConstraint.new s }.should raise_error(o_error) end end it "should interpret a lone version number as implicit = OP" do vc = DepSelector::VersionConstraint.new("1.2.3") vc.to_s.should == "= 1.2.3" end it "should allow initialization with [] for back compatibility" do DepSelector::VersionConstraint.new([]) == DepSelector::VersionConstraint.new end it "should allow initialization with ['1.2.3'] for back compatibility" do DepSelector::VersionConstraint.new(["1.2"]) == DepSelector::VersionConstraint.new("1.2") end end it "should default to >= 0.0.0" do vc = DepSelector::VersionConstraint.new vc.to_s.should == ">= 0.0.0" end it "should default to >= 0.0.0 when initialized with nil" do DepSelector::VersionConstraint.new(nil).to_s.should == ">= 0.0.0" end describe "include?" do describe "handles various input data types" do before do @vc = DepSelector::VersionConstraint.new "> 1.2.3" end it "String" do @vc.should include "1.4" end it "DepSelector::Version" do @vc.should include DepSelector::Version.new("1.4") end end it "strictly less than" do vc = DepSelector::VersionConstraint.new "< 1.2.3" vc.should_not include "1.3.0" vc.should_not include "1.2.3" vc.should include "1.2.2" end it "strictly greater than" do vc = DepSelector::VersionConstraint.new "> 1.2.3" vc.should include "1.3.0" vc.should_not include "1.2.3" vc.should_not include "1.2.2" end it "less than or equal to" do vc = DepSelector::VersionConstraint.new "<= 1.2.3" vc.should_not include "1.3.0" vc.should include "1.2.3" vc.should include "1.2.2" end it "greater than or equal to" do vc = DepSelector::VersionConstraint.new ">= 1.2.3" vc.should include "1.3.0" vc.should include "1.2.3" vc.should_not include "1.2.2" end it "equal to" do vc = DepSelector::VersionConstraint.new "= 1.2.3" vc.should_not include "1.3.0" vc.should include "1.2.3" vc.should_not include "0.3.0" end it "pessimistic ~> x.y.z" do vc = DepSelector::VersionConstraint.new "~> 1.2.3" vc.should include "1.2.3" vc.should include "1.2.4" vc.should_not include "1.2.2" vc.should_not include "1.3.0" vc.should_not include "2.0.0" end it "pessimistic ~> x.y" do vc = DepSelector::VersionConstraint.new "~> 1.2" vc.should include "1.3.3" vc.should include "1.4" vc.should_not include "2.2" vc.should_not include "0.3.0" end end end dep-selector-1.0.3/spec/dep_selector/version_spec.rb000066400000000000000000000144141232552612700225400ustar00rootroot00000000000000# # Author:: Seth Falcon () # Author:: Christopher Walters () # Copyright:: Copyright (c) 2010 Opscode, Inc. # License:: Apache License, Version 2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # require File.expand_path(File.dirname(__FILE__) + '/../spec_helper') require 'dep_selector/version' describe DepSelector::Version do before do @v0 = DepSelector::Version.new "0.0.0" @v123 = DepSelector::Version.new "1.2.3" end it "should turn itself into a string" do @v0.to_s.should == "0.0.0" @v123.to_s.should == "1.2.3" end it "should make a round trip with its string representation" do a = DepSelector::Version.new(@v123.to_s) a.should == @v123 end it "should transform 1.2 to 1.2.0" do DepSelector::Version.new("1.2").to_s.should == "1.2.0" end it "should transform 01.002.0003 to 1.2.3" do a = DepSelector::Version.new "01.002.0003" a.should == @v123 end describe "when creating valid Versions" do good_versions = %w(1.2 1.2.3 1000.80.50000 0.300.25 001.02.00003) good_versions.each do |v| it "should accept '#{v}'" do DepSelector::Version.new v end end end describe "when given bogus input" do bad_versions = ["1.2.3.4", "1.2.a4", "1", "a", "1.2 3", "1.2 a", "1 2 3", "1-2-3", "1_2_3", "1.2_3", "1.2-3"] the_error = DepSelector::Exceptions::InvalidVersion bad_versions.each do |v| it "should raise #{the_error} when given '#{v}'" do lambda { DepSelector::Version.new v }.should raise_error(the_error) end end end describe "<=>" do it "should equate versions 1.2 and 1.2.0" do DepSelector::Version.new("1.2").should == DepSelector::Version.new("1.2.0") end it "should equate version 1.04 and 1.4" do DepSelector::Version.new("1.04").should == DepSelector::Version.new("1.4") end it "should treat versions as numbers in the right way" do DepSelector::Version.new("2.0").should be < DepSelector::Version.new("11.0") end it "should sort based on the version number" do examples = [ # smaller, larger ["1.0", "2.0"], ["1.2.3", "1.2.4"], ["1.2.3", "1.3.0"], ["1.2.3", "1.3"], ["1.2.3", "2.1.1"], ["1.2.3", "2.1"], ["1.2", "1.2.4"], ["1.2", "1.3.0"], ["1.2", "1.3"], ["1.2", "2.1.1"], ["1.2", "2.1"] ] examples.each do |smaller, larger| sm = DepSelector::Version.new(smaller) lg = DepSelector::Version.new(larger) sm.should be < lg lg.should be > sm sm.should_not == lg end end it "should sort an array of versions" do a = %w{0.0.0 0.0.1 0.1.0 0.1.1 1.0.0 1.1.0 1.1.1}.map do |s| DepSelector::Version.new(s) end got = a.sort.map {|v| v.to_s } got.should == %w{0.0.0 0.0.1 0.1.0 0.1.1 1.0.0 1.1.0 1.1.1} end it "should sort an array of versions, part 2" do a = %w{9.8.7 1.0.0 1.2.3 4.4.6 4.5.6 0.8.6 4.5.5 5.9.8 3.5.7}.map do |s| DepSelector::Version.new(s) end got = a.sort.map { |v| v.to_s } got.should == %w{0.8.6 1.0.0 1.2.3 3.5.7 4.4.6 4.5.5 4.5.6 5.9.8 9.8.7} end describe "comparison examples" do [ [ "0.0.0", :>, "0.0.0", false ], [ "0.0.0", :>=, "0.0.0", true ], [ "0.0.0", :==, "0.0.0", true ], [ "0.0.0", :<=, "0.0.0", true ], [ "0.0.0", :<, "0.0.0", false ], [ "0.0.0", :>, "0.0.1", false ], [ "0.0.0", :>=, "0.0.1", false ], [ "0.0.0", :==, "0.0.1", false ], [ "0.0.0", :<=, "0.0.1", true ], [ "0.0.0", :<, "0.0.1", true ], [ "0.0.1", :>, "0.0.1", false ], [ "0.0.1", :>=, "0.0.1", true ], [ "0.0.1", :==, "0.0.1", true ], [ "0.0.1", :<=, "0.0.1", true ], [ "0.0.1", :<, "0.0.1", false ], [ "0.1.0", :>, "0.1.0", false ], [ "0.1.0", :>=, "0.1.0", true ], [ "0.1.0", :==, "0.1.0", true ], [ "0.1.0", :<=, "0.1.0", true ], [ "0.1.0", :<, "0.1.0", false ], [ "0.1.1", :>, "0.1.1", false ], [ "0.1.1", :>=, "0.1.1", true ], [ "0.1.1", :==, "0.1.1", true ], [ "0.1.1", :<=, "0.1.1", true ], [ "0.1.1", :<, "0.1.1", false ], [ "1.0.0", :>, "1.0.0", false ], [ "1.0.0", :>=, "1.0.0", true ], [ "1.0.0", :==, "1.0.0", true ], [ "1.0.0", :<=, "1.0.0", true ], [ "1.0.0", :<, "1.0.0", false ], [ "1.0.0", :>, "0.0.1", true ], [ "1.0.0", :>=, "1.9.2", false ], [ "1.0.0", :==, "9.7.2", false ], [ "1.0.0", :<=, "1.9.1", true ], [ "1.0.0", :<, "1.9.0", true ], [ "1.2.2", :>, "1.2.1", true ], [ "1.2.2", :>=, "1.2.1", true ], [ "1.2.2", :==, "1.2.1", false ], [ "1.2.2", :<=, "1.2.1", false ], [ "1.2.2", :<, "1.2.1", false ] ].each do |spec| it "(#{spec.first(3).join(' ')}) should be #{spec[3]}" do got = DepSelector::Version.new(spec[0]).send(spec[1], DepSelector::Version.new(spec[2])) got.should == spec[3] end end end end it "should implement the ability to be hashed correctly" do v1_1 = DepSelector::Version.new("1.0.0") v1_2 = DepSelector::Version.new("1.0.0") # the objects' references are not equal v1_1.should_not equal(v1_2) # the contract with hash is that v1_1.eql?(v1_2) implies that # v1_1.hash == v1_2.hash v1_1.should eql(v1_2) v1_1.hash.should == v1_2.hash # putting it all together, inserting by v1_1 and accessing by v1_2 # should succeed hash = {} hash[v1_1] = v1_1 hash[v1_2].should equal(v1_1) end end dep-selector-1.0.3/spec/solve_integration_spec.rb000066400000000000000000000044241232552612700221360ustar00rootroot00000000000000require 'spec_helper' require 'solve' # The current version of solve (0.8.2) doesn't quite match the API we require. # This will be remedied in a future release. module Solve class Constraint def include?(v) satisfies?(v) end end end # Test that we can use duck typing to pass Solve's version and constraint # types to dep-selector describe "Integration with berkshelf solve" do let(:solve_graph) do graph = Solve::Graph.new graph.artifacts("top-level", "1.0.0") .depends("dep-package", ">= 0.0.0") graph.artifacts("dep-package", "1.0.0-beta") graph end let(:demands) { [["get-the-old-one"]] } let(:graph) { DepSelector::DependencyGraph.new } let(:solve_artifact_top_level) { solve_graph.artifacts("top-level", "1.0.0") } let(:solve_artifact_dep_package) { solve_graph.artifacts("dep-package", "1.0.0") } it "uses solve's artifact objects to describe the problem" do artifact = solve_artifact_top_level package_version = graph.package(artifact.name).add_version(artifact.version) package_version.version.should == Solve::Version.new("1.0.0") end it "uses solve's constraints to find matching packages" do artifact = solve_artifact_top_level package_version = graph.package(artifact.name).add_version(artifact.version) package = graph.package(artifact.name) package[Solve::Constraint.new(">= 0.0.0")].should == [ package_version ] end it "uses solve's dependencies to describe the problem" do artifact = solve_artifact_top_level dependency = solve_artifact_top_level.dependencies.first # Add packages to dep-selector's graph graph.package(solve_artifact_top_level.name).add_version(solve_artifact_top_level.version) graph.package(solve_artifact_dep_package.name).add_version(solve_artifact_dep_package.version) DepSelector::Dependency.new(graph.package(dependency.name), dependency.constraint) gecode_all_versions = [ graph.package(dependency.name) ] gecode_demands = [ DepSelector::SolutionConstraint.new(graph.package(artifact.name), Solve::Constraint.new(">= 0.0.0")) ] selector = DepSelector::Selector.new(graph, (1.0)) solution = selector.find_solution(gecode_demands, gecode_all_versions) solution.should == { "top-level" => Solve::Version.new("1.0.0") } end end dep-selector-1.0.3/spec/spec_helper.rb000066400000000000000000000041261232552612700176610ustar00rootroot00000000000000# # Author:: Christopher Walters () # Author:: Mark Anderson () # Copyright:: Copyright (c) 2010-2011 Opscode, Inc. # License:: Apache License, Version 2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # require 'rubygems' $:.unshift(File.expand_path("../../ext/dep_gecode", __FILE__)) require 'dep_selector' require 'pp' RSpec.configure do |config| config.run_all_when_everything_filtered = true config.treat_symbols_as_metadata_keys_with_true_values = true config.filter_run :focus => true config.filter_run_excluding :external => true # Tests that randomly fail, but may have value. config.filter_run_excluding :volatile => true end def setup_constraint(dep_graph, cset) cset.each do |cb_version| package_name = cb_version["key"].first version = DepSelector::Version.new(cb_version["key"].last) dependencies = cb_version['value'] pv = dep_graph.package(package_name).add_version(version) dependencies.each_pair do |dep_name, constraint_str| constraint = DepSelector::VersionConstraint.new(constraint_str) pv.dependencies << DepSelector::Dependency.new(dep_graph.package(dep_name), constraint) end end end def setup_soln_constraints(dep_graph, soln_constraints) soln_constraints.map do |elt| pkg = dep_graph.package(elt.shift) constraint = DepSelector::VersionConstraint.new(elt.shift) DepSelector::SolutionConstraint.new(pkg, constraint) end end def verify_solution(observed, expected) versions = expected.inject({}){|acc, elt| acc[elt.first]=DepSelector::Version.new(elt.last) ; acc} observed.should == versions end dep-selector-1.0.3/spec/version_constraints.rb000066400000000000000000000075041232552612700215070ustar00rootroot00000000000000# # Author:: Christopher Walters () # Author:: Mark Anderson () # Copyright:: Copyright (c) 2010-2011 Opscode, Inc. # License:: Apache License, Version 2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # module VersionConstraints Simple_cookbook_version_constraint = [{"key"=>["A", "1.0.0"], "value"=>{"B"=>"= 2.0.0"}}, {"key"=>["A", "2.0.0"], "value"=>{"B"=>"= 1.0.0", "C"=>"= 1.0.0"}}, {"key"=>["B", "1.0.0"], "value"=>{}}, {"key"=>["B", "2.0.0"], "value"=>{}}, {"key"=>["C", "1.0.0"], "value"=>{}}, ] SimpleProblem_1_soluble = { :desc => "Simple soluble problem, one solution", :version_constraint => Simple_cookbook_version_constraint, :runlist_constraint => [ ["A"], ["B", "= 1.0.0"] ], :solution => {'A'=>'2.0.0', 'B'=>'1.0.0', 'C'=>'1.0.0'} } SimpleProblem_2_insoluble = { :desc => "fails to solve a simple, unsatisfiable set of constraints", :version_constraint => Simple_cookbook_version_constraint, :runlist_constraint => [ ["A", "= 1.0.0"], ["B", "= 1.0.0"] ], :solution => {'A'=>'1.0.0', 'B'=>'1.0.0', 'C'=>'1.0.0'} } Simple_cookbook_version_constraint_2 = [{"key"=>["A", "1.0.0"], "value"=>{"B"=>"= 2.0.0", "C"=>"= 2.0.0"}}, {"key"=>["A", "2.0.0"], "value"=>{"B"=>"= 1.0.0", "C"=>"= 1.0.0"}}, {"key"=>["B", "1.0.0"], "value"=>{}}, {"key"=>["B", "2.0.0"], "value"=>{}}, {"key"=>["C", "1.0.0"], "value"=>{}}, {"key"=>["C", "2.0.0"], "value"=>{}}, {"key"=>["C", "3.0.0"], "value"=>{}} ] SimpleProblem_3_soluble = { :desc => "solves problem 3 constraints", :version_constraint => Simple_cookbook_version_constraint_2, :runlist_constraint => [ ["A"], ["B", "= 2.0.0"] ], :solution => { 'A'=>'1.0.0', 'B'=>'2.0.0', 'C'=>'2.0.0'} } Simple_cookbook_version_constraint_3 = [{"key"=>["A", "1.0.0"], "value"=>{"B"=>">= 1.0.0"}}, {"key"=>["B", "1.0.0"], "value"=>{}}, {"key"=>["B", "2.0.0"], "value"=>{}}, ] Moderate_cookbook_version_constraint = [{"key"=>["A", "1.0.0"], "value"=>{"B"=>"= 2.0.0", "C"=>">= 2.0.0"}}, {"key"=>["A", "2.0.0"], "value"=>{"B"=>"= 1.0.0", "C"=>"= 1.0.0"}}, {"key"=>["B", "1.0.0"], "value"=>{}}, {"key"=>["B", "2.0.0"], "value"=>{}}, {"key"=>["C", "1.0.0"], "value"=>{"D"=>">= 1.0.0"}}, {"key"=>["C", "2.0.0"], "value"=>{"D"=>">= 2.0.0"}}, {"key"=>["C", "3.0.0"], "value"=>{"D"=>">= 3.0.0"}}, {"key"=>["C", "4.0.0"], "value"=>{"D"=>">= 4.0.0"}}, {"key"=>["D", "1.0.0"], "value"=>{}}, {"key"=>["D", "2.0.0"], "value"=>{}}, {"key"=>["D", "3.0.0"], "value"=>{}}, {"key"=>["D", "4.0.0"], "value"=>{}} ] Moderate_cookbook_version_constraint_2 = [{"key"=>["A", "1.0"], "value"=>{"C"=>"< 4.0"}}, {"key"=>["B", "1.0"], "value"=>{"C"=>"< 3.0"}}, {"key"=>["C", "2.0"], "value"=>{"D"=>"> 1.0", "F"=>">= 0.0.0"}}, {"key"=>["C", "3.0"], "value"=>{"D"=>"> 2.0", "E"=>">= 0.0.0"}}, {"key"=>["D", "1.1"], "value"=>{}}, {"key"=>["D", "2.1"], "value"=>{}}, {"key"=>["E", "1.0"], "value"=>{}}, {"key"=>["F", "1.0"], "value"=>{}}, ] end