@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,201 @@
1
+ import {
2
+ FLAPPY_GROUND_GRID_DEPTH_CURVE_EXPONENT,
3
+ FLAPPY_GROUND_GRID_HORIZONTAL_LINE_COUNT,
4
+ FLAPPY_GROUND_GRID_MAX_ALPHA,
5
+ FLAPPY_GROUND_GRID_MAX_BLUR_PX,
6
+ FLAPPY_GROUND_GRID_MAX_THICKNESS_PX,
7
+ FLAPPY_GROUND_GRID_MIN_ALPHA,
8
+ FLAPPY_GROUND_GRID_MIN_BLUR_PX,
9
+ FLAPPY_GROUND_GRID_MIN_THICKNESS_PX,
10
+ FLAPPY_GROUND_GRID_PIPE_CONNECTION_LINE_OFFSET_FROM_BOTTOM,
11
+ FLAPPY_GROUND_GRID_SCROLL_RATIO,
12
+ } from './playback.background.ground-grid.constants';
13
+ import { resolvePlaybackBackgroundLayout } from '../playback.background.utils';
14
+
15
+ const cachedPipeConnectionProfileByHeight = new Map<
16
+ number,
17
+ PlaybackGroundGridPipeConnectionProfile
18
+ >();
19
+
20
+ /**
21
+ * Small point value used when interpolating positions along one grid ray.
22
+ */
23
+ export type PlaybackGroundGridPoint = {
24
+ xPx: number;
25
+ yPx: number;
26
+ };
27
+
28
+ /**
29
+ * Shared pipe-floor projection resolved from the lower ground-grid geometry.
30
+ */
31
+ export type PlaybackGroundGridPipeConnectionProfile = {
32
+ pipeFloorYPx: number;
33
+ matchedRayScrollRatio: number;
34
+ };
35
+
36
+ /**
37
+ * Maps a normalized depth ratio into a stronger synthwave spacing curve.
38
+ *
39
+ * @param depthRatio - Normalized 0..1 depth where 0 is far and 1 is near.
40
+ * @returns Curved depth ratio used for line placement and styling.
41
+ */
42
+ export function resolvePlaybackGroundGridDepthCurve(
43
+ depthRatio: number,
44
+ ): number {
45
+ return Math.pow(depthRatio, FLAPPY_GROUND_GRID_DEPTH_CURVE_EXPONENT);
46
+ }
47
+
48
+ /**
49
+ * Resolves neon alpha for one line based on its normalized depth.
50
+ *
51
+ * @param depthRatio - Normalized 0..1 depth where 0 is far and 1 is near.
52
+ * @returns Opacity for the rendered line.
53
+ */
54
+ export function resolvePlaybackGroundGridLineAlpha(depthRatio: number): number {
55
+ return (
56
+ FLAPPY_GROUND_GRID_MIN_ALPHA +
57
+ (FLAPPY_GROUND_GRID_MAX_ALPHA - FLAPPY_GROUND_GRID_MIN_ALPHA) * depthRatio
58
+ );
59
+ }
60
+
61
+ /**
62
+ * Resolves glow blur for one line based on its normalized depth.
63
+ *
64
+ * @param depthRatio - Normalized 0..1 depth where 0 is far and 1 is near.
65
+ * @returns Blur radius for the rendered line.
66
+ */
67
+ export function resolvePlaybackGroundGridLineBlur(depthRatio: number): number {
68
+ return (
69
+ FLAPPY_GROUND_GRID_MAX_BLUR_PX -
70
+ (FLAPPY_GROUND_GRID_MAX_BLUR_PX - FLAPPY_GROUND_GRID_MIN_BLUR_PX) *
71
+ depthRatio
72
+ );
73
+ }
74
+
75
+ /**
76
+ * Resolves stroke thickness for one line based on its normalized depth.
77
+ *
78
+ * @param depthRatio - Normalized 0..1 depth where 0 is far and 1 is near.
79
+ * @returns Stroke width in pixels.
80
+ */
81
+ export function resolvePlaybackGroundGridLineThickness(
82
+ depthRatio: number,
83
+ ): number {
84
+ return (
85
+ FLAPPY_GROUND_GRID_MIN_THICKNESS_PX +
86
+ (FLAPPY_GROUND_GRID_MAX_THICKNESS_PX -
87
+ FLAPPY_GROUND_GRID_MIN_THICKNESS_PX) *
88
+ depthRatio
89
+ );
90
+ }
91
+
92
+ /**
93
+ * Resolves normalized depth from a vertical distance away from the horizon.
94
+ *
95
+ * @param distanceToHorizonPx - Vertical distance from the vanishing horizon.
96
+ * @param maximumDistanceToHorizonPx - Largest visible vertical horizon distance.
97
+ * @returns Normalized 0..1 depth where 0 is at the horizon and 1 is nearest.
98
+ */
99
+ export function resolvePlaybackGroundGridDepthFromHorizonDistance(
100
+ distanceToHorizonPx: number,
101
+ maximumDistanceToHorizonPx: number,
102
+ ): number {
103
+ if (maximumDistanceToHorizonPx <= 0) {
104
+ return 0;
105
+ }
106
+
107
+ return Math.min(
108
+ 1,
109
+ Math.max(0, distanceToHorizonPx / maximumDistanceToHorizonPx),
110
+ );
111
+ }
112
+
113
+ /**
114
+ * Resolves the shared lower-pipe floor and matched grid-ray scroll ratio.
115
+ *
116
+ * The lower pipe is visually clipped to the first usable horizontal grid band
117
+ * above the bottom edge. The returned scroll ratio then speeds up the moving
118
+ * perspective rays so their lateral motion matches the pipe speed exactly at
119
+ * that same projected height.
120
+ *
121
+ * @param visibleWorldHeightPx - Current visible world height in pixels.
122
+ * @returns Pipe-floor y-position plus the matching vertical-ray scroll ratio.
123
+ */
124
+ export function resolvePlaybackGroundGridPipeConnectionProfile(
125
+ visibleWorldHeightPx: number,
126
+ ): PlaybackGroundGridPipeConnectionProfile {
127
+ const cachedProfile =
128
+ cachedPipeConnectionProfileByHeight.get(visibleWorldHeightPx);
129
+ if (cachedProfile) {
130
+ return cachedProfile;
131
+ }
132
+
133
+ // Step 1: Resolve the lower-band layout used by both the grid and pipe illusion.
134
+ const backgroundLayout =
135
+ resolvePlaybackBackgroundLayout(visibleWorldHeightPx);
136
+ const connectionLineIndex = Math.max(
137
+ 0,
138
+ FLAPPY_GROUND_GRID_HORIZONTAL_LINE_COUNT -
139
+ FLAPPY_GROUND_GRID_PIPE_CONNECTION_LINE_OFFSET_FROM_BOTTOM -
140
+ 1,
141
+ );
142
+ const depthRatio =
143
+ (connectionLineIndex + 1) / FLAPPY_GROUND_GRID_HORIZONTAL_LINE_COUNT;
144
+ const curvedDepthRatio = resolvePlaybackGroundGridDepthCurve(depthRatio);
145
+ const pipeFloorYPx =
146
+ backgroundLayout.lowerBandTopYPx +
147
+ curvedDepthRatio * backgroundLayout.lowerBandHeightPx;
148
+
149
+ // Step 2: Resolve how much anchor motion survives at the projected floor height.
150
+ const vanishingPointYPx = Math.max(0, visibleWorldHeightPx * 0.5);
151
+ const verticalTravelPx =
152
+ vanishingPointYPx - backgroundLayout.lowerBandBottomYPx;
153
+ const interpolationRatio =
154
+ Math.abs(verticalTravelPx) < Number.EPSILON
155
+ ? 0
156
+ : (pipeFloorYPx - backgroundLayout.lowerBandBottomYPx) / verticalTravelPx;
157
+ const clampedInterpolationRatio = Math.min(
158
+ 0.999,
159
+ Math.max(0, interpolationRatio),
160
+ );
161
+
162
+ // Step 3: Return the floor height and the ray-scroll multiplier needed there.
163
+ const pipeConnectionProfile = {
164
+ pipeFloorYPx,
165
+ matchedRayScrollRatio:
166
+ 1 /
167
+ Math.max(
168
+ Number.EPSILON,
169
+ FLAPPY_GROUND_GRID_SCROLL_RATIO * (1 - clampedInterpolationRatio),
170
+ ),
171
+ };
172
+
173
+ cachedPipeConnectionProfileByHeight.set(
174
+ visibleWorldHeightPx,
175
+ pipeConnectionProfile,
176
+ );
177
+ return pipeConnectionProfile;
178
+ }
179
+
180
+ /**
181
+ * Interpolates one point along a perspective ray.
182
+ *
183
+ * @param startXPx - Bottom anchor x-position.
184
+ * @param startYPx - Bottom anchor y-position.
185
+ * @param endXPx - Vanishing-point x-position.
186
+ * @param endYPx - Vanishing-point y-position.
187
+ * @param interpolationRatio - Normalized 0..1 position along the ray.
188
+ * @returns Interpolated point on the perspective ray.
189
+ */
190
+ export function interpolatePlaybackGroundGridPoint(
191
+ startXPx: number,
192
+ startYPx: number,
193
+ endXPx: number,
194
+ endYPx: number,
195
+ interpolationRatio: number,
196
+ ): PlaybackGroundGridPoint {
197
+ return {
198
+ xPx: startXPx + (endXPx - startXPx) * interpolationRatio,
199
+ yPx: startYPx + (endYPx - startYPx) * interpolationRatio,
200
+ };
201
+ }
@@ -0,0 +1,171 @@
1
+ import { FLAPPY_GROUND_GRID_VERTICAL_OVERFLOW_COUNT } from './playback.background.ground-grid.constants';
2
+ import { interpolatePlaybackGroundGridPoint } from './playback.background.ground-grid.math.utils';
3
+ import type {
4
+ PlaybackGroundGridPulsePath,
5
+ PlaybackGroundGridVerticalPulseContinuationState,
6
+ } from './playback.background.ground-grid.types';
7
+
8
+ const cachedVerticalPulseContinuationBySlot = new Map<
9
+ number,
10
+ PlaybackGroundGridVerticalPulseContinuationState
11
+ >();
12
+
13
+ /**
14
+ * Resolves the current vertical pulse path while preserving per-slot continuity.
15
+ *
16
+ * A vertical pulse should stay attached to one moving ray for its whole
17
+ * lifetime, even though the frame-local ray array is rebuilt as scroll wraps.
18
+ * This helper first prefers the nearest continuation of the previous frame's
19
+ * pulse position, then falls back to deterministic slot-based selection.
20
+ *
21
+ * @param verticalPulsePaths - Full vertical ray paths for the current frame.
22
+ * @param visibleVerticalPulsePaths - Visible subset preferred for on-screen pulses.
23
+ * @param pulseSlotIndex - Zero-based pulse slot index.
24
+ * @param frameIndex - Current deterministic frame index.
25
+ * @param travelProgressRatio - Current travel ratio along the chosen line.
26
+ * @param resolveUnitHash - Deterministic unit-hash helper used for fallback picks.
27
+ * @returns Vertical pulse path, or null when none are available.
28
+ */
29
+ export function resolvePlaybackGroundGridVerticalPulseSelection(input: {
30
+ verticalPulsePaths: readonly PlaybackGroundGridPulsePath[];
31
+ visibleVerticalPulsePaths: readonly PlaybackGroundGridPulsePath[];
32
+ pulseSlotIndex: number;
33
+ frameIndex: number;
34
+ travelProgressRatio: number;
35
+ resolveUnitHash: (seed: number, salt: number) => number;
36
+ }): PlaybackGroundGridPulsePath | null {
37
+ if (input.verticalPulsePaths.length === 0) {
38
+ return null;
39
+ }
40
+
41
+ trimCachedVerticalPulseContinuationState(input.pulseSlotIndex);
42
+
43
+ const candidatePulsePaths = resolveStableVerticalPulsePathCandidates(
44
+ input.verticalPulsePaths,
45
+ input.visibleVerticalPulsePaths,
46
+ );
47
+ const continuedPulsePath = resolveContinuedVerticalPulsePath({
48
+ candidatePulsePaths,
49
+ pulseSlotIndex: input.pulseSlotIndex,
50
+ frameIndex: input.frameIndex,
51
+ travelProgressRatio: input.travelProgressRatio,
52
+ });
53
+ if (continuedPulsePath) {
54
+ return continuedPulsePath;
55
+ }
56
+
57
+ const selectedPathIndex = Math.min(
58
+ candidatePulsePaths.length - 1,
59
+ Math.floor(
60
+ input.resolveUnitHash(input.pulseSlotIndex, 23) *
61
+ candidatePulsePaths.length,
62
+ ),
63
+ );
64
+ return candidatePulsePaths[selectedPathIndex];
65
+ }
66
+
67
+ /**
68
+ * Stores the resolved pulse center for continuation on the next frame.
69
+ *
70
+ * @param pulseSlotIndex - Zero-based pulse slot index.
71
+ * @param continuationState - Latest visible pulse position for the slot.
72
+ * @returns Nothing.
73
+ */
74
+ export function rememberPlaybackGroundGridVerticalPulseSelection(
75
+ pulseSlotIndex: number,
76
+ continuationState: PlaybackGroundGridVerticalPulseContinuationState,
77
+ ): void {
78
+ cachedVerticalPulseContinuationBySlot.set(pulseSlotIndex, continuationState);
79
+ }
80
+
81
+ /**
82
+ * Resolves the nearest continued vertical pulse path for an active slot.
83
+ *
84
+ * @param input - Continuation input for the current frame.
85
+ * @returns Continued pulse path when one can be matched, otherwise null.
86
+ */
87
+ function resolveContinuedVerticalPulsePath(input: {
88
+ candidatePulsePaths: readonly PlaybackGroundGridPulsePath[];
89
+ pulseSlotIndex: number;
90
+ frameIndex: number;
91
+ travelProgressRatio: number;
92
+ }): PlaybackGroundGridPulsePath | null {
93
+ const cachedContinuationState = cachedVerticalPulseContinuationBySlot.get(
94
+ input.pulseSlotIndex,
95
+ );
96
+ if (!cachedContinuationState) {
97
+ return null;
98
+ }
99
+
100
+ if (input.frameIndex <= cachedContinuationState.frameIndex) {
101
+ return null;
102
+ }
103
+
104
+ let closestPulsePath: PlaybackGroundGridPulsePath | null = null;
105
+ let closestDistanceSquared = Number.POSITIVE_INFINITY;
106
+
107
+ for (const candidatePulsePath of input.candidatePulsePaths) {
108
+ const candidateCenter = interpolatePlaybackGroundGridPoint(
109
+ candidatePulsePath.startXPx,
110
+ candidatePulsePath.startYPx,
111
+ candidatePulsePath.endXPx,
112
+ candidatePulsePath.endYPx,
113
+ input.travelProgressRatio,
114
+ );
115
+ const deltaXPx = candidateCenter.xPx - cachedContinuationState.centerXPx;
116
+ const deltaYPx = candidateCenter.yPx - cachedContinuationState.centerYPx;
117
+ const distanceSquared = deltaXPx * deltaXPx + deltaYPx * deltaYPx;
118
+
119
+ if (distanceSquared < closestDistanceSquared) {
120
+ closestDistanceSquared = distanceSquared;
121
+ closestPulsePath = candidatePulsePath;
122
+ }
123
+ }
124
+
125
+ return closestPulsePath;
126
+ }
127
+
128
+ /**
129
+ * Trims cached continuation state so only the current or previous pulse slots remain.
130
+ *
131
+ * @param currentPulseSlotIndex - Pulse slot currently being resolved.
132
+ * @returns Nothing.
133
+ */
134
+ function trimCachedVerticalPulseContinuationState(
135
+ currentPulseSlotIndex: number,
136
+ ): void {
137
+ for (const cachedPulseSlotIndex of cachedVerticalPulseContinuationBySlot.keys()) {
138
+ if (cachedPulseSlotIndex < currentPulseSlotIndex - 1) {
139
+ cachedVerticalPulseContinuationBySlot.delete(cachedPulseSlotIndex);
140
+ }
141
+ }
142
+ }
143
+
144
+ /**
145
+ * Resolves a stable vertical pulse-candidate set for one frame.
146
+ *
147
+ * @param verticalPulsePaths - Full vertical ray paths for the current frame.
148
+ * @param visibleVerticalPulsePaths - Midpoint-visible subset used as fallback.
149
+ * @returns Stable candidate set for deterministic vertical pulse selection.
150
+ */
151
+ function resolveStableVerticalPulsePathCandidates(
152
+ verticalPulsePaths: readonly PlaybackGroundGridPulsePath[],
153
+ visibleVerticalPulsePaths: readonly PlaybackGroundGridPulsePath[],
154
+ ): readonly PlaybackGroundGridPulsePath[] {
155
+ const stableCandidatePaths = verticalPulsePaths.slice(
156
+ FLAPPY_GROUND_GRID_VERTICAL_OVERFLOW_COUNT,
157
+ Math.max(
158
+ FLAPPY_GROUND_GRID_VERTICAL_OVERFLOW_COUNT,
159
+ verticalPulsePaths.length - FLAPPY_GROUND_GRID_VERTICAL_OVERFLOW_COUNT,
160
+ ),
161
+ );
162
+ if (stableCandidatePaths.length > 0) {
163
+ return stableCandidatePaths;
164
+ }
165
+
166
+ if (visibleVerticalPulsePaths.length > 0) {
167
+ return visibleVerticalPulsePaths;
168
+ }
169
+
170
+ return verticalPulsePaths;
171
+ }
@@ -0,0 +1,124 @@
1
+ import {
2
+ FLAPPY_GROUND_GRID_APPROX_FRAME_DURATION_MS,
3
+ FLAPPY_GROUND_GRID_PULSE_INTERVAL_MS,
4
+ FLAPPY_GROUND_GRID_PULSE_LIFETIME_MS,
5
+ FLAPPY_GROUND_GRID_UNSIGNED_NORMALIZATION_DIVISOR,
6
+ FLAPPY_GROUND_GRID_VERTICAL_PULSE_END_RATIO,
7
+ FLAPPY_GROUND_GRID_VERTICAL_PULSE_START_RATIO,
8
+ } from './playback.background.ground-grid.constants';
9
+ import type {
10
+ PlaybackGroundGridPulseOrientation,
11
+ PlaybackGroundGridPulsePath,
12
+ PlaybackGroundGridPulseTimingState,
13
+ PlaybackGroundGridPulseTravelRatioInput,
14
+ } from './playback.background.ground-grid.types';
15
+
16
+ /**
17
+ * Resolves timing state for the currently active deterministic pulse slot.
18
+ *
19
+ * @param frameIndex - Current deterministic playback frame index.
20
+ * @returns Pulse timing state, or null when no pulse is active in this frame.
21
+ */
22
+ export function resolvePlaybackGroundGridPulseTiming(
23
+ frameIndex: number,
24
+ ): PlaybackGroundGridPulseTimingState | null {
25
+ const currentTimeMs =
26
+ frameIndex * FLAPPY_GROUND_GRID_APPROX_FRAME_DURATION_MS;
27
+ const pulseSlotIndex = Math.floor(
28
+ currentTimeMs / FLAPPY_GROUND_GRID_PULSE_INTERVAL_MS,
29
+ );
30
+ const pulseElapsedMs =
31
+ currentTimeMs - pulseSlotIndex * FLAPPY_GROUND_GRID_PULSE_INTERVAL_MS;
32
+ if (pulseElapsedMs > FLAPPY_GROUND_GRID_PULSE_LIFETIME_MS) {
33
+ return null;
34
+ }
35
+
36
+ return {
37
+ pulseSlotIndex,
38
+ pulseElapsedMs,
39
+ lifetimeProgressRatio:
40
+ pulseElapsedMs / FLAPPY_GROUND_GRID_PULSE_LIFETIME_MS,
41
+ };
42
+ }
43
+
44
+ /**
45
+ * Resolves pulse orientation for one deterministic pulse slot.
46
+ *
47
+ * @param pulseSlotIndex - Zero-based pulse slot index.
48
+ * @returns Horizontal or vertical pulse travel orientation.
49
+ */
50
+ export function resolvePlaybackGroundGridPulseOrientation(
51
+ pulseSlotIndex: number,
52
+ ): PlaybackGroundGridPulseOrientation {
53
+ return resolvePlaybackGroundGridUnitHash(pulseSlotIndex, 11) >= 0.5
54
+ ? 'horizontal'
55
+ : 'vertical';
56
+ }
57
+
58
+ /**
59
+ * Selects one thick-enough horizontal band for the current pulse slot.
60
+ *
61
+ * @param horizontalPulsePaths - Cached horizontal pulse paths eligible for travel.
62
+ * @param pulseSlotIndex - Zero-based pulse slot index.
63
+ * @returns Horizontal pulse path, or null when none are suitable.
64
+ */
65
+ export function resolvePlaybackGroundGridHorizontalPulsePath(
66
+ horizontalPulsePaths: readonly PlaybackGroundGridPulsePath[],
67
+ pulseSlotIndex: number,
68
+ ): PlaybackGroundGridPulsePath | null {
69
+ if (horizontalPulsePaths.length === 0) {
70
+ return null;
71
+ }
72
+
73
+ const selectedLineIndex = Math.min(
74
+ horizontalPulsePaths.length - 1,
75
+ Math.floor(
76
+ resolvePlaybackGroundGridUnitHash(pulseSlotIndex, 17) *
77
+ horizontalPulsePaths.length,
78
+ ),
79
+ );
80
+ return horizontalPulsePaths[selectedLineIndex];
81
+ }
82
+
83
+ /**
84
+ * Resolves the pulse travel ratio along its chosen line.
85
+ *
86
+ * @param input - Pulse timing direction and orientation.
87
+ * @returns Normalized 0..1 travel ratio along the chosen line.
88
+ */
89
+ export function resolvePlaybackGroundGridPulseTravelRatio(
90
+ input: PlaybackGroundGridPulseTravelRatioInput,
91
+ ): number {
92
+ const baseTravelProgressRatio = input.directionIsForward
93
+ ? input.lifetimeProgressRatio
94
+ : 1 - input.lifetimeProgressRatio;
95
+ if (input.orientation === 'horizontal') {
96
+ return baseTravelProgressRatio;
97
+ }
98
+
99
+ return (
100
+ FLAPPY_GROUND_GRID_VERTICAL_PULSE_START_RATIO +
101
+ (FLAPPY_GROUND_GRID_VERTICAL_PULSE_END_RATIO -
102
+ FLAPPY_GROUND_GRID_VERTICAL_PULSE_START_RATIO) *
103
+ baseTravelProgressRatio
104
+ );
105
+ }
106
+
107
+ /**
108
+ * Resolves a deterministic unit-interval hash from a slot index and salt.
109
+ *
110
+ * @param seed - Slot-local seed value.
111
+ * @param salt - Small integer salt used to pick a stable random stream.
112
+ * @returns Stable random value in the range 0..1.
113
+ */
114
+ export function resolvePlaybackGroundGridUnitHash(
115
+ seed: number,
116
+ salt: number,
117
+ ): number {
118
+ let hashedValue = (seed + 1) ^ Math.imul(salt + 1, 374_761_393);
119
+ hashedValue = Math.imul(hashedValue ^ (hashedValue >>> 13), 1_274_126_177);
120
+ hashedValue ^= hashedValue >>> 16;
121
+ return (
122
+ (hashedValue >>> 0) / FLAPPY_GROUND_GRID_UNSIGNED_NORMALIZATION_DIVISOR
123
+ );
124
+ }