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,34 @@
1
+ from pymoo.core.callback import Callback
2
+ from pymoo.util.display.progress import ProgressBar
3
+
4
+
5
+ class Display(Callback):
6
+
7
+ def __init__(self, output=None, progress=False, verbose=False):
8
+ super().__init__()
9
+ self.output = output
10
+ self.verbose = verbose
11
+ self.progress = ProgressBar() if progress else None
12
+
13
+ def update(self, algorithm, **kwargs):
14
+ output, progress = self.output, self.progress
15
+
16
+ if self.verbose and output:
17
+ text = ""
18
+ header = not output.is_initialized
19
+ output(algorithm)
20
+
21
+ if header:
22
+ text += output.header(border=True) + '\n'
23
+ text += output.text()
24
+
25
+ print(text)
26
+
27
+ if progress:
28
+ perc = algorithm.termination.perc
29
+ progress.set(perc)
30
+
31
+ def finalize(self):
32
+
33
+ if self.progress:
34
+ self.progress.close()
@@ -0,0 +1,100 @@
1
+ from pymoo.indicators.gd import GD
2
+ from pymoo.indicators.hv import Hypervolume
3
+ from pymoo.indicators.igd import IGD
4
+ from pymoo.termination.ftol import MultiObjectiveSpaceTermination
5
+
6
+ from pymoo.util.display.column import Column
7
+ from pymoo.util.display.output import Output, pareto_front_if_possible
8
+ from pymoo.util.display.single import MinimumConstraintViolation, AverageConstraintViolation
9
+
10
+
11
+ class NumberOfNondominatedSolutions(Column):
12
+
13
+ def __init__(self, width=6, **kwargs) -> None:
14
+ super().__init__("n_nds", width=width, **kwargs)
15
+
16
+ def update(self, algorithm):
17
+ self.value = len(algorithm.opt)
18
+
19
+
20
+ class MultiObjectiveOutput(Output):
21
+
22
+ def __init__(self):
23
+ super().__init__()
24
+ self.cv_min = MinimumConstraintViolation()
25
+ self.cv_avg = AverageConstraintViolation()
26
+ self.n_nds = NumberOfNondominatedSolutions()
27
+
28
+ self.igd = Column("igd")
29
+ self.gd = Column("gd")
30
+ self.hv = Column("hv")
31
+ self.eps = Column("eps")
32
+ self.indicator = Column("indicator")
33
+
34
+ self.pf = None
35
+ self.indicator_no_pf = None
36
+
37
+ def initialize(self, algorithm):
38
+ problem = algorithm.problem
39
+
40
+ self.columns += [self.n_nds]
41
+
42
+ if problem.has_constraints():
43
+ self.columns += [self.cv_min, self.cv_avg]
44
+
45
+ self.pf = pareto_front_if_possible(problem)
46
+ if self.pf is not None:
47
+ self.columns += [self.igd, self.gd]
48
+
49
+ if problem.n_obj == 2:
50
+ self.columns += [self.hv]
51
+
52
+ else:
53
+ self.indicator_no_pf = MultiObjectiveSpaceTermination()
54
+ self.columns += [self.eps, self.indicator]
55
+
56
+ def update(self, algorithm):
57
+ super().update(algorithm)
58
+
59
+ for col in [self.igd, self.gd, self.hv, self.eps, self.indicator]:
60
+ col.set(None)
61
+
62
+ F, feas = algorithm.opt.get("F", "feas")
63
+ F = F[feas]
64
+
65
+ if len(F) > 0:
66
+
67
+ problem = algorithm.problem
68
+ if hasattr(problem, "time"):
69
+ self.pf = pareto_front_if_possible(problem)
70
+
71
+ if self.pf is not None:
72
+
73
+ if feas.sum() > 0:
74
+ self.igd.set(IGD(self.pf, zero_to_one=True).do(F))
75
+ self.gd.set(GD(self.pf, zero_to_one=True).do(F))
76
+
77
+ if self.hv in self.columns:
78
+ self.hv.set(Hypervolume(pf=self.pf, zero_to_one=True).do(F))
79
+
80
+ if self.indicator_no_pf is not None:
81
+
82
+ ind = self.indicator_no_pf
83
+ ind.update(algorithm)
84
+
85
+ valid = ind.delta_ideal is not None
86
+
87
+ if valid:
88
+
89
+ if ind.delta_ideal > ind.tol:
90
+ max_from = "ideal"
91
+ eps = ind.delta_ideal
92
+ elif ind.delta_nadir > ind.tol:
93
+ max_from = "nadir"
94
+ eps = ind.delta_nadir
95
+ else:
96
+ max_from = "f"
97
+ eps = ind.delta_f
98
+
99
+ self.eps.set(eps)
100
+ self.indicator.set(max_from)
@@ -0,0 +1,53 @@
1
+ from pymoo.core.callback import Callback
2
+ from pymoo.util.display.column import Column
3
+
4
+
5
+ def pareto_front_if_possible(problem):
6
+ try:
7
+ return problem.pareto_front()
8
+ except:
9
+ return None
10
+
11
+
12
+ class NumberOfGenerations(Column):
13
+
14
+ def __init__(self, **kwargs) -> None:
15
+ super().__init__("n_gen", **kwargs)
16
+
17
+ def update(self, algorithm):
18
+ self.value = algorithm.n_gen
19
+
20
+
21
+ class NumberOfEvaluations(Column):
22
+
23
+ def __init__(self, **kwargs) -> None:
24
+ super().__init__("n_eval", **kwargs)
25
+
26
+ def update(self, algorithm):
27
+ self.value = algorithm.evaluator.n_eval
28
+
29
+
30
+ class Output(Callback):
31
+
32
+ def __init__(self):
33
+ super().__init__()
34
+ self.n_gen = NumberOfGenerations(width=6)
35
+ self.n_eval = NumberOfEvaluations(width=8)
36
+ self.columns = [self.n_gen, self.n_eval]
37
+
38
+ def update(self, algorithm):
39
+ [col.update(algorithm) for col in self.columns]
40
+
41
+ def header(self, border=False):
42
+ regex = " | ".join(["{}"] * len(self.columns))
43
+ header = regex.format(*[col.name.center(col.width) for col in self.columns])
44
+
45
+ if border:
46
+ line = "=" * len(header)
47
+ header = line + '\n' + header + '\n' + line
48
+
49
+ return header
50
+
51
+ def text(self):
52
+ regex = " | ".join(["{}"] * len(self.columns))
53
+ return regex.format(*[col.text() for col in self.columns])
@@ -0,0 +1,54 @@
1
+ import math
2
+
3
+ from alive_progress import alive_bar
4
+
5
+
6
+ class ProgressBar:
7
+
8
+ def __init__(self, *args, start=True, non_decreasing=True, **kwargs):
9
+ self.args = args
10
+ self.kwargs = kwargs
11
+
12
+ for key, default in [("manual", True), ("force_tty", True)]:
13
+ if key not in kwargs:
14
+ kwargs[key] = default
15
+
16
+ self.func = None
17
+ self.obj = None
18
+ self.non_decreasing = non_decreasing
19
+ self._max = 0.0
20
+
21
+ if start:
22
+ self.start()
23
+
24
+ def set(self, value, *args, **kwargs):
25
+ if self.non_decreasing:
26
+ self._max = max(self._max, value)
27
+ value = self._max
28
+
29
+ prec = 100
30
+ value = math.floor(value * prec) / prec
31
+
32
+ self.obj(value, *args, **kwargs)
33
+
34
+ def start(self):
35
+
36
+ if not self.obj:
37
+ # save the generator to this object
38
+ self.func = alive_bar(*self.args, **self.kwargs).gen
39
+
40
+ # create the bar
41
+ self.obj = next(self.func)
42
+
43
+ def close(self):
44
+ if self.obj:
45
+ try:
46
+ next(self.func)
47
+ except:
48
+ pass
49
+
50
+ def __enter__(self):
51
+ self.start()
52
+
53
+ def __exit__(self, type, value, traceback):
54
+ self.close()
@@ -0,0 +1,67 @@
1
+ from pymoo.util.display.column import Column
2
+ from pymoo.util.display.output import Output, pareto_front_if_possible
3
+
4
+
5
+ class MinimumConstraintViolation(Column):
6
+
7
+ def __init__(self, **kwargs) -> None:
8
+ super().__init__("cv_min", **kwargs)
9
+
10
+ def update(self, algorithm):
11
+ self.value = algorithm.opt.get("cv").min()
12
+
13
+
14
+ class AverageConstraintViolation(Column):
15
+
16
+ def __init__(self, **kwargs) -> None:
17
+ super().__init__("cv_avg", **kwargs)
18
+
19
+ def update(self, algorithm):
20
+ self.value = algorithm.pop.get("cv").mean()
21
+
22
+
23
+ class SingleObjectiveOutput(Output):
24
+
25
+ def __init__(self):
26
+ super().__init__()
27
+ self.cv_min = MinimumConstraintViolation()
28
+ self.cv_avg = AverageConstraintViolation()
29
+
30
+ self.f_min = Column(name="f_min")
31
+ self.f_avg = Column(name="f_avg")
32
+ self.f_gap = Column(name="f_gap")
33
+
34
+ self.best = None
35
+
36
+ def initialize(self, algorithm):
37
+ problem = algorithm.problem
38
+
39
+ if problem.has_constraints():
40
+ self.columns += [self.cv_min, self.cv_avg]
41
+
42
+ self.columns += [self.f_avg, self.f_min]
43
+
44
+ pf = pareto_front_if_possible(problem)
45
+ if pf is not None:
46
+ self.best = pf.flatten()[0]
47
+ self.columns += [self.f_gap]
48
+
49
+ def update(self, algorithm):
50
+ super().update(algorithm)
51
+
52
+ f, cv, feas = algorithm.pop.get("f", "cv", "feas")
53
+
54
+ if feas.sum() > 0:
55
+ self.f_avg.set(f[feas].mean())
56
+ else:
57
+ self.f_avg.set(None)
58
+
59
+ opt = algorithm.opt[0]
60
+
61
+ if opt.feas:
62
+ self.f_min.set(opt.f)
63
+ if self.best is not None:
64
+ self.f_gap.set(opt.f - self.best)
65
+ else:
66
+ self.f_min.set(None)
67
+ self.f_gap.set(None)
@@ -0,0 +1,67 @@
1
+ import numpy as np
2
+
3
+
4
+ def get_relation(ind_a, ind_b):
5
+ return Dominator.get_relation(ind_a.F, ind_b.F, ind_a.CV[0], ind_b.CV[0])
6
+
7
+
8
+ class Dominator:
9
+
10
+ @staticmethod
11
+ def get_relation(a, b, cva=None, cvb=None):
12
+
13
+ if cva is not None and cvb is not None:
14
+ if cva < cvb:
15
+ return 1
16
+ elif cvb < cva:
17
+ return -1
18
+
19
+ val = 0
20
+ for i in range(len(a)):
21
+ if a[i] < b[i]:
22
+ # indifferent because once better and once worse
23
+ if val == -1:
24
+ return 0
25
+ val = 1
26
+ elif b[i] < a[i]:
27
+ # indifferent because once better and once worse
28
+ if val == 1:
29
+ return 0
30
+ val = -1
31
+ return val
32
+
33
+ @staticmethod
34
+ def calc_domination_matrix_loop(F, G):
35
+ n = F.shape[0]
36
+ CV = np.sum(G * (G > 0).astype(float), axis=1)
37
+ M = np.zeros((n, n))
38
+ for i in range(n):
39
+ for j in range(i + 1, n):
40
+ M[i, j] = Dominator.get_relation(F[i, :], F[j, :], CV[i], CV[j])
41
+ M[j, i] = -M[i, j]
42
+
43
+ return M
44
+
45
+ @staticmethod
46
+ def calc_domination_matrix(F, _F=None, epsilon=0.0):
47
+
48
+ if _F is None:
49
+ _F = F
50
+
51
+ # look at the obj for dom
52
+ n = F.shape[0]
53
+ m = _F.shape[0]
54
+
55
+ L = np.repeat(F, m, axis=0)
56
+ R = np.tile(_F, (n, 1))
57
+
58
+ smaller = np.reshape(np.any(L + epsilon < R, axis=1), (n, m))
59
+ larger = np.reshape(np.any(L > R + epsilon, axis=1), (n, m))
60
+
61
+ M = np.logical_and(smaller, np.logical_not(larger)) * 1 \
62
+ + np.logical_and(larger, np.logical_not(smaller)) * -1
63
+
64
+ # if cv equal then look at dom
65
+ # M = constr + (constr == 0) * dom
66
+
67
+ return M
pymoo/util/hv.py ADDED
@@ -0,0 +1,21 @@
1
+ import numpy as np
2
+
3
+ from moocore import hypervolume as _hypervolume
4
+
5
+
6
+ def hv(ref_point, F):
7
+ return _hypervolume(F, ref = ref_point)
8
+
9
+ def calc_hvc_looped(ref_point, F, func=hv):
10
+ hv = func(F, ref_point)
11
+
12
+ hvi = []
13
+
14
+ for k in range(len(F)):
15
+ v = np.full(len(F), True)
16
+ v[k] = False
17
+ _hv = func(F[v], ref_point)
18
+ hvi.append(hv - _hv)
19
+
20
+ hvi = np.array(hvi)
21
+ return hvi
@@ -0,0 +1,39 @@
1
+ def install_matlab():
2
+ print("Please install the Matlab python interface:")
3
+ print("Tutorial: https://www.mathworks.com/help/matlab/matlab_external/install-the-matlab-engine-for-python.html")
4
+ print("---------------------------")
5
+ print("Go to:")
6
+ print("Windows:", 'cd "matlabroot\extern\engines\python"')
7
+ print("Linux/Mac:", 'cd "matlabroot/extern/engines/python"')
8
+ print("python setup.py install")
9
+ print("---------------------------")
10
+
11
+
12
+ class MatlabEngine:
13
+ """
14
+ Launching the Matlab engine can become time-consuming and thus shall only be done once and the instance
15
+ could be reused by different kinds of problems at the same time.
16
+
17
+ This is an implementation based on the singleton pattern where only one instance of the engine is used.
18
+
19
+ """
20
+
21
+ __instance = None
22
+
23
+ @staticmethod
24
+ def get_instance():
25
+ if MatlabEngine.__instance is None:
26
+
27
+ try:
28
+ import matlab
29
+ import matlab.engine
30
+ except:
31
+ print(install_matlab())
32
+
33
+ MatlabEngine.__instance = matlab.engine.start_matlab(option="")
34
+
35
+ return MatlabEngine.__instance
36
+
37
+ @staticmethod
38
+ def shutdown():
39
+ MatlabEngine.__instance.quit()