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.

Files changed (316) hide show
  1. pymoo/__init__.py +3 -0
  2. pymoo/algorithms/__init__.py +0 -0
  3. pymoo/algorithms/base/__init__.py +0 -0
  4. pymoo/algorithms/base/bracket.py +38 -0
  5. pymoo/algorithms/base/genetic.py +109 -0
  6. pymoo/algorithms/base/line.py +62 -0
  7. pymoo/algorithms/base/local.py +39 -0
  8. pymoo/algorithms/base/meta.py +79 -0
  9. pymoo/algorithms/hyperparameters.py +89 -0
  10. pymoo/algorithms/moo/__init__.py +0 -0
  11. pymoo/algorithms/moo/age.py +304 -0
  12. pymoo/algorithms/moo/age2.py +164 -0
  13. pymoo/algorithms/moo/ctaea.py +298 -0
  14. pymoo/algorithms/moo/dnsga2.py +76 -0
  15. pymoo/algorithms/moo/kgb.py +446 -0
  16. pymoo/algorithms/moo/moead.py +183 -0
  17. pymoo/algorithms/moo/nsga2.py +117 -0
  18. pymoo/algorithms/moo/nsga3.py +358 -0
  19. pymoo/algorithms/moo/rnsga2.py +188 -0
  20. pymoo/algorithms/moo/rnsga3.py +246 -0
  21. pymoo/algorithms/moo/rvea.py +214 -0
  22. pymoo/algorithms/moo/sms.py +195 -0
  23. pymoo/algorithms/moo/spea2.py +190 -0
  24. pymoo/algorithms/moo/unsga3.py +47 -0
  25. pymoo/algorithms/soo/__init__.py +0 -0
  26. pymoo/algorithms/soo/convex/__init__.py +0 -0
  27. pymoo/algorithms/soo/nonconvex/__init__.py +0 -0
  28. pymoo/algorithms/soo/nonconvex/brkga.py +161 -0
  29. pymoo/algorithms/soo/nonconvex/cmaes.py +554 -0
  30. pymoo/algorithms/soo/nonconvex/de.py +279 -0
  31. pymoo/algorithms/soo/nonconvex/direct.py +149 -0
  32. pymoo/algorithms/soo/nonconvex/es.py +202 -0
  33. pymoo/algorithms/soo/nonconvex/g3pcx.py +94 -0
  34. pymoo/algorithms/soo/nonconvex/ga.py +93 -0
  35. pymoo/algorithms/soo/nonconvex/ga_niching.py +223 -0
  36. pymoo/algorithms/soo/nonconvex/isres.py +74 -0
  37. pymoo/algorithms/soo/nonconvex/nelder.py +251 -0
  38. pymoo/algorithms/soo/nonconvex/optuna.py +80 -0
  39. pymoo/algorithms/soo/nonconvex/pattern.py +183 -0
  40. pymoo/algorithms/soo/nonconvex/pso.py +399 -0
  41. pymoo/algorithms/soo/nonconvex/pso_ep.py +297 -0
  42. pymoo/algorithms/soo/nonconvex/random_search.py +25 -0
  43. pymoo/algorithms/soo/nonconvex/sres.py +56 -0
  44. pymoo/algorithms/soo/univariate/__init__.py +0 -0
  45. pymoo/algorithms/soo/univariate/backtracking.py +59 -0
  46. pymoo/algorithms/soo/univariate/exp.py +46 -0
  47. pymoo/algorithms/soo/univariate/golden.py +65 -0
  48. pymoo/algorithms/soo/univariate/quadr_interp.py +81 -0
  49. pymoo/algorithms/soo/univariate/wolfe.py +163 -0
  50. pymoo/config.py +33 -0
  51. pymoo/constraints/__init__.py +3 -0
  52. pymoo/constraints/adaptive.py +62 -0
  53. pymoo/constraints/as_obj.py +56 -0
  54. pymoo/constraints/as_penalty.py +41 -0
  55. pymoo/constraints/eps.py +26 -0
  56. pymoo/constraints/from_bounds.py +36 -0
  57. pymoo/core/__init__.py +0 -0
  58. pymoo/core/algorithm.py +394 -0
  59. pymoo/core/callback.py +38 -0
  60. pymoo/core/crossover.py +77 -0
  61. pymoo/core/decision_making.py +102 -0
  62. pymoo/core/decomposition.py +76 -0
  63. pymoo/core/duplicate.py +163 -0
  64. pymoo/core/evaluator.py +116 -0
  65. pymoo/core/indicator.py +34 -0
  66. pymoo/core/individual.py +783 -0
  67. pymoo/core/infill.py +64 -0
  68. pymoo/core/initialization.py +42 -0
  69. pymoo/core/mating.py +39 -0
  70. pymoo/core/meta.py +21 -0
  71. pymoo/core/mixed.py +165 -0
  72. pymoo/core/mutation.py +44 -0
  73. pymoo/core/operator.py +40 -0
  74. pymoo/core/parameters.py +134 -0
  75. pymoo/core/plot.py +210 -0
  76. pymoo/core/population.py +180 -0
  77. pymoo/core/problem.py +460 -0
  78. pymoo/core/recorder.py +99 -0
  79. pymoo/core/repair.py +23 -0
  80. pymoo/core/replacement.py +96 -0
  81. pymoo/core/result.py +52 -0
  82. pymoo/core/sampling.py +43 -0
  83. pymoo/core/selection.py +61 -0
  84. pymoo/core/solution.py +10 -0
  85. pymoo/core/survival.py +103 -0
  86. pymoo/core/termination.py +70 -0
  87. pymoo/core/variable.py +399 -0
  88. pymoo/cython/__init__.py +0 -0
  89. pymoo/cython/calc_perpendicular_distance.cpython-312-darwin.so +0 -0
  90. pymoo/cython/decomposition.cpython-312-darwin.so +0 -0
  91. pymoo/cython/hv.cpython-312-darwin.so +0 -0
  92. pymoo/cython/info.cpython-312-darwin.so +0 -0
  93. pymoo/cython/mnn.cpython-312-darwin.so +0 -0
  94. pymoo/cython/non_dominated_sorting.cpython-312-darwin.so +0 -0
  95. pymoo/cython/pruning_cd.cpython-312-darwin.so +0 -0
  96. pymoo/cython/stochastic_ranking.cpython-312-darwin.so +0 -0
  97. pymoo/cython/utils.pxd +129 -0
  98. pymoo/cython/vendor/__init__.py +0 -0
  99. pymoo/cython/vendor/hypervolume.h +63 -0
  100. pymoo/decomposition/__init__.py +0 -0
  101. pymoo/decomposition/aasf.py +24 -0
  102. pymoo/decomposition/asf.py +10 -0
  103. pymoo/decomposition/pbi.py +13 -0
  104. pymoo/decomposition/perp_dist.py +13 -0
  105. pymoo/decomposition/tchebicheff.py +11 -0
  106. pymoo/decomposition/util.py +13 -0
  107. pymoo/decomposition/weighted_sum.py +8 -0
  108. pymoo/docs.py +187 -0
  109. pymoo/experimental/__init__.py +0 -0
  110. pymoo/experimental/algorithms/__init__.py +0 -0
  111. pymoo/experimental/algorithms/gde3.py +57 -0
  112. pymoo/gradient/__init__.py +21 -0
  113. pymoo/gradient/automatic.py +57 -0
  114. pymoo/gradient/grad_autograd.py +105 -0
  115. pymoo/gradient/grad_complex.py +35 -0
  116. pymoo/gradient/grad_jax.py +51 -0
  117. pymoo/gradient/toolbox/__init__.py +6 -0
  118. pymoo/indicators/__init__.py +0 -0
  119. pymoo/indicators/distance_indicator.py +55 -0
  120. pymoo/indicators/gd.py +7 -0
  121. pymoo/indicators/gd_plus.py +7 -0
  122. pymoo/indicators/hv/__init__.py +63 -0
  123. pymoo/indicators/hv/exact.py +71 -0
  124. pymoo/indicators/hv/exact_2d.py +102 -0
  125. pymoo/indicators/hv/monte_carlo.py +74 -0
  126. pymoo/indicators/igd.py +7 -0
  127. pymoo/indicators/igd_plus.py +7 -0
  128. pymoo/indicators/kktpm.py +151 -0
  129. pymoo/indicators/migd.py +55 -0
  130. pymoo/indicators/rmetric.py +203 -0
  131. pymoo/indicators/spacing.py +52 -0
  132. pymoo/mcdm/__init__.py +0 -0
  133. pymoo/mcdm/compromise_programming.py +19 -0
  134. pymoo/mcdm/high_tradeoff.py +40 -0
  135. pymoo/mcdm/pseudo_weights.py +32 -0
  136. pymoo/operators/__init__.py +0 -0
  137. pymoo/operators/control.py +187 -0
  138. pymoo/operators/crossover/__init__.py +0 -0
  139. pymoo/operators/crossover/binx.py +45 -0
  140. pymoo/operators/crossover/dex.py +122 -0
  141. pymoo/operators/crossover/erx.py +162 -0
  142. pymoo/operators/crossover/expx.py +51 -0
  143. pymoo/operators/crossover/hux.py +37 -0
  144. pymoo/operators/crossover/nox.py +13 -0
  145. pymoo/operators/crossover/ox.py +84 -0
  146. pymoo/operators/crossover/pcx.py +82 -0
  147. pymoo/operators/crossover/pntx.py +49 -0
  148. pymoo/operators/crossover/sbx.py +125 -0
  149. pymoo/operators/crossover/spx.py +5 -0
  150. pymoo/operators/crossover/ux.py +20 -0
  151. pymoo/operators/mutation/__init__.py +0 -0
  152. pymoo/operators/mutation/bitflip.py +17 -0
  153. pymoo/operators/mutation/gauss.py +58 -0
  154. pymoo/operators/mutation/inversion.py +42 -0
  155. pymoo/operators/mutation/nom.py +7 -0
  156. pymoo/operators/mutation/pm.py +94 -0
  157. pymoo/operators/mutation/rm.py +23 -0
  158. pymoo/operators/repair/__init__.py +0 -0
  159. pymoo/operators/repair/bounce_back.py +32 -0
  160. pymoo/operators/repair/bounds_repair.py +95 -0
  161. pymoo/operators/repair/inverse_penalty.py +89 -0
  162. pymoo/operators/repair/rounding.py +18 -0
  163. pymoo/operators/repair/to_bound.py +31 -0
  164. pymoo/operators/repair/vtype.py +11 -0
  165. pymoo/operators/sampling/__init__.py +0 -0
  166. pymoo/operators/sampling/lhs.py +73 -0
  167. pymoo/operators/sampling/rnd.py +50 -0
  168. pymoo/operators/selection/__init__.py +0 -0
  169. pymoo/operators/selection/rnd.py +72 -0
  170. pymoo/operators/selection/tournament.py +76 -0
  171. pymoo/operators/survival/__init__.py +0 -0
  172. pymoo/operators/survival/rank_and_crowding/__init__.py +1 -0
  173. pymoo/operators/survival/rank_and_crowding/classes.py +209 -0
  174. pymoo/operators/survival/rank_and_crowding/metrics.py +208 -0
  175. pymoo/optimize.py +72 -0
  176. pymoo/problems/__init__.py +157 -0
  177. pymoo/problems/dyn.py +47 -0
  178. pymoo/problems/dynamic/__init__.py +0 -0
  179. pymoo/problems/dynamic/cec2015.py +108 -0
  180. pymoo/problems/dynamic/df.py +452 -0
  181. pymoo/problems/dynamic/misc.py +167 -0
  182. pymoo/problems/functional.py +48 -0
  183. pymoo/problems/many/__init__.py +5 -0
  184. pymoo/problems/many/cdtlz.py +159 -0
  185. pymoo/problems/many/dcdtlz.py +88 -0
  186. pymoo/problems/many/dtlz.py +264 -0
  187. pymoo/problems/many/wfg.py +550 -0
  188. pymoo/problems/multi/__init__.py +14 -0
  189. pymoo/problems/multi/bnh.py +34 -0
  190. pymoo/problems/multi/carside.py +48 -0
  191. pymoo/problems/multi/clutch.py +104 -0
  192. pymoo/problems/multi/csi.py +55 -0
  193. pymoo/problems/multi/ctp.py +198 -0
  194. pymoo/problems/multi/dascmop.py +213 -0
  195. pymoo/problems/multi/kursawe.py +25 -0
  196. pymoo/problems/multi/modact.py +68 -0
  197. pymoo/problems/multi/mw.py +400 -0
  198. pymoo/problems/multi/omnitest.py +48 -0
  199. pymoo/problems/multi/osy.py +32 -0
  200. pymoo/problems/multi/srn.py +28 -0
  201. pymoo/problems/multi/sympart.py +94 -0
  202. pymoo/problems/multi/tnk.py +24 -0
  203. pymoo/problems/multi/truss2d.py +83 -0
  204. pymoo/problems/multi/welded_beam.py +41 -0
  205. pymoo/problems/multi/wrm.py +36 -0
  206. pymoo/problems/multi/zdt.py +151 -0
  207. pymoo/problems/multi_to_single.py +22 -0
  208. pymoo/problems/single/__init__.py +12 -0
  209. pymoo/problems/single/ackley.py +24 -0
  210. pymoo/problems/single/cantilevered_beam.py +34 -0
  211. pymoo/problems/single/flowshop_scheduling.py +112 -0
  212. pymoo/problems/single/g.py +874 -0
  213. pymoo/problems/single/griewank.py +18 -0
  214. pymoo/problems/single/himmelblau.py +15 -0
  215. pymoo/problems/single/knapsack.py +48 -0
  216. pymoo/problems/single/mopta08.py +26 -0
  217. pymoo/problems/single/multimodal.py +20 -0
  218. pymoo/problems/single/pressure_vessel.py +30 -0
  219. pymoo/problems/single/rastrigin.py +20 -0
  220. pymoo/problems/single/rosenbrock.py +22 -0
  221. pymoo/problems/single/schwefel.py +18 -0
  222. pymoo/problems/single/simple.py +13 -0
  223. pymoo/problems/single/sphere.py +19 -0
  224. pymoo/problems/single/traveling_salesman.py +79 -0
  225. pymoo/problems/single/zakharov.py +19 -0
  226. pymoo/problems/static.py +14 -0
  227. pymoo/problems/util.py +42 -0
  228. pymoo/problems/zero_to_one.py +27 -0
  229. pymoo/termination/__init__.py +23 -0
  230. pymoo/termination/collection.py +12 -0
  231. pymoo/termination/cv.py +48 -0
  232. pymoo/termination/default.py +45 -0
  233. pymoo/termination/delta.py +64 -0
  234. pymoo/termination/fmin.py +16 -0
  235. pymoo/termination/ftol.py +144 -0
  236. pymoo/termination/indicator.py +49 -0
  237. pymoo/termination/max_eval.py +14 -0
  238. pymoo/termination/max_gen.py +15 -0
  239. pymoo/termination/max_time.py +20 -0
  240. pymoo/termination/robust.py +34 -0
  241. pymoo/termination/xtol.py +33 -0
  242. pymoo/util/__init__.py +0 -0
  243. pymoo/util/archive.py +150 -0
  244. pymoo/util/cache.py +29 -0
  245. pymoo/util/clearing.py +82 -0
  246. pymoo/util/display/__init__.py +0 -0
  247. pymoo/util/display/column.py +52 -0
  248. pymoo/util/display/display.py +34 -0
  249. pymoo/util/display/multi.py +96 -0
  250. pymoo/util/display/output.py +53 -0
  251. pymoo/util/display/progress.py +54 -0
  252. pymoo/util/display/single.py +67 -0
  253. pymoo/util/dominator.py +67 -0
  254. pymoo/util/function_loader.py +129 -0
  255. pymoo/util/hv.py +23 -0
  256. pymoo/util/matlab_engine.py +39 -0
  257. pymoo/util/misc.py +460 -0
  258. pymoo/util/mnn.py +70 -0
  259. pymoo/util/nds/__init__.py +0 -0
  260. pymoo/util/nds/dominance_degree_non_dominated_sort.py +159 -0
  261. pymoo/util/nds/efficient_non_dominated_sort.py +152 -0
  262. pymoo/util/nds/fast_non_dominated_sort.py +68 -0
  263. pymoo/util/nds/naive_non_dominated_sort.py +36 -0
  264. pymoo/util/nds/non_dominated_sorting.py +67 -0
  265. pymoo/util/nds/tree_based_non_dominated_sort.py +133 -0
  266. pymoo/util/normalization.py +315 -0
  267. pymoo/util/optimum.py +42 -0
  268. pymoo/util/plotting.py +177 -0
  269. pymoo/util/pruning_cd.py +89 -0
  270. pymoo/util/randomized_argsort.py +60 -0
  271. pymoo/util/ref_dirs/__init__.py +24 -0
  272. pymoo/util/ref_dirs/construction.py +88 -0
  273. pymoo/util/ref_dirs/das_dennis.py +52 -0
  274. pymoo/util/ref_dirs/energy.py +317 -0
  275. pymoo/util/ref_dirs/energy_layer.py +119 -0
  276. pymoo/util/ref_dirs/genetic_algorithm.py +63 -0
  277. pymoo/util/ref_dirs/incremental.py +68 -0
  278. pymoo/util/ref_dirs/misc.py +128 -0
  279. pymoo/util/ref_dirs/optimizer.py +59 -0
  280. pymoo/util/ref_dirs/performance.py +162 -0
  281. pymoo/util/ref_dirs/reduction.py +85 -0
  282. pymoo/util/ref_dirs/sample_and_map.py +24 -0
  283. pymoo/util/reference_direction.py +259 -0
  284. pymoo/util/remote.py +55 -0
  285. pymoo/util/roulette.py +27 -0
  286. pymoo/util/running_metric.py +128 -0
  287. pymoo/util/sliding_window.py +25 -0
  288. pymoo/util/stochastic_ranking.py +32 -0
  289. pymoo/util/vectors.py +40 -0
  290. pymoo/vendor/__init__.py +0 -0
  291. pymoo/vendor/cec2018.py +398 -0
  292. pymoo/vendor/gta.py +617 -0
  293. pymoo/vendor/hv.py +267 -0
  294. pymoo/vendor/vendor_cmaes.py +412 -0
  295. pymoo/vendor/vendor_coco.py +81 -0
  296. pymoo/vendor/vendor_scipy.py +232 -0
  297. pymoo/version.py +1 -0
  298. pymoo/visualization/__init__.py +8 -0
  299. pymoo/visualization/fitness_landscape.py +127 -0
  300. pymoo/visualization/heatmap.py +123 -0
  301. pymoo/visualization/pcp.py +120 -0
  302. pymoo/visualization/petal.py +91 -0
  303. pymoo/visualization/radar.py +108 -0
  304. pymoo/visualization/radviz.py +68 -0
  305. pymoo/visualization/scatter.py +150 -0
  306. pymoo/visualization/star_coordinate.py +75 -0
  307. pymoo/visualization/util.py +123 -0
  308. pymoo/visualization/video/__init__.py +0 -0
  309. pymoo/visualization/video/callback_video.py +82 -0
  310. pymoo/visualization/video/one_var_one_obj.py +57 -0
  311. pymoo/visualization/video/two_var_one_obj.py +62 -0
  312. pymoo-0.6.1.2.dist-info/LICENSE +191 -0
  313. pymoo-0.6.1.2.dist-info/METADATA +188 -0
  314. pymoo-0.6.1.2.dist-info/RECORD +316 -0
  315. pymoo-0.6.1.2.dist-info/WHEEL +5 -0
  316. 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)
File without changes
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
@@ -0,0 +1,11 @@
1
+ import numpy as np
2
+
3
+ from pymoo.core.decomposition import Decomposition
4
+
5
+
6
+ class Tchebicheff(Decomposition):
7
+
8
+ def _do(self, F, weights, **kwargs):
9
+ v = np.abs(F - self.utopian_point) * weights
10
+ tchebi = v.max(axis=1)
11
+ return tchebi