%module FormulaPolynomialT %{ #include #include #include #include "gmpxx.h" #include #include typedef mpq_class Rational; typedef carl::Monomial::Arg Monomial; typedef carl::Term Term; typedef carl::MultivariatePolynomial Polynomial; typedef carl::FactorizedPolynomial FactorizedPolynomial; typedef carl::RationalFunction RationalFunction; typedef carl::RationalFunction FactorizedRationalFunction; typedef carl::PolynomialFactorizationPair FactorizationPair; typedef carl::Formula FormulaPolynomial; typedef std::vector FormulaVector; %} %import "constraint.i" %include "std_string.i" %import "variable.i" %import "polynomial.i" %import "rationalfunction.i" %import "factorizedpolynomial.i" %include "std_vector.i" %include "std_map.i" typedef carl::MultivariatePolynomial Polynomial; typedef std::vector FormulaVector; %template(FormulaVector) std::vector>>; typedef carl::Formula FormulaPolynomial; typedef mpq_class Rational; typedef carl::Monomial::Arg Monomial; typedef carl::Term Term; typedef carl::FactorizedPolynomial FactorizedPolynomial; typedef carl::RationalFunction RationalFunction; typedef carl::RationalFunction FactorizedRationalFunction; typedef carl::PolynomialFactorizationPair FactorizationPair; namespace carl { enum FormulaType { // Generic ITE, EXISTS, FORALL, // Core Theory TRUE, FALSE, BOOL, NOT, IMPLIES, AND, OR, XOR, IFF, // Arithmetic Theory CONSTRAINT, // Bitvector Theory BITVECTOR, // Uninterpreted Theory UEQ }; template class Formula { public: explicit Formula( carl::Variable::Arg _booleanVar ): Formula( carl::FormulaPool::getInstance().create( _booleanVar ) ) {} explicit Formula( const carl::Constraint& _constraint ): Formula( carl::FormulaPool::getInstance().create( _constraint ) ) {} explicit Formula( carl::FormulaType _type, const Formula& _subformula ): Formula(carl::FormulaPool::getInstance().create(_type, std::move(Formula(_subformula)))) {} //explicit Formula( carl::FormulaType _type, const std::vector>& _subasts ): // Formula( carl::FormulaPool::getInstance().create( _type, _subasts ) ) //{} //Apparently satisfiedBy no longer exists //unsigned satisfiedBy( const carl::EvaluationMap& _assignment ) const; std::string toString( bool _withActivity = false, unsigned _resolveUnequal = 0, const std::string _init = "", bool _oneline = true, bool _infix = false, bool _friendlyNames = true, bool _withVariableDefinition = false ) const; size_t size() const; carl::FormulaType getType() const; //TODO: maybe find fix for the weird underscore names %extend { carl::Formula not_() { return carl::Formula(carl::FormulaType::NOT, carl::Formula(*$self)); } carl::Formula and_(const carl::Constraint& rhs) { return carl::Formula(carl::FormulaType::AND, carl::Formula(*$self), carl::Formula(rhs)); } carl::Formula and_(const carl::Formula& rhs) { return carl::Formula(carl::FormulaType::AND, carl::Formula(*$self), rhs); } carl::Formula or_(const carl::Constraint& rhs) { return carl::Formula(carl::FormulaType::OR, carl::Formula(*$self), carl::Formula(rhs)); } carl::Formula or_(const carl::Formula& rhs) { return carl::Formula(carl::FormulaType::OR, carl::Formula(*$self), rhs); } carl::Formula xor_(const carl::Constraint& rhs) { return carl::Formula(carl::FormulaType::XOR, carl::Formula(*$self), carl::Formula(rhs)); } carl::Formula xor_(const carl::Formula& rhs) { return carl::Formula(carl::FormulaType::XOR, carl::Formula(*$self), rhs); } //instead of iterator carl::Formula getItem(int i) { return $self->subformulas().at(i); } bool equals(const carl::Formula& rhs) { return *$self == rhs; } } }; } %template(FormulaPolynomial) carl::Formula;