@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,399 @@
1
+ /**
2
+ * Rollout shaping and result helpers.
3
+ *
4
+ * This file will host rollout-local fitness composition, shaping utilities,
5
+ * and terminal result assembly helpers.
6
+ *
7
+ * Educational note:
8
+ * The rollout subsystem separates simulation from scoring on purpose. The
9
+ * services file determines what happened; this file determines how that episode
10
+ * should be interpreted as fitness.
11
+ */
12
+ import {
13
+ FLAPPY_FITNESS_ALIGNMENT_WEIGHT_PER_FRAME,
14
+ FLAPPY_FITNESS_APPROACH_PROGRESS_WEIGHT,
15
+ FLAPPY_FITNESS_BONUS_PER_PIPE,
16
+ FLAPPY_FITNESS_CENTERING_PROGRESS_WEIGHT,
17
+ FLAPPY_FITNESS_CLEARANCE_WEIGHT_PER_FRAME,
18
+ FLAPPY_FITNESS_SECOND_GAP_ALIGNMENT_WEIGHT_PER_FRAME,
19
+ FLAPPY_FITNESS_STABLE_VELOCITY_WEIGHT_PER_FRAME,
20
+ FLAPPY_FITNESS_SURVIVAL_WEIGHT,
21
+ FLAPPY_FITNESS_TERMINAL_ALIGNMENT_BONUS_WEIGHT,
22
+ FLAPPY_FITNESS_TERMINAL_PROGRESS_BONUS_WEIGHT,
23
+ } from '../../constants/constants';
24
+ import {
25
+ FLAPPY_EVALUATION_DEFAULT_PIPE_PROGRESS_TARGET,
26
+ FLAPPY_EVALUATION_DENSE_SHAPING_FRAMES_NORMALIZER,
27
+ FLAPPY_EVALUATION_NORMALIZED_DENSE_WEIGHT,
28
+ FLAPPY_EVALUATION_NORMALIZED_PROGRESS_WEIGHT,
29
+ FLAPPY_EVALUATION_NORMALIZED_SURVIVAL_WEIGHT,
30
+ FLAPPY_EVALUATION_NORMALIZED_TERMINAL_WEIGHT,
31
+ FLAPPY_EVALUATION_UNRECOVERABLE_ABOVE_GAP_DELTA,
32
+ FLAPPY_EVALUATION_UNRECOVERABLE_BELOW_GAP_DELTA,
33
+ FLAPPY_EVALUATION_UNRECOVERABLE_CLEARANCE_THRESHOLD,
34
+ FLAPPY_EVALUATION_UNRECOVERABLE_FALLING_VELOCITY,
35
+ FLAPPY_EVALUATION_UNRECOVERABLE_RISING_VELOCITY,
36
+ } from '../evaluation.constants';
37
+ import {
38
+ getFlappyObservationFeatures,
39
+ type FlappyGameState,
40
+ type FlappyObservationFeatures,
41
+ } from '../../flappyEnvironment.ts';
42
+ import { clampValue } from '../../flappy.simulation.shared.utils';
43
+ import {
44
+ FLAPPY_ROLLOUT_MIN_MAX_FRAMES,
45
+ FLAPPY_ROLLOUT_ZERO_FITNESS,
46
+ } from './evaluation.rollout.constants';
47
+ import type {
48
+ DenseShapingRewardComponents,
49
+ RolloutEpisodeContext,
50
+ RolloutEpisodeRuntimeState,
51
+ RolloutFitnessBreakdown,
52
+ } from './evaluation.rollout.types';
53
+ import type { FlappyEpisodeResult } from '../evaluation.types';
54
+
55
+ /**
56
+ * Composes the final rollout result from the terminal game state.
57
+ *
58
+ * This is the final fold step for rollout execution: internal counters and
59
+ * shaping channels become the public `FlappyEpisodeResult` consumed by training
60
+ * and reporting.
61
+ *
62
+ * @param rolloutEpisodeContext - Normalized rollout configuration.
63
+ * @param rolloutEpisodeRuntimeState - Mutable runtime state.
64
+ * @returns Episode result details.
65
+ */
66
+ export function composeRolloutEpisodeResult(
67
+ rolloutEpisodeContext: RolloutEpisodeContext,
68
+ rolloutEpisodeRuntimeState: RolloutEpisodeRuntimeState,
69
+ ): FlappyEpisodeResult {
70
+ // Step 1: Resolve fitness-channel breakdown values from the final game state.
71
+ const framesSurvived = rolloutEpisodeRuntimeState.state.frameIndex;
72
+ const pipesPassed = rolloutEpisodeRuntimeState.state.pipesPassed;
73
+ const rolloutFitnessBreakdown = resolveRolloutFitnessBreakdown(
74
+ rolloutEpisodeContext,
75
+ rolloutEpisodeRuntimeState,
76
+ framesSurvived,
77
+ pipesPassed,
78
+ );
79
+
80
+ // Step 2: Compose normalized or raw fitness from the resolved breakdown.
81
+ const fitness = rolloutEpisodeContext.normalizeFitness
82
+ ? composeNormalizedFitness(
83
+ framesSurvived,
84
+ pipesPassed,
85
+ rolloutFitnessBreakdown.denseShapingFitness,
86
+ rolloutFitnessBreakdown.terminalShapingFitness,
87
+ rolloutEpisodeContext.maxFramesPerEpisode,
88
+ rolloutEpisodeContext.pipeProgressTarget,
89
+ )
90
+ : resolveUnnormalizedRolloutFitness(rolloutFitnessBreakdown);
91
+
92
+ // Step 3: Return the public episode result payload.
93
+ return {
94
+ framesSurvived,
95
+ pipesPassed,
96
+ done: rolloutEpisodeRuntimeState.state.done,
97
+ doneReason: rolloutEpisodeRuntimeState.state.doneReason,
98
+ fitness,
99
+ fitnessBreakdown: {
100
+ survival: rolloutFitnessBreakdown.survivalFitness,
101
+ pipeProgress: rolloutFitnessBreakdown.pipePassFitness,
102
+ denseShaping: rolloutFitnessBreakdown.denseShapingFitness,
103
+ terminalShaping: rolloutFitnessBreakdown.terminalShapingFitness,
104
+ },
105
+ };
106
+ }
107
+
108
+ /**
109
+ * Computes dense reward shaping from consecutive observations.
110
+ *
111
+ * Dense shaping rewards incremental improvement throughout an episode instead of
112
+ * paying out only at the end, which gives evolution a more informative signal.
113
+ *
114
+ * @param previousFeatures - Observation before stepping the environment.
115
+ * @param currentFeatures - Observation after stepping the environment.
116
+ * @returns Per-step shaped reward.
117
+ */
118
+ export function computeDenseShapingReward(
119
+ previousFeatures: FlappyObservationFeatures,
120
+ currentFeatures: FlappyObservationFeatures,
121
+ ): number {
122
+ // Step 1: Resolve each shaping component from the consecutive observations.
123
+ const denseShapingRewardComponents = resolveDenseShapingRewardComponents(
124
+ previousFeatures,
125
+ currentFeatures,
126
+ );
127
+
128
+ // Step 2: Sum the shaping channels into one per-frame reward.
129
+ return (
130
+ denseShapingRewardComponents.nextGapAlignmentReward +
131
+ denseShapingRewardComponents.approachProgressReward +
132
+ denseShapingRewardComponents.centeringProgressReward +
133
+ denseShapingRewardComponents.clearanceReward +
134
+ denseShapingRewardComponents.secondGapAlignmentReward +
135
+ denseShapingRewardComponents.velocityStabilityReward
136
+ );
137
+ }
138
+
139
+ /**
140
+ * Detects trajectories that are usually irrecoverable in early warmup.
141
+ *
142
+ * The heuristic focuses on obvious early failures, where spending more rollout
143
+ * budget is least informative.
144
+ *
145
+ * @param observationFeatures - Post-step observation features.
146
+ * @returns Whether the current trajectory appears unrecoverable.
147
+ */
148
+ export function isBirdLikelyUnrecoverable(
149
+ observationFeatures: FlappyObservationFeatures,
150
+ ): boolean {
151
+ const farOutsideGap =
152
+ observationFeatures.normalizedNextGapClearance <
153
+ FLAPPY_EVALUATION_UNRECOVERABLE_CLEARANCE_THRESHOLD;
154
+ const belowGapAndStillFalling =
155
+ observationFeatures.normalizedDeltaToNextGap >
156
+ FLAPPY_EVALUATION_UNRECOVERABLE_BELOW_GAP_DELTA &&
157
+ observationFeatures.normalizedVelocity >
158
+ FLAPPY_EVALUATION_UNRECOVERABLE_FALLING_VELOCITY;
159
+ const aboveGapAndStillRising =
160
+ observationFeatures.normalizedDeltaToNextGap <
161
+ FLAPPY_EVALUATION_UNRECOVERABLE_ABOVE_GAP_DELTA &&
162
+ observationFeatures.normalizedVelocity <
163
+ FLAPPY_EVALUATION_UNRECOVERABLE_RISING_VELOCITY;
164
+
165
+ return farOutsideGap && (belowGapAndStillFalling || aboveGapAndStillRising);
166
+ }
167
+
168
+ /**
169
+ * Resolves the raw fitness channels from the final episode state.
170
+ *
171
+ * Separating raw channels from final composition makes reward rebalancing much
172
+ * easier to reason about.
173
+ *
174
+ * @param rolloutEpisodeContext - Normalized rollout configuration.
175
+ * @param rolloutEpisodeRuntimeState - Mutable runtime state.
176
+ * @param framesSurvived - Final frame count.
177
+ * @param pipesPassed - Final pipe-pass count.
178
+ * @returns Fitness-channel breakdown.
179
+ */
180
+ function resolveRolloutFitnessBreakdown(
181
+ rolloutEpisodeContext: RolloutEpisodeContext,
182
+ rolloutEpisodeRuntimeState: RolloutEpisodeRuntimeState,
183
+ framesSurvived: number,
184
+ pipesPassed: number,
185
+ ): RolloutFitnessBreakdown {
186
+ // Step 1: Resolve the direct survival and progress channels.
187
+ const survivalFitness = framesSurvived * FLAPPY_FITNESS_SURVIVAL_WEIGHT;
188
+ const pipePassFitness = pipesPassed * FLAPPY_FITNESS_BONUS_PER_PIPE;
189
+
190
+ // Step 2: Resolve the terminal shaping bonus from the final observation.
191
+ const terminalShapingFitness = computeTerminalShapingFitness(
192
+ rolloutEpisodeRuntimeState.state,
193
+ rolloutEpisodeContext.difficultyScale,
194
+ );
195
+
196
+ return {
197
+ survivalFitness,
198
+ pipePassFitness,
199
+ denseShapingFitness: rolloutEpisodeRuntimeState.denseShapingFitness,
200
+ terminalShapingFitness,
201
+ };
202
+ }
203
+
204
+ /**
205
+ * Resolves raw fitness by summing every fitness channel.
206
+ *
207
+ * This is the legacy unnormalized objective. The normalized path below caps
208
+ * channels so no single term dominates the whole score.
209
+ *
210
+ * @param rolloutFitnessBreakdown - Fitness-channel breakdown.
211
+ * @returns Raw unnormalized fitness.
212
+ */
213
+ function resolveUnnormalizedRolloutFitness(
214
+ rolloutFitnessBreakdown: RolloutFitnessBreakdown,
215
+ ): number {
216
+ // Step 1: Sum all channels directly for the legacy unnormalized objective.
217
+ return (
218
+ rolloutFitnessBreakdown.survivalFitness +
219
+ rolloutFitnessBreakdown.pipePassFitness +
220
+ rolloutFitnessBreakdown.denseShapingFitness +
221
+ rolloutFitnessBreakdown.terminalShapingFitness
222
+ );
223
+ }
224
+
225
+ /**
226
+ * Resolves every dense-shaping reward component from consecutive observations.
227
+ *
228
+ * If you want background reading, the Wikipedia article on "reward shaping" is
229
+ * a good high-level companion concept for why these components exist.
230
+ *
231
+ * @param previousFeatures - Observation before stepping the environment.
232
+ * @param currentFeatures - Observation after stepping the environment.
233
+ * @returns Dense-shaping reward components.
234
+ */
235
+ function resolveDenseShapingRewardComponents(
236
+ previousFeatures: FlappyObservationFeatures,
237
+ currentFeatures: FlappyObservationFeatures,
238
+ ): DenseShapingRewardComponents {
239
+ // Step 1: Reward alignment with the next immediate pipe gap.
240
+ const nextGapAlignmentReward =
241
+ Math.max(
242
+ FLAPPY_ROLLOUT_ZERO_FITNESS,
243
+ FLAPPY_ROLLOUT_MIN_MAX_FRAMES -
244
+ Math.abs(currentFeatures.normalizedDeltaToNextGap),
245
+ ) * FLAPPY_FITNESS_ALIGNMENT_WEIGHT_PER_FRAME;
246
+
247
+ // Step 2: Reward forward progress toward the next pipe.
248
+ const approachProgressReward =
249
+ Math.max(
250
+ FLAPPY_ROLLOUT_ZERO_FITNESS,
251
+ previousFeatures.normalizedDistanceToNextPipe -
252
+ currentFeatures.normalizedDistanceToNextPipe,
253
+ ) * FLAPPY_FITNESS_APPROACH_PROGRESS_WEIGHT;
254
+
255
+ // Step 3: Reward reduction in absolute next-gap centering error.
256
+ const centeringProgressReward =
257
+ Math.max(
258
+ FLAPPY_ROLLOUT_ZERO_FITNESS,
259
+ Math.abs(previousFeatures.normalizedDeltaToNextGap) -
260
+ Math.abs(currentFeatures.normalizedDeltaToNextGap),
261
+ ) * FLAPPY_FITNESS_CENTERING_PROGRESS_WEIGHT;
262
+
263
+ // Step 4: Reward maintaining positive clearance around the next gap.
264
+ const clearanceReward =
265
+ Math.max(
266
+ FLAPPY_ROLLOUT_ZERO_FITNESS,
267
+ currentFeatures.normalizedNextGapClearance,
268
+ ) * FLAPPY_FITNESS_CLEARANCE_WEIGHT_PER_FRAME;
269
+
270
+ // Step 5: Reward alignment with the second upcoming gap to encourage stability.
271
+ const secondGapAlignmentReward =
272
+ Math.max(
273
+ FLAPPY_ROLLOUT_ZERO_FITNESS,
274
+ FLAPPY_ROLLOUT_MIN_MAX_FRAMES -
275
+ Math.abs(currentFeatures.normalizedDeltaToSecondGap),
276
+ ) * FLAPPY_FITNESS_SECOND_GAP_ALIGNMENT_WEIGHT_PER_FRAME;
277
+
278
+ // Step 6: Reward stable velocity magnitudes that avoid extreme oscillation.
279
+ const velocityStabilityReward =
280
+ Math.max(
281
+ FLAPPY_ROLLOUT_ZERO_FITNESS,
282
+ FLAPPY_ROLLOUT_MIN_MAX_FRAMES -
283
+ Math.abs(currentFeatures.normalizedVelocity),
284
+ ) * FLAPPY_FITNESS_STABLE_VELOCITY_WEIGHT_PER_FRAME;
285
+
286
+ return {
287
+ nextGapAlignmentReward,
288
+ approachProgressReward,
289
+ centeringProgressReward,
290
+ clearanceReward,
291
+ secondGapAlignmentReward,
292
+ velocityStabilityReward,
293
+ };
294
+ }
295
+
296
+ /**
297
+ * Adds small terminal bonuses from final progress/alignment signals.
298
+ *
299
+ * Terminal bonuses refine the final ranking, but they are intentionally smaller
300
+ * than the main survival and pipe-progress channels.
301
+ *
302
+ * @param episodeState - Final rollout state.
303
+ * @param difficultyScale - Active rollout difficulty scale.
304
+ * @returns Terminal shaping reward.
305
+ */
306
+ function computeTerminalShapingFitness(
307
+ episodeState: FlappyGameState,
308
+ difficultyScale: number,
309
+ ): number {
310
+ const finalObservationFeatures = getFlappyObservationFeatures(
311
+ episodeState,
312
+ difficultyScale,
313
+ );
314
+ const finalAlignment =
315
+ 1 - Math.abs(finalObservationFeatures.normalizedDeltaToNextGap);
316
+ const finalProgress =
317
+ 1 -
318
+ Math.max(
319
+ 0,
320
+ Math.min(1, finalObservationFeatures.normalizedDistanceToNextPipe),
321
+ );
322
+
323
+ const terminalAlignmentBonus =
324
+ Math.max(0, finalAlignment) *
325
+ FLAPPY_FITNESS_TERMINAL_ALIGNMENT_BONUS_WEIGHT;
326
+ const terminalProgressBonus =
327
+ Math.max(0, finalProgress) * FLAPPY_FITNESS_TERMINAL_PROGRESS_BONUS_WEIGHT;
328
+
329
+ return terminalAlignmentBonus + terminalProgressBonus;
330
+ }
331
+
332
+ /**
333
+ * Normalize and cap fitness channels so no single reward term dominates.
334
+ *
335
+ * Educational note:
336
+ * Channel normalization is a pragmatic way to keep the objective balanced across
337
+ * episodes of different lengths and levels of progress.
338
+ *
339
+ * @param framesValue - Frames survived for the episode.
340
+ * @param pipesPassedValue - Pipes passed during the episode.
341
+ * @param denseShapingValue - Accumulated dense shaping reward.
342
+ * @param terminalShapingValue - Terminal shaping reward.
343
+ * @param maxFramesValue - Frame budget used for the episode.
344
+ * @param pipeProgressTarget - Optional target used to normalize pipe progress.
345
+ * @returns Normalized composite fitness.
346
+ */
347
+ function composeNormalizedFitness(
348
+ framesValue: number,
349
+ pipesPassedValue: number,
350
+ denseShapingValue: number,
351
+ terminalShapingValue: number,
352
+ maxFramesValue: number,
353
+ pipeProgressTarget: number | undefined,
354
+ ): number {
355
+ const effectivePipeProgressTarget = Math.max(
356
+ 1,
357
+ Math.trunc(
358
+ pipeProgressTarget ?? FLAPPY_EVALUATION_DEFAULT_PIPE_PROGRESS_TARGET,
359
+ ),
360
+ );
361
+ const normalizedSurvival = clampValue(
362
+ framesValue / Math.max(1, maxFramesValue),
363
+ 0,
364
+ 1,
365
+ );
366
+ const normalizedPipeProgress = clampValue(
367
+ pipesPassedValue / effectivePipeProgressTarget,
368
+ 0,
369
+ 1,
370
+ );
371
+ const normalizedDenseShaping = clampValue(
372
+ denseShapingValue /
373
+ Math.max(
374
+ 1,
375
+ framesValue * FLAPPY_EVALUATION_DENSE_SHAPING_FRAMES_NORMALIZER,
376
+ ),
377
+ 0,
378
+ 1,
379
+ );
380
+ const normalizedTerminalShaping = clampValue(
381
+ terminalShapingValue /
382
+ Math.max(
383
+ 1,
384
+ FLAPPY_FITNESS_TERMINAL_ALIGNMENT_BONUS_WEIGHT +
385
+ FLAPPY_FITNESS_TERMINAL_PROGRESS_BONUS_WEIGHT,
386
+ ),
387
+ 0,
388
+ 1,
389
+ );
390
+
391
+ return (
392
+ normalizedSurvival *
393
+ FLAPPY_EVALUATION_NORMALIZED_SURVIVAL_WEIGHT *
394
+ FLAPPY_FITNESS_SURVIVAL_WEIGHT +
395
+ normalizedPipeProgress * FLAPPY_EVALUATION_NORMALIZED_PROGRESS_WEIGHT +
396
+ normalizedDenseShaping * FLAPPY_EVALUATION_NORMALIZED_DENSE_WEIGHT +
397
+ normalizedTerminalShaping * FLAPPY_EVALUATION_NORMALIZED_TERMINAL_WEIGHT
398
+ );
399
+ }