chihaya
Validating delayed array operations in HDF5
Loading...
Searching...
No Matches
validate.hpp
Go to the documentation of this file.
1#ifndef CHIHAYA_VALIDATE_HPP
2#define CHIHAYA_VALIDATE_HPP
3
4#include "H5Cpp.h"
5#include "ritsuko/ritsuko.hpp"
6
7#include "subset.hpp"
8#include "combine.hpp"
9#include "transpose.hpp"
10
11#include "dense_array.hpp"
12#include "sparse_matrix.hpp"
13#include "external_hdf5.hpp"
14#include "custom_array.hpp"
15#include "constant_array.hpp"
16
17#include "dimnames.hpp"
18#include "subset_assignment.hpp"
19
20#include "unary_arithmetic.hpp"
21#include "unary_comparison.hpp"
22#include "unary_logic.hpp"
23#include "unary_math.hpp"
25
26#include "binary_arithmetic.hpp"
27#include "binary_comparison.hpp"
28#include "binary_logic.hpp"
29
30#include "matrix_product.hpp"
31
32#include "utils_public.hpp"
33
34#include <string>
35#include <stdexcept>
36#include <unordered_map>
37#include <functional>
38
44namespace chihaya {
45
49inline auto default_operation_registry() {
50 ValidateRegistry registry;
51 registry["subset"] = [](const H5::Group& h, const ritsuko::Version& v, const Options& o) -> ArrayDetails { return validate_subset(h, v, o); };
52 registry["combine"] = [](const H5::Group& h, const ritsuko::Version& v, const Options& o) -> ArrayDetails { return validate_combine(h, v, o); };
53 registry["transpose"] = [](const H5::Group& h, const ritsuko::Version& v, const Options& o) -> ArrayDetails { return validate_transpose(h, v, o); };
54 registry["dimnames"] = [](const H5::Group& h, const ritsuko::Version& v, const Options& o) -> ArrayDetails { return validate_dimnames(h, v, o); };
55 registry["subset assignment"] = [](const H5::Group& h, const ritsuko::Version& v, const Options& o) -> ArrayDetails { return validate_subset_assignment(h, v, o); };
56 registry["unary arithmetic"] = [](const H5::Group& h, const ritsuko::Version& v, const Options& o) -> ArrayDetails { return validate_unary_arithmetic(h, v, o); };
57 registry["unary comparison"] = [](const H5::Group& h, const ritsuko::Version& v, const Options& o) -> ArrayDetails { return validate_unary_comparison(h, v, o); };
58 registry["unary logic"] = [](const H5::Group& h, const ritsuko::Version& v, const Options& o) -> ArrayDetails { return validate_unary_logic(h, v, o); };
59 registry["unary math"] = [](const H5::Group& h, const ritsuko::Version& v, const Options& o) -> ArrayDetails { return validate_unary_math(h, v, o); };
60 registry["unary special check"] = [](const H5::Group& h, const ritsuko::Version& v, const Options& o) -> ArrayDetails { return validate_unary_special_check(h, v, o); };
61 registry["binary arithmetic"] = [](const H5::Group& h, const ritsuko::Version& v, const Options& o) -> ArrayDetails { return validate_binary_arithmetic(h, v, o); };
62 registry["binary comparison"] = [](const H5::Group& h, const ritsuko::Version& v, const Options& o) -> ArrayDetails { return validate_binary_comparison(h, v, o); };
63 registry["binary logic"] = [](const H5::Group& h, const ritsuko::Version& v, const Options& o) -> ArrayDetails { return validate_binary_logic(h, v, o); };
64 registry["matrix product"] = [](const H5::Group& h, const ritsuko::Version& v, const Options& o) -> ArrayDetails { return validate_matrix_product(h, v, o); };
65 return registry;
66}
67
68inline auto default_array_registry() {
69 ValidateRegistry registry;
70 registry["dense array"] = [](const H5::Group& h, const ritsuko::Version& v, const Options& o) -> ArrayDetails { return validate_dense_array(h, v, o); };
71 registry["sparse matrix"] = [](const H5::Group& h, const ritsuko::Version& v, const Options& o) -> ArrayDetails { return validate_sparse_matrix(h, v, o); };
72 registry["constant array"] = [](const H5::Group& h, const ritsuko::Version& v, const Options& o) -> ArrayDetails { return validate_constant_array(h, v, o); };
73 return registry;
74}
90inline ArrayDetails validate(const H5::Group& group, const ritsuko::Version& version, const Options& options) {
91 std::string dtype;
92 try {
93 auto ahandle = group.openAttribute("delayed_type");
94 dtype = read_scalar_string_attribute(ahandle);
95 } catch (...) {
96 std::throw_with_nested(std::runtime_error("failed to validate the 'delayed_type' attribute"));
97 }
98
99 ArrayDetails output;
100 if (dtype == "array") {
101 std::string atype;
102 try {
103 auto ahandle = group.openAttribute("delayed_array");
104 atype = read_scalar_string_attribute(ahandle);
105 } catch (...) {
106 std::throw_with_nested(std::runtime_error("failed to validate the 'delayed_array' attribute"));
107 }
108
109 const auto& custom = options.array_validate_registry;
110 auto cit = custom.find(atype);
111 if (cit != custom.end()) {
112 try {
113 output = (cit->second)(group, version, options);
114 } catch (...) {
115 std::throw_with_nested(std::runtime_error("failed to validate delayed array of type '" + atype + "'"));
116 }
117
118 } else {
119 static const auto global = default_array_registry();
120 auto git = global.find(atype);
121 if (git != global.end()) {
122 try {
123 output = (git->second)(group, version, options);
124 } catch (...) {
125 std::throw_with_nested(std::runtime_error("failed to validate delayed array of type '" + atype + "'"));
126 }
127
128 } else if (atype.rfind("custom ", 0) != std::string::npos) {
129 try {
130 output = validate_custom_array(group, version, options);
131 } catch (...) {
132 std::throw_with_nested(std::runtime_error("failed to validate delayed array of type '" + atype + "'"));
133 }
134
135 } else if (atype.rfind("external hdf5 ", 0) != std::string::npos && version.lt(1, 1, 0)) {
136 try {
137 output = validate_external_hdf5(group, version, options);
138 } catch (...) {
139 std::throw_with_nested(std::runtime_error("failed to validate delayed array of type '" + atype + "'"));
140 }
141
142 } else {
143 throw std::runtime_error("unknown array type '" + atype + "'");
144 }
145 }
146
147 } else if (dtype == "operation") {
148 std::string otype;
149 try {
150 auto ohandle = group.openAttribute("delayed_operation");
151 otype = read_scalar_string_attribute(ohandle);
152 } catch (...) {
153 std::throw_with_nested(std::runtime_error("failed to validate the 'delayed_operation' attribute"));
154 }
155
156 const auto& custom = options.operation_validate_registry;
157 auto cit = custom.find(otype);
158 if (cit != custom.end()) {
159 try {
160 output = (cit->second)(group, version, options);
161 } catch (...) {
162 std::throw_with_nested(std::runtime_error("failed to validate delayed operation of type '" + otype + "'"));
163 }
164
165 } else {
166 static const auto global = default_operation_registry();
167 auto git = global.find(otype);
168 if (git != global.end()) {
169 try {
170 output = (git->second)(group, version, options);
171 } catch (...) {
172 std::throw_with_nested(std::runtime_error("failed to validate delayed operation of type '" + otype + "'"));
173 }
174
175 } else {
176 throw std::runtime_error("unknown operation type '" + otype + "'");
177 }
178 }
179
180 } else {
181 throw std::runtime_error("unknown delayed type '" + dtype + "'");
182 }
183
184 return output;
185}
186
196inline ritsuko::Version extract_version(const H5::Group& group) {
197 ritsuko::Version version;
198
199 if (group.attrExists("delayed_version")) {
200 try {
201 auto vhandle = group.openAttribute("delayed_version");
202 auto vstring = read_scalar_string_attribute(vhandle);
203 if (vstring == "1.0.0") {
204 version.major = 1;
205 } else {
206 version = ritsuko::parse_version_string(vstring.c_str(), vstring.size(), /* skip_patch = */ true);
207 }
208 } catch (...) {
209 std::throw_with_nested(std::runtime_error("failed to validate the 'delayed_version' attribute"));
210 }
211 } else {
212 version.minor = 99;
213 }
214
215 return version;
216}
217
225inline ArrayDetails validate(const H5::Group& group, const Options& options) {
226 return validate(group, extract_version(group), options);
227}
228
238inline ArrayDetails validate(const std::string& path, const std::string& name, const Options& options) {
239 try {
240 H5::H5File handle(path, H5F_ACC_RDONLY);
241 auto ghandle = handle.openGroup(name);
242 return validate(ghandle, options);
243 } catch (...) {
244 std::throw_with_nested(std::runtime_error("failed to validate '" + name + "' in '" + path + "'"));
245 }
246}
247
256inline ArrayDetails validate(const std::string& path, const std::string& name) {
257 return validate(path, name, {});
258}
259
260}
261
262#endif
Validation for delayed binary arithmetic operations.
Validation for delayed binary comparisons.
Validation for delayed binary logical operations.
Validation for delayed combining operations.
Constant array, stored inside the file.
Validation for custom third-party arrays.
Dense array, stored inside the file.
Validation for delayed dimnames assignment.
Validation for external HDF5 arrays.
Validation for delayed matrix products.
Namespace for all chihaya functions.
Definition binary_arithmetic.hpp:20
ArrayDetails validate_sparse_matrix(const H5::Group &group, const ritsuko::Version &version, const Options &options)
Definition sparse_matrix.hpp:96
std::unordered_map< std::string, std::function< ArrayDetails(const H5::Group &, const ritsuko::Version &, const Options &)> > ValidateRegistry
Definition utils_public.hpp:74
ArrayDetails validate_constant_array(const H5::Group &group, const ritsuko::Version &version, const Options &options)
Definition constant_array.hpp:33
ArrayDetails validate_subset(const H5::Group &group, const ritsuko::Version &version, const Options &options)
Definition subset.hpp:26
ArrayDetails validate_transpose(const H5::Group &group, const ritsuko::Version &version, const Options &options)
Definition transpose.hpp:71
ArrayDetails validate_binary_logic(const H5::Group &group, const ritsuko::Version &version, const Options &options)
Definition binary_logic.hpp:30
ArrayDetails validate_matrix_product(const H5::Group &group, const ritsuko::Version &version, const Options &options)
Definition matrix_product.hpp:68
ArrayDetails validate_unary_arithmetic(const H5::Group &group, const ritsuko::Version &version, const Options &options)
Definition unary_arithmetic.hpp:30
ritsuko::Version extract_version(const H5::Group &group)
Definition validate.hpp:196
ArrayDetails validate_custom_array(const H5::Group &group, const ritsuko::Version &version, const Options &options)
Definition custom_array.hpp:83
ArrayDetails validate_binary_comparison(const H5::Group &group, const ritsuko::Version &version, const Options &options)
Definition binary_comparison.hpp:29
ArrayDetails validate(const H5::Group &group, const ritsuko::Version &version, const Options &options)
Definition validate.hpp:90
ArrayDetails validate_dimnames(const H5::Group &group, const ritsuko::Version &version, const Options &options)
Definition dimnames.hpp:27
ArrayDetails validate_external_hdf5(const H5::Group &group, const ritsuko::Version &version, const Options &options)
Definition external_hdf5.hpp:25
ArrayDetails validate_subset_assignment(const H5::Group &group, const ritsuko::Version &version, const Options &options)
Definition subset_assignment.hpp:32
ArrayDetails validate_unary_comparison(const H5::Group &group, const ritsuko::Version &version, const Options &options)
Definition unary_comparison.hpp:30
ArrayDetails validate_dense_array(const H5::Group &group, const ritsuko::Version &version, const Options &options)
Definition dense_array.hpp:53
ArrayDetails validate_unary_logic(const H5::Group &group, const ritsuko::Version &version, const Options &options)
Definition unary_logic.hpp:31
ArrayDetails validate_unary_math(const H5::Group &group, const ritsuko::Version &version, const Options &options)
Definition unary_math.hpp:29
ArrayDetails validate_binary_arithmetic(const H5::Group &group, const ritsuko::Version &version, const Options &options)
Definition binary_arithmetic.hpp:30
ArrayDetails validate_combine(const H5::Group &group, const ritsuko::Version &version, const Options &options)
Definition combine.hpp:33
ArrayDetails validate_unary_special_check(const H5::Group &group, const ritsuko::Version &version, const Options &options)
Definition unary_special_check.hpp:28
Validation for compressed sparse column matrices.
Details about an array.
Definition utils_public.hpp:38
Options for validate().
Definition utils_public.hpp:79
ValidateRegistry array_validate_registry
Definition utils_public.hpp:96
ValidateRegistry operation_validate_registry
Definition utils_public.hpp:102
Validation for delayed subsets.
Validation for delayed subset assignment.
Validation for delayed transposition.
Validation for delayed unary arithmetic operations.
Validation for delayed unary comparisons.
Validation for delayed unary logic operations.
Validation for delayed unary math operations.
Validation for delayed unary special checks.
Various public utilities.