Skip to content

Commit 6c76f1f

Browse files
committed
Implement log CDF for Triangular distribution
1 parent a9f1b02 commit 6c76f1f

File tree

2 files changed

+20
-0
lines changed

2 files changed

+20
-0
lines changed

pymc3/distributions/continuous.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1414,3 +1414,21 @@ def logp(self, value):
14141414
tt.switch(tt.eq(value, c), tt.log(2 / (upper - lower)),
14151415
tt.switch(alltrue_elemwise([c < value, value <= upper]),
14161416
tt.log(2 * (upper - value) / ((upper - lower) * (upper - c))),np.inf)))
1417+
1418+
def logcdf(self, value):
1419+
l = self.lower
1420+
u = self.upper
1421+
c = self.c
1422+
return tt.switch(
1423+
tt.le(value, l),
1424+
-np.inf,
1425+
tt.switch(
1426+
tt.le(value, c),
1427+
tt.log(((value - l) ** 2) / ((u - l) * (c - l))),
1428+
tt.switch(
1429+
tt.lt(value, u),
1430+
tt.log1p(-((u - value) ** 2) / ((u - l) * (u - c))),
1431+
0
1432+
)
1433+
)
1434+
)

pymc3/tests/test_distributions.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -373,6 +373,8 @@ def test_triangular(self):
373373
self.pymc3_matches_scipy(
374374
Triangular, Runif, {'lower': -Rplusunif, 'c': Runif, 'upper': Rplusunif},
375375
lambda value, c, lower, upper: sp.triang.logpdf(value, c-lower, lower, upper-lower))
376+
self.check_logcdf(Triangular, Runif, {'lower': -Rplusunif, 'c': Runif, 'upper': Rplusunif},
377+
lambda value, c, lower, upper: sp.triang.logcdf(value, c-lower, lower, upper-lower))
376378

377379
def test_bound_normal(self):
378380
PositiveNormal = Bound(Normal, lower=0.)

0 commit comments

Comments
 (0)