AggregPacking
 All Classes Namespaces Files Functions Variables Typedefs Friends Macros
randomizer.hpp
Go to the documentation of this file.
1 /*
2 *
3 * AggregPacking : Generator of random aggregate packings in concrete
4 *
5 * version 0.1 (2014-08-22)
6 *
7 * Copyright (C) 2014 Jan Stransky
8 *
9 * Czech Technical University, Faculty of Civil Engineering,
10 * Department of Structural Mechanics, 166 29 Prague, Czech Republic
11 *
12 * AggregPacking is free software: you can redistribute it and/or modify it
13 * under the terms of the GNU Lesser General Public License as published by the
14 * Free Software Foundation, either version 3 of the License, or (at your
15 * option) any later version.
16 *
17 * AggregPacking is distributed in the hope that it will be useful, but WITHOUT
18 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
19 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
20 * for more details.
21 *
22 * You should have received a copy of the GNU Lesser General Public License
23 * along with this program. If not, see <http://www.gnu.org/licenses/>.
24 */
25 
31 #ifndef RANDOMIZER_HPP
32 #define RANDOMIZER_HPP
33 
35 #define NMINVALUES_DEFAULT 10000
36 
38 #include <vector>
39 #include <array>
40 #include <string>
41 using std::vector;
42 using std::array;
43 using std::string;
44 
45 #include "utils.hpp"
46 
47 #ifdef AGGREGPACKING_SERIALIZATION
48 #include <iostream>
49 #include <fstream>
50 using std::istream;
51 using std::ostream;
52 using std::ifstream;
53 using std::ofstream;
54 #endif
55 
56 #ifdef AGGREGPACKING_BOOST_PYTHON
57 #include <boost/python.hpp>
58 namespace bp = boost::python;
59 #endif
60 
61 namespace aggregpacking {
62 
63 
64 /**********************************************************************
65 * RANDOMIZER
66 **********************************************************************/
68 class Randomizer {
69  private:
71  static int seed;
72 
73  public:
75  static double random() { return (double)rand()/(double)RAND_MAX; }
76 
78 
80  static double randint(int m) { return (int)(random()*m); }
81 
83  static int getSeed() { return Randomizer::seed; }
84 
86 
88  static void setSeed(int s) { Randomizer::seed = s; srand(s); }
89 };
90 
91 
92 
93 /**********************************************************************
94 * AGGREG SIZE RANDOMIZER
95 **********************************************************************/
97 
100  public:
102  typedef vector<double> sizes_t;
103 
104  protected:
107 
109  void initSizes(unsigned int nMinValues);
110 
111 #ifdef AGGREGPACKING_SERIALIZATION
112  string fileName;
114 
116 
118  void saveSizes(ostream& os) const;
119 
121 
123  void loadSizes(istream& is);
124 
126 
128  static AggregSizeRandomizer* Load(istream& is);
129 
130 #endif
131  public:
132 #ifdef AGGREGPACKING_SERIALIZATION
135 
137 
139  AggregSizeRandomizer(const string& m) : fileName(m) {};
140 #else
142 #endif
143 
148  virtual double cdf(double size) const = 0;
149 
151  double take() const;
152 
154  const sizes_t& getSizes() { return sizes; }
155 
157  virtual double getMinSize() const { return sizes[sizes.size()-1]; }
158 
160  virtual double getMaxSize() const { return sizes[0]; }
161 
162 #ifdef AGGREGPACKING_SERIALIZATION
163  string getFileName() { return fileName; }
165 
167  virtual const string& getClassName() = 0;
168 
170 
172  virtual void save(const string& fName) const { saveObject(*this,fName,fileName); }
173 
175  virtual void save() const { save(string()); }
176 
178 
181  virtual bool load(const string& fName) { return loadObject(*this,fName,fileName); }
182 
184 
186  virtual bool load() { load(string()); }
187 
189  friend ostream& operator<<(ostream& f, const AggregSizeRandomizer& o);
190 
192  friend istream& operator>>(istream& f, AggregSizeRandomizer& o);
193 #endif
194 };
195 
196 
197 
198 
199 
200 
201 /**********************************************************************
202 * FULLER CURVE RANDOMIZER
203 **********************************************************************/
205 
208  protected:
210  double exponent;
211 
213  double minSize;
214 
216  double maxSize;
217 
218  public:
220 
221  FullerCurveRandomizer() : FullerCurveRandomizer(NMINVALUES_DEFAULT,0.5,.5e-3,16e-3) {}
222 
223 #ifdef AGGREGPACKING_SERIALIZATION
224 
230  FullerCurveRandomizer(int n, double e, double minSize, double maxSize) : FullerCurveRandomizer(n,e,minSize,maxSize,string()) {}
231 
233 
239  FullerCurveRandomizer(int n, double e, double minSize, double maxSize, const string& m) : AggregSizeRandomizer(m), exponent(e), minSize(minSize), maxSize(maxSize) {
240  initSizes(n);
241  }
242 #else
243  FullerCurveRandomizer(int n, double e, double minSize, double maxSize) : AggregSizeRandomizer(), exponent(e), minSize(minSize), maxSize(maxSize) {
244  initSizes(n);
245  }
246 #endif
247 
248  virtual double cdf(double size) const;
249 
251  double getExponent() { return exponent; }
252 
254  void setExponent(double v) { exponent = v; }
255 
256  virtual double getMinSize() const { return minSize; }
257 
258  virtual double getMaxSize() const { return maxSize; }
259 
260 #ifdef AGGREGPACKING_SERIALIZATION
261  const static string className;
263 
265  virtual const string& getClassName() { return FullerCurveRandomizer::className; }
266 
268  friend ostream& operator<<(ostream& f, const FullerCurveRandomizer& o);
269 
271  friend istream& operator>>(istream& f, FullerCurveRandomizer& o);
272 #endif
273 };
274 //**********************************************************************
275 
276 
277 
278 /**********************************************************************
279 * EXPERIMENTAL SIEVE CURVE RANDOMIZER
280 **********************************************************************/
282 
285  public:
287  typedef vector<array<double,2>> sieve_curve;
288 
289  protected:
292 
294  void check();
295 
297 
300  int findInterval(double size) const;
301 
302  public:
304  ExperimentalSieveCurveRandomizer() : ExperimentalSieveCurveRandomizer(NMINVALUES_DEFAULT,{{.5e-3,0.},{16e-3,1.}}) {};
305 
306 #ifdef AGGREGPACKING_SERIALIZATION
307 
312 
314 
318  ExperimentalSieveCurveRandomizer(int n, const sieve_curve& v, const string& m) : AggregSizeRandomizer(m), values(v) {
319  check();
320  initSizes(n);
321  }
322 #else
324  check();
325  initSizes(n);
326  }
327 #endif
328 
330  const sieve_curve& getValues() const { return values; }
331 
334 
336  void setValues(const sieve_curve& sc) { values = sc; check(); }
337 
338  virtual double cdf(double size) const;
339 
340  virtual double getMinSize() const { return values[0][0]; }
341 
342  virtual double getMaxSize() const { return values[values.size()-1][0]; }
343 
344 #ifdef AGGREGPACKING_SERIALIZATION
345  const static string className;
347 
349  virtual const string& getClassName() { return ExperimentalSieveCurveRandomizer::className; }
350 
352  friend ostream& operator<<(ostream& f, const ExperimentalSieveCurveRandomizer& o);
353 
355  friend istream& operator>>(istream& f, ExperimentalSieveCurveRandomizer& o);
356 #endif
357 };
358 //**********************************************************************
359 
360 
361 
362 /**********************************************************************
363 * PYTHON
364 **********************************************************************/
365 #ifdef AGGREGPACKING_BOOST_PYTHON
366 void py_randomizer();
369 #endif
370 
371 } // namespace
372 #endif
double take() const
Returns random size. A lot of random sizes should converge to the prescribed sieve curve...
Definition: randomizer.cpp:113
void setExponent(double v)
Setter for exponent.
Definition: randomizer.hpp:254
virtual double cdf(double size) const
Definition: randomizer.cpp:198
virtual double cdf(double size) const
Definition: randomizer.cpp:258
friend ostream & operator<<(ostream &f, const FullerCurveRandomizer &o)
FullerCurveRandomizer to ostream shift operator.
Definition: randomizer.cpp:206
int findInterval(double size) const
Finds an interval which size blongs to.
Definition: randomizer.cpp:249
ExperimentalSieveCurveRandomizer(int n, const sieve_curve &v, const string &m)
Constructor from nMinValues, sieve_curve and file name.
Definition: randomizer.hpp:318
void check()
Checks, if given sieve curve is correct. Throw error if not.
Definition: randomizer.cpp:230
string getFileName()
Getter for file name.
Definition: randomizer.hpp:164
virtual void save() const
Saves receiver into this->fileName.
Definition: randomizer.hpp:175
AggregSizeRandomizer(const string &m)
Constructor from file name.
Definition: randomizer.hpp:139
Random size generator for experimental sieve curve.
Definition: randomizer.hpp:284
File containing several auxiliary functions.
friend istream & operator>>(istream &f, FullerCurveRandomizer &o)
FullerCurveRandomizer from istream shift operator.
Definition: randomizer.cpp:213
Abstract class representing random size generator for given sieve curve.
Definition: randomizer.hpp:99
static int seed
Random seed.
Definition: randomizer.hpp:71
virtual bool load()
Loads receiver from this->fileName.
Definition: randomizer.hpp:186
virtual const string & getClassName()=0
Returns string representation of Sphere class name.
static AggregSizeRandomizer * Load(istream &is)
Create and return a new AggregSizeRandomizer from given istream.
Definition: randomizer.cpp:145
sieve_curve values
Sieve curve as a pair array (size,relative cumulative mass)
Definition: randomizer.hpp:291
virtual double getMaxSize() const
Returns maximum defined size.
Definition: randomizer.hpp:160
virtual const string & getClassName()
Returns string representation of FullerCurveRandomizer class name.
Definition: randomizer.hpp:265
double getExponent()
Getter for exponent.
Definition: randomizer.hpp:251
virtual double getMinSize() const
Returns minimum defined size.
Definition: randomizer.hpp:157
sizes_t sizes
Array of increasing sizes. Discrete representation of given sieve curve in terms of aggregate size...
Definition: randomizer.hpp:106
string fileName
File name for saving itself.
Definition: randomizer.hpp:113
void saveObject(const T &t, const string &fName, const string &memoizeDb)
Auxiliary template function for saving objects to files.
Definition: utils.hpp:142
const sieve_curve & getValues() const
Getter for values (returns by const reference)
Definition: randomizer.hpp:330
virtual void save(const string &fName) const
Saves receiver into specified file.
Definition: randomizer.hpp:172
virtual double getMinSize() const
Returns minimum defined size.
Definition: randomizer.hpp:340
virtual double getMaxSize() const
Returns maximum defined size.
Definition: randomizer.hpp:258
double exponent
Exponent of analytical expression.
Definition: randomizer.hpp:210
sieve_curve getValues()
Getter for values (returns by value)
Definition: randomizer.hpp:333
vector< double > sizes_t
typedef for sizes type
Definition: randomizer.hpp:102
static const string className
String representation of FullerCurveRandomizer class name.
Definition: randomizer.hpp:262
static void setSeed(int s)
Setter for seed.
Definition: randomizer.hpp:88
ExperimentalSieveCurveRandomizer()
Default constructor, sets values to ((0.5e-3,0.0),(16e-3,1.0))
Definition: randomizer.hpp:304
static int getSeed()
Getter for seed.
Definition: randomizer.hpp:83
virtual double getMaxSize() const
Returns maximum defined size.
Definition: randomizer.hpp:342
double minSize
User defined minimum aggregate size.
Definition: randomizer.hpp:213
ExperimentalSieveCurveRandomizer(int n, const sieve_curve &v)
Constructor from nMinValues and sieve_curve.
Definition: randomizer.hpp:311
double maxSize
Maximum size from the analytical expression.
Definition: randomizer.hpp:216
virtual double getMinSize() const
Returns minimum defined size.
Definition: randomizer.hpp:256
virtual double cdf(double size) const =0
friend istream & operator>>(istream &f, AggregSizeRandomizer &o)
AggregSizeRandomizer from istream shift operator.
Definition: randomizer.cpp:177
static double random()
Returns random number in the interval [0,1) (with uniform distribution)
Definition: randomizer.hpp:75
vector< array< double, 2 > > sieve_curve
typedef for sieve curve
Definition: randomizer.hpp:287
static double randint(int m)
Returns random integer in the interval [0,m-1] (with uniform istribution)
Definition: randomizer.hpp:80
void saveSizes(ostream &os) const
Save sizes to ostream.
Definition: randomizer.cpp:128
virtual const string & getClassName()
Returns string representation of ExperimentalSieveCurveRandomizer class name.
Definition: randomizer.hpp:349
bool loadObject(T &t, const string &fName, const string &memoizeDb)
Auxiliary template function for lading objects from files.
Definition: utils.hpp:151
void initSizes(unsigned int nMinValues)
According to given parameters, constructs sizes. It is numerically converted sieve curve from terms o...
Definition: randomizer.cpp:53
const sizes_t & getSizes()
Getter for sizes.
Definition: randomizer.hpp:154
friend ostream & operator<<(ostream &f, const ExperimentalSieveCurveRandomizer &o)
ExperimentalSieveCurveRandomizer to ostream shift operator.
Definition: randomizer.cpp:275
AggregSizeRandomizer()
Default constructor.
Definition: randomizer.hpp:134
Class representing most simple random numbers generator.
Definition: randomizer.hpp:68
virtual bool load(const string &fName)
Loads receiver from specified file.
Definition: randomizer.hpp:181
FullerCurveRandomizer()
Default constructor.
Definition: randomizer.hpp:221
Random size generator for Fuller curve.
Definition: randomizer.hpp:207
friend ostream & operator<<(ostream &f, const AggregSizeRandomizer &o)
AggregSizeRandomizer to ostream shift operator.
Definition: randomizer.cpp:162
friend istream & operator>>(istream &f, ExperimentalSieveCurveRandomizer &o)
ExperimentalSieveCurveRandomizer from istream shift operator.
Definition: randomizer.cpp:285
FullerCurveRandomizer(int n, double e, double minSize, double maxSize)
Constructor.
Definition: randomizer.hpp:230
void setValues(const sieve_curve &sc)
Setter for values.
Definition: randomizer.hpp:336
FullerCurveRandomizer(int n, double e, double minSize, double maxSize, const string &m)
Constructor.
Definition: randomizer.hpp:239
void loadSizes(istream &is)
Load sizes from istream.
Definition: randomizer.cpp:136
static const string className
String representation of ExperimentalSieveCurveRandomizer class name.
Definition: randomizer.hpp:346