Merge pull request #1566 from wolfv/structured_problems

add structured problems extraction and python interface
This commit is contained in:
Wolf Vollprecht 2022-03-09 23:12:35 +01:00 committed by GitHub
commit 4cdfdf1cd8
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 112 additions and 2 deletions

View File

@ -31,6 +31,22 @@ extern "C"
namespace mamba
{
class MSolverProblem
{
public:
SolverRuleinfo type;
Id source_id;
Id target_id;
Id dep_id;
Solver* solver;
std::string to_string() const;
PackageInfo target() const;
PackageInfo source() const;
};
class MSolver
{
public:
@ -55,6 +71,7 @@ namespace mamba
bool solve();
std::string problems_to_str() const;
std::vector<std::string> all_problems() const;
std::vector<MSolverProblem> all_problems_structured() const;
std::string all_problems_to_str() const;
const std::vector<MatchSpec>& install_specs() const;

View File

@ -13,6 +13,22 @@
namespace mamba
{
std::string MSolverProblem::to_string() const
{
return solver_problemruleinfo2str(
solver, (SolverRuleinfo) type, source_id, target_id, dep_id);
}
PackageInfo MSolverProblem::target() const
{
return pool_id2solvable(solver->pool, target_id);
}
PackageInfo MSolverProblem::source() const
{
return pool_id2solvable(solver->pool, source_id);
}
MSolver::MSolver(MPool& pool,
const std::vector<std::pair<int, int>>& flags,
const PrefixData* prefix_data)
@ -349,6 +365,38 @@ namespace mamba
return success;
}
std::vector<MSolverProblem> MSolver::all_problems_structured() const
{
std::vector<MSolverProblem> res;
Queue problem_rules;
queue_init(&problem_rules);
Id count = solver_problem_count(m_solver);
for (Id i = 1; i <= count; ++i)
{
solver_findallproblemrules(m_solver, i, &problem_rules);
for (Id j = 0; j < problem_rules.count; ++j)
{
Id type, source, target, dep;
Id r = problem_rules.elements[j];
if (r)
{
type = solver_ruleinfo(m_solver, r, &source, &target, &dep);
MSolverProblem problem;
problem.source_id = source;
problem.target_id = target;
problem.dep_id = dep;
problem.solver = m_solver;
problem.type = static_cast<SolverRuleinfo>(type);
res.push_back(problem);
}
}
}
queue_free(&problem_rules);
return res;
}
std::string MSolver::all_problems_to_str() const
{
std::stringstream problems;

View File

@ -1,4 +1,9 @@
import os
try:
from libmambapy.bindings import * # noqa: F401,F403
except ImportError:
pass
except ImportError as e:
if not os.environ.get("CONDA_BUILD_CROSS_COMPILATION"):
raise e
else:
print("libmambapy import error ignored due to cross compilation")

View File

@ -133,8 +133,18 @@ PYBIND11_MODULE(bindings, m)
.def("is_solved", &MSolver::is_solved)
.def("problems_to_str", &MSolver::problems_to_str)
.def("all_problems_to_str", &MSolver::all_problems_to_str)
.def("all_problems_structured", &MSolver::all_problems_structured)
.def("solve", &MSolver::solve);
py::class_<MSolverProblem>(m, "SolverProblem")
.def_readonly("target_id", &MSolverProblem::target_id)
.def_readonly("source_id", &MSolverProblem::source_id)
.def_readonly("dep_id", &MSolverProblem::dep_id)
.def_readonly("type", &MSolverProblem::type)
.def("__str__", &MSolverProblem::to_string)
.def("target", &MSolverProblem::target)
.def("source", &MSolverProblem::source);
py::class_<History>(m, "History")
.def(py::init<const fs::path&>())
.def("get_requested_specs_map", &History::get_requested_specs_map);
@ -530,6 +540,36 @@ PYBIND11_MODULE(bindings, m)
m.attr("SOLVER_FLAG_ONLY_NAMESPACE_RECOMMENDED") = SOLVER_FLAG_ONLY_NAMESPACE_RECOMMENDED;
m.attr("SOLVER_FLAG_STRICT_REPO_PRIORITY") = SOLVER_FLAG_STRICT_REPO_PRIORITY;
// Solver rule flags
py::enum_<SolverRuleinfo>(m, "SolverRuleinfo")
.value("SOLVER_RULE_UNKNOWN", SolverRuleinfo::SOLVER_RULE_UNKNOWN)
.value("SOLVER_RULE_PKG", SolverRuleinfo::SOLVER_RULE_PKG)
.value("SOLVER_RULE_PKG_NOT_INSTALLABLE", SolverRuleinfo::SOLVER_RULE_PKG_NOT_INSTALLABLE)
.value("SOLVER_RULE_PKG_NOTHING_PROVIDES_DEP",
SolverRuleinfo::SOLVER_RULE_PKG_NOTHING_PROVIDES_DEP)
.value("SOLVER_RULE_PKG_REQUIRES", SolverRuleinfo::SOLVER_RULE_PKG_REQUIRES)
.value("SOLVER_RULE_PKG_SELF_CONFLICT", SolverRuleinfo::SOLVER_RULE_PKG_SELF_CONFLICT)
.value("SOLVER_RULE_PKG_CONFLICTS", SolverRuleinfo::SOLVER_RULE_PKG_CONFLICTS)
.value("SOLVER_RULE_PKG_SAME_NAME", SolverRuleinfo::SOLVER_RULE_PKG_SAME_NAME)
.value("SOLVER_RULE_PKG_OBSOLETES", SolverRuleinfo::SOLVER_RULE_PKG_OBSOLETES)
.value("SOLVER_RULE_PKG_IMPLICIT_OBSOLETES",
SolverRuleinfo::SOLVER_RULE_PKG_IMPLICIT_OBSOLETES)
.value("SOLVER_RULE_PKG_INSTALLED_OBSOLETES",
SolverRuleinfo::SOLVER_RULE_PKG_INSTALLED_OBSOLETES)
.value("SOLVER_RULE_UPDATE", SolverRuleinfo::SOLVER_RULE_UPDATE)
.value("SOLVER_RULE_FEATURE", SolverRuleinfo::SOLVER_RULE_FEATURE)
.value("SOLVER_RULE_JOB", SolverRuleinfo::SOLVER_RULE_JOB)
.value("SOLVER_RULE_JOB_NOTHING_PROVIDES_DEP",
SolverRuleinfo::SOLVER_RULE_JOB_NOTHING_PROVIDES_DEP)
.value("SOLVER_RULE_JOB_PROVIDED_BY_SYSTEM",
SolverRuleinfo::SOLVER_RULE_JOB_PROVIDED_BY_SYSTEM)
.value("SOLVER_RULE_JOB_UNKNOWN_PACKAGE", SolverRuleinfo::SOLVER_RULE_JOB_UNKNOWN_PACKAGE)
.value("SOLVER_RULE_JOB_UNSUPPORTED", SolverRuleinfo::SOLVER_RULE_JOB_UNSUPPORTED)
.value("SOLVER_RULE_DISTUPGRADE", SolverRuleinfo::SOLVER_RULE_DISTUPGRADE)
.value("SOLVER_RULE_INFARCH", SolverRuleinfo::SOLVER_RULE_INFARCH)
.value("SOLVER_RULE_CHOICE", SolverRuleinfo::SOLVER_RULE_CHOICE)
.value("SOLVER_RULE_LEARNT", SolverRuleinfo::SOLVER_RULE_LEARNT);
// INSTALL FLAGS
m.attr("MAMBA_NO_DEPS") = MAMBA_NO_DEPS;
m.attr("MAMBA_ONLY_DEPS") = MAMBA_ONLY_DEPS;