1#ifndef SYMENGINE_SERIALIZE_CEREAL_H
2#define SYMENGINE_SERIALIZE_CEREAL_H
8#include <symengine/utilities/stream_fmt.h>
10#include <cereal/cereal.hpp>
11#include <cereal/version.hpp>
12#include <cereal/types/polymorphic.hpp>
13#include <cereal/types/string.hpp>
14#include <cereal/details/helpers.hpp>
15#include <cereal/types/map.hpp>
16#include <cereal/types/unordered_map.hpp>
17#include <cereal/types/set.hpp>
18#include <cereal/types/vector.hpp>
19#include <cereal/types/utility.hpp>
20#include <cereal/archives/portable_binary.hpp>
25template <
class Archive>
26inline void save_basic(
Archive &
ar,
const Basic &b)
28 const auto t_code = b.get_type_code();
34 <<
" not supported: " << type_code_name(
t_code)
37 <<
", " << b.__str__()
41template <
class Archive>
42inline void save_basic(
Archive &
ar,
const Symbol &b)
46template <
class Archive>
47inline void save_basic(
Archive &
ar,
const Mul &b)
52template <
class Archive>
53inline void save_basic(
Archive &
ar,
const Add &b)
58template <
class Archive>
59inline void save_basic(
Archive &
ar,
const Pow &b)
64template <
typename Archive>
71template <
typename Archive>
74 integer_class
num = get_num(
rat);
75 integer_class
den = get_den(
rat);
81template <
typename Archive>
82void save_basic(
Archive &
ar,
const URatPoly &b)
85 const URatDict &
urd = b.get_poly();
86 size_t l =
urd.size();
88 for (
auto &p :
urd.dict_) {
89 unsigned int first = p.first;
90 const rational_class &
second = p.second;
95template <
class Archive>
96inline void save_basic(
Archive &
ar,
const Integer &b)
100template <
class Archive>
101inline void save_basic(
Archive &
ar,
const RealDouble &b)
105template <
class Archive>
106inline void save_basic(
Archive &
ar,
const Rational &b)
108 ar(b.get_num(), b.get_den());
110template <
class Archive>
111inline void save_basic(
Archive &
ar,
const ComplexBase &b)
113 ar(b.real_part(), b.imaginary_part());
115template <
class Archive>
116inline void save_basic(
Archive &
ar,
const Interval &b)
118 ar(b.get_left_open(), b.get_start(), b.get_right_open(), b.get_end());
120template <
class Archive>
121inline void save_basic(
Archive &
ar,
const BooleanAtom &b)
125template <
class Archive>
126inline void save_basic(
Archive &
ar,
const Infty &b)
128 ar(b.get_direction());
131template <
class Archive>
132inline void save_basic(
Archive &
ar,
const NaN &b)
136template <
class Archive>
137inline void save_basic(
Archive &
ar,
const Constant &b)
141template <
class Archive>
142inline void save_basic(
Archive &
ar,
const OneArgFunction &b)
146template <
class Archive>
147inline void save_basic(
Archive &
ar,
const TwoArgFunction &b)
149 ar(b.get_arg1(), b.get_arg2());
152template <
class Archive>
153inline void save_basic(
Archive &
ar,
const Relational &b)
155 ar(b.get_arg1(), b.get_arg2());
157template <
class Archive>
158inline void save_basic(
Archive &
ar,
const And &b)
160 ar(b.get_container());
162template <
class Archive>
163inline void save_basic(
Archive &
ar,
const Or &b)
165 ar(b.get_container());
167template <
class Archive>
168inline void save_basic(
Archive &
ar,
const Xor &b)
170 ar(b.get_container());
172template <
class Archive>
173inline void save_basic(
Archive &
ar,
const Not &b)
177template <
class Archive>
178inline void save_basic(
Archive &
ar,
const Contains &b)
180 ar(b.get_expr(), b.get_set());
182template <
class Archive>
183inline void save_basic(
Archive &
ar,
const Piecewise &b)
187template <
class Archive>
188inline void save_basic(
Archive &
ar,
const Reals &b)
191template <
class Archive>
192inline void save_basic(
Archive &
ar,
const Rationals &b)
195template <
class Archive>
196inline void save_basic(
Archive &
ar,
const EmptySet &b)
199template <
class Archive>
200inline void save_basic(
Archive &
ar,
const Integers &b)
203template <
class Archive>
204inline void save_basic(
Archive &
ar,
const UniversalSet &b)
207template <
class Archive>
208inline void save_basic(
Archive &
ar,
const Union &b)
210 ar(b.get_container());
212template <
class Archive>
213inline void save_basic(
Archive &
ar,
const Complement &b)
215 ar(b.get_universe(), b.get_container());
217template <
class Archive>
218inline void save_basic(
Archive &
ar,
const ImageSet &b)
220 ar(b.get_symbol(), b.get_expr(), b.get_baseset());
222template <
class Archive>
223inline void save_basic(
Archive &
ar,
const FiniteSet &b)
225 ar(b.get_container());
227template <
class Archive>
228inline void save_basic(
Archive &
ar,
const ConditionSet &b)
230 ar(b.get_symbol(), b.get_condition());
232#ifdef HAVE_SYMENGINE_MPFR
233template <
class Archive>
234inline void save_basic(
Archive &
ar,
const RealMPFR &b)
236 ar(b.__str__(), b.get_prec());
239template <
class Archive>
240inline void save_basic(
Archive &
ar,
const GaloisField &b)
244template <
class Archive>
245inline void save_basic(
Archive &
ar,
const SeriesCoeffInterface &)
249template <
class Archive>
250inline void save_basic(
Archive &
ar,
const MultiArgFunction &b)
254template <
class Archive>
255inline void save_basic(
Archive &
ar,
const FunctionSymbol &b)
257 ar(b.get_name(), b.get_args());
259template <
class Archive>
260inline void save_basic(
Archive &
ar,
const Derivative &b)
262 ar(b.get_arg(), b.get_symbols());
264template <
class Archive>
265inline void save_basic(
Archive &
ar,
const Subs &b)
267 ar(b.get_arg(), b.get_dict());
269template <
class Archive>
270inline void save_basic(
Archive &
ar,
const NumberWrapper &b)
274template <
class Archive>
275inline void save_basic(
Archive &
ar,
const FunctionWrapper &b)
280template <
class Archive>
281inline void save_basic(
Archive &
ar, RCP<const Basic>
const &ptr)
283#if CEREAL_VERSION >= 10301
288 uint32_t
id =
ar.registerSharedPointer(ptr.get());
292 if (
id & cereal::detail::msb_32bit) {
293 ar(ptr->get_type_code());
294 switch (ptr->get_type_code()) {
295#define SYMENGINE_ENUM(type, Class) \
297 save_basic(ar, static_cast<const Class &>(*ptr)); \
299#include "symengine/type_codes.inc"
302 save_basic(
ar, *ptr);
308template <
class Archive,
class T>
313template <
class Archive>
318 return real_double(
val);
320template <
class Archive>
327template <
class Archive>
332template <
class Archive>
339template <
class Archive>
342 RCP<const Number> coeff;
343 map_basic_basic dict;
348template <
class Archive>
351 RCP<const Number> coeff;
357template <
class Archive>
360 RCP<const Basic> base,
exp;
365template <
typename Archive>
372template <
typename Archive>
376 load_helper(
ar,
num);
377 load_helper(
ar,
den);
381template <
typename Archive>
382RCP<const Basic> load_basic(
Archive &
ar,
const URatPoly &b)
384 RCP<const Basic> var;
390 for (
size_t i = 0; i <
l; i++) {
395#if !defined(__clang__) && (__GNUC__ == 4 && __GNUC_MINOR__ <= 7)
403template <
class Archive>
410template <
class Archive>
417template <
class Archive>
424template <
class Archive>
427 RCP<const Number>
num,
den;
431template <
class Archive,
class T>
435 int>::type * =
nullptr)
437 RCP<const Number>
num,
den;
441template <
class Archive>
449template <
class Archive>
456template <
class Archive>
463template <
class Archive>
470template <
class Archive>
477template <
class Archive>
480 RCP<const Boolean>
arg;
484template <
class Archive>
491template <
class Archive>
494 RCP<const Basic>
expr;
499template <
class Archive>
504template <
class Archive>
509template <
class Archive>
514template <
class Archive>
519template <
class Archive>
524template <
class Archive>
531template <
class Archive>
538template <
class Archive>
541 RCP<const Basic> sym,
expr;
546template <
class Archive>
553template <
class Archive>
556 RCP<const Basic> sym;
561#ifdef HAVE_SYMENGINE_MPFR
562template <
class Archive>
571template <
class Archive>
574 RCP<const Basic>
arg;
579template <
class Archive>
582 RCP<const Basic>
arg;
583 map_basic_basic dict;
588template <
class Archive,
class T>
592 int>::type * =
nullptr)
594 RCP<const Basic>
arg;
598template <
class Archive,
class T>
602 int>::type * =
nullptr)
608template <
class Archive>
616template <
class Archive>
624 <<
"Loading of this type is not implemented.");
626template <
class Archive,
class T>
630 int>::type * =
nullptr)
636template <
class Archive,
class T>
640 int>::type * =
nullptr)
646template <
class Archive,
class T>
647RCP<const Basic> load_basic(
654 int>::type * =
nullptr)
661 <<
"Loading of this type is not implemented.");
665template <
class Archive,
class T>
671 if (
id & cereal::detail::msb_32bit) {
675#define SYMENGINE_ENUM(type_enum, Class) \
677 if (not std::is_base_of<T, Class>::value) { \
678 throw std::runtime_error("Cannot convert to type."); \
680 RCP<const Class> dummy_ptr; \
681 ptr = rcp_static_cast<const T>( \
682 rcp_static_cast<const Basic>(load_basic(ar, dummy_ptr))); \
686#include "symengine/type_codes.inc"
697 = std::static_pointer_cast<RCP<const T>>(
ar.getSharedPointer(
id));
The base class for SymEngine.
static RCP< const Number > from_two_nums(const Number &re, const Number &im)
static RCP< const Number > from_two_ints(const Integer &n, const Integer &d)
Main namespace for SymEngine package.
RCP< const Reals > reals()
RCP< const EmptySet > emptyset()
RCP< const UniversalSet > universalset()
RCP< const Integers > integers()
void hash_combine(hash_t &seed, const T &v)
RCP< const Number > addnum(const RCP< const Number > &self, const RCP< const Number > &other)
Add self and other
RCP< const Basic > exp(const RCP< const Basic > &x)
Returns the natural exponential function E**x = pow(E, x)
RCP< const Rationals > rationals()
RCP< const Symbol > symbol(const std::string &name)
inline version to return Symbol
void CEREAL_SAVE_FUNCTION_NAME(Archive &ar, RCP< const T > const &ptr)
Saving for SymEngine::RCP.
void CEREAL_LOAD_FUNCTION_NAME(Archive &ar, RCP< const T > &ptr)
Loading for SymEngine::RCP.
std::enable_if< std::is_integral< T >::value, RCP< constInteger > >::type integer(T i)
RCP< const Constant > constant(const std::string &name)
inline version to return Constant
RCP< const Number > mulnum(const RCP< const Number > &self, const RCP< const Number > &other)
Multiply self and other