chihaya
Validating delayed array operations in HDF5
Loading...
Searching...
No Matches
matrix_product.hpp
Go to the documentation of this file.
1#ifndef CHIHAYA_MATRIX_PRODUCT_HPP
2#define CHIHAYA_MATRIX_PRODUCT_HPP
3
4#include "H5Cpp.h"
5#include "ritsuko/ritsuko.hpp"
6
7#include <stdexcept>
8#include <exception>
9#include <string>
10
11#include "utils_public.hpp"
12#include "utils_misc.hpp"
13#include "utils_nary.hpp"
14
20namespace chihaya {
21
25inline std::pair<ArrayDetails, bool> fetch_matprod_seed(
26 const H5::Group& group,
27 const std::string& target,
28 const std::string& orientation,
29 const ritsuko::Version& version,
30 const Options& options
31) {
32 ArrayDetails seed_details;
33 try {
34 auto thandle = group.openGroup(target);
35 seed_details = validate_numeric_seed(thandle, version, options);
36 } catch (...) {
37 std::throw_with_nested(std::runtime_error("failed to validate '" + target + "'"));
38 }
39
40 if (seed_details.dimensions.size() != 2) {
41 throw std::runtime_error("expected '" + target + "' to be a 2-dimensional array");
42 }
43
44 std::string oristr;
45 try {
46 auto ohandle = group.openDataSet(orientation);
47 oristr = read_scalar_string_dataset(ohandle);
48 if (oristr != "N" && oristr != "T") {
49 throw std::runtime_error("expected either 'N' or 'T'");
50 }
51 } catch (...) {
52 std::throw_with_nested(std::runtime_error("failed to validate '" + orientation + "'"));
53 }
54
55 return std::pair<ArrayDetails, bool>(seed_details, oristr == "T");
56}
73inline ArrayDetails validate_matrix_product(const H5::Group& group, const ritsuko::Version& version, const Options& options) {
74 auto left_details = fetch_matprod_seed(group, "left_seed", "left_orientation", version, options);
75 auto right_details = fetch_matprod_seed(group, "right_seed", "right_orientation", version, options);
76
77 ArrayDetails output;
78 output.dimensions.resize(2);
79 auto& nrow = output.dimensions[0];
80 auto& ncol = output.dimensions[1];
81 I<decltype(nrow)> common, common2;
82
83 if (left_details.second) {
84 nrow = left_details.first.dimensions[1];
85 common = left_details.first.dimensions[0];
86 } else {
87 nrow = left_details.first.dimensions[0];
88 common = left_details.first.dimensions[1];
89 }
90
91 if (right_details.second) {
92 ncol = right_details.first.dimensions[0];
93 common2 = right_details.first.dimensions[1];
94 } else {
95 ncol = right_details.first.dimensions[1];
96 common2 = right_details.first.dimensions[0];
97 }
98
99 if (!options.details_only) {
100 if (common != common2) {
101 throw std::runtime_error("inconsistent common dimensions (" + ritsuko::itoa(common) + " vs " + ritsuko::itoa(common2) + ")");
102 }
103 }
104
105 if (left_details.first.type == FLOAT || right_details.first.type == FLOAT) {
106 output.type = FLOAT;
107 } else {
108 output.type = INTEGER;
109 }
110
111 return output;
112}
113
114}
115
116#endif
Namespace for all chihaya functions.
Definition binary_arithmetic.hpp:21
ArrayDetails validate_matrix_product(const H5::Group &group, const ritsuko::Version &version, const Options &options)
Definition matrix_product.hpp:73
Details about an array.
Definition utils_public.hpp:38
std::vector< std::size_t > dimensions
Definition utils_public.hpp:58
ArrayType type
Definition utils_public.hpp:52
Options for validate().
Definition utils_public.hpp:79
bool details_only
Definition utils_public.hpp:84
Various public utilities.