3#include "DistanceTransformTypes.hpp"
34 std::vector<std::uint8_t> alive)
36 if ((
accuracy_ != DistanceTransformAccuracy::Exact &&
accuracy_ != DistanceTransformAccuracy::Approximate) ||
spans_.size() != alive_.size()) {
37 throw std::invalid_argument(
"DistanceTransformProfiles requires aligned node spans and liveness flags.");
39 for (std::size_t node = 0; node <
spans_.size(); ++node) {
42 (alive_[node] == 0 &&
span.size != 0)) {
43 throw std::invalid_argument(
"DistanceTransformProfiles received an invalid node histogram span.");
49 throw std::invalid_argument(
"DistanceTransformProfiles requires positive counts at strictly increasing non-negative levels.");
70 return std::span<const DistanceTransformHistogramBin>(
bins_.data() +
span.offset,
span.size);
80 std::uint64_t
total = 0;
82 if (
bin.count > std::numeric_limits<std::uint64_t>::max() -
total) {
83 throw std::overflow_error(
"Distance-transform survival profile exceeds the 64-bit count domain.");
87 std::vector<DistanceTransformSurvivalBin>
result;
89 std::uint64_t
below = 0;
100 if (node < 0 ||
static_cast<std::size_t
>(node) >=
spans_.size() || alive_[
static_cast<std::size_t
>(node)] == 0) {
101 throw std::out_of_range(
"Distance-transform profile access requires a live internal node id.");
103 return spans_[
static_cast<std::size_t
>(node)];
106 DistanceTransformAccuracy accuracy_ = DistanceTransformAccuracy::Exact;
107 std::vector<DistanceTransformHistogramBin> bins_;
108 std::vector<Span> spans_;
109 std::vector<std::uint8_t> alive_;
Owning result for one computed scalar attribute layout and buffer.