Stride Reference Manual  1.0
ClusterSaver.h
Go to the documentation of this file.
1 
2 #pragma once
3 
4 #include <boost/property_tree/xml_parser.hpp>
5 #include <string>
6 #include <utility>
7 #include <fstream>
8 #include <map>
9 
10 #include "sim/Simulator.h"
11 #include "core/Cluster.h"
13 #include "util/Observer.h"
14 
15 
16 namespace stride {
17 
18 using boost::property_tree::ptree;
19 using std::string;
20 using std::pair;
21 using std::ofstream;
22 using std::vector;
23 using std::map;
24 using std::pair;
25 
26 class ClusterSaver : public util::Observer<Simulator> {
27 public:
28  ClusterSaver(string file_name, string pop_file_name, string facility_file_name, string output_dir);
29 
30  virtual void update(const Simulator& sim) {
31  saveClustersCSV(sim);
32  savePopDataJSON(sim);
34  m_sim_day++;
35  }
36 
37 private:
38  using uint = unsigned int;
39 
41  void saveClustersCSV(const Simulator& sim) const;
42 
44  inline void saveClusterCSV(const Cluster& cluster, ofstream& csv_file) const;
45 
47  void saveAggrClustersCSV(const vector<Cluster>& households, ofstream& csv_file) const;
48 
50  void saveClusterGroup(const vector<Cluster>& households, const vector<uint> indices, ofstream& csv_file) const;
51 
52  // Deprecated
53  void saveClustersJSON(const Simulator& sim) const;
54 
55  // Deprecated
56  pair<ptree, ptree> getClusterJSON(const Cluster& cluster) const;
57 
58  // Save data of the population to a JSON file
59  void savePopDataJSON(const Simulator& local_sim) const;
60 
61  double getPopCount(const Simulator& local_sim) const;
62 
63  map<uint, uint> getAgeMap(const Simulator& local_sim) const;
64 
65  void saveTransportationFacilities(const Simulator& local_sim) const;
66 
67 
68 private:
70  string m_file_name;
71  string m_file_dir;
76 };
77 
78 template<ClusterType type>
79 class ClusterCalculator {
80 public:
81  static double calcSurface(const vector<Cluster>& clusters) {
82  double latitude_middle = 0.0;
83  double longitude_middle = 0.0;
84  const auto& calc = GeoCoordCalculator::getInstance();
85 
86  for (const auto& cluster: clusters) {
87  latitude_middle += cluster.getLocation().m_latitude;
88  longitude_middle += cluster.getLocation().m_longitude;
89  }
90 
91  latitude_middle /= clusters.size() - 1;
92  longitude_middle /= clusters.size() - 1;
93 
94  GeoCoordinate middle;
95  middle.m_latitude = latitude_middle;
96  middle.m_longitude = longitude_middle;
97 
98  double radius = 0.0;
99 
100  for (auto it = clusters.begin() + 1; it != clusters.end(); ++it) {
101  const auto& cluster = *it;
102 
103  double candidate_distance = calc.getDistance(middle, cluster.getLocation());
104 
105  if (radius < candidate_distance && cluster.getActiveClusterMembers() != 0) {
106  radius = candidate_distance;
107  }
108  }
109 
110  return PI * radius * radius;
111  }
112 
113  static map<uint, uint> getClMap(const vector<Cluster>& clusters) {
114  map<uint, uint> result;
115 
116  for (const auto& cluster: clusters) {
117  uint count = cluster.getActiveClusterMembers();
118 
119  if (result.find(count) == result.end() && count != 0) {
120  result[count] = 1;
121  } else {
122  ++result[count];
123  }
124 
125  }
126 
127  return result;
128  }
129 
133  static double calculateSurface(const Simulator& local_sim) {
134  throw runtime_error(string(__func__) + ">Trying to save unknown cluster type.");
135  }
136 
137  static map<uint, uint> getClusterMap(const Simulator& local_sim) {
138  throw runtime_error(string(__func__) + ">Trying to save unknown cluster type.");
139  }
140 };
141 
142 template<>
144 public:
145  static double calculateSurface(const Simulator& local_sim) {
147  }
148 
149  static map<uint, uint> getClusterMap(const Simulator& local_sim) {
151  }
152 };
153 
154 template<>
156 public:
157  static double calculateSurface(const Simulator& local_sim) {
159  }
160 
161  static map<uint, uint> getClusterMap(const Simulator& local_sim) {
163  }
164 };
165 
166 template<>
168 public:
169  static double calculateSurface(const Simulator& local_sim) {
171  }
172 
173  static map<uint, uint> getClusterMap(const Simulator& local_sim) {
175  }
176 };
177 
178 template<>
180 public:
181  static double calculateSurface(const Simulator& local_sim) {
183  }
184 
185  static map<uint, uint> getClusterMap(const Simulator& local_sim) {
187  }
188 };
189 
190 template<>
192 public:
193  static double calculateSurface(const Simulator& local_sim) {
195  }
196 
197  static map<uint, uint> getClusterMap(const Simulator& local_sim) {
199  }
200 };
201 
202 
203 }
const std::vector< Cluster > & getPrimaryCommunities() const
Definition: Simulator.h:143
unsigned int uint
Definition: ClusterSaver.h:38
static map< uint, uint > getClusterMap(const Simulator &local_sim)
Definition: ClusterSaver.h:173
unsigned int uint
Definition: Influence.h:17
double getPopCount(const Simulator &local_sim) const
void saveClustersCSV(const Simulator &sim) const
Saves cluster information for Households (aggregated), Primary Communities and Secondary Communities...
static double calcSurface(const vector< Cluster > &clusters)
Definition: ClusterSaver.h:81
Time Dependent Person DataType.
Definition: NoBehaviour.h:17
virtual void update(const Simulator &sim)
Definition: ClusterSaver.h:30
void saveClustersJSON(const Simulator &sim) const
Interface/Implementation of Observer.
pair< ptree, ptree > getClusterJSON(const Cluster &cluster) const
void saveTransportationFacilities(const Simulator &local_sim) const
static double calculateSurface(const Simulator &local_sim)
Definition: ClusterSaver.h:193
static map< uint, uint > getClusterMap(const Simulator &local_sim)
Definition: ClusterSaver.h:161
ClusterSaver(string file_name, string pop_file_name, string facility_file_name, string output_dir)
map< uint, uint > getAgeMap(const Simulator &local_sim) const
void saveClusterGroup(const vector< Cluster > &households, const vector< uint > indices, ofstream &csv_file) const
Saves an aggregated cluster. The clusters that need to be aggregated are given by the indices...
#define PI
Definition: popgen/utils.h:13
static map< uint, uint > getClMap(const vector< Cluster > &clusters)
Definition: ClusterSaver.h:113
Header for the Simulator class.
static double calculateSurface(const Simulator &local_sim)
Definition: ClusterSaver.h:181
const std::vector< Cluster > & getSchoolClusters() const
Definition: Simulator.h:139
Main class that contains and direct the virtual world.
Definition: Simulator.h:64
const std::vector< Cluster > & getWorkClusters() const
Definition: Simulator.h:141
static map< uint, uint > getClusterMap(const Simulator &local_sim)
Definition: ClusterSaver.h:197
static map< uint, uint > getClusterMap(const Simulator &local_sim)
Definition: ClusterSaver.h:185
const std::vector< Cluster > & getSecondaryCommunities() const
Definition: Simulator.h:145
void savePopDataJSON(const Simulator &local_sim) const
Represents a location for social contacts, an group of people.
Definition: Cluster.h:46
void saveClusterCSV(const Cluster &cluster, ofstream &csv_file) const
Saves a single cluster.
static double calculateSurface(const Simulator &local_sim)
Calculate the used surface The middle point of cities is calculated, followed by the distance between...
Definition: ClusterSaver.h:133
static double calculateSurface(const Simulator &local_sim)
Definition: ClusterSaver.h:157
const std::vector< Cluster > & getHouseholds() const
Definition: Simulator.h:137
void saveAggrClustersCSV(const vector< Cluster > &households, ofstream &csv_file) const
Aggregates the vector of given clusters according to their GeoLocation, and saves them...
ClusterType
Enumerates the cluster types.
Definition: ClusterType.h:28
static const GeoCoordCalculator & getInstance()
Singleton pattern.
static double calculateSurface(const Simulator &local_sim)
Definition: ClusterSaver.h:169
Header for the core Cluster class.
static map< uint, uint > getClusterMap(const Simulator &local_sim)
Definition: ClusterSaver.h:149
static map< uint, uint > getClusterMap(const Simulator &local_sim)
Definition: ClusterSaver.h:137
static double calculateSurface(const Simulator &local_sim)
Definition: ClusterSaver.h:145