6#include "symengine/symengine_config.h"
8#ifdef HAVE_SYMENGINE_GMP
12#ifdef HAVE_SYMENGINE_MPFR
16#include "symengine/symengine_exception.h"
23#define SYMENGINE_C_ASSERT(cond) \
26 printf("SYMENGINE_C_ASSERT failed: %s \nfunction %s (), line " \
27 "number %d at\n%s\n", \
28 __FILE__, __func__, __LINE__, #cond); \
33typedef symengine_exceptions_t CWRAPPER_OUTPUT_TYPE;
36#define SYMENGINE_INCLUDE_ALL
37#define SYMENGINE_ENUM(type, Class) type,
38#include "symengine/type_codes.inc"
40#undef SYMENGINE_INCLUDE_ALL
41 SYMENGINE_TypeID_Count
69#if !defined(WITH_SYMENGINE_RCP)
100void basic_new_stack(basic s);
102void basic_free_stack(basic s);
110const char *symengine_version();
118void basic_const_set(basic s,
const char *c);
120void basic_const_zero(basic s);
121void basic_const_one(basic s);
122void basic_const_minus_one(basic s);
123void basic_const_I(basic s);
125void basic_const_pi(basic s);
126void basic_const_E(basic s);
127void basic_const_EulerGamma(basic s);
128void basic_const_Catalan(basic s);
129void basic_const_GoldenRatio(basic s);
133void basic_const_infinity(basic s);
134void basic_const_neginfinity(basic s);
135void basic_const_complex_infinity(basic s);
138void basic_const_nan(basic s);
141CWRAPPER_OUTPUT_TYPE basic_assign(basic a,
const basic b);
144CWRAPPER_OUTPUT_TYPE basic_parse(basic b,
const char *str);
147CWRAPPER_OUTPUT_TYPE basic_parse2(basic b,
const char *str,
int convert_xor);
150TypeID basic_get_type(
const basic s);
152TypeID basic_get_class_id(
const char *c);
155char *basic_get_class_from_id(TypeID
id);
160CWRAPPER_OUTPUT_TYPE symbol_set(basic s,
const char *c);
163int number_is_zero(
const basic s);
165int number_is_negative(
const basic s);
167int number_is_positive(
const basic s);
169int number_is_complex(
const basic s);
172CWRAPPER_OUTPUT_TYPE integer_set_si(basic s,
long i);
174CWRAPPER_OUTPUT_TYPE integer_set_ui(basic s,
unsigned long i);
176#ifdef HAVE_SYMENGINE_GMP
177CWRAPPER_OUTPUT_TYPE integer_set_mpz(basic s,
const mpz_t i);
180CWRAPPER_OUTPUT_TYPE integer_set_str(basic s,
const char *c);
182CWRAPPER_OUTPUT_TYPE real_double_set_d(basic s,
double d);
184double real_double_get_d(
const basic s);
186#ifdef HAVE_SYMENGINE_MPFR
188CWRAPPER_OUTPUT_TYPE real_mpfr_set_d(basic s,
double d,
int prec);
191CWRAPPER_OUTPUT_TYPE real_mpfr_set_str(basic s,
const char *c,
int prec);
193double real_mpfr_get_d(
const basic s);
195CWRAPPER_OUTPUT_TYPE real_mpfr_set(basic s, mpfr_srcptr m);
197CWRAPPER_OUTPUT_TYPE real_mpfr_get(mpfr_ptr m,
const basic s);
199mpfr_prec_t real_mpfr_get_prec(
const basic s);
203CWRAPPER_OUTPUT_TYPE complex_base_real_part(basic s,
const basic com);
205CWRAPPER_OUTPUT_TYPE complex_base_imaginary_part(basic s,
const basic com);
208signed long integer_get_si(
const basic s);
210unsigned long integer_get_ui(
const basic s);
212#ifdef HAVE_SYMENGINE_GMP
213CWRAPPER_OUTPUT_TYPE integer_get_mpz(mpz_t a,
const basic s);
218CWRAPPER_OUTPUT_TYPE rational_set(basic s,
const basic i,
const basic j);
220CWRAPPER_OUTPUT_TYPE rational_set_si(basic s,
long i,
long j);
222CWRAPPER_OUTPUT_TYPE rational_set_ui(basic s,
unsigned long i,
unsigned long j);
223#ifdef HAVE_SYMENGINE_GMP
225CWRAPPER_OUTPUT_TYPE rational_get_mpq(mpq_t a,
const basic s);
227CWRAPPER_OUTPUT_TYPE rational_set_mpq(basic s,
const mpq_t i);
231CWRAPPER_OUTPUT_TYPE complex_set(basic s,
const basic re,
const basic im);
233CWRAPPER_OUTPUT_TYPE complex_set_rat(basic s,
const basic re,
const basic im);
234#ifdef HAVE_SYMENGINE_GMP
236CWRAPPER_OUTPUT_TYPE complex_set_mpq(basic s,
const mpq_t re,
const mpq_t im);
241dcomplex complex_double_get(
const basic s);
244CWRAPPER_OUTPUT_TYPE basic_add(basic s,
const basic a,
const basic b);
246CWRAPPER_OUTPUT_TYPE basic_sub(basic s,
const basic a,
const basic b);
248CWRAPPER_OUTPUT_TYPE basic_mul(basic s,
const basic a,
const basic b);
250CWRAPPER_OUTPUT_TYPE basic_div(basic s,
const basic a,
const basic b);
252CWRAPPER_OUTPUT_TYPE basic_pow(basic s,
const basic a,
const basic b);
255CWRAPPER_OUTPUT_TYPE basic_diff(basic s,
const basic expr,
const basic sym);
257int basic_eq(
const basic a,
const basic b);
259int basic_neq(
const basic a,
const basic b);
262CWRAPPER_OUTPUT_TYPE basic_expand(basic s,
const basic a);
264CWRAPPER_OUTPUT_TYPE basic_neg(basic s,
const basic a);
267CWRAPPER_OUTPUT_TYPE basic_abs(basic s,
const basic a);
270CWRAPPER_OUTPUT_TYPE basic_erf(basic s,
const basic a);
272CWRAPPER_OUTPUT_TYPE basic_erfc(basic s,
const basic a);
275CWRAPPER_OUTPUT_TYPE basic_sin(basic s,
const basic a);
277CWRAPPER_OUTPUT_TYPE basic_cos(basic s,
const basic a);
279CWRAPPER_OUTPUT_TYPE basic_tan(basic s,
const basic a);
282CWRAPPER_OUTPUT_TYPE basic_asin(basic s,
const basic a);
284CWRAPPER_OUTPUT_TYPE basic_acos(basic s,
const basic a);
286CWRAPPER_OUTPUT_TYPE basic_atan(basic s,
const basic a);
289CWRAPPER_OUTPUT_TYPE basic_csc(basic s,
const basic a);
291CWRAPPER_OUTPUT_TYPE basic_sec(basic s,
const basic a);
293CWRAPPER_OUTPUT_TYPE basic_cot(basic s,
const basic a);
296CWRAPPER_OUTPUT_TYPE basic_acsc(basic s,
const basic a);
298CWRAPPER_OUTPUT_TYPE basic_asec(basic s,
const basic a);
300CWRAPPER_OUTPUT_TYPE basic_acot(basic s,
const basic a);
303CWRAPPER_OUTPUT_TYPE basic_sinh(basic s,
const basic a);
305CWRAPPER_OUTPUT_TYPE basic_cosh(basic s,
const basic a);
307CWRAPPER_OUTPUT_TYPE basic_tanh(basic s,
const basic a);
310CWRAPPER_OUTPUT_TYPE basic_asinh(basic s,
const basic a);
312CWRAPPER_OUTPUT_TYPE basic_acosh(basic s,
const basic a);
314CWRAPPER_OUTPUT_TYPE basic_atanh(basic s,
const basic a);
317CWRAPPER_OUTPUT_TYPE basic_csch(basic s,
const basic a);
319CWRAPPER_OUTPUT_TYPE basic_sech(basic s,
const basic a);
321CWRAPPER_OUTPUT_TYPE basic_coth(basic s,
const basic a);
324CWRAPPER_OUTPUT_TYPE basic_acsch(basic s,
const basic a);
326CWRAPPER_OUTPUT_TYPE basic_asech(basic s,
const basic a);
328CWRAPPER_OUTPUT_TYPE basic_acoth(basic s,
const basic a);
331CWRAPPER_OUTPUT_TYPE basic_lambertw(basic s,
const basic a);
333CWRAPPER_OUTPUT_TYPE basic_zeta(basic s,
const basic a);
335CWRAPPER_OUTPUT_TYPE basic_dirichlet_eta(basic s,
const basic a);
337CWRAPPER_OUTPUT_TYPE basic_gamma(basic s,
const basic a);
339CWRAPPER_OUTPUT_TYPE basic_loggamma(basic s,
const basic a);
341CWRAPPER_OUTPUT_TYPE basic_sqrt(basic s,
const basic a);
343CWRAPPER_OUTPUT_TYPE basic_cbrt(basic s,
const basic a);
345CWRAPPER_OUTPUT_TYPE basic_exp(basic s,
const basic a);
347CWRAPPER_OUTPUT_TYPE basic_log(basic s,
const basic a);
349CWRAPPER_OUTPUT_TYPE basic_floor(basic s,
const basic a);
351CWRAPPER_OUTPUT_TYPE basic_ceiling(basic s,
const basic a);
354CWRAPPER_OUTPUT_TYPE basic_atan2(basic s,
const basic a,
const basic b);
356CWRAPPER_OUTPUT_TYPE basic_kronecker_delta(basic s,
const basic a,
359CWRAPPER_OUTPUT_TYPE basic_lowergamma(basic s,
const basic a,
const basic b);
361CWRAPPER_OUTPUT_TYPE basic_uppergamma(basic s,
const basic a,
const basic b);
363CWRAPPER_OUTPUT_TYPE basic_beta(basic s,
const basic a,
const basic b);
365CWRAPPER_OUTPUT_TYPE basic_polygamma(basic s,
const basic a,
const basic b);
368char *basic_dumps(
const basic s,
unsigned long *size);
370CWRAPPER_OUTPUT_TYPE basic_loads(basic s,
const char *c,
unsigned long size);
373char *basic_str(
const basic s);
376char *basic_str_julia(
const basic s);
378char *basic_str_mathml(
const basic s);
380char *basic_str_latex(
const basic s);
382char *basic_str_ccode(
const basic s);
384char *basic_str_jscode(
const basic s);
386void basic_str_free(
char *s);
389void bool_set_true(basic s);
391void bool_set_false(basic s);
394void basic_set_emptyset(basic s);
396void basic_set_universalset(basic s);
398void basic_set_complexes(basic s);
400void basic_set_reals(basic s);
402void basic_set_rationals(basic s);
404void basic_set_integers(basic s);
406CWRAPPER_OUTPUT_TYPE basic_set_interval(basic s,
const basic start,
407 const basic end,
int left_open,
410CWRAPPER_OUTPUT_TYPE basic_set_finiteset(basic s,
const CSetBasic *container);
412CWRAPPER_OUTPUT_TYPE basic_set_union(basic s,
const basic a,
const basic b);
414CWRAPPER_OUTPUT_TYPE basic_set_intersection(basic s,
const basic a,
417CWRAPPER_OUTPUT_TYPE basic_set_complement(basic s,
const basic a,
420CWRAPPER_OUTPUT_TYPE basic_set_contains(basic s,
const basic a,
const basic b);
422int basic_set_is_subset(
const basic a,
const basic b);
424int basic_set_is_proper_subset(
const basic a,
const basic b);
426int basic_set_is_superset(
const basic a,
const basic b);
428int basic_set_is_proper_superset(
const basic a,
const basic b);
430CWRAPPER_OUTPUT_TYPE basic_set_inf(basic s,
const basic a);
432CWRAPPER_OUTPUT_TYPE basic_set_sup(basic s,
const basic a);
434CWRAPPER_OUTPUT_TYPE basic_set_boundary(basic s,
const basic a);
436CWRAPPER_OUTPUT_TYPE basic_set_interior(basic s,
const basic a);
438CWRAPPER_OUTPUT_TYPE basic_set_closure(basic s,
const basic a);
449int symengine_have_component(
const char *c);
452int is_a_Number(
const basic s);
454int is_a_Integer(
const basic s);
456int is_a_Rational(
const basic s);
458int is_a_Symbol(
const basic s);
460int is_a_Complex(
const basic s);
462int is_a_RealDouble(
const basic c);
464int is_a_ComplexDouble(
const basic c);
466int is_a_RealMPFR(
const basic c);
468int is_a_ComplexMPC(
const basic c);
470int is_a_Set(
const basic c);
484int vectorint_placement_new_check(
void *data,
size_t size);
485CVectorInt *vectorint_placement_new(
void *data);
487void vectorint_placement_free(
CVectorInt *self);
490void vectorint_push_back(
CVectorInt *self,
int value);
499CWRAPPER_OUTPUT_TYPE vecbasic_push_back(
CVecBasic *self,
const basic value);
500CWRAPPER_OUTPUT_TYPE vecbasic_get(
CVecBasic *self,
size_t n, basic result);
501CWRAPPER_OUTPUT_TYPE vecbasic_set(
CVecBasic *self,
size_t n,
const basic s);
502CWRAPPER_OUTPUT_TYPE vecbasic_erase(
CVecBasic *self,
size_t n);
506CWRAPPER_OUTPUT_TYPE basic_max(basic s,
const CVecBasic *d);
508CWRAPPER_OUTPUT_TYPE basic_min(basic s,
const CVecBasic *d);
510CWRAPPER_OUTPUT_TYPE basic_add_vec(basic s,
const CVecBasic *d);
513CWRAPPER_OUTPUT_TYPE basic_mul_vec(basic s,
const CVecBasic *d);
527CDenseMatrix *dense_matrix_new_rows_cols(
unsigned r,
unsigned c);
538CWRAPPER_OUTPUT_TYPE dense_matrix_rows_cols(
CDenseMatrix *mat,
unsigned r,
541CWRAPPER_OUTPUT_TYPE dense_matrix_get_basic(basic s,
const CDenseMatrix *mat,
543 unsigned long int c);
545CWRAPPER_OUTPUT_TYPE dense_matrix_set_basic(
CDenseMatrix *mat,
547 unsigned long int c, basic s);
549CWRAPPER_OUTPUT_TYPE sparse_matrix_get_basic(basic s,
const CSparseMatrix *mat,
551 unsigned long int c);
553CWRAPPER_OUTPUT_TYPE sparse_matrix_set_basic(
CSparseMatrix *mat,
555 unsigned long int c, basic s);
557CWRAPPER_OUTPUT_TYPE dense_matrix_det(basic s,
const CDenseMatrix *mat);
561CWRAPPER_OUTPUT_TYPE dense_matrix_transpose(
CDenseMatrix *s,
567 unsigned long int r1,
unsigned long int c1,
568 unsigned long int r2,
unsigned long int c2,
569 unsigned long int r,
unsigned long int c);
571CWRAPPER_OUTPUT_TYPE dense_matrix_row_join(
CDenseMatrix *A,
574CWRAPPER_OUTPUT_TYPE dense_matrix_col_join(
CDenseMatrix *A,
577CWRAPPER_OUTPUT_TYPE dense_matrix_row_del(
CDenseMatrix *C,
unsigned k);
579CWRAPPER_OUTPUT_TYPE dense_matrix_col_del(
CDenseMatrix *C,
unsigned k);
582unsigned long int dense_matrix_cols(
const CDenseMatrix *s);
584unsigned long int dense_matrix_rows(
const CDenseMatrix *s);
586CWRAPPER_OUTPUT_TYPE dense_matrix_add_matrix(
CDenseMatrix *s,
590CWRAPPER_OUTPUT_TYPE dense_matrix_mul_matrix(
CDenseMatrix *s,
594CWRAPPER_OUTPUT_TYPE dense_matrix_add_scalar(
CDenseMatrix *s,
598CWRAPPER_OUTPUT_TYPE dense_matrix_mul_scalar(
CDenseMatrix *s,
615CWRAPPER_OUTPUT_TYPE dense_matrix_LU_solve(
CDenseMatrix *x,
619CWRAPPER_OUTPUT_TYPE dense_matrix_ones(
CDenseMatrix *s,
unsigned long int r,
620 unsigned long int c);
622CWRAPPER_OUTPUT_TYPE dense_matrix_zeros(
CDenseMatrix *s,
unsigned long int r,
623 unsigned long int c);
629CWRAPPER_OUTPUT_TYPE dense_matrix_eye(
CDenseMatrix *s,
unsigned long int N,
630 unsigned long int M,
int k);
633CWRAPPER_OUTPUT_TYPE dense_matrix_diff(
CDenseMatrix *result,
636CWRAPPER_OUTPUT_TYPE dense_matrix_jacobian(
CDenseMatrix *result,
643void sparse_matrix_rows_cols(
CSparseMatrix *s,
unsigned long int r,
644 unsigned long int c);
664int setbasic_insert(
CSetBasic *self,
const basic value);
665void setbasic_get(
CSetBasic *self,
int n, basic result);
667int setbasic_find(
CSetBasic *self, basic value);
669int setbasic_erase(
CSetBasic *self,
const basic value);
681int mapbasicbasic_get(
CMapBasicBasic *self,
const basic key, basic mapped);
687CWRAPPER_OUTPUT_TYPE basic_get_args(
const basic self,
CVecBasic *args);
689CWRAPPER_OUTPUT_TYPE basic_free_symbols(
const basic self,
CSetBasic *symbols);
691CWRAPPER_OUTPUT_TYPE basic_function_symbols(
CSetBasic *symbols,
694size_t basic_hash(
const basic self);
697CWRAPPER_OUTPUT_TYPE basic_subs(basic s,
const basic e,
701CWRAPPER_OUTPUT_TYPE basic_subs2(basic s,
const basic e,
const basic a,
706CWRAPPER_OUTPUT_TYPE function_symbol_set(basic s,
const char *c,
710char *function_symbol_get_name(
const basic b);
712CWRAPPER_OUTPUT_TYPE basic_coeff(basic c,
const basic b,
const basic x,
721CWRAPPER_OUTPUT_TYPE basic_solve_poly(
CSetBasic *r,
const basic f,
728char *ascii_art_str();
732CWRAPPER_OUTPUT_TYPE ntheory_gcd(basic s,
const basic a,
const basic b);
734CWRAPPER_OUTPUT_TYPE ntheory_lcm(basic s,
const basic a,
const basic b);
736CWRAPPER_OUTPUT_TYPE ntheory_gcd_ext(basic g, basic s, basic t,
const basic a,
739CWRAPPER_OUTPUT_TYPE ntheory_nextprime(basic s,
const basic a);
741CWRAPPER_OUTPUT_TYPE ntheory_mod(basic s,
const basic n,
const basic d);
743CWRAPPER_OUTPUT_TYPE ntheory_quotient(basic s,
const basic n,
const basic d);
745CWRAPPER_OUTPUT_TYPE ntheory_quotient_mod(basic q, basic r,
const basic n,
748CWRAPPER_OUTPUT_TYPE ntheory_mod_f(basic s,
const basic n,
const basic d);
750CWRAPPER_OUTPUT_TYPE ntheory_quotient_f(basic s,
const basic n,
const basic d);
752CWRAPPER_OUTPUT_TYPE ntheory_quotient_mod_f(basic q, basic r,
const basic n,
755int ntheory_mod_inverse(basic b,
const basic a,
const basic m);
757CWRAPPER_OUTPUT_TYPE ntheory_fibonacci(basic s,
unsigned long a);
759CWRAPPER_OUTPUT_TYPE ntheory_fibonacci2(basic g, basic s,
unsigned long a);
761CWRAPPER_OUTPUT_TYPE ntheory_lucas(basic s,
unsigned long a);
763CWRAPPER_OUTPUT_TYPE ntheory_lucas2(basic g, basic s,
unsigned long a);
765CWRAPPER_OUTPUT_TYPE ntheory_binomial(basic s,
const basic a,
unsigned long b);
767CWRAPPER_OUTPUT_TYPE ntheory_factorial(basic s,
unsigned long n);
769CWRAPPER_OUTPUT_TYPE basic_evalf(basic s,
const basic b,
unsigned long bits,
773CWRAPPER_OUTPUT_TYPE basic_as_numer_denom(basic numer, basic denom,
781 const CVecBasic *exprs,
int perform_cse);
784 const double *
const inps);
788#ifdef HAVE_SYMENGINE_LLVM
790typedef struct CLLVMDoubleVisitor CLLVMDoubleVisitor;
791CLLVMDoubleVisitor *llvm_double_visitor_new();
792void llvm_double_visitor_init(CLLVMDoubleVisitor *self,
const CVecBasic *args,
795void llvm_double_visitor_call(CLLVMDoubleVisitor *self,
double *
const outs,
796 const double *
const inps);
797void llvm_double_visitor_free(CLLVMDoubleVisitor *self);
799typedef struct CLLVMFloatVisitor CLLVMFloatVisitor;
800CLLVMFloatVisitor *llvm_float_visitor_new();
801void llvm_float_visitor_init(CLLVMFloatVisitor *self,
const CVecBasic *args,
804void llvm_float_visitor_call(CLLVMFloatVisitor *self,
float *
const outs,
805 const float *
const inps);
806void llvm_float_visitor_free(CLLVMFloatVisitor *self);
808#ifdef SYMENGINE_HAVE_LLVM_LONG_DOUBLE
810typedef struct CLLVMLongDoubleVisitor CLLVMLongDoubleVisitor;
811CLLVMLongDoubleVisitor *llvm_long_double_visitor_new();
812void llvm_long_double_visitor_init(CLLVMLongDoubleVisitor *self,
816void llvm_long_double_visitor_call(CLLVMLongDoubleVisitor *self,
817 long double *
const outs,
818 const long double *
const inps);
819void llvm_long_double_visitor_free(CLLVMLongDoubleVisitor *self);
823CWRAPPER_OUTPUT_TYPE basic_cse(
CVecBasic *replacement_syms,
829void symengine_print_stack_on_segfault();