Health-GPS 3.0.0.0
Global Health Policy Simulation model (Health-GPS)
Loading...
Searching...
No Matches
risk_factor_adjustable_model.h
Go to the documentation of this file.
1#pragma once
2
5
6#include "map2d.h"
7#include "risk_factor_model.h"
8#include "runtime_context.h"
9
10#include <cstddef>
11#include <functional>
12#include <optional>
13#include <string>
14#include <unordered_set>
15#include <vector>
16
17namespace { // anonymous namespace
18
19using OptionalRange = std::optional<std::reference_wrapper<const hgps::core::DoubleInterval>>;
20
21using OptionalRanges =
22 std::optional<std::reference_wrapper<const std::vector<hgps::core::DoubleInterval>>>;
23
24} // anonymous namespace
25
26namespace hgps {
27
29enum class TrendType {
30 Null,
31 UPFTrend,
33};
34
36inline bool operator==(TrendType lhs, TrendType rhs) noexcept {
37 return static_cast<int>(lhs) == static_cast<int>(rhs);
38}
39
41inline bool operator!=(TrendType lhs, TrendType rhs) noexcept { return !(lhs == rhs); }
42
45
48 std::size_t bucket{};
49 std::string stratum_id;
50 std::string factor;
51 std::string sex;
52 int age{};
55 double delta{};
56 std::size_t person_id{};
57 double current_value{};
59 double final_value{};
60};
61
64 public:
73 std::shared_ptr<RiskFactorSexAgeTable> expected,
74 std::shared_ptr<std::unordered_map<core::Identifier, double>> expected_trend,
75 std::shared_ptr<std::unordered_map<core::Identifier, int>> trend_steps,
76 TrendType trend_type = TrendType::Null,
77 std::shared_ptr<std::unordered_map<core::Identifier, double>> expected_income_trend =
78 nullptr,
79 std::shared_ptr<std::unordered_map<core::Identifier, double>>
80 expected_income_trend_decay_factors = nullptr);
81
90 virtual double get_expected(RuntimeContext &context, core::Gender sex, int age,
91 const core::Identifier &factor, OptionalRange range,
92 bool apply_trend) const;
93
100 RuntimeContext &context, const std::vector<core::Identifier> &factors,
101 OptionalRanges ranges, bool apply_trend,
102 const RiskFactorSexAgeTable *expected_override = nullptr,
103 std::optional<std::size_t> income_stratum_filter = std::nullopt,
104 std::vector<IncomeStratumAdjustmentExampleRow> *debug_example_rows = nullptr) const;
105
109 int get_trend_steps(const core::Identifier &factor) const;
110
113 const std::shared_ptr<std::unordered_map<core::Identifier, double>> &
114 get_expected_trend() const noexcept {
115 return expected_trend_;
116 }
117
120 void set_logistic_factors(const std::unordered_set<core::Identifier> &logistic_factors);
121
122 private:
128 RiskFactorSexAgeTable calculate_adjustments(
129 RuntimeContext &context, const std::vector<core::Identifier> &factors,
130 OptionalRanges ranges, bool apply_trend,
131 const RiskFactorSexAgeTable *expected_override = nullptr,
132 std::optional<std::size_t> income_stratum_filter = std::nullopt,
133 std::vector<IncomeStratumAdjustmentExampleRow> *debug_delta_rows = nullptr) const;
134
136 calculate_simulated_mean(Population &population, core::IntegerInterval age_range,
137 const std::vector<core::Identifier> &factors,
138 const std::unordered_set<core::Identifier> &logistic_factors = {},
139 std::optional<std::size_t> income_stratum_filter = std::nullopt);
140
141 std::shared_ptr<RiskFactorSexAgeTable> expected_;
142 std::shared_ptr<std::unordered_map<core::Identifier, double>> expected_trend_;
143 std::shared_ptr<std::unordered_map<core::Identifier, int>> trend_steps_;
144
145 // Trend type for factors mean adjustment
146 TrendType trend_type_;
147
148 // Income trend data structures (only used when trend_type_ == TrendType::IncomeTrend)
149 std::shared_ptr<std::unordered_map<core::Identifier, double>> expected_income_trend_;
150 std::shared_ptr<std::unordered_map<core::Identifier, double>>
151 expected_income_trend_decay_factors_;
152
153 // Logistic factors for simulated mean calculation (factors that use 2-stage modeling)
154 std::unordered_set<core::Identifier> logistic_factors_;
155};
156
159 public:
162
170 std::unique_ptr<RiskFactorSexAgeTable> expected,
171 std::unique_ptr<std::unordered_map<core::Identifier, double>> expected_trend,
172 std::unique_ptr<std::unordered_map<core::Identifier, int>> trend_steps,
173 TrendType trend_type = TrendType::Null);
174
175 protected:
176 std::shared_ptr<RiskFactorSexAgeTable> expected_;
177 std::shared_ptr<std::unordered_map<core::Identifier, double>> expected_trend_;
178 std::shared_ptr<std::unordered_map<core::Identifier, int>> trend_steps_;
180};
181
182} // namespace hgps
Defines the two-dimensional map (lookup table) data type.
Definition map2d.h:14
Defines the virtual population data type.
Definition population.h:19
Risk factor adjustable model definition interface.
Definition risk_factor_adjustable_model.h:158
TrendType trend_type_
Definition risk_factor_adjustable_model.h:179
std::shared_ptr< std::unordered_map< core::Identifier, double > > expected_trend_
Definition risk_factor_adjustable_model.h:177
std::shared_ptr< std::unordered_map< core::Identifier, int > > trend_steps_
Definition risk_factor_adjustable_model.h:178
~RiskFactorAdjustableModelDefinition() override=default
Destroys a RiskFactorAdjustableModelDefinition instance.
std::shared_ptr< RiskFactorSexAgeTable > expected_
Definition risk_factor_adjustable_model.h:176
Risk factor model interface with mean adjustment by sex and age.
Definition risk_factor_adjustable_model.h:63
virtual double get_expected(RuntimeContext &context, core::Gender sex, int age, const core::Identifier &factor, OptionalRange range, bool apply_trend) const
Gets a person's expected risk factor value.
Definition risk_factor_adjustable_model.cpp:85
const std::shared_ptr< std::unordered_map< core::Identifier, double > > & get_expected_trend() const noexcept
Gets the expected trend values.
Definition risk_factor_adjustable_model.h:114
int get_trend_steps(const core::Identifier &factor) const
Gets the number of time steps to apply the trend.
Definition risk_factor_adjustable_model.cpp:433
void set_logistic_factors(const std::unordered_set< core::Identifier > &logistic_factors)
Sets the logistic factors for simulated mean calculation.
Definition risk_factor_adjustable_model.cpp:440
void adjust_risk_factors(RuntimeContext &context, const std::vector< core::Identifier > &factors, OptionalRanges ranges, bool apply_trend, const RiskFactorSexAgeTable *expected_override=nullptr, std::optional< std::size_t > income_stratum_filter=std::nullopt, std::vector< IncomeStratumAdjustmentExampleRow > *debug_example_rows=nullptr) const
Adjust risk factors such that mean sim value matches expected value.
Definition risk_factor_adjustable_model.cpp:143
Risk factor model definition interface.
Definition risk_factor_model.h:44
Risk factor model interface.
Definition risk_factor_model.h:21
Defines the Simulation runtime context data type.
Definition runtime_context.h:22
Gender
Enumerates gender types.
Definition forward_type.h:18
Top-level namespace for Health-GPS Console host application.
Definition command_options.cpp:8
bool operator!=(TrendType lhs, TrendType rhs) noexcept
Inequality comparison operator for TrendType.
Definition risk_factor_adjustable_model.h:41
bool operator==(TrendType lhs, TrendType rhs) noexcept
Equality comparison operator for TrendType.
Definition risk_factor_adjustable_model.h:36
TrendType
Defines the trend type enumeration for factors mean adjustment.
Definition risk_factor_adjustable_model.h:29
@ IncomeTrend
Income-based trends applied to factors mean adjustment.
@ Null
No trends applied to factors mean adjustment.
@ UPFTrend
UPF (ultra-processed food) trends; config: "upf_trend", "trend" or "UPFTrend".
One debug row showing stratum expected/simulated delta and one sample applied update.
Definition risk_factor_adjustable_model.h:47
std::size_t bucket
Definition risk_factor_adjustable_model.h:48
std::string sex
Definition risk_factor_adjustable_model.h:51
double simulated_mean
Definition risk_factor_adjustable_model.h:54
double after_delta_value
Definition risk_factor_adjustable_model.h:58
int age
Definition risk_factor_adjustable_model.h:52
double expected_value
Definition risk_factor_adjustable_model.h:53
double delta
Definition risk_factor_adjustable_model.h:55
std::string stratum_id
Definition risk_factor_adjustable_model.h:49
std::size_t person_id
Definition risk_factor_adjustable_model.h:56
double final_value
Definition risk_factor_adjustable_model.h:59
double current_value
Definition risk_factor_adjustable_model.h:57
std::string factor
Definition risk_factor_adjustable_model.h:50
Entity unique identifier data type.
Definition identifier.h:20