Skip to content

Commit b04f88c

Browse files
authored
Feature/find in events (#96)
* Updating for the find in events functionality * fixing typo in find in event list function
1 parent 879ae89 commit b04f88c

File tree

9 files changed

+74
-96
lines changed

9 files changed

+74
-96
lines changed

include/hepce/utils/config.hpp

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
// Created Date: 2025-04-18 //
55
// Author: Matthew Carroll //
66
// ----- //
7-
// Last Modified: 2025-05-08 //
7+
// Last Modified: 2025-05-15 //
88
// Modified By: Matthew Carroll //
99
// ----- //
1010
// Copyright (c) 2025 Syndemics Lab at Boston Medical Center //
@@ -93,6 +93,19 @@ inline std::string GetStringFromConfig(std::string config_key,
9393
}
9494
return s;
9595
}
96+
97+
inline bool FindInEventList(std::string event_name,
98+
datamanagement::ModelData &model_data) {
99+
auto event_list = utils::ToLowerVector(utils::SplitToVecT<std::string>(
100+
model_data.GetFromConfig("simulation.events"), ','));
101+
auto event_name_lower = utils::ToLower(event_name);
102+
if (std::find(event_list.begin(), event_list.end(), event_name_lower) !=
103+
event_list.end()) {
104+
return true;
105+
}
106+
return false;
107+
}
108+
96109
} // namespace utils
97110
} // namespace hepce
98111
#endif // HEPCE_UTILS_CONFIG_HPP_

include/hepce/utils/formatting.hpp

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
// Created Date: 2025-04-17 //
55
// Author: Matthew Carroll //
66
// ----- //
7-
// Last Modified: 2025-04-30 //
7+
// Last Modified: 2025-05-15 //
88
// Modified By: Matthew Carroll //
99
// ----- //
1010
// Copyright (c) 2025 Syndemics Lab at Boston Medical Center //
@@ -78,6 +78,14 @@ inline std::string const BoolToString(bool b) {
7878
return b ? std::string("true") : std::string("false");
7979
}
8080

81+
inline std::vector<std::string>
82+
ToLowerVector(const std::vector<std::string> &vec_str) {
83+
std::vector<std::string> copy = vec_str;
84+
std::transform(copy.begin(), copy.end(), copy.begin(),
85+
[](std::string &str) { return ToLower(str); });
86+
return copy;
87+
}
88+
8189
template <typename T>
8290
inline bool FindInVector(std::vector<T> searched, std::vector<T> queries) {
8391
for (T &query : queries) {

src/event/base/death.cpp

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
// Created Date: 2025-04-18 //
55
// Author: Matthew Carroll //
66
// ----- //
7-
// Last Modified: 2025-05-14 //
7+
// Last Modified: 2025-05-15 //
88
// Modified By: Matthew Carroll //
99
// ----- //
1010
// Copyright (c) 2025 Syndemics Lab at Boston Medical Center //
@@ -37,16 +37,19 @@ DeathImpl::DeathImpl(datamanagement::ModelData &model_data,
3737
_decomp_infected_probability(
3838
utils::GetDoubleFromConfig("mortality.decomp_infected", model_data)),
3939
_decomp_uninfected_probability(utils::GetDoubleFromConfig(
40-
"mortality.decomp_uninfected", model_data)),
41-
_hiv_mortality_probability(
42-
utils::GetDoubleFromConfig("mortality.hiv", model_data)) {
40+
"mortality.decomp_uninfected", model_data)) {
4341
LoadData(model_data);
4442
}
4543

4644
// Execute
4745
void DeathImpl::Execute(model::Person &person, model::Sampler &sampler) {
48-
if (ReachedMaxAge(person) || FatalOverdose(person, sampler) ||
49-
HivDeath(person, sampler)) {
46+
if (check_overdose && FatalOverdose(person, sampler)) {
47+
return;
48+
}
49+
if (check_hiv && HivDeath(person, sampler)) {
50+
return;
51+
}
52+
if (ReachedMaxAge(person)) {
5053
return;
5154
}
5255

@@ -78,7 +81,15 @@ void DeathImpl::Execute(model::Person &person, model::Sampler &sampler) {
7881
}
7982

8083
void DeathImpl::LoadData(datamanagement::ModelData &model_data) {
81-
LoadOverdoseData(model_data);
84+
if (utils::FindInEventList("overdose", model_data)) {
85+
check_overdose = true;
86+
LoadOverdoseData(model_data);
87+
}
88+
if (utils::FindInEventList("hivinfection", model_data)) {
89+
check_hiv = true;
90+
_hiv_mortality_probability =
91+
utils::GetDoubleFromConfig("mortality.hiv", model_data);
92+
}
8293
LoadBackgroundMortality(model_data);
8394
}
8495

src/event/base/internals/death_internals.hpp

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
// Created Date: 2025-04-18 //
55
// Author: Matthew Carroll //
66
// ----- //
7-
// Last Modified: 2025-05-14 //
7+
// Last Modified: 2025-05-15 //
88
// Modified By: Matthew Carroll //
99
// ----- //
1010
// Copyright (c) 2025 Syndemics Lab at Boston Medical Center //
@@ -51,7 +51,10 @@ class DeathImpl : public virtual Death, public EventBase {
5151
const double _f4_uninfected_probability;
5252
const double _decomp_infected_probability;
5353
const double _decomp_uninfected_probability;
54-
const double _hiv_mortality_probability;
54+
double _hiv_mortality_probability = 0.0;
55+
56+
bool check_overdose = false;
57+
bool check_hiv = false;
5558

5659
backgroundmap_t _background_data;
5760
overdosemap_t _overdose_data;

src/event/hcv/linking.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
// Created Date: 2025-04-23 //
55
// Author: Matthew Carroll //
66
// ----- //
7-
// Last Modified: 2025-05-08 //
7+
// Last Modified: 2025-05-15 //
88
// Modified By: Matthew Carroll //
99
// ----- //
1010
// Copyright (c) 2025 Syndemics Lab at Boston Medical Center //
@@ -39,7 +39,8 @@ LinkingImpl::LinkingImpl(datamanagement::ModelData &model_data,
3939

4040
void LinkingImpl::LoadData(datamanagement::ModelData &model_data) {
4141
SetEventCostCategory(model::CostCategory::kLinking);
42-
SetLinkingStratifiedByPregnancy(CheckForPregnancyEvent(model_data));
42+
SetLinkingStratifiedByPregnancy(
43+
utils::FindInEventList("Pregnancy", model_data));
4344
LoadLinkingData(model_data);
4445
SetInterventionCost(
4546
utils::GetDoubleFromConfig("linking.intervention_cost", model_data));

src/event/hiv/linking.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
// Created Date: 2025-04-23 //
55
// Author: Matthew Carroll //
66
// ----- //
7-
// Last Modified: 2025-05-08 //
7+
// Last Modified: 2025-05-15 //
88
// Modified By: Matthew Carroll //
99
// ----- //
1010
// Copyright (c) 2025 Syndemics Lab at Boston Medical Center //
@@ -35,7 +35,8 @@ LinkingImpl::LinkingImpl(datamanagement::ModelData &model_data,
3535

3636
void LinkingImpl::LoadData(datamanagement::ModelData &model_data) {
3737
SetEventCostCategory(model::CostCategory::kHiv);
38-
SetLinkingStratifiedByPregnancy(CheckForPregnancyEvent(model_data));
38+
SetLinkingStratifiedByPregnancy(
39+
utils::FindInEventList("pregnancy", model_data));
3940
LoadLinkingData(model_data);
4041

4142
SetInterventionCost(utils::GetDoubleFromConfig(

src/event/internals/linking_internals.hpp

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
// Created Date: 2025-04-18 //
55
// Author: Matthew Carroll //
66
// ----- //
7-
// Last Modified: 2025-05-12 //
7+
// Last Modified: 2025-05-15 //
88
// Modified By: Matthew Carroll //
99
// ----- //
1010
// Copyright (c) 2025 Syndemics Lab at Boston Medical Center //
@@ -170,13 +170,6 @@ class LinkingBase : public EventBase {
170170
inline double ApplyMultiplier(double prob, double mult) {
171171
return utils::RateToProbability(utils::ProbabilityToRate(prob) * mult);
172172
}
173-
inline bool CheckForPregnancyEvent(datamanagement::ModelData &model_data) {
174-
std::vector<std::string> event_list = utils::SplitToVecT<std::string>(
175-
utils::GetStringFromConfig("simulation.events", model_data), ',');
176-
177-
return (std::find(event_list.begin(), event_list.end(), "pregnancy") !=
178-
event_list.end());
179-
}
180173

181174
private:
182175
// properties

tests/constants/config.hpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
// Created Date: 2025-04-23 //
55
// Author: Matthew Carroll //
66
// ----- //
7-
// Last Modified: 2025-05-08 //
7+
// Last Modified: 2025-05-15 //
88
// Modified By: Matthew Carroll //
99
// ----- //
1010
// Copyright (c) 2025 Syndemics Lab at Boston Medical Center //
@@ -147,6 +147,7 @@ inline void BuildAlternateSimConf(const std::string &name) {
147147
<< "f4_uninfected = 0.0000271037696334409" << std::endl
148148
<< "decomp_infected = 0.01734776" << std::endl
149149
<< "decomp_uninfected = 0.005688756" << std::endl
150+
<< "hiv = 0.0" << std::endl
150151
<< "[infection]" << std::endl
151152
<< std::endl
152153
<< "clearance_prob = 0.0489" << std::endl

tests/src/event/base/death_test.cpp

Lines changed: 19 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
// Created: 2025-01-06 //
55
// Author: Matthew Carroll //
66
// ----- //
7-
// Last Modified: 2025-05-08 //
7+
// Last Modified: 2025-05-15 //
88
// Modified By: Matthew Carroll //
99
// ----- //
1010
// Copyright (c) 2025 Syndemics Lab at Boston Medical Center //
@@ -34,6 +34,7 @@
3434
#include <sampler_mock.hpp>
3535

3636
using ::testing::_;
37+
using ::testing::NiceMock;
3738
using ::testing::Return;
3839

3940
using namespace hepce::data;
@@ -44,7 +45,7 @@ namespace testing {
4445

4546
class DeathTest : public ::testing::Test {
4647
protected:
47-
MockPerson mock_person;
48+
NiceMock<MockPerson> mock_person;
4849
MockSampler mock_sampler;
4950
std::string test_db = "inputs.db";
5051
std::string test_conf = "sim.conf";
@@ -75,6 +76,13 @@ class DeathTest : public ::testing::Test {
7576
discounted_life = utils::Discount(1, 0.0025, 1, false);
7677
model_data = datamanagement::ModelData::Create(test_conf);
7778
model_data->AddSource(test_db);
79+
80+
ON_CALL(mock_person, GetAge()).WillByDefault(Return(300));
81+
ON_CALL(mock_person, GetCurrentlyOverdosing())
82+
.WillByDefault(Return(false));
83+
ON_CALL(mock_person, GetSex()).WillByDefault(Return(data::Sex::kMale));
84+
ON_CALL(mock_person, GetBehaviorDetails())
85+
.WillByDefault(Return(behaviors));
7886
}
7987
void TearDown() override {
8088
std::filesystem::remove(test_db);
@@ -95,27 +103,14 @@ TEST_F(DeathTest, AgeDR) {
95103
auto event = event::base::Death::Create(*model_data, LOG_NAME);
96104
event->Execute(mock_person, mock_sampler);
97105

98-
// Testing the Overdose Table Logging
99-
std::string expected = "No Overdose Table Found in the inputs database...";
100-
std::string line;
101-
std::ifstream f(LOG_FILE);
102-
std::getline(f, line);
103-
f.close();
104-
ASSERT_TRUE(line.find(expected) != std::string::npos);
105106
std::filesystem::remove(LOG_FILE);
106107
}
107108

108109
TEST_F(DeathTest, F4_Infected_BackgroundDR) {
109110
hcv_details.fibrosis_state = data::FibrosisState::kF4;
110111
hcv_details.hcv = data::HCV::kChronic;
111112

112-
EXPECT_CALL(mock_person, GetAge()).Times(2).WillRepeatedly(Return(300));
113-
EXPECT_CALL(mock_person, GetCurrentlyOverdosing()).WillOnce(Return(false));
114-
EXPECT_CALL(mock_person, GetHCVDetails())
115-
.Times(2)
116-
.WillRepeatedly(Return(hcv_details));
117-
EXPECT_CALL(mock_person, GetSex()).WillOnce(Return(data::Sex::kMale));
118-
EXPECT_CALL(mock_person, GetBehaviorDetails()).WillOnce(Return(behaviors));
113+
ON_CALL(mock_person, GetHCVDetails()).WillByDefault(Return(hcv_details));
119114

120115
EXPECT_CALL(mock_sampler, GetDecision(_)).WillOnce(Return(0));
121116
EXPECT_CALL(mock_person, Die(data::DeathReason::kBackground)).Times(1);
@@ -134,13 +129,7 @@ TEST_F(DeathTest, F4_Infected_LiverDR) {
134129
hcv_details.fibrosis_state = data::FibrosisState::kF4;
135130
hcv_details.hcv = data::HCV::kChronic;
136131

137-
EXPECT_CALL(mock_person, GetAge()).Times(2).WillRepeatedly(Return(300));
138-
EXPECT_CALL(mock_person, GetCurrentlyOverdosing()).WillOnce(Return(false));
139-
EXPECT_CALL(mock_person, GetHCVDetails())
140-
.Times(2)
141-
.WillRepeatedly(Return(hcv_details));
142-
EXPECT_CALL(mock_person, GetSex()).WillOnce(Return(data::Sex::kMale));
143-
EXPECT_CALL(mock_person, GetBehaviorDetails()).WillOnce(Return(behaviors));
132+
ON_CALL(mock_person, GetHCVDetails()).WillByDefault(Return(hcv_details));
144133

145134
EXPECT_CALL(mock_sampler, GetDecision(_)).WillOnce(Return(1));
146135
EXPECT_CALL(mock_person, Die(data::DeathReason::kLiver)).Times(1);
@@ -159,13 +148,7 @@ TEST_F(DeathTest, F4_Uninfected_BackgroundDR) {
159148
hcv_details.fibrosis_state = data::FibrosisState::kF4;
160149
hcv_details.hcv = data::HCV::kNone;
161150

162-
EXPECT_CALL(mock_person, GetAge()).Times(2).WillRepeatedly(Return(300));
163-
EXPECT_CALL(mock_person, GetCurrentlyOverdosing()).WillOnce(Return(false));
164-
EXPECT_CALL(mock_person, GetHCVDetails())
165-
.Times(2)
166-
.WillRepeatedly(Return(hcv_details));
167-
EXPECT_CALL(mock_person, GetSex()).WillOnce(Return(data::Sex::kMale));
168-
EXPECT_CALL(mock_person, GetBehaviorDetails()).WillOnce(Return(behaviors));
151+
ON_CALL(mock_person, GetHCVDetails()).WillByDefault(Return(hcv_details));
169152

170153
EXPECT_CALL(mock_sampler, GetDecision(_)).WillOnce(Return(0));
171154
EXPECT_CALL(mock_person, Die(data::DeathReason::kBackground)).Times(1);
@@ -184,13 +167,7 @@ TEST_F(DeathTest, F4_Uninfected_LiverDR) {
184167
hcv_details.fibrosis_state = data::FibrosisState::kF4;
185168
hcv_details.hcv = data::HCV::kNone;
186169

187-
EXPECT_CALL(mock_person, GetAge()).Times(2).WillRepeatedly(Return(300));
188-
EXPECT_CALL(mock_person, GetCurrentlyOverdosing()).WillOnce(Return(false));
189-
EXPECT_CALL(mock_person, GetHCVDetails())
190-
.Times(2)
191-
.WillRepeatedly(Return(hcv_details));
192-
EXPECT_CALL(mock_person, GetSex()).WillOnce(Return(data::Sex::kMale));
193-
EXPECT_CALL(mock_person, GetBehaviorDetails()).WillOnce(Return(behaviors));
170+
ON_CALL(mock_person, GetHCVDetails()).WillByDefault(Return(hcv_details));
194171

195172
EXPECT_CALL(mock_sampler, GetDecision(_)).WillOnce(Return(1));
196173
EXPECT_CALL(mock_person, Die(data::DeathReason::kLiver)).Times(1);
@@ -209,13 +186,7 @@ TEST_F(DeathTest, Decomp_Infected_BackgroundDR) {
209186
hcv_details.fibrosis_state = data::FibrosisState::kDecomp;
210187
hcv_details.hcv = data::HCV::kChronic;
211188

212-
EXPECT_CALL(mock_person, GetAge()).Times(2).WillRepeatedly(Return(300));
213-
EXPECT_CALL(mock_person, GetCurrentlyOverdosing()).WillOnce(Return(false));
214-
EXPECT_CALL(mock_person, GetHCVDetails())
215-
.Times(3)
216-
.WillRepeatedly(Return(hcv_details));
217-
EXPECT_CALL(mock_person, GetSex()).WillOnce(Return(data::Sex::kMale));
218-
EXPECT_CALL(mock_person, GetBehaviorDetails()).WillOnce(Return(behaviors));
189+
ON_CALL(mock_person, GetHCVDetails()).WillByDefault(Return(hcv_details));
219190

220191
EXPECT_CALL(mock_sampler, GetDecision(_)).WillOnce(Return(0));
221192
EXPECT_CALL(mock_person, Die(data::DeathReason::kBackground)).Times(1);
@@ -234,13 +205,7 @@ TEST_F(DeathTest, Decomp_Infected_LiverDR) {
234205
hcv_details.fibrosis_state = data::FibrosisState::kDecomp;
235206
hcv_details.hcv = data::HCV::kChronic;
236207

237-
EXPECT_CALL(mock_person, GetAge()).Times(2).WillRepeatedly(Return(300));
238-
EXPECT_CALL(mock_person, GetCurrentlyOverdosing()).WillOnce(Return(false));
239-
EXPECT_CALL(mock_person, GetHCVDetails())
240-
.Times(3)
241-
.WillRepeatedly(Return(hcv_details));
242-
EXPECT_CALL(mock_person, GetSex()).WillOnce(Return(data::Sex::kMale));
243-
EXPECT_CALL(mock_person, GetBehaviorDetails()).WillOnce(Return(behaviors));
208+
ON_CALL(mock_person, GetHCVDetails()).WillByDefault(Return(hcv_details));
244209

245210
EXPECT_CALL(mock_sampler, GetDecision(_)).WillOnce(Return(1));
246211
EXPECT_CALL(mock_person, Die(data::DeathReason::kLiver)).Times(1);
@@ -259,13 +224,7 @@ TEST_F(DeathTest, Decomp_Uninfected_BackgroundDR) {
259224
hcv_details.fibrosis_state = data::FibrosisState::kDecomp;
260225
hcv_details.hcv = data::HCV::kNone;
261226

262-
EXPECT_CALL(mock_person, GetAge()).Times(2).WillRepeatedly(Return(300));
263-
EXPECT_CALL(mock_person, GetCurrentlyOverdosing()).WillOnce(Return(false));
264-
EXPECT_CALL(mock_person, GetHCVDetails())
265-
.Times(3)
266-
.WillRepeatedly(Return(hcv_details));
267-
EXPECT_CALL(mock_person, GetSex()).WillOnce(Return(data::Sex::kMale));
268-
EXPECT_CALL(mock_person, GetBehaviorDetails()).WillOnce(Return(behaviors));
227+
ON_CALL(mock_person, GetHCVDetails()).WillByDefault(Return(hcv_details));
269228

270229
EXPECT_CALL(mock_sampler, GetDecision(_)).WillOnce(Return(0));
271230
EXPECT_CALL(mock_person, Die(data::DeathReason::kBackground)).Times(1);
@@ -284,13 +243,7 @@ TEST_F(DeathTest, Decomp_Uninfected_LiverDR) {
284243
hcv_details.fibrosis_state = data::FibrosisState::kDecomp;
285244
hcv_details.hcv = data::HCV::kNone;
286245

287-
EXPECT_CALL(mock_person, GetAge()).Times(2).WillRepeatedly(Return(300));
288-
EXPECT_CALL(mock_person, GetCurrentlyOverdosing()).WillOnce(Return(false));
289-
EXPECT_CALL(mock_person, GetHCVDetails())
290-
.Times(3)
291-
.WillRepeatedly(Return(hcv_details));
292-
EXPECT_CALL(mock_person, GetSex()).WillOnce(Return(data::Sex::kMale));
293-
EXPECT_CALL(mock_person, GetBehaviorDetails()).WillOnce(Return(behaviors));
246+
ON_CALL(mock_person, GetHCVDetails()).WillByDefault(Return(hcv_details));
294247

295248
EXPECT_CALL(mock_sampler, GetDecision(_)).WillOnce(Return(1));
296249
EXPECT_CALL(mock_person, Die(data::DeathReason::kLiver)).Times(1);
@@ -309,13 +262,7 @@ TEST_F(DeathTest, NoDeath) {
309262
hcv_details.fibrosis_state = data::FibrosisState::kDecomp;
310263
hcv_details.hcv = data::HCV::kNone;
311264

312-
EXPECT_CALL(mock_person, GetAge()).Times(2).WillRepeatedly(Return(300));
313-
EXPECT_CALL(mock_person, GetCurrentlyOverdosing()).WillOnce(Return(false));
314-
EXPECT_CALL(mock_person, GetHCVDetails())
315-
.Times(3)
316-
.WillRepeatedly(Return(hcv_details));
317-
EXPECT_CALL(mock_person, GetSex()).WillOnce(Return(data::Sex::kMale));
318-
EXPECT_CALL(mock_person, GetBehaviorDetails()).WillOnce(Return(behaviors));
265+
ON_CALL(mock_person, GetHCVDetails()).WillByDefault(Return(hcv_details));
319266

320267
EXPECT_CALL(mock_sampler, GetDecision(_)).WillOnce(Return(2));
321268
EXPECT_CALL(mock_person, Die(_)).Times(0);

0 commit comments

Comments
 (0)