pymoo 0.6.1.6__cp312-cp312-macosx_10_13_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.
Files changed (337) 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 +110 -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 +91 -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/cmopso.py +239 -0
  14. pymoo/algorithms/moo/ctaea.py +305 -0
  15. pymoo/algorithms/moo/dnsga2.py +80 -0
  16. pymoo/algorithms/moo/kgb.py +450 -0
  17. pymoo/algorithms/moo/moead.py +183 -0
  18. pymoo/algorithms/moo/mopso_cd.py +309 -0
  19. pymoo/algorithms/moo/nsga2.py +113 -0
  20. pymoo/algorithms/moo/nsga3.py +361 -0
  21. pymoo/algorithms/moo/pinsga2.py +370 -0
  22. pymoo/algorithms/moo/rnsga2.py +188 -0
  23. pymoo/algorithms/moo/rnsga3.py +246 -0
  24. pymoo/algorithms/moo/rvea.py +214 -0
  25. pymoo/algorithms/moo/sms.py +196 -0
  26. pymoo/algorithms/moo/spea2.py +191 -0
  27. pymoo/algorithms/moo/unsga3.py +49 -0
  28. pymoo/algorithms/soo/__init__.py +0 -0
  29. pymoo/algorithms/soo/convex/__init__.py +0 -0
  30. pymoo/algorithms/soo/nonconvex/__init__.py +0 -0
  31. pymoo/algorithms/soo/nonconvex/brkga.py +162 -0
  32. pymoo/algorithms/soo/nonconvex/cmaes.py +556 -0
  33. pymoo/algorithms/soo/nonconvex/de.py +283 -0
  34. pymoo/algorithms/soo/nonconvex/direct.py +148 -0
  35. pymoo/algorithms/soo/nonconvex/es.py +213 -0
  36. pymoo/algorithms/soo/nonconvex/g3pcx.py +94 -0
  37. pymoo/algorithms/soo/nonconvex/ga.py +95 -0
  38. pymoo/algorithms/soo/nonconvex/ga_niching.py +223 -0
  39. pymoo/algorithms/soo/nonconvex/isres.py +74 -0
  40. pymoo/algorithms/soo/nonconvex/nelder.py +251 -0
  41. pymoo/algorithms/soo/nonconvex/nrbo.py +191 -0
  42. pymoo/algorithms/soo/nonconvex/optuna.py +80 -0
  43. pymoo/algorithms/soo/nonconvex/pattern.py +185 -0
  44. pymoo/algorithms/soo/nonconvex/pso.py +337 -0
  45. pymoo/algorithms/soo/nonconvex/pso_ep.py +307 -0
  46. pymoo/algorithms/soo/nonconvex/random_search.py +25 -0
  47. pymoo/algorithms/soo/nonconvex/sres.py +56 -0
  48. pymoo/algorithms/soo/univariate/__init__.py +0 -0
  49. pymoo/algorithms/soo/univariate/exp.py +46 -0
  50. pymoo/algorithms/soo/univariate/golden.py +65 -0
  51. pymoo/algorithms/soo/univariate/quadr_interp.py +81 -0
  52. pymoo/algorithms/soo/univariate/wolfe.py +163 -0
  53. pymoo/config.py +33 -0
  54. pymoo/constraints/__init__.py +3 -0
  55. pymoo/constraints/adaptive.py +66 -0
  56. pymoo/constraints/as_obj.py +56 -0
  57. pymoo/constraints/as_penalty.py +41 -0
  58. pymoo/constraints/eps.py +34 -0
  59. pymoo/constraints/from_bounds.py +36 -0
  60. pymoo/core/__init__.py +0 -0
  61. pymoo/core/algorithm.py +408 -0
  62. pymoo/core/callback.py +38 -0
  63. pymoo/core/crossover.py +79 -0
  64. pymoo/core/decision_making.py +102 -0
  65. pymoo/core/decomposition.py +76 -0
  66. pymoo/core/duplicate.py +163 -0
  67. pymoo/core/evaluator.py +116 -0
  68. pymoo/core/indicator.py +34 -0
  69. pymoo/core/individual.py +784 -0
  70. pymoo/core/infill.py +65 -0
  71. pymoo/core/initialization.py +44 -0
  72. pymoo/core/mating.py +39 -0
  73. pymoo/core/meta.py +21 -0
  74. pymoo/core/mixed.py +164 -0
  75. pymoo/core/mutation.py +44 -0
  76. pymoo/core/operator.py +46 -0
  77. pymoo/core/parameters.py +134 -0
  78. pymoo/core/plot.py +208 -0
  79. pymoo/core/population.py +180 -0
  80. pymoo/core/problem.py +373 -0
  81. pymoo/core/recorder.py +99 -0
  82. pymoo/core/repair.py +23 -0
  83. pymoo/core/replacement.py +96 -0
  84. pymoo/core/result.py +52 -0
  85. pymoo/core/sampling.py +45 -0
  86. pymoo/core/selection.py +61 -0
  87. pymoo/core/solution.py +10 -0
  88. pymoo/core/survival.py +107 -0
  89. pymoo/core/termination.py +70 -0
  90. pymoo/core/variable.py +415 -0
  91. pymoo/decomposition/__init__.py +0 -0
  92. pymoo/decomposition/aasf.py +24 -0
  93. pymoo/decomposition/asf.py +10 -0
  94. pymoo/decomposition/pbi.py +13 -0
  95. pymoo/decomposition/perp_dist.py +13 -0
  96. pymoo/decomposition/tchebicheff.py +11 -0
  97. pymoo/decomposition/util.py +13 -0
  98. pymoo/decomposition/weighted_sum.py +8 -0
  99. pymoo/docs.py +187 -0
  100. pymoo/experimental/__init__.py +0 -0
  101. pymoo/experimental/algorithms/__init__.py +0 -0
  102. pymoo/experimental/algorithms/gde3.py +57 -0
  103. pymoo/functions/__init__.py +135 -0
  104. pymoo/functions/compiled/__init__.py +0 -0
  105. pymoo/functions/compiled/calc_perpendicular_distance.cpp +27464 -0
  106. pymoo/functions/compiled/calc_perpendicular_distance.cpython-312-darwin.so +0 -0
  107. pymoo/functions/compiled/decomposition.cpp +28853 -0
  108. pymoo/functions/compiled/decomposition.cpython-312-darwin.so +0 -0
  109. pymoo/functions/compiled/info.cpp +7058 -0
  110. pymoo/functions/compiled/info.cpython-312-darwin.so +0 -0
  111. pymoo/functions/compiled/mnn.cpp +30095 -0
  112. pymoo/functions/compiled/mnn.cpython-312-darwin.so +0 -0
  113. pymoo/functions/compiled/non_dominated_sorting.cpp +35692 -0
  114. pymoo/functions/compiled/non_dominated_sorting.cpython-312-darwin.so +0 -0
  115. pymoo/functions/compiled/pruning_cd.cpp +29248 -0
  116. pymoo/functions/compiled/pruning_cd.cpython-312-darwin.so +0 -0
  117. pymoo/functions/compiled/stochastic_ranking.cpp +28042 -0
  118. pymoo/functions/compiled/stochastic_ranking.cpython-312-darwin.so +0 -0
  119. pymoo/functions/standard/__init__.py +1 -0
  120. pymoo/functions/standard/calc_perpendicular_distance.py +20 -0
  121. pymoo/functions/standard/decomposition.py +18 -0
  122. pymoo/functions/standard/hv.py +5 -0
  123. pymoo/functions/standard/mnn.py +78 -0
  124. pymoo/functions/standard/non_dominated_sorting.py +474 -0
  125. pymoo/functions/standard/pruning_cd.py +93 -0
  126. pymoo/functions/standard/stochastic_ranking.py +42 -0
  127. pymoo/gradient/__init__.py +24 -0
  128. pymoo/gradient/automatic.py +85 -0
  129. pymoo/gradient/grad_autograd.py +105 -0
  130. pymoo/gradient/grad_complex.py +35 -0
  131. pymoo/gradient/grad_jax.py +51 -0
  132. pymoo/gradient/numpy.py +22 -0
  133. pymoo/gradient/toolbox/__init__.py +19 -0
  134. pymoo/indicators/__init__.py +0 -0
  135. pymoo/indicators/distance_indicator.py +55 -0
  136. pymoo/indicators/gd.py +7 -0
  137. pymoo/indicators/gd_plus.py +7 -0
  138. pymoo/indicators/hv/__init__.py +59 -0
  139. pymoo/indicators/hv/approximate.py +105 -0
  140. pymoo/indicators/hv/exact.py +68 -0
  141. pymoo/indicators/hv/exact_2d.py +102 -0
  142. pymoo/indicators/igd.py +7 -0
  143. pymoo/indicators/igd_plus.py +7 -0
  144. pymoo/indicators/kktpm.py +151 -0
  145. pymoo/indicators/migd.py +55 -0
  146. pymoo/indicators/rmetric.py +203 -0
  147. pymoo/indicators/spacing.py +52 -0
  148. pymoo/mcdm/__init__.py +0 -0
  149. pymoo/mcdm/compromise_programming.py +19 -0
  150. pymoo/mcdm/high_tradeoff.py +40 -0
  151. pymoo/mcdm/pseudo_weights.py +32 -0
  152. pymoo/operators/__init__.py +0 -0
  153. pymoo/operators/control.py +190 -0
  154. pymoo/operators/crossover/__init__.py +0 -0
  155. pymoo/operators/crossover/binx.py +47 -0
  156. pymoo/operators/crossover/dex.py +125 -0
  157. pymoo/operators/crossover/erx.py +164 -0
  158. pymoo/operators/crossover/expx.py +53 -0
  159. pymoo/operators/crossover/hux.py +37 -0
  160. pymoo/operators/crossover/nox.py +25 -0
  161. pymoo/operators/crossover/ox.py +88 -0
  162. pymoo/operators/crossover/pcx.py +84 -0
  163. pymoo/operators/crossover/pntx.py +49 -0
  164. pymoo/operators/crossover/sbx.py +137 -0
  165. pymoo/operators/crossover/spx.py +5 -0
  166. pymoo/operators/crossover/ux.py +20 -0
  167. pymoo/operators/mutation/__init__.py +0 -0
  168. pymoo/operators/mutation/bitflip.py +17 -0
  169. pymoo/operators/mutation/gauss.py +60 -0
  170. pymoo/operators/mutation/inversion.py +42 -0
  171. pymoo/operators/mutation/nom.py +7 -0
  172. pymoo/operators/mutation/pm.py +96 -0
  173. pymoo/operators/mutation/rm.py +23 -0
  174. pymoo/operators/repair/__init__.py +0 -0
  175. pymoo/operators/repair/bounce_back.py +32 -0
  176. pymoo/operators/repair/bounds_repair.py +97 -0
  177. pymoo/operators/repair/inverse_penalty.py +91 -0
  178. pymoo/operators/repair/rounding.py +18 -0
  179. pymoo/operators/repair/to_bound.py +31 -0
  180. pymoo/operators/repair/vtype.py +11 -0
  181. pymoo/operators/sampling/__init__.py +0 -0
  182. pymoo/operators/sampling/lhs.py +76 -0
  183. pymoo/operators/sampling/rnd.py +52 -0
  184. pymoo/operators/selection/__init__.py +0 -0
  185. pymoo/operators/selection/rnd.py +75 -0
  186. pymoo/operators/selection/tournament.py +78 -0
  187. pymoo/operators/survival/__init__.py +0 -0
  188. pymoo/operators/survival/rank_and_crowding/__init__.py +1 -0
  189. pymoo/operators/survival/rank_and_crowding/classes.py +212 -0
  190. pymoo/operators/survival/rank_and_crowding/metrics.py +208 -0
  191. pymoo/optimize.py +72 -0
  192. pymoo/parallelization/__init__.py +15 -0
  193. pymoo/parallelization/dask.py +25 -0
  194. pymoo/parallelization/joblib.py +28 -0
  195. pymoo/parallelization/ray.py +31 -0
  196. pymoo/parallelization/starmap.py +24 -0
  197. pymoo/problems/__init__.py +157 -0
  198. pymoo/problems/dyn.py +47 -0
  199. pymoo/problems/dynamic/__init__.py +0 -0
  200. pymoo/problems/dynamic/cec2015.py +108 -0
  201. pymoo/problems/dynamic/df.py +451 -0
  202. pymoo/problems/dynamic/misc.py +167 -0
  203. pymoo/problems/functional.py +48 -0
  204. pymoo/problems/many/__init__.py +5 -0
  205. pymoo/problems/many/cdtlz.py +159 -0
  206. pymoo/problems/many/dcdtlz.py +88 -0
  207. pymoo/problems/many/dtlz.py +264 -0
  208. pymoo/problems/many/wfg.py +553 -0
  209. pymoo/problems/multi/__init__.py +14 -0
  210. pymoo/problems/multi/bnh.py +34 -0
  211. pymoo/problems/multi/carside.py +48 -0
  212. pymoo/problems/multi/clutch.py +104 -0
  213. pymoo/problems/multi/csi.py +55 -0
  214. pymoo/problems/multi/ctp.py +198 -0
  215. pymoo/problems/multi/dascmop.py +213 -0
  216. pymoo/problems/multi/kursawe.py +25 -0
  217. pymoo/problems/multi/modact.py +68 -0
  218. pymoo/problems/multi/mw.py +400 -0
  219. pymoo/problems/multi/omnitest.py +48 -0
  220. pymoo/problems/multi/osy.py +32 -0
  221. pymoo/problems/multi/srn.py +28 -0
  222. pymoo/problems/multi/sympart.py +94 -0
  223. pymoo/problems/multi/tnk.py +24 -0
  224. pymoo/problems/multi/truss2d.py +83 -0
  225. pymoo/problems/multi/welded_beam.py +41 -0
  226. pymoo/problems/multi/wrm.py +36 -0
  227. pymoo/problems/multi/zdt.py +151 -0
  228. pymoo/problems/multi_to_single.py +22 -0
  229. pymoo/problems/single/__init__.py +12 -0
  230. pymoo/problems/single/ackley.py +24 -0
  231. pymoo/problems/single/cantilevered_beam.py +34 -0
  232. pymoo/problems/single/flowshop_scheduling.py +113 -0
  233. pymoo/problems/single/g.py +874 -0
  234. pymoo/problems/single/griewank.py +18 -0
  235. pymoo/problems/single/himmelblau.py +15 -0
  236. pymoo/problems/single/knapsack.py +49 -0
  237. pymoo/problems/single/mopta08.py +26 -0
  238. pymoo/problems/single/multimodal.py +20 -0
  239. pymoo/problems/single/pressure_vessel.py +30 -0
  240. pymoo/problems/single/rastrigin.py +20 -0
  241. pymoo/problems/single/rosenbrock.py +22 -0
  242. pymoo/problems/single/schwefel.py +18 -0
  243. pymoo/problems/single/simple.py +13 -0
  244. pymoo/problems/single/sphere.py +19 -0
  245. pymoo/problems/single/traveling_salesman.py +79 -0
  246. pymoo/problems/single/zakharov.py +19 -0
  247. pymoo/problems/static.py +14 -0
  248. pymoo/problems/util.py +42 -0
  249. pymoo/problems/zero_to_one.py +27 -0
  250. pymoo/termination/__init__.py +23 -0
  251. pymoo/termination/collection.py +12 -0
  252. pymoo/termination/cv.py +48 -0
  253. pymoo/termination/default.py +45 -0
  254. pymoo/termination/delta.py +64 -0
  255. pymoo/termination/fmin.py +16 -0
  256. pymoo/termination/ftol.py +144 -0
  257. pymoo/termination/indicator.py +49 -0
  258. pymoo/termination/max_eval.py +14 -0
  259. pymoo/termination/max_gen.py +15 -0
  260. pymoo/termination/max_time.py +20 -0
  261. pymoo/termination/robust.py +34 -0
  262. pymoo/termination/xtol.py +33 -0
  263. pymoo/util/__init__.py +33 -0
  264. pymoo/util/archive.py +152 -0
  265. pymoo/util/cache.py +29 -0
  266. pymoo/util/clearing.py +82 -0
  267. pymoo/util/display/__init__.py +0 -0
  268. pymoo/util/display/column.py +52 -0
  269. pymoo/util/display/display.py +34 -0
  270. pymoo/util/display/multi.py +100 -0
  271. pymoo/util/display/output.py +53 -0
  272. pymoo/util/display/progress.py +54 -0
  273. pymoo/util/display/single.py +67 -0
  274. pymoo/util/dominator.py +67 -0
  275. pymoo/util/hv.py +21 -0
  276. pymoo/util/matlab_engine.py +39 -0
  277. pymoo/util/misc.py +447 -0
  278. pymoo/util/nds/__init__.py +0 -0
  279. pymoo/util/nds/dominance_degree_non_dominated_sort.py +159 -0
  280. pymoo/util/nds/efficient_non_dominated_sort.py +152 -0
  281. pymoo/util/nds/fast_non_dominated_sort.py +70 -0
  282. pymoo/util/nds/find_non_dominated.py +54 -0
  283. pymoo/util/nds/naive_non_dominated_sort.py +36 -0
  284. pymoo/util/nds/non_dominated_sorting.py +94 -0
  285. pymoo/util/nds/tree_based_non_dominated_sort.py +133 -0
  286. pymoo/util/normalization.py +312 -0
  287. pymoo/util/optimum.py +42 -0
  288. pymoo/util/randomized_argsort.py +63 -0
  289. pymoo/util/ref_dirs/__init__.py +24 -0
  290. pymoo/util/ref_dirs/construction.py +89 -0
  291. pymoo/util/ref_dirs/das_dennis.py +52 -0
  292. pymoo/util/ref_dirs/energy.py +317 -0
  293. pymoo/util/ref_dirs/energy_layer.py +119 -0
  294. pymoo/util/ref_dirs/genetic_algorithm.py +64 -0
  295. pymoo/util/ref_dirs/incremental.py +69 -0
  296. pymoo/util/ref_dirs/misc.py +128 -0
  297. pymoo/util/ref_dirs/optimizer.py +59 -0
  298. pymoo/util/ref_dirs/performance.py +162 -0
  299. pymoo/util/ref_dirs/reduction.py +85 -0
  300. pymoo/util/ref_dirs/sample_and_map.py +24 -0
  301. pymoo/util/reference_direction.py +258 -0
  302. pymoo/util/remote.py +55 -0
  303. pymoo/util/roulette.py +29 -0
  304. pymoo/util/running_metric.py +128 -0
  305. pymoo/util/sliding_window.py +25 -0
  306. pymoo/util/value_functions.py +720 -0
  307. pymoo/util/vectors.py +40 -0
  308. pymoo/util/vf_dominator.py +102 -0
  309. pymoo/vendor/__init__.py +0 -0
  310. pymoo/vendor/cec2018.py +398 -0
  311. pymoo/vendor/gta.py +617 -0
  312. pymoo/vendor/vendor_cmaes.py +421 -0
  313. pymoo/vendor/vendor_coco.py +81 -0
  314. pymoo/vendor/vendor_scipy.py +232 -0
  315. pymoo/version.py +1 -0
  316. pymoo/visualization/__init__.py +21 -0
  317. pymoo/visualization/app/__init__.py +0 -0
  318. pymoo/visualization/app/pso.py +61 -0
  319. pymoo/visualization/fitness_landscape.py +128 -0
  320. pymoo/visualization/heatmap.py +123 -0
  321. pymoo/visualization/matplotlib.py +61 -0
  322. pymoo/visualization/pcp.py +121 -0
  323. pymoo/visualization/petal.py +91 -0
  324. pymoo/visualization/radar.py +108 -0
  325. pymoo/visualization/radviz.py +68 -0
  326. pymoo/visualization/scatter.py +150 -0
  327. pymoo/visualization/star_coordinate.py +75 -0
  328. pymoo/visualization/util.py +296 -0
  329. pymoo/visualization/video/__init__.py +0 -0
  330. pymoo/visualization/video/callback_video.py +82 -0
  331. pymoo/visualization/video/one_var_one_obj.py +57 -0
  332. pymoo/visualization/video/two_var_one_obj.py +62 -0
  333. pymoo-0.6.1.6.dist-info/METADATA +209 -0
  334. pymoo-0.6.1.6.dist-info/RECORD +337 -0
  335. pymoo-0.6.1.6.dist-info/WHEEL +6 -0
  336. pymoo-0.6.1.6.dist-info/licenses/LICENSE +191 -0
  337. pymoo-0.6.1.6.dist-info/top_level.txt +1 -0
@@ -0,0 +1,97 @@
1
+ import abc
2
+
3
+ import numpy as np
4
+
5
+ from pymoo.core.population import Population
6
+ from pymoo.core.repair import Repair
7
+ from pymoo.util import default_random_state
8
+
9
+
10
+ def is_in_bounds(X, xl, xu):
11
+ return np.where(np.all(np.logical_and(X >= xl, X <= xu), axis=1))[0]
12
+
13
+
14
+ def is_in_bounds_by_problem(problem, X):
15
+ return is_in_bounds(X, problem.xl, problem.xu)
16
+
17
+
18
+ def is_out_of_bounds(X, xl, xu):
19
+ return np.where(np.any(np.logical_or(X < xl, X > xu), axis=1))[0]
20
+
21
+
22
+ def is_out_of_bounds_by_problem(problem, X):
23
+ return is_out_of_bounds(X, problem.xl, problem.xu)
24
+
25
+
26
+ def repeat_bounds(xl, xu, n):
27
+ XL = np.tile(xl, (n, 1))
28
+ XU = np.tile(xu, (n, 1))
29
+ return XL, XU
30
+
31
+
32
+ def repair_clamp(Xp, xl, xu):
33
+ XL, XU = repeat_bounds(xl, xu, len(Xp))
34
+
35
+ I = np.where(Xp < XL)
36
+ Xp[I] = XL[I]
37
+
38
+ I = np.where(Xp > XU)
39
+ Xp[I] = XU[I]
40
+
41
+ return Xp
42
+
43
+
44
+ def repair_periodic(Xp, xl, xu):
45
+ XL, XU = repeat_bounds(xl, xu, len(Xp))
46
+
47
+ S = (XU - XL)
48
+
49
+ I = np.where(Xp < XL)
50
+ Xp[I] = XU[I] - (XL[I] - Xp[I]) % S[I]
51
+
52
+ I = np.where(Xp > XU)
53
+ Xp[I] = XL[I] + (Xp[I] - XU[I]) % S[I]
54
+
55
+ return Xp
56
+
57
+
58
+ @default_random_state
59
+ def repair_random_init(Xp, X, xl, xu, random_state=None):
60
+ XL, XU = repeat_bounds(xl, xu, len(Xp))
61
+
62
+ i, j = np.where(Xp < XL)
63
+ if len(i) > 0:
64
+ Xp[i, j] = XL[i, j] + random_state.random(len(i)) * (X[i, j] - XL[i, j])
65
+
66
+ i, j = np.where(Xp > XU)
67
+ if len(i) > 0:
68
+ Xp[i, j] = XU[i, j] - random_state.random(len(i)) * (XU[i, j] - X[i, j])
69
+
70
+ return Xp
71
+
72
+
73
+ class BoundsRepair(Repair):
74
+
75
+ def _do(self,
76
+ problem,
77
+ pop_or_X,
78
+ check_out_of_bounds=True,
79
+ **kwargs):
80
+
81
+ is_array = not isinstance(pop_or_X, Population)
82
+
83
+ X = pop_or_X if is_array else pop_or_X.get("X")
84
+
85
+ X = self.repair_out_of_bounds(problem, X, **kwargs)
86
+
87
+ assert len(is_out_of_bounds_by_problem(problem, X)) == 0
88
+
89
+ if is_array:
90
+ return X
91
+ else:
92
+ pop_or_X.set("X", X)
93
+ return pop_or_X
94
+
95
+ @abc.abstractmethod
96
+ def repair_out_of_bounds(self, problem, X, **kwargs):
97
+ pass
@@ -0,0 +1,91 @@
1
+ import numpy as np
2
+
3
+ from pymoo.operators.repair.bounds_repair import BoundsRepair
4
+ from pymoo.util import default_random_state
5
+
6
+
7
+ @default_random_state
8
+ def inverse_penality(x, p, xl, xu, alpha=None, random_state=None):
9
+ assert len(p) == len(x)
10
+
11
+ normv = np.linalg.norm(p - x)
12
+
13
+ # violated boundaries
14
+ idl = x < xl
15
+ idr = xu < x
16
+
17
+ # if nothing is out of bounds just return the value
18
+ if not np.any(np.logical_or(idl, idr)):
19
+ return x
20
+
21
+ else:
22
+ # lower bounds of Y
23
+ diff = (p - x)
24
+ diff[diff == 0] = 1e-32
25
+ d = normv * np.max(np.maximum(idl * (xl - x) / diff, idr * (xu - x) / diff))
26
+
27
+ # upper bounds on Y
28
+ bounds = np.array([~idl * ((xl - x) / diff), ~idr * (xu - x) / diff])
29
+
30
+ D = normv * np.min(bounds[bounds > 0])
31
+
32
+ if alpha is None:
33
+ alpha = (normv - d) / normv
34
+ alpha += 1e-32
35
+
36
+ r = random_state.random()
37
+ Y = d * (1.0 + alpha * np.tan(r * np.arctan((D - d) / (alpha * d))))
38
+
39
+ ret = x + (p - x) * Y / normv
40
+
41
+ # for floating point error - in theory it will always be in bounds
42
+ ret[ret < xl] = xl[ret < xl]
43
+ ret[ret > xu] = xu[ret > xu]
44
+
45
+ return ret
46
+
47
+
48
+ def inverse_penality_by_problem(problem, x, p, **kwargs):
49
+ return inverse_penality(x, p, problem.xl, problem.xu, **kwargs)
50
+
51
+
52
+ class InversePenaltyOutOfBoundsRepair(BoundsRepair):
53
+
54
+ def repair_out_of_bounds(self, problem, X, P=None, **kwargs):
55
+ if P is None:
56
+ raise Exception("For this out of bounds handling a parent solution in bounds needs to be provided.")
57
+ assert len(X) == len(P)
58
+ n = len(X)
59
+
60
+ for k in range(n):
61
+ X[k] = inverse_penality_by_problem(problem, X[k], P[k])
62
+
63
+ return X
64
+
65
+
66
+ if __name__ == '__main__':
67
+
68
+ # lower and upper bounds
69
+ xl = np.zeros(2)
70
+ xu = np.ones(2)
71
+
72
+ # chosen parents
73
+ # p = np.array([0.1, 1.0])
74
+ p = np.array([0.5, 0.6])
75
+
76
+ c = np.array([-0.1, 1.0])
77
+
78
+ from pymoo.visualization.matplotlib import plt
79
+
80
+ plt.scatter(p[0], p[1], color="green", label="Parent")
81
+ plt.scatter(c[0], c[1], color="orange", label="Offspring")
82
+
83
+ data = []
84
+ for j in range(200):
85
+ ret = inverse_penality(c, p, xl, xu, alpha=None)
86
+ plt.scatter(ret[0], ret[1], facecolor="none", edgecolor="red", s=10, alpha=0.6)
87
+
88
+ plt.ylim(0.0, 1.3)
89
+ plt.xlim(-0.2, 1)
90
+ plt.legend()
91
+ plt.show()
@@ -0,0 +1,18 @@
1
+ import numpy as np
2
+
3
+ from pymoo.core.repair import Repair
4
+
5
+
6
+ class RoundingRepair(Repair):
7
+
8
+ def __init__(self, **kwargs) -> None:
9
+ """
10
+
11
+ Returns
12
+ -------
13
+ object
14
+ """
15
+ super().__init__(**kwargs)
16
+
17
+ def _do(self, problem, X, **kwargs):
18
+ return np.around(X).astype(int)
@@ -0,0 +1,31 @@
1
+ import numpy as np
2
+
3
+ from pymoo.operators.repair.bounds_repair import BoundsRepair
4
+ from pymoo.util.misc import at_least_2d_array
5
+
6
+
7
+ def set_to_bounds_if_outside(X, xl, xu):
8
+ _X, only_1d = at_least_2d_array(X, return_if_reshaped=True)
9
+
10
+ if xl is not None:
11
+ xl = np.repeat(xl[None, :], _X.shape[0], axis=0)
12
+ _X[_X < xl] = xl[_X < xl]
13
+
14
+ if xu is not None:
15
+ xu = np.repeat(xu[None, :], _X.shape[0], axis=0)
16
+ _X[_X > xu] = xu[_X > xu]
17
+
18
+ if only_1d:
19
+ return _X[0, :]
20
+ else:
21
+ return _X
22
+
23
+
24
+ def set_to_bounds_if_outside_by_problem(problem, X):
25
+ return set_to_bounds_if_outside(X, problem.xl, problem.xu)
26
+
27
+
28
+ class ToBoundOutOfBoundsRepair(BoundsRepair):
29
+
30
+ def repair_out_of_bounds(self, problem, X, **kwargs):
31
+ return set_to_bounds_if_outside_by_problem(problem, X)
@@ -0,0 +1,11 @@
1
+ from pymoo.core.repair import Repair
2
+
3
+
4
+ class TypeRepair(Repair):
5
+
6
+ def __init__(self, vtype) -> None:
7
+ super().__init__()
8
+ self.vtype = vtype
9
+
10
+ def _do(self, problem, X, **kwargs):
11
+ return X.astype(self.vtype)
File without changes
@@ -0,0 +1,76 @@
1
+ import numpy as np
2
+
3
+ from pymoo.core.sampling import Sampling
4
+ from pymoo.util import default_random_state
5
+ from pymoo.util.misc import cdist
6
+
7
+
8
+ def criterion_maxmin(X):
9
+ D = cdist(X, X)
10
+ np.fill_diagonal(D, np.inf)
11
+ return np.min(D)
12
+
13
+
14
+ def criterion_corr(X):
15
+ M = np.corrcoef(X.T, rowvar=True)
16
+ return -np.sum(np.tril(M, -1) ** 2)
17
+
18
+
19
+ @default_random_state
20
+ def sampling_lhs(n_samples, n_var, xl=0, xu=1, smooth=True, criterion=criterion_maxmin, n_iter=50, random_state=None):
21
+
22
+ X = sampling_lhs_unit(n_samples, n_var, smooth=smooth, random_state=random_state)
23
+
24
+ # if a criterion is selected to further improve the sampling
25
+ if criterion is not None:
26
+
27
+ # current best score is stored here
28
+ score = criterion(X)
29
+
30
+ for j in range(1, n_iter):
31
+
32
+ # create new random sample and check the score again
33
+ _X = sampling_lhs_unit(n_samples, n_var, smooth=smooth, random_state=random_state)
34
+ _score = criterion(_X)
35
+
36
+ if _score > score:
37
+ X, score = _X, _score
38
+
39
+ return xl + X * (xu - xl)
40
+
41
+
42
+ @default_random_state
43
+ def sampling_lhs_unit(n_samples, n_var, smooth=True, random_state=None):
44
+ X = random_state.random(size=(n_samples, n_var))
45
+ Xp = X.argsort(axis=0) + 1
46
+
47
+ if smooth:
48
+ Xp = Xp - random_state.random(Xp.shape)
49
+ else:
50
+ Xp = Xp - 0.5
51
+ Xp /= n_samples
52
+ return Xp
53
+
54
+
55
+ class LatinHypercubeSampling(Sampling):
56
+
57
+ def __init__(self,
58
+ smooth=True,
59
+ iterations=20,
60
+ criterion=criterion_maxmin) -> None:
61
+ super().__init__()
62
+ self.smooth = smooth
63
+ self.iterations = iterations
64
+ self.criterion = criterion
65
+
66
+ def _do(self, problem, n_samples, random_state=None, **kwargs):
67
+ xl, xu = problem.bounds()
68
+
69
+ X = sampling_lhs(n_samples, problem.n_var, xl=xl, xu=xu, smooth=self.smooth,
70
+ criterion=self.criterion, n_iter=self.iterations, random_state=random_state)
71
+
72
+ return X
73
+
74
+
75
+ class LHS(LatinHypercubeSampling):
76
+ pass
@@ -0,0 +1,52 @@
1
+ import numpy as np
2
+
3
+ from pymoo.core.sampling import Sampling
4
+ from pymoo.util import default_random_state
5
+
6
+
7
+ @default_random_state
8
+ def random(problem, n_samples=1, random_state=None):
9
+ X = random_state.random((n_samples, problem.n_var))
10
+
11
+ if problem.has_bounds():
12
+ xl, xu = problem.bounds()
13
+ assert np.all(xu >= xl)
14
+ X = xl + (xu - xl) * X
15
+
16
+ return X
17
+
18
+
19
+ class FloatRandomSampling(Sampling):
20
+
21
+ def _do(self, problem, n_samples, *args, random_state=None, **kwargs):
22
+ X = random_state.random((n_samples, problem.n_var))
23
+
24
+ if problem.has_bounds():
25
+ xl, xu = problem.bounds()
26
+ assert np.all(xu >= xl)
27
+ X = xl + (xu - xl) * X
28
+
29
+ return X
30
+
31
+
32
+ class BinaryRandomSampling(Sampling):
33
+
34
+ def _do(self, problem, n_samples, *args, random_state=None, **kwargs):
35
+ val = random_state.random((n_samples, problem.n_var))
36
+ return (val < 0.5).astype(bool)
37
+
38
+
39
+ class IntegerRandomSampling(FloatRandomSampling):
40
+
41
+ def _do(self, problem, n_samples, *args, random_state=None, **kwargs):
42
+ n, (xl, xu) = problem.n_var, problem.bounds()
43
+ return np.column_stack([random_state.integers(xl[k], xu[k] + 1, size=n_samples) for k in range(n)])
44
+
45
+
46
+ class PermutationRandomSampling(Sampling):
47
+
48
+ def _do(self, problem, n_samples, *args, random_state=None, **kwargs):
49
+ X = np.full((n_samples, problem.n_var), 0, dtype=int)
50
+ for i in range(n_samples):
51
+ X[i, :] = random_state.permutation(problem.n_var)
52
+ return X
File without changes
@@ -0,0 +1,75 @@
1
+ import math
2
+
3
+ import numpy as np
4
+
5
+ from pymoo.core.selection import Selection
6
+ from pymoo.util.misc import random_permutations
7
+ from pymoo.util import default_random_state
8
+
9
+
10
+ class RandomSelection(Selection):
11
+
12
+ def _do(self, _, pop, n_select, n_parents, *args, random_state=None, **kwargs):
13
+ # number of random individuals needed
14
+ n_random = n_select * n_parents
15
+
16
+ # number of permutations needed
17
+ n_perms = math.ceil(n_random / len(pop))
18
+
19
+ # get random permutations and reshape them
20
+ P = random_permutations(n_perms, len(pop), random_state=random_state)[:n_random]
21
+
22
+ return np.reshape(P, (n_select, n_parents))
23
+
24
+
25
+ @default_random_state
26
+ def fast_fill_random(X, N, columns=None, Xp=None, n_max_attempts=10, random_state=None):
27
+ """
28
+
29
+ Parameters
30
+ ----------
31
+ X : np.ndarray
32
+ The actually array to fill with random values.
33
+ N : int
34
+ The upper limit for the values. The values will be in range (0, ..., N)
35
+ columns : list
36
+ The columns which should be filled randomly. Other columns indicate duplicates
37
+ Xp : np.ndarray
38
+ If some other duplicates shall be avoided by default
39
+
40
+ """
41
+
42
+ _, n_cols = X.shape
43
+
44
+ if columns is None:
45
+ columns = range(n_cols)
46
+
47
+ # all columns set so far to be checked for duplicates
48
+ J = []
49
+
50
+ # for each of the columns which should be set to be no duplicates
51
+ for col in columns:
52
+
53
+ D = X[:, J]
54
+ if Xp is not None:
55
+ D = np.column_stack([D, Xp])
56
+
57
+ # all the remaining indices that need to be filled with no duplicates
58
+ rem = np.arange(len(X))
59
+
60
+ for _ in range(n_max_attempts):
61
+
62
+ # random_state is guaranteed to be set by decorator
63
+ if len(rem) > N:
64
+ X[rem, col] = random_state.choice(N, replace=True, size=len(rem))
65
+ else:
66
+ X[rem, col] = random_state.permutation(N)[:len(rem)]
67
+
68
+ rem = np.where((X[rem, col][:, None] == D[rem]).any(axis=1))[0]
69
+
70
+ if len(rem) == 0:
71
+ break
72
+
73
+ J.append(col)
74
+
75
+ return X
@@ -0,0 +1,78 @@
1
+ import math
2
+
3
+ import numpy as np
4
+
5
+ from pymoo.core.selection import Selection
6
+ from pymoo.util.misc import random_permutations
7
+ from pymoo.util import default_random_state
8
+
9
+
10
+ class TournamentSelection(Selection):
11
+ """
12
+ The Tournament selection is used to simulate a tournament between individuals. The pressure balances
13
+ greedy the genetic algorithm will be.
14
+ """
15
+
16
+ def __init__(self, func_comp=None, pressure=2, **kwargs):
17
+ """
18
+
19
+ Parameters
20
+ ----------
21
+ func_comp: func
22
+ The function to compare two individuals. It has the shape: comp(pop, indices) and returns the winner.
23
+ If the function is None it is assumed the population is sorted by a criterion and only indices are compared.
24
+
25
+ pressure: int
26
+ The selection pressure to be applied. Default it is a binary tournament.
27
+ """
28
+
29
+ super().__init__(**kwargs)
30
+
31
+ # selection pressure to be applied
32
+ self.pressure = pressure
33
+
34
+ self.func_comp = func_comp
35
+ if self.func_comp is None:
36
+ raise Exception("Please provide the comparing function for the tournament selection!")
37
+
38
+ def _do(self, _, pop, n_select, n_parents=1, random_state=None, **kwargs):
39
+ # number of random individuals needed
40
+ n_random = n_select * n_parents * self.pressure
41
+
42
+ # number of permutations needed
43
+ n_perms = math.ceil(n_random / len(pop))
44
+
45
+ # get random permutations and reshape them
46
+ P = random_permutations(n_perms, len(pop), random_state=random_state)[:n_random]
47
+ P = np.reshape(P, (n_select * n_parents, self.pressure))
48
+
49
+ # compare using tournament function
50
+ S = self.func_comp(pop, P, random_state=random_state, **kwargs)
51
+
52
+ return np.reshape(S, (n_select, n_parents))
53
+
54
+
55
+ @default_random_state
56
+ def compare(a, a_val, b, b_val, method, return_random_if_equal=False, random_state=None):
57
+ if method == 'larger_is_better':
58
+ if a_val > b_val:
59
+ return a
60
+ elif a_val < b_val:
61
+ return b
62
+ else:
63
+ if return_random_if_equal:
64
+ return random_state.choice([a, b])
65
+ else:
66
+ return None
67
+ elif method == 'smaller_is_better':
68
+ if a_val < b_val:
69
+ return a
70
+ elif a_val > b_val:
71
+ return b
72
+ else:
73
+ if return_random_if_equal:
74
+ return random_state.choice([a, b])
75
+ else:
76
+ return None
77
+ else:
78
+ raise Exception("Unknown method.")
File without changes
@@ -0,0 +1 @@
1
+ from pymoo.operators.survival.rank_and_crowding.classes import RankAndCrowding, ConstrRankAndCrowding