diff --git a/pymoo/algorithms/moo/age.py b/pymoo/algorithms/moo/age.py index c8342782..f24b76e2 100644 --- a/pymoo/algorithms/moo/age.py +++ b/pymoo/algorithms/moo/age.py @@ -167,7 +167,7 @@ def survival_score(self, front, ideal_point): p = self.compute_geometry(front, extreme, n) nn = np.linalg.norm(front, p, axis=1) - distances = self.pairwise_distances(front, p) / nn[:, None] + distances = self.pairwise_distances(front, p) / (nn[:, None]) neighbors = 2 remaining = np.arange(m) diff --git a/pymoo/gradient/__init__.py b/pymoo/gradient/__init__.py index acc2f4c5..24843f3c 100644 --- a/pymoo/gradient/__init__.py +++ b/pymoo/gradient/__init__.py @@ -3,7 +3,7 @@ GRADIENT_MODULE = "pymoo.gradient.toolbox" -TOOLBOX = "autograd.numpy" +TOOLBOX = "numpy" def activate(name): @@ -17,3 +17,5 @@ def activate(name): def deactivate(): activate("numpy") + + diff --git a/pymoo/gradient/grad_autograd.py b/pymoo/gradient/grad_autograd.py index a2dcd4e6..2f11248f 100644 --- a/pymoo/gradient/grad_autograd.py +++ b/pymoo/gradient/grad_autograd.py @@ -1,9 +1,33 @@ import warnings - -import autograd.numpy as anp import numpy as np -from autograd.core import VJPNode, vspace, backward_pass -from autograd.tracer import new_box, isbox + +try: + import autograd.numpy as anp + from autograd import value_and_grad + from autograd.core import VJPNode, backward_pass + from autograd.tracer import new_box, isbox +except: + print("autograd only supports numpy < 2.0.0 versions.") + + +def value_and_grad(*args, **kwargs): + return value_and_grad(*args, **kwargs) + + +def log(*args, **kwargs): + return anp.log(*args, **kwargs) + + +def sqrt(*args, **kwargs): + return anp.sqrt(*args, **kwargs) + + +def row_stack(*args, **kwargs): + return anp.row_stack(*args, **kwargs) + + +def triu_indices(*args, **kwargs): + return anp.triu_indices(*args, **kwargs) def run_and_trace(f, x): diff --git a/pymoo/util/ref_dirs/energy.py b/pymoo/util/ref_dirs/energy.py index 0b77dd7c..40def556 100644 --- a/pymoo/util/ref_dirs/energy.py +++ b/pymoo/util/ref_dirs/energy.py @@ -1,7 +1,6 @@ import numpy as np -import pymoo.gradient.toolbox as anp - +from pymoo.gradient.grad_autograd import triu_indices, sqrt, log from pymoo.util.ref_dirs.construction import ConstructionBasedReferenceDirectionFactory from pymoo.util.ref_dirs.misc import project_onto_sum_equals_zero_plane, project_onto_unit_simplex_recursive from pymoo.util.ref_dirs.optimizer import Adam @@ -280,9 +279,9 @@ def squared_dist(A, B): def calc_potential_energy(A, d): - i, j = anp.triu_indices(len(A), 1) - D = anp.sqrt(squared_dist(A, A)[i, j]) - energy = anp.log((1 / D ** d).mean()) + i, j = triu_indices(len(A), 1) + D = sqrt(squared_dist(A, A)[i, j]) + energy = log((1 / D ** d).mean()) return energy diff --git a/pymoo/util/ref_dirs/energy_layer.py b/pymoo/util/ref_dirs/energy_layer.py index 9ace8e35..182fa39a 100644 --- a/pymoo/util/ref_dirs/energy_layer.py +++ b/pymoo/util/ref_dirs/energy_layer.py @@ -1,7 +1,8 @@ -import autograd.numpy as anp + + import numpy as np -from autograd import value_and_grad +from pymoo.gradient.grad_autograd import value_and_grad, triu_indices, row_stack from pymoo.util.normalization import normalize from pymoo.util.ref_dirs.energy import squared_dist from pymoo.util.ref_dirs.optimizer import Adam @@ -102,14 +103,14 @@ def get_points(X, scalings): vals = [] for i in range(len(X)): vals.append(scale_reference_directions(X[i], scalings[i])) - X = anp.row_stack(vals) + X = row_stack(vals) return X def calc_potential_energy(scalings, X): X = get_points(X, scalings) - i, j = anp.triu_indices(len(X), 1) + i, j = triu_indices(len(X), 1) D = squared_dist(X, X)[i, j] if np.any(D < 1e-12):