Skip to content

Commit 2c3c2a0

Browse files
committed
Add safe values/ parameters for BetaBinomial, Poisson, and HyperGeometric to avoid errors when evaluating negative logcdfs.
1 parent 450a6f7 commit 2c3c2a0

File tree

1 file changed

+8
-3
lines changed

1 file changed

+8
-3
lines changed

pymc3/distributions/discrete.py

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -330,11 +330,12 @@ def logcdf(self, value):
330330
alpha = self.alpha
331331
beta = self.beta
332332
n = self.n
333+
safe_lower = tt.switch(tt.lt(value, 0), value, 0)
333334

334335
return bound(
335336
tt.switch(
336337
tt.lt(value, n),
337-
logsumexp(self.logp(tt.arange(0, value + 1)), keepdims=False),
338+
logsumexp(self.logp(tt.arange(safe_lower, value + 1)), keepdims=False),
338339
0,
339340
),
340341
0 <= value,
@@ -706,9 +707,12 @@ def logcdf(self, value):
706707
"""
707708
mu = self.mu
708709
value = tt.floor(value)
710+
# To avoid issue with #4340
711+
safe_mu = tt.switch(tt.lt(mu, 0), 0, mu)
712+
safe_value = tt.switch(tt.lt(value, 0), 0, value)
709713

710714
return bound(
711-
tt.log(tt.gammaincc(value + 1, mu)),
715+
tt.log(tt.gammaincc(safe_value + 1, safe_mu)),
712716
0 <= value,
713717
0 <= mu,
714718
)
@@ -1133,11 +1137,12 @@ def logcdf(self, value):
11331137
N = self.N
11341138
n = self.n
11351139
k = self.k
1140+
safe_lower = tt.switch(tt.lt(value, 0), value, 0)
11361141

11371142
return bound(
11381143
tt.switch(
11391144
tt.lt(value, n),
1140-
logsumexp(self.logp(tt.arange(0, value + 1)), keepdims=False),
1145+
logsumexp(self.logp(tt.arange(safe_lower, value + 1)), keepdims=False),
11411146
0,
11421147
),
11431148
0 <= value,

0 commit comments

Comments
 (0)