llikNbinom() and llikNbinomMu() now
accept a continuous (non-integer) size. In the negative
binomial’s mean/dispersion parameterisation size is a real
dispersion parameter, not a count, and stats::dnbinom() has
always allowed it. Previously size was stored in an integer
vector and silently truncated, so a size above 1 returned
the log-likelihood at trunc(size) and a size
between 0 and 1 truncated to 0 and aborted; the R-level
assertIntegerish(size) rejected such values outright.
Truncation also made the log-likelihood a step function of
size, so the dispersion could not be estimated even when
its true value was an integer. This blocked nbinomMu()
models with continuous overdispersion in nlmixr2.
size must now be strictly positive; non-positive values
return NA. The INT_MAX bound added in 2.0.15
still applies to x everywhere, and to size for
rxLlikBinom where size is a number of
trials.
llikNbinom() and llikNbinomMu() now
return NA instead of aborting the R process when the mean
handed to the underlying likelihood is out of domain. This covers a
prob of 0 (and, through the C API, a prob
outside [0, 1] or a negative mu), and –
because size is no longer bounded by INT_MAX –
a large size with a small prob whose product
overflows. Previously these threw a C++ exception that escaped the
rxLlikNbinom() / rxLlikNbinomMu() entry points
used by rxode2 solves and focei, killing the
session.
llikNbinom() at prob == 1 and
llikNbinomMu() at mu == 0 now match
stats::dnbinom(). The distribution is degenerate at zero
there, so fx is 0 (a likelihood of 1) at
x == 0 and -Inf otherwise. These are the only
points where stats::dnbinom() defines a value that the
underlying Stan likelihood cannot compute – it requires a strictly
positive mean. No derivative exists at a point mass, so
dProb / dMu are NA; an unusable
gradient beats a NA log-likelihood, and beats the abort
these used to cause. prob == 0 remains NA,
matching the NaN R returns there.
Added more liklihood families and also added a ABI free header for linking
llikXxxInternal() Rcpp functions changed from
int to R_xlen_t; previously vectors longer
than ~500 million elements (>4 GB) could cause undefined behavior due
to int overflow when assigned from
x.size().double-to-int casts for discrete distribution
count arguments (x, size) exceeding
INT_MAX (2147483647); the five affected C-API functions
(rxLlikPois, rxLlikBinom,
rxLlikGeom, rxLlikNbinom,
rxLlikNbinomMu) now return NA instead of
invoking undefined behavior for out-of-range inputs.operator() methods across all 15 distributions: changed
from int to Eigen::Index to match the return
type of Eigen::VectorXd::size().*Internal() C++ functions
directly to bypass R-level input validation.skip()-guarded large-vector test that documents
the R_xlen_t fix and can be run manually on systems with
>4 GB free RAM.NEWS.md file to track changes to the
package.