Reformat the source files.

This commit is contained in:
Alexander Suvorov
2017-04-26 11:41:07 +02:00
parent 41d7b962b0
commit 7c02055d05
197 changed files with 66650 additions and 70743 deletions
+253 -289
View File
@@ -9,240 +9,217 @@
#include "crn_rand.h"
#include "crn_hash.h"
#define znew (z=36969*(z&65535)+(z>>16))
#define wnew (w=18000*(w&65535)+(w>>16))
#define MWC ((znew<<16)+wnew )
#define SHR3 (jsr^=(jsr<<17), jsr^=(jsr>>13), jsr^=(jsr<<5))
#define CONG (jcong=69069*jcong+1234567)
#define FIB ((b=a+b),(a=b-a))
#define KISS ((MWC^CONG)+SHR3)
#define LFIB4 (c++,t[c]=t[c]+t[UC(c+58)]+t[UC(c+119)]+t[UC(c+178)])
#define SWB (c++,bro=(x<y),t[c]=(x=t[UC(c+34)])-(y=t[UC(c+19)]+bro))
#define UNI (KISS*2.328306e-10)
#define VNI ((long) KISS)*4.656613e-10
#define UC (unsigned char) /*a cast operation*/
#define znew (z = 36969 * (z & 65535) + (z >> 16))
#define wnew (w = 18000 * (w & 65535) + (w >> 16))
#define MWC ((znew << 16) + wnew)
#define SHR3 (jsr ^= (jsr << 17), jsr ^= (jsr >> 13), jsr ^= (jsr << 5))
#define CONG (jcong = 69069 * jcong + 1234567)
#define FIB ((b = a + b), (a = b - a))
#define KISS ((MWC ^ CONG) + SHR3)
#define LFIB4 (c++, t[c] = t[c] + t[UC(c + 58)] + t[UC(c + 119)] + t[UC(c + 178)])
#define SWB (c++, bro = (x < y), t[c] = (x = t[UC(c + 34)]) - (y = t[UC(c + 19)] + bro))
#define UNI (KISS * 2.328306e-10)
#define VNI ((long)KISS) * 4.656613e-10
#define UC (unsigned char)/*a cast operation*/
//#define rot(x,k) (((x)<<(k))|((x)>>(32-(k))))
#define rot(x,k) CRNLIB_ROTATE_LEFT(x,k)
#define rot(x, k) CRNLIB_ROTATE_LEFT(x, k)
namespace crnlib
{
static const double cNorm = 1.0 / (double)0x100000000ULL;
namespace crnlib {
static const double cNorm = 1.0 / (double)0x100000000ULL;
kiss99::kiss99()
{
x = 123456789;
y = 362436000;
z = 521288629;
c = 7654321;
}
kiss99::kiss99() {
x = 123456789;
y = 362436000;
z = 521288629;
c = 7654321;
}
void kiss99::seed(uint32 i, uint32 j, uint32 k)
{
x = i;
y = j;
z = k;
c = 7654321;
}
void kiss99::seed(uint32 i, uint32 j, uint32 k) {
x = i;
y = j;
z = k;
c = 7654321;
}
inline uint32 kiss99::next()
{
x = 69069*x+12345;
inline uint32 kiss99::next() {
x = 69069 * x + 12345;
y ^= (y<<13);
y ^= (y>>17);
y ^= (y<<5);
y ^= (y << 13);
y ^= (y >> 17);
y ^= (y << 5);
uint64 t = c;
t += (698769069ULL*z);
c = static_cast<uint32>(t >> 32);
z = static_cast<uint32>(t);
uint64 t = c;
t += (698769069ULL * z);
c = static_cast<uint32>(t >> 32);
z = static_cast<uint32>(t);
return (x+y+z);
}
return (x + y + z);
}
inline uint32 ranctx::next()
{
uint32 e = a - rot(b, 27);
a = b ^ rot(c, 17);
b = c + d;
c = d + e;
d = e + a;
return d;
}
inline uint32 ranctx::next() {
uint32 e = a - rot(b, 27);
a = b ^ rot(c, 17);
b = c + d;
c = d + e;
d = e + a;
return d;
}
void ranctx::seed(uint32 seed)
{
a = 0xf1ea5eed, b = c = d = seed;
for (uint32 i=0; i<20; ++i)
next();
}
void ranctx::seed(uint32 seed) {
a = 0xf1ea5eed, b = c = d = seed;
for (uint32 i = 0; i < 20; ++i)
next();
}
well512::well512()
{
seed(0xDEADBE3F);
}
well512::well512() {
seed(0xDEADBE3F);
}
void well512::seed(uint32 seed[well512::cStateSize])
{
memcpy(m_state, seed, sizeof(m_state));
m_index = 0;
}
void well512::seed(uint32 seed[well512::cStateSize]) {
memcpy(m_state, seed, sizeof(m_state));
m_index = 0;
}
void well512::seed(uint32 seed)
{
uint32 jsr = utils::swap32(seed) ^ 0xAAC29377;
void well512::seed(uint32 seed) {
uint32 jsr = utils::swap32(seed) ^ 0xAAC29377;
for (uint i = 0; i < cStateSize; i++)
{
SHR3;
seed = bitmix32c(seed);
for (uint i = 0; i < cStateSize; i++) {
SHR3;
seed = bitmix32c(seed);
m_state[i] = seed ^ jsr;
}
m_index = 0;
}
m_state[i] = seed ^ jsr;
}
m_index = 0;
}
void well512::seed(uint32 seed1, uint32 seed2, uint32 seed3)
{
uint32 jsr = seed2;
uint32 jcong = seed3;
void well512::seed(uint32 seed1, uint32 seed2, uint32 seed3) {
uint32 jsr = seed2;
uint32 jcong = seed3;
for (uint i = 0; i < cStateSize; i++)
{
SHR3;
seed1 = bitmix32c(seed1);
CONG;
for (uint i = 0; i < cStateSize; i++) {
SHR3;
seed1 = bitmix32c(seed1);
CONG;
m_state[i] = seed1 ^ jsr ^ jcong;
}
m_index = 0;
}
m_state[i] = seed1 ^ jsr ^ jcong;
}
m_index = 0;
}
inline uint32 well512::next()
{
uint32 a, b, c, d;
a = m_state[m_index];
c = m_state[(m_index+13)&15];
b = a^c^(a<<16)^(c<<15);
c = m_state[(m_index+9)&15];
c ^= (c>>11);
a = m_state[m_index] = b^c;
d = a^((a<<5)&0xDA442D20UL);
m_index = (m_index + 15)&15;
a = m_state[m_index];
m_state[m_index] = a^b^d^(a<<2)^(b<<18)^(c<<28);
return m_state[m_index];
}
inline uint32 well512::next() {
uint32 a, b, c, d;
a = m_state[m_index];
c = m_state[(m_index + 13) & 15];
b = a ^ c ^ (a << 16) ^ (c << 15);
c = m_state[(m_index + 9) & 15];
c ^= (c >> 11);
a = m_state[m_index] = b ^ c;
d = a ^ ((a << 5) & 0xDA442D20UL);
m_index = (m_index + 15) & 15;
a = m_state[m_index];
m_state[m_index] = a ^ b ^ d ^ (a << 2) ^ (b << 18) ^ (c << 28);
return m_state[m_index];
}
random::random()
{
seed(12345,65435,34221);
}
random::random() {
seed(12345, 65435, 34221);
}
random::random(uint32 i)
{
seed(i);
}
random::random(uint32 i) {
seed(i);
}
void random::seed(uint32 i1, uint32 i2, uint32 i3)
{
m_ranctx.seed(i1^i2^i3);
void random::seed(uint32 i1, uint32 i2, uint32 i3) {
m_ranctx.seed(i1 ^ i2 ^ i3);
m_kiss99.seed(i1, i2, i3);
m_kiss99.seed(i1, i2, i3);
m_well512.seed(i1, i2, i3);
m_well512.seed(i1, i2, i3);
for (uint i = 0; i < 100; i++)
urand32();
}
for (uint i = 0; i < 100; i++)
urand32();
}
void random::seed(uint32 i)
{
uint32 jsr = i;
SHR3; SHR3;
uint32 jcong = utils::swap32(~jsr);
CONG; CONG;
uint32 i1 = SHR3 ^ CONG;
uint32 i2 = SHR3 ^ CONG;
uint32 i3 = SHR3 + CONG;
seed(i1, i2, i3);
}
void random::seed(uint32 i) {
uint32 jsr = i;
SHR3;
SHR3;
uint32 jcong = utils::swap32(~jsr);
CONG;
CONG;
uint32 i1 = SHR3 ^ CONG;
uint32 i2 = SHR3 ^ CONG;
uint32 i3 = SHR3 + CONG;
seed(i1, i2, i3);
}
uint32 random::urand32()
{
return m_kiss99.next() ^ (m_ranctx.next() + m_well512.next());
}
uint32 random::urand32() {
return m_kiss99.next() ^ (m_ranctx.next() + m_well512.next());
}
uint64 random::urand64()
{
uint64 result = urand32();
result <<= 32ULL;
result |= urand32();
return result;
}
uint32 random::fast_urand32()
{
return m_well512.next();
}
uint64 random::urand64() {
uint64 result = urand32();
result <<= 32ULL;
result |= urand32();
return result;
}
uint32 random::fast_urand32() {
return m_well512.next();
}
uint32 random::bit()
{
uint32 k = urand32();
return (k ^ (k >> 6) ^ (k >> 10) ^ (k >> 30)) & 1;
}
uint32 random::bit() {
uint32 k = urand32();
return (k ^ (k >> 6) ^ (k >> 10) ^ (k >> 30)) & 1;
}
double random::drand(double l, double h)
{
CRNLIB_ASSERT(l <= h);
if (l >= h)
return l;
double random::drand(double l, double h) {
CRNLIB_ASSERT(l <= h);
if (l >= h)
return l;
return math::clamp(l + (h - l) * (urand32() * cNorm), l, h);
}
return math::clamp(l + (h - l) * (urand32() * cNorm), l, h);
}
float random::frand(float l, float h)
{
CRNLIB_ASSERT(l <= h);
if (l >= h)
return l;
float random::frand(float l, float h) {
CRNLIB_ASSERT(l <= h);
if (l >= h)
return l;
float r = static_cast<float>(l + (h - l) * (urand32() * cNorm));
float r = static_cast<float>(l + (h - l) * (urand32() * cNorm));
return math::clamp<float>(r, l, h);
}
int random::irand(int l, int h)
{
CRNLIB_ASSERT(l < h);
if (l >= h)
return l;
return math::clamp<float>(r, l, h);
}
uint32 range = static_cast<uint32>(h - l);
int random::irand(int l, int h) {
CRNLIB_ASSERT(l < h);
if (l >= h)
return l;
uint32 rnd = urand32();
uint32 range = static_cast<uint32>(h - l);
uint32 rnd = urand32();
#if defined(_M_IX86) && defined(_MSC_VER)
//uint32 rnd_range = static_cast<uint32>(__emulu(range, rnd) >> 32U);
uint32 x[2];
*reinterpret_cast<uint64*>(x) = __emulu(range, rnd);
uint32 rnd_range = x[1];
//uint32 rnd_range = static_cast<uint32>(__emulu(range, rnd) >> 32U);
uint32 x[2];
*reinterpret_cast<uint64*>(x) = __emulu(range, rnd);
uint32 rnd_range = x[1];
#else
uint32 rnd_range = static_cast<uint32>((((uint64)range) * ((uint64)rnd)) >> 32U);
uint32 rnd_range = static_cast<uint32>((((uint64)range) * ((uint64)rnd)) >> 32U);
#endif
int result = l + rnd_range;
CRNLIB_ASSERT((result >= l) && (result < h));
return result;
}
int result = l + rnd_range;
CRNLIB_ASSERT((result >= l) && (result < h));
return result;
}
int random::irand_inclusive(int l, int h)
{
CRNLIB_ASSERT(h < cINT32_MAX);
return irand(l, h + 1);
}
int random::irand_inclusive(int l, int h) {
CRNLIB_ASSERT(h < cINT32_MAX);
return irand(l, h + 1);
}
/*
/*
ALGORITHM 712, COLLECTED ALGORITHMS FROM ACM.
THIS WORK PUBLISHED IN TRANSACTIONS ON MATHEMATICAL SOFTWARE,
VOL. 18, NO. 4, DECEMBER, 1992, PP. 434-435.
@@ -253,133 +230,120 @@ namespace crnlib
The algorithm uses the ratio of uniforms method of A.J. Kinderman
and J.F. Monahan augmented with quadratic bounding curves.
*/
double random::gaussian(double mean, double stddev)
{
double q,u,v,x,y;
double random::gaussian(double mean, double stddev) {
double q, u, v, x, y;
/*
/*
Generate P = (u,v) uniform in rect. enclosing acceptance region
Make sure that any random numbers <= 0 are rejected, since
gaussian() requires uniforms > 0, but RandomUniform() delivers >= 0.
*/
do {
u = drand(0, 1);
v = drand(0, 1);
if (u <= 0.0 || v <= 0.0) {
u = 1.0;
v = 1.0;
}
v = 1.7156 * (v - 0.5);
do {
u = drand(0, 1);
v = drand(0, 1);
if (u <= 0.0 || v <= 0.0) {
u = 1.0;
v = 1.0;
}
v = 1.7156 * (v - 0.5);
/* Evaluate the quadratic form */
x = u - 0.449871;
y = fabs(v) + 0.386595;
q = x * x + y * (0.19600 * y - 0.25472 * x);
/* Evaluate the quadratic form */
x = u - 0.449871;
y = fabs(v) + 0.386595;
q = x * x + y * (0.19600 * y - 0.25472 * x);
/* Accept P if inside inner ellipse */
if (q < 0.27597)
break;
/* Accept P if inside inner ellipse */
if (q < 0.27597)
break;
/* Reject P if outside outer ellipse, or outside acceptance region */
} while ((q > 0.27846) || (v * v > -4.0 * log(u) * u * u));
/* Reject P if outside outer ellipse, or outside acceptance region */
} while ((q > 0.27846) || (v * v > -4.0 * log(u) * u * u));
/* Return ratio of P's coordinates as the normal deviate */
return (mean + stddev * v / u);
}
/* Return ratio of P's coordinates as the normal deviate */
return (mean + stddev * v / u);
}
void random::test()
{
}
void random::test() {
}
fast_random::fast_random() :
jsr(0xABCD917A),
jcong(0x17F3DEAD)
{
}
fast_random::fast_random()
: jsr(0xABCD917A),
jcong(0x17F3DEAD) {
}
fast_random::fast_random(const fast_random& other) :
jsr(other.jsr), jcong(other.jcong)
{
}
fast_random::fast_random(const fast_random& other)
: jsr(other.jsr), jcong(other.jcong) {
}
fast_random::fast_random(uint32 i)
{
seed(i);
}
fast_random::fast_random(uint32 i) {
seed(i);
}
fast_random& fast_random::operator=(const fast_random& other)
{
jsr = other.jsr;
jcong = other.jcong;
return *this;
}
fast_random& fast_random::operator=(const fast_random& other) {
jsr = other.jsr;
jcong = other.jcong;
return *this;
}
void fast_random::seed(uint32 i)
{
jsr = i;
SHR3;
SHR3;
jcong = (~i) ^ 0xDEADBEEF;
void fast_random::seed(uint32 i) {
jsr = i;
SHR3;
SHR3;
jcong = (~i) ^ 0xDEADBEEF;
SHR3;
CONG;
}
SHR3;
CONG;
}
uint32 fast_random::urand32()
{
return SHR3 ^ CONG;
}
uint32 fast_random::urand32() {
return SHR3 ^ CONG;
}
uint64 fast_random::urand64()
{
uint64 result = urand32();
result <<= 32ULL;
result |= urand32();
return result;
}
int fast_random::irand(int l, int h)
{
CRNLIB_ASSERT(l < h);
if (l >= h)
return l;
uint64 fast_random::urand64() {
uint64 result = urand32();
result <<= 32ULL;
result |= urand32();
return result;
}
int fast_random::irand(int l, int h) {
CRNLIB_ASSERT(l < h);
if (l >= h)
return l;
uint32 range = static_cast<uint32>(h - l);
uint32 range = static_cast<uint32>(h - l);
uint32 rnd = urand32();
uint32 rnd = urand32();
#if defined(_M_IX86) && defined(_MSC_VER)
//uint32 rnd_range = static_cast<uint32>(__emulu(range, rnd) >> 32U);
uint32 x[2];
*reinterpret_cast<uint64*>(x) = __emulu(range, rnd);
uint32 rnd_range = x[1];
//uint32 rnd_range = static_cast<uint32>(__emulu(range, rnd) >> 32U);
uint32 x[2];
*reinterpret_cast<uint64*>(x) = __emulu(range, rnd);
uint32 rnd_range = x[1];
#else
uint32 rnd_range = static_cast<uint32>((((uint64)range) * ((uint64)rnd)) >> 32U);
uint32 rnd_range = static_cast<uint32>((((uint64)range) * ((uint64)rnd)) >> 32U);
#endif
int result = l + rnd_range;
CRNLIB_ASSERT((result >= l) && (result < h));
return result;
}
int result = l + rnd_range;
CRNLIB_ASSERT((result >= l) && (result < h));
return result;
}
double fast_random::drand(double l, double h)
{
CRNLIB_ASSERT(l <= h);
if (l >= h)
return l;
double fast_random::drand(double l, double h) {
CRNLIB_ASSERT(l <= h);
if (l >= h)
return l;
return math::clamp(l + (h - l) * (urand32() * cNorm), l, h);
}
return math::clamp(l + (h - l) * (urand32() * cNorm), l, h);
}
float fast_random::frand(float l, float h)
{
CRNLIB_ASSERT(l <= h);
if (l >= h)
return l;
float fast_random::frand(float l, float h) {
CRNLIB_ASSERT(l <= h);
if (l >= h)
return l;
float r = static_cast<float>(l + (h - l) * (urand32() * cNorm));
float r = static_cast<float>(l + (h - l) * (urand32() * cNorm));
return math::clamp<float>(r, l, h);
}
} // namespace crnlib
return math::clamp<float>(r, l, h);
}
} // namespace crnlib