-
Notifications
You must be signed in to change notification settings - Fork 0
/
environment.cpp
274 lines (228 loc) · 7.65 KB
/
environment.cpp
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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
/******************************************************************************
* GRIDGEN: Grid Generating Compiler
* By: Andy Stone (aistone@gmail.com)
* (C) Copyright 2011 Colorado State University
*****************************************************************************/
#include "environment.hpp"
#include "utils.hpp"
#include "error.hpp"
#include "binIO.hpp"
#include <iostream>
#include <fstream>
#include <map>
using namespace std;
Environment::NeighborMap_t Environment::mNeighbors;
Environment::SubgridMap_t Environment::mSubgrids;
Environment::GridMap_t Environment::mGrids;
Environment::DistributionMap_t Environment::mDistributions;
Environment::ScheduleMap_t Environment::mSchedules;
Environment::DataObjectMap_t Environment::mDataObjects;
static bool debug = false;
void initializeModule_environment() {
GW_DEBUG_CTRL("environment:all", debug);
}
void Environment::clear() {
mNeighbors.clear();
mSubgrids.clear();
mGrids.clear();
mDistributions.clear();
mSchedules.clear();
}
Neighbor* Environment::newNeighbor(const string &id) {
DBG_MSG_V("Create a new neighbor.", id);
// Create the new neighbor
Neighbor *neigh = new Neighbor(id);
// Attempt to insert the new neighbor into the environment. Error out
// if the neighbor already exists.
pair<NeighborMap_t::iterator, bool> ret;
ret = mNeighbors.insert(make_pair(id, neigh));
if(ret.second == false) {
error(ERR_ENV__DUPLICATE_ENTRY, id);
}
return (*ret.first).second;
}
void Environment::newObj(const std::string &id, Neighbor **neigh) {
*neigh = newNeighbor(id);
}
Subgrid* Environment::newSubgrid(const string &id) {
DBG_MSG_V("Create a new subgrid.", id);
// Create the new subgrid
Subgrid *sg = new Subgrid(id, mSubgrids.size()+1);
// Attempt to insert the new neighbor into the environment. Error out
// if the neighbor already exists.
pair<SubgridMap_t::iterator, bool> ret;
ret = mSubgrids.insert(make_pair(id, sg));
if(ret.second == false) {
error(ERR_ENV__DUPLICATE_ENTRY, id);
}
return (*ret.first).second;
}
void Environment::newObj(const std::string &id, Subgrid **sg) {
*sg = newSubgrid(id);
}
Grid* Environment::newGrid(const string &id) {
DBG_MSG_V("Create a new grid.", id);
// Create the new grid
Grid *g = new Grid(id);
// Attempt to insert the new grid into the environment. Error out
// if the grid already exists.
pair<GridMap_t::iterator, bool> ret;
ret = mGrids.insert(make_pair(id, g));
if(ret.second == false) {
error(ERR_ENV__DUPLICATE_ENTRY, id);
}
return (*ret.first).second;
}
void Environment::newObj(const std::string &id, Grid **grid) {
*grid = newGrid(id);
}
Distribution* Environment::newDistribution(const std::string &id) {
DBG_MSG_V("Create a new distribution.", id);
// Create the new distribution
Distribution *dist = new Distribution(id);
// Attempt to insert the new distribution into the environment. Error out
// if the distribution already exists.
pair<DistributionMap_t::iterator, bool> ret;
ret = mDistributions.insert(make_pair(id, dist));
if(ret.second == false) {
error(ERR_ENV__DUPLICATE_ENTRY, id);
}
return (*ret.first).second;
}
void Environment::newObj(const std::string &id, Distribution **dist) {
*dist = newDistribution(id);
}
Schedule* Environment::newSchedule(const std::string &id) {
DBG_MSG_V("Create a new schedule.", id);
// Create the new schedule
Schedule *sched = new Schedule(id);
// Attempt to insert the new distribution into the environment. Error out
// if the distribution already exists.
pair<ScheduleMap_t::iterator, bool> ret;
ret = mSchedules.insert(make_pair(id, sched));
if(ret.second == false) {
error(ERR_ENV__DUPLICATE_ENTRY, id);
}
return (*ret.first).second;
}
void Environment::newObj(const std::string &id, Schedule **sched) {
*sched = newSchedule(id);
}
DataObject* Environment::newDataObject(const std::string &id) {
DBG_MSG_V("Create a new data object.", id);
// Create the new schedule
DataObject *data = new DataObject(id);
// Attempt to insert the new distribution into the environment. Error out
// if the distribution already exists.
pair<DataObjectMap_t::iterator, bool> ret;
ret = mDataObjects.insert(make_pair(id, data));
if(ret.second == false) {
error(ERR_ENV__DUPLICATE_ENTRY, id);
}
return (*ret.first).second;
}
void Environment::newObj(const std::string &id, DataObject **data) {
DBG_MSG_V("Create a new data object.", id);
*data = newDataObject(id);
}
Neighbor* Environment::getNeighbor(const string &id) {
return (*mNeighbors.find(id)).second;
}
Subgrid* Environment::getSubgrid(const string &id) {
Subgrid *sg = (*mSubgrids.find(id)).second;
return sg;
}
map<string, Neighbor*>::const_iterator Environment::neighborsBegin()
{
return mNeighbors.begin();
}
map<string, Neighbor*>::const_iterator Environment::neighborsEnd()
{
return mNeighbors.end();
}
Grid* Environment::getGrid(const string &id) {
return (*mGrids.find(id)).second;
}
Distribution* Environment::getDistribution(const string &id) {
return (*mDistributions.find(id)).second;
}
Schedule* Environment::getSchedule(const std::string &id) {
return (*mSchedules.find(id)).second;
}
DataObject* Environment::getDataObject(const std::string &id) {
return (*mDataObjects.find(id)).second;
}
void Environment::print(ostream &out) {
// have master rank print neighbors
if(isMasterRank()) {
if(mNeighbors.empty()) {
out << indt << "Environment contains no neighbors.";
}
for(NeighborMap_t::const_iterator i = mNeighbors.begin();
i != mNeighbors.end(); i++)
{
(i->second)->print(out);
}
}
// have master rank print subgrids
if(isMasterRank()) {
if(mSubgrids.empty()) {
out << indt << "Environment contains no subgrids.";
}
for(SubgridMap_t::const_iterator i = mSubgrids.begin();
i != mSubgrids.end(); i++)
{
(i->second)->print(out);
}
}
// have master rank print grids
if(isMasterRank()) {
if(mSubgrids.empty()) {
out << indt << "Environment contains no grids.";
}
for(GridMap_t::const_iterator i = mGrids.begin();
i != mGrids.end(); i++)
{
(i->second)->print(out);
}
}
// have master rank print distributions
if(isMasterRank()) {
if(mDistributions.empty()) {
out << indt << "Environment contains no distributions.";
}
for(DistributionMap_t::const_iterator i = mDistributions.begin();
i != mDistributions.end(); i++)
{
(i->second)->print(out);
}
}
// print schedules
if(isMasterRank()) {
if(mSchedules.empty()) {
out << indt << "Environment contains no schedules.";
}
}
for(ScheduleMap_t::const_iterator i = mSchedules.begin();
i != mSchedules.end(); i++)
{
(i->second)->print(out);
}
}
void Environment::printSimp(ostream &out) {
out << "<Environment>";
}
void Environment::output(ostream &out) {
BinIO::outEnvMap(out, mNeighbors);
BinIO::outEnvMap(out, mSubgrids);
BinIO::outEnvMap(out, mGrids);
BinIO::outEnvMap(out, mDistributions);
BinIO::outEnvMap(out, mSchedules);
}
void Environment::input(istream &in) {
BinIO::inEnvMap(in, mNeighbors);
BinIO::inEnvMap(in, mSubgrids);
BinIO::inEnvMap(in, mGrids);
BinIO::inEnvMap(in, mDistributions);
BinIO::inEnvMap(in, mSchedules);
}