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 std::unordered_map<std::string, std::function<ArrayDetails(const H5::Group&, const ritsuko::Version&, const Options&)> > 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 std::unordered_map<std::string, std::function<ArrayDetails(const H5::Group&, const ritsuko::Version&, const Options&)> > 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 auto dtype = load_scalar_string_attribute(group, "delayed_type");
92 ArrayDetails output;
93
94 if (dtype == "array") {
95 auto atype = load_scalar_string_attribute(group, "delayed_array");
96
97 const auto& custom = options.array_validate_registry;
98 auto cit = custom.find(atype);
99 if (cit != custom.end()) {
100 try {
101 output = (cit->second)(group, version, options);
102 } catch (std::exception& e) {
103 throw std::runtime_error("failed to validate delayed array of type '" + atype + "'; " + std::string(e.what()));
104 }
105
106 } else {
107 static const auto global = default_array_registry();
108 auto git = global.find(atype);
109 if (git != global.end()) {
110 try {
111 output = (git->second)(group, version, options);
112 } catch (std::exception& e) {
113 throw std::runtime_error("failed to validate delayed array of type '" + atype + "'; " + std::string(e.what()));
114 }
115 } else if (atype.rfind("custom ", 0) != std::string::npos) {
116 try {
117 output = validate_custom_array(group, version, options);
118 } catch (std::exception& e) {
119 throw std::runtime_error("failed to validate delayed array of type '" + atype + "'; " + std::string(e.what()));
120 }
121 } else if (atype.rfind("external hdf5 ", 0) != std::string::npos && version.lt(1, 1, 0)) {
122 try {
123 output = validate_external_hdf5(group, version, options);
124 } catch (std::exception& e) {
125 throw std::runtime_error("failed to validate delayed array of type '" + atype + "'; " + std::string(e.what()));
126 }
127 } else {
128 throw std::runtime_error("unknown array type '" + atype + "'");
129 }
130 }
131
132 } else if (dtype == "operation") {
133 auto otype = load_scalar_string_attribute(group, "delayed_operation");
134
135 const auto& custom = options.operation_validate_registry;
136 auto cit = custom.find(otype);
137 if (cit != custom.end()) {
138 try {
139 output = (cit->second)(group, version, options);
140 } catch (std::exception& e) {
141 throw std::runtime_error("failed to validate delayed operation of type '" + otype + "'; " + std::string(e.what()));
142 }
143
144 } else {
145 static const auto global = default_operation_registry();
146 auto git = global.find(otype);
147 if (git != global.end()) {
148 try {
149 output = (git->second)(group, version, options);
150 } catch (std::exception& e) {
151 throw std::runtime_error("failed to validate delayed operation of type '" + otype + "'; " + std::string(e.what()));
152 }
153 } else {
154 throw std::runtime_error("unknown operation type '" + otype + "'");
155 }
156 }
157
158 } else {
159 throw std::runtime_error("unknown delayed type '" + dtype + "'");
160 }
161
162 return output;
163}
164
174inline ritsuko::Version extract_version(const H5::Group& group) {
175 ritsuko::Version version;
176
177 if (group.attrExists("delayed_version")) {
178 auto vstring = load_scalar_string_attribute(group, "delayed_version");
179 if (vstring == "1.0.0") {
180 version.major = 1;
181 } else {
182 version = ritsuko::parse_version_string(vstring.c_str(), vstring.size(), /* skip_patch = */ true);
183 }
184 } else {
185 version.minor = 99;
186 }
187
188 return version;
189}
190
198inline ArrayDetails validate(const H5::Group& group, const Options& options) {
199 return validate(group, extract_version(group), options);
200}
201
211inline ArrayDetails validate(const std::string& path, const std::string& name, const Options& options) {
212 H5::H5File handle(path, H5F_ACC_RDONLY);
213 auto ghandle = handle.openGroup(name);
214 return validate(ghandle, options);
215}
216
225inline ArrayDetails validate(const std::string& path, const std::string& name) {
226 H5::H5File handle(path, H5F_ACC_RDONLY);
227 Options options;
228 auto ghandle = handle.openGroup(name);
229 return validate(ghandle, options);
230}
231
232}
233
234#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:84
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:55
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:174
ArrayDetails validate_custom_array(const H5::Group &group, const ritsuko::Version &version, const Options &options)
Definition custom_array.hpp:75
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:37
Validation options.
Definition utils_public.hpp:67
std::unordered_map< std::string, std::function< ArrayDetails(const H5::Group &, const ritsuko::Version &, const Options &)> > operation_validate_registry
Definition utils_public.hpp:84
std::unordered_map< std::string, std::function< ArrayDetails(const H5::Group &, const ritsuko::Version &, const Options &)> > array_validate_registry
Definition utils_public.hpp:78
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.