@reicek/neataptic-ts 0.1.21 → 0.1.23

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (361) hide show
  1. package/.github/agents/boundary-mapper.agent.md +31 -0
  2. package/.github/agents/docs-scout.agent.md +29 -0
  3. package/.github/agents/plan-scout.agent.md +31 -0
  4. package/.github/agents/solid-split.agent.md +143 -0
  5. package/.github/copilot-instructions.md +119 -0
  6. package/.github/skills/solid-split-playbook/SKILL.md +220 -0
  7. package/.github/skills/solid-split-playbook/assets/docs-checklist.md +34 -0
  8. package/.github/skills/solid-split-playbook/assets/split-plan-template.md +48 -0
  9. package/.github/skills/solid-split-playbook/assets/split-workflow-checklist.md +51 -0
  10. package/.github/skills/trace-analyzer-extension/SKILL.md +63 -0
  11. package/.github/skills/trace-analyzer-extension/assets/extension-checklist.md +24 -0
  12. package/.github/skills/trace-analyzer-extension/references/analyzer-extension-workflow.md +101 -0
  13. package/.github/skills/trace-audit-reporting/SKILL.md +96 -0
  14. package/.github/skills/trace-audit-reporting/assets/performance-report-template.md +123 -0
  15. package/.github/skills/trace-audit-reporting/references/trace-analysis-workflow.md +132 -0
  16. package/package.json +7 -3
  17. package/plans/ES2023 migration +13 -8
  18. package/plans/Evolution_Training_Interoperability_Contracts.md +1 -1
  19. package/plans/Flappy_Bird_Folder_Documentation_Pass.md +53 -0
  20. package/plans/Flappy_Evolution_Worker_Documentation_Pass.md +58 -0
  21. package/plans/Interactive_Examples_and_Learning_Path.md +10 -2
  22. package/plans/Memory_Optimization.md +3 -3
  23. package/plans/README.md +63 -0
  24. package/plans/Roadmap.md +15 -3
  25. package/plans/asciiMaze_SOLID_split.done.md +130 -0
  26. package/plans/flappy_bird_SOLID_split.done.md +67 -0
  27. package/scripts/analyze-trace.ts +590 -0
  28. package/scripts/assets/theme.css +221 -34
  29. package/scripts/copy-examples.mjs +9 -5
  30. package/scripts/export-onnx.mjs +3 -3
  31. package/scripts/generate-bench-tables.mjs +10 -10
  32. package/scripts/generate-bench-tables.ts +10 -10
  33. package/scripts/generate-docs.ts +1415 -449
  34. package/scripts/render-docs-html.ts +15 -8
  35. package/src/README.md +127 -222
  36. package/src/architecture/README.md +117 -184
  37. package/src/architecture/architect.ts +6 -0
  38. package/src/architecture/layer/README.md +38 -38
  39. package/src/architecture/network/README.md +49 -31
  40. package/src/architecture/network/activate/README.md +77 -77
  41. package/src/architecture/network/connect/README.md +15 -13
  42. package/src/architecture/network/deterministic/README.md +7 -7
  43. package/src/architecture/network/evolve/README.md +44 -44
  44. package/src/architecture/network/gating/README.md +20 -20
  45. package/src/architecture/network/genetic/README.md +51 -51
  46. package/src/architecture/network/mutate/README.md +97 -97
  47. package/src/architecture/network/network.types.ts +39 -0
  48. package/src/architecture/network/onnx/README.md +264 -264
  49. package/src/architecture/network/prune/README.md +39 -39
  50. package/src/architecture/network/remove/README.md +26 -26
  51. package/src/architecture/network/serialize/README.md +56 -56
  52. package/src/architecture/network/serialize/network.serialize.json.utils.ts +1 -0
  53. package/src/architecture/network/serialize/network.serialize.utils.ts +6 -1
  54. package/src/architecture/network/serialize/network.serialize.utils.types.ts +1 -1
  55. package/src/architecture/network/slab/README.md +61 -61
  56. package/src/architecture/network/standalone/README.md +24 -24
  57. package/src/architecture/network/stats/README.md +9 -9
  58. package/src/architecture/network/topology/README.md +46 -46
  59. package/src/architecture/network/training/README.md +21 -21
  60. package/src/architecture/network.ts +114 -10
  61. package/src/methods/README.md +9 -87
  62. package/src/multithreading/README.md +8 -77
  63. package/src/multithreading/workers/README.md +2 -2
  64. package/src/multithreading/workers/browser/README.md +0 -6
  65. package/src/multithreading/workers/node/README.md +0 -3
  66. package/src/neat/README.md +623 -568
  67. package/src/neat/neat.evolve.population.utils.ts +29 -5
  68. package/src/neat/neat.helpers.ts +16 -0
  69. package/src/neat/neat.topology-intent.utils.ts +160 -0
  70. package/src/utils/README.md +18 -18
  71. package/test/examples/asciiMaze/README.md +59 -59
  72. package/test/examples/asciiMaze/asciiMaze.e2e.test.ts +14 -9
  73. package/test/examples/asciiMaze/browser-entry/README.md +196 -0
  74. package/test/examples/asciiMaze/browser-entry/browser-entry.abort.services.ts +95 -0
  75. package/test/examples/asciiMaze/browser-entry/browser-entry.constants.ts +23 -0
  76. package/test/examples/asciiMaze/browser-entry/browser-entry.curriculum.services.ts +115 -0
  77. package/test/examples/asciiMaze/browser-entry/browser-entry.globals.services.ts +106 -0
  78. package/test/examples/asciiMaze/browser-entry/browser-entry.host.services.ts +157 -0
  79. package/test/examples/asciiMaze/browser-entry/browser-entry.services.ts +14 -0
  80. package/test/examples/asciiMaze/browser-entry/browser-entry.ts +129 -0
  81. package/test/examples/asciiMaze/browser-entry/browser-entry.types.ts +120 -0
  82. package/test/examples/asciiMaze/browser-entry/browser-entry.utils.ts +98 -0
  83. package/test/examples/asciiMaze/browser-entry.ts +10 -576
  84. package/test/examples/asciiMaze/dashboardManager/README.md +276 -0
  85. package/test/examples/asciiMaze/dashboardManager/archive/README.md +16 -0
  86. package/test/examples/asciiMaze/dashboardManager/archive/dashboardManager.archive.services.ts +267 -0
  87. package/test/examples/asciiMaze/dashboardManager/dashboardManager.constants.ts +35 -0
  88. package/test/examples/asciiMaze/dashboardManager/dashboardManager.services.ts +103 -0
  89. package/test/examples/asciiMaze/dashboardManager/dashboardManager.ts +181 -0
  90. package/test/examples/asciiMaze/dashboardManager/dashboardManager.types.ts +267 -0
  91. package/test/examples/asciiMaze/dashboardManager/dashboardManager.utils.ts +254 -0
  92. package/test/examples/asciiMaze/dashboardManager/live/README.md +14 -0
  93. package/test/examples/asciiMaze/dashboardManager/live/dashboardManager.live.services.ts +264 -0
  94. package/test/examples/asciiMaze/dashboardManager/telemetry/README.md +47 -0
  95. package/test/examples/asciiMaze/dashboardManager/telemetry/dashboardManager.telemetry.services.ts +513 -0
  96. package/test/examples/asciiMaze/dashboardManager.ts +13 -2335
  97. package/test/examples/asciiMaze/evolutionEngine/README.md +1058 -0
  98. package/test/examples/asciiMaze/evolutionEngine/curriculumPhase.ts +90 -0
  99. package/test/examples/asciiMaze/evolutionEngine/engineState.constants.ts +36 -0
  100. package/test/examples/asciiMaze/evolutionEngine/engineState.ts +58 -513
  101. package/test/examples/asciiMaze/evolutionEngine/engineState.types.ts +212 -0
  102. package/test/examples/asciiMaze/evolutionEngine/engineState.utils.ts +301 -0
  103. package/test/examples/asciiMaze/evolutionEngine/evolutionEngine.types.ts +445 -0
  104. package/test/examples/asciiMaze/evolutionEngine/evolutionLoop.ts +81 -50
  105. package/test/examples/asciiMaze/evolutionEngine/optionsAndSetup.ts +2 -4
  106. package/test/examples/asciiMaze/evolutionEngine/populationDynamics.ts +17 -33
  107. package/test/examples/asciiMaze/evolutionEngine/populationPruning.ts +1 -1
  108. package/test/examples/asciiMaze/evolutionEngine/rngAndTiming.ts +1 -2
  109. package/test/examples/asciiMaze/evolutionEngine/sampling.ts +1 -1
  110. package/test/examples/asciiMaze/evolutionEngine/scratchPools.ts +2 -5
  111. package/test/examples/asciiMaze/evolutionEngine/setupHelpers.ts +30 -37
  112. package/test/examples/asciiMaze/evolutionEngine/telemetryMetrics.ts +16 -58
  113. package/test/examples/asciiMaze/evolutionEngine/trainingWarmStart.ts +2 -2
  114. package/test/examples/asciiMaze/evolutionEngine.ts +55 -55
  115. package/test/examples/asciiMaze/fitness.ts +2 -2
  116. package/test/examples/asciiMaze/fitness.types.ts +65 -0
  117. package/test/examples/asciiMaze/interfaces.ts +64 -1352
  118. package/test/examples/asciiMaze/mazeMovement/README.md +356 -0
  119. package/test/examples/asciiMaze/mazeMovement/finalization/README.md +49 -0
  120. package/test/examples/asciiMaze/mazeMovement/finalization/mazeMovement.finalization.ts +138 -0
  121. package/test/examples/asciiMaze/mazeMovement/mazeMovement.constants.ts +101 -0
  122. package/test/examples/asciiMaze/mazeMovement/mazeMovement.services.ts +230 -0
  123. package/test/examples/asciiMaze/mazeMovement/mazeMovement.ts +299 -0
  124. package/test/examples/asciiMaze/mazeMovement/mazeMovement.types.ts +185 -0
  125. package/test/examples/asciiMaze/mazeMovement/mazeMovement.utils.ts +153 -0
  126. package/test/examples/asciiMaze/mazeMovement/policy/README.md +91 -0
  127. package/test/examples/asciiMaze/mazeMovement/policy/mazeMovement.policy.ts +467 -0
  128. package/test/examples/asciiMaze/mazeMovement/runtime/README.md +95 -0
  129. package/test/examples/asciiMaze/mazeMovement/runtime/mazeMovement.runtime.ts +354 -0
  130. package/test/examples/asciiMaze/mazeMovement/shaping/README.md +124 -0
  131. package/test/examples/asciiMaze/mazeMovement/shaping/mazeMovement.shaping.ts +459 -0
  132. package/test/examples/asciiMaze/mazeMovement.ts +12 -2978
  133. package/test/examples/flappy_bird/README.md +193 -88
  134. package/test/examples/flappy_bird/browser-entry/README.md +1441 -0
  135. package/test/examples/flappy_bird/browser-entry/browser-entry.host.utils.ts +4 -324
  136. package/test/examples/flappy_bird/browser-entry/browser-entry.network-view.utils.ts +9 -396
  137. package/test/examples/flappy_bird/browser-entry/browser-entry.playback.utils.ts +6 -714
  138. package/test/examples/flappy_bird/browser-entry/browser-entry.render.types.ts +26 -3
  139. package/test/examples/flappy_bird/browser-entry/browser-entry.runtime.types.ts +16 -1
  140. package/test/examples/flappy_bird/browser-entry/browser-entry.simulation.types.ts +39 -5
  141. package/test/examples/flappy_bird/browser-entry/browser-entry.spawn.utils.ts +11 -31
  142. package/test/examples/flappy_bird/browser-entry/browser-entry.stats.types.ts +32 -4
  143. package/test/examples/flappy_bird/browser-entry/browser-entry.ts +11 -0
  144. package/test/examples/flappy_bird/browser-entry/browser-entry.types.ts +8 -0
  145. package/test/examples/flappy_bird/browser-entry/browser-entry.visualization.types.ts +50 -7
  146. package/test/examples/flappy_bird/browser-entry/browser-entry.visualization.utils.ts +21 -893
  147. package/test/examples/flappy_bird/browser-entry/browser-entry.worker.types.ts +91 -10
  148. package/test/examples/flappy_bird/browser-entry/host/README.md +318 -0
  149. package/test/examples/flappy_bird/browser-entry/host/host.canvas.service.ts +16 -0
  150. package/test/examples/flappy_bird/browser-entry/host/host.constants.ts +20 -0
  151. package/test/examples/flappy_bird/browser-entry/host/host.dom.service.ts +10 -0
  152. package/test/examples/flappy_bird/browser-entry/host/host.resize.service.ts +1 -295
  153. package/test/examples/flappy_bird/browser-entry/host/host.stats.service.ts +14 -0
  154. package/test/examples/flappy_bird/browser-entry/host/host.ts +592 -6
  155. package/test/examples/flappy_bird/browser-entry/host/host.types.ts +13 -0
  156. package/test/examples/flappy_bird/browser-entry/host/resize/README.md +309 -0
  157. package/test/examples/flappy_bird/browser-entry/host/resize/host.resize.service.constants.ts +47 -0
  158. package/test/examples/flappy_bird/browser-entry/host/resize/host.resize.service.services.ts +392 -0
  159. package/test/examples/flappy_bird/browser-entry/host/resize/host.resize.service.ts +132 -0
  160. package/test/examples/flappy_bird/browser-entry/host/resize/host.resize.service.types.ts +92 -0
  161. package/test/examples/flappy_bird/browser-entry/host/resize/host.resize.service.utils.ts +272 -0
  162. package/test/examples/flappy_bird/browser-entry/network-view/README.md +389 -0
  163. package/test/examples/flappy_bird/browser-entry/network-view/network-view.draw.service.ts +13 -0
  164. package/test/examples/flappy_bird/browser-entry/network-view/network-view.labels.utils.ts +12 -0
  165. package/test/examples/flappy_bird/browser-entry/network-view/network-view.layout.utils.ts +14 -0
  166. package/test/examples/flappy_bird/browser-entry/network-view/network-view.topology.utils.ts +267 -0
  167. package/test/examples/flappy_bird/browser-entry/network-view/network-view.ts +823 -7
  168. package/test/examples/flappy_bird/browser-entry/network-view/network-view.types.ts +11 -0
  169. package/test/examples/flappy_bird/browser-entry/playback/README.md +845 -0
  170. package/test/examples/flappy_bird/browser-entry/playback/background/README.md +355 -0
  171. package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/README.md +1068 -0
  172. package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/playback.background.ground-grid.batch.services.ts +64 -0
  173. package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/playback.background.ground-grid.cache.services.ts +207 -0
  174. package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/playback.background.ground-grid.constants.ts +197 -0
  175. package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/playback.background.ground-grid.geometry.batch.utils.ts +114 -0
  176. package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/playback.background.ground-grid.geometry.layout.utils.test.ts +96 -0
  177. package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/playback.background.ground-grid.geometry.layout.utils.ts +204 -0
  178. package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/playback.background.ground-grid.geometry.services.ts +49 -0
  179. package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/playback.background.ground-grid.geometry.utils.ts +313 -0
  180. package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/playback.background.ground-grid.layer.services.ts +81 -0
  181. package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/playback.background.ground-grid.math.utils.test.ts +33 -0
  182. package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/playback.background.ground-grid.math.utils.ts +201 -0
  183. package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/playback.background.ground-grid.pulse.selection.utils.ts +171 -0
  184. package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/playback.background.ground-grid.pulse.timing.utils.ts +124 -0
  185. package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/playback.background.ground-grid.pulse.utils.test.ts +279 -0
  186. package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/playback.background.ground-grid.pulse.utils.ts +132 -0
  187. package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/playback.background.ground-grid.scene.services.ts +26 -0
  188. package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/playback.background.ground-grid.services.ts +65 -0
  189. package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/playback.background.ground-grid.ts +48 -0
  190. package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/playback.background.ground-grid.types.ts +342 -0
  191. package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/playback.background.ground-grid.utils.ts +10 -0
  192. package/test/examples/flappy_bird/browser-entry/playback/background/playback.background.cache.services.ts +96 -0
  193. package/test/examples/flappy_bird/browser-entry/playback/background/playback.background.constants.ts +127 -0
  194. package/test/examples/flappy_bird/browser-entry/playback/background/playback.background.draw.services.ts +184 -0
  195. package/test/examples/flappy_bird/browser-entry/playback/background/playback.background.scene.services.ts +64 -0
  196. package/test/examples/flappy_bird/browser-entry/playback/background/playback.background.services.ts +6 -0
  197. package/test/examples/flappy_bird/browser-entry/playback/background/playback.background.ts +53 -0
  198. package/test/examples/flappy_bird/browser-entry/playback/background/playback.background.types.ts +105 -0
  199. package/test/examples/flappy_bird/browser-entry/playback/background/playback.background.utils.ts +100 -0
  200. package/test/examples/flappy_bird/browser-entry/playback/frame-render/README.md +541 -0
  201. package/test/examples/flappy_bird/browser-entry/playback/frame-render/playback.frame-render.bird.utils.ts +180 -0
  202. package/test/examples/flappy_bird/browser-entry/playback/frame-render/playback.frame-render.canvas.services.ts +77 -0
  203. package/test/examples/flappy_bird/browser-entry/playback/frame-render/playback.frame-render.entity.services.ts +167 -0
  204. package/test/examples/flappy_bird/browser-entry/playback/frame-render/playback.frame-render.scene.services.ts +57 -0
  205. package/test/examples/flappy_bird/browser-entry/playback/frame-render/playback.frame-render.service.test.ts +176 -0
  206. package/test/examples/flappy_bird/browser-entry/playback/frame-render/playback.frame-render.service.ts +113 -0
  207. package/test/examples/flappy_bird/browser-entry/playback/frame-render/playback.frame-render.services.ts +35 -0
  208. package/test/examples/flappy_bird/browser-entry/playback/frame-render/playback.frame-render.trail.utils.ts +248 -0
  209. package/test/examples/flappy_bird/browser-entry/playback/frame-render/playback.frame-render.types.ts +103 -0
  210. package/test/examples/flappy_bird/browser-entry/playback/frame-render/playback.frame-render.utils.ts +11 -0
  211. package/test/examples/flappy_bird/browser-entry/playback/playback.constants.ts +1 -1
  212. package/test/examples/flappy_bird/browser-entry/playback/playback.frame-render.service.ts +10 -0
  213. package/test/examples/flappy_bird/browser-entry/playback/playback.iteration.services.ts +192 -0
  214. package/test/examples/flappy_bird/browser-entry/playback/playback.loop.service.ts +12 -0
  215. package/test/examples/flappy_bird/browser-entry/playback/playback.orchestration.types.ts +78 -0
  216. package/test/examples/flappy_bird/browser-entry/playback/playback.render.pipe-outline.service.ts +128 -0
  217. package/test/examples/flappy_bird/browser-entry/playback/playback.render.service.ts +1 -116
  218. package/test/examples/flappy_bird/browser-entry/playback/playback.session.services.ts +184 -0
  219. package/test/examples/flappy_bird/browser-entry/playback/playback.snapshot.utils.test.ts +121 -0
  220. package/test/examples/flappy_bird/browser-entry/playback/playback.snapshot.utils.ts +8 -0
  221. package/test/examples/flappy_bird/browser-entry/playback/playback.starfield.layer.services.ts +36 -0
  222. package/test/examples/flappy_bird/browser-entry/playback/playback.starfield.service.ts +11 -128
  223. package/test/examples/flappy_bird/browser-entry/playback/playback.starfield.services.ts +268 -0
  224. package/test/examples/flappy_bird/browser-entry/playback/playback.starfield.types.ts +91 -0
  225. package/test/examples/flappy_bird/browser-entry/playback/playback.starfield.utils.ts +11 -4
  226. package/test/examples/flappy_bird/browser-entry/playback/playback.trail.utils.ts +9 -86
  227. package/test/examples/flappy_bird/browser-entry/playback/playback.ts +75 -7
  228. package/test/examples/flappy_bird/browser-entry/playback/playback.types.ts +12 -9
  229. package/test/examples/flappy_bird/browser-entry/playback/playback.worker-channel.utils.ts +11 -123
  230. package/test/examples/flappy_bird/browser-entry/playback/snapshot/README.md +55 -0
  231. package/test/examples/flappy_bird/browser-entry/playback/snapshot/playback.snapshot.services.ts +103 -0
  232. package/test/examples/flappy_bird/browser-entry/playback/snapshot/playback.snapshot.summary.utils.test.ts +45 -0
  233. package/test/examples/flappy_bird/browser-entry/playback/snapshot/playback.snapshot.summary.utils.ts +28 -0
  234. package/test/examples/flappy_bird/browser-entry/playback/trail/README.md +95 -0
  235. package/test/examples/flappy_bird/browser-entry/playback/trail/playback.trail.history.services.test.ts +35 -0
  236. package/test/examples/flappy_bird/browser-entry/playback/trail/playback.trail.history.services.ts +64 -0
  237. package/test/examples/flappy_bird/browser-entry/playback/trail/playback.trail.opacity.utils.test.ts +37 -0
  238. package/test/examples/flappy_bird/browser-entry/playback/trail/playback.trail.opacity.utils.ts +74 -0
  239. package/test/examples/flappy_bird/browser-entry/playback/worker-channel/README.md +71 -0
  240. package/test/examples/flappy_bird/browser-entry/playback/worker-channel/playback.worker-channel.request.services.ts +45 -0
  241. package/test/examples/flappy_bird/browser-entry/playback/worker-channel/playback.worker-channel.summary.services.ts +74 -0
  242. package/test/examples/flappy_bird/browser-entry/playback/worker-channel/playback.worker-channel.types.ts +53 -0
  243. package/test/examples/flappy_bird/browser-entry/runtime/README.md +304 -0
  244. package/test/examples/flappy_bird/browser-entry/runtime/runtime.browser-globals.service.ts +15 -0
  245. package/test/examples/flappy_bird/browser-entry/runtime/runtime.errors.ts +17 -0
  246. package/test/examples/flappy_bird/browser-entry/runtime/runtime.evolution-launch.service.ts +56 -0
  247. package/test/examples/flappy_bird/browser-entry/runtime/runtime.evolution-loop.service.ts +19 -0
  248. package/test/examples/flappy_bird/browser-entry/runtime/runtime.lifecycle.service.ts +96 -0
  249. package/test/examples/flappy_bird/browser-entry/runtime/runtime.startup.service.ts +92 -0
  250. package/test/examples/flappy_bird/browser-entry/runtime/runtime.telemetry.service.ts +24 -0
  251. package/test/examples/flappy_bird/browser-entry/runtime/runtime.ts +31 -121
  252. package/test/examples/flappy_bird/browser-entry/runtime/runtime.types.ts +65 -0
  253. package/test/examples/flappy_bird/browser-entry/visualization/README.md +568 -0
  254. package/test/examples/flappy_bird/browser-entry/visualization/visualization.colors.utils.ts +26 -0
  255. package/test/examples/flappy_bird/browser-entry/visualization/visualization.constants.ts +110 -0
  256. package/test/examples/flappy_bird/browser-entry/visualization/visualization.draw.service.ts +979 -19
  257. package/test/examples/flappy_bird/browser-entry/visualization/visualization.legend.utils.ts +157 -3
  258. package/test/examples/flappy_bird/browser-entry/visualization/visualization.topology.utils.ts +13 -27
  259. package/test/examples/flappy_bird/browser-entry/visualization/visualization.ts +7 -20
  260. package/test/examples/flappy_bird/browser-entry/visualization/visualization.types.ts +14 -0
  261. package/test/examples/flappy_bird/browser-entry/worker-channel/README.md +238 -0
  262. package/test/examples/flappy_bird/browser-entry/worker-channel/worker-channel.errors.ts +11 -0
  263. package/test/examples/flappy_bird/browser-entry/worker-channel/worker-channel.generation.service.ts +12 -0
  264. package/test/examples/flappy_bird/browser-entry/worker-channel/worker-channel.playback.service.test.ts +143 -0
  265. package/test/examples/flappy_bird/browser-entry/worker-channel/worker-channel.playback.service.ts +140 -14
  266. package/test/examples/flappy_bird/browser-entry/worker-channel/worker-channel.request.service.ts +27 -0
  267. package/test/examples/flappy_bird/browser-entry/worker-channel/worker-channel.ts +8 -0
  268. package/test/examples/flappy_bird/browser-entry/worker-channel/worker-channel.types.ts +23 -0
  269. package/test/examples/flappy_bird/browser-entry/worker-channel/worker-channel.url.service.ts +5 -0
  270. package/test/examples/flappy_bird/constants/README.md +1163 -0
  271. package/test/examples/flappy_bird/constants/constants.birds.ts +16 -38
  272. package/test/examples/flappy_bird/constants/constants.difficulty.ts +21 -0
  273. package/test/examples/flappy_bird/constants/constants.network-view.ts +24 -0
  274. package/test/examples/flappy_bird/constants/constants.network.ts +1 -1
  275. package/test/examples/flappy_bird/constants/constants.observation.ts +7 -0
  276. package/test/examples/flappy_bird/constants/constants.palette.ts +9 -2
  277. package/test/examples/flappy_bird/constants/constants.physics.ts +9 -0
  278. package/test/examples/flappy_bird/constants/constants.pipe-render.ts +3 -0
  279. package/test/examples/flappy_bird/constants/constants.pipes.ts +22 -3
  280. package/test/examples/flappy_bird/constants/constants.runtime.ts +28 -4
  281. package/test/examples/flappy_bird/constants/constants.starfield.ts +78 -3
  282. package/test/examples/flappy_bird/constants/constants.ts +6 -0
  283. package/test/examples/flappy_bird/environment/README.md +182 -0
  284. package/test/examples/flappy_bird/environment/environment.collision.utils.ts +7 -0
  285. package/test/examples/flappy_bird/environment/environment.constants.ts +16 -3
  286. package/test/examples/flappy_bird/environment/environment.observation.utils.ts +12 -19
  287. package/test/examples/flappy_bird/environment/environment.state.service.ts +10 -0
  288. package/test/examples/flappy_bird/environment/environment.step.service.ts +15 -66
  289. package/test/examples/flappy_bird/environment/environment.types.ts +14 -0
  290. package/test/examples/flappy_bird/evaluation/README.md +155 -0
  291. package/test/examples/flappy_bird/evaluation/evaluation.constants.ts +23 -4
  292. package/test/examples/flappy_bird/evaluation/evaluation.fitness.utils.ts +16 -1
  293. package/test/examples/flappy_bird/evaluation/evaluation.rollout.service.ts +7 -374
  294. package/test/examples/flappy_bird/evaluation/evaluation.seed.utils.ts +4 -0
  295. package/test/examples/flappy_bird/evaluation/evaluation.types.ts +18 -2
  296. package/test/examples/flappy_bird/evaluation/rollout/README.md +355 -0
  297. package/test/examples/flappy_bird/evaluation/rollout/evaluation.rollout.constants.ts +38 -0
  298. package/test/examples/flappy_bird/evaluation/rollout/evaluation.rollout.service.ts +71 -0
  299. package/test/examples/flappy_bird/evaluation/rollout/evaluation.rollout.services.ts +338 -0
  300. package/test/examples/flappy_bird/evaluation/rollout/evaluation.rollout.types.ts +69 -0
  301. package/test/examples/flappy_bird/evaluation/rollout/evaluation.rollout.utils.ts +399 -0
  302. package/test/examples/flappy_bird/flappy-evolution-worker/README.md +845 -0
  303. package/test/examples/flappy_bird/flappy-evolution-worker/flappy-evolution-worker.constants.ts +49 -7
  304. package/test/examples/flappy_bird/flappy-evolution-worker/flappy-evolution-worker.errors.ts +34 -3
  305. package/test/examples/flappy_bird/flappy-evolution-worker/flappy-evolution-worker.evolution.service.ts +22 -0
  306. package/test/examples/flappy_bird/flappy-evolution-worker/flappy-evolution-worker.playback.service.ts +62 -26
  307. package/test/examples/flappy_bird/flappy-evolution-worker/flappy-evolution-worker.protocol.service.ts +27 -1
  308. package/test/examples/flappy_bird/flappy-evolution-worker/flappy-evolution-worker.runtime.service.ts +23 -0
  309. package/test/examples/flappy_bird/flappy-evolution-worker/flappy-evolution-worker.simulation.frame.service.ts +378 -0
  310. package/test/examples/flappy_bird/flappy-evolution-worker/flappy-evolution-worker.simulation.types.ts +22 -0
  311. package/test/examples/flappy_bird/flappy-evolution-worker/flappy-evolution-worker.simulation.utils.ts +20 -203
  312. package/test/examples/flappy_bird/flappy-evolution-worker/flappy-evolution-worker.snapshot.utils.test.ts +94 -0
  313. package/test/examples/flappy_bird/flappy-evolution-worker/flappy-evolution-worker.snapshot.utils.ts +78 -13
  314. package/test/examples/flappy_bird/flappy-evolution-worker/flappy-evolution-worker.ts +235 -344
  315. package/test/examples/flappy_bird/flappy-evolution-worker/flappy-evolution-worker.types.ts +170 -22
  316. package/test/examples/flappy_bird/flappy-evolution-worker/flappy-evolution-worker.warm-start.service.ts +314 -0
  317. package/test/examples/flappy_bird/flappy.simulation.shared.utils.ts +17 -0
  318. package/test/examples/flappy_bird/flappyEnvironment.ts +21 -0
  319. package/test/examples/flappy_bird/flappyEvaluation.ts +12 -0
  320. package/test/examples/flappy_bird/flappyEvolution.worker.ts +7 -0
  321. package/test/examples/flappy_bird/index.ts +8 -2
  322. package/test/examples/flappy_bird/rng.ts +10 -0
  323. package/test/examples/flappy_bird/simulation-shared/README.md +518 -0
  324. package/test/examples/flappy_bird/simulation-shared/observation/README.md +255 -0
  325. package/test/examples/flappy_bird/simulation-shared/observation/observation.features.utils.ts +339 -0
  326. package/test/examples/flappy_bird/simulation-shared/observation/observation.ts +19 -0
  327. package/test/examples/flappy_bird/simulation-shared/observation/observation.vector.utils.ts +81 -0
  328. package/test/examples/flappy_bird/simulation-shared/simulation-shared.constants.ts +3 -0
  329. package/test/examples/flappy_bird/simulation-shared/simulation-shared.control.utils.ts +6 -0
  330. package/test/examples/flappy_bird/simulation-shared/simulation-shared.difficulty.utils.ts +9 -0
  331. package/test/examples/flappy_bird/simulation-shared/simulation-shared.errors.ts +10 -1
  332. package/test/examples/flappy_bird/simulation-shared/simulation-shared.memory.utils.ts +18 -0
  333. package/test/examples/flappy_bird/simulation-shared/simulation-shared.observation.utils.ts +7 -402
  334. package/test/examples/flappy_bird/simulation-shared/simulation-shared.spawn.utils.ts +36 -6
  335. package/test/examples/flappy_bird/{evaluation/evaluation.statistics.utils.ts → simulation-shared/simulation-shared.statistics.utils.ts} +30 -9
  336. package/test/examples/flappy_bird/simulation-shared/simulation-shared.types.ts +38 -5
  337. package/test/examples/flappy_bird/trainFlappyBird.ts +13 -0
  338. package/test/examples/flappy_bird/trainer/README.md +676 -0
  339. package/test/examples/flappy_bird/trainer/evaluation/README.md +253 -0
  340. package/test/examples/flappy_bird/trainer/evaluation/trainer.evaluation.service.constants.ts +15 -0
  341. package/test/examples/flappy_bird/trainer/evaluation/trainer.evaluation.service.services.ts +86 -0
  342. package/test/examples/flappy_bird/trainer/evaluation/trainer.evaluation.service.ts +187 -0
  343. package/test/examples/flappy_bird/trainer/evaluation/trainer.evaluation.service.types.ts +32 -0
  344. package/test/examples/flappy_bird/trainer/evaluation/trainer.evaluation.service.utils.ts +182 -0
  345. package/test/examples/flappy_bird/trainer/trainer.evaluation.service.ts +13 -0
  346. package/test/examples/flappy_bird/trainer/trainer.fitness.service.ts +23 -1
  347. package/test/examples/flappy_bird/trainer/trainer.loop.service.ts +17 -1
  348. package/test/examples/flappy_bird/trainer/trainer.report.service.services.ts +181 -0
  349. package/test/examples/flappy_bird/trainer/trainer.report.service.ts +136 -0
  350. package/test/examples/flappy_bird/trainer/trainer.selection.utils.ts +89 -0
  351. package/test/examples/flappy_bird/trainer/trainer.setup.service.ts +22 -0
  352. package/test/examples/flappy_bird/trainer/trainer.signals.service.ts +8 -0
  353. package/test/examples/flappy_bird/trainer/trainer.ts +38 -553
  354. package/test/examples/flappy_bird/trainer/trainer.types.ts +44 -7
  355. package/test/neat/neat.topology-intent.test.ts +129 -0
  356. package/test/network/network.topology-intent.test.ts +44 -0
  357. package/test/examples/flappy_bird/browser-entry/browser-entry.utils.ts +0 -12
  358. package/test/examples/flappy_bird/environment/environment.ts +0 -7
  359. package/test/examples/flappy_bird/evaluation/evaluation.ts +0 -7
  360. package/test/examples/flappy_bird/simulation-shared/simulation-shared.ts +0 -15
  361. package/test/examples/flappy_bird/trainer/trainer.statistics.utils.ts +0 -78
@@ -0,0 +1,255 @@
1
+ # simulation-shared/observation
2
+
3
+ ## simulation-shared/observation/observation.ts
4
+
5
+ ### observation
6
+
7
+ Shared observation public entry.
8
+
9
+ This focused boundary keeps observation feature assembly separate from
10
+ observation-vector projection so browser, environment, and worker callers can
11
+ depend on a smaller, clearer public surface.
12
+
13
+ Conceptually, this folder is the "state representation" layer for the
14
+ Flappy Bird example. Instead of learning directly from pixels, the agent sees
15
+ a compact set of geometric and kinematic signals derived from the current
16
+ world state. That makes the example easier to study, faster to evaluate, and
17
+ closer to classic feature-engineering pipelines used in small control tasks.
18
+
19
+ If you want background reading, the Wikipedia articles on "feature
20
+ engineering" and "state space representation" give useful intuition for why
21
+ this boundary exists at all.
22
+
23
+ ### resolveCoreObservationVectorFromFeatures
24
+
25
+ `(features: import("test/examples/flappy_bird/simulation-shared/simulation-shared.types").SharedObservationFeatures) => number[]`
26
+
27
+ Resolves the compact core vector used for temporal stacking.
28
+
29
+ The core intentionally keeps directly observed kinematic and geometric
30
+ channels while dropping derived one-step predictors that become redundant
31
+ once short-term temporal memory is available.
32
+
33
+ This is the representation used when the example wants a short history of raw
34
+ observation slices. The idea is similar to frame stacking in reinforcement
35
+ learning: a feed-forward policy can recover some sense of motion by looking
36
+ at several recent compact frames at once.
37
+
38
+ The Wikipedia article on "frame stacking" is a useful conceptual reference.
39
+
40
+ Parameters:
41
+ - `features` - - Structured observation features.
42
+
43
+ Returns: Core per-frame vector.
44
+
45
+ ### resolveObservationFeatures
46
+
47
+ `(input: import("test/examples/flappy_bird/simulation-shared/simulation-shared.types").SharedObservationInput) => import("test/examples/flappy_bird/simulation-shared/simulation-shared.types").SharedObservationFeatures`
48
+
49
+ Builds the shared normalized observation feature set consumed by policies.
50
+
51
+ Educational note:
52
+ This helper stays focused on semantic feature assembly only. Projection into
53
+ the canonical network vectors now lives in the neighboring vector module so
54
+ observation policy and network-shape concerns can evolve independently.
55
+
56
+ The features deliberately mix three kinds of signal:
57
+ 1. Current state, such as bird height and vertical velocity.
58
+ 2. Near-term geometry, such as gap bounds and upcoming-pipe distances.
59
+ 3. Simple forward-looking control hints, such as urgency and one-flap
60
+ reachability.
61
+
62
+ This is a compact example of feature engineering for control. Instead of
63
+ asking NEAT to rediscover basic geometry from raw sensory input, the example
64
+ hands the network semantically meaningful signals and lets evolution focus on
65
+ policy search.
66
+
67
+ For broader context, the Wikipedia article on "feature engineering" is a
68
+ good companion reference.
69
+
70
+ Parameters:
71
+ - `input` - - Observation input bundle.
72
+
73
+ Returns: Structured observation features.
74
+
75
+ ### resolveObservationVectorFromFeatures
76
+
77
+ `(features: import("test/examples/flappy_bird/simulation-shared/simulation-shared.types").SharedObservationFeatures) => number[]`
78
+
79
+ Converts observation features to the canonical 12-value network input vector.
80
+
81
+ Educational note:
82
+ This module owns the network-shape projection so feature semantics can change
83
+ independently from how the policy input is ordered.
84
+
85
+ The 12-value vector is the compact feed-forward policy input used by the main
86
+ evaluation and training flow. Its ordering is stable on purpose: once a
87
+ network topology has evolved against one input layout, silent channel
88
+ reshuffles would invalidate learned behavior.
89
+
90
+ Parameters:
91
+ - `features` - - Structured feature object.
92
+
93
+ Returns: Ordered feature vector.
94
+
95
+ ### resolveUpcomingPipes
96
+
97
+ `(pipes: import("test/examples/flappy_bird/simulation-shared/simulation-shared.types").SharedPipeLike[], birdCenterXPx: number, birdRadiusPx: number, pipeWidthPx: number) => [import("test/examples/flappy_bird/simulation-shared/simulation-shared.types").SharedPipeLike | undefined, import("test/examples/flappy_bird/simulation-shared/simulation-shared.types").SharedPipeLike | undefined]`
98
+
99
+ Resolves the next two upcoming pipes in front of the bird.
100
+
101
+ The observation pipeline only cares about the immediate near future, because
102
+ Flappy Bird decisions are dominated by the next gap and the transition after
103
+ it. Looking further ahead adds noise faster than it adds useful control
104
+ signal.
105
+
106
+ Parameters:
107
+ - `pipes` - - Current pipe list.
108
+ - `birdCenterXPx` - - Bird center x-position.
109
+ - `birdRadiusPx` - - Bird radius.
110
+ - `pipeWidthPx` - - Pipe width.
111
+
112
+ Returns: Tuple of first and second upcoming pipes.
113
+
114
+ ## simulation-shared/observation/observation.vector.utils.ts
115
+
116
+ ### resolveCoreObservationVectorFromFeatures
117
+
118
+ `(features: import("test/examples/flappy_bird/simulation-shared/simulation-shared.types").SharedObservationFeatures) => number[]`
119
+
120
+ Resolves the compact core vector used for temporal stacking.
121
+
122
+ The core intentionally keeps directly observed kinematic and geometric
123
+ channels while dropping derived one-step predictors that become redundant
124
+ once short-term temporal memory is available.
125
+
126
+ This is the representation used when the example wants a short history of raw
127
+ observation slices. The idea is similar to frame stacking in reinforcement
128
+ learning: a feed-forward policy can recover some sense of motion by looking
129
+ at several recent compact frames at once.
130
+
131
+ The Wikipedia article on "frame stacking" is a useful conceptual reference.
132
+
133
+ Parameters:
134
+ - `features` - - Structured observation features.
135
+
136
+ Returns: Core per-frame vector.
137
+
138
+ ### resolveObservationVectorFromFeatures
139
+
140
+ `(features: import("test/examples/flappy_bird/simulation-shared/simulation-shared.types").SharedObservationFeatures) => number[]`
141
+
142
+ Converts observation features to the canonical 12-value network input vector.
143
+
144
+ Educational note:
145
+ This module owns the network-shape projection so feature semantics can change
146
+ independently from how the policy input is ordered.
147
+
148
+ The 12-value vector is the compact feed-forward policy input used by the main
149
+ evaluation and training flow. Its ordering is stable on purpose: once a
150
+ network topology has evolved against one input layout, silent channel
151
+ reshuffles would invalidate learned behavior.
152
+
153
+ Parameters:
154
+ - `features` - - Structured feature object.
155
+
156
+ Returns: Ordered feature vector.
157
+
158
+ ## simulation-shared/observation/observation.features.utils.ts
159
+
160
+ ### clamp
161
+
162
+ `(value: number, min: number, max: number) => number`
163
+
164
+ Clamps a numeric value to the inclusive [min, max] interval.
165
+
166
+ Observation synthesis normalizes many raw measurements, so this helper keeps
167
+ derived channels inside their documented ranges.
168
+
169
+ Parameters:
170
+ - `value` - - Candidate value.
171
+ - `min` - - Inclusive lower bound.
172
+ - `max` - - Inclusive upper bound.
173
+
174
+ Returns: Clamped value.
175
+
176
+ ### clamp01
177
+
178
+ `(value: number) => number`
179
+
180
+ Clamps a numeric value to the inclusive [0, 1] interval.
181
+
182
+ This is used for channels that are naturally interpreted as normalized
183
+ proportions or bounded progress values.
184
+
185
+ Parameters:
186
+ - `value` - - Candidate value.
187
+
188
+ Returns: Value clamped between 0 and 1.
189
+
190
+ ### resolveObservationFeatures
191
+
192
+ `(input: import("test/examples/flappy_bird/simulation-shared/simulation-shared.types").SharedObservationInput) => import("test/examples/flappy_bird/simulation-shared/simulation-shared.types").SharedObservationFeatures`
193
+
194
+ Builds the shared normalized observation feature set consumed by policies.
195
+
196
+ Educational note:
197
+ This helper stays focused on semantic feature assembly only. Projection into
198
+ the canonical network vectors now lives in the neighboring vector module so
199
+ observation policy and network-shape concerns can evolve independently.
200
+
201
+ The features deliberately mix three kinds of signal:
202
+ 1. Current state, such as bird height and vertical velocity.
203
+ 2. Near-term geometry, such as gap bounds and upcoming-pipe distances.
204
+ 3. Simple forward-looking control hints, such as urgency and one-flap
205
+ reachability.
206
+
207
+ This is a compact example of feature engineering for control. Instead of
208
+ asking NEAT to rediscover basic geometry from raw sensory input, the example
209
+ hands the network semantically meaningful signals and lets evolution focus on
210
+ policy search.
211
+
212
+ For broader context, the Wikipedia article on "feature engineering" is a
213
+ good companion reference.
214
+
215
+ Parameters:
216
+ - `input` - - Observation input bundle.
217
+
218
+ Returns: Structured observation features.
219
+
220
+ ### resolvePredictedBirdYAtFrames
221
+
222
+ `(startYPx: number, initialVerticalVelocityPxPerFrame: number, frameHorizon: number) => number`
223
+
224
+ Predicts bird y-position after a frame horizon with constant gravity.
225
+
226
+ This is a deliberately cheap forward model. It ignores richer control
227
+ sequences and simply answers: "where would the bird be after N frames under
228
+ the current physics assumption?" That small prediction is enough to build the
229
+ reachability and urgency features used by the controller.
230
+
231
+ Parameters:
232
+ - `startYPx` - - Current bird y-position.
233
+ - `initialVerticalVelocityPxPerFrame` - - Initial vertical velocity.
234
+ - `frameHorizon` - - Predicted horizon in simulation frames.
235
+
236
+ Returns: Predicted y-position.
237
+
238
+ ### resolveUpcomingPipes
239
+
240
+ `(pipes: import("test/examples/flappy_bird/simulation-shared/simulation-shared.types").SharedPipeLike[], birdCenterXPx: number, birdRadiusPx: number, pipeWidthPx: number) => [import("test/examples/flappy_bird/simulation-shared/simulation-shared.types").SharedPipeLike | undefined, import("test/examples/flappy_bird/simulation-shared/simulation-shared.types").SharedPipeLike | undefined]`
241
+
242
+ Resolves the next two upcoming pipes in front of the bird.
243
+
244
+ The observation pipeline only cares about the immediate near future, because
245
+ Flappy Bird decisions are dominated by the next gap and the transition after
246
+ it. Looking further ahead adds noise faster than it adds useful control
247
+ signal.
248
+
249
+ Parameters:
250
+ - `pipes` - - Current pipe list.
251
+ - `birdCenterXPx` - - Bird center x-position.
252
+ - `birdRadiusPx` - - Bird radius.
253
+ - `pipeWidthPx` - - Pipe width.
254
+
255
+ Returns: Tuple of first and second upcoming pipes.
@@ -0,0 +1,339 @@
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_PIPE_GAP_PX,
8
+ FLAPPY_PIPE_WIDTH_PX,
9
+ FLAPPY_WORLD_HEIGHT_PX,
10
+ } from '../../constants/constants';
11
+ import { FLAPPY_SHARED_DEFAULT_NORMALIZATION_EPSILON } from '../simulation-shared.constants';
12
+ import type {
13
+ SharedObservationFeatures,
14
+ SharedObservationInput,
15
+ SharedPipeLike,
16
+ } from '../simulation-shared.types';
17
+
18
+ /**
19
+ * Resolves the next two upcoming pipes in front of the bird.
20
+ *
21
+ * The observation pipeline only cares about the immediate near future, because
22
+ * Flappy Bird decisions are dominated by the next gap and the transition after
23
+ * it. Looking further ahead adds noise faster than it adds useful control
24
+ * signal.
25
+ *
26
+ * @param pipes - Current pipe list.
27
+ * @param birdCenterXPx - Bird center x-position.
28
+ * @param birdRadiusPx - Bird radius.
29
+ * @param pipeWidthPx - Pipe width.
30
+ * @returns Tuple of first and second upcoming pipes.
31
+ * @example
32
+ * ```ts
33
+ * const [nextPipe, secondPipe] = resolveUpcomingPipes(pipes);
34
+ * ```
35
+ */
36
+ export function resolveUpcomingPipes(
37
+ pipes: SharedPipeLike[],
38
+ birdCenterXPx = FLAPPY_BIRD_X_PX,
39
+ birdRadiusPx = FLAPPY_BIRD_RADIUS_PX,
40
+ pipeWidthPx = FLAPPY_PIPE_WIDTH_PX,
41
+ ): [SharedPipeLike | undefined, SharedPipeLike | undefined] {
42
+ const birdFrontX = birdCenterXPx - birdRadiusPx;
43
+ const upcomingPipes = pipes.filter(
44
+ (pipe) => pipe.xPx + pipeWidthPx >= birdFrontX,
45
+ );
46
+ return [upcomingPipes[0], upcomingPipes[1]];
47
+ }
48
+
49
+ /**
50
+ * Builds the shared normalized observation feature set consumed by policies.
51
+ *
52
+ * Educational note:
53
+ * This helper stays focused on semantic feature assembly only. Projection into
54
+ * the canonical network vectors now lives in the neighboring vector module so
55
+ * observation policy and network-shape concerns can evolve independently.
56
+ *
57
+ * The features deliberately mix three kinds of signal:
58
+ * 1. Current state, such as bird height and vertical velocity.
59
+ * 2. Near-term geometry, such as gap bounds and upcoming-pipe distances.
60
+ * 3. Simple forward-looking control hints, such as urgency and one-flap
61
+ * reachability.
62
+ *
63
+ * This is a compact example of feature engineering for control. Instead of
64
+ * asking NEAT to rediscover basic geometry from raw sensory input, the example
65
+ * hands the network semantically meaningful signals and lets evolution focus on
66
+ * policy search.
67
+ *
68
+ * For broader context, the Wikipedia article on "feature engineering" is a
69
+ * good companion reference.
70
+ *
71
+ * @param input - Observation input bundle.
72
+ * @returns Structured observation features.
73
+ * @example
74
+ * ```ts
75
+ * const features = resolveObservationFeatures({
76
+ * birdYPx: 120,
77
+ * velocityYPxPerFrame: 2,
78
+ * pipes,
79
+ * visibleWorldWidthPx: 640,
80
+ * difficultyProfile,
81
+ * activeSpawnIntervalFrames: 90,
82
+ * });
83
+ *
84
+ * if (features.normalizedEntryUrgency > 0.8) {
85
+ * // The bird is misaligned and running out of time to recover.
86
+ * }
87
+ * ```
88
+ */
89
+ export function resolveObservationFeatures(
90
+ input: SharedObservationInput,
91
+ ): SharedObservationFeatures {
92
+ // Step 1: Resolve normalization and geometry defaults.
93
+ const worldHeightPx = input.worldHeightPx ?? FLAPPY_WORLD_HEIGHT_PX;
94
+ const maxFallSpeedPxPerFrame =
95
+ input.maxFallSpeedPxPerFrame ?? FLAPPY_MAX_FALL_SPEED_PX_PER_FRAME;
96
+ const birdCenterXPx = input.birdCenterXPx ?? FLAPPY_BIRD_X_PX;
97
+ const birdRadiusPx = input.birdRadiusPx ?? FLAPPY_BIRD_RADIUS_PX;
98
+ const pipeWidthPx = input.pipeWidthPx ?? FLAPPY_PIPE_WIDTH_PX;
99
+ const defaultGapSizePx = input.defaultGapSizePx ?? FLAPPY_PIPE_GAP_PX;
100
+ const normalizationEpsilon =
101
+ input.normalizationEpsilon ?? FLAPPY_SHARED_DEFAULT_NORMALIZATION_EPSILON;
102
+
103
+ // Step 2: Resolve next-pipe geometry used by all near-term features.
104
+ const [nextPipe, secondPipe] = resolveUpcomingPipes(
105
+ input.pipes,
106
+ birdCenterXPx,
107
+ birdRadiusPx,
108
+ pipeWidthPx,
109
+ );
110
+ const normalizedBirdY = clamp01(input.birdYPx / worldHeightPx);
111
+ const normalizedVelocity = clamp(
112
+ input.velocityYPxPerFrame / maxFallSpeedPxPerFrame,
113
+ -1,
114
+ 1,
115
+ );
116
+
117
+ const distanceToNextPipePx = nextPipe
118
+ ? nextPipe.xPx + pipeWidthPx - birdCenterXPx
119
+ : input.visibleWorldWidthPx;
120
+ const normalizedDistanceToNextPipe = clamp01(
121
+ distanceToNextPipePx / input.visibleWorldWidthPx,
122
+ );
123
+
124
+ const nextGapCenterYPx = nextPipe?.gapCenterYPx ?? worldHeightPx * 0.5;
125
+ const nextGapHalfPx = (nextPipe?.gapSizePx ?? defaultGapSizePx) * 0.5;
126
+ const normalizedNextGapTop = clamp01(
127
+ (nextGapCenterYPx - nextGapHalfPx) / worldHeightPx,
128
+ );
129
+ const normalizedNextGapBottom = clamp01(
130
+ (nextGapCenterYPx + nextGapHalfPx) / worldHeightPx,
131
+ );
132
+ const normalizedDeltaToNextGap = clamp(
133
+ (input.birdYPx - nextGapCenterYPx) / worldHeightPx,
134
+ -1,
135
+ 1,
136
+ );
137
+
138
+ const distanceToSecondPipePx = secondPipe
139
+ ? secondPipe.xPx + pipeWidthPx - birdCenterXPx
140
+ : input.visibleWorldWidthPx;
141
+ const normalizedDistanceToSecondPipe = clamp01(
142
+ distanceToSecondPipePx / input.visibleWorldWidthPx,
143
+ );
144
+
145
+ const secondGapCenterYPx = secondPipe?.gapCenterYPx ?? nextGapCenterYPx;
146
+ const normalizedDeltaToSecondGap = clamp(
147
+ (input.birdYPx - secondGapCenterYPx) / worldHeightPx,
148
+ -1,
149
+ 1,
150
+ );
151
+
152
+ // Step 3: Resolve timing, clearance, and controllability signals.
153
+ const estimatedFramesToNextPipe =
154
+ distanceToNextPipePx /
155
+ Math.max(normalizationEpsilon, input.difficultyProfile.pipeSpeedPxPerFrame);
156
+ const normalizedTimeToNextPipe = clamp01(
157
+ 1 -
158
+ estimatedFramesToNextPipe / Math.max(1, input.activeSpawnIntervalFrames),
159
+ );
160
+
161
+ const distanceToNextGapCenterPx = Math.abs(input.birdYPx - nextGapCenterYPx);
162
+ const normalizedNextGapClearance = clamp(
163
+ (nextGapHalfPx - distanceToNextGapCenterPx) / Math.max(1, nextGapHalfPx),
164
+ -1,
165
+ 1,
166
+ );
167
+
168
+ const distanceToGapEntryPx = nextPipe
169
+ ? nextPipe.xPx - (birdCenterXPx + birdRadiusPx)
170
+ : input.visibleWorldWidthPx;
171
+ const distanceToGapExitPx = nextPipe
172
+ ? nextPipe.xPx + pipeWidthPx - (birdCenterXPx - birdRadiusPx)
173
+ : input.visibleWorldWidthPx;
174
+
175
+ const framesToGapEntry = Math.max(
176
+ 0,
177
+ distanceToGapEntryPx /
178
+ Math.max(
179
+ normalizationEpsilon,
180
+ input.difficultyProfile.pipeSpeedPxPerFrame,
181
+ ),
182
+ );
183
+ const framesToGapExit = Math.max(
184
+ framesToGapEntry,
185
+ distanceToGapExitPx /
186
+ Math.max(
187
+ normalizationEpsilon,
188
+ input.difficultyProfile.pipeSpeedPxPerFrame,
189
+ ),
190
+ );
191
+
192
+ const normalizedFramesToGapEntry = clamp01(
193
+ framesToGapEntry / Math.max(1, input.activeSpawnIntervalFrames),
194
+ );
195
+ const normalizedFramesToGapExit = clamp01(
196
+ framesToGapExit / Math.max(1, input.activeSpawnIntervalFrames),
197
+ );
198
+
199
+ const requiredVerticalVelocityToNextGapPxPerFrame = clamp(
200
+ (nextGapCenterYPx - input.birdYPx) / Math.max(1, estimatedFramesToNextPipe),
201
+ -maxFallSpeedPxPerFrame,
202
+ maxFallSpeedPxPerFrame,
203
+ );
204
+ const normalizedRequiredVerticalVelocityToNextGap = clamp(
205
+ requiredVerticalVelocityToNextGapPxPerFrame / maxFallSpeedPxPerFrame,
206
+ -1,
207
+ 1,
208
+ );
209
+
210
+ const requiredVerticalVelocityAtGapEntryPxPerFrame = clamp(
211
+ (nextGapCenterYPx - input.birdYPx) / Math.max(1, framesToGapEntry),
212
+ -maxFallSpeedPxPerFrame,
213
+ maxFallSpeedPxPerFrame,
214
+ );
215
+ const requiredVerticalVelocityAtGapExitPxPerFrame = clamp(
216
+ (nextGapCenterYPx - input.birdYPx) / Math.max(1, framesToGapExit),
217
+ -maxFallSpeedPxPerFrame,
218
+ maxFallSpeedPxPerFrame,
219
+ );
220
+ const normalizedRequiredVerticalVelocityAtGapEntry = clamp(
221
+ requiredVerticalVelocityAtGapEntryPxPerFrame / maxFallSpeedPxPerFrame,
222
+ -1,
223
+ 1,
224
+ );
225
+ const normalizedRequiredVerticalVelocityAtGapExit = clamp(
226
+ requiredVerticalVelocityAtGapExitPxPerFrame / maxFallSpeedPxPerFrame,
227
+ -1,
228
+ 1,
229
+ );
230
+
231
+ const normalizedEntryUrgency = clamp(
232
+ Math.abs(normalizedDeltaToNextGap) /
233
+ Math.max(normalizationEpsilon, normalizedFramesToGapEntry),
234
+ 0,
235
+ 1,
236
+ );
237
+
238
+ const predictedBirdYAtEntryWithoutFlap = resolvePredictedBirdYAtFrames(
239
+ input.birdYPx,
240
+ input.velocityYPxPerFrame,
241
+ framesToGapEntry,
242
+ );
243
+ const predictedBirdYAtEntryWithOneFlap = resolvePredictedBirdYAtFrames(
244
+ input.birdYPx,
245
+ FLAPPY_FLAP_VELOCITY_PX_PER_FRAME,
246
+ framesToGapEntry,
247
+ );
248
+ const noFlapEntryErrorPx = Math.abs(
249
+ predictedBirdYAtEntryWithoutFlap - nextGapCenterYPx,
250
+ );
251
+ const oneFlapEntryErrorPx = Math.abs(
252
+ predictedBirdYAtEntryWithOneFlap - nextGapCenterYPx,
253
+ );
254
+ const minimalEntryErrorPx = Math.min(noFlapEntryErrorPx, oneFlapEntryErrorPx);
255
+ const normalizedOneFlapReachabilityAtGapEntry =
256
+ minimalEntryErrorPx <= nextGapHalfPx ? 1 : 0;
257
+
258
+ const normalizedNextToSecondGapTransition = clamp(
259
+ (secondGapCenterYPx - nextGapCenterYPx) / worldHeightPx,
260
+ -1,
261
+ 1,
262
+ );
263
+
264
+ // Step 4: Return the structured feature record consumed by both runtimes.
265
+ return {
266
+ normalizedBirdY,
267
+ normalizedVelocity,
268
+ normalizedDistanceToNextPipe,
269
+ normalizedDeltaToNextGap,
270
+ normalizedNextGapTop,
271
+ normalizedNextGapBottom,
272
+ normalizedDistanceToSecondPipe,
273
+ normalizedDeltaToSecondGap,
274
+ normalizedTimeToNextPipe,
275
+ normalizedNextGapClearance,
276
+ normalizedRequiredVerticalVelocityToNextGap,
277
+ normalizedNextToSecondGapTransition,
278
+ normalizedFramesToGapEntry,
279
+ normalizedFramesToGapExit,
280
+ normalizedRequiredVerticalVelocityAtGapEntry,
281
+ normalizedRequiredVerticalVelocityAtGapExit,
282
+ normalizedEntryUrgency,
283
+ normalizedOneFlapReachabilityAtGapEntry,
284
+ };
285
+ }
286
+
287
+ /**
288
+ * Predicts bird y-position after a frame horizon with constant gravity.
289
+ *
290
+ * This is a deliberately cheap forward model. It ignores richer control
291
+ * sequences and simply answers: "where would the bird be after N frames under
292
+ * the current physics assumption?" That small prediction is enough to build the
293
+ * reachability and urgency features used by the controller.
294
+ *
295
+ * @param startYPx - Current bird y-position.
296
+ * @param initialVerticalVelocityPxPerFrame - Initial vertical velocity.
297
+ * @param frameHorizon - Predicted horizon in simulation frames.
298
+ * @returns Predicted y-position.
299
+ */
300
+ function resolvePredictedBirdYAtFrames(
301
+ startYPx: number,
302
+ initialVerticalVelocityPxPerFrame: number,
303
+ frameHorizon: number,
304
+ ): number {
305
+ const safeFrameHorizon = Math.max(0, frameHorizon);
306
+ return (
307
+ startYPx +
308
+ initialVerticalVelocityPxPerFrame * safeFrameHorizon +
309
+ 0.5 * FLAPPY_GRAVITY_PX_PER_FRAME2 * safeFrameHorizon * safeFrameHorizon
310
+ );
311
+ }
312
+
313
+ /**
314
+ * Clamps a numeric value to the inclusive [min, max] interval.
315
+ *
316
+ * Observation synthesis normalizes many raw measurements, so this helper keeps
317
+ * derived channels inside their documented ranges.
318
+ *
319
+ * @param value - Candidate value.
320
+ * @param min - Inclusive lower bound.
321
+ * @param max - Inclusive upper bound.
322
+ * @returns Clamped value.
323
+ */
324
+ function clamp(value: number, min: number, max: number): number {
325
+ return Math.min(max, Math.max(min, value));
326
+ }
327
+
328
+ /**
329
+ * Clamps a numeric value to the inclusive [0, 1] interval.
330
+ *
331
+ * This is used for channels that are naturally interpreted as normalized
332
+ * proportions or bounded progress values.
333
+ *
334
+ * @param value - Candidate value.
335
+ * @returns Value clamped between 0 and 1.
336
+ */
337
+ function clamp01(value: number): number {
338
+ return clamp(value, 0, 1);
339
+ }
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Shared observation public entry.
3
+ *
4
+ * This focused boundary keeps observation feature assembly separate from
5
+ * observation-vector projection so browser, environment, and worker callers can
6
+ * depend on a smaller, clearer public surface.
7
+ *
8
+ * Conceptually, this folder is the "state representation" layer for the
9
+ * Flappy Bird example. Instead of learning directly from pixels, the agent sees
10
+ * a compact set of geometric and kinematic signals derived from the current
11
+ * world state. That makes the example easier to study, faster to evaluate, and
12
+ * closer to classic feature-engineering pipelines used in small control tasks.
13
+ *
14
+ * If you want background reading, the Wikipedia articles on "feature
15
+ * engineering" and "state space representation" give useful intuition for why
16
+ * this boundary exists at all.
17
+ */
18
+ export * from './observation.features.utils';
19
+ export * from './observation.vector.utils';
@@ -0,0 +1,81 @@
1
+ import type { SharedObservationFeatures } from '../simulation-shared.types';
2
+
3
+ /**
4
+ * Converts observation features to the canonical 12-value network input vector.
5
+ *
6
+ * Educational note:
7
+ * This module owns the network-shape projection so feature semantics can change
8
+ * independently from how the policy input is ordered.
9
+ *
10
+ * The 12-value vector is the compact feed-forward policy input used by the main
11
+ * evaluation and training flow. Its ordering is stable on purpose: once a
12
+ * network topology has evolved against one input layout, silent channel
13
+ * reshuffles would invalidate learned behavior.
14
+ *
15
+ * @param features - Structured feature object.
16
+ * @returns Ordered feature vector.
17
+ * @example
18
+ * ```ts
19
+ * const features = resolveObservationFeatures(input);
20
+ * const networkInput = resolveObservationVectorFromFeatures(features);
21
+ * ```
22
+ */
23
+ export function resolveObservationVectorFromFeatures(
24
+ features: SharedObservationFeatures,
25
+ ): number[] {
26
+ return [
27
+ features.normalizedBirdY,
28
+ features.normalizedVelocity,
29
+ features.normalizedDistanceToNextPipe,
30
+ features.normalizedDeltaToNextGap,
31
+ features.normalizedNextGapTop,
32
+ features.normalizedNextGapBottom,
33
+ features.normalizedDistanceToSecondPipe,
34
+ features.normalizedDeltaToSecondGap,
35
+ features.normalizedTimeToNextPipe,
36
+ features.normalizedNextGapClearance,
37
+ features.normalizedRequiredVerticalVelocityToNextGap,
38
+ features.normalizedNextToSecondGapTransition,
39
+ ];
40
+ }
41
+
42
+ /**
43
+ * Resolves the compact core vector used for temporal stacking.
44
+ *
45
+ * The core intentionally keeps directly observed kinematic and geometric
46
+ * channels while dropping derived one-step predictors that become redundant
47
+ * once short-term temporal memory is available.
48
+ *
49
+ * This is the representation used when the example wants a short history of raw
50
+ * observation slices. The idea is similar to frame stacking in reinforcement
51
+ * learning: a feed-forward policy can recover some sense of motion by looking
52
+ * at several recent compact frames at once.
53
+ *
54
+ * The Wikipedia article on "frame stacking" is a useful conceptual reference.
55
+ *
56
+ * @param features - Structured observation features.
57
+ * @returns Core per-frame vector.
58
+ * @example
59
+ * ```ts
60
+ * const coreFrame = resolveCoreObservationVectorFromFeatures(features);
61
+ * observationMemoryState.previousCoreFrames.push(coreFrame);
62
+ * ```
63
+ */
64
+ export function resolveCoreObservationVectorFromFeatures(
65
+ features: SharedObservationFeatures,
66
+ ): number[] {
67
+ return [
68
+ features.normalizedBirdY,
69
+ features.normalizedVelocity,
70
+ features.normalizedDistanceToNextPipe,
71
+ features.normalizedDeltaToNextGap,
72
+ features.normalizedNextGapTop,
73
+ features.normalizedNextGapBottom,
74
+ features.normalizedDistanceToSecondPipe,
75
+ features.normalizedDeltaToSecondGap,
76
+ features.normalizedNextGapClearance,
77
+ features.normalizedRequiredVerticalVelocityToNextGap,
78
+ features.normalizedEntryUrgency,
79
+ features.normalizedOneFlapReachabilityAtGapEntry,
80
+ ];
81
+ }