Changelog
Source:NEWS.md
gkwdist 1.1.3
Bug Fixes
llgkw()invalid parameter return (gkw.cpp): Fixed critical error where the negative log-likelihood returnedR_NegInf(−∞) for invalid parameters instead ofR_PosInf(+∞). Gradient-based MLE optimizers interpret −∞ as a global minimum, causing them to converge to the invalid boundary rather than the true MLE.gkwinit.cpp— delta validation (gkwinit.cpp): Fixed internalgkw_pdf()rejectingdelta = 0(a valid GKw parameter value) due to a strictdelta <= 0check that should have beendelta < 0.gkwinit.cpp— EKw/Kw sub-family PDF mapping (gkwinit.cpp): Fixedekw_pdf()andkw_pdf()passingdelta = 1instead of the correctdelta = 0when delegating togkw_pdf(). EKw and Kw are GKw sub-families withdelta = 0, notdelta = 1. This produced wrong starting values for MLE of these families.hsbkw()— v^(β−1) computation (bkw.cpp): Fixed the Hessian of the BKw negative log-likelihood returning a wrong value for β < 1. The ternary expression(beta > 1.0) ? v_beta/v : 1.0coincidentally produces the correct result for β = 1 but is wrong for all 0 < β < 1. Replaced with the exact formulasafe_exp((beta - 1.0) * ln_v).
Numerical Stability
safe_exp()underflow scaling (utils.h): Fixed a systematic 10× error in the moderate-underflow branch. The previous implementation usedDBL_MIN_SAFE * exp(x − log(DBL_MIN))whereDBL_MIN_SAFE = 10 * DBL_MIN, yielding10 * exp(x)instead ofexp(x). The fix usesDBL_MIN * exp(x − log(DBL_MIN)) = exp(x)exactly.dgkw()silent boundary truncation removed (gkw.cpp): Removed a block that silently skipped data points withinSQRT_EPSILON^(1/α)of 0 or 1, returning density 0 for those points without warning. The log-space computation handles near-boundary values correctly without this truncation.llekw()/grekw()— lambda clamping removed (ekw.cpp): Removed the arbitrary caplambda_factor = min(lambda_factor, 1000)applied to gradient and Hessian terms when λ > 1000. This distorted optimization for large-λ scenarios and produced incorrect standard errors.
Code Quality
gkwinit.cpp: Removedusing namespace Rcpp;at file scope; replaced with explicitRcpp::qualifications. Added NA/NaN filtering before moment computation to prevent silent corruption when input data contains missing values.bkw.cpp: Removed spurioustry/catchblocks wrappingRcpp::as<arma::vec>()conversions ingrbkw()andhsbkw(). These conversions cannot throw in this context and the silent fallback masked type errors.gkw.cpp/ekw.cpp: Refactored Hessian accumulation to build only the upper triangle inside the observation loop and symmetrize once afterwards witharma::symmatu(), eliminating O(n × p²) redundant assignments.utils.h—vec_safe_pow()UB guard: Added guard preventing undefined behaviour when casting largey_roundedvalues (>INT_MAX) tointfor odd-exponent sign detection.utils.h—vec_safe_pow()SIMD fast path: Added an early-return patharma::exp(y * arma::log(x))for the common case (y > 0, all x > 0) that is fully auto-vectorizable, improving throughput in gradient/Hessian evaluation.
gkwdist 1.1.2
CRAN release: 2026-01-08
Code Cleanup and Testing Enhancement
C++ Code Cleanup
-
Removed legacy commented code: Cleaned up all C++ source files (
gkw.cpp,bkw.cpp,kkw.cpp,ekw.cpp,kw.cpp,bpmc.cpp,beta_.cpp) by removing old commented-out implementations that were kept for reference. -
Code formatting: Improved R wrapper formatting with consistent indentation and alignment in
.Call()invocations and roxygen examples.
New Test Suites
-
Analytical derivatives validation (
test-derivatives-validation.R):- 70 comprehensive tests validating gradient (
gr*) and Hessian (hs*) functions - Compares analytical derivatives against numerical differentiation via
numDeriv - Covers all 7 subfamilies: GKw, BKw, KKw, EKw, Mc, Kw, Beta
- Multiple parameter configurations per subfamily for robustness
- 70 comprehensive tests validating gradient (
-
MLE performance benchmarks (
test-mle-performance.R):- Compares optimization efficiency across three scenarios: numerical-only, analytical gradient, and analytical gradient + Hessian
- Validates that analytical derivatives provide equivalent or better accuracy
- Tests convergence rates and computational time across all distribution families
gkwdist 1.1.1
CRAN release: 2025-11-27
Major Refactoring Release
This release represents a comprehensive refactoring of the entire package codebase, focusing on numerical stability, code consistency, and maintainability.
C++ Backend Overhaul
-
Unified utility functions: Introduced
utils.hheader providing numerically stable implementations of critical functions:-
log1mexp(): Stable computation of log(1 - exp(x)) using Mächler (2012) methodology -
log1pexp(): Overflow-protected computation of log(1 + exp(x)) -
safe_log(),safe_exp(),safe_pow(): Protected arithmetic operations with graceful handling of edge cases - Vectorized versions (
vec_safe_log,vec_log1mexp, etc.) for efficient array operations
-
Consistent parameter validation: All distribution families now use dedicated parameter checkers (
check_pars(),check_kw_pars(),check_ekw_pars(), etc.) that properly handle NaN, Inf, and boundary conditions.-
Complete documentation: All C++ source files now include comprehensive Doxygen-style documentation headers describing:
- Mathematical formulas for PDF, CDF, quantile, and random generation
- Parameter constraints and special cases
- Numerical stability considerations
- Relationship to parent GKw distribution
Bug Fixes
Fixed critical bug in
qgkw(): Corrected logic error wherelower_tailtransformation was incorrectly applied whenlog_p = TRUE. The probability is now properly converted to linear scale before tail adjustment.Fixed gradient calculation in
grkkw(): Resolved issue wherelog_zwas not recomputed after clampingzto minimum threshold, causing corrupted gradient values near boundaries.Fixed Hessian calculation in
hsmc(): Corrected sign errors and formula for the lambda component of the Hessian matrix for the Beta-Power/McDonald distribution.Fixed gradient signs in
grmc(): Ensured consistent computation of log-likelihood gradient before negation for optimization.
Code Quality Improvements
Eliminated unused variables: Removed declared but unused constants (
exp_threshold) and intermediate variables across all distribution files.Removed redundant calculations: Streamlined computations, notably in
pgkw()where logarithm was computed twice for the same quantity.Simplified parameter recycling: Replaced double-modulo indexing pattern (
idx = i % k; vec[idx % vec.n_elem]) with direct single-modulo access (vec[i % vec.n_elem]) in random generation functions.Standardized function signatures: All distribution functions now follow consistent patterns for parameter order, validation, and return value handling.
R Wrapper Layer
-
Complete separation of R and C++ interfaces: All exported R functions now serve as wrappers around internal C++ implementations (
.dgkw_cpp,.pgkw_cpp, etc.), providing:- Enhanced input validation with informative error messages
- Consistent argument checking across all distribution families
- Proper NA/NaN propagation
- Documentation accessible via standard R help system
Distribution Families
All seven distribution families have been refactored with identical improvements:
| Distribution | Parameters | File |
|---|---|---|
| Generalized Kumaraswamy (GKw) | α, β, γ, δ, λ | gkw.cpp |
| Kumaraswamy-Kumaraswamy (KKw) | α, β, δ, λ | kkw.cpp |
| Beta-Kumaraswamy (BKw) | α, β, γ, δ | bkw.cpp |
| Exponentiated Kumaraswamy (EKw) | α, β, λ | ekw.cpp |
| Beta-Power/McDonald (BP/Mc) | γ, δ, λ | bpmc.cpp |
| Kumaraswamy (Kw) | α, β | kw.cpp |
| Beta (GKw-style) | γ, δ | beta.cpp |
Each family includes: density (d*), distribution (p*), quantile (q*), random generation (r*), negative log-likelihood (ll*), gradient (gr*), and Hessian (hs*) functions.
gkwdist 1.0.5
Documentation Improvements
-
Enhanced Examples for Likelihood Functions: All
ll*,gr*, andhs*functions now include comprehensive examples demonstrating:- Maximum likelihood estimation with analytical gradients
- Univariate profile likelihoods with confidence thresholds
- 2D likelihood surfaces with confidence regions (90%, 95%, 99%)
- Confidence ellipses with marginal intervals for parameter pairs
- Numerical vs analytical derivative verification
- Likelihood ratio tests and score tests
-
Professional Visualization Standards:
- Consistent color scheme across all examples
- Grid-adaptive algorithms for computational efficiency
- Base R only - no external dependencies required
Complete Coverage: Enhanced documentation for all distribution families (Kw, EKw, KKw, GKw) covering 2 to 5 parameters
Theoretical References: Documentation cites foundational work by Carrasco et al. (2010), Jones (2009), Kumaraswamy (1980), and standard inference theory from Casella & Berger (2002)
gkwdist 1.0.1
Major Improvements
Enhanced gkwgetstartvalues() Function
-
NEW: Added
familyparameter to support all distribution families- Automatically returns correct number of parameters for each family
- Family-specific initial value strategies for better convergence
- Supported families:
"gkw","bkw","kkw","ekw","mc","kw","beta" - Case-insensitive family names for user convenience
Documentation Enhancements
-
README.md: Complete rewrite with mathematical rigor
- All LaTeX formulas corrected and verified for proper rendering
- Eight comprehensive examples using
optim()with analytical gradients - Corrected function signatures: all
ll*(),gr*(), andhs*()functions use(par, data)signature - Added performance benchmarks demonstrating 10-50× speedup with C++ implementation
- Hierarchical structure diagram for all distribution families
- Model selection workflow and practical guidelines
- Removed all references to deprecated
gkwfit()function
Bug Fixes
- Fixed function call signatures in all README examples to match actual implementation
- Corrected parameter passing in optimization examples (now consistently use
(par, data)) - Fixed LaTeX rendering issues with
\left/\rightdelimiters in GitHub Markdown
Testing
-
NEW: Comprehensive test suite using
testthat- 100+ tests covering all exported functions
- Tests for all 7 distribution families (GKw, BKw, KKw, EKw, MC, Kw, Beta)
- PDF, CDF, quantile, and random generation tests
- Log-likelihood, gradient, and Hessian validation
- Parameter recovery tests with MLE
- Edge cases and boundary condition handling
- Integration tests for PDF-CDF consistency
Performance
- All functions implemented in C++ for maximum computational efficiency
- Analytical derivatives (gradient and Hessian) provide exact computations
- Optimized numerical stability for extreme parameter values
Notes
- This is the initial CRAN submission
- Package focuses exclusively on distribution functions (no high-level fitting interface)
- Companion package
gkwregprovides regression modeling capabilities - All user-facing functions maintain backward compatibility
- C++ implementation uses RcppArmadillo for linear algebra operations
- Analytical functions use robust log-scale computations to prevent overflow/underflow
- Random generation uses inverse CDF method where closed-form solutions exist
gkwdist 0.1.0
New Features
- Initial CRAN release
- Generalized Kumaraswamy distribution (5 parameters)
- Six nested sub-families: Beta, Kumaraswamy, Exponentiated-Kumaraswamy, Kumaraswamy-Kumaraswamy, Beta-Kumaraswamy, and McDonald distributions
- Complete set of distribution functions (d/p/q/r)
- Log-likelihood, gradient, and Hessian functions for all families