mirror of https://github.com/mamba-org/mamba.git
Merge pull request #1566 from wolfv/structured_problems
add structured problems extraction and python interface
This commit is contained in:
commit
4cdfdf1cd8
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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")
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue