%module ModRationalFunction %{ #include #include #include typedef mpq_class Rational; typedef carl::Term Term; typedef carl::MultivariatePolynomial Polynomial; typedef carl::FactorizedPolynomial FactorizedPolynomial; typedef carl::RationalFunction RationalFunction; typedef carl::RationalFunction FactorizedRationalFunction; typedef unsigned int uint; %} %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 %import "rational.i" %import "variable.i" %import "monomial.i" %import "term.i" %import "polynomial.i" %import "factorizedpolynomial.i" typedef carl::Term Term; typedef carl::MultivariatePolynomial Polynomial; typedef carl::FactorizedPolynomial FactorizedPolynomial; typedef carl::RationalFunction FactorizedRationalFunction; %rename(RationalFunction) carl::RationalFunction; %rename(FactorizedRationalFunction) carl::RationalFunction; namespace carl { class RationalFunction { public: typedef typename Rational CoeffType; explicit RationalFunction(const Polynomial& nom, const Polynomial& denom): mPolynomialQuotient(nullptr), mNumberQuotient(), mIsSimplified(false) { } CoeffType evaluate(const std::map& substitutions) const; inline Polynomial nominator() const; inline Polynomial denominator() const; %extend { std::string toString() { std::stringstream ss; ss << *$self; return ss.str(); } Polynomial numerator() const { return $self->nominator(); } std::vector gatherVariables() const { std::set asSet = $self->gatherVariables(); return std::vector(asSet.begin(),asSet.end()); } bool equals(const carl::RationalFunction& other) { return *$self == other; } bool notEquals(const carl::RationalFunction& other) { return *$self != other; } carl::RationalFunction add(const Polynomial& rhs) { return *($self)+rhs; } carl::RationalFunction add(const Term& rhs) { return *($self)+rhs; } carl::RationalFunction add(const Monomial::Arg& rhs) { return *($self)+rhs; } carl::RationalFunction add(carl::Variable::Arg rhs) { return *($self)+rhs; } carl::RationalFunction add(Rational rhs) { return *($self)+rhs; } carl::RationalFunction sub(const Polynomial& rhs) { return *($self)-rhs; } carl::RationalFunction sub(const Term& rhs) { return *($self)-rhs; } carl::RationalFunction sub(const Monomial::Arg& rhs) { return *($self)-rhs; } carl::RationalFunction sub(carl::Variable::Arg rhs) { return *($self)-rhs; } carl::RationalFunction sub(Rational rhs) { return *($self)-rhs; } carl::RationalFunction mul(const Polynomial& rhs) { return *($self)*rhs; } carl::RationalFunctionmul(const Term& rhs) { return *($self)*rhs; } carl::RationalFunction mul(const Monomial::Arg& rhs) { return *($self)*rhs; } carl::RationalFunction mul(carl::Variable::Arg rhs) { return *($self)*rhs; } carl::RationalFunction mul(Rational rhs) { return *($self)*rhs; } carl::RationalFunction div(const Polynomial& rhs) { return *($self)/rhs; } carl::RationalFunction div(const Term& rhs) { return *($self)/rhs; } carl::RationalFunction div(const Monomial::Arg& rhs) { return *($self)/rhs; } carl::RationalFunction div(carl::Variable::Arg rhs) { return *($self)/rhs; } carl::RationalFunction div(Rational rhs) { return *($self)/rhs; } carl::RationalFunction div(const RationalFunction& rhs) { return *($self)/rhs; } carl::RationalFunction pow(uint exp) { return carl::pow(*($self),exp); } carl::RationalFunction neg() { return *$self*Rational(-1); } } }; class RationalFunction { public: typedef typename Rational CoeffType; explicit RationalFunction(const FactorizedPolynomial& nom, const FactorizedPolynomial& denom): mPolynomialQuotient(nullptr), mNumberQuotient(), mIsSimplified(false) { } CoeffType evaluate(const std::map& substitutions) const; inline FactorizedPolynomial nominator() const; inline FactorizedPolynomial denominator() const; %extend { std::string toString() { std::stringstream ss; ss << *$self; return ss.str(); } FactorizedPolynomial numerator() const { return $self->nominator(); } std::vector gatherVariables() const { std::set asSet = $self->gatherVariables(); return std::vector(asSet.begin(),asSet.end()); } bool equals(const carl::RationalFunction& other) { return *$self == other; } } }; } typedef carl::RationalFunction RationalFunction; /* %template(RationalFunctionPoly) carl::RationalFunction; %template(FactorizedRationalFunction) carl::RationalFunction,false>; */