13 #include <shogun/lib/external/SFMT/SFMT.h>
14 #include <shogun/lib/external/dSFMT/dSFMT.h>
18 using namespace shogun;
21 : m_seed((uint32_t)
CTime::get_curtime()*100),
63 m_A = 9.91256303526217e-3;
64 m_uint32ToU = 1.0 / (
float64_t)std::numeric_limits<uint32_t>::max();
66 m_x = SG_MALLOC(
float64_t, m_blockCount + 1);
68 m_xComp = SG_MALLOC(uint32_t, m_blockCount);
77 m_y[0] = GaussianPdfDenorm(m_R);
83 m_y[1] = m_y[0] + (m_A / m_x[1]);
86 for(
int i=2; i < m_blockCount; i++)
88 m_x[i] = GaussianPdfDenormInv(m_y[i-1]);
89 m_y[i] = m_y[i-1] + (m_A / m_x[i]);
93 m_x[m_blockCount] = 0.0;
96 m_A_div_y0 = m_A / m_y[0];
101 m_xComp[0] = (uint32_t)(((m_R * m_y[0]) / m_A) * (
float64_t)std::numeric_limits<uint32_t>::max());
103 for(int32_t i=1; i < m_blockCount-1; i++)
105 m_xComp[i] = (uint32_t)((m_x[i+1] / m_x[i]) * (
float64_t)std::numeric_limits<uint32_t>::max());
107 m_xComp[m_blockCount-1] = 0;
115 m_sfmt_32 = SG_MALLOC(sfmt_t, 1);
116 m_sfmt_64 = SG_MALLOC(sfmt_t, 1);
117 m_dsfmt = SG_MALLOC(dsfmt_t, 1);
123 return sfmt_genrand_uint32(m_sfmt_32);
128 return sfmt_genrand_uint64(m_sfmt_64);
133 #if defined(USE_ALIGNED_MEMORY) || defined(DARWIN)
134 if ((size >= sfmt_get_min_array_size32(m_sfmt_32)) && (size % 4) == 0)
136 sfmt_fill_array32(m_sfmt_32, array, size);
140 for (int32_t i=0; i < size; i++)
146 #if defined(USE_ALIGNED_MEMORY) || defined(DARWIN)
147 if ((size >= sfmt_get_min_array_size64(m_sfmt_64)) && (size % 2) == 0)
149 sfmt_fill_array64(m_sfmt_64, array, size);
153 for (int32_t i=0; i < size; i++)
159 #if defined(USE_ALIGNED_MEMORY) || defined(DARWIN)
160 if ((size >= dsfmt_get_min_array_size()) && (size % 2) == 0)
162 dsfmt_fill_array_open_close(m_dsfmt, array, size);
166 for (int32_t i=0; i < size; i++)
167 array[i] = dsfmt_genrand_open_close(m_dsfmt);
172 #if defined(USE_ALIGNED_MEMORY) || defined(DARWIN)
173 if ((size >= dsfmt_get_min_array_size()) && (size % 2) == 0)
175 dsfmt_fill_array_close_open(m_dsfmt, array, size);
179 for (int32_t i=0; i < size; i++)
180 array[i] = dsfmt_genrand_close_open(m_dsfmt);
185 #if defined(USE_ALIGNED_MEMORY) || defined(DARWIN)
186 if ((size >= dsfmt_get_min_array_size()) && (size % 2) == 0)
188 dsfmt_fill_array_open_open(m_dsfmt, array, size);
192 for (int32_t i=0; i < size; i++)
193 array[i] = dsfmt_genrand_open_open(m_dsfmt);
198 #if defined(USE_ALIGNED_MEMORY) || defined(DARWIN)
199 if ((size >= dsfmt_get_min_array_size()) && (size % 2) == 0)
201 dsfmt_fill_array_close1_open2(m_dsfmt, array, size);
205 for (int32_t i=0; i < size; i++)
206 array[i] = dsfmt_genrand_close1_open2(m_dsfmt);
211 return sfmt_genrand_real1(m_sfmt_32);
216 return dsfmt_genrand_open_open(m_dsfmt);
221 return dsfmt_genrand_close_open(m_dsfmt);
235 int32_t i = (int32_t)(u & 0x7F);
236 float64_t sign = ((u & 0x80) == 0) ? -1.0 : 1.0;
247 return u2 * m_uint32ToU * m_A_div_y0 * sign;
250 return sample_tail() * sign;
256 return u2 * m_uint32ToU * m_x[i] * sign;
264 if(m_y[i-1] + ((m_y[i] - m_y[i-1]) *
random_half_open()) < GaussianPdfDenorm(x) ) {
296 void CRandom::reinit(uint32_t seed)
300 sfmt_init_gen_rand(m_sfmt_32, m_seed);
301 sfmt_init_gen_rand(m_sfmt_64, m_seed);
302 dsfmt_init_gen_rand(m_dsfmt, m_seed);