11 namespace convert_poly {
12 template<
typename T,
typename S>
15 template<
typename A,
typename B,
typename C>
22 template<
typename A,
typename B,
typename C>
30 template<
typename A,
typename B,
typename C>
33 CARL_LOG_DEBUG(
"carl.converter",
"Converting Carl Multivariate Poly " << p <<
" with LPContext " << context);
43 if (denominator < 0) {
57 CARL_LOG_DEBUG(
"carl.converter",
"Coprime Factor/ Denominator: " << denominator);
58 LPPolynomial res(context);
60 for (
const auto& term : p) {
63 LPPolynomial t(context, mpz_class(term.coeff() * denominator));
65 if (term.monomial()) {
67 for (
const std::pair<carl::Variable, std::size_t>& var_pow : (*term.monomial()).exponents()) {
69 t *=LPPolynomial(context, var_pow.first, mpz_class(1), (
unsigned)var_pow.second);
72 CARL_LOG_TRACE(
"carl.converter",
"converted term: " << term <<
" -> " << t);
80 namespace conversion_private {
82 struct CollectTermData {
83 std::vector<carl::Term<T>> terms;
84 const LPContext& context;
85 CollectTermData(
const LPContext& c) : context(c) {}
89 void collectTermDataFunction(
const lp_polynomial_context_t* , lp_monomial_t* m,
void* d) {
90 CollectTermData<T>* data =
static_cast<CollectTermData<T>*
>(d);
92 for (
size_t i = 0; i < m->n; i++) {
93 auto carl_var = data->context.carl_variable(m->p[i].x);
94 assert(carl_var.has_value());
97 data->terms.emplace_back(term);
101 template<
typename A,
typename B,
typename C>
102 struct ConvertHelper<MultivariatePolynomial<
A, B, C>, LPPolynomial> {
103 static MultivariatePolynomial<A, B, C>
convert(
const LPPolynomial& p) {
104 conversion_private::CollectTermData<A> termdata(p.context());
105 CARL_LOG_DEBUG(
"carl.converter",
"Converting LPPolynomial " << p);
106 lp_polynomial_traverse(p.get_internal(), conversion_private::collectTermDataFunction<A>, &termdata);
108 if (termdata.terms.empty()) {
109 return MultivariatePolynomial<A, B, C>();
111 return MultivariatePolynomial<A, B, C>(termdata.terms);
118 template<typename T, typename S, std::enable_if_t<is_polynomial_type<T>::value && is_polynomial_type<S>::value && !needs_context_type<T>::value,
int> = 0>
123 template<typename T, typename S, std::enable_if_t<is_polynomial_type<T>::value && is_polynomial_type<S>::value && needs_context_type<T>::value,
int> = 0>
124 inline T
convert(
const typename T::ContextType& c,
const S& r) {
#define CARL_LOG_TRACE(channel, msg)
#define CARL_LOG_DEBUG(channel, msg)
carl is the main namespace for the library.
bool is_constant(const ContextPolynomial< Coeff, Ordering, Policies > &p)
cln::cl_I get_num(const cln::cl_RA &n)
Extract the numerator from a fraction.
BasicConstraint< ToPoly > convert(const typename ToPoly::ContextType &context, const BasicConstraint< FromPoly > &c)
cln::cl_I get_denom(const cln::cl_RA &n)
Extract the denominator from a fraction.
The general-purpose multivariate polynomial class.
const Coeff & constant_part() const
Retrieve the constant term of this polynomial or zero, if there is no constant term.
Coeff coprime_factor() const
static ContextPolynomial< A, B, C > convert(const Context &context, const MultivariatePolynomial< A, B, C > &p)
static MultivariatePolynomial< A, B, C > convert(const ContextPolynomial< A, B, C > &p)
MultivariatePolynomial< Coeff, Ordering, Policies > as_multivariate() const
Represents a single term, that is a numeric coefficient and a monomial.