Class: PubGrub::PartialSolution
- Inherits:
-
Object
- Object
- PubGrub::PartialSolution
- Defined in:
- lib/pub_grub/partial_solution.rb
Instance Attribute Summary collapse
-
#assignments ⇒ Object
readonly
Returns the value of attribute assignments.
-
#attempted_solutions ⇒ Object
readonly
Returns the value of attribute attempted_solutions.
-
#decisions ⇒ Object
readonly
Returns the value of attribute decisions.
Instance Method Summary collapse
- #backtrack(previous_level) ⇒ Object
- #decide(package, version) ⇒ Object
- #decision_level ⇒ Object
- #derive(term, cause) ⇒ Object
-
#initialize ⇒ PartialSolution
constructor
A new instance of PartialSolution.
- #relation(term) ⇒ Object
- #satisfier(term) ⇒ Object
- #satisfies?(term) ⇒ Boolean
-
#unsatisfied ⇒ Object
A list of unsatisfied terms.
Constructor Details
#initialize ⇒ PartialSolution
Returns a new instance of PartialSolution.
9 10 11 12 13 14 |
# File 'lib/pub_grub/partial_solution.rb', line 9 def initialize reset! @attempted_solutions = 1 @backtracking = false end |
Instance Attribute Details
#assignments ⇒ Object (readonly)
Returns the value of attribute assignments.
6 7 8 |
# File 'lib/pub_grub/partial_solution.rb', line 6 def assignments @assignments end |
#attempted_solutions ⇒ Object (readonly)
Returns the value of attribute attempted_solutions.
7 8 9 |
# File 'lib/pub_grub/partial_solution.rb', line 7 def attempted_solutions @attempted_solutions end |
#decisions ⇒ Object (readonly)
Returns the value of attribute decisions.
6 7 8 |
# File 'lib/pub_grub/partial_solution.rb', line 6 def decisions @decisions end |
Instance Method Details
#backtrack(previous_level) ⇒ Object
63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 |
# File 'lib/pub_grub/partial_solution.rb', line 63 def backtrack(previous_level) @backtracking = true new_assignments = assignments.select do |assignment| assignment.decision_level <= previous_level end new_decisions = Hash[decisions.first(previous_level)] reset! @decisions = new_decisions new_assignments.each do |assignment| add_assignment(assignment) end end |
#decide(package, version) ⇒ Object
54 55 56 57 58 59 60 61 |
# File 'lib/pub_grub/partial_solution.rb', line 54 def decide(package, version) @attempted_solutions += 1 if @backtracking @backtracking = false; decisions[package] = version assignment = Assignment.decision(package, version, decision_level, assignments.length) add_assignment(assignment) end |
#decision_level ⇒ Object
16 17 18 |
# File 'lib/pub_grub/partial_solution.rb', line 16 def decision_level @decisions.length end |
#derive(term, cause) ⇒ Object
32 33 34 |
# File 'lib/pub_grub/partial_solution.rb', line 32 def derive(term, cause) add_assignment(Assignment.new(term, cause, decision_level, assignments.length)) end |
#relation(term) ⇒ Object
20 21 22 23 24 25 26 |
# File 'lib/pub_grub/partial_solution.rb', line 20 def relation(term) package = term.package return :overlap if !@terms.key?(package) @relation_cache[package][term] ||= @terms[package].relation(term) end |
#satisfier(term) ⇒ Object
36 37 38 39 40 41 42 43 |
# File 'lib/pub_grub/partial_solution.rb', line 36 def satisfier(term) assignment = @assignments_by[term.package].bsearch do |assignment| @cumulative_assignments[assignment].satisfies?(term) end assignment || raise("#{term} unsatisfied") end |
#satisfies?(term) ⇒ Boolean
28 29 30 |
# File 'lib/pub_grub/partial_solution.rb', line 28 def satisfies?(term) relation(term) == :subset end |
#unsatisfied ⇒ Object
A list of unsatisfied terms
46 47 48 49 50 51 52 |
# File 'lib/pub_grub/partial_solution.rb', line 46 def unsatisfied @required.reject do |package| @decisions.key?(package) end.map do |package| @terms[package] end end |