cwrapper.h
1 #ifndef CWRAPPER_H
2 #define CWRAPPER_H
3 
4 #include <stdint.h>
5 #include <stdio.h>
6 #include <stdlib.h>
7 #include "symengine/symengine_config.h"
8 
9 #ifdef HAVE_SYMENGINE_GMP
10 #include <gmp.h>
11 #endif
12 
13 #ifdef HAVE_SYMENGINE_MPFR
14 #include <mpfr.h>
15 #endif // HAVE_SYMENGINE_MPFR
16 
17 #include "symengine/symengine_exception.h"
18 
19 #ifdef __cplusplus
20 extern "C" {
21 #endif
22 
23 // Use SYMENGINE_C_ASSERT in C tests
24 #define SYMENGINE_C_ASSERT(cond) \
25  { \
26  if (0 == (cond)) { \
27  printf("SYMENGINE_C_ASSERT failed: %s \nfunction %s (), line " \
28  "number %d at\n%s\n", \
29  __FILE__, __func__, __LINE__, #cond); \
30  abort(); \
31  } \
32  }
33 
34 typedef symengine_exceptions_t CWRAPPER_OUTPUT_TYPE;
35 
37 typedef enum {
38  SYMENGINE_DOUBLE = 0,
39  SYMENGINE_FLOAT = 1,
40  SYMENGINE_HALF = 2,
41 } BasicCodePrinterPrecision;
44 
45 typedef enum {
46 #define SYMENGINE_INCLUDE_ALL
47 #define SYMENGINE_ENUM(type, Class) type,
48 #include "symengine/type_codes.inc"
49 #undef SYMENGINE_ENUM
50 #undef SYMENGINE_INCLUDE_ALL
51  SYMENGINE_TypeID_Count
52 } TypeID;
53 
56 typedef struct dcomplex {
57  double real;
58  double imag;
59 } dcomplex;
60 
61 // The size of 'CRCPBasic_C' must be the same as CRCPBasic (which contains a
62 // single RCP<const Basic> member) *and* they must have the same alignment
63 // (because we allocate CRCPBasic into the memory occupied by this struct in
64 // cwrapper.cpp). We cannot use C++ in this file, so we need to use C tools to
65 // arrive at the correct size and alignment. The size of the RCP object on
66 // most platforms (with WITH_SYMENGINE_RCP on) should be just the size of the
67 // 'T *ptr_' pointer that it contains (as there is no virtual function table)
68 // and the alignment should also be of a pointer. So we just put 'void *data'
69 // as the only member of the struct, that should have the correct size and
70 // alignment. With WITH_SYMENGINE_RCP off (i.e. using Teuchos::RCP), we have to
71 // add additional members into the structure.
72 //
73 // However, this is checked at compile time in cwrapper.cpp, so if the size or
74 // alignment is different on some platform, the compilation will fail --- in
75 // that case one needs to modify the contents of this struct to adjust its size
76 // and/or alignment.
77 struct CRCPBasic_C {
78  void *data;
79 #if !defined(WITH_SYMENGINE_RCP)
80  void *teuchos_handle;
81  int teuchos_strength;
82 #endif
83 };
84 
86 // CRCPBasic, which has the same size and alignment as RCP<const Basic> (see
87 // the above comment for details). That is then used by the user to allocate
88 // the memory needed for RCP<const Basic> on the stack. A 'basic' type should
89 // be initialized using basic_new_stack(), before any function is called.
90 // Assignment should be done only by using basic_assign(). Before the variable
91 // goes out of scope, basic_free_stack() must be called.
92 //
93 // For downstream projects, define a dummy struct with the right size, so
94 // that it can be allocated on the stack.
95 typedef struct CRCPBasic_C basic_struct;
96 
97 typedef struct CSetBasic CSetBasic;
98 
101 typedef basic_struct basic[1];
102 
104 // 'basic' type, this function initializes an RCP<const Basic> on the stack
105 // allocated variable. The 's' variable must be freed using basic_free_stack()
106 SYMENGINE_EXPORT void basic_new_stack(basic s);
108 SYMENGINE_EXPORT void basic_free_stack(basic s);
109 
110 // Use these two functions to allocate and free 'basic' on a heap. The pointer
111 // can then be used in all the other methods below (i.e. the methods that
112 // accept 'basic s' work no matter if 's' is stack or heap allocated).
113 SYMENGINE_EXPORT basic_struct *basic_new_heap(void);
114 SYMENGINE_EXPORT void basic_free_heap(basic_struct *s);
115 
116 SYMENGINE_EXPORT const char *symengine_version(void);
117 
119 
124 SYMENGINE_EXPORT void basic_const_set(basic s, const char *c);
125 
126 SYMENGINE_EXPORT void basic_const_zero(basic s);
127 SYMENGINE_EXPORT void basic_const_one(basic s);
128 SYMENGINE_EXPORT void basic_const_minus_one(basic s);
129 SYMENGINE_EXPORT void basic_const_I(basic s);
130 
131 SYMENGINE_EXPORT void basic_const_pi(basic s);
132 SYMENGINE_EXPORT void basic_const_E(basic s);
133 SYMENGINE_EXPORT void basic_const_EulerGamma(basic s);
134 SYMENGINE_EXPORT void basic_const_Catalan(basic s);
135 SYMENGINE_EXPORT void basic_const_GoldenRatio(basic s);
136 
139 SYMENGINE_EXPORT void basic_const_infinity(basic s);
140 SYMENGINE_EXPORT void basic_const_neginfinity(basic s);
141 SYMENGINE_EXPORT void basic_const_complex_infinity(basic s);
142 
144 SYMENGINE_EXPORT void basic_const_nan(basic s);
145 
147 SYMENGINE_EXPORT CWRAPPER_OUTPUT_TYPE basic_assign(basic a, const basic b);
148 
150 SYMENGINE_EXPORT CWRAPPER_OUTPUT_TYPE basic_parse(basic b, const char *str);
153 SYMENGINE_EXPORT CWRAPPER_OUTPUT_TYPE basic_parse2(basic b, const char *str,
154  int convert_xor);
155 
157 SYMENGINE_EXPORT TypeID basic_get_type(const basic s);
159 SYMENGINE_EXPORT TypeID basic_get_class_id(const char *c);
162 SYMENGINE_EXPORT char *basic_get_class_from_id(TypeID id);
163 
167 SYMENGINE_EXPORT CWRAPPER_OUTPUT_TYPE symbol_set(basic s, const char *c);
168 
170 SYMENGINE_EXPORT int number_is_zero(const basic s);
172 SYMENGINE_EXPORT int number_is_negative(const basic s);
174 SYMENGINE_EXPORT int number_is_positive(const basic s);
176 SYMENGINE_EXPORT int number_is_complex(const basic s);
177 
179 SYMENGINE_EXPORT int basic_has_symbol(const basic e, const basic s);
180 
182 SYMENGINE_EXPORT CWRAPPER_OUTPUT_TYPE integer_set_si(basic s, long i);
184 SYMENGINE_EXPORT CWRAPPER_OUTPUT_TYPE integer_set_ui(basic s, unsigned long i);
186 #ifdef HAVE_SYMENGINE_GMP
187 SYMENGINE_EXPORT CWRAPPER_OUTPUT_TYPE integer_set_mpz(basic s, const mpz_t i);
188 #endif
190 SYMENGINE_EXPORT CWRAPPER_OUTPUT_TYPE integer_set_str(basic s, const char *c);
192 SYMENGINE_EXPORT CWRAPPER_OUTPUT_TYPE real_double_set_d(basic s, double d);
194 SYMENGINE_EXPORT double real_double_get_d(const basic s);
195 
196 #ifdef HAVE_SYMENGINE_MPFR
198 SYMENGINE_EXPORT CWRAPPER_OUTPUT_TYPE real_mpfr_set_d(basic s, double d,
199  int prec);
202 SYMENGINE_EXPORT CWRAPPER_OUTPUT_TYPE real_mpfr_set_str(basic s, const char *c,
203  int prec);
205 SYMENGINE_EXPORT double real_mpfr_get_d(const basic s);
207 SYMENGINE_EXPORT CWRAPPER_OUTPUT_TYPE real_mpfr_set(basic s, mpfr_srcptr m);
209 SYMENGINE_EXPORT CWRAPPER_OUTPUT_TYPE real_mpfr_get(mpfr_ptr m, const basic s);
211 SYMENGINE_EXPORT mpfr_prec_t real_mpfr_get_prec(const basic s);
212 #endif // HAVE_SYMENGINE_MPFR
213 
215 SYMENGINE_EXPORT CWRAPPER_OUTPUT_TYPE complex_base_real_part(basic s,
216  const basic com);
218 SYMENGINE_EXPORT CWRAPPER_OUTPUT_TYPE
219 complex_base_imaginary_part(basic s, const basic com);
220 
222 SYMENGINE_EXPORT signed long integer_get_si(const basic s);
224 SYMENGINE_EXPORT unsigned long integer_get_ui(const basic s);
226 #ifdef HAVE_SYMENGINE_GMP
227 SYMENGINE_EXPORT CWRAPPER_OUTPUT_TYPE integer_get_mpz(mpz_t a, const basic s);
228 #endif
229 
232 SYMENGINE_EXPORT CWRAPPER_OUTPUT_TYPE rational_set(basic s, const basic i,
233  const basic j);
235 SYMENGINE_EXPORT CWRAPPER_OUTPUT_TYPE rational_set_si(basic s, long i, long j);
237 SYMENGINE_EXPORT CWRAPPER_OUTPUT_TYPE rational_set_ui(basic s, unsigned long i,
238  unsigned long j);
239 #ifdef HAVE_SYMENGINE_GMP
241 SYMENGINE_EXPORT CWRAPPER_OUTPUT_TYPE rational_get_mpq(mpq_t a, const basic s);
243 SYMENGINE_EXPORT CWRAPPER_OUTPUT_TYPE rational_set_mpq(basic s, const mpq_t i);
244 #endif
245 
247 SYMENGINE_EXPORT CWRAPPER_OUTPUT_TYPE complex_set(basic s, const basic re,
248  const basic im);
250 SYMENGINE_EXPORT CWRAPPER_OUTPUT_TYPE complex_set_rat(basic s, const basic re,
251  const basic im);
252 #ifdef HAVE_SYMENGINE_GMP
254 SYMENGINE_EXPORT CWRAPPER_OUTPUT_TYPE complex_set_mpq(basic s, const mpq_t re,
255  const mpq_t im);
256 #endif
257 
260 SYMENGINE_EXPORT dcomplex complex_double_get(const basic s);
261 
263 SYMENGINE_EXPORT CWRAPPER_OUTPUT_TYPE basic_add(basic s, const basic a,
264  const basic b);
266 SYMENGINE_EXPORT CWRAPPER_OUTPUT_TYPE basic_sub(basic s, const basic a,
267  const basic b);
269 SYMENGINE_EXPORT CWRAPPER_OUTPUT_TYPE basic_mul(basic s, const basic a,
270  const basic b);
272 SYMENGINE_EXPORT CWRAPPER_OUTPUT_TYPE basic_div(basic s, const basic a,
273  const basic b);
275 SYMENGINE_EXPORT CWRAPPER_OUTPUT_TYPE basic_pow(basic s, const basic a,
276  const basic b);
279 SYMENGINE_EXPORT CWRAPPER_OUTPUT_TYPE basic_diff(basic s, const basic expr,
280  const basic sym);
282 SYMENGINE_EXPORT int basic_eq(const basic a, const basic b);
284 SYMENGINE_EXPORT int basic_neq(const basic a, const basic b);
285 
287 SYMENGINE_EXPORT CWRAPPER_OUTPUT_TYPE basic_expand(basic s, const basic a);
289 SYMENGINE_EXPORT CWRAPPER_OUTPUT_TYPE basic_neg(basic s, const basic a);
290 
292 SYMENGINE_EXPORT CWRAPPER_OUTPUT_TYPE basic_abs(basic s, const basic a);
293 
295 SYMENGINE_EXPORT CWRAPPER_OUTPUT_TYPE basic_erf(basic s, const basic a);
297 SYMENGINE_EXPORT CWRAPPER_OUTPUT_TYPE basic_erfc(basic s, const basic a);
298 
300 SYMENGINE_EXPORT CWRAPPER_OUTPUT_TYPE basic_sin(basic s, const basic a);
302 SYMENGINE_EXPORT CWRAPPER_OUTPUT_TYPE basic_cos(basic s, const basic a);
304 SYMENGINE_EXPORT CWRAPPER_OUTPUT_TYPE basic_tan(basic s, const basic a);
305 
307 SYMENGINE_EXPORT CWRAPPER_OUTPUT_TYPE basic_asin(basic s, const basic a);
309 SYMENGINE_EXPORT CWRAPPER_OUTPUT_TYPE basic_acos(basic s, const basic a);
311 SYMENGINE_EXPORT CWRAPPER_OUTPUT_TYPE basic_atan(basic s, const basic a);
312 
314 SYMENGINE_EXPORT CWRAPPER_OUTPUT_TYPE basic_csc(basic s, const basic a);
316 SYMENGINE_EXPORT CWRAPPER_OUTPUT_TYPE basic_sec(basic s, const basic a);
318 SYMENGINE_EXPORT CWRAPPER_OUTPUT_TYPE basic_cot(basic s, const basic a);
319 
321 SYMENGINE_EXPORT CWRAPPER_OUTPUT_TYPE basic_acsc(basic s, const basic a);
323 SYMENGINE_EXPORT CWRAPPER_OUTPUT_TYPE basic_asec(basic s, const basic a);
325 SYMENGINE_EXPORT CWRAPPER_OUTPUT_TYPE basic_acot(basic s, const basic a);
326 
328 SYMENGINE_EXPORT CWRAPPER_OUTPUT_TYPE basic_sinh(basic s, const basic a);
330 SYMENGINE_EXPORT CWRAPPER_OUTPUT_TYPE basic_cosh(basic s, const basic a);
332 SYMENGINE_EXPORT CWRAPPER_OUTPUT_TYPE basic_tanh(basic s, const basic a);
333 
335 SYMENGINE_EXPORT CWRAPPER_OUTPUT_TYPE basic_asinh(basic s, const basic a);
337 SYMENGINE_EXPORT CWRAPPER_OUTPUT_TYPE basic_acosh(basic s, const basic a);
339 SYMENGINE_EXPORT CWRAPPER_OUTPUT_TYPE basic_atanh(basic s, const basic a);
340 
342 SYMENGINE_EXPORT CWRAPPER_OUTPUT_TYPE basic_csch(basic s, const basic a);
344 SYMENGINE_EXPORT CWRAPPER_OUTPUT_TYPE basic_sech(basic s, const basic a);
346 SYMENGINE_EXPORT CWRAPPER_OUTPUT_TYPE basic_coth(basic s, const basic a);
347 
349 SYMENGINE_EXPORT CWRAPPER_OUTPUT_TYPE basic_acsch(basic s, const basic a);
351 SYMENGINE_EXPORT CWRAPPER_OUTPUT_TYPE basic_asech(basic s, const basic a);
353 SYMENGINE_EXPORT CWRAPPER_OUTPUT_TYPE basic_acoth(basic s, const basic a);
354 
356 SYMENGINE_EXPORT CWRAPPER_OUTPUT_TYPE basic_lambertw(basic s, const basic a);
358 SYMENGINE_EXPORT CWRAPPER_OUTPUT_TYPE basic_zeta(basic s, const basic a);
360 SYMENGINE_EXPORT CWRAPPER_OUTPUT_TYPE basic_dirichlet_eta(basic s,
361  const basic a);
363 SYMENGINE_EXPORT CWRAPPER_OUTPUT_TYPE basic_gamma(basic s, const basic a);
365 SYMENGINE_EXPORT CWRAPPER_OUTPUT_TYPE basic_loggamma(basic s, const basic a);
367 SYMENGINE_EXPORT CWRAPPER_OUTPUT_TYPE basic_sqrt(basic s, const basic a);
369 SYMENGINE_EXPORT CWRAPPER_OUTPUT_TYPE basic_cbrt(basic s, const basic a);
371 SYMENGINE_EXPORT CWRAPPER_OUTPUT_TYPE basic_exp(basic s, const basic a);
373 SYMENGINE_EXPORT CWRAPPER_OUTPUT_TYPE basic_log(basic s, const basic a);
375 SYMENGINE_EXPORT CWRAPPER_OUTPUT_TYPE basic_floor(basic s, const basic a);
377 SYMENGINE_EXPORT CWRAPPER_OUTPUT_TYPE basic_ceiling(basic s, const basic a);
379 SYMENGINE_EXPORT CWRAPPER_OUTPUT_TYPE basic_sign(basic s, const basic a);
380 
382 SYMENGINE_EXPORT CWRAPPER_OUTPUT_TYPE basic_atan2(basic s, const basic a,
383  const basic b);
385 SYMENGINE_EXPORT CWRAPPER_OUTPUT_TYPE basic_kronecker_delta(basic s,
386  const basic a,
387  const basic b);
389 SYMENGINE_EXPORT CWRAPPER_OUTPUT_TYPE basic_lowergamma(basic s, const basic a,
390  const basic b);
392 SYMENGINE_EXPORT CWRAPPER_OUTPUT_TYPE basic_uppergamma(basic s, const basic a,
393  const basic b);
395 SYMENGINE_EXPORT CWRAPPER_OUTPUT_TYPE basic_beta(basic s, const basic a,
396  const basic b);
398 SYMENGINE_EXPORT CWRAPPER_OUTPUT_TYPE basic_polygamma(basic s, const basic a,
399  const basic b);
400 
402 SYMENGINE_EXPORT char *basic_dumps(const basic s, unsigned long *size);
404 SYMENGINE_EXPORT CWRAPPER_OUTPUT_TYPE basic_loads(basic s, const char *c,
405  unsigned long size);
406 
408 SYMENGINE_EXPORT BasicCodePrinterSettings *basic_code_printer_settings_new();
410 SYMENGINE_EXPORT void
411 basic_code_printer_settings_free(BasicCodePrinterSettings *self);
413 SYMENGINE_EXPORT void
414 basic_code_printer_settings_set_precision(BasicCodePrinterSettings *self,
415  BasicCodePrinterPrecision prec);
416 
418 SYMENGINE_EXPORT char *basic_str(const basic s);
421 SYMENGINE_EXPORT char *basic_str_julia(const basic s);
423 SYMENGINE_EXPORT char *basic_str_mathml(const basic s);
425 SYMENGINE_EXPORT char *basic_str_latex(const basic s);
427 SYMENGINE_EXPORT char *basic_str_ccode(const basic s);
429 SYMENGINE_EXPORT
430 char *basic_str_ccode_settings(const basic s,
431  const BasicCodePrinterSettings *settings);
433 SYMENGINE_EXPORT char *basic_str_cudacode(const basic s);
435 SYMENGINE_EXPORT
436 char *basic_str_cudacode_settings(const basic s,
437  const BasicCodePrinterSettings *settings);
439 SYMENGINE_EXPORT char *basic_str_metalcode(const basic s);
441 SYMENGINE_EXPORT char *
442 basic_str_metalcode_settings(const basic s,
443  const BasicCodePrinterSettings *settings);
445 SYMENGINE_EXPORT char *basic_str_jscode(const basic s);
447 SYMENGINE_EXPORT void basic_str_free(char *s);
448 
450 SYMENGINE_EXPORT void bool_set_true(basic s);
452 SYMENGINE_EXPORT void bool_set_false(basic s);
453 
455 SYMENGINE_EXPORT void basic_set_emptyset(basic s);
457 SYMENGINE_EXPORT void basic_set_universalset(basic s);
459 SYMENGINE_EXPORT void basic_set_complexes(basic s);
461 SYMENGINE_EXPORT void basic_set_reals(basic s);
463 SYMENGINE_EXPORT void basic_set_rationals(basic s);
465 SYMENGINE_EXPORT void basic_set_integers(basic s);
467 SYMENGINE_EXPORT CWRAPPER_OUTPUT_TYPE basic_set_interval(
468  basic s, const basic start, const basic end, int left_open, int right_open);
470 SYMENGINE_EXPORT CWRAPPER_OUTPUT_TYPE
471 basic_set_finiteset(basic s, const CSetBasic *container);
473 SYMENGINE_EXPORT CWRAPPER_OUTPUT_TYPE basic_set_union(basic s, const basic a,
474  const basic b);
476 SYMENGINE_EXPORT CWRAPPER_OUTPUT_TYPE basic_set_intersection(basic s,
477  const basic a,
478  const basic b);
480 SYMENGINE_EXPORT CWRAPPER_OUTPUT_TYPE basic_set_complement(basic s,
481  const basic a,
482  const basic b);
484 SYMENGINE_EXPORT CWRAPPER_OUTPUT_TYPE basic_set_contains(basic s, const basic a,
485  const basic b);
487 SYMENGINE_EXPORT int basic_set_is_subset(const basic a, const basic b);
489 SYMENGINE_EXPORT int basic_set_is_proper_subset(const basic a, const basic b);
491 SYMENGINE_EXPORT int basic_set_is_superset(const basic a, const basic b);
493 SYMENGINE_EXPORT int basic_set_is_proper_superset(const basic a, const basic b);
495 SYMENGINE_EXPORT CWRAPPER_OUTPUT_TYPE basic_set_inf(basic s, const basic a);
497 SYMENGINE_EXPORT CWRAPPER_OUTPUT_TYPE basic_set_sup(basic s, const basic a);
499 SYMENGINE_EXPORT CWRAPPER_OUTPUT_TYPE basic_set_boundary(basic s,
500  const basic a);
502 SYMENGINE_EXPORT CWRAPPER_OUTPUT_TYPE basic_set_interior(basic s,
503  const basic a);
505 SYMENGINE_EXPORT CWRAPPER_OUTPUT_TYPE basic_set_closure(basic s, const basic a);
506 
516 SYMENGINE_EXPORT int symengine_have_component(const char *c);
517 
519 SYMENGINE_EXPORT int is_a_Number(const basic s);
521 SYMENGINE_EXPORT int is_a_Integer(const basic s);
523 SYMENGINE_EXPORT int is_a_Rational(const basic s);
525 SYMENGINE_EXPORT int is_a_Symbol(const basic s);
527 SYMENGINE_EXPORT int is_a_Complex(const basic s);
529 SYMENGINE_EXPORT int is_a_RealDouble(const basic c);
531 SYMENGINE_EXPORT int is_a_ComplexDouble(const basic c);
533 SYMENGINE_EXPORT int is_a_RealMPFR(const basic c);
535 SYMENGINE_EXPORT int is_a_ComplexMPC(const basic c);
537 SYMENGINE_EXPORT int is_a_Set(const basic c);
538 
540 
541 typedef struct CVectorInt CVectorInt;
542 
543 SYMENGINE_EXPORT CVectorInt *vectorint_new(void);
544 
545 // 'data' must point to allocated memory of size 'size'. The function returns 0
546 // if std::vector<int> can be initialized using placement new into 'data',
547 // otherwise 1 if 'size' is too small or 2 if 'data' is not properly aligned.
548 // No memory is leaked either way. Use vectorint_placement_new_check() to check
549 // that the 'data' and 'size' is properly allocated and aligned. Use
550 // vectorint_placement_new() to do the actual allocation.
551 SYMENGINE_EXPORT int vectorint_placement_new_check(void *data, size_t size);
552 SYMENGINE_EXPORT CVectorInt *vectorint_placement_new(void *data);
553 
554 SYMENGINE_EXPORT void vectorint_placement_free(CVectorInt *self);
555 
556 SYMENGINE_EXPORT void vectorint_free(CVectorInt *self);
557 SYMENGINE_EXPORT void vectorint_push_back(CVectorInt *self, int value);
558 SYMENGINE_EXPORT int vectorint_get(CVectorInt *self, int n);
559 
561 
562 typedef struct CVecBasic CVecBasic;
563 
564 SYMENGINE_EXPORT CVecBasic *vecbasic_new(void);
565 SYMENGINE_EXPORT void vecbasic_free(CVecBasic *self);
566 SYMENGINE_EXPORT CWRAPPER_OUTPUT_TYPE vecbasic_push_back(CVecBasic *self,
567  const basic value);
568 SYMENGINE_EXPORT CWRAPPER_OUTPUT_TYPE vecbasic_get(CVecBasic *self, size_t n,
569  basic result);
570 SYMENGINE_EXPORT CWRAPPER_OUTPUT_TYPE vecbasic_set(CVecBasic *self, size_t n,
571  const basic s);
572 SYMENGINE_EXPORT CWRAPPER_OUTPUT_TYPE vecbasic_erase(CVecBasic *self, size_t n);
573 SYMENGINE_EXPORT size_t vecbasic_size(CVecBasic *self);
574 
576 SYMENGINE_EXPORT CWRAPPER_OUTPUT_TYPE basic_max(basic s, const CVecBasic *d);
578 SYMENGINE_EXPORT CWRAPPER_OUTPUT_TYPE basic_min(basic s, const CVecBasic *d);
580 SYMENGINE_EXPORT CWRAPPER_OUTPUT_TYPE basic_add_vec(basic s,
581  const CVecBasic *d);
582 
584 SYMENGINE_EXPORT CWRAPPER_OUTPUT_TYPE basic_mul_vec(basic s,
585  const CVecBasic *d);
586 
588 
589 typedef struct CDenseMatrix CDenseMatrix;
590 typedef struct CSparseMatrix CSparseMatrix;
591 
592 SYMENGINE_EXPORT CDenseMatrix *dense_matrix_new(void);
593 SYMENGINE_EXPORT CSparseMatrix *sparse_matrix_new(void);
594 
595 SYMENGINE_EXPORT void dense_matrix_free(CDenseMatrix *self);
597 SYMENGINE_EXPORT CDenseMatrix *
598 dense_matrix_new_vec(unsigned rows, unsigned cols, CVecBasic *l);
600 SYMENGINE_EXPORT CDenseMatrix *dense_matrix_new_rows_cols(unsigned r,
601  unsigned c);
602 
603 SYMENGINE_EXPORT void sparse_matrix_free(CSparseMatrix *self);
604 
606 SYMENGINE_EXPORT CWRAPPER_OUTPUT_TYPE dense_matrix_set(CDenseMatrix *s,
607  const CDenseMatrix *d);
608 
611 SYMENGINE_EXPORT char *dense_matrix_str(const CDenseMatrix *s);
613 SYMENGINE_EXPORT CWRAPPER_OUTPUT_TYPE dense_matrix_rows_cols(CDenseMatrix *mat,
614  unsigned r,
615  unsigned c);
617 SYMENGINE_EXPORT CWRAPPER_OUTPUT_TYPE dense_matrix_get_basic(
618  basic s, const CDenseMatrix *mat, unsigned long int r, unsigned long int c);
620 SYMENGINE_EXPORT CWRAPPER_OUTPUT_TYPE dense_matrix_set_basic(
621  CDenseMatrix *mat, unsigned long int r, unsigned long int c, basic s);
623 SYMENGINE_EXPORT CWRAPPER_OUTPUT_TYPE
624 sparse_matrix_get_basic(basic s, const CSparseMatrix *mat, unsigned long int r,
625  unsigned long int c);
627 SYMENGINE_EXPORT CWRAPPER_OUTPUT_TYPE sparse_matrix_set_basic(
628  CSparseMatrix *mat, unsigned long int r, unsigned long int c, basic s);
630 SYMENGINE_EXPORT CWRAPPER_OUTPUT_TYPE dense_matrix_det(basic s,
631  const CDenseMatrix *mat);
633 SYMENGINE_EXPORT CWRAPPER_OUTPUT_TYPE dense_matrix_inv(CDenseMatrix *s,
634  const CDenseMatrix *mat);
636 SYMENGINE_EXPORT CWRAPPER_OUTPUT_TYPE
637 dense_matrix_transpose(CDenseMatrix *s, const CDenseMatrix *mat);
640 SYMENGINE_EXPORT CWRAPPER_OUTPUT_TYPE dense_matrix_submatrix(
641  CDenseMatrix *s, const CDenseMatrix *mat, unsigned long int r1,
642  unsigned long int c1, unsigned long int r2, unsigned long int c2,
643  unsigned long int r, unsigned long int c);
645 SYMENGINE_EXPORT CWRAPPER_OUTPUT_TYPE
646 dense_matrix_row_join(CDenseMatrix *A, const CDenseMatrix *B);
648 SYMENGINE_EXPORT CWRAPPER_OUTPUT_TYPE
649 dense_matrix_col_join(CDenseMatrix *A, const CDenseMatrix *B);
651 SYMENGINE_EXPORT CWRAPPER_OUTPUT_TYPE dense_matrix_row_del(CDenseMatrix *C,
652  unsigned k);
654 SYMENGINE_EXPORT CWRAPPER_OUTPUT_TYPE dense_matrix_col_del(CDenseMatrix *C,
655  unsigned k);
656 
658 SYMENGINE_EXPORT unsigned long int dense_matrix_cols(const CDenseMatrix *s);
660 SYMENGINE_EXPORT unsigned long int dense_matrix_rows(const CDenseMatrix *s);
662 SYMENGINE_EXPORT CWRAPPER_OUTPUT_TYPE dense_matrix_add_matrix(
663  CDenseMatrix *s, const CDenseMatrix *matA, const CDenseMatrix *matB);
665 SYMENGINE_EXPORT CWRAPPER_OUTPUT_TYPE dense_matrix_mul_matrix(
666  CDenseMatrix *s, const CDenseMatrix *matA, const CDenseMatrix *matB);
668 SYMENGINE_EXPORT CWRAPPER_OUTPUT_TYPE dense_matrix_add_scalar(
669  CDenseMatrix *s, const CDenseMatrix *matA, const basic b);
671 SYMENGINE_EXPORT CWRAPPER_OUTPUT_TYPE dense_matrix_mul_scalar(
672  CDenseMatrix *s, const CDenseMatrix *matA, const basic b);
674 SYMENGINE_EXPORT CWRAPPER_OUTPUT_TYPE dense_matrix_LU(CDenseMatrix *l,
675  CDenseMatrix *u,
676  const CDenseMatrix *mat);
678 SYMENGINE_EXPORT CWRAPPER_OUTPUT_TYPE dense_matrix_LDL(CDenseMatrix *l,
679  CDenseMatrix *d,
680  const CDenseMatrix *mat);
682 SYMENGINE_EXPORT CWRAPPER_OUTPUT_TYPE
683 dense_matrix_FFLU(CDenseMatrix *lu, const CDenseMatrix *mat);
685 SYMENGINE_EXPORT CWRAPPER_OUTPUT_TYPE dense_matrix_FFLDU(
686  CDenseMatrix *l, CDenseMatrix *d, CDenseMatrix *u, const CDenseMatrix *mat);
688 SYMENGINE_EXPORT CWRAPPER_OUTPUT_TYPE dense_matrix_LU_solve(
689  CDenseMatrix *x, const CDenseMatrix *A, const CDenseMatrix *b);
691 SYMENGINE_EXPORT CWRAPPER_OUTPUT_TYPE dense_matrix_ones(CDenseMatrix *s,
692  unsigned long int r,
693  unsigned long int c);
695 SYMENGINE_EXPORT CWRAPPER_OUTPUT_TYPE dense_matrix_zeros(CDenseMatrix *s,
696  unsigned long int r,
697  unsigned long int c);
700 SYMENGINE_EXPORT CWRAPPER_OUTPUT_TYPE dense_matrix_diag(CDenseMatrix *s,
701  CVecBasic *d,
702  long int k);
704 SYMENGINE_EXPORT CWRAPPER_OUTPUT_TYPE dense_matrix_eye(CDenseMatrix *s,
705  unsigned long int N,
706  unsigned long int M,
707  int k);
710 SYMENGINE_EXPORT CWRAPPER_OUTPUT_TYPE dense_matrix_diff(CDenseMatrix *result,
711  const CDenseMatrix *A,
712  basic const x);
714 SYMENGINE_EXPORT CWRAPPER_OUTPUT_TYPE dense_matrix_jacobian(
715  CDenseMatrix *result, const CDenseMatrix *A, const CDenseMatrix *x);
716 
718 SYMENGINE_EXPORT void sparse_matrix_init(CSparseMatrix *s);
720 SYMENGINE_EXPORT void sparse_matrix_rows_cols(CSparseMatrix *s,
721  unsigned long int r,
722  unsigned long int c);
724 SYMENGINE_EXPORT char *sparse_matrix_str(const CSparseMatrix *s);
725 
727 SYMENGINE_EXPORT int is_a_DenseMatrix(const CDenseMatrix *c);
729 SYMENGINE_EXPORT int is_a_SparseMatrix(const CSparseMatrix *c);
730 
732 SYMENGINE_EXPORT int dense_matrix_eq(CDenseMatrix *lhs, CDenseMatrix *rhs);
734 SYMENGINE_EXPORT int sparse_matrix_eq(CSparseMatrix *lhs, CSparseMatrix *rhs);
735 
737 
738 SYMENGINE_EXPORT CSetBasic *setbasic_new(void);
739 SYMENGINE_EXPORT void setbasic_free(CSetBasic *self);
742 SYMENGINE_EXPORT int setbasic_insert(CSetBasic *self, const basic value);
743 SYMENGINE_EXPORT void setbasic_get(CSetBasic *self, int n, basic result);
745 SYMENGINE_EXPORT int setbasic_find(CSetBasic *self, basic value);
747 SYMENGINE_EXPORT int setbasic_erase(CSetBasic *self, const basic value);
748 SYMENGINE_EXPORT size_t setbasic_size(CSetBasic *self);
749 
751 
752 typedef struct CMapBasicBasic CMapBasicBasic;
753 
754 SYMENGINE_EXPORT CMapBasicBasic *mapbasicbasic_new(void);
755 SYMENGINE_EXPORT void mapbasicbasic_free(CMapBasicBasic *self);
756 SYMENGINE_EXPORT void mapbasicbasic_insert(CMapBasicBasic *self,
757  const basic key, const basic mapped);
759 SYMENGINE_EXPORT int mapbasicbasic_get(CMapBasicBasic *self, const basic key,
760  basic mapped);
761 SYMENGINE_EXPORT size_t mapbasicbasic_size(CMapBasicBasic *self);
762 
763 // -------------------------------------
764 
766 SYMENGINE_EXPORT CWRAPPER_OUTPUT_TYPE basic_get_args(const basic self,
767  CVecBasic *args);
769 SYMENGINE_EXPORT CWRAPPER_OUTPUT_TYPE basic_free_symbols(const basic self,
770  CSetBasic *symbols);
772 SYMENGINE_EXPORT CWRAPPER_OUTPUT_TYPE basic_function_symbols(CSetBasic *symbols,
773  const basic self);
775 SYMENGINE_EXPORT size_t basic_hash(const basic self);
778 SYMENGINE_EXPORT CWRAPPER_OUTPUT_TYPE basic_subs(basic s, const basic e,
779  const CMapBasicBasic *mapbb);
782 SYMENGINE_EXPORT CWRAPPER_OUTPUT_TYPE basic_subs2(basic s, const basic e,
783  const basic a, const basic b);
784 
787 SYMENGINE_EXPORT CWRAPPER_OUTPUT_TYPE function_symbol_set(basic s,
788  const char *c,
789  const CVecBasic *arg);
792 SYMENGINE_EXPORT char *function_symbol_get_name(const basic b);
794 SYMENGINE_EXPORT CWRAPPER_OUTPUT_TYPE basic_coeff(basic c, const basic b,
795  const basic x, const basic n);
796 
798 
800 SYMENGINE_EXPORT CWRAPPER_OUTPUT_TYPE vecbasic_linsolve(CVecBasic *sol,
801  const CVecBasic *sys,
802  const CVecBasic *sym);
804 SYMENGINE_EXPORT CWRAPPER_OUTPUT_TYPE basic_solve_poly(CSetBasic *r,
805  const basic f,
806  const basic s);
807 
809 
812 SYMENGINE_EXPORT char *ascii_art_str(void);
813 
816 SYMENGINE_EXPORT CWRAPPER_OUTPUT_TYPE ntheory_gcd(basic s, const basic a,
817  const basic b);
819 SYMENGINE_EXPORT CWRAPPER_OUTPUT_TYPE ntheory_lcm(basic s, const basic a,
820  const basic b);
822 SYMENGINE_EXPORT CWRAPPER_OUTPUT_TYPE ntheory_gcd_ext(basic g, basic s, basic t,
823  const basic a,
824  const basic b);
826 SYMENGINE_EXPORT CWRAPPER_OUTPUT_TYPE ntheory_nextprime(basic s, const basic a);
828 SYMENGINE_EXPORT CWRAPPER_OUTPUT_TYPE ntheory_mod(basic s, const basic n,
829  const basic d);
831 SYMENGINE_EXPORT CWRAPPER_OUTPUT_TYPE ntheory_quotient(basic s, const basic n,
832  const basic d);
834 SYMENGINE_EXPORT CWRAPPER_OUTPUT_TYPE ntheory_quotient_mod(basic q, basic r,
835  const basic n,
836  const basic d);
838 SYMENGINE_EXPORT CWRAPPER_OUTPUT_TYPE ntheory_mod_f(basic s, const basic n,
839  const basic d);
841 SYMENGINE_EXPORT CWRAPPER_OUTPUT_TYPE ntheory_quotient_f(basic s, const basic n,
842  const basic d);
844 SYMENGINE_EXPORT CWRAPPER_OUTPUT_TYPE ntheory_quotient_mod_f(basic q, basic r,
845  const basic n,
846  const basic d);
848 SYMENGINE_EXPORT int ntheory_mod_inverse(basic b, const basic a, const basic m);
850 SYMENGINE_EXPORT CWRAPPER_OUTPUT_TYPE ntheory_fibonacci(basic s,
851  unsigned long a);
853 SYMENGINE_EXPORT CWRAPPER_OUTPUT_TYPE ntheory_fibonacci2(basic g, basic s,
854  unsigned long a);
856 SYMENGINE_EXPORT CWRAPPER_OUTPUT_TYPE ntheory_lucas(basic s, unsigned long a);
858 SYMENGINE_EXPORT CWRAPPER_OUTPUT_TYPE ntheory_lucas2(basic g, basic s,
859  unsigned long a);
861 SYMENGINE_EXPORT CWRAPPER_OUTPUT_TYPE ntheory_binomial(basic s, const basic a,
862  unsigned long b);
864 SYMENGINE_EXPORT CWRAPPER_OUTPUT_TYPE ntheory_factorial(basic s,
865  unsigned long n);
867 SYMENGINE_EXPORT CWRAPPER_OUTPUT_TYPE basic_evalf(basic s, const basic b,
868  unsigned long bits, int real);
869 
871 SYMENGINE_EXPORT CWRAPPER_OUTPUT_TYPE basic_as_numer_denom(basic numer,
872  basic denom,
873  const basic x);
875 SYMENGINE_EXPORT CWRAPPER_OUTPUT_TYPE basic_add_as_two_terms(basic term1,
876  basic term2,
877  const basic s);
879 SYMENGINE_EXPORT CWRAPPER_OUTPUT_TYPE basic_mul_as_two_terms(basic term1,
880  basic term2,
881  const basic s);
882 
885 SYMENGINE_EXPORT CLambdaRealDoubleVisitor *lambda_real_double_visitor_new(void);
886 SYMENGINE_EXPORT void
887 lambda_real_double_visitor_init(CLambdaRealDoubleVisitor *self,
888  const CVecBasic *args, const CVecBasic *exprs,
889  int perform_cse);
890 SYMENGINE_EXPORT void
891 lambda_real_double_visitor_call(CLambdaRealDoubleVisitor *self,
892  double *const outs, const double *const inps);
893 SYMENGINE_EXPORT void
894 lambda_real_double_visitor_free(CLambdaRealDoubleVisitor *self);
895 
897 #ifdef HAVE_SYMENGINE_LLVM
898 // double
899 typedef struct CLLVMDoubleVisitor CLLVMDoubleVisitor;
900 SYMENGINE_EXPORT CLLVMDoubleVisitor *llvm_double_visitor_new(void);
901 SYMENGINE_EXPORT void llvm_double_visitor_init(CLLVMDoubleVisitor *self,
902  const CVecBasic *args,
903  const CVecBasic *exprs,
904  int perform_cse, int opt_level);
905 SYMENGINE_EXPORT void llvm_double_visitor_call(CLLVMDoubleVisitor *self,
906  double *const outs,
907  const double *const inps);
908 SYMENGINE_EXPORT void llvm_double_visitor_free(CLLVMDoubleVisitor *self);
909 // float
910 typedef struct CLLVMFloatVisitor CLLVMFloatVisitor;
911 SYMENGINE_EXPORT CLLVMFloatVisitor *llvm_float_visitor_new(void);
912 SYMENGINE_EXPORT void llvm_float_visitor_init(CLLVMFloatVisitor *self,
913  const CVecBasic *args,
914  const CVecBasic *exprs,
915  int perform_cse, int opt_level);
916 SYMENGINE_EXPORT void llvm_float_visitor_call(CLLVMFloatVisitor *self,
917  float *const outs,
918  const float *const inps);
919 SYMENGINE_EXPORT void llvm_float_visitor_free(CLLVMFloatVisitor *self);
920 
921 #ifdef SYMENGINE_HAVE_LLVM_LONG_DOUBLE
922 // long double
923 typedef struct CLLVMLongDoubleVisitor CLLVMLongDoubleVisitor;
924 SYMENGINE_EXPORT CLLVMLongDoubleVisitor *llvm_long_double_visitor_new(void);
925 SYMENGINE_EXPORT void
926 llvm_long_double_visitor_init(CLLVMLongDoubleVisitor *self,
927  const CVecBasic *args, const CVecBasic *exprs,
928  int perform_cse, int opt_level);
929 SYMENGINE_EXPORT void
930 llvm_long_double_visitor_call(CLLVMLongDoubleVisitor *self,
931  long double *const outs,
932  const long double *const inps);
933 SYMENGINE_EXPORT void
934 llvm_long_double_visitor_free(CLLVMLongDoubleVisitor *self);
935 #endif
936 #endif
937 
938 SYMENGINE_EXPORT CWRAPPER_OUTPUT_TYPE basic_cse(CVecBasic *replacement_syms,
939  CVecBasic *replacement_exprs,
940  CVecBasic *reduced_exprs,
941  const CVecBasic *exprs);
942 
944 SYMENGINE_EXPORT void symengine_print_stack_on_segfault(void);
945 
946 #ifdef __cplusplus
947 }
948 #endif
949 #endif
bool is_a_Number(const Basic &b)
Definition: number.h:130
TypeID
Definition: basic.h:43
bool is_a_Complex(const Basic &b)
Definition: complex.h:24