@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,204 @@
1
+ import {
2
+ FLAPPY_GROUND_GRID_MIN_VERTICAL_LINE_COUNT,
3
+ FLAPPY_GROUND_GRID_PULSE_VISIBLE_VIEWPORT_INSET_PX,
4
+ FLAPPY_GROUND_GRID_SCROLL_OFFSET_QUANTIZATION_DECIMALS,
5
+ FLAPPY_GROUND_GRID_SCROLL_RATIO,
6
+ FLAPPY_GROUND_GRID_TARGET_VERTICAL_LINE_SPACING_PX,
7
+ FLAPPY_GROUND_GRID_VERTICAL_PULSE_END_RATIO,
8
+ FLAPPY_GROUND_GRID_VERTICAL_PULSE_START_RATIO,
9
+ } from './playback.background.ground-grid.constants';
10
+ import { resolvePlaybackGroundGridPipeConnectionProfile } from './playback.background.ground-grid.math.utils';
11
+ import { positiveModulo } from '../../playback.starfield.utils';
12
+ import type {
13
+ PlaybackGroundGridAnchorBounds,
14
+ PlaybackGroundGridAnchorBoundsInput,
15
+ PlaybackBackgroundGroundGridSceneContext,
16
+ PlaybackGroundGridPulsePath,
17
+ PlaybackGroundGridVerticalCycleContext,
18
+ PlaybackGroundGridVerticalSceneMetrics,
19
+ } from './playback.background.ground-grid.types';
20
+
21
+ /**
22
+ * Builds the static scene metrics reused across one viewport-sized grid layout.
23
+ *
24
+ * @param sceneContext - Lower-band geometry for the current viewport.
25
+ * @returns Stable anchor bounds and lane spacing for vertical-ray reuse.
26
+ */
27
+ export function buildPlaybackGroundGridVerticalSceneMetrics(
28
+ sceneContext: PlaybackBackgroundGroundGridSceneContext,
29
+ ): PlaybackGroundGridVerticalSceneMetrics {
30
+ const visibleAnchorBounds = resolvePlaybackGroundGridAnchorBounds({
31
+ horizonLeftXPx: 0,
32
+ horizonRightXPx: sceneContext.visibleWorldWidthPx,
33
+ sceneContext,
34
+ });
35
+ const pipeConnectionProfile = resolvePlaybackGroundGridPipeConnectionProfile(
36
+ sceneContext.lowerBandBottomYPx,
37
+ );
38
+ const retainedWidthRatioAtPipeConnection =
39
+ resolvePlaybackGroundGridRetainedWidthRatioAtYPx(
40
+ sceneContext.lowerBandBottomYPx,
41
+ sceneContext.vanishingPointYPx,
42
+ pipeConnectionProfile.pipeFloorYPx,
43
+ );
44
+ const safeLaneSpacingPx = Math.max(
45
+ 1,
46
+ FLAPPY_GROUND_GRID_TARGET_VERTICAL_LINE_SPACING_PX /
47
+ Math.max(Number.EPSILON, retainedWidthRatioAtPipeConnection),
48
+ );
49
+ const totalVisibleLaneCount = Math.max(
50
+ FLAPPY_GROUND_GRID_MIN_VERTICAL_LINE_COUNT,
51
+ Math.ceil(visibleAnchorBounds.anchorSpanPx / safeLaneSpacingPx) + 1,
52
+ );
53
+
54
+ return {
55
+ visibleAnchorBounds,
56
+ totalVisibleLaneCount,
57
+ safeLaneSpacingPx,
58
+ };
59
+ }
60
+
61
+ /**
62
+ * Resolves the wrapped vertical-geometry cycle for the current scroll value.
63
+ *
64
+ * @param safeLaneSpacingPx - Stable lane spacing used by current viewport metrics.
65
+ * @param lowerBandBottomYPx - Lower edge of the visible ground-grid band.
66
+ * @param scrollBasePx - Shared world scroll used for parallax motion.
67
+ * @returns Quantized wrapped offset and safe lane spacing for cache lookups.
68
+ */
69
+ export function resolvePlaybackGroundGridVerticalCycleContext(
70
+ safeLaneSpacingPx: number,
71
+ lowerBandBottomYPx: number,
72
+ scrollBasePx: number,
73
+ ): PlaybackGroundGridVerticalCycleContext {
74
+ const pipeConnectionProfile =
75
+ resolvePlaybackGroundGridPipeConnectionProfile(lowerBandBottomYPx);
76
+ const wrappedOffsetPx = positiveModulo(
77
+ scrollBasePx *
78
+ FLAPPY_GROUND_GRID_SCROLL_RATIO *
79
+ pipeConnectionProfile.matchedRayScrollRatio,
80
+ safeLaneSpacingPx,
81
+ );
82
+ const wrappedOffsetPrecisionScale = Math.pow(
83
+ 10,
84
+ FLAPPY_GROUND_GRID_SCROLL_OFFSET_QUANTIZATION_DECIMALS,
85
+ );
86
+
87
+ return {
88
+ wrappedOffsetPx:
89
+ Math.round(wrappedOffsetPx * wrappedOffsetPrecisionScale) /
90
+ wrappedOffsetPrecisionScale,
91
+ safeLaneSpacingPx,
92
+ };
93
+ }
94
+
95
+ /**
96
+ * Projects one visible horizontal span back onto the floor anchor line.
97
+ *
98
+ * @param input - Visible span bounds and scene geometry.
99
+ * @returns Bottom-anchor bounds required to cover the chosen projected span.
100
+ */
101
+ export function resolvePlaybackGroundGridAnchorBounds(
102
+ input: PlaybackGroundGridAnchorBoundsInput,
103
+ ): PlaybackGroundGridAnchorBounds {
104
+ const leftAnchorXPx = projectPlaybackGroundGridProjectedXToAnchorX({
105
+ projectedXPx: input.horizonLeftXPx,
106
+ projectedYPx: input.sceneContext.alignedHorizonYPx,
107
+ sceneContext: input.sceneContext,
108
+ });
109
+ const rightAnchorXPx = projectPlaybackGroundGridProjectedXToAnchorX({
110
+ projectedXPx: input.horizonRightXPx,
111
+ projectedYPx: input.sceneContext.alignedHorizonYPx,
112
+ sceneContext: input.sceneContext,
113
+ });
114
+
115
+ return {
116
+ leftAnchorXPx,
117
+ rightAnchorXPx,
118
+ anchorSpanPx: Math.max(1, rightAnchorXPx - leftAnchorXPx),
119
+ };
120
+ }
121
+
122
+ /**
123
+ * Resolves whether one vertical pulse path is safely visible in the viewport.
124
+ *
125
+ * @param pulsePath - Candidate vertical pulse path.
126
+ * @param sceneContext - Current lower-band scene geometry.
127
+ * @returns True when the pulse midpoint stays inside the visible ground band.
128
+ */
129
+ export function isPlaybackGroundGridVerticalPulsePathVisible(
130
+ pulsePath: PlaybackGroundGridPulsePath,
131
+ sceneContext: PlaybackBackgroundGroundGridSceneContext,
132
+ ): boolean {
133
+ const midTravelRatio =
134
+ FLAPPY_GROUND_GRID_VERTICAL_PULSE_START_RATIO +
135
+ (FLAPPY_GROUND_GRID_VERTICAL_PULSE_END_RATIO -
136
+ FLAPPY_GROUND_GRID_VERTICAL_PULSE_START_RATIO) *
137
+ 0.5;
138
+ const pulseMidpointXPx =
139
+ pulsePath.startXPx +
140
+ (pulsePath.endXPx - pulsePath.startXPx) * midTravelRatio;
141
+ const visibleLeftXPx = FLAPPY_GROUND_GRID_PULSE_VISIBLE_VIEWPORT_INSET_PX;
142
+ const visibleRightXPx =
143
+ sceneContext.visibleWorldWidthPx -
144
+ FLAPPY_GROUND_GRID_PULSE_VISIBLE_VIEWPORT_INSET_PX;
145
+
146
+ return (
147
+ pulseMidpointXPx >= visibleLeftXPx && pulseMidpointXPx <= visibleRightXPx
148
+ );
149
+ }
150
+
151
+ /**
152
+ * Projects one visible x-position at an arbitrary y-level to the anchor line.
153
+ *
154
+ * @param input - Projected target and scene geometry.
155
+ * @returns Bottom anchor x-position whose ray reaches the projected point.
156
+ */
157
+ function projectPlaybackGroundGridProjectedXToAnchorX(input: {
158
+ projectedXPx: number;
159
+ projectedYPx: number;
160
+ sceneContext: PlaybackBackgroundGroundGridSceneContext;
161
+ }): number {
162
+ const verticalProjectionDenominatorPx =
163
+ input.projectedYPx - input.sceneContext.vanishingPointYPx;
164
+ if (Math.abs(verticalProjectionDenominatorPx) < Number.EPSILON) {
165
+ return input.projectedXPx;
166
+ }
167
+
168
+ const verticalProjectionRatio =
169
+ (input.sceneContext.lowerBandBottomYPx -
170
+ input.sceneContext.vanishingPointYPx) /
171
+ verticalProjectionDenominatorPx;
172
+ return (
173
+ input.sceneContext.vanishingPointXPx +
174
+ (input.projectedXPx - input.sceneContext.vanishingPointXPx) *
175
+ verticalProjectionRatio
176
+ );
177
+ }
178
+
179
+ /**
180
+ * Resolves how much adjacent-ray spacing remains at one projected y-position.
181
+ *
182
+ * Perspective rays linearly collapse toward the vanishing point, so the local
183
+ * lane width at any y-position is just the bottom-anchor spacing multiplied by
184
+ * the remaining width ratio between the bottom edge and the vanishing point.
185
+ *
186
+ * @param lowerBandBottomYPx - Bottom edge of the visible ground band.
187
+ * @param vanishingPointYPx - Shared vanishing-point y-position.
188
+ * @param targetYPx - Projected y-position whose retained width should be measured.
189
+ * @returns Width-retention ratio in the inclusive `[0, 1]` range.
190
+ */
191
+ function resolvePlaybackGroundGridRetainedWidthRatioAtYPx(
192
+ lowerBandBottomYPx: number,
193
+ vanishingPointYPx: number,
194
+ targetYPx: number,
195
+ ): number {
196
+ const verticalTravelPx = vanishingPointYPx - lowerBandBottomYPx;
197
+ if (Math.abs(verticalTravelPx) < Number.EPSILON) {
198
+ return 1;
199
+ }
200
+
201
+ const interpolationRatio =
202
+ (targetYPx - lowerBandBottomYPx) / verticalTravelPx;
203
+ return Math.max(0, Math.min(1, 1 - interpolationRatio));
204
+ }
@@ -0,0 +1,49 @@
1
+ import {
2
+ resolvePlaybackGroundGridHorizontalGeometry,
3
+ resolvePlaybackGroundGridVerticalGeometry,
4
+ } from './playback.background.ground-grid.geometry.utils';
5
+ import { resolvePlaybackGroundGridPulse } from './playback.background.ground-grid.pulse.utils';
6
+ import type {
7
+ PlaybackBackgroundGroundGridSceneContext,
8
+ PlaybackGroundGridGeometry,
9
+ PlaybackGroundGridHorizontalGeometry,
10
+ PlaybackGroundGridVerticalGeometry,
11
+ } from './playback.background.ground-grid.types';
12
+
13
+ /**
14
+ * Builds the line geometry for the neon ground grid.
15
+ *
16
+ * @param sceneContext - Lower-band geometry for the current viewport.
17
+ * @param frameIndex - Current deterministic playback frame index.
18
+ * @param scrollBasePx - Shared world scroll used for parallax motion.
19
+ * @returns Horizontal depth bands and perspective rays for the current frame.
20
+ */
21
+ export function resolvePlaybackGroundGridGeometry(
22
+ sceneContext: PlaybackBackgroundGroundGridSceneContext,
23
+ frameIndex: number,
24
+ scrollBasePx: number,
25
+ ): PlaybackGroundGridGeometry {
26
+ // Step 1: Resolve and cache the fixed horizontal depth bands for the lower plane.
27
+ const horizontalGeometry: PlaybackGroundGridHorizontalGeometry =
28
+ resolvePlaybackGroundGridHorizontalGeometry(sceneContext);
29
+
30
+ // Step 2: Resolve and cache the moving perspective rays within one wrapped cycle.
31
+ const verticalGeometry: PlaybackGroundGridVerticalGeometry =
32
+ resolvePlaybackGroundGridVerticalGeometry(sceneContext, scrollBasePx);
33
+
34
+ // Step 3: Resolve one visible pulse above the grid lines.
35
+ const pulse = resolvePlaybackGroundGridPulse({
36
+ frameIndex,
37
+ horizontalPulsePaths: horizontalGeometry.preferredHorizontalPulsePaths,
38
+ sceneContext,
39
+ verticalPulsePaths: verticalGeometry.verticalPulsePaths,
40
+ visibleVerticalPulsePaths: verticalGeometry.visibleVerticalPulsePaths,
41
+ });
42
+
43
+ // Step 4: Return the pure geometry bundle used by the canvas renderer.
44
+ return {
45
+ horizontalLineBatches: horizontalGeometry.horizontalLineBatches,
46
+ pulse,
47
+ verticalLineBatches: verticalGeometry.verticalLineBatches,
48
+ };
49
+ }
@@ -0,0 +1,313 @@
1
+ import {
2
+ FLAPPY_GROUND_GRID_HORIZONTAL_LINE_COUNT,
3
+ FLAPPY_GROUND_GRID_TARGET_VERTICAL_LINE_SPACING_PX,
4
+ FLAPPY_GROUND_GRID_TARGET_VERTICAL_SEGMENT_HEIGHT_PX,
5
+ FLAPPY_GROUND_GRID_VERTICAL_OVERFLOW_COUNT,
6
+ } from './playback.background.ground-grid.constants';
7
+ import {
8
+ resolvePlaybackGroundGridDepthCurve,
9
+ resolvePlaybackGroundGridDepthFromHorizonDistance,
10
+ resolvePlaybackGroundGridLineAlpha,
11
+ resolvePlaybackGroundGridLineBlur,
12
+ resolvePlaybackGroundGridLineThickness,
13
+ } from './playback.background.ground-grid.math.utils';
14
+ import {
15
+ ensureGroundGridViewportCacheValidity,
16
+ resolveCachedGroundGridHorizontalGeometry,
17
+ resolveCachedGroundGridVerticalGeometry,
18
+ resolveCachedGroundGridVerticalSceneMetrics,
19
+ resolveGroundGridSceneCacheKey,
20
+ resolveGroundGridVerticalCycleCacheKey,
21
+ } from './playback.background.ground-grid.cache.services';
22
+ import {
23
+ groupPlaybackGroundGridSegmentsByStyle,
24
+ resolvePlaybackGroundGridPreferredHorizontalPulsePaths,
25
+ } from './playback.background.ground-grid.geometry.batch.utils';
26
+ import {
27
+ buildPlaybackGroundGridVerticalSceneMetrics,
28
+ isPlaybackGroundGridVerticalPulsePathVisible,
29
+ resolvePlaybackGroundGridVerticalCycleContext,
30
+ } from './playback.background.ground-grid.geometry.layout.utils';
31
+ import type {
32
+ PlaybackBackgroundGroundGridSceneContext,
33
+ PlaybackGroundGridHorizontalGeometry,
34
+ PlaybackGroundGridHorizontalGeometryFactory,
35
+ PlaybackGroundGridLineSegment,
36
+ PlaybackGroundGridPulsePath,
37
+ PlaybackGroundGridSegmentBatch,
38
+ PlaybackGroundGridVerticalGeometry,
39
+ PlaybackGroundGridVerticalRayInput,
40
+ PlaybackGroundGridVerticalSceneMetrics,
41
+ } from './playback.background.ground-grid.types';
42
+
43
+ /**
44
+ * Resolves cached screen-horizontal depth bands for the lower neon plane.
45
+ *
46
+ * @param sceneContext - Lower-band geometry for the current viewport.
47
+ * @returns Ordered far-to-near line segments and pulse subsets.
48
+ */
49
+ export function resolvePlaybackGroundGridHorizontalGeometry(
50
+ sceneContext: PlaybackBackgroundGroundGridSceneContext,
51
+ ): PlaybackGroundGridHorizontalGeometry {
52
+ ensureGroundGridViewportCacheValidity(sceneContext);
53
+ const sceneCacheKey = resolveGroundGridSceneCacheKey(sceneContext);
54
+
55
+ return resolveCachedGroundGridHorizontalGeometry(sceneCacheKey, () =>
56
+ buildPlaybackGroundGridHorizontalGeometry(sceneContext),
57
+ );
58
+ }
59
+
60
+ /**
61
+ * Resolves cached perspective rays that converge to the centered horizon point.
62
+ *
63
+ * @param sceneContext - Lower-band geometry for the current viewport.
64
+ * @param scrollBasePx - Shared world scroll used for parallax motion.
65
+ * @returns Wrapped left-to-right perspective rays and pulse subsets.
66
+ */
67
+ export function resolvePlaybackGroundGridVerticalGeometry(
68
+ sceneContext: PlaybackBackgroundGroundGridSceneContext,
69
+ scrollBasePx: number,
70
+ ): PlaybackGroundGridVerticalGeometry {
71
+ ensureGroundGridViewportCacheValidity(sceneContext);
72
+
73
+ const sceneCacheKey = resolveGroundGridSceneCacheKey(sceneContext);
74
+ const verticalSceneMetrics = resolveCachedGroundGridVerticalSceneMetrics(
75
+ sceneCacheKey,
76
+ () => buildPlaybackGroundGridVerticalSceneMetrics(sceneContext),
77
+ );
78
+ const verticalCycleContext = resolvePlaybackGroundGridVerticalCycleContext(
79
+ verticalSceneMetrics.safeLaneSpacingPx,
80
+ sceneContext.lowerBandBottomYPx,
81
+ scrollBasePx,
82
+ );
83
+ const cycleCacheKey = resolveGroundGridVerticalCycleCacheKey(
84
+ sceneCacheKey,
85
+ verticalCycleContext.wrappedOffsetPx,
86
+ );
87
+
88
+ return resolveCachedGroundGridVerticalGeometry(cycleCacheKey, () =>
89
+ buildPlaybackGroundGridVerticalGeometry(
90
+ sceneContext,
91
+ verticalSceneMetrics,
92
+ verticalCycleContext.wrappedOffsetPx,
93
+ ),
94
+ );
95
+ }
96
+
97
+ /**
98
+ * Builds the screen-horizontal depth bands for the lower neon plane.
99
+ *
100
+ * @param sceneContext - Lower-band geometry for the current viewport.
101
+ * @returns Ordered far-to-near line segments and pulse subsets.
102
+ */
103
+ function buildPlaybackGroundGridHorizontalGeometry(
104
+ sceneContext: PlaybackBackgroundGroundGridSceneContext,
105
+ ): PlaybackGroundGridHorizontalGeometry {
106
+ const maximumDistanceToHorizonPx = Math.max(
107
+ 1,
108
+ sceneContext.lowerBandBottomYPx - sceneContext.alignedHorizonYPx,
109
+ );
110
+ const horizontalLines = new Array<PlaybackGroundGridLineSegment>(
111
+ FLAPPY_GROUND_GRID_HORIZONTAL_LINE_COUNT,
112
+ );
113
+
114
+ for (
115
+ let lineIndex = 0;
116
+ lineIndex < FLAPPY_GROUND_GRID_HORIZONTAL_LINE_COUNT;
117
+ lineIndex += 1
118
+ ) {
119
+ // Step 1: Resolve normalized depth so the first line hugs the horizon.
120
+ const depthRatio =
121
+ (lineIndex + 1) / FLAPPY_GROUND_GRID_HORIZONTAL_LINE_COUNT;
122
+ const curvedDepthRatio = resolvePlaybackGroundGridDepthCurve(depthRatio);
123
+ const lineYPx =
124
+ sceneContext.lowerBandTopYPx +
125
+ curvedDepthRatio * sceneContext.lowerBandHeightPx;
126
+ const thicknessDepthRatio =
127
+ resolvePlaybackGroundGridDepthFromHorizonDistance(
128
+ lineYPx - sceneContext.alignedHorizonYPx,
129
+ maximumDistanceToHorizonPx,
130
+ );
131
+
132
+ // Step 2: Strengthen the near lines while softening the far ones.
133
+ horizontalLines[lineIndex] = {
134
+ startXPx: 0,
135
+ startYPx: lineYPx,
136
+ endXPx: sceneContext.visibleWorldWidthPx,
137
+ endYPx: lineYPx,
138
+ alpha: resolvePlaybackGroundGridLineAlpha(depthRatio),
139
+ blurPx: resolvePlaybackGroundGridLineBlur(depthRatio),
140
+ thicknessPx: resolvePlaybackGroundGridLineThickness(thicknessDepthRatio),
141
+ };
142
+ }
143
+
144
+ return {
145
+ horizontalLineBatches:
146
+ groupPlaybackGroundGridSegmentsByStyle(horizontalLines),
147
+ horizontalLines,
148
+ preferredHorizontalPulsePaths:
149
+ resolvePlaybackGroundGridPreferredHorizontalPulsePaths(horizontalLines),
150
+ };
151
+ }
152
+
153
+ /**
154
+ * Builds the perspective rays that converge to the centered horizon point.
155
+ *
156
+ * @param sceneContext - Lower-band geometry for the current viewport.
157
+ * @param safeLaneSpacingPx - Stable lane spacing used for ray anchors.
158
+ * @param wrappedOffsetPx - Wrapped offset used for cache reuse and ray placement.
159
+ * @returns Wrapped left-to-right perspective rays and pulse subsets.
160
+ */
161
+ function buildPlaybackGroundGridVerticalGeometry(
162
+ sceneContext: PlaybackBackgroundGroundGridSceneContext,
163
+ verticalSceneMetrics: PlaybackGroundGridVerticalSceneMetrics,
164
+ wrappedOffsetPx: number,
165
+ ): PlaybackGroundGridVerticalGeometry {
166
+ const firstAnchorXPx =
167
+ verticalSceneMetrics.visibleAnchorBounds.leftAnchorXPx -
168
+ FLAPPY_GROUND_GRID_VERTICAL_OVERFLOW_COUNT *
169
+ verticalSceneMetrics.safeLaneSpacingPx -
170
+ wrappedOffsetPx;
171
+ const totalRayCount =
172
+ verticalSceneMetrics.totalVisibleLaneCount +
173
+ FLAPPY_GROUND_GRID_VERTICAL_OVERFLOW_COUNT * 2 +
174
+ 1;
175
+ const maximumLateralDistancePx =
176
+ Math.max(
177
+ Math.abs(
178
+ verticalSceneMetrics.visibleAnchorBounds.leftAnchorXPx -
179
+ sceneContext.vanishingPointXPx,
180
+ ),
181
+ Math.abs(
182
+ verticalSceneMetrics.visibleAnchorBounds.rightAnchorXPx -
183
+ sceneContext.vanishingPointXPx,
184
+ ),
185
+ ) +
186
+ FLAPPY_GROUND_GRID_VERTICAL_OVERFLOW_COUNT *
187
+ verticalSceneMetrics.safeLaneSpacingPx;
188
+ const maximumDistanceToHorizonPx = Math.max(
189
+ 1,
190
+ sceneContext.lowerBandBottomYPx - sceneContext.alignedHorizonYPx,
191
+ );
192
+ const verticalSegmentCount = Math.max(
193
+ 6,
194
+ Math.ceil(
195
+ maximumDistanceToHorizonPx /
196
+ FLAPPY_GROUND_GRID_TARGET_VERTICAL_SEGMENT_HEIGHT_PX,
197
+ ),
198
+ );
199
+ const verticalPulsePaths = new Array<PlaybackGroundGridPulsePath>(
200
+ totalRayCount,
201
+ );
202
+ const verticalLineSegments = new Array<PlaybackGroundGridLineSegment>(
203
+ totalRayCount * verticalSegmentCount,
204
+ );
205
+ const visibleVerticalPulsePaths: PlaybackGroundGridPulsePath[] = [];
206
+ let segmentWriteIndex = 0;
207
+
208
+ for (let rayIndex = 0; rayIndex < totalRayCount; rayIndex += 1) {
209
+ // Step 1: Resolve the bottom anchor and its centered strength.
210
+ const anchorXPx =
211
+ firstAnchorXPx + rayIndex * verticalSceneMetrics.safeLaneSpacingPx;
212
+ const lateralDistancePx = Math.abs(
213
+ anchorXPx - sceneContext.vanishingPointXPx,
214
+ );
215
+ const centeredStrength =
216
+ 1 - Math.min(1, lateralDistancePx / maximumLateralDistancePx);
217
+ const lineDepthRatio = 0.45 + centeredStrength * 0.55;
218
+ const verticalPulsePath: PlaybackGroundGridPulsePath = {
219
+ orientation: 'vertical',
220
+ startXPx: anchorXPx,
221
+ startYPx: sceneContext.lowerBandBottomYPx,
222
+ endXPx: sceneContext.vanishingPointXPx,
223
+ endYPx: sceneContext.vanishingPointYPx,
224
+ thicknessPx: resolvePlaybackGroundGridLineThickness(1),
225
+ };
226
+
227
+ verticalPulsePaths[rayIndex] = verticalPulsePath;
228
+ if (
229
+ isPlaybackGroundGridVerticalPulsePathVisible(
230
+ verticalPulsePath,
231
+ sceneContext,
232
+ )
233
+ ) {
234
+ visibleVerticalPulsePaths.push(verticalPulsePath);
235
+ }
236
+
237
+ segmentWriteIndex = appendPlaybackGroundGridVerticalLineSegments(
238
+ verticalLineSegments,
239
+ segmentWriteIndex,
240
+ {
241
+ ...verticalPulsePath,
242
+ lineDepthRatio,
243
+ maximumDistanceToHorizonPx,
244
+ sceneContext,
245
+ verticalSegmentCount,
246
+ },
247
+ );
248
+ }
249
+
250
+ return {
251
+ verticalLineBatches:
252
+ groupPlaybackGroundGridSegmentsByStyle(verticalLineSegments),
253
+ verticalPulsePaths,
254
+ visibleVerticalPulsePaths,
255
+ };
256
+ }
257
+
258
+ /**
259
+ * Appends tapered style segments for one perspective ray.
260
+ *
261
+ * @param targetSegments - Target line-segment buffer.
262
+ * @param startIndex - Current insertion index within the target buffer.
263
+ * @param input - Geometry and depth context for one ray.
264
+ * @returns Next insertion index after all ray segments have been written.
265
+ */
266
+ function appendPlaybackGroundGridVerticalLineSegments(
267
+ targetSegments: PlaybackGroundGridLineSegment[],
268
+ startIndex: number,
269
+ input: PlaybackGroundGridVerticalRayInput,
270
+ ): number {
271
+ const rayDeltaXPx = input.endXPx - input.startXPx;
272
+ const rayDeltaYPx = input.endYPx - input.startYPx;
273
+ let writeIndex = startIndex;
274
+
275
+ for (
276
+ let segmentIndex = 0;
277
+ segmentIndex < input.verticalSegmentCount;
278
+ segmentIndex += 1
279
+ ) {
280
+ // Step 1: Resolve the interpolation bounds for this sub-segment.
281
+ const segmentStartRatio = segmentIndex / input.verticalSegmentCount;
282
+ const segmentEndRatio = (segmentIndex + 1) / input.verticalSegmentCount;
283
+ const segmentMidpointRatio = (segmentStartRatio + segmentEndRatio) * 0.5;
284
+ const segmentStartXPx = input.startXPx + rayDeltaXPx * segmentStartRatio;
285
+ const segmentStartYPx = input.startYPx + rayDeltaYPx * segmentStartRatio;
286
+ const segmentEndXPx = input.startXPx + rayDeltaXPx * segmentEndRatio;
287
+ const segmentEndYPx = input.startYPx + rayDeltaYPx * segmentEndRatio;
288
+
289
+ // Step 2: Resolve style from the segment midpoint distance to the horizon.
290
+ const segmentMidpointYPx =
291
+ input.startYPx + rayDeltaYPx * segmentMidpointRatio;
292
+ const segmentDepthRatio = resolvePlaybackGroundGridDepthFromHorizonDistance(
293
+ segmentMidpointYPx - input.sceneContext.alignedHorizonYPx,
294
+ input.maximumDistanceToHorizonPx,
295
+ );
296
+ const combinedAlphaDepthRatio =
297
+ segmentDepthRatio * 0.7 + input.lineDepthRatio * 0.3;
298
+
299
+ // Step 3: Append the tapered segment so the ray narrows toward the horizon.
300
+ targetSegments[writeIndex] = {
301
+ startXPx: segmentStartXPx,
302
+ startYPx: segmentStartYPx,
303
+ endXPx: segmentEndXPx,
304
+ endYPx: segmentEndYPx,
305
+ alpha: resolvePlaybackGroundGridLineAlpha(combinedAlphaDepthRatio),
306
+ blurPx: resolvePlaybackGroundGridLineBlur(segmentDepthRatio),
307
+ thicknessPx: resolvePlaybackGroundGridLineThickness(segmentDepthRatio),
308
+ };
309
+ writeIndex += 1;
310
+ }
311
+
312
+ return writeIndex;
313
+ }
@@ -0,0 +1,81 @@
1
+ import {
2
+ FLAPPY_GROUND_GRID_FOG_ALPHA,
3
+ FLAPPY_GROUND_GRID_FOG_HEIGHT_RATIO,
4
+ } from './playback.background.ground-grid.constants';
5
+ import { FLAPPY_BACKGROUND_COMPOSITE_SOURCE_OVER } from '../playback.background.constants';
6
+ import {
7
+ resolveCachedGroundGridFogGradient,
8
+ resolveGroundGridSceneCacheKey,
9
+ } from './playback.background.ground-grid.cache.services';
10
+ import type {
11
+ PlaybackBackgroundGroundGridResolvedScene,
12
+ PlaybackGroundGridPulse,
13
+ } from './playback.background.ground-grid.types';
14
+
15
+ /**
16
+ * Draws the lower-band atmospheric wash behind the neon line work.
17
+ *
18
+ * @param context - Canvas 2D drawing context.
19
+ * @param resolvedScene - Geometry and style for the current viewport.
20
+ * @returns Nothing.
21
+ */
22
+ export function drawGroundGridFog(
23
+ context: CanvasRenderingContext2D,
24
+ resolvedScene: PlaybackBackgroundGroundGridResolvedScene,
25
+ ): void {
26
+ const fogHeightPx =
27
+ resolvedScene.sceneContext.lowerBandHeightPx *
28
+ FLAPPY_GROUND_GRID_FOG_HEIGHT_RATIO;
29
+ const sceneCacheKey = resolveGroundGridSceneCacheKey(
30
+ resolvedScene.sceneContext,
31
+ );
32
+ const fogGradient = resolveCachedGroundGridFogGradient(
33
+ context,
34
+ sceneCacheKey,
35
+ resolvedScene.sceneContext,
36
+ resolvedScene.style.fogColor,
37
+ );
38
+
39
+ context.save();
40
+ context.globalAlpha = FLAPPY_GROUND_GRID_FOG_ALPHA;
41
+ context.fillStyle = fogGradient;
42
+ context.fillRect(
43
+ 0,
44
+ resolvedScene.sceneContext.lowerBandTopYPx,
45
+ resolvedScene.sceneContext.visibleWorldWidthPx,
46
+ fogHeightPx,
47
+ );
48
+ context.restore();
49
+ }
50
+
51
+ /**
52
+ * Draws one pulse square above the grid lines and below gameplay entities.
53
+ *
54
+ * @param context - Canvas 2D drawing context.
55
+ * @param pulse - Visible pulse square for the current frame.
56
+ * @param fillColor - Core neon fill color.
57
+ * @returns Nothing.
58
+ */
59
+ export function drawGroundGridPulse(
60
+ context: CanvasRenderingContext2D,
61
+ pulse: PlaybackGroundGridPulse | null,
62
+ fillColor: string,
63
+ ): void {
64
+ if (!pulse) {
65
+ return;
66
+ }
67
+
68
+ const halfSizePx = pulse.sizePx * 0.5;
69
+
70
+ context.save();
71
+ context.globalCompositeOperation = FLAPPY_BACKGROUND_COMPOSITE_SOURCE_OVER;
72
+ context.fillStyle = fillColor;
73
+ context.globalAlpha = pulse.alpha;
74
+ context.fillRect(
75
+ pulse.centerXPx - halfSizePx,
76
+ pulse.centerYPx - halfSizePx,
77
+ pulse.sizePx,
78
+ pulse.sizePx,
79
+ );
80
+ context.restore();
81
+ }
@@ -0,0 +1,33 @@
1
+ import { FLAPPY_PIPE_SPEED_PX_PER_FRAME } from '../../../../constants/constants.pipes';
2
+ import { FLAPPY_GROUND_GRID_SCROLL_RATIO } from './playback.background.ground-grid.constants';
3
+ import { resolvePlaybackGroundGridPipeConnectionProfile } from './playback.background.ground-grid.math.utils';
4
+
5
+ describe('resolvePlaybackGroundGridPipeConnectionProfile', () => {
6
+ it('places the lower-pipe floor above the bottom edge', () => {
7
+ const pipeConnectionProfile =
8
+ resolvePlaybackGroundGridPipeConnectionProfile(512);
9
+
10
+ expect(pipeConnectionProfile.pipeFloorYPx).toBeLessThan(512);
11
+ });
12
+
13
+ it('matches perspective-ray motion to pipe speed at the connection line', () => {
14
+ const visibleWorldHeightPx = 512;
15
+ const pipeConnectionProfile =
16
+ resolvePlaybackGroundGridPipeConnectionProfile(visibleWorldHeightPx);
17
+ const lowerBandBottomYPx = visibleWorldHeightPx;
18
+ const vanishingPointYPx = visibleWorldHeightPx * 0.5;
19
+ const interpolationRatio =
20
+ (pipeConnectionProfile.pipeFloorYPx - lowerBandBottomYPx) /
21
+ (vanishingPointYPx - lowerBandBottomYPx);
22
+ const localRaySpeedPxPerFrame =
23
+ FLAPPY_PIPE_SPEED_PX_PER_FRAME *
24
+ FLAPPY_GROUND_GRID_SCROLL_RATIO *
25
+ pipeConnectionProfile.matchedRayScrollRatio *
26
+ (1 - interpolationRatio);
27
+
28
+ expect(localRaySpeedPxPerFrame).toBeCloseTo(
29
+ FLAPPY_PIPE_SPEED_PX_PER_FRAME,
30
+ 6,
31
+ );
32
+ });
33
+ });