@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
@@ -7,5 +7,8 @@ export const FLAPPY_SHARED_DEFAULT_DIFFICULTY_SCALE = 1;
7
7
 
8
8
  /**
9
9
  * Small positive epsilon used to guard divisions in normalized timing features.
10
+ *
11
+ * The epsilon avoids unstable divide-by-zero behavior when distances or speeds
12
+ * collapse toward zero during normalization.
10
13
  */
11
14
  export const FLAPPY_SHARED_DEFAULT_NORMALIZATION_EPSILON = 0.001;
@@ -1,6 +1,12 @@
1
1
  /**
2
2
  * Resolves flap/no-flap decision from network outputs.
3
3
  *
4
+ * Educational note:
5
+ * The shared control layer accepts both two-output competitive policies
6
+ * (`no flap` vs `flap`) and simpler single-output thresholded policies. That
7
+ * flexibility makes the helper reusable across experiments without forcing every
8
+ * caller to reshape its outputs first.
9
+ *
4
10
  * @param rawOutputs - Activation output payload.
5
11
  * @param flapThreshold - Scalar threshold for single-output policies.
6
12
  * @returns True when flap should trigger.
@@ -14,6 +14,15 @@ import type { SharedDifficultyProfile } from './simulation-shared.types';
14
14
  /**
15
15
  * Resolves adaptive difficulty profile from passed-pipe progress.
16
16
  *
17
+ * Educational note:
18
+ * Difficulty is ramped as a smooth profile rather than as a sequence of hard
19
+ * level jumps. That keeps the task readable for humans and less noisy for
20
+ * evolution.
21
+ *
22
+ * The idea is closely related to curriculum learning: easier versions of the
23
+ * task dominate early, then the example interpolates toward the harder target
24
+ * settings as progress increases.
25
+ *
17
26
  * @param pipesPassed - Number of passed pipes.
18
27
  * @param difficultyScale - Curriculum scale in `[0, 1]`.
19
28
  * @returns Active difficulty profile.
@@ -1,9 +1,18 @@
1
- /** Prefix used when formatting unexpected shared-simulation errors. */
1
+ /**
2
+ * Prefix used when formatting unexpected shared-simulation errors.
3
+ *
4
+ * A stable prefix makes logs easier to scan when multiple Flappy subsystems are
5
+ * emitting diagnostics.
6
+ */
2
7
  export const FLAPPY_SHARED_SIMULATION_ERROR_PREFIX = 'Shared simulation error:';
3
8
 
4
9
  /**
5
10
  * Formats unknown shared-simulation errors for stable logs.
6
11
  *
12
+ * Shared utilities are used from several runtime contexts, so this helper keeps
13
+ * the error surface human-readable even when the thrown value is not an
14
+ * `Error` instance.
15
+ *
7
16
  * @param error - Unknown error value.
8
17
  * @returns Readable error message.
9
18
  */
@@ -12,6 +12,11 @@ import type {
12
12
  /**
13
13
  * Creates an empty temporal observation memory state.
14
14
  *
15
+ * @example
16
+ * ```ts
17
+ * const memoryState = createSharedObservationMemoryState();
18
+ * ```
19
+ *
15
20
  * @returns Fresh mutable memory buffers for one bird/controller.
16
21
  */
17
22
  export function createSharedObservationMemoryState(): SharedObservationMemoryState {
@@ -24,6 +29,12 @@ export function createSharedObservationMemoryState(): SharedObservationMemorySta
24
29
  /**
25
30
  * Builds the temporal policy input vector (stacked observation + action memory).
26
31
  *
32
+ * Educational note:
33
+ * This helper turns an interpretable feature object into the exact flat vector a
34
+ * feed-forward network consumes. That is why the output layout is documented so
35
+ * explicitly: changing the order would change the meaning of every trained
36
+ * weight in the policy.
37
+ *
27
38
  * Output layout:
28
39
  * 1) current core observation frame
29
40
  * 2) previous core frames (newest to oldest) with zero padding
@@ -60,6 +71,10 @@ export function resolveTemporalObservationVector(
60
71
  /**
61
72
  * Commits one observation-action step into temporal memory.
62
73
  *
74
+ * The memory update happens after the decision is made so the next step can see
75
+ * both the recent observation context and the action history that produced the
76
+ * current trajectory.
77
+ *
63
78
  * @param observationMemoryState - Mutable temporal memory for the active bird.
64
79
  * @param features - Structured observation features used for the decision.
65
80
  * @param didFlap - Decision taken at this step.
@@ -93,6 +108,9 @@ export function commitSharedObservationMemoryStep(
93
108
  /**
94
109
  * Resolves previous core frames (newest-first) with deterministic zero padding.
95
110
  *
111
+ * Zero padding keeps the policy input width stable during the first few frames
112
+ * of an episode before enough history has accumulated.
113
+ *
96
114
  * @param observationMemoryState - Mutable temporal memory for the active bird.
97
115
  * @returns Previous core frame list with fixed target length.
98
116
  */
@@ -1,406 +1,11 @@
1
- import {
2
- FLAPPY_BIRD_RADIUS_PX,
3
- FLAPPY_BIRD_X_PX,
4
- FLAPPY_FLAP_VELOCITY_PX_PER_FRAME,
5
- FLAPPY_GRAVITY_PX_PER_FRAME2,
6
- FLAPPY_MAX_FALL_SPEED_PX_PER_FRAME,
7
- FLAPPY_MIN_PIPE_RECOVERY_FRAMES,
8
- FLAPPY_PIPE_GAP_PX,
9
- FLAPPY_PIPE_WIDTH_PX,
10
- FLAPPY_WORLD_HEIGHT_PX,
11
- } from '../constants/constants';
12
- import { FLAPPY_SHARED_DEFAULT_NORMALIZATION_EPSILON } from './simulation-shared.constants';
13
- import type {
14
- SharedObservationFeatures,
15
- SharedObservationInput,
16
- SharedPipeLike,
17
- } from './simulation-shared.types';
18
-
19
1
  /**
20
- * Resolves the next two upcoming pipes in front of the bird.
2
+ * Shared observation compatibility façade.
21
3
  *
22
- * @param pipes - Current pipe list.
23
- * @param birdCenterXPx - Bird center x-position.
24
- * @param birdRadiusPx - Bird radius.
25
- * @param pipeWidthPx - Pipe width.
26
- * @returns Tuple of first and second upcoming pipes.
27
- */
28
- export function resolveUpcomingPipes(
29
- pipes: SharedPipeLike[],
30
- birdCenterXPx = FLAPPY_BIRD_X_PX,
31
- birdRadiusPx = FLAPPY_BIRD_RADIUS_PX,
32
- pipeWidthPx = FLAPPY_PIPE_WIDTH_PX,
33
- ): [SharedPipeLike | undefined, SharedPipeLike | undefined] {
34
- const birdFrontX = birdCenterXPx - birdRadiusPx;
35
- const upcomingPipes = pipes.filter(
36
- (pipe) => pipe.xPx + pipeWidthPx >= birdFrontX,
37
- );
38
- return [upcomingPipes[0], upcomingPipes[1]];
39
- }
40
-
41
- /**
42
- * Builds the shared normalized observation feature set consumed by policies.
43
- *
44
- * @param input - Observation input bundle.
45
- * @returns Structured observation features.
46
- */
47
- export function resolveObservationFeatures(
48
- input: SharedObservationInput,
49
- ): SharedObservationFeatures {
50
- /**
51
- * Effective world height used for all vertical normalization.
52
- *
53
- * Why it matters: scaling by a stable height keeps feature magnitudes
54
- * comparable across episodes and prevents value drift when display sizes vary.
55
- */
56
- const worldHeightPx = input.worldHeightPx ?? FLAPPY_WORLD_HEIGHT_PX;
57
- /**
58
- * Maximum downward speed used to normalize velocity-like channels.
59
- *
60
- * Why it matters: velocity channels become dimensionless and bounded in [-1, 1],
61
- * making policy optimization numerically easier.
62
- */
63
- const maxFallSpeedPxPerFrame =
64
- input.maxFallSpeedPxPerFrame ?? FLAPPY_MAX_FALL_SPEED_PX_PER_FRAME;
65
- /** Bird center x-position used to measure forward distances to pipes. */
66
- const birdCenterXPx = input.birdCenterXPx ?? FLAPPY_BIRD_X_PX;
67
- /** Bird collision radius used by upcoming-pipe selection and entry/exit timing. */
68
- const birdRadiusPx = input.birdRadiusPx ?? FLAPPY_BIRD_RADIUS_PX;
69
- /** Pipe width used for distance-to-entry/exit and visibility checks. */
70
- const pipeWidthPx = input.pipeWidthPx ?? FLAPPY_PIPE_WIDTH_PX;
71
- /** Default gap size fallback when no upcoming pipe is available yet. */
72
- const defaultGapSizePx = input.defaultGapSizePx ?? FLAPPY_PIPE_GAP_PX;
73
- /**
74
- * Small denominator guard used in time/urgency calculations.
75
- *
76
- * Why it matters: avoids division by zero and explosive values when
77
- * speed or time-to-event become extremely small.
78
- */
79
- const normalizationEpsilon =
80
- input.normalizationEpsilon ?? FLAPPY_SHARED_DEFAULT_NORMALIZATION_EPSILON;
81
-
82
- /** First and second upcoming pipes used for near-term and lookahead guidance. */
83
- const [nextPipe, secondPipe] = resolveUpcomingPipes(
84
- input.pipes,
85
- birdCenterXPx,
86
- birdRadiusPx,
87
- pipeWidthPx,
88
- );
89
- /** Bird y-position normalized to [0, 1]. */
90
- const normalizedBirdY = clamp01(input.birdYPx / worldHeightPx);
91
- /** Bird vertical velocity normalized to [-1, 1]. */
92
- const normalizedVelocity = clamp(
93
- input.velocityYPxPerFrame / maxFallSpeedPxPerFrame,
94
- -1,
95
- 1,
96
- );
97
-
98
- /** Forward distance from bird to the next pipe corridor (pixels). */
99
- const distanceToNextPipePx = nextPipe
100
- ? nextPipe.xPx + pipeWidthPx - birdCenterXPx
101
- : input.visibleWorldWidthPx;
102
- /** Next-pipe forward distance normalized to [0, 1]. */
103
- const normalizedDistanceToNextPipe = clamp01(
104
- distanceToNextPipePx / input.visibleWorldWidthPx,
105
- );
106
-
107
- /** Next gap center y-position (fallback to mid-world when absent). */
108
- const nextGapCenterYPx = nextPipe?.gapCenterYPx ?? worldHeightPx * 0.5;
109
- /** Half-gap height for clearance and boundary calculations. */
110
- const nextGapHalfPx = (nextPipe?.gapSizePx ?? defaultGapSizePx) * 0.5;
111
- /** Normalized top boundary of the next gap opening. */
112
- const normalizedNextGapTop = clamp01(
113
- (nextGapCenterYPx - nextGapHalfPx) / worldHeightPx,
114
- );
115
- /** Normalized bottom boundary of the next gap opening. */
116
- const normalizedNextGapBottom = clamp01(
117
- (nextGapCenterYPx + nextGapHalfPx) / worldHeightPx,
118
- );
119
- /** Signed bird-to-next-gap-center vertical offset normalized to [-1, 1]. */
120
- const normalizedDeltaToNextGap = clamp(
121
- (input.birdYPx - nextGapCenterYPx) / worldHeightPx,
122
- -1,
123
- 1,
124
- );
125
-
126
- /** Forward distance from bird to the second upcoming pipe (pixels). */
127
- const distanceToSecondPipePx = secondPipe
128
- ? secondPipe.xPx + pipeWidthPx - birdCenterXPx
129
- : input.visibleWorldWidthPx;
130
- /** Second-pipe forward distance normalized to [0, 1]. */
131
- const normalizedDistanceToSecondPipe = clamp01(
132
- distanceToSecondPipePx / input.visibleWorldWidthPx,
133
- );
134
-
135
- /** Second gap center y-position (fallback to next center when absent). */
136
- const secondGapCenterYPx = secondPipe?.gapCenterYPx ?? nextGapCenterYPx;
137
- /** Signed bird-to-second-gap-center vertical offset normalized to [-1, 1]. */
138
- const normalizedDeltaToSecondGap = clamp(
139
- (input.birdYPx - secondGapCenterYPx) / worldHeightPx,
140
- -1,
141
- 1,
142
- );
143
-
144
- /** Estimated frames until reaching the next pipe (continuous-time approximation). */
145
- const estimatedFramesToNextPipe =
146
- distanceToNextPipePx /
147
- Math.max(normalizationEpsilon, input.difficultyProfile.pipeSpeedPxPerFrame);
148
- /** Urgency-like proximity to next pipe in [0, 1], where 1 means imminent. */
149
- const normalizedTimeToNextPipe = clamp01(
150
- 1 -
151
- estimatedFramesToNextPipe / Math.max(1, input.activeSpawnIntervalFrames),
152
- );
153
-
154
- /** Absolute vertical distance from bird to next gap center (pixels). */
155
- const distanceToNextGapCenterPx = Math.abs(input.birdYPx - nextGapCenterYPx);
156
- /** Signed clearance relative to half-gap height, normalized to [-1, 1]. */
157
- const normalizedNextGapClearance = clamp(
158
- (nextGapHalfPx - distanceToNextGapCenterPx) / Math.max(1, nextGapHalfPx),
159
- -1,
160
- 1,
161
- );
162
-
163
- /** Horizontal distance to the gap entry plane (pixels). */
164
- const distanceToGapEntryPx = nextPipe
165
- ? nextPipe.xPx - (birdCenterXPx + birdRadiusPx)
166
- : input.visibleWorldWidthPx;
167
- /** Horizontal distance to the gap exit plane (pixels). */
168
- const distanceToGapExitPx = nextPipe
169
- ? nextPipe.xPx + pipeWidthPx - (birdCenterXPx - birdRadiusPx)
170
- : input.visibleWorldWidthPx;
171
-
172
- /** Frames until gap entry; clamped to non-negative values. */
173
- const framesToGapEntry = Math.max(
174
- 0,
175
- distanceToGapEntryPx /
176
- Math.max(
177
- normalizationEpsilon,
178
- input.difficultyProfile.pipeSpeedPxPerFrame,
179
- ),
180
- );
181
- /**
182
- * Frames until gap exit; never smaller than entry time.
183
- *
184
- * Why it matters: captures tube traversal duration, which is crucial for
185
- * wide-pipe timing and potential two-flap planning.
186
- */
187
- const framesToGapExit = Math.max(
188
- framesToGapEntry,
189
- distanceToGapExitPx /
190
- Math.max(
191
- normalizationEpsilon,
192
- input.difficultyProfile.pipeSpeedPxPerFrame,
193
- ),
194
- );
195
-
196
- /** Frames-to-entry normalized to [0, 1] using spawn-interval scale. */
197
- const normalizedFramesToGapEntry = clamp01(
198
- framesToGapEntry / Math.max(1, input.activeSpawnIntervalFrames),
199
- );
200
- /** Frames-to-exit normalized to [0, 1] using spawn-interval scale. */
201
- const normalizedFramesToGapExit = clamp01(
202
- framesToGapExit / Math.max(1, input.activeSpawnIntervalFrames),
203
- );
204
-
205
- /** Required mean vertical velocity to center at next-pipe contact window. */
206
- const requiredVerticalVelocityToNextGapPxPerFrame = clamp(
207
- (nextGapCenterYPx - input.birdYPx) / Math.max(1, estimatedFramesToNextPipe),
208
- -maxFallSpeedPxPerFrame,
209
- maxFallSpeedPxPerFrame,
210
- );
211
- /** Required velocity-to-next-gap channel normalized to [-1, 1]. */
212
- const normalizedRequiredVerticalVelocityToNextGap = clamp(
213
- requiredVerticalVelocityToNextGapPxPerFrame / maxFallSpeedPxPerFrame,
214
- -1,
215
- 1,
216
- );
217
-
218
- /** Required mean vertical velocity to center precisely at gap entry. */
219
- const requiredVerticalVelocityAtGapEntryPxPerFrame = clamp(
220
- (nextGapCenterYPx - input.birdYPx) / Math.max(1, framesToGapEntry),
221
- -maxFallSpeedPxPerFrame,
222
- maxFallSpeedPxPerFrame,
223
- );
224
- /** Required mean vertical velocity to remain centered by gap exit. */
225
- const requiredVerticalVelocityAtGapExitPxPerFrame = clamp(
226
- (nextGapCenterYPx - input.birdYPx) / Math.max(1, framesToGapExit),
227
- -maxFallSpeedPxPerFrame,
228
- maxFallSpeedPxPerFrame,
229
- );
230
- /** Entry-target velocity normalized to [-1, 1]. */
231
- const normalizedRequiredVerticalVelocityAtGapEntry = clamp(
232
- requiredVerticalVelocityAtGapEntryPxPerFrame / maxFallSpeedPxPerFrame,
233
- -1,
234
- 1,
235
- );
236
- /** Exit-target velocity normalized to [-1, 1]. */
237
- const normalizedRequiredVerticalVelocityAtGapExit = clamp(
238
- requiredVerticalVelocityAtGapExitPxPerFrame / maxFallSpeedPxPerFrame,
239
- -1,
240
- 1,
241
- );
242
-
243
- /**
244
- * Centering urgency in [0, 1]: large offset with little time-to-entry yields
245
- * stronger urgency.
246
- */
247
- const normalizedEntryUrgency = clamp(
248
- Math.abs(normalizedDeltaToNextGap) /
249
- Math.max(normalizationEpsilon, normalizedFramesToGapEntry),
250
- 0,
251
- 1,
252
- );
253
-
254
- /** Predicted entry y-position if no flap occurs before entry. */
255
- const predictedBirdYAtEntryWithoutFlap = resolvePredictedBirdYAtFrames(
256
- input.birdYPx,
257
- input.velocityYPxPerFrame,
258
- framesToGapEntry,
259
- );
260
- /** Predicted entry y-position if one immediate flap occurs before entry. */
261
- const predictedBirdYAtEntryWithOneFlap = resolvePredictedBirdYAtFrames(
262
- input.birdYPx,
263
- FLAPPY_FLAP_VELOCITY_PX_PER_FRAME,
264
- framesToGapEntry,
265
- );
266
- /** Entry centering error (pixels) under no-flap trajectory. */
267
- const noFlapEntryErrorPx = Math.abs(
268
- predictedBirdYAtEntryWithoutFlap - nextGapCenterYPx,
269
- );
270
- /** Entry centering error (pixels) under one-flap trajectory. */
271
- const oneFlapEntryErrorPx = Math.abs(
272
- predictedBirdYAtEntryWithOneFlap - nextGapCenterYPx,
273
- );
274
- /** Best (minimum) entry error among one-step action hypotheses. */
275
- const minimalEntryErrorPx = Math.min(noFlapEntryErrorPx, oneFlapEntryErrorPx);
276
- /** Binary reachability feature: 1 when entry center is recoverable within <=1 flap. */
277
- const normalizedOneFlapReachabilityAtGapEntry =
278
- minimalEntryErrorPx <= nextGapHalfPx ? 1 : 0;
279
-
280
- /** Signed centerline transition from next gap to second gap, normalized to [-1, 1]. */
281
- const normalizedNextToSecondGapTransition = clamp(
282
- (secondGapCenterYPx - nextGapCenterYPx) / worldHeightPx,
283
- -1,
284
- 1,
285
- );
286
-
287
- return {
288
- normalizedBirdY,
289
- normalizedVelocity,
290
- normalizedDistanceToNextPipe,
291
- normalizedDeltaToNextGap,
292
- normalizedNextGapTop,
293
- normalizedNextGapBottom,
294
- normalizedDistanceToSecondPipe,
295
- normalizedDeltaToSecondGap,
296
- normalizedTimeToNextPipe,
297
- normalizedNextGapClearance,
298
- normalizedRequiredVerticalVelocityToNextGap,
299
- normalizedNextToSecondGapTransition,
300
- normalizedFramesToGapEntry,
301
- normalizedFramesToGapExit,
302
- normalizedRequiredVerticalVelocityAtGapEntry,
303
- normalizedRequiredVerticalVelocityAtGapExit,
304
- normalizedEntryUrgency,
305
- normalizedOneFlapReachabilityAtGapEntry,
306
- };
307
- }
308
-
309
- /**
310
- * Converts observation features to the canonical 12-value network input vector.
311
- *
312
- * @param features - Structured feature object.
313
- * @returns Ordered feature vector.
314
- */
315
- export function resolveObservationVectorFromFeatures(
316
- features: SharedObservationFeatures,
317
- ): number[] {
318
- return [
319
- features.normalizedBirdY,
320
- features.normalizedVelocity,
321
- features.normalizedDistanceToNextPipe,
322
- features.normalizedDeltaToNextGap,
323
- features.normalizedNextGapTop,
324
- features.normalizedNextGapBottom,
325
- features.normalizedDistanceToSecondPipe,
326
- features.normalizedDeltaToSecondGap,
327
- features.normalizedTimeToNextPipe,
328
- features.normalizedNextGapClearance,
329
- features.normalizedRequiredVerticalVelocityToNextGap,
330
- features.normalizedNextToSecondGapTransition,
331
- ];
332
- }
333
-
334
- /**
335
- * Resolves the compact core vector used for temporal stacking.
336
- *
337
- * The core intentionally keeps directly observed kinematic/geometric channels
338
- * and drops derived one-step predictors that become redundant once temporal
339
- * context is available.
340
- *
341
- * @param features - Structured observation features.
342
- * @returns Core per-frame vector.
343
- */
344
- export function resolveCoreObservationVectorFromFeatures(
345
- features: SharedObservationFeatures,
346
- ): number[] {
347
- return [
348
- features.normalizedBirdY,
349
- features.normalizedVelocity,
350
- features.normalizedDistanceToNextPipe,
351
- features.normalizedDeltaToNextGap,
352
- features.normalizedNextGapTop,
353
- features.normalizedNextGapBottom,
354
- features.normalizedDistanceToSecondPipe,
355
- features.normalizedDeltaToSecondGap,
356
- features.normalizedNextGapClearance,
357
- features.normalizedRequiredVerticalVelocityToNextGap,
358
- features.normalizedEntryUrgency,
359
- features.normalizedOneFlapReachabilityAtGapEntry,
360
- ];
361
- }
362
-
363
- /**
364
- * Predicts bird y-position after a frame horizon with constant gravity.
365
- *
366
- * This lightweight estimate is used for reachability signals only.
367
- *
368
- * @param startYPx - Current bird y-position.
369
- * @param initialVerticalVelocityPxPerFrame - Initial vertical velocity.
370
- * @param frameHorizon - Predicted horizon in simulation frames.
371
- * @returns Predicted y-position.
372
- */
373
- function resolvePredictedBirdYAtFrames(
374
- startYPx: number,
375
- initialVerticalVelocityPxPerFrame: number,
376
- frameHorizon: number,
377
- ): number {
378
- const safeFrameHorizon = Math.max(0, frameHorizon);
379
- return (
380
- startYPx +
381
- initialVerticalVelocityPxPerFrame * safeFrameHorizon +
382
- 0.5 * FLAPPY_GRAVITY_PX_PER_FRAME2 * safeFrameHorizon * safeFrameHorizon
383
- );
384
- }
385
-
386
- /**
387
- * Clamps a numeric value to the inclusive `[min, max]` interval.
388
- *
389
- * @param value - Candidate value.
390
- * @param min - Inclusive lower bound.
391
- * @param max - Inclusive upper bound.
392
- * @returns Clamped value.
393
- */
394
- function clamp(value: number, min: number, max: number): number {
395
- return Math.min(max, Math.max(min, value));
396
- }
397
-
398
- /**
399
- * Clamps a numeric value to the inclusive `[0, 1]` interval.
4
+ * The observation implementation now lives under `simulation-shared/observation/`
5
+ * so feature synthesis and vector projection can evolve behind a focused module
6
+ * boundary. This file stays as the stable import path for existing callers.
400
7
  *
401
- * @param value - Candidate value.
402
- * @returns Value clamped between 0 and 1.
8
+ * That split keeps the high-level import path simple while allowing the
9
+ * observation subsystem to grow into its own documented folder.
403
10
  */
404
- function clamp01(value: number): number {
405
- return clamp(value, 0, 1);
406
- }
11
+ export * from './observation/observation';
@@ -17,46 +17,72 @@ import type {
17
17
  /**
18
18
  * Samples a random gap center y-position.
19
19
  *
20
+ * The sampled center is bounded so the resulting pipe gap always remains inside
21
+ * the visible play area.
22
+ *
20
23
  * @param rng - Deterministic RNG.
24
+ * @param maximumGapCenterYPx - Optional inclusive upper bound for smaller viewports.
21
25
  * @returns Sampled y-position.
22
26
  */
23
- export function sampleGapCenterY(rng: SharedRngLike): number {
27
+ export function sampleGapCenterY(
28
+ rng: SharedRngLike,
29
+ maximumGapCenterYPx: number = FLAPPY_PIPE_GAP_CENTER_MAX_Y_PX,
30
+ ): number {
31
+ const boundedMaximumGapCenterYPx = Math.max(
32
+ FLAPPY_PIPE_GAP_CENTER_MIN_Y_PX,
33
+ maximumGapCenterYPx,
34
+ );
24
35
  return rng.nextInt(
25
36
  FLAPPY_PIPE_GAP_CENTER_MIN_Y_PX,
26
- FLAPPY_PIPE_GAP_CENTER_MAX_Y_PX,
37
+ boundedMaximumGapCenterYPx,
27
38
  );
28
39
  }
29
40
 
30
41
  /**
31
42
  * Resolves next gap center with bounded per-pipe delta.
32
43
  *
44
+ * Educational note:
45
+ * Consecutive gaps are deliberately constrained to avoid unfair zig-zag jumps.
46
+ * The environment should still be challenging, but it should not demand an
47
+ * impossible vertical correction from one pipe to the next.
48
+ *
33
49
  * @param previousGapCenterYPx - Previous spawn gap center.
34
50
  * @param rng - Deterministic RNG.
51
+ * @param maximumGapCenterYPx - Optional inclusive upper bound for smaller viewports.
35
52
  * @returns Next gap center y-position.
36
53
  */
37
54
  export function resolveNextSpawnGapCenterY(
38
55
  previousGapCenterYPx: number,
39
56
  rng: SharedRngLike,
57
+ maximumGapCenterYPx: number = FLAPPY_PIPE_GAP_CENTER_MAX_Y_PX,
40
58
  ): number {
41
- const sampledGapCenterYPx = sampleGapCenterY(rng);
59
+ const boundedMaximumGapCenterYPx = Math.max(
60
+ FLAPPY_PIPE_GAP_CENTER_MIN_Y_PX,
61
+ maximumGapCenterYPx,
62
+ );
63
+ const sampledGapCenterYPx = sampleGapCenterY(rng, boundedMaximumGapCenterYPx);
42
64
  const minimumGapCenterYPx = Math.max(
43
65
  FLAPPY_PIPE_GAP_CENTER_MIN_Y_PX,
44
66
  previousGapCenterYPx - FLAPPY_PIPE_GAP_CENTER_MAX_DELTA_PX,
45
67
  );
46
- const maximumGapCenterYPx = Math.min(
47
- FLAPPY_PIPE_GAP_CENTER_MAX_Y_PX,
68
+ const clampedMaximumGapCenterYPx = Math.min(
69
+ boundedMaximumGapCenterYPx,
48
70
  previousGapCenterYPx + FLAPPY_PIPE_GAP_CENTER_MAX_DELTA_PX,
49
71
  );
50
72
  return clampValue(
51
73
  sampledGapCenterYPx,
52
74
  minimumGapCenterYPx,
53
- maximumGapCenterYPx,
75
+ clampedMaximumGapCenterYPx,
54
76
  );
55
77
  }
56
78
 
57
79
  /**
58
80
  * Resolves next spawn gap size using progressive shrink and jitter.
59
81
  *
82
+ * The gap starts wider than the current hardest target, then shrinks toward the
83
+ * active difficulty profile with a small amount of deterministic jitter so runs
84
+ * do not feel mechanically repetitive.
85
+ *
60
86
  * @param previousSpawnGapPx - Previous spawn gap size.
61
87
  * @param difficultyProfile - Active difficulty profile.
62
88
  * @param rng - Deterministic RNG.
@@ -94,6 +120,10 @@ export function resolveNextSpawnGapSize(
94
120
  /**
95
121
  * Resolves next spawn interval using progressive shrink.
96
122
  *
123
+ * This mirrors the gap-size logic: early pipes are spaced more generously, then
124
+ * spacing contracts toward the current difficulty target as the episode settles
125
+ * into its harder rhythm.
126
+ *
97
127
  * @param previousSpawnIntervalFrames - Previous spawn interval.
98
128
  * @param difficultyProfile - Active difficulty profile.
99
129
  * @returns Next spawn interval in frames.
@@ -1,4 +1,4 @@
1
- import { clampValue } from '../flappy.simulation.shared.utils';
1
+ import { clampValue } from './simulation-shared.math.utils';
2
2
 
3
3
  /**
4
4
  * Computes arithmetic mean for numeric samples.
@@ -13,10 +13,13 @@ export function computeMean(values: readonly number[]): number {
13
13
  values.length
14
14
  );
15
15
  }
16
-
17
16
  /**
18
17
  * Computes population standard deviation.
19
18
  *
19
+ * This uses population variance rather than sample variance because the trainer
20
+ * is summarizing the whole evolved population for that generation, not estimating
21
+ * a larger hidden distribution from a subsample.
22
+ *
20
23
  * @param values - Numeric samples.
21
24
  * @param meanValue - Precomputed mean.
22
25
  * @returns Population standard deviation.
@@ -26,17 +29,22 @@ export function computePopulationStandardDeviation(
26
29
  meanValue: number,
27
30
  ): number {
28
31
  if (values.length === 0) return 0;
32
+
29
33
  const variance =
30
34
  values.reduce((accumulator, value) => {
31
- const delta = value - meanValue;
32
- return accumulator + delta * delta;
35
+ const deltaFromMean = value - meanValue;
36
+ return accumulator + deltaFromMean * deltaFromMean;
33
37
  }, 0) / values.length;
38
+
34
39
  return Math.sqrt(Math.max(0, variance));
35
40
  }
36
41
 
37
42
  /**
38
43
  * Computes percentile value via linear interpolation between nearest ranks.
39
44
  *
45
+ * Percentiles are useful in the trainer because they reveal whether strong
46
+ * performance is broad across the population or concentrated in a single outlier.
47
+ *
40
48
  * @param values - Numeric samples.
41
49
  * @param percentile - Percentile in [0, 1].
42
50
  * @returns Percentile value, or `Number.NaN` when `values` is empty.
@@ -46,16 +54,29 @@ export function computePercentile(
46
54
  percentile: number,
47
55
  ): number {
48
56
  if (values.length === 0) return Number.NaN;
49
- const sortedValues = values.toSorted(
50
- (leftValue, rightValue) => leftValue - rightValue,
51
- );
57
+
58
+ const sortedValues = values.toSorted(compareNumbersAscending);
52
59
  const clampedPercentile = clampValue(percentile, 0, 1);
53
60
  const rawIndex = clampedPercentile * (sortedValues.length - 1);
54
61
  const lowerIndex = Math.floor(rawIndex);
55
62
  const upperIndex = Math.ceil(rawIndex);
56
- const interpolation = rawIndex - lowerIndex;
63
+ const interpolationWeight = rawIndex - lowerIndex;
57
64
 
58
65
  const lowerValue = sortedValues[lowerIndex] ?? sortedValues[0] ?? Number.NaN;
59
66
  const upperValue = sortedValues[upperIndex] ?? lowerValue;
60
- return lowerValue + (upperValue - lowerValue) * interpolation;
67
+ return lowerValue + (upperValue - lowerValue) * interpolationWeight;
68
+ }
69
+
70
+ /**
71
+ * Compares two numeric values in ascending order.
72
+ *
73
+ * @param leftValue - Left numeric value.
74
+ * @param rightValue - Right numeric value.
75
+ * @returns Comparator delta for `Array.prototype.toSorted`.
76
+ */
77
+ function compareNumbersAscending(
78
+ leftValue: number,
79
+ rightValue: number,
80
+ ): number {
81
+ return leftValue - rightValue;
61
82
  }