@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
@@ -0,0 +1,253 @@
1
+ # trainer/evaluation
2
+
3
+ ## trainer/evaluation/trainer.evaluation.service.types.ts
4
+
5
+ ### PopulationAggregateScoringContext
6
+
7
+ Aggregate scoring context shared while computing frame-primary scores.
8
+
9
+ The context precomputes population-wide reference values so per-genome scoring
10
+ can stay simple and deterministic.
11
+
12
+ ### PopulationStageEvaluationRequest
13
+
14
+ Candidate-stage request used by the staged population evaluator.
15
+
16
+ Keeping this internal contract narrow lets the orchestration service choose
17
+ a candidate budget without coupling the execution helpers to generation-plan
18
+ details.
19
+
20
+ This shape is intentionally stage-agnostic: quick, full, and reevaluation can
21
+ all use the same execution helper by changing only candidate count, seed set,
22
+ and rollout budget.
23
+
24
+ ## trainer/evaluation/trainer.evaluation.service.ts
25
+
26
+ ### commitPopulationScores
27
+
28
+ `(population: readonly import("test/examples/flappy_bird/trainer/trainer.types").FlappyTrainerNetwork[], provisionalScoresByGenome: ReadonlyMap<import("test/examples/flappy_bird/trainer/trainer.types").FlappyTrainerNetwork, number>) => void`
29
+
30
+ Commits provisional scores to genome score fields.
31
+
32
+ Provisional scores are kept in a map during staging so each phase can refresh
33
+ them without mutating the genomes too early. This helper performs the final
34
+ write-back once staged evaluation is complete.
35
+
36
+ Parameters:
37
+ - `population` - - Current population.
38
+ - `provisionalScoresByGenome` - - Final provisional score map.
39
+
40
+ Returns: Nothing.
41
+
42
+ ### evaluatePopulationFullStage
43
+
44
+ `(population: readonly import("test/examples/flappy_bird/trainer/trainer.types").FlappyTrainerNetwork[], generationEvaluationPlan: import("test/examples/flappy_bird/trainer/trainer.types").FlappyGenerationEvaluationPlan, aggregateByGenome: Map<import("test/examples/flappy_bird/trainer/trainer.types").FlappyTrainerNetwork, import("test/examples/flappy_bird/evaluation/evaluation.types").FlappySeedBatchEvaluation>, provisionalScoresByGenome: Map<import("test/examples/flappy_bird/trainer/trainer.types").FlappyTrainerNetwork, number>, elitismCount: number) => void`
45
+
46
+ Executes the full evaluation stage over the top provisional candidates.
47
+
48
+ This is the middle-cost stage in the ranking ladder: not every genome
49
+ survives into it, but the survivors receive a more trustworthy estimate than
50
+ the quick screen alone can provide.
51
+
52
+ Parameters:
53
+ - `population` - - Current population.
54
+ - `generationEvaluationPlan` - - Per-generation staged evaluation plan.
55
+ - `aggregateByGenome` - - Mutable aggregate cache keyed by genome.
56
+ - `provisionalScoresByGenome` - - Mutable provisional score map.
57
+ - `elitismCount` - - Configured elitism count.
58
+
59
+ Returns: Nothing.
60
+
61
+ ### evaluatePopulationQuickStage
62
+
63
+ `(population: readonly import("test/examples/flappy_bird/trainer/trainer.types").FlappyTrainerNetwork[], generationEvaluationPlan: import("test/examples/flappy_bird/trainer/trainer.types").FlappyGenerationEvaluationPlan, aggregateByGenome: Map<import("test/examples/flappy_bird/trainer/trainer.types").FlappyTrainerNetwork, import("test/examples/flappy_bird/evaluation/evaluation.types").FlappySeedBatchEvaluation>, provisionalScoresByGenome: Map<import("test/examples/flappy_bird/trainer/trainer.types").FlappyTrainerNetwork, number>) => void`
64
+
65
+ Executes the quick evaluation stage over the full population.
66
+
67
+ Educational note:
68
+ The quick stage is a cheap screening pass. Every genome is tested on the same
69
+ small shared seed batch so the trainer can discard obviously weak candidates
70
+ before spending more rollout budget on them.
71
+
72
+ Parameters:
73
+ - `population` - - Current population.
74
+ - `generationEvaluationPlan` - - Per-generation staged evaluation plan.
75
+ - `aggregateByGenome` - - Mutable aggregate cache keyed by genome.
76
+ - `provisionalScoresByGenome` - - Mutable provisional score map.
77
+
78
+ Returns: Nothing.
79
+
80
+ ### evaluatePopulationReevaluationStage
81
+
82
+ `(population: readonly import("test/examples/flappy_bird/trainer/trainer.types").FlappyTrainerNetwork[], generationEvaluationPlan: import("test/examples/flappy_bird/trainer/trainer.types").FlappyGenerationEvaluationPlan, aggregateByGenome: Map<import("test/examples/flappy_bird/trainer/trainer.types").FlappyTrainerNetwork, import("test/examples/flappy_bird/evaluation/evaluation.types").FlappySeedBatchEvaluation>, provisionalScoresByGenome: Map<import("test/examples/flappy_bird/trainer/trainer.types").FlappyTrainerNetwork, number>, elitismCount: number) => void`
83
+
84
+ Executes the large-seed reevaluation stage over top candidates.
85
+
86
+ Educational note:
87
+ Reevaluation is the trainer's anti-luck pass. The best provisional genomes
88
+ are tested again on a larger shared seed batch so leaderboard positions are
89
+ less sensitive to a fortunate early sample.
90
+
91
+ Parameters:
92
+ - `population` - - Current population.
93
+ - `generationEvaluationPlan` - - Per-generation staged evaluation plan.
94
+ - `aggregateByGenome` - - Mutable aggregate cache keyed by genome.
95
+ - `provisionalScoresByGenome` - - Mutable provisional score map.
96
+ - `elitismCount` - - Configured elitism count.
97
+
98
+ Returns: Nothing.
99
+
100
+ ### resolveFullPassCandidateCount
101
+
102
+ `(populationSize: number, elitismCount: number) => number`
103
+
104
+ Resolves how many genomes should advance to the full-pass stage.
105
+
106
+ The trainer uses the larger of two budgets so the full stage stays large
107
+ enough to preserve competitive diversity while still shrinking meaningfully
108
+ relative to the full population.
109
+
110
+ Parameters:
111
+ - `populationSize` - - Population size.
112
+ - `elitismCount` - - Configured elitism count.
113
+
114
+ Returns: Full-pass candidate count.
115
+
116
+ ## trainer/evaluation/trainer.evaluation.service.services.ts
117
+
118
+ ### evaluatePopulationSelectedCandidateStage
119
+
120
+ `(population: readonly import("test/examples/flappy_bird/trainer/trainer.types").FlappyTrainerNetwork[], populationStageEvaluationRequest: import("test/examples/flappy_bird/trainer/evaluation/trainer.evaluation.service.types").PopulationStageEvaluationRequest, aggregateByGenome: Map<import("test/examples/flappy_bird/trainer/trainer.types").FlappyTrainerNetwork, import("test/examples/flappy_bird/evaluation/evaluation.types").FlappySeedBatchEvaluation>, provisionalScoresByGenome: Map<import("test/examples/flappy_bird/trainer/trainer.types").FlappyTrainerNetwork, number>) => void`
121
+
122
+ Evaluates a selected candidate subset for a population stage.
123
+
124
+ Educational note:
125
+ This helper is the workhorse behind the full and reevaluation stages. It
126
+ turns a stage request into three steps: pick candidates, evaluate them across
127
+ shared seeds, then refresh the provisional ranking for the whole population.
128
+
129
+ Parameters:
130
+ - `population` - - Current population.
131
+ - `populationStageEvaluationRequest` - - Candidate-stage evaluation request.
132
+ - `aggregateByGenome` - - Mutable aggregate cache keyed by genome.
133
+ - `provisionalScoresByGenome` - - Mutable provisional score map.
134
+
135
+ Returns: Nothing.
136
+
137
+ ### evaluateSpecificGenomesAcrossSeeds
138
+
139
+ `(genomes: readonly import("test/examples/flappy_bird/trainer/trainer.types").FlappyTrainerNetwork[], sharedSeeds: readonly number[], rolloutOptions: import("test/examples/flappy_bird/evaluation/evaluation.types").FlappyRolloutOptions, aggregateByGenome: Map<import("test/examples/flappy_bird/trainer/trainer.types").FlappyTrainerNetwork, import("test/examples/flappy_bird/evaluation/evaluation.types").FlappySeedBatchEvaluation>) => void`
140
+
141
+ Evaluates a specific genome subset across shared seeds.
142
+
143
+ Shared seeds are the fairness mechanism in this trainer. Every selected genome
144
+ sees the same randomized episode batch for the stage, so comparisons are much
145
+ less noisy than per-genome private seed sampling.
146
+
147
+ For background reading, the Wikipedia article on "control variates" is a good
148
+ intuition pump for why holding part of the randomness fixed can reduce
149
+ variance when comparing alternatives.
150
+
151
+ Parameters:
152
+ - `genomes` - - Genomes selected for evaluation.
153
+ - `sharedSeeds` - - Shared deterministic seeds.
154
+ - `rolloutOptions` - - Rollout options for this stage.
155
+ - `aggregateByGenome` - - Mutable aggregate cache keyed by genome.
156
+
157
+ Returns: Nothing.
158
+
159
+ ## trainer/evaluation/trainer.evaluation.service.constants.ts
160
+
161
+ ### trainer.evaluation.service.constants
162
+
163
+ Fallback score assigned to genomes that have not yet been evaluated.
164
+
165
+ Using negative infinity guarantees unevaluated genomes lose any ranking tie
166
+ against genomes that already have real aggregate results.
167
+
168
+ ### FLAPPY_TRAINER_MIN_PIPE_PROGRESS
169
+
170
+ ### FLAPPY_TRAINER_NEGATIVE_INFINITY_SCORE
171
+
172
+ ## trainer/evaluation/trainer.evaluation.service.utils.ts
173
+
174
+ ### assignFramePrimaryScores
175
+
176
+ `(population: readonly import("test/examples/flappy_bird/trainer/trainer.types").FlappyTrainerNetwork[], aggregateByGenome: ReadonlyMap<import("test/examples/flappy_bird/trainer/trainer.types").FlappyTrainerNetwork, import("test/examples/flappy_bird/evaluation/evaluation.types").FlappySeedBatchEvaluation>, provisionalScoresByGenome: Map<import("test/examples/flappy_bird/trainer/trainer.types").FlappyTrainerNetwork, number>) => void`
177
+
178
+ Assigns refreshed frame-primary scores to the current population.
179
+
180
+ Educational note:
181
+ The trainer does not rank genomes purely by one raw metric. It combines pipe
182
+ progress, survival, and stability into a provisional score so early-stage
183
+ selection remains robust when several genomes are close in quality.
184
+
185
+ Parameters:
186
+ - `population` - - Current population.
187
+ - `aggregateByGenome` - - Aggregate cache keyed by genome.
188
+ - `provisionalScoresByGenome` - - Mutable provisional score map.
189
+
190
+ Returns: Nothing.
191
+
192
+ ### collectAggregateValues
193
+
194
+ `(population: readonly import("test/examples/flappy_bird/trainer/trainer.types").FlappyTrainerNetwork[], aggregateByGenome: ReadonlyMap<import("test/examples/flappy_bird/trainer/trainer.types").FlappyTrainerNetwork, import("test/examples/flappy_bird/evaluation/evaluation.types").FlappySeedBatchEvaluation>) => import("test/examples/flappy_bird/evaluation/evaluation.types").FlappySeedBatchEvaluation[]`
195
+
196
+ Collects all currently available aggregate values.
197
+
198
+ Only genomes with completed aggregate results are included. That lets the
199
+ scoring helpers distinguish between genuinely weak genomes and genomes that
200
+ simply have not yet reached a later stage.
201
+
202
+ Parameters:
203
+ - `population` - - Current population.
204
+ - `aggregateByGenome` - - Aggregate cache keyed by genome.
205
+
206
+ Returns: Collected aggregate values.
207
+
208
+ ### resolveMaximumMeanPipesPassed
209
+
210
+ `(aggregateValues: readonly import("test/examples/flappy_bird/evaluation/evaluation.types").FlappySeedBatchEvaluation[]) => number`
211
+
212
+ Resolves the leading mean pipe-progress value across available aggregates.
213
+
214
+ Mean pipe progress acts as the leading indicator for the frame-primary score:
215
+ if a genome is far behind the current pipe leader, it falls back to a simpler
216
+ progress-first score.
217
+
218
+ Parameters:
219
+ - `aggregateValues` - - Aggregate values currently available.
220
+
221
+ Returns: Highest mean pipe-progress value.
222
+
223
+ ### resolvePopulationAggregateScoringContext
224
+
225
+ `(population: readonly import("test/examples/flappy_bird/trainer/trainer.types").FlappyTrainerNetwork[], aggregateByGenome: ReadonlyMap<import("test/examples/flappy_bird/trainer/trainer.types").FlappyTrainerNetwork, import("test/examples/flappy_bird/evaluation/evaluation.types").FlappySeedBatchEvaluation>) => import("test/examples/flappy_bird/trainer/evaluation/trainer.evaluation.service.types").PopulationAggregateScoringContext`
226
+
227
+ Resolves the aggregate scoring context used by frame-primary scoring.
228
+
229
+ This precomputation step keeps the per-genome scoring loop lean and avoids
230
+ recomputing population-wide maxima for every genome.
231
+
232
+ Parameters:
233
+ - `population` - - Current population.
234
+ - `aggregateByGenome` - - Aggregate cache keyed by genome.
235
+
236
+ Returns: Aggregate scoring context.
237
+
238
+ ### scoreAggregateFramePrimary
239
+
240
+ `(aggregate: import("test/examples/flappy_bird/evaluation/evaluation.types").FlappySeedBatchEvaluation, maximumMeanPipesPassed: number) => number`
241
+
242
+ Scores one aggregate using the frame-primary heuristic.
243
+
244
+ Educational note:
245
+ The heuristic intentionally mixes progress and stability. A genome that passes
246
+ many pipes but has wildly inconsistent fitness across seeds is treated more
247
+ cautiously than a similarly strong but steadier genome.
248
+
249
+ Parameters:
250
+ - `aggregate` - - Aggregate evaluation result.
251
+ - `maximumMeanPipesPassed` - - Best mean pipe progress in the population.
252
+
253
+ Returns: Provisional score.
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Fallback score assigned to genomes that have not yet been evaluated.
3
+ *
4
+ * Using negative infinity guarantees unevaluated genomes lose any ranking tie
5
+ * against genomes that already have real aggregate results.
6
+ */
7
+ export const FLAPPY_TRAINER_NEGATIVE_INFINITY_SCORE = Number.NEGATIVE_INFINITY;
8
+
9
+ /**
10
+ * Minimum pipe-progress baseline used when no aggregates are available.
11
+ *
12
+ * This keeps early-stage aggregate scoring well-defined even before any genome
13
+ * has established meaningful pipe progress.
14
+ */
15
+ export const FLAPPY_TRAINER_MIN_PIPE_PROGRESS = 0;
@@ -0,0 +1,86 @@
1
+ import {
2
+ evaluateFlappyFitnessAcrossSeeds,
3
+ type FlappyRolloutOptions,
4
+ type FlappySeedBatchEvaluation,
5
+ } from '../../flappyEvaluation';
6
+ import { selectTopGenomesByScore } from '../trainer.selection.utils';
7
+ import type { FlappyTrainerNetwork } from '../trainer.types';
8
+ import { assignFramePrimaryScores } from './trainer.evaluation.service.utils';
9
+ import type { PopulationStageEvaluationRequest } from './trainer.evaluation.service.types';
10
+
11
+ /**
12
+ * Evaluates a selected candidate subset for a population stage.
13
+ *
14
+ * Educational note:
15
+ * This helper is the workhorse behind the full and reevaluation stages. It
16
+ * turns a stage request into three steps: pick candidates, evaluate them across
17
+ * shared seeds, then refresh the provisional ranking for the whole population.
18
+ *
19
+ * @param population - Current population.
20
+ * @param populationStageEvaluationRequest - Candidate-stage evaluation request.
21
+ * @param aggregateByGenome - Mutable aggregate cache keyed by genome.
22
+ * @param provisionalScoresByGenome - Mutable provisional score map.
23
+ * @returns Nothing.
24
+ */
25
+ export function evaluatePopulationSelectedCandidateStage(
26
+ population: readonly FlappyTrainerNetwork[],
27
+ populationStageEvaluationRequest: PopulationStageEvaluationRequest,
28
+ aggregateByGenome: Map<FlappyTrainerNetwork, FlappySeedBatchEvaluation>,
29
+ provisionalScoresByGenome: Map<FlappyTrainerNetwork, number>,
30
+ ): void {
31
+ // Step 1: Select the top-scoring candidates for the requested stage.
32
+ const selectedCandidates = selectTopGenomesByScore(
33
+ population,
34
+ provisionalScoresByGenome,
35
+ populationStageEvaluationRequest.candidateCount,
36
+ );
37
+
38
+ // Step 2: Evaluate the selected candidates across the stage's shared seeds.
39
+ evaluateSpecificGenomesAcrossSeeds(
40
+ selectedCandidates,
41
+ populationStageEvaluationRequest.sharedSeeds,
42
+ populationStageEvaluationRequest.rolloutOptions,
43
+ aggregateByGenome,
44
+ );
45
+
46
+ // Step 3: Refresh frame-primary scores for the full population.
47
+ assignFramePrimaryScores(
48
+ population,
49
+ aggregateByGenome,
50
+ provisionalScoresByGenome,
51
+ );
52
+ }
53
+
54
+ /**
55
+ * Evaluates a specific genome subset across shared seeds.
56
+ *
57
+ * Shared seeds are the fairness mechanism in this trainer. Every selected genome
58
+ * sees the same randomized episode batch for the stage, so comparisons are much
59
+ * less noisy than per-genome private seed sampling.
60
+ *
61
+ * For background reading, the Wikipedia article on "control variates" is a good
62
+ * intuition pump for why holding part of the randomness fixed can reduce
63
+ * variance when comparing alternatives.
64
+ *
65
+ * @param genomes - Genomes selected for evaluation.
66
+ * @param sharedSeeds - Shared deterministic seeds.
67
+ * @param rolloutOptions - Rollout options for this stage.
68
+ * @param aggregateByGenome - Mutable aggregate cache keyed by genome.
69
+ * @returns Nothing.
70
+ */
71
+ export function evaluateSpecificGenomesAcrossSeeds(
72
+ genomes: readonly FlappyTrainerNetwork[],
73
+ sharedSeeds: readonly number[],
74
+ rolloutOptions: FlappyRolloutOptions,
75
+ aggregateByGenome: Map<FlappyTrainerNetwork, FlappySeedBatchEvaluation>,
76
+ ): void {
77
+ // Step 1: Evaluate each selected genome independently across the shared batch.
78
+ for (const genome of genomes) {
79
+ const aggregate = evaluateFlappyFitnessAcrossSeeds(
80
+ genome,
81
+ sharedSeeds,
82
+ rolloutOptions,
83
+ );
84
+ aggregateByGenome.set(genome, aggregate);
85
+ }
86
+ }
@@ -0,0 +1,187 @@
1
+ import type { FlappySeedBatchEvaluation } from '../../flappyEvaluation';
2
+ import {
3
+ FLAPPY_TRAINER_FULL_PASS_ELITISM_MULTIPLIER,
4
+ FLAPPY_TRAINER_FULL_PASS_POPULATION_FRACTION,
5
+ FLAPPY_TRAINER_REEVALUATION_MIN_CANDIDATE_COUNT,
6
+ } from '../trainer.constants';
7
+ import type {
8
+ FlappyGenerationEvaluationPlan,
9
+ FlappyTrainerNetwork,
10
+ } from '../trainer.types';
11
+ import { FLAPPY_TRAINER_NEGATIVE_INFINITY_SCORE } from './trainer.evaluation.service.constants';
12
+ import {
13
+ evaluatePopulationSelectedCandidateStage,
14
+ evaluateSpecificGenomesAcrossSeeds,
15
+ } from './trainer.evaluation.service.services';
16
+ import { assignFramePrimaryScores } from './trainer.evaluation.service.utils';
17
+ import type { PopulationStageEvaluationRequest } from './trainer.evaluation.service.types';
18
+
19
+ /**
20
+ * Executes the quick evaluation stage over the full population.
21
+ *
22
+ * Educational note:
23
+ * The quick stage is a cheap screening pass. Every genome is tested on the same
24
+ * small shared seed batch so the trainer can discard obviously weak candidates
25
+ * before spending more rollout budget on them.
26
+ *
27
+ * @param population - Current population.
28
+ * @param generationEvaluationPlan - Per-generation staged evaluation plan.
29
+ * @param aggregateByGenome - Mutable aggregate cache keyed by genome.
30
+ * @param provisionalScoresByGenome - Mutable provisional score map.
31
+ * @returns Nothing.
32
+ *
33
+ * @example
34
+ * ```ts
35
+ * evaluatePopulationQuickStage(
36
+ * population,
37
+ * generationEvaluationPlan,
38
+ * aggregateByGenome,
39
+ * provisionalScoresByGenome,
40
+ * );
41
+ * ```
42
+ */
43
+ export function evaluatePopulationQuickStage(
44
+ population: readonly FlappyTrainerNetwork[],
45
+ generationEvaluationPlan: FlappyGenerationEvaluationPlan,
46
+ aggregateByGenome: Map<FlappyTrainerNetwork, FlappySeedBatchEvaluation>,
47
+ provisionalScoresByGenome: Map<FlappyTrainerNetwork, number>,
48
+ ): void {
49
+ evaluateSpecificGenomesAcrossSeeds(
50
+ population,
51
+ generationEvaluationPlan.quickSeeds,
52
+ generationEvaluationPlan.quickRolloutOptions,
53
+ aggregateByGenome,
54
+ );
55
+
56
+ assignFramePrimaryScores(
57
+ population,
58
+ aggregateByGenome,
59
+ provisionalScoresByGenome,
60
+ );
61
+ }
62
+
63
+ /**
64
+ * Executes the full evaluation stage over the top provisional candidates.
65
+ *
66
+ * This is the middle-cost stage in the ranking ladder: not every genome
67
+ * survives into it, but the survivors receive a more trustworthy estimate than
68
+ * the quick screen alone can provide.
69
+ *
70
+ * @param population - Current population.
71
+ * @param generationEvaluationPlan - Per-generation staged evaluation plan.
72
+ * @param aggregateByGenome - Mutable aggregate cache keyed by genome.
73
+ * @param provisionalScoresByGenome - Mutable provisional score map.
74
+ * @param elitismCount - Configured elitism count.
75
+ * @returns Nothing.
76
+ */
77
+ export function evaluatePopulationFullStage(
78
+ population: readonly FlappyTrainerNetwork[],
79
+ generationEvaluationPlan: FlappyGenerationEvaluationPlan,
80
+ aggregateByGenome: Map<FlappyTrainerNetwork, FlappySeedBatchEvaluation>,
81
+ provisionalScoresByGenome: Map<FlappyTrainerNetwork, number>,
82
+ elitismCount: number,
83
+ ): void {
84
+ // Step 1: Resolve the candidate-stage request for the full evaluation pass.
85
+ const populationStageEvaluationRequest = {
86
+ candidateCount: resolveFullPassCandidateCount(
87
+ population.length,
88
+ elitismCount,
89
+ ),
90
+ sharedSeeds: generationEvaluationPlan.fullSeeds,
91
+ rolloutOptions: generationEvaluationPlan.fullRolloutOptions,
92
+ } satisfies PopulationStageEvaluationRequest;
93
+
94
+ // Step 2: Evaluate the selected candidates and refresh provisional scores.
95
+ evaluatePopulationSelectedCandidateStage(
96
+ population,
97
+ populationStageEvaluationRequest,
98
+ aggregateByGenome,
99
+ provisionalScoresByGenome,
100
+ );
101
+ }
102
+
103
+ /**
104
+ * Executes the large-seed reevaluation stage over top candidates.
105
+ *
106
+ * Educational note:
107
+ * Reevaluation is the trainer's anti-luck pass. The best provisional genomes
108
+ * are tested again on a larger shared seed batch so leaderboard positions are
109
+ * less sensitive to a fortunate early sample.
110
+ *
111
+ * @param population - Current population.
112
+ * @param generationEvaluationPlan - Per-generation staged evaluation plan.
113
+ * @param aggregateByGenome - Mutable aggregate cache keyed by genome.
114
+ * @param provisionalScoresByGenome - Mutable provisional score map.
115
+ * @param elitismCount - Configured elitism count.
116
+ * @returns Nothing.
117
+ */
118
+ export function evaluatePopulationReevaluationStage(
119
+ population: readonly FlappyTrainerNetwork[],
120
+ generationEvaluationPlan: FlappyGenerationEvaluationPlan,
121
+ aggregateByGenome: Map<FlappyTrainerNetwork, FlappySeedBatchEvaluation>,
122
+ provisionalScoresByGenome: Map<FlappyTrainerNetwork, number>,
123
+ elitismCount: number,
124
+ ): void {
125
+ // Step 1: Resolve the candidate-stage request for reevaluation.
126
+ const populationStageEvaluationRequest = {
127
+ candidateCount: Math.max(
128
+ elitismCount,
129
+ FLAPPY_TRAINER_REEVALUATION_MIN_CANDIDATE_COUNT,
130
+ ),
131
+ sharedSeeds: generationEvaluationPlan.reevaluationSeeds,
132
+ rolloutOptions: generationEvaluationPlan.reevaluationRolloutOptions,
133
+ } satisfies PopulationStageEvaluationRequest;
134
+
135
+ // Step 2: Evaluate the selected candidates and refresh provisional scores.
136
+ evaluatePopulationSelectedCandidateStage(
137
+ population,
138
+ populationStageEvaluationRequest,
139
+ aggregateByGenome,
140
+ provisionalScoresByGenome,
141
+ );
142
+ }
143
+
144
+ /**
145
+ * Commits provisional scores to genome score fields.
146
+ *
147
+ * Provisional scores are kept in a map during staging so each phase can refresh
148
+ * them without mutating the genomes too early. This helper performs the final
149
+ * write-back once staged evaluation is complete.
150
+ *
151
+ * @param population - Current population.
152
+ * @param provisionalScoresByGenome - Final provisional score map.
153
+ * @returns Nothing.
154
+ */
155
+ export function commitPopulationScores(
156
+ population: readonly FlappyTrainerNetwork[],
157
+ provisionalScoresByGenome: ReadonlyMap<FlappyTrainerNetwork, number>,
158
+ ): void {
159
+ // Step 1: Copy provisional scores into the mutable genome score fields.
160
+ for (const genome of population) {
161
+ genome.score =
162
+ provisionalScoresByGenome.get(genome) ??
163
+ FLAPPY_TRAINER_NEGATIVE_INFINITY_SCORE;
164
+ }
165
+ }
166
+
167
+ /**
168
+ * Resolves how many genomes should advance to the full-pass stage.
169
+ *
170
+ * The trainer uses the larger of two budgets so the full stage stays large
171
+ * enough to preserve competitive diversity while still shrinking meaningfully
172
+ * relative to the full population.
173
+ *
174
+ * @param populationSize - Population size.
175
+ * @param elitismCount - Configured elitism count.
176
+ * @returns Full-pass candidate count.
177
+ */
178
+ function resolveFullPassCandidateCount(
179
+ populationSize: number,
180
+ elitismCount: number,
181
+ ): number {
182
+ // Step 1: Use the larger of the elitism-based and population-fraction candidate budgets.
183
+ return Math.max(
184
+ elitismCount * FLAPPY_TRAINER_FULL_PASS_ELITISM_MULTIPLIER,
185
+ Math.floor(populationSize * FLAPPY_TRAINER_FULL_PASS_POPULATION_FRACTION),
186
+ );
187
+ }
@@ -0,0 +1,32 @@
1
+ import type {
2
+ FlappyRolloutOptions,
3
+ FlappySeedBatchEvaluation,
4
+ } from '../../flappyEvaluation';
5
+
6
+ /**
7
+ * Candidate-stage request used by the staged population evaluator.
8
+ *
9
+ * Keeping this internal contract narrow lets the orchestration service choose
10
+ * a candidate budget without coupling the execution helpers to generation-plan
11
+ * details.
12
+ *
13
+ * This shape is intentionally stage-agnostic: quick, full, and reevaluation can
14
+ * all use the same execution helper by changing only candidate count, seed set,
15
+ * and rollout budget.
16
+ */
17
+ export type PopulationStageEvaluationRequest = {
18
+ candidateCount: number;
19
+ sharedSeeds: readonly number[];
20
+ rolloutOptions: FlappyRolloutOptions;
21
+ };
22
+
23
+ /**
24
+ * Aggregate scoring context shared while computing frame-primary scores.
25
+ *
26
+ * The context precomputes population-wide reference values so per-genome scoring
27
+ * can stay simple and deterministic.
28
+ */
29
+ export type PopulationAggregateScoringContext = {
30
+ aggregateValues: FlappySeedBatchEvaluation[];
31
+ maximumMeanPipesPassed: number;
32
+ };