26 #include "function.hpp"
27 #include "serializer.hpp"
28 #include "serializing_stream.hpp"
31 #include "importer.hpp"
32 #include "generic_type.hpp"
33 #include "filesystem_impl.hpp"
44 std::unique_ptr<
std::ostream>(
50 sstream_(
std::move(stream)),
80 default: casadi_error(
"Unknown type" +
str(type));
88 std::string ret =
static_cast<std::stringstream*
>(
sstream_.get())->
str();
89 static_cast<std::stringstream*
>(
sstream_.get())->
str(
"");
94 casadi_assert(
dstream_->peek() == std::char_traits<char>::eof(),
95 "StringDeserializer::decode does not apply: current string not fully consumed yet.");
96 static_cast<std::stringstream*
>(
dstream_.get())->
str(
string);
104 dstream_(
std::move(stream)),
110 new
std::ifstream(fname,
std::ios_base::binary |
std::ios::in))) {
111 if ((
dstream_->rdstate() & std::ifstream::failbit) != 0) {
112 casadi_error(
"Could not open file '" + fname +
"' for reading.");
118 new
std::stringstream(string))) {
130 casadi_assert(
dstream_->peek() != std::char_traits<char>::eof(),
131 "Deserializer reached end of stream. Nothing left to unpack.");
162 std::vector<MX> sorted;
169 std::vector<SX> sorted;
176 std::vector<MX> sorted;
183 std::vector<SX> sorted;
219 if (t==SerializerBase::SerializationType::SERIALIZED_MX_v1) {
222 casadi_assert(t==SerializerBase::SerializationType::SERIALIZED_MX,
224 SerializerBase::SerializationType::SERIALIZED_MX)+
230 if (t==SerializerBase::SerializationType::SERIALIZED_SX_v1) {
233 casadi_assert(t==SerializerBase::SerializationType::SERIALIZED_SX,
235 SerializerBase::SerializationType::SERIALIZED_SX)+
241 if (t==SerializerBase::SerializationType::SERIALIZED_MX_VECTOR_v1) {
244 casadi_assert(t==SerializerBase::SerializationType::SERIALIZED_MX_VECTOR, \
246 SerializerBase::SerializationType::SERIALIZED_MX_VECTOR)+
252 if (t==SerializerBase::SerializationType::SERIALIZED_SX_VECTOR_v1) {
255 casadi_assert(t==SerializerBase::SerializationType::SERIALIZED_SX_VECTOR, \
257 SerializerBase::SerializationType::SERIALIZED_SX_VECTOR)+
262 #define SERIALIZE(TYPE, Type, type) \
263 void SerializerBase::pack(const Type& e) { \
264 serializer().pack(static_cast<char>(SERIALIZED_ ## TYPE));\
265 serializer().pack(e); \
268 Type DeserializerBase::blind_unpack_ ## type() { \
270 deserializer().unpack(ret);\
273 Type DeserializerBase::unpack_ ## type() { \
274 SerializerBase::SerializationType t = pop_type();\
275 casadi_assert(t==SerializerBase::SerializationType::SERIALIZED_ ## TYPE, \
276 "Expected to find a '" + SerializerBase::type_to_string(\
277 SerializerBase::SerializationType::SERIALIZED_ ## TYPE) +\
278 "', but encountered a '" + SerializerBase::type_to_string(t) + "' instead.");\
279 return blind_unpack_ ## type();\
282 #define SERIALIZE_ALL(TYPE, Type, type)\
283 SERIALIZE(TYPE, Type, type)\
284 SERIALIZE(TYPE ## _VECTOR, std::vector< Type >, type ## _vector)
286 SERIALIZE_ALL(SPARSITY,
Sparsity, sparsity)
287 SERIALIZE_ALL(
DM,
DM, dm)
288 SERIALIZE_ALL(LINSOL,
Linsol, linsol)
289 SERIALIZE_ALL(FUNCTION,
Function,
function)
290 SERIALIZE_ALL(GENERICTYPE,
GenericType, generictype)
291 SERIALIZE_ALL(INT, casadi_int,
int)
292 SERIALIZE_ALL(DOUBLE,
double,
double)
293 SERIALIZE_ALL(STRING,
std::
string ,
string)
296 serializer_->
connect(*s.deserializer_);
std::vector< MX > blind_unpack_mx_vector()
Matrix< SXElem > blind_unpack_sx_v1()
Matrix< SXElem > unpack_sx()
std::vector< Matrix< SXElem > > unpack_sx_vector()
std::unique_ptr< DeserializingStream > deserializer_
DeserializingStream & deserializer()
std::vector< MX > blind_unpack_mx_vector_v1()
Matrix< SXElem > blind_unpack_sx()
std::vector< Matrix< SXElem > > blind_unpack_sx_vector_v1()
std::unique_ptr< std::istream > dstream_
std::vector< Matrix< SXElem > > blind_unpack_sx_vector()
DeserializerBase(std::unique_ptr< std::istream > stream)
void connect(SerializerBase &s)
SerializerBase::SerializationType pop_type()
std::vector< MX > unpack_mx_vector()
Helper class for Serialization.
void unpack(Sparsity &e)
Reconstruct an object from the input stream.
FileDeserializer(const std::string &fname)
Advanced deserialization of CasADi objects.
FileSerializer(const std::string &fname, const Dict &opts=Dict())
Advanced serialization of CasADi objects.
static std::vector< SX > order(const std::vector< SX > &expr)
Generic data type, can hold different types such as bool, casadi_int, std::string etc.
Sparse matrix class. SX and DM are specializations.
SerializerBase(std::unique_ptr< std::ostream > stream, const Dict &opts=Dict())
void connect(DeserializerBase &s)
std::unique_ptr< SerializingStream > serializer_
void pack(const Sparsity &e)
std::unique_ptr< std::ostream > sstream_
static std::string type_to_string(SerializationType type)
@ SERIALIZED_FUNCTION_VECTOR
@ SERIALIZED_MX_VECTOR_v1
@ SERIALIZED_STRING_VECTOR
@ SERIALIZED_LINSOL_VECTOR
@ SERIALIZED_GENERICTYPE_VECTOR
@ SERIALIZED_SX_VECTOR_v1
@ SERIALIZED_DOUBLE_VECTOR
@ SERIALIZED_SPARSITY_VECTOR
SerializingStream & serializer()
Helper class for Serialization.
void pack(const Sparsity &e)
Serializes an object to the output stream.
StringDeserializer(const std::string &string)
Advanced deserialization of CasADi objects.
void decode(const std::string &string)
Sets the string to deserialize objects from.
std::string encode()
Returns a string that holds the serialized objects.
StringSerializer(const Dict &opts=Dict())
Advanced serialization of CasADi objects.
std::string str(const T &v)
String representation, any type.
GenericType::Dict Dict
C++ equivalent of Python's dict or MATLAB's struct.