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/__init__.py ADDED
@@ -0,0 +1,3 @@
1
+ from pymoo.version import __version__
2
+
3
+
File without changes
File without changes
@@ -0,0 +1,38 @@
1
+ from pymoo.core.algorithm import Algorithm
2
+ from pymoo.core.individual import Individual
3
+
4
+
5
+ class BracketSearch(Algorithm):
6
+
7
+ def __init__(self, a=None, b=None, **kwargs):
8
+ super().__init__(**kwargs)
9
+ self.a, self.b = a, b
10
+
11
+ def _setup(self, problem, a=None, b=None, **kwargs):
12
+ msg = "Only problems with one variable, one objective and no constraints can be solved!"
13
+ assert problem.n_var == 1 and not problem.has_constraints() and problem.n_obj == 1, msg
14
+ self.a, self.b = a, b
15
+
16
+ def _initialize_infill(self):
17
+
18
+ # the boundaries of the problem for initialization
19
+ xl, xu = self.problem.bounds()
20
+
21
+ # take care of the lower bound - make sure it is an individual and make sure it is evaluated
22
+ if self.a is None:
23
+ assert xl is not None, "Either provide a left bound or set the xl attribute in the problem."
24
+ self.a = Individual(X=xl)
25
+
26
+ if self.a.F is None:
27
+ self.evaluator.eval(self.problem, self.a, algorithm=self)
28
+
29
+ # take care of the upper bound - make sure it is an individual and make sure it is evaluated
30
+ if self.b is None:
31
+ assert xl is not None, "Either provide a right bound or set the xu attribute in the problem."
32
+ self.b = Individual(X=xu)
33
+
34
+ if self.b.F is None:
35
+ self.evaluator.eval(self.problem, self.b, algorithm=self)
36
+
37
+ assert self.a.X[0] <= self.b.X[0], "The left bound must be smaller than the left bound!"
38
+
@@ -0,0 +1,109 @@
1
+ from pymoo.core.algorithm import Algorithm
2
+ from pymoo.core.duplicate import DefaultDuplicateElimination, NoDuplicateElimination
3
+ from pymoo.core.initialization import Initialization
4
+ from pymoo.core.mating import Mating
5
+ from pymoo.core.population import Population
6
+ from pymoo.core.repair import NoRepair
7
+
8
+
9
+ class GeneticAlgorithm(Algorithm):
10
+
11
+ def __init__(self,
12
+ pop_size=None,
13
+ sampling=None,
14
+ selection=None,
15
+ crossover=None,
16
+ mutation=None,
17
+ survival=None,
18
+ n_offsprings=None,
19
+ eliminate_duplicates=DefaultDuplicateElimination(),
20
+ repair=None,
21
+ mating=None,
22
+ advance_after_initial_infill=False,
23
+ **kwargs
24
+ ):
25
+
26
+ super().__init__(**kwargs)
27
+
28
+ # the population size used
29
+ self.pop_size = pop_size
30
+
31
+ # whether the algorithm should be advanced after initialization of not
32
+ self.advance_after_initial_infill = advance_after_initial_infill
33
+
34
+ # the survival for the genetic algorithm
35
+ self.survival = survival
36
+
37
+ # number of offsprings to generate through recombination
38
+ self.n_offsprings = n_offsprings
39
+
40
+ # if the number of offspring is not set - equal to population size
41
+ if self.n_offsprings is None:
42
+ self.n_offsprings = pop_size
43
+
44
+ # set the duplicate detection class - a boolean value chooses the default duplicate detection
45
+ if isinstance(eliminate_duplicates, bool):
46
+ if eliminate_duplicates:
47
+ self.eliminate_duplicates = DefaultDuplicateElimination()
48
+ else:
49
+ self.eliminate_duplicates = NoDuplicateElimination()
50
+ else:
51
+ self.eliminate_duplicates = eliminate_duplicates
52
+
53
+ # simply set the no repair object if it is None
54
+ self.repair = repair if repair is not None else NoRepair()
55
+
56
+ self.initialization = Initialization(sampling,
57
+ repair=self.repair,
58
+ eliminate_duplicates=self.eliminate_duplicates)
59
+
60
+ if mating is None:
61
+ mating = Mating(selection,
62
+ crossover,
63
+ mutation,
64
+ repair=self.repair,
65
+ eliminate_duplicates=self.eliminate_duplicates,
66
+ n_max_iterations=100)
67
+ self.mating = mating
68
+
69
+ # other run specific data updated whenever solve is called - to share them in all algorithms
70
+ self.n_gen = None
71
+ self.pop = None
72
+ self.off = None
73
+
74
+ def _initialize_infill(self):
75
+ pop = self.initialization.do(self.problem, self.pop_size, algorithm=self)
76
+ return pop
77
+
78
+ def _initialize_advance(self, infills=None, **kwargs):
79
+ if self.advance_after_initial_infill:
80
+ self.pop = self.survival.do(self.problem, infills, n_survive=len(infills), algorithm=self, **kwargs)
81
+
82
+ def _infill(self):
83
+
84
+ # do the mating using the current population
85
+ off = self.mating.do(self.problem, self.pop, self.n_offsprings, algorithm=self)
86
+
87
+ # if the mating could not generate any new offspring (duplicate elimination might make that happen)
88
+ if len(off) == 0:
89
+ self.termination.force_termination = True
90
+ return
91
+
92
+ # if not the desired number of offspring could be created
93
+ elif len(off) < self.n_offsprings:
94
+ if self.verbose:
95
+ print("WARNING: Mating could not produce the required number of (unique) offsprings!")
96
+
97
+ return off
98
+
99
+ def _advance(self, infills=None, **kwargs):
100
+
101
+ # the current population
102
+ pop = self.pop
103
+
104
+ # merge the offsprings with the current population
105
+ if infills is not None:
106
+ pop = Population.merge(self.pop, infills)
107
+
108
+ # execute the survival to find the fittest solutions
109
+ self.pop = self.survival.do(self.problem, pop, n_survive=self.pop_size, algorithm=self, **kwargs)
@@ -0,0 +1,62 @@
1
+ import numpy as np
2
+
3
+ from pymoo.core.algorithm import Algorithm
4
+ from pymoo.core.individual import Individual
5
+ from pymoo.core.meta import Meta
6
+ from pymoo.core.problem import Problem
7
+ from pymoo.operators.repair.to_bound import set_to_bounds_if_outside
8
+
9
+
10
+ class LineSearch(Algorithm):
11
+
12
+ def __init__(self, **kwargs):
13
+ super().__init__(**kwargs)
14
+ self.point, self.direction = None, None
15
+
16
+ def setup(self, problem, point=None, direction=None, **kwargs):
17
+ super().setup(problem, **kwargs)
18
+
19
+ msg = "Only problems with one objective and no constraints can be solved using a line search!"
20
+ assert not problem.has_constraints() and problem.n_obj == 1, msg
21
+
22
+ assert point is not None, "You have to define a starting point for the algorithm"
23
+ self.point = point
24
+
25
+ assert direction is not None, "You have to define a direction point for the algorithm"
26
+ self.direction = direction
27
+
28
+ return self
29
+
30
+ def _initialize_infill(self):
31
+
32
+ # x could be a vector or an individual
33
+ if isinstance(self.point, np.ndarray):
34
+ self.point = Individual(X=self.point)
35
+
36
+ # make sure it is evaluated - if not yet also get the gradient
37
+ if self.point.get("F") is None:
38
+ self.evaluator.eval(self.problem, self.point, algorithm=self)
39
+
40
+ self.infill = self.point
41
+
42
+
43
+ class LineSearchProblem(Meta, Problem):
44
+
45
+ def __init__(self, problem, point, direction, strict_bounds=True, xl=0.0, xu=np.inf):
46
+ super().__init__(problem)
47
+ self.n_var = 1
48
+ self.xl, self.xu = np.array([xl]), np.array([xu])
49
+
50
+ self.point = point
51
+ self.direction = direction
52
+ self.strict_bounds = strict_bounds
53
+
54
+ def _evaluate(self, alpha, out, *args, **kwargs):
55
+ out["alpha"] = alpha
56
+
57
+ x = self.point.X + alpha * self.direction
58
+ if self.strict_bounds:
59
+ x = set_to_bounds_if_outside(x, self.xl, self.xu)
60
+ out["__X__"] = x
61
+
62
+ super()._evaluate(x, out, *args, **kwargs)
@@ -0,0 +1,39 @@
1
+ from pymoo.algorithms.soo.nonconvex.ga import FitnessSurvival
2
+ from pymoo.core.algorithm import Algorithm, LoopwiseAlgorithm
3
+ from pymoo.core.initialization import Initialization
4
+ from pymoo.operators.sampling.lhs import LatinHypercubeSampling
5
+ from pymoo.termination.ftol import SingleObjectiveSpaceTermination
6
+ from pymoo.termination.robust import RobustTermination
7
+ from pymoo.util.display.single import SingleObjectiveOutput
8
+
9
+
10
+ class LocalSearch(LoopwiseAlgorithm, Algorithm):
11
+
12
+ def __init__(self,
13
+ initial=None,
14
+ sampling=LatinHypercubeSampling(),
15
+ output=SingleObjectiveOutput(),
16
+ n_sample_points=20,
17
+ **kwargs):
18
+ super().__init__(output=output, **kwargs)
19
+
20
+ # the default termination if not specified otherwise
21
+ self.termination = RobustTermination(SingleObjectiveSpaceTermination(tol=1e-8), period=10)
22
+
23
+ # the type of initial sampling
24
+ initial = initial if "x0" not in kwargs else kwargs["x0"]
25
+ if initial is not None:
26
+ sampling = initial
27
+
28
+ self.initialization = Initialization(sampling)
29
+
30
+ # the number of sampling points to determine x0
31
+ self.n_sample_points = n_sample_points
32
+
33
+ def _initialize_infill(self):
34
+ return self.initialization.do(self.problem, self.n_sample_points, algorithm=self)
35
+
36
+ def _initialize_advance(self, infills=None, **kwargs):
37
+ self.x0 = FitnessSurvival().do(self.problem, infills, n_survive=1, algorithm=self)[0]
38
+
39
+
@@ -0,0 +1,79 @@
1
+ from copy import deepcopy
2
+ from typing import Any
3
+
4
+ from pymoo.core.algorithm import Algorithm
5
+
6
+
7
+ class MetaAlgorithm:
8
+
9
+ def __new__(cls, algorithm) -> Any:
10
+
11
+
12
+
13
+
14
+ return algorithm
15
+
16
+
17
+ def __init__(self, algorithm) -> None:
18
+ super().__init__()
19
+ self.algorithm = algorithm
20
+
21
+ def __getattr__(self, attr):
22
+ print(attr)
23
+ if attr in self.__dict__:
24
+ return getattr(self, attr)
25
+ return getattr(self.__dict__["algorithm"], attr)
26
+
27
+
28
+ class MetaAlgorithm2(Algorithm):
29
+
30
+ def __init__(self,
31
+ algorithm,
32
+ copy=False,
33
+ ):
34
+ super().__init__()
35
+
36
+ # if the algorithm object should be copied to keep the original one unmodified
37
+ if copy:
38
+ algorithm = deepcopy(algorithm)
39
+
40
+ self.algorithm = algorithm
41
+
42
+ def _copy_from_orig(self):
43
+ for k, v in self.algorithm.__dict__.items():
44
+ if k not in ["opt", "display"]:
45
+ self.__dict__[k] = v
46
+
47
+ def setup(self, *args, **kwargs):
48
+ self.algorithm.setup(*args, **kwargs)
49
+ self._copy_from_orig()
50
+
51
+ self.display = self.algorithm.display
52
+ self.algorithm.display = None
53
+
54
+ self._setup(*args, **kwargs)
55
+
56
+ return self
57
+
58
+ def _infill(self):
59
+ ret = self.algorithm.infill()
60
+ self._copy_from_orig()
61
+ return ret
62
+
63
+ def _initialize_infill(self):
64
+ return self._infill()
65
+
66
+ def _initialize_advance(self, infills=None, **kwargs):
67
+ self.algorithm.advance(infills=infills, **kwargs)
68
+ self._copy_from_orig()
69
+
70
+ def _advance(self, infills=None, **kwargs):
71
+ self.algorithm.advance(infills=infills, **kwargs)
72
+ self._copy_from_orig()
73
+
74
+ def advance(self, infills=None, **kwargs):
75
+ super().advance(infills, **kwargs)
76
+ self._copy_from_orig()
77
+
78
+ def _set_optimum(self):
79
+ self.opt = self.algorithm.opt
@@ -0,0 +1,89 @@
1
+ from copy import deepcopy
2
+
3
+ import numpy as np
4
+
5
+ from pymoo.core.parameters import get_params, flatten, set_params, hierarchical
6
+ from pymoo.core.problem import ElementwiseProblem
7
+ from pymoo.optimize import minimize
8
+
9
+
10
+ def create(algorithm, params):
11
+ algorithm = deepcopy(algorithm)
12
+ set_params(algorithm, hierarchical(params))
13
+ return algorithm
14
+
15
+
16
+ class HyperparameterProblem(ElementwiseProblem):
17
+
18
+ def __init__(self, algorithm, performance, func_create=create, vars=None, **kwargs):
19
+
20
+ # get the parameters from the algorithm object
21
+ if vars is None:
22
+ vars = get_params(algorithm)
23
+
24
+ if isinstance(vars, dict):
25
+ vars = flatten(vars)
26
+
27
+ assert len(vars) > 0, "No hyper-parameters found to optimize."
28
+
29
+ super().__init__(vars=vars, **kwargs)
30
+
31
+ self.algorithm = algorithm
32
+ self.performance = performance
33
+ self.func_create = func_create
34
+
35
+ def _evaluate(self, x, out, *args, **kwargs):
36
+ algorithm = self.func_create(self.algorithm, x)
37
+ v = self.performance(algorithm)
38
+ out.update(v)
39
+
40
+
41
+ class SingleObjectiveSingleRun:
42
+
43
+ def __init__(self, problem, **kwargs):
44
+ super().__init__()
45
+ self.problem = problem
46
+ self.kwargs = kwargs
47
+
48
+ def __call__(self, algorithm):
49
+ ret = minimize(self.problem, algorithm, **self.kwargs)
50
+ return dict(F=ret.F, G=ret.G, H=ret.H)
51
+
52
+
53
+ def stats_single_objective_mean(rets):
54
+ F, G, H = [], [], []
55
+ for ret in rets:
56
+ F.append(ret.F)
57
+ G.append(ret.G)
58
+ H.append(ret.H)
59
+
60
+ F, G, H = np.array(F), np.array(G), np.array(H)
61
+
62
+ return dict(F=F.mean(axis=0), G=G.mean(axis=0), H=H.mean(axis=0))
63
+
64
+
65
+ def stats_avg_nevals(rets):
66
+ return dict(F=np.array([ret.algorithm.evaluator.n_eval for ret in rets]).mean())
67
+
68
+
69
+ class MultiRun:
70
+
71
+ def __init__(self, problem, n_runs=None, seeds=None, func_stats=stats_single_objective_mean, **kwargs):
72
+ super().__init__()
73
+ self.problem = problem
74
+ self.kwargs = kwargs
75
+
76
+ if seeds is None:
77
+ if n_runs is None:
78
+ raise Exception("Either provide number of runs or seeds directly.")
79
+
80
+ seeds = np.random.randint(1, 1000000, size=n_runs)
81
+
82
+ self.seeds = seeds
83
+ self.func_stats = func_stats
84
+
85
+ def __call__(self, algorithm):
86
+ rets = [minimize(self.problem, algorithm, seed=seed, **self.kwargs) for seed in self.seeds]
87
+ out = self.func_stats(rets)
88
+ out["__results__"] = rets
89
+ return out
File without changes