diff --git a/cpp/models/ode_secir/model.h b/cpp/models/ode_secir/model.h index 840845e2ce..ae269a26d1 100755 --- a/cpp/models/ode_secir/model.h +++ b/cpp/models/ode_secir/model.h @@ -116,7 +116,8 @@ class Model : public FlowModel>(), - params.template get>() * 5, + params.template get>() * + params.template get>(), params.template get>()[j], params.template get>()[j]); @@ -454,15 +455,16 @@ IOResult get_reproduction_number(size_t t_idx, const Simulation& s } divN[(size_t)k] = 1 / temp; - riskFromInfectedSymptomatic[(size_t)k] = - smoother_cosine(test_and_trace_required, params.template get>(), - (params.template get>()) * 5, - params.template get>()[k], - params.template get>()[k]); + riskFromInfectedSymptomatic[(size_t)k] = smoother_cosine( + test_and_trace_required, params.template get>(), + (params.template get>()) * params.template get>(), + params.template get>()[k], + params.template get>()[k]); for (mio::AgeGroup l = 0; l < (mio::AgeGroup)num_groups; l++) { if (test_and_trace_required < params.template get>() || - test_and_trace_required > 5 * params.template get>()) { + test_and_trace_required > params.template get>() * + params.template get>()) { riskFromInfectedSymptomatic_derivatives((size_t)k, (size_t)l) = 0; } else { @@ -661,9 +663,11 @@ auto get_migration_factors(const Simulation& sim, FP /*t*/, const Eigen::R auto test_and_trace_required = ((1 - p_asymp) / params.template get>().array().template cast() * y_INS.array()) .sum(); - auto test_and_trace_capacity = double(params.template get>()); - auto riskFromInfectedSymptomatic = smoother_cosine(test_and_trace_required, test_and_trace_capacity, - test_and_trace_capacity * 5, p_inf.matrix(), p_inf_max.matrix()); + auto test_and_trace_capacity = double(params.template get>()); + auto test_and_trace_capacity_max_risk = double(params.template get>()); + auto riskFromInfectedSymptomatic = + smoother_cosine(test_and_trace_required, test_and_trace_capacity, + test_and_trace_capacity * test_and_trace_capacity_max_risk, p_inf.matrix(), p_inf_max.matrix()); //set factor for infected auto factors = Eigen::VectorXd::Ones(y.rows()).eval(); diff --git a/cpp/models/ode_secir/parameters.h b/cpp/models/ode_secir/parameters.h index f5951e4571..014a510f93 100644 --- a/cpp/models/ode_secir/parameters.h +++ b/cpp/models/ode_secir/parameters.h @@ -348,14 +348,29 @@ struct TestAndTraceCapacity { } }; +/** + * @brief Multiplier for the test and trace capacity to determine when it is considered overloaded. + */ +template +struct TestAndTraceCapacityMaxRisk { + using Type = UncertainValue; + static Type get_default(AgeGroup) + { + return Type(5.0); + } + static std::string name() + { + return "TestAndTraceCapacityMaxRisk"; + } +}; + template -using ParametersBase = - ParameterSet, ICUCapacity, TestAndTraceCapacity, ContactPatterns, - DynamicNPIsInfectedSymptoms, TimeExposed, TimeInfectedNoSymptoms, TimeInfectedSymptoms, - TimeInfectedSevere, TimeInfectedCritical, TransmissionProbabilityOnContact, - RelativeTransmissionNoSymptoms, RecoveredPerInfectedNoSymptoms, - RiskOfInfectionFromSymptomatic, MaxRiskOfInfectionFromSymptomatic, - SeverePerInfectedSymptoms, CriticalPerSevere, DeathsPerCritical>; +using ParametersBase = ParameterSet< + StartDay, Seasonality, ICUCapacity, TestAndTraceCapacity, TestAndTraceCapacityMaxRisk, + ContactPatterns, DynamicNPIsInfectedSymptoms, TimeExposed, TimeInfectedNoSymptoms, + TimeInfectedSymptoms, TimeInfectedSevere, TimeInfectedCritical, TransmissionProbabilityOnContact, + RelativeTransmissionNoSymptoms, RecoveredPerInfectedNoSymptoms, RiskOfInfectionFromSymptomatic, + MaxRiskOfInfectionFromSymptomatic, SeverePerInfectedSymptoms, CriticalPerSevere, DeathsPerCritical>; /** * @brief Parameters of an age-resolved SECIR/SECIHURD model. @@ -445,6 +460,20 @@ class Parameters : public ParametersBase corrected = true; } + if (this->template get>() < 0.0) { + log_warning("Constraint check: Parameter TestAndTraceCapacity changed from {:0.4f} to {:d}", + this->template get>(), 0); + this->template get>() = 0; + corrected = true; + } + + if (this->template get>() < 0.0) { + log_warning("Constraint check: Parameter TestAndTraceCapacityMaxRisk changed from {:0.4f} to {:d}", + this->template get>(), 0); + this->template get>() = 0; + corrected = true; + } + for (auto i = AgeGroup(0); i < AgeGroup(m_num_groups); ++i) { if (this->template get>()[i] < tol_times) { log_warning("Constraint check: Parameter TimeExposed changed from {:.4f} to {:.4f}. Please " @@ -567,6 +596,16 @@ class Parameters : public ParametersBase return true; } + if (this->template get>() < 0.0) { + log_error("Constraint check: Parameter TestAndTraceCapacity smaller {:d}", 0); + return true; + } + + if (this->template get>() < 0.0) { + log_error("Constraint check: Parameter TestAndTraceCapacityMaxRisk smaller {:d}", 0); + return true; + } + const double tol_times = 1e-1; // accepted tolerance for compartment stays for (auto i = AgeGroup(0); i < AgeGroup(m_num_groups); ++i) { diff --git a/cpp/models/ode_secirvvs/model.h b/cpp/models/ode_secirvvs/model.h index 96f8dd2a5d..cff82bf5f6 100644 --- a/cpp/models/ode_secirvvs/model.h +++ b/cpp/models/ode_secirvvs/model.h @@ -183,13 +183,15 @@ class Model //symptomatic are less well quarantined when testing and tracing is overwhelmed so they infect more people auto riskFromInfectedSymptomatic = smoother_cosine(test_and_trace_required, params.template get>(), - params.template get>() * 15, + params.template get>() * + params.template get>(), params.template get>()[i], params.template get>()[i]); auto riskFromInfectedNoSymptoms = smoother_cosine(test_and_trace_required, params.template get>(), - params.template get>() * 2, + params.template get>() * + params.template get>(), params.template get>()[i], 1.0); for (auto j = AgeGroup(0); j < n_agegroups; j++) { @@ -835,7 +837,9 @@ auto get_migration_factors(const Simulation& sim, FP /*t*/, const Eigen::R .sum(); auto riskFromInfectedSymptomatic = smoother_cosine(test_and_trace_required, double(params.template get>()), - params.template get>() * 5, p_inf.matrix(), p_inf_max.matrix()); + params.template get>() * + params.template get>(), + p_inf.matrix(), p_inf_max.matrix()); //set factor for infected auto factors = Eigen::VectorXd::Ones(y.rows()).eval(); diff --git a/cpp/models/ode_secirvvs/parameters.h b/cpp/models/ode_secirvvs/parameters.h index cda7e78d1a..b39f496df1 100644 --- a/cpp/models/ode_secirvvs/parameters.h +++ b/cpp/models/ode_secirvvs/parameters.h @@ -119,6 +119,38 @@ struct TestAndTraceCapacity { } }; +/** + * @brief Multiplier for the test and trace capacity to determine when it is considered overloaded from cases without symptoms. + */ +template +struct TestAndTraceCapacityMaxRiskNoSymptoms { + using Type = UncertainValue; + static Type get_default(AgeGroup) + { + return Type(2.0); + } + static std::string name() + { + return "TestAndTraceCapacityMaxRiskNoSymptoms"; + } +}; + +/** + * @brief Multiplier for the test and trace capacity to determine when it is considered overloaded by symptomatic cases. + */ +template +struct TestAndTraceCapacityMaxRiskSymptoms { + using Type = UncertainValue; + static Type get_default(AgeGroup) + { + return Type(15.0); + } + static std::string name() + { + return "TestAndTraceCapacityMaxRiskSymptoms"; + } +}; + /** * @brief the contact patterns within the society are modelled using an UncertainContactMatrix */ @@ -573,19 +605,18 @@ struct InfectiousnessNewVariant { }; template -using ParametersBase = - ParameterSet, ICUCapacity, TestAndTraceCapacity, ContactPatterns, - DynamicNPIsInfectedSymptoms, TimeExposed, TimeInfectedNoSymptoms, TimeInfectedSymptoms, - TimeInfectedSevere, TimeInfectedCritical, TransmissionProbabilityOnContact, - RelativeTransmissionNoSymptoms, RecoveredPerInfectedNoSymptoms, - RiskOfInfectionFromSymptomatic, MaxRiskOfInfectionFromSymptomatic, - SeverePerInfectedSymptoms, CriticalPerSevere, DeathsPerCritical, VaccinationGap, - DaysUntilEffectivePartialImmunity, DaysUntilEffectiveImprovedImmunity, - DailyFullVaccination, DailyFirstVaccination, ReducExposedPartialImmunity, - ReducExposedImprovedImmunity, ReducInfectedSymptomsPartialImmunity, - ReducInfectedSymptomsImprovedImmunity, ReducInfectedSevereCriticalDeadPartialImmunity, - ReducInfectedSevereCriticalDeadImprovedImmunity, ReducTimeInfectedMild, - InfectiousnessNewVariant, StartDayNewVariant>; +using ParametersBase = ParameterSet< + StartDay, Seasonality, ICUCapacity, TestAndTraceCapacity, TestAndTraceCapacityMaxRiskNoSymptoms, + TestAndTraceCapacityMaxRiskSymptoms, ContactPatterns, DynamicNPIsInfectedSymptoms, TimeExposed, + TimeInfectedNoSymptoms, TimeInfectedSymptoms, TimeInfectedSevere, TimeInfectedCritical, + TransmissionProbabilityOnContact, RelativeTransmissionNoSymptoms, RecoveredPerInfectedNoSymptoms, + RiskOfInfectionFromSymptomatic, MaxRiskOfInfectionFromSymptomatic, SeverePerInfectedSymptoms, + CriticalPerSevere, DeathsPerCritical, VaccinationGap, DaysUntilEffectivePartialImmunity, + DaysUntilEffectiveImprovedImmunity, DailyFullVaccination, DailyFirstVaccination, + ReducExposedPartialImmunity, ReducExposedImprovedImmunity, ReducInfectedSymptomsPartialImmunity, + ReducInfectedSymptomsImprovedImmunity, ReducInfectedSevereCriticalDeadPartialImmunity, + ReducInfectedSevereCriticalDeadImprovedImmunity, ReducTimeInfectedMild, InfectiousnessNewVariant, + StartDayNewVariant>; /** * @brief Parameters of an age-resolved SECIR/SECIHURD model with paths for partial and improved immunity through vaccination. @@ -685,6 +716,27 @@ class Parameters : public ParametersBase corrected = true; } + if (this->template get>() < 0.0) { + log_warning("Constraint check: Parameter TestAndTraceCapacity changed from {} to {}", + this->template get>(), 0); + this->template set>(0); + corrected = true; + } + + if (this->template get>() < 0.0) { + log_warning("Constraint check: Parameter TestAndTraceCapacityMaxRiskSymptoms changed from {} to {}", + this->template get>(), 0); + this->template set>(0); + corrected = true; + } + + if (this->template get>() < 0.0) { + log_warning("Constraint check: Parameter TestAndTraceCapacityMaxRiskNoSymptoms changed from {} to {}", + this->template get>(), 0); + this->template set>(0); + corrected = true; + } + const double tol_times = 1e-1; // accepted tolerance for compartment stays for (auto i = AgeGroup(0); i < AgeGroup(m_num_groups); ++i) { @@ -789,7 +841,7 @@ class Parameters : public ParametersBase } if (this->template get>()[i] < 0.0) { - log_warning("Constraint check: Parameter DeathsPerCritical changed from {} to {}", + log_warning("Constraint check: Parameter DaysUntilEffectivePartialImmunity changed from {} to {}", this->template get>()[i], 0); this->template get>()[i] = 0; corrected = true; @@ -877,12 +929,27 @@ class Parameters : public ParametersBase { const double tol_times = 1e-1; // accepted tolerance for compartment stays if (this->template get>() < 0.0 || this->template get>() > 0.5) { - log_error("Constraint check: Parameter m_seasonality smaller {} or larger {}", 0, 0.5); + log_error("Constraint check: Parameter Seasonality smaller {} or larger {}", 0, 0.5); return true; } if (this->template get>() < 0.0) { - log_error("Constraint check: Parameter m_icu_capacity smaller {}", 0); + log_error("Constraint check: Parameter ICUCapacity smaller {}", 0); + return true; + } + + if (this->template get>() < 0.0) { + log_error("Constraint check: Parameter TestAndTraceCapacity smaller {}", 0); + return true; + } + + if (this->template get>() < 0.0) { + log_error("Constraint check: Parameter TestAndTraceCapacityMaxRiskSymptoms smaller {}", 0); + return true; + } + + if (this->template get>() < 0.0) { + log_error("Constraint check: Parameter TestAndTraceCapacityMaxRiskNoSymptoms smaller {}", 0); return true; } diff --git a/cpp/tests/test_odesecir.cpp b/cpp/tests/test_odesecir.cpp index c5dc9c3d3e..ef10f5b7ca 100644 --- a/cpp/tests/test_odesecir.cpp +++ b/cpp/tests/test_odesecir.cpp @@ -1033,63 +1033,74 @@ TEST(Secir, test_commuters) TEST(Secir, check_constraints_parameters) { auto model = mio::osecir::Model(1); - ASSERT_EQ(model.parameters.check_constraints(), 0); + EXPECT_EQ(model.parameters.check_constraints(), 0); mio::set_log_level(mio::LogLevel::off); model.parameters.set>(-0.5); - ASSERT_EQ(model.parameters.check_constraints(), 1); + EXPECT_EQ(model.parameters.check_constraints(), 1); model.parameters.set>(0.2); model.parameters.set>(-2); - ASSERT_EQ(model.parameters.check_constraints(), 1); + EXPECT_EQ(model.parameters.check_constraints(), 1); model.parameters.set>(2); + model.parameters.set>(-1); + EXPECT_EQ(model.parameters.check_constraints(), 1); + + model.parameters.set>(1); + model.parameters.set>(-1); + EXPECT_EQ(model.parameters.check_constraints(), 1); + + model.parameters.set>(1); model.parameters.set>(-2); - ASSERT_EQ(model.parameters.check_constraints(), 1); + EXPECT_EQ(model.parameters.check_constraints(), 1); model.parameters.set>(2); model.parameters.set>(-1); - ASSERT_EQ(model.parameters.check_constraints(), 1); + EXPECT_EQ(model.parameters.check_constraints(), 1); model.parameters.set>(5); model.parameters.set>(0); - ASSERT_EQ(model.parameters.check_constraints(), 1); + EXPECT_EQ(model.parameters.check_constraints(), 1); model.parameters.set>(2); model.parameters.set>(-1); - ASSERT_EQ(model.parameters.check_constraints(), 1); + EXPECT_EQ(model.parameters.check_constraints(), 1); model.parameters.set>(2); model.parameters.set>(0); - ASSERT_EQ(model.parameters.check_constraints(), 1); + EXPECT_EQ(model.parameters.check_constraints(), 1); model.parameters.set>(2); model.parameters.set>(2.0); - ASSERT_EQ(model.parameters.check_constraints(), 1); + EXPECT_EQ(model.parameters.check_constraints(), 1); model.parameters.set>(0.5); model.parameters.set>(-1.0); - ASSERT_EQ(model.parameters.check_constraints(), 1); + EXPECT_EQ(model.parameters.check_constraints(), 1); model.parameters.set>(0.5); model.parameters.set>(3.0); - ASSERT_EQ(model.parameters.check_constraints(), 1); + EXPECT_EQ(model.parameters.check_constraints(), 1); model.parameters.set>(0.5); model.parameters.set>(-2.0); - ASSERT_EQ(model.parameters.check_constraints(), 1); + EXPECT_EQ(model.parameters.check_constraints(), 1); model.parameters.set>(0.5); model.parameters.set>(-1.0); - ASSERT_EQ(model.parameters.check_constraints(), 1); + EXPECT_EQ(model.parameters.check_constraints(), 1); model.parameters.set>(0.5); model.parameters.set>(-1.0); - ASSERT_EQ(model.parameters.check_constraints(), 1); + EXPECT_EQ(model.parameters.check_constraints(), 1); model.parameters.set>(0.5); model.parameters.set>(1.1); - ASSERT_EQ(model.parameters.check_constraints(), 1); + EXPECT_EQ(model.parameters.check_constraints(), 1); + + model.parameters.set>(0.5); + EXPECT_EQ(model.parameters.check_constraints(), 0); mio::set_log_level(mio::LogLevel::warn); } @@ -1110,6 +1121,14 @@ TEST(Secir, apply_constraints_parameters) EXPECT_EQ(model.parameters.apply_constraints(), 1); EXPECT_EQ(model.parameters.get>(), 0); + model.parameters.set>(-1); + EXPECT_EQ(model.parameters.apply_constraints(), 1); + EXPECT_EQ(model.parameters.get>(), 0); + + model.parameters.set>(-1); + EXPECT_EQ(model.parameters.apply_constraints(), 1); + EXPECT_EQ(model.parameters.get>(), 0); + model.parameters.set>(-2); EXPECT_EQ(model.parameters.apply_constraints(), 1); EXPECT_EQ(model.parameters.get>()[indx_agegroup], tol_times); @@ -1158,6 +1177,8 @@ TEST(Secir, apply_constraints_parameters) model.parameters.set>(1.1); EXPECT_EQ(model.parameters.apply_constraints(), 1); EXPECT_EQ(model.parameters.get>()[indx_agegroup], 0); + + EXPECT_EQ(model.parameters.apply_constraints(), 0); mio::set_log_level(mio::LogLevel::warn); } diff --git a/cpp/tests/test_odesecirvvs.cpp b/cpp/tests/test_odesecirvvs.cpp index 14708e7f5c..1e39925276 100644 --- a/cpp/tests/test_odesecirvvs.cpp +++ b/cpp/tests/test_odesecirvvs.cpp @@ -973,107 +973,122 @@ TEST(TestOdeSECIRVVS, test_commuters) TEST(TestOdeSECIRVVS, check_constraints_parameters) { auto model = mio::osecirvvs::Model(1); - ASSERT_EQ(model.parameters.check_constraints(), 0); + EXPECT_EQ(model.parameters.check_constraints(), 0); mio::set_log_level(mio::LogLevel::off); model.parameters.set>(-0.2); - ASSERT_EQ(model.parameters.check_constraints(), 1); + EXPECT_EQ(model.parameters.check_constraints(), 1); model.parameters.set>(0.2); model.parameters.set>(-2); - ASSERT_EQ(model.parameters.check_constraints(), 1); + EXPECT_EQ(model.parameters.check_constraints(), 1); model.parameters.set>(2); + model.parameters.set>(-1); + EXPECT_EQ(model.parameters.check_constraints(), 1); + + model.parameters.set>(1); + model.parameters.set>(-1); + EXPECT_EQ(model.parameters.check_constraints(), 1); + + model.parameters.set>(1); + model.parameters.set>(-1); + EXPECT_EQ(model.parameters.check_constraints(), 1); + + model.parameters.set>(1); model.parameters.set>(-2); - ASSERT_EQ(model.parameters.check_constraints(), 1); + EXPECT_EQ(model.parameters.check_constraints(), 1); model.parameters.set>(2); model.parameters.set>(0); - ASSERT_EQ(model.parameters.check_constraints(), 1); + EXPECT_EQ(model.parameters.check_constraints(), 1); model.parameters.set>(5); model.parameters.set>(0); - ASSERT_EQ(model.parameters.check_constraints(), 1); + EXPECT_EQ(model.parameters.check_constraints(), 1); model.parameters.set>(2); model.parameters.set>(-1); - ASSERT_EQ(model.parameters.check_constraints(), 1); + EXPECT_EQ(model.parameters.check_constraints(), 1); model.parameters.set>(2); model.parameters.set>(0); - ASSERT_EQ(model.parameters.check_constraints(), 1); + EXPECT_EQ(model.parameters.check_constraints(), 1); model.parameters.set>(2); model.parameters.set>(2.0); - ASSERT_EQ(model.parameters.check_constraints(), 1); + EXPECT_EQ(model.parameters.check_constraints(), 1); model.parameters.set>(0.5); model.parameters.set>(-1.0); - ASSERT_EQ(model.parameters.check_constraints(), 1); + EXPECT_EQ(model.parameters.check_constraints(), 1); model.parameters.set>(0.5); model.parameters.set>(3.0); - ASSERT_EQ(model.parameters.check_constraints(), 1); + EXPECT_EQ(model.parameters.check_constraints(), 1); model.parameters.set>(0.5); model.parameters.set>(-0.8); - ASSERT_EQ(model.parameters.check_constraints(), 1); + EXPECT_EQ(model.parameters.check_constraints(), 1); model.parameters.set>(0.5); model.parameters.set>(-0.1); - ASSERT_EQ(model.parameters.check_constraints(), 1); + EXPECT_EQ(model.parameters.check_constraints(), 1); model.parameters.set>(0.5); model.parameters.set>(-1.0); - ASSERT_EQ(model.parameters.check_constraints(), 1); + EXPECT_EQ(model.parameters.check_constraints(), 1); model.parameters.set>(0.5); model.parameters.set>(1.1); - ASSERT_EQ(model.parameters.check_constraints(), 1); + EXPECT_EQ(model.parameters.check_constraints(), 1); model.parameters.set>(0.5); model.parameters.set>(0.2); - ASSERT_EQ(model.parameters.check_constraints(), 1); + EXPECT_EQ(model.parameters.check_constraints(), 1); model.parameters.set>(2); model.parameters.set>(-2); - ASSERT_EQ(model.parameters.check_constraints(), 1); + EXPECT_EQ(model.parameters.check_constraints(), 1); model.parameters.set>(30); model.parameters.set>(-0.2); - ASSERT_EQ(model.parameters.check_constraints(), 1); + EXPECT_EQ(model.parameters.check_constraints(), 1); model.parameters.set>(30); model.parameters.set>(0); - ASSERT_EQ(model.parameters.check_constraints(), 1); + EXPECT_EQ(model.parameters.check_constraints(), 1); model.parameters.set>(0.5); model.parameters.set>(-0.2); - ASSERT_EQ(model.parameters.check_constraints(), 1); + EXPECT_EQ(model.parameters.check_constraints(), 1); model.parameters.set>(0.5); model.parameters.set>(0); - ASSERT_EQ(model.parameters.check_constraints(), 1); + EXPECT_EQ(model.parameters.check_constraints(), 1); model.parameters.set>(0.5); model.parameters.set>(0.); - ASSERT_EQ(model.parameters.check_constraints(), 1); + EXPECT_EQ(model.parameters.check_constraints(), 1); model.parameters.set>(0.5); model.parameters.set>(-4); - ASSERT_EQ(model.parameters.check_constraints(), 1); + EXPECT_EQ(model.parameters.check_constraints(), 1); model.parameters.set>(0.5); model.parameters.set>(-4); - ASSERT_EQ(model.parameters.check_constraints(), 1); + EXPECT_EQ(model.parameters.check_constraints(), 1); model.parameters.set>(0.5); model.parameters.set>(-0); - ASSERT_EQ(model.parameters.check_constraints(), 1); + EXPECT_EQ(model.parameters.check_constraints(), 1); model.parameters.set>(1); model.parameters.set>(-4); - ASSERT_EQ(model.parameters.check_constraints(), 1); + EXPECT_EQ(model.parameters.check_constraints(), 1); + + model.parameters.set>(1); + EXPECT_EQ(model.parameters.check_constraints(), 0); mio::set_log_level(mio::LogLevel::warn); } @@ -1095,6 +1110,18 @@ TEST(TestOdeSECIRVVS, apply_constraints_parameters) EXPECT_EQ(model.parameters.apply_constraints(), 1); EXPECT_EQ(model.parameters.get>(), 0); + model.parameters.set>(-1); + EXPECT_EQ(model.parameters.apply_constraints(), 1); + EXPECT_EQ(model.parameters.get>(), 0); + + model.parameters.set>(-1); + EXPECT_EQ(model.parameters.apply_constraints(), 1); + EXPECT_EQ(model.parameters.get>(), 0); + + model.parameters.set>(-1); + EXPECT_EQ(model.parameters.apply_constraints(), 1); + EXPECT_EQ(model.parameters.get>(), 0); + model.parameters.set>(-2); EXPECT_EQ(model.parameters.apply_constraints(), 1); EXPECT_EQ(model.parameters.get>()[indx_agegroup], tol_times); @@ -1192,6 +1219,8 @@ TEST(TestOdeSECIRVVS, apply_constraints_parameters) EXPECT_EQ(model.parameters.apply_constraints(), 1); EXPECT_EQ(model.parameters.get>()[indx_agegroup], 1); + EXPECT_EQ(model.parameters.apply_constraints(), 0); + mio::set_log_level(mio::LogLevel::warn); }