GCC Code Coverage Report


Directory: gridformat/
File: gridformat/common/hdf5.hpp
Date: 2024-11-20 14:41:59
Exec Total Coverage
Lines: 251 282 89.0%
Functions: 213 328 64.9%
Branches: 538 3156 17.0%

Line Branch Exec Source
1 // SPDX-FileCopyrightText: 2022-2023 Dennis Gläser <dennis.glaeser@iws.uni-stuttgart.de>
2 // SPDX-License-Identifier: MIT
3 /*!
4 * \file
5 * \ingroup Common
6 * \brief Helpers for I/O from HDF5 files.
7 */
8 #ifndef GRIDFORMAT_COMMON_HDF5_HPP_
9 #define GRIDFORMAT_COMMON_HDF5_HPP_
10 #if GRIDFORMAT_HAVE_HIGH_FIVE
11
12 #include <type_traits>
13 #include <algorithm>
14 #include <concepts>
15 #include <ranges>
16 #include <cstdint>
17
18 #ifdef GRIDFORMAT_DISABLE_HIGHFIVE_WARNINGS
19 #pragma GCC diagnostic push
20 #pragma GCC diagnostic ignored "-Wold-style-cast"
21 #pragma GCC diagnostic ignored "-Wswitch-enum"
22 #pragma GCC diagnostic ignored "-Wuseless-cast"
23 #pragma GCC diagnostic ignored "-Wcast-qual"
24 #pragma GCC diagnostic ignored "-Wnull-dereference"
25 #pragma GCC diagnostic ignored "-Warray-bounds"
26 #pragma GCC diagnostic ignored "-Wstringop-overflow"
27 #endif // GRIDFORMAT_DISABLE_HIGHFIVE_WARNINGS
28
29 #include <highfive/H5Easy.hpp>
30 #include <highfive/H5File.hpp>
31
32 #ifdef GRIDFORMAT_DISABLE_HIGHFIVE_WARNINGS
33 #pragma GCC diagnostic pop
34 #endif // GRIDFORMAT_DISABLE_HIGHFIVE_WARNINGS
35
36 #include <gridformat/common/field.hpp>
37 #include <gridformat/common/logging.hpp>
38 #include <gridformat/common/concepts.hpp>
39 #include <gridformat/common/md_layout.hpp>
40 #include <gridformat/common/buffer_field.hpp>
41 #include <gridformat/common/precision.hpp>
42
43 #include <gridformat/parallel/communication.hpp>
44 #include <gridformat/grid/grid.hpp>
45
46
47 namespace GridFormat::HDF5 {
48
49 #ifndef DOXYGEN
50 namespace Detail {
51
52 2644 HighFive::DataTransferProps parallel_transfer_props() {
53 2644 HighFive::DataTransferProps xfer_props;
54 #if GRIDFORMAT_HAVE_PARALLEL_HIGH_FIVE
55
1/2
✓ Branch 2 taken 2644 times.
✗ Branch 3 not taken.
2644 xfer_props.add(HighFive::UseCollectiveIO{});
56 #else
57 throw NotImplemented("Parallel HighFive required for parallel I/O");
58 #endif
59 2644 return xfer_props;
60 }
61
62 template<Concepts::Communicator Communicator>
63 354 auto parallel_file_access_props([[maybe_unused]] const Communicator& communicator) {
64 354 HighFive::FileAccessProps fapl;
65 #if GRIDFORMAT_HAVE_PARALLEL_HIGH_FIVE
66 if constexpr (!std::is_same_v<Communicator, NullCommunicator>) {
67
1/2
✓ Branch 2 taken 250 times.
✗ Branch 3 not taken.
354 fapl.add(HighFive::MPIOFileAccess{communicator, MPI_INFO_NULL});
68
1/2
✓ Branch 2 taken 250 times.
✗ Branch 3 not taken.
354 fapl.add(HighFive::MPIOCollectiveMetadata{});
69 } else {
70 throw TypeError("Cannot establish parallel I/O with null communicator");
71 }
72 #else
73 throw NotImplemented("Parallel HighFive required for parallel I/O");
74 #endif
75 354 return fapl;
76 }
77
78 2644 void check_successful_collective_io([[maybe_unused]] const HighFive::DataTransferProps& xfer_props) {
79 #if GRIDFORMAT_HAVE_PARALLEL_HIGH_FIVE
80
1/2
✓ Branch 1 taken 2644 times.
✗ Branch 2 not taken.
2644 auto mnccp = HighFive::MpioNoCollectiveCause(xfer_props);
81
3/6
✓ Branch 1 taken 2644 times.
✗ Branch 2 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2644 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 2644 times.
2644 if (mnccp.getLocalCause() || mnccp.getGlobalCause())
82 log_warning(
83 std::string{"The operation was successful, but couldn't use collective MPI-IO. "}
84 + "Local cause: " + std::to_string(mnccp.getLocalCause()) + " "
85 + "Global cause:" + std::to_string(mnccp.getGlobalCause()) + "\n"
86 );
87 #else
88 throw NotImplemented("Parallel HighFive required for parallel I/O");
89 #endif
90 2644 }
91
92 42819 std::pair<std::string, std::string> split_group(const std::string& in) {
93
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 42819 times.
42819 if (in.ends_with('/'))
94 return {in, ""};
95
96 42819 const auto split_pos = in.find_last_of("/");
97
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 42819 times.
42819 if (split_pos == std::string::npos )
98 throw ValueError("Could not split name from given path: " + in);
99 return {
100
6/10
✓ Branch 0 taken 42267 times.
✓ Branch 1 taken 552 times.
✓ Branch 3 taken 42267 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 552 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 552 times.
✓ Branch 9 taken 42267 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
86742 split_pos > 0 ? in.substr(0, split_pos) : "/",
101
1/2
✓ Branch 1 taken 42819 times.
✗ Branch 2 not taken.
85638 in.substr(split_pos + 1)
102 42819 };
103 }
104
105 } // namespace Detail
106 #endif // DOXYGEN
107
108 //! Represents a dataset slice
109 struct Slice {
110 std::vector<std::size_t> offset;
111 std::vector<std::size_t> count;
112 std::optional<std::vector<std::size_t>> total_size = {};
113 };
114
115 //! Custom string data type using ascii encoding.
116 //! HighFive uses UTF-8, but VTKHDF, for instance, uses ascii.
117 struct AsciiString : public HighFive::DataType {
118 337 explicit AsciiString(std::size_t n) {
119
2/4
✓ Branch 1 taken 337 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 337 times.
✗ Branch 5 not taken.
337 _hid = H5Tcopy(H5T_C_S1);
120
2/4
✓ Branch 1 taken 337 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 337 times.
337 if (H5Tset_size(_hid, n) < 0) {
121 HighFive::HDF5ErrMapper::ToException<HighFive::DataTypeException>(
122 "Unable to define datatype size to " + std::to_string(n)
123 );
124 }
125 // define encoding to ASCII
126
1/2
✓ Branch 1 taken 337 times.
✗ Branch 2 not taken.
337 H5Tset_cset(_hid, H5T_CSET_ASCII);
127
1/2
✓ Branch 1 taken 337 times.
✗ Branch 2 not taken.
337 H5Tset_strpad(_hid, H5T_STR_SPACEPAD);
128 337 }
129
130 template<std::size_t N>
131 502 static AsciiString from(const char (&input)[N]) {
132
1/2
✓ Branch 0 taken 337 times.
✗ Branch 1 not taken.
502 if (input[N-1] == '\0')
133 502 return AsciiString{N-1};
134 return AsciiString{N};
135 }
136
137 static AsciiString from(const std::string& n) {
138 return AsciiString{n.size()};
139 }
140 };
141
142 /*!
143 * \ingroup Common
144 * \brief Helper class for I/O from HDF5 files.
145 * \note Currently, strings are ascii encoded, in contrast to the standard utf-8
146 * that HighFive uses. Once necessary, we'll make the encoding settable.
147 */
148 template<Concepts::Communicator Communicator = NullCommunicator>
149 class File {
150 public:
151 enum Mode {
152 overwrite, //!< remove all content before writing
153 append, //!< append given data to existing datasets
154 read_only //!< only read data
155 };
156
157 2 File(const std::string& filename, Mode mode = Mode::read_only)
158 requires(std::same_as<Communicator, NullCommunicator>)
159
1/2
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
2 : File(filename, NullCommunicator{}, mode)
160 2 {}
161
162 599 File(const std::string& filename, const Communicator& comm, Mode mode = Mode::read_only)
163 354 : _comm{comm}
164 599 , _mode{mode}
165 599 , _file{_open(filename)}
166 599 {}
167
168 //! Clear the contents of the file with the given name
169 48 static void clear(const std::string& filename, const Communicator& comm) {
170
2/2
✓ Branch 1 taken 34 times.
✓ Branch 2 taken 14 times.
48 if (Parallel::rank(comm) == 0) // clear file by open it in overwrite mode
171
1/2
✓ Branch 2 taken 34 times.
✗ Branch 3 not taken.
34 HighFive::File{filename, HighFive::File::Overwrite};
172 48 Parallel::barrier(comm);
173 48 }
174
175 //! Write the given values to the attribute with the given name into the given group
176 template<typename Values>
177 2308 void write_attribute(const Values& values, const std::string& path) {
178
1/2
✓ Branch 1 taken 1161 times.
✗ Branch 2 not taken.
2308 _check_writable();
179
1/2
✓ Branch 1 taken 1161 times.
✗ Branch 2 not taken.
2308 const auto [group, name] = Detail::split_group(path);
180
1/2
✓ Branch 1 taken 1161 times.
✗ Branch 2 not taken.
2308 _clear_attribute(name, group);
181
2/4
✓ Branch 1 taken 1161 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1161 times.
✗ Branch 5 not taken.
2308 _get_group(group).createAttribute(name, values);
182 2308 }
183
184 //! Write the given characters to the attribute with the given name into the given group
185 template<std::size_t N>
186 502 void write_attribute(const char (&values)[N], const std::string& path) {
187
1/2
✓ Branch 1 taken 337 times.
✗ Branch 2 not taken.
502 _check_writable();
188
1/2
✓ Branch 1 taken 337 times.
✗ Branch 2 not taken.
502 const auto [group, name] = Detail::split_group(path);
189
1/2
✓ Branch 1 taken 337 times.
✗ Branch 2 not taken.
502 _clear_attribute(name, group);
190
2/4
✓ Branch 1 taken 337 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 337 times.
✗ Branch 5 not taken.
1004 auto type_attr = _get_group(group).createAttribute(
191 name,
192
1/2
✓ Branch 1 taken 337 times.
✗ Branch 2 not taken.
1004 HighFive::DataSpace{1},
193
1/2
✓ Branch 1 taken 337 times.
✗ Branch 2 not taken.
1004 AsciiString::from(values)
194 );
195
1/2
✓ Branch 1 taken 337 times.
✗ Branch 2 not taken.
502 type_attr.write(values);
196 502 }
197
198 //! Write the given values into the dataset with the given path
199 template<std::ranges::range Values>
200 7768 void write(const Values& values,
201 const std::string& path,
202 const std::optional<Slice>& slice = {}) {
203
1/2
✓ Branch 1 taken 3884 times.
✗ Branch 2 not taken.
7768 _check_writable();
204
1/2
✓ Branch 1 taken 3884 times.
✗ Branch 2 not taken.
7768 const auto [group_name, ds_name] = Detail::split_group(path);
205
5/8
✓ Branch 1 taken 684 times.
✓ Branch 2 taken 3200 times.
✓ Branch 5 taken 684 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 684 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 3200 times.
✗ Branch 12 not taken.
7768 const auto space = slice ? HighFive::DataSpace{slice->total_size.value()}
206 : HighFive::DataSpace::From(values);
207
1/2
✓ Branch 1 taken 3884 times.
✗ Branch 2 not taken.
7768 auto group = _get_group(group_name);
208
1/2
✓ Branch 1 taken 3884 times.
✗ Branch 2 not taken.
7768 auto [offset, dataset] = _prepare_dataset<FieldScalar<Values>>(group, ds_name, space);
209
2/6
✓ Branch 1 taken 3200 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 3200 times.
✗ Branch 5 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
14168 Slice _slice{
210
6/10
✓ Branch 1 taken 684 times.
✓ Branch 2 taken 3200 times.
✓ Branch 5 taken 684 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 3200 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 3200 times.
✓ Branch 11 taken 684 times.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
21936 .offset = slice ? slice->offset : std::vector<std::size_t>(space.getNumberDimensions(), 0),
211
3/4
✓ Branch 1 taken 684 times.
✓ Branch 2 taken 3200 times.
✓ Branch 5 taken 684 times.
✗ Branch 6 not taken.
7768 .count = slice ? slice->count : space.getDimensions()
212 };
213
1/2
✓ Branch 1 taken 3884 times.
✗ Branch 2 not taken.
7768 _slice.offset.at(0) += offset;
214
215
3/4
✓ Branch 1 taken 2306 times.
✓ Branch 2 taken 1578 times.
✓ Branch 3 taken 2306 times.
✗ Branch 4 not taken.
7768 if (Parallel::size(_comm) > 1) {
216
2/2
✓ Branch 1 taken 684 times.
✓ Branch 2 taken 1622 times.
4612 if (slice) { // collective I/O
217
1/2
✓ Branch 1 taken 684 times.
✗ Branch 2 not taken.
1368 const auto props = Detail::parallel_transfer_props();
218
2/4
✓ Branch 1 taken 684 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 684 times.
✗ Branch 5 not taken.
1368 _write_to(dataset, values, _slice, props);
219
1/2
✓ Branch 1 taken 684 times.
✗ Branch 2 not taken.
1368 Detail::check_successful_collective_io(props);
220
3/4
✓ Branch 2 taken 1622 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 811 times.
✓ Branch 5 taken 811 times.
4612 } else if (Parallel::rank(_comm) == 0) { // write only on rank 0 to avoid clashes
221
1/2
✓ Branch 2 taken 811 times.
✗ Branch 3 not taken.
1622 _write_to(dataset, values, _slice);
222 }
223 } else {
224
1/2
✓ Branch 2 taken 1578 times.
✗ Branch 3 not taken.
3156 _write_to(dataset, values, _slice);
225 }
226
1/2
✓ Branch 1 taken 3884 times.
✗ Branch 2 not taken.
7768 _file.flush();
227 7768 }
228
229 //! Write a field into the dataset with the given path
230 3359 void write(const Field& field,
231 const std::string& path,
232 const std::optional<Slice>& slice = {}) {
233
1/2
✓ Branch 1 taken 3359 times.
✗ Branch 2 not taken.
3359 _check_writable();
234
1/2
✓ Branch 1 taken 3359 times.
✗ Branch 2 not taken.
3359 const auto layout = field.layout();
235
1/2
✓ Branch 1 taken 3359 times.
✗ Branch 2 not taken.
3359 const HighFive::DataSpace space{[&] () {
236
2/2
✓ Branch 1 taken 2424 times.
✓ Branch 2 taken 935 times.
3359 if (slice)
237
2/4
✓ Branch 2 taken 2424 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 2424 times.
✗ Branch 6 not taken.
2424 return slice->total_size.value();
238
2/4
✓ Branch 1 taken 935 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 935 times.
✗ Branch 5 not taken.
935 std::vector<std::size_t> dims(layout.dimension());
239
1/2
✓ Branch 1 taken 935 times.
✗ Branch 2 not taken.
935 layout.export_to(dims);
240 935 return dims;
241
1/2
✓ Branch 1 taken 3359 times.
✗ Branch 2 not taken.
7653 } ()};
242
243
1/2
✓ Branch 1 taken 3359 times.
✗ Branch 2 not taken.
3359 const auto [group_name, ds_name] = Detail::split_group(path);
244
1/2
✓ Branch 1 taken 3359 times.
✗ Branch 2 not taken.
3359 auto group = _get_group(group_name);
245
2/4
✓ Branch 1 taken 3359 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 3359 times.
✗ Branch 5 not taken.
10077 field.precision().visit([&] <typename T> (const Precision<T>&) {
246
5/22
✓ Branch 1 taken 222 times.
✗ Branch 2 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
✓ Branch 31 taken 125 times.
✗ Branch 32 not taken.
✗ Branch 36 not taken.
✗ Branch 37 not taken.
✓ Branch 41 taken 28 times.
✗ Branch 42 not taken.
✓ Branch 46 taken 1646 times.
✗ Branch 47 not taken.
✓ Branch 51 taken 1338 times.
✗ Branch 52 not taken.
3359 auto [offset, dataset] = _prepare_dataset<T>(group, ds_name, space);
247
10/66
✓ Branch 1 taken 114 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 114 times.
✗ Branch 5 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 24 not taken.
✗ Branch 25 not taken.
✗ Branch 27 not taken.
✗ Branch 28 not taken.
✗ Branch 31 not taken.
✗ Branch 32 not taken.
✗ Branch 34 not taken.
✗ Branch 35 not taken.
✗ Branch 37 not taken.
✗ Branch 38 not taken.
✗ Branch 41 not taken.
✗ Branch 42 not taken.
✗ Branch 44 not taken.
✗ Branch 45 not taken.
✗ Branch 47 not taken.
✗ Branch 48 not taken.
✗ Branch 51 not taken.
✗ Branch 52 not taken.
✗ Branch 54 not taken.
✗ Branch 55 not taken.
✗ Branch 57 not taken.
✗ Branch 58 not taken.
✓ Branch 61 taken 71 times.
✗ Branch 62 not taken.
✓ Branch 64 taken 71 times.
✗ Branch 65 not taken.
✗ Branch 67 not taken.
✗ Branch 68 not taken.
✗ Branch 71 not taken.
✗ Branch 72 not taken.
✗ Branch 74 not taken.
✗ Branch 75 not taken.
✗ Branch 77 not taken.
✗ Branch 78 not taken.
✓ Branch 81 taken 28 times.
✗ Branch 82 not taken.
✓ Branch 84 taken 28 times.
✗ Branch 85 not taken.
✗ Branch 87 not taken.
✗ Branch 88 not taken.
✓ Branch 91 taken 407 times.
✗ Branch 92 not taken.
✓ Branch 94 taken 407 times.
✗ Branch 95 not taken.
✗ Branch 97 not taken.
✗ Branch 98 not taken.
✓ Branch 101 taken 315 times.
✗ Branch 102 not taken.
✓ Branch 104 taken 315 times.
✗ Branch 105 not taken.
✗ Branch 107 not taken.
✗ Branch 108 not taken.
4294 Slice _slice{
248
27/110
✓ Branch 1 taken 108 times.
✓ Branch 2 taken 114 times.
✓ Branch 5 taken 108 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 114 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 114 times.
✓ Branch 11 taken 108 times.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✗ Branch 33 not taken.
✗ Branch 34 not taken.
✗ Branch 36 not taken.
✗ Branch 37 not taken.
✗ Branch 38 not taken.
✗ Branch 39 not taken.
✗ Branch 40 not taken.
✗ Branch 41 not taken.
✗ Branch 43 not taken.
✗ Branch 44 not taken.
✗ Branch 47 not taken.
✗ Branch 48 not taken.
✗ Branch 50 not taken.
✗ Branch 51 not taken.
✗ Branch 52 not taken.
✗ Branch 53 not taken.
✗ Branch 54 not taken.
✗ Branch 55 not taken.
✗ Branch 57 not taken.
✗ Branch 58 not taken.
✗ Branch 61 not taken.
✗ Branch 62 not taken.
✗ Branch 64 not taken.
✗ Branch 65 not taken.
✗ Branch 66 not taken.
✗ Branch 67 not taken.
✗ Branch 68 not taken.
✗ Branch 69 not taken.
✗ Branch 71 not taken.
✗ Branch 72 not taken.
✗ Branch 75 not taken.
✗ Branch 76 not taken.
✗ Branch 78 not taken.
✗ Branch 79 not taken.
✗ Branch 80 not taken.
✗ Branch 81 not taken.
✗ Branch 82 not taken.
✗ Branch 83 not taken.
✓ Branch 85 taken 54 times.
✓ Branch 86 taken 71 times.
✓ Branch 89 taken 54 times.
✗ Branch 90 not taken.
✓ Branch 92 taken 71 times.
✗ Branch 93 not taken.
✓ Branch 94 taken 71 times.
✓ Branch 95 taken 54 times.
✗ Branch 96 not taken.
✗ Branch 97 not taken.
✗ Branch 99 not taken.
✗ Branch 100 not taken.
✗ Branch 103 not taken.
✗ Branch 104 not taken.
✗ Branch 106 not taken.
✗ Branch 107 not taken.
✗ Branch 108 not taken.
✗ Branch 109 not taken.
✗ Branch 110 not taken.
✗ Branch 111 not taken.
✗ Branch 113 not taken.
✓ Branch 114 taken 28 times.
✗ Branch 117 not taken.
✗ Branch 118 not taken.
✓ Branch 120 taken 28 times.
✗ Branch 121 not taken.
✓ Branch 122 taken 28 times.
✗ Branch 123 not taken.
✗ Branch 124 not taken.
✗ Branch 125 not taken.
✓ Branch 127 taken 1239 times.
✓ Branch 128 taken 407 times.
✓ Branch 131 taken 1239 times.
✗ Branch 132 not taken.
✓ Branch 134 taken 407 times.
✗ Branch 135 not taken.
✓ Branch 136 taken 407 times.
✓ Branch 137 taken 1239 times.
✗ Branch 138 not taken.
✗ Branch 139 not taken.
✓ Branch 141 taken 1023 times.
✓ Branch 142 taken 315 times.
✓ Branch 145 taken 1023 times.
✗ Branch 146 not taken.
✓ Branch 148 taken 315 times.
✗ Branch 149 not taken.
✓ Branch 150 taken 315 times.
✓ Branch 151 taken 1023 times.
✗ Branch 152 not taken.
✗ Branch 153 not taken.
7653 .offset = slice ? slice->offset : std::vector<std::size_t>(space.getNumberDimensions(), 0),
249
13/44
✓ Branch 1 taken 108 times.
✓ Branch 2 taken 114 times.
✓ Branch 5 taken 108 times.
✗ Branch 6 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✗ Branch 33 not taken.
✗ Branch 34 not taken.
✗ Branch 36 not taken.
✗ Branch 37 not taken.
✗ Branch 40 not taken.
✗ Branch 41 not taken.
✓ Branch 43 taken 54 times.
✓ Branch 44 taken 71 times.
✓ Branch 47 taken 54 times.
✗ Branch 48 not taken.
✗ Branch 50 not taken.
✗ Branch 51 not taken.
✗ Branch 54 not taken.
✗ Branch 55 not taken.
✗ Branch 57 not taken.
✓ Branch 58 taken 28 times.
✗ Branch 61 not taken.
✗ Branch 62 not taken.
✓ Branch 64 taken 1239 times.
✓ Branch 65 taken 407 times.
✓ Branch 68 taken 1239 times.
✗ Branch 69 not taken.
✓ Branch 71 taken 1023 times.
✓ Branch 72 taken 315 times.
✓ Branch 75 taken 1023 times.
✗ Branch 76 not taken.
3359 .count = slice ? slice->count : space.getDimensions()
250 };
251
5/22
✓ Branch 1 taken 222 times.
✗ Branch 2 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✓ Branch 19 taken 125 times.
✗ Branch 20 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✓ Branch 25 taken 28 times.
✗ Branch 26 not taken.
✓ Branch 28 taken 1646 times.
✗ Branch 29 not taken.
✓ Branch 31 taken 1338 times.
✗ Branch 32 not taken.
3359 _slice.offset.at(0) += offset;
252
253
5/22
✓ Branch 1 taken 222 times.
✗ Branch 2 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✓ Branch 19 taken 125 times.
✗ Branch 20 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✓ Branch 25 taken 28 times.
✗ Branch 26 not taken.
✓ Branch 28 taken 1646 times.
✗ Branch 29 not taken.
✓ Branch 31 taken 1338 times.
✗ Branch 32 not taken.
3359 const auto serialization = field.serialized();
254
5/22
✓ Branch 1 taken 222 times.
✗ Branch 2 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✓ Branch 19 taken 125 times.
✗ Branch 20 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✓ Branch 25 taken 28 times.
✗ Branch 26 not taken.
✓ Branch 28 taken 1646 times.
✗ Branch 29 not taken.
✓ Branch 31 taken 1338 times.
✗ Branch 32 not taken.
3359 const std::span<const T> span = serialization.template as_span_of<T>();
255
256
15/48
✓ Branch 1 taken 128 times.
✓ Branch 2 taken 94 times.
✓ Branch 3 taken 128 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✓ Branch 20 taken 53 times.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✗ Branch 25 not taken.
✓ Branch 26 taken 12 times.
✗ Branch 27 not taken.
✗ Branch 28 not taken.
✓ Branch 29 taken 604 times.
✓ Branch 31 taken 72 times.
✓ Branch 32 taken 498 times.
✓ Branch 33 taken 72 times.
✗ Branch 34 not taken.
✗ Branch 36 not taken.
✗ Branch 37 not taken.
✗ Branch 38 not taken.
✗ Branch 39 not taken.
✓ Branch 41 taken 16 times.
✗ Branch 42 not taken.
✓ Branch 43 taken 16 times.
✗ Branch 44 not taken.
✓ Branch 46 taken 1042 times.
✗ Branch 47 not taken.
✓ Branch 48 taken 1042 times.
✗ Branch 49 not taken.
✓ Branch 51 taken 840 times.
✗ Branch 52 not taken.
✓ Branch 53 taken 840 times.
✗ Branch 54 not taken.
3359 if (Parallel::size(_comm) > 1) {
257
7/22
✓ Branch 1 taken 52 times.
✓ Branch 2 taken 76 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✓ Branch 19 taken 26 times.
✓ Branch 20 taken 46 times.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 25 not taken.
✓ Branch 26 taken 16 times.
✓ Branch 28 taken 1042 times.
✗ Branch 29 not taken.
✓ Branch 31 taken 840 times.
✗ Branch 32 not taken.
2098 if (slice) { // collective I/O
258
4/22
✓ Branch 1 taken 52 times.
✗ Branch 2 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✓ Branch 19 taken 26 times.
✗ Branch 20 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✓ Branch 28 taken 1042 times.
✗ Branch 29 not taken.
✓ Branch 31 taken 840 times.
✗ Branch 32 not taken.
1960 const auto props = Detail::parallel_transfer_props();
259
8/44
✓ Branch 1 taken 52 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 52 times.
✗ Branch 6 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✗ Branch 28 not taken.
✗ Branch 29 not taken.
✗ Branch 32 not taken.
✗ Branch 33 not taken.
✗ Branch 37 not taken.
✗ Branch 38 not taken.
✗ Branch 41 not taken.
✗ Branch 42 not taken.
✗ Branch 46 not taken.
✗ Branch 47 not taken.
✗ Branch 50 not taken.
✗ Branch 51 not taken.
✓ Branch 55 taken 26 times.
✗ Branch 56 not taken.
✓ Branch 59 taken 26 times.
✗ Branch 60 not taken.
✗ Branch 64 not taken.
✗ Branch 65 not taken.
✗ Branch 68 not taken.
✗ Branch 69 not taken.
✗ Branch 73 not taken.
✗ Branch 74 not taken.
✗ Branch 77 not taken.
✗ Branch 78 not taken.
✓ Branch 82 taken 1042 times.
✗ Branch 83 not taken.
✓ Branch 86 taken 1042 times.
✗ Branch 87 not taken.
✓ Branch 91 taken 840 times.
✗ Branch 92 not taken.
✓ Branch 95 taken 840 times.
✗ Branch 96 not taken.
1960 _write_to(dataset, span.data(), _slice, props);
260
4/22
✓ Branch 1 taken 52 times.
✗ Branch 2 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✓ Branch 19 taken 26 times.
✗ Branch 20 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✓ Branch 28 taken 1042 times.
✗ Branch 29 not taken.
✓ Branch 31 taken 840 times.
✗ Branch 32 not taken.
1960 Detail::check_successful_collective_io(props);
261
9/53
✓ Branch 2 taken 76 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 34 times.
✓ Branch 5 taken 42 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
✗ Branch 28 not taken.
✗ Branch 30 not taken.
✗ Branch 31 not taken.
✗ Branch 32 not taken.
✗ Branch 33 not taken.
✗ Branch 37 not taken.
✗ Branch 38 not taken.
✗ Branch 39 not taken.
✗ Branch 40 not taken.
✗ Branch 42 not taken.
✗ Branch 43 not taken.
✓ Branch 44 taken 46 times.
✗ Branch 45 not taken.
✓ Branch 46 taken 21 times.
✓ Branch 47 taken 25 times.
✗ Branch 48 not taken.
✗ Branch 51 not taken.
✗ Branch 52 not taken.
✗ Branch 53 not taken.
✗ Branch 54 not taken.
✓ Branch 58 taken 16 times.
✗ Branch 59 not taken.
✓ Branch 60 taken 8 times.
✓ Branch 61 taken 8 times.
✗ Branch 65 not taken.
✗ Branch 66 not taken.
✗ Branch 67 not taken.
✗ Branch 68 not taken.
✗ Branch 72 not taken.
✗ Branch 73 not taken.
✗ Branch 74 not taken.
✗ Branch 75 not taken.
2098 } else if (Parallel::rank(_comm) == 0) { // write only on rank 0 to avoid clashes
262
3/22
✓ Branch 3 taken 34 times.
✗ Branch 4 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✗ Branch 24 not taken.
✗ Branch 25 not taken.
✗ Branch 31 not taken.
✗ Branch 32 not taken.
✗ Branch 38 not taken.
✗ Branch 39 not taken.
✓ Branch 45 taken 21 times.
✗ Branch 46 not taken.
✗ Branch 52 not taken.
✗ Branch 53 not taken.
✓ Branch 59 taken 8 times.
✗ Branch 60 not taken.
✗ Branch 66 not taken.
✗ Branch 67 not taken.
✗ Branch 73 not taken.
✗ Branch 74 not taken.
63 _write_to(dataset, span.data(), _slice);
263 }
264 } else {
265
5/22
✓ Branch 3 taken 94 times.
✗ Branch 4 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✗ Branch 24 not taken.
✗ Branch 25 not taken.
✗ Branch 31 not taken.
✗ Branch 32 not taken.
✗ Branch 38 not taken.
✗ Branch 39 not taken.
✓ Branch 45 taken 53 times.
✗ Branch 46 not taken.
✗ Branch 52 not taken.
✗ Branch 53 not taken.
✓ Branch 59 taken 12 times.
✗ Branch 60 not taken.
✓ Branch 66 taken 604 times.
✗ Branch 67 not taken.
✓ Branch 73 taken 498 times.
✗ Branch 74 not taken.
1261 _write_to(dataset, span.data(), _slice);
266 }
267
5/22
✓ Branch 1 taken 222 times.
✗ Branch 2 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✓ Branch 19 taken 125 times.
✗ Branch 20 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✓ Branch 25 taken 28 times.
✗ Branch 26 not taken.
✓ Branch 28 taken 1646 times.
✗ Branch 29 not taken.
✓ Branch 31 taken 1338 times.
✗ Branch 32 not taken.
3359 _file.flush();
268 3359 });
269 3359 }
270
271 //! Read dataset values into an instance of the given T
272 template<typename T>
273 requires(Concepts::ResizableMDRange<T> or Concepts::Scalar<T>)
274 13170 T read_dataset_to(const std::string& path,
275 const std::optional<Slice>& slice = {}) const {
276
1/2
✓ Branch 1 taken 3219 times.
✗ Branch 2 not taken.
26209 return visit_dataset(path, [&] <typename F> (BufferField<F>&& field) {
277 6601 return field.template export_to<T>();
278
1/2
✓ Branch 1 taken 3382 times.
✗ Branch 2 not taken.
26340 }, slice);
279 }
280
281 //! Visit the dataset field
282 template<std::invocable<BufferField<int>&&> Visitor>
283 17200 decltype(auto) visit_dataset(const std::string& path,
284 Visitor&& visitor,
285 const std::optional<Slice>& slice = {}) const {
286
2/4
✓ Branch 1 taken 8616 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 8616 times.
17200 if (!has_dataset_at(path))
287 throw ValueError("Given data set '" + path + "' does not exist.");
288
289
1/2
✓ Branch 1 taken 8616 times.
✗ Branch 2 not taken.
17200 auto [group, name] = Detail::split_group(path);
290
2/2
✓ Branch 1 taken 7048 times.
✓ Branch 2 taken 1568 times.
17200 if (slice)
291
1/2
✓ Branch 2 taken 3219 times.
✗ Branch 3 not taken.
6406 return _visit_data(
292 std::forward<Visitor>(visitor),
293
3/6
✓ Branch 1 taken 7048 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 7048 times.
✗ Branch 6 not taken.
✓ Branch 12 taken 7048 times.
✗ Branch 13 not taken.
28128 _file.getGroup(group).getDataSet(name).select(slice->offset, slice->count)
294
1/2
✓ Branch 2 taken 3829 times.
✗ Branch 3 not taken.
14064 );
295
3/6
✓ Branch 1 taken 1568 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1568 times.
✗ Branch 6 not taken.
✓ Branch 9 taken 1568 times.
✗ Branch 10 not taken.
3136 return _visit_data(std::forward<Visitor>(visitor), _file.getGroup(group).getDataSet(name));
296 17200 }
297
298 //! Read attribute values into an instance of the given T
299 template<typename T>
300 requires(Concepts::ResizableMDRange<T> or Concepts::Scalar<T>)
301 464 T read_attribute_to(const std::string& path) const {
302 696 return visit_attribute(path, [&] <typename F> (BufferField<F>&& field) {
303 232 return field.template export_to<T>();
304
1/2
✓ Branch 1 taken 232 times.
✗ Branch 2 not taken.
928 });
305 }
306
307 //! Visit the attribute field
308 template<std::invocable<BufferField<int>&&> Visitor>
309 680 decltype(auto) visit_attribute(const std::string& path, Visitor&& visitor) const {
310
2/4
✓ Branch 1 taken 340 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 340 times.
680 if (!has_attribute_at(path))
311 throw ValueError("Given attribute '" + path + "' does not exist.");
312
313
1/2
✓ Branch 1 taken 340 times.
✗ Branch 2 not taken.
680 auto [group, name] = Detail::split_group(path);
314
3/6
✓ Branch 1 taken 340 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 340 times.
✗ Branch 5 not taken.
✓ Branch 8 taken 340 times.
✗ Branch 9 not taken.
1360 return _visit_data(std::forward<Visitor>(visitor), _file.getGroup(group).getAttribute(name));
315 680 }
316
317 //! Get the dimensions of a dataset; returns null optional if it doesn't exist.
318 8344 std::optional<std::vector<std::size_t>> get_dimensions(const std::string& path) const {
319
2/2
✓ Branch 1 taken 4968 times.
✓ Branch 2 taken 572 times.
8344 if (has_dataset_at(path)) {
320
1/2
✓ Branch 1 taken 4968 times.
✗ Branch 2 not taken.
7556 const auto [group, name] = Detail::split_group(path);
321
3/6
✓ Branch 1 taken 4968 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 4968 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 4968 times.
✗ Branch 9 not taken.
7556 return _file.getGroup(group).getDataSet(name).getDimensions();
322 7556 }
323 788 return {};
324 }
325
326 //! Get the precision of a dataset; returns null optional if it doesn't exist.
327 4379 std::optional<DynamicPrecision> get_precision(const std::string& path) const {
328
1/2
✓ Branch 1 taken 2699 times.
✗ Branch 2 not taken.
4379 if (has_dataset_at(path)) {
329
1/2
✓ Branch 1 taken 2699 times.
✗ Branch 2 not taken.
4379 const auto [group, name] = Detail::split_group(path);
330
4/8
✓ Branch 1 taken 2699 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 2699 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 2699 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 2699 times.
✗ Branch 12 not taken.
4379 return _to_precision(_file.getGroup(group).getDataSet(name).getDataType());
331 4379 }
332 return {};
333 }
334
335 //! Return the names of all datasets in the given group
336 332 std::ranges::range auto dataset_names_in(const std::string& group) const {
337
2/4
✓ Branch 1 taken 202 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 202 times.
✗ Branch 5 not taken.
664 return _file.getGroup(group).listObjectNames()
338
2/6
✓ Branch 1 taken 202 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 202 times.
✗ Branch 5 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
1298 | std::views::filter([&, group=group] (const auto& name) {
339
4/8
✓ Branch 1 taken 720 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 720 times.
✗ Branch 5 not taken.
✓ Branch 9 taken 270 times.
✗ Branch 10 not taken.
✓ Branch 12 taken 270 times.
✗ Branch 13 not taken.
990 return _file.getGroup(group).getObjectType(name) == HighFive::ObjectType::Dataset;
340
1/2
✓ Branch 1 taken 202 times.
✗ Branch 2 not taken.
664 });
341 }
342
343 //! Return true if the given path exists in the file
344 3218 bool exists(const std::string& path) const {
345 3218 return _file.exist(path);
346 }
347
348 //! Return true if a dataset exists at the given path
349 27768 bool has_dataset_at(const std::string& path) const {
350
2/2
✓ Branch 1 taken 16869 times.
✓ Branch 2 taken 572 times.
27768 if (_file.exist(path)) {
351
1/2
✓ Branch 1 taken 16869 times.
✗ Branch 2 not taken.
26980 const auto [group, name] = Detail::split_group(path);
352
3/6
✓ Branch 1 taken 16869 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 16869 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 16869 times.
✗ Branch 8 not taken.
26980 if (_file.getGroup(group).exist(name))
353
2/4
✓ Branch 1 taken 16869 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 16869 times.
✗ Branch 5 not taken.
26980 return _file.getGroup(group).getObjectType(name) == HighFive::ObjectType::Dataset;
354
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 16869 times.
26980 }
355 788 return false;
356 }
357
358 //! Return true if an attribute exists at the given path
359 939 bool has_attribute_at(const std::string& path) const {
360
1/2
✓ Branch 1 taken 586 times.
✗ Branch 2 not taken.
939 const auto [parent_path, attr_name] = Detail::split_group(path);
361
2/4
✓ Branch 1 taken 586 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 586 times.
✗ Branch 4 not taken.
939 if (_file.exist(parent_path)) {
362
2/4
✓ Branch 1 taken 586 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 586 times.
939 if (has_dataset_at(parent_path)) {
363 const auto [group, dataset] = Detail::split_group(parent_path);
364 return _file.getGroup(group).getDataSet(dataset).hasAttribute(attr_name);
365 } else {
366
2/4
✓ Branch 1 taken 586 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 586 times.
✗ Branch 5 not taken.
939 return _file.getGroup(parent_path).hasAttribute(attr_name);
367 }
368 }
369 return false;
370 939 }
371
372 private:
373 8741 void _check_writable() const {
374
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 8741 times.
8741 if (_mode == read_only)
375 throw InvalidState("Cannot modify hdf-file opened in read-only mode");
376 8741 }
377
378 599 HighFive::File _open(const std::string& filename) const {
379
2/2
✓ Branch 0 taken 337 times.
✓ Branch 1 taken 114 times.
1012 auto open_mode = _mode == read_only ? HighFive::File::ReadOnly
380
2/2
✓ Branch 0 taken 133 times.
✓ Branch 1 taken 204 times.
413 : (_mode == overwrite ? HighFive::File::Overwrite
381 : HighFive::File::ReadWrite);
382
2/2
✓ Branch 1 taken 250 times.
✓ Branch 2 taken 201 times.
599 if (Parallel::size(_comm) > 1)
383
2/4
✓ Branch 1 taken 250 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 250 times.
✗ Branch 5 not taken.
708 return HighFive::File{filename, open_mode, Detail::parallel_file_access_props(_comm)};
384 else
385 245 return HighFive::File{filename, open_mode};
386 }
387
388 template<typename T>
389 14486 auto _prepare_dataset(HighFive::Group& group,
390 const std::string& name,
391 const HighFive::DataSpace& space) {
392
2/2
✓ Branch 0 taken 1335 times.
✓ Branch 1 taken 5908 times.
14486 if (_mode == overwrite)
393
2/4
✓ Branch 3 taken 1335 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 1335 times.
✗ Branch 7 not taken.
2670 return std::make_pair(std::size_t{0}, group.createDataSet(name, space, HighFive::create_datatype<T>()));
394
1/2
✓ Branch 0 taken 5908 times.
✗ Branch 1 not taken.
11816 else if (_mode == append) {
395
2/2
✓ Branch 1 taken 4528 times.
✓ Branch 2 taken 1380 times.
11816 if (group.exist(name)) {
396
1/2
✓ Branch 2 taken 4528 times.
✗ Branch 3 not taken.
9056 auto dataset = group.getDataSet(name);
397
1/2
✓ Branch 1 taken 4528 times.
✗ Branch 2 not taken.
9056 auto out_dimensions = dataset.getDimensions();
398
1/2
✓ Branch 1 taken 4528 times.
✗ Branch 2 not taken.
9056 const auto in_dimensions = space.getDimensions();
399
400
3/6
✓ Branch 1 taken 4528 times.
✗ Branch 2 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 4528 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 4528 times.
9056 if (out_dimensions.size() < 1 || in_dimensions.size() < 1)
401 throw ValueError("Cannot extend scalar datasets");
402 9056 if (
403
1/2
✓ Branch 1 taken 4528 times.
✗ Branch 2 not taken.
9056 !std::ranges::equal(
404 9056 std::ranges::subrange(out_dimensions.begin() + 1, out_dimensions.end()),
405
1/2
✗ Branch 4 not taken.
✓ Branch 5 taken 4528 times.
18112 std::ranges::subrange(in_dimensions.begin() + 1, in_dimensions.end())
406 )
407 )
408 throw ValueError("Dataset extension requires the sub-dimensions to be equal");
409
410 9056 const std::size_t offset = out_dimensions[0];
411 9056 out_dimensions[0] += in_dimensions[0];
412
1/2
✓ Branch 1 taken 4528 times.
✗ Branch 2 not taken.
9056 dataset.resize(out_dimensions);
413 9056 return std::make_pair(offset, std::move(dataset));
414 9056 } else {
415
1/2
✓ Branch 1 taken 1380 times.
✗ Branch 2 not taken.
2760 const auto init_dimensions = space.getDimensions();
416
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 1380 times.
2760 if (init_dimensions.size() < 1)
417 throw ValueError("Scalars cannot be written in appended mode. Wrap them in std::array{scalar}");
418
419
1/2
✓ Branch 3 taken 1380 times.
✗ Branch 4 not taken.
5520 const auto chunk_dimensions = std::vector<hsize_t>{init_dimensions.begin(), init_dimensions.end()};
420
1/2
✓ Branch 1 taken 1380 times.
✗ Branch 2 not taken.
4140 const auto max_dimensions = [&] () {
421 1380 auto tmp = init_dimensions;
422 1380 tmp[0] *= HighFive::DataSpace::UNLIMITED;
423 1380 return tmp;
424 } ();
425
426
1/2
✓ Branch 1 taken 1380 times.
✗ Branch 2 not taken.
2760 HighFive::DataSpace out_space(init_dimensions, max_dimensions);
427 2760 HighFive::DataSetCreateProps props;
428
2/4
✓ Branch 1 taken 1380 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1380 times.
✗ Branch 5 not taken.
2760 props.add(HighFive::Chunking(chunk_dimensions));
429 return std::make_pair(
430 5520 std::size_t{0},
431
2/4
✓ Branch 2 taken 1380 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1380 times.
✗ Branch 6 not taken.
5520 group.createDataSet(name, out_space, HighFive::create_datatype<T>(), props)
432 2760 );
433 2760 }
434 } else {
435 throw NotImplemented("Unknown file mode");
436 }
437 }
438
439 template<typename Values>
440 6146 void _write_to(HighFive::DataSet& dataset,
441 const Values& values,
442 const Slice& slice,
443 const std::optional<HighFive::DataTransferProps> props = {}) {
444
8/16
✓ Branch 1 taken 684 times.
✓ Branch 2 taken 2389 times.
✓ Branch 6 taken 684 times.
✗ Branch 7 not taken.
✓ Branch 10 taken 684 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 684 times.
✓ Branch 14 taken 2389 times.
✓ Branch 16 taken 684 times.
✓ Branch 17 taken 2389 times.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
12292 props ? dataset.select(slice.offset, slice.count).write(values, *props)
445
12/22
✓ Branch 3 taken 2389 times.
✗ Branch 4 not taken.
✓ Branch 7 taken 2389 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 2389 times.
✓ Branch 10 taken 684 times.
✓ Branch 12 taken 2389 times.
✓ Branch 13 taken 684 times.
✓ Branch 15 taken 2389 times.
✓ Branch 16 taken 684 times.
✓ Branch 18 taken 2389 times.
✓ Branch 19 taken 684 times.
✓ Branch 21 taken 684 times.
✓ Branch 22 taken 2389 times.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✗ Branch 32 not taken.
✗ Branch 33 not taken.
6146 : dataset.select(slice.offset, slice.count).write(values);
446 6146 }
447
448 template<Concepts::Scalar T>
449 6568 void _write_to(HighFive::DataSet& dataset,
450 const T* buffer,
451 const Slice& slice,
452 const std::optional<HighFive::DataTransferProps> props = {}) {
453
11/22
✓ Branch 1 taken 1960 times.
✓ Branch 2 taken 1324 times.
✓ Branch 6 taken 1960 times.
✗ Branch 7 not taken.
✓ Branch 10 taken 1960 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 1960 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 1960 times.
✓ Branch 17 taken 1324 times.
✓ Branch 19 taken 1960 times.
✓ Branch 20 taken 1324 times.
✓ Branch 22 taken 1960 times.
✓ Branch 23 taken 1324 times.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✗ Branch 28 not taken.
✗ Branch 29 not taken.
✗ Branch 31 not taken.
✗ Branch 32 not taken.
✗ Branch 34 not taken.
✗ Branch 35 not taken.
13136 props ? dataset.select(slice.offset, slice.count).write_raw(buffer, dataset.getDataType(), *props)
454
15/28
✓ Branch 3 taken 1324 times.
✗ Branch 4 not taken.
✓ Branch 7 taken 1324 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 1324 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 1324 times.
✓ Branch 13 taken 1960 times.
✓ Branch 15 taken 1324 times.
✓ Branch 16 taken 1960 times.
✓ Branch 18 taken 1324 times.
✓ Branch 19 taken 1960 times.
✓ Branch 21 taken 1324 times.
✓ Branch 22 taken 1960 times.
✓ Branch 24 taken 1324 times.
✓ Branch 25 taken 1960 times.
✓ Branch 27 taken 1960 times.
✓ Branch 28 taken 1324 times.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✗ Branch 32 not taken.
✗ Branch 33 not taken.
✗ Branch 35 not taken.
✗ Branch 36 not taken.
✗ Branch 38 not taken.
✗ Branch 39 not taken.
✗ Branch 41 not taken.
✗ Branch 42 not taken.
6568 : dataset.select(slice.offset, slice.count).write_raw(buffer, dataset.getDataType());
455 6568 }
456
457 template<typename Visitor, typename Source>
458 17912 decltype(auto) _visit_data(Visitor&& visitor, const Source& source) const {
459
1/2
✓ Branch 1 taken 8956 times.
✗ Branch 2 not taken.
17912 const auto datatype = source.getDataType();
460
3/4
✓ Branch 1 taken 8956 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 112 times.
✓ Branch 4 taken 8844 times.
17912 if (datatype.isFixedLenStr()) {
461 static constexpr std::size_t N = 100;
462 224 HighFive::FixedLenStringArray<N> pre_out;
463
1/3
✓ Branch 1 taken 112 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
224 source.read(pre_out);
464
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 112 times.
224 if (pre_out.size() > 1)
465 throw SizeError("Unexpected string array size");
466
467 224 std::string out;
468
2/4
✓ Branch 1 taken 112 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 112 times.
✗ Branch 5 not taken.
448 std::ranges::copy(
469
3/6
✓ Branch 1 taken 112 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 112 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 112 times.
✗ Branch 8 not taken.
2030 pre_out.getString(0) | std::views::take_while([] (const char c) { return c != '\0'; }),
470 std::back_inserter(out)
471 );
472
1/2
✓ Branch 2 taken 112 times.
✗ Branch 3 not taken.
224 MDLayout layout{{out.size()}};
473
2/4
✓ Branch 3 taken 112 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 112 times.
✗ Branch 7 not taken.
224 return visitor(BufferField{std::move(out), std::move(layout)});
474 224 } else {
475
2/4
✓ Branch 1 taken 8844 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 3327 times.
✗ Branch 5 not taken.
44004 return _to_precision(datatype).visit([&] <typename T> (const Precision<T>&) {
476
114/1980
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✗ Branch 28 not taken.
✗ Branch 29 not taken.
✗ Branch 33 not taken.
✗ Branch 34 not taken.
✗ Branch 36 not taken.
✗ Branch 37 not taken.
✗ Branch 41 not taken.
✗ Branch 42 not taken.
✗ Branch 44 not taken.
✗ Branch 45 not taken.
✗ Branch 49 not taken.
✗ Branch 50 not taken.
✗ Branch 52 not taken.
✗ Branch 53 not taken.
✗ Branch 57 not taken.
✗ Branch 58 not taken.
✗ Branch 60 not taken.
✗ Branch 61 not taken.
✗ Branch 65 not taken.
✗ Branch 66 not taken.
✗ Branch 68 not taken.
✗ Branch 69 not taken.
✗ Branch 73 not taken.
✗ Branch 74 not taken.
✗ Branch 76 not taken.
✗ Branch 77 not taken.
✗ Branch 81 not taken.
✗ Branch 82 not taken.
✗ Branch 84 not taken.
✗ Branch 85 not taken.
✗ Branch 89 not taken.
✗ Branch 90 not taken.
✗ Branch 92 not taken.
✗ Branch 93 not taken.
✗ Branch 97 not taken.
✗ Branch 98 not taken.
✗ Branch 100 not taken.
✗ Branch 101 not taken.
✗ Branch 105 not taken.
✗ Branch 106 not taken.
✗ Branch 108 not taken.
✗ Branch 109 not taken.
✗ Branch 113 not taken.
✗ Branch 114 not taken.
✗ Branch 116 not taken.
✗ Branch 117 not taken.
✓ Branch 121 taken 56 times.
✗ Branch 122 not taken.
✓ Branch 124 taken 56 times.
✗ Branch 125 not taken.
✗ Branch 129 not taken.
✗ Branch 130 not taken.
✗ Branch 132 not taken.
✗ Branch 133 not taken.
✗ Branch 137 not taken.
✗ Branch 138 not taken.
✗ Branch 140 not taken.
✗ Branch 141 not taken.
✓ Branch 145 taken 107 times.
✗ Branch 146 not taken.
✓ Branch 148 taken 107 times.
✗ Branch 149 not taken.
✗ Branch 153 not taken.
✗ Branch 154 not taken.
✗ Branch 156 not taken.
✗ Branch 157 not taken.
✗ Branch 161 not taken.
✗ Branch 162 not taken.
✗ Branch 164 not taken.
✗ Branch 165 not taken.
✗ Branch 169 not taken.
✗ Branch 170 not taken.
✗ Branch 172 not taken.
✗ Branch 173 not taken.
✗ Branch 177 not taken.
✗ Branch 178 not taken.
✗ Branch 180 not taken.
✗ Branch 181 not taken.
✗ Branch 185 not taken.
✗ Branch 186 not taken.
✗ Branch 188 not taken.
✗ Branch 189 not taken.
✗ Branch 193 not taken.
✗ Branch 194 not taken.
✗ Branch 196 not taken.
✗ Branch 197 not taken.
✗ Branch 201 not taken.
✗ Branch 202 not taken.
✗ Branch 204 not taken.
✗ Branch 205 not taken.
✓ Branch 209 taken 658 times.
✗ Branch 210 not taken.
✓ Branch 212 taken 658 times.
✗ Branch 213 not taken.
✓ Branch 217 taken 2 times.
✗ Branch 218 not taken.
✓ Branch 220 taken 2 times.
✗ Branch 221 not taken.
✓ Branch 225 taken 2 times.
✗ Branch 226 not taken.
✓ Branch 228 taken 2 times.
✗ Branch 229 not taken.
✗ Branch 233 not taken.
✗ Branch 234 not taken.
✗ Branch 236 not taken.
✗ Branch 237 not taken.
✗ Branch 241 not taken.
✗ Branch 242 not taken.
✗ Branch 244 not taken.
✗ Branch 245 not taken.
✗ Branch 249 not taken.
✗ Branch 250 not taken.
✗ Branch 252 not taken.
✗ Branch 253 not taken.
✗ Branch 257 not taken.
✗ Branch 258 not taken.
✗ Branch 260 not taken.
✗ Branch 261 not taken.
✗ Branch 265 not taken.
✗ Branch 266 not taken.
✗ Branch 268 not taken.
✗ Branch 269 not taken.
✗ Branch 273 not taken.
✗ Branch 274 not taken.
✗ Branch 276 not taken.
✗ Branch 277 not taken.
✓ Branch 281 taken 663 times.
✗ Branch 282 not taken.
✓ Branch 284 taken 663 times.
✗ Branch 285 not taken.
✗ Branch 289 not taken.
✗ Branch 290 not taken.
✗ Branch 292 not taken.
✗ Branch 293 not taken.
✗ Branch 297 not taken.
✗ Branch 298 not taken.
✗ Branch 300 not taken.
✗ Branch 301 not taken.
✗ Branch 305 not taken.
✗ Branch 306 not taken.
✗ Branch 308 not taken.
✗ Branch 309 not taken.
✗ Branch 313 not taken.
✗ Branch 314 not taken.
✗ Branch 316 not taken.
✗ Branch 317 not taken.
✗ Branch 321 not taken.
✗ Branch 322 not taken.
✗ Branch 324 not taken.
✗ Branch 325 not taken.
✗ Branch 329 not taken.
✗ Branch 330 not taken.
✗ Branch 332 not taken.
✗ Branch 333 not taken.
✗ Branch 337 not taken.
✗ Branch 338 not taken.
✗ Branch 340 not taken.
✗ Branch 341 not taken.
✗ Branch 345 not taken.
✗ Branch 346 not taken.
✗ Branch 348 not taken.
✗ Branch 349 not taken.
✗ Branch 353 not taken.
✗ Branch 354 not taken.
✗ Branch 356 not taken.
✗ Branch 357 not taken.
✗ Branch 361 not taken.
✗ Branch 362 not taken.
✗ Branch 364 not taken.
✗ Branch 365 not taken.
✗ Branch 369 not taken.
✗ Branch 370 not taken.
✗ Branch 372 not taken.
✗ Branch 373 not taken.
✗ Branch 377 not taken.
✗ Branch 378 not taken.
✗ Branch 380 not taken.
✗ Branch 381 not taken.
✗ Branch 385 not taken.
✗ Branch 386 not taken.
✗ Branch 388 not taken.
✗ Branch 389 not taken.
✗ Branch 393 not taken.
✗ Branch 394 not taken.
✗ Branch 396 not taken.
✗ Branch 397 not taken.
✗ Branch 401 not taken.
✗ Branch 402 not taken.
✗ Branch 404 not taken.
✗ Branch 405 not taken.
✗ Branch 409 not taken.
✗ Branch 410 not taken.
✗ Branch 412 not taken.
✗ Branch 413 not taken.
✗ Branch 417 not taken.
✗ Branch 418 not taken.
✗ Branch 420 not taken.
✗ Branch 421 not taken.
✗ Branch 425 not taken.
✗ Branch 426 not taken.
✗ Branch 428 not taken.
✗ Branch 429 not taken.
✗ Branch 433 not taken.
✗ Branch 434 not taken.
✗ Branch 436 not taken.
✗ Branch 437 not taken.
✓ Branch 441 taken 615 times.
✗ Branch 442 not taken.
✓ Branch 444 taken 615 times.
✗ Branch 445 not taken.
✓ Branch 449 taken 30 times.
✗ Branch 450 not taken.
✓ Branch 452 taken 30 times.
✗ Branch 453 not taken.
✗ Branch 457 not taken.
✗ Branch 458 not taken.
✗ Branch 460 not taken.
✗ Branch 461 not taken.
✗ Branch 465 not taken.
✗ Branch 466 not taken.
✗ Branch 468 not taken.
✗ Branch 469 not taken.
✗ Branch 473 not taken.
✗ Branch 474 not taken.
✗ Branch 476 not taken.
✗ Branch 477 not taken.
✗ Branch 481 not taken.
✗ Branch 482 not taken.
✗ Branch 484 not taken.
✗ Branch 485 not taken.
✗ Branch 489 not taken.
✗ Branch 490 not taken.
✗ Branch 492 not taken.
✗ Branch 493 not taken.
✗ Branch 497 not taken.
✗ Branch 498 not taken.
✗ Branch 500 not taken.
✗ Branch 501 not taken.
✗ Branch 505 not taken.
✗ Branch 506 not taken.
✗ Branch 508 not taken.
✗ Branch 509 not taken.
✗ Branch 513 not taken.
✗ Branch 514 not taken.
✗ Branch 516 not taken.
✗ Branch 517 not taken.
✗ Branch 521 not taken.
✗ Branch 522 not taken.
✗ Branch 524 not taken.
✗ Branch 525 not taken.
✗ Branch 529 not taken.
✗ Branch 530 not taken.
✗ Branch 532 not taken.
✗ Branch 533 not taken.
✗ Branch 537 not taken.
✗ Branch 538 not taken.
✗ Branch 540 not taken.
✗ Branch 541 not taken.
✗ Branch 545 not taken.
✗ Branch 546 not taken.
✗ Branch 548 not taken.
✗ Branch 549 not taken.
✗ Branch 553 not taken.
✗ Branch 554 not taken.
✗ Branch 556 not taken.
✗ Branch 557 not taken.
✗ Branch 561 not taken.
✗ Branch 562 not taken.
✗ Branch 564 not taken.
✗ Branch 565 not taken.
✗ Branch 569 not taken.
✗ Branch 570 not taken.
✗ Branch 572 not taken.
✗ Branch 573 not taken.
✗ Branch 577 not taken.
✗ Branch 578 not taken.
✗ Branch 580 not taken.
✗ Branch 581 not taken.
✗ Branch 585 not taken.
✗ Branch 586 not taken.
✗ Branch 588 not taken.
✗ Branch 589 not taken.
✗ Branch 593 not taken.
✗ Branch 594 not taken.
✗ Branch 596 not taken.
✗ Branch 597 not taken.
✗ Branch 601 not taken.
✗ Branch 602 not taken.
✗ Branch 604 not taken.
✗ Branch 605 not taken.
✗ Branch 609 not taken.
✗ Branch 610 not taken.
✗ Branch 612 not taken.
✗ Branch 613 not taken.
✗ Branch 617 not taken.
✗ Branch 618 not taken.
✗ Branch 620 not taken.
✗ Branch 621 not taken.
✓ Branch 625 taken 98 times.
✗ Branch 626 not taken.
✓ Branch 628 taken 98 times.
✗ Branch 629 not taken.
✗ Branch 633 not taken.
✗ Branch 634 not taken.
✗ Branch 636 not taken.
✗ Branch 637 not taken.
✗ Branch 641 not taken.
✗ Branch 642 not taken.
✗ Branch 644 not taken.
✗ Branch 645 not taken.
✗ Branch 649 not taken.
✗ Branch 650 not taken.
✗ Branch 652 not taken.
✗ Branch 653 not taken.
✓ Branch 657 taken 2 times.
✗ Branch 658 not taken.
✓ Branch 660 taken 2 times.
✗ Branch 661 not taken.
✗ Branch 665 not taken.
✗ Branch 666 not taken.
✗ Branch 668 not taken.
✗ Branch 669 not taken.
✓ Branch 673 taken 4 times.
✗ Branch 674 not taken.
✓ Branch 676 taken 4 times.
✗ Branch 677 not taken.
✗ Branch 681 not taken.
✗ Branch 682 not taken.
✗ Branch 684 not taken.
✗ Branch 685 not taken.
✓ Branch 689 taken 440 times.
✗ Branch 690 not taken.
✓ Branch 692 taken 440 times.
✗ Branch 693 not taken.
✗ Branch 697 not taken.
✗ Branch 698 not taken.
✗ Branch 700 not taken.
✗ Branch 701 not taken.
✗ Branch 705 not taken.
✗ Branch 706 not taken.
✗ Branch 708 not taken.
✗ Branch 709 not taken.
✗ Branch 713 not taken.
✗ Branch 714 not taken.
✗ Branch 716 not taken.
✗ Branch 717 not taken.
✗ Branch 721 not taken.
✗ Branch 722 not taken.
✗ Branch 724 not taken.
✗ Branch 725 not taken.
✗ Branch 729 not taken.
✗ Branch 730 not taken.
✗ Branch 732 not taken.
✗ Branch 733 not taken.
✗ Branch 737 not taken.
✗ Branch 738 not taken.
✗ Branch 740 not taken.
✗ Branch 741 not taken.
✗ Branch 745 not taken.
✗ Branch 746 not taken.
✗ Branch 748 not taken.
✗ Branch 749 not taken.
✗ Branch 753 not taken.
✗ Branch 754 not taken.
✗ Branch 756 not taken.
✗ Branch 757 not taken.
✓ Branch 761 taken 496 times.
✗ Branch 762 not taken.
✓ Branch 764 taken 496 times.
✗ Branch 765 not taken.
✗ Branch 769 not taken.
✗ Branch 770 not taken.
✗ Branch 772 not taken.
✗ Branch 773 not taken.
✗ Branch 777 not taken.
✗ Branch 778 not taken.
✗ Branch 780 not taken.
✗ Branch 781 not taken.
✗ Branch 785 not taken.
✗ Branch 786 not taken.
✗ Branch 788 not taken.
✗ Branch 789 not taken.
✗ Branch 793 not taken.
✗ Branch 794 not taken.
✗ Branch 796 not taken.
✗ Branch 797 not taken.
✗ Branch 801 not taken.
✗ Branch 802 not taken.
✗ Branch 804 not taken.
✗ Branch 805 not taken.
✗ Branch 809 not taken.
✗ Branch 810 not taken.
✗ Branch 812 not taken.
✗ Branch 813 not taken.
✗ Branch 817 not taken.
✗ Branch 818 not taken.
✗ Branch 820 not taken.
✗ Branch 821 not taken.
✓ Branch 825 taken 59 times.
✗ Branch 826 not taken.
✓ Branch 828 taken 59 times.
✗ Branch 829 not taken.
✗ Branch 833 not taken.
✗ Branch 834 not taken.
✗ Branch 836 not taken.
✗ Branch 837 not taken.
✗ Branch 841 not taken.
✗ Branch 842 not taken.
✗ Branch 844 not taken.
✗ Branch 845 not taken.
✗ Branch 849 not taken.
✗ Branch 850 not taken.
✗ Branch 852 not taken.
✗ Branch 853 not taken.
✗ Branch 857 not taken.
✗ Branch 858 not taken.
✗ Branch 860 not taken.
✗ Branch 861 not taken.
✗ Branch 865 not taken.
✗ Branch 866 not taken.
✗ Branch 868 not taken.
✗ Branch 869 not taken.
✗ Branch 873 not taken.
✗ Branch 874 not taken.
✗ Branch 876 not taken.
✗ Branch 877 not taken.
✓ Branch 881 taken 4 times.
✗ Branch 882 not taken.
✓ Branch 884 taken 4 times.
✗ Branch 885 not taken.
✗ Branch 889 not taken.
✗ Branch 890 not taken.
✗ Branch 892 not taken.
✗ Branch 893 not taken.
✗ Branch 897 not taken.
✗ Branch 898 not taken.
✗ Branch 900 not taken.
✗ Branch 901 not taken.
✗ Branch 905 not taken.
✗ Branch 906 not taken.
✗ Branch 908 not taken.
✗ Branch 909 not taken.
✗ Branch 913 not taken.
✗ Branch 914 not taken.
✗ Branch 916 not taken.
✗ Branch 917 not taken.
✗ Branch 921 not taken.
✗ Branch 922 not taken.
✗ Branch 924 not taken.
✗ Branch 925 not taken.
✗ Branch 929 not taken.
✗ Branch 930 not taken.
✗ Branch 932 not taken.
✗ Branch 933 not taken.
✗ Branch 937 not taken.
✗ Branch 938 not taken.
✗ Branch 940 not taken.
✗ Branch 941 not taken.
✗ Branch 945 not taken.
✗ Branch 946 not taken.
✗ Branch 948 not taken.
✗ Branch 949 not taken.
✓ Branch 953 taken 48 times.
✗ Branch 954 not taken.
✓ Branch 956 taken 48 times.
✗ Branch 957 not taken.
✗ Branch 961 not taken.
✗ Branch 962 not taken.
✗ Branch 964 not taken.
✗ Branch 965 not taken.
✗ Branch 969 not taken.
✗ Branch 970 not taken.
✗ Branch 972 not taken.
✗ Branch 973 not taken.
✗ Branch 977 not taken.
✗ Branch 978 not taken.
✗ Branch 980 not taken.
✗ Branch 981 not taken.
✗ Branch 985 not taken.
✗ Branch 986 not taken.
✗ Branch 988 not taken.
✗ Branch 989 not taken.
✗ Branch 993 not taken.
✗ Branch 994 not taken.
✗ Branch 996 not taken.
✗ Branch 997 not taken.
✓ Branch 1001 taken 220 times.
✗ Branch 1002 not taken.
✓ Branch 1004 taken 220 times.
✗ Branch 1005 not taken.
✗ Branch 1009 not taken.
✗ Branch 1010 not taken.
✗ Branch 1012 not taken.
✗ Branch 1013 not taken.
✗ Branch 1017 not taken.
✗ Branch 1018 not taken.
✗ Branch 1020 not taken.
✗ Branch 1021 not taken.
✗ Branch 1025 not taken.
✗ Branch 1026 not taken.
✗ Branch 1028 not taken.
✗ Branch 1029 not taken.
✗ Branch 1033 not taken.
✗ Branch 1034 not taken.
✗ Branch 1036 not taken.
✗ Branch 1037 not taken.
✗ Branch 1041 not taken.
✗ Branch 1042 not taken.
✗ Branch 1044 not taken.
✗ Branch 1045 not taken.
✗ Branch 1049 not taken.
✗ Branch 1050 not taken.
✗ Branch 1052 not taken.
✗ Branch 1053 not taken.
✓ Branch 1057 taken 3 times.
✗ Branch 1058 not taken.
✓ Branch 1060 taken 3 times.
✗ Branch 1061 not taken.
✗ Branch 1065 not taken.
✗ Branch 1066 not taken.
✗ Branch 1068 not taken.
✗ Branch 1069 not taken.
✗ Branch 1073 not taken.
✗ Branch 1074 not taken.
✗ Branch 1076 not taken.
✗ Branch 1077 not taken.
✓ Branch 1081 taken 40 times.
✗ Branch 1082 not taken.
✓ Branch 1084 taken 40 times.
✗ Branch 1085 not taken.
✓ Branch 1089 taken 536 times.
✗ Branch 1090 not taken.
✓ Branch 1092 taken 536 times.
✗ Branch 1093 not taken.
✗ Branch 1097 not taken.
✗ Branch 1098 not taken.
✗ Branch 1100 not taken.
✗ Branch 1101 not taken.
✗ Branch 1105 not taken.
✗ Branch 1106 not taken.
✗ Branch 1108 not taken.
✗ Branch 1109 not taken.
✗ Branch 1113 not taken.
✗ Branch 1114 not taken.
✗ Branch 1116 not taken.
✗ Branch 1117 not taken.
✗ Branch 1121 not taken.
✗ Branch 1122 not taken.
✗ Branch 1124 not taken.
✗ Branch 1125 not taken.
✓ Branch 1129 taken 180 times.
✗ Branch 1130 not taken.
✓ Branch 1132 taken 180 times.
✗ Branch 1133 not taken.
✗ Branch 1137 not taken.
✗ Branch 1138 not taken.
✗ Branch 1140 not taken.
✗ Branch 1141 not taken.
✗ Branch 1145 not taken.
✗ Branch 1146 not taken.
✗ Branch 1148 not taken.
✗ Branch 1149 not taken.
✗ Branch 1153 not taken.
✗ Branch 1154 not taken.
✗ Branch 1156 not taken.
✗ Branch 1157 not taken.
✗ Branch 1161 not taken.
✗ Branch 1162 not taken.
✗ Branch 1164 not taken.
✗ Branch 1165 not taken.
✗ Branch 1169 not taken.
✗ Branch 1170 not taken.
✗ Branch 1172 not taken.
✗ Branch 1173 not taken.
✗ Branch 1177 not taken.
✗ Branch 1178 not taken.
✗ Branch 1180 not taken.
✗ Branch 1181 not taken.
✗ Branch 1185 not taken.
✗ Branch 1186 not taken.
✗ Branch 1188 not taken.
✗ Branch 1189 not taken.
✗ Branch 1193 not taken.
✗ Branch 1194 not taken.
✗ Branch 1196 not taken.
✗ Branch 1197 not taken.
✗ Branch 1201 not taken.
✗ Branch 1202 not taken.
✗ Branch 1204 not taken.
✗ Branch 1205 not taken.
✗ Branch 1209 not taken.
✗ Branch 1210 not taken.
✗ Branch 1212 not taken.
✗ Branch 1213 not taken.
✗ Branch 1217 not taken.
✗ Branch 1218 not taken.
✗ Branch 1220 not taken.
✗ Branch 1221 not taken.
✗ Branch 1225 not taken.
✗ Branch 1226 not taken.
✗ Branch 1228 not taken.
✗ Branch 1229 not taken.
✗ Branch 1233 not taken.
✗ Branch 1234 not taken.
✗ Branch 1236 not taken.
✗ Branch 1237 not taken.
✗ Branch 1241 not taken.
✗ Branch 1242 not taken.
✗ Branch 1244 not taken.
✗ Branch 1245 not taken.
✗ Branch 1249 not taken.
✗ Branch 1250 not taken.
✗ Branch 1252 not taken.
✗ Branch 1253 not taken.
✗ Branch 1257 not taken.
✗ Branch 1258 not taken.
✗ Branch 1260 not taken.
✗ Branch 1261 not taken.
✗ Branch 1265 not taken.
✗ Branch 1266 not taken.
✗ Branch 1268 not taken.
✗ Branch 1269 not taken.
✓ Branch 1273 taken 2 times.
✗ Branch 1274 not taken.
✓ Branch 1276 taken 2 times.
✗ Branch 1277 not taken.
✗ Branch 1281 not taken.
✗ Branch 1282 not taken.
✗ Branch 1284 not taken.
✗ Branch 1285 not taken.
✓ Branch 1289 taken 72 times.
✗ Branch 1290 not taken.
✓ Branch 1292 taken 72 times.
✗ Branch 1293 not taken.
✗ Branch 1297 not taken.
✗ Branch 1298 not taken.
✗ Branch 1300 not taken.
✗ Branch 1301 not taken.
✗ Branch 1305 not taken.
✗ Branch 1306 not taken.
✗ Branch 1308 not taken.
✗ Branch 1309 not taken.
✗ Branch 1313 not taken.
✗ Branch 1314 not taken.
✗ Branch 1316 not taken.
✗ Branch 1317 not taken.
✓ Branch 1321 taken 20 times.
✗ Branch 1322 not taken.
✓ Branch 1324 taken 20 times.
✗ Branch 1325 not taken.
✗ Branch 1329 not taken.
✗ Branch 1330 not taken.
✗ Branch 1332 not taken.
✗ Branch 1333 not taken.
✗ Branch 1337 not taken.
✗ Branch 1338 not taken.
✗ Branch 1340 not taken.
✗ Branch 1341 not taken.
✗ Branch 1345 not taken.
✗ Branch 1346 not taken.
✗ Branch 1348 not taken.
✗ Branch 1349 not taken.
✓ Branch 1353 taken 448 times.
✗ Branch 1354 not taken.
✓ Branch 1356 taken 448 times.
✗ Branch 1357 not taken.
✗ Branch 1361 not taken.
✗ Branch 1362 not taken.
✗ Branch 1364 not taken.
✗ Branch 1365 not taken.
✗ Branch 1369 not taken.
✗ Branch 1370 not taken.
✗ Branch 1372 not taken.
✗ Branch 1373 not taken.
✗ Branch 1377 not taken.
✗ Branch 1378 not taken.
✗ Branch 1380 not taken.
✗ Branch 1381 not taken.
✗ Branch 1385 not taken.
✗ Branch 1386 not taken.
✗ Branch 1388 not taken.
✗ Branch 1389 not taken.
✗ Branch 1393 not taken.
✗ Branch 1394 not taken.
✗ Branch 1396 not taken.
✗ Branch 1397 not taken.
✗ Branch 1401 not taken.
✗ Branch 1402 not taken.
✗ Branch 1404 not taken.
✗ Branch 1405 not taken.
✗ Branch 1409 not taken.
✗ Branch 1410 not taken.
✗ Branch 1412 not taken.
✗ Branch 1413 not taken.
✗ Branch 1417 not taken.
✗ Branch 1418 not taken.
✗ Branch 1420 not taken.
✗ Branch 1421 not taken.
✓ Branch 1425 taken 400 times.
✗ Branch 1426 not taken.
✓ Branch 1428 taken 400 times.
✗ Branch 1429 not taken.
✗ Branch 1433 not taken.
✗ Branch 1434 not taken.
✗ Branch 1436 not taken.
✗ Branch 1437 not taken.
✗ Branch 1441 not taken.
✗ Branch 1442 not taken.
✗ Branch 1444 not taken.
✗ Branch 1445 not taken.
✗ Branch 1449 not taken.
✗ Branch 1450 not taken.
✗ Branch 1452 not taken.
✗ Branch 1453 not taken.
✗ Branch 1457 not taken.
✗ Branch 1458 not taken.
✗ Branch 1460 not taken.
✗ Branch 1461 not taken.
✗ Branch 1465 not taken.
✗ Branch 1466 not taken.
✗ Branch 1468 not taken.
✗ Branch 1469 not taken.
✗ Branch 1473 not taken.
✗ Branch 1474 not taken.
✗ Branch 1476 not taken.
✗ Branch 1477 not taken.
✗ Branch 1481 not taken.
✗ Branch 1482 not taken.
✗ Branch 1484 not taken.
✗ Branch 1485 not taken.
✗ Branch 1489 not taken.
✗ Branch 1490 not taken.
✗ Branch 1492 not taken.
✗ Branch 1493 not taken.
✗ Branch 1497 not taken.
✗ Branch 1498 not taken.
✗ Branch 1500 not taken.
✗ Branch 1501 not taken.
✗ Branch 1505 not taken.
✗ Branch 1506 not taken.
✗ Branch 1508 not taken.
✗ Branch 1509 not taken.
✗ Branch 1513 not taken.
✗ Branch 1514 not taken.
✗ Branch 1516 not taken.
✗ Branch 1517 not taken.
✗ Branch 1521 not taken.
✗ Branch 1522 not taken.
✗ Branch 1524 not taken.
✗ Branch 1525 not taken.
✗ Branch 1529 not taken.
✗ Branch 1530 not taken.
✗ Branch 1532 not taken.
✗ Branch 1533 not taken.
✓ Branch 1537 taken 65 times.
✗ Branch 1538 not taken.
✓ Branch 1540 taken 65 times.
✗ Branch 1541 not taken.
✗ Branch 1545 not taken.
✗ Branch 1546 not taken.
✗ Branch 1548 not taken.
✗ Branch 1549 not taken.
✗ Branch 1553 not taken.
✗ Branch 1554 not taken.
✗ Branch 1556 not taken.
✗ Branch 1557 not taken.
✗ Branch 1561 not taken.
✗ Branch 1562 not taken.
✗ Branch 1564 not taken.
✗ Branch 1565 not taken.
✗ Branch 1569 not taken.
✗ Branch 1570 not taken.
✗ Branch 1572 not taken.
✗ Branch 1573 not taken.
✗ Branch 1577 not taken.
✗ Branch 1578 not taken.
✗ Branch 1580 not taken.
✗ Branch 1581 not taken.
✓ Branch 1585 taken 14 times.
✗ Branch 1586 not taken.
✓ Branch 1588 taken 14 times.
✗ Branch 1589 not taken.
✗ Branch 1593 not taken.
✗ Branch 1594 not taken.
✗ Branch 1596 not taken.
✗ Branch 1597 not taken.
✗ Branch 1601 not taken.
✗ Branch 1602 not taken.
✗ Branch 1604 not taken.
✗ Branch 1605 not taken.
✗ Branch 1609 not taken.
✗ Branch 1610 not taken.
✗ Branch 1612 not taken.
✗ Branch 1613 not taken.
✗ Branch 1617 not taken.
✗ Branch 1618 not taken.
✗ Branch 1620 not taken.
✗ Branch 1621 not taken.
✗ Branch 1625 not taken.
✗ Branch 1626 not taken.
✗ Branch 1628 not taken.
✗ Branch 1629 not taken.
✗ Branch 1633 not taken.
✗ Branch 1634 not taken.
✗ Branch 1636 not taken.
✗ Branch 1637 not taken.
✗ Branch 1641 not taken.
✗ Branch 1642 not taken.
✗ Branch 1644 not taken.
✗ Branch 1645 not taken.
✗ Branch 1649 not taken.
✗ Branch 1650 not taken.
✗ Branch 1652 not taken.
✗ Branch 1653 not taken.
✗ Branch 1657 not taken.
✗ Branch 1658 not taken.
✗ Branch 1660 not taken.
✗ Branch 1661 not taken.
✓ Branch 1665 taken 776 times.
✗ Branch 1666 not taken.
✓ Branch 1668 taken 776 times.
✗ Branch 1669 not taken.
✓ Branch 1673 taken 60 times.
✗ Branch 1674 not taken.
✓ Branch 1676 taken 60 times.
✗ Branch 1677 not taken.
✗ Branch 1681 not taken.
✗ Branch 1682 not taken.
✗ Branch 1684 not taken.
✗ Branch 1685 not taken.
✗ Branch 1689 not taken.
✗ Branch 1690 not taken.
✗ Branch 1692 not taken.
✗ Branch 1693 not taken.
✓ Branch 1697 taken 42 times.
✗ Branch 1698 not taken.
✓ Branch 1700 taken 42 times.
✗ Branch 1701 not taken.
✗ Branch 1705 not taken.
✗ Branch 1706 not taken.
✗ Branch 1708 not taken.
✗ Branch 1709 not taken.
✗ Branch 1713 not taken.
✗ Branch 1714 not taken.
✗ Branch 1716 not taken.
✗ Branch 1717 not taken.
✗ Branch 1721 not taken.
✗ Branch 1722 not taken.
✗ Branch 1724 not taken.
✗ Branch 1725 not taken.
✗ Branch 1729 not taken.
✗ Branch 1730 not taken.
✗ Branch 1732 not taken.
✗ Branch 1733 not taken.
✗ Branch 1737 not taken.
✗ Branch 1738 not taken.
✗ Branch 1740 not taken.
✗ Branch 1741 not taken.
✓ Branch 1745 taken 28 times.
✗ Branch 1746 not taken.
✓ Branch 1748 taken 28 times.
✗ Branch 1749 not taken.
✗ Branch 1753 not taken.
✗ Branch 1754 not taken.
✗ Branch 1756 not taken.
✗ Branch 1757 not taken.
✗ Branch 1761 not taken.
✗ Branch 1762 not taken.
✗ Branch 1764 not taken.
✗ Branch 1765 not taken.
✗ Branch 1769 not taken.
✗ Branch 1770 not taken.
✗ Branch 1772 not taken.
✗ Branch 1773 not taken.
✗ Branch 1777 not taken.
✗ Branch 1778 not taken.
✗ Branch 1780 not taken.
✗ Branch 1781 not taken.
✗ Branch 1785 not taken.
✗ Branch 1786 not taken.
✗ Branch 1788 not taken.
✗ Branch 1789 not taken.
✗ Branch 1793 not taken.
✗ Branch 1794 not taken.
✗ Branch 1796 not taken.
✗ Branch 1797 not taken.
✗ Branch 1801 not taken.
✗ Branch 1802 not taken.
✗ Branch 1804 not taken.
✗ Branch 1805 not taken.
✗ Branch 1809 not taken.
✗ Branch 1810 not taken.
✗ Branch 1812 not taken.
✗ Branch 1813 not taken.
✗ Branch 1817 not taken.
✗ Branch 1818 not taken.
✗ Branch 1820 not taken.
✗ Branch 1821 not taken.
✗ Branch 1825 not taken.
✗ Branch 1826 not taken.
✗ Branch 1828 not taken.
✗ Branch 1829 not taken.
✗ Branch 1833 not taken.
✗ Branch 1834 not taken.
✗ Branch 1836 not taken.
✗ Branch 1837 not taken.
✗ Branch 1841 not taken.
✗ Branch 1842 not taken.
✗ Branch 1844 not taken.
✗ Branch 1845 not taken.
✗ Branch 1849 not taken.
✗ Branch 1850 not taken.
✗ Branch 1852 not taken.
✗ Branch 1853 not taken.
✓ Branch 1857 taken 20 times.
✗ Branch 1858 not taken.
✓ Branch 1860 taken 20 times.
✗ Branch 1861 not taken.
✗ Branch 1865 not taken.
✗ Branch 1866 not taken.
✗ Branch 1868 not taken.
✗ Branch 1869 not taken.
✗ Branch 1873 not taken.
✗ Branch 1874 not taken.
✗ Branch 1876 not taken.
✗ Branch 1877 not taken.
✗ Branch 1881 not taken.
✗ Branch 1882 not taken.
✗ Branch 1884 not taken.
✗ Branch 1885 not taken.
✗ Branch 1889 not taken.
✗ Branch 1890 not taken.
✗ Branch 1892 not taken.
✗ Branch 1893 not taken.
✗ Branch 1897 not taken.
✗ Branch 1898 not taken.
✗ Branch 1900 not taken.
✗ Branch 1901 not taken.
✗ Branch 1905 not taken.
✗ Branch 1906 not taken.
✗ Branch 1908 not taken.
✗ Branch 1909 not taken.
✗ Branch 1913 not taken.
✗ Branch 1914 not taken.
✗ Branch 1916 not taken.
✗ Branch 1917 not taken.
✓ Branch 1921 taken 2 times.
✗ Branch 1922 not taken.
✓ Branch 1924 taken 2 times.
✗ Branch 1925 not taken.
✗ Branch 1929 not taken.
✗ Branch 1930 not taken.
✗ Branch 1932 not taken.
✗ Branch 1933 not taken.
✓ Branch 1937 taken 4 times.
✗ Branch 1938 not taken.
✓ Branch 1940 taken 4 times.
✗ Branch 1941 not taken.
✓ Branch 1945 taken 4 times.
✗ Branch 1946 not taken.
✓ Branch 1948 taken 4 times.
✗ Branch 1949 not taken.
✗ Branch 1953 not taken.
✗ Branch 1954 not taken.
✗ Branch 1956 not taken.
✗ Branch 1957 not taken.
✓ Branch 1961 taken 8 times.
✗ Branch 1962 not taken.
✓ Branch 1964 taken 8 times.
✗ Branch 1965 not taken.
✗ Branch 1969 not taken.
✗ Branch 1970 not taken.
✗ Branch 1972 not taken.
✗ Branch 1973 not taken.
✗ Branch 1977 not taken.
✗ Branch 1978 not taken.
✗ Branch 1980 not taken.
✗ Branch 1981 not taken.
✗ Branch 1985 not taken.
✗ Branch 1986 not taken.
✗ Branch 1988 not taken.
✗ Branch 1989 not taken.
✗ Branch 1993 not taken.
✗ Branch 1994 not taken.
✗ Branch 1996 not taken.
✗ Branch 1997 not taken.
✗ Branch 2001 not taken.
✗ Branch 2002 not taken.
✗ Branch 2004 not taken.
✗ Branch 2005 not taken.
✗ Branch 2009 not taken.
✗ Branch 2010 not taken.
✗ Branch 2012 not taken.
✗ Branch 2013 not taken.
✗ Branch 2017 not taken.
✗ Branch 2018 not taken.
✗ Branch 2020 not taken.
✗ Branch 2021 not taken.
✗ Branch 2025 not taken.
✗ Branch 2026 not taken.
✗ Branch 2028 not taken.
✗ Branch 2029 not taken.
✗ Branch 2033 not taken.
✗ Branch 2034 not taken.
✗ Branch 2036 not taken.
✗ Branch 2037 not taken.
✗ Branch 2041 not taken.
✗ Branch 2042 not taken.
✗ Branch 2044 not taken.
✗ Branch 2045 not taken.
✗ Branch 2049 not taken.
✗ Branch 2050 not taken.
✗ Branch 2052 not taken.
✗ Branch 2053 not taken.
✗ Branch 2057 not taken.
✗ Branch 2058 not taken.
✗ Branch 2060 not taken.
✗ Branch 2061 not taken.
✗ Branch 2065 not taken.
✗ Branch 2066 not taken.
✗ Branch 2068 not taken.
✗ Branch 2069 not taken.
✗ Branch 2073 not taken.
✗ Branch 2074 not taken.
✗ Branch 2076 not taken.
✗ Branch 2077 not taken.
✗ Branch 2081 not taken.
✗ Branch 2082 not taken.
✗ Branch 2084 not taken.
✗ Branch 2085 not taken.
✗ Branch 2089 not taken.
✗ Branch 2090 not taken.
✗ Branch 2092 not taken.
✗ Branch 2093 not taken.
✓ Branch 2097 taken 8 times.
✗ Branch 2098 not taken.
✓ Branch 2100 taken 8 times.
✗ Branch 2101 not taken.
✗ Branch 2105 not taken.
✗ Branch 2106 not taken.
✗ Branch 2108 not taken.
✗ Branch 2109 not taken.
✗ Branch 2113 not taken.
✗ Branch 2114 not taken.
✗ Branch 2116 not taken.
✗ Branch 2117 not taken.
✓ Branch 2121 taken 209 times.
✗ Branch 2122 not taken.
✓ Branch 2124 taken 209 times.
✗ Branch 2125 not taken.
✗ Branch 2129 not taken.
✗ Branch 2130 not taken.
✗ Branch 2132 not taken.
✗ Branch 2133 not taken.
✗ Branch 2137 not taken.
✗ Branch 2138 not taken.
✗ Branch 2140 not taken.
✗ Branch 2141 not taken.
✗ Branch 2145 not taken.
✗ Branch 2146 not taken.
✗ Branch 2148 not taken.
✗ Branch 2149 not taken.
✗ Branch 2153 not taken.
✗ Branch 2154 not taken.
✗ Branch 2156 not taken.
✗ Branch 2157 not taken.
✗ Branch 2161 not taken.
✗ Branch 2162 not taken.
✗ Branch 2164 not taken.
✗ Branch 2165 not taken.
✗ Branch 2169 not taken.
✗ Branch 2170 not taken.
✗ Branch 2172 not taken.
✗ Branch 2173 not taken.
✗ Branch 2177 not taken.
✗ Branch 2178 not taken.
✗ Branch 2180 not taken.
✗ Branch 2181 not taken.
✗ Branch 2185 not taken.
✗ Branch 2186 not taken.
✗ Branch 2188 not taken.
✗ Branch 2189 not taken.
✗ Branch 2193 not taken.
✗ Branch 2194 not taken.
✗ Branch 2196 not taken.
✗ Branch 2197 not taken.
✗ Branch 2201 not taken.
✗ Branch 2202 not taken.
✗ Branch 2204 not taken.
✗ Branch 2205 not taken.
✓ Branch 2209 taken 7 times.
✗ Branch 2210 not taken.
✓ Branch 2212 taken 7 times.
✗ Branch 2213 not taken.
✗ Branch 2217 not taken.
✗ Branch 2218 not taken.
✗ Branch 2220 not taken.
✗ Branch 2221 not taken.
✗ Branch 2225 not taken.
✗ Branch 2226 not taken.
✗ Branch 2228 not taken.
✗ Branch 2229 not taken.
✗ Branch 2233 not taken.
✗ Branch 2234 not taken.
✗ Branch 2236 not taken.
✗ Branch 2237 not taken.
✗ Branch 2241 not taken.
✗ Branch 2242 not taken.
✗ Branch 2244 not taken.
✗ Branch 2245 not taken.
✗ Branch 2249 not taken.
✗ Branch 2250 not taken.
✗ Branch 2252 not taken.
✗ Branch 2253 not taken.
✗ Branch 2257 not taken.
✗ Branch 2258 not taken.
✗ Branch 2260 not taken.
✗ Branch 2261 not taken.
✗ Branch 2265 not taken.
✗ Branch 2266 not taken.
✗ Branch 2268 not taken.
✗ Branch 2269 not taken.
✓ Branch 2273 taken 207 times.
✗ Branch 2274 not taken.
✓ Branch 2276 taken 207 times.
✗ Branch 2277 not taken.
✗ Branch 2281 not taken.
✗ Branch 2282 not taken.
✗ Branch 2284 not taken.
✗ Branch 2285 not taken.
✗ Branch 2289 not taken.
✗ Branch 2290 not taken.
✗ Branch 2292 not taken.
✗ Branch 2293 not taken.
✗ Branch 2297 not taken.
✗ Branch 2298 not taken.
✗ Branch 2300 not taken.
✗ Branch 2301 not taken.
✓ Branch 2305 taken 4 times.
✗ Branch 2306 not taken.
✓ Branch 2308 taken 4 times.
✗ Branch 2309 not taken.
✗ Branch 2313 not taken.
✗ Branch 2314 not taken.
✗ Branch 2316 not taken.
✗ Branch 2317 not taken.
✓ Branch 2321 taken 8 times.
✗ Branch 2322 not taken.
✓ Branch 2324 taken 8 times.
✗ Branch 2325 not taken.
✗ Branch 2329 not taken.
✗ Branch 2330 not taken.
✗ Branch 2332 not taken.
✗ Branch 2333 not taken.
✗ Branch 2337 not taken.
✗ Branch 2338 not taken.
✗ Branch 2340 not taken.
✗ Branch 2341 not taken.
✗ Branch 2345 not taken.
✗ Branch 2346 not taken.
✗ Branch 2348 not taken.
✗ Branch 2349 not taken.
✗ Branch 2353 not taken.
✗ Branch 2354 not taken.
✗ Branch 2356 not taken.
✗ Branch 2357 not taken.
✗ Branch 2361 not taken.
✗ Branch 2362 not taken.
✗ Branch 2364 not taken.
✗ Branch 2365 not taken.
✗ Branch 2369 not taken.
✗ Branch 2370 not taken.
✗ Branch 2372 not taken.
✗ Branch 2373 not taken.
✗ Branch 2377 not taken.
✗ Branch 2378 not taken.
✗ Branch 2380 not taken.
✗ Branch 2381 not taken.
✗ Branch 2385 not taken.
✗ Branch 2386 not taken.
✗ Branch 2388 not taken.
✗ Branch 2389 not taken.
✗ Branch 2393 not taken.
✗ Branch 2394 not taken.
✗ Branch 2396 not taken.
✗ Branch 2397 not taken.
✗ Branch 2401 not taken.
✗ Branch 2402 not taken.
✗ Branch 2404 not taken.
✗ Branch 2405 not taken.
✗ Branch 2409 not taken.
✗ Branch 2410 not taken.
✗ Branch 2412 not taken.
✗ Branch 2413 not taken.
✗ Branch 2417 not taken.
✗ Branch 2418 not taken.
✗ Branch 2420 not taken.
✗ Branch 2421 not taken.
✗ Branch 2425 not taken.
✗ Branch 2426 not taken.
✗ Branch 2428 not taken.
✗ Branch 2429 not taken.
✓ Branch 2433 taken 118 times.
✗ Branch 2434 not taken.
✓ Branch 2436 taken 118 times.
✗ Branch 2437 not taken.
✗ Branch 2441 not taken.
✗ Branch 2442 not taken.
✗ Branch 2444 not taken.
✗ Branch 2445 not taken.
✗ Branch 2449 not taken.
✗ Branch 2450 not taken.
✗ Branch 2452 not taken.
✗ Branch 2453 not taken.
✗ Branch 2457 not taken.
✗ Branch 2458 not taken.
✗ Branch 2460 not taken.
✗ Branch 2461 not taken.
✗ Branch 2465 not taken.
✗ Branch 2466 not taken.
✗ Branch 2468 not taken.
✗ Branch 2469 not taken.
✗ Branch 2473 not taken.
✗ Branch 2474 not taken.
✗ Branch 2476 not taken.
✗ Branch 2477 not taken.
✗ Branch 2481 not taken.
✗ Branch 2482 not taken.
✗ Branch 2484 not taken.
✗ Branch 2485 not taken.
✓ Branch 2489 taken 8 times.
✗ Branch 2490 not taken.
✓ Branch 2492 taken 8 times.
✗ Branch 2493 not taken.
✗ Branch 2497 not taken.
✗ Branch 2498 not taken.
✗ Branch 2500 not taken.
✗ Branch 2501 not taken.
✗ Branch 2505 not taken.
✗ Branch 2506 not taken.
✗ Branch 2508 not taken.
✗ Branch 2509 not taken.
✗ Branch 2513 not taken.
✗ Branch 2514 not taken.
✗ Branch 2516 not taken.
✗ Branch 2517 not taken.
✗ Branch 2521 not taken.
✗ Branch 2522 not taken.
✗ Branch 2524 not taken.
✗ Branch 2525 not taken.
✗ Branch 2529 not taken.
✗ Branch 2530 not taken.
✗ Branch 2532 not taken.
✗ Branch 2533 not taken.
✗ Branch 2537 not taken.
✗ Branch 2538 not taken.
✗ Branch 2540 not taken.
✗ Branch 2541 not taken.
✗ Branch 2545 not taken.
✗ Branch 2546 not taken.
✗ Branch 2548 not taken.
✗ Branch 2549 not taken.
✗ Branch 2553 not taken.
✗ Branch 2554 not taken.
✗ Branch 2556 not taken.
✗ Branch 2557 not taken.
✗ Branch 2561 not taken.
✗ Branch 2562 not taken.
✗ Branch 2564 not taken.
✗ Branch 2565 not taken.
✗ Branch 2569 not taken.
✗ Branch 2570 not taken.
✗ Branch 2572 not taken.
✗ Branch 2573 not taken.
✗ Branch 2577 not taken.
✗ Branch 2578 not taken.
✗ Branch 2580 not taken.
✗ Branch 2581 not taken.
✗ Branch 2585 not taken.
✗ Branch 2586 not taken.
✗ Branch 2588 not taken.
✗ Branch 2589 not taken.
✗ Branch 2593 not taken.
✗ Branch 2594 not taken.
✗ Branch 2596 not taken.
✗ Branch 2597 not taken.
✗ Branch 2601 not taken.
✗ Branch 2602 not taken.
✗ Branch 2604 not taken.
✗ Branch 2605 not taken.
✗ Branch 2609 not taken.
✗ Branch 2610 not taken.
✗ Branch 2612 not taken.
✗ Branch 2613 not taken.
✗ Branch 2617 not taken.
✗ Branch 2618 not taken.
✗ Branch 2620 not taken.
✗ Branch 2621 not taken.
✓ Branch 2625 taken 96 times.
✗ Branch 2626 not taken.
✓ Branch 2628 taken 96 times.
✗ Branch 2629 not taken.
✗ Branch 2633 not taken.
✗ Branch 2634 not taken.
✗ Branch 2636 not taken.
✗ Branch 2637 not taken.
✗ Branch 2641 not taken.
✗ Branch 2642 not taken.
✗ Branch 2644 not taken.
✗ Branch 2645 not taken.
✗ Branch 2649 not taken.
✗ Branch 2650 not taken.
✗ Branch 2652 not taken.
✗ Branch 2653 not taken.
✗ Branch 2657 not taken.
✗ Branch 2658 not taken.
✗ Branch 2660 not taken.
✗ Branch 2661 not taken.
✓ Branch 2665 taken 356 times.
✗ Branch 2666 not taken.
✓ Branch 2668 taken 356 times.
✗ Branch 2669 not taken.
✗ Branch 2673 not taken.
✗ Branch 2674 not taken.
✗ Branch 2676 not taken.
✗ Branch 2677 not taken.
✗ Branch 2681 not taken.
✗ Branch 2682 not taken.
✗ Branch 2684 not taken.
✗ Branch 2685 not taken.
✗ Branch 2689 not taken.
✗ Branch 2690 not taken.
✗ Branch 2692 not taken.
✗ Branch 2693 not taken.
✗ Branch 2697 not taken.
✗ Branch 2698 not taken.
✗ Branch 2700 not taken.
✗ Branch 2701 not taken.
✗ Branch 2705 not taken.
✗ Branch 2706 not taken.
✗ Branch 2708 not taken.
✗ Branch 2709 not taken.
✗ Branch 2713 not taken.
✗ Branch 2714 not taken.
✗ Branch 2716 not taken.
✗ Branch 2717 not taken.
✓ Branch 2721 taken 4 times.
✗ Branch 2722 not taken.
✓ Branch 2724 taken 4 times.
✗ Branch 2725 not taken.
✗ Branch 2729 not taken.
✗ Branch 2730 not taken.
✗ Branch 2732 not taken.
✗ Branch 2733 not taken.
✗ Branch 2737 not taken.
✗ Branch 2738 not taken.
✗ Branch 2740 not taken.
✗ Branch 2741 not taken.
✗ Branch 2745 not taken.
✗ Branch 2746 not taken.
✗ Branch 2748 not taken.
✗ Branch 2749 not taken.
✗ Branch 2753 not taken.
✗ Branch 2754 not taken.
✗ Branch 2756 not taken.
✗ Branch 2757 not taken.
✓ Branch 2761 taken 976 times.
✗ Branch 2762 not taken.
✓ Branch 2764 taken 976 times.
✗ Branch 2765 not taken.
✗ Branch 2769 not taken.
✗ Branch 2770 not taken.
✗ Branch 2772 not taken.
✗ Branch 2773 not taken.
✗ Branch 2777 not taken.
✗ Branch 2778 not taken.
✗ Branch 2780 not taken.
✗ Branch 2781 not taken.
✗ Branch 2785 not taken.
✗ Branch 2786 not taken.
✗ Branch 2788 not taken.
✗ Branch 2789 not taken.
✗ Branch 2793 not taken.
✗ Branch 2794 not taken.
✗ Branch 2796 not taken.
✗ Branch 2797 not taken.
✓ Branch 2801 taken 288 times.
✗ Branch 2802 not taken.
✓ Branch 2804 taken 288 times.
✗ Branch 2805 not taken.
✗ Branch 2809 not taken.
✗ Branch 2810 not taken.
✗ Branch 2812 not taken.
✗ Branch 2813 not taken.
✗ Branch 2817 not taken.
✗ Branch 2818 not taken.
✗ Branch 2820 not taken.
✗ Branch 2821 not taken.
✗ Branch 2825 not taken.
✗ Branch 2826 not taken.
✗ Branch 2828 not taken.
✗ Branch 2829 not taken.
✗ Branch 2833 not taken.
✗ Branch 2834 not taken.
✗ Branch 2836 not taken.
✗ Branch 2837 not taken.
✗ Branch 2841 not taken.
✗ Branch 2842 not taken.
✗ Branch 2844 not taken.
✗ Branch 2845 not taken.
✗ Branch 2849 not taken.
✗ Branch 2850 not taken.
✗ Branch 2852 not taken.
✗ Branch 2853 not taken.
✗ Branch 2857 not taken.
✗ Branch 2858 not taken.
✗ Branch 2860 not taken.
✗ Branch 2861 not taken.
✗ Branch 2865 not taken.
✗ Branch 2866 not taken.
✗ Branch 2868 not taken.
✗ Branch 2869 not taken.
✗ Branch 2873 not taken.
✗ Branch 2874 not taken.
✗ Branch 2876 not taken.
✗ Branch 2877 not taken.
✗ Branch 2881 not taken.
✗ Branch 2882 not taken.
✗ Branch 2884 not taken.
✗ Branch 2885 not taken.
✗ Branch 2889 not taken.
✗ Branch 2890 not taken.
✗ Branch 2892 not taken.
✗ Branch 2893 not taken.
✗ Branch 2897 not taken.
✗ Branch 2898 not taken.
✗ Branch 2900 not taken.
✗ Branch 2901 not taken.
✗ Branch 2905 not taken.
✗ Branch 2906 not taken.
✗ Branch 2908 not taken.
✗ Branch 2909 not taken.
✗ Branch 2913 not taken.
✗ Branch 2914 not taken.
✗ Branch 2916 not taken.
✗ Branch 2917 not taken.
✗ Branch 2921 not taken.
✗ Branch 2922 not taken.
✗ Branch 2924 not taken.
✗ Branch 2925 not taken.
✗ Branch 2929 not taken.
✗ Branch 2930 not taken.
✗ Branch 2932 not taken.
✗ Branch 2933 not taken.
✗ Branch 2937 not taken.
✗ Branch 2938 not taken.
✗ Branch 2940 not taken.
✗ Branch 2941 not taken.
✗ Branch 2945 not taken.
✗ Branch 2946 not taken.
✗ Branch 2948 not taken.
✗ Branch 2949 not taken.
✗ Branch 2953 not taken.
✗ Branch 2954 not taken.
✗ Branch 2956 not taken.
✗ Branch 2957 not taken.
✗ Branch 2961 not taken.
✗ Branch 2962 not taken.
✗ Branch 2964 not taken.
✗ Branch 2965 not taken.
✗ Branch 2969 not taken.
✗ Branch 2970 not taken.
✗ Branch 2972 not taken.
✗ Branch 2973 not taken.
✗ Branch 2977 not taken.
✗ Branch 2978 not taken.
✗ Branch 2980 not taken.
✗ Branch 2981 not taken.
✗ Branch 2985 not taken.
✗ Branch 2986 not taken.
✗ Branch 2988 not taken.
✗ Branch 2989 not taken.
✗ Branch 2993 not taken.
✗ Branch 2994 not taken.
✗ Branch 2996 not taken.
✗ Branch 2997 not taken.
✗ Branch 3001 not taken.
✗ Branch 3002 not taken.
✗ Branch 3004 not taken.
✗ Branch 3005 not taken.
✗ Branch 3009 not taken.
✗ Branch 3010 not taken.
✗ Branch 3012 not taken.
✗ Branch 3013 not taken.
✗ Branch 3017 not taken.
✗ Branch 3018 not taken.
✗ Branch 3020 not taken.
✗ Branch 3021 not taken.
✗ Branch 3025 not taken.
✗ Branch 3026 not taken.
✗ Branch 3028 not taken.
✗ Branch 3029 not taken.
✗ Branch 3033 not taken.
✗ Branch 3034 not taken.
✗ Branch 3036 not taken.
✗ Branch 3037 not taken.
✗ Branch 3041 not taken.
✗ Branch 3042 not taken.
✗ Branch 3044 not taken.
✗ Branch 3045 not taken.
✗ Branch 3049 not taken.
✗ Branch 3050 not taken.
✗ Branch 3052 not taken.
✗ Branch 3053 not taken.
✗ Branch 3057 not taken.
✗ Branch 3058 not taken.
✗ Branch 3060 not taken.
✗ Branch 3061 not taken.
✗ Branch 3065 not taken.
✗ Branch 3066 not taken.
✗ Branch 3068 not taken.
✗ Branch 3069 not taken.
✗ Branch 3073 not taken.
✗ Branch 3074 not taken.
✗ Branch 3076 not taken.
✗ Branch 3077 not taken.
✗ Branch 3081 not taken.
✗ Branch 3082 not taken.
✗ Branch 3084 not taken.
✗ Branch 3085 not taken.
✗ Branch 3089 not taken.
✗ Branch 3090 not taken.
✗ Branch 3092 not taken.
✗ Branch 3093 not taken.
✗ Branch 3097 not taken.
✗ Branch 3098 not taken.
✗ Branch 3100 not taken.
✗ Branch 3101 not taken.
✗ Branch 3105 not taken.
✗ Branch 3106 not taken.
✗ Branch 3108 not taken.
✗ Branch 3109 not taken.
✗ Branch 3113 not taken.
✗ Branch 3114 not taken.
✗ Branch 3116 not taken.
✗ Branch 3117 not taken.
✗ Branch 3121 not taken.
✗ Branch 3122 not taken.
✗ Branch 3124 not taken.
✗ Branch 3125 not taken.
✗ Branch 3129 not taken.
✗ Branch 3130 not taken.
✗ Branch 3132 not taken.
✗ Branch 3133 not taken.
✗ Branch 3137 not taken.
✗ Branch 3138 not taken.
✗ Branch 3140 not taken.
✗ Branch 3141 not taken.
✗ Branch 3145 not taken.
✗ Branch 3146 not taken.
✗ Branch 3148 not taken.
✗ Branch 3149 not taken.
✗ Branch 3153 not taken.
✗ Branch 3154 not taken.
✗ Branch 3156 not taken.
✗ Branch 3157 not taken.
✗ Branch 3161 not taken.
✗ Branch 3162 not taken.
✗ Branch 3164 not taken.
✗ Branch 3165 not taken.
✗ Branch 3169 not taken.
✗ Branch 3170 not taken.
✗ Branch 3172 not taken.
✗ Branch 3173 not taken.
✗ Branch 3177 not taken.
✗ Branch 3178 not taken.
✗ Branch 3180 not taken.
✗ Branch 3181 not taken.
✗ Branch 3185 not taken.
✗ Branch 3186 not taken.
✗ Branch 3188 not taken.
✗ Branch 3189 not taken.
✗ Branch 3193 not taken.
✗ Branch 3194 not taken.
✗ Branch 3196 not taken.
✗ Branch 3197 not taken.
✗ Branch 3201 not taken.
✗ Branch 3202 not taken.
✗ Branch 3204 not taken.
✗ Branch 3205 not taken.
✓ Branch 3209 taken 45 times.
✗ Branch 3210 not taken.
✓ Branch 3212 taken 45 times.
✗ Branch 3213 not taken.
✗ Branch 3217 not taken.
✗ Branch 3218 not taken.
✗ Branch 3220 not taken.
✗ Branch 3221 not taken.
✗ Branch 3225 not taken.
✗ Branch 3226 not taken.
✗ Branch 3228 not taken.
✗ Branch 3229 not taken.
✗ Branch 3233 not taken.
✗ Branch 3234 not taken.
✗ Branch 3236 not taken.
✗ Branch 3237 not taken.
✗ Branch 3241 not taken.
✗ Branch 3242 not taken.
✗ Branch 3244 not taken.
✗ Branch 3245 not taken.
✗ Branch 3249 not taken.
✗ Branch 3250 not taken.
✗ Branch 3252 not taken.
✗ Branch 3253 not taken.
✓ Branch 3257 taken 16 times.
✗ Branch 3258 not taken.
✓ Branch 3260 taken 16 times.
✗ Branch 3261 not taken.
✗ Branch 3265 not taken.
✗ Branch 3266 not taken.
✗ Branch 3268 not taken.
✗ Branch 3269 not taken.
✗ Branch 3273 not taken.
✗ Branch 3274 not taken.
✗ Branch 3276 not taken.
✗ Branch 3277 not taken.
✗ Branch 3281 not taken.
✗ Branch 3282 not taken.
✗ Branch 3284 not taken.
✗ Branch 3285 not taken.
✗ Branch 3289 not taken.
✗ Branch 3290 not taken.
✗ Branch 3292 not taken.
✗ Branch 3293 not taken.
✗ Branch 3297 not taken.
✗ Branch 3298 not taken.
✗ Branch 3300 not taken.
✗ Branch 3301 not taken.
✗ Branch 3305 not taken.
✗ Branch 3306 not taken.
✗ Branch 3308 not taken.
✗ Branch 3309 not taken.
✗ Branch 3313 not taken.
✗ Branch 3314 not taken.
✗ Branch 3316 not taken.
✗ Branch 3317 not taken.
✗ Branch 3321 not taken.
✗ Branch 3322 not taken.
✗ Branch 3324 not taken.
✗ Branch 3325 not taken.
✗ Branch 3329 not taken.
✗ Branch 3330 not taken.
✗ Branch 3332 not taken.
✗ Branch 3333 not taken.
✗ Branch 3337 not taken.
✗ Branch 3338 not taken.
✗ Branch 3340 not taken.
✗ Branch 3341 not taken.
✗ Branch 3345 not taken.
✗ Branch 3346 not taken.
✗ Branch 3348 not taken.
✗ Branch 3349 not taken.
✗ Branch 3353 not taken.
✗ Branch 3354 not taken.
✗ Branch 3356 not taken.
✗ Branch 3357 not taken.
✗ Branch 3361 not taken.
✗ Branch 3362 not taken.
✗ Branch 3364 not taken.
✗ Branch 3365 not taken.
✓ Branch 3369 taken 48 times.
✗ Branch 3370 not taken.
✓ Branch 3372 taken 48 times.
✗ Branch 3373 not taken.
✗ Branch 3377 not taken.
✗ Branch 3378 not taken.
✗ Branch 3380 not taken.
✗ Branch 3381 not taken.
✗ Branch 3385 not taken.
✗ Branch 3386 not taken.
✗ Branch 3388 not taken.
✗ Branch 3389 not taken.
✗ Branch 3393 not taken.
✗ Branch 3394 not taken.
✗ Branch 3396 not taken.
✗ Branch 3397 not taken.
✗ Branch 3401 not taken.
✗ Branch 3402 not taken.
✗ Branch 3404 not taken.
✗ Branch 3405 not taken.
✗ Branch 3409 not taken.
✗ Branch 3410 not taken.
✗ Branch 3412 not taken.
✗ Branch 3413 not taken.
✓ Branch 3417 taken 18 times.
✗ Branch 3418 not taken.
✓ Branch 3420 taken 18 times.
✗ Branch 3421 not taken.
✗ Branch 3425 not taken.
✗ Branch 3426 not taken.
✗ Branch 3428 not taken.
✗ Branch 3429 not taken.
✗ Branch 3433 not taken.
✗ Branch 3434 not taken.
✗ Branch 3436 not taken.
✗ Branch 3437 not taken.
✗ Branch 3441 not taken.
✗ Branch 3442 not taken.
✗ Branch 3444 not taken.
✗ Branch 3445 not taken.
✗ Branch 3449 not taken.
✗ Branch 3450 not taken.
✗ Branch 3452 not taken.
✗ Branch 3453 not taken.
✗ Branch 3457 not taken.
✗ Branch 3458 not taken.
✗ Branch 3460 not taken.
✗ Branch 3461 not taken.
✗ Branch 3465 not taken.
✗ Branch 3466 not taken.
✗ Branch 3468 not taken.
✗ Branch 3469 not taken.
✗ Branch 3473 not taken.
✗ Branch 3474 not taken.
✗ Branch 3476 not taken.
✗ Branch 3477 not taken.
✗ Branch 3481 not taken.
✗ Branch 3482 not taken.
✗ Branch 3484 not taken.
✗ Branch 3485 not taken.
✗ Branch 3489 not taken.
✗ Branch 3490 not taken.
✗ Branch 3492 not taken.
✗ Branch 3493 not taken.
✗ Branch 3497 not taken.
✗ Branch 3498 not taken.
✗ Branch 3500 not taken.
✗ Branch 3501 not taken.
✗ Branch 3505 not taken.
✗ Branch 3506 not taken.
✗ Branch 3508 not taken.
✗ Branch 3509 not taken.
✗ Branch 3513 not taken.
✗ Branch 3514 not taken.
✗ Branch 3516 not taken.
✗ Branch 3517 not taken.
✗ Branch 3521 not taken.
✗ Branch 3522 not taken.
✗ Branch 3524 not taken.
✗ Branch 3525 not taken.
✗ Branch 3529 not taken.
✗ Branch 3530 not taken.
✗ Branch 3532 not taken.
✗ Branch 3533 not taken.
✗ Branch 3537 not taken.
✗ Branch 3538 not taken.
✗ Branch 3540 not taken.
✗ Branch 3541 not taken.
✗ Branch 3545 not taken.
✗ Branch 3546 not taken.
✗ Branch 3548 not taken.
✗ Branch 3549 not taken.
✗ Branch 3553 not taken.
✗ Branch 3554 not taken.
✗ Branch 3556 not taken.
✗ Branch 3557 not taken.
✗ Branch 3561 not taken.
✗ Branch 3562 not taken.
✗ Branch 3564 not taken.
✗ Branch 3565 not taken.
✗ Branch 3569 not taken.
✗ Branch 3570 not taken.
✗ Branch 3572 not taken.
✗ Branch 3573 not taken.
✗ Branch 3577 not taken.
✗ Branch 3578 not taken.
✗ Branch 3580 not taken.
✗ Branch 3581 not taken.
✗ Branch 3585 not taken.
✗ Branch 3586 not taken.
✗ Branch 3588 not taken.
✗ Branch 3589 not taken.
✗ Branch 3593 not taken.
✗ Branch 3594 not taken.
✗ Branch 3596 not taken.
✗ Branch 3597 not taken.
✗ Branch 3601 not taken.
✗ Branch 3602 not taken.
✗ Branch 3604 not taken.
✗ Branch 3605 not taken.
✗ Branch 3609 not taken.
✗ Branch 3610 not taken.
✗ Branch 3612 not taken.
✗ Branch 3613 not taken.
✗ Branch 3617 not taken.
✗ Branch 3618 not taken.
✗ Branch 3620 not taken.
✗ Branch 3621 not taken.
✗ Branch 3625 not taken.
✗ Branch 3626 not taken.
✗ Branch 3628 not taken.
✗ Branch 3629 not taken.
✗ Branch 3633 not taken.
✗ Branch 3634 not taken.
✗ Branch 3636 not taken.
✗ Branch 3637 not taken.
✗ Branch 3641 not taken.
✗ Branch 3642 not taken.
✗ Branch 3644 not taken.
✗ Branch 3645 not taken.
✗ Branch 3649 not taken.
✗ Branch 3650 not taken.
✗ Branch 3652 not taken.
✗ Branch 3653 not taken.
✗ Branch 3657 not taken.
✗ Branch 3658 not taken.
✗ Branch 3660 not taken.
✗ Branch 3661 not taken.
✗ Branch 3665 not taken.
✗ Branch 3666 not taken.
✗ Branch 3668 not taken.
✗ Branch 3669 not taken.
✗ Branch 3673 not taken.
✗ Branch 3674 not taken.
✗ Branch 3676 not taken.
✗ Branch 3677 not taken.
✗ Branch 3681 not taken.
✗ Branch 3682 not taken.
✗ Branch 3684 not taken.
✗ Branch 3685 not taken.
✗ Branch 3689 not taken.
✗ Branch 3690 not taken.
✗ Branch 3692 not taken.
✗ Branch 3693 not taken.
✗ Branch 3697 not taken.
✗ Branch 3698 not taken.
✗ Branch 3700 not taken.
✗ Branch 3701 not taken.
✗ Branch 3705 not taken.
✗ Branch 3706 not taken.
✗ Branch 3708 not taken.
✗ Branch 3709 not taken.
✗ Branch 3713 not taken.
✗ Branch 3714 not taken.
✗ Branch 3716 not taken.
✗ Branch 3717 not taken.
✗ Branch 3721 not taken.
✗ Branch 3722 not taken.
✗ Branch 3724 not taken.
✗ Branch 3725 not taken.
✗ Branch 3729 not taken.
✗ Branch 3730 not taken.
✗ Branch 3732 not taken.
✗ Branch 3733 not taken.
✗ Branch 3737 not taken.
✗ Branch 3738 not taken.
✗ Branch 3740 not taken.
✗ Branch 3741 not taken.
✗ Branch 3745 not taken.
✗ Branch 3746 not taken.
✗ Branch 3748 not taken.
✗ Branch 3749 not taken.
✗ Branch 3753 not taken.
✗ Branch 3754 not taken.
✗ Branch 3756 not taken.
✗ Branch 3757 not taken.
✗ Branch 3761 not taken.
✗ Branch 3762 not taken.
✗ Branch 3764 not taken.
✗ Branch 3765 not taken.
✗ Branch 3769 not taken.
✗ Branch 3770 not taken.
✗ Branch 3772 not taken.
✗ Branch 3773 not taken.
✗ Branch 3777 not taken.
✗ Branch 3778 not taken.
✗ Branch 3780 not taken.
✗ Branch 3781 not taken.
✗ Branch 3785 not taken.
✗ Branch 3786 not taken.
✗ Branch 3788 not taken.
✗ Branch 3789 not taken.
✓ Branch 3793 taken 96 times.
✗ Branch 3794 not taken.
✓ Branch 3796 taken 96 times.
✗ Branch 3797 not taken.
✗ Branch 3801 not taken.
✗ Branch 3802 not taken.
✗ Branch 3804 not taken.
✗ Branch 3805 not taken.
✗ Branch 3809 not taken.
✗ Branch 3810 not taken.
✗ Branch 3812 not taken.
✗ Branch 3813 not taken.
✗ Branch 3817 not taken.
✗ Branch 3818 not taken.
✗ Branch 3820 not taken.
✗ Branch 3821 not taken.
✗ Branch 3825 not taken.
✗ Branch 3826 not taken.
✗ Branch 3828 not taken.
✗ Branch 3829 not taken.
✗ Branch 3833 not taken.
✗ Branch 3834 not taken.
✗ Branch 3836 not taken.
✗ Branch 3837 not taken.
✗ Branch 3841 not taken.
✗ Branch 3842 not taken.
✗ Branch 3844 not taken.
✗ Branch 3845 not taken.
✗ Branch 3849 not taken.
✗ Branch 3850 not taken.
✗ Branch 3852 not taken.
✗ Branch 3853 not taken.
✗ Branch 3857 not taken.
✗ Branch 3858 not taken.
✗ Branch 3860 not taken.
✗ Branch 3861 not taken.
✗ Branch 3865 not taken.
✗ Branch 3866 not taken.
✗ Branch 3868 not taken.
✗ Branch 3869 not taken.
✗ Branch 3873 not taken.
✗ Branch 3874 not taken.
✗ Branch 3876 not taken.
✗ Branch 3877 not taken.
✓ Branch 3881 taken 8 times.
✗ Branch 3882 not taken.
✓ Branch 3884 taken 8 times.
✗ Branch 3885 not taken.
✗ Branch 3889 not taken.
✗ Branch 3890 not taken.
✗ Branch 3892 not taken.
✗ Branch 3893 not taken.
✗ Branch 3897 not taken.
✗ Branch 3898 not taken.
✗ Branch 3900 not taken.
✗ Branch 3901 not taken.
✗ Branch 3905 not taken.
✗ Branch 3906 not taken.
✗ Branch 3908 not taken.
✗ Branch 3909 not taken.
✗ Branch 3913 not taken.
✗ Branch 3914 not taken.
✗ Branch 3916 not taken.
✗ Branch 3917 not taken.
✗ Branch 3921 not taken.
✗ Branch 3922 not taken.
✗ Branch 3924 not taken.
✗ Branch 3925 not taken.
✗ Branch 3929 not taken.
✗ Branch 3930 not taken.
✗ Branch 3932 not taken.
✗ Branch 3933 not taken.
✗ Branch 3937 not taken.
✗ Branch 3938 not taken.
✗ Branch 3940 not taken.
✗ Branch 3941 not taken.
✓ Branch 3945 taken 96 times.
✗ Branch 3946 not taken.
✓ Branch 3948 taken 96 times.
✗ Branch 3949 not taken.
✗ Branch 3953 not taken.
✗ Branch 3954 not taken.
✗ Branch 3956 not taken.
✗ Branch 3957 not taken.
14361 return visitor(_read_buffer_field<T>(source));
477
1/2
✓ Branch 1 taken 5517 times.
✗ Branch 2 not taken.
17688 });
478 }
479 17912 }
480
481 18844 DynamicPrecision _to_precision(const HighFive::DataType& datatype) const {
482
6/6
✓ Branch 1 taken 4794 times.
✓ Branch 2 taken 6749 times.
✓ Branch 4 taken 2670 times.
✓ Branch 5 taken 2124 times.
✓ Branch 6 taken 2670 times.
✓ Branch 7 taken 8873 times.
18844 if (datatype.getClass() == HighFive::DataTypeClass::Float && datatype.getSize() == 8)
483 4287 return float64;
484
5/6
✓ Branch 1 taken 2124 times.
✓ Branch 2 taken 6749 times.
✓ Branch 4 taken 2124 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2124 times.
✓ Branch 7 taken 6749 times.
14557 else if (datatype.getClass() == HighFive::DataTypeClass::Float && datatype.getSize() == 4)
485 3396 return float32;
486
5/6
✓ Branch 1 taken 6749 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 393 times.
✓ Branch 5 taken 6356 times.
✓ Branch 6 taken 393 times.
✓ Branch 7 taken 6356 times.
11161 else if (datatype.getClass() == HighFive::DataTypeClass::Integer && datatype.getSize() == 1)
487 647 return int8;
488
3/6
✓ Branch 1 taken 6356 times.
✗ Branch 2 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 6356 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 6356 times.
10514 else if (datatype.getClass() == HighFive::DataTypeClass::Integer && datatype.getSize() == 2)
489 return int16;
490
5/6
✓ Branch 1 taken 6356 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1732 times.
✓ Branch 5 taken 4624 times.
✓ Branch 6 taken 1732 times.
✓ Branch 7 taken 4624 times.
10514 else if (datatype.getClass() == HighFive::DataTypeClass::Integer && datatype.getSize() == 4)
491 2853 return int32;
492
3/6
✓ Branch 1 taken 4624 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 4624 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 4624 times.
✗ Branch 7 not taken.
7661 else if (datatype.getClass() == HighFive::DataTypeClass::Integer && datatype.getSize() == 8)
493 7661 return int64;
494 else if (datatype.isVariableStr())
495 return Precision<char>{};
496 else if (datatype.isFixedLenStr())
497 return Precision<char>{};
498 throw NotImplemented("Could not determine data set precision");
499 }
500
501 template<typename T, typename Source>
502 17688 auto _read_buffer_field(const Source& source) const {
503
3/5
✓ Branch 1 taken 1796 times.
✓ Branch 2 taken 7048 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1796 times.
✗ Branch 5 not taken.
17688 auto dims = source.getMemSpace().getDimensions();
504
4/6
✓ Branch 1 taken 34 times.
✓ Branch 2 taken 8810 times.
✓ Branch 4 taken 34 times.
✗ Branch 5 not taken.
✓ Branch 8 taken 8810 times.
✗ Branch 9 not taken.
17688 MDLayout layout = dims.empty() ? MDLayout{{1}} : MDLayout{std::move(dims)};
505
2/4
✓ Branch 1 taken 8844 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 8844 times.
✗ Branch 5 not taken.
17688 std::vector<T> out(layout.number_of_entries());
506
2/3
✓ Branch 3 taken 228 times.
✓ Branch 4 taken 8616 times.
✗ Branch 5 not taken.
17688 source.read(out.data());
507
1/2
✓ Branch 3 taken 8844 times.
✗ Branch 4 not taken.
35376 return BufferField(std::move(out), std::move(layout));
508 17688 }
509
510 10899 HighFive::Group _get_group(const std::string& group_name) {
511
2/2
✓ Branch 1 taken 10251 times.
✓ Branch 2 taken 648 times.
10899 return _file.exist(group_name) ? _file.getGroup(group_name) : _file.createGroup(group_name);
512 }
513
514 1498 void _clear_attribute(const std::string& name, const std::string& group) {
515
4/6
✓ Branch 1 taken 1498 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1498 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 660 times.
✓ Branch 8 taken 838 times.
1498 if (_get_group(group).hasAttribute(name))
516
2/4
✓ Branch 1 taken 660 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 660 times.
✗ Branch 5 not taken.
660 _get_group(group).deleteAttribute(name);
517 1498 }
518
519 Communicator _comm;
520 Mode _mode;
521 HighFive::File _file;
522 };
523
524 } // namespace GridFormat::HDF5
525
526 #endif // GRIDFORMAT_HAVE_HIGH_FIVE
527 #endif // GRIDFORMAT_COMMON_HDF5_HPP_
528