@reicek/neataptic-ts 0.1.21 → 0.1.23

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 (361) hide show
  1. package/.github/agents/boundary-mapper.agent.md +31 -0
  2. package/.github/agents/docs-scout.agent.md +29 -0
  3. package/.github/agents/plan-scout.agent.md +31 -0
  4. package/.github/agents/solid-split.agent.md +143 -0
  5. package/.github/copilot-instructions.md +119 -0
  6. package/.github/skills/solid-split-playbook/SKILL.md +220 -0
  7. package/.github/skills/solid-split-playbook/assets/docs-checklist.md +34 -0
  8. package/.github/skills/solid-split-playbook/assets/split-plan-template.md +48 -0
  9. package/.github/skills/solid-split-playbook/assets/split-workflow-checklist.md +51 -0
  10. package/.github/skills/trace-analyzer-extension/SKILL.md +63 -0
  11. package/.github/skills/trace-analyzer-extension/assets/extension-checklist.md +24 -0
  12. package/.github/skills/trace-analyzer-extension/references/analyzer-extension-workflow.md +101 -0
  13. package/.github/skills/trace-audit-reporting/SKILL.md +96 -0
  14. package/.github/skills/trace-audit-reporting/assets/performance-report-template.md +123 -0
  15. package/.github/skills/trace-audit-reporting/references/trace-analysis-workflow.md +132 -0
  16. package/package.json +7 -3
  17. package/plans/ES2023 migration +13 -8
  18. package/plans/Evolution_Training_Interoperability_Contracts.md +1 -1
  19. package/plans/Flappy_Bird_Folder_Documentation_Pass.md +53 -0
  20. package/plans/Flappy_Evolution_Worker_Documentation_Pass.md +58 -0
  21. package/plans/Interactive_Examples_and_Learning_Path.md +10 -2
  22. package/plans/Memory_Optimization.md +3 -3
  23. package/plans/README.md +63 -0
  24. package/plans/Roadmap.md +15 -3
  25. package/plans/asciiMaze_SOLID_split.done.md +130 -0
  26. package/plans/flappy_bird_SOLID_split.done.md +67 -0
  27. package/scripts/analyze-trace.ts +590 -0
  28. package/scripts/assets/theme.css +221 -34
  29. package/scripts/copy-examples.mjs +9 -5
  30. package/scripts/export-onnx.mjs +3 -3
  31. package/scripts/generate-bench-tables.mjs +10 -10
  32. package/scripts/generate-bench-tables.ts +10 -10
  33. package/scripts/generate-docs.ts +1415 -449
  34. package/scripts/render-docs-html.ts +15 -8
  35. package/src/README.md +127 -222
  36. package/src/architecture/README.md +117 -184
  37. package/src/architecture/architect.ts +6 -0
  38. package/src/architecture/layer/README.md +38 -38
  39. package/src/architecture/network/README.md +49 -31
  40. package/src/architecture/network/activate/README.md +77 -77
  41. package/src/architecture/network/connect/README.md +15 -13
  42. package/src/architecture/network/deterministic/README.md +7 -7
  43. package/src/architecture/network/evolve/README.md +44 -44
  44. package/src/architecture/network/gating/README.md +20 -20
  45. package/src/architecture/network/genetic/README.md +51 -51
  46. package/src/architecture/network/mutate/README.md +97 -97
  47. package/src/architecture/network/network.types.ts +39 -0
  48. package/src/architecture/network/onnx/README.md +264 -264
  49. package/src/architecture/network/prune/README.md +39 -39
  50. package/src/architecture/network/remove/README.md +26 -26
  51. package/src/architecture/network/serialize/README.md +56 -56
  52. package/src/architecture/network/serialize/network.serialize.json.utils.ts +1 -0
  53. package/src/architecture/network/serialize/network.serialize.utils.ts +6 -1
  54. package/src/architecture/network/serialize/network.serialize.utils.types.ts +1 -1
  55. package/src/architecture/network/slab/README.md +61 -61
  56. package/src/architecture/network/standalone/README.md +24 -24
  57. package/src/architecture/network/stats/README.md +9 -9
  58. package/src/architecture/network/topology/README.md +46 -46
  59. package/src/architecture/network/training/README.md +21 -21
  60. package/src/architecture/network.ts +114 -10
  61. package/src/methods/README.md +9 -87
  62. package/src/multithreading/README.md +8 -77
  63. package/src/multithreading/workers/README.md +2 -2
  64. package/src/multithreading/workers/browser/README.md +0 -6
  65. package/src/multithreading/workers/node/README.md +0 -3
  66. package/src/neat/README.md +623 -568
  67. package/src/neat/neat.evolve.population.utils.ts +29 -5
  68. package/src/neat/neat.helpers.ts +16 -0
  69. package/src/neat/neat.topology-intent.utils.ts +160 -0
  70. package/src/utils/README.md +18 -18
  71. package/test/examples/asciiMaze/README.md +59 -59
  72. package/test/examples/asciiMaze/asciiMaze.e2e.test.ts +14 -9
  73. package/test/examples/asciiMaze/browser-entry/README.md +196 -0
  74. package/test/examples/asciiMaze/browser-entry/browser-entry.abort.services.ts +95 -0
  75. package/test/examples/asciiMaze/browser-entry/browser-entry.constants.ts +23 -0
  76. package/test/examples/asciiMaze/browser-entry/browser-entry.curriculum.services.ts +115 -0
  77. package/test/examples/asciiMaze/browser-entry/browser-entry.globals.services.ts +106 -0
  78. package/test/examples/asciiMaze/browser-entry/browser-entry.host.services.ts +157 -0
  79. package/test/examples/asciiMaze/browser-entry/browser-entry.services.ts +14 -0
  80. package/test/examples/asciiMaze/browser-entry/browser-entry.ts +129 -0
  81. package/test/examples/asciiMaze/browser-entry/browser-entry.types.ts +120 -0
  82. package/test/examples/asciiMaze/browser-entry/browser-entry.utils.ts +98 -0
  83. package/test/examples/asciiMaze/browser-entry.ts +10 -576
  84. package/test/examples/asciiMaze/dashboardManager/README.md +276 -0
  85. package/test/examples/asciiMaze/dashboardManager/archive/README.md +16 -0
  86. package/test/examples/asciiMaze/dashboardManager/archive/dashboardManager.archive.services.ts +267 -0
  87. package/test/examples/asciiMaze/dashboardManager/dashboardManager.constants.ts +35 -0
  88. package/test/examples/asciiMaze/dashboardManager/dashboardManager.services.ts +103 -0
  89. package/test/examples/asciiMaze/dashboardManager/dashboardManager.ts +181 -0
  90. package/test/examples/asciiMaze/dashboardManager/dashboardManager.types.ts +267 -0
  91. package/test/examples/asciiMaze/dashboardManager/dashboardManager.utils.ts +254 -0
  92. package/test/examples/asciiMaze/dashboardManager/live/README.md +14 -0
  93. package/test/examples/asciiMaze/dashboardManager/live/dashboardManager.live.services.ts +264 -0
  94. package/test/examples/asciiMaze/dashboardManager/telemetry/README.md +47 -0
  95. package/test/examples/asciiMaze/dashboardManager/telemetry/dashboardManager.telemetry.services.ts +513 -0
  96. package/test/examples/asciiMaze/dashboardManager.ts +13 -2335
  97. package/test/examples/asciiMaze/evolutionEngine/README.md +1058 -0
  98. package/test/examples/asciiMaze/evolutionEngine/curriculumPhase.ts +90 -0
  99. package/test/examples/asciiMaze/evolutionEngine/engineState.constants.ts +36 -0
  100. package/test/examples/asciiMaze/evolutionEngine/engineState.ts +58 -513
  101. package/test/examples/asciiMaze/evolutionEngine/engineState.types.ts +212 -0
  102. package/test/examples/asciiMaze/evolutionEngine/engineState.utils.ts +301 -0
  103. package/test/examples/asciiMaze/evolutionEngine/evolutionEngine.types.ts +445 -0
  104. package/test/examples/asciiMaze/evolutionEngine/evolutionLoop.ts +81 -50
  105. package/test/examples/asciiMaze/evolutionEngine/optionsAndSetup.ts +2 -4
  106. package/test/examples/asciiMaze/evolutionEngine/populationDynamics.ts +17 -33
  107. package/test/examples/asciiMaze/evolutionEngine/populationPruning.ts +1 -1
  108. package/test/examples/asciiMaze/evolutionEngine/rngAndTiming.ts +1 -2
  109. package/test/examples/asciiMaze/evolutionEngine/sampling.ts +1 -1
  110. package/test/examples/asciiMaze/evolutionEngine/scratchPools.ts +2 -5
  111. package/test/examples/asciiMaze/evolutionEngine/setupHelpers.ts +30 -37
  112. package/test/examples/asciiMaze/evolutionEngine/telemetryMetrics.ts +16 -58
  113. package/test/examples/asciiMaze/evolutionEngine/trainingWarmStart.ts +2 -2
  114. package/test/examples/asciiMaze/evolutionEngine.ts +55 -55
  115. package/test/examples/asciiMaze/fitness.ts +2 -2
  116. package/test/examples/asciiMaze/fitness.types.ts +65 -0
  117. package/test/examples/asciiMaze/interfaces.ts +64 -1352
  118. package/test/examples/asciiMaze/mazeMovement/README.md +356 -0
  119. package/test/examples/asciiMaze/mazeMovement/finalization/README.md +49 -0
  120. package/test/examples/asciiMaze/mazeMovement/finalization/mazeMovement.finalization.ts +138 -0
  121. package/test/examples/asciiMaze/mazeMovement/mazeMovement.constants.ts +101 -0
  122. package/test/examples/asciiMaze/mazeMovement/mazeMovement.services.ts +230 -0
  123. package/test/examples/asciiMaze/mazeMovement/mazeMovement.ts +299 -0
  124. package/test/examples/asciiMaze/mazeMovement/mazeMovement.types.ts +185 -0
  125. package/test/examples/asciiMaze/mazeMovement/mazeMovement.utils.ts +153 -0
  126. package/test/examples/asciiMaze/mazeMovement/policy/README.md +91 -0
  127. package/test/examples/asciiMaze/mazeMovement/policy/mazeMovement.policy.ts +467 -0
  128. package/test/examples/asciiMaze/mazeMovement/runtime/README.md +95 -0
  129. package/test/examples/asciiMaze/mazeMovement/runtime/mazeMovement.runtime.ts +354 -0
  130. package/test/examples/asciiMaze/mazeMovement/shaping/README.md +124 -0
  131. package/test/examples/asciiMaze/mazeMovement/shaping/mazeMovement.shaping.ts +459 -0
  132. package/test/examples/asciiMaze/mazeMovement.ts +12 -2978
  133. package/test/examples/flappy_bird/README.md +193 -88
  134. package/test/examples/flappy_bird/browser-entry/README.md +1441 -0
  135. package/test/examples/flappy_bird/browser-entry/browser-entry.host.utils.ts +4 -324
  136. package/test/examples/flappy_bird/browser-entry/browser-entry.network-view.utils.ts +9 -396
  137. package/test/examples/flappy_bird/browser-entry/browser-entry.playback.utils.ts +6 -714
  138. package/test/examples/flappy_bird/browser-entry/browser-entry.render.types.ts +26 -3
  139. package/test/examples/flappy_bird/browser-entry/browser-entry.runtime.types.ts +16 -1
  140. package/test/examples/flappy_bird/browser-entry/browser-entry.simulation.types.ts +39 -5
  141. package/test/examples/flappy_bird/browser-entry/browser-entry.spawn.utils.ts +11 -31
  142. package/test/examples/flappy_bird/browser-entry/browser-entry.stats.types.ts +32 -4
  143. package/test/examples/flappy_bird/browser-entry/browser-entry.ts +11 -0
  144. package/test/examples/flappy_bird/browser-entry/browser-entry.types.ts +8 -0
  145. package/test/examples/flappy_bird/browser-entry/browser-entry.visualization.types.ts +50 -7
  146. package/test/examples/flappy_bird/browser-entry/browser-entry.visualization.utils.ts +21 -893
  147. package/test/examples/flappy_bird/browser-entry/browser-entry.worker.types.ts +91 -10
  148. package/test/examples/flappy_bird/browser-entry/host/README.md +318 -0
  149. package/test/examples/flappy_bird/browser-entry/host/host.canvas.service.ts +16 -0
  150. package/test/examples/flappy_bird/browser-entry/host/host.constants.ts +20 -0
  151. package/test/examples/flappy_bird/browser-entry/host/host.dom.service.ts +10 -0
  152. package/test/examples/flappy_bird/browser-entry/host/host.resize.service.ts +1 -295
  153. package/test/examples/flappy_bird/browser-entry/host/host.stats.service.ts +14 -0
  154. package/test/examples/flappy_bird/browser-entry/host/host.ts +592 -6
  155. package/test/examples/flappy_bird/browser-entry/host/host.types.ts +13 -0
  156. package/test/examples/flappy_bird/browser-entry/host/resize/README.md +309 -0
  157. package/test/examples/flappy_bird/browser-entry/host/resize/host.resize.service.constants.ts +47 -0
  158. package/test/examples/flappy_bird/browser-entry/host/resize/host.resize.service.services.ts +392 -0
  159. package/test/examples/flappy_bird/browser-entry/host/resize/host.resize.service.ts +132 -0
  160. package/test/examples/flappy_bird/browser-entry/host/resize/host.resize.service.types.ts +92 -0
  161. package/test/examples/flappy_bird/browser-entry/host/resize/host.resize.service.utils.ts +272 -0
  162. package/test/examples/flappy_bird/browser-entry/network-view/README.md +389 -0
  163. package/test/examples/flappy_bird/browser-entry/network-view/network-view.draw.service.ts +13 -0
  164. package/test/examples/flappy_bird/browser-entry/network-view/network-view.labels.utils.ts +12 -0
  165. package/test/examples/flappy_bird/browser-entry/network-view/network-view.layout.utils.ts +14 -0
  166. package/test/examples/flappy_bird/browser-entry/network-view/network-view.topology.utils.ts +267 -0
  167. package/test/examples/flappy_bird/browser-entry/network-view/network-view.ts +823 -7
  168. package/test/examples/flappy_bird/browser-entry/network-view/network-view.types.ts +11 -0
  169. package/test/examples/flappy_bird/browser-entry/playback/README.md +845 -0
  170. package/test/examples/flappy_bird/browser-entry/playback/background/README.md +355 -0
  171. package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/README.md +1068 -0
  172. package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/playback.background.ground-grid.batch.services.ts +64 -0
  173. package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/playback.background.ground-grid.cache.services.ts +207 -0
  174. package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/playback.background.ground-grid.constants.ts +197 -0
  175. package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/playback.background.ground-grid.geometry.batch.utils.ts +114 -0
  176. package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/playback.background.ground-grid.geometry.layout.utils.test.ts +96 -0
  177. package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/playback.background.ground-grid.geometry.layout.utils.ts +204 -0
  178. package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/playback.background.ground-grid.geometry.services.ts +49 -0
  179. package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/playback.background.ground-grid.geometry.utils.ts +313 -0
  180. package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/playback.background.ground-grid.layer.services.ts +81 -0
  181. package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/playback.background.ground-grid.math.utils.test.ts +33 -0
  182. package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/playback.background.ground-grid.math.utils.ts +201 -0
  183. package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/playback.background.ground-grid.pulse.selection.utils.ts +171 -0
  184. package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/playback.background.ground-grid.pulse.timing.utils.ts +124 -0
  185. package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/playback.background.ground-grid.pulse.utils.test.ts +279 -0
  186. package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/playback.background.ground-grid.pulse.utils.ts +132 -0
  187. package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/playback.background.ground-grid.scene.services.ts +26 -0
  188. package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/playback.background.ground-grid.services.ts +65 -0
  189. package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/playback.background.ground-grid.ts +48 -0
  190. package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/playback.background.ground-grid.types.ts +342 -0
  191. package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/playback.background.ground-grid.utils.ts +10 -0
  192. package/test/examples/flappy_bird/browser-entry/playback/background/playback.background.cache.services.ts +96 -0
  193. package/test/examples/flappy_bird/browser-entry/playback/background/playback.background.constants.ts +127 -0
  194. package/test/examples/flappy_bird/browser-entry/playback/background/playback.background.draw.services.ts +184 -0
  195. package/test/examples/flappy_bird/browser-entry/playback/background/playback.background.scene.services.ts +64 -0
  196. package/test/examples/flappy_bird/browser-entry/playback/background/playback.background.services.ts +6 -0
  197. package/test/examples/flappy_bird/browser-entry/playback/background/playback.background.ts +53 -0
  198. package/test/examples/flappy_bird/browser-entry/playback/background/playback.background.types.ts +105 -0
  199. package/test/examples/flappy_bird/browser-entry/playback/background/playback.background.utils.ts +100 -0
  200. package/test/examples/flappy_bird/browser-entry/playback/frame-render/README.md +541 -0
  201. package/test/examples/flappy_bird/browser-entry/playback/frame-render/playback.frame-render.bird.utils.ts +180 -0
  202. package/test/examples/flappy_bird/browser-entry/playback/frame-render/playback.frame-render.canvas.services.ts +77 -0
  203. package/test/examples/flappy_bird/browser-entry/playback/frame-render/playback.frame-render.entity.services.ts +167 -0
  204. package/test/examples/flappy_bird/browser-entry/playback/frame-render/playback.frame-render.scene.services.ts +57 -0
  205. package/test/examples/flappy_bird/browser-entry/playback/frame-render/playback.frame-render.service.test.ts +176 -0
  206. package/test/examples/flappy_bird/browser-entry/playback/frame-render/playback.frame-render.service.ts +113 -0
  207. package/test/examples/flappy_bird/browser-entry/playback/frame-render/playback.frame-render.services.ts +35 -0
  208. package/test/examples/flappy_bird/browser-entry/playback/frame-render/playback.frame-render.trail.utils.ts +248 -0
  209. package/test/examples/flappy_bird/browser-entry/playback/frame-render/playback.frame-render.types.ts +103 -0
  210. package/test/examples/flappy_bird/browser-entry/playback/frame-render/playback.frame-render.utils.ts +11 -0
  211. package/test/examples/flappy_bird/browser-entry/playback/playback.constants.ts +1 -1
  212. package/test/examples/flappy_bird/browser-entry/playback/playback.frame-render.service.ts +10 -0
  213. package/test/examples/flappy_bird/browser-entry/playback/playback.iteration.services.ts +192 -0
  214. package/test/examples/flappy_bird/browser-entry/playback/playback.loop.service.ts +12 -0
  215. package/test/examples/flappy_bird/browser-entry/playback/playback.orchestration.types.ts +78 -0
  216. package/test/examples/flappy_bird/browser-entry/playback/playback.render.pipe-outline.service.ts +128 -0
  217. package/test/examples/flappy_bird/browser-entry/playback/playback.render.service.ts +1 -116
  218. package/test/examples/flappy_bird/browser-entry/playback/playback.session.services.ts +184 -0
  219. package/test/examples/flappy_bird/browser-entry/playback/playback.snapshot.utils.test.ts +121 -0
  220. package/test/examples/flappy_bird/browser-entry/playback/playback.snapshot.utils.ts +8 -0
  221. package/test/examples/flappy_bird/browser-entry/playback/playback.starfield.layer.services.ts +36 -0
  222. package/test/examples/flappy_bird/browser-entry/playback/playback.starfield.service.ts +11 -128
  223. package/test/examples/flappy_bird/browser-entry/playback/playback.starfield.services.ts +268 -0
  224. package/test/examples/flappy_bird/browser-entry/playback/playback.starfield.types.ts +91 -0
  225. package/test/examples/flappy_bird/browser-entry/playback/playback.starfield.utils.ts +11 -4
  226. package/test/examples/flappy_bird/browser-entry/playback/playback.trail.utils.ts +9 -86
  227. package/test/examples/flappy_bird/browser-entry/playback/playback.ts +75 -7
  228. package/test/examples/flappy_bird/browser-entry/playback/playback.types.ts +12 -9
  229. package/test/examples/flappy_bird/browser-entry/playback/playback.worker-channel.utils.ts +11 -123
  230. package/test/examples/flappy_bird/browser-entry/playback/snapshot/README.md +55 -0
  231. package/test/examples/flappy_bird/browser-entry/playback/snapshot/playback.snapshot.services.ts +103 -0
  232. package/test/examples/flappy_bird/browser-entry/playback/snapshot/playback.snapshot.summary.utils.test.ts +45 -0
  233. package/test/examples/flappy_bird/browser-entry/playback/snapshot/playback.snapshot.summary.utils.ts +28 -0
  234. package/test/examples/flappy_bird/browser-entry/playback/trail/README.md +95 -0
  235. package/test/examples/flappy_bird/browser-entry/playback/trail/playback.trail.history.services.test.ts +35 -0
  236. package/test/examples/flappy_bird/browser-entry/playback/trail/playback.trail.history.services.ts +64 -0
  237. package/test/examples/flappy_bird/browser-entry/playback/trail/playback.trail.opacity.utils.test.ts +37 -0
  238. package/test/examples/flappy_bird/browser-entry/playback/trail/playback.trail.opacity.utils.ts +74 -0
  239. package/test/examples/flappy_bird/browser-entry/playback/worker-channel/README.md +71 -0
  240. package/test/examples/flappy_bird/browser-entry/playback/worker-channel/playback.worker-channel.request.services.ts +45 -0
  241. package/test/examples/flappy_bird/browser-entry/playback/worker-channel/playback.worker-channel.summary.services.ts +74 -0
  242. package/test/examples/flappy_bird/browser-entry/playback/worker-channel/playback.worker-channel.types.ts +53 -0
  243. package/test/examples/flappy_bird/browser-entry/runtime/README.md +304 -0
  244. package/test/examples/flappy_bird/browser-entry/runtime/runtime.browser-globals.service.ts +15 -0
  245. package/test/examples/flappy_bird/browser-entry/runtime/runtime.errors.ts +17 -0
  246. package/test/examples/flappy_bird/browser-entry/runtime/runtime.evolution-launch.service.ts +56 -0
  247. package/test/examples/flappy_bird/browser-entry/runtime/runtime.evolution-loop.service.ts +19 -0
  248. package/test/examples/flappy_bird/browser-entry/runtime/runtime.lifecycle.service.ts +96 -0
  249. package/test/examples/flappy_bird/browser-entry/runtime/runtime.startup.service.ts +92 -0
  250. package/test/examples/flappy_bird/browser-entry/runtime/runtime.telemetry.service.ts +24 -0
  251. package/test/examples/flappy_bird/browser-entry/runtime/runtime.ts +31 -121
  252. package/test/examples/flappy_bird/browser-entry/runtime/runtime.types.ts +65 -0
  253. package/test/examples/flappy_bird/browser-entry/visualization/README.md +568 -0
  254. package/test/examples/flappy_bird/browser-entry/visualization/visualization.colors.utils.ts +26 -0
  255. package/test/examples/flappy_bird/browser-entry/visualization/visualization.constants.ts +110 -0
  256. package/test/examples/flappy_bird/browser-entry/visualization/visualization.draw.service.ts +979 -19
  257. package/test/examples/flappy_bird/browser-entry/visualization/visualization.legend.utils.ts +157 -3
  258. package/test/examples/flappy_bird/browser-entry/visualization/visualization.topology.utils.ts +13 -27
  259. package/test/examples/flappy_bird/browser-entry/visualization/visualization.ts +7 -20
  260. package/test/examples/flappy_bird/browser-entry/visualization/visualization.types.ts +14 -0
  261. package/test/examples/flappy_bird/browser-entry/worker-channel/README.md +238 -0
  262. package/test/examples/flappy_bird/browser-entry/worker-channel/worker-channel.errors.ts +11 -0
  263. package/test/examples/flappy_bird/browser-entry/worker-channel/worker-channel.generation.service.ts +12 -0
  264. package/test/examples/flappy_bird/browser-entry/worker-channel/worker-channel.playback.service.test.ts +143 -0
  265. package/test/examples/flappy_bird/browser-entry/worker-channel/worker-channel.playback.service.ts +140 -14
  266. package/test/examples/flappy_bird/browser-entry/worker-channel/worker-channel.request.service.ts +27 -0
  267. package/test/examples/flappy_bird/browser-entry/worker-channel/worker-channel.ts +8 -0
  268. package/test/examples/flappy_bird/browser-entry/worker-channel/worker-channel.types.ts +23 -0
  269. package/test/examples/flappy_bird/browser-entry/worker-channel/worker-channel.url.service.ts +5 -0
  270. package/test/examples/flappy_bird/constants/README.md +1163 -0
  271. package/test/examples/flappy_bird/constants/constants.birds.ts +16 -38
  272. package/test/examples/flappy_bird/constants/constants.difficulty.ts +21 -0
  273. package/test/examples/flappy_bird/constants/constants.network-view.ts +24 -0
  274. package/test/examples/flappy_bird/constants/constants.network.ts +1 -1
  275. package/test/examples/flappy_bird/constants/constants.observation.ts +7 -0
  276. package/test/examples/flappy_bird/constants/constants.palette.ts +9 -2
  277. package/test/examples/flappy_bird/constants/constants.physics.ts +9 -0
  278. package/test/examples/flappy_bird/constants/constants.pipe-render.ts +3 -0
  279. package/test/examples/flappy_bird/constants/constants.pipes.ts +22 -3
  280. package/test/examples/flappy_bird/constants/constants.runtime.ts +28 -4
  281. package/test/examples/flappy_bird/constants/constants.starfield.ts +78 -3
  282. package/test/examples/flappy_bird/constants/constants.ts +6 -0
  283. package/test/examples/flappy_bird/environment/README.md +182 -0
  284. package/test/examples/flappy_bird/environment/environment.collision.utils.ts +7 -0
  285. package/test/examples/flappy_bird/environment/environment.constants.ts +16 -3
  286. package/test/examples/flappy_bird/environment/environment.observation.utils.ts +12 -19
  287. package/test/examples/flappy_bird/environment/environment.state.service.ts +10 -0
  288. package/test/examples/flappy_bird/environment/environment.step.service.ts +15 -66
  289. package/test/examples/flappy_bird/environment/environment.types.ts +14 -0
  290. package/test/examples/flappy_bird/evaluation/README.md +155 -0
  291. package/test/examples/flappy_bird/evaluation/evaluation.constants.ts +23 -4
  292. package/test/examples/flappy_bird/evaluation/evaluation.fitness.utils.ts +16 -1
  293. package/test/examples/flappy_bird/evaluation/evaluation.rollout.service.ts +7 -374
  294. package/test/examples/flappy_bird/evaluation/evaluation.seed.utils.ts +4 -0
  295. package/test/examples/flappy_bird/evaluation/evaluation.types.ts +18 -2
  296. package/test/examples/flappy_bird/evaluation/rollout/README.md +355 -0
  297. package/test/examples/flappy_bird/evaluation/rollout/evaluation.rollout.constants.ts +38 -0
  298. package/test/examples/flappy_bird/evaluation/rollout/evaluation.rollout.service.ts +71 -0
  299. package/test/examples/flappy_bird/evaluation/rollout/evaluation.rollout.services.ts +338 -0
  300. package/test/examples/flappy_bird/evaluation/rollout/evaluation.rollout.types.ts +69 -0
  301. package/test/examples/flappy_bird/evaluation/rollout/evaluation.rollout.utils.ts +399 -0
  302. package/test/examples/flappy_bird/flappy-evolution-worker/README.md +845 -0
  303. package/test/examples/flappy_bird/flappy-evolution-worker/flappy-evolution-worker.constants.ts +49 -7
  304. package/test/examples/flappy_bird/flappy-evolution-worker/flappy-evolution-worker.errors.ts +34 -3
  305. package/test/examples/flappy_bird/flappy-evolution-worker/flappy-evolution-worker.evolution.service.ts +22 -0
  306. package/test/examples/flappy_bird/flappy-evolution-worker/flappy-evolution-worker.playback.service.ts +62 -26
  307. package/test/examples/flappy_bird/flappy-evolution-worker/flappy-evolution-worker.protocol.service.ts +27 -1
  308. package/test/examples/flappy_bird/flappy-evolution-worker/flappy-evolution-worker.runtime.service.ts +23 -0
  309. package/test/examples/flappy_bird/flappy-evolution-worker/flappy-evolution-worker.simulation.frame.service.ts +378 -0
  310. package/test/examples/flappy_bird/flappy-evolution-worker/flappy-evolution-worker.simulation.types.ts +22 -0
  311. package/test/examples/flappy_bird/flappy-evolution-worker/flappy-evolution-worker.simulation.utils.ts +20 -203
  312. package/test/examples/flappy_bird/flappy-evolution-worker/flappy-evolution-worker.snapshot.utils.test.ts +94 -0
  313. package/test/examples/flappy_bird/flappy-evolution-worker/flappy-evolution-worker.snapshot.utils.ts +78 -13
  314. package/test/examples/flappy_bird/flappy-evolution-worker/flappy-evolution-worker.ts +235 -344
  315. package/test/examples/flappy_bird/flappy-evolution-worker/flappy-evolution-worker.types.ts +170 -22
  316. package/test/examples/flappy_bird/flappy-evolution-worker/flappy-evolution-worker.warm-start.service.ts +314 -0
  317. package/test/examples/flappy_bird/flappy.simulation.shared.utils.ts +17 -0
  318. package/test/examples/flappy_bird/flappyEnvironment.ts +21 -0
  319. package/test/examples/flappy_bird/flappyEvaluation.ts +12 -0
  320. package/test/examples/flappy_bird/flappyEvolution.worker.ts +7 -0
  321. package/test/examples/flappy_bird/index.ts +8 -2
  322. package/test/examples/flappy_bird/rng.ts +10 -0
  323. package/test/examples/flappy_bird/simulation-shared/README.md +518 -0
  324. package/test/examples/flappy_bird/simulation-shared/observation/README.md +255 -0
  325. package/test/examples/flappy_bird/simulation-shared/observation/observation.features.utils.ts +339 -0
  326. package/test/examples/flappy_bird/simulation-shared/observation/observation.ts +19 -0
  327. package/test/examples/flappy_bird/simulation-shared/observation/observation.vector.utils.ts +81 -0
  328. package/test/examples/flappy_bird/simulation-shared/simulation-shared.constants.ts +3 -0
  329. package/test/examples/flappy_bird/simulation-shared/simulation-shared.control.utils.ts +6 -0
  330. package/test/examples/flappy_bird/simulation-shared/simulation-shared.difficulty.utils.ts +9 -0
  331. package/test/examples/flappy_bird/simulation-shared/simulation-shared.errors.ts +10 -1
  332. package/test/examples/flappy_bird/simulation-shared/simulation-shared.memory.utils.ts +18 -0
  333. package/test/examples/flappy_bird/simulation-shared/simulation-shared.observation.utils.ts +7 -402
  334. package/test/examples/flappy_bird/simulation-shared/simulation-shared.spawn.utils.ts +36 -6
  335. package/test/examples/flappy_bird/{evaluation/evaluation.statistics.utils.ts → simulation-shared/simulation-shared.statistics.utils.ts} +30 -9
  336. package/test/examples/flappy_bird/simulation-shared/simulation-shared.types.ts +38 -5
  337. package/test/examples/flappy_bird/trainFlappyBird.ts +13 -0
  338. package/test/examples/flappy_bird/trainer/README.md +676 -0
  339. package/test/examples/flappy_bird/trainer/evaluation/README.md +253 -0
  340. package/test/examples/flappy_bird/trainer/evaluation/trainer.evaluation.service.constants.ts +15 -0
  341. package/test/examples/flappy_bird/trainer/evaluation/trainer.evaluation.service.services.ts +86 -0
  342. package/test/examples/flappy_bird/trainer/evaluation/trainer.evaluation.service.ts +187 -0
  343. package/test/examples/flappy_bird/trainer/evaluation/trainer.evaluation.service.types.ts +32 -0
  344. package/test/examples/flappy_bird/trainer/evaluation/trainer.evaluation.service.utils.ts +182 -0
  345. package/test/examples/flappy_bird/trainer/trainer.evaluation.service.ts +13 -0
  346. package/test/examples/flappy_bird/trainer/trainer.fitness.service.ts +23 -1
  347. package/test/examples/flappy_bird/trainer/trainer.loop.service.ts +17 -1
  348. package/test/examples/flappy_bird/trainer/trainer.report.service.services.ts +181 -0
  349. package/test/examples/flappy_bird/trainer/trainer.report.service.ts +136 -0
  350. package/test/examples/flappy_bird/trainer/trainer.selection.utils.ts +89 -0
  351. package/test/examples/flappy_bird/trainer/trainer.setup.service.ts +22 -0
  352. package/test/examples/flappy_bird/trainer/trainer.signals.service.ts +8 -0
  353. package/test/examples/flappy_bird/trainer/trainer.ts +38 -553
  354. package/test/examples/flappy_bird/trainer/trainer.types.ts +44 -7
  355. package/test/neat/neat.topology-intent.test.ts +129 -0
  356. package/test/network/network.topology-intent.test.ts +44 -0
  357. package/test/examples/flappy_bird/browser-entry/browser-entry.utils.ts +0 -12
  358. package/test/examples/flappy_bird/environment/environment.ts +0 -7
  359. package/test/examples/flappy_bird/evaluation/evaluation.ts +0 -7
  360. package/test/examples/flappy_bird/simulation-shared/simulation-shared.ts +0 -15
  361. package/test/examples/flappy_bird/trainer/trainer.statistics.utils.ts +0 -78
@@ -21,6 +21,11 @@ import type {
21
21
  /**
22
22
  * Creates immutable setup values for the trainer.
23
23
  *
24
+ * Educational note:
25
+ * The setup object freezes the core training shape up front: input width,
26
+ * output width, population size, and elitism count. Centralizing those values
27
+ * makes the rest of the trainer read as policy rather than configuration noise.
28
+ *
24
29
  * @returns Default trainer setup values used for NEAT configuration.
25
30
  */
26
31
  export function createTrainerSetup(): FlappyTrainerSetup {
@@ -35,6 +40,9 @@ export function createTrainerSetup(): FlappyTrainerSetup {
35
40
  /**
36
41
  * Creates mutable runtime state container.
37
42
  *
43
+ * The runtime state is intentionally tiny. It only tracks stop intent and the
44
+ * latest report so the outer loop can remain easy to reason about.
45
+ *
38
46
  * @returns Fresh runtime state used by loop orchestration.
39
47
  */
40
48
  export function createTrainerRuntimeState(): FlappyTrainerRuntimeState {
@@ -47,6 +55,17 @@ export function createTrainerRuntimeState(): FlappyTrainerRuntimeState {
47
55
  /**
48
56
  * Builds the NEAT controller with baseline options.
49
57
  *
58
+ * Educational note:
59
+ * The trainer enables population-level fitness mode because the quality of a
60
+ * Flappy policy depends on fair comparison across shared seed batches, not on a
61
+ * one-network-at-a-time scoring callback.
62
+ *
63
+ * @example
64
+ * ```ts
65
+ * const trainerSetup = createTrainerSetup();
66
+ * const neatController = createNeatController(trainerSetup);
67
+ * ```
68
+ *
50
69
  * @param trainerSetup - Immutable trainer setup values.
51
70
  * @returns Typed NEAT controller used by the trainer loop.
52
71
  */
@@ -81,6 +100,9 @@ export function createNeatController(
81
100
  /**
82
101
  * Trivial baseline fitness used before attaching population evaluator.
83
102
  *
103
+ * This placeholder keeps controller construction simple. The real staged
104
+ * evaluator is attached immediately afterward by the fitness service.
105
+ *
84
106
  * @returns Constant zero fitness.
85
107
  */
86
108
  function resolveNoopFitness(): number {
@@ -3,7 +3,13 @@ import type { FlappyTrainerRuntimeState } from './trainer.types';
3
3
  /**
4
4
  * Registers graceful stop signal handlers.
5
5
  *
6
+ * Educational note:
7
+ * Long-running evolutionary runs should stop cleanly when the user presses
8
+ * `Ctrl+C`. This service flips runtime intent instead of abruptly tearing down
9
+ * the process mid-generation.
10
+ *
6
11
  * @param trainerRuntimeState - Mutable trainer runtime state.
12
+ * @returns Nothing.
7
13
  */
8
14
  export function registerTrainerStopSignals(
9
15
  trainerRuntimeState: FlappyTrainerRuntimeState,
@@ -20,6 +26,8 @@ export function registerTrainerStopSignals(
20
26
  /**
21
27
  * Handles one stop signal update.
22
28
  *
29
+ * @returns Nothing.
30
+ *
23
31
  * @param trainerRuntimeState - Mutable trainer runtime state.
24
32
  */
25
33
  function handleTrainerStopSignal(
@@ -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.
@@ -56,8 +37,24 @@ import {
56
37
  * The network sees a temporal observation (38 floats) and outputs two competing
57
38
  * action scores (`no flap` vs `flap`).
58
39
  *
40
+ * Educational note:
41
+ * The trainer is intentionally orchestration-first. It wires together setup,
42
+ * staged population evaluation, the outer evolution loop, graceful shutdown,
43
+ * and compact generation logging without burying those responsibilities inside a
44
+ * single monolithic file.
45
+ *
46
+ * The mutation schedule gradually cools over early generations. If you want a
47
+ * conceptual parallel, the Wikipedia article on "simulated annealing" is a
48
+ * useful mental model for why early exploration is broader and later updates are
49
+ * more conservative.
50
+ *
59
51
  * Run (from repo root):
60
52
  * `npx ts-node test/examples/flappy_bird/trainFlappyBird.ts`
53
+ *
54
+ * @example
55
+ * ```ts
56
+ * await runTrainer();
57
+ * ```
61
58
  */
62
59
  export async function runTrainer(): Promise<void> {
63
60
  const trainerSetup = createTrainerSetup();
@@ -90,531 +87,14 @@ export async function runTrainer(): Promise<void> {
90
87
  console.log(FLAPPY_TRAINER_STOPPED_MESSAGE);
91
88
  }
92
89
 
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
90
  /**
617
91
  * Handles fatal `main` rejection path.
92
+ *
93
+ * The trainer keeps this boundary small so unexpected failures are formatted in
94
+ * one consistent place before reaching the CLI.
95
+ *
96
+ * @param error - Unknown rejection reason from trainer execution.
97
+ * @returns Nothing.
618
98
  */
619
99
  export function handleTrainerMainError(error: unknown): void {
620
100
  // eslint-disable-next-line no-console
@@ -626,6 +106,11 @@ if (isDirectTrainerExecution()) {
626
106
  runTrainer().catch(handleTrainerMainError);
627
107
  }
628
108
 
109
+ /**
110
+ * Resolves whether this module is the direct Node entrypoint.
111
+ *
112
+ * @returns `true` when Node launched this file directly.
113
+ */
629
114
  function isDirectTrainerExecution(): boolean {
630
115
  const entryScriptPath = process.argv[1];
631
116
  if (!entryScriptPath) {