You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
213 lines
5.2 KiB
213 lines
5.2 KiB
|
|
%module FormulaClasses
|
|
%{
|
|
#include <carl/formula/Formula.h>
|
|
#include <carl/formula/Constraint.h>
|
|
#include <carl/core/SimpleConstraint.h>
|
|
#include "gmpxx.h"
|
|
#include <carl/core/RationalFunction.h>
|
|
#include <carl/core/Relation.h>
|
|
|
|
|
|
typedef mpq_class Rational;
|
|
|
|
typedef carl::Monomial::Arg Monomial;
|
|
typedef carl::Term<Rational> Term;
|
|
typedef carl::MultivariatePolynomial<Rational> Polynomial;
|
|
typedef carl::FactorizedPolynomial<Polynomial> FactorizedPolynomial;
|
|
typedef carl::RationalFunction<Polynomial> RationalFunction;
|
|
typedef carl::RationalFunction<FactorizedPolynomial> FactorizedRationalFunction;
|
|
typedef carl::PolynomialFactorizationPair<Polynomial> FactorizationPair;
|
|
|
|
typedef carl::Formula<Polynomial> FormulaPoly;
|
|
typedef std::vector<FormulaPoly> FormulaVector;
|
|
|
|
|
|
|
|
|
|
%}
|
|
|
|
|
|
%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<Rational> Polynomial;
|
|
typedef std::vector<FormulaPoly> FormulaVector;
|
|
|
|
|
|
|
|
%template(FormulaVector) std::vector<carl::Formula<carl::MultivariatePolynomial<Rational>>>;
|
|
|
|
|
|
typedef carl::Formula<Polynomial> FormulaPoly;
|
|
|
|
|
|
|
|
|
|
typedef mpq_class Rational;
|
|
|
|
typedef carl::Monomial::Arg Monomial;
|
|
typedef carl::Term<Rational> Term;
|
|
typedef carl::FactorizedPolynomial<Polynomial> FactorizedPolynomial;
|
|
typedef carl::RationalFunction<Polynomial> RationalFunction;
|
|
typedef carl::RationalFunction<FactorizedPolynomial> FactorizedRationalFunction;
|
|
typedef carl::PolynomialFactorizationPair<Polynomial> FactorizationPair;
|
|
|
|
|
|
|
|
|
|
/*%typemap(in) std::vector<FormulaPoly> {
|
|
|
|
|
|
}*/
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
namespace carl {
|
|
|
|
//typedef typename Polynomial::UnderlyingNumberType<Rational>::type Polynomial::NumberType;
|
|
|
|
|
|
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
|
|
};
|
|
|
|
enum Relation { EQ = 0, NEQ = 1, LESS = 2, LEQ = 4, GREATER = 3, GEQ = 5 };
|
|
/* TODO: wrap this toString
|
|
inline std::ostream& operator<<(std::ostream& os, const Relation& r) {
|
|
switch (r) {
|
|
case Relation::EQ: os << "="; break;
|
|
case Relation::NEQ: os << "<>"; break;
|
|
case Relation::LESS: os << "<"; break;
|
|
case Relation::LEQ: os << "<="; break;
|
|
case Relation::GREATER: os << ">"; break;
|
|
case Relation::GEQ: os << ">="; break;
|
|
}
|
|
return os;
|
|
} */
|
|
|
|
template<typename Pol> class Constraint {
|
|
public:
|
|
Constraint( bool _valid = true );
|
|
|
|
explicit Constraint( carl::Variable::Arg _var, carl::Relation _rel, const typename Pol::NumberType & _bound = constant_zero<Rational>::get() );
|
|
|
|
explicit Constraint( const Pol& _lhs, carl::Relation _rel );
|
|
|
|
unsigned satisfiedBy( const std::map<Variable,Rational>& _assignment ) const;
|
|
|
|
std::string toString( unsigned _unequalSwitch = 0, bool _infix = true, bool _friendlyVarNames = true ) const;
|
|
|
|
const Pol& lhs() const;
|
|
|
|
carl::Relation relation() const;
|
|
|
|
//TODO: boolean connectives
|
|
|
|
|
|
};
|
|
|
|
template<typename LhsType> class SimpleConstraint {
|
|
public:
|
|
SimpleConstraint(bool v) : mLhs(v ? 0 : 1), mRelation(carl::Relation::EQ) {}
|
|
SimpleConstraint(const LhsType& lhs, carl::Relation rel) : mLhs(lhs), mRelation(rel)
|
|
{}
|
|
|
|
const LhsType& lhs() const {return mLhs;}
|
|
const carl::Relation& rel() const {return mRelation;}
|
|
|
|
%extend {
|
|
std::string toString() {
|
|
std::stringstream ss;
|
|
ss << *$self;
|
|
return ss.str();
|
|
}
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
//TODO: wrap EvaluationMap, Formulas, and the other types that are missing!
|
|
|
|
template<typename Pol> class Formula {
|
|
|
|
|
|
public:
|
|
explicit Formula( carl::Variable::Arg _booleanVar ):
|
|
Formula( carl::FormulaPool<Pol>::getInstance().create( _booleanVar ) )
|
|
{}
|
|
|
|
explicit Formula( const carl::Constraint<Pol>& _constraint ):
|
|
Formula( carl::FormulaPool<Pol>::getInstance().create( _constraint ) )
|
|
{}
|
|
|
|
explicit Formula( carl::FormulaType _type, const Formula& _subformula ):
|
|
Formula(carl::FormulaPool<Pol>::getInstance().create(_type, std::move(Formula(_subformula))))
|
|
{}
|
|
|
|
explicit Formula( carl::FormulaType _type, const std::vector<Formula<Pol>>& _subasts ):
|
|
Formula( carl::FormulaPool<Pol>::getInstance().create( _type, _subasts ) )
|
|
{}
|
|
|
|
//Apparently satisfiedBy is no longer existent
|
|
//unsigned satisfiedBy( const carl::EvaluationMap<typename Pol::NumberType>& _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
|
|
{
|
|
return mpContent->mType;
|
|
}
|
|
//TODO: operators and iterator!
|
|
|
|
};
|
|
}
|
|
|
|
|
|
%include "std_map.i"
|
|
|
|
|
|
|
|
%template(FormulaPoly) carl::Formula<Polynomial>;
|
|
%template(ConstraintPoly) carl::Constraint<Polynomial>;
|
|
%template(SimpleConstraintPoly) carl::SimpleConstraint<Polynomial>;
|
|
%template(SimpleConstraintFunc) carl::SimpleConstraint<FactorizedRationalFunction>;
|
|
|
|
|
|
|
|
|
|
|
|
|