diff --git a/docs/source/algorithms.md b/docs/source/algorithms.md index c8c379b25..a09878e28 100644 --- a/docs/source/algorithms.md +++ b/docs/source/algorithms.md @@ -313,6 +313,35 @@ automatically installed when you install optimagic. ``` +```{eval-rst} +.. dropdown:: scipy_cobyqa + + **How to use this algorithm:** + + .. code-block:: + + import optimagic as om + om.minimize( + ..., + algorithm=om.algos.scipy_cobyqa(stopping_maxfun=1_000, ...) + ) + + or + + .. code-block:: + + om.minimize( + ..., + algorithm="scipy_cobyqa", + algo_options={"stopping_maxfun": 1_000, ...} + ) + + **Description and available options:** + + .. autoclass:: optimagic.optimizers.scipy_optimizers.ScipyCOBYQA + +``` + ```{eval-rst} .. dropdown:: scipy_truncated_newton diff --git a/src/optimagic/algorithms.py b/src/optimagic/algorithms.py index 795046950..33be900d9 100644 --- a/src/optimagic/algorithms.py +++ b/src/optimagic/algorithms.py @@ -96,6 +96,7 @@ ScipyBFGS, ScipyBrute, ScipyCOBYLA, + ScipyCOBYQA, ScipyConjugateGradient, ScipyDifferentialEvolution, ScipyDirect, @@ -214,7 +215,7 @@ class BoundedGlobalGradientFreeParallelScalarAlgorithms(AlgoSelection): nevergrad_eda: Type[NevergradEDA] = NevergradEDA nevergrad_emna: Type[NevergradEMNA] = NevergradEMNA nevergrad_meta: Type[NevergradMeta] = NevergradMeta - nevergrad_NGOpt: Type[NevergradNGOpt] = NevergradNGOpt + nevergrad_ngopt: Type[NevergradNGOpt] = NevergradNGOpt nevergrad_oneplusone: Type[NevergradOnePlusOne] = NevergradOnePlusOne nevergrad_pso: Type[NevergradPSO] = NevergradPSO nevergrad_randomsearch: Type[NevergradRandomSearch] = NevergradRandomSearch @@ -254,6 +255,7 @@ def Bounded( @dataclass(frozen=True) class BoundedGradientFreeLocalNonlinearConstrainedScalarAlgorithms(AlgoSelection): nlopt_cobyla: Type[NloptCOBYLA] = NloptCOBYLA + scipy_cobyqa: Type[ScipyCOBYQA] = ScipyCOBYQA @dataclass(frozen=True) @@ -441,7 +443,7 @@ class BoundedGlobalGradientFreeScalarAlgorithms(AlgoSelection): nevergrad_eda: Type[NevergradEDA] = NevergradEDA nevergrad_emna: Type[NevergradEMNA] = NevergradEMNA nevergrad_meta: Type[NevergradMeta] = NevergradMeta - nevergrad_NGOpt: Type[NevergradNGOpt] = NevergradNGOpt + nevergrad_ngopt: Type[NevergradNGOpt] = NevergradNGOpt nevergrad_oneplusone: Type[NevergradOnePlusOne] = NevergradOnePlusOne nevergrad_pso: Type[NevergradPSO] = NevergradPSO nevergrad_randomsearch: Type[NevergradRandomSearch] = NevergradRandomSearch @@ -497,7 +499,7 @@ class BoundedGlobalGradientFreeParallelAlgorithms(AlgoSelection): nevergrad_eda: Type[NevergradEDA] = NevergradEDA nevergrad_emna: Type[NevergradEMNA] = NevergradEMNA nevergrad_meta: Type[NevergradMeta] = NevergradMeta - nevergrad_NGOpt: Type[NevergradNGOpt] = NevergradNGOpt + nevergrad_ngopt: Type[NevergradNGOpt] = NevergradNGOpt nevergrad_oneplusone: Type[NevergradOnePlusOne] = NevergradOnePlusOne nevergrad_pso: Type[NevergradPSO] = NevergradPSO nevergrad_randomsearch: Type[NevergradRandomSearch] = NevergradRandomSearch @@ -569,7 +571,7 @@ class GlobalGradientFreeParallelScalarAlgorithms(AlgoSelection): nevergrad_eda: Type[NevergradEDA] = NevergradEDA nevergrad_emna: Type[NevergradEMNA] = NevergradEMNA nevergrad_meta: Type[NevergradMeta] = NevergradMeta - nevergrad_NGOpt: Type[NevergradNGOpt] = NevergradNGOpt + nevergrad_ngopt: Type[NevergradNGOpt] = NevergradNGOpt nevergrad_oneplusone: Type[NevergradOnePlusOne] = NevergradOnePlusOne nevergrad_pso: Type[NevergradPSO] = NevergradPSO nevergrad_randomsearch: Type[NevergradRandomSearch] = NevergradRandomSearch @@ -600,6 +602,7 @@ def NonlinearConstrained( @dataclass(frozen=True) class BoundedGradientFreeLocalNonlinearConstrainedAlgorithms(AlgoSelection): nlopt_cobyla: Type[NloptCOBYLA] = NloptCOBYLA + scipy_cobyqa: Type[ScipyCOBYQA] = ScipyCOBYQA @property def Scalar(self) -> BoundedGradientFreeLocalNonlinearConstrainedScalarAlgorithms: @@ -614,6 +617,7 @@ class BoundedGradientFreeLocalScalarAlgorithms(AlgoSelection): nlopt_newuoa: Type[NloptNEWUOA] = NloptNEWUOA nlopt_neldermead: Type[NloptNelderMead] = NloptNelderMead nlopt_sbplx: Type[NloptSbplx] = NloptSbplx + scipy_cobyqa: Type[ScipyCOBYQA] = ScipyCOBYQA scipy_neldermead: Type[ScipyNelderMead] = ScipyNelderMead scipy_powell: Type[ScipyPowell] = ScipyPowell tranquilo: Type[Tranquilo] = Tranquilo @@ -660,6 +664,7 @@ def Scalar(self) -> BoundedGradientFreeLocalParallelScalarAlgorithms: class GradientFreeLocalNonlinearConstrainedScalarAlgorithms(AlgoSelection): nlopt_cobyla: Type[NloptCOBYLA] = NloptCOBYLA scipy_cobyla: Type[ScipyCOBYLA] = ScipyCOBYLA + scipy_cobyqa: Type[ScipyCOBYQA] = ScipyCOBYQA @property def Bounded(self) -> BoundedGradientFreeLocalNonlinearConstrainedScalarAlgorithms: @@ -690,6 +695,7 @@ def Bounded(self) -> BoundedGradientFreeLeastSquaresLocalParallelAlgorithms: class BoundedGradientFreeNonlinearConstrainedScalarAlgorithms(AlgoSelection): nlopt_cobyla: Type[NloptCOBYLA] = NloptCOBYLA nlopt_isres: Type[NloptISRES] = NloptISRES + scipy_cobyqa: Type[ScipyCOBYQA] = ScipyCOBYQA scipy_differential_evolution: Type[ScipyDifferentialEvolution] = ( ScipyDifferentialEvolution ) @@ -733,7 +739,7 @@ class BoundedGradientFreeParallelScalarAlgorithms(AlgoSelection): nevergrad_eda: Type[NevergradEDA] = NevergradEDA nevergrad_emna: Type[NevergradEMNA] = NevergradEMNA nevergrad_meta: Type[NevergradMeta] = NevergradMeta - nevergrad_NGOpt: Type[NevergradNGOpt] = NevergradNGOpt + nevergrad_ngopt: Type[NevergradNGOpt] = NevergradNGOpt nevergrad_oneplusone: Type[NevergradOnePlusOne] = NevergradOnePlusOne nevergrad_pso: Type[NevergradPSO] = NevergradPSO nevergrad_randomsearch: Type[NevergradRandomSearch] = NevergradRandomSearch @@ -844,7 +850,7 @@ class BoundedGlobalParallelScalarAlgorithms(AlgoSelection): nevergrad_eda: Type[NevergradEDA] = NevergradEDA nevergrad_emna: Type[NevergradEMNA] = NevergradEMNA nevergrad_meta: Type[NevergradMeta] = NevergradMeta - nevergrad_NGOpt: Type[NevergradNGOpt] = NevergradNGOpt + nevergrad_ngopt: Type[NevergradNGOpt] = NevergradNGOpt nevergrad_oneplusone: Type[NevergradOnePlusOne] = NevergradOnePlusOne nevergrad_pso: Type[NevergradPSO] = NevergradPSO nevergrad_randomsearch: Type[NevergradRandomSearch] = NevergradRandomSearch @@ -895,6 +901,7 @@ class BoundedLocalNonlinearConstrainedScalarAlgorithms(AlgoSelection): nlopt_cobyla: Type[NloptCOBYLA] = NloptCOBYLA nlopt_mma: Type[NloptMMA] = NloptMMA nlopt_slsqp: Type[NloptSLSQP] = NloptSLSQP + scipy_cobyqa: Type[ScipyCOBYQA] = ScipyCOBYQA scipy_slsqp: Type[ScipySLSQP] = ScipySLSQP scipy_trust_constr: Type[ScipyTrustConstr] = ScipyTrustConstr @@ -1204,7 +1211,7 @@ class BoundedGlobalGradientFreeAlgorithms(AlgoSelection): nevergrad_eda: Type[NevergradEDA] = NevergradEDA nevergrad_emna: Type[NevergradEMNA] = NevergradEMNA nevergrad_meta: Type[NevergradMeta] = NevergradMeta - nevergrad_NGOpt: Type[NevergradNGOpt] = NevergradNGOpt + nevergrad_ngopt: Type[NevergradNGOpt] = NevergradNGOpt nevergrad_oneplusone: Type[NevergradOnePlusOne] = NevergradOnePlusOne nevergrad_pso: Type[NevergradPSO] = NevergradPSO nevergrad_randomsearch: Type[NevergradRandomSearch] = NevergradRandomSearch @@ -1301,7 +1308,7 @@ class GlobalGradientFreeScalarAlgorithms(AlgoSelection): nevergrad_eda: Type[NevergradEDA] = NevergradEDA nevergrad_emna: Type[NevergradEMNA] = NevergradEMNA nevergrad_meta: Type[NevergradMeta] = NevergradMeta - nevergrad_NGOpt: Type[NevergradNGOpt] = NevergradNGOpt + nevergrad_ngopt: Type[NevergradNGOpt] = NevergradNGOpt nevergrad_oneplusone: Type[NevergradOnePlusOne] = NevergradOnePlusOne nevergrad_pso: Type[NevergradPSO] = NevergradPSO nevergrad_randomsearch: Type[NevergradRandomSearch] = NevergradRandomSearch @@ -1361,7 +1368,7 @@ class GlobalGradientFreeParallelAlgorithms(AlgoSelection): nevergrad_eda: Type[NevergradEDA] = NevergradEDA nevergrad_emna: Type[NevergradEMNA] = NevergradEMNA nevergrad_meta: Type[NevergradMeta] = NevergradMeta - nevergrad_NGOpt: Type[NevergradNGOpt] = NevergradNGOpt + nevergrad_ngopt: Type[NevergradNGOpt] = NevergradNGOpt nevergrad_oneplusone: Type[NevergradOnePlusOne] = NevergradOnePlusOne nevergrad_pso: Type[NevergradPSO] = NevergradPSO nevergrad_randomsearch: Type[NevergradRandomSearch] = NevergradRandomSearch @@ -1403,6 +1410,7 @@ class BoundedGradientFreeLocalAlgorithms(AlgoSelection): nlopt_neldermead: Type[NloptNelderMead] = NloptNelderMead nlopt_sbplx: Type[NloptSbplx] = NloptSbplx pounders: Type[Pounders] = Pounders + scipy_cobyqa: Type[ScipyCOBYQA] = ScipyCOBYQA scipy_neldermead: Type[ScipyNelderMead] = ScipyNelderMead scipy_powell: Type[ScipyPowell] = ScipyPowell tao_pounders: Type[TAOPounders] = TAOPounders @@ -1432,6 +1440,7 @@ def Scalar(self) -> BoundedGradientFreeLocalScalarAlgorithms: class GradientFreeLocalNonlinearConstrainedAlgorithms(AlgoSelection): nlopt_cobyla: Type[NloptCOBYLA] = NloptCOBYLA scipy_cobyla: Type[ScipyCOBYLA] = ScipyCOBYLA + scipy_cobyqa: Type[ScipyCOBYQA] = ScipyCOBYQA @property def Bounded(self) -> BoundedGradientFreeLocalNonlinearConstrainedAlgorithms: @@ -1453,6 +1462,7 @@ class GradientFreeLocalScalarAlgorithms(AlgoSelection): nlopt_praxis: Type[NloptPRAXIS] = NloptPRAXIS nlopt_sbplx: Type[NloptSbplx] = NloptSbplx scipy_cobyla: Type[ScipyCOBYLA] = ScipyCOBYLA + scipy_cobyqa: Type[ScipyCOBYQA] = ScipyCOBYQA scipy_neldermead: Type[ScipyNelderMead] = ScipyNelderMead scipy_powell: Type[ScipyPowell] = ScipyPowell tranquilo: Type[Tranquilo] = Tranquilo @@ -1512,6 +1522,7 @@ def Scalar(self) -> GradientFreeLocalParallelScalarAlgorithms: class BoundedGradientFreeNonlinearConstrainedAlgorithms(AlgoSelection): nlopt_cobyla: Type[NloptCOBYLA] = NloptCOBYLA nlopt_isres: Type[NloptISRES] = NloptISRES + scipy_cobyqa: Type[ScipyCOBYQA] = ScipyCOBYQA scipy_differential_evolution: Type[ScipyDifferentialEvolution] = ( ScipyDifferentialEvolution ) @@ -1560,7 +1571,7 @@ class BoundedGradientFreeScalarAlgorithms(AlgoSelection): nevergrad_eda: Type[NevergradEDA] = NevergradEDA nevergrad_emna: Type[NevergradEMNA] = NevergradEMNA nevergrad_meta: Type[NevergradMeta] = NevergradMeta - nevergrad_NGOpt: Type[NevergradNGOpt] = NevergradNGOpt + nevergrad_ngopt: Type[NevergradNGOpt] = NevergradNGOpt nevergrad_oneplusone: Type[NevergradOnePlusOne] = NevergradOnePlusOne nevergrad_pso: Type[NevergradPSO] = NevergradPSO nevergrad_randomsearch: Type[NevergradRandomSearch] = NevergradRandomSearch @@ -1596,6 +1607,7 @@ class BoundedGradientFreeScalarAlgorithms(AlgoSelection): pyswarms_global_best: Type[PySwarmsGlobalBestPSO] = PySwarmsGlobalBestPSO pyswarms_local_best: Type[PySwarmsLocalBestPSO] = PySwarmsLocalBestPSO scipy_brute: Type[ScipyBrute] = ScipyBrute + scipy_cobyqa: Type[ScipyCOBYQA] = ScipyCOBYQA scipy_differential_evolution: Type[ScipyDifferentialEvolution] = ( ScipyDifferentialEvolution ) @@ -1648,7 +1660,7 @@ class BoundedGradientFreeParallelAlgorithms(AlgoSelection): nevergrad_eda: Type[NevergradEDA] = NevergradEDA nevergrad_emna: Type[NevergradEMNA] = NevergradEMNA nevergrad_meta: Type[NevergradMeta] = NevergradMeta - nevergrad_NGOpt: Type[NevergradNGOpt] = NevergradNGOpt + nevergrad_ngopt: Type[NevergradNGOpt] = NevergradNGOpt nevergrad_oneplusone: Type[NevergradOnePlusOne] = NevergradOnePlusOne nevergrad_pso: Type[NevergradPSO] = NevergradPSO nevergrad_randomsearch: Type[NevergradRandomSearch] = NevergradRandomSearch @@ -1696,6 +1708,7 @@ class GradientFreeNonlinearConstrainedScalarAlgorithms(AlgoSelection): nlopt_cobyla: Type[NloptCOBYLA] = NloptCOBYLA nlopt_isres: Type[NloptISRES] = NloptISRES scipy_cobyla: Type[ScipyCOBYLA] = ScipyCOBYLA + scipy_cobyqa: Type[ScipyCOBYQA] = ScipyCOBYQA scipy_differential_evolution: Type[ScipyDifferentialEvolution] = ( ScipyDifferentialEvolution ) @@ -1746,7 +1759,7 @@ class GradientFreeParallelScalarAlgorithms(AlgoSelection): nevergrad_eda: Type[NevergradEDA] = NevergradEDA nevergrad_emna: Type[NevergradEMNA] = NevergradEMNA nevergrad_meta: Type[NevergradMeta] = NevergradMeta - nevergrad_NGOpt: Type[NevergradNGOpt] = NevergradNGOpt + nevergrad_ngopt: Type[NevergradNGOpt] = NevergradNGOpt nevergrad_oneplusone: Type[NevergradOnePlusOne] = NevergradOnePlusOne nevergrad_pso: Type[NevergradPSO] = NevergradPSO nevergrad_randomsearch: Type[NevergradRandomSearch] = NevergradRandomSearch @@ -1848,7 +1861,7 @@ class BoundedGlobalScalarAlgorithms(AlgoSelection): nevergrad_eda: Type[NevergradEDA] = NevergradEDA nevergrad_emna: Type[NevergradEMNA] = NevergradEMNA nevergrad_meta: Type[NevergradMeta] = NevergradMeta - nevergrad_NGOpt: Type[NevergradNGOpt] = NevergradNGOpt + nevergrad_ngopt: Type[NevergradNGOpt] = NevergradNGOpt nevergrad_oneplusone: Type[NevergradOnePlusOne] = NevergradOnePlusOne nevergrad_pso: Type[NevergradPSO] = NevergradPSO nevergrad_randomsearch: Type[NevergradRandomSearch] = NevergradRandomSearch @@ -1913,7 +1926,7 @@ class BoundedGlobalParallelAlgorithms(AlgoSelection): nevergrad_eda: Type[NevergradEDA] = NevergradEDA nevergrad_emna: Type[NevergradEMNA] = NevergradEMNA nevergrad_meta: Type[NevergradMeta] = NevergradMeta - nevergrad_NGOpt: Type[NevergradNGOpt] = NevergradNGOpt + nevergrad_ngopt: Type[NevergradNGOpt] = NevergradNGOpt nevergrad_oneplusone: Type[NevergradOnePlusOne] = NevergradOnePlusOne nevergrad_pso: Type[NevergradPSO] = NevergradPSO nevergrad_randomsearch: Type[NevergradRandomSearch] = NevergradRandomSearch @@ -1998,7 +2011,7 @@ class GlobalParallelScalarAlgorithms(AlgoSelection): nevergrad_eda: Type[NevergradEDA] = NevergradEDA nevergrad_emna: Type[NevergradEMNA] = NevergradEMNA nevergrad_meta: Type[NevergradMeta] = NevergradMeta - nevergrad_NGOpt: Type[NevergradNGOpt] = NevergradNGOpt + nevergrad_ngopt: Type[NevergradNGOpt] = NevergradNGOpt nevergrad_oneplusone: Type[NevergradOnePlusOne] = NevergradOnePlusOne nevergrad_pso: Type[NevergradPSO] = NevergradPSO nevergrad_randomsearch: Type[NevergradRandomSearch] = NevergradRandomSearch @@ -2036,6 +2049,7 @@ class BoundedLocalNonlinearConstrainedAlgorithms(AlgoSelection): nlopt_cobyla: Type[NloptCOBYLA] = NloptCOBYLA nlopt_mma: Type[NloptMMA] = NloptMMA nlopt_slsqp: Type[NloptSLSQP] = NloptSLSQP + scipy_cobyqa: Type[ScipyCOBYQA] = ScipyCOBYQA scipy_slsqp: Type[ScipySLSQP] = ScipySLSQP scipy_trust_constr: Type[ScipyTrustConstr] = ScipyTrustConstr @@ -2069,6 +2083,7 @@ class BoundedLocalScalarAlgorithms(AlgoSelection): nlopt_sbplx: Type[NloptSbplx] = NloptSbplx nlopt_tnewton: Type[NloptTNewton] = NloptTNewton nlopt_var: Type[NloptVAR] = NloptVAR + scipy_cobyqa: Type[ScipyCOBYQA] = ScipyCOBYQA scipy_lbfgsb: Type[ScipyLBFGSB] = ScipyLBFGSB scipy_neldermead: Type[ScipyNelderMead] = ScipyNelderMead scipy_powell: Type[ScipyPowell] = ScipyPowell @@ -2142,6 +2157,7 @@ class LocalNonlinearConstrainedScalarAlgorithms(AlgoSelection): nlopt_mma: Type[NloptMMA] = NloptMMA nlopt_slsqp: Type[NloptSLSQP] = NloptSLSQP scipy_cobyla: Type[ScipyCOBYLA] = ScipyCOBYLA + scipy_cobyqa: Type[ScipyCOBYQA] = ScipyCOBYQA scipy_slsqp: Type[ScipySLSQP] = ScipySLSQP scipy_trust_constr: Type[ScipyTrustConstr] = ScipyTrustConstr @@ -2193,6 +2209,7 @@ class BoundedNonlinearConstrainedScalarAlgorithms(AlgoSelection): nlopt_isres: Type[NloptISRES] = NloptISRES nlopt_mma: Type[NloptMMA] = NloptMMA nlopt_slsqp: Type[NloptSLSQP] = NloptSLSQP + scipy_cobyqa: Type[ScipyCOBYQA] = ScipyCOBYQA scipy_differential_evolution: Type[ScipyDifferentialEvolution] = ( ScipyDifferentialEvolution ) @@ -2249,7 +2266,7 @@ class BoundedParallelScalarAlgorithms(AlgoSelection): nevergrad_eda: Type[NevergradEDA] = NevergradEDA nevergrad_emna: Type[NevergradEMNA] = NevergradEMNA nevergrad_meta: Type[NevergradMeta] = NevergradMeta - nevergrad_NGOpt: Type[NevergradNGOpt] = NevergradNGOpt + nevergrad_ngopt: Type[NevergradNGOpt] = NevergradNGOpt nevergrad_oneplusone: Type[NevergradOnePlusOne] = NevergradOnePlusOne nevergrad_pso: Type[NevergradPSO] = NevergradPSO nevergrad_randomsearch: Type[NevergradRandomSearch] = NevergradRandomSearch @@ -2541,7 +2558,7 @@ class GlobalGradientFreeAlgorithms(AlgoSelection): nevergrad_eda: Type[NevergradEDA] = NevergradEDA nevergrad_emna: Type[NevergradEMNA] = NevergradEMNA nevergrad_meta: Type[NevergradMeta] = NevergradMeta - nevergrad_NGOpt: Type[NevergradNGOpt] = NevergradNGOpt + nevergrad_ngopt: Type[NevergradNGOpt] = NevergradNGOpt nevergrad_oneplusone: Type[NevergradOnePlusOne] = NevergradOnePlusOne nevergrad_pso: Type[NevergradPSO] = NevergradPSO nevergrad_randomsearch: Type[NevergradRandomSearch] = NevergradRandomSearch @@ -2607,6 +2624,7 @@ class GradientFreeLocalAlgorithms(AlgoSelection): nlopt_sbplx: Type[NloptSbplx] = NloptSbplx pounders: Type[Pounders] = Pounders scipy_cobyla: Type[ScipyCOBYLA] = ScipyCOBYLA + scipy_cobyqa: Type[ScipyCOBYQA] = ScipyCOBYQA scipy_neldermead: Type[ScipyNelderMead] = ScipyNelderMead scipy_powell: Type[ScipyPowell] = ScipyPowell tao_pounders: Type[TAOPounders] = TAOPounders @@ -2662,7 +2680,7 @@ class BoundedGradientFreeAlgorithms(AlgoSelection): nevergrad_eda: Type[NevergradEDA] = NevergradEDA nevergrad_emna: Type[NevergradEMNA] = NevergradEMNA nevergrad_meta: Type[NevergradMeta] = NevergradMeta - nevergrad_NGOpt: Type[NevergradNGOpt] = NevergradNGOpt + nevergrad_ngopt: Type[NevergradNGOpt] = NevergradNGOpt nevergrad_oneplusone: Type[NevergradOnePlusOne] = NevergradOnePlusOne nevergrad_pso: Type[NevergradPSO] = NevergradPSO nevergrad_randomsearch: Type[NevergradRandomSearch] = NevergradRandomSearch @@ -2699,6 +2717,7 @@ class BoundedGradientFreeAlgorithms(AlgoSelection): pyswarms_global_best: Type[PySwarmsGlobalBestPSO] = PySwarmsGlobalBestPSO pyswarms_local_best: Type[PySwarmsLocalBestPSO] = PySwarmsLocalBestPSO scipy_brute: Type[ScipyBrute] = ScipyBrute + scipy_cobyqa: Type[ScipyCOBYQA] = ScipyCOBYQA scipy_differential_evolution: Type[ScipyDifferentialEvolution] = ( ScipyDifferentialEvolution ) @@ -2739,6 +2758,7 @@ class GradientFreeNonlinearConstrainedAlgorithms(AlgoSelection): nlopt_cobyla: Type[NloptCOBYLA] = NloptCOBYLA nlopt_isres: Type[NloptISRES] = NloptISRES scipy_cobyla: Type[ScipyCOBYLA] = ScipyCOBYLA + scipy_cobyqa: Type[ScipyCOBYQA] = ScipyCOBYQA scipy_differential_evolution: Type[ScipyDifferentialEvolution] = ( ScipyDifferentialEvolution ) @@ -2792,7 +2812,7 @@ class GradientFreeScalarAlgorithms(AlgoSelection): nevergrad_eda: Type[NevergradEDA] = NevergradEDA nevergrad_emna: Type[NevergradEMNA] = NevergradEMNA nevergrad_meta: Type[NevergradMeta] = NevergradMeta - nevergrad_NGOpt: Type[NevergradNGOpt] = NevergradNGOpt + nevergrad_ngopt: Type[NevergradNGOpt] = NevergradNGOpt nevergrad_oneplusone: Type[NevergradOnePlusOne] = NevergradOnePlusOne nevergrad_pso: Type[NevergradPSO] = NevergradPSO nevergrad_randomsearch: Type[NevergradRandomSearch] = NevergradRandomSearch @@ -2830,6 +2850,7 @@ class GradientFreeScalarAlgorithms(AlgoSelection): pyswarms_local_best: Type[PySwarmsLocalBestPSO] = PySwarmsLocalBestPSO scipy_brute: Type[ScipyBrute] = ScipyBrute scipy_cobyla: Type[ScipyCOBYLA] = ScipyCOBYLA + scipy_cobyqa: Type[ScipyCOBYQA] = ScipyCOBYQA scipy_differential_evolution: Type[ScipyDifferentialEvolution] = ( ScipyDifferentialEvolution ) @@ -2889,7 +2910,7 @@ class GradientFreeParallelAlgorithms(AlgoSelection): nevergrad_eda: Type[NevergradEDA] = NevergradEDA nevergrad_emna: Type[NevergradEMNA] = NevergradEMNA nevergrad_meta: Type[NevergradMeta] = NevergradMeta - nevergrad_NGOpt: Type[NevergradNGOpt] = NevergradNGOpt + nevergrad_ngopt: Type[NevergradNGOpt] = NevergradNGOpt nevergrad_oneplusone: Type[NevergradOnePlusOne] = NevergradOnePlusOne nevergrad_pso: Type[NevergradPSO] = NevergradPSO nevergrad_randomsearch: Type[NevergradRandomSearch] = NevergradRandomSearch @@ -2962,7 +2983,7 @@ class BoundedGlobalAlgorithms(AlgoSelection): nevergrad_eda: Type[NevergradEDA] = NevergradEDA nevergrad_emna: Type[NevergradEMNA] = NevergradEMNA nevergrad_meta: Type[NevergradMeta] = NevergradMeta - nevergrad_NGOpt: Type[NevergradNGOpt] = NevergradNGOpt + nevergrad_ngopt: Type[NevergradNGOpt] = NevergradNGOpt nevergrad_oneplusone: Type[NevergradOnePlusOne] = NevergradOnePlusOne nevergrad_pso: Type[NevergradPSO] = NevergradPSO nevergrad_randomsearch: Type[NevergradRandomSearch] = NevergradRandomSearch @@ -3077,7 +3098,7 @@ class GlobalScalarAlgorithms(AlgoSelection): nevergrad_eda: Type[NevergradEDA] = NevergradEDA nevergrad_emna: Type[NevergradEMNA] = NevergradEMNA nevergrad_meta: Type[NevergradMeta] = NevergradMeta - nevergrad_NGOpt: Type[NevergradNGOpt] = NevergradNGOpt + nevergrad_ngopt: Type[NevergradNGOpt] = NevergradNGOpt nevergrad_oneplusone: Type[NevergradOnePlusOne] = NevergradOnePlusOne nevergrad_pso: Type[NevergradPSO] = NevergradPSO nevergrad_randomsearch: Type[NevergradRandomSearch] = NevergradRandomSearch @@ -3146,7 +3167,7 @@ class GlobalParallelAlgorithms(AlgoSelection): nevergrad_eda: Type[NevergradEDA] = NevergradEDA nevergrad_emna: Type[NevergradEMNA] = NevergradEMNA nevergrad_meta: Type[NevergradMeta] = NevergradMeta - nevergrad_NGOpt: Type[NevergradNGOpt] = NevergradNGOpt + nevergrad_ngopt: Type[NevergradNGOpt] = NevergradNGOpt nevergrad_oneplusone: Type[NevergradOnePlusOne] = NevergradOnePlusOne nevergrad_pso: Type[NevergradPSO] = NevergradPSO nevergrad_randomsearch: Type[NevergradRandomSearch] = NevergradRandomSearch @@ -3199,6 +3220,7 @@ class BoundedLocalAlgorithms(AlgoSelection): nlopt_tnewton: Type[NloptTNewton] = NloptTNewton nlopt_var: Type[NloptVAR] = NloptVAR pounders: Type[Pounders] = Pounders + scipy_cobyqa: Type[ScipyCOBYQA] = ScipyCOBYQA scipy_lbfgsb: Type[ScipyLBFGSB] = ScipyLBFGSB scipy_ls_dogbox: Type[ScipyLSDogbox] = ScipyLSDogbox scipy_ls_trf: Type[ScipyLSTRF] = ScipyLSTRF @@ -3243,6 +3265,7 @@ class LocalNonlinearConstrainedAlgorithms(AlgoSelection): nlopt_mma: Type[NloptMMA] = NloptMMA nlopt_slsqp: Type[NloptSLSQP] = NloptSLSQP scipy_cobyla: Type[ScipyCOBYLA] = ScipyCOBYLA + scipy_cobyqa: Type[ScipyCOBYQA] = ScipyCOBYQA scipy_slsqp: Type[ScipySLSQP] = ScipySLSQP scipy_trust_constr: Type[ScipyTrustConstr] = ScipyTrustConstr @@ -3284,6 +3307,7 @@ class LocalScalarAlgorithms(AlgoSelection): nlopt_var: Type[NloptVAR] = NloptVAR scipy_bfgs: Type[ScipyBFGS] = ScipyBFGS scipy_cobyla: Type[ScipyCOBYLA] = ScipyCOBYLA + scipy_cobyqa: Type[ScipyCOBYQA] = ScipyCOBYQA scipy_conjugate_gradient: Type[ScipyConjugateGradient] = ScipyConjugateGradient scipy_lbfgsb: Type[ScipyLBFGSB] = ScipyLBFGSB scipy_neldermead: Type[ScipyNelderMead] = ScipyNelderMead @@ -3382,6 +3406,7 @@ class BoundedNonlinearConstrainedAlgorithms(AlgoSelection): nlopt_isres: Type[NloptISRES] = NloptISRES nlopt_mma: Type[NloptMMA] = NloptMMA nlopt_slsqp: Type[NloptSLSQP] = NloptSLSQP + scipy_cobyqa: Type[ScipyCOBYQA] = ScipyCOBYQA scipy_differential_evolution: Type[ScipyDifferentialEvolution] = ( ScipyDifferentialEvolution ) @@ -3444,7 +3469,7 @@ class BoundedScalarAlgorithms(AlgoSelection): nevergrad_eda: Type[NevergradEDA] = NevergradEDA nevergrad_emna: Type[NevergradEMNA] = NevergradEMNA nevergrad_meta: Type[NevergradMeta] = NevergradMeta - nevergrad_NGOpt: Type[NevergradNGOpt] = NevergradNGOpt + nevergrad_ngopt: Type[NevergradNGOpt] = NevergradNGOpt nevergrad_oneplusone: Type[NevergradOnePlusOne] = NevergradOnePlusOne nevergrad_pso: Type[NevergradPSO] = NevergradPSO nevergrad_randomsearch: Type[NevergradRandomSearch] = NevergradRandomSearch @@ -3487,6 +3512,7 @@ class BoundedScalarAlgorithms(AlgoSelection): pyswarms_local_best: Type[PySwarmsLocalBestPSO] = PySwarmsLocalBestPSO scipy_basinhopping: Type[ScipyBasinhopping] = ScipyBasinhopping scipy_brute: Type[ScipyBrute] = ScipyBrute + scipy_cobyqa: Type[ScipyCOBYQA] = ScipyCOBYQA scipy_differential_evolution: Type[ScipyDifferentialEvolution] = ( ScipyDifferentialEvolution ) @@ -3561,7 +3587,7 @@ class BoundedParallelAlgorithms(AlgoSelection): nevergrad_eda: Type[NevergradEDA] = NevergradEDA nevergrad_emna: Type[NevergradEMNA] = NevergradEMNA nevergrad_meta: Type[NevergradMeta] = NevergradMeta - nevergrad_NGOpt: Type[NevergradNGOpt] = NevergradNGOpt + nevergrad_ngopt: Type[NevergradNGOpt] = NevergradNGOpt nevergrad_oneplusone: Type[NevergradOnePlusOne] = NevergradOnePlusOne nevergrad_pso: Type[NevergradPSO] = NevergradPSO nevergrad_randomsearch: Type[NevergradRandomSearch] = NevergradRandomSearch @@ -3614,6 +3640,7 @@ class NonlinearConstrainedScalarAlgorithms(AlgoSelection): nlopt_mma: Type[NloptMMA] = NloptMMA nlopt_slsqp: Type[NloptSLSQP] = NloptSLSQP scipy_cobyla: Type[ScipyCOBYLA] = ScipyCOBYLA + scipy_cobyqa: Type[ScipyCOBYQA] = ScipyCOBYQA scipy_differential_evolution: Type[ScipyDifferentialEvolution] = ( ScipyDifferentialEvolution ) @@ -3679,7 +3706,7 @@ class ParallelScalarAlgorithms(AlgoSelection): nevergrad_eda: Type[NevergradEDA] = NevergradEDA nevergrad_emna: Type[NevergradEMNA] = NevergradEMNA nevergrad_meta: Type[NevergradMeta] = NevergradMeta - nevergrad_NGOpt: Type[NevergradNGOpt] = NevergradNGOpt + nevergrad_ngopt: Type[NevergradNGOpt] = NevergradNGOpt nevergrad_oneplusone: Type[NevergradOnePlusOne] = NevergradOnePlusOne nevergrad_pso: Type[NevergradPSO] = NevergradPSO nevergrad_randomsearch: Type[NevergradRandomSearch] = NevergradRandomSearch @@ -3820,7 +3847,7 @@ class GradientFreeAlgorithms(AlgoSelection): nevergrad_eda: Type[NevergradEDA] = NevergradEDA nevergrad_emna: Type[NevergradEMNA] = NevergradEMNA nevergrad_meta: Type[NevergradMeta] = NevergradMeta - nevergrad_NGOpt: Type[NevergradNGOpt] = NevergradNGOpt + nevergrad_ngopt: Type[NevergradNGOpt] = NevergradNGOpt nevergrad_oneplusone: Type[NevergradOnePlusOne] = NevergradOnePlusOne nevergrad_pso: Type[NevergradPSO] = NevergradPSO nevergrad_randomsearch: Type[NevergradRandomSearch] = NevergradRandomSearch @@ -3859,6 +3886,7 @@ class GradientFreeAlgorithms(AlgoSelection): pyswarms_local_best: Type[PySwarmsLocalBestPSO] = PySwarmsLocalBestPSO scipy_brute: Type[ScipyBrute] = ScipyBrute scipy_cobyla: Type[ScipyCOBYLA] = ScipyCOBYLA + scipy_cobyqa: Type[ScipyCOBYQA] = ScipyCOBYQA scipy_differential_evolution: Type[ScipyDifferentialEvolution] = ( ScipyDifferentialEvolution ) @@ -3924,7 +3952,7 @@ class GlobalAlgorithms(AlgoSelection): nevergrad_eda: Type[NevergradEDA] = NevergradEDA nevergrad_emna: Type[NevergradEMNA] = NevergradEMNA nevergrad_meta: Type[NevergradMeta] = NevergradMeta - nevergrad_NGOpt: Type[NevergradNGOpt] = NevergradNGOpt + nevergrad_ngopt: Type[NevergradNGOpt] = NevergradNGOpt nevergrad_oneplusone: Type[NevergradOnePlusOne] = NevergradOnePlusOne nevergrad_pso: Type[NevergradPSO] = NevergradPSO nevergrad_randomsearch: Type[NevergradRandomSearch] = NevergradRandomSearch @@ -4012,6 +4040,7 @@ class LocalAlgorithms(AlgoSelection): pounders: Type[Pounders] = Pounders scipy_bfgs: Type[ScipyBFGS] = ScipyBFGS scipy_cobyla: Type[ScipyCOBYLA] = ScipyCOBYLA + scipy_cobyqa: Type[ScipyCOBYQA] = ScipyCOBYQA scipy_conjugate_gradient: Type[ScipyConjugateGradient] = ScipyConjugateGradient scipy_lbfgsb: Type[ScipyLBFGSB] = ScipyLBFGSB scipy_ls_dogbox: Type[ScipyLSDogbox] = ScipyLSDogbox @@ -4091,7 +4120,7 @@ class BoundedAlgorithms(AlgoSelection): nevergrad_eda: Type[NevergradEDA] = NevergradEDA nevergrad_emna: Type[NevergradEMNA] = NevergradEMNA nevergrad_meta: Type[NevergradMeta] = NevergradMeta - nevergrad_NGOpt: Type[NevergradNGOpt] = NevergradNGOpt + nevergrad_ngopt: Type[NevergradNGOpt] = NevergradNGOpt nevergrad_oneplusone: Type[NevergradOnePlusOne] = NevergradOnePlusOne nevergrad_pso: Type[NevergradPSO] = NevergradPSO nevergrad_randomsearch: Type[NevergradRandomSearch] = NevergradRandomSearch @@ -4135,6 +4164,7 @@ class BoundedAlgorithms(AlgoSelection): pyswarms_local_best: Type[PySwarmsLocalBestPSO] = PySwarmsLocalBestPSO scipy_basinhopping: Type[ScipyBasinhopping] = ScipyBasinhopping scipy_brute: Type[ScipyBrute] = ScipyBrute + scipy_cobyqa: Type[ScipyCOBYQA] = ScipyCOBYQA scipy_differential_evolution: Type[ScipyDifferentialEvolution] = ( ScipyDifferentialEvolution ) @@ -4194,6 +4224,7 @@ class NonlinearConstrainedAlgorithms(AlgoSelection): nlopt_mma: Type[NloptMMA] = NloptMMA nlopt_slsqp: Type[NloptSLSQP] = NloptSLSQP scipy_cobyla: Type[ScipyCOBYLA] = ScipyCOBYLA + scipy_cobyqa: Type[ScipyCOBYQA] = ScipyCOBYQA scipy_differential_evolution: Type[ScipyDifferentialEvolution] = ( ScipyDifferentialEvolution ) @@ -4261,7 +4292,7 @@ class ScalarAlgorithms(AlgoSelection): nevergrad_eda: Type[NevergradEDA] = NevergradEDA nevergrad_emna: Type[NevergradEMNA] = NevergradEMNA nevergrad_meta: Type[NevergradMeta] = NevergradMeta - nevergrad_NGOpt: Type[NevergradNGOpt] = NevergradNGOpt + nevergrad_ngopt: Type[NevergradNGOpt] = NevergradNGOpt nevergrad_oneplusone: Type[NevergradOnePlusOne] = NevergradOnePlusOne nevergrad_pso: Type[NevergradPSO] = NevergradPSO nevergrad_randomsearch: Type[NevergradRandomSearch] = NevergradRandomSearch @@ -4307,6 +4338,7 @@ class ScalarAlgorithms(AlgoSelection): scipy_basinhopping: Type[ScipyBasinhopping] = ScipyBasinhopping scipy_brute: Type[ScipyBrute] = ScipyBrute scipy_cobyla: Type[ScipyCOBYLA] = ScipyCOBYLA + scipy_cobyqa: Type[ScipyCOBYQA] = ScipyCOBYQA scipy_conjugate_gradient: Type[ScipyConjugateGradient] = ScipyConjugateGradient scipy_differential_evolution: Type[ScipyDifferentialEvolution] = ( ScipyDifferentialEvolution @@ -4406,7 +4438,7 @@ class ParallelAlgorithms(AlgoSelection): nevergrad_eda: Type[NevergradEDA] = NevergradEDA nevergrad_emna: Type[NevergradEMNA] = NevergradEMNA nevergrad_meta: Type[NevergradMeta] = NevergradMeta - nevergrad_NGOpt: Type[NevergradNGOpt] = NevergradNGOpt + nevergrad_ngopt: Type[NevergradNGOpt] = NevergradNGOpt nevergrad_oneplusone: Type[NevergradOnePlusOne] = NevergradOnePlusOne nevergrad_pso: Type[NevergradPSO] = NevergradPSO nevergrad_randomsearch: Type[NevergradRandomSearch] = NevergradRandomSearch @@ -4488,7 +4520,7 @@ class Algorithms(AlgoSelection): nevergrad_eda: Type[NevergradEDA] = NevergradEDA nevergrad_emna: Type[NevergradEMNA] = NevergradEMNA nevergrad_meta: Type[NevergradMeta] = NevergradMeta - nevergrad_NGOpt: Type[NevergradNGOpt] = NevergradNGOpt + nevergrad_ngopt: Type[NevergradNGOpt] = NevergradNGOpt nevergrad_oneplusone: Type[NevergradOnePlusOne] = NevergradOnePlusOne nevergrad_pso: Type[NevergradPSO] = NevergradPSO nevergrad_randomsearch: Type[NevergradRandomSearch] = NevergradRandomSearch @@ -4535,6 +4567,7 @@ class Algorithms(AlgoSelection): scipy_basinhopping: Type[ScipyBasinhopping] = ScipyBasinhopping scipy_brute: Type[ScipyBrute] = ScipyBrute scipy_cobyla: Type[ScipyCOBYLA] = ScipyCOBYLA + scipy_cobyqa: Type[ScipyCOBYQA] = ScipyCOBYQA scipy_conjugate_gradient: Type[ScipyConjugateGradient] = ScipyConjugateGradient scipy_differential_evolution: Type[ScipyDifferentialEvolution] = ( ScipyDifferentialEvolution diff --git a/src/optimagic/config.py b/src/optimagic/config.py index e75f11f62..4dfcbab9c 100644 --- a/src/optimagic/config.py +++ b/src/optimagic/config.py @@ -3,6 +3,7 @@ import pandas as pd import plotly.express as px +import scipy from packaging import version DOCS_DIR = Path(__file__).parent.parent / "docs" @@ -79,6 +80,10 @@ def _is_installed(module_name: str) -> bool: # Check if pandas version is newer or equal to version 2.1.0 # ====================================================================================== -IS_PANDAS_VERSION_NEWER_OR_EQUAL_TO_2_1_0 = version.parse( - pd.__version__ -) >= version.parse("2.1.0") +IS_PANDAS_VERSION_GE_2_1 = version.parse(pd.__version__) >= version.parse("2.1.0") + +# ====================================================================================== +# Check SciPy Version for COBYQA support (added in scipy 1.14.0) +# ====================================================================================== + +IS_SCIPY_GE_1_14 = version.parse(scipy.__version__) >= version.parse("1.14.0") diff --git a/src/optimagic/optimization/scipy_aliases.py b/src/optimagic/optimization/scipy_aliases.py index fd9d1d107..25e54e0b4 100644 --- a/src/optimagic/optimization/scipy_aliases.py +++ b/src/optimagic/optimization/scipy_aliases.py @@ -14,6 +14,7 @@ def map_method_to_algorithm(method): "L-BFGS-B": "scipy_lbfgsb", "TNC": "scipy_truncated_newton", "COBYLA": "scipy_cobyla", + "COBYQA": "scipy_cobyqa", "SLSQP": "scipy_slsqp", "trust-constr": "scipy_trust_constr", } @@ -23,7 +24,6 @@ def map_method_to_algorithm(method): "trust-ncg": "scipy_trust_ncg", "trust-exact": "scipy_trust_exact", "trust-krylov": "scipy_trust_krylov", - "COBYQA": "scipy_cobyqa", } if method in implemented: diff --git a/src/optimagic/optimizers/scipy_optimizers.py b/src/optimagic/optimizers/scipy_optimizers.py index b35aef29d..42f7d715d 100644 --- a/src/optimagic/optimizers/scipy_optimizers.py +++ b/src/optimagic/optimizers/scipy_optimizers.py @@ -49,6 +49,7 @@ from optimagic import mark from optimagic.batch_evaluators import process_batch_evaluator +from optimagic.config import IS_SCIPY_GE_1_14 from optimagic.optimization.algo_options import ( CONVERGENCE_FTOL_ABS, CONVERGENCE_FTOL_REL, @@ -498,6 +499,126 @@ def _solve_internal_problem( return res +@mark.minimizer( + name="scipy_cobyqa", + solver_type=AggregationLevel.SCALAR, + is_available=IS_SCIPY_GE_1_14, + is_global=False, + needs_jac=False, + needs_hess=False, + needs_bounds=False, + supports_parallelism=False, + supports_bounds=True, + supports_infinite_bounds=True, + supports_linear_constraints=False, + supports_nonlinear_constraints=True, + disable_history=False, +) +@dataclass(frozen=True) +class ScipyCOBYQA(Algorithm): + """Minimize a scalar function using the COBYQA algorithm. + + COBYQA (Constrained Optimization BY Quadratic Approximations) is a + derivative-free optimization algorithm for constrained problems. It is the + successor to COBYLA and was developed by the same research group. + + The algorithm builds quadratic models of the objective function and constraints + using interpolation. It then solves a trust-region subproblem to find the next + iterate. Unlike COBYLA, which uses linear approximations, COBYQA's quadratic + models generally provide better convergence properties. + + COBYQA is well suited for optimization problems where derivatives are unavailable + or expensive to compute, and where the number of variables is moderate (up to a + few hundred). It can handle bound constraints and general nonlinear constraints. + + Key advantages over COBYLA: + + - Supports bound constraints directly (COBYLA does not support bounds) + - Uses quadratic models instead of linear, improving convergence + - Generally requires fewer function evaluations to reach the same accuracy + + The algorithm treats bounds as unrelaxable constraints, meaning it will never + evaluate the objective function outside the specified bounds. + + This algorithm requires scipy >= 1.14.0. + + """ + + stopping_maxfun: PositiveInt = STOPPING_MAXFUN + """Maximum number of function evaluations.""" + + stopping_maxiter: PositiveInt = STOPPING_MAXITER + """Maximum number of iterations.""" + + convergence_ftol_abs: NonNegativeFloat | None = None + """Target objective function value. + + The algorithm stops when the objective function value is below this threshold. + Disabled by default. + + """ + + feasibility_tol: NonNegativeFloat = 1e-8 + """Tolerance for the constraint violation.""" + + trustregion_initial_radius: PositiveFloat | None = None + """Initial trust-region radius. + + If not specified, it is calculated based on the starting point. + + """ + + trustregion_final_radius: PositiveFloat = 1e-6 + """Final trust-region radius, indicating the required accuracy in the variables.""" + + scale: bool = False + """Whether to scale the variables to the bounds. + + If True and all bounds are finite, the variables are scaled to the range [-1, 1]. + + """ + + display: bool = False + """Whether to print information about the optimization progress.""" + + def _solve_internal_problem( + self, problem: InternalOptimizationProblem, x0: NDArray[np.float64] + ) -> InternalOptimizeResult: + if self.trustregion_initial_radius is None: + radius = calculate_trustregion_initial_radius(x0) + else: + radius = self.trustregion_initial_radius + + options: dict[str, Any] = { + "maxfev": self.stopping_maxfun, + "maxiter": self.stopping_maxiter, + "initial_tr_radius": radius, + "final_tr_radius": self.trustregion_final_radius, + "feasibility_tol": self.feasibility_tol, + "scale": self.scale, + "disp": self.display, + } + + if self.convergence_ftol_abs is not None: + options["f_target"] = self.convergence_ftol_abs + + # COBYQA uses NonlinearConstraint format like trust-constr + nonlinear_constraints = _get_scipy_constraints( + equality_as_inequality_constraints(problem.nonlinear_constraints) + ) + + raw_res = scipy.optimize.minimize( + fun=problem.fun, + x0=x0, + method="COBYQA", + bounds=_get_scipy_bounds(problem.bounds), + constraints=nonlinear_constraints, + options=options, + ) + res = process_scipy_result(raw_res) + return res + + @mark.minimizer( name="scipy_ls_trf", solver_type=AggregationLevel.LEAST_SQUARES, diff --git a/src/optimagic/shared/compat.py b/src/optimagic/shared/compat.py index 324d2e511..9a5148649 100644 --- a/src/optimagic/shared/compat.py +++ b/src/optimagic/shared/compat.py @@ -5,7 +5,7 @@ """ -from optimagic.config import IS_PANDAS_VERSION_NEWER_OR_EQUAL_TO_2_1_0 +from optimagic.config import IS_PANDAS_VERSION_GE_2_1 def pd_df_map(df, func, na_action=None, **kwargs): @@ -26,7 +26,7 @@ def pd_df_map(df, func, na_action=None, **kwargs): pd.DataFrame: Transformed DataFrame. """ - if IS_PANDAS_VERSION_NEWER_OR_EQUAL_TO_2_1_0: + if IS_PANDAS_VERSION_GE_2_1: out = df.map(func, na_action=na_action, **kwargs) else: out = df.applymap(func, na_action=na_action, **kwargs)