From 618e53771ac0fcd80f25f522c1f721d2efb05067 Mon Sep 17 00:00:00 2001 From: paramthakkar123 Date: Tue, 6 Feb 2024 22:12:59 +0530 Subject: [PATCH 1/8] added icdf for asymmetric laplace distribution --- pymc/distributions/continuous.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/pymc/distributions/continuous.py b/pymc/distributions/continuous.py index 76932db6f6..1d8614dd98 100644 --- a/pymc/distributions/continuous.py +++ b/pymc/distributions/continuous.py @@ -1641,7 +1641,14 @@ def logp(value, b, kappa, mu): kappa > 0, msg="b > 0, kappa > 0", ) - + def icdf(p, mu, b, kappa): + if b <= 0: + raise ValueError("Scale Parameter sigma must be positive") + if p <= 0.5: + res = mu - (b / kappa) * pt.log(2 * p) + if p > 0.5: + res = mu + (b / kappa) * pt.log(2 * (1 - p)) + return res class LogNormal(PositiveContinuous): r""" From 17338f62d0d404f9016439a9582a606973015afe Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 6 Feb 2024 16:47:47 +0000 Subject: [PATCH 2/8] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- pymc/distributions/continuous.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/pymc/distributions/continuous.py b/pymc/distributions/continuous.py index 1d8614dd98..006a8cb694 100644 --- a/pymc/distributions/continuous.py +++ b/pymc/distributions/continuous.py @@ -1641,6 +1641,7 @@ def logp(value, b, kappa, mu): kappa > 0, msg="b > 0, kappa > 0", ) + def icdf(p, mu, b, kappa): if b <= 0: raise ValueError("Scale Parameter sigma must be positive") @@ -1650,6 +1651,7 @@ def icdf(p, mu, b, kappa): res = mu + (b / kappa) * pt.log(2 * (1 - p)) return res + class LogNormal(PositiveContinuous): r""" Log-normal log-likelihood. From 628fa168f11cdf46ced59cbe2a196c51fb6a6a9f Mon Sep 17 00:00:00 2001 From: paramthakkar123 Date: Wed, 7 Feb 2024 07:54:15 +0530 Subject: [PATCH 3/8] Added unit tests --- pymc/distributions/continuous.py | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/pymc/distributions/continuous.py b/pymc/distributions/continuous.py index 1d8614dd98..62fe6a068b 100644 --- a/pymc/distributions/continuous.py +++ b/pymc/distributions/continuous.py @@ -1641,14 +1641,20 @@ def logp(value, b, kappa, mu): kappa > 0, msg="b > 0, kappa > 0", ) - def icdf(p, mu, b, kappa): + def icdf(value, b, kappa, mu): if b <= 0: raise ValueError("Scale Parameter sigma must be positive") - if p <= 0.5: - res = mu - (b / kappa) * pt.log(2 * p) - if p > 0.5: - res = mu + (b / kappa) * pt.log(2 * (1 - p)) - return res + if value <= 0.5: + res = mu - (b / kappa) * pt.log(2 * value) + if value > 0.5: + res = mu + (b / kappa) * pt.log(2 * (1 - value)) + res = check_icdf_parameters(res, value) + return check_icdf_parameters( + res, + b > 0, + kappa > 0, + msg="b > 0, kappa > 0" + ) class LogNormal(PositiveContinuous): r""" From 17fbf6efdca644c5a483c17c3f7f30edb4d487e4 Mon Sep 17 00:00:00 2001 From: paramthakkar123 Date: Wed, 7 Feb 2024 08:16:44 +0530 Subject: [PATCH 4/8] Added test --- tests/distributions/test_continuous.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/tests/distributions/test_continuous.py b/tests/distributions/test_continuous.py index 80bbb816c8..f2041ed22d 100644 --- a/tests/distributions/test_continuous.py +++ b/tests/distributions/test_continuous.py @@ -488,6 +488,11 @@ def test_laplace_asymmetric(self): laplace_asymmetric_logpdf, decimal=select_by_precision(float64=6, float32=2), ) + check_icdf( + pm.AsymmetricLaplace, + {"b": Rplus, "kappa": Rplus, "mu": R}, + lambda q, kappa, mu, b: st.laplace_asymmetric.ppf(q, kappa, mu, b) + ) def test_lognormal(self): check_logp( From f739c2453c3c9ff666b2a2c2ac74af953b4b5907 Mon Sep 17 00:00:00 2001 From: Param Thakkar <128291516+ParamThakkar123@users.noreply.github.com> Date: Mon, 12 Feb 2024 12:13:55 +0530 Subject: [PATCH 5/8] Changed comparison operator to pytensor comparison operators --- pymc/distributions/continuous.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/pymc/distributions/continuous.py b/pymc/distributions/continuous.py index 60ad74a725..26da86fe47 100644 --- a/pymc/distributions/continuous.py +++ b/pymc/distributions/continuous.py @@ -1641,12 +1641,13 @@ def logp(value, b, kappa, mu): kappa > 0, msg="b > 0, kappa > 0", ) + def icdf(value, b, kappa, mu): - if b <= 0: + if pt.le(b, 0): raise ValueError("Scale Parameter b must be positive") - if value <= 0.5: + if pt.le(value, 0.5): res = mu - (b / kappa) * pt.log(2 * value) - if value > 0.5: + if pt.gt(value, 0.5): res = mu + (b / kappa) * pt.log(2 * (1 - value)) res = check_icdf_parameters(res, value) return check_icdf_parameters( From acb30b1f17bc6c631fa1c21ff143f692dd707974 Mon Sep 17 00:00:00 2001 From: Param Thakkar <128291516+ParamThakkar123@users.noreply.github.com> Date: Mon, 12 Feb 2024 12:16:55 +0530 Subject: [PATCH 6/8] Update continuous.py --- pymc/distributions/continuous.py | 1 - 1 file changed, 1 deletion(-) diff --git a/pymc/distributions/continuous.py b/pymc/distributions/continuous.py index 26da86fe47..7495d43513 100644 --- a/pymc/distributions/continuous.py +++ b/pymc/distributions/continuous.py @@ -1641,7 +1641,6 @@ def logp(value, b, kappa, mu): kappa > 0, msg="b > 0, kappa > 0", ) - def icdf(value, b, kappa, mu): if pt.le(b, 0): raise ValueError("Scale Parameter b must be positive") From 524c1009b304320a785dac39a22ea9c835c3e014 Mon Sep 17 00:00:00 2001 From: Param Thakkar <128291516+ParamThakkar123@users.noreply.github.com> Date: Mon, 12 Feb 2024 17:26:48 +0530 Subject: [PATCH 7/8] Replaced Python If condition by Pytensor switch --- pymc/distributions/continuous.py | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/pymc/distributions/continuous.py b/pymc/distributions/continuous.py index 7495d43513..9039563c3f 100644 --- a/pymc/distributions/continuous.py +++ b/pymc/distributions/continuous.py @@ -1642,12 +1642,14 @@ def logp(value, b, kappa, mu): msg="b > 0, kappa > 0", ) def icdf(value, b, kappa, mu): - if pt.le(b, 0): - raise ValueError("Scale Parameter b must be positive") - if pt.le(value, 0.5): - res = mu - (b / kappa) * pt.log(2 * value) - if pt.gt(value, 0.5): - res = mu + (b / kappa) * pt.log(2 * (1 - value)) + res = pt.switch(pt.le(b, 0), + lambda: raise ValueError("Scale Parameter b must be positive"), + pt.switch( + pt.le(value, 0.5), + lambda: mu - (b / kappa) * pt.log(2 * value), + lambda: mu + (b / kappa) * pt.log(2 * (1 - value)) + ) + ) res = check_icdf_parameters(res, value) return check_icdf_parameters( res, From bb312a81e17b948f99d27e23722830b32ac177e7 Mon Sep 17 00:00:00 2001 From: Param Thakkar <128291516+ParamThakkar123@users.noreply.github.com> Date: Mon, 12 Feb 2024 17:28:59 +0530 Subject: [PATCH 8/8] Update continuous.py --- pymc/distributions/continuous.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pymc/distributions/continuous.py b/pymc/distributions/continuous.py index 9039563c3f..b8857b2fe2 100644 --- a/pymc/distributions/continuous.py +++ b/pymc/distributions/continuous.py @@ -1643,7 +1643,7 @@ def logp(value, b, kappa, mu): ) def icdf(value, b, kappa, mu): res = pt.switch(pt.le(b, 0), - lambda: raise ValueError("Scale Parameter b must be positive"), + lambda: ValueError("Scale Parameter b must be positive"), pt.switch( pt.le(value, 0.5), lambda: mu - (b / kappa) * pt.log(2 * value),