pymoo 0.6.1.5.dev0__cp39-cp39-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-39-x86_64-linux-gnu.so +0 -0
  91. pymoo/cython/calc_perpendicular_distance.pyx +67 -0
  92. pymoo/cython/decomposition.cpython-39-x86_64-linux-gnu.so +0 -0
  93. pymoo/cython/decomposition.pyx +165 -0
  94. pymoo/cython/hv.cpython-39-x86_64-linux-gnu.so +0 -0
  95. pymoo/cython/hv.pyx +18 -0
  96. pymoo/cython/info.cpython-39-x86_64-linux-gnu.so +0 -0
  97. pymoo/cython/info.pyx +5 -0
  98. pymoo/cython/mnn.cpython-39-x86_64-linux-gnu.so +0 -0
  99. pymoo/cython/mnn.pyx +273 -0
  100. pymoo/cython/non_dominated_sorting.cpython-39-x86_64-linux-gnu.so +0 -0
  101. pymoo/cython/non_dominated_sorting.pyx +645 -0
  102. pymoo/cython/pruning_cd.cpython-39-x86_64-linux-gnu.so +0 -0
  103. pymoo/cython/pruning_cd.pyx +197 -0
  104. pymoo/cython/stochastic_ranking.cpython-39-x86_64-linux-gnu.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/result.py ADDED
@@ -0,0 +1,52 @@
1
+ class Result:
2
+ """
3
+ The resulting object of an optimization run.
4
+ """
5
+
6
+ def __init__(self) -> None:
7
+ super().__init__()
8
+
9
+ self.opt = None
10
+ self.success = None
11
+ self.message = None
12
+
13
+ # ! other attributes to be set as well
14
+
15
+ # the problem that was solved
16
+ self.problem = None
17
+
18
+ # the archive stored during the run
19
+ self.archive = None
20
+
21
+ # the optimal solution for that problem
22
+ self.pf = None
23
+
24
+ # the algorithm that was used for optimization
25
+ self.algorithm = None
26
+
27
+ # the final population if it applies
28
+ self.pop = None
29
+
30
+ # directly the values of opt
31
+ self.X, self.F, self.CV, self.G, self.H = None, None, None, None, None
32
+
33
+ # all the timings that are stored of the run
34
+ self.start_time, self.end_time, self.exec_time = None, None, None
35
+
36
+ # the history of the optimization run is they were saved
37
+ self.history = []
38
+
39
+ # data stored within the algorithm
40
+ self.data = None
41
+
42
+ @property
43
+ def cv(self):
44
+ return self.CV[0]
45
+
46
+ @property
47
+ def f(self):
48
+ return self.F[0]
49
+
50
+ @property
51
+ def feas(self):
52
+ return self.cv <= 0
pymoo/core/sampling.py ADDED
@@ -0,0 +1,43 @@
1
+ from abc import abstractmethod
2
+
3
+ from pymoo.core.operator import Operator
4
+ from pymoo.core.population import Population
5
+
6
+
7
+ class Sampling(Operator):
8
+
9
+ def __init__(self) -> None:
10
+ """
11
+ This abstract class represents any sampling strategy that can be used to create an initial population or
12
+ an initial search point.
13
+ """
14
+ super().__init__()
15
+
16
+ def do(self, problem, n_samples, **kwargs):
17
+ """
18
+ Sample new points with problem information if necessary.
19
+
20
+ Parameters
21
+ ----------
22
+
23
+ problem : :class:`~pymoo.core.problem.Problem`
24
+ The problem to which points should be sampled. (lower and upper bounds, discrete, binary, ...)
25
+
26
+ n_samples : int
27
+ Number of samples
28
+
29
+ Returns
30
+ -------
31
+ pop : Population
32
+ The output population after sampling
33
+
34
+ """
35
+ val = self._do(problem, n_samples, **kwargs)
36
+ return Population.new("X", val)
37
+
38
+ @abstractmethod
39
+ def _do(self, problem, n_samples, **kwargs):
40
+ pass
41
+
42
+
43
+
@@ -0,0 +1,61 @@
1
+ from abc import abstractmethod
2
+
3
+ import numpy as np
4
+
5
+ from pymoo.core.operator import Operator
6
+
7
+
8
+ class Selection(Operator):
9
+
10
+ def __init__(self, **kwargs) -> None:
11
+ """
12
+ This class is used to select parents for the mating or other evolutionary operators.
13
+ Several strategies can be used to increase the selection pressure.
14
+ """
15
+ super().__init__(**kwargs)
16
+
17
+ def do(self, problem, pop, n_select, n_parents, to_pop=True, **kwargs):
18
+ """
19
+ Choose from the population new individuals to be selected.
20
+
21
+ Parameters
22
+ ----------
23
+
24
+
25
+ problem: class
26
+ The problem to be solved. Provides information such as lower and upper bounds or feasibility
27
+ conditions for custom crossovers.
28
+
29
+ pop : :class:`~pymoo.core.population.Population`
30
+ The population which should be selected from. Some criteria from the design or objective space
31
+ might be used for the selection. Therefore, only the number of individual might be not enough.
32
+
33
+ n_select : int
34
+ Number of individuals to select.
35
+
36
+ n_parents : int
37
+ Number of parents needed to create an offspring.
38
+
39
+ to_pop : bool
40
+ Whether IF(!) the implementation returns only indices, it should be converted to individuals.
41
+
42
+ Returns
43
+ -------
44
+ parents : list
45
+ List of parents to be used in the crossover
46
+
47
+ """
48
+
49
+ ret = self._do(problem, pop, n_select, n_parents, **kwargs)
50
+
51
+ # if some selections return indices they are used to create the individual list
52
+ if to_pop and isinstance(ret, np.ndarray) and np.issubdtype(ret.dtype, np.integer):
53
+ ret = pop[ret]
54
+
55
+ return ret
56
+
57
+ @abstractmethod
58
+ def _do(self, problem, pop, n_select, n_parents, **kwargs):
59
+ pass
60
+
61
+
pymoo/core/solution.py ADDED
@@ -0,0 +1,10 @@
1
+ from pymoo.core.individual import Individual
2
+ from pymoo.core.population import Population
3
+
4
+
5
+ class Solution(Individual):
6
+ pass
7
+
8
+
9
+ class SolutionSet(Population):
10
+ pass
pymoo/core/survival.py ADDED
@@ -0,0 +1,103 @@
1
+ from abc import abstractmethod
2
+
3
+ import numpy as np
4
+
5
+ from pymoo.core.population import Population
6
+
7
+
8
+ # ---------------------------------------------------------------------------------------------------------
9
+ # Survival
10
+ # ---------------------------------------------------------------------------------------------------------
11
+
12
+
13
+ class Survival:
14
+
15
+ def __init__(self, filter_infeasible=True):
16
+ super().__init__()
17
+ self.filter_infeasible = filter_infeasible
18
+
19
+ def do(self,
20
+ problem,
21
+ pop,
22
+ *args,
23
+ n_survive=None,
24
+ return_indices=False,
25
+ **kwargs):
26
+
27
+ # make sure the population has at least one individual
28
+ if len(pop) == 0:
29
+ return pop
30
+
31
+ if n_survive is None:
32
+ n_survive = len(pop)
33
+
34
+ n_survive = min(n_survive, len(pop))
35
+
36
+ # if the split should be done beforehand
37
+ if self.filter_infeasible and problem.has_constraints():
38
+
39
+ # split feasible and infeasible solutions
40
+ feas, infeas = split_by_feasibility(pop, sort_infeas_by_cv=True)
41
+
42
+ if len(feas) == 0:
43
+ survivors = Population()
44
+ else:
45
+ survivors = self._do(problem, pop[feas], *args, n_survive=min(len(feas), n_survive), **kwargs)
46
+
47
+ # calculate how many individuals are still remaining to be filled up with infeasible ones
48
+ n_remaining = n_survive - len(survivors)
49
+
50
+ # if infeasible solutions needs to be added
51
+ if n_remaining > 0:
52
+ survivors = Population.merge(survivors, pop[infeas[:n_remaining]])
53
+
54
+ else:
55
+ survivors = self._do(problem, pop, *args, n_survive=n_survive, **kwargs)
56
+
57
+ if return_indices:
58
+ H = {}
59
+ for k, ind in enumerate(pop):
60
+ H[ind] = k
61
+ return [H[survivor] for survivor in survivors]
62
+ else:
63
+ return survivors
64
+
65
+ @abstractmethod
66
+ def _do(self, problem, pop, *args, n_survive=None, **kwargs):
67
+ pass
68
+
69
+
70
+ class ToReplacement(Survival):
71
+
72
+ def __init__(self, survival):
73
+ super().__init__(False)
74
+ self.survival = survival
75
+
76
+ def _do(self, problem, pop, off, **kwargs):
77
+ merged = Population.merge(pop, off)
78
+ I = self.survival.do(problem, merged, n_survive=len(merged), return_indices=True, **kwargs)
79
+ merged.set("__rank__", I)
80
+
81
+ for k in range(len(pop)):
82
+ if off[k].get("__rank__") < pop[k].get("__rank__"):
83
+ pop[k] = off[k]
84
+
85
+ return pop
86
+
87
+
88
+ def split_by_feasibility(pop, sort_infeas_by_cv=True, sort_feas_by_obj=False, return_pop=False):
89
+ F, CV, b = pop.get("F", "CV", "FEAS")
90
+
91
+ feasible = np.where(b)[0]
92
+ infeasible = np.where(~b)[0]
93
+
94
+ if sort_infeas_by_cv:
95
+ infeasible = infeasible[np.argsort(CV[infeasible, 0])]
96
+
97
+ if sort_feas_by_obj:
98
+ feasible = feasible[np.argsort(F[feasible, 0])]
99
+
100
+ if not return_pop:
101
+ return feasible, infeasible
102
+ else:
103
+ return feasible, infeasible, pop[feasible], pop[infeasible]
@@ -0,0 +1,70 @@
1
+ from abc import abstractmethod
2
+
3
+
4
+ class Termination:
5
+
6
+ def __init__(self) -> None:
7
+ super().__init__()
8
+
9
+ # the algorithm can be forced to terminate by setting this attribute to true
10
+ self.force_termination = False
11
+
12
+ # the value indicating how much perc has been made
13
+ self.perc = 0.0
14
+
15
+ def update(self, algorithm):
16
+ """
17
+ Provide the termination criterion a current status of the algorithm to update the perc.
18
+
19
+ Parameters
20
+ ----------
21
+ algorithm : object
22
+ The algorithm object which is used to determine whether a run has terminated.
23
+ """
24
+
25
+ if self.force_termination:
26
+ progress = 1.0
27
+ else:
28
+ progress = self._update(algorithm)
29
+ assert progress >= 0.0, "Invalid progress was set by the TerminationCriterion."
30
+
31
+ self.perc = progress
32
+ return self.perc
33
+
34
+ def has_terminated(self):
35
+ return self.perc >= 1.0
36
+
37
+ def do_continue(self):
38
+ return not self.has_terminated()
39
+
40
+ def terminate(self):
41
+ self.force_termination = True
42
+
43
+ @abstractmethod
44
+ def _update(self, algorithm):
45
+ pass
46
+
47
+
48
+ class NoTermination(Termination):
49
+
50
+ def _update(self, algorithm):
51
+ return 0.0
52
+
53
+
54
+ class MultipleCriteria(Termination):
55
+
56
+ def __init__(self, *args) -> None:
57
+ super().__init__()
58
+ self.criteria = args
59
+
60
+
61
+ class TerminateIfAny(MultipleCriteria):
62
+
63
+ def _update(self, algorithm):
64
+ return max([termination.update(algorithm) for termination in self.criteria])
65
+
66
+
67
+ class TerminateIfAll(MultipleCriteria):
68
+
69
+ def _update(self, algorithm):
70
+ return min([termination.update(algorithm) for termination in self.criteria])