xref: /aosp_15_r20/external/OpenCL-CTS/test_common/harness/mt19937.h (revision 6467f958c7de8070b317fc65bcb0f6472e388d82)
1*6467f958SSadaf Ebrahimi 
2*6467f958SSadaf Ebrahimi /*
3*6467f958SSadaf Ebrahimi  *  mt19937.h
4*6467f958SSadaf Ebrahimi  *
5*6467f958SSadaf Ebrahimi  *  Mersenne Twister.
6*6467f958SSadaf Ebrahimi  *
7*6467f958SSadaf Ebrahimi    A C-program for MT19937, with initialization improved 2002/1/26.
8*6467f958SSadaf Ebrahimi    Coded by Takuji Nishimura and Makoto Matsumoto.
9*6467f958SSadaf Ebrahimi 
10*6467f958SSadaf Ebrahimi    Before using, initialize the state by using init_genrand(seed)
11*6467f958SSadaf Ebrahimi    or init_by_array(init_key, key_length).
12*6467f958SSadaf Ebrahimi 
13*6467f958SSadaf Ebrahimi    Copyright (C) 1997 - 2002, Makoto Matsumoto and Takuji Nishimura,
14*6467f958SSadaf Ebrahimi    All rights reserved.
15*6467f958SSadaf Ebrahimi 
16*6467f958SSadaf Ebrahimi    Redistribution and use in source and binary forms, with or without
17*6467f958SSadaf Ebrahimi    modification, are permitted provided that the following conditions
18*6467f958SSadaf Ebrahimi    are met:
19*6467f958SSadaf Ebrahimi 
20*6467f958SSadaf Ebrahimi      1. Redistributions of source code must retain the above copyright
21*6467f958SSadaf Ebrahimi         notice, this list of conditions and the following disclaimer.
22*6467f958SSadaf Ebrahimi 
23*6467f958SSadaf Ebrahimi      2. Redistributions in binary form must reproduce the above copyright
24*6467f958SSadaf Ebrahimi         notice, this list of conditions and the following disclaimer in the
25*6467f958SSadaf Ebrahimi         documentation and/or other materials provided with the distribution.
26*6467f958SSadaf Ebrahimi 
27*6467f958SSadaf Ebrahimi      3. The names of its contributors may not be used to endorse or promote
28*6467f958SSadaf Ebrahimi         products derived from this software without specific prior written
29*6467f958SSadaf Ebrahimi         permission.
30*6467f958SSadaf Ebrahimi 
31*6467f958SSadaf Ebrahimi    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
32*6467f958SSadaf Ebrahimi    "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
33*6467f958SSadaf Ebrahimi    LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
34*6467f958SSadaf Ebrahimi    A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER
35*6467f958SSadaf Ebrahimi  OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
36*6467f958SSadaf Ebrahimi    EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
37*6467f958SSadaf Ebrahimi    PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
38*6467f958SSadaf Ebrahimi    PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
39*6467f958SSadaf Ebrahimi    LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
40*6467f958SSadaf Ebrahimi    NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
41*6467f958SSadaf Ebrahimi    SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
42*6467f958SSadaf Ebrahimi 
43*6467f958SSadaf Ebrahimi 
44*6467f958SSadaf Ebrahimi    Any feedback is very welcome.
45*6467f958SSadaf Ebrahimi    http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/emt.html
46*6467f958SSadaf Ebrahimi    email: m-mat @ math.sci.hiroshima-u.ac.jp (remove space)
47*6467f958SSadaf Ebrahimi  */
48*6467f958SSadaf Ebrahimi 
49*6467f958SSadaf Ebrahimi #ifndef MT19937_H
50*6467f958SSadaf Ebrahimi #define MT19937_H 1
51*6467f958SSadaf Ebrahimi 
52*6467f958SSadaf Ebrahimi #if defined(__APPLE__)
53*6467f958SSadaf Ebrahimi #include <OpenCL/cl_platform.h>
54*6467f958SSadaf Ebrahimi #else
55*6467f958SSadaf Ebrahimi #include <CL/cl_platform.h>
56*6467f958SSadaf Ebrahimi #endif
57*6467f958SSadaf Ebrahimi 
58*6467f958SSadaf Ebrahimi /*
59*6467f958SSadaf Ebrahimi  *      Interfaces here have been modified from original sources so that they
60*6467f958SSadaf Ebrahimi  *      are safe to call reentrantly, so long as a different MTdata is used
61*6467f958SSadaf Ebrahimi  *      on each thread.
62*6467f958SSadaf Ebrahimi  */
63*6467f958SSadaf Ebrahimi 
64*6467f958SSadaf Ebrahimi typedef struct _MTdata *MTdata;
65*6467f958SSadaf Ebrahimi 
66*6467f958SSadaf Ebrahimi /* Create the random number generator with seed */
67*6467f958SSadaf Ebrahimi MTdata init_genrand(cl_uint /*seed*/);
68*6467f958SSadaf Ebrahimi 
69*6467f958SSadaf Ebrahimi /* release memory used by a MTdata private data */
70*6467f958SSadaf Ebrahimi void free_mtdata(MTdata /*data*/);
71*6467f958SSadaf Ebrahimi 
72*6467f958SSadaf Ebrahimi /* generates a random number on [0,0xffffffff]-interval */
73*6467f958SSadaf Ebrahimi cl_uint genrand_int32(MTdata /*data*/);
74*6467f958SSadaf Ebrahimi 
75*6467f958SSadaf Ebrahimi /* generates a random number on [0,0xffffffffffffffffULL]-interval */
76*6467f958SSadaf Ebrahimi cl_ulong genrand_int64(MTdata /*data*/);
77*6467f958SSadaf Ebrahimi 
78*6467f958SSadaf Ebrahimi /* generates a random number on [0,1]-real-interval */
79*6467f958SSadaf Ebrahimi double genrand_real1(MTdata /*data*/);
80*6467f958SSadaf Ebrahimi 
81*6467f958SSadaf Ebrahimi /* generates a random number on [0,1)-real-interval */
82*6467f958SSadaf Ebrahimi double genrand_real2(MTdata /*data*/);
83*6467f958SSadaf Ebrahimi 
84*6467f958SSadaf Ebrahimi /* generates a random number on (0,1)-real-interval */
85*6467f958SSadaf Ebrahimi double genrand_real3(MTdata /*data*/);
86*6467f958SSadaf Ebrahimi 
87*6467f958SSadaf Ebrahimi /* generates a random number on [0,1) with 53-bit resolution*/
88*6467f958SSadaf Ebrahimi double genrand_res53(MTdata /*data*/);
89*6467f958SSadaf Ebrahimi 
90*6467f958SSadaf Ebrahimi 
91*6467f958SSadaf Ebrahimi #ifdef __cplusplus
92*6467f958SSadaf Ebrahimi 
93*6467f958SSadaf Ebrahimi /* generates a random boolean */
94*6467f958SSadaf Ebrahimi bool genrand_bool(MTdata /*data*/);
95*6467f958SSadaf Ebrahimi 
96*6467f958SSadaf Ebrahimi #include <cassert>
97*6467f958SSadaf Ebrahimi #include <utility>
98*6467f958SSadaf Ebrahimi 
99*6467f958SSadaf Ebrahimi class MTdataHolder {
100*6467f958SSadaf Ebrahimi public:
101*6467f958SSadaf Ebrahimi     MTdataHolder() = default;
MTdataHolder(cl_uint seed)102*6467f958SSadaf Ebrahimi     explicit MTdataHolder(cl_uint seed)
103*6467f958SSadaf Ebrahimi     {
104*6467f958SSadaf Ebrahimi         m_mtdata = init_genrand(seed);
105*6467f958SSadaf Ebrahimi         assert(m_mtdata != nullptr);
106*6467f958SSadaf Ebrahimi     }
107*6467f958SSadaf Ebrahimi 
108*6467f958SSadaf Ebrahimi     // Forbid copy.
109*6467f958SSadaf Ebrahimi     MTdataHolder(const MTdataHolder&) = delete;
110*6467f958SSadaf Ebrahimi     MTdataHolder& operator=(const MTdataHolder&) = delete;
111*6467f958SSadaf Ebrahimi 
112*6467f958SSadaf Ebrahimi     // Support move semantics.
MTdataHolder(MTdataHolder && h)113*6467f958SSadaf Ebrahimi     MTdataHolder(MTdataHolder&& h) { std::swap(m_mtdata, h.m_mtdata); }
114*6467f958SSadaf Ebrahimi     MTdataHolder& operator=(MTdataHolder&& h)
115*6467f958SSadaf Ebrahimi     {
116*6467f958SSadaf Ebrahimi         std::swap(m_mtdata, h.m_mtdata);
117*6467f958SSadaf Ebrahimi         return *this;
118*6467f958SSadaf Ebrahimi     }
119*6467f958SSadaf Ebrahimi 
~MTdataHolder()120*6467f958SSadaf Ebrahimi     ~MTdataHolder()
121*6467f958SSadaf Ebrahimi     {
122*6467f958SSadaf Ebrahimi         if (m_mtdata) free_mtdata(m_mtdata);
123*6467f958SSadaf Ebrahimi     }
124*6467f958SSadaf Ebrahimi 
MTdata()125*6467f958SSadaf Ebrahimi     operator MTdata() const
126*6467f958SSadaf Ebrahimi     {
127*6467f958SSadaf Ebrahimi         assert(m_mtdata && "Object wasn't initialised");
128*6467f958SSadaf Ebrahimi         return m_mtdata;
129*6467f958SSadaf Ebrahimi     }
130*6467f958SSadaf Ebrahimi 
131*6467f958SSadaf Ebrahimi private:
132*6467f958SSadaf Ebrahimi     MTdata m_mtdata = nullptr;
133*6467f958SSadaf Ebrahimi };
134*6467f958SSadaf Ebrahimi 
135*6467f958SSadaf Ebrahimi #endif // #ifdef __cplusplus
136*6467f958SSadaf Ebrahimi 
137*6467f958SSadaf Ebrahimi #endif /* MT19937_H */
138