OPAL (Object Oriented Parallel Accelerator Library)  2.2.0
OPAL
FromFile.h
Go to the documentation of this file.
1 #ifndef OPAL_SEQUENCE_H
2 #define OPAL_SEQUENCE_H
3 
6 
7 #include <string>
8 #include <fstream>
9 #include <sstream>
10 #include <iterator>
11 
12 #include <vector>
13 
21 class FromFile : public SamplingMethod
22 {
23 
24 public:
25 
26  FromFile(const std::string &filename, const std::string &dvarName, size_t modulo)
27  : n_m(0)
28  , counter_m(0)
29  , mod_m(modulo)
30  , filename_m(filename)
31  , dvarName_m(dvarName)
32  {
33  // we need to count the number of lines
34  std::ifstream in(filename_m);
35 
36  if ( !in.is_open() ) {
37  throw OpalException("FromFile()",
38  "Couldn't open file \"" + filename_m + "\".");
39  }
40 
41  int nLines = std::count(std::istreambuf_iterator<char>(in),
42  std::istreambuf_iterator<char>(), '\n');
43 
44  // make sure we do not count empty lines at end
45  in.seekg(-1, std::ios_base::end);
46  std::size_t pos = in.tellg();
47 
48  std::string line;
49  std::getline(in, line);
50 
51  while ( line.empty() ) {
52  --nLines;
53  --pos;
54  in.seekg(pos, std::ios_base::beg);
55  std::getline(in, line);
56  }
57 
58  if ( nLines < 0 )
59  throw OpalException("FromFile()", "Empty file \"" + filename_m + "\".");
60 
61  globalSize_m = nLines;
62 
63  in.close();
64  }
65 
66  void create(boost::shared_ptr<SampleIndividual>& ind, size_t i) {
67  ind->genes[i] = getNext();
68  }
69 
70  void allocate(const CmdArguments_t& args, const Comm::Bundle_t& comm) {
71  std::ifstream in(filename_m);
72 
73  if ( !in.is_open() ) {
74  throw OpalException("FromFile()",
75  "Couldn't open file \"" + filename_m + "\".");
76  }
77 
78  std::string header;
79  std::getline(in, header);
80  std::istringstream iss(header);
81  std::vector<std::string> dvars({std::istream_iterator<std::string>{iss},
82  std::istream_iterator<std::string>{}});
83  size_t j = 0;
84  for (const std::string str: dvars) {
85  if (str == dvarName_m) break;
86  ++ j;
87  }
88 
89  if (j == dvars.size()) {
90  throw OpalException("FromFile()",
91  "Couldn't find the dvar '" + dvarName_m + "' in the file '" + filename_m + "'");
92  }
93 
94  int nSamples = args->getArg<int>("nsamples", true);
95  int nMasters = args->getArg<int>("num-masters", true);
96 
97  int nLocSamples = nSamples / nMasters;
98  int rest = nSamples - nMasters * nLocSamples;
99 
100  int id = comm.island_id;
101  if ( id < rest )
102  nLocSamples++;
103 
104  int skip = 0;
105 
106  if ( rest == 0 )
107  skip = nLocSamples * id;
108  else {
109  if ( id < rest ) {
110  skip = nLocSamples * id;
111  } else {
112  skip = (nLocSamples + 1) * rest + (id - rest) * nLocSamples;
113  }
114  }
115 
116  while ( skip > 0 ) {
117  skip--;
119  }
120 
121  std::string line;
122  std::getline(in, line);
123  while (nLocSamples-- > 0) {
124  std::istringstream iss(line);
125  std::vector<std::string> numbers({std::istream_iterator<std::string>{iss},
126  std::istream_iterator<std::string>{}});
127 
128  chain_m.push_back(std::stod(numbers[j]));
129 
130  std::getline(in, line);
131  }
132  in.close();
133  }
134 
135  double getNext() {
136  double sample = chain_m[n_m];
138 
139  return sample;
140  }
141 
142  unsigned int getSize() const {
143  return globalSize_m;
144  }
145 
146 private:
147  std::vector<double> chain_m;
148  unsigned int n_m;
149  size_t counter_m;
150  size_t mod_m;
151  std::string filename_m;
152  std::string dvarName_m;
153 
154  unsigned int globalSize_m;
155 
157  ++ counter_m;
158  if (counter_m % mod_m == 0)
159  ++ n_m;
160  if (n_m >= chain_m.size())
161  n_m = 0;
162  }
163 };
164 
165 #endif
unsigned int globalSize_m
Definition: FromFile.h:154
int island_id
Definition: types.h:15
T::PETE_Expr_t::PETE_Return_t max(const PETE_Expr< T > &expr, NDIndex< D > &loc)
Definition: ReductionLoc.h:123
std::string filename_m
Definition: FromFile.h:151
The base class for all OPAL exceptions.
Definition: OpalException.h:28
boost::shared_ptr< CmdArguments > CmdArguments_t
Definition: CmdArguments.h:169
void allocate(const CmdArguments_t &args, const Comm::Bundle_t &comm)
Definition: FromFile.h:70
std::vector< double > chain_m
Definition: FromFile.h:147
size_t mod_m
Definition: FromFile.h:150
unsigned int n_m
Definition: FromFile.h:148
FromFile(const std::string &filename, const std::string &dvarName, size_t modulo)
Definition: FromFile.h:26
void incrementCounter()
Definition: FromFile.h:156
unsigned int getSize() const
Definition: FromFile.h:142
size_t counter_m
Definition: FromFile.h:149
double getNext()
Definition: FromFile.h:135
std::string dvarName_m
Definition: FromFile.h:152
void create(boost::shared_ptr< SampleIndividual > &ind, size_t i)
Definition: FromFile.h:66
bundles all communicators for a specific role/pid
Definition: types.h:14