Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
84 changes: 84 additions & 0 deletions distributions/uniform.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
import pytensor.tensor as pt

from distributions.helper import ppf_bounds_cont


def mean(lower, upper):
return (upper + lower) / 2


def mode(lower, upper):
shape = pt.broadcast_arrays(lower, upper)[0]
return pt.full_like(shape, pt.nan)


def median(lower, upper):
return mean(lower, upper)


def var(lower, upper):
return (upper - lower) ** 2 / 12


def std(lower, upper):
return pt.sqrt(var(lower, upper))


def skewness(lower, upper):
shape = pt.broadcast_arrays(lower, upper)[0]
return pt.zeros_like(shape)


def kurtosis(lower, upper):
shape = pt.broadcast_arrays(lower, upper)[0]
return pt.full_like(shape, -6 / 5)


def entropy(lower, upper):
return pt.log(upper - lower)


def cdf(x, lower, upper):
return pt.switch(
pt.lt(x, lower),
pt.zeros_like(x),
pt.switch(pt.gt(x, upper), pt.ones_like(x), (x - lower) / (upper - lower)),
)


def pdf(x, lower, upper):
return pt.exp(logpdf(x, lower, upper))


def ppf(q, lower, upper):
x_vals = lower + q * (upper - lower)
return ppf_bounds_cont(x_vals, q, lower, upper)


def sf(x, lower, upper):
return 1 - cdf(x, lower, upper)


def isf(x, lower, upper):
return ppf(1 - x, lower, upper)


def rvs(lower, upper, size=None, random_state=None):
return pt.random.uniform(lower, upper, size=size, rng=random_state)


def logcdf(x, lower, upper):
return pt.switch(
pt.lt(x, lower),
-pt.inf,
pt.switch(pt.gt(x, upper), 0, pt.log((x - lower) / (upper - lower))),
)


def logpdf(x, lower, upper):
log_height = -pt.log(upper - lower)
return pt.switch(pt.or_(pt.lt(x, lower), pt.gt(x, upper)), -pt.inf, log_height)


def logsf(x, lower, upper):
return pt.log(sf(x, lower, upper))
32 changes: 32 additions & 0 deletions tests/test_uniform.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
"""Test Uniform distribution against scipy implementation."""

import pytest
from scipy import stats

from distributions import uniform as Uniform
from tests.helper_scipy import make_params, run_distribution_tests


@pytest.mark.parametrize(
"params, sp_params",
[
([0.0, 1.0], {"loc": 0.0, "scale": 1.0}),
([-5.0, 5.0], {"loc": -5.0, "scale": 10.0}),
([10.0, 20.0], {"loc": 10.0, "scale": 10.0}),
([-100.0, -50.0], {"loc": -100.0, "scale": 50.0}),
([0.0, 1e-6], {"loc": 0.0, "scale": 1e-6}),
],
)
def test_uniform_vs_scipy(params, sp_params):
"""Test Uniform distribution against scipy."""
p_params = make_params(*params)
support = (params[0], params[1])

run_distribution_tests(
p_dist=Uniform,
sp_dist=stats.uniform,
p_params=p_params,
sp_params=sp_params,
support=support,
name="uniform",
)