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)[] alphaconcentration 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)[] probsprobabilities of the multinomial distribution size_t NNumber 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
sigmain 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)*) mumean vector (assumed zero if not supplied) Slice!(T*, 2) sigmacovariance matrix bool choloptional 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