Skip to content

Releases: SimonBlanke/Gradient-Free-Optimizers

v1.13.0

Choose a tag to compare

@SimonBlanke SimonBlanke released this 15 May 19:01

Added

  • boundary optimizer parameter for out-of-bounds candidate handling, with clip, reflect, periodic, random, and intermediate strategies
  • 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 ppf values to objective functions
  • Example for SciPy distribution-backed search spaces
  • SearchParams dict 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]), fixing SetuptoolsDeprecationWarning

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/max broadcasting in the pure-Python array backend
  • norm_cdf/norm_pdf recursion 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

v1.12.0

Choose a tag to compare

@SimonBlanke SimonBlanke released this 18 Apr 18:50

What's Changed

Full Changelog: v1.11.1...v1.12.0

v1.11.1

Choose a tag to compare

@SimonBlanke SimonBlanke released this 15 Mar 11:57

Full Changelog: v1.11.0...v1.11.1

v1.11.0

Choose a tag to compare

@SimonBlanke SimonBlanke released this 14 Mar 16:00

Full Changelog: v1.10.1...v1.11.0

v1.10.1

Choose a tag to compare

@SimonBlanke SimonBlanke released this 19 Feb 23:55

Fixed

  • optimum="minimum" parameter in search() had no effect on the actual optimization. The objective adapter received the raw function instead of the negated one, causing the optimizer to maximize regardless of the optimum setting. The negation was only applied to the progress bar display.

Full Changelog: v1.10.0...v1.10.1

v1.10.0

Choose a tag to compare

@SimonBlanke SimonBlanke released this 16 Feb 17:34

Added

  • New optimizer module (optimizers/) using the Template Method Pattern with explicit hook methods (_iterate_continuous_batch, _iterate_categorical_batch, _iterate_discrete_batch)
  • Extended search space dimension types: continuous (min, max) tuples, categorical ["a", "b"] lists, and discrete numerical NumPy arrays
  • DimensionType enum, DimensionInfo dataclass, and DimensionMasks for dimension-aware vectorized operations
  • Automatic vectorization for search spaces with 1000+ dimensions via DimensionIteratorMixin
  • resolution parameter for GridSearchOptimizer and DirectAlgorithm to handle continuous dimensions
  • Mixed-type distance metric (Gower-like) for the DIRECT algorithm across heterogeneous dimensions
  • Lazy search data construction in ResultsManager for reduced memory footprint during optimization
  • State management via property setters with automatic history tracking in CoreOptimizer
  • Extended search-space tests for all optimizers
  • Examples for mixed and large search spaces
  • Sphinx documentation site with landing page, logos, and navigation

Changed

  • All optimizers reimplemented to comply with the new Template Method architecture
  • Legacy optimizer implementations preserved in optimizers_legacy/ (not part of public API)
  • SciPy restored as a core dependency
  • Wall clipping algorithm reworked
  • Optimizer initialization refactored (finish_initialization, _generate_position pattern)
  • Converter enhanced with dimension type analysis (_analyze_dimension_types)
  • Updated CI workflow configuration

Fixed

  • finish_initialization in Downhill Simplex and other optimizers
  • _move_random in sequential model-based optimizers
  • Init position and evaluate_init override issues in optimizer subclasses
  • Empty scores edge case in evaluation

Full Changelog: v1.9.0...v1.10.0

v1.9.0

Choose a tag to compare

@SimonBlanke SimonBlanke released this 15 Jan 19:39

Added

  • Private array backend (_array_backend) for pure Python array operations without NumPy
  • Private math backend (_math_backend) for mathematical operations without SciPy
  • Native DecisionTreeRegressor implementation
  • Native ExtraTreesRegressor implementation
  • Native RandomForestRegressor implementation
  • Native GradientBoostingRegressor implementation
  • SimpleProgressBar class as fallback when tqdm is unavailable
  • Sigma self-adaptation for EvolutionStrategyOptimizer
  • convergence_threshold parameter for Powell's Method
  • Type hints to all optimizer classes and Search class
  • Comprehensive docstrings for all optimizer classes
  • Sphinx documentation with ReadTheDocs integration
  • API tests for all optimizer categories

Changed

  • scikit-learn is now an optional dependency (native estimators used by default)
  • SciPy is now an optional dependency
  • tqdm is now an optional dependency
  • Complete reimplementation of Powell's Method with improved line search algorithms
  • Reworked README with new 3D optimization animation
  • Consolidated CI workflows into single ci.yml
  • Restructured test directory (tests/test_main/, tests/test_internal/, etc.)
  • Improved error messages with actionable suggestions

Removed

  • BayesianRidge estimator
  • Linear GP option from Gaussian Process regressor

Fixed

  • Golden section search algorithm in Powell's Method
  • Mutable default argument anti-pattern (constraints=[] changed to constraints=None)
  • Missing @functools.wraps on internal decorators
  • Division by zero edge case in print-times
  • Bug in evaluate method

v1.8.1

Choose a tag to compare

@SimonBlanke SimonBlanke released this 29 Dec 10:22

Build

v1.8.0

Choose a tag to compare

@SimonBlanke SimonBlanke released this 29 Dec 10:09

Python Version Support

  • Removed support for Python 3.9
  • Added support for Python 3.14
  • Updated CI workflows for macOS, Ubuntu, and Windows

Package Metadata

  • Added keywords and classifiers to pyproject.toml for better PyPI discoverability

Testing Improvements

  • Optimized test suite for faster execution
  • Reduced test iterations in multiple test files
  • Added optimizers_representative parametrization for subset testing
  • Fixed sporadic test failures:
    • test_inf_nan_1: Relaxed lower bound from 10 to 5 for probabilistic validation
    • test_start_temp_1: Added deterministic random seeds and relaxed assertion to allow equality

v1.7.2

Choose a tag to compare

@SimonBlanke SimonBlanke released this 25 Sep 17:43

What's Changed

New Contributors

Full Changelog: v1.7.1...v1.7.2