The source code and dockerfile for the GSW2024 AI Lab.
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.
This repo is archived. You can view files and clone it, but cannot push or open issues/pull-requests.
 
 
 
 
 
 

238 lines
3.8 KiB

%module Rational
%{
#include <carl/core/Monomial.h>
#include <carl/core/Term.h>
#include <carl/core/MultivariatePolynomial.h>
#include <carl/core/RationalFunction.h>
#include <carl/numbers/numbers.h>
#include "gmp.h"
#include "gmpxx.h"
typedef mpq_class Rational;
typedef carl::Term<Rational> Term;
typedef carl::MultivariatePolynomial<Rational> Polynomial;
typedef carl::RationalFunction<Polynomial> RationalFunction;
%}
%include "std_string.i"
%import "monomial.i"
%import "variable.i"
%import "term.i"
%import "polynomial.i"
%import "rationalfunction.i"
namespace carl {
typedef long sint;
}
%rename(Rational) mpq_class;
class mpq_class {
//NOTE: maybe change this to getDouble or whatever..
%rename(toDouble) get_d;
public:
mpq_class(signed int i) { mpq_init(mp); mpq_set_si(mp, i, 1); }
mpq_class(double d) { mpq_init(mp); mpq_set_d(mp, d); }
explicit mpq_class(const std::string &s, int base = 0)
{
mpq_init(mp);
if (mpq_set_str (mp, s.c_str(), base) != 0)
{
mpq_clear (mp);
throw std::invalid_argument ("mpq_set_str");
}
}
double get_d() const;
%extend{
std::string toString() {
return carl::toString(*$self,true);
}
int nominator() {
return carl::toInt<carl::sint>(carl::getNum(*$self));
}
int numerator() {
return carl::toInt<carl::sint>(carl::getNum(*$self));
}
int denominator() {
return carl::toInt<carl::sint>(carl::getDenom(*$self));
}
carl::sint toInt() {
double d = carl::toDouble(*$self);
return static_cast<carl::sint>(d);
}
Polynomial add(const Polynomial & rhs) {
return *$self+rhs;
}
Polynomial add(const Term& rhs) {
return *$self+rhs;
}
Polynomial add(const carl::Monomial::Arg& rhs) {
return *$self+rhs;
}
Polynomial add(carl::Variable::Arg rhs) {
return *$self+rhs;
}
Rational add(const Rational& rhs) {
return *$self+rhs;
}
Polynomial sub(const Polynomial & rhs) {
return *$self-rhs;
}
Polynomial sub(const Term& rhs) {
return *$self-rhs;
}
Polynomial sub(const carl::Monomial::Arg& rhs) {
return *$self-rhs;
}
Polynomial sub(carl::Variable::Arg rhs) {
return *$self-rhs;
}
Rational sub(const Rational& rhs) {
return *$self-rhs;
}
Polynomial mul(const Polynomial & rhs) {
return *$self*rhs;
}
Term mul(const Term& rhs) {
return *$self*rhs;
}
Term mul(const carl::Monomial::Arg& rhs) {
return *$self*rhs;
}
Term mul(carl::Variable::Arg rhs) {
return *$self*rhs;
}
Rational mul(const Rational& rhs) {
return *$self*rhs;
}
RationalFunction div(const RationalFunction& rhs) {
return RationalFunction(*$self) / rhs;
}
RationalFunction div(const Polynomial& rhs) {
return RationalFunction(*$self) / rhs;
}
RationalFunction div(const Term& rhs) {
return RationalFunction(*$self) / rhs;
}
RationalFunction div(const carl::Monomial::Arg& rhs) {
return RationalFunction(*$self) / rhs;
}
RationalFunction div(carl::Variable::Arg rhs) {
return RationalFunction(*$self) / rhs;
}
Rational div(const Rational& rhs) {
if (carl::isZero(rhs)) throw std::runtime_error("Div by zero");
return *$self / rhs;
}
Rational pow(std::size_t exp) {
return pow($self->get_d(),exp);
}
Rational neg() {
return -(*$self);
}
Rational abs() {
return abs(*$self);
}
bool equals(const Rational& rhs) {
return *$self==rhs;
}
bool notEquals(const Rational& rhs) {
return *$self!=rhs;
}
bool lessEquals(const Rational& rhs) {
return *$self<=rhs;
}
bool greaterEquals(const Rational& rhs) {
return *$self>=rhs;
}
bool less(const Rational& rhs) {
return *$self<rhs;
}
bool greater(const Rational& rhs) {
return *$self>rhs;
}
}
};
typedef mpq_class Rational;
/*
typedef carl::Term<Rational> Term;
typedef carl::MultivariatePolynomial<Rational> Polynomial;
typedef carl::RationalFunction<Polynomial> RationalFunction; */