That’s fantastic - Thanks @junpenglao! Following the second link, my cdf is now:
def CdfPosPoisson(lam):
# return the logP of all non-zero results of Poisson distribution.
return tt.switch(tt.le(lam, np.log(2)),
tt.log(-tt.expm1(-lam)),
tt.log1p(-tt.exp(-lam)))
This performs quite well.
I had tried some numerical tricks for large lambda, but not for small, and the function (1-e^{-\lambda}) has stability issues at both large and small values of \lambda with a minimum around ln2, where these approximations switch.
Thanks again!