1#ifndef CHIHAYA_VALIDATE_HPP
2#define CHIHAYA_VALIDATE_HPP
5#include "ritsuko/ritsuko.hpp"
36#include <unordered_map>
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); };
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); };
91 auto dtype = load_scalar_string_attribute(group,
"delayed_type");
94 if (dtype ==
"array") {
95 auto atype = load_scalar_string_attribute(group,
"delayed_array");
98 auto cit = custom.find(atype);
99 if (cit != custom.end()) {
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()));
107 static const auto global = default_array_registry();
108 auto git = global.find(atype);
109 if (git != global.end()) {
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()));
115 }
else if (atype.rfind(
"custom ", 0) != std::string::npos) {
118 }
catch (std::exception& e) {
119 throw std::runtime_error(
"failed to validate delayed array of type '" + atype +
"'; " + std::string(e.what()));
121 }
else if (atype.rfind(
"external hdf5 ", 0) != std::string::npos && version.lt(1, 1, 0)) {
124 }
catch (std::exception& e) {
125 throw std::runtime_error(
"failed to validate delayed array of type '" + atype +
"'; " + std::string(e.what()));
128 throw std::runtime_error(
"unknown array type '" + atype +
"'");
132 }
else if (dtype ==
"operation") {
133 auto otype = load_scalar_string_attribute(group,
"delayed_operation");
136 auto cit = custom.find(otype);
137 if (cit != custom.end()) {
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()));
145 static const auto global = default_operation_registry();
146 auto git = global.find(otype);
147 if (git != global.end()) {
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()));
154 throw std::runtime_error(
"unknown operation type '" + otype +
"'");
159 throw std::runtime_error(
"unknown delayed type '" + dtype +
"'");
175 ritsuko::Version version;
177 if (group.attrExists(
"delayed_version")) {
178 auto vstring = load_scalar_string_attribute(group,
"delayed_version");
179 if (vstring ==
"1.0.0") {
182 version = ritsuko::parse_version_string(vstring.c_str(), vstring.size(),
true);
212 H5::H5File handle(path, H5F_ACC_RDONLY);
213 auto ghandle = handle.openGroup(name);
226 H5::H5File handle(path, H5F_ACC_RDONLY);
228 auto ghandle = handle.openGroup(name);
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.