Report a bug
If you spot a problem with this page, click here to create a GitHub issue.
Improve this page
Quickly fork, edit online, and submit a pull request for this page.
Requires a signed-in GitHub account. This works well for small changes.
If you'd like to make larger changes you may want to consider using
a local clone.
mir.random.ndvariable
Generator name | Description |
---|---|
SphereVariable | Uniform distribution on a unit-sphere |
SimplexVariable | Uniform distribution on a standard-simplex |
DirichletVariable | Dirichlet random variable |
MultinomialVariable | Multinomial random variable |
MultivariateNormalVariable | Multivariate_normal random variable |
Authors:
Simon Bürger, Ilya Yaroshenko
License:
- template
isNdRandomVariable
(T) - Test if T is an n-dimensional random variable.Examples:
static assert(isNdRandomVariable!(SphereVariable!double));
- struct
SphereVariable
(T) if (isFloatingPoint!T);
SphereVariable!TsphereVar
(T = double)()
if (isFloatingPoint!T);
aliassphereVariable
= sphereVar(T = double)() if (isFloatingPoint!T); - Uniform distribution on a sphere.Returns:X ~ 1 with X[0]^^2 + .. + X[$-1]^^2 = 1Examples:Generate random points on a circle
import mir.random.engine; import mir.math.common: fabs; double[2] x; sphereVar()(rne, x); assert(fabs(x[0] * x[0] + x[1] * x[1] - 1) < 1e-10);
- enum auto
isNdRandomVariable
; - alias
Element
= T; - void
opCall
(G)(ref scope Ggen
, scope T[]result
)
if (isSaturatedRandomEngine!G);
voidopCall
(G)(scope G*gen
, scope T[]result
)
if (isSaturatedRandomEngine!G);
- struct
SimplexVariable
(T) if (isFloatingPoint!T);
SimplexVariable!TsimplexVar
(T = double)()
if (isFloatingPoint!T);
aliassimplexVariable
= simplexVar(T = double)() if (isFloatingPoint!T); - Uniform distribution on a simplex.Returns:X ~ 1 with X[i] >= 0 and X[0] + .. + X[$-1] = 1Examples:
// mir.ndslice package is required for 'SimplexVariable', it can be found in 'mir-algorithm' static if (is(typeof({ import mir.ndslice.slice; }))) { import mir.random.engine; auto rv = simplexVar; double[3] x; rv(rne, x); assert(x[0] >= 0 && x[1] >= 0 && x[2] >= 0); assert(fabs(x[0] + x[1] + x[2] - 1) < 1e-10); }
Examples:import mir.math.common: fabs; // mir.ndslice package is required for 'SimplexVariable', it can be found in 'mir-algorithm' static if (is(typeof({ import mir.ndslice.slice; }))) { import mir.ndslice.slice; Random* gen = threadLocalPtr!Random; SimplexVariable!double rv; double[3] x; rv(gen, x); assert(x[0] >= 0 && x[1] >= 0 && x[2] >= 0); assert(fabs(x[0] + x[1] + x[2] - 1) < 1e-10); }
- enum auto
isNdRandomVariable
; - alias
Element
= T; - void
opCall
(G)(ref scope Ggen
, scope T[]result
)
if (isSaturatedRandomEngine!G);
voidopCall
(G)(scope G*gen
, scope T[]result
)
if (isSaturatedRandomEngine!G);
- struct
DirichletVariable
(T) if (isFloatingPoint!T);
DirichletVariable!TdirichletVar
(T)(in T[]alpha
)
if (isFloatingPoint!T);
aliasdirichletVariable
= dirichletVar(T)(in T[] alpha) if (isFloatingPoint!T); - Dirichlet distribution.Examples:
import mir.random.engine; import mir.math.common: fabs; auto rv = dirichletVar([1.0, 5.7, 0.3]); double[3] x; rv(rne, x); assert(x[0] >= 0 && x[1] >= 0 && x[2] >= 0); assert(fabs(x[0] + x[1] + x[2] - 1) < 1e-10);
Examples:import mir.random.engine; import mir.math.common: fabs; Random* gen = threadLocalPtr!Random; auto rv = DirichletVariable!double([1.0, 5.7, 0.3]); double[3] x; rv(gen, x); assert(x[0] >= 0 && x[1] >= 0 && x[2] >= 0); assert(fabs(x[0] + x[1] + x[2] - 1) < 1e-10);
- enum auto
isNdRandomVariable
; - alias
Element
= T; - const(T)[]
alpha
; - this()(const(T)[]
alpha
); - Parameters:
const(T)[] alpha
concentration parameters Constraints
dittoalpha
[i] > 0 - void
opCall
(G)(ref scope Ggen
, scope T[]result
)
if (isSaturatedRandomEngine!G);
voidopCall
(G)(scope G*gen
, scope T[]result
)
if (isSaturatedRandomEngine!G);
- struct
MultinomialVariable
(T) if (isFloatingPoint!T);
MultinomialVariable!TmultinomialVar
(T)(size_tN
, return const T[]probs
)
if (isFloatingPoint!T);
aliasmultinomialVariable
= multinomialVar(T)(size_t N, return const T[] probs) if (isFloatingPoint!T); - Multinomial distribution.Examples:Tests if sample returned is of correct size.
import mir.random.engine; size_t s = 10000; double[6] p =[1/6., 1/6., 1/6., 1/6., 1/6., 1/6.]; // probs must add up to one auto rv = multinomialVar(s, p); uint[6] x; rv(rne, x[]); assert(x[0]+x[1]+x[2]+x[3]+x[4]+x[5] == s);
- enum auto
isNdRandomVariable
; - alias
Element
= uint; - const(T)[]
probs
; - this()(size_t
N
, const(T)[]probs
); - Parameters:
const(T)[] probs
probabilities of the multinomial distribution size_t N
Number of rolls Constraints sum(
probs
[i]) <= 1 - void
opCall
(G)(ref scope Ggen
, scope uint[]result
)
if (isSaturatedRandomEngine!G);
voidopCall
(G)(scope G*gen
, scope uint[]result
)
if (isSaturatedRandomEngine!G);
- struct
MultivariateNormalVariable
(T) if (isFloatingPoint!T);
MultivariateNormalVariable!TmultivariateNormalVar
(T)(Slice!(const(T)*)mu
, Slice!(T*, 2)sigma
, boolchol
= false);
MultivariateNormalVariable!TmultivariateNormalVar
(T)(Slice!(T*, 2)sigma
, boolchol
= false);
aliasmultivariateNormalVariable
= multivariateNormalVar(T)(Slice!(const(T)*) mu, Slice!(T*, 2) sigma, bool chol = false); - Multivariate normal distribution. Beta version (has not properly tested).Examples:
// mir.ndslice package is required for 'multivariateNormalVar', it can be found in 'mir-algorithm' static if (is(typeof({ import mir.ndslice.slice; }))) { import mir.random.engine; import mir.ndslice.slice: sliced; auto mu = [10.0, 0.0].sliced; auto sigma = [2.0, -1.5, -1.5, 2.0].sliced(2,2); auto rv = multivariateNormalVar(mu, sigma); double[2] x; rv(rne, x[]); }
Examples:// mir.ndslice package is required for 'multivariateNormalVar', it can be found in 'mir-algorithm' static if (is(typeof({ import mir.ndslice.slice; }))) { import mir.ndslice.slice: sliced; import mir.random.engine; Random* gen = threadLocalPtr!Random; auto mu = [10.0, 0.0].sliced; auto sigma = [2.0, -1.5, -1.5, 2.0].sliced(2,2); auto rv = multivariateNormalVar(mu, sigma); double[2] x; rv(gen, x[]); }
- bool
cholesky
()(Slice!(T*, 2)m
); - Compute Cholesky decomposition in place. Only accesses lower/left half of the matrix. Returns false if the matrix is not positive definite.
- enum auto
isNdRandomVariable
; - alias
Element
= T; - this()(Slice!(const(T)*)
mu
, Slice!(T*, 2)sigma
, boolchol
= false);
this()(Slice!(T*, 2)sigma
, boolchol
= false); - Constructor computes the Cholesky decomposition of
sigma
in place without memory allocation. Furthermore it is assumed to be a symmetric matrix, but only the lower/left half is actually accessed.Parameters:Slice!(const(T)*) mu
mean vector (assumed zero if not supplied) Slice!(T*, 2) sigma
covariance matrix bool chol
optional flag indicating that sigma is already Cholesky decomposed Constraints sigma has to be positive-definite
- void
opCall
(G)(ref scope Ggen
, scope T[]result
)
if (isSaturatedRandomEngine!G);
voidopCall
(G)(scope G*gen
, scope T[]result
)
if (isSaturatedRandomEngine!G);
Copyright © 2016-2021 by Ilya Yaroshenko | Page generated by
Ddoc on Tue Mar 23 21:30:37 2021