@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,378 @@
1
+ import { clamp } from '../browser-entry/browser-entry.math.utils';
2
+ import {
3
+ commitObservationMemoryStep,
4
+ resolveFlapDecision,
5
+ resolveObservationVector,
6
+ } from '../browser-entry/browser-entry.observation.utils';
7
+ import {
8
+ resolveNextSpawnGapCenterY,
9
+ resolveNextSpawnGapSize,
10
+ resolveNextSpawnIntervalFrames,
11
+ } from '../browser-entry/browser-entry.spawn.utils';
12
+ import type { RngLike } from '../browser-entry/browser-entry.types';
13
+ import { resolvePipeSpawnXPx } from '../browser-entry/browser-entry.viewport.utils';
14
+ import type { SharedDifficultyProfile } from '../flappy.simulation.shared.utils';
15
+ import { FLAPPY_BIRD_VIEWPORT_X_RATIO } from '../constants/constants';
16
+ import {
17
+ FLAPPY_BIRD_RADIUS_PX,
18
+ FLAPPY_BIRD_X_PX,
19
+ FLAPPY_PIPE_COLLISION_ENTRANCE_EXPAND_PX,
20
+ FLAPPY_PIPE_COLLISION_SIDE_EXPAND_PX,
21
+ FLAPPY_CONTROL_SUBSTEPS_PER_FRAME,
22
+ FLAPPY_ENABLE_RUNTIME_INSTRUMENTATION,
23
+ FLAPPY_FLAP_VELOCITY_PX_PER_FRAME,
24
+ FLAPPY_GRAVITY_PX_PER_FRAME2,
25
+ FLAPPY_MAX_FALL_SPEED_PX_PER_FRAME,
26
+ FLAPPY_PIPE_WIDTH_PX,
27
+ } from '../constants/constants';
28
+ import type {
29
+ WorkerPlaybackState,
30
+ WorkerPopulationBird,
31
+ WorkerPopulationPipe,
32
+ } from './flappy-evolution-worker.types';
33
+ import type { WorkerPlaybackFrameContext } from './flappy-evolution-worker.simulation.types';
34
+
35
+ /**
36
+ * Advances the whole population simulation by one logical frame.
37
+ *
38
+ * Educational note:
39
+ * One logical frame is internally split into smaller control substeps so the
40
+ * worker can make flap decisions, apply gravity, move pipes, spawn new pipes,
41
+ * and resolve collisions with better numerical stability than a single large
42
+ * integration jump.
43
+ *
44
+ * This function is the main simulation ownership boundary for the folder.
45
+ * The companion `simulation.utils` file creates initial state; this service is
46
+ * responsible for mutating that state over time.
47
+ *
48
+ * @param renderState - Mutable simulation state.
49
+ * @param rng - Deterministic random source for spawn variation.
50
+ * @param difficultyProfile - Active dynamic difficulty profile.
51
+ * @returns Number of policy activation calls made in this frame.
52
+ */
53
+ export function stepWorkerPopulationFrame(
54
+ renderState: WorkerPlaybackState,
55
+ rng: RngLike,
56
+ difficultyProfile: SharedDifficultyProfile,
57
+ ): number {
58
+ const controlSubstepCount = Math.max(1, FLAPPY_CONTROL_SUBSTEPS_PER_FRAME);
59
+ const frameContext: WorkerPlaybackFrameContext = {
60
+ renderState,
61
+ rng,
62
+ difficultyProfile,
63
+ controlSubstepDelta: 1 / controlSubstepCount,
64
+ cameraLeftXPx: resolveCameraLeftXPx(renderState.visibleWorldWidthPx),
65
+ birdLeftXPx: FLAPPY_BIRD_X_PX - FLAPPY_BIRD_RADIUS_PX,
66
+ birdRightXPx: FLAPPY_BIRD_X_PX + FLAPPY_BIRD_RADIUS_PX,
67
+ };
68
+ let activationCallsThisFrame = 0;
69
+
70
+ // Step 1: Advance the per-frame survival counters for living birds.
71
+ incrementLivingBirdFrameCounters(renderState);
72
+
73
+ for (
74
+ let controlSubstepIndex = 0;
75
+ controlSubstepIndex < controlSubstepCount;
76
+ controlSubstepIndex++
77
+ ) {
78
+ // Step 2: Resolve one control/physics/collision substep.
79
+ activationCallsThisFrame += runWorkerPopulationControlSubstep(frameContext);
80
+ }
81
+
82
+ // Step 3: Publish the completed logical frame index.
83
+ renderState.frameIndex += 1;
84
+ return activationCallsThisFrame;
85
+ }
86
+
87
+ /**
88
+ * Resolves the current left-edge of the visible world in world-space pixels.
89
+ *
90
+ * @param visibleWorldWidthPx - Current visible world width.
91
+ * @returns Left edge x-position in world coordinates.
92
+ */
93
+ function resolveCameraLeftXPx(visibleWorldWidthPx: number): number {
94
+ const clampedVisibleWorldWidthPx = Math.max(1, visibleWorldWidthPx);
95
+ const desiredBirdScreenXPx =
96
+ clampedVisibleWorldWidthPx * FLAPPY_BIRD_VIEWPORT_X_RATIO;
97
+ return FLAPPY_BIRD_X_PX - desiredBirdScreenXPx;
98
+ }
99
+
100
+ /**
101
+ * Increments survival counters for birds that remain active at frame start.
102
+ *
103
+ * @param renderState - Mutable playback state.
104
+ * @returns Nothing.
105
+ */
106
+ function incrementLivingBirdFrameCounters(
107
+ renderState: WorkerPlaybackState,
108
+ ): void {
109
+ renderState.birds.forEach((bird) => {
110
+ if (bird.done) {
111
+ return;
112
+ }
113
+
114
+ bird.framesSurvived += 1;
115
+ });
116
+ }
117
+
118
+ /**
119
+ * Advances one control substep of the worker playback simulation.
120
+ *
121
+ * @param frameContext - Shared frame context for this logical frame.
122
+ * @returns Number of activation calls performed in the substep.
123
+ */
124
+ function runWorkerPopulationControlSubstep(
125
+ frameContext: WorkerPlaybackFrameContext,
126
+ ): number {
127
+ const activationCallsThisSubstep = resolveBirdControlActions(frameContext);
128
+
129
+ advanceBirdPhysics(frameContext);
130
+ advancePipes(frameContext);
131
+ spawnPipeIfNeeded(frameContext);
132
+ resolveBirdTerminationAndProgress(frameContext);
133
+
134
+ return activationCallsThisSubstep;
135
+ }
136
+
137
+ /**
138
+ * Runs policy evaluation and commits the resulting observation memory updates.
139
+ *
140
+ * @param frameContext - Shared frame context for this logical frame.
141
+ * @returns Number of activation calls performed in the substep.
142
+ */
143
+ function resolveBirdControlActions(
144
+ frameContext: WorkerPlaybackFrameContext,
145
+ ): number {
146
+ const { difficultyProfile, renderState } = frameContext;
147
+ let activationCallsThisSubstep = 0;
148
+
149
+ renderState.birds.forEach((bird) => {
150
+ if (bird.done) {
151
+ return;
152
+ }
153
+
154
+ const observation = resolveObservationVector(
155
+ bird.yPx,
156
+ bird.velocityYPxPerFrame,
157
+ renderState.pipes,
158
+ renderState.visibleWorldWidthPx,
159
+ renderState.visibleWorldHeightPx,
160
+ difficultyProfile,
161
+ renderState.lastSpawnedPipeSpawnIntervalFrames,
162
+ bird.observationMemoryState,
163
+ );
164
+ const outputs = bird.network.activate(observation.observationVector);
165
+ if (FLAPPY_ENABLE_RUNTIME_INSTRUMENTATION) {
166
+ activationCallsThisSubstep += 1;
167
+ }
168
+
169
+ const shouldFlap = resolveFlapDecision(outputs);
170
+ commitObservationMemoryStep(
171
+ bird.observationMemoryState,
172
+ observation.observationFeatures,
173
+ shouldFlap,
174
+ );
175
+
176
+ if (shouldFlap) {
177
+ bird.velocityYPxPerFrame = FLAPPY_FLAP_VELOCITY_PX_PER_FRAME;
178
+ }
179
+ });
180
+
181
+ return activationCallsThisSubstep;
182
+ }
183
+
184
+ /**
185
+ * Integrates bird velocity and vertical motion for one control substep.
186
+ *
187
+ * @param frameContext - Shared frame context for this logical frame.
188
+ * @returns Nothing.
189
+ */
190
+ function advanceBirdPhysics(frameContext: WorkerPlaybackFrameContext): void {
191
+ const { controlSubstepDelta, renderState } = frameContext;
192
+
193
+ renderState.birds.forEach((bird) => {
194
+ if (bird.done) {
195
+ return;
196
+ }
197
+
198
+ bird.velocityYPxPerFrame = clamp(
199
+ bird.velocityYPxPerFrame +
200
+ FLAPPY_GRAVITY_PX_PER_FRAME2 * controlSubstepDelta,
201
+ -Infinity,
202
+ FLAPPY_MAX_FALL_SPEED_PX_PER_FRAME,
203
+ );
204
+ bird.yPx += bird.velocityYPxPerFrame * controlSubstepDelta;
205
+ });
206
+ }
207
+
208
+ /**
209
+ * Advances all visible pipes and culls those that have left the camera window.
210
+ *
211
+ * @param frameContext - Shared frame context for this logical frame.
212
+ * @returns Nothing.
213
+ */
214
+ function advancePipes(frameContext: WorkerPlaybackFrameContext): void {
215
+ const { controlSubstepDelta, difficultyProfile, renderState, cameraLeftXPx } =
216
+ frameContext;
217
+ const pipeTravelDistancePx =
218
+ difficultyProfile.pipeSpeedPxPerFrame * controlSubstepDelta;
219
+
220
+ renderState.cumulativePipeTravelPx += pipeTravelDistancePx;
221
+
222
+ renderState.pipes.forEach((pipe) => {
223
+ pipe.xPx -= pipeTravelDistancePx;
224
+ });
225
+
226
+ renderState.pipes = renderState.pipes.filter(
227
+ (pipe) => pipe.xPx + FLAPPY_PIPE_WIDTH_PX > cameraLeftXPx,
228
+ );
229
+ }
230
+
231
+ /**
232
+ * Spawns a new pipe when the substep budget crosses the spawn boundary.
233
+ *
234
+ * @param frameContext - Shared frame context for this logical frame.
235
+ * @returns Nothing.
236
+ */
237
+ function spawnPipeIfNeeded(frameContext: WorkerPlaybackFrameContext): void {
238
+ const { controlSubstepDelta, difficultyProfile, renderState, rng } =
239
+ frameContext;
240
+
241
+ renderState.framesUntilNextPipeSpawn -= controlSubstepDelta;
242
+ if (renderState.framesUntilNextPipeSpawn > 0) {
243
+ return;
244
+ }
245
+
246
+ const nextGapSizePx = resolveNextSpawnGapSize(
247
+ renderState.lastSpawnedPipeGapPx,
248
+ difficultyProfile,
249
+ rng,
250
+ );
251
+ const nextSpawnIntervalFrames = resolveNextSpawnIntervalFrames(
252
+ renderState.lastSpawnedPipeSpawnIntervalFrames,
253
+ difficultyProfile,
254
+ );
255
+ const nextGapCenterYPx = resolveNextSpawnGapCenterY(
256
+ renderState.lastSpawnedPipeGapCenterYPx,
257
+ rng,
258
+ renderState.visibleWorldHeightPx,
259
+ );
260
+
261
+ renderState.pipes.push({
262
+ id: renderState.nextPipeId++,
263
+ xPx: resolvePipeSpawnXPx(renderState.visibleWorldWidthPx),
264
+ gapCenterYPx: nextGapCenterYPx,
265
+ gapSizePx: nextGapSizePx,
266
+ });
267
+ renderState.lastSpawnedPipeGapPx = nextGapSizePx;
268
+ renderState.lastSpawnedPipeGapCenterYPx = nextGapCenterYPx;
269
+ renderState.lastSpawnedPipeSpawnIntervalFrames = nextSpawnIntervalFrames;
270
+ renderState.framesUntilNextPipeSpawn += nextSpawnIntervalFrames;
271
+ }
272
+
273
+ /**
274
+ * Resolves bird deaths and passed-pipe progress after motion is applied.
275
+ *
276
+ * @param frameContext - Shared frame context for this logical frame.
277
+ * @returns Nothing.
278
+ */
279
+ function resolveBirdTerminationAndProgress(
280
+ frameContext: WorkerPlaybackFrameContext,
281
+ ): void {
282
+ const { renderState } = frameContext;
283
+
284
+ renderState.birds.forEach((bird) => {
285
+ if (bird.done) {
286
+ return;
287
+ }
288
+
289
+ if (resolveBirdOutOfBounds(bird, renderState.visibleWorldHeightPx)) {
290
+ bird.done = true;
291
+ bird.doneReason = 'out_of_bounds';
292
+ return;
293
+ }
294
+
295
+ for (const pipe of renderState.pipes) {
296
+ if (resolveBirdCollisionAgainstPipe(bird, pipe, frameContext)) {
297
+ bird.done = true;
298
+ bird.doneReason = 'collision';
299
+ break;
300
+ }
301
+
302
+ commitPassedPipeProgress(bird, pipe);
303
+ }
304
+ });
305
+ }
306
+
307
+ /**
308
+ * Resolves whether a bird has exceeded the vertical play area.
309
+ *
310
+ * @param bird - Mutable bird state.
311
+ * @param visibleWorldHeightPx - Current visible world height.
312
+ * @returns `true` when the bird is outside the vertical bounds.
313
+ */
314
+ function resolveBirdOutOfBounds(
315
+ bird: WorkerPopulationBird,
316
+ visibleWorldHeightPx: number,
317
+ ): boolean {
318
+ const birdTop = bird.yPx - FLAPPY_BIRD_RADIUS_PX;
319
+ const birdBottom = bird.yPx + FLAPPY_BIRD_RADIUS_PX;
320
+
321
+ return birdTop <= 0 || birdBottom >= visibleWorldHeightPx;
322
+ }
323
+
324
+ /**
325
+ * Resolves whether a bird collides with one pipe corridor during this substep.
326
+ *
327
+ * @param bird - Mutable bird state.
328
+ * @param pipe - Pipe candidate to test.
329
+ * @param frameContext - Shared frame context for this logical frame.
330
+ * @returns `true` when the bird overlaps the pipe body instead of the gap.
331
+ */
332
+ function resolveBirdCollisionAgainstPipe(
333
+ bird: WorkerPopulationBird,
334
+ pipe: WorkerPopulationPipe,
335
+ frameContext: WorkerPlaybackFrameContext,
336
+ ): boolean {
337
+ const { birdLeftXPx, birdRightXPx } = frameContext;
338
+ const birdTop = bird.yPx - FLAPPY_BIRD_RADIUS_PX;
339
+ const birdBottom = bird.yPx + FLAPPY_BIRD_RADIUS_PX;
340
+ const pipeLeft = pipe.xPx - FLAPPY_PIPE_COLLISION_SIDE_EXPAND_PX;
341
+ const pipeRight =
342
+ pipe.xPx + FLAPPY_PIPE_WIDTH_PX + FLAPPY_PIPE_COLLISION_SIDE_EXPAND_PX;
343
+ const overlapsHorizontally =
344
+ birdRightXPx >= pipeLeft && birdLeftXPx <= pipeRight;
345
+
346
+ if (!overlapsHorizontally) {
347
+ return false;
348
+ }
349
+
350
+ const gapHalf = pipe.gapSizePx * 0.5;
351
+ const gapTop =
352
+ pipe.gapCenterYPx - gapHalf + FLAPPY_PIPE_COLLISION_ENTRANCE_EXPAND_PX;
353
+ const gapBottom =
354
+ pipe.gapCenterYPx + gapHalf - FLAPPY_PIPE_COLLISION_ENTRANCE_EXPAND_PX;
355
+
356
+ return !(birdTop >= gapTop && birdBottom <= gapBottom);
357
+ }
358
+
359
+ /**
360
+ * Commits one passed-pipe progress increment for a bird when eligible.
361
+ *
362
+ * @param bird - Mutable bird state.
363
+ * @param pipe - Pipe candidate to mark as passed.
364
+ * @returns Nothing.
365
+ */
366
+ function commitPassedPipeProgress(
367
+ bird: WorkerPopulationBird,
368
+ pipe: WorkerPopulationPipe,
369
+ ): void {
370
+ const pipeRight =
371
+ pipe.xPx + FLAPPY_PIPE_WIDTH_PX + FLAPPY_PIPE_COLLISION_SIDE_EXPAND_PX;
372
+ if (pipeRight >= FLAPPY_BIRD_X_PX || bird.passedPipeIds.has(pipe.id)) {
373
+ return;
374
+ }
375
+
376
+ bird.passedPipeIds.add(pipe.id);
377
+ bird.pipesPassed += 1;
378
+ }
@@ -0,0 +1,22 @@
1
+ import type { RngLike } from '../browser-entry/browser-entry.types';
2
+ import type { SharedDifficultyProfile } from '../flappy.simulation.shared.utils';
3
+ import type { WorkerPlaybackState } from './flappy-evolution-worker.types';
4
+
5
+ /**
6
+ * Shared mutable inputs for one worker playback frame simulation pass.
7
+ *
8
+ * Educational note:
9
+ * The frame service computes several derived geometry values once per logical
10
+ * frame and threads them through the substep helpers in this context object.
11
+ * That keeps the top-level simulation flow declarative while avoiding repeated
12
+ * argument sprawl across helper calls.
13
+ */
14
+ export interface WorkerPlaybackFrameContext {
15
+ renderState: WorkerPlaybackState;
16
+ rng: RngLike;
17
+ difficultyProfile: SharedDifficultyProfile;
18
+ controlSubstepDelta: number;
19
+ cameraLeftXPx: number;
20
+ birdLeftXPx: number;
21
+ birdRightXPx: number;
22
+ }
@@ -1,52 +1,35 @@
1
1
  import type Network from '../../../../src/architecture/network';
2
- import { clamp } from '../browser-entry/browser-entry.math.utils';
3
2
  import {
4
- commitObservationMemoryStep,
5
- resolveFlapDecision,
6
- resolveObservationVector,
7
- } from '../browser-entry/browser-entry.observation.utils';
8
- import {
9
- createBirdColor,
10
- resolveDifficultyProfile,
11
- resolveNextSpawnGapCenterY,
12
3
  resolveNextSpawnGapSize,
13
4
  resolveNextSpawnIntervalFrames,
14
5
  sampleGapCenterY,
15
6
  } from '../browser-entry/browser-entry.spawn.utils';
16
7
  import type { RngLike } from '../browser-entry/browser-entry.types';
17
8
  import { resolvePipeSpawnXPx } from '../browser-entry/browser-entry.viewport.utils';
18
- import { createSharedObservationMemoryState } from '../flappy.simulation.shared.utils';
19
- import { FLAPPY_BIRD_VIEWPORT_X_RATIO } from '../constants/constants';
20
9
  import {
21
- FLAPPY_BIRD_RADIUS_PX,
22
- FLAPPY_BIRD_X_PX,
23
- FLAPPY_PIPE_COLLISION_ENTRANCE_EXPAND_PX,
24
- FLAPPY_PIPE_COLLISION_SIDE_EXPAND_PX,
25
- FLAPPY_CONTROL_SUBSTEPS_PER_FRAME,
26
- FLAPPY_ENABLE_RUNTIME_INSTRUMENTATION,
27
- FLAPPY_FLAP_VELOCITY_PX_PER_FRAME,
28
- FLAPPY_GRAVITY_PX_PER_FRAME2,
29
- FLAPPY_MAX_FALL_SPEED_PX_PER_FRAME,
30
- FLAPPY_PIPE_WIDTH_PX,
31
- } from '../constants/constants';
10
+ createSharedObservationMemoryState,
11
+ resolveAdaptiveDifficultyProfile,
12
+ } from '../flappy.simulation.shared.utils';
32
13
  import type { WorkerPlaybackState } from './flappy-evolution-worker.types';
33
14
 
34
- /**
35
- * Resolves the current left-edge of the visible world in world-space pixels.
36
- *
37
- * @param visibleWorldWidthPx - Current visible world width.
38
- * @returns Left edge x-position in world coordinates.
39
- */
40
- function resolveCameraLeftXPx(visibleWorldWidthPx: number): number {
41
- const clampedVisibleWorldWidthPx = Math.max(1, visibleWorldWidthPx);
42
- const desiredBirdScreenXPx =
43
- clampedVisibleWorldWidthPx * FLAPPY_BIRD_VIEWPORT_X_RATIO;
44
- return FLAPPY_BIRD_X_PX - desiredBirdScreenXPx;
45
- }
46
-
47
15
  /**
48
16
  * Creates initial playback state for a population of networks.
49
17
  *
18
+ * Educational note:
19
+ * This is the ownership boundary for worker playback initialization. The frame
20
+ * simulation service mutates the returned state on every step, but only this
21
+ * helper decides how a fresh population is placed into the world at time zero.
22
+ *
23
+ * @example
24
+ * ```ts
25
+ * const playbackState = createWorkerPopulationRenderState(
26
+ * currentPopulation,
27
+ * rng,
28
+ * 1280,
29
+ * 720,
30
+ * );
31
+ * ```
32
+ *
50
33
  * @param networks - Population to visualize.
51
34
  * @param rng - Deterministic random source.
52
35
  * @param initialVisibleWorldWidthPx - Initial viewport width from host.
@@ -59,7 +42,7 @@ export function createWorkerPopulationRenderState(
59
42
  initialVisibleWorldWidthPx: number,
60
43
  initialVisibleWorldHeightPx: number,
61
44
  ): WorkerPlaybackState {
62
- const initialDifficultyProfile = resolveDifficultyProfile(0);
45
+ const initialDifficultyProfile = resolveAdaptiveDifficultyProfile(0, 1);
63
46
  const initialGapCenterYPx = sampleGapCenterY(
64
47
  rng,
65
48
  initialVisibleWorldHeightPx,
@@ -76,7 +59,6 @@ export function createWorkerPopulationRenderState(
76
59
 
77
60
  const birds = networks.map((network, networkIndex) => ({
78
61
  network,
79
- color: createBirdColor(networkIndex, networks.length),
80
62
  observationMemoryState: createSharedObservationMemoryState(),
81
63
  yPx: initialVisibleWorldHeightPx * 0.5,
82
64
  velocityYPxPerFrame: 0,
@@ -88,6 +70,7 @@ export function createWorkerPopulationRenderState(
88
70
 
89
71
  return {
90
72
  frameIndex: 0,
73
+ cumulativePipeTravelPx: 0,
91
74
  visibleWorldWidthPx: initialVisibleWorldWidthPx,
92
75
  visibleWorldHeightPx: initialVisibleWorldHeightPx,
93
76
  nextPipeId: 2,
@@ -106,169 +89,3 @@ export function createWorkerPopulationRenderState(
106
89
  birds,
107
90
  };
108
91
  }
109
-
110
- /**
111
- * Advances the whole population simulation by one logical frame.
112
- *
113
- * @param renderState - Mutable simulation state.
114
- * @param rng - Deterministic random source for spawn variation.
115
- * @param difficultyProfile - Active dynamic difficulty profile.
116
- * @returns Number of policy activation calls made in this frame.
117
- */
118
- export function stepWorkerPopulationFrame(
119
- renderState: WorkerPlaybackState,
120
- rng: RngLike,
121
- difficultyProfile: {
122
- pipeGapPx: number;
123
- pipeSpeedPxPerFrame: number;
124
- pipeSpawnIntervalFrames: number;
125
- },
126
- ): number {
127
- const controlSubstepCount = Math.max(1, FLAPPY_CONTROL_SUBSTEPS_PER_FRAME);
128
- const controlSubstepDelta = 1 / controlSubstepCount;
129
- let activationCallsThisFrame = 0;
130
-
131
- renderState.birds.forEach((bird) => {
132
- if (bird.done) return;
133
- bird.framesSurvived += 1;
134
- });
135
-
136
- for (
137
- let controlSubstepIndex = 0;
138
- controlSubstepIndex < controlSubstepCount;
139
- controlSubstepIndex++
140
- ) {
141
- renderState.birds.forEach((bird) => {
142
- if (bird.done) return;
143
-
144
- const observation = resolveObservationVector(
145
- bird.yPx,
146
- bird.velocityYPxPerFrame,
147
- renderState.pipes,
148
- renderState.visibleWorldWidthPx,
149
- renderState.visibleWorldHeightPx,
150
- difficultyProfile,
151
- renderState.lastSpawnedPipeSpawnIntervalFrames,
152
- bird.observationMemoryState,
153
- );
154
- const outputs = bird.network.activate(
155
- observation.observationVector,
156
- ) as unknown;
157
- if (FLAPPY_ENABLE_RUNTIME_INSTRUMENTATION) {
158
- activationCallsThisFrame += 1;
159
- }
160
- const shouldFlap = resolveFlapDecision(outputs);
161
- commitObservationMemoryStep(
162
- bird.observationMemoryState,
163
- observation.observationFeatures,
164
- shouldFlap,
165
- );
166
-
167
- if (shouldFlap) {
168
- bird.velocityYPxPerFrame = FLAPPY_FLAP_VELOCITY_PX_PER_FRAME;
169
- }
170
- });
171
-
172
- renderState.birds.forEach((bird) => {
173
- if (bird.done) return;
174
-
175
- bird.velocityYPxPerFrame = clamp(
176
- bird.velocityYPxPerFrame +
177
- FLAPPY_GRAVITY_PX_PER_FRAME2 * controlSubstepDelta,
178
- -Infinity,
179
- FLAPPY_MAX_FALL_SPEED_PX_PER_FRAME,
180
- );
181
- bird.yPx += bird.velocityYPxPerFrame * controlSubstepDelta;
182
- });
183
-
184
- renderState.pipes.forEach((pipe) => {
185
- pipe.xPx -= difficultyProfile.pipeSpeedPxPerFrame * controlSubstepDelta;
186
- });
187
-
188
- const cameraLeftXPx = resolveCameraLeftXPx(renderState.visibleWorldWidthPx);
189
- renderState.pipes = renderState.pipes.filter(
190
- (pipe) => pipe.xPx + FLAPPY_PIPE_WIDTH_PX > cameraLeftXPx,
191
- );
192
-
193
- renderState.framesUntilNextPipeSpawn -= controlSubstepDelta;
194
- if (renderState.framesUntilNextPipeSpawn <= 0) {
195
- const nextGapSizePx = resolveNextSpawnGapSize(
196
- renderState.lastSpawnedPipeGapPx,
197
- difficultyProfile,
198
- rng,
199
- );
200
- const nextSpawnIntervalFrames = resolveNextSpawnIntervalFrames(
201
- renderState.lastSpawnedPipeSpawnIntervalFrames,
202
- difficultyProfile,
203
- );
204
- const nextGapCenterYPx = resolveNextSpawnGapCenterY(
205
- renderState.lastSpawnedPipeGapCenterYPx,
206
- rng,
207
- renderState.visibleWorldHeightPx,
208
- );
209
- renderState.pipes.push({
210
- id: renderState.nextPipeId++,
211
- xPx: resolvePipeSpawnXPx(renderState.visibleWorldWidthPx),
212
- gapCenterYPx: nextGapCenterYPx,
213
- gapSizePx: nextGapSizePx,
214
- });
215
- renderState.lastSpawnedPipeGapPx = nextGapSizePx;
216
- renderState.lastSpawnedPipeGapCenterYPx = nextGapCenterYPx;
217
- renderState.lastSpawnedPipeSpawnIntervalFrames = nextSpawnIntervalFrames;
218
- renderState.framesUntilNextPipeSpawn += nextSpawnIntervalFrames;
219
- }
220
-
221
- renderState.birds.forEach((bird) => {
222
- if (bird.done) return;
223
-
224
- const birdTop = bird.yPx - FLAPPY_BIRD_RADIUS_PX;
225
- const birdBottom = bird.yPx + FLAPPY_BIRD_RADIUS_PX;
226
-
227
- if (birdTop <= 0 || birdBottom >= renderState.visibleWorldHeightPx) {
228
- bird.done = true;
229
- bird.doneReason = 'out_of_bounds';
230
- return;
231
- }
232
-
233
- const birdLeft = FLAPPY_BIRD_X_PX - FLAPPY_BIRD_RADIUS_PX;
234
- const birdRight = FLAPPY_BIRD_X_PX + FLAPPY_BIRD_RADIUS_PX;
235
-
236
- for (const pipe of renderState.pipes) {
237
- const pipeLeft = pipe.xPx - FLAPPY_PIPE_COLLISION_SIDE_EXPAND_PX;
238
- const pipeRight =
239
- pipe.xPx +
240
- FLAPPY_PIPE_WIDTH_PX +
241
- FLAPPY_PIPE_COLLISION_SIDE_EXPAND_PX;
242
- const overlapsHorizontally =
243
- birdRight >= pipeLeft && birdLeft <= pipeRight;
244
-
245
- if (overlapsHorizontally) {
246
- const gapHalf = pipe.gapSizePx * 0.5;
247
- const gapTop =
248
- pipe.gapCenterYPx -
249
- gapHalf +
250
- FLAPPY_PIPE_COLLISION_ENTRANCE_EXPAND_PX;
251
- const gapBottom =
252
- pipe.gapCenterYPx +
253
- gapHalf -
254
- FLAPPY_PIPE_COLLISION_ENTRANCE_EXPAND_PX;
255
- const isInsideGap = birdTop >= gapTop && birdBottom <= gapBottom;
256
-
257
- if (!isInsideGap) {
258
- bird.done = true;
259
- bird.doneReason = 'collision';
260
- break;
261
- }
262
- }
263
-
264
- if (pipeRight < FLAPPY_BIRD_X_PX && !bird.passedPipeIds.has(pipe.id)) {
265
- bird.passedPipeIds.add(pipe.id);
266
- bird.pipesPassed += 1;
267
- }
268
- }
269
- });
270
- }
271
-
272
- renderState.frameIndex += 1;
273
- return activationCallsThisFrame;
274
- }