-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathsimulation.cpp
More file actions
64 lines (52 loc) · 2.17 KB
/
simulation.cpp
File metadata and controls
64 lines (52 loc) · 2.17 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
// src/Simulation.cpp
#include "Simulation.h"
#include "HealthPredictor.h"
#include "ReportGenerator.h"
#include <iostream>
#include <algorithm>
#include <execution>
Simulation::Simulation(std::shared_ptr<Policy> policy)
: policy_(policy) {}
void Simulation::generatePopulation(int size) {
for (int i = 0; i < size; ++i) {
patients_.emplace_back(std::make_shared<Patient>(i + 1));
}
}
void Simulation::run() {
std::for_each(std::execution::par, patients_.begin(), patients_.end(),
[this](auto& patient) {
policy_->apply(*patient);
double risk = HealthPredictor::predictHealthRisk(*patient);
patient->display(); // Optionally log patient data
});
}
void Simulation::generateReport() const {
ReportGenerator::generateSimulationReport(patients_, "simulation_report.txt");
ReportGenerator::saveSyntheticPopulation(patients_, "patients_data.csv");
// Generate population-level metrics
auto metrics = calculatePopulationMetrics();
ReportGenerator::generatePopulationMetricsReport(metrics, "population_metrics.txt");
}
std::map<std::string, double> Simulation::calculatePopulationMetrics() const {
double totalHealthScore = 0.0;
int totalPatients = patients_.size();
int atRiskCount = 0;
int diabetesCount = 0;
int hypertensionCount = 0;
for (const auto& patient : patients_) {
totalHealthScore += patient->getHealthScore();
// Check risk factors
for (const auto& factor : patient->getRiskFactors()) {
if (factor == "Diabetes") diabetesCount++;
if (factor == "Hypertension") hypertensionCount++;
}
// Count patients with any risk factor
if (!patient->getRiskFactors().empty()) atRiskCount++;
}
return {
{"Average Health Score", totalHealthScore / totalPatients},
{"Proportion At Risk", static_cast<double>(atRiskCount) / totalPatients * 100},
{"Proportion with Diabetes", static_cast<double>(diabetesCount) / totalPatients * 100},
{"Proportion with Hypertension", static_cast<double>(hypertensionCount) / totalPatients * 100}
};
}