@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,268 @@
1
+ import {
2
+ FLAPPY_STARFIELD_CANVAS_CONTEXT_ID,
3
+ FLAPPY_STARFIELD_CYAN_FILL_STYLE,
4
+ FLAPPY_STARFIELD_COMPOSITE_SOURCE_OVER,
5
+ FLAPPY_STARFIELD_FULL_ALPHA,
6
+ FLAPPY_STARFIELD_INCLUSIVE_RANGE_OFFSET,
7
+ FLAPPY_STARFIELD_MIN_DIMENSION_PX,
8
+ FLAPPY_STARFIELD_ORIGIN_PX,
9
+ } from '../../constants/constants';
10
+ import { createSeededRandom } from './playback.starfield.utils';
11
+ import type {
12
+ CreateStarTileCanvasOptions,
13
+ StarfieldCanvasDimensions,
14
+ StarPlacement,
15
+ StarTileImage,
16
+ } from './playback.starfield.types';
17
+
18
+ /**
19
+ * Pre-renders a deterministic tile that can be reused across animation frames.
20
+ *
21
+ * @param options - Declarative drawing recipe for one parallax layer.
22
+ * @returns Canvas image source containing the rendered star strip.
23
+ */
24
+ export function createStarTileCanvas(
25
+ options: CreateStarTileCanvasOptions,
26
+ ): StarTileImage {
27
+ // Step 1: Allocate a compatible canvas for the requested tile dimensions.
28
+ const canvas = createCompatibleCanvas(
29
+ options.tileWidthPx,
30
+ options.tileHeightPx,
31
+ );
32
+
33
+ // Step 2: Resolve a 2D context when the runtime can actually render.
34
+ const tileContext = resolveStarTileContext(canvas);
35
+ if (!tileContext) {
36
+ return canvas;
37
+ }
38
+
39
+ // Step 3: Initialize drawing state and render deterministic stars.
40
+ const seededRandom = createSeededRandom(options.seed);
41
+ initializeStarTileContext({
42
+ tileContext,
43
+ canvas,
44
+ });
45
+ renderSeededStars({
46
+ tileContext,
47
+ seededRandom,
48
+ canvasOptions: options,
49
+ });
50
+
51
+ // Step 4: Restore neutral drawing state before handing the canvas back.
52
+ resetStarTileContext(tileContext);
53
+ return canvas;
54
+ }
55
+
56
+ /**
57
+ * Creates a browser-compatible canvas with clamped integer dimensions.
58
+ *
59
+ * @param widthPx - Requested tile width in pixels.
60
+ * @param heightPx - Requested tile height in pixels.
61
+ * @returns Offscreen canvas when supported, otherwise a DOM canvas fallback.
62
+ */
63
+ function createCompatibleCanvas(
64
+ widthPx: number,
65
+ heightPx: number,
66
+ ): HTMLCanvasElement | OffscreenCanvas {
67
+ const canvasDimensions = normalizeCanvasDimensions(widthPx, heightPx);
68
+ const offscreenCanvas = createOffscreenCanvasIfSupported(canvasDimensions);
69
+ if (offscreenCanvas) {
70
+ return offscreenCanvas;
71
+ }
72
+
73
+ const documentCanvas = createDocumentCanvasIfSupported(canvasDimensions);
74
+ if (documentCanvas) {
75
+ return documentCanvas;
76
+ }
77
+
78
+ return createCanvasSizeFallback(canvasDimensions);
79
+ }
80
+
81
+ /**
82
+ * Resolves the rendering context used for star tile pre-rendering.
83
+ *
84
+ * @param canvas - Compatible canvas returned by the runtime-specific factory.
85
+ * @returns A 2D drawing context when rendering is supported.
86
+ */
87
+ function resolveStarTileContext(
88
+ canvas: HTMLCanvasElement | OffscreenCanvas,
89
+ ): OffscreenCanvasRenderingContext2D | CanvasRenderingContext2D | null {
90
+ return canvas.getContext(FLAPPY_STARFIELD_CANVAS_CONTEXT_ID) as
91
+ | OffscreenCanvasRenderingContext2D
92
+ | CanvasRenderingContext2D
93
+ | null;
94
+ }
95
+
96
+ /**
97
+ * Clears the canvas and applies the neutral settings shared by all rendered stars.
98
+ *
99
+ * @param options - Context initialization dependencies.
100
+ * @returns Nothing. The provided context is mutated in place.
101
+ */
102
+ function initializeStarTileContext(options: {
103
+ tileContext: OffscreenCanvasRenderingContext2D | CanvasRenderingContext2D;
104
+ canvas: HTMLCanvasElement | OffscreenCanvas;
105
+ }): void {
106
+ options.tileContext.clearRect(
107
+ FLAPPY_STARFIELD_ORIGIN_PX,
108
+ FLAPPY_STARFIELD_ORIGIN_PX,
109
+ options.canvas.width,
110
+ options.canvas.height,
111
+ );
112
+ options.tileContext.globalCompositeOperation =
113
+ FLAPPY_STARFIELD_COMPOSITE_SOURCE_OVER;
114
+ }
115
+
116
+ /**
117
+ * Draws all stars for one tile using a seeded random source.
118
+ *
119
+ * @param options - Drawing context, seed source, and tile recipe.
120
+ * @returns Nothing. The provided context is mutated in place.
121
+ */
122
+ function renderSeededStars(options: {
123
+ tileContext: OffscreenCanvasRenderingContext2D | CanvasRenderingContext2D;
124
+ seededRandom: () => number;
125
+ canvasOptions: CreateStarTileCanvasOptions;
126
+ }): void {
127
+ for (
128
+ let starIndex = 0;
129
+ starIndex < options.canvasOptions.starCount;
130
+ starIndex += 1
131
+ ) {
132
+ const starPlacement = resolveStarPlacement({
133
+ seededRandom: options.seededRandom,
134
+ tileWidthPx: options.canvasOptions.tileWidthPx,
135
+ tileHeightPx: options.canvasOptions.tileHeightPx,
136
+ minSizePx: options.canvasOptions.minSizePx,
137
+ maxSizePx: options.canvasOptions.maxSizePx,
138
+ minAlpha: options.canvasOptions.minAlpha,
139
+ maxAlpha: options.canvasOptions.maxAlpha,
140
+ });
141
+
142
+ options.tileContext.globalAlpha = starPlacement.alpha;
143
+ options.tileContext.fillStyle = FLAPPY_STARFIELD_CYAN_FILL_STYLE;
144
+ options.tileContext.fillRect(
145
+ starPlacement.xPx,
146
+ starPlacement.yPx,
147
+ starPlacement.sizePx,
148
+ starPlacement.sizePx,
149
+ );
150
+ }
151
+ }
152
+
153
+ /**
154
+ * Restores neutral drawing state so later canvas consumers start from defaults.
155
+ *
156
+ * @param tileContext - 2D context used to render the star tile.
157
+ * @returns Nothing. The provided context is mutated in place.
158
+ */
159
+ function resetStarTileContext(
160
+ tileContext: OffscreenCanvasRenderingContext2D | CanvasRenderingContext2D,
161
+ ): void {
162
+ tileContext.globalAlpha = FLAPPY_STARFIELD_FULL_ALPHA;
163
+ }
164
+
165
+ /**
166
+ * Normalizes requested canvas dimensions into positive integer pixel sizes.
167
+ *
168
+ * @param widthPx - Requested width in pixels.
169
+ * @param heightPx - Requested height in pixels.
170
+ * @returns Clamped integer dimensions safe for canvas allocation.
171
+ */
172
+ function normalizeCanvasDimensions(
173
+ widthPx: number,
174
+ heightPx: number,
175
+ ): StarfieldCanvasDimensions {
176
+ return {
177
+ width: Math.max(FLAPPY_STARFIELD_MIN_DIMENSION_PX, Math.round(widthPx)),
178
+ height: Math.max(FLAPPY_STARFIELD_MIN_DIMENSION_PX, Math.round(heightPx)),
179
+ };
180
+ }
181
+
182
+ /**
183
+ * Creates an offscreen canvas when the current runtime supports it.
184
+ *
185
+ * @param canvasDimensions - Already-normalized pixel dimensions.
186
+ * @returns Offscreen canvas instance or `null` when unavailable.
187
+ */
188
+ function createOffscreenCanvasIfSupported(
189
+ canvasDimensions: StarfieldCanvasDimensions,
190
+ ): OffscreenCanvas | null {
191
+ if (typeof OffscreenCanvas !== 'undefined') {
192
+ return new OffscreenCanvas(canvasDimensions.width, canvasDimensions.height);
193
+ }
194
+
195
+ return null;
196
+ }
197
+
198
+ /**
199
+ * Creates a DOM canvas when document APIs are available.
200
+ *
201
+ * @param canvasDimensions - Already-normalized pixel dimensions.
202
+ * @returns DOM canvas instance or `null` when unavailable.
203
+ */
204
+ function createDocumentCanvasIfSupported(
205
+ canvasDimensions: StarfieldCanvasDimensions,
206
+ ): HTMLCanvasElement | null {
207
+ if (typeof document !== 'undefined') {
208
+ const canvas = document.createElement('canvas');
209
+ canvas.width = canvasDimensions.width;
210
+ canvas.height = canvasDimensions.height;
211
+ return canvas;
212
+ }
213
+
214
+ return null;
215
+ }
216
+
217
+ /**
218
+ * Creates a size-only fallback so non-browser tests can skip rendering safely.
219
+ *
220
+ * @param canvasDimensions - Already-normalized pixel dimensions.
221
+ * @returns Minimal canvas-shaped object cast to the compatible return type.
222
+ */
223
+ function createCanvasSizeFallback(
224
+ canvasDimensions: StarfieldCanvasDimensions,
225
+ ): HTMLCanvasElement {
226
+ const canvas = {
227
+ width: canvasDimensions.width,
228
+ height: canvasDimensions.height,
229
+ } as Partial<HTMLCanvasElement> as HTMLCanvasElement;
230
+ return canvas;
231
+ }
232
+
233
+ /**
234
+ * Resolves one deterministic star placement and appearance from the seeded RNG.
235
+ *
236
+ * @param options - Random source and star placement bounds.
237
+ * @returns Pixel location, square size, and alpha for one rendered star.
238
+ */
239
+ function resolveStarPlacement(options: {
240
+ seededRandom: () => number;
241
+ tileWidthPx: number;
242
+ tileHeightPx: number;
243
+ minSizePx: number;
244
+ maxSizePx: number;
245
+ minAlpha: number;
246
+ maxAlpha: number;
247
+ }): StarPlacement {
248
+ const xPx = Math.floor(options.seededRandom() * options.tileWidthPx);
249
+ const yPx = Math.floor(options.seededRandom() * options.tileHeightPx);
250
+ const sizePx =
251
+ options.minSizePx +
252
+ Math.floor(
253
+ options.seededRandom() *
254
+ (options.maxSizePx -
255
+ options.minSizePx +
256
+ FLAPPY_STARFIELD_INCLUSIVE_RANGE_OFFSET),
257
+ );
258
+ const alpha =
259
+ options.minAlpha +
260
+ options.seededRandom() * (options.maxAlpha - options.minAlpha);
261
+
262
+ return {
263
+ xPx,
264
+ yPx,
265
+ sizePx,
266
+ alpha,
267
+ };
268
+ }
@@ -0,0 +1,91 @@
1
+ /**
2
+ * Starfield and parallax rendering contracts for playback backgrounds.
3
+ *
4
+ * The playback view uses a cached layered starfield to add depth without paying
5
+ * a large per-frame rendering cost. These types define the tile, layer, and
6
+ * deterministic placement data needed for that effect.
7
+ */
8
+
9
+ /**
10
+ * Shared type contract for starfield tile rendering layers.
11
+ *
12
+ * A tile is pre-rendered and repeated horizontally to draw efficient
13
+ * parallax backgrounds during playback.
14
+ */
15
+ export type StarTileImage = HTMLCanvasElement | OffscreenCanvas;
16
+
17
+ /**
18
+ * Shared type contract for starfield tile rendering layers.
19
+ *
20
+ * A tile is pre-rendered and repeated horizontally to draw efficient
21
+ * parallax backgrounds during playback.
22
+ *
23
+ * Separating the image type from the tile record lets the same starfield logic
24
+ * work with ordinary canvases and `OffscreenCanvas` when available.
25
+ */
26
+ export type StarTile = {
27
+ image: StarTileImage;
28
+ tileWidthPx: number;
29
+ tileHeightPx: number;
30
+ scrollRatio: number;
31
+ };
32
+
33
+ /**
34
+ * Declarative recipe for building one cached starfield parallax layer.
35
+ *
36
+ * Each layer spec describes how dense, bright, blurred, and fast one visual
37
+ * depth plane should feel.
38
+ */
39
+ export type PlaybackStarfieldLayerSpec = {
40
+ seed: number;
41
+ scrollRatio: number;
42
+ starCount: number;
43
+ minSizePx: number;
44
+ maxSizePx: number;
45
+ minAlpha: number;
46
+ maxAlpha: number;
47
+ blurPx: number;
48
+ };
49
+
50
+ /**
51
+ * Input contract for pre-rendering one deterministic starfield tile.
52
+ *
53
+ * The generated tile is cached and repeated horizontally during playback,
54
+ * so every field here affects both the visual look and the parallax cost.
55
+ */
56
+ export type CreateStarTileCanvasOptions = {
57
+ seed: number;
58
+ tileWidthPx: number;
59
+ tileHeightPx: number;
60
+ starCount: number;
61
+ minSizePx: number;
62
+ maxSizePx: number;
63
+ minAlpha: number;
64
+ maxAlpha: number;
65
+ blurPx: number;
66
+ };
67
+
68
+ /**
69
+ * Normalized canvas dimensions used by browser and offscreen tile creation.
70
+ *
71
+ * The creation path works with both `HTMLCanvasElement` and `OffscreenCanvas`,
72
+ * so dimensions are stored in a narrow shared shape rather than tied to one DOM
73
+ * type.
74
+ */
75
+ export type StarfieldCanvasDimensions = {
76
+ width: number;
77
+ height: number;
78
+ };
79
+
80
+ /**
81
+ * Deterministic placement and appearance for one rendered star sprite.
82
+ *
83
+ * Determinism matters here because cached starfield tiles should remain stable
84
+ * across redraws instead of sparkling randomly every frame.
85
+ */
86
+ export type StarPlacement = {
87
+ xPx: number;
88
+ yPx: number;
89
+ sizePx: number;
90
+ alpha: number;
91
+ };
@@ -1,3 +1,10 @@
1
+ import {
2
+ FLAPPY_STARFIELD_UNSIGNED_NORMALIZATION_DIVISOR,
3
+ FLAPPY_STARFIELD_XORSHIFT_LEFT_SHIFT_FINAL,
4
+ FLAPPY_STARFIELD_XORSHIFT_LEFT_SHIFT_PRIMARY,
5
+ FLAPPY_STARFIELD_XORSHIFT_RIGHT_SHIFT,
6
+ } from '../../constants/constants';
7
+
1
8
  /**
2
9
  * Creates a deterministic pseudo-random generator for starfield tile layouts.
3
10
  *
@@ -9,15 +16,15 @@ export function createSeededRandom(seed: number): () => number {
9
16
 
10
17
  return () => {
11
18
  // Step 1: Apply xorshift32 state transitions.
12
- randomState ^= randomState << 13;
19
+ randomState ^= randomState << FLAPPY_STARFIELD_XORSHIFT_LEFT_SHIFT_PRIMARY;
13
20
  randomState >>>= 0;
14
- randomState ^= randomState >> 17;
21
+ randomState ^= randomState >> FLAPPY_STARFIELD_XORSHIFT_RIGHT_SHIFT;
15
22
  randomState >>>= 0;
16
- randomState ^= randomState << 5;
23
+ randomState ^= randomState << FLAPPY_STARFIELD_XORSHIFT_LEFT_SHIFT_FINAL;
17
24
  randomState >>>= 0;
18
25
 
19
26
  // Step 2: Normalize 32-bit unsigned state into [0, 1).
20
- return randomState / 0x1_0000_0000;
27
+ return randomState / FLAPPY_STARFIELD_UNSIGNED_NORMALIZATION_DIVISOR;
21
28
  };
22
29
  }
23
30
 
@@ -1,86 +1,9 @@
1
- import {
2
- FLAPPY_TRAIL_EDGE_FADE_DISTANCE_PX,
3
- FLAPPY_TRAIL_MAX_POINTS,
4
- } from '../../constants/constants';
5
- import type { PlaybackEdgeBounds } from './playback.types';
6
- import type { TrailPoint } from '../browser-entry.types';
7
-
8
- /**
9
- * Appends one trail point while enforcing max retained history length.
10
- *
11
- * @param trailPoints - Mutable trail collection.
12
- * @param frameIndex - Source frame index.
13
- * @param yPosition - Bird y position.
14
- * @returns Nothing.
15
- */
16
- export function pushTrailPoint(
17
- trailPoints: TrailPoint[],
18
- frameIndex: number,
19
- yPosition: number,
20
- ): void {
21
- trailPoints.push({ frameIndex, yPx: yPosition });
22
- const maxTrailPoints = FLAPPY_TRAIL_MAX_POINTS;
23
- if (trailPoints.length > maxTrailPoints) {
24
- trailPoints.splice(0, trailPoints.length - maxTrailPoints);
25
- }
26
- }
27
-
28
- /**
29
- * Converts distance-to-edge into a normalized opacity factor.
30
- *
31
- * Returns 0 exactly on or beyond an edge and rises to 1 once distance exceeds
32
- * the configured fade band.
33
- *
34
- * @param pointXPx - Point x position.
35
- * @param pointYPx - Point y position.
36
- * @param edgeBounds - Visible world bounds used for edge distance checks.
37
- * @returns Opacity multiplier in [0, 1].
38
- */
39
- export function resolveEdgeOpacityFactor(
40
- pointXPx: number,
41
- pointYPx: number,
42
- edgeBounds: PlaybackEdgeBounds,
43
- ): number {
44
- const distanceToLeftEdgePx = pointXPx - edgeBounds.leftXPx;
45
- const distanceToRightEdgePx = edgeBounds.rightXPx - pointXPx;
46
- const distanceToTopEdgePx = pointYPx - edgeBounds.topYPx;
47
- const distanceToBottomEdgePx = edgeBounds.bottomYPx - pointYPx;
48
-
49
- const nearestEdgeDistancePx = Math.min(
50
- distanceToLeftEdgePx,
51
- distanceToRightEdgePx,
52
- distanceToTopEdgePx,
53
- distanceToBottomEdgePx,
54
- );
55
- const fadeProgress =
56
- nearestEdgeDistancePx / FLAPPY_TRAIL_EDGE_FADE_DISTANCE_PX;
57
- return clamp01(fadeProgress);
58
- }
59
-
60
- /**
61
- * Converts trail age into a normalized opacity factor.
62
- *
63
- * Oldest retained history approaches 0 opacity; newest approaches 1.
64
- *
65
- * @param frameOffset - Frames between this point and newest trail point.
66
- * @param maxTrailFrameOffset - Oldest age offset currently retained by trail.
67
- * @returns Opacity multiplier in [0, 1].
68
- */
69
- export function resolveTrailLifetimeOpacityFactor(
70
- frameOffset: number,
71
- maxTrailFrameOffset: number,
72
- ): number {
73
- const normalizedLifetimeProgress =
74
- 1 - frameOffset / Math.max(1, maxTrailFrameOffset);
75
- return clamp01(normalizedLifetimeProgress);
76
- }
77
-
78
- /**
79
- * Clamps a number to the inclusive [0, 1] range.
80
- *
81
- * @param value - Candidate value.
82
- * @returns Clamped value.
83
- */
84
- export function clamp01(value: number): number {
85
- return Math.max(0, Math.min(1, value));
86
- }
1
+ export {
2
+ pushChampionTrailPoint,
3
+ pushTrailPoint,
4
+ } from './trail/playback.trail.history.services';
5
+ export {
6
+ clamp01,
7
+ resolveEdgeOpacityFactor,
8
+ resolveTrailLifetimeOpacityFactor,
9
+ } from './trail/playback.trail.opacity.utils';
@@ -1,26 +1,50 @@
1
1
  import type { PlaybackFrameStats } from '../browser-entry.types';
2
- import { animatePopulationEpisodeInternal } from '../browser-entry.playback.utils';
2
+ import { renderPopulationFrame } from './frame-render/playback.frame-render.service';
3
+ import { runPlaybackLoop } from './playback.iteration.services';
4
+ import type { PlaybackEpisodeSummary } from './playback.orchestration.types';
5
+ import {
6
+ initializePlaybackSessionContext,
7
+ resolvePlaybackEpisodeSummary,
8
+ } from './playback.session.services';
9
+
10
+ export type { PlaybackEpisodeSummary } from './playback.orchestration.types';
11
+
12
+ /**
13
+ * Public playback orchestration for the Flappy Bird browser demo.
14
+ *
15
+ * Playback is the bridge between off-thread simulation and on-screen
16
+ * visualization. The worker advances the world and streams packed snapshots;
17
+ * this layer mirrors enough state locally to animate those snapshots at browser
18
+ * frame cadence, render trails and backgrounds, and emit HUD telemetry.
19
+ */
3
20
 
4
21
  /**
5
22
  * Public playback entry point used by browser runtime orchestration.
6
23
  *
24
+ * Conceptually, this answers: "play one worker-produced episode on the canvas
25
+ * until it is done, and tell me what happened along the way".
26
+ *
7
27
  * @param canvas - Target playback canvas.
8
28
  * @param context - Canvas 2D context.
9
29
  * @param evolutionWorker - Worker owning playback simulation state.
10
30
  * @param onFrameStats - Callback receiving per-frame playback telemetry.
11
31
  * @returns Aggregate playback summary for the current episode.
32
+ * @example
33
+ * ```ts
34
+ * const summary = await animatePopulationEpisode(
35
+ * canvas,
36
+ * context,
37
+ * evolutionWorker,
38
+ * (stats) => updateHud(stats),
39
+ * );
40
+ * ```
12
41
  */
13
42
  export async function animatePopulationEpisode(
14
43
  canvas: HTMLCanvasElement,
15
44
  context: CanvasRenderingContext2D,
16
45
  evolutionWorker: Worker,
17
46
  onFrameStats: (stats: PlaybackFrameStats) => void,
18
- ): Promise<{
19
- averagePipesPassed: number;
20
- p90FramesSurvived: number;
21
- winnerPipesPassed: number;
22
- winnerFramesSurvived: number;
23
- }> {
47
+ ): Promise<PlaybackEpisodeSummary> {
24
48
  return animatePopulationEpisodeInternal(
25
49
  canvas,
26
50
  context,
@@ -28,3 +52,47 @@ export async function animatePopulationEpisode(
28
52
  onFrameStats,
29
53
  );
30
54
  }
55
+
56
+ /**
57
+ * Internal playback orchestration entry retained for compatibility re-exports.
58
+ *
59
+ * The implementation is shared with the public entry so legacy imports and the
60
+ * newer folderized surface behave identically.
61
+ *
62
+ * @param canvas - Target playback canvas.
63
+ * @param context - Canvas 2D context.
64
+ * @param evolutionWorker - Worker owning playback simulation state.
65
+ * @param onFrameStats - Callback receiving per-frame playback telemetry.
66
+ * @returns Aggregate playback summary for the current episode.
67
+ */
68
+ export async function animatePopulationEpisodeInternal(
69
+ canvas: HTMLCanvasElement,
70
+ context: CanvasRenderingContext2D,
71
+ evolutionWorker: Worker,
72
+ onFrameStats: (stats: PlaybackFrameStats) => void,
73
+ ): Promise<PlaybackEpisodeSummary> {
74
+ // Step 1: Initialize worker playback state and local render mirrors.
75
+ const sessionContext = initializePlaybackSessionContext(
76
+ canvas,
77
+ evolutionWorker,
78
+ );
79
+
80
+ // Step 2: Run playback iterations until the worker reports completion.
81
+ await runPlaybackLoop({
82
+ canvas,
83
+ context,
84
+ evolutionWorker,
85
+ onFrameStats,
86
+ sessionContext,
87
+ });
88
+
89
+ // Step 3: Render the final settled frame for the completed episode.
90
+ renderPopulationFrame(
91
+ context,
92
+ sessionContext.renderState,
93
+ sessionContext.trailState,
94
+ );
95
+
96
+ // Step 4: Fold the mutable loop summary into the public return shape.
97
+ return resolvePlaybackEpisodeSummary(sessionContext.loopState.summary);
98
+ }
@@ -1,18 +1,21 @@
1
+ export type {
2
+ PlaybackStarfieldLayerSpec,
3
+ StarTile,
4
+ } from './playback.starfield.types';
5
+
1
6
  /**
2
- * Shared type contract for starfield tile rendering layers.
7
+ * Shared playback utility types for the browser-entry subsystem.
3
8
  *
4
- * A tile is pre-rendered and repeated horizontally to draw efficient
5
- * parallax backgrounds during playback.
9
+ * These types support rendering concerns that cut across multiple playback
10
+ * helpers, such as edge-aware trail fading and cached parallax backgrounds.
6
11
  */
7
- export type StarTile = {
8
- image: CanvasImageSource;
9
- tileWidthPx: number;
10
- tileHeightPx: number;
11
- scrollRatio: number;
12
- };
13
12
 
14
13
  /**
15
14
  * Axis-aligned visible world bounds used for edge-aware trail fading.
15
+ *
16
+ * Trail rendering needs a quick answer to "is this point still visually inside
17
+ * the active world rectangle?" so fading logic can taper paths near the edges
18
+ * instead of drawing abrupt cutoffs.
16
19
  */
17
20
  export type PlaybackEdgeBounds = {
18
21
  leftXPx: number;