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.
244 lines
4.7 KiB
244 lines
4.7 KiB
|
|
|
|
|
|
|
|
%module IntervalRationalT
|
|
%{
|
|
#include <carl/interval/Interval.h>
|
|
|
|
typedef mpq_class Rational;
|
|
typedef unsigned int uint;
|
|
%}
|
|
|
|
%import "rational.i"
|
|
|
|
typedef unsigned int uint;
|
|
|
|
|
|
namespace carl {
|
|
|
|
|
|
%include "enums.swg"
|
|
%javaconst(1);
|
|
|
|
|
|
enum class BoundType {
|
|
/// the given bound is compared by a strict ordering relation
|
|
STRICT=0,
|
|
/// the given bound is compared by a weak ordering relation
|
|
WEAK=1,
|
|
/// the given bound is interpreted as minus or plus infinity depending on whether it is the left or the right bound
|
|
INFTY=2
|
|
};
|
|
|
|
|
|
|
|
template<typename Number>
|
|
class Interval
|
|
{
|
|
public:
|
|
|
|
Interval(const Number& n) :
|
|
mContent(n),
|
|
mLowerBoundType(BoundType::WEAK),
|
|
mUpperBoundType(BoundType::WEAK) { }
|
|
|
|
Interval(const Number& lower, const Number& upper)
|
|
{
|
|
|
|
}
|
|
|
|
Interval(const Number& lower, BoundType lowerBoundType, const Number& upper, BoundType upperBoundType)
|
|
{
|
|
}
|
|
|
|
|
|
//BEWARE: in python sth with return value policy had to be changed here, so maybe problems will arise
|
|
|
|
inline const Number& lower() const;
|
|
|
|
inline const Number& upper() const;
|
|
|
|
inline void setLower(const Number& n);
|
|
|
|
inline void setUpper(const Number& n);
|
|
|
|
inline bool isInfinite() const;
|
|
|
|
inline bool isUnbounded() const;
|
|
|
|
inline bool isHalfBounded() const;
|
|
|
|
inline bool isEmpty() const;
|
|
|
|
inline bool isPointInterval() const;
|
|
|
|
inline bool isOpenInterval() const;
|
|
|
|
inline bool isClosedInterval() const;
|
|
|
|
inline bool isZero() const;
|
|
|
|
inline bool isOne() const;
|
|
|
|
inline bool isPositive() const;
|
|
|
|
inline bool isNegative() const;
|
|
|
|
inline bool isSemiPositive() const;
|
|
|
|
inline bool isSemiNegative() const;
|
|
|
|
Interval<Number> integralPart() const;
|
|
Number diameter() const;
|
|
//NOTE: this is now set for Number not being a float... needs to be changed in Interval.h otherwise
|
|
Number center() const;
|
|
Number sample(bool _includingBounds = true) const;
|
|
bool contains(const Number& val) const;
|
|
bool contains(const Interval<Number>& rhs) const;
|
|
bool meets(const Number& val) const;
|
|
bool isSubset(const Interval<Number>& rhs) const;
|
|
bool isProperSubset(const Interval<Number>& rhs) const;
|
|
|
|
Interval<Number> div(const Interval<Number>& rhs) const;
|
|
Interval<Number> inverse() const;
|
|
Interval<Number> abs() const;
|
|
Interval<Number> pow(uint exp) const;
|
|
bool intersectsWith(const Interval<Number>& rhs) const;
|
|
|
|
Interval<Number> intersect(const Interval<Number>& rhs) const;
|
|
bool unite(const Interval<Number>& rhs, Interval<Number>& resultA, Interval<Number>& resultB) const;
|
|
bool difference(const Interval<Number>& rhs, Interval<Number>& resultA, Interval<Number>& resultB) const;
|
|
bool complement(Interval<Number>& resultA, Interval<Number>& resultB) const;
|
|
bool symmetricDifference(const Interval<Number>& rhs, Interval<Number>& resultA, Interval<Number>& resultB) const;
|
|
|
|
|
|
|
|
|
|
std::string toString() const;
|
|
|
|
%extend {
|
|
/*
|
|
static Interval<Number> pow(const Interval<Number>& _in, unsigned _exponent)
|
|
{
|
|
return carl::pow(_in,_exponent);
|
|
} */
|
|
|
|
static Interval<Number> floor(const Interval<Number>& _in) {
|
|
return carl::floor(_in);
|
|
}
|
|
|
|
static Interval<Number> ceil(const Interval<Number>& _in) {
|
|
return carl::ceil(_in);
|
|
}
|
|
|
|
/*
|
|
static Interval<Number> abs(const Interval<Number>& _in) {
|
|
return carl::abs(_in);
|
|
}
|
|
|
|
static Interval<Number> div(const Interval<Number>& _lhs, const Interval<Number>& _rhs) {
|
|
return carl::div(_lhs,_rhs);
|
|
} */
|
|
|
|
static Interval<Number> quotient(const Interval<Number>& _lhs, const Interval<Number>& _rhs) {
|
|
return carl::div(_lhs,_rhs);
|
|
}
|
|
|
|
static bool isInteger(const Interval<Number>&) {
|
|
return false;
|
|
}
|
|
|
|
|
|
|
|
|
|
Interval<Number> add(const Interval<Number>& rhs) {
|
|
return *$self+rhs;
|
|
}
|
|
|
|
Interval<Number> add(const Rational& rhs) {
|
|
return *$self+rhs;
|
|
}
|
|
|
|
Interval<Number> neg() {
|
|
return -*$self;
|
|
}
|
|
|
|
Interval<Number> sub(const Interval<Number>& rhs) {
|
|
return *$self-rhs;
|
|
}
|
|
|
|
Interval<Number> sub(const Rational& rhs) {
|
|
return *$self-rhs;
|
|
}
|
|
|
|
Interval<Number> mul(const Interval<Number>& rhs) {
|
|
return *$self*rhs;
|
|
}
|
|
|
|
Interval<Number> mul(const Rational& rhs) {
|
|
return *$self*rhs;
|
|
}
|
|
|
|
|
|
|
|
|
|
Interval<Number> div(const Rational& rhs) {
|
|
return *$self+rhs;
|
|
}
|
|
|
|
|
|
//The +=, -=, *= are missing now
|
|
|
|
|
|
|
|
bool equals(const Interval<Number> rhs) {
|
|
return *$self==rhs;
|
|
}
|
|
|
|
bool notEquals(const Interval<Number> rhs) {
|
|
return *$self!=rhs;
|
|
}
|
|
|
|
bool lessEquals(const Interval<Number> rhs) {
|
|
return *$self<=rhs;
|
|
}
|
|
|
|
bool lessEquals(const Rational rhs) {
|
|
return *$self<=rhs;
|
|
}
|
|
|
|
bool greaterEquals(const Interval<Number> rhs) {
|
|
return *$self>=rhs;
|
|
}
|
|
|
|
bool greaterEquals(const Rational rhs) {
|
|
return *$self>=rhs;
|
|
}
|
|
|
|
|
|
bool less(const Interval<Number> rhs) {
|
|
return *$self<rhs;
|
|
}
|
|
|
|
bool less(const Rational rhs) {
|
|
return *$self<rhs;
|
|
}
|
|
|
|
bool greater(const Interval<Number> rhs) {
|
|
return *$self>rhs;
|
|
}
|
|
|
|
bool greater(const Rational rhs) {
|
|
return *$self>rhs;
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
};
|
|
|
|
}
|
|
%template(IntervalRational) carl::Interval<Rational>;
|
|
|