PolyFEM
Loading...
Searching...
No Matches
ResourceIO.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <polyfem/Common.hpp>
4
5#include <Eigen/Core>
6
7#include <array>
8#include <filesystem>
9#include <istream>
10#include <map>
11#include <memory>
12#include <mutex>
13#include <string>
14#include <vector>
15
16namespace polyfem::io
17{
20 {
21 public:
22 virtual ~ResourceIO() = default;
23
24 virtual std::unique_ptr<const ResourceIO> with_root(const std::string &root) const = 0;
26 virtual std::string canonical_path(const std::string &path) const = 0;
27
28 virtual bool exists(const std::string &path) const = 0;
29 virtual bool is_group(const std::string &path) const = 0;
30 virtual std::vector<std::string> list(const std::string &path) const = 0;
33 std::vector<std::string> glob(const std::string &pattern) const;
34 virtual std::unique_ptr<std::istream> open(const std::string &path, bool binary) const = 0;
35 virtual std::string read_string(const std::string &path) const;
36 virtual Eigen::MatrixXd read_matrix(const std::string &path) const = 0;
37 virtual Eigen::MatrixXi read_int_matrix(const std::string &path) const = 0;
38 virtual std::vector<double> read_double_vector(const std::string &path) const = 0;
39 virtual std::vector<int> read_int_vector(const std::string &path) const = 0;
40 virtual std::vector<long> read_long_vector(const std::string &path) const = 0;
41 virtual bool has_attribute(const std::string &path, const std::string &name) const = 0;
42 virtual long read_integer_attribute(const std::string &path, const std::string &name) const = 0;
43 virtual std::string read_string_attribute(const std::string &path, const std::string &name) const = 0;
44 virtual std::array<long, 2> read_shape_attribute(
45 const std::string &path, const std::string &name) const = 0;
46 virtual std::filesystem::path materialize(const std::string &path) const = 0;
47
49 virtual const std::filesystem::path &host_directory() const = 0;
50 virtual std::string describe(const std::string &path) const = 0;
51
54 std::vector<std::string> accessed_resources() const;
55
56 protected:
57 class AccessTracker;
58 ResourceIO();
59 void record_access(const std::string &path) const;
60 std::shared_ptr<AccessTracker> access_tracker_;
61 };
62
63 class FileSystemIO final : public ResourceIO
64 {
65 public:
66 explicit FileSystemIO(
67 const std::filesystem::path &root,
68 const std::filesystem::path &host_directory = {});
69
70 std::unique_ptr<const ResourceIO> with_root(const std::string &root) const override;
71 std::string canonical_path(const std::string &path) const override { return resolve(path).generic_string(); }
72 bool exists(const std::string &path) const override;
73 bool is_group(const std::string &path) const override;
74 std::vector<std::string> list(const std::string &path) const override;
75 std::unique_ptr<std::istream> open(const std::string &path, bool binary) const override;
76 Eigen::MatrixXd read_matrix(const std::string &path) const override;
77 Eigen::MatrixXi read_int_matrix(const std::string &path) const override;
78 std::vector<double> read_double_vector(const std::string &path) const override;
79 std::vector<int> read_int_vector(const std::string &path) const override;
80 std::vector<long> read_long_vector(const std::string &path) const override;
81 bool has_attribute(const std::string &path, const std::string &name) const override;
82 long read_integer_attribute(const std::string &path, const std::string &name) const override;
83 std::string read_string_attribute(const std::string &path, const std::string &name) const override;
84 std::array<long, 2> read_shape_attribute(
85 const std::string &path, const std::string &name) const override;
86 std::filesystem::path materialize(const std::string &path) const override;
87 const std::filesystem::path &host_directory() const override { return host_directory_; }
88 std::string describe(const std::string &path) const override;
89
90 std::filesystem::path resolve(const std::string &path) const;
91
92 private:
93 std::filesystem::path root_;
94 std::filesystem::path host_directory_;
95 };
96
101 class HDF5IO final : public ResourceIO
102 {
103 public:
104 explicit HDF5IO(
105 const std::filesystem::path &file,
106 const std::string &root = "/",
107 const std::filesystem::path &host_directory = {},
108 const std::string &storage_root = "");
109 ~HDF5IO() override;
110
111 std::unique_ptr<const ResourceIO> with_root(const std::string &root) const override;
112 std::string canonical_path(const std::string &path) const override { return logical_resolve(path); }
113 bool exists(const std::string &path) const override;
114 bool is_group(const std::string &path) const override;
115 std::vector<std::string> list(const std::string &path) const override;
116 std::unique_ptr<std::istream> open(const std::string &path, bool binary) const override;
117 std::string read_string(const std::string &path) const override;
118 Eigen::MatrixXd read_matrix(const std::string &path) const override;
119 Eigen::MatrixXi read_int_matrix(const std::string &path) const override;
120 std::vector<double> read_double_vector(const std::string &path) const override;
121 std::vector<int> read_int_vector(const std::string &path) const override;
122 std::vector<long> read_long_vector(const std::string &path) const override;
123 bool has_attribute(const std::string &path, const std::string &name) const override;
124 long read_integer_attribute(const std::string &path, const std::string &name) const override;
125 std::string read_string_attribute(const std::string &path, const std::string &name) const override;
126 std::array<long, 2> read_shape_attribute(
127 const std::string &path, const std::string &name) const override;
128 std::filesystem::path materialize(const std::string &path) const override;
129 const std::filesystem::path &host_directory() const override { return host_directory_; }
130 std::string describe(const std::string &path) const override;
131
132 const std::filesystem::path &file_path() const { return file_path_; }
133 const std::string &logical_root() const { return root_; }
134 std::string logical_resolve(const std::string &path) const;
135 std::string resolve(const std::string &path) const;
136
137 private:
138 class Impl;
139 std::shared_ptr<Impl> impl_;
140 std::filesystem::path file_path_;
141 std::string root_;
142 std::string storage_root_;
143 std::filesystem::path host_directory_;
144 };
145
146} // namespace polyfem::io
std::filesystem::path host_directory_
bool has_attribute(const std::string &path, const std::string &name) const override
std::filesystem::path resolve(const std::string &path) const
std::filesystem::path root_
bool exists(const std::string &path) const override
long read_integer_attribute(const std::string &path, const std::string &name) const override
std::unique_ptr< const ResourceIO > with_root(const std::string &root) const override
std::string read_string_attribute(const std::string &path, const std::string &name) const override
std::vector< std::string > list(const std::string &path) const override
std::vector< int > read_int_vector(const std::string &path) const override
std::filesystem::path materialize(const std::string &path) const override
bool is_group(const std::string &path) const override
Eigen::MatrixXd read_matrix(const std::string &path) const override
std::vector< long > read_long_vector(const std::string &path) const override
std::string canonical_path(const std::string &path) const override
Absolute resource identity, independent of the active reader root.
std::unique_ptr< std::istream > open(const std::string &path, bool binary) const override
Eigen::MatrixXi read_int_matrix(const std::string &path) const override
std::vector< double > read_double_vector(const std::string &path) const override
const std::filesystem::path & host_directory() const override
Host directory used only as the base for ordinary filesystem outputs.
std::string describe(const std::string &path) const override
std::array< long, 2 > read_shape_attribute(const std::string &path, const std::string &name) const override
HDF5 logical paths always use POSIX separators and roots.
std::vector< int > read_int_vector(const std::string &path) const override
std::vector< long > read_long_vector(const std::string &path) const override
std::filesystem::path file_path_
bool has_attribute(const std::string &path, const std::string &name) const override
std::unique_ptr< std::istream > open(const std::string &path, bool binary) const override
std::string read_string(const std::string &path) const override
long read_integer_attribute(const std::string &path, const std::string &name) const override
std::string logical_resolve(const std::string &path) const
std::filesystem::path materialize(const std::string &path) const override
std::shared_ptr< Impl > impl_
const std::string & logical_root() const
Eigen::MatrixXd read_matrix(const std::string &path) const override
std::filesystem::path host_directory_
std::vector< std::string > list(const std::string &path) const override
bool is_group(const std::string &path) const override
bool exists(const std::string &path) const override
const std::filesystem::path & file_path() const
std::string storage_root_
std::vector< double > read_double_vector(const std::string &path) const override
std::unique_ptr< const ResourceIO > with_root(const std::string &root) const override
std::array< long, 2 > read_shape_attribute(const std::string &path, const std::string &name) const override
std::string describe(const std::string &path) const override
Eigen::MatrixXi read_int_matrix(const std::string &path) const override
std::string resolve(const std::string &path) const
std::string canonical_path(const std::string &path) const override
Absolute resource identity, independent of the active reader root.
std::string read_string_attribute(const std::string &path, const std::string &name) const override
const std::filesystem::path & host_directory() const override
Host directory used only as the base for ordinary filesystem outputs.
Read-only interface to a hierarchical collection of simulation resources.
virtual std::array< long, 2 > read_shape_attribute(const std::string &path, const std::string &name) const =0
virtual std::vector< int > read_int_vector(const std::string &path) const =0
std::vector< std::string > accessed_resources() const
A snapshot of canonical paths consumed so far, including solver setup.
virtual Eigen::MatrixXi read_int_matrix(const std::string &path) const =0
void record_access(const std::string &path) const
virtual std::vector< std::string > list(const std::string &path) const =0
virtual ~ResourceIO()=default
std::vector< std::string > glob(const std::string &pattern) const
Glob normalized logical paths using POSIX '*' and '?' wildcards.
virtual std::string read_string(const std::string &path) const
virtual std::string read_string_attribute(const std::string &path, const std::string &name) const =0
virtual std::string canonical_path(const std::string &path) const =0
Absolute resource identity, independent of the active reader root.
virtual std::unique_ptr< const ResourceIO > with_root(const std::string &root) const =0
std::shared_ptr< AccessTracker > access_tracker_
virtual const std::filesystem::path & host_directory() const =0
Host directory used only as the base for ordinary filesystem outputs.
virtual long read_integer_attribute(const std::string &path, const std::string &name) const =0
virtual std::filesystem::path materialize(const std::string &path) const =0
virtual bool has_attribute(const std::string &path, const std::string &name) const =0
virtual std::string describe(const std::string &path) const =0
virtual std::vector< double > read_double_vector(const std::string &path) const =0
virtual bool exists(const std::string &path) const =0
virtual std::unique_ptr< std::istream > open(const std::string &path, bool binary) const =0
virtual Eigen::MatrixXd read_matrix(const std::string &path) const =0
virtual std::vector< long > read_long_vector(const std::string &path) const =0
virtual bool is_group(const std::string &path) const =0