OoOJoin  0.0.1
The next generation of out-of-order join operator
MicroDataSet.hpp
1 
2 //Copyright (C) 2022 by the IntelliStream team (https://github.com/intellistream)
3 // Created by tony on 03/03/22.
4 //
5 
6 #ifndef _UTILS_MICRODATASET_H_
7 #define _UTILS_MICRODATASET_H_
8 #pragma once
9 #include <stdint.h>
10 #include <vector>
11 #include <stddef.h>
12 #include <stdlib.h>
13 #include <time.h>
14 #include <random>
15 #include <cmath>
16 #include <iostream>
17 using namespace std;
18 namespace INTELLI {
45 class MicroDataSet {
46  private:
47  std::random_device rd;
48  std::default_random_engine e1;
49  bool hasSeed = false;
50  uint64_t seed;
51  //uint64_t runTime=0;
52  public:
57 
58  }
63  MicroDataSet(uint64_t _seed) {
64  seed = _seed;
65  hasSeed = true;
66  }
71  void setSeed(uint64_t _seed) {
72  seed = _seed;
73  hasSeed = true;
74  }
75  ~MicroDataSet() {}
86  template<class dType=uint32_t>
87  vector<dType> genIncrementalAlphabet(size_t len) {
88  vector<dType> ru(len);
89  /* populate */
90  for (size_t i = 0; i < len; i++) {
91  ru[i] = i + 1; /* don't let 0 be in the alphabet */
92  }
93  return ru;
94  }
103  template<class tsType=size_t>
104  vector<tsType> genZipfInt(size_t len, tsType maxV, double fac) {
105  vector<tsType> ret(len);
106  vector<tsType> alphabet = genIncrementalAlphabet<tsType>(maxV);
107  std::mt19937_64 gen;
108  if (!hasSeed) {
109  gen = std::mt19937_64(rd()); // 以 rd() 播种的标准 mersenne_twister_engine
110  } else {
111  gen = std::mt19937_64(seed);
112  seed++;
113  }
114 
115  std::uniform_real_distribution<> dis(0, 1);
116  vector<double> lut = genZipfLut<double>(maxV, fac);
117  for (size_t i = 0; i < len; i++) {
118  /* take random number */
119  double r = dis(gen);
120  /* binary search in lookup table to determine item */
121  size_t left = 0;
122  size_t right = maxV - 1;
123  size_t m; /* middle between left and right */
124  size_t pos; /* position to take */
125 
126  if (lut[0] >= r)
127  pos = 0;
128  else {
129  while (right - left > 1) {
130  m = (left + right) / 2;
131 
132  if (lut[m] < r)
133  left = m;
134  else
135  right = m;
136  }
137 
138  pos = right;
139  }
140  ret[i] = alphabet[pos];
141  }
142  return ret;
143  }
158  template<class tsType=uint32_t, class genType=std::mt19937>
159  vector<tsType> genRandInt(size_t len, tsType maxV, tsType minV = 0) {
160  genType gen;
161  if (!hasSeed) {
162  gen = genType(rd());
163  } else {
164  seed++;
165  gen = genType(seed);
166  }
167  std::uniform_int_distribution<> dis(minV, maxV);
168  vector<tsType> ret(len);
169  for (size_t i = 0; i < len; i++) {
170  ret[i] = (tsType) dis(gen);
171  }
172  return ret;
173  }
181  template<class dType=double>
182  vector<dType> genZipfLut(size_t len, dType fac) {
183  dType scaling_factor;
184  dType sum;
185  vector<dType> lut(len);
192  scaling_factor = 0.0;
193  for (size_t i = 1; i <= len; i++) { scaling_factor += 1.0 / pow(i, fac); }
197  sum = 0.0;
198  for (size_t i = 1; i <= len; i++) {
199  sum += 1.0 / std::pow(i, fac);
200  lut[i - 1] = sum / scaling_factor;
201  }
202  return lut;
203  }
204 
221  template<class tsType=size_t>
222  vector<tsType> genSmoothTimeStamp(size_t len, size_t step, size_t interval) {
223  vector<tsType> ret(len);
224  tsType ts = 0;
225  for (size_t i = 0; i < len; i++) {
226  ret[i] = ts;
227  if (i % (step) == 0) {
228  ts += interval;
229  }
230 
231  }
232  return ret;
233  }
234 
244  template<class tsType=size_t>
245  vector<tsType> genZipfTimeStamp(size_t len, tsType maxTime, double fac) {
246  vector<tsType> ret = genZipfInt<tsType>(len, maxTime, fac);
247  std::sort(ret.begin(), ret.end()); //just incremental re-arrange
248  return ret;
249  }
253 };
254 }
259 #endif //ALIANCEDB_INCLUDE_UTILS_MICRODATASET_H_
The all-in-one class for the Micro dataset.
Definition: MicroDataSet.hpp:45
uint64_t tsType
Definition: Tuples.h:20
MicroDataSet(uint64_t _seed)
construction with seed
Definition: MicroDataSet.hpp:63
void setSeed(uint64_t _seed)
construction with seed
Definition: MicroDataSet.hpp:71
MicroDataSet()
default construction, with auto random generator
Definition: MicroDataSet.hpp:56
vector< tsType > genZipfInt(size_t len, tsType maxV, double fac)
The function to generate a vector of integers which has zipf distribution.
Definition: MicroDataSet.hpp:104
vector< tsType > genRandInt(size_t len, tsType maxV, tsType minV=0)
generate the vector of random integer
Definition: MicroDataSet.hpp:159
vector< dType > genZipfLut(size_t len, dType fac)
To generate the zipf Lut.
Definition: MicroDataSet.hpp:182
vector< dType > genIncrementalAlphabet(size_t len)
To generate incremental alphabet, starting from 0 and end at len.
Definition: MicroDataSet.hpp:87
vector< tsType > genSmoothTimeStamp(size_t len, size_t step, size_t interval)
The function to generate a vector of timestamp which grows smoothly.
Definition: MicroDataSet.hpp:222
vector< tsType > genZipfTimeStamp(size_t len, tsType maxTime, double fac)
The function to generate a vector of timestamp which has zipf distribution.
Definition: MicroDataSet.hpp:245