33 std::vector<torch::Tensor> &v) {
35 std::filesystem::path path(location);
37 if (std::filesystem::exists(path)) {
38 if (std::filesystem::is_regular_file(path)) {
40 pugi::xml_document doc;
41 doc.load_file(path.c_str());
42 v.emplace_back(obj.from_xml(doc).as_tensor());
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") {
49 pugi::xml_document doc;
50 doc.load_file(file.path().c_str());
51 v.emplace_back(obj.from_xml(doc).as_tensor());
57 throw std::runtime_error(
58 "The path refers to neither a file nor a directory");
60 throw std::runtime_error(
"The path does not exist");
74 public torch::data::Dataset<
76 torch::data::Example<torch::Tensor, torch::data::example::NoTarget>> {
79 std::vector<torch::Tensor>
G_;
82 std::vector<torch::Tensor>
f_;
87 torch::data::Example<torch::Tensor, torch::data::example::NoTarget>;
92 read_from_xml(location, obj, G_);
96 read_from_xml(location, obj, G_);
102 template <
typename T>
104 std::string label =
"") {
105 G_.emplace_back(obj.from_xml(doc.child(
"xml"),
id, label).as_tensor());
108 template <
typename T>
110 std::string label =
"") {
111 G_.emplace_back(obj.from_xml(doc.child(
"xml"),
id, label).as_tensor());
117 template <
typename T>
119 std::string label =
"") {
120 G_.emplace_back(obj.from_xml(root,
id, label).as_tensor());
123 template <
typename T>
125 std::string label =
"") {
126 G_.emplace_back(obj.from_xml(root,
id, label).as_tensor());
133 read_from_xml(location, obj, f_);
137 read_from_xml(location, obj, f_);
143 template <
typename T>
145 std::string label =
"") {
146 f_.emplace_back(obj.from_xml(doc.child(
"xml"),
id, label).as_tensor());
149 template <
typename T>
151 std::string label =
"") {
152 f_.emplace_back(obj.from_xml(doc.child(
"xml"),
id, label).as_tensor());
158 template <
typename T>
160 std::string label =
"") {
161 f_.emplace_back(obj.from_xml(root,
id, label).as_tensor());
164 template <
typename T>
166 std::string label =
"") {
167 f_.emplace_back(obj.from_xml(root,
id, label).as_tensor());
173 template <
typename T,
typename Func>
175 f_.emplace_back(obj.transform(
func).as_tensor());
178 template <
typename T,
typename Func>
180 f_.emplace_back(obj.transform(
func).as_tensor());
187 std::size_t geo_index = index / (f_.empty() ? 1 : f_.size());
188 std::size_t ref_index = index - geo_index * f_.size();
192 return torch::cat({G_.at(geo_index), f_.at(ref_index)});
194 return G_.at(geo_index);
197 return f_.at(ref_index);
199 throw std::runtime_error(
"No geometry maps and reference data");
204 [[nodiscard]]
inline torch::optional<std::size_t>
size()
const override {
205 return (G_.empty() ? 1 : G_.size()) * (f_.empty() ? 1 : f_.size());
212 public torch::data::Dataset<IgADataset<true>, torch::data::Example<>> {
215 std::vector<torch::Tensor>
G_;
218 std::vector<torch::Tensor>
f_;
221 std::vector<torch::Tensor>
u_;
227 read_from_xml(location, obj, G_);
231 read_from_xml(location, obj, G_);
237 template <
typename T>
239 std::string label =
"") {
240 G_.emplace_back(obj.from_xml(doc.child(
"xml"),
id, label).as_tensor());
243 template <
typename T>
245 std::string label =
"") {
246 G_.emplace_back(obj.from_xml(doc.child(
"xml"),
id, label).as_tensor());
252 template <
typename T>
254 std::string label =
"") {
255 G_.emplace_back(obj.from_xml(root,
id, label).as_tensor());
258 template <
typename T>
260 std::string label =
"") {
261 G_.emplace_back(obj.from_xml(root,
id, label).as_tensor());
268 read_from_xml(location, obj, f_);
272 read_from_xml(location, obj, f_);
278 template <
typename T>
280 std::string label =
"") {
281 f_.emplace_back(obj.from_xml(doc.child(
"xml"),
id, label).as_tensor());
284 template <
typename T>
286 std::string label =
"") {
287 f_.emplace_back(obj.from_xml(doc.child(
"xml"),
id, label).as_tensor());
293 template <
typename T>
295 std::string label =
"") {
296 f_.emplace_back(obj.from_xml(root,
id, label).as_tensor());
299 template <
typename T>
301 std::string label =
"") {
302 f_.emplace_back(obj.from_xml(root,
id, label).as_tensor());
308 template <
typename T,
typename Func>
310 f_.emplace_back(obj.transform(
func).as_tensor());
313 template <
typename T,
typename Func>
315 f_.emplace_back(obj.transform(
func).as_tensor());
321 template <
typename T>
void add_solution(T &obj, std::string location) {
322 read_from_xml(location, obj, u_);
325 template <
typename T>
void add_solution(T &&obj, std::string location) {
326 read_from_xml(location, obj, u_);
332 template <
typename T>
334 std::string label =
"") {
335 u_.emplace_back(obj.from_xml(doc.child(
"xml"),
id, label).as_tensor());
338 template <
typename T>
340 std::string label =
"") {
341 u_.emplace_back(obj.from_xml(doc.child(
"xml"),
id, label).as_tensor());
347 template <
typename T>
349 std::string label =
"") {
350 u_.emplace_back(obj.from_xml(root,
id, label).as_tensor());
353 template <
typename T>
355 std::string label =
"") {
356 u_.emplace_back(obj.from_xml(root,
id, label).as_tensor());
361 inline torch::data::Example<>
get(std::size_t index)
override {
363 std::size_t geo_index = index / (f_.empty() ? 1 : f_.size());
364 std::size_t ref_index = index - geo_index * f_.size();
368 return {torch::cat({G_.at(geo_index), f_.at(ref_index)}), u_.at(index)};
370 return {G_.at(geo_index), u_.at(index)};
373 return {f_.at(ref_index), u_.at(index)};
375 throw std::runtime_error(
"No geometry maps and reference data");
380 [[nodiscard]]
inline torch::optional<std::size_t>
size()
const override {
381 return (G_.empty() ? 1 : G_.size()) * (f_.empty() ? 1 : f_.size());
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
IgA dataset class.
Definition igabase.hpp:69