def find_solution(solution_constraints, valid_packages = nil)
packages_to_include_in_solve = trim_unreachable_packages(dep_graph, solution_constraints)
begin
solve(dep_graph.clone, solution_constraints, valid_packages, packages_to_include_in_solve)
rescue Exceptions::NoSolutionFound
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
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
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