pymoo 0.6.1.2__cp312-cp312-macosx_10_9_universal2.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of pymoo might be problematic. Click here for more details.
- pymoo/__init__.py +3 -0
- pymoo/algorithms/__init__.py +0 -0
- pymoo/algorithms/base/__init__.py +0 -0
- pymoo/algorithms/base/bracket.py +38 -0
- pymoo/algorithms/base/genetic.py +109 -0
- pymoo/algorithms/base/line.py +62 -0
- pymoo/algorithms/base/local.py +39 -0
- pymoo/algorithms/base/meta.py +79 -0
- pymoo/algorithms/hyperparameters.py +89 -0
- pymoo/algorithms/moo/__init__.py +0 -0
- pymoo/algorithms/moo/age.py +304 -0
- pymoo/algorithms/moo/age2.py +164 -0
- pymoo/algorithms/moo/ctaea.py +298 -0
- pymoo/algorithms/moo/dnsga2.py +76 -0
- pymoo/algorithms/moo/kgb.py +446 -0
- pymoo/algorithms/moo/moead.py +183 -0
- pymoo/algorithms/moo/nsga2.py +117 -0
- pymoo/algorithms/moo/nsga3.py +358 -0
- pymoo/algorithms/moo/rnsga2.py +188 -0
- pymoo/algorithms/moo/rnsga3.py +246 -0
- pymoo/algorithms/moo/rvea.py +214 -0
- pymoo/algorithms/moo/sms.py +195 -0
- pymoo/algorithms/moo/spea2.py +190 -0
- pymoo/algorithms/moo/unsga3.py +47 -0
- pymoo/algorithms/soo/__init__.py +0 -0
- pymoo/algorithms/soo/convex/__init__.py +0 -0
- pymoo/algorithms/soo/nonconvex/__init__.py +0 -0
- pymoo/algorithms/soo/nonconvex/brkga.py +161 -0
- pymoo/algorithms/soo/nonconvex/cmaes.py +554 -0
- pymoo/algorithms/soo/nonconvex/de.py +279 -0
- pymoo/algorithms/soo/nonconvex/direct.py +149 -0
- pymoo/algorithms/soo/nonconvex/es.py +202 -0
- pymoo/algorithms/soo/nonconvex/g3pcx.py +94 -0
- pymoo/algorithms/soo/nonconvex/ga.py +93 -0
- pymoo/algorithms/soo/nonconvex/ga_niching.py +223 -0
- pymoo/algorithms/soo/nonconvex/isres.py +74 -0
- pymoo/algorithms/soo/nonconvex/nelder.py +251 -0
- pymoo/algorithms/soo/nonconvex/optuna.py +80 -0
- pymoo/algorithms/soo/nonconvex/pattern.py +183 -0
- pymoo/algorithms/soo/nonconvex/pso.py +399 -0
- pymoo/algorithms/soo/nonconvex/pso_ep.py +297 -0
- pymoo/algorithms/soo/nonconvex/random_search.py +25 -0
- pymoo/algorithms/soo/nonconvex/sres.py +56 -0
- pymoo/algorithms/soo/univariate/__init__.py +0 -0
- pymoo/algorithms/soo/univariate/backtracking.py +59 -0
- pymoo/algorithms/soo/univariate/exp.py +46 -0
- pymoo/algorithms/soo/univariate/golden.py +65 -0
- pymoo/algorithms/soo/univariate/quadr_interp.py +81 -0
- pymoo/algorithms/soo/univariate/wolfe.py +163 -0
- pymoo/config.py +33 -0
- pymoo/constraints/__init__.py +3 -0
- pymoo/constraints/adaptive.py +62 -0
- pymoo/constraints/as_obj.py +56 -0
- pymoo/constraints/as_penalty.py +41 -0
- pymoo/constraints/eps.py +26 -0
- pymoo/constraints/from_bounds.py +36 -0
- pymoo/core/__init__.py +0 -0
- pymoo/core/algorithm.py +394 -0
- pymoo/core/callback.py +38 -0
- pymoo/core/crossover.py +77 -0
- pymoo/core/decision_making.py +102 -0
- pymoo/core/decomposition.py +76 -0
- pymoo/core/duplicate.py +163 -0
- pymoo/core/evaluator.py +116 -0
- pymoo/core/indicator.py +34 -0
- pymoo/core/individual.py +783 -0
- pymoo/core/infill.py +64 -0
- pymoo/core/initialization.py +42 -0
- pymoo/core/mating.py +39 -0
- pymoo/core/meta.py +21 -0
- pymoo/core/mixed.py +165 -0
- pymoo/core/mutation.py +44 -0
- pymoo/core/operator.py +40 -0
- pymoo/core/parameters.py +134 -0
- pymoo/core/plot.py +210 -0
- pymoo/core/population.py +180 -0
- pymoo/core/problem.py +460 -0
- pymoo/core/recorder.py +99 -0
- pymoo/core/repair.py +23 -0
- pymoo/core/replacement.py +96 -0
- pymoo/core/result.py +52 -0
- pymoo/core/sampling.py +43 -0
- pymoo/core/selection.py +61 -0
- pymoo/core/solution.py +10 -0
- pymoo/core/survival.py +103 -0
- pymoo/core/termination.py +70 -0
- pymoo/core/variable.py +399 -0
- pymoo/cython/__init__.py +0 -0
- pymoo/cython/calc_perpendicular_distance.cpython-312-darwin.so +0 -0
- pymoo/cython/decomposition.cpython-312-darwin.so +0 -0
- pymoo/cython/hv.cpython-312-darwin.so +0 -0
- pymoo/cython/info.cpython-312-darwin.so +0 -0
- pymoo/cython/mnn.cpython-312-darwin.so +0 -0
- pymoo/cython/non_dominated_sorting.cpython-312-darwin.so +0 -0
- pymoo/cython/pruning_cd.cpython-312-darwin.so +0 -0
- pymoo/cython/stochastic_ranking.cpython-312-darwin.so +0 -0
- pymoo/cython/utils.pxd +129 -0
- pymoo/cython/vendor/__init__.py +0 -0
- pymoo/cython/vendor/hypervolume.h +63 -0
- pymoo/decomposition/__init__.py +0 -0
- pymoo/decomposition/aasf.py +24 -0
- pymoo/decomposition/asf.py +10 -0
- pymoo/decomposition/pbi.py +13 -0
- pymoo/decomposition/perp_dist.py +13 -0
- pymoo/decomposition/tchebicheff.py +11 -0
- pymoo/decomposition/util.py +13 -0
- pymoo/decomposition/weighted_sum.py +8 -0
- pymoo/docs.py +187 -0
- pymoo/experimental/__init__.py +0 -0
- pymoo/experimental/algorithms/__init__.py +0 -0
- pymoo/experimental/algorithms/gde3.py +57 -0
- pymoo/gradient/__init__.py +21 -0
- pymoo/gradient/automatic.py +57 -0
- pymoo/gradient/grad_autograd.py +105 -0
- pymoo/gradient/grad_complex.py +35 -0
- pymoo/gradient/grad_jax.py +51 -0
- pymoo/gradient/toolbox/__init__.py +6 -0
- pymoo/indicators/__init__.py +0 -0
- pymoo/indicators/distance_indicator.py +55 -0
- pymoo/indicators/gd.py +7 -0
- pymoo/indicators/gd_plus.py +7 -0
- pymoo/indicators/hv/__init__.py +63 -0
- pymoo/indicators/hv/exact.py +71 -0
- pymoo/indicators/hv/exact_2d.py +102 -0
- pymoo/indicators/hv/monte_carlo.py +74 -0
- pymoo/indicators/igd.py +7 -0
- pymoo/indicators/igd_plus.py +7 -0
- pymoo/indicators/kktpm.py +151 -0
- pymoo/indicators/migd.py +55 -0
- pymoo/indicators/rmetric.py +203 -0
- pymoo/indicators/spacing.py +52 -0
- pymoo/mcdm/__init__.py +0 -0
- pymoo/mcdm/compromise_programming.py +19 -0
- pymoo/mcdm/high_tradeoff.py +40 -0
- pymoo/mcdm/pseudo_weights.py +32 -0
- pymoo/operators/__init__.py +0 -0
- pymoo/operators/control.py +187 -0
- pymoo/operators/crossover/__init__.py +0 -0
- pymoo/operators/crossover/binx.py +45 -0
- pymoo/operators/crossover/dex.py +122 -0
- pymoo/operators/crossover/erx.py +162 -0
- pymoo/operators/crossover/expx.py +51 -0
- pymoo/operators/crossover/hux.py +37 -0
- pymoo/operators/crossover/nox.py +13 -0
- pymoo/operators/crossover/ox.py +84 -0
- pymoo/operators/crossover/pcx.py +82 -0
- pymoo/operators/crossover/pntx.py +49 -0
- pymoo/operators/crossover/sbx.py +125 -0
- pymoo/operators/crossover/spx.py +5 -0
- pymoo/operators/crossover/ux.py +20 -0
- pymoo/operators/mutation/__init__.py +0 -0
- pymoo/operators/mutation/bitflip.py +17 -0
- pymoo/operators/mutation/gauss.py +58 -0
- pymoo/operators/mutation/inversion.py +42 -0
- pymoo/operators/mutation/nom.py +7 -0
- pymoo/operators/mutation/pm.py +94 -0
- pymoo/operators/mutation/rm.py +23 -0
- pymoo/operators/repair/__init__.py +0 -0
- pymoo/operators/repair/bounce_back.py +32 -0
- pymoo/operators/repair/bounds_repair.py +95 -0
- pymoo/operators/repair/inverse_penalty.py +89 -0
- pymoo/operators/repair/rounding.py +18 -0
- pymoo/operators/repair/to_bound.py +31 -0
- pymoo/operators/repair/vtype.py +11 -0
- pymoo/operators/sampling/__init__.py +0 -0
- pymoo/operators/sampling/lhs.py +73 -0
- pymoo/operators/sampling/rnd.py +50 -0
- pymoo/operators/selection/__init__.py +0 -0
- pymoo/operators/selection/rnd.py +72 -0
- pymoo/operators/selection/tournament.py +76 -0
- pymoo/operators/survival/__init__.py +0 -0
- pymoo/operators/survival/rank_and_crowding/__init__.py +1 -0
- pymoo/operators/survival/rank_and_crowding/classes.py +209 -0
- pymoo/operators/survival/rank_and_crowding/metrics.py +208 -0
- pymoo/optimize.py +72 -0
- pymoo/problems/__init__.py +157 -0
- pymoo/problems/dyn.py +47 -0
- pymoo/problems/dynamic/__init__.py +0 -0
- pymoo/problems/dynamic/cec2015.py +108 -0
- pymoo/problems/dynamic/df.py +452 -0
- pymoo/problems/dynamic/misc.py +167 -0
- pymoo/problems/functional.py +48 -0
- pymoo/problems/many/__init__.py +5 -0
- pymoo/problems/many/cdtlz.py +159 -0
- pymoo/problems/many/dcdtlz.py +88 -0
- pymoo/problems/many/dtlz.py +264 -0
- pymoo/problems/many/wfg.py +550 -0
- pymoo/problems/multi/__init__.py +14 -0
- pymoo/problems/multi/bnh.py +34 -0
- pymoo/problems/multi/carside.py +48 -0
- pymoo/problems/multi/clutch.py +104 -0
- pymoo/problems/multi/csi.py +55 -0
- pymoo/problems/multi/ctp.py +198 -0
- pymoo/problems/multi/dascmop.py +213 -0
- pymoo/problems/multi/kursawe.py +25 -0
- pymoo/problems/multi/modact.py +68 -0
- pymoo/problems/multi/mw.py +400 -0
- pymoo/problems/multi/omnitest.py +48 -0
- pymoo/problems/multi/osy.py +32 -0
- pymoo/problems/multi/srn.py +28 -0
- pymoo/problems/multi/sympart.py +94 -0
- pymoo/problems/multi/tnk.py +24 -0
- pymoo/problems/multi/truss2d.py +83 -0
- pymoo/problems/multi/welded_beam.py +41 -0
- pymoo/problems/multi/wrm.py +36 -0
- pymoo/problems/multi/zdt.py +151 -0
- pymoo/problems/multi_to_single.py +22 -0
- pymoo/problems/single/__init__.py +12 -0
- pymoo/problems/single/ackley.py +24 -0
- pymoo/problems/single/cantilevered_beam.py +34 -0
- pymoo/problems/single/flowshop_scheduling.py +112 -0
- pymoo/problems/single/g.py +874 -0
- pymoo/problems/single/griewank.py +18 -0
- pymoo/problems/single/himmelblau.py +15 -0
- pymoo/problems/single/knapsack.py +48 -0
- pymoo/problems/single/mopta08.py +26 -0
- pymoo/problems/single/multimodal.py +20 -0
- pymoo/problems/single/pressure_vessel.py +30 -0
- pymoo/problems/single/rastrigin.py +20 -0
- pymoo/problems/single/rosenbrock.py +22 -0
- pymoo/problems/single/schwefel.py +18 -0
- pymoo/problems/single/simple.py +13 -0
- pymoo/problems/single/sphere.py +19 -0
- pymoo/problems/single/traveling_salesman.py +79 -0
- pymoo/problems/single/zakharov.py +19 -0
- pymoo/problems/static.py +14 -0
- pymoo/problems/util.py +42 -0
- pymoo/problems/zero_to_one.py +27 -0
- pymoo/termination/__init__.py +23 -0
- pymoo/termination/collection.py +12 -0
- pymoo/termination/cv.py +48 -0
- pymoo/termination/default.py +45 -0
- pymoo/termination/delta.py +64 -0
- pymoo/termination/fmin.py +16 -0
- pymoo/termination/ftol.py +144 -0
- pymoo/termination/indicator.py +49 -0
- pymoo/termination/max_eval.py +14 -0
- pymoo/termination/max_gen.py +15 -0
- pymoo/termination/max_time.py +20 -0
- pymoo/termination/robust.py +34 -0
- pymoo/termination/xtol.py +33 -0
- pymoo/util/__init__.py +0 -0
- pymoo/util/archive.py +150 -0
- pymoo/util/cache.py +29 -0
- pymoo/util/clearing.py +82 -0
- pymoo/util/display/__init__.py +0 -0
- pymoo/util/display/column.py +52 -0
- pymoo/util/display/display.py +34 -0
- pymoo/util/display/multi.py +96 -0
- pymoo/util/display/output.py +53 -0
- pymoo/util/display/progress.py +54 -0
- pymoo/util/display/single.py +67 -0
- pymoo/util/dominator.py +67 -0
- pymoo/util/function_loader.py +129 -0
- pymoo/util/hv.py +23 -0
- pymoo/util/matlab_engine.py +39 -0
- pymoo/util/misc.py +460 -0
- pymoo/util/mnn.py +70 -0
- pymoo/util/nds/__init__.py +0 -0
- pymoo/util/nds/dominance_degree_non_dominated_sort.py +159 -0
- pymoo/util/nds/efficient_non_dominated_sort.py +152 -0
- pymoo/util/nds/fast_non_dominated_sort.py +68 -0
- pymoo/util/nds/naive_non_dominated_sort.py +36 -0
- pymoo/util/nds/non_dominated_sorting.py +67 -0
- pymoo/util/nds/tree_based_non_dominated_sort.py +133 -0
- pymoo/util/normalization.py +315 -0
- pymoo/util/optimum.py +42 -0
- pymoo/util/plotting.py +177 -0
- pymoo/util/pruning_cd.py +89 -0
- pymoo/util/randomized_argsort.py +60 -0
- pymoo/util/ref_dirs/__init__.py +24 -0
- pymoo/util/ref_dirs/construction.py +88 -0
- pymoo/util/ref_dirs/das_dennis.py +52 -0
- pymoo/util/ref_dirs/energy.py +317 -0
- pymoo/util/ref_dirs/energy_layer.py +119 -0
- pymoo/util/ref_dirs/genetic_algorithm.py +63 -0
- pymoo/util/ref_dirs/incremental.py +68 -0
- pymoo/util/ref_dirs/misc.py +128 -0
- pymoo/util/ref_dirs/optimizer.py +59 -0
- pymoo/util/ref_dirs/performance.py +162 -0
- pymoo/util/ref_dirs/reduction.py +85 -0
- pymoo/util/ref_dirs/sample_and_map.py +24 -0
- pymoo/util/reference_direction.py +259 -0
- pymoo/util/remote.py +55 -0
- pymoo/util/roulette.py +27 -0
- pymoo/util/running_metric.py +128 -0
- pymoo/util/sliding_window.py +25 -0
- pymoo/util/stochastic_ranking.py +32 -0
- pymoo/util/vectors.py +40 -0
- pymoo/vendor/__init__.py +0 -0
- pymoo/vendor/cec2018.py +398 -0
- pymoo/vendor/gta.py +617 -0
- pymoo/vendor/hv.py +267 -0
- pymoo/vendor/vendor_cmaes.py +412 -0
- pymoo/vendor/vendor_coco.py +81 -0
- pymoo/vendor/vendor_scipy.py +232 -0
- pymoo/version.py +1 -0
- pymoo/visualization/__init__.py +8 -0
- pymoo/visualization/fitness_landscape.py +127 -0
- pymoo/visualization/heatmap.py +123 -0
- pymoo/visualization/pcp.py +120 -0
- pymoo/visualization/petal.py +91 -0
- pymoo/visualization/radar.py +108 -0
- pymoo/visualization/radviz.py +68 -0
- pymoo/visualization/scatter.py +150 -0
- pymoo/visualization/star_coordinate.py +75 -0
- pymoo/visualization/util.py +123 -0
- pymoo/visualization/video/__init__.py +0 -0
- pymoo/visualization/video/callback_video.py +82 -0
- pymoo/visualization/video/one_var_one_obj.py +57 -0
- pymoo/visualization/video/two_var_one_obj.py +62 -0
- pymoo-0.6.1.2.dist-info/LICENSE +191 -0
- pymoo-0.6.1.2.dist-info/METADATA +188 -0
- pymoo-0.6.1.2.dist-info/RECORD +316 -0
- pymoo-0.6.1.2.dist-info/WHEEL +5 -0
- pymoo-0.6.1.2.dist-info/top_level.txt +1 -0
pymoo/core/variable.py
ADDED
|
@@ -0,0 +1,399 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Module containing infrastructure for representing decision variable classes.
|
|
3
|
+
"""
|
|
4
|
+
|
|
5
|
+
# public API for when using ``from pymoo.core.variable import *``
|
|
6
|
+
__all__ = [
|
|
7
|
+
"Variable",
|
|
8
|
+
"BoundedVariable",
|
|
9
|
+
"Real",
|
|
10
|
+
"Integer",
|
|
11
|
+
"Binary",
|
|
12
|
+
"Choice",
|
|
13
|
+
"get",
|
|
14
|
+
]
|
|
15
|
+
|
|
16
|
+
from typing import Optional, Tuple
|
|
17
|
+
from typing import Union
|
|
18
|
+
import numpy as np
|
|
19
|
+
from numpy.typing import ArrayLike
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class Variable(object):
|
|
23
|
+
"""
|
|
24
|
+
Semi-abstract base class for the representation of a decision variable.
|
|
25
|
+
"""
|
|
26
|
+
|
|
27
|
+
def __init__(
|
|
28
|
+
self,
|
|
29
|
+
value: Optional[object] = None,
|
|
30
|
+
active: bool = True,
|
|
31
|
+
flag: str = "default",
|
|
32
|
+
) -> None:
|
|
33
|
+
"""
|
|
34
|
+
Constructor for the ``Variable`` class.
|
|
35
|
+
|
|
36
|
+
Parameters
|
|
37
|
+
----------
|
|
38
|
+
value : object, None
|
|
39
|
+
Value the decision variable is to take.
|
|
40
|
+
active : bool
|
|
41
|
+
Whether the variable is active (``True``) or inactive (``False``).
|
|
42
|
+
flag : str
|
|
43
|
+
Flag to bind to the decision variable.
|
|
44
|
+
"""
|
|
45
|
+
super().__init__()
|
|
46
|
+
self.value = value
|
|
47
|
+
self.flag = flag
|
|
48
|
+
self.active = active
|
|
49
|
+
|
|
50
|
+
def sample(
|
|
51
|
+
self,
|
|
52
|
+
n: Optional[int] = None,
|
|
53
|
+
) -> Union[object,np.ndarray]:
|
|
54
|
+
"""
|
|
55
|
+
Randomly sample ``n`` instances of a decision variable.
|
|
56
|
+
|
|
57
|
+
Parameters
|
|
58
|
+
----------
|
|
59
|
+
n : int, None
|
|
60
|
+
Number of decision variable samples which to draw.
|
|
61
|
+
If ``int``, sample ``n`` decision variables.
|
|
62
|
+
If ``None``, sample a single decision variables.
|
|
63
|
+
|
|
64
|
+
Returns
|
|
65
|
+
-------
|
|
66
|
+
out : object, np.ndarray
|
|
67
|
+
If ``n`` is ``int``, return a ``np.ndarray`` of shape ``(n,)``
|
|
68
|
+
containing sampled decision variables.
|
|
69
|
+
If ``n`` is ``None``, return an ``object`` of a sampled decision
|
|
70
|
+
variable.
|
|
71
|
+
"""
|
|
72
|
+
if n is None:
|
|
73
|
+
return self._sample(1)[0]
|
|
74
|
+
else:
|
|
75
|
+
return self._sample(n)
|
|
76
|
+
|
|
77
|
+
def _sample(
|
|
78
|
+
self,
|
|
79
|
+
n: int,
|
|
80
|
+
) -> np.ndarray:
|
|
81
|
+
"""
|
|
82
|
+
Randomly sample ``n`` instances of a decision variable.
|
|
83
|
+
This is an abstract private method governing the behavior of the
|
|
84
|
+
``sample`` method.
|
|
85
|
+
|
|
86
|
+
Parameters
|
|
87
|
+
----------
|
|
88
|
+
n : int
|
|
89
|
+
Number of decision variable samples which to draw.
|
|
90
|
+
|
|
91
|
+
Returns
|
|
92
|
+
-------
|
|
93
|
+
out : np.ndarray
|
|
94
|
+
An array of shape ``(n,)`` containing sampled decision variables.
|
|
95
|
+
"""
|
|
96
|
+
pass
|
|
97
|
+
|
|
98
|
+
def set(
|
|
99
|
+
self,
|
|
100
|
+
value: object,
|
|
101
|
+
) -> None:
|
|
102
|
+
"""
|
|
103
|
+
Set the value of a decision variable.
|
|
104
|
+
|
|
105
|
+
Parameters
|
|
106
|
+
----------
|
|
107
|
+
value : object
|
|
108
|
+
Value to assign to the decision variable.
|
|
109
|
+
"""
|
|
110
|
+
self.value = value
|
|
111
|
+
|
|
112
|
+
def get(
|
|
113
|
+
self,
|
|
114
|
+
**kwargs: dict
|
|
115
|
+
) -> object:
|
|
116
|
+
"""
|
|
117
|
+
Get the value of a decision variable.
|
|
118
|
+
|
|
119
|
+
Parameters
|
|
120
|
+
----------
|
|
121
|
+
kwargs : dict
|
|
122
|
+
Additional keyword arguments.
|
|
123
|
+
|
|
124
|
+
Returns
|
|
125
|
+
-------
|
|
126
|
+
out : object
|
|
127
|
+
The value of the decision variable.
|
|
128
|
+
"""
|
|
129
|
+
return self.value
|
|
130
|
+
|
|
131
|
+
|
|
132
|
+
class BoundedVariable(Variable):
|
|
133
|
+
"""
|
|
134
|
+
Semi-abstract class for the representation of a bounded decision variable.
|
|
135
|
+
"""
|
|
136
|
+
|
|
137
|
+
def __init__(
|
|
138
|
+
self,
|
|
139
|
+
value: Optional[object] = None,
|
|
140
|
+
bounds: Tuple[Optional[object],Optional[object]] = (None, None),
|
|
141
|
+
strict: Optional[Tuple[Optional[object],Optional[object]]] = None,
|
|
142
|
+
**kwargs: dict,
|
|
143
|
+
) -> None:
|
|
144
|
+
"""
|
|
145
|
+
Constructor for the ``BoundedVariable`` class.
|
|
146
|
+
|
|
147
|
+
Parameters
|
|
148
|
+
----------
|
|
149
|
+
value : object
|
|
150
|
+
Value the decision variable is to take.
|
|
151
|
+
bounds : tuple
|
|
152
|
+
A tuple of length 2 containing upper and lower limits for the
|
|
153
|
+
decision variable.
|
|
154
|
+
strict : tuple, None
|
|
155
|
+
Strict boundaries for the decision variable.
|
|
156
|
+
If ``None``, the value of ``bounds`` is copied to ``strict``.
|
|
157
|
+
kwargs : dict
|
|
158
|
+
Additional keyword arguments for ``active`` and ``flag``.
|
|
159
|
+
"""
|
|
160
|
+
# call the Variable constructor
|
|
161
|
+
super().__init__(value=value, **kwargs)
|
|
162
|
+
self.bounds = bounds
|
|
163
|
+
|
|
164
|
+
# if no strict boundaries were provided, consider ``bounds`` as
|
|
165
|
+
# strict boundaries
|
|
166
|
+
if strict is None:
|
|
167
|
+
strict = bounds
|
|
168
|
+
self.strict = strict
|
|
169
|
+
|
|
170
|
+
@property
|
|
171
|
+
def lb(self) -> object:
|
|
172
|
+
"""
|
|
173
|
+
Lower bound of the decision variable.
|
|
174
|
+
|
|
175
|
+
Returns
|
|
176
|
+
-------
|
|
177
|
+
out : object
|
|
178
|
+
The decision variable lower bound.
|
|
179
|
+
"""
|
|
180
|
+
return self.bounds[0]
|
|
181
|
+
|
|
182
|
+
@property
|
|
183
|
+
def ub(self) -> object:
|
|
184
|
+
"""
|
|
185
|
+
Upper bound of the decision variable.
|
|
186
|
+
|
|
187
|
+
Returns
|
|
188
|
+
-------
|
|
189
|
+
out : object
|
|
190
|
+
The decision variable upper bound.
|
|
191
|
+
"""
|
|
192
|
+
return self.bounds[1]
|
|
193
|
+
|
|
194
|
+
|
|
195
|
+
class Real(BoundedVariable):
|
|
196
|
+
"""
|
|
197
|
+
Class for the representation of bounded, real decision variables.
|
|
198
|
+
"""
|
|
199
|
+
# variable type represented by this object class
|
|
200
|
+
vtype = float
|
|
201
|
+
|
|
202
|
+
def _sample(
|
|
203
|
+
self,
|
|
204
|
+
n: int,
|
|
205
|
+
) -> np.ndarray:
|
|
206
|
+
"""
|
|
207
|
+
Randomly sample ``n`` instances of a real, bounded decision variable.
|
|
208
|
+
Decision variables are sampled from a uniform distribution.
|
|
209
|
+
|
|
210
|
+
This is a private method governing the behavior of the ``sample``
|
|
211
|
+
method.
|
|
212
|
+
|
|
213
|
+
Parameters
|
|
214
|
+
----------
|
|
215
|
+
n : int
|
|
216
|
+
Number of decision variable samples which to draw.
|
|
217
|
+
|
|
218
|
+
Returns
|
|
219
|
+
-------
|
|
220
|
+
out : np.ndarray
|
|
221
|
+
An array of shape ``(n,)`` containing sampled real, bounded
|
|
222
|
+
decision variables.
|
|
223
|
+
"""
|
|
224
|
+
low, high = self.bounds
|
|
225
|
+
return np.random.uniform(low=low, high=high, size=n)
|
|
226
|
+
|
|
227
|
+
|
|
228
|
+
class Integer(BoundedVariable):
|
|
229
|
+
"""
|
|
230
|
+
Class for the representation of bounded, integer decision variables.
|
|
231
|
+
"""
|
|
232
|
+
# variable type represented by this object class
|
|
233
|
+
vtype = int
|
|
234
|
+
|
|
235
|
+
def _sample(
|
|
236
|
+
self,
|
|
237
|
+
n: int,
|
|
238
|
+
) -> np.ndarray:
|
|
239
|
+
"""
|
|
240
|
+
Randomly sample ``n`` instances of a bounded, integer decision variable.
|
|
241
|
+
Decision variables are sampled from a uniform distribution.
|
|
242
|
+
|
|
243
|
+
This is a private method governing the behavior of the ``sample``
|
|
244
|
+
method.
|
|
245
|
+
|
|
246
|
+
Parameters
|
|
247
|
+
----------
|
|
248
|
+
n : int
|
|
249
|
+
Number of decision variable samples which to draw.
|
|
250
|
+
|
|
251
|
+
Returns
|
|
252
|
+
-------
|
|
253
|
+
out : np.ndarray
|
|
254
|
+
An array of shape ``(n,)`` containing sampled bounded, integer
|
|
255
|
+
decision variables.
|
|
256
|
+
"""
|
|
257
|
+
low, high = self.bounds
|
|
258
|
+
return np.random.randint(low, high=high + 1, size=n)
|
|
259
|
+
|
|
260
|
+
|
|
261
|
+
class Binary(BoundedVariable):
|
|
262
|
+
"""
|
|
263
|
+
Class for the representation of a binary, bounded decision variable.
|
|
264
|
+
"""
|
|
265
|
+
# variable type represented by this object class
|
|
266
|
+
vtype = bool
|
|
267
|
+
|
|
268
|
+
def _sample(
|
|
269
|
+
self,
|
|
270
|
+
n: int,
|
|
271
|
+
) -> np.ndarray:
|
|
272
|
+
"""
|
|
273
|
+
Randomly sample ``n`` instances of a bounded, binary decision variable.
|
|
274
|
+
Decision variables are sampled from a uniform distribution.
|
|
275
|
+
|
|
276
|
+
This is a private method governing the behavior of the ``sample``
|
|
277
|
+
method.
|
|
278
|
+
|
|
279
|
+
Parameters
|
|
280
|
+
----------
|
|
281
|
+
n : int
|
|
282
|
+
Number of decision variable samples which to draw.
|
|
283
|
+
|
|
284
|
+
Returns
|
|
285
|
+
-------
|
|
286
|
+
out : np.ndarray
|
|
287
|
+
An array of shape ``(n,)`` containing sampled bounded, binary
|
|
288
|
+
decision variables.
|
|
289
|
+
"""
|
|
290
|
+
return np.random.random(size=n) < 0.5
|
|
291
|
+
|
|
292
|
+
|
|
293
|
+
class Choice(Variable):
|
|
294
|
+
"""
|
|
295
|
+
Class for the representation of a discrete, subset decision variable.
|
|
296
|
+
"""
|
|
297
|
+
# variable type represented by this object class
|
|
298
|
+
vtype = object
|
|
299
|
+
|
|
300
|
+
def __init__(
|
|
301
|
+
self,
|
|
302
|
+
value: Optional[object] = None,
|
|
303
|
+
options: Optional[ArrayLike] = None,
|
|
304
|
+
all: Optional[ArrayLike] = None,
|
|
305
|
+
**kwargs: dict,
|
|
306
|
+
) -> None:
|
|
307
|
+
"""
|
|
308
|
+
Constructor for the ``Choice`` class.
|
|
309
|
+
|
|
310
|
+
Parameters
|
|
311
|
+
----------
|
|
312
|
+
value : object
|
|
313
|
+
Value the decision variable is to take.
|
|
314
|
+
options : ArrayLike, None
|
|
315
|
+
A list of decision variable options from which to choose.
|
|
316
|
+
all : ArrayLike, None
|
|
317
|
+
A strict list of decision variable options from which to choose.
|
|
318
|
+
If ``None``, the value of ``options`` is copied to ``all``.
|
|
319
|
+
kwargs : dict
|
|
320
|
+
Additional keyword arguments for ``active`` and ``flag``.
|
|
321
|
+
"""
|
|
322
|
+
# all super constructor
|
|
323
|
+
super().__init__(value=value, **kwargs)
|
|
324
|
+
self.options = options
|
|
325
|
+
|
|
326
|
+
# if strict list not provided, set to ``options``
|
|
327
|
+
if all is None:
|
|
328
|
+
all = options
|
|
329
|
+
self.all = all
|
|
330
|
+
|
|
331
|
+
def _sample(
|
|
332
|
+
self,
|
|
333
|
+
n: int,
|
|
334
|
+
) -> np.ndarray:
|
|
335
|
+
"""
|
|
336
|
+
Randomly sample ``n`` instances of a discrete, subset decision variable.
|
|
337
|
+
Decision variables are sampled with replacement from a uniform
|
|
338
|
+
distribution.
|
|
339
|
+
|
|
340
|
+
This is a private method governing the behavior of the ``sample``
|
|
341
|
+
method.
|
|
342
|
+
|
|
343
|
+
Parameters
|
|
344
|
+
----------
|
|
345
|
+
n : int
|
|
346
|
+
Number of decision variable samples which to draw.
|
|
347
|
+
|
|
348
|
+
Returns
|
|
349
|
+
-------
|
|
350
|
+
out : np.ndarray
|
|
351
|
+
An array of shape ``(n,)`` containing sampled bounded, integer
|
|
352
|
+
decision variables.
|
|
353
|
+
"""
|
|
354
|
+
return np.random.choice(self.options, size=n)
|
|
355
|
+
|
|
356
|
+
|
|
357
|
+
def get(
|
|
358
|
+
*args: Tuple[Union[Variable,object],...],
|
|
359
|
+
size: Optional[Union[tuple,int]] = None,
|
|
360
|
+
**kwargs: dict
|
|
361
|
+
) -> Union[tuple,object,None]:
|
|
362
|
+
"""
|
|
363
|
+
Get decision variable values from a tuple of ``Variable`` objects.
|
|
364
|
+
|
|
365
|
+
Parameters
|
|
366
|
+
----------
|
|
367
|
+
args : tuple
|
|
368
|
+
A tuple of ``Variable`` or ``object``s.
|
|
369
|
+
size : tuple, int, None
|
|
370
|
+
Size to reshape decision variables.
|
|
371
|
+
kwargs : dict
|
|
372
|
+
Additional keyword arguments to pass to the ``get`` method of the
|
|
373
|
+
``Variable`` class when getting decision variable values.
|
|
374
|
+
|
|
375
|
+
Returns
|
|
376
|
+
-------
|
|
377
|
+
out : tuple, object, None
|
|
378
|
+
Decision variable value(s).
|
|
379
|
+
"""
|
|
380
|
+
if len(args) == 0:
|
|
381
|
+
return
|
|
382
|
+
|
|
383
|
+
ret = []
|
|
384
|
+
for arg in args:
|
|
385
|
+
v = arg.get(**kwargs) if isinstance(arg, Variable) else arg
|
|
386
|
+
|
|
387
|
+
if size is not None:
|
|
388
|
+
|
|
389
|
+
if isinstance(v, np.ndarray):
|
|
390
|
+
v = np.reshape(v, size)
|
|
391
|
+
else:
|
|
392
|
+
v = np.full(size, v)
|
|
393
|
+
|
|
394
|
+
ret.append(v)
|
|
395
|
+
|
|
396
|
+
if len(ret) == 1:
|
|
397
|
+
return ret[0]
|
|
398
|
+
else:
|
|
399
|
+
return tuple(ret)
|
pymoo/cython/__init__.py
ADDED
|
File without changes
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
pymoo/cython/utils.pxd
ADDED
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
# distutils: language = c++
|
|
2
|
+
# cython: language_level=2, boundscheck=False, wraparound=False, cdivision=True
|
|
3
|
+
|
|
4
|
+
import numpy as np
|
|
5
|
+
|
|
6
|
+
from libcpp cimport bool
|
|
7
|
+
from libcpp.vector cimport vector
|
|
8
|
+
from libcpp.set cimport set as cpp_set
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
cdef extern from "math.h":
|
|
12
|
+
double HUGE_VAL
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
# Returns elements to remove based on crowding metric d and heap of remaining elements H
|
|
16
|
+
cdef inline int c_get_drop(double[:] d, cpp_set[int] H):
|
|
17
|
+
|
|
18
|
+
cdef:
|
|
19
|
+
int i, min_i
|
|
20
|
+
double min_d
|
|
21
|
+
|
|
22
|
+
min_d = HUGE_VAL
|
|
23
|
+
min_i = 0
|
|
24
|
+
|
|
25
|
+
for i in H:
|
|
26
|
+
|
|
27
|
+
if d[i] <= min_d:
|
|
28
|
+
min_d = d[i]
|
|
29
|
+
min_i = i
|
|
30
|
+
|
|
31
|
+
return min_i
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
# Returns vector of positions of minimum values along axis 0 of a 2d memoryview
|
|
35
|
+
cdef inline vector[int] c_get_argmin(double[:, :] X):
|
|
36
|
+
|
|
37
|
+
cdef:
|
|
38
|
+
int N, M, min_i, n, m
|
|
39
|
+
double min_val
|
|
40
|
+
vector[int] indexes
|
|
41
|
+
|
|
42
|
+
N = X.shape[0]
|
|
43
|
+
M = X.shape[1]
|
|
44
|
+
|
|
45
|
+
indexes = vector[int]()
|
|
46
|
+
|
|
47
|
+
for m in range(M):
|
|
48
|
+
|
|
49
|
+
min_i = 0
|
|
50
|
+
min_val = X[0, m]
|
|
51
|
+
|
|
52
|
+
for n in range(N):
|
|
53
|
+
|
|
54
|
+
if X[n, m] < min_val:
|
|
55
|
+
|
|
56
|
+
min_i = n
|
|
57
|
+
min_val = X[n, m]
|
|
58
|
+
|
|
59
|
+
indexes.push_back(min_i)
|
|
60
|
+
|
|
61
|
+
return indexes
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
# Returns vector of positions of maximum values along axis 0 of a 2d memoryview
|
|
65
|
+
cdef inline vector[int] c_get_argmax(double[:, :] X):
|
|
66
|
+
|
|
67
|
+
cdef:
|
|
68
|
+
int N, M, max_i, n, m
|
|
69
|
+
double max_val
|
|
70
|
+
vector[int] indexes
|
|
71
|
+
|
|
72
|
+
N = X.shape[0]
|
|
73
|
+
M = X.shape[1]
|
|
74
|
+
|
|
75
|
+
indexes = vector[int]()
|
|
76
|
+
|
|
77
|
+
for m in range(M):
|
|
78
|
+
|
|
79
|
+
max_i = 0
|
|
80
|
+
max_val = X[0, m]
|
|
81
|
+
|
|
82
|
+
for n in range(N):
|
|
83
|
+
|
|
84
|
+
if X[n, m] > max_val:
|
|
85
|
+
|
|
86
|
+
max_i = n
|
|
87
|
+
max_val = X[n, m]
|
|
88
|
+
|
|
89
|
+
indexes.push_back(max_i)
|
|
90
|
+
|
|
91
|
+
return indexes
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
# Performs normalization of a 2d memoryview
|
|
95
|
+
cdef inline double[:, :] c_normalize_array(double[:, :] X, vector[int] extremes_max, vector[int] extremes_min):
|
|
96
|
+
|
|
97
|
+
cdef:
|
|
98
|
+
int N = X.shape[0]
|
|
99
|
+
int M = X.shape[1]
|
|
100
|
+
int n, m, l, u
|
|
101
|
+
double l_val, u_val, diff_val
|
|
102
|
+
vector[double] min_vals, max_vals
|
|
103
|
+
|
|
104
|
+
min_vals = vector[double]()
|
|
105
|
+
max_vals = vector[double]()
|
|
106
|
+
|
|
107
|
+
m = 0
|
|
108
|
+
for u in extremes_max:
|
|
109
|
+
u_val = X[u, m]
|
|
110
|
+
max_vals.push_back(u_val)
|
|
111
|
+
m = m + 1
|
|
112
|
+
|
|
113
|
+
m = 0
|
|
114
|
+
for l in extremes_min:
|
|
115
|
+
l_val = X[l, m]
|
|
116
|
+
min_vals.push_back(l_val)
|
|
117
|
+
m = m + 1
|
|
118
|
+
|
|
119
|
+
for m in range(M):
|
|
120
|
+
|
|
121
|
+
diff_val = max_vals[m] - min_vals[m]
|
|
122
|
+
if diff_val == 0.0:
|
|
123
|
+
diff_val = 1.0
|
|
124
|
+
|
|
125
|
+
for n in range(N):
|
|
126
|
+
|
|
127
|
+
X[n, m] = (X[n, m] - min_vals[m]) / diff_val
|
|
128
|
+
|
|
129
|
+
return X
|
|
File without changes
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
|
|
2
|
+
|
|
3
|
+
#ifndef HYPERVOLUME_H
|
|
4
|
+
#define HYPERVOLUME_H
|
|
5
|
+
|
|
6
|
+
/*!
|
|
7
|
+
*
|
|
8
|
+
* \brief Implementation of the Overmars-Yap Algorithm, originally provided by N. Beume.
|
|
9
|
+
*
|
|
10
|
+
* Applicable to points of dimension d >= 3. It is assumed that the array of points is sorted
|
|
11
|
+
* according to the 'last' objective.
|
|
12
|
+
*
|
|
13
|
+
* <PRE>
|
|
14
|
+
* author = {Nicola Beume and G\"unther Rudolph},
|
|
15
|
+
* title = {Faster {S}-Metric Calculation By Considering Dominated Hypervolume as {Klee}'s Measure Problem},
|
|
16
|
+
* booktitle = {IASTED International Conference on Computational Intelligence},
|
|
17
|
+
* publisher = {ACTA Press},
|
|
18
|
+
* pages = {231-236},
|
|
19
|
+
* year = {2006},
|
|
20
|
+
* </PRE>
|
|
21
|
+
*/
|
|
22
|
+
|
|
23
|
+
double overmars_yap( double * points, double * referencePoint, unsigned noObjectives, unsigned noPoints );
|
|
24
|
+
|
|
25
|
+
/*!
|
|
26
|
+
*
|
|
27
|
+
* \brief Algorithm for the special case of d = 3 objectives.
|
|
28
|
+
*
|
|
29
|
+
* Applicable to points of dimension d = 3.
|
|
30
|
+
*
|
|
31
|
+
* Relevant literature:
|
|
32
|
+
*
|
|
33
|
+
* [1] C. M. Fonseca, L. Paquete, and M. Lopez-Ibanez. An
|
|
34
|
+
* improved dimension-sweep algorithm for the hypervolume
|
|
35
|
+
* indicator. In IEEE Congress on Evolutionary Computation,
|
|
36
|
+
* pages 1157-1163, Vancouver, Canada, July 2006.
|
|
37
|
+
*
|
|
38
|
+
* [2] L. Paquete, C. M. Fonseca and M. Lopez-Ibanez. An optimal
|
|
39
|
+
* algorithm for a special case of Klee's measure problem in three
|
|
40
|
+
* dimensions. Technical Report CSI-RT-I-01/2006, CSI, Universidade
|
|
41
|
+
* do Algarve, 2006.
|
|
42
|
+
*/
|
|
43
|
+
|
|
44
|
+
double fonseca( double * points, double * referencePoint, unsigned noObjectives, unsigned noPoints );
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
//!
|
|
48
|
+
//! \brief computation of the hypervolume
|
|
49
|
+
//!
|
|
50
|
+
//! \par
|
|
51
|
+
//! This function acts as a frontend to various algorithms
|
|
52
|
+
//! for the computation of the hypervolume.
|
|
53
|
+
//!
|
|
54
|
+
//! \param points the list containes the coordinates of all points in a single array
|
|
55
|
+
//! \param referencePoint the reference or nadir point
|
|
56
|
+
//! \param noObjectives number of coordinates per point
|
|
57
|
+
//! \param noPoints number of points in the list
|
|
58
|
+
//! \return dominated hypervolume
|
|
59
|
+
//!
|
|
60
|
+
double hypervolume(double* points, double* referencePoint, unsigned int noObjectives, unsigned int noPoints);
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
#endif // HYPERVOLUME_H
|
|
File without changes
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import numpy as np
|
|
2
|
+
|
|
3
|
+
from pymoo.decomposition.asf import ASF
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class AASF(ASF):
|
|
7
|
+
|
|
8
|
+
def __init__(self, eps=1e-10, _type="auto", rho=None, beta=None, **kwargs) -> None:
|
|
9
|
+
super().__init__(eps, _type, **kwargs)
|
|
10
|
+
if rho is None and beta is None:
|
|
11
|
+
raise Exception("Either provide rho or beta!")
|
|
12
|
+
elif rho is None:
|
|
13
|
+
self.rho = calc_rho(beta)
|
|
14
|
+
else:
|
|
15
|
+
self.rho = rho
|
|
16
|
+
|
|
17
|
+
def _do(self, F, weights, **kwargs):
|
|
18
|
+
asf = super()._do(F, weights, **kwargs)
|
|
19
|
+
augment = ((F - self.utopian_point) / np.clip(weights, 1e-12, np.inf)).sum(axis=1)
|
|
20
|
+
return asf + self.rho * augment
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
def calc_rho(beta):
|
|
24
|
+
return 1 / (1 - np.tan(beta / 360 * 2 * np.pi)) - 1
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
from pymoo.core.decomposition import Decomposition
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
class ASF(Decomposition):
|
|
5
|
+
|
|
6
|
+
def _do(self, F, weights, weight_0=1e-10, **kwargs):
|
|
7
|
+
_weights = weights.astype(float)
|
|
8
|
+
_weights[weights == 0] = weight_0
|
|
9
|
+
asf = ((F - self.utopian_point) / _weights).max(axis=1)
|
|
10
|
+
return asf
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
from pymoo.core.decomposition import Decomposition
|
|
2
|
+
from pymoo.util.function_loader import load_function
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
class PBI(Decomposition):
|
|
6
|
+
|
|
7
|
+
def __init__(self, theta=5, **kwargs) -> None:
|
|
8
|
+
super().__init__(**kwargs)
|
|
9
|
+
self.theta = theta
|
|
10
|
+
|
|
11
|
+
def _do(self, F, weights, **kwargs):
|
|
12
|
+
d1, d2 = load_function("calc_distance_to_weights")(F, weights, self.utopian_point)
|
|
13
|
+
return d1 + self.theta * d2
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
from pymoo.core.decomposition import Decomposition
|
|
2
|
+
from pymoo.util.function_loader import load_function
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
class PerpendicularDistance(Decomposition):
|
|
6
|
+
|
|
7
|
+
def __init__(self, theta=5, **kwargs) -> None:
|
|
8
|
+
super().__init__(**kwargs)
|
|
9
|
+
self.theta = theta
|
|
10
|
+
|
|
11
|
+
def _do(self, F, weights, **kwargs):
|
|
12
|
+
_, d2 = load_function("calc_distance_to_weights")(F, weights)
|
|
13
|
+
return d2
|