Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion cpp/examples/d_abm.cpp
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright (C) 2020-2024 German Aerospace Center (DLR-SC)
* Copyright (C) 2020-2025 MEmilio
*
* Authors: Julia Bicker, René Schmieding
*
Expand Down
2 changes: 1 addition & 1 deletion cpp/examples/graph_abm.cpp
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright (C) 2020-2024 MEmilio
* Copyright (C) 2020-2025 MEmilio
*
* Authors: Julia Bicker
*
Expand Down
70 changes: 45 additions & 25 deletions cpp/examples/smm.cpp
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
/*
* Copyright (C) 2020-2024 German Aerospace Center (DLR-SC)
* Copyright (C) 2020-2025 MEmilio
*
* Authors: Julia Bicker, René Schmieding
* Authors: Julia Bicker, René Schmieding, Kilian Volmer
*
* Contact: Martin J. Kuehn <Martin.Kuehn@DLR.de>
*
Expand All @@ -18,6 +18,7 @@
* limitations under the License.
*/

#include "memilio/epidemiology/age_group.h"
#include "smm/simulation.h"
#include "smm/model.h"
#include "smm/parameters.h"
Expand All @@ -33,61 +34,80 @@ enum class InfectionState
R,
D,
Count

};

using Age = mio::AgeGroup;
using Species = mio::AgeGroup;

int main()
{

//Example how to run the stochastic metapopulation models with four regions
const size_t num_regions = 4;
using Model = mio::smm::Model<ScalarType, num_regions, InfectionState>;
const size_t num_regions = 4;
const size_t num_age_groups = 1;
const size_t num_groups = 1;
using Model = mio::smm::Model<ScalarType, num_regions, InfectionState, num_age_groups, num_groups>;

ScalarType numE = 12, numC = 4, numI = 12, numR = 0, numD = 0;

Model model;
//Population are distributed uniformly to the four regions
for (size_t r = 0; r < num_regions; ++r) {
model.populations[{mio::regions::Region(r), InfectionState::S}] =
model.populations[{mio::regions::Region(r), InfectionState::S, Age(0), Species(0)}] =
(1000 - numE - numC - numI - numR - numD) / num_regions;
model.populations[{mio::regions::Region(r), InfectionState::E}] = numE / num_regions;
model.populations[{mio::regions::Region(r), InfectionState::C}] = numC / num_regions;
model.populations[{mio::regions::Region(r), InfectionState::I}] = numI / num_regions;
model.populations[{mio::regions::Region(r), InfectionState::R}] = numR / num_regions;
model.populations[{mio::regions::Region(r), InfectionState::D}] = numD / num_regions;
model.populations[{mio::regions::Region(r), InfectionState::E, Age(0), Species(0)}] = numE / num_regions;
model.populations[{mio::regions::Region(r), InfectionState::C, Age(0), Species(0)}] = numC / num_regions;
model.populations[{mio::regions::Region(r), InfectionState::I, Age(0), Species(0)}] = numI / num_regions;
model.populations[{mio::regions::Region(r), InfectionState::R, Age(0), Species(0)}] = numR / num_regions;
model.populations[{mio::regions::Region(r), InfectionState::D, Age(0), Species(0)}] = numD / num_regions;
}

//Set infection state adoption and spatial transition rates
std::vector<mio::AdoptionRate<ScalarType, InfectionState>> adoption_rates;
std::vector<mio::smm::TransitionRate<ScalarType, InfectionState>> transition_rates;
std::vector<mio::AdoptionRate<ScalarType, InfectionState, Age, Species>> adoption_rates;
std::vector<mio::smm::TransitionRate<ScalarType, InfectionState, Age, Species>> transition_rates;
for (size_t r = 0; r < num_regions; ++r) {
adoption_rates.push_back({InfectionState::S,
InfectionState::E,
mio::regions::Region(r),
0.1,
{{InfectionState::C, 1}, {InfectionState::I, 0.5}}});
adoption_rates.push_back({InfectionState::E, InfectionState::C, mio::regions::Region(r), 1.0 / 5., {}});
adoption_rates.push_back({InfectionState::C, InfectionState::R, mio::regions::Region(r), 0.2 / 3., {}});
adoption_rates.push_back({InfectionState::C, InfectionState::I, mio::regions::Region(r), 0.8 / 3., {}});
adoption_rates.push_back({InfectionState::I, InfectionState::R, mio::regions::Region(r), 0.99 / 5., {}});
adoption_rates.push_back({InfectionState::I, InfectionState::D, mio::regions::Region(r), 0.01 / 5., {}});
{{InfectionState::C, 1, mio::regions::Region(3), {Age(0), Species(0)}},
{InfectionState::I, 0.5, mio::regions::Region(1), {Age(0), Species(0)}}},
{Age(0), Species(0)}});
adoption_rates.push_back(
{InfectionState::C, InfectionState::R, mio::regions::Region(r), 0.2 / 3., {}, {Age(0), Species(0)}});
adoption_rates.push_back(
{InfectionState::E, InfectionState::C, mio::regions::Region(r), 1.0 / 5., {}, {Age(0), Species(0)}});
adoption_rates.push_back(
{InfectionState::C, InfectionState::I, mio::regions::Region(r), 0.8 / 3., {}, {Age(0), Species(0)}});
adoption_rates.push_back(
{InfectionState::I, InfectionState::R, mio::regions::Region(r), 0.99 / 5., {}, {Age(0), Species(0)}});
adoption_rates.push_back(
{InfectionState::I, InfectionState::D, mio::regions::Region(r), 0.01 / 5., {}, {Age(0), Species(0)}});
}

//Agents in infection state D do not transition
for (size_t s = 0; s < static_cast<size_t>(InfectionState::D); ++s) {
for (size_t i = 0; i < num_regions; ++i) {
for (size_t j = 0; j < num_regions; ++j)
if (i != j) {
transition_rates.push_back(
{InfectionState(s), mio::regions::Region(i), mio::regions::Region(j), 0.01});
transition_rates.push_back(
{InfectionState(s), mio::regions::Region(j), mio::regions::Region(i), 0.01});
transition_rates.push_back({InfectionState(s),
mio::regions::Region(i),
mio::regions::Region(j),
0.01,
{Age(0), Species(0)},
{Age(0), Species(0)}});
transition_rates.push_back({InfectionState(s),
mio::regions::Region(j),
mio::regions::Region(i),
0.01,
{Age(0), Species(0)},
{Age(0), Species(0)}});
}
}
}

model.parameters.get<mio::smm::AdoptionRates<ScalarType, InfectionState>>() = adoption_rates;
model.parameters.get<mio::smm::TransitionRates<ScalarType, InfectionState>>() = transition_rates;
model.parameters.get<mio::smm::AdoptionRates<ScalarType, InfectionState, Age, Species>>() = adoption_rates;
model.parameters.get<mio::smm::TransitionRates<ScalarType, InfectionState, Age, Species>>() = transition_rates;

ScalarType dt = 0.1;
ScalarType tmax = 30.0;
Expand Down
38 changes: 24 additions & 14 deletions cpp/memilio/epidemiology/adoption_rate.h
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
/*
* Copyright (C) 2020-2025 MEmilio
*
* Authors: René Schmieding, Julia Bicker
* Authors: René Schmieding, Julia Bicker, Kilian Volmer
*
* Contact: Martin J. Kuehn <Martin.Kuehn@DLR.de>
*
Expand All @@ -23,35 +23,45 @@
#include "memilio/utils/index.h"
#include "memilio/config.h"
#include "memilio/geography/regions.h"
#include <limits>
#include <tuple>
#include <optional>

namespace mio
{

/**
* @brief Struct defining an influence for a second-order adoption.
* The population having "status" is multiplied with "factor."
* @tparam Status An infection state enum.
*/
template <typename FP, class Status>
struct Influence {
Status status;
FP factor;
};

/**
* @brief Struct defining a possible status adoption in a Model based on Poisson Processes.
* The AdoptionRate is considered to be of second-order if there are any "influences".
* In the d_abm and smm simulations, "from" is implicitly an influence, scaled by "factor". This is multiplied by
* the sum over all "influences", which scale their "status" with the respective "factor".
* @tparam Status An infection state enum.
* @tparam Groups Additional grouping indices.
*/
template <typename FP, class Status>
template <typename FP, class Status, class... Groups>
struct AdoptionRate {

/**
* @brief Struct defining an influence for a second-order adoption.
* The population having "status" is multiplied with "factor."
* @tparam status An infection state enum.
* @tparam factor Scaling factor for the influence.
* @tparam
* @tparam Groups Additional grouping indices.
*/
struct Influence {
Status status;
FP factor;
std::optional<mio::regions::Region> region = std::nullopt;
std::tuple<Groups...> group_indices{};
};

Status from; // i
Status to; // j
mio::regions::Region region; // k
FP factor; // gammahat_{ij}^k
std::vector<Influence<FP, Status>> influences; // influences[tau] = ( Psi_{i,j,tau} , gamma_{i,j,tau} )
std::vector<Influence> influences; // influences[tau] = ( Psi_{i,j,tau} , gamma_{i,j,tau} )
std::tuple<Groups...> group_indices{};
};

} // namespace mio
Expand Down
2 changes: 1 addition & 1 deletion cpp/models/d_abm/model.cpp
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright (C) 2020-2025 German Aerospace Center (DLR-SC)
* Copyright (C) 2020-2025 MEmilio
*
* Authors: René Schmieding
*
Expand Down
2 changes: 1 addition & 1 deletion cpp/models/d_abm/model.h
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright (C) 2020-2025 German Aerospace Center (DLR-SC)
* Copyright (C) 2020-2025 MEmilio
*
* Authors: René Schmieding, Julia Bicker
*
Expand Down
2 changes: 1 addition & 1 deletion cpp/models/d_abm/parameters.h
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright (C) 2020-2024 German Aerospace Center (DLR-SC)
* Copyright (C) 2020-2025 MEmilio
*
* Authors: René Schmieding, Julia Bicker
*
Expand Down
2 changes: 1 addition & 1 deletion cpp/models/d_abm/quad_well.h
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright (C) 2020-2025 German Aerospace Center (DLR-SC)
* Copyright (C) 2020-2025 MEmilio
*
* Authors: René Schmieding, Julia Bicker
*
Expand Down
2 changes: 1 addition & 1 deletion cpp/models/d_abm/simulation.cpp
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright (C) 2020-2024 MEmilio
* Copyright (C) 2020-2025 MEmilio
*
* Authors: René Schmieding, Julia Bicker
*
Expand Down
2 changes: 1 addition & 1 deletion cpp/models/d_abm/simulation.h
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright (C) 2020-2025 German Aerospace Center (DLR-SC)
* Copyright (C) 2020-2025 MEmilio
*
* Authors: René Schmieding, Julia Bicker
*
Expand Down
2 changes: 1 addition & 1 deletion cpp/models/d_abm/single_well.h
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright (C) 2020-2025 German Aerospace Center (DLR-SC)
* Copyright (C) 2020-2025 MEmilio
*
* Authors: Julia Bicker, René Schmieding
*
Expand Down
2 changes: 1 addition & 1 deletion cpp/models/graph_abm/graph_abm_mobility.cpp
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright (C) 2020-2024 MEmilio
* Copyright (C) 2020-2025 MEmilio
*
* Authors: Julia Bicker
*
Expand Down
2 changes: 1 addition & 1 deletion cpp/models/graph_abm/graph_abm_mobility.h
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright (C) 2020-2024 MEmilio
* Copyright (C) 2020-2025 MEmilio
*
* Authors: Julia Bicker
*
Expand Down
2 changes: 1 addition & 1 deletion cpp/models/graph_abm/graph_abmodel.h
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright (C) 2020-2024 MEmilio
* Copyright (C) 2020-2025 MEmilio
*
* Authors: Julia Bicker
*
Expand Down
2 changes: 1 addition & 1 deletion cpp/models/hybrid/temporal_hybrid_model.cpp
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright (C) 2020-2025 German Aerospace Center (DLR-SC)
* Copyright (C) 2020-2025 MEmilio
*
* Authors: Julia Bicker, René Schmieding
*
Expand Down
2 changes: 1 addition & 1 deletion cpp/models/hybrid/temporal_hybrid_model.h
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright (C) 2020-2025 German Aerospace Center (DLR-SC)
* Copyright (C) 2020-2025 MEmilio
*
* Authors: Julia Bicker, René Schmieding
*
Expand Down
2 changes: 1 addition & 1 deletion cpp/models/smm/model.cpp
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright (C) 2020-2025 German Aerospace Center (DLR-SC)
* Copyright (C) 2020-2025 MEmilio
*
* Authors: René Schmieding
*
Expand Down
Loading
Loading