openPMD-api
RandomDatasetFiller.hpp
1 /* Copyright 2018-2020 Franz Poeschel
2  *
3  * This file is part of openPMD-api.
4  *
5  * openPMD-api is free software: you can redistribute it and/or modify
6  * it under the terms of of either the GNU General Public License or
7  * the GNU Lesser General Public License as published by
8  * the Free Software Foundation, either version 3 of the License, or
9  * (at your option) any later version.
10  *
11  * openPMD-api is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  * GNU General Public License and the GNU Lesser General Public License
15  * for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * and the GNU Lesser General Public License along with openPMD-api.
19  * If not, see <http://www.gnu.org/licenses/>.
20  */
21 
22 #pragma once
23 
24 
25 #include "openPMD/benchmark/mpi/DatasetFiller.hpp"
26 #include "openPMD/Dataset.hpp"
27 #include <random>
28 #include <memory>
29 
30 
31 namespace openPMD
32 {
33  template<
34  typename Distr,
35  typename T = typename Distr::result_type
36  >
38  public DatasetFiller< T >
39  {
40 
41  private:
42  Distr distr;
43  std::default_random_engine engine;
44  std::shared_ptr< T > buffered;
45  public:
46  using resultType = T;
47 
48 
49  explicit RandomDatasetFiller(
50  Distr distribution,
51  Extent::value_type numOfItems = 0
52  ) :
53  DatasetFiller< T >( numOfItems ),
54  distr( distribution )
55  {}
56 
57 
58  std::shared_ptr< T > produceData( ) override
59  {
60  if( this->buffered )
61  {
62  return buffered;
63  }
64  auto res = std::shared_ptr< T > {
65  new T[this->m_numberOfItems],
66  []( T * d )
67  {
68  delete[] d;
69  }
70  };
71  auto ptr = res.get( );
72  for( typename Extent::value_type i = 0;
73  i < this->m_numberOfItems;
74  i++ )
75  {
76  ptr[i] = this->distr( this->engine );
77  }
78  return res;
79  }
80 
81 
93  template< typename X = Distr >
94  static RandomDatasetFiller<
95  X,
96  T
98  Extent::value_type numberOfItems,
99  typename X::result_type lower,
100  typename X::result_type upper
101  )
102  {
104  X(
105  lower,
106  upper
107  ),
108  numberOfItems
109  );
110  }
111 
112 
113  void setSeed( std::default_random_engine::result_type seed )
114  {
115  this->engine = std::default_random_engine( seed );
116  }
117 
118 
119  void randomSeed( )
120  {
121  std::random_device rd;
122  this->engine = std::default_random_engine( rd( ) );
123  }
124 
125 
130  void bufferMode( )
131  {
132  if( !this->buffered )
133  {
134  this->buffered = this->produceData( );
135  }
136  }
137 
138 
139  void setNumberOfItems( Extent::value_type numItems ) override
140  {
141  this->m_numberOfItems = numItems;
142  if( this->buffered )
143  {
144  this->buffered
145  .reset( );
146  this->buffered = this->produceData( );
147  }
148  }
149 
150  };
151 
152 }
An abstract class to create one iteration of data per thread.
Definition: DatasetFiller.hpp:37
Definition: RandomDatasetFiller.hpp:37
static RandomDatasetFiller< X, T > makeRandomDatasetFiller(Extent::value_type numberOfItems, typename X::result_type lower, typename X::result_type upper)
Definition: RandomDatasetFiller.hpp:97
void setNumberOfItems(Extent::value_type numItems) override
Set number of items to be produced.
Definition: RandomDatasetFiller.hpp:139
Public definitions of openPMD-api.
Definition: Date.cpp:29
void bufferMode()
Activate buffer mode.
Definition: RandomDatasetFiller.hpp:130
std::shared_ptr< T > produceData() override
Create a shared pointer of m_numberOfItems items of type T.
Definition: RandomDatasetFiller.hpp:58