support for user-specified parameters

This commit is contained in:
conrad
2022-05-26 16:44:51 +10:00
parent 382795556c
commit 353e0e4069
+96
View File
@@ -345,6 +345,40 @@ struct arma_rng::randu
}
#endif
}
inline
static
void
fill(eT* mem, const uword N, const double a, const double b)
{
#if defined(ARMA_RNG_ALT)
{
const double r = b - a;
for(uword i=0; i < N; ++i) { mem[i] = eT( arma_rng_alt::randu_val() * r + a ); }
}
#elif defined(ARMA_USE_EXTERN_RNG)
{
std::uniform_real_distribution<double> local_u_distr(a,b);
for(uword i=0; i < N; ++i) { mem[i] = eT( local_u_distr(mt19937_64_instance) ); }
}
#else
{
if(N == uword(1)) { mem[0] = eT( arma_rng_cxx03::randu_val() * (b - a) + a ); return; }
typedef typename std::mt19937_64::result_type local_seed_type;
std::mt19937_64 local_engine;
std::uniform_real_distribution<double> local_u_distr(a,b);
local_engine.seed( local_seed_type(std::rand()) );
for(uword i=0; i < N; ++i) { mem[i] = eT( local_u_distr(local_engine) ); }
}
#endif
}
};
@@ -438,6 +472,68 @@ struct arma_rng::randu< std::complex<T> >
}
#endif
}
inline
static
void
fill(std::complex<T>* mem, const uword N, const double a, const double b)
{
#if defined(ARMA_RNG_ALT)
{
const double r = b - a;
for(uword i=0; i < N; ++i)
{
const T tmp1 = T( arma_rng_alt::randu_val() * r + a );
const T tmp2 = T( arma_rng_alt::randu_val() * r + a );
mem[i] = std::complex<T>(tmp1, tmp2);
}
}
#elif defined(ARMA_USE_EXTERN_RNG)
{
std::uniform_real_distribution<double> local_u_distr(a,b);
for(uword i=0; i < N; ++i)
{
const T tmp1 = T( local_u_distr(mt19937_64_instance) );
const T tmp2 = T( local_u_distr(mt19937_64_instance) );
mem[i] = std::complex<T>(tmp1, tmp2);
}
}
#else
{
if(N == uword(1))
{
const double r = b - a;
const T tmp1 = T( arma_rng_cxx03::randu_val() * r + a);
const T tmp2 = T( arma_rng_cxx03::randu_val() * r + a);
mem[0] = std::complex<T>(tmp1, tmp2);
return;
}
typedef typename std::mt19937_64::result_type local_seed_type;
std::mt19937_64 local_engine;
std::uniform_real_distribution<double> local_u_distr(a,b);
local_engine.seed( local_seed_type(std::rand()) );
for(uword i=0; i < N; ++i)
{
const T tmp1 = T( local_u_distr(local_engine) );
const T tmp2 = T( local_u_distr(local_engine) );
mem[0] = std::complex<T>(tmp1, tmp2);
}
}
#endif
}
};