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); \
33 typedef 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)
87 #ifdef symengine_EXPORTS
102 void basic_new_stack(basic s);
104 void basic_free_stack(basic s);
112 const char *symengine_version(
void);
120 void basic_const_set(basic s,
const char *c);
122 void basic_const_zero(basic s);
123 void basic_const_one(basic s);
124 void basic_const_minus_one(basic s);
125 void basic_const_I(basic s);
127 void basic_const_pi(basic s);
128 void basic_const_E(basic s);
129 void basic_const_EulerGamma(basic s);
130 void basic_const_Catalan(basic s);
131 void basic_const_GoldenRatio(basic s);
135 void basic_const_infinity(basic s);
136 void basic_const_neginfinity(basic s);
137 void basic_const_complex_infinity(basic s);
140 void basic_const_nan(basic s);
143 CWRAPPER_OUTPUT_TYPE basic_assign(basic a,
const basic b);
146 CWRAPPER_OUTPUT_TYPE basic_parse(basic b,
const char *str);
149 CWRAPPER_OUTPUT_TYPE basic_parse2(basic b,
const char *str,
int convert_xor);
152 TypeID basic_get_type(
const basic s);
154 TypeID basic_get_class_id(
const char *c);
157 char *basic_get_class_from_id(TypeID
id);
162 CWRAPPER_OUTPUT_TYPE symbol_set(basic s,
const char *c);
165 int number_is_zero(
const basic s);
167 int number_is_negative(
const basic s);
169 int number_is_positive(
const basic s);
171 int number_is_complex(
const basic s);
174 int basic_has_symbol(
const basic e,
const basic s);
177 CWRAPPER_OUTPUT_TYPE integer_set_si(basic s,
long i);
179 CWRAPPER_OUTPUT_TYPE integer_set_ui(basic s,
unsigned long i);
181 #ifdef HAVE_SYMENGINE_GMP
182 CWRAPPER_OUTPUT_TYPE integer_set_mpz(basic s,
const mpz_t i);
185 CWRAPPER_OUTPUT_TYPE integer_set_str(basic s,
const char *c);
187 CWRAPPER_OUTPUT_TYPE real_double_set_d(basic s,
double d);
189 double real_double_get_d(
const basic s);
191 #ifdef HAVE_SYMENGINE_MPFR
193 CWRAPPER_OUTPUT_TYPE real_mpfr_set_d(basic s,
double d,
int prec);
196 CWRAPPER_OUTPUT_TYPE real_mpfr_set_str(basic s,
const char *c,
int prec);
198 double real_mpfr_get_d(
const basic s);
200 CWRAPPER_OUTPUT_TYPE real_mpfr_set(basic s, mpfr_srcptr m);
202 CWRAPPER_OUTPUT_TYPE real_mpfr_get(mpfr_ptr m,
const basic s);
204 mpfr_prec_t real_mpfr_get_prec(
const basic s);
208 CWRAPPER_OUTPUT_TYPE complex_base_real_part(basic s,
const basic com);
210 CWRAPPER_OUTPUT_TYPE complex_base_imaginary_part(basic s,
const basic com);
213 signed long integer_get_si(
const basic s);
215 unsigned long integer_get_ui(
const basic s);
217 #ifdef HAVE_SYMENGINE_GMP
218 CWRAPPER_OUTPUT_TYPE integer_get_mpz(mpz_t a,
const basic s);
223 CWRAPPER_OUTPUT_TYPE rational_set(basic s,
const basic i,
const basic j);
225 CWRAPPER_OUTPUT_TYPE rational_set_si(basic s,
long i,
long j);
227 CWRAPPER_OUTPUT_TYPE rational_set_ui(basic s,
unsigned long i,
unsigned long j);
228 #ifdef HAVE_SYMENGINE_GMP
230 CWRAPPER_OUTPUT_TYPE rational_get_mpq(mpq_t a,
const basic s);
232 CWRAPPER_OUTPUT_TYPE rational_set_mpq(basic s,
const mpq_t i);
236 CWRAPPER_OUTPUT_TYPE complex_set(basic s,
const basic re,
const basic im);
238 CWRAPPER_OUTPUT_TYPE complex_set_rat(basic s,
const basic re,
const basic im);
239 #ifdef HAVE_SYMENGINE_GMP
241 CWRAPPER_OUTPUT_TYPE complex_set_mpq(basic s,
const mpq_t re,
const mpq_t im);
246 dcomplex complex_double_get(
const basic s);
249 CWRAPPER_OUTPUT_TYPE basic_add(basic s,
const basic a,
const basic b);
251 CWRAPPER_OUTPUT_TYPE basic_sub(basic s,
const basic a,
const basic b);
253 CWRAPPER_OUTPUT_TYPE basic_mul(basic s,
const basic a,
const basic b);
255 CWRAPPER_OUTPUT_TYPE basic_div(basic s,
const basic a,
const basic b);
257 CWRAPPER_OUTPUT_TYPE basic_pow(basic s,
const basic a,
const basic b);
260 CWRAPPER_OUTPUT_TYPE basic_diff(basic s,
const basic expr,
const basic sym);
262 int basic_eq(
const basic a,
const basic b);
264 int basic_neq(
const basic a,
const basic b);
267 CWRAPPER_OUTPUT_TYPE basic_expand(basic s,
const basic a);
269 CWRAPPER_OUTPUT_TYPE basic_neg(basic s,
const basic a);
272 CWRAPPER_OUTPUT_TYPE basic_abs(basic s,
const basic a);
275 CWRAPPER_OUTPUT_TYPE basic_erf(basic s,
const basic a);
277 CWRAPPER_OUTPUT_TYPE basic_erfc(basic s,
const basic a);
280 CWRAPPER_OUTPUT_TYPE basic_sin(basic s,
const basic a);
282 CWRAPPER_OUTPUT_TYPE basic_cos(basic s,
const basic a);
284 CWRAPPER_OUTPUT_TYPE basic_tan(basic s,
const basic a);
287 CWRAPPER_OUTPUT_TYPE basic_asin(basic s,
const basic a);
289 CWRAPPER_OUTPUT_TYPE basic_acos(basic s,
const basic a);
291 CWRAPPER_OUTPUT_TYPE basic_atan(basic s,
const basic a);
294 CWRAPPER_OUTPUT_TYPE basic_csc(basic s,
const basic a);
296 CWRAPPER_OUTPUT_TYPE basic_sec(basic s,
const basic a);
298 CWRAPPER_OUTPUT_TYPE basic_cot(basic s,
const basic a);
301 CWRAPPER_OUTPUT_TYPE basic_acsc(basic s,
const basic a);
303 CWRAPPER_OUTPUT_TYPE basic_asec(basic s,
const basic a);
305 CWRAPPER_OUTPUT_TYPE basic_acot(basic s,
const basic a);
308 CWRAPPER_OUTPUT_TYPE basic_sinh(basic s,
const basic a);
310 CWRAPPER_OUTPUT_TYPE basic_cosh(basic s,
const basic a);
312 CWRAPPER_OUTPUT_TYPE basic_tanh(basic s,
const basic a);
315 CWRAPPER_OUTPUT_TYPE basic_asinh(basic s,
const basic a);
317 CWRAPPER_OUTPUT_TYPE basic_acosh(basic s,
const basic a);
319 CWRAPPER_OUTPUT_TYPE basic_atanh(basic s,
const basic a);
322 CWRAPPER_OUTPUT_TYPE basic_csch(basic s,
const basic a);
324 CWRAPPER_OUTPUT_TYPE basic_sech(basic s,
const basic a);
326 CWRAPPER_OUTPUT_TYPE basic_coth(basic s,
const basic a);
329 CWRAPPER_OUTPUT_TYPE basic_acsch(basic s,
const basic a);
331 CWRAPPER_OUTPUT_TYPE basic_asech(basic s,
const basic a);
333 CWRAPPER_OUTPUT_TYPE basic_acoth(basic s,
const basic a);
336 CWRAPPER_OUTPUT_TYPE basic_lambertw(basic s,
const basic a);
338 CWRAPPER_OUTPUT_TYPE basic_zeta(basic s,
const basic a);
340 CWRAPPER_OUTPUT_TYPE basic_dirichlet_eta(basic s,
const basic a);
342 CWRAPPER_OUTPUT_TYPE basic_gamma(basic s,
const basic a);
344 CWRAPPER_OUTPUT_TYPE basic_loggamma(basic s,
const basic a);
346 CWRAPPER_OUTPUT_TYPE basic_sqrt(basic s,
const basic a);
348 CWRAPPER_OUTPUT_TYPE basic_cbrt(basic s,
const basic a);
350 CWRAPPER_OUTPUT_TYPE basic_exp(basic s,
const basic a);
352 CWRAPPER_OUTPUT_TYPE basic_log(basic s,
const basic a);
354 CWRAPPER_OUTPUT_TYPE basic_floor(basic s,
const basic a);
356 CWRAPPER_OUTPUT_TYPE basic_ceiling(basic s,
const basic a);
358 CWRAPPER_OUTPUT_TYPE basic_sign(basic s,
const basic a);
361 CWRAPPER_OUTPUT_TYPE basic_atan2(basic s,
const basic a,
const basic b);
363 CWRAPPER_OUTPUT_TYPE basic_kronecker_delta(basic s,
const basic a,
366 CWRAPPER_OUTPUT_TYPE basic_lowergamma(basic s,
const basic a,
const basic b);
368 CWRAPPER_OUTPUT_TYPE basic_uppergamma(basic s,
const basic a,
const basic b);
370 CWRAPPER_OUTPUT_TYPE basic_beta(basic s,
const basic a,
const basic b);
372 CWRAPPER_OUTPUT_TYPE basic_polygamma(basic s,
const basic a,
const basic b);
375 char *basic_dumps(
const basic s,
unsigned long *size);
377 CWRAPPER_OUTPUT_TYPE basic_loads(basic s,
const char *c,
unsigned long size);
380 char *basic_str(
const basic s);
383 char *basic_str_julia(
const basic s);
385 char *basic_str_mathml(
const basic s);
387 char *basic_str_latex(
const basic s);
389 char *basic_str_ccode(
const basic s);
391 char *basic_str_jscode(
const basic s);
393 void basic_str_free(
char *s);
396 void bool_set_true(basic s);
398 void bool_set_false(basic s);
401 void basic_set_emptyset(basic s);
403 void basic_set_universalset(basic s);
405 void basic_set_complexes(basic s);
407 void basic_set_reals(basic s);
409 void basic_set_rationals(basic s);
411 void basic_set_integers(basic s);
413 CWRAPPER_OUTPUT_TYPE basic_set_interval(basic s,
const basic start,
414 const basic end,
int left_open,
417 CWRAPPER_OUTPUT_TYPE basic_set_finiteset(basic s,
const CSetBasic *container);
419 CWRAPPER_OUTPUT_TYPE basic_set_union(basic s,
const basic a,
const basic b);
421 CWRAPPER_OUTPUT_TYPE basic_set_intersection(basic s,
const basic a,
424 CWRAPPER_OUTPUT_TYPE basic_set_complement(basic s,
const basic a,
427 CWRAPPER_OUTPUT_TYPE basic_set_contains(basic s,
const basic a,
const basic b);
429 int basic_set_is_subset(
const basic a,
const basic b);
431 int basic_set_is_proper_subset(
const basic a,
const basic b);
433 int basic_set_is_superset(
const basic a,
const basic b);
435 int basic_set_is_proper_superset(
const basic a,
const basic b);
437 CWRAPPER_OUTPUT_TYPE basic_set_inf(basic s,
const basic a);
439 CWRAPPER_OUTPUT_TYPE basic_set_sup(basic s,
const basic a);
441 CWRAPPER_OUTPUT_TYPE basic_set_boundary(basic s,
const basic a);
443 CWRAPPER_OUTPUT_TYPE basic_set_interior(basic s,
const basic a);
445 CWRAPPER_OUTPUT_TYPE basic_set_closure(basic s,
const basic a);
456 int symengine_have_component(
const char *c);
461 int is_a_Integer(
const basic s);
463 int is_a_Rational(
const basic s);
465 int is_a_Symbol(
const basic s);
469 int is_a_RealDouble(
const basic c);
471 int is_a_ComplexDouble(
const basic c);
473 int is_a_RealMPFR(
const basic c);
475 int is_a_ComplexMPC(
const basic c);
477 int is_a_Set(
const basic c);
491 int vectorint_placement_new_check(
void *data,
size_t size);
492 CVectorInt *vectorint_placement_new(
void *data);
494 void vectorint_placement_free(
CVectorInt *
self);
497 void vectorint_push_back(
CVectorInt *
self,
int value);
506 CWRAPPER_OUTPUT_TYPE vecbasic_push_back(
CVecBasic *
self,
const basic value);
507 CWRAPPER_OUTPUT_TYPE vecbasic_get(
CVecBasic *
self,
size_t n, basic result);
508 CWRAPPER_OUTPUT_TYPE vecbasic_set(
CVecBasic *
self,
size_t n,
const basic s);
509 CWRAPPER_OUTPUT_TYPE vecbasic_erase(
CVecBasic *
self,
size_t n);
513 CWRAPPER_OUTPUT_TYPE basic_max(basic s,
const CVecBasic *d);
515 CWRAPPER_OUTPUT_TYPE basic_min(basic s,
const CVecBasic *d);
517 CWRAPPER_OUTPUT_TYPE basic_add_vec(basic s,
const CVecBasic *d);
520 CWRAPPER_OUTPUT_TYPE basic_mul_vec(basic s,
const CVecBasic *d);
534 CDenseMatrix *dense_matrix_new_rows_cols(
unsigned r,
unsigned c);
545 CWRAPPER_OUTPUT_TYPE dense_matrix_rows_cols(
CDenseMatrix *mat,
unsigned r,
548 CWRAPPER_OUTPUT_TYPE dense_matrix_get_basic(basic s,
const CDenseMatrix *mat,
550 unsigned long int c);
552 CWRAPPER_OUTPUT_TYPE dense_matrix_set_basic(
CDenseMatrix *mat,
554 unsigned long int c, basic s);
556 CWRAPPER_OUTPUT_TYPE sparse_matrix_get_basic(basic s,
const CSparseMatrix *mat,
558 unsigned long int c);
560 CWRAPPER_OUTPUT_TYPE sparse_matrix_set_basic(
CSparseMatrix *mat,
562 unsigned long int c, basic s);
564 CWRAPPER_OUTPUT_TYPE dense_matrix_det(basic s,
const CDenseMatrix *mat);
568 CWRAPPER_OUTPUT_TYPE dense_matrix_transpose(
CDenseMatrix *s,
574 unsigned long int r1,
unsigned long int c1,
575 unsigned long int r2,
unsigned long int c2,
576 unsigned long int r,
unsigned long int c);
578 CWRAPPER_OUTPUT_TYPE dense_matrix_row_join(
CDenseMatrix *A,
581 CWRAPPER_OUTPUT_TYPE dense_matrix_col_join(
CDenseMatrix *A,
584 CWRAPPER_OUTPUT_TYPE dense_matrix_row_del(
CDenseMatrix *C,
unsigned k);
586 CWRAPPER_OUTPUT_TYPE dense_matrix_col_del(
CDenseMatrix *C,
unsigned k);
589 unsigned long int dense_matrix_cols(
const CDenseMatrix *s);
591 unsigned long int dense_matrix_rows(
const CDenseMatrix *s);
593 CWRAPPER_OUTPUT_TYPE dense_matrix_add_matrix(
CDenseMatrix *s,
597 CWRAPPER_OUTPUT_TYPE dense_matrix_mul_matrix(
CDenseMatrix *s,
601 CWRAPPER_OUTPUT_TYPE dense_matrix_add_scalar(
CDenseMatrix *s,
605 CWRAPPER_OUTPUT_TYPE dense_matrix_mul_scalar(
CDenseMatrix *s,
615 CWRAPPER_OUTPUT_TYPE dense_matrix_FFLU(
CDenseMatrix *lu,
622 CWRAPPER_OUTPUT_TYPE dense_matrix_LU_solve(
CDenseMatrix *x,
626 CWRAPPER_OUTPUT_TYPE dense_matrix_ones(
CDenseMatrix *s,
unsigned long int r,
627 unsigned long int c);
629 CWRAPPER_OUTPUT_TYPE dense_matrix_zeros(
CDenseMatrix *s,
unsigned long int r,
630 unsigned long int c);
636 CWRAPPER_OUTPUT_TYPE dense_matrix_eye(
CDenseMatrix *s,
unsigned long int N,
637 unsigned long int M,
int k);
640 CWRAPPER_OUTPUT_TYPE dense_matrix_diff(
CDenseMatrix *result,
643 CWRAPPER_OUTPUT_TYPE dense_matrix_jacobian(
CDenseMatrix *result,
650 void sparse_matrix_rows_cols(
CSparseMatrix *s,
unsigned long int r,
651 unsigned long int c);
671 int setbasic_insert(
CSetBasic *
self,
const basic value);
672 void setbasic_get(
CSetBasic *
self,
int n, basic result);
674 int setbasic_find(
CSetBasic *
self, basic value);
676 int setbasic_erase(
CSetBasic *
self,
const basic value);
688 int mapbasicbasic_get(
CMapBasicBasic *
self,
const basic key, basic mapped);
694 CWRAPPER_OUTPUT_TYPE basic_get_args(
const basic
self,
CVecBasic *args);
696 CWRAPPER_OUTPUT_TYPE basic_free_symbols(
const basic
self,
CSetBasic *symbols);
698 CWRAPPER_OUTPUT_TYPE basic_function_symbols(
CSetBasic *symbols,
701 size_t basic_hash(
const basic
self);
704 CWRAPPER_OUTPUT_TYPE basic_subs(basic s,
const basic e,
708 CWRAPPER_OUTPUT_TYPE basic_subs2(basic s,
const basic e,
const basic a,
713 CWRAPPER_OUTPUT_TYPE function_symbol_set(basic s,
const char *c,
717 char *function_symbol_get_name(
const basic b);
719 CWRAPPER_OUTPUT_TYPE basic_coeff(basic c,
const basic b,
const basic x,
728 CWRAPPER_OUTPUT_TYPE basic_solve_poly(
CSetBasic *r,
const basic f,
735 char *ascii_art_str(
void);
739 CWRAPPER_OUTPUT_TYPE ntheory_gcd(basic s,
const basic a,
const basic b);
741 CWRAPPER_OUTPUT_TYPE ntheory_lcm(basic s,
const basic a,
const basic b);
743 CWRAPPER_OUTPUT_TYPE ntheory_gcd_ext(basic g, basic s, basic t,
const basic a,
746 CWRAPPER_OUTPUT_TYPE ntheory_nextprime(basic s,
const basic a);
748 CWRAPPER_OUTPUT_TYPE ntheory_mod(basic s,
const basic n,
const basic d);
750 CWRAPPER_OUTPUT_TYPE ntheory_quotient(basic s,
const basic n,
const basic d);
752 CWRAPPER_OUTPUT_TYPE ntheory_quotient_mod(basic q, basic r,
const basic n,
755 CWRAPPER_OUTPUT_TYPE ntheory_mod_f(basic s,
const basic n,
const basic d);
757 CWRAPPER_OUTPUT_TYPE ntheory_quotient_f(basic s,
const basic n,
const basic d);
759 CWRAPPER_OUTPUT_TYPE ntheory_quotient_mod_f(basic q, basic r,
const basic n,
762 int ntheory_mod_inverse(basic b,
const basic a,
const basic m);
764 CWRAPPER_OUTPUT_TYPE ntheory_fibonacci(basic s,
unsigned long a);
766 CWRAPPER_OUTPUT_TYPE ntheory_fibonacci2(basic g, basic s,
unsigned long a);
768 CWRAPPER_OUTPUT_TYPE ntheory_lucas(basic s,
unsigned long a);
770 CWRAPPER_OUTPUT_TYPE ntheory_lucas2(basic g, basic s,
unsigned long a);
772 CWRAPPER_OUTPUT_TYPE ntheory_binomial(basic s,
const basic a,
unsigned long b);
774 CWRAPPER_OUTPUT_TYPE ntheory_factorial(basic s,
unsigned long n);
776 CWRAPPER_OUTPUT_TYPE basic_evalf(basic s,
const basic b,
unsigned long bits,
780 CWRAPPER_OUTPUT_TYPE basic_as_numer_denom(basic numer, basic denom,
783 CWRAPPER_OUTPUT_TYPE basic_add_as_two_terms(basic term1, basic term2,
786 CWRAPPER_OUTPUT_TYPE basic_mul_as_two_terms(basic term1, basic term2,
794 const CVecBasic *exprs,
int perform_cse);
797 const double *
const inps);
801 #ifdef HAVE_SYMENGINE_LLVM
803 typedef struct CLLVMDoubleVisitor CLLVMDoubleVisitor;
804 CLLVMDoubleVisitor *llvm_double_visitor_new(
void);
805 void llvm_double_visitor_init(CLLVMDoubleVisitor *
self,
const CVecBasic *args,
808 void llvm_double_visitor_call(CLLVMDoubleVisitor *
self,
double *
const outs,
809 const double *
const inps);
810 void llvm_double_visitor_free(CLLVMDoubleVisitor *
self);
812 typedef struct CLLVMFloatVisitor CLLVMFloatVisitor;
813 CLLVMFloatVisitor *llvm_float_visitor_new(
void);
814 void llvm_float_visitor_init(CLLVMFloatVisitor *
self,
const CVecBasic *args,
817 void llvm_float_visitor_call(CLLVMFloatVisitor *
self,
float *
const outs,
818 const float *
const inps);
819 void llvm_float_visitor_free(CLLVMFloatVisitor *
self);
821 #ifdef SYMENGINE_HAVE_LLVM_LONG_DOUBLE
823 typedef struct CLLVMLongDoubleVisitor CLLVMLongDoubleVisitor;
824 CLLVMLongDoubleVisitor *llvm_long_double_visitor_new(
void);
825 void llvm_long_double_visitor_init(CLLVMLongDoubleVisitor *
self,
829 void llvm_long_double_visitor_call(CLLVMLongDoubleVisitor *
self,
830 long double *
const outs,
831 const long double *
const inps);
832 void llvm_long_double_visitor_free(CLLVMLongDoubleVisitor *
self);
836 CWRAPPER_OUTPUT_TYPE basic_cse(
CVecBasic *replacement_syms,
842 void symengine_print_stack_on_segfault(
void);
bool is_a_Number(const Basic &b)
bool is_a_Complex(const Basic &b)