Skip to content

Commit da6da9a

Browse files
authored
Fix cma library dependency, update pymoo (#1711)
* Fix cma library dependency: drop numpy downgrade, fix seed type, bump cma - Remove forced numpy==1.26.4 downgrade in CI that broke cma import - Wrap randint result with int() for random.seed() compatibility on numpy 2.x - Bump cma requirement from >=2.6.0 to >=3.4.0 * Update pymoo from 0.5.0 to >=0.6.1 and fix removed factory API - Bump pymoo requirement from ==0.5.0 to >=0.6.1 (fixes cma==2.7 pin conflict) - Replace removed pymoo.factory.get_algorithm with _get_pymoo_algorithm helper - Remove pymoo < 0.5.0 fallback in _create_pymoo_problem
1 parent 8fd093b commit da6da9a

5 files changed

Lines changed: 35 additions & 53 deletions

File tree

.github/actions/ubuntu_restore_all/action.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,6 @@ runs:
1919
( unset GITHUB_REF ; pip install --progress-bar off IOHexperimenter>=0.2.9.2 )
2020
pip install --progress-bar off -e .[all]
2121
#pip install --progress-bar off --use-deprecated=legacy-resolver -e .[all]
22-
pip install --progress-bar off -U numpy==1.26.4 matplotlib==3.9.0 pyomo==5.7.1
22+
pip install --progress-bar off -U matplotlib==3.9.0 pyomo==5.7.1
2323
pip install keras==2.6.0 # issue on Nov 4th 2021
2424
shell: bash

nevergrad/benchmark/xpbase.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@
2727
) # import from optimizerlib so as to fill it
2828
from . import execution
2929

30-
3130
registry: decorators.Registry[tp.Callable[..., tp.Iterator["Experiment"]]] = decorators.Registry()
3231

3332

@@ -131,7 +130,7 @@ def create_seed_generator(seed: tp.Optional[int]) -> tp.Iterator[tp.Optional[int
131130
"""
132131
generator = None if seed is None else np.random.RandomState(seed=seed)
133132
while True:
134-
yield None if generator is None else generator.randint(2**32, dtype=np.uint32) # type: ignore
133+
yield None if generator is None else int(generator.randint(2**32, dtype=np.uint32)) # type: ignore
135134

136135

137136
class Experiment:

nevergrad/optimization/recastlib.py

Lines changed: 31 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -599,23 +599,6 @@ def _optimization_function(
599599
# pylint:disable=unused-argument, import-outside-toplevel
600600
from pymoo import optimize as pymoooptimize
601601

602-
from pymoo.factory import get_algorithm as get_pymoo_algorithm
603-
604-
# from pymoo.factory import get_reference_directions
605-
606-
# reference direction code for when we want to use the other MOO optimizers in Pymoo
607-
# if self.algorithm in [
608-
# "rnsga2",
609-
# "nsga3",
610-
# "unsga3",
611-
# "rnsga3",
612-
# "moead",
613-
# "ctaea",
614-
# ]: # algorithms that require reference points or reference directions
615-
# the appropriate n_partitions must be looked into
616-
# ref_dirs = get_reference_directions("das-dennis", self.num_objectives, n_partitions=12)
617-
# algorithm = get_pymoo_algorithm(self.algorithm, ref_dirs)
618-
# else:
619602
problem = _create_pymoo_problem(weakself, objective_function)
620603
if weakself.algorithm == "CMAES":
621604
from pymoo.algorithms.soo.nonconvex.cmaes import CMAES
@@ -635,7 +618,7 @@ def _optimization_function(
635618
bipop=True,
636619
)
637620
else:
638-
algorithm = get_pymoo_algorithm(weakself.algorithm)
621+
algorithm = _get_pymoo_algorithm(weakself.algorithm)
639622
pymoooptimize.minimize(problem, algorithm, seed=weakself._initial_seed)
640623
return None
641624

@@ -745,24 +728,7 @@ def _optimization_function(
745728
# pylint:disable=unused-argument, import-outside-toplevel
746729
from pymoo import optimize as pymoooptimize
747730

748-
from pymoo.factory import get_algorithm as get_pymoo_algorithm
749-
750-
# from pymoo.factory import get_reference_directions
751-
752-
# reference direction code for when we want to use the other MOO optimizers in Pymoo
753-
# if self.algorithm in [
754-
# "rnsga2",
755-
# "nsga3",
756-
# "unsga3",
757-
# "rnsga3",
758-
# "moead",
759-
# "ctaea",
760-
# ]: # algorithms that require reference points or reference directions
761-
# the appropriate n_partitions must be looked into
762-
# ref_dirs = get_reference_directions("das-dennis", self.num_objectives, n_partitions=12)
763-
# algorithm = get_pymoo_algorithm(self.algorithm, ref_dirs)
764-
# else:
765-
algorithm = get_pymoo_algorithm(weakself.algorithm)
731+
algorithm = _get_pymoo_algorithm(weakself.algorithm)
766732
problem = _create_pymoo_problem(weakself, objective_function, False)
767733
pymoooptimize.minimize(problem, algorithm, seed=weakself._initial_seed)
768734
return None
@@ -834,23 +800,41 @@ def __init__(self, *, algorithm: str) -> None:
834800
super().__init__(_PymooBatchMinimizeBase, locals())
835801

836802

803+
def _get_pymoo_algorithm(name: str):
804+
"""Instantiate a pymoo algorithm by name (replaces removed pymoo.factory.get_algorithm)."""
805+
# pylint:disable=import-outside-toplevel
806+
_PYMOO_ALGORITHMS = {
807+
"de": "pymoo.algorithms.soo.nonconvex.de.DE",
808+
"ga": "pymoo.algorithms.soo.nonconvex.ga.GA",
809+
"brkga": "pymoo.algorithms.soo.nonconvex.brkga.BRKGA",
810+
"nelder-mead": "pymoo.algorithms.soo.nonconvex.nelder.NelderMead",
811+
"pattern-search": "pymoo.algorithms.soo.nonconvex.pattern.PatternSearch",
812+
"cmaes": "pymoo.algorithms.soo.nonconvex.cmaes.CMAES",
813+
"nsga2": "pymoo.algorithms.moo.nsga2.NSGA2",
814+
"rnsga2": "pymoo.algorithms.moo.rnsga2.RNSGA2",
815+
"nsga3": "pymoo.algorithms.moo.nsga3.NSGA3",
816+
"unsga3": "pymoo.algorithms.moo.unsga3.UNSGA3",
817+
"rnsga3": "pymoo.algorithms.moo.rnsga3.RNSGA3",
818+
"moead": "pymoo.algorithms.moo.moead.MOEAD",
819+
"ctaea": "pymoo.algorithms.moo.ctaea.CTAEA",
820+
}
821+
import importlib
822+
823+
qualname = _PYMOO_ALGORITHMS[name]
824+
module_path, class_name = qualname.rsplit(".", 1)
825+
module = importlib.import_module(module_path)
826+
return getattr(module, class_name)()
827+
828+
837829
def _create_pymoo_problem(
838830
optimizer: base.Optimizer,
839831
objective_function: tp.Callable[[tp.ArrayLike], float],
840832
elementwise: bool = True,
841833
):
842-
kwargs = {}
843-
try:
844-
# pylint:disable=import-outside-toplevel
845-
from pymoo.core.problem import ElementwiseProblem, Problem # type: ignore
846-
847-
Base = ElementwiseProblem if elementwise else Problem
848-
except ImportError:
849-
# Used if pymoo < 0.5.0
850-
# pylint:disable=import-outside-toplevel
851-
from pymoo.model.problem import Problem as Base # type: ignore
834+
# pylint:disable=import-outside-toplevel
835+
from pymoo.core.problem import ElementwiseProblem, Problem # type: ignore
852836

853-
kwargs = {"elementwise_evaluation": elementwise}
837+
Base = ElementwiseProblem if elementwise else Problem
854838

855839
class _PymooProblem(Base): # type: ignore
856840
def __init__(self, optimizer, objective_function):
@@ -861,7 +845,6 @@ def __init__(self, optimizer, objective_function):
861845
n_constr=0, # constraints handled already by nevergrad
862846
xl=-math.pi * 0.5,
863847
xu=math.pi * 0.5,
864-
**kwargs,
865848
)
866849

867850
def _evaluate(self, X, out, *args, **kwargs):

requirements/bench.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ scikit-image>=0.18.3
4040
image-quality>=1.2.7
4141
#keras>=2.4.3
4242
#tensorflow>=2.7.0
43-
pymoo==0.5.0
43+
pymoo>=0.6.1
4444
olymp>=0.0.1b0 ; sys_platform == "linux"
4545
Keras-Preprocessing
4646
silence_tensorflow # for olymp

requirements/main.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
numpy>=1.26.4
2-
cma>=2.6.0
2+
cma>=3.4.0
33
bayesian-optimization==1.4.0
44
typing_extensions>=3.6.6
55
pandas

0 commit comments

Comments
 (0)