Added
boundaryoptimizer parameter for out-of-bounds candidate handling, withclip,reflect,periodic,random, andintermediatestrategies- Documentation and runnable example for boundary strategies
- SciPy stats continuous distributions can now be used as search-space dimensions; optimizers operate on quantiles internally and pass
ppfvalues to objective functions - Example for SciPy distribution-backed search spaces
SearchParamsdict subclass carrying optimization metadata as private attributes for tooling integration
Changed
- SciPy moved from core dependency to optional extra (
pip install gradient-free-optimizers[scipy]) - All optimizers ported from direct numpy imports to the internal array/math backends, enabling numpy-free operation
- All pandas imports made lazy, reducing startup cost
- Bayesian Optimization normalizes inputs to [0, 1] before GP fitting for better length-scale stability
- GPR surrogate switched from Matern ν=0.5 to ν=2.5 with hyperparameter optimization (
n_restarts_optimizer=3) - TPE bandwidth selection changed from hardcoded 1.0 to Silverman's rule
- Performance improvements in GPR kernel and KDE score computation via vectorized distance matrices
- License metadata migrated to PEP 639 format (
license = "MIT"under[project]), fixingSetuptoolsDeprecationWarning
Removed
- Legacy optimizer implementations (
optimizers_legacy/)
Fixed
- Warm-start rows with distribution values outside the search space are now dropped instead of being silently clipped to boundary quantiles
- NaN distribution quantile positions now fall back to the midpoint quantile instead of propagating NaN to objective functions
- KDE bandwidth computation on degenerate data (all identical points) causing division-by-zero
- KDE bandwidth not recomputed on refit with new data
min/maxbroadcasting in the pure-Python array backendnorm_cdf/norm_pdfrecursion when checking for iterability
Tests
- Coverage for SciPy distribution-backed search spaces across optimizers, memory warm starts, SMBO warm starts, constraints, and ask/tell
- Unit tests for all six internal estimators
- Pure-Python backend integration tests (no numpy, no scipy)
- Expanded coverage for distributed module and ask/tell interface
- CI: no-scipy and no-numpy isolation jobs, coverage collection
- CI: strict mode (
GFO_CI_STRICT) prevents dependency-isolation tests from silently skipping when the wrong packages are installed
Full Changelog: v1.12.0...v1.13.0