359 lines
8.5 KiB
Plaintext
359 lines
8.5 KiB
Plaintext
---
|
|
title: "Functions Reference"
|
|
sidebar_position: 7
|
|
---
|
|
|
|
import { SquiggleEditor } from "../../src/components/SquiggleEditor";
|
|
|
|
_The source of truth for this document is [this file of code](https://github.com/quantified-uncertainty/squiggle/blob/develop/packages/squiggle-lang/src/rescript/ReducerInterface/ReducerInterface_GenericDistribution.res)_
|
|
|
|
## Inventory distributions
|
|
|
|
We provide starter distributions, computed symbolically.
|
|
|
|
### Normal distribution
|
|
|
|
The `normal(mean, sd)` function creates a normal distribution with the given mean
|
|
and standard deviation.
|
|
|
|
<SquiggleEditor initialSquiggleString="normal(5, 1)" />
|
|
|
|
#### Validity
|
|
|
|
- `sd > 0`
|
|
|
|
### Uniform distribution
|
|
|
|
The `uniform(low, high)` function creates a uniform distribution between the
|
|
two given numbers.
|
|
|
|
<SquiggleEditor initialSquiggleString="uniform(3, 7)" />
|
|
|
|
#### Validity
|
|
|
|
- `low < high`
|
|
|
|
### Lognormal distribution
|
|
|
|
The `lognormal(mu, sigma)` returns the log of a normal distribution with parameters
|
|
`mu` and `sigma`. The log of `lognormal(mu, sigma)` is a normal distribution with mean `mu` and standard deviation `sigma`.
|
|
|
|
<SquiggleEditor initialSquiggleString="lognormal(0, 0.7)" />
|
|
|
|
An alternative format is also available. The `to` notation creates a lognormal
|
|
distribution with a 90% confidence interval between the two numbers. We add
|
|
this convenience as lognormal distributions are commonly used in practice.
|
|
|
|
<SquiggleEditor initialSquiggleString="2 to 10" />
|
|
|
|
#### Future feature:
|
|
|
|
Furthermore, it's also possible to create a lognormal from it's actual mean
|
|
and standard deviation, using `lognormalFromMeanAndStdDev`.
|
|
|
|
TODO: interpreter/parser doesn't provide this in current `develop` branch
|
|
|
|
<SquiggleEditor initialSquiggleString="lognormalFromMeanAndStdDev(20, 10)" />
|
|
|
|
#### Validity
|
|
|
|
- `sigma > 0`
|
|
- In `x to y` notation, `x < y`
|
|
|
|
### Beta distribution
|
|
|
|
The `beta(a, b)` function creates a beta distribution with parameters `a` and `b`:
|
|
|
|
<SquiggleEditor initialSquiggleString="beta(10, 20)" />
|
|
|
|
#### Validity
|
|
|
|
- `a > 0`
|
|
- `b > 0`
|
|
- Empirically, we have noticed that numerical instability arises when `a < 1` or `b < 1`
|
|
|
|
### Exponential distribution
|
|
|
|
The `exponential(rate)` function creates an exponential distribution with the given
|
|
rate.
|
|
|
|
<SquiggleEditor initialSquiggleString="exponential(1.11)" />
|
|
|
|
#### Validity
|
|
|
|
- `rate > 0`
|
|
|
|
### Triangular distribution
|
|
|
|
The `triangular(a,b,c)` function creates a triangular distribution with lower
|
|
bound `a`, mode `b` and upper bound `c`.
|
|
|
|
#### Validity
|
|
|
|
- `a < b < c`
|
|
|
|
<SquiggleEditor initialSquiggleString="triangular(1, 2, 4)" />
|
|
|
|
### Scalar (constant dist)
|
|
|
|
Squiggle, when the context is right, automatically casts a float to a constant distribution.
|
|
|
|
## Operating on distributions
|
|
|
|
Here are the ways we combine distributions.
|
|
|
|
### Mixture of distributions
|
|
|
|
The `mixture` function combines 2 or more other distributions to create a weighted
|
|
combination of the two. The first positional arguments represent the distributions
|
|
to be combined, and the last argument is how much to weigh every distribution in the
|
|
combination.
|
|
|
|
<SquiggleEditor initialSquiggleString="mixture(uniform(0,1), normal(1,1), [0.5, 0.5])" />
|
|
|
|
It's possible to create discrete distributions using this method.
|
|
|
|
<SquiggleEditor initialSquiggleString="mixture(0, 1, [0.2,0.8])" />
|
|
|
|
As well as mixed distributions:
|
|
|
|
<SquiggleEditor initialSquiggleString="mixture(3, 8, 1 to 10, [0.2, 0.3, 0.5])" />
|
|
|
|
An alias of `mixture` is `mx`
|
|
|
|
#### Validity
|
|
|
|
Using javascript's variable arguments notation, consider `mx(...dists, weights)`:
|
|
|
|
- `dists.length == weights.length`
|
|
|
|
### Addition
|
|
|
|
A horizontal right shift
|
|
|
|
<SquiggleEditor
|
|
initialSquiggleString={`dist1 = 1 to 10
|
|
dist2 = triangular(1,2,3)
|
|
dist1 + dist2`}
|
|
/>
|
|
|
|
### Subtraction
|
|
|
|
A horizontal left shift
|
|
|
|
<SquiggleEditor
|
|
initialSquiggleString={`dist1 = 1 to 10
|
|
dist2 = triangular(1,2,3)
|
|
dist1 - dist2`}
|
|
/>
|
|
|
|
### Multiplication
|
|
|
|
TODO: provide intuition pump for the semantics
|
|
|
|
<SquiggleEditor
|
|
initialSquiggleString={`dist1 = 1 to 10
|
|
dist2 = triangular(1,2,3)
|
|
dist1 * dist2`}
|
|
/>
|
|
|
|
We also provide concatenation of two distributions as a syntax sugar for `*`
|
|
|
|
<SquiggleEditor initialSquiggleString="(0.1 to 1) triangular(1,2,3)" />
|
|
|
|
### Division
|
|
|
|
TODO: provide intuition pump for the semantics
|
|
|
|
<SquiggleEditor
|
|
initialSquiggleString={`dist1 = 1 to 10
|
|
dist2 = triangular(1,2,3)
|
|
dist1 / dist2`}
|
|
/>
|
|
|
|
### Exponentiation
|
|
|
|
TODO: provide intuition pump for the semantics
|
|
|
|
<SquiggleEditor initialSquiggleString={`(0.1 to 1) ^ beta(2, 3)`} />
|
|
|
|
### Taking the base `e` exponential
|
|
|
|
<SquiggleEditor
|
|
initialSquiggleString={`dist = triangular(1,2,3)
|
|
exp(dist)`}
|
|
/>
|
|
|
|
### Taking logarithms
|
|
|
|
<SquiggleEditor
|
|
initialSquiggleString={`dist = triangular(1,2,3)
|
|
log(dist)`}
|
|
/>
|
|
|
|
<SquiggleEditor
|
|
initialSquiggleString={`dist = beta(1,2)
|
|
log10(dist)`}
|
|
/>
|
|
|
|
Base `x`
|
|
|
|
<SquiggleEditor
|
|
initialSquiggleString={`x = 2
|
|
dist = beta(2,3)
|
|
log(dist, x)`}
|
|
/>
|
|
|
|
#### Validity
|
|
|
|
- `x` must be a scalar
|
|
- See [the current discourse](https://github.com/quantified-uncertainty/squiggle/issues/304)
|
|
|
|
### Pointwise addition
|
|
|
|
**Pointwise operations are done with `PointSetDist` internals rather than `SampleSetDist` internals**.
|
|
|
|
TODO: this isn't in the new interpreter/parser yet.
|
|
|
|
<SquiggleEditor
|
|
initialSquiggleString={`dist1 = 1 to 10
|
|
dist2 = triangular(1,2,3)
|
|
dist1 .+ dist2`}
|
|
/>
|
|
|
|
### Pointwise subtraction
|
|
|
|
TODO: this isn't in the new interpreter/parser yet.
|
|
|
|
<SquiggleEditor
|
|
initialSquiggleString={`dist1 = 1 to 10
|
|
dist2 = triangular(1,2,3)
|
|
dist1 .- dist2`}
|
|
/>
|
|
|
|
### Pointwise multiplication
|
|
|
|
<SquiggleEditor
|
|
initialSquiggleString={`dist1 = 1 to 10
|
|
dist2 = triangular(1,2,3)
|
|
dist1 .* dist2`}
|
|
/>
|
|
|
|
### Pointwise division
|
|
|
|
<SquiggleEditor
|
|
initialSquiggleString={`dist1 = 1 to 10
|
|
dist2 = triangular(1,2,3)
|
|
dist1 ./ dist2`}
|
|
/>
|
|
|
|
### Pointwise exponentiation
|
|
|
|
<SquiggleEditor
|
|
initialSquiggleString={`dist1 = 1 to 10
|
|
dist2 = triangular(1,2,3)
|
|
dist1 .^ dist2`}
|
|
/>
|
|
|
|
## Standard functions on distributions
|
|
|
|
### Probability density function
|
|
|
|
The `pdf(dist, x)` function returns the density of a distribution at the
|
|
given point x.
|
|
|
|
<SquiggleEditor initialSquiggleString="pdf(normal(0,1),0)" />
|
|
|
|
#### Validity
|
|
|
|
- `x` must be a scalar
|
|
- `dist` must be a distribution
|
|
|
|
### Cumulative density function
|
|
|
|
The `cdf(dist, x)` gives the cumulative probability of the distribution
|
|
or all values lower than x. It is the inverse of `inv`.
|
|
|
|
<SquiggleEditor initialSquiggleString="cdf(normal(0,1),0)" />
|
|
|
|
#### Validity
|
|
|
|
- `x` must be a scalar
|
|
- `dist` must be a distribution
|
|
|
|
### Inverse CDF
|
|
|
|
The `inv(dist, prob)` gives the value x or which the probability for all values
|
|
lower than x is equal to prob. It is the inverse of `cdf`.
|
|
|
|
<SquiggleEditor initialSquiggleString="inv(normal(0,1),0.5)" />
|
|
|
|
#### Validity
|
|
|
|
- `prob` must be a scalar (please only put it in `(0,1)`)
|
|
- `dist` must be a distribution
|
|
|
|
### Mean
|
|
|
|
The `mean(distribution)` function gives the mean (expected value) of a distribution.
|
|
|
|
<SquiggleEditor initialSquiggleString="mean(normal(5, 10))" />
|
|
|
|
### Sampling a distribution
|
|
|
|
The `sample(distribution)` samples a given distribution.
|
|
|
|
<SquiggleEditor initialSquiggleString="sample(normal(0, 10))" />
|
|
|
|
## Normalization
|
|
|
|
Some distribution operations (like horizontal shift) return an unnormalized distriibution.
|
|
|
|
We provide a `normalize` function
|
|
|
|
<SquiggleEditor initialSquiggleString="normalize((0.1 to 1) + triangular(0.1, 1, 10))" />
|
|
|
|
#### Validity - Input to `normalize` must be a dist
|
|
|
|
We provide a predicate `isNormalized`, for when we have simple control flow
|
|
|
|
<SquiggleEditor initialSquiggleString="isNormalized((0.1 to 1) * triangular(0.1, 1, 10))" />
|
|
|
|
#### Validity
|
|
|
|
- Input to `isNormalized` must be a dist
|
|
|
|
## Convert any distribution to a sample set distribution
|
|
|
|
`toSampleSet` has two signatures
|
|
|
|
It is unary when you use an internal hardcoded number of samples
|
|
|
|
<SquiggleEditor initialSquiggleString="toSampleSet(0.1 to 1)" />
|
|
|
|
And binary when you provide a number of samples (floored)
|
|
|
|
<SquiggleEditor initialSquiggleString="toSampleSet(0.1 to 1, 100)" />
|
|
|
|
## `inspect`
|
|
|
|
You may like to debug by right clicking your browser and using the _inspect_ functionality on the webpage, and viewing the _console_ tab. Then, wrap your squiggle output with `inspect` to log an internal representation.
|
|
|
|
<SquiggleEditor initialSquiggleString="inspect(toSampleSet(0.1 to 1, 100))" />
|
|
|
|
Save for a logging side effect, `inspect` does nothing to input and returns it.
|
|
|
|
## Truncate
|
|
|
|
You can cut off from the left
|
|
|
|
<SquiggleEditor initialSquiggleString="truncateLeft(0.1 to 1, 0.5)" />
|
|
|
|
You can cut off from the right
|
|
|
|
<SquiggleEditor initialSquiggleString="truncateRight(0.1 to 1, 10)" />
|
|
|
|
You can cut off from both sides
|
|
|
|
<SquiggleEditor initialSquiggleString="truncate(0.1 to 1, 0.5, 1.5)" />
|