@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
@@ -4,10 +4,21 @@ import type {
4
4
  SharedObservationMemoryState,
5
5
  } from '../flappy.simulation.shared.utils';
6
6
 
7
- /** Loose JSON-compatible network payload used by worker messages. */
7
+ /**
8
+ * Loose JSON-compatible network payload used by worker messages.
9
+ *
10
+ * The worker never posts live `Network` instances back to the browser host.
11
+ * Instead it sends the result of `network.toJSON()` so the payload stays
12
+ * structured-clone safe and easy to inspect in devtools.
13
+ */
8
14
  export type SerializedNetwork = Record<string, unknown>;
9
15
 
10
- /** Mutable pipe state tracked by the worker playback simulation. */
16
+ /**
17
+ * Mutable pipe state tracked by the worker playback simulation.
18
+ *
19
+ * These objects exist only inside the worker runtime. The host later receives a
20
+ * packed snapshot derived from them rather than these live mutable records.
21
+ */
11
22
  export interface WorkerPopulationPipe {
12
23
  id: number;
13
24
  xPx: number;
@@ -15,10 +26,16 @@ export interface WorkerPopulationPipe {
15
26
  gapSizePx: number;
16
27
  }
17
28
 
18
- /** Mutable bird state tracked by the worker playback simulation. */
29
+ /**
30
+ * Mutable bird state tracked by the worker playback simulation.
31
+ *
32
+ * Educational note:
33
+ * Each bird keeps both physics state and policy state. The observation-memory
34
+ * field lets feed-forward networks approximate short-term temporal memory by
35
+ * carrying previous observation features between simulation steps.
36
+ */
19
37
  export interface WorkerPopulationBird {
20
38
  network: Network;
21
- color: string;
22
39
  observationMemoryState: SharedObservationMemoryState;
23
40
  yPx: number;
24
41
  velocityYPxPerFrame: number;
@@ -29,9 +46,16 @@ export interface WorkerPopulationBird {
29
46
  doneReason?: 'collision' | 'out_of_bounds';
30
47
  }
31
48
 
32
- /** Mutable simulation state stored between worker playback requests. */
49
+ /**
50
+ * Mutable simulation state stored between worker playback requests.
51
+ *
52
+ * A `start-playback` message creates this state once, and each
53
+ * `request-playback-step` message advances it by a host-selected number of
54
+ * simulation steps.
55
+ */
33
56
  export interface WorkerPlaybackState {
34
57
  frameIndex: number;
58
+ cumulativePipeTravelPx: number;
35
59
  visibleWorldWidthPx: number;
36
60
  visibleWorldHeightPx: number;
37
61
  nextPipeId: number;
@@ -43,16 +67,25 @@ export interface WorkerPlaybackState {
43
67
  birds: WorkerPopulationBird[];
44
68
  }
45
69
 
46
- /** Render-only bird snapshot DTO posted to host. */
70
+ /**
71
+ * Render-only bird snapshot DTO posted to host.
72
+ *
73
+ * This shape is useful conceptually, but the current transport uses the packed
74
+ * typed-array variant for lower allocation and transfer cost.
75
+ */
47
76
  export interface WorkerFrameBirdSnapshot {
48
- color: string;
49
77
  yPx: number;
50
78
  pipesPassed: number;
51
79
  framesSurvived: number;
52
80
  done: boolean;
53
81
  }
54
82
 
55
- /** Render-only pipe snapshot DTO posted to host. */
83
+ /**
84
+ * Render-only pipe snapshot DTO posted to host.
85
+ *
86
+ * Like `WorkerFrameBirdSnapshot`, this documents the logical payload shape even
87
+ * though the worker currently sends the packed transport form.
88
+ */
56
89
  export interface WorkerFramePipeSnapshot {
57
90
  id: number;
58
91
  xPx: number;
@@ -60,16 +93,70 @@ export interface WorkerFramePipeSnapshot {
60
93
  gapSizePx: number;
61
94
  }
62
95
 
63
- /** Full frame snapshot payload posted to host. */
96
+ /**
97
+ * Packed typed-array payload for playback pipe snapshot transport.
98
+ *
99
+ * Packing the per-pipe fields into column-oriented typed arrays makes the
100
+ * browser/worker boundary cheaper than sending large arrays of object literals
101
+ * on every animation frame.
102
+ */
103
+ export interface WorkerPackedPlaybackPipeSnapshot {
104
+ xPositionsPx: Float32Array;
105
+ gapCenterYPositionsPx: Float32Array;
106
+ gapSizesPx: Float32Array;
107
+ }
108
+
109
+ /**
110
+ * Packed typed-array payload for playback bird snapshot transport.
111
+ *
112
+ * The host can reconstruct renderer-friendly bird views from these arrays while
113
+ * the worker keeps the authoritative mutable simulation objects private.
114
+ */
115
+ export interface WorkerPackedPlaybackBirdSnapshot {
116
+ yPositionsPx: Float32Array;
117
+ pipesPassed: Uint32Array;
118
+ framesSurvived: Uint32Array;
119
+ doneFlags: Uint8Array;
120
+ }
121
+
122
+ /**
123
+ * Full frame snapshot payload posted to host.
124
+ *
125
+ * Educational note:
126
+ * `packed-v1` is a transport contract, not a rendering primitive. The versioned
127
+ * format string gives the browser host a stable way to decode snapshots even if
128
+ * the worker later gains additional packed fields or alternate transport modes.
129
+ *
130
+ * @example
131
+ * ```ts
132
+ * const message = {
133
+ * type: 'playback-step',
134
+ * payload: {
135
+ * requestId: 7,
136
+ * snapshot,
137
+ * done: false,
138
+ * },
139
+ * };
140
+ * ```
141
+ */
64
142
  export interface WorkerPlaybackFrameSnapshot {
143
+ format: 'packed-v1';
65
144
  frameIndex: number;
145
+ cumulativePipeTravelPx: number;
66
146
  visibleWorldWidthPx: number;
67
147
  visibleWorldHeightPx: number;
68
- pipes: WorkerFramePipeSnapshot[];
69
- birds: WorkerFrameBirdSnapshot[];
148
+ pipeCount: number;
149
+ birdCount: number;
150
+ pipes: WorkerPackedPlaybackPipeSnapshot;
151
+ birds: WorkerPackedPlaybackBirdSnapshot;
70
152
  }
71
153
 
72
- /** Worker init request message. */
154
+ /**
155
+ * Worker init request message.
156
+ *
157
+ * This is the first message the host should send. It seeds deterministic RNG
158
+ * state and configures the worker-local NEAT runtime.
159
+ */
73
160
  export interface WorkerInitMessage {
74
161
  type: 'init';
75
162
  payload: {
@@ -79,12 +166,23 @@ export interface WorkerInitMessage {
79
166
  };
80
167
  }
81
168
 
82
- /** Worker request asking to evolve one generation. */
169
+ /**
170
+ * Worker request asking to evolve one generation.
171
+ *
172
+ * The worker responds with `generation-ready` once the NEAT runtime finishes
173
+ * one evolution pass.
174
+ */
83
175
  export interface WorkerRequestGenerationMessage {
84
176
  type: 'request-generation';
85
177
  }
86
178
 
87
- /** Worker request asking to initialize playback state. */
179
+ /**
180
+ * Worker request asking to initialize playback state.
181
+ *
182
+ * This materializes the mutable world state for the current evolved population.
183
+ * After this message succeeds, the host can begin issuing playback-step
184
+ * requests.
185
+ */
88
186
  export interface WorkerStartPlaybackMessage {
89
187
  type: 'start-playback';
90
188
  payload: {
@@ -93,22 +191,40 @@ export interface WorkerStartPlaybackMessage {
93
191
  };
94
192
  }
95
193
 
96
- /** Worker request asking to advance playback by N simulation steps. */
194
+ /**
195
+ * Worker request asking to advance playback by N simulation steps.
196
+ *
197
+ * The host typically sends this once per animation frame and chooses
198
+ * `simulationSteps` based on how much simulation throughput it wants relative to
199
+ * rendering smoothness.
200
+ */
97
201
  export interface WorkerRequestPlaybackStepMessage {
98
202
  type: 'request-playback-step';
99
203
  payload: {
204
+ requestId: number;
100
205
  simulationSteps: number;
101
206
  visibleWorldWidthPx: number;
102
207
  visibleWorldHeightPx: number;
103
208
  };
104
209
  }
105
210
 
106
- /** Worker stop request message. */
211
+ /**
212
+ * Worker stop request message.
213
+ *
214
+ * This is a cooperative shutdown signal. Long-running worker flows can observe
215
+ * the stopped flag and fail fast instead of continuing work the UI no longer
216
+ * cares about.
217
+ */
107
218
  export interface WorkerStopMessage {
108
219
  type: 'stop';
109
220
  }
110
221
 
111
- /** Union of inbound worker request messages. */
222
+ /**
223
+ * Union of inbound worker request messages.
224
+ *
225
+ * Reading this union top-to-bottom is the quickest way to understand the worker
226
+ * protocol: initialize, evolve, start playback, step playback, then stop.
227
+ */
112
228
  export type WorkerRequestMessage =
113
229
  | WorkerInitMessage
114
230
  | WorkerRequestGenerationMessage
@@ -116,7 +232,12 @@ export type WorkerRequestMessage =
116
232
  | WorkerRequestPlaybackStepMessage
117
233
  | WorkerStopMessage;
118
234
 
119
- /** Worker generation-ready response message. */
235
+ /**
236
+ * Worker generation-ready response message.
237
+ *
238
+ * The browser host uses this message to refresh HUD state and optionally render
239
+ * the current best network visualization.
240
+ */
120
241
  export interface WorkerGenerationReadyMessage {
121
242
  type: 'generation-ready';
122
243
  payload: {
@@ -126,10 +247,21 @@ export interface WorkerGenerationReadyMessage {
126
247
  };
127
248
  }
128
249
 
129
- /** Worker playback-step response message. */
250
+ /**
251
+ * Worker playback-step response message.
252
+ *
253
+ * The message carries the packed frame snapshot plus optional instrumentation
254
+ * and end-of-run summary statistics when the whole simulated population has
255
+ * been eliminated.
256
+ *
257
+ * The split between per-frame snapshot data and end-of-run summary fields keeps
258
+ * the hot path compact while still giving the host enough telemetry to update
259
+ * HUD metrics when a playback session completes.
260
+ */
130
261
  export interface WorkerPlaybackStepMessage {
131
262
  type: 'playback-step';
132
263
  payload: {
264
+ requestId: number;
133
265
  snapshot: WorkerPlaybackFrameSnapshot;
134
266
  instrumentation?: {
135
267
  activationCallsPerFrame: number;
@@ -143,7 +275,12 @@ export interface WorkerPlaybackStepMessage {
143
275
  };
144
276
  }
145
277
 
146
- /** Worker error response message. */
278
+ /**
279
+ * Worker error response message.
280
+ *
281
+ * Errors are normalized into a display-safe string so the host UI can surface
282
+ * failures without depending on worker-specific exception classes.
283
+ */
147
284
  export interface WorkerErrorMessage {
148
285
  type: 'error';
149
286
  payload: {
@@ -151,11 +288,22 @@ export interface WorkerErrorMessage {
151
288
  };
152
289
  }
153
290
 
154
- /** Union of outbound worker response messages. */
291
+ /**
292
+ * Union of outbound worker response messages.
293
+ *
294
+ * Together with `WorkerRequestMessage`, this forms the full host/worker
295
+ * protocol contract for the demo.
296
+ */
155
297
  export type WorkerResponseMessage =
156
298
  | WorkerGenerationReadyMessage
157
299
  | WorkerPlaybackStepMessage
158
300
  | WorkerErrorMessage;
159
301
 
160
- /** Structured features used by heuristic generation-0 teacher policy. */
302
+ /**
303
+ * Structured features used by heuristic generation-0 teacher policy.
304
+ *
305
+ * The warm-start service reuses the same high-level observation semantics as the
306
+ * real policy inference path, which keeps the heuristic teacher aligned with the
307
+ * features evolved networks will later see.
308
+ */
161
309
  export type WorkerHeuristicObservationFeatures = SharedObservationFeatures;
@@ -0,0 +1,314 @@
1
+ import type { Neat } from '../../../../src/neataptic';
2
+ import type Network from '../../../../src/architecture/network';
3
+ import { createXorshift32 } from '../rng';
4
+ import {
5
+ commitObservationMemoryStep,
6
+ resolveFlapDecision,
7
+ resolveObservationVector,
8
+ } from '../browser-entry/browser-entry.observation.utils';
9
+ import { sampleGapCenterY } from '../browser-entry/browser-entry.spawn.utils';
10
+ import type {
11
+ WorkerHeuristicObservationFeatures,
12
+ WorkerPopulationPipe,
13
+ } from './flappy-evolution-worker.types';
14
+ import { FLAPPY_BIRD_VIEWPORT_X_RATIO } from '../constants/constants';
15
+ import {
16
+ FLAPPY_BIRD_RADIUS_PX,
17
+ FLAPPY_BIRD_X_PX,
18
+ FLAPPY_PIPE_COLLISION_ENTRANCE_EXPAND_PX,
19
+ FLAPPY_PIPE_COLLISION_SIDE_EXPAND_PX,
20
+ FLAPPY_CONTROL_SUBSTEPS_PER_FRAME,
21
+ FLAPPY_FLAP_VELOCITY_PX_PER_FRAME,
22
+ FLAPPY_GRAVITY_PX_PER_FRAME2,
23
+ FLAPPY_MAX_FALL_SPEED_PX_PER_FRAME,
24
+ FLAPPY_PIPE_WIDTH_PX,
25
+ FLAPPY_WORLD_HEIGHT_PX,
26
+ } from '../constants/constants';
27
+ import {
28
+ FLAPPY_WORKER_GEN0_PRETRAIN_BATCH_SIZE,
29
+ FLAPPY_WORKER_GEN0_PRETRAIN_BIAS_NOISE_STDDEV,
30
+ FLAPPY_WORKER_GEN0_PRETRAIN_ITERATIONS,
31
+ FLAPPY_WORKER_GEN0_PRETRAIN_RATE,
32
+ FLAPPY_WORKER_GEN0_PRETRAIN_SAMPLE_COUNT,
33
+ FLAPPY_WORKER_GEN0_PRETRAIN_VISIBLE_WORLD_WIDTH_PX,
34
+ FLAPPY_WORKER_GEN0_PRETRAIN_WEIGHT_NOISE_STDDEV,
35
+ } from './flappy-evolution-worker.constants';
36
+ import {
37
+ createSharedObservationMemoryState,
38
+ resolveAdaptiveDifficultyProfile,
39
+ } from '../flappy.simulation.shared.utils';
40
+
41
+ /**
42
+ * State carried between generation requests for one worker runtime.
43
+ *
44
+ * The warm-start service is intentionally one-shot. These fields let the worker
45
+ * remember whether generation 0 has already been bootstrapped and which initial
46
+ * RNG seed should be reused for deterministic synthetic sample generation.
47
+ */
48
+ export interface WorkerWarmStartState {
49
+ workerInitSeed: number;
50
+ generationZeroWarmStartApplied: boolean;
51
+ }
52
+
53
+ /**
54
+ * Applies a one-time generation-0 warm-start to improve initial demo quality.
55
+ *
56
+ * Educational note:
57
+ * The worker entry should stay protocol-first. This service owns the short
58
+ * supervised bootstrap pass that nudges generation 0 away from pure noise while
59
+ * preserving the later NEAT-driven search loop.
60
+ *
61
+ * Conceptually this is a lightweight behavior-cloning pass. If you want more
62
+ * background, the Wikipedia article on "imitation learning" is a helpful bridge
63
+ * between the heuristic teacher used here and the later evolutionary search.
64
+ *
65
+ * @param neatController - Initialized NEAT runtime.
66
+ * @param warmStartState - Mutable warm-start lifecycle state.
67
+ * @returns Promise resolved when warm-start evaluation finishes.
68
+ * @example
69
+ * ```ts
70
+ * await warmStartWorkerGenerationZeroIfNeeded(neatRuntime, {
71
+ * workerInitSeed: 123,
72
+ * generationZeroWarmStartApplied: false,
73
+ * });
74
+ * ```
75
+ */
76
+ export async function warmStartWorkerGenerationZeroIfNeeded(
77
+ neatController: Neat,
78
+ warmStartState: WorkerWarmStartState,
79
+ ): Promise<void> {
80
+ // Step 1: Exit fast when warm-start is already processed.
81
+ if (warmStartState.generationZeroWarmStartApplied) return;
82
+
83
+ // Step 2: Warm-start only generation 0 to avoid skewing later evolution.
84
+ if (neatController.generation !== 0) {
85
+ warmStartState.generationZeroWarmStartApplied = true;
86
+ return;
87
+ }
88
+
89
+ // Step 3: Validate population availability.
90
+ const population = neatController.population;
91
+ if (!Array.isArray(population) || population.length === 0) {
92
+ warmStartState.generationZeroWarmStartApplied = true;
93
+ return;
94
+ }
95
+
96
+ // Step 4: Build a small synthetic dataset labeled by a simple heuristic.
97
+ const warmStartRng = createXorshift32(
98
+ warmStartState.workerInitSeed ^ 0x9e37_79b9,
99
+ );
100
+ const trainingSet = buildHeuristicPretrainSet(
101
+ warmStartRng,
102
+ FLAPPY_WORKER_GEN0_PRETRAIN_SAMPLE_COUNT,
103
+ );
104
+
105
+ // Step 5: Train a single template network, then seed the whole population from it.
106
+ const templateNetwork = population[0]?.clone();
107
+ if (!templateNetwork) {
108
+ warmStartState.generationZeroWarmStartApplied = true;
109
+ return;
110
+ }
111
+
112
+ try {
113
+ templateNetwork.train(trainingSet, {
114
+ iterations: FLAPPY_WORKER_GEN0_PRETRAIN_ITERATIONS,
115
+ rate: FLAPPY_WORKER_GEN0_PRETRAIN_RATE,
116
+ batchSize: FLAPPY_WORKER_GEN0_PRETRAIN_BATCH_SIZE,
117
+ optimizer: 'adam',
118
+ mixedPrecision: false,
119
+ });
120
+ } catch {
121
+ // If training fails for any reason, fall back to pure noise seeding.
122
+ }
123
+
124
+ // Step 6: Copy trained weights/biases into each genome with small noise for diversity.
125
+ for (const genome of population) {
126
+ applyTemplateWeightsWithNoise(genome, templateNetwork, warmStartRng, {
127
+ weightStdDev: FLAPPY_WORKER_GEN0_PRETRAIN_WEIGHT_NOISE_STDDEV,
128
+ biasStdDev: FLAPPY_WORKER_GEN0_PRETRAIN_BIAS_NOISE_STDDEV,
129
+ });
130
+ (genome as unknown as { score?: number }).score = undefined;
131
+ }
132
+
133
+ warmStartState.generationZeroWarmStartApplied = true;
134
+ }
135
+
136
+ /**
137
+ * Builds synthetic supervised samples for generation-0 behavior cloning.
138
+ *
139
+ * Educational note:
140
+ * These samples are not recorded gameplay traces. They are synthetic states
141
+ * generated from the same observation pipeline used during real playback so the
142
+ * teacher labels and the evolved policy inputs stay in the same feature space.
143
+ *
144
+ * @param rng - Deterministic random source.
145
+ * @param sampleCount - Requested number of synthetic samples.
146
+ * @returns Supervised dataset of input/output pairs.
147
+ */
148
+ function buildHeuristicPretrainSet(
149
+ rng: ReturnType<typeof createXorshift32>,
150
+ sampleCount: number,
151
+ ): Array<{ input: number[]; output: number[] }> {
152
+ // Step 1: Resolve bounded sample count and a baseline difficulty profile.
153
+ const clampedSampleCount = Math.max(8, Math.trunc(sampleCount));
154
+ const difficultyProfile = resolveAdaptiveDifficultyProfile(0, 1);
155
+ const trainingSet: Array<{ input: number[]; output: number[] }> = [];
156
+
157
+ // Step 2: Sample state tuples, encode observations, and attach heuristic labels.
158
+ for (let sampleIndex = 0; sampleIndex < clampedSampleCount; sampleIndex++) {
159
+ const pipeGapPx = difficultyProfile.pipeGapPx;
160
+ const gapHalfPx = pipeGapPx * 0.5;
161
+
162
+ const birdYPx = rng.nextFloat01() * FLAPPY_WORLD_HEIGHT_PX;
163
+ const velocityYPxPerFrame =
164
+ (rng.nextFloat01() * 2 - 1) * FLAPPY_MAX_FALL_SPEED_PX_PER_FRAME;
165
+
166
+ const pipeXMinPx = FLAPPY_BIRD_X_PX + 40;
167
+ const pipeXMaxPx =
168
+ FLAPPY_BIRD_X_PX +
169
+ FLAPPY_WORKER_GEN0_PRETRAIN_VISIBLE_WORLD_WIDTH_PX * 0.92;
170
+ const pipeXSamplePx =
171
+ pipeXMinPx + rng.nextFloat01() * Math.max(1, pipeXMaxPx - pipeXMinPx);
172
+
173
+ const minGapCenterYPx = gapHalfPx;
174
+ const maxGapCenterYPx = Math.max(
175
+ minGapCenterYPx,
176
+ FLAPPY_WORLD_HEIGHT_PX - gapHalfPx,
177
+ );
178
+ const gapCenterYPx =
179
+ minGapCenterYPx + rng.nextFloat01() * (maxGapCenterYPx - minGapCenterYPx);
180
+
181
+ const pipes: WorkerPopulationPipe[] = [
182
+ {
183
+ id: 1,
184
+ xPx: pipeXSamplePx,
185
+ gapCenterYPx,
186
+ gapSizePx: pipeGapPx,
187
+ },
188
+ ];
189
+
190
+ const observationMemoryState = createSharedObservationMemoryState();
191
+ const observation = resolveObservationVector(
192
+ birdYPx,
193
+ velocityYPxPerFrame,
194
+ pipes,
195
+ FLAPPY_WORKER_GEN0_PRETRAIN_VISIBLE_WORLD_WIDTH_PX,
196
+ FLAPPY_WORLD_HEIGHT_PX,
197
+ difficultyProfile,
198
+ difficultyProfile.pipeSpawnIntervalFrames,
199
+ observationMemoryState,
200
+ );
201
+
202
+ const shouldFlap = resolveHeuristicTeacherFlapDecision(
203
+ observation.observationFeatures,
204
+ );
205
+ trainingSet.push({
206
+ input: observation.observationVector,
207
+ output: shouldFlap ? [0, 1] : [1, 0],
208
+ });
209
+ }
210
+
211
+ // Step 3: Return immutable training pairs consumed by Network.train.
212
+ return trainingSet;
213
+ }
214
+
215
+ /**
216
+ * Heuristic teacher policy used to label synthetic pretraining samples.
217
+ *
218
+ * The rule intentionally stays simple and interpretable: flap when the bird is
219
+ * meaningfully below the next gap center, not already rising fast, and either
220
+ * close to the gap entry or in an urgent approach state.
221
+ *
222
+ * @param features - Structured observation features for one synthetic state.
223
+ * @returns True when the teacher says to flap.
224
+ */
225
+ function resolveHeuristicTeacherFlapDecision(
226
+ features: WorkerHeuristicObservationFeatures,
227
+ ): boolean {
228
+ // Step 1: Resolve the few interpretable teacher conditions.
229
+ const isBelowNextGapCenter = features.normalizedDeltaToNextGap > 0.035;
230
+ const isNotAlreadyRisingFast = features.normalizedVelocity > -0.25;
231
+ const isNearGapEntry = features.normalizedFramesToGapEntry < 0.8;
232
+ const isUrgent = features.normalizedEntryUrgency > 0.18;
233
+
234
+ // Step 2: Fold the teacher decision from those conditions.
235
+ return (
236
+ isBelowNextGapCenter &&
237
+ isNotAlreadyRisingFast &&
238
+ (isNearGapEntry || isUrgent)
239
+ );
240
+ }
241
+
242
+ /**
243
+ * Copies template parameters into a genome and injects small Gaussian noise.
244
+ *
245
+ * Educational note:
246
+ * The template network gives generation 0 a shared prior, while the noise terms
247
+ * restore diversity so the population is still worth evolving.
248
+ *
249
+ * @param genome - Target genome to mutate in-place.
250
+ * @param template - Trained template source network.
251
+ * @param rng - Deterministic random source for noise sampling.
252
+ * @param noise - Standard deviations for weight and bias perturbations.
253
+ * @returns Nothing.
254
+ */
255
+ function applyTemplateWeightsWithNoise(
256
+ genome: Network,
257
+ template: Network,
258
+ rng: ReturnType<typeof createXorshift32>,
259
+ noise: { weightStdDev: number; biasStdDev: number },
260
+ ): void {
261
+ // Step 1: Clamp noise scales to valid non-negative values.
262
+ const weightStdDev = Math.max(0, noise.weightStdDev);
263
+ const biasStdDev = Math.max(0, noise.biasStdDev);
264
+
265
+ // Step 2: Copy node biases with additive Gaussian noise.
266
+ const genomeNodes = genome.nodes;
267
+ const templateNodes = template.nodes;
268
+ const nodeCopyCount = Math.min(genomeNodes.length, templateNodes.length);
269
+ for (let nodeIndex = 0; nodeIndex < nodeCopyCount; nodeIndex++) {
270
+ const templateBias = templateNodes[nodeIndex]?.bias ?? 0;
271
+ genomeNodes[nodeIndex].bias =
272
+ templateBias + sampleGaussian(rng) * biasStdDev;
273
+ }
274
+
275
+ // Step 3: Copy connection weights with additive Gaussian noise.
276
+ const genomeConnections = genome.connections;
277
+ const templateConnections = template.connections;
278
+ const connectionCopyCount = Math.min(
279
+ genomeConnections.length,
280
+ templateConnections.length,
281
+ );
282
+ for (
283
+ let connectionIndex = 0;
284
+ connectionIndex < connectionCopyCount;
285
+ connectionIndex++
286
+ ) {
287
+ const templateWeight = templateConnections[connectionIndex]?.weight ?? 0;
288
+ genomeConnections[connectionIndex].weight =
289
+ templateWeight + sampleGaussian(rng) * weightStdDev;
290
+ }
291
+ }
292
+
293
+ /**
294
+ * Samples one standard-normal value using the Box-Muller transform.
295
+ *
296
+ * If you are unfamiliar with the transform, the Wikipedia article on
297
+ * "Box-Muller transform" is a useful short background read. The worker uses it
298
+ * here because it is deterministic, dependency-light, and good enough for small
299
+ * noise injection during warm-start diversification.
300
+ *
301
+ * @param rng - Deterministic random source.
302
+ * @returns One approximately standard-normal random value.
303
+ */
304
+ function sampleGaussian(rng: ReturnType<typeof createXorshift32>): number {
305
+ // Step 1: Avoid log(0) by flooring uniforms away from zero.
306
+ const epsilon = 1e-12;
307
+ const uniformA = Math.max(epsilon, rng.nextFloat01());
308
+ const uniformB = Math.max(epsilon, rng.nextFloat01());
309
+
310
+ // Step 2: Convert two uniforms into one normal sample.
311
+ const magnitude = Math.sqrt(-2 * Math.log(uniformA));
312
+ const angle = 2 * Math.PI * uniformB;
313
+ return magnitude * Math.cos(angle);
314
+ }
@@ -1,3 +1,15 @@
1
+ /**
2
+ * Compatibility facade for the shared Flappy Bird simulation helpers.
3
+ *
4
+ * Educational note:
5
+ * The Flappy example uses the same observation, spawning, math, and difficulty
6
+ * logic in multiple places: Node-side evaluation, browser playback, and the
7
+ * worker runtime. This facade keeps those shared concepts discoverable from the
8
+ * root folder while the real implementation lives under `simulation-shared/`.
9
+ *
10
+ * If you are new to the example, start here to see the cross-cutting helpers,
11
+ * then follow the re-export targets into the focused submodules.
12
+ */
1
13
  export { resolveAdaptiveDifficultyProfile } from './simulation-shared/simulation-shared.difficulty.utils';
2
14
  export { resolveFlapDecision } from './simulation-shared/simulation-shared.control.utils';
3
15
  export {
@@ -16,6 +28,11 @@ export {
16
28
  clampValue,
17
29
  interpolateValue,
18
30
  } from './simulation-shared/simulation-shared.math.utils';
31
+ export {
32
+ computeMean,
33
+ computePercentile,
34
+ computePopulationStandardDeviation,
35
+ } from './simulation-shared/simulation-shared.statistics.utils';
19
36
  export {
20
37
  resolveNextSpawnGapCenterY,
21
38
  resolveNextSpawnGapSize,
@@ -1,3 +1,16 @@
1
+ /**
2
+ * Public environment facade for the Flappy Bird example.
3
+ *
4
+ * Educational note:
5
+ * This file presents the Flappy world as a small environment API: create state,
6
+ * step it forward, and read observations. That makes it the most convenient
7
+ * entrypoint when you want to treat the game as a control problem rather than a
8
+ * rendering demo.
9
+ *
10
+ * For background reading, the Wikipedia article on "Markov decision process" is
11
+ * a useful mental model for why the example separates state transition,
12
+ * observation extraction, and action selection.
13
+ */
1
14
  import type { FlappyRng } from './rng';
2
15
  import {
3
16
  resolveNextSpawnGapCenterY as resolveSharedNextSpawnGapCenterY,
@@ -24,6 +37,10 @@ export {
24
37
  /**
25
38
  * Sample a gap center height inside configured bounds.
26
39
  *
40
+ * This root-level helper exists as a convenience export. The underlying spawn
41
+ * logic lives in the shared simulation layer so browser playback and evaluation
42
+ * use the same world-generation rules.
43
+ *
27
44
  * @param rng - Random source.
28
45
  * @returns Gap center y coordinate (pixels).
29
46
  */
@@ -34,6 +51,10 @@ export function sampleGapCenterY(rng: FlappyRng): number {
34
51
  /**
35
52
  * Resolves next gap-center y while limiting abrupt consecutive transitions.
36
53
  *
54
+ * Keeping consecutive gap centers locally smooth prevents the environment from
55
+ * generating visually unfair jumps that a feed-forward policy could not react to
56
+ * consistently.
57
+ *
37
58
  * @param previousGapCenterYPx - Previous spawned gap-center y value.
38
59
  * @param rng - Random source.
39
60
  * @returns Next gap-center y constrained by transition and world bounds.
@@ -1,3 +1,15 @@
1
+ /**
2
+ * Public evaluation facade for the Flappy Bird example.
3
+ *
4
+ * Educational note:
5
+ * The trainer and worker both need a compact way to score policies. This facade
6
+ * exposes the evaluation surface without forcing callers to know the internal
7
+ * rollout and seed-batching module layout.
8
+ *
9
+ * The important idea is variance control: the example compares genomes across
10
+ * shared random seeds so evolution is rewarded for genuinely better behavior,
11
+ * not for getting an unusually lucky pipe sequence.
12
+ */
1
13
  export {
2
14
  evaluateFlappyFitness,
3
15
  evaluateFlappyFitnessAcrossSeeds,