+ T values_[MaxSize];
+ std::size_t size_ = 0;
+};
+
+
+/// sigmoid(t, x0, y0, C, P, Q) implements a sigmoid-like function using only integers,
+/// with the following properties:
+///
+/// - sigmoid is centered in (x0, y0)
+/// - sigmoid has amplitude [-P/Q , P/Q] instead of [-1 , +1]
+/// - limit is (y0 - P/Q) when t tends to -infinity
+/// - limit is (y0 + P/Q) when t tends to +infinity
+/// - the slope can be adjusted using C > 0, smaller C giving a steeper sigmoid
+/// - the slope of the sigmoid when t = x0 is P/(Q*C)
+/// - sigmoid is increasing with t when P > 0 and Q > 0
+/// - to get a decreasing sigmoid, change sign of P
+/// - mean value of the sigmoid is y0
+///
+/// Use <https://www.desmos.com/calculator/jhh83sqq92> to draw the sigmoid
+
+inline int64_t sigmoid(int64_t t, int64_t x0,
+ int64_t y0,
+ int64_t C,
+ int64_t P,
+ int64_t Q)
+{
+ assert(C > 0);
+ assert(Q != 0);
+ return y0 + P * (t-x0) / (Q * (std::abs(t-x0) + C)) ;
+}
+
+
+/// xorshift64star Pseudo-Random Number Generator
+/// This class is based on original code written and dedicated
+/// to the public domain by Sebastiano Vigna (2014).
+/// It has the following characteristics:
+///
+/// - Outputs 64-bit numbers
+/// - Passes Dieharder and SmallCrush test batteries
+/// - Does not require warm-up, no zeroland to escape
+/// - Internal state is a single 64-bit integer
+/// - Period is 2^64 - 1
+/// - Speed: 1.60 ns/call (Core i7 @3.40GHz)
+///
+/// For further analysis see
+/// <http://vigna.di.unimi.it/ftp/papers/xorshift.pdf>
+
+class PRNG {
+
+ uint64_t s;
+
+ uint64_t rand64() {
+
+ s ^= s >> 12, s ^= s << 25, s ^= s >> 27;
+ return s * 2685821657736338717LL;
+ }
+
+public:
+ PRNG(uint64_t seed) : s(seed) { assert(seed); }
+
+ template<typename T> T rand() { return T(rand64()); }
+
+ /// Special generator used to fast init magic numbers.
+ /// Output values only have 1/8th of their bits set on average.
+ template<typename T> T sparse_rand()
+ { return T(rand64() & rand64() & rand64()); }