/// Constructs Points from BinEdges, where each point is a bin center. Points::Points(const BinEdges &edges) { if (!edges) return; if (edges.size() == 1) throw std::logic_error("Points: Cannot construct from BinEdges of size 1"); if (edges.empty()) { m_data = Kernel::make_cow<HistogramX>(0); return; } std::vector<double> data(edges.size() - 1); for (size_t i = 0; i < data.size(); ++i) { data[i] = (0.5 * (edges[i] + edges[i + 1])); } m_data = Kernel::make_cow<HistogramX>(std::move(data)); }
/// Move-constructs FrequencyStandardDeviations from CountStandardDeviations and /// bin width based on BinEdges. FrequencyStandardDeviations::FrequencyStandardDeviations( CountStandardDeviations &&counts, const BinEdges &edges) { if (!counts) return; if (!edges) throw std::logic_error("FrequencyStandardDeviations: Cannot construct from " "CountStandardDeviations -- BinEdges are NULL."); if ((counts.size() + 1) != edges.size()) if (counts.size() != 0 || edges.size() != 0) throw std::logic_error("FrequencyStandardDeviations: Cannot construct " "from CountStandardDeviations -- BinEdges size " "does not match."); // Cannot move counts private data since it is of different type. m_data = counts.cowData(); counts = Kernel::cow_ptr<HistogramE>(nullptr); auto &data = m_data.access(); for (size_t i = 0; i < data.size(); ++i) { data[i] /= edges[i + 1] - edges[i]; } }
/// Move-constructs FrequencyVariances from CountVariances and bin width based /// on BinEdges. FrequencyVariances::FrequencyVariances(CountVariances &&counts, const BinEdges &edges) { if (!counts) return; if (!edges) throw std::logic_error("FrequencyVariances: Cannot construct from " "CountVariances -- BinEdges are NULL."); if ((counts.size() + 1) != edges.size()) if (!counts.empty() || !edges.empty()) throw std::logic_error("FrequencyVariances: Cannot construct from " "CountVariances -- BinEdges size does not match."); // Cannot move counts private data since it is of different type. m_data = counts.cowData(); counts = Kernel::cow_ptr<HistogramE>(nullptr); auto &data = m_data.access(); for (size_t i = 0; i < data.size(); ++i) { const auto width = edges[i + 1] - edges[i]; data[i] /= width * width; } }