18
18
* limitations under the License.
19
19
*/
20
20
#include " load_test_data.h"
21
+ #include " memilio/config.h"
22
+ #include " memilio/utils/time_series.h"
21
23
#include " ode_seir/model.h"
22
24
#include " ode_seir/infection_state.h"
23
25
#include " ode_seir/parameters.h"
24
26
#include " memilio/math/euler.h"
25
27
#include " memilio/compartments/simulation.h"
26
28
#include < gtest/gtest.h>
29
+ #include < iomanip>
30
+ #include < vector>
27
31
28
32
TEST (TestSeir, simulateDefault)
29
33
{
@@ -150,7 +154,6 @@ TEST(TestSeir, check_constraints_parameters)
150
154
model.parameters .set <mio::oseir::TimeInfected>(6 );
151
155
model.parameters .set <mio::oseir::TransmissionProbabilityOnContact>(10 .);
152
156
ASSERT_EQ (model.parameters .check_constraints (), 1 );
153
-
154
157
mio::set_log_level (mio::LogLevel::warn);
155
158
}
156
159
@@ -176,6 +179,156 @@ TEST(TestSeir, apply_constraints_parameters)
176
179
model.parameters .set <mio::oseir::TransmissionProbabilityOnContact>(10 .);
177
180
EXPECT_EQ (model.parameters .apply_constraints (), 1 );
178
181
EXPECT_NEAR (model.parameters .get <mio::oseir::TransmissionProbabilityOnContact>(), 0.0 , 1e-14 );
179
-
180
182
mio::set_log_level (mio::LogLevel::warn);
181
183
}
184
+
185
+ TEST (TestSeir, get_reproduction_numbers)
186
+ {
187
+ mio::oseir::Model model;
188
+
189
+ double total_population = 10000 ;
190
+ model.populations [{mio::Index<mio::oseir::InfectionState>(mio::oseir::InfectionState::Exposed)}] = 100 ;
191
+ model.populations [{mio::Index<mio::oseir::InfectionState>(mio::oseir::InfectionState::Infected)}] = 100 ;
192
+ model.populations [{mio::Index<mio::oseir::InfectionState>(mio::oseir::InfectionState::Recovered)}] = 100 ;
193
+ model.populations [{mio::Index<mio::oseir::InfectionState>(mio::oseir::InfectionState::Susceptible)}] =
194
+ total_population -
195
+ model.populations [{mio::Index<mio::oseir::InfectionState>(mio::oseir::InfectionState::Exposed)}] -
196
+ model.populations [{mio::Index<mio::oseir::InfectionState>(mio::oseir::InfectionState::Infected)}] -
197
+ model.populations [{mio::Index<mio::oseir::InfectionState>(mio::oseir::InfectionState::Recovered)}];
198
+
199
+ model.parameters .set <mio::oseir::TimeInfected>(6 );
200
+ model.parameters .set <mio::oseir::TransmissionProbabilityOnContact>(0.04 );
201
+ model.parameters .get <mio::oseir::ContactPatterns>().get_baseline ()(0 , 0 ) = 10 ;
202
+
203
+ model.apply_constraints ();
204
+
205
+ Eigen::VectorXd checkReproductionNumbers (7 );
206
+ checkReproductionNumbers << 2.3280000000000002913 , 2.3279906878991880603 , 2.3279487809434575851 ,
207
+ 2.3277601483151548756 , 2.3269102025388899158 , 2.3230580052413736247 , 2.3185400624683065729 ;
208
+
209
+ Eigen::VectorXd checkReproductionNumbers2 (7 );
210
+ checkReproductionNumbers2 << 2.0952000000000001734 , 2.0951916191092689878 , 2.0951539028491117378 ,
211
+ 2.0949841334836394324 , 2.0942191822850007021 , 2.0907522047172362178 , 2.086686056221475738 ;
212
+
213
+ Eigen::VectorXd checkReproductionNumbers3 (7 );
214
+ checkReproductionNumbers3 << 1.8623999999999998334 , 1.8623925503193501374 , 1.8623590247547658905 ,
215
+ 1.8622081186521235452 , 1.8615281620311117106 , 1.8584464041930985889 , 1.854832049974644903 ;
216
+
217
+ mio::TimeSeries<ScalarType> result ((int )mio::oseir::InfectionState::Count);
218
+ mio::TimeSeries<ScalarType>::Vector result_0 (4 );
219
+ mio::TimeSeries<ScalarType>::Vector result_1 (4 );
220
+ mio::TimeSeries<ScalarType>::Vector result_2 (4 );
221
+ mio::TimeSeries<ScalarType>::Vector result_3 (4 );
222
+ mio::TimeSeries<ScalarType>::Vector result_4 (4 );
223
+ mio::TimeSeries<ScalarType>::Vector result_5 (4 );
224
+ mio::TimeSeries<ScalarType>::Vector result_6 (4 );
225
+
226
+ result_0[(Eigen::Index)mio::oseir::InfectionState::Susceptible] = 9700 ;
227
+ result_1[(Eigen::Index)mio::oseir::InfectionState::Susceptible] = 9699.9611995799496071 ;
228
+ result_2[(Eigen::Index)mio::oseir::InfectionState::Susceptible] = 9699.7865872644051706 ;
229
+ result_3[(Eigen::Index)mio::oseir::InfectionState::Susceptible] = 9699.0006179798110679 ;
230
+ result_4[(Eigen::Index)mio::oseir::InfectionState::Susceptible] = 9695.4591772453732119 ;
231
+ result_5[(Eigen::Index)mio::oseir::InfectionState::Susceptible] = 9679.4083551723888377 ;
232
+ result_6[(Eigen::Index)mio::oseir::InfectionState::Susceptible] = 9660.5835936179428245 ;
233
+
234
+ result.add_time_point (0 , result_0);
235
+ result.add_time_point (0.0010000000000000000208 , result_1);
236
+ result.add_time_point (0.0055000000000000005482 , result_2);
237
+ result.add_time_point (0.025750000000000005523 , result_3);
238
+ result.add_time_point (0.11687500000000002054 , result_4);
239
+ result.add_time_point (0.52693750000000005862 , result_5);
240
+ result.add_time_point (1 , result_6);
241
+
242
+ auto reproduction_numbers = model.get_reproduction_numbers (result);
243
+
244
+ for (int i = 0 ; i < reproduction_numbers.size (); i++) {
245
+ EXPECT_NEAR (reproduction_numbers[i], checkReproductionNumbers[i], 1e-12 );
246
+ }
247
+
248
+ model.parameters .get <mio::oseir::ContactPatterns>().get_baseline ()(0 , 0 ) = 9 ;
249
+
250
+ auto reproduction_numbers2 = model.get_reproduction_numbers (result);
251
+
252
+ for (int i = 0 ; i < reproduction_numbers2.size (); i++) {
253
+ EXPECT_NEAR (reproduction_numbers2[i], checkReproductionNumbers2[i], 1e-12 );
254
+ }
255
+
256
+ model.parameters .get <mio::oseir::ContactPatterns>().get_baseline ()(0 , 0 ) = 8 ;
257
+
258
+ auto reproduction_numbers3 = model.get_reproduction_numbers (result);
259
+
260
+ for (int i = 0 ; i < reproduction_numbers2.size (); i++) {
261
+ EXPECT_NEAR (reproduction_numbers3[i], checkReproductionNumbers3[i], 1e-12 );
262
+ }
263
+
264
+ EXPECT_FALSE (model.get_reproduction_number (static_cast <double >(static_cast <size_t >(result.get_num_time_points ())),
265
+ result)); // Test for an index that is out of range
266
+ }
267
+
268
+ TEST (TestSeir, get_reproduction_number)
269
+ {
270
+ mio::oseir::Model model;
271
+
272
+ double total_population = 10000 ; // Initialize compartments to get total population of 10000
273
+ model.populations [{mio::Index<mio::oseir::InfectionState>(mio::oseir::InfectionState::Exposed)}] = 100 ;
274
+ model.populations [{mio::Index<mio::oseir::InfectionState>(mio::oseir::InfectionState::Infected)}] = 100 ;
275
+ model.populations [{mio::Index<mio::oseir::InfectionState>(mio::oseir::InfectionState::Recovered)}] = 100 ;
276
+ model.populations [{mio::Index<mio::oseir::InfectionState>(mio::oseir::InfectionState::Susceptible)}] =
277
+ total_population -
278
+ model.populations [{mio::Index<mio::oseir::InfectionState>(mio::oseir::InfectionState::Exposed)}] -
279
+ model.populations [{mio::Index<mio::oseir::InfectionState>(mio::oseir::InfectionState::Infected)}] -
280
+ model.populations [{mio::Index<mio::oseir::InfectionState>(mio::oseir::InfectionState::Recovered)}];
281
+
282
+ model.parameters .set <mio::oseir::TimeInfected>(6 );
283
+ model.parameters .set <mio::oseir::TransmissionProbabilityOnContact>(0.04 );
284
+ model.parameters .get <mio::oseir::ContactPatterns>().get_baseline ()(0 , 0 ) = 10 ;
285
+
286
+ model.apply_constraints ();
287
+
288
+ mio::TimeSeries<ScalarType> result ((int )mio::oseir::InfectionState::Count);
289
+ mio::TimeSeries<ScalarType>::Vector result_0 (4 );
290
+ mio::TimeSeries<ScalarType>::Vector result_1 (4 );
291
+ mio::TimeSeries<ScalarType>::Vector result_2 (4 );
292
+ mio::TimeSeries<ScalarType>::Vector result_3 (4 );
293
+ mio::TimeSeries<ScalarType>::Vector result_4 (4 );
294
+ mio::TimeSeries<ScalarType>::Vector result_5 (4 );
295
+ mio::TimeSeries<ScalarType>::Vector result_6 (4 );
296
+ mio::TimeSeries<ScalarType>::Vector result_7 (4 );
297
+
298
+ result_0[(Eigen::Index)mio::oseir::InfectionState::Susceptible] = 9700 ;
299
+ result_1[(Eigen::Index)mio::oseir::InfectionState::Susceptible] = 9699.9709149074315 ;
300
+ result_2[(Eigen::Index)mio::oseir::InfectionState::Susceptible] = 9699.8404009584538 ;
301
+ result_3[(Eigen::Index)mio::oseir::InfectionState::Susceptible] = 9699.260556488618 ;
302
+ result_4[(Eigen::Index)mio::oseir::InfectionState::Susceptible] = 9696.800490904101 ;
303
+ result_5[(Eigen::Index)mio::oseir::InfectionState::Susceptible] = 9687.9435082620021 ;
304
+ result_6[(Eigen::Index)mio::oseir::InfectionState::Susceptible] = 9679.5436372291661 ;
305
+ result_7[(Eigen::Index)mio::oseir::InfectionState::Susceptible] = 9678.5949381732935 ;
306
+
307
+ result.add_time_point (0 , result_0);
308
+ result.add_time_point (0.001 , result_1);
309
+ result.add_time_point (0.0055 , result_2);
310
+ result.add_time_point (0.02575 , result_3);
311
+ result.add_time_point (0.116875 , result_4);
312
+ result.add_time_point (0.526938 , result_5);
313
+ result.add_time_point (0.952226 , result_6);
314
+ result.add_time_point (1 , result_7);
315
+
316
+ EXPECT_FALSE (model.get_reproduction_number (result.get_time (0 ) - 0.5 , result)); // Test for indices out of range
317
+ EXPECT_FALSE (model.get_reproduction_number (result.get_last_time () + 0.5 , result));
318
+ EXPECT_FALSE (model.get_reproduction_number ((size_t )result.get_num_time_points (), result));
319
+
320
+ EXPECT_EQ (model.get_reproduction_number ((size_t )0 , result).value (),
321
+ model.get_reproduction_number (0.0 , result).value ());
322
+
323
+ EXPECT_NEAR (model.get_reproduction_number (0.3 , result).value (), 2.3262828383474389859 , 1e-12 );
324
+ EXPECT_NEAR (model.get_reproduction_number (0.7 , result).value (), 2.3242860858116172196 , 1e-12 );
325
+ EXPECT_NEAR (model.get_reproduction_number (0.0 , result).value (), 2.3280000000000002913 , 1e-12 );
326
+
327
+ model.parameters .get <mio::oseir::ContactPatterns>().get_baseline ()(0 , 0 ) = 9 ;
328
+ EXPECT_NEAR (model.get_reproduction_number (0.1 , result).value (), 2.0946073086586665113 , 1e-12 );
329
+ EXPECT_NEAR (model.get_reproduction_number (0.3 , result).value (), 2.0936545545126947765 , 1e-12 );
330
+
331
+ model.parameters .get <mio::oseir::ContactPatterns>().get_baseline ()(0 , 0 ) = 8 ;
332
+ EXPECT_NEAR (model.get_reproduction_number (0.2 , result).value (), 1.8614409729718137676 , 1e-12 );
333
+ EXPECT_NEAR (model.get_reproduction_number (0.9 , result).value (), 1.858670429549998504 , 1e-12 );
334
+ }
0 commit comments