packing.cpp serif/solver/normalization/detail/packing.hpp cstddef utility vector serif/utils/error/errors.hpp serif serif::solver serif::solver::normalization serif::solver::normalization::detail #include"serif/solver/normalization/detail/packing.hpp" #include<cstddef> #include<utility> #include<vector> #include"serif/utils/error/errors.hpp" namespaceserif::solver::normalization::detail { namespace { [[nodiscard]]std::expected<std::vector<double>,std::string>pack_factors(std::span<conststd::span<constdouble>>coordinates) { usingnamespaceutils::errors; std::size_tcount=0; for(conststd::span<constdouble>factors:coordinates) { if(factors.size()>std::vector<double>{}.max_size()-count) { returnstd::unexpected(format_error_message<SERiFErrorCode::INVALID_DOF_COUNT>("Thepackednormalizationlayoutexceedsthesupportedvectorsize.Reduceitscoordinatecounts.")); } count+=factors.size(); } std::vector<double>packed; packed.reserve(count); for(conststd::span<constdouble>factors:coordinates) { packed.insert(packed.end(),factors.begin(),factors.end()); } returnpacked; } } std::expected<DiagonalNormalization,std::string>pack_normalization(std::span<conststd::span<constdouble>>states,std::span<conststd::span<constdouble>>residuals) { autostate_factors=pack_factors(states); if(!state_factors) { returnstd::unexpected(state_factors.error()); } autoresidual_factors=pack_factors(residuals); if(!residual_factors) { returnstd::unexpected(residual_factors.error()); } returnmake_diagonal_normalization(std::move(*state_factors),std::move(*residual_factors)); } }