0

Cereal ライブラリを使用してアルマジロ マトリックスのシリアル化を実装しようとしています。SOにはサンプルがありますhere。残念ながらBoostは使えません。これまでのところ、私はこれを手に入れました。mat_extra_meat.hpp の内部

template<class Archive, class eT>
typename std::enable_if<cereal::traits::is_output_serializable<cereal::BinaryData<eT>, Archive>::value, void>::type
save( Archive & ar, const Mat<eT>& m ) {
    uword n_rows_local, n_cols_local, n_elem_local, vec_state_local;
    std::size_t data_size;
    n_rows_local = m.n_rows;
    n_cols_local = m.n_cols;
    n_elem_local = m.n_elem;
    vec_state_local = m.vec_state;
    ar( n_rows_local, n_cols_local, n_elem_local, vec_state_local );
    data_size = static_cast< std::size_t >( m.n_elem * sizeof( eT ) );
    ar( cereal::binary_data( reinterpret_cast< void * const >( const_cast< eT* >( m.memptr() ) ), data_size ) );
};

template<class Archive, class eT>
typename std::enable_if<cereal::traits::is_input_serializable<cereal::BinaryData<eT>, Archive>::value, void>::type
load( Archive & ar, Mat<eT>& m ) {
    uword n_rows_local, n_cols_local, n_elem_local, vec_state_local;
    std::size_t data_size;
    ar( n_rows_local, n_cols_local, n_elem_local, vec_state_local );
    data_size = static_cast< std::size_t >( n_elem_local * sizeof( eT ) );
    m.set_size( n_rows_local, n_cols_local );
    ar( cereal::binary_data( reinterpret_cast< void * const >( const_cast< eT* >( m.memptr() ) ), data_size ) );
};

void TestArmadilloSerialization() {
    arma::mat xx1 = arma::randn( 10, 20 );
    std::ofstream ofs( "test", std::ios::binary );
    cereal::BinaryOutputArchive o( ofs );
    o( xx1 );
    ofs.close();
    // Now load it.
    arma::mat xx2;
    std::ifstream ifs( "test", std::ios::binary );
    cereal::BinaryInputArchive i( ifs );
    i( xx2 );
}
4

0 に答える 0