1#ifndef SCRAN_SANITIZE_SIZE_FACTORS_HPP
2#define SCRAN_SANITIZE_SIZE_FACTORS_HPP
48template<
typename SizeFactor_>
73template<
typename SizeFactor_>
74SizeFactor_ find_smallest_valid_factor(
const std::size_t num,
const SizeFactor_*
const size_factors) {
75 SizeFactor_ smallest = 1;
78 for (I<
decltype(num)> i = 0; i < num; ++i) {
79 const auto s = size_factors[i];
80 if (std::isfinite(s) && s > 0) {
81 if (!found || smallest > s) {
91template<
typename SizeFactor_>
92SizeFactor_ find_largest_valid_factor(
const std::size_t num,
const SizeFactor_*
const size_factors) {
93 SizeFactor_ largest = 1;
96 for (I<
decltype(num)> i = 0; i < num; ++i) {
97 const auto s = size_factors[i];
98 if (std::isfinite(s) && s > 0) {
99 if (!found || largest < s) {
125template<
typename SizeFactor_>
128 for (I<
decltype(num)> i = 0; i < num; ++i) {
129 internal::is_invalid(size_factors[i], output);
201template<
typename SizeFactor_>
203 std::optional<SizeFactor_> smallest;
207 throw std::runtime_error(
"detected negative size factor");
209 smallest = internal::find_smallest_valid_factor(num, size_factors);
210 for (I<
decltype(num)> i = 0; i < num; ++i) {
211 auto& s = size_factors[i];
220 if (options.
handle_zero == SanitizeAction::ERROR) {
221 throw std::runtime_error(
"detected size factor of zero");
222 }
else if (options.
handle_zero == SanitizeAction::SANITIZE) {
223 if (!smallest.has_value()) {
224 smallest = internal::find_smallest_valid_factor(num, size_factors);
226 for (I<
decltype(num)> i = 0; i < num; ++i) {
227 auto& s = size_factors[i];
236 if (options.
handle_nan == SanitizeAction::ERROR) {
237 throw std::runtime_error(
"detected NaN size factor");
238 }
else if (options.
handle_nan == SanitizeAction::SANITIZE) {
239 for (I<
decltype(num)> i = 0; i < num; ++i) {
240 auto& s = size_factors[i];
250 throw std::runtime_error(
"detected infinite size factor");
252 auto largest = internal::find_largest_valid_factor(num, size_factors);
253 for (I<
decltype(num)> i = 0; i < num; ++i) {
254 auto& s = size_factors[i];
275template<
typename SizeFactor_>
Scaling normalization of single-cell data.
Definition center_size_factors.hpp:20
void sanitize_size_factors(const std::size_t num, SizeFactor_ *const size_factors, const SizeFactorDiagnostics &status, const SanitizeSizeFactorsOptions &options)
Definition sanitize_size_factors.hpp:202
SizeFactorDiagnostics check_size_factor_sanity(const std::size_t num, const SizeFactor_ *const size_factors)
Definition sanitize_size_factors.hpp:126
SanitizeAction
Definition sanitize_size_factors.hpp:141
Options for sanitize_size_factors().
Definition sanitize_size_factors.hpp:146
SanitizeAction handle_zero
Definition sanitize_size_factors.hpp:157
SanitizeAction handle_nan
Definition sanitize_size_factors.hpp:172
SanitizeAction handle_negative
Definition sanitize_size_factors.hpp:165
SanitizeAction handle_infinite
Definition sanitize_size_factors.hpp:180
Diagnostics for the size factors.
Definition sanitize_size_factors.hpp:21
bool has_negative
Definition sanitize_size_factors.hpp:25
bool has_infinite
Definition sanitize_size_factors.hpp:40
bool has_zero
Definition sanitize_size_factors.hpp:30
bool has_nan
Definition sanitize_size_factors.hpp:35