@@ -756,6 +756,90 @@ TEST(DynamicNPIs, secirvvs_delayed_implementation)
756756 EXPECT_EQ (contact_matrix_sim_3.get_matrix_at (mio::SimulationTime<double >(11.0 ))(0 , 0 ), 0.5 );
757757}
758758
759+ TEST (DynamicNPIs, secirvvs_implementation_with_directives)
760+ {
761+ mio::osecirvvs::Model<double > model (1 );
762+ model.populations [{mio::AgeGroup (0 ), mio::osecirvvs::InfectionState::InfectedSymptomsNaive}] = 10 ;
763+ model.populations .set_difference_from_total ({mio::AgeGroup (0 ), mio::osecirvvs::InfectionState::SusceptibleNaive},
764+ 100 );
765+ model.parameters .get <mio::osecirvvs::DailyPartialVaccinations<double >>().resize (mio::SimulationDay (size_t (1000 )));
766+ model.parameters .get <mio::osecirvvs::DailyPartialVaccinations<double >>().array ().setConstant (0 );
767+ model.parameters .get <mio::osecirvvs::DailyFullVaccinations<double >>().resize (mio::SimulationDay (size_t (1000 )));
768+ model.parameters .get <mio::osecirvvs::DailyFullVaccinations<double >>().array ().setConstant (0 );
769+
770+ mio::ContactMatrixGroup<double >& cm = model.parameters .get <mio::osecirvvs::ContactPatterns<double >>();
771+ cm[0 ] = mio::ContactMatrix<double >(Eigen::MatrixXd::Constant (1 , 1 , 1.0 ));
772+
773+ mio::DynamicNPIs<double > npis;
774+ npis.set_threshold (0.05 * 50'000 , {mio::DampingSampling<double >{0.5 ,
775+ mio::DampingLevel (0 ),
776+ mio::DampingType (0 ),
777+ mio::SimulationTime<double >(0 ),
778+ {0 },
779+ Eigen::VectorXd::Ones (1 )}});
780+ npis.set_duration (mio::SimulationTime<double >(5.0 ));
781+ npis.set_base_value (50'000 );
782+
783+ // directive begin is after the simulation, so no NPI is implemented
784+ npis.set_directive_begin (mio::SimulationTime<double >(5.0 ));
785+ model.parameters .get <mio::osecirvvs::DynamicNPIsInfectedSymptoms<double >>() = npis;
786+ mio::osecirvvs::Simulation<double , mio_test::MockSimulation<mio::osecirvvs::Model>> sim (model, 0.0 );
787+ sim.advance (3.0 );
788+ mio::ContactMatrixGroup<double > const & contact_matrix =
789+ sim.get_model ().parameters .template get <mio::osecirvvs::ContactPatterns<double >>();
790+ EXPECT_EQ (contact_matrix.get_matrix_at (mio::SimulationTime<double >(0.0 ))(0 , 0 ), 1.0 );
791+ EXPECT_EQ (contact_matrix.get_matrix_at (mio::SimulationTime<double >(1.0 ))(0 , 0 ), 1.0 );
792+ EXPECT_EQ (contact_matrix.get_matrix_at (mio::SimulationTime<double >(3.0 ))(0 , 0 ), 1.0 );
793+
794+ // directive begin is satisfied
795+ npis.set_implementation_delay (mio::SimulationTime<double >(2.0 )); // not used as t0=0
796+ npis.set_directive_begin (mio::SimulationTime<double >(0.0 ));
797+ model.parameters .get <mio::osecirvvs::DynamicNPIsInfectedSymptoms<double >>() = npis;
798+ mio::osecirvvs::Simulation<double , mio_test::MockSimulation<mio::osecirvvs::Model>> sim_2 (model, 0.0 );
799+ sim_2.advance (3.0 );
800+ mio::ContactMatrixGroup<double > const & contact_matrix_sim_2 =
801+ sim_2.get_model ().parameters .template get <mio::osecirvvs::ContactPatterns<double >>();
802+ EXPECT_EQ (contact_matrix_sim_2.get_matrix_at (mio::SimulationTime<double >(0.0 ))(0 , 0 ), 0.5 );
803+ EXPECT_EQ (contact_matrix_sim_2.get_matrix_at (mio::SimulationTime<double >(4.0 ))(0 , 0 ), 0.5 );
804+ EXPECT_EQ (contact_matrix_sim_2.get_matrix_at (mio::SimulationTime<double >(5.0 ))(0 , 0 ), 1.0 ); // lifted after duration
805+
806+ // directive begin satisfied but directive end cuts NPI earlier
807+ npis.set_directive_end (mio::SimulationTime<double >(3.0 ));
808+ model.parameters .get <mio::osecirvvs::DynamicNPIsInfectedSymptoms<double >>() = npis;
809+ mio::osecirvvs::Simulation<double , mio_test::MockSimulation<mio::osecirvvs::Model>> sim_3 (model, 0.0 );
810+ sim_3.advance (4.0 );
811+ mio::ContactMatrixGroup<double > const & contact_matrix_sim_3 =
812+ sim_3.get_model ().parameters .template get <mio::osecirvvs::ContactPatterns<double >>();
813+ EXPECT_EQ (contact_matrix_sim_3.get_matrix_at (mio::SimulationTime<double >(0.0 ))(0 , 0 ), 0.5 );
814+ EXPECT_EQ (contact_matrix_sim_3.get_matrix_at (mio::SimulationTime<double >(2.0 ))(0 , 0 ), 0.5 );
815+ EXPECT_EQ (contact_matrix_sim_3.get_matrix_at (mio::SimulationTime<double >(3.0 ))(0 , 0 ), 1.0 );
816+
817+ // directive begin satisfied (with delay > 0 as t0 = 1)
818+ npis.set_implementation_delay (mio::SimulationTime<double >(2.0 ));
819+ npis.set_directive_begin (mio::SimulationTime<double >(0.0 ));
820+ npis.set_directive_end (mio::SimulationTime<double >(1000000 .));
821+ model.parameters .get <mio::osecirvvs::DynamicNPIsInfectedSymptoms<double >>() = npis;
822+ mio::osecirvvs::Simulation<double , mio_test::MockSimulation<mio::osecirvvs::Model>> sim_4 (model, 1.0 );
823+ sim_4.advance (4.0 );
824+ mio::ContactMatrixGroup<double > const & contact_matrix_sim_4 =
825+ sim_4.get_model ().parameters .template get <mio::osecirvvs::ContactPatterns<double >>();
826+ EXPECT_EQ (contact_matrix_sim_4.get_matrix_at (mio::SimulationTime<double >(2.0 ))(0 , 0 ), 1.0 );
827+ EXPECT_EQ (contact_matrix_sim_4.get_matrix_at (mio::SimulationTime<double >(3.0 ))(0 , 0 ), 0.5 );
828+ EXPECT_EQ (contact_matrix_sim_4.get_matrix_at (mio::SimulationTime<double >(7.0 ))(0 , 0 ), 0.5 );
829+ EXPECT_EQ (contact_matrix_sim_4.get_matrix_at (mio::SimulationTime<double >(8.0 ))(0 , 0 ), 1.0 ); // lifted after duration
830+
831+ // directive begin satisfied but directive end cuts NPI earlier (with delay > 0 as t0 = 1)
832+ npis.set_directive_end (mio::SimulationTime<double >(4.0 ));
833+ model.parameters .get <mio::osecirvvs::DynamicNPIsInfectedSymptoms<double >>() = npis;
834+ mio::osecirvvs::Simulation<double , mio_test::MockSimulation<mio::osecirvvs::Model>> sim_5 (model, 1.0 );
835+ sim_5.advance (4.0 );
836+ mio::ContactMatrixGroup<double > const & contact_matrix_sim_5 =
837+ sim_5.get_model ().parameters .template get <mio::osecirvvs::ContactPatterns<double >>();
838+ EXPECT_EQ (contact_matrix_sim_5.get_matrix_at (mio::SimulationTime<double >(1.0 ))(0 , 0 ), 1.0 );
839+ EXPECT_EQ (contact_matrix_sim_5.get_matrix_at (mio::SimulationTime<double >(3.0 ))(0 , 0 ), 0.5 );
840+ EXPECT_EQ (contact_matrix_sim_5.get_matrix_at (mio::SimulationTime<double >(4.0 ))(0 , 0 ), 1.0 );
841+ }
842+
759843TEST (DynamicNPIs, osecirts_delayed_implementation)
760844{
761845 mio::osecirts::Model<double > model (1 );
0 commit comments