Skip to content

Commit 2590ac0

Browse files
committed
invlogccdf_newton(): extract df(x)
1 parent 59a2831 commit 2590ac0

File tree

1 file changed

+6
-4
lines changed

1 file changed

+6
-4
lines changed

src/quantilealgs.jl

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -121,19 +121,21 @@ end
121121

122122
function invlogccdf_newton(d::ContinuousUnivariateDistribution, lp::Real, xs::Real=mode(d), tol::Real=1e-12)
123123
T = typeof(lp - logpdf(d,xs))
124+
f_a(x) = exp(lp - logpdf(d,x) + logexpm1(max(logccdf(d,x)-lp,0)))
125+
f_b(x) = -exp(lp - logpdf(d,x) + log1mexp(min(logccdf(d,x)-lp,0)))
124126
if -Inf < lp < 0
125127
x0 = T(xs)
126128
if lp < logccdf(d,x0)
127-
x = x0 + exp(lp - logpdf(d,x0) + logexpm1(max(logccdf(d,x0)-lp,0)))
129+
x = x0 + f_a(x0)
128130
while abs(x-x0) > max(abs(x),abs(x0)) * tol
129131
x0 = x
130-
x = x0 + exp(lp - logpdf(d,x0) + logexpm1(max(logccdf(d,x0)-lp,0)))
132+
x = x0 + f_a(x0)
131133
end
132134
else
133-
x = x0 - exp(lp - logpdf(d,x0) + log1mexp(min(logccdf(d,x0)-lp,0)))
135+
x = x0 + f_b(x0)
134136
while abs(x-x0) > max(abs(x),abs(x0)) * tol
135137
x0 = x
136-
x = x0 - exp(lp - logpdf(d,x0) + log1mexp(min(logccdf(d,x0)-lp,0)))
138+
x = x0 + f_b(x0)
137139
end
138140
end
139141
return x

0 commit comments

Comments
 (0)