@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,113 @@
1
+ import {
2
+ FLAPPY_BIRD_RADIUS_PX,
3
+ FLAPPY_BIRD_X_PX,
4
+ } from '../../../constants/constants';
5
+ import type {
6
+ PopulationRenderState,
7
+ TrailState,
8
+ } from '../../browser-entry.types';
9
+ import { resolveChampionBirdIndex } from '../playback.render.utils';
10
+ import { pushChampionTrailPoint } from '../playback.trail.utils';
11
+ import {
12
+ beginPlaybackFrameViewportTransform,
13
+ finalizePlaybackFrameCanvas,
14
+ preparePlaybackFrameCanvas,
15
+ renderPlaybackFrameBackground,
16
+ renderPlaybackFrameBirds,
17
+ renderPlaybackFramePipes,
18
+ renderPlaybackFrameTrails,
19
+ resolvePlaybackFrameSceneContext,
20
+ } from './playback.frame-render.services';
21
+ import {
22
+ drawTrail,
23
+ renderPlaybackBird,
24
+ resolvePlaybackTrailStyle,
25
+ } from './playback.frame-render.utils';
26
+
27
+ /**
28
+ * High-level frame-render orchestration for playback.
29
+ *
30
+ * This boundary coordinates one visual frame of the playback experience. It
31
+ * resolves the scene, prepares the canvas, paints the background and entities,
32
+ * and maintains the short champion trail used for motion emphasis.
33
+ */
34
+
35
+ /**
36
+ * Draws one simulation frame for the current population state.
37
+ *
38
+ * The render order matters: background first, then pipes, then birds, then
39
+ * trails and overlays that should visually sit on top.
40
+ *
41
+ * @param context - Canvas 2D drawing context.
42
+ * @param renderState - Mutable simulation state snapshot.
43
+ * @param trailState - Leader trail render cache.
44
+ * @returns Nothing.
45
+ */
46
+ export function renderPopulationFrame(
47
+ context: CanvasRenderingContext2D,
48
+ renderState: PopulationRenderState,
49
+ trailState: TrailState,
50
+ ): void {
51
+ // Step 1: Resolve scene geometry and champion render state.
52
+ const sceneContext = resolvePlaybackFrameSceneContext(context, renderState);
53
+
54
+ // Step 2: Reset canvas state and enter the viewport transform.
55
+ preparePlaybackFrameCanvas(context);
56
+ beginPlaybackFrameViewportTransform(context, sceneContext);
57
+
58
+ // Step 3: Draw the split background, pipes, birds, and trails in order.
59
+ renderPlaybackFrameBackground(context, renderState, sceneContext);
60
+ renderPlaybackFramePipes(context, renderState, sceneContext);
61
+ renderPlaybackFrameBirds(
62
+ context,
63
+ renderState,
64
+ sceneContext,
65
+ renderPlaybackBird,
66
+ );
67
+ renderPlaybackFrameTrails(
68
+ context,
69
+ renderState,
70
+ trailState,
71
+ sceneContext,
72
+ resolvePlaybackTrailStyle,
73
+ drawTrail,
74
+ );
75
+
76
+ // Step 4: Restore the caller canvas state after viewport-space drawing.
77
+ finalizePlaybackFrameCanvas(context);
78
+ }
79
+
80
+ /**
81
+ * Updates the trail cache from the latest frame snapshot.
82
+ *
83
+ * The renderer intentionally keeps only a short champion trail instead of full
84
+ * history for every bird, which keeps the visual emphasis clear and the per-frame
85
+ * work small.
86
+ *
87
+ * @param trailState - Mutable trail state.
88
+ * @param renderState - Current render state.
89
+ * @returns Nothing.
90
+ */
91
+ export function updateTrailState(
92
+ trailState: TrailState,
93
+ renderState: PopulationRenderState,
94
+ ): void {
95
+ // Step 1: Resolve the current champion so only one short trail is retained.
96
+ const championBirdIndex = resolveChampionBirdIndex(renderState);
97
+
98
+ // Step 2: Reset all non-champion trails to avoid per-frame trail work.
99
+ renderState.birds.forEach((bird, birdIndex) => {
100
+ if (!trailState.birdTrailsY[birdIndex]) {
101
+ trailState.birdTrailsY[birdIndex] = [];
102
+ }
103
+ const birdTrail = trailState.birdTrailsY[birdIndex];
104
+
105
+ if (bird.done || birdIndex !== championBirdIndex) {
106
+ birdTrail.length = 0;
107
+ return;
108
+ }
109
+
110
+ // Step 3: Keep a short trail only for the current champion bird.
111
+ pushChampionTrailPoint(birdTrail, renderState.frameIndex, bird.yPx);
112
+ });
113
+ }
@@ -0,0 +1,35 @@
1
+ import type {
2
+ PopulationRenderState,
3
+ TrailState,
4
+ } from '../../browser-entry.types';
5
+ import {
6
+ beginPlaybackFrameViewportTransform,
7
+ finalizePlaybackFrameCanvas,
8
+ preparePlaybackFrameCanvas,
9
+ } from './playback.frame-render.canvas.services';
10
+ import {
11
+ renderPlaybackFrameBackground,
12
+ renderPlaybackFrameBirds,
13
+ renderPlaybackFramePipes,
14
+ renderPlaybackFrameTrails,
15
+ } from './playback.frame-render.entity.services';
16
+ import { resolvePlaybackFrameSceneContext } from './playback.frame-render.scene.services';
17
+ import type {
18
+ PlaybackBirdRenderer,
19
+ PlaybackFrameSceneContext,
20
+ PlaybackTrailRenderer,
21
+ PlaybackTrailRenderStyle,
22
+ PlaybackTrailStyleResolver,
23
+ } from './playback.frame-render.types';
24
+ export {
25
+ beginPlaybackFrameViewportTransform,
26
+ finalizePlaybackFrameCanvas,
27
+ preparePlaybackFrameCanvas,
28
+ } from './playback.frame-render.canvas.services';
29
+ export {
30
+ renderPlaybackFrameBackground,
31
+ renderPlaybackFrameBirds,
32
+ renderPlaybackFramePipes,
33
+ renderPlaybackFrameTrails,
34
+ } from './playback.frame-render.entity.services';
35
+ export { resolvePlaybackFrameSceneContext } from './playback.frame-render.scene.services';
@@ -0,0 +1,248 @@
1
+ import {
2
+ FLAPPY_NEON_PALETTE,
3
+ FLAPPY_NON_CHAMPION_OPACITY,
4
+ FLAPPY_PIPE_SPEED_PX_PER_FRAME,
5
+ FLAPPY_TRAIL_LINE_WIDTH_PX,
6
+ FLAPPY_TRAIL_MIN_HORIZONTAL_SEGMENT_PX,
7
+ FLAPPY_TRAIL_MIN_VERTICAL_SEGMENT_PX,
8
+ FLAPPY_TRAIL_OPACITY_FACTOR,
9
+ } from '../../../constants/constants';
10
+ import type { TrailPoint } from '../../browser-entry.types';
11
+ import {
12
+ resolveEdgeOpacityFactor,
13
+ resolveTrailLifetimeOpacityFactor,
14
+ } from '../playback.trail.utils';
15
+ import type { PlaybackEdgeBounds } from '../playback.types';
16
+ import type { PlaybackTrailRenderStyle } from './playback.frame-render.types';
17
+
18
+ /**
19
+ * Detailed trail-painting helpers for playback frames.
20
+ *
21
+ * Trails are rendered as stepped segments with both lifetime fading and edge
22
+ * fading so motion remains legible without overwhelming the scene.
23
+ */
24
+
25
+ /**
26
+ * Resolves the trail style used for one bird's stepped trail.
27
+ *
28
+ * Champion trails are emphasized while non-champion trails, when present, are
29
+ * intentionally subdued.
30
+ *
31
+ * @param birdIndex - Index of the bird being rendered.
32
+ * @param championBirdIndex - Champion index for the current frame.
33
+ * @returns Base opacity and color for the bird trail.
34
+ */
35
+ export function resolvePlaybackTrailStyle(
36
+ birdIndex: number,
37
+ championBirdIndex: number,
38
+ ): PlaybackTrailRenderStyle {
39
+ const isChampionBird = birdIndex === championBirdIndex;
40
+ return {
41
+ baseOpacity:
42
+ (isChampionBird ? 1 : FLAPPY_NON_CHAMPION_OPACITY) *
43
+ FLAPPY_TRAIL_OPACITY_FACTOR,
44
+ trailColor: isChampionBird
45
+ ? FLAPPY_NEON_PALETTE.trail
46
+ : FLAPPY_NEON_PALETTE.nonChampionBird,
47
+ };
48
+ }
49
+
50
+ /**
51
+ * Draws the stepped trail history for one active bird.
52
+ *
53
+ * The stepped shape makes the trajectory feel more schematic and readable than a
54
+ * perfectly smooth spline, which fits the overall instrument-panel aesthetic.
55
+ *
56
+ * @param context - Canvas 2D drawing context.
57
+ * @param trailPoints - Cached per-frame trail points for one bird.
58
+ * @param color - Stroke color for the trail.
59
+ * @param anchorX - Bird anchor x-position in world space.
60
+ * @param baseOpacity - Base opacity before edge and lifetime fading.
61
+ * @param edgeBounds - Visible world bounds used for edge fading.
62
+ * @returns Nothing.
63
+ */
64
+ export function drawTrail(
65
+ context: CanvasRenderingContext2D,
66
+ trailPoints: TrailPoint[],
67
+ color: string,
68
+ anchorX: number,
69
+ baseOpacity: number,
70
+ edgeBounds: PlaybackEdgeBounds,
71
+ ): void {
72
+ if (trailPoints.length === 0) {
73
+ return;
74
+ }
75
+
76
+ const latestTrailFrameIndex = trailPoints.at(-1)?.frameIndex ?? 0;
77
+ const firstTrailPoint = trailPoints[0];
78
+ const firstTrailFrameOffset = Math.max(
79
+ 0,
80
+ latestTrailFrameIndex - firstTrailPoint.frameIndex,
81
+ );
82
+ let previousXPosition =
83
+ anchorX - firstTrailFrameOffset * FLAPPY_PIPE_SPEED_PX_PER_FRAME;
84
+ let previousYPosition = firstTrailPoint.yPx;
85
+ let previousFrameOffset = firstTrailFrameOffset;
86
+ const maximumTrailFrameOffset = Math.max(1, firstTrailFrameOffset);
87
+
88
+ const previousGlobalAlpha = context.globalAlpha;
89
+ context.strokeStyle = color;
90
+ context.lineWidth = FLAPPY_TRAIL_LINE_WIDTH_PX;
91
+
92
+ trailPoints.slice(1).forEach((trailPoint) => {
93
+ const frameOffset = Math.max(
94
+ 0,
95
+ latestTrailFrameIndex - trailPoint.frameIndex,
96
+ );
97
+ const nextXPosition =
98
+ anchorX - frameOffset * FLAPPY_PIPE_SPEED_PX_PER_FRAME;
99
+ const nextYPosition = trailPoint.yPx;
100
+
101
+ const horizontalDeltaPx = nextXPosition - previousXPosition;
102
+ const horizontalDirection = Math.sign(horizontalDeltaPx) || 1;
103
+ const steppedHorizontalLengthPx = Math.max(
104
+ Math.abs(horizontalDeltaPx),
105
+ FLAPPY_TRAIL_MIN_HORIZONTAL_SEGMENT_PX,
106
+ );
107
+ const steppedHorizontalXPosition =
108
+ previousXPosition + horizontalDirection * steppedHorizontalLengthPx;
109
+ drawTrailSegmentWithEdgeFade(
110
+ context,
111
+ previousXPosition,
112
+ previousYPosition,
113
+ steppedHorizontalXPosition,
114
+ previousYPosition,
115
+ baseOpacity,
116
+ edgeBounds,
117
+ previousFrameOffset,
118
+ frameOffset,
119
+ maximumTrailFrameOffset,
120
+ );
121
+ previousXPosition = steppedHorizontalXPosition;
122
+
123
+ const verticalDeltaPx = nextYPosition - previousYPosition;
124
+ if (verticalDeltaPx !== 0) {
125
+ const verticalDirection = Math.sign(verticalDeltaPx);
126
+ const steppedVerticalLengthPx = Math.max(
127
+ Math.abs(verticalDeltaPx),
128
+ FLAPPY_TRAIL_MIN_VERTICAL_SEGMENT_PX,
129
+ );
130
+ const steppedVerticalYPosition =
131
+ previousYPosition + verticalDirection * steppedVerticalLengthPx;
132
+ drawTrailSegmentWithEdgeFade(
133
+ context,
134
+ previousXPosition,
135
+ previousYPosition,
136
+ steppedHorizontalXPosition,
137
+ steppedVerticalYPosition,
138
+ baseOpacity,
139
+ edgeBounds,
140
+ previousFrameOffset,
141
+ frameOffset,
142
+ maximumTrailFrameOffset,
143
+ );
144
+ previousYPosition = steppedVerticalYPosition;
145
+ }
146
+
147
+ drawTrailSegmentWithEdgeFade(
148
+ context,
149
+ previousXPosition,
150
+ previousYPosition,
151
+ steppedHorizontalXPosition,
152
+ nextYPosition,
153
+ baseOpacity,
154
+ edgeBounds,
155
+ previousFrameOffset,
156
+ frameOffset,
157
+ maximumTrailFrameOffset,
158
+ );
159
+ previousYPosition = nextYPosition;
160
+
161
+ drawTrailSegmentWithEdgeFade(
162
+ context,
163
+ previousXPosition,
164
+ previousYPosition,
165
+ nextXPosition,
166
+ nextYPosition,
167
+ baseOpacity,
168
+ edgeBounds,
169
+ previousFrameOffset,
170
+ frameOffset,
171
+ maximumTrailFrameOffset,
172
+ );
173
+ previousXPosition = nextXPosition;
174
+ previousYPosition = nextYPosition;
175
+ previousFrameOffset = frameOffset;
176
+ });
177
+
178
+ context.globalAlpha = previousGlobalAlpha;
179
+ }
180
+
181
+ /**
182
+ * Draws one trail segment with combined edge and lifetime fading.
183
+ *
184
+ * Two independent fade signals are combined here: old segments dim over time,
185
+ * and segments near the viewport edge fade to avoid harsh clipping.
186
+ *
187
+ * @param context - Canvas 2D drawing context.
188
+ * @param startXPx - Segment start x-position.
189
+ * @param startYPx - Segment start y-position.
190
+ * @param endXPx - Segment end x-position.
191
+ * @param endYPx - Segment end y-position.
192
+ * @param baseOpacity - Base opacity before fade factors.
193
+ * @param edgeBounds - Visible world bounds used for edge fading.
194
+ * @param startFrameOffset - Relative age of the segment start.
195
+ * @param endFrameOffset - Relative age of the segment end.
196
+ * @param maximumTrailFrameOffset - Oldest visible trail age.
197
+ * @returns Nothing.
198
+ */
199
+ function drawTrailSegmentWithEdgeFade(
200
+ context: CanvasRenderingContext2D,
201
+ startXPx: number,
202
+ startYPx: number,
203
+ endXPx: number,
204
+ endYPx: number,
205
+ baseOpacity: number,
206
+ edgeBounds: PlaybackEdgeBounds,
207
+ startFrameOffset: number,
208
+ endFrameOffset: number,
209
+ maximumTrailFrameOffset: number,
210
+ ): void {
211
+ const segmentLengthPx = Math.hypot(endXPx - startXPx, endYPx - startYPx);
212
+ if (segmentLengthPx === 0 || baseOpacity <= 0) {
213
+ return;
214
+ }
215
+
216
+ const startOpacityFactor = resolveEdgeOpacityFactor(
217
+ startXPx,
218
+ startYPx,
219
+ edgeBounds,
220
+ );
221
+ const endOpacityFactor = resolveEdgeOpacityFactor(endXPx, endYPx, edgeBounds);
222
+ const edgeOpacityFactor = Math.min(startOpacityFactor, endOpacityFactor);
223
+
224
+ const startLifetimeOpacityFactor = resolveTrailLifetimeOpacityFactor(
225
+ startFrameOffset,
226
+ maximumTrailFrameOffset,
227
+ );
228
+ const endLifetimeOpacityFactor = resolveTrailLifetimeOpacityFactor(
229
+ endFrameOffset,
230
+ maximumTrailFrameOffset,
231
+ );
232
+ const lifetimeOpacityFactor = Math.min(
233
+ startLifetimeOpacityFactor,
234
+ endLifetimeOpacityFactor,
235
+ );
236
+
237
+ const segmentOpacity =
238
+ baseOpacity * edgeOpacityFactor * lifetimeOpacityFactor;
239
+ if (segmentOpacity <= 0) {
240
+ return;
241
+ }
242
+
243
+ context.globalAlpha = segmentOpacity;
244
+ context.beginPath();
245
+ context.moveTo(startXPx, startYPx);
246
+ context.lineTo(endXPx, endYPx);
247
+ context.stroke();
248
+ }
@@ -0,0 +1,103 @@
1
+ import { resolveWorldViewport } from '../../browser-entry.viewport.utils';
2
+ import type { TrailPoint } from '../../browser-entry.types';
3
+ import type { PlaybackEdgeBounds } from '../playback.types';
4
+ import type { PlaybackBirdRenderStyle } from '../playback.render.utils';
5
+
6
+ /**
7
+ * Local type contracts for playback frame rendering.
8
+ *
9
+ * These types are extracted from the broader frame renderer so scene state,
10
+ * bird geometry, and trail styling can evolve behind a dedicated module
11
+ * boundary.
12
+ *
13
+ * Together they describe the inputs and intermediate state needed to paint one
14
+ * world-space frame on the browser canvas.
15
+ */
16
+
17
+ /**
18
+ * Shared scene contract used by one playback frame render pass.
19
+ *
20
+ * This collects the camera, viewport, and champion metadata that multiple frame
21
+ * render helpers need during the same paint pass.
22
+ */
23
+ export type PlaybackFrameSceneContext = {
24
+ viewport: ReturnType<typeof resolveWorldViewport>;
25
+ visibleWorldWidthPx: number;
26
+ visibleWorldHeightPx: number;
27
+ cameraLeftPx: number;
28
+ championBirdIndex: number;
29
+ edgeBounds: PlaybackEdgeBounds;
30
+ };
31
+
32
+ /**
33
+ * Pixel-aligned square geometry used by bird paint helpers.
34
+ *
35
+ * Bird geometry is resolved once so the detailed bird renderer can reuse a
36
+ * stable square body box across glow and fill passes.
37
+ */
38
+ export type PlaybackBirdGeometry = {
39
+ birdSideLengthPx: number;
40
+ birdLeftPx: number;
41
+ birdTopPx: number;
42
+ };
43
+
44
+ /**
45
+ * Resolved opacity and color for one bird trail render pass.
46
+ *
47
+ * Trails use a lighter-weight style record than birds because they only need a
48
+ * base opacity plus stroke color.
49
+ */
50
+ export type PlaybackTrailRenderStyle = {
51
+ baseOpacity: number;
52
+ trailColor: string;
53
+ };
54
+
55
+ /**
56
+ * Bird body renderer contract used by frame-render orchestration helpers.
57
+ *
58
+ * Keeping the renderer as an injected function makes the high-level frame pass
59
+ * independent from the detailed bird-paint implementation.
60
+ */
61
+ export type PlaybackBirdRenderer = (
62
+ context: CanvasRenderingContext2D,
63
+ birdYPx: number,
64
+ birdIndex: number,
65
+ championBirdIndex: number,
66
+ ) => void;
67
+
68
+ /**
69
+ * Trail style resolver used by frame-render orchestration helpers.
70
+ *
71
+ * This lets orchestration ask for champion-vs-non-champion trail styling
72
+ * without embedding color policy directly in the frame pass.
73
+ */
74
+ export type PlaybackTrailStyleResolver = (
75
+ birdIndex: number,
76
+ championBirdIndex: number,
77
+ ) => PlaybackTrailRenderStyle;
78
+
79
+ /**
80
+ * Trail segment renderer used by frame-render orchestration helpers.
81
+ *
82
+ * The detailed trail painter owns edge fading and stepped segments; the frame
83
+ * orchestration only decides when to call it.
84
+ */
85
+ export type PlaybackTrailRenderer = (
86
+ context: CanvasRenderingContext2D,
87
+ trailPoints: TrailPoint[],
88
+ color: string,
89
+ anchorX: number,
90
+ baseOpacity: number,
91
+ edgeBounds: PlaybackEdgeBounds,
92
+ ) => void;
93
+
94
+ /**
95
+ * Bird-paint input shared by the bird render helper module.
96
+ *
97
+ * This combines geometry and style into one small input object for lower-level
98
+ * drawing helpers.
99
+ */
100
+ export type PlaybackBirdPaintInput = {
101
+ birdGeometry: PlaybackBirdGeometry;
102
+ birdRenderStyle: PlaybackBirdRenderStyle;
103
+ };
@@ -0,0 +1,11 @@
1
+ export {
2
+ drawChampionPlaybackBirdGlow,
3
+ drawPlaybackBirdBody,
4
+ renderPlaybackBird,
5
+ resolvePlaybackBirdBodyGlowBlur,
6
+ resolvePlaybackBirdGeometry,
7
+ } from './playback.frame-render.bird.utils';
8
+ export {
9
+ drawTrail,
10
+ resolvePlaybackTrailStyle,
11
+ } from './playback.frame-render.trail.utils';
@@ -1,4 +1,4 @@
1
- import type { StarTile } from './playback.types';
1
+ import type { StarTile } from './playback.starfield.types';
2
2
 
3
3
  /**
4
4
  * Shared in-memory cache for pre-rendered parallax starfield tiles.
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Compatibility facade for playback frame rendering.
3
+ *
4
+ * Older imports still reach the frame renderer through this file while the
5
+ * implementation now lives in the dedicated frame-render folder.
6
+ */
7
+ export {
8
+ renderPopulationFrame,
9
+ updateTrailState,
10
+ } from './frame-render/playback.frame-render.service';