%module VariableT %{ #include #include #include #include #include typedef mpq_class Rational; typedef carl::Term Term; typedef carl::MultivariatePolynomial Polynomial; typedef carl::RationalFunction RationalFunction; %} %include "std_string.i" %import "monomial.i" %import "term.i" %import "polynomial.i" %import "rationalfunction.i" //TODO: for 32 bit support this has to be changed.. //%import //for size_t maybe? typedef long unsigned int size_t; //this should be okay for 64 bits at least typedef mpq_class Rational; typedef carl::Term Term; typedef carl::MultivariatePolynomial Polynomial; //typedef carl::RationalFunction RationalFunction; namespace carl { %include "enums.swg" %javaconst(1); //maybe also define the toString for this enum, if needed //enum VariableType { VT_BOOL = 0, VT_REAL = 1, VT_INT = 2, VT_UNINTERPRETED = 3, VT_BITVECTOR = 4, MIN_TYPE = VT_BOOL, MAX_TYPE = VT_BITVECTOR}; enum class VariableType { VT_BOOL = 0, VT_REAL = 1, VT_INT = 2, VT_UNINTERPRETED = 3, VT_BITVECTOR = 4, MIN_TYPE = VT_BOOL, MAX_TYPE = VT_BITVECTOR, TYPE_SIZE = MAX_TYPE - MIN_TYPE + 1 }; class Variable { public: #ifdef VARIABLE_PASS_BY_VALUE /// Argument type for variables being function arguments. typedef Variable Arg; #else /// Argument type for variables being function arguments. typedef const Variable& Arg; #endif %extend { Variable(std::string name, carl::VariableType type) { //try and generate new variable from pool carl::Variable newVar; auto& pool = carl::VariablePool::getInstance(); carl::Variable res = pool.findVariableWithName(name); if (res != carl::Variable::NO_VARIABLE) { newVar = res; } else { newVar = freshVariable(name, type); } return new carl::Variable(newVar); } Variable(carl::VariableType type) { carl::Variable newVar = freshVariable(type); return new carl::Variable(newVar); } std::string toString() { std::stringstream ss; ss << *$self; return ss.str(); } } std::size_t getId() const; VariableType getType() const; std::string getName() const; std::size_t getRank(); %extend { bool equals(carl::Variable::Arg other) { return *$self == other; } bool notEquals(carl::Variable::Arg other) { return *$self != other; } bool less(carl::Variable::Arg other) { return *$self < other; } bool lessEquals(carl::Variable::Arg other) { return *$self <= other; } bool greater(carl::Variable::Arg other) { return *$self > other; } bool greaterEquals(carl::Variable::Arg other) { return *$self >= other; } Polynomial add(const Polynomial& rhs) { return *($self)+rhs; } Polynomial add(const Term& rhs) { return *($self)+rhs; } Polynomial add(const carl::Monomial::Arg& rhs) { return carl::operator+>(*($self),rhs); } Polynomial add(carl::Variable::Arg rhs) { return carl::operator+>(*($self),rhs); } Polynomial add(const Rational& rhs) { return *($self)+Term(rhs); } Polynomial sub(const Polynomial& rhs) { return *($self)-rhs; } Polynomial sub(const Term& rhs) { return *($self)-rhs; } Polynomial sub(const carl::Monomial::Arg& rhs) { return carl::operator->(*($self),rhs); } Polynomial sub(carl::Variable::Arg rhs) { return carl::operator->(*($self),rhs); } Polynomial sub(const Rational& rhs) { return *($self)-Term(rhs); } Polynomial mul(const Polynomial& rhs) { return *($self)*rhs; } Term mul(const Term& rhs) { return *($self)*rhs; } Polynomial mul(const Monomial::Arg& rhs) { //const std::shared_ptr ptr(rhs); return carl::operator*(*($self),Polynomial(rhs)); } Polynomial mul(carl::Variable::Arg rhs) { return carl::operator*(*($self),Polynomial(rhs)); } Term mul(const Rational& rhs) { return *($self)*Term(rhs); } RationalFunction div(const carl::RationalFunction& rhs) { return RationalFunction(*($self)) / rhs; } RationalFunction div(const Polynomial& rhs) { return RationalFunction(*($self)) / rhs; } RationalFunction div(const Term& rhs) { return RationalFunction(*($self)) / rhs; } RationalFunction div(const carl::Monomial::Arg& rhs) { return RationalFunction(*($self)) / rhs; } RationalFunction div(carl::Variable::Arg rhs) { return RationalFunction(*($self)) / rhs; } Polynomial div(const Rational& rhs) { if (carl::isZero(rhs)) throw std::runtime_error("Div by zero"); return Polynomial(*($self)) / rhs; } Term neg() { return *$self*Rational(-1); } carl::Monomial::Arg pow(uint exp) { carl::Monomial m(*$self); return m.pow(exp); } } }; }