@reicek/neataptic-ts 0.1.21 → 0.1.22

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 (223) hide show
  1. package/.github/agents/boundary-mapper.agent.md +29 -0
  2. package/.github/agents/docs-scout.agent.md +29 -0
  3. package/.github/agents/plan-scout.agent.md +29 -0
  4. package/.github/agents/solid-split.agent.md +138 -0
  5. package/.github/copilot-instructions.md +103 -0
  6. package/package.json +6 -3
  7. package/plans/ES2023 migration +13 -8
  8. package/plans/Evolution_Training_Interoperability_Contracts.md +1 -1
  9. package/plans/Interactive_Examples_and_Learning_Path.md +10 -2
  10. package/plans/Memory_Optimization.md +3 -3
  11. package/plans/README.md +63 -0
  12. package/plans/Roadmap.md +15 -3
  13. package/plans/asciiMaze_SOLID_split.done.md +130 -0
  14. package/plans/flappy_bird_SOLID_split.done.md +67 -0
  15. package/scripts/assets/theme.css +221 -34
  16. package/scripts/copy-examples.mjs +9 -5
  17. package/scripts/export-onnx.mjs +3 -3
  18. package/scripts/generate-bench-tables.mjs +10 -10
  19. package/scripts/generate-bench-tables.ts +10 -10
  20. package/scripts/generate-docs.ts +1415 -449
  21. package/scripts/render-docs-html.ts +15 -8
  22. package/src/README.md +101 -223
  23. package/src/architecture/README.md +57 -185
  24. package/src/architecture/layer/README.md +38 -38
  25. package/src/architecture/network/README.md +33 -31
  26. package/src/architecture/network/activate/README.md +77 -77
  27. package/src/architecture/network/connect/README.md +15 -13
  28. package/src/architecture/network/deterministic/README.md +7 -7
  29. package/src/architecture/network/evolve/README.md +44 -44
  30. package/src/architecture/network/gating/README.md +20 -20
  31. package/src/architecture/network/genetic/README.md +51 -51
  32. package/src/architecture/network/mutate/README.md +97 -97
  33. package/src/architecture/network/onnx/README.md +264 -264
  34. package/src/architecture/network/prune/README.md +39 -39
  35. package/src/architecture/network/remove/README.md +26 -26
  36. package/src/architecture/network/serialize/README.md +56 -56
  37. package/src/architecture/network/slab/README.md +61 -61
  38. package/src/architecture/network/standalone/README.md +24 -24
  39. package/src/architecture/network/stats/README.md +9 -9
  40. package/src/architecture/network/topology/README.md +46 -46
  41. package/src/architecture/network/training/README.md +21 -21
  42. package/src/methods/README.md +9 -87
  43. package/src/multithreading/README.md +8 -77
  44. package/src/multithreading/workers/README.md +2 -2
  45. package/src/multithreading/workers/browser/README.md +0 -6
  46. package/src/multithreading/workers/node/README.md +0 -3
  47. package/src/neat/README.md +562 -568
  48. package/src/utils/README.md +18 -18
  49. package/test/examples/asciiMaze/README.md +59 -59
  50. package/test/examples/asciiMaze/asciiMaze.e2e.test.ts +14 -9
  51. package/test/examples/asciiMaze/browser-entry/README.md +196 -0
  52. package/test/examples/asciiMaze/browser-entry/browser-entry.abort.services.ts +95 -0
  53. package/test/examples/asciiMaze/browser-entry/browser-entry.constants.ts +23 -0
  54. package/test/examples/asciiMaze/browser-entry/browser-entry.curriculum.services.ts +115 -0
  55. package/test/examples/asciiMaze/browser-entry/browser-entry.globals.services.ts +106 -0
  56. package/test/examples/asciiMaze/browser-entry/browser-entry.host.services.ts +157 -0
  57. package/test/examples/asciiMaze/browser-entry/browser-entry.services.ts +14 -0
  58. package/test/examples/asciiMaze/browser-entry/browser-entry.ts +129 -0
  59. package/test/examples/asciiMaze/browser-entry/browser-entry.types.ts +120 -0
  60. package/test/examples/asciiMaze/browser-entry/browser-entry.utils.ts +98 -0
  61. package/test/examples/asciiMaze/browser-entry.ts +10 -576
  62. package/test/examples/asciiMaze/dashboardManager/README.md +276 -0
  63. package/test/examples/asciiMaze/dashboardManager/archive/README.md +16 -0
  64. package/test/examples/asciiMaze/dashboardManager/archive/dashboardManager.archive.services.ts +267 -0
  65. package/test/examples/asciiMaze/dashboardManager/dashboardManager.constants.ts +35 -0
  66. package/test/examples/asciiMaze/dashboardManager/dashboardManager.services.ts +103 -0
  67. package/test/examples/asciiMaze/dashboardManager/dashboardManager.ts +181 -0
  68. package/test/examples/asciiMaze/dashboardManager/dashboardManager.types.ts +267 -0
  69. package/test/examples/asciiMaze/dashboardManager/dashboardManager.utils.ts +254 -0
  70. package/test/examples/asciiMaze/dashboardManager/live/README.md +14 -0
  71. package/test/examples/asciiMaze/dashboardManager/live/dashboardManager.live.services.ts +264 -0
  72. package/test/examples/asciiMaze/dashboardManager/telemetry/README.md +47 -0
  73. package/test/examples/asciiMaze/dashboardManager/telemetry/dashboardManager.telemetry.services.ts +513 -0
  74. package/test/examples/asciiMaze/dashboardManager.ts +13 -2335
  75. package/test/examples/asciiMaze/evolutionEngine/README.md +1058 -0
  76. package/test/examples/asciiMaze/evolutionEngine/curriculumPhase.ts +90 -0
  77. package/test/examples/asciiMaze/evolutionEngine/engineState.constants.ts +36 -0
  78. package/test/examples/asciiMaze/evolutionEngine/engineState.ts +58 -513
  79. package/test/examples/asciiMaze/evolutionEngine/engineState.types.ts +212 -0
  80. package/test/examples/asciiMaze/evolutionEngine/engineState.utils.ts +301 -0
  81. package/test/examples/asciiMaze/evolutionEngine/evolutionEngine.types.ts +445 -0
  82. package/test/examples/asciiMaze/evolutionEngine/evolutionLoop.ts +81 -50
  83. package/test/examples/asciiMaze/evolutionEngine/optionsAndSetup.ts +2 -4
  84. package/test/examples/asciiMaze/evolutionEngine/populationDynamics.ts +17 -33
  85. package/test/examples/asciiMaze/evolutionEngine/populationPruning.ts +1 -1
  86. package/test/examples/asciiMaze/evolutionEngine/rngAndTiming.ts +1 -2
  87. package/test/examples/asciiMaze/evolutionEngine/sampling.ts +1 -1
  88. package/test/examples/asciiMaze/evolutionEngine/scratchPools.ts +2 -5
  89. package/test/examples/asciiMaze/evolutionEngine/setupHelpers.ts +30 -37
  90. package/test/examples/asciiMaze/evolutionEngine/telemetryMetrics.ts +16 -58
  91. package/test/examples/asciiMaze/evolutionEngine/trainingWarmStart.ts +2 -2
  92. package/test/examples/asciiMaze/evolutionEngine.ts +55 -55
  93. package/test/examples/asciiMaze/fitness.ts +2 -2
  94. package/test/examples/asciiMaze/fitness.types.ts +65 -0
  95. package/test/examples/asciiMaze/interfaces.ts +64 -1352
  96. package/test/examples/asciiMaze/mazeMovement/README.md +356 -0
  97. package/test/examples/asciiMaze/mazeMovement/finalization/README.md +49 -0
  98. package/test/examples/asciiMaze/mazeMovement/finalization/mazeMovement.finalization.ts +138 -0
  99. package/test/examples/asciiMaze/mazeMovement/mazeMovement.constants.ts +101 -0
  100. package/test/examples/asciiMaze/mazeMovement/mazeMovement.services.ts +230 -0
  101. package/test/examples/asciiMaze/mazeMovement/mazeMovement.ts +299 -0
  102. package/test/examples/asciiMaze/mazeMovement/mazeMovement.types.ts +185 -0
  103. package/test/examples/asciiMaze/mazeMovement/mazeMovement.utils.ts +153 -0
  104. package/test/examples/asciiMaze/mazeMovement/policy/README.md +91 -0
  105. package/test/examples/asciiMaze/mazeMovement/policy/mazeMovement.policy.ts +467 -0
  106. package/test/examples/asciiMaze/mazeMovement/runtime/README.md +95 -0
  107. package/test/examples/asciiMaze/mazeMovement/runtime/mazeMovement.runtime.ts +354 -0
  108. package/test/examples/asciiMaze/mazeMovement/shaping/README.md +124 -0
  109. package/test/examples/asciiMaze/mazeMovement/shaping/mazeMovement.shaping.ts +459 -0
  110. package/test/examples/asciiMaze/mazeMovement.ts +12 -2978
  111. package/test/examples/flappy_bird/Trace-20260309T191949.json +24124 -0
  112. package/test/examples/flappy_bird/browser-entry/README.md +1129 -0
  113. package/test/examples/flappy_bird/browser-entry/browser-entry.host.utils.ts +4 -324
  114. package/test/examples/flappy_bird/browser-entry/browser-entry.network-view.utils.ts +6 -399
  115. package/test/examples/flappy_bird/browser-entry/browser-entry.playback.utils.ts +1 -717
  116. package/test/examples/flappy_bird/browser-entry/browser-entry.spawn.utils.ts +11 -31
  117. package/test/examples/flappy_bird/browser-entry/browser-entry.visualization.utils.ts +15 -893
  118. package/test/examples/flappy_bird/browser-entry/host/README.md +307 -0
  119. package/test/examples/flappy_bird/browser-entry/host/host.resize.service.ts +1 -295
  120. package/test/examples/flappy_bird/browser-entry/host/host.ts +562 -6
  121. package/test/examples/flappy_bird/browser-entry/host/resize/README.md +274 -0
  122. package/test/examples/flappy_bird/browser-entry/host/resize/host.resize.service.constants.ts +31 -0
  123. package/test/examples/flappy_bird/browser-entry/host/resize/host.resize.service.services.ts +360 -0
  124. package/test/examples/flappy_bird/browser-entry/host/resize/host.resize.service.ts +117 -0
  125. package/test/examples/flappy_bird/browser-entry/host/resize/host.resize.service.types.ts +63 -0
  126. package/test/examples/flappy_bird/browser-entry/host/resize/host.resize.service.utils.ts +250 -0
  127. package/test/examples/flappy_bird/browser-entry/network-view/README.md +399 -0
  128. package/test/examples/flappy_bird/browser-entry/network-view/network-view.topology.utils.ts +255 -0
  129. package/test/examples/flappy_bird/browser-entry/network-view/network-view.ts +802 -7
  130. package/test/examples/flappy_bird/browser-entry/playback/README.md +684 -0
  131. package/test/examples/flappy_bird/browser-entry/playback/background/README.md +277 -0
  132. package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/README.md +770 -0
  133. package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/playback.background.ground-grid.cache.services.ts +178 -0
  134. package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/playback.background.ground-grid.constants.ts +107 -0
  135. package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/playback.background.ground-grid.geometry.utils.ts +518 -0
  136. package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/playback.background.ground-grid.math.utils.ts +117 -0
  137. package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/playback.background.ground-grid.pulse.utils.ts +233 -0
  138. package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/playback.background.ground-grid.services.ts +211 -0
  139. package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/playback.background.ground-grid.ts +48 -0
  140. package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/playback.background.ground-grid.types.ts +212 -0
  141. package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/playback.background.ground-grid.utils.ts +81 -0
  142. package/test/examples/flappy_bird/browser-entry/playback/background/playback.background.cache.services.ts +96 -0
  143. package/test/examples/flappy_bird/browser-entry/playback/background/playback.background.constants.ts +62 -0
  144. package/test/examples/flappy_bird/browser-entry/playback/background/playback.background.services.ts +244 -0
  145. package/test/examples/flappy_bird/browser-entry/playback/background/playback.background.ts +53 -0
  146. package/test/examples/flappy_bird/browser-entry/playback/background/playback.background.types.ts +68 -0
  147. package/test/examples/flappy_bird/browser-entry/playback/background/playback.background.utils.ts +100 -0
  148. package/test/examples/flappy_bird/browser-entry/playback/frame-render/README.md +310 -0
  149. package/test/examples/flappy_bird/browser-entry/playback/frame-render/playback.frame-render.service.ts +92 -0
  150. package/test/examples/flappy_bird/browser-entry/playback/frame-render/playback.frame-render.services.ts +272 -0
  151. package/test/examples/flappy_bird/browser-entry/playback/frame-render/playback.frame-render.types.ts +39 -0
  152. package/test/examples/flappy_bird/browser-entry/playback/frame-render/playback.frame-render.utils.ts +493 -0
  153. package/test/examples/flappy_bird/browser-entry/playback/playback.constants.ts +1 -1
  154. package/test/examples/flappy_bird/browser-entry/playback/playback.frame-render.service.ts +4 -0
  155. package/test/examples/flappy_bird/browser-entry/playback/playback.snapshot.utils.ts +44 -0
  156. package/test/examples/flappy_bird/browser-entry/playback/playback.starfield.service.ts +39 -122
  157. package/test/examples/flappy_bird/browser-entry/playback/playback.starfield.services.ts +272 -0
  158. package/test/examples/flappy_bird/browser-entry/playback/playback.starfield.types.ts +62 -0
  159. package/test/examples/flappy_bird/browser-entry/playback/playback.starfield.utils.ts +11 -4
  160. package/test/examples/flappy_bird/browser-entry/playback/playback.ts +409 -8
  161. package/test/examples/flappy_bird/browser-entry/playback/playback.types.ts +4 -12
  162. package/test/examples/flappy_bird/browser-entry/runtime/README.md +235 -0
  163. package/test/examples/flappy_bird/browser-entry/runtime/runtime.evolution-launch.service.ts +45 -0
  164. package/test/examples/flappy_bird/browser-entry/runtime/runtime.lifecycle.service.ts +81 -0
  165. package/test/examples/flappy_bird/browser-entry/runtime/runtime.startup.service.ts +74 -0
  166. package/test/examples/flappy_bird/browser-entry/runtime/runtime.ts +31 -121
  167. package/test/examples/flappy_bird/browser-entry/runtime/runtime.types.ts +36 -0
  168. package/test/examples/flappy_bird/browser-entry/visualization/README.md +557 -0
  169. package/test/examples/flappy_bird/browser-entry/visualization/visualization.constants.ts +110 -0
  170. package/test/examples/flappy_bird/browser-entry/visualization/visualization.draw.service.ts +957 -19
  171. package/test/examples/flappy_bird/browser-entry/visualization/visualization.legend.utils.ts +138 -3
  172. package/test/examples/flappy_bird/browser-entry/visualization/visualization.topology.utils.ts +3 -27
  173. package/test/examples/flappy_bird/browser-entry/visualization/visualization.ts +1 -23
  174. package/test/examples/flappy_bird/browser-entry/worker-channel/README.md +156 -0
  175. package/test/examples/flappy_bird/constants/README.md +1179 -0
  176. package/test/examples/flappy_bird/constants/constants.network-view.ts +24 -0
  177. package/test/examples/flappy_bird/constants/constants.palette.ts +7 -0
  178. package/test/examples/flappy_bird/constants/constants.starfield.ts +78 -3
  179. package/test/examples/flappy_bird/environment/README.md +143 -0
  180. package/test/examples/flappy_bird/environment/environment.observation.utils.ts +1 -19
  181. package/test/examples/flappy_bird/environment/environment.step.service.ts +3 -66
  182. package/test/examples/flappy_bird/evaluation/README.md +130 -0
  183. package/test/examples/flappy_bird/evaluation/evaluation.fitness.utils.ts +1 -1
  184. package/test/examples/flappy_bird/evaluation/evaluation.rollout.service.ts +5 -375
  185. package/test/examples/flappy_bird/evaluation/rollout/README.md +291 -0
  186. package/test/examples/flappy_bird/evaluation/rollout/evaluation.rollout.constants.ts +30 -0
  187. package/test/examples/flappy_bird/evaluation/rollout/evaluation.rollout.service.ts +58 -0
  188. package/test/examples/flappy_bird/evaluation/rollout/evaluation.rollout.services.ts +310 -0
  189. package/test/examples/flappy_bird/evaluation/rollout/evaluation.rollout.types.ts +56 -0
  190. package/test/examples/flappy_bird/evaluation/rollout/evaluation.rollout.utils.ts +368 -0
  191. package/test/examples/flappy_bird/flappy-evolution-worker/README.md +618 -0
  192. package/test/examples/flappy_bird/flappy-evolution-worker/flappy-evolution-worker.playback.service.ts +7 -7
  193. package/test/examples/flappy_bird/flappy-evolution-worker/flappy-evolution-worker.simulation.frame.service.ts +364 -0
  194. package/test/examples/flappy_bird/flappy-evolution-worker/flappy-evolution-worker.simulation.types.ts +14 -0
  195. package/test/examples/flappy_bird/flappy-evolution-worker/flappy-evolution-worker.simulation.utils.ts +4 -201
  196. package/test/examples/flappy_bird/flappy-evolution-worker/flappy-evolution-worker.ts +184 -345
  197. package/test/examples/flappy_bird/flappy-evolution-worker/flappy-evolution-worker.warm-start.service.ts +291 -0
  198. package/test/examples/flappy_bird/flappy.simulation.shared.utils.ts +5 -0
  199. package/test/examples/flappy_bird/simulation-shared/README.md +417 -0
  200. package/test/examples/flappy_bird/simulation-shared/observation/README.md +183 -0
  201. package/test/examples/flappy_bird/simulation-shared/observation/observation.features.utils.ts +301 -0
  202. package/test/examples/flappy_bird/simulation-shared/observation/observation.ts +9 -0
  203. package/test/examples/flappy_bird/simulation-shared/observation/observation.vector.utils.ts +59 -0
  204. package/test/examples/flappy_bird/simulation-shared/simulation-shared.observation.utils.ts +5 -403
  205. package/test/examples/flappy_bird/simulation-shared/simulation-shared.spawn.utils.ts +20 -6
  206. package/test/examples/flappy_bird/{evaluation/evaluation.statistics.utils.ts → simulation-shared/simulation-shared.statistics.utils.ts} +23 -8
  207. package/test/examples/flappy_bird/trainer/README.md +563 -0
  208. package/test/examples/flappy_bird/trainer/evaluation/README.md +199 -0
  209. package/test/examples/flappy_bird/trainer/evaluation/trainer.evaluation.service.constants.ts +9 -0
  210. package/test/examples/flappy_bird/trainer/evaluation/trainer.evaluation.service.services.ts +73 -0
  211. package/test/examples/flappy_bird/trainer/evaluation/trainer.evaluation.service.ts +165 -0
  212. package/test/examples/flappy_bird/trainer/evaluation/trainer.evaluation.service.types.ts +25 -0
  213. package/test/examples/flappy_bird/trainer/evaluation/trainer.evaluation.service.utils.ts +161 -0
  214. package/test/examples/flappy_bird/trainer/trainer.evaluation.service.ts +13 -0
  215. package/test/examples/flappy_bird/trainer/trainer.report.service.services.ts +181 -0
  216. package/test/examples/flappy_bird/trainer/trainer.report.service.ts +126 -0
  217. package/test/examples/flappy_bird/trainer/trainer.selection.utils.ts +89 -0
  218. package/test/examples/flappy_bird/trainer/trainer.ts +11 -553
  219. package/test/examples/flappy_bird/browser-entry/browser-entry.utils.ts +0 -12
  220. package/test/examples/flappy_bird/environment/environment.ts +0 -7
  221. package/test/examples/flappy_bird/evaluation/evaluation.ts +0 -7
  222. package/test/examples/flappy_bird/simulation-shared/simulation-shared.ts +0 -15
  223. package/test/examples/flappy_bird/trainer/trainer.statistics.utils.ts +0 -78
@@ -1,37 +1,20 @@
1
1
  import { pathToFileURL } from 'node:url';
2
- import {
3
- evaluateFlappyFitnessAcrossSeeds,
4
- rolloutEpisode,
5
- type FlappyRolloutOptions,
6
- type FlappySeedBatchEvaluation,
7
- } from '../flappyEvaluation';
2
+ import { rolloutEpisode } from '../flappyEvaluation';
8
3
  import type {
9
- FlappyGenerationEvaluationPlan,
10
- FlappyGenerationReport,
11
4
  FlappyTrainerNetwork,
12
5
  FlappyTrainerRuntimeState,
13
6
  FlappyTrainerSetup,
14
- ScoredGenomeEntry,
15
7
  } from './trainer.types';
16
8
  import {
17
9
  FLAPPY_TRAINER_DEFAULT_RNG_SEED,
18
- FLAPPY_TRAINER_DUMMY_FLAP_OUTPUT,
19
- FLAPPY_TRAINER_DUMMY_NETWORK_ID,
20
- FLAPPY_TRAINER_DUMMY_NO_FLAP_OUTPUT,
21
- FLAPPY_TRAINER_FRAME_PRIMARY_BASE_SCORE,
22
- FLAPPY_TRAINER_FRAME_PRIMARY_PIPE_WEIGHT,
23
- FLAPPY_TRAINER_FRAME_PRIMARY_SURVIVAL_WEIGHT,
24
- FLAPPY_TRAINER_FRAME_STABILITY_STDDEV_WEIGHT,
25
- FLAPPY_TRAINER_FULL_PASS_ELITISM_MULTIPLIER,
26
- FLAPPY_TRAINER_FULL_PASS_POPULATION_FRACTION,
27
- FLAPPY_TRAINER_LOG_PARTS_DELIMITER,
28
- FLAPPY_TRAINER_PIPE_FALLBACK_PIPE_WEIGHT,
29
- FLAPPY_TRAINER_PIPE_FILTER_TOLERANCE,
30
- FLAPPY_TRAINER_REEVALUATION_MIN_CANDIDATE_COUNT,
31
- FLAPPY_TRAINER_SCORE_MEDIAN_PERCENTILE,
32
- FLAPPY_TRAINER_SCORE_P90_PERCENTILE,
33
10
  FLAPPY_TRAINER_STOPPED_MESSAGE,
34
11
  } from './trainer.constants';
12
+ import {
13
+ commitPopulationScores,
14
+ evaluatePopulationFullStage,
15
+ evaluatePopulationQuickStage,
16
+ evaluatePopulationReevaluationStage,
17
+ } from './trainer.evaluation.service';
35
18
  import { formatTrainerErrorMessage } from './trainer.errors';
36
19
  import { resolveGenerationEvaluationPlan } from './trainer.evaluation-plan.utils';
37
20
  import {
@@ -40,14 +23,12 @@ import {
40
23
  createTrainerSetup,
41
24
  } from './trainer.setup.service';
42
25
  import { attachPopulationFitnessEvaluator } from './trainer.fitness.service';
43
- import { buildGenerationLogParts } from './trainer.reporting.utils';
44
26
  import { runTrainerEvolutionLoop } from './trainer.loop.service';
45
- import { registerTrainerStopSignals } from './trainer.signals.service';
46
27
  import {
47
- computeMean,
48
- computePercentile,
49
- computePopulationStandardDeviation,
50
- } from './trainer.statistics.utils';
28
+ buildGenerationReport,
29
+ logGenerationSummary,
30
+ } from './trainer.report.service';
31
+ import { registerTrainerStopSignals } from './trainer.signals.service';
51
32
 
52
33
  /**
53
34
  * Flappy Bird neuroevolution demo.
@@ -90,529 +71,6 @@ export async function runTrainer(): Promise<void> {
90
71
  console.log(FLAPPY_TRAINER_STOPPED_MESSAGE);
91
72
  }
92
73
 
93
- /**
94
- * Executes quick evaluation stage over the full population.
95
- */
96
- function evaluatePopulationQuickStage(
97
- population: readonly FlappyTrainerNetwork[],
98
- generationEvaluationPlan: FlappyGenerationEvaluationPlan,
99
- aggregateByGenome: Map<FlappyTrainerNetwork, FlappySeedBatchEvaluation>,
100
- provisionalScoresByGenome: Map<FlappyTrainerNetwork, number>,
101
- ): void {
102
- evaluateSpecificGenomesAcrossSeeds(
103
- population,
104
- generationEvaluationPlan.quickSeeds,
105
- generationEvaluationPlan.quickRolloutOptions,
106
- aggregateByGenome,
107
- );
108
-
109
- assignFramePrimaryScores(
110
- population,
111
- aggregateByGenome,
112
- provisionalScoresByGenome,
113
- );
114
- }
115
-
116
- /**
117
- * Executes full evaluation stage over top provisional candidates.
118
- */
119
- function evaluatePopulationFullStage(
120
- population: readonly FlappyTrainerNetwork[],
121
- generationEvaluationPlan: FlappyGenerationEvaluationPlan,
122
- aggregateByGenome: Map<FlappyTrainerNetwork, FlappySeedBatchEvaluation>,
123
- provisionalScoresByGenome: Map<FlappyTrainerNetwork, number>,
124
- elitismCount: number,
125
- ): void {
126
- const fullPassCandidateCount = resolveFullPassCandidateCount(
127
- population.length,
128
- elitismCount,
129
- );
130
- const fullPassCandidates = selectTopGenomesByScore(
131
- population,
132
- provisionalScoresByGenome,
133
- fullPassCandidateCount,
134
- );
135
-
136
- evaluateSpecificGenomesAcrossSeeds(
137
- fullPassCandidates,
138
- generationEvaluationPlan.fullSeeds,
139
- generationEvaluationPlan.fullRolloutOptions,
140
- aggregateByGenome,
141
- );
142
-
143
- assignFramePrimaryScores(
144
- population,
145
- aggregateByGenome,
146
- provisionalScoresByGenome,
147
- );
148
- }
149
-
150
- /**
151
- * Executes large-seed reevaluation stage over top candidates.
152
- */
153
- function evaluatePopulationReevaluationStage(
154
- population: readonly FlappyTrainerNetwork[],
155
- generationEvaluationPlan: FlappyGenerationEvaluationPlan,
156
- aggregateByGenome: Map<FlappyTrainerNetwork, FlappySeedBatchEvaluation>,
157
- provisionalScoresByGenome: Map<FlappyTrainerNetwork, number>,
158
- elitismCount: number,
159
- ): void {
160
- const reevaluationCount = Math.max(
161
- elitismCount,
162
- FLAPPY_TRAINER_REEVALUATION_MIN_CANDIDATE_COUNT,
163
- );
164
- const reevaluationCandidates = selectTopGenomesByScore(
165
- population,
166
- provisionalScoresByGenome,
167
- reevaluationCount,
168
- );
169
-
170
- evaluateSpecificGenomesAcrossSeeds(
171
- reevaluationCandidates,
172
- generationEvaluationPlan.reevaluationSeeds,
173
- generationEvaluationPlan.reevaluationRolloutOptions,
174
- aggregateByGenome,
175
- );
176
-
177
- assignFramePrimaryScores(
178
- population,
179
- aggregateByGenome,
180
- provisionalScoresByGenome,
181
- );
182
- }
183
-
184
- /**
185
- * Evaluates a specific genome set across a shared seed batch.
186
- */
187
- function evaluateSpecificGenomesAcrossSeeds(
188
- genomes: readonly FlappyTrainerNetwork[],
189
- sharedSeeds: readonly number[],
190
- rolloutOptions: FlappyRolloutOptions,
191
- aggregateByGenome: Map<FlappyTrainerNetwork, FlappySeedBatchEvaluation>,
192
- ): void {
193
- for (const genome of genomes) {
194
- const aggregate = evaluateFlappyFitnessAcrossSeeds(
195
- genome,
196
- sharedSeeds,
197
- rolloutOptions,
198
- );
199
- aggregateByGenome.set(genome, aggregate);
200
- }
201
- }
202
-
203
- /**
204
- * Commits provisional scores to genome `.score` fields.
205
- */
206
- function commitPopulationScores(
207
- population: readonly FlappyTrainerNetwork[],
208
- provisionalScoresByGenome: ReadonlyMap<FlappyTrainerNetwork, number>,
209
- ): void {
210
- for (const genome of population) {
211
- genome.score =
212
- provisionalScoresByGenome.get(genome) ?? Number.NEGATIVE_INFINITY;
213
- }
214
- }
215
-
216
- /**
217
- * Builds compact report for current generation.
218
- */
219
- function buildGenerationReport(
220
- population: readonly FlappyTrainerNetwork[],
221
- aggregateByGenome: ReadonlyMap<
222
- FlappyTrainerNetwork,
223
- FlappySeedBatchEvaluation
224
- >,
225
- generationEvaluationPlan: FlappyGenerationEvaluationPlan,
226
- ): FlappyGenerationReport {
227
- const finalScores = collectFiniteGenomeScores(population);
228
- const scoreMean = computeMean(finalScores);
229
- const scoreStdDev = computePopulationStandardDeviation(
230
- finalScores,
231
- scoreMean,
232
- );
233
- const bestGenome = resolveBestGenomeByScore(population);
234
- const bestAggregate = resolveBestAggregate(
235
- population,
236
- bestGenome,
237
- aggregateByGenome,
238
- generationEvaluationPlan.reevaluationSeeds,
239
- generationEvaluationPlan.reevaluationRolloutOptions,
240
- );
241
- const bestEpisode = resolveBestEpisode(
242
- population,
243
- bestGenome,
244
- generationEvaluationPlan.reevaluationSeeds,
245
- generationEvaluationPlan.reevaluationRolloutOptions,
246
- );
247
-
248
- return {
249
- generationIndex: generationEvaluationPlan.generationIndex,
250
- difficultyScale: generationEvaluationPlan.difficultyScale,
251
- mutationRate: generationEvaluationPlan.mutationRate,
252
- mutationAmount: generationEvaluationPlan.mutationAmount,
253
- quickSeedCount: generationEvaluationPlan.quickSeeds.length,
254
- fullSeedCount: generationEvaluationPlan.fullSeeds.length,
255
- reevaluationSeedCount: generationEvaluationPlan.reevaluationSeeds.length,
256
- evaluatedPopulationSize: population.length,
257
- scoreMean,
258
- scoreMedian: computePercentile(
259
- finalScores,
260
- FLAPPY_TRAINER_SCORE_MEDIAN_PERCENTILE,
261
- ),
262
- scoreP90: computePercentile(
263
- finalScores,
264
- FLAPPY_TRAINER_SCORE_P90_PERCENTILE,
265
- ),
266
- scoreStdDev,
267
- bestRobustFitness: bestGenome?.score ?? Number.NaN,
268
- bestMeanFitness: bestAggregate.meanFitness,
269
- bestPipesPassed: bestEpisode.pipesPassed,
270
- bestFramesSurvived: bestEpisode.framesSurvived,
271
- };
272
- }
273
-
274
- /**
275
- * Collects finite genome scores from population.
276
- */
277
- function collectFiniteGenomeScores(
278
- population: readonly FlappyTrainerNetwork[],
279
- ): number[] {
280
- const finiteScores: number[] = [];
281
-
282
- for (const genome of population) {
283
- const genomeScore = genome.score ?? Number.NEGATIVE_INFINITY;
284
- if (Number.isFinite(genomeScore)) {
285
- finiteScores.push(genomeScore);
286
- }
287
- }
288
-
289
- return finiteScores;
290
- }
291
-
292
- /**
293
- * Resolves the best genome by current score.
294
- */
295
- function resolveBestGenomeByScore(
296
- population: readonly FlappyTrainerNetwork[],
297
- ): FlappyTrainerNetwork | undefined {
298
- const scoredGenomes = buildScoredGenomeEntries(population, undefined);
299
- scoredGenomes.sort(compareScoredGenomeEntriesDescending);
300
- return scoredGenomes[0]?.genome;
301
- }
302
-
303
- /**
304
- * Resolves aggregate for the selected best genome.
305
- */
306
- function resolveBestAggregate(
307
- population: readonly FlappyTrainerNetwork[],
308
- bestGenome: FlappyTrainerNetwork | undefined,
309
- aggregateByGenome: ReadonlyMap<
310
- FlappyTrainerNetwork,
311
- FlappySeedBatchEvaluation
312
- >,
313
- fallbackSeeds: readonly number[],
314
- fallbackRolloutOptions: FlappyRolloutOptions,
315
- ): FlappySeedBatchEvaluation {
316
- const fallbackGenome = resolveFallbackGenome(population, bestGenome);
317
- if (!fallbackGenome) {
318
- return buildEmptySeedBatchEvaluation();
319
- }
320
-
321
- const cachedAggregate = aggregateByGenome.get(fallbackGenome);
322
- if (cachedAggregate) {
323
- return cachedAggregate;
324
- }
325
-
326
- return evaluateFlappyFitnessAcrossSeeds(
327
- fallbackGenome,
328
- fallbackSeeds,
329
- fallbackRolloutOptions,
330
- );
331
- }
332
-
333
- /**
334
- * Resolves one representative episode for the selected best genome.
335
- */
336
- function resolveBestEpisode(
337
- population: readonly FlappyTrainerNetwork[],
338
- bestGenome: FlappyTrainerNetwork | undefined,
339
- fallbackSeeds: readonly number[],
340
- fallbackRolloutOptions: FlappyRolloutOptions,
341
- ): ReturnType<typeof rolloutEpisode> {
342
- const fallbackGenome = resolveFallbackGenome(population, bestGenome);
343
- if (!fallbackGenome) {
344
- return rolloutEpisode(resolveDummyNetwork(), fallbackRolloutOptions);
345
- }
346
-
347
- const episodeSeed = fallbackSeeds[0];
348
- return rolloutEpisode(fallbackGenome, {
349
- ...fallbackRolloutOptions,
350
- seed: episodeSeed,
351
- });
352
- }
353
-
354
- /**
355
- * Picks the best genome when available, else falls back to the first genome.
356
- */
357
- function resolveFallbackGenome(
358
- population: readonly FlappyTrainerNetwork[],
359
- bestGenome: FlappyTrainerNetwork | undefined,
360
- ): FlappyTrainerNetwork | undefined {
361
- return bestGenome ?? population[0];
362
- }
363
-
364
- /**
365
- * Builds empty aggregate object for defensive fallback paths.
366
- */
367
- function buildEmptySeedBatchEvaluation(): FlappySeedBatchEvaluation {
368
- return {
369
- seedCount: 0,
370
- meanFitness: 0,
371
- medianFitness: 0,
372
- p90Fitness: 0,
373
- fitnessStdDev: 0,
374
- robustFitness: 0,
375
- meanPipesPassed: 0,
376
- meanFramesSurvived: 0,
377
- };
378
- }
379
-
380
- /**
381
- * Builds a minimal dummy network used only by fallback episode path.
382
- */
383
- function resolveDummyNetwork(): FlappyTrainerNetwork {
384
- return {
385
- activate: activateWithoutFlap,
386
- _id: FLAPPY_TRAINER_DUMMY_NETWORK_ID,
387
- };
388
- }
389
-
390
- /**
391
- * Dummy network activation used by fallback code paths.
392
- */
393
- function activateWithoutFlap(): number[] {
394
- return [
395
- FLAPPY_TRAINER_DUMMY_NO_FLAP_OUTPUT,
396
- FLAPPY_TRAINER_DUMMY_FLAP_OUTPUT,
397
- ];
398
- }
399
-
400
- /**
401
- * Emits one compact generation log line.
402
- */
403
- function logGenerationSummary(
404
- generationLabel: number,
405
- mutationSchedule: { mutationRate: number; mutationAmount: number },
406
- report: FlappyGenerationReport | undefined,
407
- fittestGenome: FlappyTrainerNetwork,
408
- fallbackEpisode: ReturnType<typeof rolloutEpisode>,
409
- ): void {
410
- const bestFitness =
411
- report?.bestRobustFitness ??
412
- (fittestGenome.score as number) ??
413
- fallbackEpisode.fitness;
414
- const bestPipesPassed =
415
- report?.bestPipesPassed ?? fallbackEpisode.pipesPassed;
416
- const bestFramesSurvived =
417
- report?.bestFramesSurvived ?? fallbackEpisode.framesSurvived;
418
-
419
- const logParts = buildGenerationLogParts(
420
- generationLabel,
421
- bestFitness,
422
- bestPipesPassed,
423
- bestFramesSurvived,
424
- report,
425
- mutationSchedule,
426
- );
427
-
428
- // eslint-disable-next-line no-console
429
- console.log(logParts.join(FLAPPY_TRAINER_LOG_PARTS_DELIMITER));
430
- }
431
-
432
- /**
433
- * Rebuild provisional scores using frame-primary ranking with a pipe filter.
434
- */
435
- function assignFramePrimaryScores(
436
- population: readonly FlappyTrainerNetwork[],
437
- aggregateByGenome: ReadonlyMap<
438
- FlappyTrainerNetwork,
439
- FlappySeedBatchEvaluation
440
- >,
441
- provisionalScoresByGenome: Map<FlappyTrainerNetwork, number>,
442
- ): void {
443
- const aggregateValues = collectAggregateValues(population, aggregateByGenome);
444
- const maxMeanPipesPassed = resolveMaxMeanPipesPassed(aggregateValues);
445
-
446
- for (const genome of population) {
447
- const aggregate = aggregateByGenome.get(genome);
448
- if (!aggregate) {
449
- provisionalScoresByGenome.set(genome, Number.NEGATIVE_INFINITY);
450
- continue;
451
- }
452
-
453
- provisionalScoresByGenome.set(
454
- genome,
455
- scoreAggregateFramePrimary(aggregate, maxMeanPipesPassed),
456
- );
457
- }
458
- }
459
-
460
- /**
461
- * Collects present aggregate values in population order.
462
- */
463
- function collectAggregateValues(
464
- population: readonly FlappyTrainerNetwork[],
465
- aggregateByGenome: ReadonlyMap<
466
- FlappyTrainerNetwork,
467
- FlappySeedBatchEvaluation
468
- >,
469
- ): FlappySeedBatchEvaluation[] {
470
- const aggregateValues: FlappySeedBatchEvaluation[] = [];
471
-
472
- for (const genome of population) {
473
- const aggregate = aggregateByGenome.get(genome);
474
- if (aggregate) {
475
- aggregateValues.push(aggregate);
476
- }
477
- }
478
-
479
- return aggregateValues;
480
- }
481
-
482
- /**
483
- * Resolves best mean pipe progress across aggregates.
484
- */
485
- function resolveMaxMeanPipesPassed(
486
- aggregateValues: readonly FlappySeedBatchEvaluation[],
487
- ): number {
488
- return aggregateValues.reduce(function resolveBest(
489
- bestPipeProgress,
490
- aggregate,
491
- ): number {
492
- return Math.max(bestPipeProgress, aggregate.meanPipesPassed);
493
- }, 0);
494
- }
495
-
496
- /**
497
- * Score one aggregate with pipes as filter and frames as primary objective.
498
- */
499
- function scoreAggregateFramePrimary(
500
- aggregate: FlappySeedBatchEvaluation,
501
- maxMeanPipesPassed: number,
502
- ): number {
503
- const frameStabilityPenalty =
504
- aggregate.fitnessStdDev * FLAPPY_TRAINER_FRAME_STABILITY_STDDEV_WEIGHT;
505
- const passesPipeFilter =
506
- aggregate.meanPipesPassed >=
507
- maxMeanPipesPassed - FLAPPY_TRAINER_PIPE_FILTER_TOLERANCE;
508
-
509
- if (passesPipeFilter) {
510
- return (
511
- FLAPPY_TRAINER_FRAME_PRIMARY_BASE_SCORE +
512
- aggregate.meanFramesSurvived *
513
- FLAPPY_TRAINER_FRAME_PRIMARY_SURVIVAL_WEIGHT +
514
- aggregate.meanPipesPassed * FLAPPY_TRAINER_FRAME_PRIMARY_PIPE_WEIGHT -
515
- frameStabilityPenalty
516
- );
517
- }
518
-
519
- return (
520
- aggregate.meanPipesPassed * FLAPPY_TRAINER_PIPE_FALLBACK_PIPE_WEIGHT +
521
- aggregate.meanFramesSurvived -
522
- frameStabilityPenalty
523
- );
524
- }
525
-
526
- /**
527
- * Resolves full-stage candidate count from population and elitism.
528
- */
529
- function resolveFullPassCandidateCount(
530
- populationSize: number,
531
- elitismCount: number,
532
- ): number {
533
- return Math.max(
534
- elitismCount * FLAPPY_TRAINER_FULL_PASS_ELITISM_MULTIPLIER,
535
- Math.floor(populationSize * FLAPPY_TRAINER_FULL_PASS_POPULATION_FRACTION),
536
- );
537
- }
538
-
539
- /**
540
- * Returns top genomes ordered by current provisional score.
541
- */
542
- function selectTopGenomesByScore(
543
- population: readonly FlappyTrainerNetwork[],
544
- provisionalScoresByGenome: ReadonlyMap<FlappyTrainerNetwork, number>,
545
- targetCount: number,
546
- ): FlappyTrainerNetwork[] {
547
- const scoredEntries = buildScoredGenomeEntries(
548
- population,
549
- provisionalScoresByGenome,
550
- );
551
-
552
- scoredEntries.sort(compareScoredGenomeEntriesDescending);
553
-
554
- const selectedGenomes: FlappyTrainerNetwork[] = [];
555
- const maxSelectionCount = Math.max(
556
- 0,
557
- Math.min(targetCount, scoredEntries.length),
558
- );
559
-
560
- let selectedIndex = 0;
561
- while (selectedIndex < maxSelectionCount) {
562
- const scoredEntry = scoredEntries[selectedIndex];
563
- if (scoredEntry) {
564
- selectedGenomes.push(scoredEntry.genome);
565
- }
566
- selectedIndex++;
567
- }
568
-
569
- return selectedGenomes;
570
- }
571
-
572
- /**
573
- * Builds sortable scored entries from genomes.
574
- */
575
- function buildScoredGenomeEntries(
576
- population: readonly FlappyTrainerNetwork[],
577
- provisionalScoresByGenome:
578
- | ReadonlyMap<FlappyTrainerNetwork, number>
579
- | undefined,
580
- ): ScoredGenomeEntry[] {
581
- const scoredEntries: ScoredGenomeEntry[] = [];
582
-
583
- for (const genome of population) {
584
- const score = resolveGenomeScore(genome, provisionalScoresByGenome);
585
- scoredEntries.push({ genome, score });
586
- }
587
-
588
- return scoredEntries;
589
- }
590
-
591
- /**
592
- * Resolves genome score either from map or direct genome field.
593
- */
594
- function resolveGenomeScore(
595
- genome: FlappyTrainerNetwork,
596
- provisionalScoresByGenome:
597
- | ReadonlyMap<FlappyTrainerNetwork, number>
598
- | undefined,
599
- ): number {
600
- if (provisionalScoresByGenome) {
601
- return provisionalScoresByGenome.get(genome) ?? Number.NEGATIVE_INFINITY;
602
- }
603
- return genome.score ?? Number.NEGATIVE_INFINITY;
604
- }
605
-
606
- /**
607
- * Sort comparator for scored genome entries (descending by score).
608
- */
609
- function compareScoredGenomeEntriesDescending(
610
- leftEntry: ScoredGenomeEntry,
611
- rightEntry: ScoredGenomeEntry,
612
- ): number {
613
- return rightEntry.score - leftEntry.score;
614
- }
615
-
616
74
  /**
617
75
  * Handles fatal `main` rejection path.
618
76
  */
@@ -1,12 +0,0 @@
1
- export * from './browser-entry.math.utils';
2
- export * from './browser-entry.host.utils';
3
- export * from './browser-entry.network-view.utils';
4
- export * from './browser-entry.observation.utils';
5
- export * from './browser-entry.playback.utils';
6
- export * from './browser-entry.spawn.utils';
7
- export * from './browser-entry.stats.utils';
8
- export * from './browser-entry.telemetry.utils';
9
- export * from './browser-entry.text-frame.utils';
10
- export * from './browser-entry.viewport.utils';
11
- export * from './browser-entry.visualization.utils';
12
- export * from './browser-entry.worker-channel.utils';
@@ -1,7 +0,0 @@
1
- /**
2
- * Environment domain public entry.
3
- *
4
- * This compatibility façade re-exports the current environment implementation
5
- * while `flappyEnvironment.ts` is decomposed into focused environment modules.
6
- */
7
- export * from '../flappyEnvironment';
@@ -1,7 +0,0 @@
1
- /**
2
- * Evaluation domain public entry.
3
- *
4
- * This compatibility façade re-exports the current evaluation implementation
5
- * while `flappyEvaluation.ts` is decomposed into focused evaluation modules.
6
- */
7
- export * from '../flappyEvaluation';
@@ -1,15 +0,0 @@
1
- /**
2
- * Shared simulation public entry.
3
- *
4
- * This compatibility façade re-exports shared simulation utilities while
5
- * `flappy.simulation.shared.utils.ts` is decomposed into focused modules.
6
- */
7
- export * from './simulation-shared.constants';
8
- export * from './simulation-shared.control.utils';
9
- export * from './simulation-shared.difficulty.utils';
10
- export * from './simulation-shared.errors';
11
- export * from './simulation-shared.math.utils';
12
- export * from './simulation-shared.memory.utils';
13
- export * from './simulation-shared.observation.utils';
14
- export * from './simulation-shared.spawn.utils';
15
- export * from './simulation-shared.types';
@@ -1,78 +0,0 @@
1
- import { clampValue } from '../flappy.simulation.shared.utils';
2
-
3
- /**
4
- * Computes the arithmetic mean of numeric samples.
5
- *
6
- * @param values - Numeric samples.
7
- * @returns Arithmetic mean.
8
- */
9
- export function computeMean(values: readonly number[]): number {
10
- if (values.length === 0) return 0;
11
- return (
12
- values.reduce(function accumulate(sumValue, currentValue): number {
13
- return sumValue + currentValue;
14
- }, 0) / values.length
15
- );
16
- }
17
-
18
- /**
19
- * Computes population standard deviation from numeric samples.
20
- *
21
- * @param values - Numeric samples.
22
- * @param meanValue - Precomputed mean.
23
- * @returns Population standard deviation.
24
- */
25
- export function computePopulationStandardDeviation(
26
- values: readonly number[],
27
- meanValue: number,
28
- ): number {
29
- if (values.length === 0) return 0;
30
-
31
- const variance =
32
- values.reduce(function accumulateVariance(sumValue, currentValue): number {
33
- const deltaFromMean = currentValue - meanValue;
34
- return sumValue + deltaFromMean * deltaFromMean;
35
- }, 0) / values.length;
36
-
37
- return Math.sqrt(Math.max(0, variance));
38
- }
39
-
40
- /**
41
- * Computes an interpolated percentile value.
42
- *
43
- * @param values - Numeric samples.
44
- * @param percentile - Percentile in [0, 1].
45
- * @returns Interpolated percentile value.
46
- */
47
- export function computePercentile(
48
- values: readonly number[],
49
- percentile: number,
50
- ): number {
51
- if (values.length === 0) return Number.NaN;
52
-
53
- const sortedValues = values.toSorted(compareNumbersAscending);
54
-
55
- const clampedPercentile = clampValue(percentile, 0, 1);
56
- const percentileIndex = clampedPercentile * (sortedValues.length - 1);
57
- const lowerIndex = Math.floor(percentileIndex);
58
- const upperIndex = Math.ceil(percentileIndex);
59
- const interpolationWeight = percentileIndex - lowerIndex;
60
-
61
- const lowerValue = sortedValues[lowerIndex] ?? sortedValues[0] ?? Number.NaN;
62
- const upperValue = sortedValues[upperIndex] ?? lowerValue;
63
- return lowerValue + (upperValue - lowerValue) * interpolationWeight;
64
- }
65
-
66
- /**
67
- * Numeric ascending comparator.
68
- *
69
- * @param leftValue - Left numeric value.
70
- * @param rightValue - Right numeric value.
71
- * @returns Ascending comparator delta.
72
- */
73
- export function compareNumbersAscending(
74
- leftValue: number,
75
- rightValue: number,
76
- ): number {
77
- return leftValue - rightValue;
78
- }