GlobalSearch-rs: A multistart framework for global optimization written in Rust
Abstract
What's Changed Breaking changes Simplified OQNLPParams API: The explicit LocalSolverType field has been removed. The solver type is now inferred from LocalSolverConfig. New helpers LocalSolverConfig::solver_type and OQNLPParams::local_solver_type expose it. This removes a class of bugs where the solver type and its config could be set inconsistently. Migration: drop the local_solver_type argument when constructing OQNLPParams. Reliability Objective-value comparisons now use total_cmp instead of partial_cmp, giving consistent NaN handling and eliminating potential panics from unwrap() on a None ordering. Applies to both the Rust core (OQNLP) and the Python SolutionSet. Python bindings Callbacks (objective, gradient, hessian, constraints) now accept and return numpy.ndarray. variable_bounds accepts an ndarray, a list-of-lists, or a callable. Variable bounds are resolved and cached at construction, avoiding repeated Python re-entry during optimization. PyLocalSolution gains an as_array() accessor; type stubs updated for NDArray types. Local solver is now selected via the LocalSolverType enum instead of inferred strings. numpy added to the build-system requirements. Performance/internals LocalSolution is now passed by reference throughout, avoiding unnecessary clones. Dependencies cobyla 0.8 to 1.0.2 rand 0.9.2 to 0.10.0 pyo3 0.27.2 to 0.28.3 (+ numpy crate 0.28) thiserror 2.0.17 to 2.0.18 kdam 0.6.3 to 0.6.4 Maintenance CI fixes and clippy cleanups. Expanded test suite: numpy-integration and error-handling tests for the Python bindings. README updates and committed lockfiles.
Publication details
- Journal / source
- Zenodo (CERN European Organization for Nuclear Research)
- Publication date
- 30 May 2026
- Language
- EN