6 #include "../../core/Variable.h"
10 #include <poly/poly.h>
11 #include <poly/polynomial_context.h>
12 #include <poly/polyxx.h>
20 std::vector<Variable> variable_order;
22 std::map<carl::Variable, lp_variable_t> vars_carl_libpoly;
24 std::map<lp_variable_t, carl::Variable> vars_libpoly_carl;
30 poly::Context poly_context;
32 Data(
const std::vector<Variable>& v) : variable_order(v) {}
40 std::shared_ptr<Data> m_data;
48 LPContext(
const LPContext& rhs) {
52 LPContext& operator=(
const LPContext& rhs) {
57 std::optional<carl::Variable> carl_variable(lp_variable_t var)
const {
58 auto it = m_data->vars_libpoly_carl.find(var);
59 if(it == m_data->vars_libpoly_carl.end())
return std::nullopt;
60 CARL_LOG_TRACE(
"carl.poly",
"Mapping libpoly variable " << lp_variable_db_get_name(m_data->poly_context.get_variable_db(), var) <<
" -> " << it->second);
64 std::optional<lp_variable_t> lp_variable(
carl::Variable var)
const {
65 auto it = m_data->vars_carl_libpoly.find(var);
66 if(it == m_data->vars_carl_libpoly.end())
return std::nullopt;
67 CARL_LOG_TRACE(
"carl.poly",
"Mapping carl variable " << var <<
" -> " << lp_variable_db_get_name(m_data->poly_context.get_variable_db(), it->second));
75 LPContext(
const std::vector<Variable>& carl_var_order) : m_data(std::make_shared<Data>(carl_var_order)) {
80 for (
size_t i = 0; i < carl_var_order.size(); i++) {
81 std::string var_name = carl_var_order[i].name();
82 lp_variable_t poly_var = lp_variable_db_new_variable(m_data->poly_context.get_variable_db(), &var_name[0]);
83 lp_variable_order_push(m_data->poly_context.get_variable_order(), poly_var);
84 CARL_LOG_TRACE(
"carl.poly",
"Creating lp var for carl var " << carl_var_order[i] <<
" -> " << lp_variable_db_get_name(m_data->poly_context.get_variable_db(), poly_var));
85 m_data->vars_carl_libpoly.emplace(carl_var_order[i], poly_var);
86 m_data->vars_libpoly_carl.emplace(poly_var, carl_var_order[i]);
90 poly::Context& poly_context() {
91 return m_data->poly_context;
94 const poly::Context& poly_context()
const {
95 return m_data->poly_context;
98 lp_polynomial_context_t* lp_context() {
99 return m_data->poly_context.get_polynomial_context();
102 const lp_polynomial_context_t* lp_context()
const {
103 return m_data->poly_context.get_polynomial_context();
106 const std::vector<Variable>& variable_ordering()
const {
107 return m_data->variable_order;
110 bool has(
const Variable& var)
const {
111 return std::find(variable_ordering().begin(), variable_ordering().end(), var) != variable_ordering().end();
117 inline bool operator==(
const LPContext& rhs)
const {
118 return m_data == rhs.m_data;
122 inline std::ostream&
operator<<(std::ostream& os,
const LPContext& ctx) {
123 os << ctx.variable_ordering();
#define CARL_LOG_FUNC(channel, args)
#define CARL_LOG_TRACE(channel, msg)
carl is the main namespace for the library.
std::ostream & operator<<(std::ostream &os, const BasicConstraint< Poly > &c)
Prints the given constraint on the given stream.
bool operator==(const BasicConstraint< P > &lhs, const BasicConstraint< P > &rhs)
A Variable represents an algebraic variable that can be used throughout carl.