24 #ifndef SOM_SERIALIZE_H 25 #define SOM_SERIALIZE_H 28 #include <boost/archive/binary_iarchive.hpp> 29 #include <boost/archive/binary_oarchive.hpp> 30 #include <CCfits/CCfits> 38 template<
typename OArchive, std::
size_t ND,
typename DistFunc>
46 template <std::
size_t ND,
typename DistFunc>
48 somExport<boost::archive::binary_oarchive>(out, som);
51 template <
typename IArchive, std::
size_t ND,
typename DistFunc=Distance::L2<ND>>
57 std::unique_ptr<SOM<ND, DistFunc>> smart_ptr {ptr};
60 return std::move(*smart_ptr);
63 template <std::
size_t ND,
typename DistFunc=Distance::L2<ND>>
65 return somImport<boost::archive::binary_iarchive, ND, DistFunc>(in);
68 template <std::
size_t ND,
typename DistFunc>
75 std::tie(x, y) = som.getSize();
76 long ax_sizes[3] = {(long)x, (
long)y, (long)ND};
77 CCfits::FITS fits (filename, DOUBLE_IMG, n_axes, ax_sizes);
80 fits.pHDU().addKey(
"DISTFUNC",
typeid(DistFunc).name(),
"");
83 std::size_t total_size = x * y * ND;
84 std::valarray<double> data (total_size);
86 for (std::size_t w_i = 0; w_i < ND; ++w_i) {
87 for (
auto& w_arr : som) {
92 fits.pHDU().write(1, total_size, data);
96 template <std::
size_t ND,
typename DistFunc=Distance::L2<ND>>
99 CCfits::FITS fits (filename, CCfits::Read);
102 std::string dist_func_type;
103 fits.pHDU().readKey(
"DISTFUNC", dist_func_type);
104 if (dist_func_type !=
typeid(DistFunc).name()) {
106 << dist_func_type <<
" and is read as " <<
typeid(DistFunc).name();
110 if (fits.pHDU().axes() != 3) {
111 throw Elements::Exception() <<
"Data array in file " << filename <<
" does not have 3 dimensions";
113 if (fits.pHDU().axis(2) != ND) {
115 " should have size " << ND <<
" but was " << fits.pHDU().axis(2);
117 std::size_t x = fits.pHDU().axis(0);
118 std::size_t y = fits.pHDU().axis(1);
121 std::valarray<double> data;
122 fits.pHDU().read(data);
127 for (std::size_t w_i = 0; w_i < ND; ++w_i) {
128 for (
auto& w_arr : result) {
129 w_arr[w_i] = data[i];
134 return std::move(result);
SOM< ND, DistFunc > somImport(std::istream &in)
void somBinaryExport(std::ostream &out, const SOM< ND, DistFunc > &som)
void somExport(std::ostream &out, const SOM< ND, DistFunc > &som)
SOM< ND, DistFunc > somFitsImport(const std::string &filename)
void somFitsExport(const std::string &filename, const SOM< ND, DistFunc > &som)
SOM< ND, DistFunc > somBinaryImport(std::istream &in)