Raku Land # Math::Libgsl::RandomDistribution

cpan:FRITH # NAME

Math::Libgsl::RandomDistribution - An interface to libgsl, the Gnu Scientific Library - Random Number Distributions

# SYNOPSIS

```use Math::Libgsl::Random;
use Math::Libgsl::RandomDistribution;

my Math::Libgsl::Random \$r .= new;
say poisson(\$r, 3) for ^10;
```

# DESCRIPTION

Math::Libgsl::RandomDistribution is an interface to the Random Number Distributions section of libgsl, the Gnu Scientific Library.

### gaussian(Math::Libgsl::Random \$r, Num() \$sigma --> Num)

This function returns a Gaussian random variate, with mean zero and standard deviation \$sigma.

### gaussian-pdf(Num() \$x, Num() \$sigma --> Num)

This function computes the probability density at \$x for a Gaussian distribution with standard deviation \$sigma.

### gaussian-ratio-method(Math::Libgsl::Random \$r, Num() \$sigma --> Num)

This function computes a Gaussian random variate using the alternative Marsaglia-Tsang ziggurat and Kinderman-Monahan-Leva ratio methods.

### ugaussian-ratio-method(Math::Libgsl::Random \$r --> Num)

These functions compute results for the unit Gaussian distribution. They are equivalent to the functions above with \$sigma = 1.

### gaussian-Qinv(Num() \$Q, Num() \$sigma --> Num)

These functions compute the cumulative distribution functions P(x), Q(x) and their inverses.

### ugaussian-Qinv(Num() \$Q --> Num)

These functions compute the cumulative distribution functions P(x), Q(x) and their inverses for the unit Gaussian distribution.

### gaussian-tail(Math::Libgsl::Random \$r, Num() \$a where * > 0, Num() \$sigma --> Num)

This function provides random variates from the upper tail of a Gaussian distribution with standard deviation \$sigma.

### gaussian-tail-pdf(Num() \$x, Num() \$a where * > 0, Num() \$sigma --> Num)

This function computes the probability density p(x) at \$x for a Gaussian tail distribution with standard deviation \$sigma and lower limit \$a.

### ugaussian-tail-pdf(Num() \$x, Num() \$a where * > 0 --> Num)

These functions compute results for the tail of a unit Gaussian distribution.

### bivariate-gaussian(Math::Libgsl::Random \$r, Num() \$sigma-x, Num() \$sigma-y, Num() \$rho where -1 < * < 1 --> List)

This function generates a pair of correlated Gaussian variates, with mean zero, correlation coefficient \$rho and standard deviations \$sigma_x and \$sigma_y. The function returns two Num values: the Gauusian correlates along the x and y directions.

### bivariate-gaussian-pdf(Num() \$x, Num() \$y, Num() \$sigma-x, Num() \$sigma-y, Num() \$rho where -1 < * < 1 --> Num)

This function computes the probability density p(x, y) at (\$x, \$y) for a bivariate Gaussian distribution with standard deviations \$sigma_x, \$sigma_y and correlation coefficient \$rho.

### multivariate-gaussian(Math::Libgsl::Random \$r, Math::Libgsl::Vector \$mu, Math::Libgsl::Matrix \$L where { \$L.matrix.size1 == \$L.matrix.size2 && \$L.matrix.size1 == \$mu.vector.size } --> Math::Libgsl::Vector)

This function generates a random vector satisfying the k-dimensional multivariate Gaussian distribution with mean μ and variance-covariance matrix Σ. On input, the k-vector μ is given in \$mu, and the Cholesky factor of the k-by-k matrix Σ = LT(L) is given in the lower triangle of \$L, as output from Math::Libgsl::LinearAlgebra::cholesky-decomp(). The function returns the random vector as a Math::Libgsl::Vector object.

### multivariate-gaussian-log-pdf(Math::Libgsl::Vector \$x, Math::Libgsl::Vector \$mu where *.vector.size == \$x.vector.size, Math::Libgsl::Matrix \$L where { \$L.matrix.size1 == \$L.matrix.size2 && \$L.matrix.size1 == \$mu.vector.size } --> Num)

These functions compute p(x) or log p(x) at the point \$x, using mean vector \$mu and variance-covariance matrix specified by its Cholesky factor \$L.

### multivariate-gaussian-mean(Math::Libgsl::Matrix \$X --> Math::Libgsl::Vector)

Given a set of n samples Xⱼ from a k-dimensional multivariate Gaussian distribution, this function computes the maximum likelihood estimate of the mean of the distribution. The function returns the maximum likelihood estimate as a Math::Libgsl::Vector object.

### multivariate-gaussian-vcov(Math::Libgsl::Matrix \$X --> Math::Libgsl::Matrix)

Given a set of n samples Xⱼ from a k-dimensional multivariate Gaussian distribution, this function computes the maximum likelihood estimate of the variance-covariance matrix of the distribution. The function returns the maximum likelihood estimate of the variance-covariance matrix as a Math::Libgsl::Matrix object.

### exponential(Math::Libgsl::Random \$r, Num() \$mu --> Num)

This function returns a random variate from the exponential distribution with mean \$mu.

### exponential-pdf(Num() \$x, Num() \$mu --> Num)

This function computes the probability density p(x) at \$x for an exponential distribution with mean \$mu.

### exponential-Qinv(Num() \$Q, Num() \$mu --> Num)

These functions compute the cumulative distribution functions P(x), Q(x) and their inverses for the exponential distribution with mean \$mu.

### laplace(Math::Libgsl::Random \$r, Num() \$a --> Num)

This function returns a random variate from the Laplace distribution with width \$a.

### laplace-pdf(Num() \$x, Num() \$a --> Num)

This function computes the probability density p(x) at \$x for a Laplace distribution with width \$a.

### laplace-Qinv(Num() \$Q, Num() \$a --> Num)

These functions compute the cumulative distribution functions P(x), Q(x) and their inverses for the Laplace distribution with width \$a.

### exppow(Math::Libgsl::Random \$r, Num() \$a, Num() \$b --> Num)

This function returns a random variate from the exponential power distribution with scale parameter \$a and exponent \$b.

### exppow-pdf(Num() \$x, Num() \$a, Num() \$b --> Num)

This function computes the probability density p(x) at \$x for an exponential power distribution with scale parameter \$a and exponent \$b.

### exppow-Q(Num() \$x, Num() \$a, Num() \$b --> Num)

These functions compute the cumulative distribution functions P(x), Q(x) for the exponential power distribution with parameters \$a and \$b.

### cauchy(Math::Libgsl::Random \$r, Num() \$a --> Num)

This function returns a random variate from the Cauchy distribution with scale parameter \$a.

### cauchy-pdf(Num() \$x, Num() \$a --> Num)

This function computes the probability density p(x) at \$x for a Cauchy distribution with scale parameter \$a.

### cauchy-Qinv(Num() \$Q, Num() \$a --> Num)

These functions compute the cumulative distribution functions P(x), Q(x) and their inverses for the Cauchy distribution with scale parameter \$a.

### rayleigh(Math::Libgsl::Random \$r, Num() \$sigma --> Num)

This function returns a random variate from the Rayleigh distribution with scale parameter \$sigma.

### rayleigh-pdf(Num() \$x, Num() \$sigma --> Num)

This function computes the probability density p(x) at \$x for a Rayleigh distribution with scale parameter \$sigma.

### rayleigh-Qinv(Num() \$Q, Num() \$sigma --> Num)

These functions compute the cumulative distribution functions P(x), Q(x) and their inverses for the Rayleigh distribution with scale parameter \$sigma.

### rayleigh-tail(Math::Libgsl::Random \$r, Num() \$a, Num() \$sigma --> Num)

This function returns a random variate from the tail of the Rayleigh distribution with scale parameter \$sigma and a lower limit of \$a.

### rayleigh-tail-pdf(Num() \$x, Num() \$a, Num() \$sigma --> Num)

This function computes the probability density p(x) at \$x for a Rayleigh tail distribution with scale parameter \$sigma and lower limit \$a.

### landau(Math::Libgsl::Random \$r --> Num)

This function returns a random variate from the Landau distribution.

### landau-pdf(Num() \$x --> Num)

This function computes the probability density p(x) at \$x for the Landau distribution.

### levy(Math::Libgsl::Random \$r, Num() \$c, Num() \$alpha where 0 < * ≤ 2 --> Num)

This function returns a random variate from the Levy symmetric stable distribution with scale \$c and exponent \$alpha.

### levy-skew(Math::Libgsl::Random \$r, Num() \$c, Num() \$alpha where 0 < * ≤ 2, Num() \$beta --> Num)

This function returns a random variate from the Levy skew stable distribution with scale \$c, exponent \$alpha and skewness parameter \$beta.

### gamma(Math::Libgsl::Random \$r, Num() \$a, Num() \$b --> Num)

This function returns a random variate from the gamma distribution.

### gamma-knuth(Math::Libgsl::Random \$r, Num() \$a, Num() \$b --> Num)

This function returns a gamma variate using the algorithms from Knuth.

### gamma-pdf(Num() \$x, Num() \$a, Num() \$b --> Num)

This function computes the probability density p(x) at \$x for a gamma distribution with parameters \$a and \$b.

### gamma-Qinv(Num() \$Q, Num() \$a, Num() \$b --> Num)

These functions compute the cumulative distribution functions P(x), Q(x) and their inverses for the gamma distribution with parameters \$a and \$b.

### flat(Math::Libgsl::Random \$r, Num() \$a, Num() \$b --> Num)

This function returns a random variate from the flat (uniform) distribution from \$a to \$b.

### flat-pdf(Num() \$x, Num() \$a, Num() \$b --> Num)

This function computes the probability density p(x) at \$x for a uniform distribution from \$a to \$b.

### flat-Qinv(Num() \$Q, Num() \$a, Num() \$b --> Num)

These functions compute the cumulative distribution functions P(x), Q(x) and their inverses for a uniform distribution from \$a to \$b.

### lognormal(Math::Libgsl::Random \$r, Num() \$zeta, Num() \$sigma --> Num)

This function returns a random variate from the lognormal distribution.

### lognormal-pdf(Num() \$x, Num() \$zeta, Num() \$sigma --> Num)

This function computes the probability density p(x) at \$x for a lognormal distribution with parameters \$zeta and \$sigma.

### lognormal-Qinv(Num() \$Q, Num() \$zeta, Num() \$sigma --> Num)

These functions compute the cumulative distribution functions P(x), Q(x) and their inverses for the lognormal distribution with parameters \$zeta and \$sigma.

### chisq(Math::Libgsl::Random \$r, Num() \$nu --> Num)

This function returns a random variate from the chi-squared distribution with \$nu degrees of freedom.

### chisq-pdf(Num() \$x where * ≥ 0, Num() \$nu --> Num)

This function computes the probability density p(x) at \$x for a chi-squared distribution with \$nu degrees of freedom.

### chisq-Qinv(Num() \$Q, Num() \$nu --> Num)

These functions compute the cumulative distribution functions P(x), Q(x) and their inverses for the chi-squared distribution with \$nu degrees of freedom.

### fdist(Math::Libgsl::Random \$r, Num() \$nu1, Num() \$nu2 --> Num)

This function returns a random variate from the F-distribution with degrees of freedom \$nu1 and \$nu2.

### fdist-pdf(Num() \$x where * ≥ 0, Num() \$nu1, Num() \$nu2 --> Num)

This function computes the probability density p(x) at \$x for an F-distribution with \$nu1 and \$nu2 degrees of freedom.

### fdist-Qinv(Num() \$Q, Num() \$nu1, Num() \$nu2 --> Num)

These functions compute the cumulative distribution functions P(x), Q(x) and their inverses for the F-distribution with \$nu1 and \$nu2 degrees of freedom.

### tdist(Math::Libgsl::Random \$r, Num() \$nu --> Num)

This function returns a random variate from the t-distribution.

### tdist-pdf(Num() \$x, Num() \$nu --> Num)

This function computes the probability density p(x) at \$x for a t-distribution with \$nu degrees of freedom.

### tdist-Qinv(Num() \$Q, Num() \$nu --> Num)

These functions compute the cumulative distribution functions P(x), Q(x) and their inverses for the t-distribution with \$nu degrees of freedom.

### beta(Math::Libgsl::Random \$r, Num() \$a, Num() \$b --> Num)

This function returns a random variate from the beta distribution.

### beta-pdf(Num() \$x, Num() \$a, Num() \$b --> Num)

This function computes the probability density p(x) at \$x for a beta distribution with parameters \$a and \$b.

### beta-Qinv(Num() \$Q, Num() \$a, Num() \$b --> Num)

These functions compute the cumulative distribution functions P(x), Q(x) and their inverses for the beta distribution with parameters \$a and \$b.

### logistic(Math::Libgsl::Random \$r, Num() \$a --> Num)

This function returns a random variate from the logistic distribution.

### logistic-pdf(Num() \$x, Num() \$a --> Num)

This function computes the probability density p(x) at \$x for a logistic distribution with scale parameter \$a.

### logistic-Qinv(Num() \$Q, Num() \$a --> Num)

These functions compute the cumulative distribution functions P(x), Q(x) and their inverses for the logistic distribution with scale parameter \$a.

### pareto(Math::Libgsl::Random \$r, Num() \$a, Num() \$b --> Num)

This function returns a random variate from the Pareto distribution of order \$a and scale \$b.

### pareto-pdf(Num() \$x, Num() \$a, Num() \$b where { \$x ≥ \$b } --> Num)

This function computes the probability density p(x) at \$x for a Pareto distribution with exponent \$a and scale \$b.

### pareto-Qinv(Num() \$Q, Num() \$a, Num() \$b --> Num)

These functions compute the cumulative distribution functions P(x), Q(x) and their inverses for the Pareto distribution with exponent \$a and scale \$b.

### d2dir-trig-method(Math::Libgsl::Random \$r --> List)

This function returns a random direction vector v = (x, y) in two dimensions. The return value is a List of two Num(s): the x and y components of the 2D vector.

### d3dir(Math::Libgsl::Random \$r --> List)

This function returns a random direction vector v = (x, y, z) in three dimensions. The return value is a List of three Num(s): the x, y, and z components of the 3D vector.

### dndir(Math::Libgsl::Random \$r, Int \$n --> List)

This function returns a random direction vector v = (x 1 , x 2 , . . . , x n ) in \$n dimensions. The return value is a List of \$n Num(s): the components of the n-D vector.

### weibull(Math::Libgsl::Random \$r, Num() \$a, Num() \$b --> Num)

This function returns a random variate from the Weibull distribution.

### weibull-pdf(Num() \$x where \$x ≥ 0, Num() \$a, Num() \$b --> Num)

This function computes the probability density p(x) at \$x for a Weibull distribution with scale \$a and exponent \$b.

### weibull-Qinv(Num() \$Q, Num() \$a, Num() \$b --> Num)

These functions compute the cumulative distribution functions P(x), Q(x) and their inverses for the Weibull distribution with scale \$a and exponent \$b.

### gumbel1(Math::Libgsl::Random \$r, Num() \$a, Num() \$b --> Num)

This function returns a random variate from the Type-1 Gumbel distribution.

### gumbel1-pdf(Num() \$x, Num() \$a, Num() \$b --> Num)

This function computes the probability density p(x) at \$x for a Type-1 Gumbel distribution with parameters \$a and \$b.

### gumbel1-Qinv(Num() \$Q, Num() \$a, Num() \$b --> Num)

These functions compute the cumulative distribution functions P(x), Q(x) and their inverses for the Type-1 Gumbel distribution with parameters \$a and \$b.

### gumbel2(Math::Libgsl::Random \$r, Num() \$a, Num() \$b --> Num)

This function returns a random variate from the Type-2 Gumbel distribution.

### gumbel2-pdf(Num() \$x where * > 0, Num() \$a, Num() \$b --> Num)

This function computes the probability density p(x) at \$x for a Type-2 Gumbel distribution with parameters \$a and \$b.

### gumbel2-Qinv(Num() \$Q, Num() \$a, Num() \$b --> Num)

These functions compute the cumulative distribution functions P(x), Q(x) and their inverses for the Type-2 Gumbel distribution with parameters \$a and \$b.

### dirichlet(Math::Libgsl::Random \$r, Int \$K, @alpha where *.all > 0 --> List)

This function returns an array of K random variates as a List of Num(s) from a Dirichlet distribution of order K-1.

### dirichlet-pdf(Int \$K, @alpha where *.all > 0, @theta where *.all ≥ 0 --> Num)

This function computes the probability density p(θ₁, …, θₖ) at theta[K] for a Dirichlet distribution with parameters alpha[K].

### dirichlet-lnpdf(Int \$K, @alpha where *.all > 0, @theta where *.all ≥ 0 --> Num)

This function computes the logarithm of the probability density p(θ₁, …, θₖ) at theta[K] for a Dirichlet distribution with parameters alpha[K].

### poisson(Math::Libgsl::Random \$r, Num() \$mu --> UInt)

This function returns a random integer from the Poisson distribution with mean \$mu.

### poisson-pdf(UInt \$k, Num() \$mu --> Num)

This function computes the probability p(k) of obtaining \$k from a Poisson distribution with mean \$mu.

### poisson-Q(UInt \$k, Num() \$mu --> Num)

These functions compute the cumulative distribution functions P(k), Q(k) for the Poisson distribution with parameter \$mu.

### bernoulli(Math::Libgsl::Random \$r, Num() \$p --> Int)

This function returns either 0 or 1, the result of a Bernoulli trial with probability \$p.

### bernoulli-pdf(UInt \$k, Num() \$p --> Num)

This function computes the probability p(k) of obtaining \$k from a Bernoulli distribution with probability parameter \$p.

### binomial(Math::Libgsl::Random \$r, Num() \$p, UInt \$n --> Int)

This function returns a random integer from the binomial distribution, the number of successes in \$n independent trials with probability \$p.

### binomial-pdf(UInt \$k, Num() \$p, UInt \$n where * ≥ \$k --> Num)

This function computes the probability p(k) of obtaining \$k from a binomial distribution with parameters \$p and \$n.

### binomial-Q(UInt \$k, Num() \$p, UInt \$n where * ≥ \$k --> Num)

These functions compute the cumulative distribution functions P (k), Q(k) for the binomial distribution with parameters \$p and \$n.

### multinomial(Math::Libgsl::Random \$r, Int \$K, UInt \$N, *@p where { @p.all ~~ Numeric } --> List)

This function returns a random sample from the multinomial distribution formed by \$N trials from an underlying distribution p[K] as a List of UInt(s).

### multinomial-pdf(Int \$K, @p where { @p.all ~~ Numeric }, *@n where { @n.all ~~ UInt } --> Num)

This function computes the probability P(n₁, n₂, …, nₖ) of sampling n[K] from a multinomial distribution with parameters p[K].

### multinomial-lnpdf(Int \$K, @p where { @p.all ~~ Numeric }, *@n where { @n.all ~~ UInt } --> Num)

This function computes the logarithm of the probability P(n₁, n₂, …, nₖ) for the multinomial distribution with parameters p[K].

### negative-binomial(Math::Libgsl::Random \$r, Num() \$p, Num() \$n --> UInt)

This function returns a random integer from the negative binomial distribution.

### negative-binomial-pdf(UInt \$k, Num() \$p, Num() \$n --> Num)

This function computes the probability p(k) of obtaining \$k from a negative binomial distribution with parameters \$p and \$n.

### negative-binomial-Q(UInt \$k, Num() \$p, Num() \$n --> Num)

These functions compute the cumulative distribution functions P(k), Q(k) for the negative binomial distribution with parameters \$p and \$n.

### pascal(Math::Libgsl::Random \$r, Num() \$p, UInt \$n --> UInt)

This function returns a random integer from the Pascal distribution.

### pascal-pdf(UInt \$k, Num() \$p, UInt \$n --> Num)

This function computes the probability p(k) of obtaining \$k from a Pascal distribution with parameters \$p and \$n.

### pascal-Q(UInt \$k, Num() \$p, UInt \$n --> Num)

These functions compute the cumulative distribution functions P(k), Q(k) for the Pascal distribution with parameters \$p and \$n.

### geometric(Math::Libgsl::Random \$r, Num() \$p --> UInt)

This function returns a random integer from the geometric distribution, the number of independent trials with probability \$p until the first success.

### geometric-pdf(UInt \$k where * ≥ 1, Num() \$p --> Num)

This function computes the probability p(k) of obtaining \$k from a geometric distribution with probability parameter \$p.

### geometric-Q(UInt \$k where * ≥ 1, Num() \$p --> Num)

These functions compute the cumulative distribution functions P(k), Q(k) for the geometric distribution with parameter \$p.

### hypergeometric(Math::Libgsl::Random \$r, UInt \$n1, UInt \$n2, UInt \$t --> UInt)

This function returns a random integer from the hypergeometric distribution.

### hypergeometric-pdf(UInt \$k, UInt \$n1, UInt \$n2, UInt \$t --> Num)

This function computes the probability p(k) of obtaining \$k from a hypergeometric distribution with parameters \$n1, \$n2, \$t.

### hypergeometric-Q(UInt \$k, UInt \$n1, UInt \$n2, UInt \$t --> Num)

These functions compute the cumulative distribution functions P(k), Q(k) for the hypergeometric distribution with parameters \$n1, \$n2 and \$t.

### logarithmic(Math::Libgsl::Random \$r, Num() \$p --> UInt)

This function returns a random integer from the logarithmic distribution.

### logarithmic-pdf(UInt \$k where * ≥ 1, Num() \$p --> Num)

This function computes the probability p(k) of obtaining \$k from a logarithmic distribution with probability parameter \$p.

### wishart(Math::Libgsl::Random \$r, Num() \$n, Math::Libgsl::Matrix \$L where { \$L.matrix.size1 == \$L.matrix.size2 && \$n ≤ \$L.matrix.size1 - 1 } --> Math::Libgsl::Matrix)

This function returns a random symmetric p-by-p matrix from the Wishart distribution as a Math::Libgsl::Matrix object.

### wishart-log-pdf(Math::Libgsl::Matrix \$X where { \$X.matrix.size1 == \$X.matrix.size2 }, Math::Libgsl::Matrix \$L-X where { \$L-X.matrix.size1 == \$L-X.matrix.size2 }, Num() \$n where * > \$X.matrix.size1 - 1, Math::Libgsl::Matrix \$L where { \$L.matrix.size1 == \$L.matrix.size2 && \$X.matrix.size1 == \$L.matrix.size1 && \$L-X.matrix.size1 == \$L.matrix.size1 } --> Num)

These functions return p(X) or log p(X) for the p-by-p matrix \$X, whose Cholesky factor is specified in \$L-X. The degrees of freedom is given by \$n, the Cholesky factor of the scale matrix V is specified in \$L.

### shuffle(Math::Libgsl::Random \$r, @base --> List)

This function randomly shuffles the order of the elements of the array @base and returns them as a List.

### choose(Math::Libgsl::Random \$r, Int \$k, @src where *.elems ≥ \$k --> List)

This function returns the list of \$k objects taken randomly from the elements of the array @src.

### sample(Math::Libgsl::Random \$r, Int \$k, @src --> List)

This function is like choose() but samples \$k items from the original array of n items @src with replacement, so the same object can appear more than once in the output.

## Class Math::Libgsl::RandomDistribution::Discrete

This probability distribution needs a lookup table for the discrete random number generator, so it's implemented as a class, which hides the implementation details.

```use Math::Libgsl::RandomDistribution;
use Math::Libgsl::Random;

my Int \$size = 3;
my @probability = .59, .4, .01;
my Math::Libgsl::Random \$r .= new;
my Math::Libgsl::RandomDistribution::Discrete \$d .= new: :\$size, :@probability;

say "Using probability values: { \$d.probability }";
say \$d.discrete(\$r) for ^10;

say \$d.discrete-pdf(2);
```

### new(Int() :\$size, :@probability where *.all > 0)

Creates the lookup table for the discrete random number generator. The array @probability contains the probabilities of the discrete events.

### discrete(Math::Libgsl::Random \$r --> Int)

This method returns one discrete random number.

### discrete-pdf(Int \$k --> Num)

This method returns the probability P[k] of observing the variable \$k.

# C Library Documentation

For more details on libgsl see https://www.gnu.org/software/gsl/. The excellent C Library manual is available here https://www.gnu.org/software/gsl/doc/html/index.html, or here https://www.gnu.org/software/gsl/doc/latex/gsl-ref.pdf in PDF format.

# Prerequisites

This module requires the libgsl library to be installed. Please follow the instructions below based on your platform:

## Debian Linux and Ubuntu 20.04

``````sudo apt install libgsl23 libgsl-dev libgslcblas0
``````

That command will install libgslcblas0 as well, since it's used by the GSL.

## Ubuntu 18.04

libgsl23 and libgslcblas0 have a missing symbol on Ubuntu 18.04. I solved the issue installing the Debian Buster version of those three libraries:

# Installation

To install it using zef (a module management tool):

``````\$ zef install Math::Libgsl::RandomDistribution
``````

# AUTHOR

Fernando Santagata nando.santagata@gmail.com