functions.h
Go to the documentation of this file.
1 
7 #ifndef SYMENGINE_FUNCTIONS_H
8 #define SYMENGINE_FUNCTIONS_H
9 
10 #include <symengine/basic.h>
11 #include <symengine/symengine_casts.h>
12 #include <symengine/constants.h>
13 
14 namespace SymEngine
15 {
16 
17 class SYMENGINE_EXPORT Function : public Basic
18 {
19 };
20 
21 class SYMENGINE_EXPORT OneArgFunction : public Function
22 {
23 private:
24  RCP<const Basic> arg_;
25 public:
27  OneArgFunction(const RCP<const Basic> &arg) : arg_{arg} {};
29  inline hash_t __hash__() const override
30  {
31  hash_t seed = this->get_type_code();
32  hash_combine<Basic>(seed, *arg_);
33  return seed;
34  }
36  inline RCP<const Basic> get_arg() const
37  {
38  return arg_;
39  }
40  inline vec_basic get_args() const override
41  {
42  return {arg_};
43  }
45  virtual RCP<const Basic> create(const RCP<const Basic> &arg) const = 0;
46 
47  inline RCP<const Basic> create(const vec_basic &b) const
48  {
49  SYMENGINE_ASSERT(b.size() == 1);
50  return create(b[0]);
51  }
52 
57  inline bool __eq__(const Basic &o) const override
58  {
59  return is_same_type(*this, o)
60  and eq(*get_arg(),
61  *down_cast<const OneArgFunction &>(o).get_arg());
62  }
64  inline int compare(const Basic &o) const override
65  {
66  SYMENGINE_ASSERT(is_same_type(*this, o))
67  return get_arg()->__cmp__(
68  *(down_cast<const OneArgFunction &>(o).get_arg()));
69  }
70 };
71 
72 template <class BaseClass>
73 class TwoArgBasic : public BaseClass
74 {
75 private:
76  RCP<const Basic> a_;
77  RCP<const Basic> b_;
78 public:
80  TwoArgBasic(const RCP<const Basic> &a, const RCP<const Basic> &b)
81  : a_{a}, b_{b} {};
83  inline hash_t __hash__() const override
84  {
85  hash_t seed = this->get_type_code();
86  hash_combine<Basic>(seed, *a_);
87  hash_combine<Basic>(seed, *b_);
88  return seed;
89  }
91  inline RCP<const Basic> get_arg1() const
92  {
93  return a_;
94  }
96  inline RCP<const Basic> get_arg2() const
97  {
98  return b_;
99  }
100  inline vec_basic get_args() const override
101  {
102  return {a_, b_};
103  }
105  virtual RCP<const Basic> create(const RCP<const Basic> &a,
106  const RCP<const Basic> &b) const = 0;
107 
108  inline RCP<const Basic> create(const vec_basic &b) const
109  {
110  SYMENGINE_ASSERT(b.size() == 2);
111  return create(b[0], b[1]);
112  }
113 
118  inline bool __eq__(const Basic &o) const override
119  {
120  return is_same_type(*this, o)
121  and eq(*get_arg1(),
122  *down_cast<const TwoArgBasic &>(o).get_arg1())
123  and eq(*get_arg2(),
124  *down_cast<const TwoArgBasic &>(o).get_arg2());
125  }
127  inline int compare(const Basic &o) const override
128  {
129  SYMENGINE_ASSERT(is_same_type(*this, o))
130  const TwoArgBasic &t = down_cast<const TwoArgBasic &>(o);
131  if (neq(*get_arg1(), *(t.get_arg1()))) {
132  return get_arg1()->__cmp__(
133  *(down_cast<const TwoArgBasic &>(o).get_arg1()));
134  } else {
135  return get_arg2()->__cmp__(
136  *(down_cast<const TwoArgBasic &>(o).get_arg2()));
137  }
138  }
139 };
140 
141 typedef TwoArgBasic<Function> TwoArgFunction;
142 
143 class SYMENGINE_EXPORT MultiArgFunction : public Function
144 {
145 private:
146  vec_basic arg_;
147 
148 public:
150  MultiArgFunction(const vec_basic &arg) : arg_{arg} {};
152  inline hash_t __hash__() const override
153  {
154  hash_t seed = this->get_type_code();
155  for (const auto &a : arg_)
156  hash_combine<Basic>(seed, *a);
157  return seed;
158  }
159  inline vec_basic get_args() const override
160  {
161  return arg_;
162  }
163  inline const vec_basic &get_vec() const
164  {
165  return arg_;
166  }
168  virtual RCP<const Basic> create(const vec_basic &v) const = 0;
173  inline bool __eq__(const Basic &o) const override
174  {
175  return is_same_type(*this, o)
176  and unified_eq(get_vec(),
177  down_cast<const MultiArgFunction &>(o).get_vec());
178  }
180  inline int compare(const Basic &o) const override
181  {
182  SYMENGINE_ASSERT(is_same_type(*this, o))
183  return unified_compare(
184  get_vec(), down_cast<const MultiArgFunction &>(o).get_vec());
185  }
186 };
187 
188 class SYMENGINE_EXPORT Sign : public OneArgFunction
189 {
190 public:
191  IMPLEMENT_TYPEID(SYMENGINE_SIGN)
193  Sign(const RCP<const Basic> &arg);
195  bool is_canonical(const RCP<const Basic> &arg) const;
197  RCP<const Basic> create(const RCP<const Basic> &arg) const override;
198 };
199 
201 SYMENGINE_EXPORT RCP<const Basic> sign(const RCP<const Basic> &arg);
202 
203 class SYMENGINE_EXPORT Floor : public OneArgFunction
204 {
205 public:
206  IMPLEMENT_TYPEID(SYMENGINE_FLOOR)
208  Floor(const RCP<const Basic> &arg);
210  bool is_canonical(const RCP<const Basic> &arg) const;
212  RCP<const Basic> create(const RCP<const Basic> &arg) const override;
213 };
214 
216 SYMENGINE_EXPORT RCP<const Basic> floor(const RCP<const Basic> &arg);
217 
218 class SYMENGINE_EXPORT Ceiling : public OneArgFunction
219 {
220 public:
221  IMPLEMENT_TYPEID(SYMENGINE_CEILING)
223  Ceiling(const RCP<const Basic> &arg);
225  bool is_canonical(const RCP<const Basic> &arg) const;
227  RCP<const Basic> create(const RCP<const Basic> &arg) const override;
228 };
229 
231 SYMENGINE_EXPORT RCP<const Basic> ceiling(const RCP<const Basic> &arg);
232 
233 class SYMENGINE_EXPORT Truncate : public OneArgFunction
234 {
235 public:
236  IMPLEMENT_TYPEID(SYMENGINE_TRUNCATE)
238  Truncate(const RCP<const Basic> &arg);
240  bool is_canonical(const RCP<const Basic> &arg) const;
242  RCP<const Basic> create(const RCP<const Basic> &arg) const override;
243 };
244 
246 SYMENGINE_EXPORT RCP<const Basic> truncate(const RCP<const Basic> &arg);
247 
248 class SYMENGINE_EXPORT Conjugate : public OneArgFunction
249 {
250 public:
251  IMPLEMENT_TYPEID(SYMENGINE_CONJUGATE)
253  Conjugate(const RCP<const Basic> &arg);
255  bool is_canonical(const RCP<const Basic> &arg) const;
257  RCP<const Basic> create(const RCP<const Basic> &arg) const override;
258 };
259 
261 SYMENGINE_EXPORT RCP<const Basic> conjugate(const RCP<const Basic> &arg);
262 
263 class SYMENGINE_EXPORT TrigBase : public OneArgFunction
264 {
265 public:
267  TrigBase(RCP<const Basic> arg) : OneArgFunction(arg){};
268 };
269 
270 class SYMENGINE_EXPORT TrigFunction : public TrigBase
271 {
272 public:
274  TrigFunction(RCP<const Basic> arg) : TrigBase(arg){};
275 };
276 
277 class SYMENGINE_EXPORT InverseTrigFunction : public TrigBase
278 {
279 public:
281  InverseTrigFunction(RCP<const Basic> arg) : TrigBase(arg){};
282 };
283 
286 SYMENGINE_EXPORT
287 bool get_pi_shift(const RCP<const Basic> &arg, const Ptr<RCP<const Number>> &n,
288  const Ptr<RCP<const Basic>> &m);
289 
291 SYMENGINE_EXPORT bool could_extract_minus(const Basic &arg);
292 
293 SYMENGINE_EXPORT
294 bool handle_minus(const RCP<const Basic> &arg,
295  const Ptr<RCP<const Basic>> &rarg);
296 
300 SYMENGINE_EXPORT
301 bool inverse_lookup(const umap_basic_basic &d, const RCP<const Basic> &t,
302  const Ptr<RCP<const Basic>> &index);
303 
304 // \return true of conjugate has to be returned finally else false
305 SYMENGINE_EXPORT
306 bool trig_simplify(const RCP<const Basic> &arg, unsigned period, bool odd,
307  bool conj_odd, // input
308  const Ptr<RCP<const Basic>> &rarg, int &index,
309  int &sign); // output
310 
312 SYMENGINE_EXPORT RCP<const Basic> sqrt(const RCP<const Basic> &arg);
313 
315 SYMENGINE_EXPORT RCP<const Basic> cbrt(const RCP<const Basic> &arg);
316 
317 class SYMENGINE_EXPORT Sin : public TrigFunction
318 {
319 
320 public:
321  IMPLEMENT_TYPEID(SYMENGINE_SIN)
323  Sin(const RCP<const Basic> &arg);
325  bool is_canonical(const RCP<const Basic> &arg) const;
327  RCP<const Basic> create(const RCP<const Basic> &arg) const override;
328 };
329 
331 SYMENGINE_EXPORT RCP<const Basic> sin(const RCP<const Basic> &arg);
332 
333 class SYMENGINE_EXPORT Cos : public TrigFunction
334 {
335 
336 public:
337  IMPLEMENT_TYPEID(SYMENGINE_COS)
339  Cos(const RCP<const Basic> &arg);
341  bool is_canonical(const RCP<const Basic> &arg) const;
343  RCP<const Basic> create(const RCP<const Basic> &arg) const override;
344 };
345 
347 SYMENGINE_EXPORT RCP<const Basic> cos(const RCP<const Basic> &arg);
348 
349 class SYMENGINE_EXPORT Tan : public TrigFunction
350 {
351 
352 public:
353  IMPLEMENT_TYPEID(SYMENGINE_TAN)
355  Tan(const RCP<const Basic> &arg);
357  bool is_canonical(const RCP<const Basic> &arg) const;
359  RCP<const Basic> create(const RCP<const Basic> &arg) const override;
360 };
362 SYMENGINE_EXPORT RCP<const Basic> tan(const RCP<const Basic> &arg);
363 
364 class SYMENGINE_EXPORT Cot : public TrigFunction
365 {
366 
367 public:
368  IMPLEMENT_TYPEID(SYMENGINE_COT)
370  Cot(const RCP<const Basic> &arg);
372  bool is_canonical(const RCP<const Basic> &arg) const;
374  RCP<const Basic> create(const RCP<const Basic> &arg) const override;
375 };
377 SYMENGINE_EXPORT RCP<const Basic> cot(const RCP<const Basic> &arg);
378 
379 class SYMENGINE_EXPORT Csc : public TrigFunction
380 {
381 
382 public:
383  IMPLEMENT_TYPEID(SYMENGINE_CSC)
385  Csc(const RCP<const Basic> &arg);
387  bool is_canonical(const RCP<const Basic> &arg) const;
389  RCP<const Basic> create(const RCP<const Basic> &arg) const override;
390 };
392 SYMENGINE_EXPORT RCP<const Basic> csc(const RCP<const Basic> &arg);
393 
394 class SYMENGINE_EXPORT Sec : public TrigFunction
395 {
396 
397 public:
398  IMPLEMENT_TYPEID(SYMENGINE_SEC)
400  Sec(const RCP<const Basic> &arg);
402  bool is_canonical(const RCP<const Basic> &arg) const;
404  RCP<const Basic> create(const RCP<const Basic> &arg) const override;
405 };
407 SYMENGINE_EXPORT RCP<const Basic> sec(const RCP<const Basic> &arg);
408 
409 class SYMENGINE_EXPORT ASin : public InverseTrigFunction
410 {
411 
412 public:
413  IMPLEMENT_TYPEID(SYMENGINE_ASIN)
415  ASin(const RCP<const Basic> &arg);
417  bool is_canonical(const RCP<const Basic> &arg) const;
419  RCP<const Basic> create(const RCP<const Basic> &arg) const override;
420 };
421 
423 SYMENGINE_EXPORT RCP<const Basic> asin(const RCP<const Basic> &arg);
424 
425 class SYMENGINE_EXPORT ACos : public InverseTrigFunction
426 {
427 
428 public:
429  IMPLEMENT_TYPEID(SYMENGINE_ACOS)
431  ACos(const RCP<const Basic> &arg);
433  bool is_canonical(const RCP<const Basic> &arg) const;
435  RCP<const Basic> create(const RCP<const Basic> &arg) const override;
436 };
437 
439 SYMENGINE_EXPORT RCP<const Basic> acos(const RCP<const Basic> &arg);
440 
441 class SYMENGINE_EXPORT ASec : public InverseTrigFunction
442 {
443 
444 public:
445  IMPLEMENT_TYPEID(SYMENGINE_ASEC)
447  ASec(const RCP<const Basic> &arg);
449  bool is_canonical(const RCP<const Basic> &arg) const;
451  RCP<const Basic> create(const RCP<const Basic> &arg) const override;
452 };
453 
455 SYMENGINE_EXPORT RCP<const Basic> asec(const RCP<const Basic> &arg);
456 
457 class SYMENGINE_EXPORT ACsc : public InverseTrigFunction
458 {
459 
460 public:
461  IMPLEMENT_TYPEID(SYMENGINE_ACSC)
463  ACsc(const RCP<const Basic> &arg);
465  bool is_canonical(const RCP<const Basic> &arg) const;
467  RCP<const Basic> create(const RCP<const Basic> &arg) const override;
468 };
469 
471 SYMENGINE_EXPORT RCP<const Basic> acsc(const RCP<const Basic> &arg);
472 
473 class SYMENGINE_EXPORT ATan : public InverseTrigFunction
474 {
475 
476 public:
477  IMPLEMENT_TYPEID(SYMENGINE_ATAN)
479  ATan(const RCP<const Basic> &arg);
481  bool is_canonical(const RCP<const Basic> &arg) const;
483  RCP<const Basic> create(const RCP<const Basic> &arg) const override;
484 };
485 
487 SYMENGINE_EXPORT RCP<const Basic> atan(const RCP<const Basic> &arg);
488 
489 class SYMENGINE_EXPORT ACot : public InverseTrigFunction
490 {
491 
492 public:
493  IMPLEMENT_TYPEID(SYMENGINE_ACOT)
495  ACot(const RCP<const Basic> &arg);
497  bool is_canonical(const RCP<const Basic> &arg) const;
499  RCP<const Basic> create(const RCP<const Basic> &arg) const override;
500 };
501 
503 SYMENGINE_EXPORT RCP<const Basic> acot(const RCP<const Basic> &arg);
504 
505 class SYMENGINE_EXPORT ATan2 : public TwoArgFunction
506 {
507 public:
508  IMPLEMENT_TYPEID(SYMENGINE_ATAN2)
510  ATan2(const RCP<const Basic> &num, const RCP<const Basic> &den);
512  bool is_canonical(const RCP<const Basic> &num,
513  const RCP<const Basic> &den) const;
515  inline RCP<const Basic> get_num() const
516  {
517  return get_arg1();
518  }
520  inline RCP<const Basic> get_den() const
521  {
522  return get_arg2();
523  }
525  RCP<const Basic> create(const RCP<const Basic> &a,
526  const RCP<const Basic> &b) const override;
527 };
528 
530 SYMENGINE_EXPORT RCP<const Basic> atan2(const RCP<const Basic> &num,
531  const RCP<const Basic> &den);
532 
533 class SYMENGINE_EXPORT Log : public OneArgFunction
534 {
535  // Logarithms are taken with the natural base, `e`. To get
536  // a logarithm of a different base `b`, use `log(x, b)`,
537  // which is essentially short-hand for `log(x)/log(b)`.
538 public:
539  IMPLEMENT_TYPEID(SYMENGINE_LOG)
541  Log(const RCP<const Basic> &arg);
543  bool is_canonical(const RCP<const Basic> &arg) const;
545  RCP<const Basic> create(const RCP<const Basic> &arg) const override;
546 };
547 
549 SYMENGINE_EXPORT RCP<const Basic> log(const RCP<const Basic> &arg);
551 SYMENGINE_EXPORT RCP<const Basic> log(const RCP<const Basic> &arg,
552  const RCP<const Basic> &b);
553 
554 class SYMENGINE_EXPORT LambertW : public OneArgFunction
555 {
556  // Lambert W function, defined as the inverse function of
557  // x*exp(x). This function represents the principal branch
558  // of this inverse function, which is multivalued.
559  // For more information, see:
560  // http://en.wikipedia.org/wiki/Lambert_W_function
561 public:
562  IMPLEMENT_TYPEID(SYMENGINE_LAMBERTW)
564  LambertW(const RCP<const Basic> &arg);
566  bool is_canonical(const RCP<const Basic> &arg) const;
568  RCP<const Basic> create(const RCP<const Basic> &arg) const override;
569 };
570 
572 SYMENGINE_EXPORT RCP<const Basic> lambertw(const RCP<const Basic> &arg);
573 
574 class SYMENGINE_EXPORT Zeta : public TwoArgFunction
575 {
576  // Hurwitz zeta function (or Riemann zeta function).
577  //
578  // For `\operatorname{Re}(a) > 0` and `\operatorname{Re}(s) > 1`, this
579  // function is defined as
580  //
581  // .. math:: \zeta(s, a) = \sum_{n=0}^\infty \frac{1}{(n + a)^s},
582  //
583  // where the standard choice of argument for :math:`n + a` is used.
584  // If no value is passed for :math:`a`, by this function assumes a default
585  // value
586  // of :math:`a = 1`, yielding the Riemann zeta function.
587 public:
589  IMPLEMENT_TYPEID(SYMENGINE_ZETA)
591  Zeta(const RCP<const Basic> &s, const RCP<const Basic> &a);
593  Zeta(const RCP<const Basic> &s);
595  inline RCP<const Basic> get_s() const
596  {
597  return get_arg1();
598  }
600  inline RCP<const Basic> get_a() const
601  {
602  return get_arg2();
603  }
605  bool is_canonical(const RCP<const Basic> &s,
606  const RCP<const Basic> &a) const;
608  RCP<const Basic> create(const RCP<const Basic> &a,
609  const RCP<const Basic> &b) const override;
610 };
611 
613 SYMENGINE_EXPORT RCP<const Basic> zeta(const RCP<const Basic> &s,
614  const RCP<const Basic> &a);
615 SYMENGINE_EXPORT RCP<const Basic> zeta(const RCP<const Basic> &s);
616 
617 class SYMENGINE_EXPORT Dirichlet_eta : public OneArgFunction
618 {
619  // See http://en.wikipedia.org/wiki/Dirichlet_eta_function
620 public:
621  IMPLEMENT_TYPEID(SYMENGINE_DIRICHLET_ETA)
623  Dirichlet_eta(const RCP<const Basic> &s);
625  inline RCP<const Basic> get_s() const
626  {
627  return get_arg();
628  }
630  bool is_canonical(const RCP<const Basic> &s) const;
632  RCP<const Basic> rewrite_as_zeta() const;
634  RCP<const Basic> create(const RCP<const Basic> &arg) const override;
636 };
637 
639 SYMENGINE_EXPORT RCP<const Basic> dirichlet_eta(const RCP<const Basic> &s);
640 
641 class SYMENGINE_EXPORT FunctionSymbol : public MultiArgFunction
642 {
643 protected:
644  std::string name_;
645 
646 public:
647  IMPLEMENT_TYPEID(SYMENGINE_FUNCTIONSYMBOL)
649  FunctionSymbol(std::string name, const vec_basic &arg);
650  FunctionSymbol(std::string name, const RCP<const Basic> &arg);
652  hash_t __hash__() const override;
657  bool __eq__(const Basic &o) const override;
658  int compare(const Basic &o) const override;
660  inline const std::string &get_name() const
661  {
662  return name_;
663  }
665  bool is_canonical(const vec_basic &arg) const;
666  RCP<const Basic> create(const vec_basic &x) const override;
667 };
668 
670 SYMENGINE_EXPORT RCP<const Basic> function_symbol(std::string name,
671  const RCP<const Basic> &arg);
672 SYMENGINE_EXPORT RCP<const Basic> function_symbol(std::string name,
673  const vec_basic &arg);
674 
679 class SYMENGINE_EXPORT FunctionWrapper : public FunctionSymbol
680 {
681 public:
682  IMPLEMENT_TYPEID(SYMENGINE_FUNCTIONWRAPPER)
683  FunctionWrapper(std::string name, const vec_basic &arg);
684  FunctionWrapper(std::string name, const RCP<const Basic> &arg);
685  RCP<const Basic> create(const vec_basic &v) const override = 0;
686  virtual RCP<const Number> eval(long bits) const = 0;
687  virtual RCP<const Basic> diff_impl(const RCP<const Symbol> &s) const = 0;
688 };
689 
694 class SYMENGINE_EXPORT Derivative : public Basic
695 {
696 private:
697  RCP<const Basic> arg_;
698  // The symbols are declared as Basic (and checked by is_canonical() below),
699  // to avoid issues with converting vector<RCP<Symbol>> to
700  // vector<RCP<Basic>>, see [1], [2]. The problem is that even though Symbol
701  // inherits from Basic, vector<RCP<Symbol>> does not inherit from
702  // vector<RCP<Basic>>, so the compiler can't cast the derived type to the
703  // base type when calling functions like unified_eq() that are only
704  // defined for the base type vector<RCP<Basic>>.
705  // [1]
706  // http://stackoverflow.com/questions/14964909/how-to-cast-a-vector-of-shared-ptrs-of-a-derived-class-to-a-vector-of-share-ptrs
707  // [2]
708  // http://stackoverflow.com/questions/114819/getting-a-vectorderived-into-a-function-that-expects-a-vectorbase
709  multiset_basic x_;
710 
711 public:
712  IMPLEMENT_TYPEID(SYMENGINE_DERIVATIVE)
713  Derivative(const RCP<const Basic> &arg, const multiset_basic &x);
714 
715  static RCP<const Derivative> create(const RCP<const Basic> &arg,
716  const multiset_basic &x)
717  {
718  return make_rcp<const Derivative>(arg, x);
719  }
720 
721  hash_t __hash__() const override;
722  bool __eq__(const Basic &o) const override;
723  int compare(const Basic &o) const override;
724  inline RCP<const Basic> get_arg() const
725  {
726  return arg_;
727  }
728  inline const multiset_basic &get_symbols() const
729  {
730  return x_;
731  }
732  vec_basic get_args() const override
733  {
734  vec_basic args = {arg_};
735  args.insert(args.end(), x_.begin(), x_.end());
736  return args;
737  }
738  bool is_canonical(const RCP<const Basic> &arg,
739  const multiset_basic &x) const;
740 };
741 
746 class SYMENGINE_EXPORT Subs : public Basic
747 {
748 private:
749  RCP<const Basic> arg_;
750  map_basic_basic dict_;
751 
752 public:
753  IMPLEMENT_TYPEID(SYMENGINE_SUBS)
754  Subs(const RCP<const Basic> &arg, const map_basic_basic &x);
755 
756  static RCP<const Subs> create(const RCP<const Basic> &arg,
757  const map_basic_basic &x)
758  {
759  return make_rcp<const Subs>(arg, x);
760  }
761 
762  hash_t __hash__() const override;
763  bool __eq__(const Basic &o) const override;
764  int compare(const Basic &o) const override;
765  inline const RCP<const Basic> &get_arg() const
766  {
767  return arg_;
768  }
769  inline const map_basic_basic &get_dict() const
770  {
771  return dict_;
772  };
773  virtual vec_basic get_variables() const;
774  virtual vec_basic get_point() const;
775  vec_basic get_args() const override;
776 
777  bool is_canonical(const RCP<const Basic> &arg,
778  const map_basic_basic &x) const;
779 };
780 
781 class SYMENGINE_EXPORT HyperbolicBase : public OneArgFunction
782 {
783 public:
785  HyperbolicBase(RCP<const Basic> arg) : OneArgFunction{arg} {};
786 };
787 
788 class SYMENGINE_EXPORT HyperbolicFunction : public HyperbolicBase
789 {
790 public:
792  HyperbolicFunction(RCP<const Basic> arg) : HyperbolicBase{arg} {};
793 };
794 
795 class SYMENGINE_EXPORT InverseHyperbolicFunction : public HyperbolicBase
796 {
797 public:
799  InverseHyperbolicFunction(RCP<const Basic> arg) : HyperbolicBase{arg} {};
800 };
801 
802 class SYMENGINE_EXPORT Sinh : public HyperbolicFunction
803 {
805 public:
806  IMPLEMENT_TYPEID(SYMENGINE_SINH)
808  Sinh(const RCP<const Basic> &arg);
810  bool is_canonical(const RCP<const Basic> &arg) const;
812  RCP<const Basic> create(const RCP<const Basic> &arg) const override;
813 };
814 
816 SYMENGINE_EXPORT RCP<const Basic> sinh(const RCP<const Basic> &arg);
817 
818 class SYMENGINE_EXPORT Csch : public HyperbolicFunction
819 {
821 public:
822  IMPLEMENT_TYPEID(SYMENGINE_CSCH)
824  Csch(const RCP<const Basic> &arg);
826  bool is_canonical(const RCP<const Basic> &arg) const;
828  RCP<const Basic> create(const RCP<const Basic> &arg) const override;
829 };
830 
832 SYMENGINE_EXPORT RCP<const Basic> csch(const RCP<const Basic> &arg);
833 
834 class SYMENGINE_EXPORT Cosh : public HyperbolicFunction
835 {
837 public:
838  IMPLEMENT_TYPEID(SYMENGINE_COSH)
840  Cosh(const RCP<const Basic> &arg);
842  bool is_canonical(const RCP<const Basic> &arg) const;
844  RCP<const Basic> create(const RCP<const Basic> &arg) const override;
845 };
846 
848 SYMENGINE_EXPORT RCP<const Basic> cosh(const RCP<const Basic> &arg);
849 
850 class SYMENGINE_EXPORT Sech : public HyperbolicFunction
851 {
853 public:
854  IMPLEMENT_TYPEID(SYMENGINE_SECH)
856  Sech(const RCP<const Basic> &arg);
858  bool is_canonical(const RCP<const Basic> &arg) const;
860  RCP<const Basic> create(const RCP<const Basic> &arg) const override;
861 };
862 
864 SYMENGINE_EXPORT RCP<const Basic> sech(const RCP<const Basic> &arg);
865 
866 class SYMENGINE_EXPORT Tanh : public HyperbolicFunction
867 {
869 public:
870  IMPLEMENT_TYPEID(SYMENGINE_TANH)
872  Tanh(const RCP<const Basic> &arg);
874  bool is_canonical(const RCP<const Basic> &arg) const;
876  RCP<const Basic> create(const RCP<const Basic> &arg) const override;
877 };
878 
880 SYMENGINE_EXPORT RCP<const Basic> tanh(const RCP<const Basic> &arg);
881 
882 class SYMENGINE_EXPORT Coth : public HyperbolicFunction
883 {
885 public:
886  IMPLEMENT_TYPEID(SYMENGINE_COTH)
888  Coth(const RCP<const Basic> &arg);
890  bool is_canonical(const RCP<const Basic> &arg) const;
892  RCP<const Basic> create(const RCP<const Basic> &arg) const override;
893 };
894 
896 SYMENGINE_EXPORT RCP<const Basic> coth(const RCP<const Basic> &arg);
897 
898 class SYMENGINE_EXPORT ASinh : public InverseHyperbolicFunction
899 {
901 public:
902  IMPLEMENT_TYPEID(SYMENGINE_ASINH)
904  ASinh(const RCP<const Basic> &arg);
906  bool is_canonical(const RCP<const Basic> &arg) const;
908  RCP<const Basic> create(const RCP<const Basic> &arg) const override;
909 };
910 
912 SYMENGINE_EXPORT RCP<const Basic> asinh(const RCP<const Basic> &arg);
913 
914 class SYMENGINE_EXPORT ACsch : public InverseHyperbolicFunction
915 {
917 public:
918  IMPLEMENT_TYPEID(SYMENGINE_ACSCH)
920  ACsch(const RCP<const Basic> &arg);
922  bool is_canonical(const RCP<const Basic> &arg) const;
924  RCP<const Basic> create(const RCP<const Basic> &arg) const override;
925 };
926 
928 SYMENGINE_EXPORT RCP<const Basic> acsch(const RCP<const Basic> &arg);
929 
930 class SYMENGINE_EXPORT ACosh : public InverseHyperbolicFunction
931 {
933 public:
934  IMPLEMENT_TYPEID(SYMENGINE_ACOSH)
936  ACosh(const RCP<const Basic> &arg);
938  bool is_canonical(const RCP<const Basic> &arg) const;
940  RCP<const Basic> create(const RCP<const Basic> &arg) const override;
941 };
942 
944 SYMENGINE_EXPORT RCP<const Basic> acosh(const RCP<const Basic> &arg);
945 
946 class SYMENGINE_EXPORT ATanh : public InverseHyperbolicFunction
947 {
949 public:
950  IMPLEMENT_TYPEID(SYMENGINE_ATANH)
952  ATanh(const RCP<const Basic> &arg);
954  bool is_canonical(const RCP<const Basic> &arg) const;
956  RCP<const Basic> create(const RCP<const Basic> &arg) const override;
957 };
958 
960 SYMENGINE_EXPORT RCP<const Basic> atanh(const RCP<const Basic> &arg);
961 
962 class SYMENGINE_EXPORT ACoth : public InverseHyperbolicFunction
963 {
965 public:
966  IMPLEMENT_TYPEID(SYMENGINE_ACOTH)
968  ACoth(const RCP<const Basic> &arg);
970  bool is_canonical(const RCP<const Basic> &arg) const;
972  RCP<const Basic> create(const RCP<const Basic> &arg) const override;
973 };
974 
976 SYMENGINE_EXPORT RCP<const Basic> acoth(const RCP<const Basic> &arg);
977 
978 class SYMENGINE_EXPORT ASech : public InverseHyperbolicFunction
979 {
981 public:
982  IMPLEMENT_TYPEID(SYMENGINE_ASECH)
984  ASech(const RCP<const Basic> &arg);
986  bool is_canonical(const RCP<const Basic> &arg) const;
988  RCP<const Basic> create(const RCP<const Basic> &arg) const override;
989 };
990 
992 SYMENGINE_EXPORT RCP<const Basic> asech(const RCP<const Basic> &arg);
993 
994 class SYMENGINE_EXPORT KroneckerDelta : public TwoArgFunction
995 {
1002 public:
1003  using TwoArgFunction::create;
1004  IMPLEMENT_TYPEID(SYMENGINE_KRONECKERDELTA)
1006  KroneckerDelta(const RCP<const Basic> &i, const RCP<const Basic> &j);
1008  bool is_canonical(const RCP<const Basic> &i,
1009  const RCP<const Basic> &j) const;
1011  RCP<const Basic> create(const RCP<const Basic> &a,
1012  const RCP<const Basic> &b) const override;
1013 };
1014 
1016 SYMENGINE_EXPORT RCP<const Basic> kronecker_delta(const RCP<const Basic> &i,
1017  const RCP<const Basic> &j);
1018 
1019 class SYMENGINE_EXPORT LeviCivita : public MultiArgFunction
1020 {
1028 public:
1029  IMPLEMENT_TYPEID(SYMENGINE_LEVICIVITA)
1031  LeviCivita(const vec_basic &&arg);
1033  bool is_canonical(const vec_basic &arg) const;
1035  RCP<const Basic> create(const vec_basic &arg) const override;
1036 };
1037 
1039 SYMENGINE_EXPORT RCP<const Basic> levi_civita(const vec_basic &arg);
1040 
1041 class SYMENGINE_EXPORT Erf : public OneArgFunction
1042 {
1043  /* The Gauss error function. This function is defined as:
1044  *
1045  * .. math::
1046  * \mathrm{erf}(x) = \frac{2}{\sqrt{\pi}} \int_0^x e^{-t^2}
1047  *\mathrm{d}t.
1048  **/
1049 public:
1050  IMPLEMENT_TYPEID(SYMENGINE_ERF)
1052  Erf(const RCP<const Basic> &arg) : OneArgFunction(arg)
1053  {
1054  SYMENGINE_ASSIGN_TYPEID()
1055  SYMENGINE_ASSERT(is_canonical(arg))
1056  }
1058  bool is_canonical(const RCP<const Basic> &arg) const;
1060  RCP<const Basic> create(const RCP<const Basic> &arg) const override;
1061 };
1062 
1064 SYMENGINE_EXPORT RCP<const Basic> erf(const RCP<const Basic> &arg);
1065 
1066 class SYMENGINE_EXPORT Erfc : public OneArgFunction
1067 {
1068  /* The complementary error function. This function is defined as:
1069  *
1070  * .. math::
1071  * \mathrm{erfc}(x) = 1 - \frac{2}{\sqrt{\pi}} \int_0^x e^{-t^2}
1072  * \mathrm{d}t.
1073  **/
1074 public:
1075  IMPLEMENT_TYPEID(SYMENGINE_ERFC)
1077  Erfc(const RCP<const Basic> &arg) : OneArgFunction(arg)
1078  {
1079  SYMENGINE_ASSIGN_TYPEID()
1080  SYMENGINE_ASSERT(is_canonical(arg))
1081  }
1083  bool is_canonical(const RCP<const Basic> &arg) const;
1085  RCP<const Basic> create(const RCP<const Basic> &arg) const override;
1086 };
1087 
1089 SYMENGINE_EXPORT RCP<const Basic> erfc(const RCP<const Basic> &arg);
1090 
1091 class SYMENGINE_EXPORT Gamma : public OneArgFunction
1092 {
1103 public:
1104  IMPLEMENT_TYPEID(SYMENGINE_GAMMA)
1106  Gamma(const RCP<const Basic> &arg);
1108  bool is_canonical(const RCP<const Basic> &arg) const;
1110  RCP<const Basic> create(const RCP<const Basic> &arg) const override;
1111 };
1112 
1114 SYMENGINE_EXPORT RCP<const Basic> gamma(const RCP<const Basic> &arg);
1115 
1116 class SYMENGINE_EXPORT LowerGamma : public TwoArgFunction
1117 {
1119 public:
1120  using TwoArgFunction::create;
1121  IMPLEMENT_TYPEID(SYMENGINE_LOWERGAMMA)
1123  LowerGamma(const RCP<const Basic> &s, const RCP<const Basic> &x);
1125  bool is_canonical(const RCP<const Basic> &s,
1126  const RCP<const Basic> &x) const;
1128  RCP<const Basic> create(const RCP<const Basic> &a,
1129  const RCP<const Basic> &b) const override;
1130 };
1131 
1133 SYMENGINE_EXPORT RCP<const Basic> lowergamma(const RCP<const Basic> &s,
1134  const RCP<const Basic> &x);
1135 
1136 class SYMENGINE_EXPORT UpperGamma : public TwoArgFunction
1137 {
1139 public:
1140  using TwoArgFunction::create;
1141  IMPLEMENT_TYPEID(SYMENGINE_UPPERGAMMA)
1143  UpperGamma(const RCP<const Basic> &s, const RCP<const Basic> &x);
1145  bool is_canonical(const RCP<const Basic> &s,
1146  const RCP<const Basic> &x) const;
1148  RCP<const Basic> create(const RCP<const Basic> &a,
1149  const RCP<const Basic> &b) const override;
1150 };
1151 
1153 SYMENGINE_EXPORT RCP<const Basic> uppergamma(const RCP<const Basic> &s,
1154  const RCP<const Basic> &x);
1155 
1156 class SYMENGINE_EXPORT LogGamma : public OneArgFunction
1157 {
1162 public:
1163  IMPLEMENT_TYPEID(SYMENGINE_LOGGAMMA)
1165  LogGamma(const RCP<const Basic> &arg) : OneArgFunction(arg)
1166  {
1167  SYMENGINE_ASSIGN_TYPEID()
1168  SYMENGINE_ASSERT(is_canonical(arg))
1169  }
1171  bool is_canonical(const RCP<const Basic> &arg) const;
1172  RCP<const Basic> rewrite_as_gamma() const;
1174  RCP<const Basic> create(const RCP<const Basic> &arg) const override;
1175 };
1176 
1178 SYMENGINE_EXPORT RCP<const Basic> loggamma(const RCP<const Basic> &arg);
1179 
1180 class SYMENGINE_EXPORT Beta : public TwoArgFunction
1181 {
1188 public:
1189  using TwoArgFunction::create;
1190  IMPLEMENT_TYPEID(SYMENGINE_BETA)
1192  Beta(const RCP<const Basic> &x, const RCP<const Basic> &y)
1193  : TwoArgFunction(x, y)
1194  {
1195  SYMENGINE_ASSIGN_TYPEID()
1196  SYMENGINE_ASSERT(is_canonical(x, y))
1197  }
1199  static RCP<const Beta> from_two_basic(const RCP<const Basic> &x,
1200  const RCP<const Basic> &y);
1202  bool is_canonical(const RCP<const Basic> &s, const RCP<const Basic> &x);
1203  RCP<const Basic> rewrite_as_gamma() const;
1205  RCP<const Basic> create(const RCP<const Basic> &a,
1206  const RCP<const Basic> &b) const override;
1207 };
1208 
1210 SYMENGINE_EXPORT RCP<const Basic> beta(const RCP<const Basic> &x,
1211  const RCP<const Basic> &y);
1212 
1213 class SYMENGINE_EXPORT PolyGamma : public TwoArgFunction
1214 {
1225 public:
1226  using TwoArgFunction::create;
1227  IMPLEMENT_TYPEID(SYMENGINE_POLYGAMMA)
1229  PolyGamma(const RCP<const Basic> &n, const RCP<const Basic> &x)
1230  : TwoArgFunction(n, x)
1231  {
1232  SYMENGINE_ASSIGN_TYPEID()
1233  SYMENGINE_ASSERT(is_canonical(n, x))
1234  }
1235  bool is_canonical(const RCP<const Basic> &n, const RCP<const Basic> &x);
1236  RCP<const Basic> rewrite_as_zeta() const;
1238  RCP<const Basic> create(const RCP<const Basic> &a,
1239  const RCP<const Basic> &b) const override;
1240 };
1241 
1243 SYMENGINE_EXPORT RCP<const Basic> polygamma(const RCP<const Basic> &n,
1244  const RCP<const Basic> &x);
1245 
1246 SYMENGINE_EXPORT RCP<const Basic> digamma(const RCP<const Basic> &x);
1247 
1248 SYMENGINE_EXPORT RCP<const Basic> trigamma(const RCP<const Basic> &x);
1249 
1250 class SYMENGINE_EXPORT Abs : public OneArgFunction
1251 {
1254 public:
1255  IMPLEMENT_TYPEID(SYMENGINE_ABS)
1257  Abs(const RCP<const Basic> &arg);
1259  bool is_canonical(const RCP<const Basic> &arg) const;
1261  RCP<const Basic> create(const RCP<const Basic> &arg) const override;
1262 };
1263 
1265 SYMENGINE_EXPORT RCP<const Basic> abs(const RCP<const Basic> &arg);
1266 
1267 class SYMENGINE_EXPORT Max : public MultiArgFunction
1268 {
1269 public:
1270  IMPLEMENT_TYPEID(SYMENGINE_MAX)
1272  Max(const vec_basic &&arg);
1274  bool is_canonical(const vec_basic &arg) const;
1276  RCP<const Basic> create(const vec_basic &arg) const override;
1277 };
1278 
1280 SYMENGINE_EXPORT RCP<const Basic> max(const vec_basic &arg);
1281 
1282 class SYMENGINE_EXPORT Min : public MultiArgFunction
1283 {
1284 public:
1285  IMPLEMENT_TYPEID(SYMENGINE_MIN)
1287  Min(const vec_basic &&arg);
1289  bool is_canonical(const vec_basic &arg) const;
1291  RCP<const Basic> create(const vec_basic &arg) const override;
1292 };
1293 
1295 SYMENGINE_EXPORT RCP<const Basic> min(const vec_basic &arg);
1296 
1298 SYMENGINE_EXPORT RCP<const Basic> trig_to_sqrt(const RCP<const Basic> &arg);
1299 
1300 class SYMENGINE_EXPORT UnevaluatedExpr : public OneArgFunction
1301 {
1302 public:
1303  IMPLEMENT_TYPEID(SYMENGINE_UNEVALUATED_EXPR)
1305  UnevaluatedExpr(const RCP<const Basic> &arg);
1307  bool is_canonical(const RCP<const Basic> &arg) const;
1309  RCP<const Basic> create(const RCP<const Basic> &arg) const override;
1310 };
1311 
1312 SYMENGINE_EXPORT RCP<const Basic> unevaluated_expr(const RCP<const Basic> &arg);
1313 
1314 } // namespace SymEngine
1315 
1316 #endif
The base class for SymEngine.
#define IMPLEMENT_TYPEID(SYMENGINE_ID)
Inline members and functions.
Definition: basic.h:344
RCP< const Basic > get_den() const
Definition: functions.h:520
RCP< const Basic > get_num() const
Definition: functions.h:515
The lowest unit of symbolic representation.
Definition: basic.h:97
vec_basic get_args() const override
Returns the list of arguments.
Definition: functions.h:732
multiset_basic x_
The expression to be differentiated.
Definition: functions.h:709
RCP< const Basic > get_s() const
Definition: functions.h:625
const std::string & get_name() const
Definition: functions.h:660
RCP< const Basic > create(const vec_basic &v) const override=0
Method to construct classes with canonicalization.
HyperbolicBase(RCP< const Basic > arg)
Constructor.
Definition: functions.h:785
HyperbolicFunction(RCP< const Basic > arg)
Constructor.
Definition: functions.h:792
InverseHyperbolicFunction(RCP< const Basic > arg)
Constructor.
Definition: functions.h:799
InverseTrigFunction(RCP< const Basic > arg)
Constructor.
Definition: functions.h:281
virtual RCP< const Basic > create(const vec_basic &v) const =0
Method to construct classes with canonicalization.
hash_t __hash__() const override
Definition: functions.h:152
bool __eq__(const Basic &o) const override
Definition: functions.h:173
vec_basic get_args() const override
Returns the list of arguments.
Definition: functions.h:159
int compare(const Basic &o) const override
Structural equality comparator.
Definition: functions.h:180
MultiArgFunction(const vec_basic &arg)
Constructor.
Definition: functions.h:150
virtual RCP< const Basic > create(const RCP< const Basic > &arg) const =0
Method to construct classes with canonicalization.
bool __eq__(const Basic &o) const override
Definition: functions.h:57
hash_t __hash__() const override
Definition: functions.h:29
OneArgFunction(const RCP< const Basic > &arg)
The arg in OneArgFunction(arg)
Definition: functions.h:27
vec_basic get_args() const override
Returns the list of arguments.
Definition: functions.h:40
RCP< const Basic > get_arg() const
Definition: functions.h:36
int compare(const Basic &o) const override
Structural equality comparator.
Definition: functions.h:64
TrigBase(RCP< const Basic > arg)
Constructor.
Definition: functions.h:267
TrigFunction(RCP< const Basic > arg)
Constructor.
Definition: functions.h:274
virtual RCP< const Basic > create(const RCP< const Basic > &a, const RCP< const Basic > &b) const =0
Method to construct classes with canonicalization.
hash_t __hash__() const override
Definition: functions.h:83
RCP< const Basic > get_arg1() const
Definition: functions.h:91
int compare(const Basic &o) const override
Structural equality comparator.
Definition: functions.h:127
RCP< const Basic > b_
a in TwoArgBasic(a, b)
Definition: functions.h:77
RCP< const Basic > get_arg2() const
Definition: functions.h:96
TwoArgBasic(const RCP< const Basic > &a, const RCP< const Basic > &b)
b in TwoArgBasic(a, b)
Definition: functions.h:80
bool __eq__(const Basic &o) const override
Definition: functions.h:118
RCP< const Basic > get_a() const
Definition: functions.h:600
RCP< const Basic > get_s() const
Definition: functions.h:595
Main namespace for SymEngine package.
Definition: add.cpp:19
RCP< const Basic > csc(const RCP< const Basic > &arg)
Canonicalize Csc:
Definition: functions.cpp:1138
RCP< const Basic > atan(const RCP< const Basic > &arg)
Canonicalize ATan:
Definition: functions.cpp:1524
RCP< const Basic > sec(const RCP< const Basic > &arg)
Canonicalize Sec:
Definition: functions.cpp:1202
RCP< const Basic > cos(const RCP< const Basic > &arg)
Canonicalize Cos:
Definition: functions.cpp:942
RCP< const Basic > sinh(const RCP< const Basic > &arg)
Canonicalize Sinh:
Definition: functions.cpp:2127
RCP< const Basic > beta(const RCP< const Basic > &x, const RCP< const Basic > &y)
Canonicalize Beta:
Definition: functions.cpp:3283
RCP< const Basic > conjugate(const RCP< const Basic > &arg)
Canonicalize Conjugate.
Definition: functions.cpp:149
RCP< const Basic > coth(const RCP< const Basic > &arg)
Canonicalize Coth:
Definition: functions.cpp:2333
RCP< const Basic > sin(const RCP< const Basic > &arg)
Canonicalize Sin:
Definition: functions.cpp:874
RCP< const Basic > tan(const RCP< const Basic > &arg)
Canonicalize Tan:
Definition: functions.cpp:1007
RCP< const Basic > acos(const RCP< const Basic > &arg)
Canonicalize ACos:
Definition: functions.cpp:1402
RCP< const Basic > erf(const RCP< const Basic > &arg)
Canonicalize Erf:
Definition: functions.cpp:2891
RCP< const Basic > acsch(const RCP< const Basic > &arg)
Canonicalize ACsch:
Definition: functions.cpp:2422
RCP< const Basic > max(const vec_basic &arg)
Canonicalize Max:
Definition: functions.cpp:3555
RCP< const Basic > lowergamma(const RCP< const Basic > &s, const RCP< const Basic > &x)
Canonicalize LowerGamma:
Definition: functions.cpp:3070
RCP< const Basic > ceiling(const RCP< const Basic > &arg)
Canonicalize Ceiling:
Definition: functions.cpp:705
RCP< const Basic > tanh(const RCP< const Basic > &arg)
Canonicalize Tanh:
Definition: functions.cpp:2290
RCP< const Basic > asin(const RCP< const Basic > &arg)
Canonicalize ASin:
Definition: functions.cpp:1360
RCP< const Basic > trig_to_sqrt(const RCP< const Basic > &arg)
Definition: functions.cpp:1246
RCP< const Basic > kronecker_delta(const RCP< const Basic > &i, const RCP< const Basic > &j)
Canonicalize KroneckerDelta:
Definition: functions.cpp:2675
bool inverse_lookup(const umap_basic_basic &d, const RCP< const Basic > &t, const Ptr< RCP< const Basic >> &index)
Definition: functions.cpp:480
RCP< const Basic > sech(const RCP< const Basic > &arg)
Canonicalize Sech:
Definition: functions.cpp:2251
RCP< const Basic > cosh(const RCP< const Basic > &arg)
Canonicalize Cosh:
Definition: functions.cpp:2212
RCP< const Basic > zeta(const RCP< const Basic > &s, const RCP< const Basic > &a)
Create a new Zeta instance:
Definition: functions.cpp:2800
RCP< const Basic > acsc(const RCP< const Basic > &arg)
Canonicalize ACsc:
Definition: functions.cpp:1484
RCP< const Basic > floor(const RCP< const Basic > &arg)
Canonicalize Floor:
Definition: functions.cpp:611
bool could_extract_minus(const Basic &arg)
Definition: functions.cpp:325
RCP< const Basic > uppergamma(const RCP< const Basic > &s, const RCP< const Basic > &x)
Canonicalize UpperGamma:
Definition: functions.cpp:3153
bool eq(const Basic &a, const Basic &b)
Checks equality for a and b
Definition: basic-inl.h:21
bool is_same_type(const Basic &a, const Basic &b)
Returns true if a and b are exactly the same type T.
Definition: basic-inl.h:49
RCP< const Basic > erfc(const RCP< const Basic > &arg)
Canonicalize Erfc:
Definition: functions.cpp:2927
RCP< const Basic > lambertw(const RCP< const Basic > &arg)
Create a new LambertW instance:
Definition: functions.cpp:1846
RCP< const Basic > atan2(const RCP< const Basic > &num, const RCP< const Basic > &den)
Canonicalize ATan2:
Definition: functions.cpp:1614
RCP< const Basic > gamma(const RCP< const Basic > &arg)
Canonicalize Gamma:
Definition: functions.cpp:3014
RCP< const Basic > dirichlet_eta(const RCP< const Basic > &s)
Create a new Dirichlet_eta instance:
Definition: functions.cpp:2861
RCP< const Basic > csch(const RCP< const Basic > &arg)
Canonicalize Csch:
Definition: functions.cpp:2169
bool neq(const Basic &a, const Basic &b)
Checks inequality for a and b
Definition: basic-inl.h:29
RCP< const Basic > polygamma(const RCP< const Basic > &n_, const RCP< const Basic > &x_)
Canonicalize PolyGamma.
Definition: functions.cpp:3397
int unified_compare(const T &a, const T &b)
Definition: dict.h:205
RCP< const Basic > asech(const RCP< const Basic > &arg)
Canonicalize ASech:
Definition: functions.cpp:2571
RCP< const Basic > cot(const RCP< const Basic > &arg)
Canonicalize Cot:
Definition: functions.cpp:1073
RCP< const Basic > min(const vec_basic &arg)
Canonicalize Min:
Definition: functions.cpp:3659
RCP< const Basic > asec(const RCP< const Basic > &arg)
Canonicalize ASec:
Definition: functions.cpp:1444
RCP< const Basic > atanh(const RCP< const Basic > &arg)
Canonicalize ATanh:
Definition: functions.cpp:2494
RCP< const Basic > sign(const RCP< const Basic > &arg)
Canonicalize Sign.
Definition: functions.cpp:527
RCP< const Basic > abs(const RCP< const Basic > &arg)
Canonicalize Abs:
Definition: functions.cpp:3492
RCP< const Basic > truncate(const RCP< const Basic > &arg)
Canonicalize Truncate:
Definition: functions.cpp:799
RCP< const Basic > levi_civita(const vec_basic &arg)
Canonicalize LeviCivita:
Definition: functions.cpp:2747
RCP< const Basic > loggamma(const RCP< const Basic > &arg)
Canonicalize LogGamma:
Definition: functions.cpp:3226
bool get_pi_shift(const RCP< const Basic > &arg, const Ptr< RCP< const Number >> &n, const Ptr< RCP< const Basic >> &x)
Definition: functions.cpp:203
RCP< const Basic > acoth(const RCP< const Basic > &arg)
Canonicalize ACoth:
Definition: functions.cpp:2534
RCP< const Basic > acosh(const RCP< const Basic > &arg)
Canonicalize ACosh:
Definition: functions.cpp:2461
RCP< const Basic > asinh(const RCP< const Basic > &arg)
Canonicalize ASinh:
Definition: functions.cpp:2376
RCP< const Basic > log(const RCP< const Basic > &arg)
Returns the Natural Logarithm from argument arg
Definition: functions.cpp:1774
RCP< const Basic > acot(const RCP< const Basic > &arg)
Canonicalize ACot:
Definition: functions.cpp:1566