chihaya
Validating delayed array operations in HDF5
Loading...
Searching...
No Matches
subset_assignment.hpp
Go to the documentation of this file.
1#ifndef CHIHAYA_SUBSET_ASSIGNMENT_HPP
2#define CHIHAYA_SUBSET_ASSIGNMENT_HPP
3
4#include "H5Cpp.h"
5#include "ritsuko/ritsuko.hpp"
6
7#include <stdexcept>
8#include <exception>
9#include <vector>
10#include <algorithm>
11
12#include "utils_public.hpp"
13#include "utils_list.hpp"
14#include "utils_misc.hpp"
15#include "utils_subset.hpp"
16#include "utils_dimensions.hpp"
17
23namespace chihaya {
24
37inline ArrayDetails validate_subset_assignment(const H5::Group& group, const ritsuko::Version& version, const Options& options) {
38 ArrayDetails seed_details;
39 try {
40 auto shandle = group.openGroup("seed");
41 seed_details = validate(shandle, version, options);
42 } catch (...) {
43 std::throw_with_nested(std::runtime_error("failed to validate 'seed'"));
44 }
45
46 ArrayDetails value_details;
47 try {
48 auto vhandle = group.openGroup("value");
49 value_details = validate(vhandle, version, options);
50 } catch (...) {
51 std::throw_with_nested(std::runtime_error("failed to validate 'value'"));
52 }
53
54 if (!options.details_only) {
55 if ((value_details.type == STRING) != (seed_details.type == STRING)) {
56 throw std::runtime_error("both or neither of the 'seed' and 'value' arrays should contain strings");
57 }
58
59 const auto& seed_dims = seed_details.dimensions;
60 if (seed_dims.size() != value_details.dimensions.size()) {
61 throw std::runtime_error("'seed' and 'value' arrays should have the same dimensionality");
62 }
63
64 std::vector<std::pair<std::size_t, std::size_t> > collected;
65 try {
66 auto ihandle = group.openGroup("index");
67 collected = validate_subset_index_list(ihandle, seed_dims, version, options.contiguous_chunk_size);
68 } catch (...) {
69 std::throw_with_nested(std::runtime_error("failed to validate 'index'"));
70 }
71
72 auto expected_dims = seed_dims;
73 for (auto p : collected) {
74 expected_dims[p.first] = p.second;
75 }
76
77 if (!are_dimensions_equal(expected_dims, value_details.dimensions)) {
78 throw std::runtime_error("'value' dimension extents are not consistent with lengths of indices in 'index'");
79 }
80 }
81
82 // Promotion.
83 seed_details.type = std::max(seed_details.type, value_details.type);
84 return seed_details;
85}
86
87}
88
89#endif
Namespace for all chihaya functions.
Definition binary_arithmetic.hpp:21
ArrayDetails validate(const H5::Group &group, const ritsuko::Version &version, const Options &options)
Definition validate.hpp:96
ArrayDetails validate_subset_assignment(const H5::Group &group, const ritsuko::Version &version, const Options &options)
Definition subset_assignment.hpp:37
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
hsize_t contiguous_chunk_size
Definition utils_public.hpp:90
Various public utilities.