class Solve::Solver
def resolve
-
(Hash)
-
def resolve trace("Attempting to find a solution") seed_demand_dependencies while unbound_variable = variable_table.first_unbound possible_values_for_unbound = possible_values_for(unbound_variable) trace("Searching for a value for #{unbound_variable.artifact}") trace("Constraints are") constraint_table.constraints_on_artifact(unbound_variable.artifact).each do |constraint| trace("\t#{constraint}") end trace("Possible values are #{possible_values_for_unbound}") while possible_value = possible_values_for_unbound.shift possible_artifact = graph.get_artifact(unbound_variable.artifact, possible_value.version) possible_dependencies = possible_artifact.dependencies all_ok = possible_dependencies.all? { |dependency| can_add_new_constraint?(dependency) } if all_ok trace("Attempting to use #{possible_artifact}") add_dependencies(possible_dependencies, possible_artifact) unbound_variable.bind(possible_value) break end end unless unbound_variable.bound? trace("Could not find an acceptable value for #{unbound_variable.artifact}") backtrack(unbound_variable) end end solution = {}.tap do |solution| variable_table.rows.each do |variable| solution[variable.artifact] = variable.value.version.to_s end end trace("Found Solution") trace(solution) solution end