diff --git a/.tools/envs/testenv-linux.yml b/.tools/envs/testenv-linux.yml index 90a4ea832..427c3b6fe 100644 --- a/.tools/envs/testenv-linux.yml +++ b/.tools/envs/testenv-linux.yml @@ -30,6 +30,7 @@ dependencies: - pyyaml # dev, tests - jinja2 # dev, tests - annotated-types # dev, tests + - tranquilo>=0.1.0 # tests - iminuit # dev, tests - cma # dev, tests - pygad # dev, tests diff --git a/.tools/envs/testenv-nevergrad.yml b/.tools/envs/testenv-nevergrad.yml index 071f60493..9896219de 100644 --- a/.tools/envs/testenv-nevergrad.yml +++ b/.tools/envs/testenv-nevergrad.yml @@ -28,6 +28,7 @@ dependencies: - pyyaml # dev, tests - jinja2 # dev, tests - annotated-types # dev, tests + - tranquilo>=0.1.0 # tests - iminuit # dev, tests - cma # dev, tests - pygad # dev, tests diff --git a/.tools/envs/testenv-numpy.yml b/.tools/envs/testenv-numpy.yml index cc762dfe7..c002b4ab2 100644 --- a/.tools/envs/testenv-numpy.yml +++ b/.tools/envs/testenv-numpy.yml @@ -28,6 +28,7 @@ dependencies: - pyyaml # dev, tests - jinja2 # dev, tests - annotated-types # dev, tests + - tranquilo>=0.1.0 # tests - iminuit # dev, tests - cma # dev, tests - pygad # dev, tests diff --git a/.tools/envs/testenv-others.yml b/.tools/envs/testenv-others.yml index fa2e4f644..e8e64c7e7 100644 --- a/.tools/envs/testenv-others.yml +++ b/.tools/envs/testenv-others.yml @@ -28,6 +28,7 @@ dependencies: - pyyaml # dev, tests - jinja2 # dev, tests - annotated-types # dev, tests + - tranquilo>=0.1.0 # tests - iminuit # dev, tests - cma # dev, tests - pygad # dev, tests diff --git a/.tools/envs/testenv-pandas.yml b/.tools/envs/testenv-pandas.yml index d2005eae4..1e784e3cd 100644 --- a/.tools/envs/testenv-pandas.yml +++ b/.tools/envs/testenv-pandas.yml @@ -28,6 +28,7 @@ dependencies: - pyyaml # dev, tests - jinja2 # dev, tests - annotated-types # dev, tests + - tranquilo>=0.1.0 # tests - iminuit # dev, tests - cma # dev, tests - pygad # dev, tests diff --git a/.tools/envs/testenv-plotly.yml b/.tools/envs/testenv-plotly.yml index 77484727c..bd2c57534 100644 --- a/.tools/envs/testenv-plotly.yml +++ b/.tools/envs/testenv-plotly.yml @@ -28,6 +28,7 @@ dependencies: - pyyaml # dev, tests - jinja2 # dev, tests - annotated-types # dev, tests + - tranquilo>=0.1.0 # tests - iminuit # dev, tests - cma # dev, tests - pygad # dev, tests diff --git a/codecov.yml b/codecov.yml index bd9681c15..d25993136 100644 --- a/codecov.yml +++ b/codecov.yml @@ -14,9 +14,6 @@ coverage: default: target: 90% ignore: - - setup.py # Uses numba - src/optimagic/benchmarking/cartis_roberts.py - # not installed on CI - - src/optimagic/optimizers/tranquilo.py - tests/**/* diff --git a/environment.yml b/environment.yml index 55cfeb888..e772396e6 100644 --- a/environment.yml +++ b/environment.yml @@ -40,6 +40,7 @@ dependencies: - jinja2 # dev, tests - furo # dev, docs - annotated-types # dev, tests + - tranquilo>=0.1.0 # tests - iminuit # dev, tests - cma # dev, tests - pygad # dev, tests diff --git a/src/optimagic/optimizers/tranquilo.py b/src/optimagic/optimizers/tranquilo.py index becffe5f4..38c7bda47 100644 --- a/src/optimagic/optimizers/tranquilo.py +++ b/src/optimagic/optimizers/tranquilo.py @@ -5,6 +5,7 @@ import numpy as np from numpy.typing import NDArray +from packaging import version from optimagic import mark from optimagic.config import IS_TRANQUILO_INSTALLED @@ -34,6 +35,20 @@ VarianceEstimatorOptions, ) +if IS_TRANQUILO_INSTALLED: + import tranquilo + + IS_TRANQUILO_VERSION_NEWER_OR_EQUAL_TO_0_1_0 = version.parse( + tranquilo.__version__ + ) >= version.parse("0.1.0") +else: + IS_TRANQUILO_VERSION_NEWER_OR_EQUAL_TO_0_1_0 = False + +TRANQUILO_INSTALLATION_INSTRUCTIONS = ( + "The 'tranquilo' algorithm requires the tranquilo package version 0.1.0 or newer " + "to be installed. Install it with 'conda -c conda-forge install tranquilo>=0.1.0'." +) + @mark.minimizer( name="tranquilo", @@ -48,7 +63,7 @@ supports_infinite_bounds=True, supports_linear_constraints=False, supports_nonlinear_constraints=False, - disable_history=True, + disable_history=False, ) @dataclass(frozen=True) class Tranquilo(Algorithm): @@ -164,17 +179,13 @@ class Tranquilo(Algorithm): def _solve_internal_problem( self, problem: InternalOptimizationProblem, x0: NDArray[np.float64] ) -> InternalOptimizeResult: - if not IS_TRANQUILO_INSTALLED: - raise NotInstalledError( - "The 'tranquilo-ls' algorithm requires the tranquilo package " - "to be installed. You can install it with " - "'conda install -c conda-forge tranquilo'." - ) + if not IS_TRANQUILO_VERSION_NEWER_OR_EQUAL_TO_0_1_0: + raise NotInstalledError(TRANQUILO_INSTALLATION_INSTRUCTIONS) from tranquilo.tranquilo import _tranquilo raw_res = _tranquilo( functype="scalar", - criterion=problem.fun, + batch_fun=problem.batch_fun, x=x0, lower_bounds=problem.bounds.lower, upper_bounds=problem.bounds.upper, @@ -190,7 +201,6 @@ def _solve_internal_problem( stopping_max_criterion_evaluations=self.stopping_maxfun, stopping_max_iterations=self.stopping_maxiter, stopping_max_time=self.stopping_maxtime, - batch_evaluator=self.batch_evaluator, n_cores=self.n_cores, batch_size=self.batch_size, sample_size=self.sample_size, @@ -242,7 +252,7 @@ def _solve_internal_problem( supports_infinite_bounds=True, supports_linear_constraints=False, supports_nonlinear_constraints=False, - disable_history=True, + disable_history=False, ) @dataclass(frozen=True) class TranquiloLS(Algorithm): @@ -356,17 +366,13 @@ class TranquiloLS(Algorithm): def _solve_internal_problem( self, problem: InternalOptimizationProblem, x0: NDArray[np.float64] ) -> InternalOptimizeResult: - if not IS_TRANQUILO_INSTALLED: - raise NotInstalledError( - "The 'tranquilo-ls' algorithm requires the tranquilo package " - "to be installed. You can install it with " - "'conda install -c conda-forge tranquilo'." - ) + if not IS_TRANQUILO_VERSION_NEWER_OR_EQUAL_TO_0_1_0: + raise NotInstalledError(TRANQUILO_INSTALLATION_INSTRUCTIONS) from tranquilo.tranquilo import _tranquilo raw_res = _tranquilo( functype="least_squares", - criterion=problem.fun, + batch_fun=problem.batch_fun, x=x0, lower_bounds=problem.bounds.lower, upper_bounds=problem.bounds.upper, @@ -382,7 +388,6 @@ def _solve_internal_problem( stopping_max_criterion_evaluations=self.stopping_maxfun, stopping_max_iterations=self.stopping_maxiter, stopping_max_time=self.stopping_maxtime, - batch_evaluator=self.batch_evaluator, n_cores=self.n_cores, batch_size=self.batch_size, sample_size=self.sample_size,