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>
25 template <
class Archive>
26 inline void save_basic(Archive &ar,
const Basic &b)
28 const auto t_code = b.get_type_code();
29 throw SerializationError(StreamFmt()
30 << __FILE__ <<
":" << __LINE__
32 <<
": " << __PRETTY_FUNCTION__
34 <<
" not supported: " << type_code_name(t_code)
35 <<
" (" << t_code <<
")"
37 <<
", " << b.__str__()
41 template <
class Archive>
42 inline void save_basic(Archive &ar,
const Symbol &b)
46 template <
class Archive>
47 inline void save_basic(Archive &ar,
const Mul &b)
52 template <
class Archive>
53 inline void save_basic(Archive &ar,
const Add &b)
58 template <
class Archive>
59 inline void save_basic(Archive &ar,
const Pow &b)
64 template <
typename Archive>
65 void save_helper(Archive &ar,
const integer_class &intgr)
71 template <
typename Archive>
72 void save_helper(Archive &ar,
const rational_class &rat)
74 integer_class num = get_num(rat);
75 integer_class den = get_den(rat);
81 template <
typename Archive>
82 void 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;
92 save_helper(ar, second);
95 template <
class Archive>
96 inline void save_basic(Archive &ar,
const Integer &b)
100 template <
class Archive>
101 inline void save_basic(Archive &ar,
const RealDouble &b)
105 template <
class Archive>
106 inline void save_basic(Archive &ar,
const Rational &b)
108 ar(b.get_num(), b.get_den());
110 template <
class Archive>
111 inline void save_basic(Archive &ar,
const ComplexBase &b)
113 ar(b.real_part(), b.imaginary_part());
115 template <
class Archive>
116 inline void save_basic(Archive &ar,
const Interval &b)
118 ar(b.get_left_open(), b.get_start(), b.get_right_open(), b.get_end());
120 template <
class Archive>
121 inline void save_basic(Archive &ar,
const BooleanAtom &b)
125 template <
class Archive>
126 inline void save_basic(Archive &ar,
const Infty &b)
128 ar(b.get_direction());
131 template <
class Archive>
132 inline void save_basic(Archive &ar,
const NaN &b)
136 template <
class Archive>
137 inline void save_basic(Archive &ar,
const Constant &b)
141 template <
class Archive>
142 inline void save_basic(Archive &ar,
const OneArgFunction &b)
146 template <
class Archive>
147 inline void save_basic(Archive &ar,
const TwoArgFunction &b)
149 ar(b.get_arg1(), b.get_arg2());
152 template <
class Archive>
153 inline void save_basic(Archive &ar,
const Relational &b)
155 ar(b.get_arg1(), b.get_arg2());
157 template <
class Archive>
158 inline void save_basic(Archive &ar,
const And &b)
160 ar(b.get_container());
162 template <
class Archive>
163 inline void save_basic(Archive &ar,
const Or &b)
165 ar(b.get_container());
167 template <
class Archive>
168 inline void save_basic(Archive &ar,
const Xor &b)
170 ar(b.get_container());
172 template <
class Archive>
173 inline void save_basic(Archive &ar,
const Not &b)
177 template <
class Archive>
178 inline void save_basic(Archive &ar,
const Contains &b)
180 ar(b.get_expr(), b.get_set());
182 template <
class Archive>
183 inline void save_basic(Archive &ar,
const Piecewise &b)
187 template <
class Archive>
188 inline void save_basic(Archive &ar,
const Reals &b)
191 template <
class Archive>
192 inline void save_basic(Archive &ar,
const Rationals &b)
195 template <
class Archive>
196 inline void save_basic(Archive &ar,
const EmptySet &b)
199 template <
class Archive>
200 inline void save_basic(Archive &ar,
const Integers &b)
203 template <
class Archive>
204 inline void save_basic(Archive &ar,
const UniversalSet &b)
207 template <
class Archive>
208 inline void save_basic(Archive &ar,
const Union &b)
210 ar(b.get_container());
212 template <
class Archive>
213 inline void save_basic(Archive &ar,
const Complement &b)
215 ar(b.get_universe(), b.get_container());
217 template <
class Archive>
218 inline void save_basic(Archive &ar,
const ImageSet &b)
220 ar(b.get_symbol(), b.get_expr(), b.get_baseset());
222 template <
class Archive>
223 inline void save_basic(Archive &ar,
const FiniteSet &b)
225 ar(b.get_container());
227 template <
class Archive>
228 inline void save_basic(Archive &ar,
const ConditionSet &b)
230 ar(b.get_symbol(), b.get_condition());
232 #ifdef HAVE_SYMENGINE_MPFR
233 template <
class Archive>
234 inline void save_basic(Archive &ar,
const RealMPFR &b)
236 ar(b.__str__(), b.get_prec());
239 template <
class Archive>
240 inline void save_basic(Archive &ar,
const GaloisField &b)
242 throw NotImplementedError(
"GaloisField saving is not implemented yet.");
244 template <
class Archive>
245 inline void save_basic(Archive &ar,
const SeriesCoeffInterface &)
247 throw NotImplementedError(
"Series saving is not implemented yet.");
249 template <
class Archive>
250 inline void save_basic(Archive &ar,
const MultiArgFunction &b)
254 template <
class Archive>
255 inline void save_basic(Archive &ar,
const FunctionSymbol &b)
257 ar(b.get_name(), b.get_args());
259 template <
class Archive>
260 inline void save_basic(Archive &ar,
const Derivative &b)
262 ar(b.get_arg(), b.get_symbols());
264 template <
class Archive>
265 inline void save_basic(Archive &ar,
const Subs &b)
267 ar(b.get_arg(), b.get_dict());
269 template <
class Archive>
270 inline void save_basic(Archive &ar,
const NumberWrapper &b)
272 throw NotImplementedError(
"NumberWrapper saving is not implemented yet.");
274 template <
class Archive>
275 inline void save_basic(Archive &ar,
const FunctionWrapper &b)
277 throw NotImplementedError(
"FunctionWrapper saving is not implemented yet.");
280 template <
class Archive>
281 inline void save_basic(Archive &ar, RCP<const Basic>
const &ptr)
283 #if CEREAL_VERSION >= 10301
286 uint32_t
id = ar.registerSharedPointer(sharedPtr);
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"
300 #undef SYMENGINE_ENUM
302 save_basic(ar, *ptr);
308 template <
class Archive,
class T>
311 save_basic(ar, rcp_static_cast<const Basic>(ptr));
313 template <
class Archive>
314 RCP<const Basic> load_basic(Archive &ar, RCP<const RealDouble> &)
318 return real_double(val);
320 template <
class Archive>
321 RCP<const Basic> load_basic(Archive &ar, RCP<const Infty> &)
323 RCP<const Number> direction;
325 return Infty::from_direction(direction);
327 template <
class Archive>
328 RCP<const Basic> load_basic(Archive &ar, RCP<const NaN> &)
330 return rcp_static_cast<const Basic>(Nan);
332 template <
class Archive>
333 RCP<const Basic> load_basic(Archive &ar, RCP<const Symbol> &)
339 template <
class Archive>
340 RCP<const Basic> load_basic(Archive &ar, RCP<const Mul> &)
342 RCP<const Number> coeff;
343 map_basic_basic dict;
346 return make_rcp<const Mul>(coeff,
std::move(dict));
348 template <
class Archive>
349 RCP<const Basic> load_basic(Archive &ar, RCP<const Add> &)
351 RCP<const Number> coeff;
355 return make_rcp<const Add>(coeff,
std::move(dict));
357 template <
class Archive>
358 RCP<const Basic> load_basic(Archive &ar, RCP<const Pow> &)
360 RCP<const Basic> base,
exp;
363 return make_rcp<const Pow>(base,
exp);
365 template <
typename Archive>
366 void load_helper(Archive &ar, integer_class &intgr)
370 intgr = integer_class(
std::move(int_str));
372 template <
typename Archive>
373 void load_helper(Archive &ar,
const rational_class &rat)
375 integer_class num, den;
376 load_helper(ar, num);
377 load_helper(ar, den);
381 template <
typename Archive>
382 RCP<const Basic> load_basic(Archive &ar,
const URatPoly &b)
384 RCP<const Basic> var;
389 auto hint = d.
begin();
390 for (
size_t i = 0; i < l; i++) {
392 rational_class second;
394 load_helper(ar, second);
395 #if !defined(__clang__) && (__GNUC__ == 4 && __GNUC_MINOR__ <= 7)
401 return make_rcp<const URatPoly>(var, URatDict(
std::move(d)));
403 template <
class Archive>
404 RCP<const Basic> load_basic(Archive &ar, RCP<const Integer> &)
408 return integer(integer_class(int_str));
410 template <
class Archive>
411 RCP<const Basic> load_basic(Archive &ar, RCP<const Constant> &)
417 template <
class Archive>
418 RCP<const Basic> load_basic(Archive &ar, RCP<const Rational> &)
420 RCP<const Integer> num, den;
424 template <
class Archive>
425 RCP<const Basic> load_basic(Archive &ar, RCP<const Complex> &)
427 RCP<const Number> num, den;
431 template <
class Archive,
class T>
433 load_basic(Archive &ar, RCP<const T> &,
435 int>::type * =
nullptr)
437 RCP<const Number> num, den;
441 template <
class Archive>
442 RCP<const Basic> load_basic(Archive &ar, RCP<const Interval> &)
444 RCP<const Number> start,
end;
445 bool left_open, right_open;
446 ar(left_open, start, right_open, end);
447 return make_rcp<const Interval>(start, end, left_open, right_open);
449 template <
class Archive>
450 RCP<const Basic> load_basic(Archive &ar, RCP<const BooleanAtom> &)
456 template <
class Archive>
457 RCP<const Basic> load_basic(Archive &ar, RCP<const And> &)
459 set_boolean container;
461 return make_rcp<const And>(
std::move(container));
463 template <
class Archive>
464 RCP<const Basic> load_basic(Archive &ar, RCP<const Or> &)
466 set_boolean container;
468 return make_rcp<const Or>(
std::move(container));
470 template <
class Archive>
471 RCP<const Basic> load_basic(Archive &ar, RCP<const Xor> &)
473 vec_boolean container;
475 return make_rcp<const Xor>(
std::move(container));
477 template <
class Archive>
478 RCP<const Basic> load_basic(Archive &ar, RCP<const Not> &)
480 RCP<const Boolean> arg;
482 return make_rcp<const Not>(arg);
484 template <
class Archive>
485 RCP<const Basic> load_basic(Archive &ar, RCP<const Piecewise> &)
489 return make_rcp<const Piecewise>(
std::move(vec));
491 template <
class Archive>
492 RCP<const Basic> load_basic(Archive &ar, RCP<const Contains> &)
494 RCP<const Basic> expr;
495 RCP<const Set> contains_set;
496 ar(expr, contains_set);
497 return make_rcp<const Contains>(expr, contains_set);
499 template <
class Archive>
500 RCP<const Basic> load_basic(Archive &ar, RCP<const Reals> &)
504 template <
class Archive>
505 RCP<const Basic> load_basic(Archive &ar, RCP<const Rationals> &)
509 template <
class Archive>
510 RCP<const Basic> load_basic(Archive &ar, RCP<const EmptySet> &)
514 template <
class Archive>
515 RCP<const Basic> load_basic(Archive &ar, RCP<const Integers> &)
519 template <
class Archive>
520 RCP<const Basic> load_basic(Archive &ar, RCP<const UniversalSet> &)
524 template <
class Archive>
525 RCP<const Basic> load_basic(Archive &ar, RCP<const Union> &)
529 return make_rcp<const Union>(
std::move(union_set));
531 template <
class Archive>
532 RCP<const Basic> load_basic(Archive &ar, RCP<const Complement> &)
534 RCP<const Set> universe, container;
535 ar(universe, container);
536 return make_rcp<const Complement>(universe, container);
538 template <
class Archive>
539 RCP<const Basic> load_basic(Archive &ar, RCP<const ImageSet> &)
541 RCP<const Basic> sym, expr;
544 return make_rcp<const ImageSet>(sym, expr, base);
546 template <
class Archive>
547 RCP<const Basic> load_basic(Archive &ar, RCP<const FiniteSet> &)
551 return make_rcp<const FiniteSet>(set);
553 template <
class Archive>
554 RCP<const Basic> load_basic(Archive &ar, RCP<const ConditionSet> &)
556 RCP<const Basic> sym;
557 RCP<const Boolean> condition;
559 return make_rcp<const ConditionSet>(sym, condition);
561 #ifdef HAVE_SYMENGINE_MPFR
562 template <
class Archive>
563 RCP<const Basic> load_basic(Archive &ar, RCP<const RealMPFR> &)
568 return make_rcp<const RealMPFR>(mpfr_class(num, prec, 10));
571 template <
class Archive>
572 RCP<const Basic> load_basic(Archive &ar, RCP<const Derivative> &)
574 RCP<const Basic> arg;
577 return make_rcp<const Derivative>(arg,
std::move(set));
579 template <
class Archive>
580 RCP<const Basic> load_basic(Archive &ar, RCP<const Subs> &)
582 RCP<const Basic> arg;
583 map_basic_basic dict;
585 return make_rcp<const Subs>(arg,
std::move(dict));
588 template <
class Archive,
class T>
590 load_basic(Archive &ar, RCP<const T> &,
592 int>::type * =
nullptr)
594 RCP<const Basic> arg;
596 return make_rcp<const T>(arg);
598 template <
class Archive,
class T>
600 load_basic(Archive &ar, RCP<const T> &,
602 int>::type * =
nullptr)
604 RCP<const Basic> arg1, arg2;
606 return make_rcp<const T>(arg1, arg2);
608 template <
class Archive>
609 RCP<const Basic> load_basic(Archive &ar, RCP<const FunctionSymbol> &)
614 return make_rcp<const FunctionSymbol>(name,
std::move(vec));
616 template <
class Archive>
617 RCP<const Basic> load_basic(Archive &ar, RCP<const FunctionWrapper> &)
619 throw SerializationError(StreamFmt()
620 << __FILE__ <<
":" << __LINE__
622 <<
": " << __PRETTY_FUNCTION__
624 <<
"Loading of this type is not implemented.");
626 template <
class Archive,
class T>
628 load_basic(Archive &ar, RCP<const T> &,
630 int>::type * =
nullptr)
634 return make_rcp<const T>(
std::move(args));
636 template <
class Archive,
class T>
638 load_basic(Archive &ar, RCP<const T> &,
640 int>::type * =
nullptr)
642 RCP<const Basic> arg1, arg2;
644 return make_rcp<const T>(arg1, arg2);
646 template <
class Archive,
class T>
647 RCP<const Basic> load_basic(
648 Archive &ar, RCP<const T> &,
654 int>::type * =
nullptr)
656 throw SerializationError(StreamFmt()
657 << __FILE__ <<
":" << __LINE__
659 <<
": " << __PRETTY_FUNCTION__
661 <<
"Loading of this type is not implemented.");
665 template <
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"
687 #undef SYMENGINE_ENUM
694 ar.registerSharedPointer(
id, sharedPtr);
697 = std::static_pointer_cast<RCP<const T>>(ar.getSharedPointer(
id));
698 ptr = *sharedPtr.
get();
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)
T emplace_hint(T... args)
Main namespace for SymEngine package.
std::enable_if< std::is_integral< T >::value, RCP< const Integer > >::type integer(T i)
RCP< const Symbol > symbol(const std::string &name)
inline version to return Symbol
RCP< const Number > mulnum(const RCP< const Number > &self, const RCP< const Number > &other)
Multiply self and other
RCP< const Reals > reals()
RCP< const EmptySet > emptyset()
RCP< const Integers > integers()
RCP< const Basic > exp(const RCP< const Basic > &x)
Returns the natural exponential function E**x = pow(E, x)
RCP< const UniversalSet > universalset()
RCP< const Constant > constant(const std::string &name)
inline version to return Constant
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.
RCP< const Rationals > rationals()
RCP< const Number > addnum(const RCP< const Number > &self, const RCP< const Number > &other)
Add self and other