6. API¶
Certain features of reFORM can be used inside other programs and programming languages using its API. We expose a Python API and a C API.
6.1. Python API¶
To compile the reFORM Python 3 library, compile with the python_api feature:
cargo build --release --features=python_api
This will produce a libreform.so (Linux), libreform.dylib (Mac OS),
or libreform.dll (Windows) in target/release. Rename this file to reform.so, place it in the same folder as your Python script, and simply import it.
Note
On Mac OS, it could be that the code does not compile. A fix is to remove features = ["extension-module"] from Cargo.toml, which will mean
that the Python 3 version that the library supports, is fixed.
An example Python program:
import reform
vi = reform.VarInfo()
a = reform.Expression("x+y^2", vi)
b = reform.Expression("z", vi)
c = a * b
print("c: ", c, ", c expanded: ", c.expand())
d = c.expand().id("x", "1+w", vi)
print("Substituted x->1+w: ", d)
An example Python program showing the polynomial API:
import reform
vi = reform.VarInfo();
a = reform.Polynomial("1+x*y+5", vi)
b = reform.Polynomial("x^2+2*x*y+y", vi)
g = a + b
ag = a * g
bg = b * g
rat = reform.RationalPolynomial(ag, bg)
print('ag/bg:', rat)
print('gcd:', ag.gcd(bg))
Polynomials can be converted to generic expressions and vice-versa with to_expression() and to_polynomial().
The latter function will fail if the expression is not a polynomial.
6.2. C API¶
To compile the reFORM C library, compile with the c_api feature:
cargo build --release --features=c_api
Then, compile your C code as follows:
gcc --std=c11 -o gcd gcd.c -L target/release/ -lreform
To run the C code, add the library to the path:
LD_LIBRARY_PATH=target/release/
An example C program:
#include <stdio.h>
#include <stdint.h>
typedef struct polynomial Polynomial;
typedef struct varinfo VarInfo;
extern VarInfo * polynomial_varinfo();
extern void polynomial_varinfo_free(VarInfo *);
extern Polynomial * polynomial_new(const char *expr, VarInfo*);
extern void polynomial_free(Polynomial *);
extern Polynomial * polynomial_clone(Polynomial *);
extern char * polynomial_to_string(Polynomial *);
extern void polynomial_string_free(char *);
extern Polynomial * polynomial_add(const Polynomial *, const Polynomial *);
extern Polynomial * polynomial_mul(const Polynomial *, const Polynomial *);
extern Polynomial * polynomial_sub(const Polynomial *, const Polynomial *);
extern Polynomial * polynomial_div(const Polynomial *, const Polynomial *);
extern Polynomial * polynomial_neg(const Polynomial *);
extern Polynomial * polynomial_gcd(const Polynomial *, const Polynomial *);
extern RationalPolynomial * rationalpolynomial_new(const Polynomial *, const Polynomial *);
extern void rationalpolynomial_free(RationalPolynomial *);
extern Polynomial * rationalpolynomial_clone(Polynomial *);
extern char * rationalpolynomial_to_string(RationalPolynomial *);
extern Polynomial * rationalpolynomial_neg(const RationalPolynomial *);
extern RationalPolynomial * rationalpolynomial_add(const RationalPolynomial *, const RationalPolynomial *);
extern RationalPolynomial * rationalpolynomial_mul(const RationalPolynomial *, const RationalPolynomial *);
extern RationalPolynomial * rationalpolynomial_div(const RationalPolynomial *, const RationalPolynomial *);
extern RationalPolynomial * rationalpolynomial_sub(const RationalPolynomial *, const RationalPolynomial *);
int main(void) {
VarInfo *vi = polynomial_varinfo();
Polynomial *a = polynomial_new("1+x*y+5", vi);
Polynomial *b = polynomial_new("x^2+2*x*y+y", vi);
Polynomial *g = polynomial_add(a, b);
Polynomial *ag = polynomial_mul(a, g);
Polynomial *bg = polynomial_mul(b, g);
Polynomial *gcd = polynomial_gcd(ag, bg);
char *str = polynomial_to_string(gcd);
printf("gcd: %s\n", str);
RationalPolynomial *rat = rationalpolynomial_new(ag, bg); // g wil be removed
char *s = rationalpolynomial_to_string(mrat);
printf("ag/bg: %s\n", s);
polynomial_string_free(s);
polynomial_string_free(str);
rationalpolynomial_free(rat);
rationalpolynomial_free(mrat);
polynomial_free(a);
polynomial_free(b);
polynomial_free(g);
polynomial_free(ag);
polynomial_free(bg);
polynomial_free(gcd);
polynomial_varinfo_free(vi);
}