1#ifndef SCRAN_SANITIZE_SIZE_FACTORS_HPP
2#define SCRAN_SANITIZE_SIZE_FACTORS_HPP
47template<
typename SizeFactor_>
72template<
typename SizeFactor_>
73SizeFactor_ find_smallest_valid_factor(
const std::size_t num,
const SizeFactor_*
const size_factors) {
74 SizeFactor_ smallest = 1;
77 for (
decltype(I(num)) i = 0; i < num; ++i) {
78 const auto s = size_factors[i];
79 if (std::isfinite(s) && s > 0) {
80 if (!found || smallest > s) {
90template<
typename SizeFactor_>
91SizeFactor_ find_largest_valid_factor(
const std::size_t num,
const SizeFactor_*
const size_factors) {
92 SizeFactor_ largest = 1;
95 for (
decltype(I(num)) i = 0; i < num; ++i) {
96 const auto s = size_factors[i];
97 if (std::isfinite(s) && s > 0) {
98 if (!found || largest < s) {
124template<
typename SizeFactor_>
127 for (
decltype(I(num)) i = 0; i < num; ++i) {
128 internal::is_invalid(size_factors[i], output);
200template<
typename SizeFactor_>
202 SizeFactor_ smallest = -1;
206 throw std::runtime_error(
"detected negative size factor");
208 smallest = internal::find_smallest_valid_factor(num, size_factors);
209 for (
decltype(I(num)) i = 0; i < num; ++i) {
210 auto& s = size_factors[i];
219 if (options.
handle_zero == SanitizeAction::ERROR) {
220 throw std::runtime_error(
"detected size factor of zero");
221 }
else if (options.
handle_zero == SanitizeAction::SANITIZE) {
223 smallest = internal::find_smallest_valid_factor(num, size_factors);
225 for (
decltype(I(num)) i = 0; i < num; ++i) {
226 auto& s = size_factors[i];
235 if (options.
handle_nan == SanitizeAction::ERROR) {
236 throw std::runtime_error(
"detected NaN size factor");
237 }
else if (options.
handle_nan == SanitizeAction::SANITIZE) {
238 for (
decltype(I(num)) i = 0; i < num; ++i) {
239 auto& s = size_factors[i];
249 throw std::runtime_error(
"detected infinite size factor");
251 auto largest = internal::find_largest_valid_factor(num, size_factors);
252 for (
decltype(I(num)) i = 0; i < num; ++i) {
253 auto& s = size_factors[i];
274template<
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:201
SizeFactorDiagnostics check_size_factor_sanity(const std::size_t num, const SizeFactor_ *const size_factors)
Definition sanitize_size_factors.hpp:125
SanitizeAction
Definition sanitize_size_factors.hpp:140
Options for sanitize_size_factors().
Definition sanitize_size_factors.hpp:145
SanitizeAction handle_zero
Definition sanitize_size_factors.hpp:156
SanitizeAction handle_nan
Definition sanitize_size_factors.hpp:171
SanitizeAction handle_negative
Definition sanitize_size_factors.hpp:164
SanitizeAction handle_infinite
Definition sanitize_size_factors.hpp:179
Diagnostics for the size factors.
Definition sanitize_size_factors.hpp:20
bool has_negative
Definition sanitize_size_factors.hpp:24
bool has_infinite
Definition sanitize_size_factors.hpp:39
bool has_zero
Definition sanitize_size_factors.hpp:29
bool has_nan
Definition sanitize_size_factors.hpp:34