pymoo 0.6.1.5.dev0__cp311-cp311-musllinux_1_2_x86_64.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 (330) 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 +310 -0
  12. pymoo/algorithms/moo/age2.py +194 -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 +113 -0
  18. pymoo/algorithms/moo/nsga3.py +358 -0
  19. pymoo/algorithms/moo/pinsga2.py +370 -0
  20. pymoo/algorithms/moo/rnsga2.py +188 -0
  21. pymoo/algorithms/moo/rnsga3.py +246 -0
  22. pymoo/algorithms/moo/rvea.py +214 -0
  23. pymoo/algorithms/moo/sms.py +195 -0
  24. pymoo/algorithms/moo/spea2.py +190 -0
  25. pymoo/algorithms/moo/unsga3.py +47 -0
  26. pymoo/algorithms/soo/__init__.py +0 -0
  27. pymoo/algorithms/soo/convex/__init__.py +0 -0
  28. pymoo/algorithms/soo/nonconvex/__init__.py +0 -0
  29. pymoo/algorithms/soo/nonconvex/brkga.py +161 -0
  30. pymoo/algorithms/soo/nonconvex/cmaes.py +554 -0
  31. pymoo/algorithms/soo/nonconvex/de.py +279 -0
  32. pymoo/algorithms/soo/nonconvex/direct.py +149 -0
  33. pymoo/algorithms/soo/nonconvex/es.py +203 -0
  34. pymoo/algorithms/soo/nonconvex/g3pcx.py +94 -0
  35. pymoo/algorithms/soo/nonconvex/ga.py +93 -0
  36. pymoo/algorithms/soo/nonconvex/ga_niching.py +223 -0
  37. pymoo/algorithms/soo/nonconvex/isres.py +74 -0
  38. pymoo/algorithms/soo/nonconvex/nelder.py +251 -0
  39. pymoo/algorithms/soo/nonconvex/optuna.py +80 -0
  40. pymoo/algorithms/soo/nonconvex/pattern.py +183 -0
  41. pymoo/algorithms/soo/nonconvex/pso.py +399 -0
  42. pymoo/algorithms/soo/nonconvex/pso_ep.py +297 -0
  43. pymoo/algorithms/soo/nonconvex/random_search.py +25 -0
  44. pymoo/algorithms/soo/nonconvex/sres.py +56 -0
  45. pymoo/algorithms/soo/univariate/__init__.py +0 -0
  46. pymoo/algorithms/soo/univariate/backtracking.py +59 -0
  47. pymoo/algorithms/soo/univariate/exp.py +46 -0
  48. pymoo/algorithms/soo/univariate/golden.py +65 -0
  49. pymoo/algorithms/soo/univariate/quadr_interp.py +81 -0
  50. pymoo/algorithms/soo/univariate/wolfe.py +163 -0
  51. pymoo/config.py +33 -0
  52. pymoo/constraints/__init__.py +3 -0
  53. pymoo/constraints/adaptive.py +62 -0
  54. pymoo/constraints/as_obj.py +56 -0
  55. pymoo/constraints/as_penalty.py +41 -0
  56. pymoo/constraints/eps.py +26 -0
  57. pymoo/constraints/from_bounds.py +36 -0
  58. pymoo/core/__init__.py +0 -0
  59. pymoo/core/algorithm.py +394 -0
  60. pymoo/core/callback.py +38 -0
  61. pymoo/core/crossover.py +77 -0
  62. pymoo/core/decision_making.py +102 -0
  63. pymoo/core/decomposition.py +76 -0
  64. pymoo/core/duplicate.py +163 -0
  65. pymoo/core/evaluator.py +116 -0
  66. pymoo/core/indicator.py +34 -0
  67. pymoo/core/individual.py +784 -0
  68. pymoo/core/infill.py +64 -0
  69. pymoo/core/initialization.py +42 -0
  70. pymoo/core/mating.py +39 -0
  71. pymoo/core/meta.py +21 -0
  72. pymoo/core/mixed.py +165 -0
  73. pymoo/core/mutation.py +44 -0
  74. pymoo/core/operator.py +40 -0
  75. pymoo/core/parameters.py +134 -0
  76. pymoo/core/plot.py +210 -0
  77. pymoo/core/population.py +180 -0
  78. pymoo/core/problem.py +460 -0
  79. pymoo/core/recorder.py +99 -0
  80. pymoo/core/repair.py +23 -0
  81. pymoo/core/replacement.py +96 -0
  82. pymoo/core/result.py +52 -0
  83. pymoo/core/sampling.py +43 -0
  84. pymoo/core/selection.py +61 -0
  85. pymoo/core/solution.py +10 -0
  86. pymoo/core/survival.py +103 -0
  87. pymoo/core/termination.py +70 -0
  88. pymoo/core/variable.py +399 -0
  89. pymoo/cython/__init__.py +0 -0
  90. pymoo/cython/calc_perpendicular_distance.cpython-311-x86_64-linux-musl.so +0 -0
  91. pymoo/cython/calc_perpendicular_distance.pyx +67 -0
  92. pymoo/cython/decomposition.cpython-311-x86_64-linux-musl.so +0 -0
  93. pymoo/cython/decomposition.pyx +165 -0
  94. pymoo/cython/hv.cpython-311-x86_64-linux-musl.so +0 -0
  95. pymoo/cython/hv.pyx +18 -0
  96. pymoo/cython/info.cpython-311-x86_64-linux-musl.so +0 -0
  97. pymoo/cython/info.pyx +5 -0
  98. pymoo/cython/mnn.cpython-311-x86_64-linux-musl.so +0 -0
  99. pymoo/cython/mnn.pyx +273 -0
  100. pymoo/cython/non_dominated_sorting.cpython-311-x86_64-linux-musl.so +0 -0
  101. pymoo/cython/non_dominated_sorting.pyx +645 -0
  102. pymoo/cython/pruning_cd.cpython-311-x86_64-linux-musl.so +0 -0
  103. pymoo/cython/pruning_cd.pyx +197 -0
  104. pymoo/cython/stochastic_ranking.cpython-311-x86_64-linux-musl.so +0 -0
  105. pymoo/cython/stochastic_ranking.pyx +49 -0
  106. pymoo/cython/utils.pxd +129 -0
  107. pymoo/cython/vendor/__init__.py +0 -0
  108. pymoo/cython/vendor/hypervolume.cpp +1621 -0
  109. pymoo/cython/vendor/hypervolume.h +63 -0
  110. pymoo/decomposition/__init__.py +0 -0
  111. pymoo/decomposition/aasf.py +24 -0
  112. pymoo/decomposition/asf.py +10 -0
  113. pymoo/decomposition/pbi.py +13 -0
  114. pymoo/decomposition/perp_dist.py +13 -0
  115. pymoo/decomposition/tchebicheff.py +11 -0
  116. pymoo/decomposition/util.py +13 -0
  117. pymoo/decomposition/weighted_sum.py +8 -0
  118. pymoo/docs.py +187 -0
  119. pymoo/experimental/__init__.py +0 -0
  120. pymoo/experimental/algorithms/__init__.py +0 -0
  121. pymoo/experimental/algorithms/gde3.py +57 -0
  122. pymoo/gradient/__init__.py +21 -0
  123. pymoo/gradient/automatic.py +57 -0
  124. pymoo/gradient/grad_autograd.py +105 -0
  125. pymoo/gradient/grad_complex.py +35 -0
  126. pymoo/gradient/grad_jax.py +51 -0
  127. pymoo/gradient/toolbox/__init__.py +6 -0
  128. pymoo/indicators/__init__.py +0 -0
  129. pymoo/indicators/distance_indicator.py +55 -0
  130. pymoo/indicators/gd.py +7 -0
  131. pymoo/indicators/gd_plus.py +7 -0
  132. pymoo/indicators/hv/__init__.py +63 -0
  133. pymoo/indicators/hv/exact.py +71 -0
  134. pymoo/indicators/hv/exact_2d.py +102 -0
  135. pymoo/indicators/hv/monte_carlo.py +74 -0
  136. pymoo/indicators/igd.py +7 -0
  137. pymoo/indicators/igd_plus.py +7 -0
  138. pymoo/indicators/kktpm.py +151 -0
  139. pymoo/indicators/migd.py +55 -0
  140. pymoo/indicators/rmetric.py +203 -0
  141. pymoo/indicators/spacing.py +52 -0
  142. pymoo/mcdm/__init__.py +0 -0
  143. pymoo/mcdm/compromise_programming.py +19 -0
  144. pymoo/mcdm/high_tradeoff.py +40 -0
  145. pymoo/mcdm/pseudo_weights.py +32 -0
  146. pymoo/operators/__init__.py +0 -0
  147. pymoo/operators/control.py +187 -0
  148. pymoo/operators/crossover/__init__.py +0 -0
  149. pymoo/operators/crossover/binx.py +45 -0
  150. pymoo/operators/crossover/dex.py +122 -0
  151. pymoo/operators/crossover/erx.py +162 -0
  152. pymoo/operators/crossover/expx.py +51 -0
  153. pymoo/operators/crossover/hux.py +37 -0
  154. pymoo/operators/crossover/nox.py +13 -0
  155. pymoo/operators/crossover/ox.py +84 -0
  156. pymoo/operators/crossover/pcx.py +82 -0
  157. pymoo/operators/crossover/pntx.py +49 -0
  158. pymoo/operators/crossover/sbx.py +125 -0
  159. pymoo/operators/crossover/spx.py +5 -0
  160. pymoo/operators/crossover/ux.py +20 -0
  161. pymoo/operators/mutation/__init__.py +0 -0
  162. pymoo/operators/mutation/bitflip.py +17 -0
  163. pymoo/operators/mutation/gauss.py +58 -0
  164. pymoo/operators/mutation/inversion.py +42 -0
  165. pymoo/operators/mutation/nom.py +7 -0
  166. pymoo/operators/mutation/pm.py +94 -0
  167. pymoo/operators/mutation/rm.py +23 -0
  168. pymoo/operators/repair/__init__.py +0 -0
  169. pymoo/operators/repair/bounce_back.py +32 -0
  170. pymoo/operators/repair/bounds_repair.py +95 -0
  171. pymoo/operators/repair/inverse_penalty.py +89 -0
  172. pymoo/operators/repair/rounding.py +18 -0
  173. pymoo/operators/repair/to_bound.py +31 -0
  174. pymoo/operators/repair/vtype.py +11 -0
  175. pymoo/operators/sampling/__init__.py +0 -0
  176. pymoo/operators/sampling/lhs.py +73 -0
  177. pymoo/operators/sampling/rnd.py +50 -0
  178. pymoo/operators/selection/__init__.py +0 -0
  179. pymoo/operators/selection/rnd.py +72 -0
  180. pymoo/operators/selection/tournament.py +76 -0
  181. pymoo/operators/survival/__init__.py +0 -0
  182. pymoo/operators/survival/rank_and_crowding/__init__.py +1 -0
  183. pymoo/operators/survival/rank_and_crowding/classes.py +209 -0
  184. pymoo/operators/survival/rank_and_crowding/metrics.py +208 -0
  185. pymoo/optimize.py +72 -0
  186. pymoo/problems/__init__.py +157 -0
  187. pymoo/problems/dyn.py +47 -0
  188. pymoo/problems/dynamic/__init__.py +0 -0
  189. pymoo/problems/dynamic/cec2015.py +108 -0
  190. pymoo/problems/dynamic/df.py +452 -0
  191. pymoo/problems/dynamic/misc.py +167 -0
  192. pymoo/problems/functional.py +48 -0
  193. pymoo/problems/many/__init__.py +5 -0
  194. pymoo/problems/many/cdtlz.py +159 -0
  195. pymoo/problems/many/dcdtlz.py +88 -0
  196. pymoo/problems/many/dtlz.py +264 -0
  197. pymoo/problems/many/wfg.py +550 -0
  198. pymoo/problems/multi/__init__.py +14 -0
  199. pymoo/problems/multi/bnh.py +34 -0
  200. pymoo/problems/multi/carside.py +48 -0
  201. pymoo/problems/multi/clutch.py +104 -0
  202. pymoo/problems/multi/csi.py +55 -0
  203. pymoo/problems/multi/ctp.py +198 -0
  204. pymoo/problems/multi/dascmop.py +213 -0
  205. pymoo/problems/multi/kursawe.py +25 -0
  206. pymoo/problems/multi/modact.py +68 -0
  207. pymoo/problems/multi/mw.py +400 -0
  208. pymoo/problems/multi/omnitest.py +48 -0
  209. pymoo/problems/multi/osy.py +32 -0
  210. pymoo/problems/multi/srn.py +28 -0
  211. pymoo/problems/multi/sympart.py +94 -0
  212. pymoo/problems/multi/tnk.py +24 -0
  213. pymoo/problems/multi/truss2d.py +83 -0
  214. pymoo/problems/multi/welded_beam.py +41 -0
  215. pymoo/problems/multi/wrm.py +36 -0
  216. pymoo/problems/multi/zdt.py +151 -0
  217. pymoo/problems/multi_to_single.py +22 -0
  218. pymoo/problems/single/__init__.py +12 -0
  219. pymoo/problems/single/ackley.py +24 -0
  220. pymoo/problems/single/cantilevered_beam.py +34 -0
  221. pymoo/problems/single/flowshop_scheduling.py +112 -0
  222. pymoo/problems/single/g.py +874 -0
  223. pymoo/problems/single/griewank.py +18 -0
  224. pymoo/problems/single/himmelblau.py +15 -0
  225. pymoo/problems/single/knapsack.py +48 -0
  226. pymoo/problems/single/mopta08.py +26 -0
  227. pymoo/problems/single/multimodal.py +20 -0
  228. pymoo/problems/single/pressure_vessel.py +30 -0
  229. pymoo/problems/single/rastrigin.py +20 -0
  230. pymoo/problems/single/rosenbrock.py +22 -0
  231. pymoo/problems/single/schwefel.py +18 -0
  232. pymoo/problems/single/simple.py +13 -0
  233. pymoo/problems/single/sphere.py +19 -0
  234. pymoo/problems/single/traveling_salesman.py +79 -0
  235. pymoo/problems/single/zakharov.py +19 -0
  236. pymoo/problems/static.py +14 -0
  237. pymoo/problems/util.py +42 -0
  238. pymoo/problems/zero_to_one.py +27 -0
  239. pymoo/termination/__init__.py +23 -0
  240. pymoo/termination/collection.py +12 -0
  241. pymoo/termination/cv.py +48 -0
  242. pymoo/termination/default.py +45 -0
  243. pymoo/termination/delta.py +64 -0
  244. pymoo/termination/fmin.py +16 -0
  245. pymoo/termination/ftol.py +144 -0
  246. pymoo/termination/indicator.py +49 -0
  247. pymoo/termination/max_eval.py +14 -0
  248. pymoo/termination/max_gen.py +15 -0
  249. pymoo/termination/max_time.py +20 -0
  250. pymoo/termination/robust.py +34 -0
  251. pymoo/termination/xtol.py +33 -0
  252. pymoo/util/__init__.py +0 -0
  253. pymoo/util/archive.py +150 -0
  254. pymoo/util/cache.py +29 -0
  255. pymoo/util/clearing.py +82 -0
  256. pymoo/util/display/__init__.py +0 -0
  257. pymoo/util/display/column.py +52 -0
  258. pymoo/util/display/display.py +34 -0
  259. pymoo/util/display/multi.py +96 -0
  260. pymoo/util/display/output.py +53 -0
  261. pymoo/util/display/progress.py +54 -0
  262. pymoo/util/display/single.py +67 -0
  263. pymoo/util/dominator.py +67 -0
  264. pymoo/util/function_loader.py +129 -0
  265. pymoo/util/hv.py +23 -0
  266. pymoo/util/matlab_engine.py +39 -0
  267. pymoo/util/misc.py +460 -0
  268. pymoo/util/mnn.py +70 -0
  269. pymoo/util/nds/__init__.py +0 -0
  270. pymoo/util/nds/dominance_degree_non_dominated_sort.py +159 -0
  271. pymoo/util/nds/efficient_non_dominated_sort.py +152 -0
  272. pymoo/util/nds/fast_non_dominated_sort.py +70 -0
  273. pymoo/util/nds/naive_non_dominated_sort.py +36 -0
  274. pymoo/util/nds/non_dominated_sorting.py +67 -0
  275. pymoo/util/nds/tree_based_non_dominated_sort.py +133 -0
  276. pymoo/util/normalization.py +312 -0
  277. pymoo/util/optimum.py +42 -0
  278. pymoo/util/plotting.py +177 -0
  279. pymoo/util/pruning_cd.py +89 -0
  280. pymoo/util/randomized_argsort.py +60 -0
  281. pymoo/util/ref_dirs/__init__.py +24 -0
  282. pymoo/util/ref_dirs/construction.py +88 -0
  283. pymoo/util/ref_dirs/das_dennis.py +52 -0
  284. pymoo/util/ref_dirs/energy.py +319 -0
  285. pymoo/util/ref_dirs/energy_layer.py +119 -0
  286. pymoo/util/ref_dirs/genetic_algorithm.py +63 -0
  287. pymoo/util/ref_dirs/incremental.py +68 -0
  288. pymoo/util/ref_dirs/misc.py +128 -0
  289. pymoo/util/ref_dirs/optimizer.py +59 -0
  290. pymoo/util/ref_dirs/performance.py +162 -0
  291. pymoo/util/ref_dirs/reduction.py +85 -0
  292. pymoo/util/ref_dirs/sample_and_map.py +24 -0
  293. pymoo/util/reference_direction.py +260 -0
  294. pymoo/util/remote.py +55 -0
  295. pymoo/util/roulette.py +27 -0
  296. pymoo/util/running_metric.py +128 -0
  297. pymoo/util/sliding_window.py +25 -0
  298. pymoo/util/stochastic_ranking.py +32 -0
  299. pymoo/util/value_functions.py +719 -0
  300. pymoo/util/vectors.py +40 -0
  301. pymoo/util/vf_dominator.py +99 -0
  302. pymoo/vendor/__init__.py +0 -0
  303. pymoo/vendor/cec2018.py +398 -0
  304. pymoo/vendor/gta.py +617 -0
  305. pymoo/vendor/hv.py +267 -0
  306. pymoo/vendor/vendor_cmaes.py +412 -0
  307. pymoo/vendor/vendor_coco.py +81 -0
  308. pymoo/vendor/vendor_scipy.py +232 -0
  309. pymoo/version.py +1 -0
  310. pymoo/visualization/__init__.py +8 -0
  311. pymoo/visualization/fitness_landscape.py +127 -0
  312. pymoo/visualization/heatmap.py +123 -0
  313. pymoo/visualization/pcp.py +120 -0
  314. pymoo/visualization/petal.py +91 -0
  315. pymoo/visualization/radar.py +108 -0
  316. pymoo/visualization/radviz.py +68 -0
  317. pymoo/visualization/scatter.py +150 -0
  318. pymoo/visualization/star_coordinate.py +75 -0
  319. pymoo/visualization/util.py +123 -0
  320. pymoo/visualization/video/__init__.py +0 -0
  321. pymoo/visualization/video/callback_video.py +82 -0
  322. pymoo/visualization/video/one_var_one_obj.py +57 -0
  323. pymoo/visualization/video/two_var_one_obj.py +62 -0
  324. pymoo-0.6.1.5.dev0.dist-info/METADATA +187 -0
  325. pymoo-0.6.1.5.dev0.dist-info/RECORD +330 -0
  326. pymoo-0.6.1.5.dev0.dist-info/WHEEL +5 -0
  327. pymoo-0.6.1.5.dev0.dist-info/licenses/LICENSE +191 -0
  328. pymoo-0.6.1.5.dev0.dist-info/top_level.txt +1 -0
  329. pymoo.libs/libgcc_s-2298274a.so.1 +0 -0
  330. pymoo.libs/libstdc++-08d5c7eb.so.6.0.33 +0 -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 Any, 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: Any
115
+ ) -> object:
116
+ """
117
+ Get the value of a decision variable.
118
+
119
+ Parameters
120
+ ----------
121
+ kwargs : Any
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: Any,
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 : Any
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: Any,
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 : Any
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: Any
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 : Any
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
@@ -0,0 +1,67 @@
1
+ # distutils: language = c++
2
+ # cython: language_level=2, boundscheck=False, wraparound=False, cdivision=True
3
+
4
+
5
+ import numpy as np
6
+ from libcpp.vector cimport vector
7
+
8
+
9
+
10
+ def calc_perpendicular_distance(double[:,:] P, double[:,:] L):
11
+ return np.array(c_calc_perpendicular_distance(P, L))
12
+
13
+
14
+ cdef extern from "math.h":
15
+ double sqrt(double m)
16
+ double pow(double base, double exponent)
17
+
18
+
19
+ cdef double c_norm(double[:] v):
20
+ cdef:
21
+ double val
22
+ int i
23
+ val = 0
24
+ for i in range(v.shape[0]):
25
+ val += pow(v[i], 2)
26
+ val = sqrt(val)
27
+ return val
28
+
29
+
30
+ cdef double[:,:] c_calc_perpendicular_distance(double[:,:] P, double[:,:] L):
31
+ cdef :
32
+ int s_L, s_P, n_dim, i, j, k
33
+ double[:,:] M
34
+ vector[double] N
35
+ double norm, dot, perp_dist, norm_scalar_proj
36
+
37
+ s_L = L.shape[0]
38
+ s_P = P.shape[0]
39
+ n_dim = L.shape[1]
40
+
41
+ M = np.zeros((s_P, s_L), dtype=np.float64)
42
+
43
+ for i in range(s_L):
44
+
45
+ norm = c_norm(L[i, :])
46
+
47
+ N = vector[double](n_dim)
48
+ for k in range(n_dim):
49
+ N[k] = L[i, k] / norm
50
+
51
+ for j in range(s_P):
52
+
53
+ dot = 0
54
+ for k in range(n_dim):
55
+ dot += L[i, k] * P[j, k]
56
+ norm_scalar_proj = dot / norm
57
+
58
+ perp_dist = 0
59
+ for k in range(n_dim):
60
+ perp_dist += pow(norm_scalar_proj * N[k] - P[j, k], 2)
61
+ perp_dist = sqrt(perp_dist)
62
+
63
+ M[j, i] = perp_dist
64
+
65
+ return M
66
+
67
+
@@ -0,0 +1,165 @@
1
+ # distutils: language = c++
2
+ # cython: language_level=2, boundscheck=False, wraparound=False, cdivision=True
3
+
4
+
5
+ import numpy as np
6
+ from libcpp.vector cimport vector
7
+
8
+
9
+ # -----------------------------------------------------------
10
+ # INTERFACE
11
+ # -----------------------------------------------------------
12
+
13
+ def calc_perpendicular_distance(double[:,:] P, double[:,:] L):
14
+ return np.array(c_calc_perpendicular_distance(P, L))
15
+
16
+
17
+ def pbi(double[:,:] F, double[:,:] weights, double[:] ideal_point, double theta, double eps=1e-10):
18
+ return np.array(c_pbi(F, weights, ideal_point, theta, eps), dtype=np.float64)
19
+
20
+
21
+ def calc_distance_to_weights(F, weights, utopian_point=None):
22
+
23
+ if utopian_point is None:
24
+ utopian_point = np.zeros(F.shape[1])
25
+
26
+ norm = np.linalg.norm(weights, axis=1)
27
+
28
+ d1, d2 = np.zeros(F.shape[0]), np.zeros(F.shape[0])
29
+
30
+ F = F - utopian_point
31
+ c_d1(d1, F, weights, norm)
32
+ c_d2(d2, F, weights, d1, norm)
33
+
34
+ return d1, d2
35
+
36
+
37
+ # -----------------------------------------------------------
38
+ # IMPLEMENTATION
39
+ # -----------------------------------------------------------
40
+
41
+ cdef extern from "math.h":
42
+ double sqrt(double m)
43
+ double pow(double base, double exponent)
44
+
45
+
46
+
47
+
48
+ cdef double c_norm(double[:] v):
49
+ cdef:
50
+ double val
51
+ int i
52
+
53
+ val = 0
54
+ for i in range(v.shape[0]):
55
+ val += pow(v[i], 2)
56
+ val = sqrt(val)
57
+ return val
58
+
59
+
60
+ cdef double[:,:] c_calc_perpendicular_distance(double[:,:] P, double[:,:] L):
61
+ cdef :
62
+ int s_L, s_P, n_dim, i, j, k
63
+ double[:,:] M
64
+ vector[double] N
65
+ double norm, dot, perp_dist, norm_scalar_proj
66
+
67
+ s_L = L.shape[0]
68
+ s_P = P.shape[0]
69
+ n_dim = L.shape[1]
70
+
71
+ M = np.zeros((s_P, s_L), dtype=np.float64)
72
+
73
+ for i in range(s_L):
74
+
75
+ norm = c_norm(L[i, :])
76
+
77
+ N = vector[double](n_dim)
78
+ for k in range(n_dim):
79
+ N[k] = L[i, k] / norm
80
+
81
+ for j in range(s_P):
82
+
83
+ dot = 0
84
+ for k in range(n_dim):
85
+ dot += L[i, k] * P[j, k]
86
+ norm_scalar_proj = dot / norm
87
+
88
+ perp_dist = 0
89
+ for k in range(n_dim):
90
+ perp_dist += pow(norm_scalar_proj * N[k] - P[j, k], 2)
91
+ perp_dist = sqrt(perp_dist)
92
+
93
+ M[j, i] = perp_dist
94
+
95
+ return M
96
+
97
+
98
+
99
+ cdef vector[double] c_pbi(double[:,:] F, double[:,:] weights, double[:] ideal_point, double theta, double eps):
100
+ cdef:
101
+ double d1, d2, f_max, norm
102
+ int i, j, n_dim
103
+ vector[double] pbi
104
+
105
+ n_points = F.shape[0]
106
+ n_obj = F.shape[1]
107
+ pbi = vector[double](n_points)
108
+
109
+ for i in range(n_points):
110
+
111
+ norm = c_norm(weights[i,:])
112
+
113
+ d1 = 0
114
+ for j in range(n_obj):
115
+ d1 += (F[i,j] - ideal_point[j] + eps) * weights[i,j]
116
+ d1 = d1 / norm
117
+
118
+ d2 = 0
119
+ for j in range(n_obj):
120
+ d2 += pow(F[i,j] - ideal_point[j] + eps - (d1 * weights[i,j] / norm), 2.0)
121
+ d2 = sqrt(d2)
122
+
123
+ pbi[i] = d1 + theta * d2
124
+
125
+ return pbi
126
+
127
+
128
+
129
+
130
+ cdef void c_d1(double[:] d1, double[:,:] F, double[:,:] weights, double[:] norm):
131
+ cdef:
132
+ double val
133
+ int i, j
134
+
135
+ n_points = F.shape[0]
136
+ n_obj = F.shape[1]
137
+
138
+ for i in range(n_points):
139
+
140
+ val = 0
141
+ for j in range(n_obj):
142
+ val += F[i,j] * weights[i,j]
143
+ d1[i] = val / norm[i]
144
+
145
+
146
+
147
+
148
+ cdef void c_d2(double[:] d2, double[:,:] F, double[:,:] weights, double[:] d1, double[:] norm):
149
+ cdef:
150
+ double val
151
+ int i, j
152
+
153
+ n_points = F.shape[0]
154
+ n_obj = F.shape[1]
155
+
156
+ for i in range(n_points):
157
+
158
+ val = 0
159
+ for j in range(n_obj):
160
+ val += pow(F[i,j] - (d1[i] * weights[i,j] / norm[i]), 2.0)
161
+ d2[i] = sqrt(val)
162
+
163
+
164
+
165
+
pymoo/cython/hv.pyx ADDED
@@ -0,0 +1,18 @@
1
+ # distutils: language = c++
2
+ # cython: language_level=2, boundscheck=False, wraparound=False, cdivision=True
3
+
4
+ import numpy as np
5
+
6
+ cdef extern from "vendor/hypervolume.cpp":
7
+ double overmars_yap(double * points, double * referencePoint, unsigned noObjectives, unsigned noPoints);
8
+
9
+
10
+ def hv(ref_point, F):
11
+ F = F[np.argsort(F[:, -1])]
12
+ n, m = F.shape
13
+ return c_hv(F, ref_point, m, n)
14
+
15
+
16
+ def c_hv(double[:,:] F, double[:] ref_point, m, n):
17
+ return overmars_yap(&F[0, 0], &ref_point[0], m, n)
18
+ # return fpli_hv(&F[0,0], m, n, &ref_point[0])
pymoo/cython/info.pyx ADDED
@@ -0,0 +1,5 @@
1
+ # distutils: language = c++
2
+ # cython: language_level=2, boundscheck=False, wraparound=False, cdivision=True
3
+
4
+ def info():
5
+ return "yes"