%module MonomialT %{ #include #include #include #include #include "gmp.h" #include "gmpxx.h" typedef mpq_class Rational; typedef unsigned int uint; typedef std::pair VarIntPair; typedef carl::Term Term; typedef carl::MultivariatePolynomial Polynomial; typedef carl::RationalFunction RationalFunction; %} %include "std_string.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 unsigned int uint; %include "std_pair.i" %include "std_vector.i" %import "variable.i" %import "term.i" %import "polynomial.i" %import "rationalfunction.i" %include "std_shared_ptr.i" %shared_ptr(carl::Monomial); typedef std::pair VarIntPair; namespace std { %template(VarIntPair) pair; %template(VarIntPairVector) vector; } typedef carl::Term Term; typedef carl::MultivariatePolynomial Polynomial; typedef carl::RationalFunction RationalFunction; %nodefaultctor carl::Monomial; namespace carl { typedef unsigned int exponent; class Monomial { public: typedef std::shared_ptr Arg; typedef std::vector Content; /* explicit Monomial(Variable::Arg v, carl::exponent e = 1) : mExponents(1, std::make_pair(v,e)), mTotalDegree(e) { } */ carl::exponent tdeg() const; const carl::Monomial::Content& exponents() const; std::string toString(bool infix = true, bool friendlyVarNames = true) const; size_t nrVariables() const; %extend { static carl::Monomial::Arg createMonomial(Variable::Arg v, carl::exponent e = 1) { return carl::MonomialPool::getInstance().create(v, e); } Polynomial add(const Polynomial& rhs) { carl::Monomial::Content exp($self->exponents()); const std::shared_ptr ptr = std::make_shared(std::move(exp)); return ptr+rhs; } Polynomial add(const Term& rhs) { carl::Monomial::Content exp($self->exponents()); const std::shared_ptr ptr = std::make_shared(std::move(exp)); return ptr+rhs; } Polynomial add(const Monomial::Arg& rhs) { carl::Monomial::Content exp($self->exponents()); const std::shared_ptr ptr = std::make_shared(std::move(exp)); return carl::operator+>(ptr,rhs); } Polynomial add(carl::Variable::Arg rhs) { carl::Monomial::Content exp($self->exponents()); const std::shared_ptr ptr = std::make_shared(std::move(exp)); return carl::operator+>(ptr,rhs); } Polynomial add(const Rational& rhs) { carl::Monomial::Content exp($self->exponents()); const std::shared_ptr ptr = std::make_shared(std::move(exp)); return ptr+rhs; } Polynomial sub(const Polynomial& rhs) { carl::Monomial::Content exp($self->exponents()); const std::shared_ptr ptr = std::make_shared(std::move(exp)); return ptr-rhs; } Polynomial sub(const Term& rhs) { carl::Monomial::Content exp($self->exponents()); const std::shared_ptr ptr = std::make_shared(std::move(exp)); return ptr-rhs; } Polynomial sub(const Monomial::Arg& rhs) { carl::Monomial::Content exp($self->exponents()); const std::shared_ptr ptr = std::make_shared(std::move(exp)); return carl::operator->(ptr,rhs); } Polynomial sub(carl::Variable::Arg rhs) { carl::Monomial::Content exp($self->exponents()); const std::shared_ptr ptr = std::make_shared(std::move(exp)); return carl::operator->(ptr,rhs); } Polynomial sub(const Rational& rhs) { carl::Monomial::Content exp($self->exponents()); const std::shared_ptr ptr = std::make_shared(std::move(exp)); return ptr-rhs; } Polynomial mul(const Polynomial& rhs) { carl::Monomial::Content exp($self->exponents()); const std::shared_ptr ptr = std::make_shared(std::move(exp)); return rhs*ptr; } Term mul(const Term& rhs) { carl::Monomial::Content exp($self->exponents()); const std::shared_ptr ptr = std::make_shared(std::move(exp)); return ptr*rhs; } Polynomial mul(const Monomial::Arg& rhs) { carl::Monomial::Content exp($self->exponents()); const std::shared_ptr ptr = std::make_shared(std::move(exp)); //const std::shared_ptr ptr2(rhs); return carl::operator*(ptr,Polynomial(rhs)); } Polynomial mul(carl::Variable::Arg rhs) { carl::Monomial::Content exp($self->exponents()); const std::shared_ptr ptr = std::make_shared(std::move(exp)); return carl::operator*(ptr,Polynomial(rhs)); } Term mul(const Rational& rhs) { carl::Monomial::Content exp($self->exponents()); const std::shared_ptr ptr = std::make_shared(std::move(exp)); return ptr*rhs; } RationalFunction div(const RationalFunction& rhs) { carl::Monomial::Content exp($self->exponents()); const std::shared_ptr ptr = std::make_shared(std::move(exp)); return RationalFunction(Polynomial(ptr)) / rhs; } RationalFunction div(const Polynomial& rhs) { carl::Monomial::Content exp($self->exponents()); const std::shared_ptr ptr = std::make_shared(std::move(exp)); return RationalFunction(Polynomial(ptr)) / rhs; } RationalFunction div(const Term& rhs) { carl::Monomial::Content exp($self->exponents()); const std::shared_ptr ptr = std::make_shared(std::move(exp)); return RationalFunction(Polynomial(ptr)) / rhs; } RationalFunction div(const Monomial::Arg& rhs) { carl::Monomial::Content exp($self->exponents()); const std::shared_ptr ptr = std::make_shared(std::move(exp)); return RationalFunction(Polynomial(ptr)) / rhs; } RationalFunction div(carl::Variable::Arg rhs) { carl::Monomial::Content exp($self->exponents()); const std::shared_ptr ptr = std::make_shared(std::move(exp)); return RationalFunction(Polynomial(ptr)) / rhs; } Term div(const Rational& rhs) { carl::Monomial::Content exp($self->exponents()); const std::shared_ptr ptr = std::make_shared(std::move(exp)); return Term(ptr) / rhs; } Term neg() { carl::Monomial::Content exp($self->exponents()); const std::shared_ptr ptr = std::make_shared(std::move(exp)); return ptr*Rational(-1); } carl::Monomial::Arg pow(uint exp) { return $self->pow(exp); } VarIntPair getItem(std::size_t index) { return *($self->begin()+index); } } }; }