24#ifndef SOM_SERIALIZE_H
25#define SOM_SERIALIZE_H
31#include <CCfits/CCfits>
32#include <boost/archive/binary_iarchive.hpp>
33#include <boost/archive/binary_oarchive.hpp>
39template <
typename OArchive,
typename DistFunc>
47template <
typename DistFunc>
49 somExport<boost::archive::binary_oarchive>(out, som);
52template <
typename IArchive,
typename DistFunc = Distance::L2>
64template <
typename DistFunc = Distance::L2>
66 return somImport<boost::archive::binary_iarchive, DistFunc>(in);
69template <
typename DistFunc>
77 long ax_sizes[3] = {long(x), long(y), long(som.getDimensions())};
78 CCfits::FITS fits(filename, DOUBLE_IMG, n_axes, ax_sizes);
81 fits.pHDU().addKey(
"DISTFUNC",
typeid(DistFunc).name(),
"");
84 std::size_t total_size = x * y * som.getDimensions();
87 for (
std::size_t w_i = 0; w_i < som.getDimensions(); ++w_i) {
88 for (
auto& w_arr : som) {
93 fits.pHDU().write(1, total_size, data);
96template <
typename DistFunc = Distance::L2>
99 CCfits::FITS fits(filename, CCfits::Read);
103 fits.pHDU().readKey(
"DISTFUNC", dist_func_type);
104 if (dist_func_type !=
typeid(DistFunc).name()) {
105 throw Elements::Exception() <<
"Incompatible DistFunc parameter. File contains SOM with " << dist_func_type
106 <<
" 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";
119 fits.pHDU().read(data);
125 for (
auto w_arr : result) {
126 w_arr[w_i] = data[i];
void somExport(std::ostream &out, const SOM< DistFunc > &som)
void somBinaryExport(std::ostream &out, const SOM< DistFunc > &som)
SOM< DistFunc > somImport(std::istream &in)
SOM< DistFunc > somBinaryImport(std::istream &in)
SOM< DistFunc > somFitsImport(const std::string &filename)
void somFitsExport(const std::string &filename, const SOM< DistFunc > &som)