| 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 | #include <string> | ||
| 18 | #include <vector> | ||
| 19 | #include <optional> | ||
| 20 | |||
| 21 | #ifdef GRIDFORMAT_DISABLE_HIGHFIVE_WARNINGS | ||
| 22 | #pragma GCC diagnostic push | ||
| 23 | #pragma GCC diagnostic ignored "-Wold-style-cast" | ||
| 24 | #pragma GCC diagnostic ignored "-Wswitch-enum" | ||
| 25 | #pragma GCC diagnostic ignored "-Wuseless-cast" | ||
| 26 | #pragma GCC diagnostic ignored "-Wcast-qual" | ||
| 27 | #pragma GCC diagnostic ignored "-Wnull-dereference" | ||
| 28 | #pragma GCC diagnostic ignored "-Warray-bounds" | ||
| 29 | #pragma GCC diagnostic ignored "-Wstringop-overflow" | ||
| 30 | #endif // GRIDFORMAT_DISABLE_HIGHFIVE_WARNINGS | ||
| 31 | |||
| 32 | #include <highfive/H5Easy.hpp> | ||
| 33 | #include <highfive/H5File.hpp> | ||
| 34 | |||
| 35 | #ifdef GRIDFORMAT_DISABLE_HIGHFIVE_WARNINGS | ||
| 36 | #pragma GCC diagnostic pop | ||
| 37 | #endif // GRIDFORMAT_DISABLE_HIGHFIVE_WARNINGS | ||
| 38 | |||
| 39 | #include <gridformat/common/field.hpp> | ||
| 40 | #include <gridformat/common/logging.hpp> | ||
| 41 | #include <gridformat/common/concepts.hpp> | ||
| 42 | #include <gridformat/common/md_layout.hpp> | ||
| 43 | #include <gridformat/common/buffer_field.hpp> | ||
| 44 | #include <gridformat/common/multi_string.hpp> | ||
| 45 | #include <gridformat/common/precision.hpp> | ||
| 46 | |||
| 47 | #include <gridformat/parallel/communication.hpp> | ||
| 48 | #include <gridformat/grid/grid.hpp> | ||
| 49 | |||
| 50 | |||
| 51 | namespace GridFormat::HDF5 { | ||
| 52 | |||
| 53 | #ifndef DOXYGEN | ||
| 54 | namespace Detail { | ||
| 55 | |||
| 56 | 2994 | inline HighFive::DataTransferProps parallel_transfer_props() { | |
| 57 | 2994 | HighFive::DataTransferProps xfer_props; | |
| 58 | #if GRIDFORMAT_HAVE_PARALLEL_HIGH_FIVE | ||
| 59 |
1/2✓ Branch 2 taken 2994 times.
✗ Branch 3 not taken.
|
2994 | xfer_props.add(HighFive::UseCollectiveIO{}); |
| 60 | #else | ||
| 61 | throw NotImplemented("Parallel HighFive required for parallel I/O"); | ||
| 62 | #endif | ||
| 63 | 2994 | return xfer_props; | |
| 64 | ✗ | } | |
| 65 | |||
| 66 | template<Concepts::Communicator Communicator> | ||
| 67 | 540 | auto parallel_file_access_props([[maybe_unused]] const Communicator& communicator) { | |
| 68 | 540 | HighFive::FileAccessProps fapl; | |
| 69 | #if GRIDFORMAT_HAVE_PARALLEL_HIGH_FIVE | ||
| 70 | if constexpr (!std::is_same_v<Communicator, NullCommunicator>) { | ||
| 71 |
1/2✓ Branch 2 taken 270 times.
✗ Branch 3 not taken.
|
540 | fapl.add(HighFive::MPIOFileAccess{communicator, MPI_INFO_NULL}); |
| 72 |
1/2✓ Branch 2 taken 270 times.
✗ Branch 3 not taken.
|
540 | fapl.add(HighFive::MPIOCollectiveMetadata{}); |
| 73 | } else { | ||
| 74 | ✗ | throw TypeError("Cannot establish parallel I/O with null communicator"); | |
| 75 | } | ||
| 76 | #else | ||
| 77 | throw NotImplemented("Parallel HighFive required for parallel I/O"); | ||
| 78 | #endif | ||
| 79 | 540 | return fapl; | |
| 80 | ✗ | } | |
| 81 | |||
| 82 | 2994 | inline void check_successful_collective_io([[maybe_unused]] const HighFive::DataTransferProps& xfer_props) { | |
| 83 | #if GRIDFORMAT_HAVE_PARALLEL_HIGH_FIVE | ||
| 84 |
1/2✓ Branch 1 taken 2994 times.
✗ Branch 2 not taken.
|
2994 | auto mnccp = HighFive::MpioNoCollectiveCause(xfer_props); |
| 85 |
3/6✓ Branch 1 taken 2994 times.
✗ Branch 2 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2994 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 2994 times.
|
2994 | if (mnccp.getLocalCause() || mnccp.getGlobalCause()) |
| 86 | ✗ | log_warning( | |
| 87 | ✗ | std::string{"The operation was successful, but couldn't use collective MPI-IO. "} | |
| 88 | ✗ | + "Local cause: " + std::to_string(mnccp.getLocalCause()) + " " | |
| 89 | ✗ | + "Global cause:" + std::to_string(mnccp.getGlobalCause()) + "\n" | |
| 90 | ); | ||
| 91 | #else | ||
| 92 | throw NotImplemented("Parallel HighFive required for parallel I/O"); | ||
| 93 | #endif | ||
| 94 | 2994 | } | |
| 95 | |||
| 96 | 50329 | inline std::pair<std::string, std::string> split_group(const std::string& in) { | |
| 97 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 50329 times.
|
50329 | if (in.ends_with('/')) |
| 98 | ✗ | return {in, ""}; | |
| 99 | |||
| 100 | 50329 | const auto split_pos = in.find_last_of("/"); | |
| 101 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 50329 times.
|
50329 | if (split_pos == std::string::npos ) |
| 102 | ✗ | throw ValueError("Could not split name from given path: " + in); | |
| 103 | return { | ||
| 104 |
6/10✓ Branch 0 taken 49613 times.
✓ Branch 1 taken 716 times.
✓ Branch 3 taken 49613 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 716 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 716 times.
✓ Branch 9 taken 49613 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
|
102090 | split_pos > 0 ? in.substr(0, split_pos) : "/", |
| 105 |
1/2✓ Branch 1 taken 50329 times.
✗ Branch 2 not taken.
|
100658 | in.substr(split_pos + 1) |
| 106 | 50329 | }; | |
| 107 | } | ||
| 108 | |||
| 109 | template<typename T> | ||
| 110 | using HighFiveDataType = std::conditional_t<std::is_same_v<T, bool>, char, T>; | ||
| 111 | |||
| 112 | //! HighFive's DataType::string() omits the signedness of integers | ||
| 113 | 8 | inline std::string as_string(const HighFive::DataType& type) { | |
| 114 |
2/2✓ Branch 1 taken 5 times.
✓ Branch 2 taken 3 times.
|
8 | if (type.getClass() == HighFive::DataTypeClass::Integer) |
| 115 |
4/8✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 5 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✓ Branch 8 taken 5 times.
✓ Branch 10 taken 5 times.
✗ Branch 11 not taken.
|
5 | return (H5Tget_sign(type.getId()) == H5T_SGN_NONE ? "Unsigned" : "Signed") + type.string(); |
| 116 | 3 | return type.string(); | |
| 117 | } | ||
| 118 | |||
| 119 | } // namespace Detail | ||
| 120 | #endif // DOXYGEN | ||
| 121 | |||
| 122 | //! Represents a dataset slice | ||
| 123 | struct Slice { | ||
| 124 | std::vector<std::size_t> offset; | ||
| 125 | std::vector<std::size_t> count; | ||
| 126 | std::optional<std::vector<std::size_t>> total_size = {}; | ||
| 127 | }; | ||
| 128 | |||
| 129 | //! Custom fixed-length string data type using ascii encoding, as used for the attributes of | ||
| 130 | //! VTKHDF files. HighFive defaults to variable-length utf-8 strings, which VTK accepts as well, | ||
| 131 | //! but this matches what VTK itself writes. | ||
| 132 | struct AsciiString : public HighFive::DataType { | ||
| 133 | 400 | explicit AsciiString(std::size_t n) { | |
| 134 |
2/4✓ Branch 1 taken 400 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 400 times.
✗ Branch 5 not taken.
|
400 | _hid = H5Tcopy(H5T_C_S1); |
| 135 |
2/4✓ Branch 1 taken 400 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 400 times.
|
400 | if (H5Tset_size(_hid, n) < 0) { |
| 136 | ✗ | HighFive::HDF5ErrMapper::ToException<HighFive::DataTypeException>( | |
| 137 | ✗ | "Unable to define datatype size to " + std::to_string(n) | |
| 138 | ); | ||
| 139 | } | ||
| 140 | // define encoding to ASCII | ||
| 141 |
1/2✓ Branch 1 taken 400 times.
✗ Branch 2 not taken.
|
400 | H5Tset_cset(_hid, H5T_CSET_ASCII); |
| 142 |
1/2✓ Branch 1 taken 400 times.
✗ Branch 2 not taken.
|
400 | H5Tset_strpad(_hid, H5T_STR_SPACEPAD); |
| 143 | 400 | } | |
| 144 | |||
| 145 | template<std::size_t N> | ||
| 146 | 598 | static AsciiString from(const char (&input)[N]) { | |
| 147 |
1/2✓ Branch 0 taken 400 times.
✗ Branch 1 not taken.
|
598 | if (input[N-1] == '\0') |
| 148 | 598 | return AsciiString{N-1}; | |
| 149 | ✗ | return AsciiString{N}; | |
| 150 | } | ||
| 151 | }; | ||
| 152 | |||
| 153 | //! Variable-length string data type, storing one string per dataspace entry. | ||
| 154 | //! This is the layout that VTK uses for string arrays in VTKHDF files. | ||
| 155 | struct VariableLengthString : public HighFive::DataType { | ||
| 156 | 434 | explicit VariableLengthString(bool ascii = true) { | |
| 157 |
2/4✓ Branch 1 taken 434 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 434 times.
✗ Branch 5 not taken.
|
434 | _hid = H5Tcopy(H5T_C_S1); |
| 158 |
2/4✓ Branch 1 taken 434 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 434 times.
|
434 | if (H5Tset_size(_hid, H5T_VARIABLE) < 0) { |
| 159 | ✗ | HighFive::HDF5ErrMapper::ToException<HighFive::DataTypeException>( | |
| 160 | "Unable to define a variable-length string datatype" | ||
| 161 | ); | ||
| 162 | } | ||
| 163 |
3/4✓ Branch 0 taken 433 times.
✓ Branch 1 taken 1 times.
✓ Branch 3 taken 434 times.
✗ Branch 4 not taken.
|
434 | H5Tset_cset(_hid, ascii ? H5T_CSET_ASCII : H5T_CSET_UTF8); |
| 164 | 434 | } | |
| 165 | |||
| 166 | //! Return a type that can represent the given strings (ascii-encoded if possible, utf-8 otherwise) | ||
| 167 | 434 | static VariableLengthString from(const std::vector<std::string>& values) { | |
| 168 | 434 | return VariableLengthString{std::ranges::all_of(values, [] (const std::string& value) { | |
| 169 | 716 | return std::ranges::all_of(value, [] (char c) { | |
| 170 | 6008 | return static_cast<unsigned char>(c) < 128; | |
| 171 | 716 | }); | |
| 172 | 434 | })}; | |
| 173 | } | ||
| 174 | }; | ||
| 175 | |||
| 176 | /*! | ||
| 177 | * \ingroup Common | ||
| 178 | * \brief Helper class for I/O from HDF5 files. | ||
| 179 | * \note Currently, strings are ascii encoded, in contrast to the standard utf-8 | ||
| 180 | * that HighFive uses. Once necessary, we'll make the encoding settable. | ||
| 181 | */ | ||
| 182 | template<Concepts::Communicator Communicator = NullCommunicator> | ||
| 183 | class File { | ||
| 184 | public: | ||
| 185 | enum Mode { | ||
| 186 | overwrite, //!< remove all content before writing | ||
| 187 | append, //!< append given data to existing datasets | ||
| 188 | read_only //!< only read data | ||
| 189 | }; | ||
| 190 | |||
| 191 | 268 | File(const std::string& filename, Mode mode = Mode::read_only) | |
| 192 | requires(std::same_as<Communicator, NullCommunicator>) | ||
| 193 |
1/2✓ Branch 1 taken 268 times.
✗ Branch 2 not taken.
|
268 | : File(filename, NullCommunicator{}, mode) |
| 194 | 268 | {} | |
| 195 | |||
| 196 | 1242 | File(const std::string& filename, const Communicator& comm, Mode mode = Mode::read_only) | |
| 197 | 540 | : _comm{comm} | |
| 198 | 1242 | , _mode{mode} | |
| 199 | 1242 | , _file{_open(filename)} | |
| 200 | 1242 | {} | |
| 201 | |||
| 202 | //! Clear the contents of the file with the given name | ||
| 203 | 70 | static void clear(const std::string& filename, const Communicator& comm) { | |
| 204 |
2/2✓ Branch 1 taken 52 times.
✓ Branch 2 taken 18 times.
|
70 | if (Parallel::rank(comm) == 0) // clear file by open it in overwrite mode |
| 205 |
1/2✓ Branch 2 taken 52 times.
✗ Branch 3 not taken.
|
52 | HighFive::File{filename, HighFive::File::Overwrite}; |
| 206 | 70 | Parallel::barrier(comm); | |
| 207 | 70 | } | |
| 208 | |||
| 209 | //! Write the given values to the attribute with the given name into the given group | ||
| 210 | template<typename Values> | ||
| 211 | 2834 | void write_attribute(const Values& values, const std::string& path) { | |
| 212 |
1/2✓ Branch 1 taken 1424 times.
✗ Branch 2 not taken.
|
2834 | _check_writable(); |
| 213 |
1/2✓ Branch 1 taken 1424 times.
✗ Branch 2 not taken.
|
2834 | const auto [group, name] = Detail::split_group(path); |
| 214 |
1/2✓ Branch 1 taken 1424 times.
✗ Branch 2 not taken.
|
2834 | _clear_attribute(name, group); |
| 215 |
2/4✓ Branch 1 taken 1424 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1424 times.
✗ Branch 5 not taken.
|
2834 | _get_group(group).createAttribute(name, values); |
| 216 | 2834 | } | |
| 217 | |||
| 218 | //! Write the given characters to the attribute with the given name into the given group | ||
| 219 | template<std::size_t N> | ||
| 220 | 598 | void write_attribute(const char (&values)[N], const std::string& path) { | |
| 221 |
1/2✓ Branch 1 taken 400 times.
✗ Branch 2 not taken.
|
598 | _check_writable(); |
| 222 |
1/2✓ Branch 1 taken 400 times.
✗ Branch 2 not taken.
|
598 | const auto [group, name] = Detail::split_group(path); |
| 223 |
1/2✓ Branch 1 taken 400 times.
✗ Branch 2 not taken.
|
598 | _clear_attribute(name, group); |
| 224 |
2/4✓ Branch 1 taken 400 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 400 times.
✗ Branch 5 not taken.
|
1196 | auto type_attr = _get_group(group).createAttribute( |
| 225 | name, | ||
| 226 |
1/2✓ Branch 1 taken 400 times.
✗ Branch 2 not taken.
|
1196 | HighFive::DataSpace{1}, |
| 227 |
1/2✓ Branch 1 taken 400 times.
✗ Branch 2 not taken.
|
1196 | AsciiString::from(values) |
| 228 | ); | ||
| 229 |
1/2✓ Branch 1 taken 400 times.
✗ Branch 2 not taken.
|
598 | type_attr.write(values); |
| 230 | 598 | } | |
| 231 | |||
| 232 | //! Write the given values into the dataset with the given path | ||
| 233 | template<std::ranges::range Values> | ||
| 234 | 9610 | void write(const Values& values, | |
| 235 | const std::string& path, | ||
| 236 | const std::optional<Slice>& slice = {}) { | ||
| 237 |
1/2✓ Branch 1 taken 4805 times.
✗ Branch 2 not taken.
|
9610 | _check_writable(); |
| 238 |
1/2✓ Branch 1 taken 4805 times.
✗ Branch 2 not taken.
|
9610 | const auto [group_name, ds_name] = Detail::split_group(path); |
| 239 |
5/8✓ Branch 1 taken 668 times.
✓ Branch 2 taken 4137 times.
✓ Branch 5 taken 668 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 668 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 4137 times.
✗ Branch 12 not taken.
|
9610 | const auto space = slice ? HighFive::DataSpace{slice->total_size.value()} |
| 240 | : HighFive::DataSpace::From(values); | ||
| 241 |
1/2✓ Branch 1 taken 4805 times.
✗ Branch 2 not taken.
|
9610 | auto group = _get_group(group_name); |
| 242 |
2/2✓ Branch 1 taken 4802 times.
✓ Branch 2 taken 3 times.
|
9610 | auto [offset, dataset] = _prepare_dataset<FieldScalar<Values>>(group, ds_name, space); |
| 243 |
2/6✓ Branch 1 taken 4134 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 4134 times.
✗ Branch 5 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
|
17872 | Slice _slice{ |
| 244 |
6/10✓ Branch 1 taken 668 times.
✓ Branch 2 taken 4134 times.
✓ Branch 5 taken 668 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 4134 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 4134 times.
✓ Branch 11 taken 668 times.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
|
27476 | .offset = slice ? slice->offset : std::vector<std::size_t>(space.getNumberDimensions(), 0), |
| 245 |
3/4✓ Branch 1 taken 668 times.
✓ Branch 2 taken 4134 times.
✓ Branch 5 taken 668 times.
✗ Branch 6 not taken.
|
9604 | .count = slice ? slice->count : space.getDimensions() |
| 246 | }; | ||
| 247 |
1/2✓ Branch 1 taken 4802 times.
✗ Branch 2 not taken.
|
9604 | _slice.offset.at(0) += offset; |
| 248 | |||
| 249 |
3/4✓ Branch 1 taken 1994 times.
✓ Branch 2 taken 2808 times.
✓ Branch 3 taken 1994 times.
✗ Branch 4 not taken.
|
9604 | if (Parallel::size(_comm) > 1) { |
| 250 |
2/2✓ Branch 1 taken 668 times.
✓ Branch 2 taken 1326 times.
|
3988 | if (slice) { // collective I/O |
| 251 |
1/2✓ Branch 1 taken 668 times.
✗ Branch 2 not taken.
|
1336 | const auto props = Detail::parallel_transfer_props(); |
| 252 |
2/4✓ Branch 1 taken 668 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 668 times.
✗ Branch 5 not taken.
|
1336 | _write_to(dataset, values, _slice, props); |
| 253 |
1/2✓ Branch 1 taken 668 times.
✗ Branch 2 not taken.
|
1336 | Detail::check_successful_collective_io(props); |
| 254 |
3/4✓ Branch 2 taken 1326 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 663 times.
✓ Branch 5 taken 663 times.
|
3988 | } else if (Parallel::rank(_comm) == 0) { // write only on rank 0 to avoid clashes |
| 255 |
1/2✓ Branch 2 taken 663 times.
✗ Branch 3 not taken.
|
1326 | _write_to(dataset, values, _slice); |
| 256 | } | ||
| 257 | } else { | ||
| 258 |
1/2✓ Branch 2 taken 2808 times.
✗ Branch 3 not taken.
|
5616 | _write_to(dataset, values, _slice); |
| 259 | } | ||
| 260 |
1/2✓ Branch 1 taken 4802 times.
✗ Branch 2 not taken.
|
9604 | _file.flush(); |
| 261 | 9622 | } | |
| 262 | |||
| 263 | /*! | ||
| 264 | * \brief Write the given strings into the dataset with the given path. | ||
| 265 | * \details The dataset is written as a one-dimensional array of variable-length strings, | ||
| 266 | * holding one string per entry. This is the layout that VTK uses for string arrays. | ||
| 267 | * In append mode, the given strings are appended to an existing dataset. | ||
| 268 | * \note This does not work in parallel, i.e., is only supported in serial I/O. | ||
| 269 | */ | ||
| 270 | 434 | void write_strings(const std::vector<std::string>& values, const std::string& path) { | |
| 271 |
1/2✓ Branch 1 taken 434 times.
✗ Branch 2 not taken.
|
434 | _check_writable(); |
| 272 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 434 times.
|
434 | if (Parallel::size(_comm) > 1) |
| 273 | ✗ | throw NotImplemented("Writing strings is not supported with parallel I/O"); | |
| 274 |
1/2✓ Branch 1 taken 434 times.
✗ Branch 2 not taken.
|
434 | const auto [group_name, ds_name] = Detail::split_group(path); |
| 275 |
1/2✓ Branch 1 taken 434 times.
✗ Branch 2 not taken.
|
434 | auto group = _get_group(group_name); |
| 276 |
2/2✓ Branch 1 taken 433 times.
✓ Branch 2 taken 1 times.
|
867 | auto [offset, dataset] = _prepare_dataset( |
| 277 |
2/4✓ Branch 1 taken 434 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 434 times.
✗ Branch 6 not taken.
|
870 | group, ds_name, HighFive::DataSpace{values.size()}, VariableLengthString::from(values) |
| 278 | ); | ||
| 279 |
4/8✓ Branch 4 taken 433 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 433 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 433 times.
✗ Branch 11 not taken.
✓ Branch 14 taken 433 times.
✗ Branch 15 not taken.
|
2165 | dataset.select({offset}, {values.size()}).write(values); |
| 280 |
1/2✓ Branch 1 taken 433 times.
✗ Branch 2 not taken.
|
433 | _file.flush(); |
| 281 | 435 | } | |
| 282 | |||
| 283 | //! Write a field into the dataset with the given path | ||
| 284 | 6076 | void write(const Field& field, | |
| 285 | const std::string& path, | ||
| 286 | const std::optional<Slice>& slice = {}) { | ||
| 287 |
1/2✓ Branch 1 taken 3683 times.
✗ Branch 2 not taken.
|
6076 | _check_writable(); |
| 288 |
1/2✓ Branch 1 taken 3683 times.
✗ Branch 2 not taken.
|
6076 | const auto layout = field.layout(); |
| 289 |
1/2✓ Branch 1 taken 3683 times.
✗ Branch 2 not taken.
|
8469 | const HighFive::DataSpace space{[&] () { |
| 290 |
3/4✓ Branch 1 taken 2798 times.
✓ Branch 2 taken 818 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 67 times.
|
3683 | if (slice) |
| 291 |
2/8✓ Branch 2 taken 2798 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 2798 times.
✗ Branch 6 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
|
2798 | return slice->total_size.value(); |
| 292 |
4/8✓ Branch 1 taken 818 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 818 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 67 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 67 times.
✗ Branch 11 not taken.
|
885 | std::vector<std::size_t> dims(layout.dimension()); |
| 293 |
2/4✓ Branch 1 taken 818 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 67 times.
✗ Branch 5 not taken.
|
885 | layout.export_to(dims); |
| 294 | 885 | return dims; | |
| 295 |
1/2✓ Branch 1 taken 3683 times.
✗ Branch 2 not taken.
|
13037 | } ()}; |
| 296 | |||
| 297 |
1/2✓ Branch 1 taken 3683 times.
✗ Branch 2 not taken.
|
6076 | const auto [group_name, ds_name] = Detail::split_group(path); |
| 298 |
1/2✓ Branch 1 taken 3683 times.
✗ Branch 2 not taken.
|
6076 | auto group = _get_group(group_name); |
| 299 |
2/4✓ Branch 1 taken 3683 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 3683 times.
✗ Branch 5 not taken.
|
11049 | field.precision().visit([&] <typename T> (const Precision<T>&) { |
| 300 |
5/48✗ Branch 1 not taken.
✗ 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 taken 2 times.
✗ Branch 27 not taken.
✗ Branch 31 not taken.
✗ Branch 32 not taken.
✓ Branch 36 taken 79 times.
✗ Branch 37 not taken.
✗ Branch 41 not taken.
✗ Branch 42 not taken.
✗ Branch 46 not taken.
✗ Branch 47 not taken.
✓ Branch 51 taken 1945 times.
✗ Branch 52 not taken.
✓ Branch 56 taken 1590 times.
✗ Branch 57 not taken.
✗ Branch 61 not taken.
✗ Branch 62 not taken.
✗ Branch 66 not taken.
✗ Branch 67 not taken.
✗ Branch 71 not taken.
✗ Branch 72 not taken.
✗ Branch 76 not taken.
✗ Branch 77 not taken.
✗ Branch 81 not taken.
✗ Branch 82 not taken.
✗ Branch 86 not taken.
✗ Branch 87 not taken.
✗ Branch 91 not taken.
✗ Branch 92 not taken.
✓ Branch 96 taken 67 times.
✗ Branch 97 not taken.
✗ Branch 101 not taken.
✗ Branch 102 not taken.
✗ Branch 106 not taken.
✗ Branch 107 not taken.
✗ Branch 111 not taken.
✗ Branch 112 not taken.
✗ Branch 116 not taken.
✗ Branch 117 not taken.
|
3683 | auto [offset, dataset] = _prepare_dataset<T>(group, ds_name, space); |
| 301 |
10/144✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 4 not taken.
✗ 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 taken 2 times.
✗ Branch 52 not taken.
✓ Branch 54 taken 2 times.
✗ 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 67 not taken.
✗ Branch 68 not taken.
✓ Branch 71 taken 79 times.
✗ Branch 72 not taken.
✓ Branch 74 taken 79 times.
✗ Branch 75 not taken.
✗ Branch 77 not taken.
✗ Branch 78 not taken.
✗ Branch 81 not taken.
✗ Branch 82 not taken.
✗ Branch 84 not taken.
✗ Branch 85 not taken.
✗ Branch 87 not taken.
✗ Branch 88 not taken.
✗ Branch 91 not taken.
✗ Branch 92 not taken.
✗ Branch 94 not taken.
✗ Branch 95 not taken.
✗ Branch 97 not taken.
✗ Branch 98 not taken.
✓ Branch 101 taken 422 times.
✗ Branch 102 not taken.
✓ Branch 104 taken 422 times.
✗ Branch 105 not taken.
✗ Branch 107 not taken.
✗ Branch 108 not taken.
✓ Branch 111 taken 315 times.
✗ Branch 112 not taken.
✓ Branch 114 taken 315 times.
✗ Branch 115 not taken.
✗ Branch 117 not taken.
✗ Branch 118 not taken.
✗ Branch 121 not taken.
✗ Branch 122 not taken.
✗ Branch 124 not taken.
✗ Branch 125 not taken.
✗ Branch 127 not taken.
✗ Branch 128 not taken.
✗ Branch 131 not taken.
✗ Branch 132 not taken.
✗ Branch 134 not taken.
✗ Branch 135 not taken.
✗ Branch 137 not taken.
✗ Branch 138 not taken.
✗ Branch 141 not taken.
✗ Branch 142 not taken.
✗ Branch 144 not taken.
✗ Branch 145 not taken.
✗ Branch 147 not taken.
✗ Branch 148 not taken.
✗ Branch 151 not taken.
✗ Branch 152 not taken.
✗ Branch 154 not taken.
✗ Branch 155 not taken.
✗ Branch 157 not taken.
✗ Branch 158 not taken.
✗ Branch 161 not taken.
✗ Branch 162 not taken.
✗ Branch 164 not taken.
✗ Branch 165 not taken.
✗ Branch 167 not taken.
✗ Branch 168 not taken.
✗ Branch 171 not taken.
✗ Branch 172 not taken.
✗ Branch 174 not taken.
✗ Branch 175 not taken.
✗ Branch 177 not taken.
✗ Branch 178 not taken.
✗ Branch 181 not taken.
✗ Branch 182 not taken.
✗ Branch 184 not taken.
✗ Branch 185 not taken.
✗ Branch 187 not taken.
✗ Branch 188 not taken.
✓ Branch 191 taken 67 times.
✗ Branch 192 not taken.
✓ Branch 194 taken 67 times.
✗ Branch 195 not taken.
✗ Branch 197 not taken.
✗ Branch 198 not taken.
✗ Branch 201 not taken.
✗ Branch 202 not taken.
✗ Branch 204 not taken.
✗ Branch 205 not taken.
✗ Branch 207 not taken.
✗ Branch 208 not taken.
✗ Branch 211 not taken.
✗ Branch 212 not taken.
✗ Branch 214 not taken.
✗ Branch 215 not taken.
✗ Branch 217 not taken.
✗ Branch 218 not taken.
✗ Branch 221 not taken.
✗ Branch 222 not taken.
✗ Branch 224 not taken.
✗ Branch 225 not taken.
✗ Branch 227 not taken.
✗ Branch 228 not taken.
✗ Branch 231 not taken.
✗ Branch 232 not taken.
✗ Branch 234 not taken.
✗ Branch 235 not taken.
✗ Branch 237 not taken.
✗ Branch 238 not taken.
|
4568 | Slice _slice{ |
| 302 |
21/240✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 5 not taken.
✗ Branch 6 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 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 taken 2 times.
✗ Branch 75 not taken.
✗ Branch 76 not taken.
✓ Branch 78 taken 2 times.
✗ Branch 79 not taken.
✓ Branch 80 taken 2 times.
✗ Branch 81 not taken.
✗ Branch 82 not taken.
✗ Branch 83 not taken.
✗ Branch 85 not taken.
✗ Branch 86 not taken.
✗ Branch 89 not taken.
✗ Branch 90 not taken.
✗ Branch 92 not taken.
✗ Branch 93 not taken.
✗ Branch 94 not taken.
✗ Branch 95 not taken.
✗ Branch 96 not taken.
✗ Branch 97 not taken.
✗ Branch 99 not taken.
✓ Branch 100 taken 79 times.
✗ Branch 103 not taken.
✗ Branch 104 not taken.
✓ Branch 106 taken 79 times.
✗ Branch 107 not taken.
✓ Branch 108 taken 79 times.
✗ Branch 109 not taken.
✗ Branch 110 not taken.
✗ Branch 111 not taken.
✗ Branch 113 not taken.
✗ Branch 114 not taken.
✗ Branch 117 not taken.
✗ Branch 118 not taken.
✗ Branch 120 not taken.
✗ Branch 121 not taken.
✗ Branch 122 not taken.
✗ Branch 123 not taken.
✗ Branch 124 not taken.
✗ Branch 125 not taken.
✗ Branch 127 not taken.
✗ Branch 128 not taken.
✗ Branch 131 not taken.
✗ Branch 132 not taken.
✗ Branch 134 not taken.
✗ Branch 135 not taken.
✗ Branch 136 not taken.
✗ Branch 137 not taken.
✗ Branch 138 not taken.
✗ Branch 139 not taken.
✓ Branch 141 taken 1523 times.
✓ Branch 142 taken 422 times.
✓ Branch 145 taken 1523 times.
✗ Branch 146 not taken.
✓ Branch 148 taken 422 times.
✗ Branch 149 not taken.
✓ Branch 150 taken 422 times.
✓ Branch 151 taken 1523 times.
✗ Branch 152 not taken.
✗ Branch 153 not taken.
✓ Branch 155 taken 1275 times.
✓ Branch 156 taken 315 times.
✓ Branch 159 taken 1275 times.
✗ Branch 160 not taken.
✓ Branch 162 taken 315 times.
✗ Branch 163 not taken.
✓ Branch 164 taken 315 times.
✓ Branch 165 taken 1275 times.
✗ Branch 166 not taken.
✗ Branch 167 not taken.
✗ Branch 169 not taken.
✗ Branch 170 not taken.
✗ Branch 173 not taken.
✗ Branch 174 not taken.
✗ Branch 176 not taken.
✗ Branch 177 not taken.
✗ Branch 178 not taken.
✗ Branch 179 not taken.
✗ Branch 180 not taken.
✗ Branch 181 not taken.
✗ Branch 183 not taken.
✗ Branch 184 not taken.
✗ Branch 187 not taken.
✗ Branch 188 not taken.
✗ Branch 190 not taken.
✗ Branch 191 not taken.
✗ Branch 192 not taken.
✗ Branch 193 not taken.
✗ Branch 194 not taken.
✗ Branch 195 not taken.
✗ Branch 197 not taken.
✗ Branch 198 not taken.
✗ Branch 201 not taken.
✗ Branch 202 not taken.
✗ Branch 204 not taken.
✗ Branch 205 not taken.
✗ Branch 206 not taken.
✗ Branch 207 not taken.
✗ Branch 208 not taken.
✗ Branch 209 not taken.
✗ Branch 211 not taken.
✗ Branch 212 not taken.
✗ Branch 215 not taken.
✗ Branch 216 not taken.
✗ Branch 218 not taken.
✗ Branch 219 not taken.
✗ Branch 220 not taken.
✗ Branch 221 not taken.
✗ Branch 222 not taken.
✗ Branch 223 not taken.
✗ Branch 225 not taken.
✗ Branch 226 not taken.
✗ Branch 229 not taken.
✗ Branch 230 not taken.
✗ Branch 232 not taken.
✗ Branch 233 not taken.
✗ Branch 234 not taken.
✗ Branch 235 not taken.
✗ Branch 236 not taken.
✗ Branch 237 not taken.
✗ Branch 239 not taken.
✗ Branch 240 not taken.
✗ Branch 243 not taken.
✗ Branch 244 not taken.
✗ Branch 246 not taken.
✗ Branch 247 not taken.
✗ Branch 248 not taken.
✗ Branch 249 not taken.
✗ Branch 250 not taken.
✗ Branch 251 not taken.
✗ Branch 253 not taken.
✗ Branch 254 not taken.
✗ Branch 257 not taken.
✗ Branch 258 not taken.
✗ Branch 260 not taken.
✗ Branch 261 not taken.
✗ Branch 262 not taken.
✗ Branch 263 not taken.
✗ Branch 264 not taken.
✗ Branch 265 not taken.
✗ Branch 267 not taken.
✓ Branch 268 taken 67 times.
✗ Branch 271 not taken.
✗ Branch 272 not taken.
✓ Branch 274 taken 67 times.
✗ Branch 275 not taken.
✓ Branch 276 taken 67 times.
✗ Branch 277 not taken.
✗ Branch 278 not taken.
✗ Branch 279 not taken.
✗ Branch 281 not taken.
✗ Branch 282 not taken.
✗ Branch 285 not taken.
✗ Branch 286 not taken.
✗ Branch 288 not taken.
✗ Branch 289 not taken.
✗ Branch 290 not taken.
✗ Branch 291 not taken.
✗ Branch 292 not taken.
✗ Branch 293 not taken.
✗ Branch 295 not taken.
✗ Branch 296 not taken.
✗ Branch 299 not taken.
✗ Branch 300 not taken.
✗ Branch 302 not taken.
✗ Branch 303 not taken.
✗ Branch 304 not taken.
✗ Branch 305 not taken.
✗ Branch 306 not taken.
✗ Branch 307 not taken.
✗ Branch 309 not taken.
✗ Branch 310 not taken.
✗ Branch 313 not taken.
✗ Branch 314 not taken.
✗ Branch 316 not taken.
✗ Branch 317 not taken.
✗ Branch 318 not taken.
✗ Branch 319 not taken.
✗ Branch 320 not taken.
✗ Branch 321 not taken.
✗ Branch 323 not taken.
✗ Branch 324 not taken.
✗ Branch 327 not taken.
✗ Branch 328 not taken.
✗ Branch 330 not taken.
✗ Branch 331 not taken.
✗ Branch 332 not taken.
✗ Branch 333 not taken.
✗ Branch 334 not taken.
✗ Branch 335 not taken.
|
8251 | .offset = slice ? slice->offset : std::vector<std::size_t>(space.getNumberDimensions(), 0), |
| 303 |
9/96✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 5 not taken.
✗ 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 taken 2 times.
✗ 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 taken 79 times.
✗ 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 68 not taken.
✗ Branch 69 not taken.
✓ Branch 71 taken 1523 times.
✓ Branch 72 taken 422 times.
✓ Branch 75 taken 1523 times.
✗ Branch 76 not taken.
✓ Branch 78 taken 1275 times.
✓ Branch 79 taken 315 times.
✓ Branch 82 taken 1275 times.
✗ Branch 83 not taken.
✗ Branch 85 not taken.
✗ Branch 86 not taken.
✗ Branch 89 not taken.
✗ Branch 90 not taken.
✗ Branch 92 not taken.
✗ Branch 93 not taken.
✗ 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 110 not taken.
✗ Branch 111 not taken.
✗ Branch 113 not taken.
✗ Branch 114 not taken.
✗ Branch 117 not taken.
✗ Branch 118 not taken.
✗ Branch 120 not taken.
✗ Branch 121 not taken.
✗ Branch 124 not taken.
✗ Branch 125 not taken.
✗ Branch 127 not taken.
✗ Branch 128 not taken.
✗ Branch 131 not taken.
✗ Branch 132 not taken.
✗ Branch 134 not taken.
✓ Branch 135 taken 67 times.
✗ Branch 138 not taken.
✗ Branch 139 not taken.
✗ Branch 141 not taken.
✗ Branch 142 not taken.
✗ Branch 145 not taken.
✗ Branch 146 not taken.
✗ Branch 148 not taken.
✗ Branch 149 not taken.
✗ Branch 152 not taken.
✗ Branch 153 not taken.
✗ Branch 155 not taken.
✗ Branch 156 not taken.
✗ Branch 159 not taken.
✗ Branch 160 not taken.
✗ Branch 162 not taken.
✗ Branch 163 not taken.
✗ Branch 166 not taken.
✗ Branch 167 not taken.
|
3683 | .count = slice ? slice->count : space.getDimensions() |
| 304 | }; | ||
| 305 |
5/48✗ Branch 1 not taken.
✗ 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 taken 2 times.
✗ Branch 17 not taken.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✓ Branch 22 taken 79 times.
✗ Branch 23 not taken.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✗ Branch 28 not taken.
✗ Branch 29 not taken.
✓ Branch 31 taken 1945 times.
✗ Branch 32 not taken.
✓ Branch 34 taken 1590 times.
✗ Branch 35 not taken.
✗ Branch 37 not taken.
✗ Branch 38 not taken.
✗ Branch 40 not taken.
✗ Branch 41 not taken.
✗ Branch 43 not taken.
✗ Branch 44 not taken.
✗ Branch 46 not taken.
✗ Branch 47 not taken.
✗ Branch 49 not taken.
✗ Branch 50 not taken.
✗ Branch 52 not taken.
✗ Branch 53 not taken.
✗ Branch 55 not taken.
✗ Branch 56 not taken.
✓ Branch 58 taken 67 times.
✗ Branch 59 not taken.
✗ Branch 61 not taken.
✗ Branch 62 not taken.
✗ Branch 64 not taken.
✗ Branch 65 not taken.
✗ Branch 67 not taken.
✗ Branch 68 not taken.
✗ Branch 70 not taken.
✗ Branch 71 not taken.
|
3683 | _slice.offset.at(0) += offset; |
| 306 | |||
| 307 |
5/48✗ Branch 1 not taken.
✗ 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 taken 2 times.
✗ Branch 17 not taken.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✓ Branch 22 taken 79 times.
✗ Branch 23 not taken.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✗ Branch 28 not taken.
✗ Branch 29 not taken.
✓ Branch 31 taken 1945 times.
✗ Branch 32 not taken.
✓ Branch 34 taken 1590 times.
✗ Branch 35 not taken.
✗ Branch 37 not taken.
✗ Branch 38 not taken.
✗ Branch 40 not taken.
✗ Branch 41 not taken.
✗ Branch 43 not taken.
✗ Branch 44 not taken.
✗ Branch 46 not taken.
✗ Branch 47 not taken.
✗ Branch 49 not taken.
✗ Branch 50 not taken.
✗ Branch 52 not taken.
✗ Branch 53 not taken.
✗ Branch 55 not taken.
✗ Branch 56 not taken.
✓ Branch 58 taken 67 times.
✗ Branch 59 not taken.
✗ Branch 61 not taken.
✗ Branch 62 not taken.
✗ Branch 64 not taken.
✗ Branch 65 not taken.
✗ Branch 67 not taken.
✗ Branch 68 not taken.
✗ Branch 70 not taken.
✗ Branch 71 not taken.
|
3683 | const auto serialization = field.serialized(); |
| 308 |
5/48✗ Branch 1 not taken.
✗ 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 taken 2 times.
✗ Branch 17 not taken.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✓ Branch 22 taken 79 times.
✗ Branch 23 not taken.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✗ Branch 28 not taken.
✗ Branch 29 not taken.
✓ Branch 31 taken 1945 times.
✗ Branch 32 not taken.
✓ Branch 34 taken 1590 times.
✗ Branch 35 not taken.
✗ Branch 37 not taken.
✗ Branch 38 not taken.
✗ Branch 40 not taken.
✗ Branch 41 not taken.
✗ Branch 43 not taken.
✗ Branch 44 not taken.
✗ Branch 46 not taken.
✗ Branch 47 not taken.
✗ Branch 49 not taken.
✗ Branch 50 not taken.
✗ Branch 52 not taken.
✗ Branch 53 not taken.
✗ Branch 55 not taken.
✗ Branch 56 not taken.
✓ Branch 58 taken 67 times.
✗ Branch 59 not taken.
✗ Branch 61 not taken.
✗ Branch 62 not taken.
✗ Branch 64 not taken.
✗ Branch 65 not taken.
✗ Branch 67 not taken.
✗ Branch 68 not taken.
✗ Branch 70 not taken.
✗ Branch 71 not taken.
|
3683 | const std::span<const T> span = serialization.template as_span_of<T>(); |
| 309 | |||
| 310 |
9/77✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ 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 taken 2 times.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✓ Branch 23 taken 79 times.
✗ Branch 24 not taken.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
✗ Branch 28 not taken.
✗ Branch 29 not taken.
✗ Branch 31 not taken.
✓ Branch 32 taken 675 times.
✗ Branch 33 not taken.
✗ Branch 34 not taken.
✓ Branch 35 taken 534 times.
✗ Branch 36 not taken.
✗ Branch 37 not taken.
✗ Branch 38 not taken.
✗ Branch 39 not taken.
✗ Branch 41 not taken.
✗ Branch 42 not taken.
✗ Branch 43 not taken.
✗ Branch 44 not taken.
✗ Branch 46 not taken.
✗ Branch 47 not taken.
✗ Branch 48 not taken.
✗ Branch 49 not taken.
✓ Branch 51 taken 1270 times.
✗ Branch 52 not taken.
✓ Branch 53 taken 1270 times.
✗ Branch 54 not taken.
✓ Branch 56 taken 1056 times.
✗ Branch 57 not taken.
✓ Branch 58 taken 1056 times.
✗ Branch 59 not taken.
✗ Branch 61 not taken.
✗ Branch 62 not taken.
✗ Branch 64 not taken.
✗ Branch 65 not taken.
✗ Branch 67 not taken.
✗ Branch 68 not taken.
✗ Branch 70 not taken.
✗ Branch 71 not taken.
✗ Branch 73 not taken.
✗ Branch 74 not taken.
✗ Branch 76 not taken.
✗ Branch 77 not taken.
✗ Branch 79 not taken.
✗ Branch 80 not taken.
✗ Branch 82 not taken.
✓ Branch 83 taken 67 times.
✗ Branch 85 not taken.
✗ Branch 86 not taken.
✗ Branch 88 not taken.
✗ Branch 89 not taken.
✗ Branch 91 not taken.
✗ Branch 92 not taken.
✗ Branch 94 not taken.
✗ Branch 95 not taken.
|
3683 | if (Parallel::size(_comm) > 1) { |
| 311 |
2/48✗ Branch 1 not taken.
✗ 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 not taken.
✗ Branch 20 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✗ Branch 28 not taken.
✗ Branch 29 not taken.
✓ Branch 31 taken 1270 times.
✗ Branch 32 not taken.
✓ Branch 34 taken 1056 times.
✗ Branch 35 not taken.
✗ Branch 37 not taken.
✗ Branch 38 not taken.
✗ Branch 40 not taken.
✗ Branch 41 not taken.
✗ Branch 43 not taken.
✗ Branch 44 not taken.
✗ Branch 46 not taken.
✗ Branch 47 not taken.
✗ Branch 49 not taken.
✗ Branch 50 not taken.
✗ Branch 52 not taken.
✗ Branch 53 not taken.
✗ Branch 55 not taken.
✗ Branch 56 not taken.
✗ Branch 58 not taken.
✗ Branch 59 not taken.
✗ Branch 61 not taken.
✗ Branch 62 not taken.
✗ Branch 64 not taken.
✗ Branch 65 not taken.
✗ Branch 67 not taken.
✗ Branch 68 not taken.
✗ Branch 70 not taken.
✗ Branch 71 not taken.
|
2326 | if (slice) { // collective I/O |
| 312 |
2/48✗ Branch 1 not taken.
✗ 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 not taken.
✗ Branch 20 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✗ Branch 28 not taken.
✗ Branch 29 not taken.
✓ Branch 31 taken 1270 times.
✗ Branch 32 not taken.
✓ Branch 34 taken 1056 times.
✗ Branch 35 not taken.
✗ Branch 37 not taken.
✗ Branch 38 not taken.
✗ Branch 40 not taken.
✗ Branch 41 not taken.
✗ Branch 43 not taken.
✗ Branch 44 not taken.
✗ Branch 46 not taken.
✗ Branch 47 not taken.
✗ Branch 49 not taken.
✗ Branch 50 not taken.
✗ Branch 52 not taken.
✗ Branch 53 not taken.
✗ Branch 55 not taken.
✗ Branch 56 not taken.
✗ Branch 58 not taken.
✗ Branch 59 not taken.
✗ Branch 61 not taken.
✗ Branch 62 not taken.
✗ Branch 64 not taken.
✗ Branch 65 not taken.
✗ Branch 67 not taken.
✗ Branch 68 not taken.
✗ Branch 70 not taken.
✗ Branch 71 not taken.
|
2326 | const auto props = Detail::parallel_transfer_props(); |
| 313 |
4/96✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 5 not taken.
✗ 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 not taken.
✗ Branch 56 not taken.
✗ Branch 59 not taken.
✗ 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 not taken.
✗ Branch 83 not taken.
✗ Branch 86 not taken.
✗ Branch 87 not taken.
✓ Branch 91 taken 1270 times.
✗ Branch 92 not taken.
✓ Branch 95 taken 1270 times.
✗ Branch 96 not taken.
✓ Branch 100 taken 1056 times.
✗ Branch 101 not taken.
✓ Branch 104 taken 1056 times.
✗ Branch 105 not taken.
✗ Branch 109 not taken.
✗ Branch 110 not taken.
✗ Branch 113 not taken.
✗ Branch 114 not taken.
✗ Branch 118 not taken.
✗ Branch 119 not taken.
✗ Branch 122 not taken.
✗ Branch 123 not taken.
✗ Branch 127 not taken.
✗ Branch 128 not taken.
✗ Branch 131 not taken.
✗ Branch 132 not taken.
✗ Branch 136 not taken.
✗ Branch 137 not taken.
✗ Branch 140 not taken.
✗ Branch 141 not taken.
✗ Branch 145 not taken.
✗ Branch 146 not taken.
✗ Branch 149 not taken.
✗ Branch 150 not taken.
✗ Branch 154 not taken.
✗ Branch 155 not taken.
✗ Branch 158 not taken.
✗ Branch 159 not taken.
✗ Branch 163 not taken.
✗ Branch 164 not taken.
✗ Branch 167 not taken.
✗ Branch 168 not taken.
✗ Branch 172 not taken.
✗ Branch 173 not taken.
✗ Branch 176 not taken.
✗ Branch 177 not taken.
✗ Branch 181 not taken.
✗ Branch 182 not taken.
✗ Branch 185 not taken.
✗ Branch 186 not taken.
✗ Branch 190 not taken.
✗ Branch 191 not taken.
✗ Branch 194 not taken.
✗ Branch 195 not taken.
✗ Branch 199 not taken.
✗ Branch 200 not taken.
✗ Branch 203 not taken.
✗ Branch 204 not taken.
✗ Branch 208 not taken.
✗ Branch 209 not taken.
✗ Branch 212 not taken.
✗ Branch 213 not taken.
|
2326 | _write_to(dataset, span.data(), _slice, props); |
| 314 |
2/48✗ Branch 1 not taken.
✗ 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 not taken.
✗ Branch 20 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✗ Branch 28 not taken.
✗ Branch 29 not taken.
✓ Branch 31 taken 1270 times.
✗ Branch 32 not taken.
✓ Branch 34 taken 1056 times.
✗ Branch 35 not taken.
✗ Branch 37 not taken.
✗ Branch 38 not taken.
✗ Branch 40 not taken.
✗ Branch 41 not taken.
✗ Branch 43 not taken.
✗ Branch 44 not taken.
✗ Branch 46 not taken.
✗ Branch 47 not taken.
✗ Branch 49 not taken.
✗ Branch 50 not taken.
✗ Branch 52 not taken.
✗ Branch 53 not taken.
✗ Branch 55 not taken.
✗ Branch 56 not taken.
✗ Branch 58 not taken.
✗ Branch 59 not taken.
✗ Branch 61 not taken.
✗ Branch 62 not taken.
✗ Branch 64 not taken.
✗ Branch 65 not taken.
✗ Branch 67 not taken.
✗ Branch 68 not taken.
✗ Branch 70 not taken.
✗ Branch 71 not taken.
|
2326 | Detail::check_successful_collective_io(props); |
| 315 |
0/82✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 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 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 not taken.
✗ Branch 45 not taken.
✗ Branch 46 not taken.
✗ Branch 47 not taken.
✗ Branch 48 not taken.
✗ Branch 51 not taken.
✗ Branch 52 not taken.
✗ Branch 53 not taken.
✗ Branch 54 not taken.
✗ Branch 57 not taken.
✗ Branch 58 not taken.
✗ Branch 59 not taken.
✗ Branch 60 not taken.
✗ Branch 61 not taken.
✗ 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.
✗ Branch 79 not taken.
✗ Branch 80 not taken.
✗ Branch 81 not taken.
✗ Branch 82 not taken.
✗ Branch 86 not taken.
✗ Branch 87 not taken.
✗ Branch 91 not taken.
✗ Branch 92 not taken.
✗ Branch 96 not taken.
✗ Branch 97 not taken.
✗ Branch 101 not taken.
✗ Branch 102 not taken.
✗ Branch 106 not taken.
✗ Branch 107 not taken.
✗ Branch 111 not taken.
✗ Branch 112 not taken.
✗ Branch 116 not taken.
✗ Branch 117 not taken.
✗ Branch 121 not taken.
✗ Branch 122 not taken.
✗ Branch 126 not taken.
✗ Branch 127 not taken.
✗ Branch 131 not taken.
✗ Branch 132 not taken.
✗ Branch 136 not taken.
✗ Branch 137 not taken.
✗ Branch 141 not taken.
✗ Branch 142 not taken.
|
2326 | } else if (Parallel::rank(_comm) == 0) { // write only on rank 0 to avoid clashes |
| 316 | ✗ | _write_to(dataset, span.data(), _slice); | |
| 317 | } | ||
| 318 | } else { | ||
| 319 |
5/48✗ Branch 3 not taken.
✗ 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 taken 2 times.
✗ Branch 39 not taken.
✗ Branch 45 not taken.
✗ Branch 46 not taken.
✓ Branch 52 taken 79 times.
✗ Branch 53 not taken.
✗ Branch 59 not taken.
✗ Branch 60 not taken.
✗ Branch 66 not taken.
✗ Branch 67 not taken.
✓ Branch 73 taken 675 times.
✗ Branch 74 not taken.
✓ Branch 80 taken 534 times.
✗ Branch 81 not taken.
✗ Branch 87 not taken.
✗ Branch 88 not taken.
✗ Branch 94 not taken.
✗ Branch 95 not taken.
✗ Branch 101 not taken.
✗ Branch 102 not taken.
✗ Branch 108 not taken.
✗ Branch 109 not taken.
✗ Branch 115 not taken.
✗ Branch 116 not taken.
✗ Branch 122 not taken.
✗ Branch 123 not taken.
✗ Branch 129 not taken.
✗ Branch 130 not taken.
✓ Branch 136 taken 67 times.
✗ Branch 137 not taken.
✗ Branch 143 not taken.
✗ Branch 144 not taken.
✗ Branch 150 not taken.
✗ Branch 151 not taken.
✗ Branch 157 not taken.
✗ Branch 158 not taken.
✗ Branch 164 not taken.
✗ Branch 165 not taken.
|
1357 | _write_to(dataset, span.data(), _slice); |
| 320 | } | ||
| 321 |
5/48✗ Branch 1 not taken.
✗ 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 taken 2 times.
✗ Branch 17 not taken.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✓ Branch 22 taken 79 times.
✗ Branch 23 not taken.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✗ Branch 28 not taken.
✗ Branch 29 not taken.
✓ Branch 31 taken 1945 times.
✗ Branch 32 not taken.
✓ Branch 34 taken 1590 times.
✗ Branch 35 not taken.
✗ Branch 37 not taken.
✗ Branch 38 not taken.
✗ Branch 40 not taken.
✗ Branch 41 not taken.
✗ Branch 43 not taken.
✗ Branch 44 not taken.
✗ Branch 46 not taken.
✗ Branch 47 not taken.
✗ Branch 49 not taken.
✗ Branch 50 not taken.
✗ Branch 52 not taken.
✗ Branch 53 not taken.
✗ Branch 55 not taken.
✗ Branch 56 not taken.
✓ Branch 58 taken 67 times.
✗ Branch 59 not taken.
✗ Branch 61 not taken.
✗ Branch 62 not taken.
✗ Branch 64 not taken.
✗ Branch 65 not taken.
✗ Branch 67 not taken.
✗ Branch 68 not taken.
✗ Branch 70 not taken.
✗ Branch 71 not taken.
|
3683 | _file.flush(); |
| 322 | 3683 | }); | |
| 323 | 6076 | } | |
| 324 | |||
| 325 | //! Read dataset values into an instance of the given T | ||
| 326 | template<typename T> | ||
| 327 | requires(Concepts::ResizableMDRange<T> or Concepts::Scalar<T>) | ||
| 328 | 16770 | T read_dataset_to(const std::string& path, | |
| 329 | const std::optional<Slice>& slice = {}) const { | ||
| 330 |
1/2✓ Branch 1 taken 3897 times.
✗ Branch 2 not taken.
|
32949 | return visit_dataset(path, [&] <typename F> (BufferField<F>&& field) { |
| 331 | 8385 | return field.template export_to<T>(); | |
| 332 |
1/2✓ Branch 1 taken 4488 times.
✗ Branch 2 not taken.
|
33540 | }, slice); |
| 333 | } | ||
| 334 | |||
| 335 | //! Visit the dataset field | ||
| 336 | template<std::invocable<BufferField<int>&&> Visitor> | ||
| 337 | 20872 | decltype(auto) visit_dataset(const std::string& path, | |
| 338 | Visitor&& visitor, | ||
| 339 | const std::optional<Slice>& slice = {}) const { | ||
| 340 |
2/4✓ Branch 1 taken 10436 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 10436 times.
|
20872 | if (!has_dataset_at(path)) |
| 341 | ✗ | throw ValueError("Given data set '" + path + "' does not exist."); | |
| 342 | |||
| 343 |
1/2✓ Branch 1 taken 10436 times.
✗ Branch 2 not taken.
|
20872 | auto [group, name] = Detail::split_group(path); |
| 344 |
2/2✓ Branch 1 taken 8761 times.
✓ Branch 2 taken 1675 times.
|
20872 | if (slice) |
| 345 |
1/2✓ Branch 2 taken 3897 times.
✗ Branch 3 not taken.
|
7794 | return _visit_data( |
| 346 | std::forward<Visitor>(visitor), | ||
| 347 |
3/6✓ Branch 1 taken 8761 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 8761 times.
✗ Branch 6 not taken.
✓ Branch 12 taken 8761 times.
✗ Branch 13 not taken.
|
35044 | _file.getGroup(group).getDataSet(name).select(slice->offset, slice->count) |
| 348 |
1/2✓ Branch 2 taken 4864 times.
✗ Branch 3 not taken.
|
17522 | ); |
| 349 |
3/6✓ Branch 1 taken 1675 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1675 times.
✗ Branch 6 not taken.
✓ Branch 9 taken 1675 times.
✗ Branch 10 not taken.
|
3350 | return _visit_data(std::forward<Visitor>(visitor), _file.getGroup(group).getDataSet(name)); |
| 350 | 20872 | } | |
| 351 | |||
| 352 | //! Read attribute values into an instance of the given T | ||
| 353 | template<typename T> | ||
| 354 | requires(Concepts::ResizableMDRange<T> or Concepts::Scalar<T>) | ||
| 355 | 580 | T read_attribute_to(const std::string& path) const { | |
| 356 | 870 | return visit_attribute(path, [&] <typename F> (BufferField<F>&& field) { | |
| 357 | 290 | return field.template export_to<T>(); | |
| 358 |
1/2✓ Branch 1 taken 290 times.
✗ Branch 2 not taken.
|
1160 | }); |
| 359 | } | ||
| 360 | |||
| 361 | //! Visit the attribute field | ||
| 362 | template<std::invocable<BufferField<int>&&> Visitor> | ||
| 363 | 870 | decltype(auto) visit_attribute(const std::string& path, Visitor&& visitor) const { | |
| 364 |
2/4✓ Branch 1 taken 435 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 435 times.
|
870 | if (!has_attribute_at(path)) |
| 365 | ✗ | throw ValueError("Given attribute '" + path + "' does not exist."); | |
| 366 | |||
| 367 |
1/2✓ Branch 1 taken 435 times.
✗ Branch 2 not taken.
|
870 | auto [group, name] = Detail::split_group(path); |
| 368 |
3/6✓ Branch 1 taken 435 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 435 times.
✗ Branch 5 not taken.
✓ Branch 8 taken 435 times.
✗ Branch 9 not taken.
|
1740 | return _visit_data(std::forward<Visitor>(visitor), _file.getGroup(group).getAttribute(name)); |
| 369 | 870 | } | |
| 370 | |||
| 371 | //! Get the dimensions of a dataset; returns null optional if it doesn't exist. | ||
| 372 | 9180 | std::optional<std::vector<std::size_t>> get_dimensions(const std::string& path) const { | |
| 373 |
2/2✓ Branch 1 taken 5203 times.
✓ Branch 2 taken 779 times.
|
9180 | if (has_dataset_at(path)) { |
| 374 |
1/2✓ Branch 1 taken 5203 times.
✗ Branch 2 not taken.
|
8039 | const auto [group, name] = Detail::split_group(path); |
| 375 |
3/6✓ Branch 1 taken 5203 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 5203 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 5203 times.
✗ Branch 9 not taken.
|
8039 | return _file.getGroup(group).getDataSet(name).getDimensions(); |
| 376 | 8039 | } | |
| 377 | 1141 | return {}; | |
| 378 | } | ||
| 379 | |||
| 380 | //! Get the precision of a dataset; returns null optional if it doesn't exist. | ||
| 381 | 4803 | std::optional<DynamicPrecision> get_precision(const std::string& path) const { | |
| 382 |
1/2✓ Branch 1 taken 3011 times.
✗ Branch 2 not taken.
|
4803 | if (has_dataset_at(path)) { |
| 383 |
1/2✓ Branch 1 taken 3011 times.
✗ Branch 2 not taken.
|
4803 | const auto [group, name] = Detail::split_group(path); |
| 384 |
4/8✓ Branch 1 taken 3011 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 3011 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 3011 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 3011 times.
✗ Branch 12 not taken.
|
4803 | return _to_precision(_file.getGroup(group).getDataSet(name).getDataType()); |
| 385 | 4803 | } | |
| 386 | ✗ | return {}; | |
| 387 | } | ||
| 388 | |||
| 389 | //! Return the names of all datasets in the given group | ||
| 390 | 369 | std::ranges::range auto dataset_names_in(const std::string& group) const { | |
| 391 |
2/4✓ Branch 1 taken 239 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 239 times.
✗ Branch 5 not taken.
|
738 | return _file.getGroup(group).listObjectNames() |
| 392 |
2/6✓ Branch 1 taken 239 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 239 times.
✗ Branch 5 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
|
1414 | | std::views::filter([&, group=group] (const auto& name) { |
| 393 |
4/8✓ Branch 1 taken 829 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 829 times.
✗ Branch 5 not taken.
✓ Branch 9 taken 288 times.
✗ Branch 10 not taken.
✓ Branch 12 taken 288 times.
✗ Branch 13 not taken.
|
1117 | return _file.getGroup(group).getObjectType(name) == HighFive::ObjectType::Dataset; |
| 394 |
1/2✓ Branch 1 taken 239 times.
✗ Branch 2 not taken.
|
738 | }); |
| 395 | } | ||
| 396 | |||
| 397 | //! Return true if the given path exists in the file | ||
| 398 | 3404 | bool exists(const std::string& path) const { | |
| 399 | 3404 | return _file.exist(path); | |
| 400 | } | ||
| 401 | |||
| 402 | //! Return true if a dataset exists at the given path | ||
| 403 | 32224 | bool has_dataset_at(const std::string& path) const { | |
| 404 |
2/2✓ Branch 1 taken 19747 times.
✓ Branch 2 taken 782 times.
|
32224 | if (_file.exist(path)) { |
| 405 |
1/2✓ Branch 1 taken 19747 times.
✗ Branch 2 not taken.
|
31080 | const auto [group, name] = Detail::split_group(path); |
| 406 |
3/6✓ Branch 1 taken 19747 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 19747 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 19747 times.
✗ Branch 8 not taken.
|
31080 | if (_file.getGroup(group).exist(name)) |
| 407 |
2/4✓ Branch 1 taken 19747 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 19747 times.
✗ Branch 5 not taken.
|
31080 | return _file.getGroup(group).getObjectType(name) == HighFive::ObjectType::Dataset; |
| 408 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 19747 times.
|
31080 | } |
| 409 | 1144 | return false; | |
| 410 | } | ||
| 411 | |||
| 412 | //! Return true if an attribute exists at the given path | ||
| 413 | 1104 | bool has_attribute_at(const std::string& path) const { | |
| 414 |
1/2✓ Branch 1 taken 751 times.
✗ Branch 2 not taken.
|
1104 | const auto [parent_path, attr_name] = Detail::split_group(path); |
| 415 |
2/4✓ Branch 1 taken 751 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 751 times.
✗ Branch 4 not taken.
|
1104 | if (_file.exist(parent_path)) { |
| 416 |
2/4✓ Branch 1 taken 751 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 751 times.
|
1104 | if (has_dataset_at(parent_path)) { |
| 417 | ✗ | const auto [group, dataset] = Detail::split_group(parent_path); | |
| 418 | ✗ | return _file.getGroup(group).getDataSet(dataset).hasAttribute(attr_name); | |
| 419 | ✗ | } else { | |
| 420 |
2/4✓ Branch 1 taken 751 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 751 times.
✗ Branch 5 not taken.
|
1104 | return _file.getGroup(parent_path).hasAttribute(attr_name); |
| 421 | } | ||
| 422 | } | ||
| 423 | ✗ | return false; | |
| 424 | 1104 | } | |
| 425 | |||
| 426 | private: | ||
| 427 | 16948 | void _check_writable() const { | |
| 428 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 10746 times.
|
16948 | if (_mode == read_only) |
| 429 | ✗ | throw InvalidState("Cannot modify hdf-file opened in read-only mode"); | |
| 430 | 16948 | } | |
| 431 | |||
| 432 | 1242 | HighFive::File _open(const std::string& filename) const { | |
| 433 |
2/2✓ Branch 0 taken 665 times.
✓ Branch 1 taken 153 times.
|
2256 | auto open_mode = _mode == read_only ? HighFive::File::ReadOnly |
| 434 |
2/2✓ Branch 0 taken 140 times.
✓ Branch 1 taken 525 times.
|
1014 | : (_mode == overwrite ? HighFive::File::Overwrite |
| 435 | : HighFive::File::ReadWrite); | ||
| 436 |
2/2✓ Branch 1 taken 270 times.
✓ Branch 2 taken 548 times.
|
1242 | if (Parallel::size(_comm) > 1) |
| 437 |
2/4✓ Branch 1 taken 270 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 270 times.
✗ Branch 5 not taken.
|
1080 | return HighFive::File{filename, open_mode, Detail::parallel_file_access_props(_comm)}; |
| 438 | else | ||
| 439 | 702 | return HighFive::File{filename, open_mode}; | |
| 440 | } | ||
| 441 | |||
| 442 | template<Concepts::Scalar S, typename T = Detail::HighFiveDataType<S>> | ||
| 443 | 16976 | auto _prepare_dataset(HighFive::Group& group, | |
| 444 | const std::string& name, | ||
| 445 | const HighFive::DataSpace& space) { | ||
| 446 |
3/4✓ Branch 1 taken 8488 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 8485 times.
✓ Branch 5 taken 3 times.
|
16976 | return _prepare_dataset(group, name, space, HighFive::create_datatype<T>()); |
| 447 | } | ||
| 448 | |||
| 449 | 13992 | std::pair<std::size_t, HighFive::DataSet> _prepare_dataset(HighFive::Group& group, | |
| 450 | const std::string& name, | ||
| 451 | const HighFive::DataSpace& space, | ||
| 452 | const HighFive::DataType& type) { | ||
| 453 |
2/2✓ Branch 0 taken 1749 times.
✓ Branch 1 taken 7173 times.
|
13992 | if (_mode == overwrite) |
| 454 |
1/2✓ Branch 3 taken 1749 times.
✗ Branch 4 not taken.
|
3113 | return std::make_pair(std::size_t{0}, group.createDataSet(name, space, type)); |
| 455 |
1/2✓ Branch 0 taken 7173 times.
✗ Branch 1 not taken.
|
10879 | else if (_mode == append) { |
| 456 |
2/2✓ Branch 1 taken 5215 times.
✓ Branch 2 taken 1958 times.
|
10879 | if (group.exist(name)) { |
| 457 |
1/2✓ Branch 2 taken 5215 times.
✗ Branch 3 not taken.
|
7915 | auto dataset = group.getDataSet(name); |
| 458 | // We require the exact same type instead of letting hdf5 convert, which may narrow | ||
| 459 | // silently. Check before resizing, such that a mismatch leaves the file untouched. | ||
| 460 | // Note that 1-byte types are platform-dependent: `char` equals `uint8` on aarch64 but | ||
| 461 | // `int8` on x86-64, so appending to a file written on another platform may fail. | ||
| 462 |
4/6✓ Branch 1 taken 5215 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 5215 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 4 times.
✓ Branch 8 taken 5211 times.
|
7915 | if (dataset.getDataType() != type) |
| 463 |
1/2✓ Branch 3 taken 4 times.
✗ Branch 4 not taken.
|
8 | throw ValueError( |
| 464 |
2/4✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 4 times.
✗ Branch 5 not taken.
|
8 | "Cannot extend the dataset '" + name + "' with data of a different type (" |
| 465 |
7/14✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 4 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 4 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 4 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 4 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 4 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 4 times.
✗ Branch 20 not taken.
|
16 | + Detail::as_string(dataset.getDataType()) + " vs. " + Detail::as_string(type) + ")" |
| 466 | ); | ||
| 467 |
1/2✓ Branch 1 taken 5211 times.
✗ Branch 2 not taken.
|
7911 | auto out_dimensions = dataset.getDimensions(); |
| 468 |
1/2✓ Branch 1 taken 5211 times.
✗ Branch 2 not taken.
|
7911 | const auto in_dimensions = space.getDimensions(); |
| 469 | |||
| 470 |
3/6✓ Branch 1 taken 5211 times.
✗ Branch 2 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 5211 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 5211 times.
|
7911 | if (out_dimensions.size() < 1 || in_dimensions.size() < 1) |
| 471 | ✗ | throw ValueError("Cannot extend scalar datasets"); | |
| 472 | 7911 | if ( | |
| 473 |
1/2✓ Branch 1 taken 5211 times.
✗ Branch 2 not taken.
|
7911 | !std::ranges::equal( |
| 474 | 7911 | std::ranges::subrange(out_dimensions.begin() + 1, out_dimensions.end()), | |
| 475 |
1/2✗ Branch 4 not taken.
✓ Branch 5 taken 5211 times.
|
15822 | std::ranges::subrange(in_dimensions.begin() + 1, in_dimensions.end()) |
| 476 | ) | ||
| 477 | ) | ||
| 478 | ✗ | throw ValueError("Dataset extension requires the sub-dimensions to be equal"); | |
| 479 | |||
| 480 | 7911 | const std::size_t offset = out_dimensions[0]; | |
| 481 | 7911 | out_dimensions[0] += in_dimensions[0]; | |
| 482 |
1/2✓ Branch 1 taken 5211 times.
✗ Branch 2 not taken.
|
7911 | dataset.resize(out_dimensions); |
| 483 | 7911 | return std::make_pair(offset, std::move(dataset)); | |
| 484 | 7915 | } else { | |
| 485 |
1/2✓ Branch 1 taken 1958 times.
✗ Branch 2 not taken.
|
2964 | const auto init_dimensions = space.getDimensions(); |
| 486 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 1958 times.
|
2964 | if (init_dimensions.size() < 1) |
| 487 | ✗ | throw ValueError("Scalars cannot be written in appended mode. Wrap them in std::array{scalar}"); | |
| 488 | |||
| 489 |
1/2✓ Branch 3 taken 1958 times.
✗ Branch 4 not taken.
|
5928 | const auto chunk_dimensions = std::vector<hsize_t>{init_dimensions.begin(), init_dimensions.end()}; |
| 490 |
1/2✓ Branch 1 taken 1958 times.
✗ Branch 2 not taken.
|
3970 | const auto max_dimensions = [&] () { |
| 491 | 1958 | auto tmp = init_dimensions; | |
| 492 | 1958 | tmp[0] = HighFive::DataSpace::UNLIMITED; | |
| 493 | 1958 | return tmp; | |
| 494 | } (); | ||
| 495 | |||
| 496 |
1/2✓ Branch 1 taken 1958 times.
✗ Branch 2 not taken.
|
2964 | HighFive::DataSpace out_space(init_dimensions, max_dimensions); |
| 497 | 2964 | HighFive::DataSetCreateProps props; | |
| 498 |
2/4✓ Branch 1 taken 1958 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1958 times.
✗ Branch 5 not taken.
|
2964 | props.add(HighFive::Chunking(chunk_dimensions)); |
| 499 | return std::make_pair( | ||
| 500 | 5928 | std::size_t{0}, | |
| 501 |
1/2✓ Branch 2 taken 1958 times.
✗ Branch 3 not taken.
|
5928 | group.createDataSet(name, out_space, type, props) |
| 502 | 2964 | ); | |
| 503 | 2964 | } | |
| 504 | } else { | ||
| 505 | ✗ | throw NotImplemented("Unknown file mode"); | |
| 506 | } | ||
| 507 | } | ||
| 508 | |||
| 509 | template<typename Values> | ||
| 510 | 8278 | void _write_to(HighFive::DataSet& dataset, | |
| 511 | const Values& values, | ||
| 512 | const Slice& slice, | ||
| 513 | const std::optional<HighFive::DataTransferProps> props = {}) { | ||
| 514 |
8/16✓ Branch 1 taken 668 times.
✓ Branch 2 taken 3471 times.
✓ Branch 6 taken 668 times.
✗ Branch 7 not taken.
✓ Branch 10 taken 668 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 668 times.
✓ Branch 14 taken 3471 times.
✓ Branch 16 taken 668 times.
✓ Branch 17 taken 3471 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.
|
16556 | props ? dataset.select(slice.offset, slice.count).write(values, *props) |
| 515 |
12/22✓ Branch 3 taken 3471 times.
✗ Branch 4 not taken.
✓ Branch 7 taken 3471 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 3471 times.
✓ Branch 10 taken 668 times.
✓ Branch 12 taken 3471 times.
✓ Branch 13 taken 668 times.
✓ Branch 15 taken 3471 times.
✓ Branch 16 taken 668 times.
✓ Branch 18 taken 3471 times.
✓ Branch 19 taken 668 times.
✓ Branch 21 taken 668 times.
✓ Branch 22 taken 3471 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.
|
8278 | : dataset.select(slice.offset, slice.count).write(values); |
| 516 | 8278 | } | |
| 517 | |||
| 518 | template<Concepts::Scalar T> | ||
| 519 | 7366 | void _write_to(HighFive::DataSet& dataset, | |
| 520 | const T* buffer, | ||
| 521 | const Slice& slice, | ||
| 522 | const std::optional<HighFive::DataTransferProps> props = {}) { | ||
| 523 |
11/22✓ Branch 1 taken 2326 times.
✓ Branch 2 taken 1357 times.
✓ Branch 6 taken 2326 times.
✗ Branch 7 not taken.
✓ Branch 10 taken 2326 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 2326 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 2326 times.
✓ Branch 17 taken 1357 times.
✓ Branch 19 taken 2326 times.
✓ Branch 20 taken 1357 times.
✓ Branch 22 taken 2326 times.
✓ Branch 23 taken 1357 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.
|
14732 | props ? dataset.select(slice.offset, slice.count).write_raw(buffer, dataset.getDataType(), *props) |
| 524 |
15/28✓ Branch 3 taken 1357 times.
✗ Branch 4 not taken.
✓ Branch 7 taken 1357 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 1357 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 1357 times.
✓ Branch 13 taken 2326 times.
✓ Branch 15 taken 1357 times.
✓ Branch 16 taken 2326 times.
✓ Branch 18 taken 1357 times.
✓ Branch 19 taken 2326 times.
✓ Branch 21 taken 1357 times.
✓ Branch 22 taken 2326 times.
✓ Branch 24 taken 1357 times.
✓ Branch 25 taken 2326 times.
✓ Branch 27 taken 2326 times.
✓ Branch 28 taken 1357 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.
|
7366 | : dataset.select(slice.offset, slice.count).write_raw(buffer, dataset.getDataType()); |
| 525 | 7366 | } | |
| 526 | |||
| 527 | template<typename Visitor, typename Source> | ||
| 528 | 21742 | decltype(auto) _visit_data(Visitor&& visitor, const Source& source) const { | |
| 529 |
1/2✓ Branch 1 taken 10871 times.
✗ Branch 2 not taken.
|
21742 | const auto datatype = source.getDataType(); |
| 530 |
8/10✓ Branch 1 taken 10871 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 10721 times.
✓ Branch 4 taken 150 times.
✓ Branch 6 taken 10721 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 343 times.
✓ Branch 9 taken 10378 times.
✓ Branch 10 taken 493 times.
✓ Branch 11 taken 10378 times.
|
21742 | if (datatype.isFixedLenStr() || datatype.isVariableStr()) { |
| 531 | // strings are exposed as characters, with each string terminated by '\0' (see MultiString) | ||
| 532 | 986 | std::vector<std::string> strings; | |
| 533 |
4/6✓ Branch 1 taken 493 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 493 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 8 times.
✓ Branch 8 taken 485 times.
|
986 | if (source.getSpace().getNumberDimensions() == 0) // scalar, as e.g. VTK writes attributes |
| 534 |
2/6✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 8 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
|
16 | source.read(strings.emplace_back()); |
| 535 | else | ||
| 536 |
2/3✓ Branch 1 taken 142 times.
✓ Branch 2 taken 343 times.
✗ Branch 3 not taken.
|
970 | source.read(strings); |
| 537 |
1/2✓ Branch 1 taken 493 times.
✗ Branch 2 not taken.
|
986 | const MultiString characters{strings}; |
| 538 |
1/2✓ Branch 3 taken 493 times.
✗ Branch 4 not taken.
|
1972 | std::string out{characters.begin(), characters.end()}; |
| 539 |
1/2✓ Branch 2 taken 493 times.
✗ Branch 3 not taken.
|
986 | MDLayout layout{{out.size()}}; |
| 540 |
2/4✓ Branch 3 taken 493 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 493 times.
✗ Branch 7 not taken.
|
986 | return visitor(BufferField{std::move(out), std::move(layout)}); |
| 541 | 986 | } else { | |
| 542 |
2/4✓ Branch 1 taken 10378 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 4042 times.
✗ Branch 5 not taken.
|
51600 | return _to_precision(datatype).visit([&] <typename T> (const Precision<T>&) { |
| 543 |
138/2256✗ 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 taken 4 times.
✗ Branch 50 not taken.
✓ Branch 52 taken 4 times.
✗ 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 not taken.
✗ Branch 122 not taken.
✗ Branch 124 not taken.
✗ Branch 125 not taken.
✗ Branch 129 not taken.
✗ Branch 130 not taken.
✗ Branch 132 not taken.
✗ Branch 133 not taken.
✓ Branch 137 taken 28 times.
✗ Branch 138 not taken.
✓ Branch 140 taken 28 times.
✗ Branch 141 not taken.
✗ Branch 145 not taken.
✗ Branch 146 not taken.
✗ Branch 148 not taken.
✗ Branch 149 not taken.
✗ Branch 153 not taken.
✗ Branch 154 not taken.
✗ Branch 156 not taken.
✗ Branch 157 not taken.
✓ Branch 161 taken 109 times.
✗ Branch 162 not taken.
✓ Branch 164 taken 109 times.
✗ 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 not taken.
✗ Branch 210 not taken.
✗ Branch 212 not taken.
✗ Branch 213 not taken.
✗ Branch 217 not taken.
✗ Branch 218 not taken.
✗ Branch 220 not taken.
✗ Branch 221 not taken.
✗ Branch 225 not taken.
✗ Branch 226 not taken.
✗ Branch 228 not taken.
✗ 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 not taken.
✗ Branch 282 not taken.
✗ Branch 284 not taken.
✗ 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 taken 40 times.
✗ Branch 314 not taken.
✓ Branch 316 taken 40 times.
✗ Branch 317 not taken.
✗ Branch 321 not taken.
✗ Branch 322 not taken.
✗ Branch 324 not taken.
✗ Branch 325 not taken.
✓ Branch 329 taken 16 times.
✗ Branch 330 not taken.
✓ Branch 332 taken 16 times.
✗ Branch 333 not taken.
✓ Branch 337 taken 98 times.
✗ Branch 338 not taken.
✓ Branch 340 taken 98 times.
✗ 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 taken 440 times.
✗ Branch 410 not taken.
✓ Branch 412 taken 440 times.
✗ 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 not taken.
✗ Branch 442 not taken.
✗ Branch 444 not taken.
✗ Branch 445 not taken.
✗ Branch 449 not taken.
✗ Branch 450 not taken.
✗ Branch 452 not taken.
✗ 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 taken 496 times.
✗ Branch 490 not taken.
✓ Branch 492 taken 496 times.
✗ Branch 493 not taken.
✗ Branch 497 not taken.
✗ Branch 498 not taken.
✗ Branch 500 not taken.
✗ Branch 501 not taken.
✓ Branch 505 taken 16 times.
✗ Branch 506 not taken.
✓ Branch 508 taken 16 times.
✗ 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 taken 2 times.
✗ Branch 530 not taken.
✓ Branch 532 taken 2 times.
✗ Branch 533 not taken.
✓ Branch 537 taken 279 times.
✗ Branch 538 not taken.
✓ Branch 540 taken 279 times.
✗ 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 taken 1 times.
✗ Branch 594 not taken.
✓ Branch 596 taken 1 times.
✗ Branch 597 not taken.
✓ Branch 601 taken 18 times.
✗ Branch 602 not taken.
✓ Branch 604 taken 18 times.
✗ 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 not taken.
✗ Branch 626 not taken.
✗ Branch 628 not taken.
✗ 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 234 times.
✗ Branch 658 not taken.
✓ Branch 660 taken 234 times.
✗ Branch 661 not taken.
✗ Branch 665 not taken.
✗ Branch 666 not taken.
✗ Branch 668 not taken.
✗ Branch 669 not taken.
✗ Branch 673 not taken.
✗ Branch 674 not taken.
✗ Branch 676 not taken.
✗ Branch 677 not taken.
✗ Branch 681 not taken.
✗ Branch 682 not taken.
✗ Branch 684 not taken.
✗ Branch 685 not taken.
✗ Branch 689 not taken.
✗ Branch 690 not taken.
✗ Branch 692 not taken.
✗ 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 taken 7 times.
✗ Branch 730 not taken.
✓ Branch 732 taken 7 times.
✗ 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 not taken.
✗ Branch 762 not taken.
✗ Branch 764 not taken.
✗ 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 taken 28 times.
✗ Branch 810 not taken.
✓ Branch 812 taken 28 times.
✗ Branch 813 not taken.
✗ Branch 817 not taken.
✗ Branch 818 not taken.
✗ Branch 820 not taken.
✗ Branch 821 not taken.
✗ Branch 825 not taken.
✗ Branch 826 not taken.
✗ Branch 828 not taken.
✗ Branch 829 not taken.
✓ Branch 833 taken 68 times.
✗ Branch 834 not taken.
✓ Branch 836 taken 68 times.
✗ 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 not taken.
✗ Branch 882 not taken.
✗ Branch 884 not taken.
✗ 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 taken 448 times.
✗ Branch 906 not taken.
✓ Branch 908 taken 448 times.
✗ 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 not taken.
✗ Branch 954 not taken.
✗ Branch 956 not taken.
✗ 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 taken 552 times.
✗ Branch 986 not taken.
✓ Branch 988 taken 552 times.
✗ Branch 989 not taken.
✗ Branch 993 not taken.
✗ Branch 994 not taken.
✗ Branch 996 not taken.
✗ Branch 997 not taken.
✗ Branch 1001 not taken.
✗ Branch 1002 not taken.
✗ Branch 1004 not taken.
✗ 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 not taken.
✗ Branch 1058 not taken.
✗ Branch 1060 not taken.
✗ 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 2 times.
✗ Branch 1082 not taken.
✓ Branch 1084 taken 2 times.
✗ Branch 1085 not taken.
✗ Branch 1089 not taken.
✗ Branch 1090 not taken.
✗ Branch 1092 not taken.
✗ 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 not taken.
✗ Branch 1130 not taken.
✗ Branch 1132 not taken.
✗ 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 taken 40 times.
✗ Branch 1154 not taken.
✓ Branch 1156 taken 40 times.
✗ Branch 1157 not taken.
✗ Branch 1161 not taken.
✗ Branch 1162 not taken.
✗ Branch 1164 not taken.
✗ Branch 1165 not taken.
✓ Branch 1169 taken 1 times.
✗ Branch 1170 not taken.
✓ Branch 1172 taken 1 times.
✗ 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 taken 10 times.
✗ Branch 1258 not taken.
✓ Branch 1260 taken 10 times.
✗ Branch 1261 not taken.
✗ Branch 1265 not taken.
✗ Branch 1266 not taken.
✗ Branch 1268 not taken.
✗ Branch 1269 not taken.
✗ Branch 1273 not taken.
✗ Branch 1274 not taken.
✗ Branch 1276 not taken.
✗ Branch 1277 not taken.
✓ Branch 1281 taken 3 times.
✗ Branch 1282 not taken.
✓ Branch 1284 taken 3 times.
✗ Branch 1285 not taken.
✗ Branch 1289 not taken.
✗ Branch 1290 not taken.
✗ Branch 1292 not taken.
✗ 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 not taken.
✗ Branch 1322 not taken.
✗ Branch 1324 not taken.
✗ 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 not taken.
✗ Branch 1354 not taken.
✗ Branch 1356 not taken.
✗ 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 not taken.
✗ Branch 1426 not taken.
✗ Branch 1428 not taken.
✗ Branch 1429 not taken.
✓ Branch 1433 taken 12 times.
✗ Branch 1434 not taken.
✓ Branch 1436 taken 12 times.
✗ Branch 1437 not taken.
✗ Branch 1441 not taken.
✗ Branch 1442 not taken.
✗ Branch 1444 not taken.
✗ Branch 1445 not taken.
✓ Branch 1449 taken 20 times.
✗ Branch 1450 not taken.
✓ Branch 1452 taken 20 times.
✗ Branch 1453 not taken.
✓ Branch 1457 taken 6 times.
✗ Branch 1458 not taken.
✓ Branch 1460 taken 6 times.
✗ 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 taken 65 times.
✗ Branch 1490 not taken.
✓ Branch 1492 taken 65 times.
✗ 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 not taken.
✗ Branch 1538 not taken.
✗ Branch 1540 not taken.
✗ Branch 1541 not taken.
✓ Branch 1545 taken 16 times.
✗ Branch 1546 not taken.
✓ Branch 1548 taken 16 times.
✗ Branch 1549 not taken.
✓ Branch 1553 taken 2 times.
✗ Branch 1554 not taken.
✓ Branch 1556 taken 2 times.
✗ 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 not taken.
✗ Branch 1586 not taken.
✗ Branch 1588 not taken.
✗ Branch 1589 not taken.
✗ Branch 1593 not taken.
✗ Branch 1594 not taken.
✗ Branch 1596 not taken.
✗ Branch 1597 not taken.
✓ Branch 1601 taken 928 times.
✗ Branch 1602 not taken.
✓ Branch 1604 taken 928 times.
✗ 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 54 times.
✗ Branch 1666 not taken.
✓ Branch 1668 taken 54 times.
✗ Branch 1669 not taken.
✗ Branch 1673 not taken.
✗ Branch 1674 not taken.
✗ Branch 1676 not taken.
✗ 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 not taken.
✗ Branch 1698 not taken.
✗ Branch 1700 not taken.
✗ 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 taken 39 times.
✗ Branch 1722 not taken.
✓ Branch 1724 taken 39 times.
✗ Branch 1725 not taken.
✗ Branch 1729 not taken.
✗ Branch 1730 not taken.
✗ Branch 1732 not taken.
✗ Branch 1733 not taken.
✓ Branch 1737 taken 1 times.
✗ Branch 1738 not taken.
✓ Branch 1740 taken 1 times.
✗ Branch 1741 not taken.
✗ Branch 1745 not taken.
✗ Branch 1746 not taken.
✗ Branch 1748 not taken.
✗ 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 taken 20 times.
✗ Branch 1810 not taken.
✓ Branch 1812 taken 20 times.
✗ Branch 1813 not taken.
✓ Branch 1817 taken 6 times.
✗ Branch 1818 not taken.
✓ Branch 1820 taken 6 times.
✗ Branch 1821 not taken.
✓ Branch 1825 taken 544 times.
✗ Branch 1826 not taken.
✓ Branch 1828 taken 544 times.
✗ 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 3 times.
✗ Branch 1858 not taken.
✓ Branch 1860 taken 3 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 taken 9 times.
✗ Branch 1898 not taken.
✓ Branch 1900 taken 9 times.
✗ Branch 1901 not taken.
✓ Branch 1905 taken 858 times.
✗ Branch 1906 not taken.
✓ Branch 1908 taken 858 times.
✗ Branch 1909 not taken.
✓ Branch 1913 taken 2 times.
✗ Branch 1914 not taken.
✓ Branch 1916 taken 2 times.
✗ Branch 1917 not taken.
✗ Branch 1921 not taken.
✗ Branch 1922 not taken.
✗ Branch 1924 not taken.
✗ Branch 1925 not taken.
✗ Branch 1929 not taken.
✗ Branch 1930 not taken.
✗ Branch 1932 not taken.
✗ Branch 1933 not taken.
✗ Branch 1937 not taken.
✗ Branch 1938 not taken.
✗ Branch 1940 not taken.
✗ Branch 1941 not taken.
✗ Branch 1945 not taken.
✗ Branch 1946 not taken.
✗ Branch 1948 not taken.
✗ Branch 1949 not taken.
✗ Branch 1953 not taken.
✗ Branch 1954 not taken.
✗ Branch 1956 not taken.
✗ Branch 1957 not taken.
✗ Branch 1961 not taken.
✗ Branch 1962 not taken.
✗ Branch 1964 not taken.
✗ Branch 1965 not taken.
✗ Branch 1969 not taken.
✗ Branch 1970 not taken.
✗ Branch 1972 not taken.
✗ Branch 1973 not taken.
✓ Branch 1977 taken 2 times.
✗ Branch 1978 not taken.
✓ Branch 1980 taken 2 times.
✗ 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 taken 42 times.
✗ Branch 2002 not taken.
✓ Branch 2004 taken 42 times.
✗ Branch 2005 not taken.
✗ Branch 2009 not taken.
✗ Branch 2010 not taken.
✗ Branch 2012 not taken.
✗ Branch 2013 not taken.
✓ Branch 2017 taken 6 times.
✗ Branch 2018 not taken.
✓ Branch 2020 taken 6 times.
✗ 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 taken 1358 times.
✗ Branch 2082 not taken.
✓ Branch 2084 taken 1358 times.
✗ Branch 2085 not taken.
✗ Branch 2089 not taken.
✗ Branch 2090 not taken.
✗ Branch 2092 not taken.
✗ Branch 2093 not taken.
✓ Branch 2097 taken 28 times.
✗ Branch 2098 not taken.
✓ Branch 2100 taken 28 times.
✗ Branch 2101 not taken.
✓ Branch 2105 taken 8 times.
✗ Branch 2106 not taken.
✓ Branch 2108 taken 8 times.
✗ Branch 2109 not taken.
✗ Branch 2113 not taken.
✗ Branch 2114 not taken.
✗ Branch 2116 not taken.
✗ Branch 2117 not taken.
✗ Branch 2121 not taken.
✗ Branch 2122 not taken.
✗ Branch 2124 not taken.
✗ 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 not taken.
✗ Branch 2210 not taken.
✗ Branch 2212 not taken.
✗ 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 taken 147 times.
✗ Branch 2258 not taken.
✓ Branch 2260 taken 147 times.
✗ Branch 2261 not taken.
✗ Branch 2265 not taken.
✗ Branch 2266 not taken.
✗ Branch 2268 not taken.
✗ Branch 2269 not taken.
✓ Branch 2273 taken 28 times.
✗ Branch 2274 not taken.
✓ Branch 2276 taken 28 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 221 times.
✗ Branch 2306 not taken.
✓ Branch 2308 taken 221 times.
✗ Branch 2309 not taken.
✓ Branch 2313 taken 118 times.
✗ Branch 2314 not taken.
✓ Branch 2316 taken 118 times.
✗ Branch 2317 not taken.
✗ Branch 2321 not taken.
✗ Branch 2322 not taken.
✗ Branch 2324 not taken.
✗ 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 taken 8 times.
✗ Branch 2378 not taken.
✓ Branch 2380 taken 8 times.
✗ 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 taken 9 times.
✗ Branch 2402 not taken.
✓ Branch 2404 taken 9 times.
✗ 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 not taken.
✗ Branch 2434 not taken.
✗ Branch 2436 not taken.
✗ 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 taken 319 times.
✗ Branch 2482 not taken.
✓ Branch 2484 taken 319 times.
✗ Branch 2485 not taken.
✗ Branch 2489 not taken.
✗ Branch 2490 not taken.
✗ Branch 2492 not taken.
✗ 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 taken 356 times.
✗ Branch 2546 not taken.
✓ Branch 2548 taken 356 times.
✗ 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 taken 1 times.
✗ Branch 2594 not taken.
✓ Branch 2596 taken 1 times.
✗ Branch 2597 not taken.
✗ Branch 2601 not taken.
✗ Branch 2602 not taken.
✗ Branch 2604 not taken.
✗ Branch 2605 not taken.
✓ Branch 2609 taken 4 times.
✗ Branch 2610 not taken.
✓ Branch 2612 taken 4 times.
✗ Branch 2613 not taken.
✗ Branch 2617 not taken.
✗ Branch 2618 not taken.
✗ Branch 2620 not taken.
✗ Branch 2621 not taken.
✗ Branch 2625 not taken.
✗ Branch 2626 not taken.
✗ Branch 2628 not taken.
✗ Branch 2629 not taken.
✓ Branch 2633 taken 976 times.
✗ Branch 2634 not taken.
✓ Branch 2636 taken 976 times.
✗ 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 not taken.
✗ Branch 2666 not taken.
✗ Branch 2668 not taken.
✗ Branch 2669 not taken.
✓ Branch 2673 taken 288 times.
✗ Branch 2674 not taken.
✓ Branch 2676 taken 288 times.
✗ 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 not taken.
✗ Branch 2722 not taken.
✗ Branch 2724 not taken.
✗ 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 not taken.
✗ Branch 2762 not taken.
✗ Branch 2764 not taken.
✗ 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 not taken.
✗ Branch 2802 not taken.
✗ Branch 2804 not taken.
✗ 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 not taken.
✗ Branch 3210 not taken.
✗ Branch 3212 not taken.
✗ 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 not taken.
✗ Branch 3258 not taken.
✗ Branch 3260 not taken.
✗ 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 not taken.
✗ Branch 3370 not taken.
✗ Branch 3372 not taken.
✗ 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 not taken.
✗ Branch 3418 not taken.
✗ Branch 3420 not taken.
✗ 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 taken 45 times.
✗ Branch 3506 not taken.
✓ Branch 3508 taken 45 times.
✗ 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 taken 16 times.
✗ Branch 3562 not taken.
✓ Branch 3564 taken 16 times.
✗ 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 taken 48 times.
✗ Branch 3682 not taken.
✓ Branch 3684 taken 48 times.
✗ 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 taken 18 times.
✗ Branch 3738 not taken.
✓ Branch 3740 taken 18 times.
✗ 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 not taken.
✗ Branch 3794 not taken.
✗ Branch 3796 not taken.
✗ 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 taken 120 times.
✗ Branch 3842 not taken.
✓ Branch 3844 taken 120 times.
✗ 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 not taken.
✗ Branch 3882 not taken.
✗ Branch 3884 not taken.
✗ 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 taken 212 times.
✗ Branch 3922 not taken.
✓ Branch 3924 taken 212 times.
✗ 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 not taken.
✗ Branch 3946 not taken.
✗ Branch 3948 not taken.
✗ Branch 3949 not taken.
✗ Branch 3953 not taken.
✗ Branch 3954 not taken.
✗ Branch 3956 not taken.
✗ Branch 3957 not taken.
✗ Branch 3961 not taken.
✗ Branch 3962 not taken.
✗ Branch 3964 not taken.
✗ Branch 3965 not taken.
✗ Branch 3969 not taken.
✗ Branch 3970 not taken.
✗ Branch 3972 not taken.
✗ Branch 3973 not taken.
✗ Branch 3977 not taken.
✗ Branch 3978 not taken.
✗ Branch 3980 not taken.
✗ Branch 3981 not taken.
✗ Branch 3985 not taken.
✗ Branch 3986 not taken.
✗ Branch 3988 not taken.
✗ Branch 3989 not taken.
✗ Branch 3993 not taken.
✗ Branch 3994 not taken.
✗ Branch 3996 not taken.
✗ Branch 3997 not taken.
✗ Branch 4001 not taken.
✗ Branch 4002 not taken.
✗ Branch 4004 not taken.
✗ Branch 4005 not taken.
✗ Branch 4009 not taken.
✗ Branch 4010 not taken.
✗ Branch 4012 not taken.
✗ Branch 4013 not taken.
✗ Branch 4017 not taken.
✗ Branch 4018 not taken.
✗ Branch 4020 not taken.
✗ Branch 4021 not taken.
✗ Branch 4025 not taken.
✗ Branch 4026 not taken.
✗ Branch 4028 not taken.
✗ Branch 4029 not taken.
✗ Branch 4033 not taken.
✗ Branch 4034 not taken.
✗ Branch 4036 not taken.
✗ Branch 4037 not taken.
✗ Branch 4041 not taken.
✗ Branch 4042 not taken.
✗ Branch 4044 not taken.
✗ Branch 4045 not taken.
✗ Branch 4049 not taken.
✗ Branch 4050 not taken.
✗ Branch 4052 not taken.
✗ Branch 4053 not taken.
✗ Branch 4057 not taken.
✗ Branch 4058 not taken.
✗ Branch 4060 not taken.
✗ Branch 4061 not taken.
✗ Branch 4065 not taken.
✗ Branch 4066 not taken.
✗ Branch 4068 not taken.
✗ Branch 4069 not taken.
✗ Branch 4073 not taken.
✗ Branch 4074 not taken.
✗ Branch 4076 not taken.
✗ Branch 4077 not taken.
✗ Branch 4081 not taken.
✗ Branch 4082 not taken.
✗ Branch 4084 not taken.
✗ Branch 4085 not taken.
✗ Branch 4089 not taken.
✗ Branch 4090 not taken.
✗ Branch 4092 not taken.
✗ Branch 4093 not taken.
✓ Branch 4097 taken 275 times.
✗ Branch 4098 not taken.
✓ Branch 4100 taken 275 times.
✗ Branch 4101 not taken.
✗ Branch 4105 not taken.
✗ Branch 4106 not taken.
✗ Branch 4108 not taken.
✗ Branch 4109 not taken.
✗ Branch 4113 not taken.
✗ Branch 4114 not taken.
✗ Branch 4116 not taken.
✗ Branch 4117 not taken.
✗ Branch 4121 not taken.
✗ Branch 4122 not taken.
✗ Branch 4124 not taken.
✗ Branch 4125 not taken.
✗ Branch 4129 not taken.
✗ Branch 4130 not taken.
✗ Branch 4132 not taken.
✗ Branch 4133 not taken.
✗ Branch 4137 not taken.
✗ Branch 4138 not taken.
✗ Branch 4140 not taken.
✗ Branch 4141 not taken.
✗ Branch 4145 not taken.
✗ Branch 4146 not taken.
✗ Branch 4148 not taken.
✗ Branch 4149 not taken.
✗ Branch 4153 not taken.
✗ Branch 4154 not taken.
✗ Branch 4156 not taken.
✗ Branch 4157 not taken.
✗ Branch 4161 not taken.
✗ Branch 4162 not taken.
✗ Branch 4164 not taken.
✗ Branch 4165 not taken.
✗ Branch 4169 not taken.
✗ Branch 4170 not taken.
✗ Branch 4172 not taken.
✗ Branch 4173 not taken.
✗ Branch 4177 not taken.
✗ Branch 4178 not taken.
✗ Branch 4180 not taken.
✗ Branch 4181 not taken.
✗ Branch 4185 not taken.
✗ Branch 4186 not taken.
✗ Branch 4188 not taken.
✗ Branch 4189 not taken.
✗ Branch 4193 not taken.
✗ Branch 4194 not taken.
✗ Branch 4196 not taken.
✗ Branch 4197 not taken.
✗ Branch 4201 not taken.
✗ Branch 4202 not taken.
✗ Branch 4204 not taken.
✗ Branch 4205 not taken.
✗ Branch 4209 not taken.
✗ Branch 4210 not taken.
✗ Branch 4212 not taken.
✗ Branch 4213 not taken.
✗ Branch 4217 not taken.
✗ Branch 4218 not taken.
✗ Branch 4220 not taken.
✗ Branch 4221 not taken.
✗ Branch 4225 not taken.
✗ Branch 4226 not taken.
✗ Branch 4228 not taken.
✗ Branch 4229 not taken.
✗ Branch 4233 not taken.
✗ Branch 4234 not taken.
✗ Branch 4236 not taken.
✗ Branch 4237 not taken.
✗ Branch 4241 not taken.
✗ Branch 4242 not taken.
✗ Branch 4244 not taken.
✗ Branch 4245 not taken.
✗ Branch 4249 not taken.
✗ Branch 4250 not taken.
✗ Branch 4252 not taken.
✗ Branch 4253 not taken.
✗ Branch 4257 not taken.
✗ Branch 4258 not taken.
✗ Branch 4260 not taken.
✗ Branch 4261 not taken.
✗ Branch 4265 not taken.
✗ Branch 4266 not taken.
✗ Branch 4268 not taken.
✗ Branch 4269 not taken.
✗ Branch 4273 not taken.
✗ Branch 4274 not taken.
✗ Branch 4276 not taken.
✗ Branch 4277 not taken.
✗ Branch 4281 not taken.
✗ Branch 4282 not taken.
✗ Branch 4284 not taken.
✗ Branch 4285 not taken.
✗ Branch 4289 not taken.
✗ Branch 4290 not taken.
✗ Branch 4292 not taken.
✗ Branch 4293 not taken.
✗ Branch 4297 not taken.
✗ Branch 4298 not taken.
✗ Branch 4300 not taken.
✗ Branch 4301 not taken.
✗ Branch 4305 not taken.
✗ Branch 4306 not taken.
✗ Branch 4308 not taken.
✗ Branch 4309 not taken.
✗ Branch 4313 not taken.
✗ Branch 4314 not taken.
✗ Branch 4316 not taken.
✗ Branch 4317 not taken.
✓ Branch 4321 taken 96 times.
✗ Branch 4322 not taken.
✓ Branch 4324 taken 96 times.
✗ Branch 4325 not taken.
✗ Branch 4329 not taken.
✗ Branch 4330 not taken.
✗ Branch 4332 not taken.
✗ Branch 4333 not taken.
✗ Branch 4337 not taken.
✗ Branch 4338 not taken.
✗ Branch 4340 not taken.
✗ Branch 4341 not taken.
✗ Branch 4345 not taken.
✗ Branch 4346 not taken.
✗ Branch 4348 not taken.
✗ Branch 4349 not taken.
✗ Branch 4353 not taken.
✗ Branch 4354 not taken.
✗ Branch 4356 not taken.
✗ Branch 4357 not taken.
✗ Branch 4361 not taken.
✗ Branch 4362 not taken.
✗ Branch 4364 not taken.
✗ Branch 4365 not taken.
✗ Branch 4369 not taken.
✗ Branch 4370 not taken.
✗ Branch 4372 not taken.
✗ Branch 4373 not taken.
✗ Branch 4377 not taken.
✗ Branch 4378 not taken.
✗ Branch 4380 not taken.
✗ Branch 4381 not taken.
✗ Branch 4385 not taken.
✗ Branch 4386 not taken.
✗ Branch 4388 not taken.
✗ Branch 4389 not taken.
✗ Branch 4393 not taken.
✗ Branch 4394 not taken.
✗ Branch 4396 not taken.
✗ Branch 4397 not taken.
✗ Branch 4401 not taken.
✗ Branch 4402 not taken.
✗ Branch 4404 not taken.
✗ Branch 4405 not taken.
✗ Branch 4409 not taken.
✗ Branch 4410 not taken.
✗ Branch 4412 not taken.
✗ Branch 4413 not taken.
✓ Branch 4417 taken 8 times.
✗ Branch 4418 not taken.
✓ Branch 4420 taken 8 times.
✗ Branch 4421 not taken.
✗ Branch 4425 not taken.
✗ Branch 4426 not taken.
✗ Branch 4428 not taken.
✗ Branch 4429 not taken.
✗ Branch 4433 not taken.
✗ Branch 4434 not taken.
✗ Branch 4436 not taken.
✗ Branch 4437 not taken.
✗ Branch 4441 not taken.
✗ Branch 4442 not taken.
✗ Branch 4444 not taken.
✗ Branch 4445 not taken.
✗ Branch 4449 not taken.
✗ Branch 4450 not taken.
✗ Branch 4452 not taken.
✗ Branch 4453 not taken.
✗ Branch 4457 not taken.
✗ Branch 4458 not taken.
✗ Branch 4460 not taken.
✗ Branch 4461 not taken.
✗ Branch 4465 not taken.
✗ Branch 4466 not taken.
✗ Branch 4468 not taken.
✗ Branch 4469 not taken.
✗ Branch 4473 not taken.
✗ Branch 4474 not taken.
✗ Branch 4476 not taken.
✗ Branch 4477 not taken.
✗ Branch 4481 not taken.
✗ Branch 4482 not taken.
✗ Branch 4484 not taken.
✗ Branch 4485 not taken.
✗ Branch 4489 not taken.
✗ Branch 4490 not taken.
✗ Branch 4492 not taken.
✗ Branch 4493 not taken.
✓ Branch 4497 taken 96 times.
✗ Branch 4498 not taken.
✓ Branch 4500 taken 96 times.
✗ Branch 4501 not taken.
✗ Branch 4505 not taken.
✗ Branch 4506 not taken.
✗ Branch 4508 not taken.
✗ Branch 4509 not taken.
|
16714 | return visitor(_read_buffer_field<T>(source)); |
| 544 |
1/2✓ Branch 1 taken 6336 times.
✗ Branch 2 not taken.
|
20756 | }); |
| 545 | } | ||
| 546 | 21742 | } | |
| 547 | |||
| 548 | 21334 | DynamicPrecision _to_precision(const HighFive::DataType& datatype) const { | |
| 549 |
6/6✓ Branch 1 taken 4883 times.
✓ Branch 2 taken 8506 times.
✓ Branch 4 taken 2721 times.
✓ Branch 5 taken 2162 times.
✓ Branch 6 taken 2721 times.
✓ Branch 7 taken 10668 times.
|
21334 | if (datatype.getClass() == HighFive::DataTypeClass::Float && datatype.getSize() == 8) |
| 550 | 4341 | return float64; | |
| 551 |
5/6✓ Branch 1 taken 2162 times.
✓ Branch 2 taken 8506 times.
✓ Branch 4 taken 2162 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2162 times.
✓ Branch 7 taken 8506 times.
|
16993 | else if (datatype.getClass() == HighFive::DataTypeClass::Float && datatype.getSize() == 4) |
| 552 | 3434 | return float32; | |
| 553 |
6/6✓ Branch 1 taken 8163 times.
✓ Branch 2 taken 343 times.
✓ Branch 4 taken 279 times.
✓ Branch 5 taken 7884 times.
✓ Branch 6 taken 279 times.
✓ Branch 7 taken 8227 times.
|
13559 | else if (datatype.getClass() == HighFive::DataTypeClass::Integer && datatype.getSize() == 1) |
| 554 | 469 | return int8; | |
| 555 |
4/6✓ Branch 1 taken 7884 times.
✓ Branch 2 taken 343 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 7884 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 8227 times.
|
13090 | else if (datatype.getClass() == HighFive::DataTypeClass::Integer && datatype.getSize() == 2) |
| 556 | ✗ | return int16; | |
| 557 |
6/6✓ Branch 1 taken 7884 times.
✓ Branch 2 taken 343 times.
✓ Branch 4 taken 1758 times.
✓ Branch 5 taken 6126 times.
✓ Branch 6 taken 1758 times.
✓ Branch 7 taken 6469 times.
|
13090 | else if (datatype.getClass() == HighFive::DataTypeClass::Integer && datatype.getSize() == 4) |
| 558 | 2827 | return int32; | |
| 559 |
5/6✓ Branch 1 taken 6126 times.
✓ Branch 2 taken 343 times.
✓ Branch 4 taken 6126 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 6126 times.
✓ Branch 7 taken 343 times.
|
10263 | else if (datatype.getClass() == HighFive::DataTypeClass::Integer && datatype.getSize() == 8) |
| 560 | 9758 | return int64; | |
| 561 |
1/2✓ Branch 1 taken 343 times.
✗ Branch 2 not taken.
|
505 | else if (datatype.isVariableStr()) |
| 562 | 505 | return Precision<char>{}; | |
| 563 | ✗ | else if (datatype.isFixedLenStr()) | |
| 564 | ✗ | return Precision<char>{}; | |
| 565 | ✗ | throw NotImplemented("Could not determine data set precision"); | |
| 566 | } | ||
| 567 | |||
| 568 | template<Concepts::Scalar S, typename Source> | ||
| 569 | 20756 | auto _read_buffer_field(const Source& source) const { | |
| 570 |
2/4✓ Branch 1 taken 10378 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 10378 times.
✗ Branch 5 not taken.
|
20756 | auto dims = source.getMemSpace().getDimensions(); |
| 571 |
4/6✓ Branch 1 taken 49 times.
✓ Branch 2 taken 10329 times.
✓ Branch 4 taken 49 times.
✗ Branch 5 not taken.
✓ Branch 8 taken 10329 times.
✗ Branch 9 not taken.
|
20756 | MDLayout layout = dims.empty() ? MDLayout{{1}} : MDLayout{std::move(dims)}; |
| 572 |
2/4✓ Branch 1 taken 10378 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 10378 times.
✗ Branch 5 not taken.
|
20756 | std::vector<Detail::HighFiveDataType<S>> out(layout.number_of_entries()); |
| 573 |
2/3✓ Branch 2 taken 285 times.
✓ Branch 3 taken 10093 times.
✗ Branch 4 not taken.
|
20756 | source.read_raw(out.data()); |
| 574 |
1/2✓ Branch 3 taken 10378 times.
✗ Branch 4 not taken.
|
41512 | return BufferField<S>(std::move(out), std::move(layout)); |
| 575 | 20756 | } | |
| 576 | |||
| 577 | 21201 | HighFive::Group _get_group(const std::string& group_name) { | |
| 578 |
2/2✓ Branch 1 taken 12546 times.
✓ Branch 2 taken 877 times.
|
21201 | return _file.exist(group_name) ? _file.getGroup(group_name) : _file.createGroup(group_name); |
| 579 | } | ||
| 580 | |||
| 581 | 1824 | void _clear_attribute(const std::string& name, const std::string& group) { | |
| 582 |
4/6✓ Branch 1 taken 1824 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1824 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 853 times.
✓ Branch 8 taken 971 times.
|
1824 | if (_get_group(group).hasAttribute(name)) |
| 583 |
2/4✓ Branch 1 taken 853 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 853 times.
✗ Branch 5 not taken.
|
853 | _get_group(group).deleteAttribute(name); |
| 584 | 1824 | } | |
| 585 | |||
| 586 | Communicator _comm; | ||
| 587 | Mode _mode; | ||
| 588 | HighFive::File _file; | ||
| 589 | }; | ||
| 590 | |||
| 591 | } // namespace GridFormat::HDF5 | ||
| 592 | |||
| 593 | #endif // GRIDFORMAT_HAVE_HIGH_FIVE | ||
| 594 | #endif // GRIDFORMAT_COMMON_HDF5_HPP_ | ||
| 595 |