Ariles
Loading...
Searching...
No Matches
writer.cpp
Go to the documentation of this file.
1/**
2 @file
3 @author Alexander Sherikov
4
5 @copyright 2018-2026 Alexander Sherikov, Licensed under the Apache License, Version 2.0.
6 (see @ref LICENSE or http://www.apache.org/licenses/LICENSE-2.0)
7
8 @brief
9*/
10
12
13#include <iostream>
14#include <fstream>
15#include <iomanip>
16#include <cmath>
17#include <stack>
18
19namespace ariles2
20{
21 namespace ns_python
22 {
23 namespace impl
24 {
26
28 public serialization::NodeStackBase<serialization::Node<std::string>>
29 {
30 public:
32
33 public:
34 template <class... t_Args>
35 explicit Writer(t_Args &&...args) : FileVisitorImplementation(std::forward<t_Args>(args)...)
36 {
37 }
38
39 void clear()
40 {
41 node_stack_.clear();
42 }
43 }; // end of Writer class
44 } // namespace impl
45
46
47 // Implement the wrapper methods in the outer ns_python namespace
48 Writer::Writer(const std::string &file_name)
49 {
50 makeImplPtr(file_name);
51 }
52
53
54 Writer::Writer(std::ostream &output_stream)
55 {
56 makeImplPtr(output_stream);
57 }
58
59
61 {
62 impl_->output_stream_->flush();
63 }
64
65
66 void Writer::startRoot(const std::string &name, const Parameters &)
67 {
69 impl_->clear();
70
71 if (name.empty())
72 {
73 impl_->emplace("ariles");
74 }
75 else
76 {
77 impl_->emplace(name);
78 }
79
80 *impl_->output_stream_ //
81 << std::setprecision(std::numeric_limits<double>::digits10) //
82 << "import numpy\n" //
83 << "\n" //
84 << impl_->back().node_ << " = ";
85 }
86
87
88 void Writer::startMap(const Parameters &, const std::size_t)
89 {
90 *impl_->output_stream_ << "{";
91 }
92
93 void Writer::startMapEntry(const std::string &map_name)
94 {
95 *impl_->output_stream_ << "'" << map_name << "':";
96 impl_->emplace(map_name);
97 }
98
99
101 {
102 *impl_->output_stream_ << ",";
103 impl_->pop();
104 }
105
107 {
108 *impl_->output_stream_ << "}";
109 }
110
111
112 void Writer::startArray(const std::size_t size, const bool)
113 {
114 *impl_->output_stream_ << "[";
115 impl_->emplace(impl_->back().node_, 0, size);
116 }
117
119 {
120 *impl_->output_stream_ << "]";
121 impl_->pop();
122 }
123
124
126 {
127 impl_->shiftArray();
128 *impl_->output_stream_ << ",";
129 }
130
131
132 void Writer::startVector(const std::size_t)
133 {
134 *impl_->output_stream_ << "numpy.array([";
135 impl_->emplace(impl_->back().node_, impl::Writer::NodeWrapper::Type::VECTOR);
136 }
137
139 {
140 *impl_->output_stream_ << ",";
141 }
142
144 {
145 *impl_->output_stream_ << "])"; // Close the numpy array
146 impl_->pop();
147 }
148
149
151 const bool,
152 const std::size_t,
153 const std::size_t,
154 const Parameters &)
155 {
156 *impl_->output_stream_ << "numpy.array([";
157 impl_->emplace(impl_->back().node_, impl::Writer::NodeWrapper::Type::MATRIX);
158 }
159
160 void Writer::endMatrix(const bool, const Parameters &)
161 {
162 *impl_->output_stream_ << "])"; // Close the numpy matrix
163 impl_->pop();
164 }
165
166
167 void Writer::startMatrixRow(const std::size_t, const Parameters &)
168 {
169 *impl_->output_stream_ << "[";
170 }
171
173 {
174 *impl_->output_stream_ << "],";
175 }
176
177
179 {
180 *impl_->output_stream_ << ",";
181 }
182
183
184
185#define ARILES2_BASIC_TYPE(type) \
186 void Writer::writeElement(const type &element, const Parameters &) \
187 { \
188 *impl_->output_stream_ << element; \
189 }
190
192
193#undef ARILES2_BASIC_TYPE
194
195#define ARILES2_BASIC_TYPE(type) \
196 void Writer::writeElement(const type &element, const Parameters &) \
197 { \
198 if (std::isnan(element)) \
199 { \
200 *impl_->output_stream_ << "float('nan')"; \
201 } \
202 else if (std::isinf(element)) \
203 { \
204 *impl_->output_stream_ << (element > 0 ? "float('inf')" : "float('-inf')"); \
205 } \
206 else \
207 { \
208 *impl_->output_stream_ << element; \
209 } \
210 }
211
213
214#undef ARILES2_BASIC_TYPE
215
216 void Writer::writeElement(const bool &element, const Parameters &)
217 {
218 *impl_->output_stream_ << (element ? "True" : "False");
219 }
220
221 void Writer::writeElement(const std::string &element, const Parameters &)
222 {
223 *impl_->output_stream_ << "'" << element << "'";
224 }
225 } // namespace ns_python
226} // namespace ariles2
void flush()
Flush the configuration to the output.
Definition writer.cpp:60
void startMatrix(const bool dynamic, const std::size_t cols, const std::size_t rows, const Parameters &param)
Definition writer.cpp:150
void endMatrix(const bool dynamic, const Parameters &param)
Definition writer.cpp:160
void endMap()
Ends a nested map in the configuration file.
Definition writer.cpp:106
void startArray(const std::size_t size, const bool=false)
Definition writer.cpp:112
Writer(const std::string &file_name)
Definition writer.cpp:48
void startMapEntry(const std::string &map_name)
Starts a nested map in the configuration file.
Definition writer.cpp:93
void startRoot(const std::string &name, const Parameters &)
Definition writer.cpp:66
void endMatrixRow(const Parameters &param)
Definition writer.cpp:172
void startMatrixRow(const std::size_t cols, const Parameters &param)
Definition writer.cpp:167
void startVector(const std::size_t size)
Definition writer.cpp:132
void startMap(const Parameters &, const std::size_t)
Starts a nested map in the configuration file.
Definition writer.cpp:88
std::vector< serialization::Node< std::string > > node_stack_
FileVisitorImplementation(const std::string &file_name)
Definition write.h:384
void writeElement(const std::complex< t_Scalar > &entry, const Parameters &param)
Definition write.h:264
#define ARILES2_BASIC_REAL_TYPES_LIST
Definition helpers.h:59
#define ARILES2_BASIC_INTEGER_TYPES_LIST
Definition helpers.h:55
#define CPPUT_TRACE_FUNCTION
Definition trace.h:126