text_archive.hpp 3.49 KB
Newer Older
1
2
3
4
#include <cassert>
#include <iostream>
#include <sstream>
#include <string>
5

6
7
// Quick hack for definition of 'I' in <complex.h>
#undef I
8
#include <boost/filesystem.hpp>
9

10
11
12
13
14
15
16
17
#include <Eigen/Core>

namespace limbo {
    namespace serialize {

        class TextArchive {
        public:
            TextArchive(const std::string& dir_name) : _dir_name(dir_name),
18
                                                       _fmt(Eigen::FullPrecision, Eigen::DontAlignCols, " ", "\n", "", "") {}
19
20

            /// write an Eigen::Matrix*
21
            void save(const Eigen::MatrixXd& v, const std::string& object_name) const
22
23
24
25
26
            {
                _create_directory();
                std::ofstream ofs(fname(object_name).c_str());
                ofs << v.format(_fmt) << std::endl;
            }
27

28
29
            /// write a vector of Eigen::Vector*
            template <typename T>
30
            void save(const std::vector<T>& v, const std::string& object_name) const
31
32
33
34
            {
                _create_directory();
                std::ofstream ofs(fname(object_name).c_str());
                for (auto& x : v) {
35
                    ofs << x.transpose().format(_fmt) << std::endl;
36
37
38
39
40
                }
            }

            /// load an Eigen matrix (or vector)
            template <typename M>
41
            void load(M& m, const std::string& object_name) const
42
43
44
45
46
47
48
49
50
51
            {
                auto values = _load(object_name);
                m.resize(values.size(), values[0].size());
                for (size_t i = 0; i < values.size(); ++i)
                    for (size_t j = 0; j < values[i].size(); ++j)
                        m(i, j) = values[i][j];
            }

            /// load a vector of Eigen::Vector*
            template <typename V>
52
            void load(std::vector<V>& m_list, const std::string& object_name) const
53
54
            {
                m_list.clear();
55
                auto values = _load(object_name);
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
                assert(!values.empty());
                for (size_t i = 0; i < values.size(); ++i) {
                    V v(values[i].size());
                    for (size_t j = 0; j < values[i].size(); ++j)
                        v(j) = values[i][j];
                    m_list.push_back(v);
                }
                assert(!m_list.empty());
            }

            std::string fname(const std::string& object_name) const
            {
                return _dir_name + "/" + object_name + ".dat";
            }

        protected:
            std::string _dir_name;
73
74
            Eigen::IOFormat _fmt;

75
            void _create_directory() const
76
77
78
79
            {
                boost::filesystem::path my_path(_dir_name);
                boost::filesystem::create_directory(my_path);
            }
80

81
            std::vector<std::vector<double>> _load(const std::string& object_name) const
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
            {
                std::ifstream ifs(fname(object_name).c_str());
                assert(ifs.good() && "file not found");
                std::string line;
                std::vector<std::vector<double>> v;
                while (std::getline(ifs, line)) {
                    std::stringstream line_stream(line);
                    std::string cell;
                    std::vector<double> line;
                    while (std::getline(line_stream, cell, ' '))
                        line.push_back(std::stod(cell));
                    v.push_back(line);
                }
                assert(!v.empty() && "empty file");
                return v;
            }
        };
    } // namespace serialize
} // namespace limbo