Health-GPS 3.0.0.0
Global Health Policy Simulation model (Health-GPS)
Loading...
Searching...
No Matches
result_file_writer.h
Go to the documentation of this file.
1#pragma once
2#include <atomic>
3#include <filesystem>
4#include <fstream>
5#include <map>
6#include <memory>
7#include <mutex>
8
10#include "model_info.h"
11#include "result_writer.h"
12
13namespace hgps {
20class ResultFileWriter final : public ResultWriter {
21 public:
22 ResultFileWriter() = delete;
29 ResultFileWriter(const std::filesystem::path &file_name, ExperimentInfo info,
30 bool write_income_csv = true,
31 core::IncomeCategoryLayout income_category_layout = {});
32
35 ResultFileWriter(ResultFileWriter &&other) noexcept;
37
40 void write(const hgps::ResultEventMessage &message) override;
41
42 private:
43 std::ofstream stream_;
44 std::ofstream csvstream_;
45 std::map<core::Income, std::ofstream> income_csvstreams_;
46 std::map<core::Income, bool> income_first_row_;
47 // MAHIMA: One mutex per income stream so income CSV files can be written in parallel.
48 // unique_ptr so the map is movable (std::mutex is not movable).
49 std::map<core::Income, std::unique_ptr<std::mutex>> income_mutexes_;
50 ExperimentInfo info_;
51 bool write_income_csv_{true};
52 core::IncomeCategoryLayout income_category_layout_{};
53 std::filesystem::path base_filename_;
54 std::atomic<bool> first_row_{true};
55 std::mutex lock_mutex_;
56
57 void write_json_begin(const std::filesystem::path &output);
58 void write_json_end();
59 std::string to_json_string(const hgps::ResultEventMessage &message);
60 void write_csv_header(const hgps::ResultEventMessage &message);
61 void write_csv_channels(const hgps::ResultEventMessage &message);
62
65 void write_income_based_csv_files(const hgps::ResultEventMessage &message);
66
70 void write_income_csv_header(const hgps::ResultEventMessage &message,
71 std::ofstream &income_csv);
72
77 void write_income_aggregated_csv_data(const hgps::ResultEventMessage &message,
78 core::Income income, std::ofstream &income_csv);
79
84 void write_income_csv_data(const hgps::ResultEventMessage &message, core::Income income,
85 std::ofstream &income_csv);
86
91 std::string generate_income_filename(const std::string &base_filename,
92 core::Income income) const;
93
97 std::string income_category_to_string(core::Income income) const;
98
102 std::vector<core::Income>
103 get_available_income_categories(const hgps::ResultEventMessage &message) const;
104
105 void merge_configured_income_strata(std::vector<core::Income> &categories) const;
106 void initialize_income_streams(const hgps::ResultEventMessage &message);
107 void ensure_income_stream_open(core::Income income, const hgps::ResultEventMessage &message);
108 void write_income_csv_channels(const hgps::ResultEventMessage &message);
109};
110} // namespace hgps
Defines the results message file stream writer class.
Definition result_file_writer.h:20
void write(const hgps::ResultEventMessage &message) override
Writes the hgps::ResultEventMessage contents to a stream.
Definition result_file_writer.cpp:102
ResultFileWriter(const ResultFileWriter &)=delete
~ResultFileWriter()
Destroys a hgps::ResultFileWriter instance.
Definition result_file_writer.cpp:76
ResultFileWriter & operator=(const ResultFileWriter &)=delete
Defines the Health-GPS results message writer interface.
Definition result_writer.h:7
Income
Enumerates income categories.
Definition forward_type.h:51
Top-level namespace for Health-GPS Console host application.
Definition command_options.cpp:8
@ info
General notification and progress message.
Simulation experiment run-time information for reproducibility.
Definition model_info.h:8
Implements the simulation results event message data type.
Definition result_message.h:8
Ordered final income buckets for project_requirements.income.categories (3, 4, or 5).
Definition income_category_layout.h:13