@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,338 @@
1
+ /**
2
+ * Rollout runtime services.
3
+ *
4
+ * This file will host context resolution, runtime initialization, frame loop,
5
+ * and early-termination behavior for rollout execution.
6
+ *
7
+ * The companion utils file owns reward shaping and result composition. This file
8
+ * owns the mechanics of actually running the episode.
9
+ */
10
+ import {
11
+ FLAPPY_CONTROL_SUBSTEPS_PER_FRAME,
12
+ FLAPPY_MAX_FRAMES_PER_EPISODE,
13
+ } from '../../constants/constants';
14
+ import {
15
+ FLAPPY_EVALUATION_DEFAULT_DIFFICULTY_SCALE,
16
+ FLAPPY_EVALUATION_DEFAULT_EARLY_TERMINATION_CONSECUTIVE_FRAMES,
17
+ FLAPPY_EVALUATION_DEFAULT_EARLY_TERMINATION_GRACE_FRAMES,
18
+ } from '../evaluation.constants';
19
+ import {
20
+ createInitialFlappyState,
21
+ getFlappyObservationFeatures,
22
+ stepFlappyStateWithControlSubsteps,
23
+ type FlappyObservationFeatures,
24
+ } from '../../flappyEnvironment.ts';
25
+ import {
26
+ clampValue,
27
+ commitSharedObservationMemoryStep,
28
+ createSharedObservationMemoryState,
29
+ resolveFlapDecision,
30
+ resolveTemporalObservationVector,
31
+ } from '../../flappy.simulation.shared.utils';
32
+ import { createXorshift32 } from '../../rng';
33
+ import { mixGenomeEvaluationSeed } from '../evaluation.seed.utils';
34
+ import {
35
+ FLAPPY_ROLLOUT_DEFAULT_GENOME_ID,
36
+ FLAPPY_ROLLOUT_DONE_REASON_COLLISION,
37
+ FLAPPY_ROLLOUT_DONE_REASON_TIMEOUT,
38
+ FLAPPY_ROLLOUT_MIN_EARLY_TERMINATION_CONSECUTIVE_FRAMES,
39
+ FLAPPY_ROLLOUT_MIN_EARLY_TERMINATION_GRACE_FRAMES,
40
+ FLAPPY_ROLLOUT_MIN_MAX_FRAMES,
41
+ FLAPPY_ROLLOUT_ZERO_FITNESS,
42
+ } from './evaluation.rollout.constants';
43
+ import type {
44
+ RolloutEpisodeContext,
45
+ RolloutEpisodeRuntimeState,
46
+ } from './evaluation.rollout.types';
47
+ import type {
48
+ FlappyNetworkLike,
49
+ FlappyRolloutOptions,
50
+ } from '../evaluation.types';
51
+ import {
52
+ computeDenseShapingReward,
53
+ isBirdLikelyUnrecoverable,
54
+ } from './evaluation.rollout.utils';
55
+
56
+ /**
57
+ * Resolves normalized rollout configuration from user options.
58
+ *
59
+ * This is the rollout safety boundary: caller-provided values are clamped into
60
+ * deterministic, execution-safe ranges before the main loop touches them.
61
+ *
62
+ * @param network - Genome/network to evaluate.
63
+ * @param rolloutOptions - Optional rollout controls.
64
+ * @returns Normalized rollout configuration.
65
+ */
66
+ export function resolveRolloutEpisodeContext(
67
+ network: FlappyNetworkLike,
68
+ rolloutOptions: FlappyRolloutOptions,
69
+ ): RolloutEpisodeContext {
70
+ // Step 1: Resolve the deterministic evaluation seed from the explicit option or genome id.
71
+ const genomeId = network._id ?? FLAPPY_ROLLOUT_DEFAULT_GENOME_ID;
72
+ const seed = rolloutOptions.seed ?? mixGenomeEvaluationSeed(genomeId);
73
+
74
+ // Step 2: Normalize the rollout scalar options into safe ranges.
75
+ return {
76
+ seed,
77
+ difficultyScale: clampValue(
78
+ rolloutOptions.difficultyScale ??
79
+ FLAPPY_EVALUATION_DEFAULT_DIFFICULTY_SCALE,
80
+ FLAPPY_ROLLOUT_ZERO_FITNESS,
81
+ FLAPPY_ROLLOUT_MIN_MAX_FRAMES,
82
+ ),
83
+ maxFramesPerEpisode: Math.max(
84
+ FLAPPY_ROLLOUT_MIN_MAX_FRAMES,
85
+ Math.min(
86
+ FLAPPY_MAX_FRAMES_PER_EPISODE,
87
+ Math.trunc(rolloutOptions.maxFrames ?? FLAPPY_MAX_FRAMES_PER_EPISODE),
88
+ ),
89
+ ),
90
+ earlyTerminationGraceFrames: Math.max(
91
+ FLAPPY_ROLLOUT_MIN_EARLY_TERMINATION_GRACE_FRAMES,
92
+ Math.trunc(
93
+ rolloutOptions.earlyTerminationGraceFrames ??
94
+ FLAPPY_EVALUATION_DEFAULT_EARLY_TERMINATION_GRACE_FRAMES,
95
+ ),
96
+ ),
97
+ earlyTerminationConsecutiveFrames: Math.max(
98
+ FLAPPY_ROLLOUT_MIN_EARLY_TERMINATION_CONSECUTIVE_FRAMES,
99
+ Math.trunc(
100
+ rolloutOptions.earlyTerminationConsecutiveFrames ??
101
+ FLAPPY_EVALUATION_DEFAULT_EARLY_TERMINATION_CONSECUTIVE_FRAMES,
102
+ ),
103
+ ),
104
+ enableEarlyTermination: rolloutOptions.enableEarlyTermination === true,
105
+ normalizeFitness: rolloutOptions.normalizeFitness === true,
106
+ pipeProgressTarget: rolloutOptions.pipeProgressTarget,
107
+ };
108
+ }
109
+
110
+ /**
111
+ * Creates mutable runtime state for one rollout episode.
112
+ *
113
+ * The runtime state carries the seeded RNG, the mutable environment, the
114
+ * temporal observation memory, and the shaping counters accumulated during the
115
+ * episode.
116
+ *
117
+ * @param rolloutEpisodeContext - Normalized rollout configuration.
118
+ * @returns Mutable runtime state.
119
+ */
120
+ export function createRolloutEpisodeRuntimeState(
121
+ rolloutEpisodeContext: RolloutEpisodeContext,
122
+ ): RolloutEpisodeRuntimeState {
123
+ // Step 1: Create the seeded RNG and initial game state.
124
+ const rng = createXorshift32(rolloutEpisodeContext.seed);
125
+ const state = createInitialFlappyState(rng);
126
+
127
+ // Step 2: Create the temporal observation memory used by the network controller.
128
+ return {
129
+ rng,
130
+ state,
131
+ observationMemoryState: createSharedObservationMemoryState(),
132
+ denseShapingFitness: FLAPPY_ROLLOUT_ZERO_FITNESS,
133
+ unrecoverableFrameCount: FLAPPY_ROLLOUT_ZERO_FITNESS,
134
+ };
135
+ }
136
+
137
+ /**
138
+ * Runs the main rollout loop until termination or frame-budget exhaustion.
139
+ *
140
+ * This is the episode heartbeat: keep stepping while the bird is alive and the
141
+ * rollout still has budget left.
142
+ *
143
+ * @param network - Genome/network to evaluate.
144
+ * @param rolloutEpisodeContext - Normalized rollout configuration.
145
+ * @param rolloutEpisodeRuntimeState - Mutable runtime state.
146
+ * @returns Nothing.
147
+ */
148
+ export function runRolloutEpisodeLoop(
149
+ network: FlappyNetworkLike,
150
+ rolloutEpisodeContext: RolloutEpisodeContext,
151
+ rolloutEpisodeRuntimeState: RolloutEpisodeRuntimeState,
152
+ ): void {
153
+ // Step 1: Continue stepping while the episode remains active and within the frame cap.
154
+ while (
155
+ !rolloutEpisodeRuntimeState.state.done &&
156
+ rolloutEpisodeRuntimeState.state.frameIndex <
157
+ rolloutEpisodeContext.maxFramesPerEpisode
158
+ ) {
159
+ runRolloutEpisodeFrame(
160
+ network,
161
+ rolloutEpisodeContext,
162
+ rolloutEpisodeRuntimeState,
163
+ );
164
+ }
165
+ }
166
+
167
+ /**
168
+ * Finalizes episode state after the main rollout loop exits.
169
+ *
170
+ * Timeouts are applied here instead of inside the loop body so natural episode
171
+ * endings stay distinct from budget exhaustion.
172
+ *
173
+ * @param rolloutEpisodeContext - Normalized rollout configuration.
174
+ * @param rolloutEpisodeRuntimeState - Mutable runtime state.
175
+ * @returns Nothing.
176
+ */
177
+ export function finalizeRolloutEpisodeState(
178
+ rolloutEpisodeContext: RolloutEpisodeContext,
179
+ rolloutEpisodeRuntimeState: RolloutEpisodeRuntimeState,
180
+ ): void {
181
+ // Step 1: Leave the state unchanged when the episode already finished naturally.
182
+ if (
183
+ rolloutEpisodeRuntimeState.state.done ||
184
+ rolloutEpisodeRuntimeState.state.frameIndex <
185
+ rolloutEpisodeContext.maxFramesPerEpisode
186
+ ) {
187
+ return;
188
+ }
189
+
190
+ // Step 2: Mark a clean timeout when the frame budget was exhausted.
191
+ rolloutEpisodeRuntimeState.state.done = true;
192
+ rolloutEpisodeRuntimeState.state.doneReason =
193
+ FLAPPY_ROLLOUT_DONE_REASON_TIMEOUT;
194
+ }
195
+
196
+ /**
197
+ * Runs one rollout frame including control, shaping, and early termination.
198
+ *
199
+ * Educational note:
200
+ * Each frame follows a compact pipeline: observe, act, step the environment,
201
+ * accumulate shaping reward, then optionally prune the trajectory.
202
+ *
203
+ * @param network - Genome/network to evaluate.
204
+ * @param rolloutEpisodeContext - Normalized rollout configuration.
205
+ * @param rolloutEpisodeRuntimeState - Mutable runtime state.
206
+ * @returns Nothing.
207
+ */
208
+ function runRolloutEpisodeFrame(
209
+ network: FlappyNetworkLike,
210
+ rolloutEpisodeContext: RolloutEpisodeContext,
211
+ rolloutEpisodeRuntimeState: RolloutEpisodeRuntimeState,
212
+ ): void {
213
+ // Step 1: Capture the pre-step observation used by dense shaping.
214
+ const previousObservationFeatures = getFlappyObservationFeatures(
215
+ rolloutEpisodeRuntimeState.state,
216
+ rolloutEpisodeContext.difficultyScale,
217
+ );
218
+
219
+ // Step 2: Advance the environment using network-driven flap control.
220
+ stepFlappyStateWithControlSubsteps(
221
+ rolloutEpisodeRuntimeState.state,
222
+ rolloutEpisodeRuntimeState.rng,
223
+ () =>
224
+ resolveRolloutFrameFlapDecision(
225
+ network,
226
+ rolloutEpisodeContext,
227
+ rolloutEpisodeRuntimeState,
228
+ ),
229
+ rolloutEpisodeContext.difficultyScale,
230
+ FLAPPY_CONTROL_SUBSTEPS_PER_FRAME,
231
+ );
232
+
233
+ // Step 3: Update dense shaping from the pre-step and post-step observations.
234
+ const currentObservationFeatures = getFlappyObservationFeatures(
235
+ rolloutEpisodeRuntimeState.state,
236
+ rolloutEpisodeContext.difficultyScale,
237
+ );
238
+ rolloutEpisodeRuntimeState.denseShapingFitness += computeDenseShapingReward(
239
+ previousObservationFeatures,
240
+ currentObservationFeatures,
241
+ );
242
+
243
+ // Step 4: Apply the optional early-termination heuristic when enabled.
244
+ applyRolloutEarlyTerminationIfNeeded(
245
+ rolloutEpisodeContext,
246
+ rolloutEpisodeRuntimeState,
247
+ currentObservationFeatures,
248
+ );
249
+ }
250
+
251
+ /**
252
+ * Resolves the flap decision for one control substep and commits memory state.
253
+ *
254
+ * The temporal memory is updated immediately after the decision so subsequent
255
+ * substeps can see short-term action history without needing recurrent state.
256
+ *
257
+ * @param network - Genome/network to evaluate.
258
+ * @param rolloutEpisodeContext - Normalized rollout configuration.
259
+ * @param rolloutEpisodeRuntimeState - Mutable runtime state.
260
+ * @returns Whether the bird should flap.
261
+ */
262
+ function resolveRolloutFrameFlapDecision(
263
+ network: FlappyNetworkLike,
264
+ rolloutEpisodeContext: RolloutEpisodeContext,
265
+ rolloutEpisodeRuntimeState: RolloutEpisodeRuntimeState,
266
+ ): boolean {
267
+ // Step 1: Resolve the current observation features from the mutable game state.
268
+ const observationFeatures = getFlappyObservationFeatures(
269
+ rolloutEpisodeRuntimeState.state,
270
+ rolloutEpisodeContext.difficultyScale,
271
+ );
272
+
273
+ // Step 2: Build the temporal observation vector and query the network outputs.
274
+ const observation = resolveTemporalObservationVector(
275
+ observationFeatures,
276
+ rolloutEpisodeRuntimeState.observationMemoryState,
277
+ );
278
+ const outputs = network.activate(observation);
279
+ const shouldFlap = resolveFlapDecision(outputs);
280
+
281
+ // Step 3: Commit the observation and control decision to temporal memory.
282
+ commitSharedObservationMemoryStep(
283
+ rolloutEpisodeRuntimeState.observationMemoryState,
284
+ observationFeatures,
285
+ shouldFlap,
286
+ );
287
+ return shouldFlap;
288
+ }
289
+
290
+ /**
291
+ * Applies the optional early-termination heuristic for unrecoverable starts.
292
+ *
293
+ * Educational note:
294
+ * Early termination is an evaluation-speed heuristic, not a gameplay rule. It
295
+ * exists to stop obviously doomed warmup trajectories from consuming excessive
296
+ * rollout budget.
297
+ *
298
+ * @param rolloutEpisodeContext - Normalized rollout configuration.
299
+ * @param rolloutEpisodeRuntimeState - Mutable runtime state.
300
+ * @param currentObservationFeatures - Post-step observation features.
301
+ * @returns Nothing.
302
+ */
303
+ function applyRolloutEarlyTerminationIfNeeded(
304
+ rolloutEpisodeContext: RolloutEpisodeContext,
305
+ rolloutEpisodeRuntimeState: RolloutEpisodeRuntimeState,
306
+ currentObservationFeatures: FlappyObservationFeatures,
307
+ ): void {
308
+ // Step 1: Exit immediately when early termination is disabled.
309
+ if (!rolloutEpisodeContext.enableEarlyTermination) {
310
+ return;
311
+ }
312
+
313
+ // Step 2: Track consecutive unrecoverable frames only during the warmup phase.
314
+ const earlyTerminationEligible =
315
+ rolloutEpisodeRuntimeState.state.pipesPassed ===
316
+ FLAPPY_ROLLOUT_ZERO_FITNESS &&
317
+ rolloutEpisodeRuntimeState.state.frameIndex >=
318
+ rolloutEpisodeContext.earlyTerminationGraceFrames;
319
+ const birdLikelyUnrecoverable = isBirdLikelyUnrecoverable(
320
+ currentObservationFeatures,
321
+ );
322
+ rolloutEpisodeRuntimeState.unrecoverableFrameCount =
323
+ earlyTerminationEligible && birdLikelyUnrecoverable
324
+ ? rolloutEpisodeRuntimeState.unrecoverableFrameCount + 1
325
+ : FLAPPY_ROLLOUT_ZERO_FITNESS;
326
+
327
+ // Step 3: Stop the episode once the unrecoverable streak reaches the configured threshold.
328
+ if (
329
+ rolloutEpisodeRuntimeState.unrecoverableFrameCount <
330
+ rolloutEpisodeContext.earlyTerminationConsecutiveFrames
331
+ ) {
332
+ return;
333
+ }
334
+
335
+ rolloutEpisodeRuntimeState.state.done = true;
336
+ rolloutEpisodeRuntimeState.state.doneReason =
337
+ FLAPPY_ROLLOUT_DONE_REASON_COLLISION;
338
+ }
@@ -0,0 +1,69 @@
1
+ /**
2
+ * Rollout-internal type contracts.
3
+ *
4
+ * This file will host runtime-only rollout types that should not widen the
5
+ * public evaluation-level API surface.
6
+ *
7
+ * That separation keeps the public evaluation API compact even as rollout
8
+ * internals become more detailed.
9
+ */
10
+ import { createSharedObservationMemoryState } from '../../flappy.simulation.shared.utils';
11
+ import { createXorshift32 } from '../../rng';
12
+ import type { FlappyGameState } from '../../flappyEnvironment.ts';
13
+
14
+ /**
15
+ * Immutable rollout options normalized into execution-safe ranges.
16
+ *
17
+ * Every field here is ready for direct use inside the episode loop.
18
+ */
19
+ export type RolloutEpisodeContext = {
20
+ seed: number;
21
+ difficultyScale: number;
22
+ maxFramesPerEpisode: number;
23
+ earlyTerminationGraceFrames: number;
24
+ earlyTerminationConsecutiveFrames: number;
25
+ enableEarlyTermination: boolean;
26
+ normalizeFitness: boolean;
27
+ pipeProgressTarget: number | undefined;
28
+ };
29
+
30
+ /**
31
+ * Mutable runtime state accumulated while one rollout episode executes.
32
+ *
33
+ * This is the mutable side of the rollout: world state, RNG, temporal memory,
34
+ * and the counters accumulated during execution.
35
+ */
36
+ export type RolloutEpisodeRuntimeState = {
37
+ rng: ReturnType<typeof createXorshift32>;
38
+ state: FlappyGameState;
39
+ observationMemoryState: ReturnType<typeof createSharedObservationMemoryState>;
40
+ denseShapingFitness: number;
41
+ unrecoverableFrameCount: number;
42
+ };
43
+
44
+ /**
45
+ * Fitness-channel breakdown used to compose the public episode result.
46
+ *
47
+ * Named channels make reward design easier to audit than a single opaque number.
48
+ */
49
+ export type RolloutFitnessBreakdown = {
50
+ survivalFitness: number;
51
+ pipePassFitness: number;
52
+ denseShapingFitness: number;
53
+ terminalShapingFitness: number;
54
+ };
55
+
56
+ /**
57
+ * Per-frame dense shaping channels resolved from consecutive observations.
58
+ *
59
+ * The shaping system rewards more than survival: it also tracks approach,
60
+ * centering, clearance, and stable motion.
61
+ */
62
+ export type DenseShapingRewardComponents = {
63
+ nextGapAlignmentReward: number;
64
+ approachProgressReward: number;
65
+ centeringProgressReward: number;
66
+ clearanceReward: number;
67
+ secondGapAlignmentReward: number;
68
+ velocityStabilityReward: number;
69
+ };