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 <string>
9
10#include "utils_public.hpp"
11#include "utils_misc.hpp"
12#include "utils_nary.hpp"
13
19namespace chihaya {
20
24inline std::pair<ArrayDetails, bool> fetch_matprod_seed(
25 const H5::Group& group,
26 const std::string& target,
27 const std::string& orientation,
28 const ritsuko::Version& version,
29 const Options& options
30) {
31 auto seed_details = fetch_numeric_seed(group, target, version, options);
32 if (seed_details.dimensions.size() != 2) {
33 throw std::runtime_error("expected '" + target + "' to be a 2-dimensional array for a matrix product");
34 }
35
36 auto oristr = load_scalar_string_dataset(group, orientation);
37 if (oristr != "N" && oristr != "T") {
38 throw std::runtime_error("'" + orientation + "' should be either 'N' or 'T' for a matrix product");
39 }
40
41 return std::pair<ArrayDetails, bool>(seed_details, oristr == "T");
42}
55inline ArrayDetails validate_matrix_product(const H5::Group& group, const ritsuko::Version& version, const Options& options) {
56 auto left_details = fetch_matprod_seed(group, "left_seed", "left_orientation", version, options);
57 auto right_details = fetch_matprod_seed(group, "right_seed", "right_orientation", version, options);
58
59 ArrayDetails output;
60 output.dimensions.resize(2);
61 auto& nrow = output.dimensions[0];
62 auto& ncol = output.dimensions[1];
63 I<decltype(nrow)> common, common2;
64
65 if (left_details.second) {
66 nrow = left_details.first.dimensions[1];
67 common = left_details.first.dimensions[0];
68 } else {
69 nrow = left_details.first.dimensions[0];
70 common = left_details.first.dimensions[1];
71 }
72
73 if (right_details.second) {
74 ncol = right_details.first.dimensions[0];
75 common2 = right_details.first.dimensions[1];
76 } else {
77 ncol = right_details.first.dimensions[1];
78 common2 = right_details.first.dimensions[0];
79 }
80
81 if (!options.details_only) {
82 if (common != common2) {
83 throw std::runtime_error("inconsistent common dimensions (" + std::to_string(common) + " vs " + std::to_string(common2) + ")");
84 }
85 }
86
87 if (left_details.first.type == FLOAT || right_details.first.type == FLOAT) {
88 output.type = FLOAT;
89 } else {
90 output.type = INTEGER;
91 }
92
93 return output;
94}
95
96}
97
98#endif
Namespace for all chihaya functions.
Definition binary_arithmetic.hpp:20
ArrayDetails validate_matrix_product(const H5::Group &group, const ritsuko::Version &version, const Options &options)
Definition matrix_product.hpp:55
Details about an array.
Definition utils_public.hpp:37
std::vector< std::size_t > dimensions
Definition utils_public.hpp:57
ArrayType type
Definition utils_public.hpp:51
Validation options.
Definition utils_public.hpp:67
bool details_only
Definition utils_public.hpp:72
Various public utilities.