carl  24.02
Computer ARithmetic Library
LPContext.h
Go to the documentation of this file.
1 #pragma once
2 
3 #include <carl-common/config.h>
4 #ifdef USE_LIBPOLY
5 
6 #include "../../core/Variable.h"
7 
8 #include <map>
9 
10 #include <poly/poly.h>
11 #include <poly/polynomial_context.h>
12 #include <poly/polyxx.h>
13 
15 
16 namespace carl {
17 
18 class LPContext {
19  struct Data {
20  std::vector<Variable> variable_order;
21  // mapping from carl variables to libpoly variables
22  std::map<carl::Variable, lp_variable_t> vars_carl_libpoly;
23  // mapping from libpoly variables to carl variables
24  std::map<lp_variable_t, carl::Variable> vars_libpoly_carl;
25 
26  // lp_variable_db_t* lp_var_db;
27  // lp_variable_order_t* lp_var_order;
28  // lp_polynomial_context_t* lp_context;
29 
30  poly::Context poly_context;
31 
32  Data(const std::vector<Variable>& v) : variable_order(v) {}
33  // ~Data() {
34  // lp_variable_db_detach(lp_var_db);
35  // lp_variable_order_detach(lp_var_order);
36  // lp_polynomial_context_detach(lp_context);
37  // }
38  };
39 
40  std::shared_ptr<Data> m_data;
41 
42 public:
43  /**
44  * Default constructor shall not exist.
45  */
46  LPContext() = delete;
47 
48  LPContext(const LPContext& rhs) {
49  m_data = rhs.m_data;
50  }
51 
52  LPContext& operator=(const LPContext& rhs) {
53  m_data = rhs.m_data;
54  return *this;
55  }
56 
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);
61  return it->second;
62  }
63 
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));
68  return it->second;
69  }
70 
71 
72  /**
73  * Construct a Context with a given order of carl::Variable in decreasing order of precedence
74  */
75  LPContext(const std::vector<Variable>& carl_var_order) : m_data(std::make_shared<Data>(carl_var_order)) {
76  CARL_LOG_FUNC("carl.poly", carl_var_order);
77  // m_data->lp_var_db = lp_variable_db_new();
78  // m_data->lp_var_order = lp_variable_order_new();
79  // m_data->poly_context = lp_polynomial_context_new(0, m_data->lp_var_db, m_data->lp_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]);
87  }
88  };
89 
90  poly::Context& poly_context() {
91  return m_data->poly_context;
92  }
93 
94  const poly::Context& poly_context() const {
95  return m_data->poly_context;
96  }
97 
98  lp_polynomial_context_t* lp_context() {
99  return m_data->poly_context.get_polynomial_context();
100  };
101 
102  const lp_polynomial_context_t* lp_context() const {
103  return m_data->poly_context.get_polynomial_context();
104  };
105 
106  const std::vector<Variable>& variable_ordering() const {
107  return m_data->variable_order;
108  }
109 
110  bool has(const Variable& var) const {
111  return std::find(variable_ordering().begin(), variable_ordering().end(), var) != variable_ordering().end();
112  };
113 
114  /**
115  * @brief Returns true if the underlying data is the same (by pointers).
116  */
117  inline bool operator==(const LPContext& rhs) const {
118  return m_data == rhs.m_data;
119  }
120 };
121 
122 inline std::ostream& operator<<(std::ostream& os, const LPContext& ctx) {
123  os << ctx.variable_ordering();
124  return os;
125 }
126 
127 } // namespace carl
128 
129 #endif
#define CARL_LOG_FUNC(channel, args)
Definition: carl-logging.h:46
#define CARL_LOG_TRACE(channel, msg)
Definition: carl-logging.h:44
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.
Definition: Variable.h:85