IgANet
IGAnets - Isogeometric Analysis Networks
Loading...
Searching...
No Matches
igabase.hpp
Go to the documentation of this file.
1
15#pragma once
16
17#include <filesystem>
18#include <vector>
19
20#include <core/core.hpp>
21
22namespace iganet {
23
29protected:
31 template <typename T>
32 inline void read_from_xml(const std::string &location, T &obj,
33 std::vector<torch::Tensor> &v) {
34
35 std::filesystem::path path(location);
36
37 if (std::filesystem::exists(path)) {
38 if (std::filesystem::is_regular_file(path)) {
39 try {
40 pugi::xml_document doc;
41 doc.load_file(path.c_str());
42 v.emplace_back(obj.from_xml(doc).as_tensor());
43 } catch (...) {
44 }
45 } else if (std::filesystem::is_directory(path)) {
46 for (const auto &file : std::filesystem::directory_iterator(path)) {
47 if (file.is_regular_file() && file.path().extension() == ".xml") {
48 try {
49 pugi::xml_document doc;
50 doc.load_file(file.path().c_str());
51 v.emplace_back(obj.from_xml(doc).as_tensor());
52 } catch (...) {
53 }
54 }
55 }
56 } else
57 throw std::runtime_error(
58 "The path refers to neither a file nor a directory");
59 } else
60 throw std::runtime_error("The path does not exist");
61 }
62};
63
69template <bool solution = false> class IgADataset;
70
71template <>
72class IgADataset<false>
73 : public IgADatasetBase,
74 public torch::data::Dataset<
75 IgADataset<false>,
76 torch::data::Example<torch::Tensor, torch::data::example::NoTarget>> {
77private:
79 std::vector<torch::Tensor> G_;
80
82 std::vector<torch::Tensor> f_;
83
84public:
87 torch::data::Example<torch::Tensor, torch::data::example::NoTarget>;
88
91 template <typename T> void add_geometryMap(T &obj, std::string location) {
92 read_from_xml(location, obj, G_);
93 }
94
95 template <typename T> void add_geometryMap(T &&obj, std::string location) {
96 read_from_xml(location, obj, G_);
97 }
99
102 template <typename T>
103 void add_geometryMap(T &obj, const pugi::xml_document &doc, int id = 0,
104 std::string label = "") {
105 G_.emplace_back(obj.from_xml(doc.child("xml"), id, label).as_tensor());
106 }
107
108 template <typename T>
109 void add_geometryMap(T &&obj, const pugi::xml_document &doc, int id = 0,
110 std::string label = "") {
111 G_.emplace_back(obj.from_xml(doc.child("xml"), id, label).as_tensor());
112 }
114
117 template <typename T>
118 void add_geometryMap(T &obj, const pugi::xml_node &root, int id = 0,
119 std::string label = "") {
120 G_.emplace_back(obj.from_xml(root, id, label).as_tensor());
121 }
122
123 template <typename T>
124 void add_geometryMap(T &&obj, const pugi::xml_node &root, int id = 0,
125 std::string label = "") {
126 G_.emplace_back(obj.from_xml(root, id, label).as_tensor());
127 }
129
132 template <typename T> void add_referenceData(T &obj, std::string location) {
133 read_from_xml(location, obj, f_);
134 }
135
136 template <typename T> void add_referenceData(T &&obj, std::string location) {
137 read_from_xml(location, obj, f_);
138 }
140
143 template <typename T>
144 void add_referenceData(T &obj, const pugi::xml_document &doc, int id = 0,
145 std::string label = "") {
146 f_.emplace_back(obj.from_xml(doc.child("xml"), id, label).as_tensor());
147 }
148
149 template <typename T>
150 void add_referenceData(T &&obj, const pugi::xml_document &doc, int id = 0,
151 std::string label = "") {
152 f_.emplace_back(obj.from_xml(doc.child("xml"), id, label).as_tensor());
153 }
155
158 template <typename T>
159 void add_referenceData(T &obj, const pugi::xml_node &root, int id = 0,
160 std::string label = "") {
161 f_.emplace_back(obj.from_xml(root, id, label).as_tensor());
162 }
163
164 template <typename T>
165 void add_referenceData(T &&obj, const pugi::xml_node &root, int id = 0,
166 std::string label = "") {
167 f_.emplace_back(obj.from_xml(root, id, label).as_tensor());
168 }
170
173 template <typename T, typename Func>
174 void add_referenceData(T &obj, Func func) {
175 f_.emplace_back(obj.transform(func).as_tensor());
176 }
177
178 template <typename T, typename Func>
179 void add_referenceData(T &&obj, Func func) {
180 f_.emplace_back(obj.transform(func).as_tensor());
181 }
183
185 inline example_type get(std::size_t index) override {
186
187 std::size_t geo_index = index / (f_.empty() ? 1 : f_.size());
188 std::size_t ref_index = index - geo_index * f_.size();
189
190 if (!G_.empty()) {
191 if (!f_.empty())
192 return torch::cat({G_.at(geo_index), f_.at(ref_index)});
193 else
194 return G_.at(geo_index);
195 } else {
196 if (!f_.empty())
197 return f_.at(ref_index);
198 else
199 throw std::runtime_error("No geometry maps and reference data");
200 }
201 };
202
203 // @brief Return the total size of the data set
204 [[nodiscard]] inline torch::optional<std::size_t> size() const override {
205 return (G_.empty() ? 1 : G_.size()) * (f_.empty() ? 1 : f_.size());
206 }
207};
208
209template <>
210class IgADataset<true>
211 : public IgADatasetBase,
212 public torch::data::Dataset<IgADataset<true>, torch::data::Example<>> {
213private:
215 std::vector<torch::Tensor> G_;
216
218 std::vector<torch::Tensor> f_;
219
221 std::vector<torch::Tensor> u_;
222
223public:
226 template <typename T> void add_geometryMap(T &obj, std::string location) {
227 read_from_xml(location, obj, G_);
228 }
229
230 template <typename T> void add_geometryMap(T &&obj, std::string location) {
231 read_from_xml(location, obj, G_);
232 }
234
237 template <typename T>
238 void add_geometryMap(T &obj, const pugi::xml_document &doc, int id = 0,
239 std::string label = "") {
240 G_.emplace_back(obj.from_xml(doc.child("xml"), id, label).as_tensor());
241 }
242
243 template <typename T>
244 void add_geometryMap(T &&obj, const pugi::xml_document &doc, int id = 0,
245 std::string label = "") {
246 G_.emplace_back(obj.from_xml(doc.child("xml"), id, label).as_tensor());
247 }
249
252 template <typename T>
253 void add_geometryMap(T &obj, const pugi::xml_node &root, int id = 0,
254 std::string label = "") {
255 G_.emplace_back(obj.from_xml(root, id, label).as_tensor());
256 }
257
258 template <typename T>
259 void add_geometryMap(T &&obj, const pugi::xml_node &root, int id = 0,
260 std::string label = "") {
261 G_.emplace_back(obj.from_xml(root, id, label).as_tensor());
262 }
264
267 template <typename T> void add_referenceData(T &obj, std::string location) {
268 read_from_xml(location, obj, f_);
269 }
270
271 template <typename T> void add_referenceData(T &&obj, std::string location) {
272 read_from_xml(location, obj, f_);
273 }
275
278 template <typename T>
279 void add_referenceData(T &obj, const pugi::xml_document &doc, int id = 0,
280 std::string label = "") {
281 f_.emplace_back(obj.from_xml(doc.child("xml"), id, label).as_tensor());
282 }
283
284 template <typename T>
285 void add_referenceData(T &&obj, const pugi::xml_document &doc, int id = 0,
286 std::string label = "") {
287 f_.emplace_back(obj.from_xml(doc.child("xml"), id, label).as_tensor());
288 }
290
293 template <typename T>
294 void add_referenceData(T &obj, const pugi::xml_node &root, int id = 0,
295 std::string label = "") {
296 f_.emplace_back(obj.from_xml(root, id, label).as_tensor());
297 }
298
299 template <typename T>
300 void add_referenceData(T &&obj, const pugi::xml_node &root, int id = 0,
301 std::string label = "") {
302 f_.emplace_back(obj.from_xml(root, id, label).as_tensor());
303 }
305
308 template <typename T, typename Func>
309 void add_referenceData(T &obj, Func func) {
310 f_.emplace_back(obj.transform(func).as_tensor());
311 }
312
313 template <typename T, typename Func>
314 void add_referenceData(T &&obj, Func func) {
315 f_.emplace_back(obj.transform(func).as_tensor());
316 }
318
321 template <typename T> void add_solution(T &obj, std::string location) {
322 read_from_xml(location, obj, u_);
323 }
324
325 template <typename T> void add_solution(T &&obj, std::string location) {
326 read_from_xml(location, obj, u_);
327 }
329
332 template <typename T>
333 void add_solution(T &obj, const pugi::xml_document &doc, int id = 0,
334 std::string label = "") {
335 u_.emplace_back(obj.from_xml(doc.child("xml"), id, label).as_tensor());
336 }
337
338 template <typename T>
339 void add_solution(T &&obj, const pugi::xml_document &doc, int id = 0,
340 std::string label = "") {
341 u_.emplace_back(obj.from_xml(doc.child("xml"), id, label).as_tensor());
342 }
344
347 template <typename T>
348 void add_solution(T &obj, const pugi::xml_node &root, int id = 0,
349 std::string label = "") {
350 u_.emplace_back(obj.from_xml(root, id, label).as_tensor());
351 }
352
353 template <typename T>
354 void add_solution(T &&obj, const pugi::xml_node &root, int id = 0,
355 std::string label = "") {
356 u_.emplace_back(obj.from_xml(root, id, label).as_tensor());
357 }
359
361 inline torch::data::Example<> get(std::size_t index) override {
362
363 std::size_t geo_index = index / (f_.empty() ? 1 : f_.size());
364 std::size_t ref_index = index - geo_index * f_.size();
365
366 if (!G_.empty()) {
367 if (!f_.empty())
368 return {torch::cat({G_.at(geo_index), f_.at(ref_index)}), u_.at(index)};
369 else
370 return {G_.at(geo_index), u_.at(index)};
371 } else {
372 if (!f_.empty())
373 return {f_.at(ref_index), u_.at(index)};
374 else
375 throw std::runtime_error("No geometry maps and reference data");
376 }
377 };
378
379 // @brief Return the total size of the data set
380 [[nodiscard]] inline torch::optional<std::size_t> size() const override {
381 return (G_.empty() ? 1 : G_.size()) * (f_.empty() ? 1 : f_.size());
382 }
383};
385
386} // namespace iganet
void add_referenceData(T &&obj, const pugi::xml_node &root, int id=0, std::string label="")
Adds a reference data set from XML node.
Definition igabase.hpp:165
void add_referenceData(T &&obj, std::string location)
Adds a reference data set from file.
Definition igabase.hpp:136
void add_referenceData(T &obj, Func func)
Adds a reference data set from XML node.
Definition igabase.hpp:174
void add_referenceData(T &obj, const pugi::xml_node &root, int id=0, std::string label="")
Adds a reference data set from XML node.
Definition igabase.hpp:159
std::vector< torch::Tensor > G_
Vector of tensors representing the geometry maps.
Definition igabase.hpp:79
std::vector< torch::Tensor > f_
Vector of tensors representing the reference data.
Definition igabase.hpp:82
void add_referenceData(T &obj, std::string location)
Adds a reference data set from file.
Definition igabase.hpp:132
void add_geometryMap(T &&obj, const pugi::xml_node &root, int id=0, std::string label="")
Adds a geometry map from XML node.
Definition igabase.hpp:124
void add_geometryMap(T &obj, const pugi::xml_document &doc, int id=0, std::string label="")
Adds a geometry map from XML object.
Definition igabase.hpp:103
void add_geometryMap(T &&obj, std::string location)
Adds a geometry map from file.
Definition igabase.hpp:95
void add_referenceData(T &&obj, const pugi::xml_document &doc, int id=0, std::string label="")
Adds a reference data set from XML object.
Definition igabase.hpp:150
void add_geometryMap(T &&obj, const pugi::xml_document &doc, int id=0, std::string label="")
Adds a geometry map from XML object.
Definition igabase.hpp:109
torch::data::Example< torch::Tensor, torch::data::example::NoTarget > example_type
Example type.
Definition igabase.hpp:87
void add_geometryMap(T &obj, std::string location)
Adds a geometry map from file.
Definition igabase.hpp:91
void add_referenceData(T &&obj, Func func)
Adds a reference data set from XML node.
Definition igabase.hpp:179
example_type get(std::size_t index) override
Returns the data set at location index.
Definition igabase.hpp:185
torch::optional< std::size_t > size() const override
Definition igabase.hpp:204
void add_referenceData(T &obj, const pugi::xml_document &doc, int id=0, std::string label="")
Adds a reference data set from XML object.
Definition igabase.hpp:144
void add_geometryMap(T &obj, const pugi::xml_node &root, int id=0, std::string label="")
Adds a geometry map from XML node.
Definition igabase.hpp:118
torch::optional< std::size_t > size() const override
Definition igabase.hpp:380
std::vector< torch::Tensor > G_
Vector of tensors representing the geometry maps.
Definition igabase.hpp:215
void add_geometryMap(T &&obj, const pugi::xml_node &root, int id=0, std::string label="")
Adds a geometry map from XML node.
Definition igabase.hpp:259
void add_geometryMap(T &obj, const pugi::xml_document &doc, int id=0, std::string label="")
Adds a geometry map from XML object.
Definition igabase.hpp:238
void add_referenceData(T &obj, Func func)
Adds a reference data set from XML node.
Definition igabase.hpp:309
void add_referenceData(T &&obj, const pugi::xml_document &doc, int id=0, std::string label="")
Adds a reference data set from XML object.
Definition igabase.hpp:285
void add_solution(T &obj, const pugi::xml_document &doc, int id=0, std::string label="")
Adds a solution from XML object.
Definition igabase.hpp:333
std::vector< torch::Tensor > f_
Vector of tensors representing the reference data.
Definition igabase.hpp:218
void add_referenceData(T &&obj, Func func)
Adds a reference data set from XML node.
Definition igabase.hpp:314
void add_geometryMap(T &&obj, std::string location)
Adds a geometry map from file.
Definition igabase.hpp:230
void add_referenceData(T &&obj, std::string location)
Adds a reference data set from file.
Definition igabase.hpp:271
void add_solution(T &&obj, const pugi::xml_document &doc, int id=0, std::string label="")
Adds a solution from XML object.
Definition igabase.hpp:339
torch::data::Example get(std::size_t index) override
Returns the data set at location index.
Definition igabase.hpp:361
void add_referenceData(T &obj, std::string location)
Adds a reference data set from file.
Definition igabase.hpp:267
void add_referenceData(T &&obj, const pugi::xml_node &root, int id=0, std::string label="")
Adds a reference data set from XML node.
Definition igabase.hpp:300
void add_solution(T &&obj, const pugi::xml_node &root, int id=0, std::string label="")
Adds a solution from XML node.
Definition igabase.hpp:354
void add_referenceData(T &obj, const pugi::xml_document &doc, int id=0, std::string label="")
Adds a reference data set from XML object.
Definition igabase.hpp:279
void add_solution(T &obj, std::string location)
Adds a solution from file.
Definition igabase.hpp:321
void add_solution(T &obj, const pugi::xml_node &root, int id=0, std::string label="")
Adds a solution from XML node.
Definition igabase.hpp:348
void add_solution(T &&obj, std::string location)
Adds a solution from file.
Definition igabase.hpp:325
std::vector< torch::Tensor > u_
Vector of tensors representing the solution data.
Definition igabase.hpp:221
void add_geometryMap(T &&obj, const pugi::xml_document &doc, int id=0, std::string label="")
Adds a geometry map from XML object.
Definition igabase.hpp:244
void add_referenceData(T &obj, const pugi::xml_node &root, int id=0, std::string label="")
Adds a reference data set from XML node.
Definition igabase.hpp:294
void add_geometryMap(T &obj, std::string location)
Adds a geometry map from file.
Definition igabase.hpp:226
void add_geometryMap(T &obj, const pugi::xml_node &root, int id=0, std::string label="")
Adds a geometry map from XML node.
Definition igabase.hpp:253
IgA dataset base class.
Definition igabase.hpp:28
void read_from_xml(const std::string &location, T &obj, std::vector< torch::Tensor > &v)
Reads a function space from file.
Definition igabase.hpp:32
Core components.
Definition core.hpp:72
IgA dataset class.
Definition igabase.hpp:69