1#ifndef CHIHAYA_VALIDATE_HPP
2#define CHIHAYA_VALIDATE_HPP
5#include "ritsuko/ritsuko.hpp"
36#include <unordered_map>
49inline auto default_operation_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() {
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); };
93 auto ahandle = group.openAttribute(
"delayed_type");
94 dtype = read_scalar_string_attribute(ahandle);
96 std::throw_with_nested(std::runtime_error(
"failed to validate the 'delayed_type' attribute"));
100 if (dtype ==
"array") {
103 auto ahandle = group.openAttribute(
"delayed_array");
104 atype = read_scalar_string_attribute(ahandle);
106 std::throw_with_nested(std::runtime_error(
"failed to validate the 'delayed_array' attribute"));
110 auto cit = custom.find(atype);
111 if (cit != custom.end()) {
113 output = (cit->second)(group, version, options);
115 std::throw_with_nested(std::runtime_error(
"failed to validate delayed array of type '" + atype +
"'"));
119 static const auto global = default_array_registry();
120 auto git = global.find(atype);
121 if (git != global.end()) {
123 output = (git->second)(group, version, options);
125 std::throw_with_nested(std::runtime_error(
"failed to validate delayed array of type '" + atype +
"'"));
128 }
else if (atype.rfind(
"custom ", 0) != std::string::npos) {
132 std::throw_with_nested(std::runtime_error(
"failed to validate delayed array of type '" + atype +
"'"));
135 }
else if (atype.rfind(
"external hdf5 ", 0) != std::string::npos && version.lt(1, 1, 0)) {
139 std::throw_with_nested(std::runtime_error(
"failed to validate delayed array of type '" + atype +
"'"));
143 throw std::runtime_error(
"unknown array type '" + atype +
"'");
147 }
else if (dtype ==
"operation") {
150 auto ohandle = group.openAttribute(
"delayed_operation");
151 otype = read_scalar_string_attribute(ohandle);
153 std::throw_with_nested(std::runtime_error(
"failed to validate the 'delayed_operation' attribute"));
157 auto cit = custom.find(otype);
158 if (cit != custom.end()) {
160 output = (cit->second)(group, version, options);
162 std::throw_with_nested(std::runtime_error(
"failed to validate delayed operation of type '" + otype +
"'"));
166 static const auto global = default_operation_registry();
167 auto git = global.find(otype);
168 if (git != global.end()) {
170 output = (git->second)(group, version, options);
172 std::throw_with_nested(std::runtime_error(
"failed to validate delayed operation of type '" + otype +
"'"));
176 throw std::runtime_error(
"unknown operation type '" + otype +
"'");
181 throw std::runtime_error(
"unknown delayed type '" + dtype +
"'");
197 ritsuko::Version version;
199 if (group.attrExists(
"delayed_version")) {
201 auto vhandle = group.openAttribute(
"delayed_version");
202 auto vstring = read_scalar_string_attribute(vhandle);
203 if (vstring ==
"1.0.0") {
206 version = ritsuko::parse_version_string(vstring.c_str(), vstring.size(),
true);
209 std::throw_with_nested(std::runtime_error(
"failed to validate the 'delayed_version' attribute"));
240 H5::H5File handle(path, H5F_ACC_RDONLY);
241 auto ghandle = handle.openGroup(name);
244 std::throw_with_nested(std::runtime_error(
"failed to validate '" + name +
"' in '" + path +
"'"));
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.