@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.
- package/.github/agents/boundary-mapper.agent.md +31 -0
- package/.github/agents/docs-scout.agent.md +29 -0
- package/.github/agents/plan-scout.agent.md +31 -0
- package/.github/agents/solid-split.agent.md +143 -0
- package/.github/copilot-instructions.md +119 -0
- package/.github/skills/solid-split-playbook/SKILL.md +220 -0
- package/.github/skills/solid-split-playbook/assets/docs-checklist.md +34 -0
- package/.github/skills/solid-split-playbook/assets/split-plan-template.md +48 -0
- package/.github/skills/solid-split-playbook/assets/split-workflow-checklist.md +51 -0
- package/.github/skills/trace-analyzer-extension/SKILL.md +63 -0
- package/.github/skills/trace-analyzer-extension/assets/extension-checklist.md +24 -0
- package/.github/skills/trace-analyzer-extension/references/analyzer-extension-workflow.md +101 -0
- package/.github/skills/trace-audit-reporting/SKILL.md +96 -0
- package/.github/skills/trace-audit-reporting/assets/performance-report-template.md +123 -0
- package/.github/skills/trace-audit-reporting/references/trace-analysis-workflow.md +132 -0
- package/package.json +7 -3
- package/plans/ES2023 migration +13 -8
- package/plans/Evolution_Training_Interoperability_Contracts.md +1 -1
- package/plans/Flappy_Bird_Folder_Documentation_Pass.md +53 -0
- package/plans/Flappy_Evolution_Worker_Documentation_Pass.md +58 -0
- package/plans/Interactive_Examples_and_Learning_Path.md +10 -2
- package/plans/Memory_Optimization.md +3 -3
- package/plans/README.md +63 -0
- package/plans/Roadmap.md +15 -3
- package/plans/asciiMaze_SOLID_split.done.md +130 -0
- package/plans/flappy_bird_SOLID_split.done.md +67 -0
- package/scripts/analyze-trace.ts +590 -0
- package/scripts/assets/theme.css +221 -34
- package/scripts/copy-examples.mjs +9 -5
- package/scripts/export-onnx.mjs +3 -3
- package/scripts/generate-bench-tables.mjs +10 -10
- package/scripts/generate-bench-tables.ts +10 -10
- package/scripts/generate-docs.ts +1415 -449
- package/scripts/render-docs-html.ts +15 -8
- package/src/README.md +127 -222
- package/src/architecture/README.md +117 -184
- package/src/architecture/architect.ts +6 -0
- package/src/architecture/layer/README.md +38 -38
- package/src/architecture/network/README.md +49 -31
- package/src/architecture/network/activate/README.md +77 -77
- package/src/architecture/network/connect/README.md +15 -13
- package/src/architecture/network/deterministic/README.md +7 -7
- package/src/architecture/network/evolve/README.md +44 -44
- package/src/architecture/network/gating/README.md +20 -20
- package/src/architecture/network/genetic/README.md +51 -51
- package/src/architecture/network/mutate/README.md +97 -97
- package/src/architecture/network/network.types.ts +39 -0
- package/src/architecture/network/onnx/README.md +264 -264
- package/src/architecture/network/prune/README.md +39 -39
- package/src/architecture/network/remove/README.md +26 -26
- package/src/architecture/network/serialize/README.md +56 -56
- package/src/architecture/network/serialize/network.serialize.json.utils.ts +1 -0
- package/src/architecture/network/serialize/network.serialize.utils.ts +6 -1
- package/src/architecture/network/serialize/network.serialize.utils.types.ts +1 -1
- package/src/architecture/network/slab/README.md +61 -61
- package/src/architecture/network/standalone/README.md +24 -24
- package/src/architecture/network/stats/README.md +9 -9
- package/src/architecture/network/topology/README.md +46 -46
- package/src/architecture/network/training/README.md +21 -21
- package/src/architecture/network.ts +114 -10
- package/src/methods/README.md +9 -87
- package/src/multithreading/README.md +8 -77
- package/src/multithreading/workers/README.md +2 -2
- package/src/multithreading/workers/browser/README.md +0 -6
- package/src/multithreading/workers/node/README.md +0 -3
- package/src/neat/README.md +623 -568
- package/src/neat/neat.evolve.population.utils.ts +29 -5
- package/src/neat/neat.helpers.ts +16 -0
- package/src/neat/neat.topology-intent.utils.ts +160 -0
- package/src/utils/README.md +18 -18
- package/test/examples/asciiMaze/README.md +59 -59
- package/test/examples/asciiMaze/asciiMaze.e2e.test.ts +14 -9
- package/test/examples/asciiMaze/browser-entry/README.md +196 -0
- package/test/examples/asciiMaze/browser-entry/browser-entry.abort.services.ts +95 -0
- package/test/examples/asciiMaze/browser-entry/browser-entry.constants.ts +23 -0
- package/test/examples/asciiMaze/browser-entry/browser-entry.curriculum.services.ts +115 -0
- package/test/examples/asciiMaze/browser-entry/browser-entry.globals.services.ts +106 -0
- package/test/examples/asciiMaze/browser-entry/browser-entry.host.services.ts +157 -0
- package/test/examples/asciiMaze/browser-entry/browser-entry.services.ts +14 -0
- package/test/examples/asciiMaze/browser-entry/browser-entry.ts +129 -0
- package/test/examples/asciiMaze/browser-entry/browser-entry.types.ts +120 -0
- package/test/examples/asciiMaze/browser-entry/browser-entry.utils.ts +98 -0
- package/test/examples/asciiMaze/browser-entry.ts +10 -576
- package/test/examples/asciiMaze/dashboardManager/README.md +276 -0
- package/test/examples/asciiMaze/dashboardManager/archive/README.md +16 -0
- package/test/examples/asciiMaze/dashboardManager/archive/dashboardManager.archive.services.ts +267 -0
- package/test/examples/asciiMaze/dashboardManager/dashboardManager.constants.ts +35 -0
- package/test/examples/asciiMaze/dashboardManager/dashboardManager.services.ts +103 -0
- package/test/examples/asciiMaze/dashboardManager/dashboardManager.ts +181 -0
- package/test/examples/asciiMaze/dashboardManager/dashboardManager.types.ts +267 -0
- package/test/examples/asciiMaze/dashboardManager/dashboardManager.utils.ts +254 -0
- package/test/examples/asciiMaze/dashboardManager/live/README.md +14 -0
- package/test/examples/asciiMaze/dashboardManager/live/dashboardManager.live.services.ts +264 -0
- package/test/examples/asciiMaze/dashboardManager/telemetry/README.md +47 -0
- package/test/examples/asciiMaze/dashboardManager/telemetry/dashboardManager.telemetry.services.ts +513 -0
- package/test/examples/asciiMaze/dashboardManager.ts +13 -2335
- package/test/examples/asciiMaze/evolutionEngine/README.md +1058 -0
- package/test/examples/asciiMaze/evolutionEngine/curriculumPhase.ts +90 -0
- package/test/examples/asciiMaze/evolutionEngine/engineState.constants.ts +36 -0
- package/test/examples/asciiMaze/evolutionEngine/engineState.ts +58 -513
- package/test/examples/asciiMaze/evolutionEngine/engineState.types.ts +212 -0
- package/test/examples/asciiMaze/evolutionEngine/engineState.utils.ts +301 -0
- package/test/examples/asciiMaze/evolutionEngine/evolutionEngine.types.ts +445 -0
- package/test/examples/asciiMaze/evolutionEngine/evolutionLoop.ts +81 -50
- package/test/examples/asciiMaze/evolutionEngine/optionsAndSetup.ts +2 -4
- package/test/examples/asciiMaze/evolutionEngine/populationDynamics.ts +17 -33
- package/test/examples/asciiMaze/evolutionEngine/populationPruning.ts +1 -1
- package/test/examples/asciiMaze/evolutionEngine/rngAndTiming.ts +1 -2
- package/test/examples/asciiMaze/evolutionEngine/sampling.ts +1 -1
- package/test/examples/asciiMaze/evolutionEngine/scratchPools.ts +2 -5
- package/test/examples/asciiMaze/evolutionEngine/setupHelpers.ts +30 -37
- package/test/examples/asciiMaze/evolutionEngine/telemetryMetrics.ts +16 -58
- package/test/examples/asciiMaze/evolutionEngine/trainingWarmStart.ts +2 -2
- package/test/examples/asciiMaze/evolutionEngine.ts +55 -55
- package/test/examples/asciiMaze/fitness.ts +2 -2
- package/test/examples/asciiMaze/fitness.types.ts +65 -0
- package/test/examples/asciiMaze/interfaces.ts +64 -1352
- package/test/examples/asciiMaze/mazeMovement/README.md +356 -0
- package/test/examples/asciiMaze/mazeMovement/finalization/README.md +49 -0
- package/test/examples/asciiMaze/mazeMovement/finalization/mazeMovement.finalization.ts +138 -0
- package/test/examples/asciiMaze/mazeMovement/mazeMovement.constants.ts +101 -0
- package/test/examples/asciiMaze/mazeMovement/mazeMovement.services.ts +230 -0
- package/test/examples/asciiMaze/mazeMovement/mazeMovement.ts +299 -0
- package/test/examples/asciiMaze/mazeMovement/mazeMovement.types.ts +185 -0
- package/test/examples/asciiMaze/mazeMovement/mazeMovement.utils.ts +153 -0
- package/test/examples/asciiMaze/mazeMovement/policy/README.md +91 -0
- package/test/examples/asciiMaze/mazeMovement/policy/mazeMovement.policy.ts +467 -0
- package/test/examples/asciiMaze/mazeMovement/runtime/README.md +95 -0
- package/test/examples/asciiMaze/mazeMovement/runtime/mazeMovement.runtime.ts +354 -0
- package/test/examples/asciiMaze/mazeMovement/shaping/README.md +124 -0
- package/test/examples/asciiMaze/mazeMovement/shaping/mazeMovement.shaping.ts +459 -0
- package/test/examples/asciiMaze/mazeMovement.ts +12 -2978
- package/test/examples/flappy_bird/README.md +193 -88
- package/test/examples/flappy_bird/browser-entry/README.md +1441 -0
- package/test/examples/flappy_bird/browser-entry/browser-entry.host.utils.ts +4 -324
- package/test/examples/flappy_bird/browser-entry/browser-entry.network-view.utils.ts +9 -396
- package/test/examples/flappy_bird/browser-entry/browser-entry.playback.utils.ts +6 -714
- package/test/examples/flappy_bird/browser-entry/browser-entry.render.types.ts +26 -3
- package/test/examples/flappy_bird/browser-entry/browser-entry.runtime.types.ts +16 -1
- package/test/examples/flappy_bird/browser-entry/browser-entry.simulation.types.ts +39 -5
- package/test/examples/flappy_bird/browser-entry/browser-entry.spawn.utils.ts +11 -31
- package/test/examples/flappy_bird/browser-entry/browser-entry.stats.types.ts +32 -4
- package/test/examples/flappy_bird/browser-entry/browser-entry.ts +11 -0
- package/test/examples/flappy_bird/browser-entry/browser-entry.types.ts +8 -0
- package/test/examples/flappy_bird/browser-entry/browser-entry.visualization.types.ts +50 -7
- package/test/examples/flappy_bird/browser-entry/browser-entry.visualization.utils.ts +21 -893
- package/test/examples/flappy_bird/browser-entry/browser-entry.worker.types.ts +91 -10
- package/test/examples/flappy_bird/browser-entry/host/README.md +318 -0
- package/test/examples/flappy_bird/browser-entry/host/host.canvas.service.ts +16 -0
- package/test/examples/flappy_bird/browser-entry/host/host.constants.ts +20 -0
- package/test/examples/flappy_bird/browser-entry/host/host.dom.service.ts +10 -0
- package/test/examples/flappy_bird/browser-entry/host/host.resize.service.ts +1 -295
- package/test/examples/flappy_bird/browser-entry/host/host.stats.service.ts +14 -0
- package/test/examples/flappy_bird/browser-entry/host/host.ts +592 -6
- package/test/examples/flappy_bird/browser-entry/host/host.types.ts +13 -0
- package/test/examples/flappy_bird/browser-entry/host/resize/README.md +309 -0
- package/test/examples/flappy_bird/browser-entry/host/resize/host.resize.service.constants.ts +47 -0
- package/test/examples/flappy_bird/browser-entry/host/resize/host.resize.service.services.ts +392 -0
- package/test/examples/flappy_bird/browser-entry/host/resize/host.resize.service.ts +132 -0
- package/test/examples/flappy_bird/browser-entry/host/resize/host.resize.service.types.ts +92 -0
- package/test/examples/flappy_bird/browser-entry/host/resize/host.resize.service.utils.ts +272 -0
- package/test/examples/flappy_bird/browser-entry/network-view/README.md +389 -0
- package/test/examples/flappy_bird/browser-entry/network-view/network-view.draw.service.ts +13 -0
- package/test/examples/flappy_bird/browser-entry/network-view/network-view.labels.utils.ts +12 -0
- package/test/examples/flappy_bird/browser-entry/network-view/network-view.layout.utils.ts +14 -0
- package/test/examples/flappy_bird/browser-entry/network-view/network-view.topology.utils.ts +267 -0
- package/test/examples/flappy_bird/browser-entry/network-view/network-view.ts +823 -7
- package/test/examples/flappy_bird/browser-entry/network-view/network-view.types.ts +11 -0
- package/test/examples/flappy_bird/browser-entry/playback/README.md +845 -0
- package/test/examples/flappy_bird/browser-entry/playback/background/README.md +355 -0
- package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/README.md +1068 -0
- package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/playback.background.ground-grid.batch.services.ts +64 -0
- package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/playback.background.ground-grid.cache.services.ts +207 -0
- package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/playback.background.ground-grid.constants.ts +197 -0
- package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/playback.background.ground-grid.geometry.batch.utils.ts +114 -0
- package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/playback.background.ground-grid.geometry.layout.utils.test.ts +96 -0
- package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/playback.background.ground-grid.geometry.layout.utils.ts +204 -0
- package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/playback.background.ground-grid.geometry.services.ts +49 -0
- package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/playback.background.ground-grid.geometry.utils.ts +313 -0
- package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/playback.background.ground-grid.layer.services.ts +81 -0
- package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/playback.background.ground-grid.math.utils.test.ts +33 -0
- package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/playback.background.ground-grid.math.utils.ts +201 -0
- package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/playback.background.ground-grid.pulse.selection.utils.ts +171 -0
- package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/playback.background.ground-grid.pulse.timing.utils.ts +124 -0
- package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/playback.background.ground-grid.pulse.utils.test.ts +279 -0
- package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/playback.background.ground-grid.pulse.utils.ts +132 -0
- package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/playback.background.ground-grid.scene.services.ts +26 -0
- package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/playback.background.ground-grid.services.ts +65 -0
- package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/playback.background.ground-grid.ts +48 -0
- package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/playback.background.ground-grid.types.ts +342 -0
- package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/playback.background.ground-grid.utils.ts +10 -0
- package/test/examples/flappy_bird/browser-entry/playback/background/playback.background.cache.services.ts +96 -0
- package/test/examples/flappy_bird/browser-entry/playback/background/playback.background.constants.ts +127 -0
- package/test/examples/flappy_bird/browser-entry/playback/background/playback.background.draw.services.ts +184 -0
- package/test/examples/flappy_bird/browser-entry/playback/background/playback.background.scene.services.ts +64 -0
- package/test/examples/flappy_bird/browser-entry/playback/background/playback.background.services.ts +6 -0
- package/test/examples/flappy_bird/browser-entry/playback/background/playback.background.ts +53 -0
- package/test/examples/flappy_bird/browser-entry/playback/background/playback.background.types.ts +105 -0
- package/test/examples/flappy_bird/browser-entry/playback/background/playback.background.utils.ts +100 -0
- package/test/examples/flappy_bird/browser-entry/playback/frame-render/README.md +541 -0
- package/test/examples/flappy_bird/browser-entry/playback/frame-render/playback.frame-render.bird.utils.ts +180 -0
- package/test/examples/flappy_bird/browser-entry/playback/frame-render/playback.frame-render.canvas.services.ts +77 -0
- package/test/examples/flappy_bird/browser-entry/playback/frame-render/playback.frame-render.entity.services.ts +167 -0
- package/test/examples/flappy_bird/browser-entry/playback/frame-render/playback.frame-render.scene.services.ts +57 -0
- package/test/examples/flappy_bird/browser-entry/playback/frame-render/playback.frame-render.service.test.ts +176 -0
- package/test/examples/flappy_bird/browser-entry/playback/frame-render/playback.frame-render.service.ts +113 -0
- package/test/examples/flappy_bird/browser-entry/playback/frame-render/playback.frame-render.services.ts +35 -0
- package/test/examples/flappy_bird/browser-entry/playback/frame-render/playback.frame-render.trail.utils.ts +248 -0
- package/test/examples/flappy_bird/browser-entry/playback/frame-render/playback.frame-render.types.ts +103 -0
- package/test/examples/flappy_bird/browser-entry/playback/frame-render/playback.frame-render.utils.ts +11 -0
- package/test/examples/flappy_bird/browser-entry/playback/playback.constants.ts +1 -1
- package/test/examples/flappy_bird/browser-entry/playback/playback.frame-render.service.ts +10 -0
- package/test/examples/flappy_bird/browser-entry/playback/playback.iteration.services.ts +192 -0
- package/test/examples/flappy_bird/browser-entry/playback/playback.loop.service.ts +12 -0
- package/test/examples/flappy_bird/browser-entry/playback/playback.orchestration.types.ts +78 -0
- package/test/examples/flappy_bird/browser-entry/playback/playback.render.pipe-outline.service.ts +128 -0
- package/test/examples/flappy_bird/browser-entry/playback/playback.render.service.ts +1 -116
- package/test/examples/flappy_bird/browser-entry/playback/playback.session.services.ts +184 -0
- package/test/examples/flappy_bird/browser-entry/playback/playback.snapshot.utils.test.ts +121 -0
- package/test/examples/flappy_bird/browser-entry/playback/playback.snapshot.utils.ts +8 -0
- package/test/examples/flappy_bird/browser-entry/playback/playback.starfield.layer.services.ts +36 -0
- package/test/examples/flappy_bird/browser-entry/playback/playback.starfield.service.ts +11 -128
- package/test/examples/flappy_bird/browser-entry/playback/playback.starfield.services.ts +268 -0
- package/test/examples/flappy_bird/browser-entry/playback/playback.starfield.types.ts +91 -0
- package/test/examples/flappy_bird/browser-entry/playback/playback.starfield.utils.ts +11 -4
- package/test/examples/flappy_bird/browser-entry/playback/playback.trail.utils.ts +9 -86
- package/test/examples/flappy_bird/browser-entry/playback/playback.ts +75 -7
- package/test/examples/flappy_bird/browser-entry/playback/playback.types.ts +12 -9
- package/test/examples/flappy_bird/browser-entry/playback/playback.worker-channel.utils.ts +11 -123
- package/test/examples/flappy_bird/browser-entry/playback/snapshot/README.md +55 -0
- package/test/examples/flappy_bird/browser-entry/playback/snapshot/playback.snapshot.services.ts +103 -0
- package/test/examples/flappy_bird/browser-entry/playback/snapshot/playback.snapshot.summary.utils.test.ts +45 -0
- package/test/examples/flappy_bird/browser-entry/playback/snapshot/playback.snapshot.summary.utils.ts +28 -0
- package/test/examples/flappy_bird/browser-entry/playback/trail/README.md +95 -0
- package/test/examples/flappy_bird/browser-entry/playback/trail/playback.trail.history.services.test.ts +35 -0
- package/test/examples/flappy_bird/browser-entry/playback/trail/playback.trail.history.services.ts +64 -0
- package/test/examples/flappy_bird/browser-entry/playback/trail/playback.trail.opacity.utils.test.ts +37 -0
- package/test/examples/flappy_bird/browser-entry/playback/trail/playback.trail.opacity.utils.ts +74 -0
- package/test/examples/flappy_bird/browser-entry/playback/worker-channel/README.md +71 -0
- package/test/examples/flappy_bird/browser-entry/playback/worker-channel/playback.worker-channel.request.services.ts +45 -0
- package/test/examples/flappy_bird/browser-entry/playback/worker-channel/playback.worker-channel.summary.services.ts +74 -0
- package/test/examples/flappy_bird/browser-entry/playback/worker-channel/playback.worker-channel.types.ts +53 -0
- package/test/examples/flappy_bird/browser-entry/runtime/README.md +304 -0
- package/test/examples/flappy_bird/browser-entry/runtime/runtime.browser-globals.service.ts +15 -0
- package/test/examples/flappy_bird/browser-entry/runtime/runtime.errors.ts +17 -0
- package/test/examples/flappy_bird/browser-entry/runtime/runtime.evolution-launch.service.ts +56 -0
- package/test/examples/flappy_bird/browser-entry/runtime/runtime.evolution-loop.service.ts +19 -0
- package/test/examples/flappy_bird/browser-entry/runtime/runtime.lifecycle.service.ts +96 -0
- package/test/examples/flappy_bird/browser-entry/runtime/runtime.startup.service.ts +92 -0
- package/test/examples/flappy_bird/browser-entry/runtime/runtime.telemetry.service.ts +24 -0
- package/test/examples/flappy_bird/browser-entry/runtime/runtime.ts +31 -121
- package/test/examples/flappy_bird/browser-entry/runtime/runtime.types.ts +65 -0
- package/test/examples/flappy_bird/browser-entry/visualization/README.md +568 -0
- package/test/examples/flappy_bird/browser-entry/visualization/visualization.colors.utils.ts +26 -0
- package/test/examples/flappy_bird/browser-entry/visualization/visualization.constants.ts +110 -0
- package/test/examples/flappy_bird/browser-entry/visualization/visualization.draw.service.ts +979 -19
- package/test/examples/flappy_bird/browser-entry/visualization/visualization.legend.utils.ts +157 -3
- package/test/examples/flappy_bird/browser-entry/visualization/visualization.topology.utils.ts +13 -27
- package/test/examples/flappy_bird/browser-entry/visualization/visualization.ts +7 -20
- package/test/examples/flappy_bird/browser-entry/visualization/visualization.types.ts +14 -0
- package/test/examples/flappy_bird/browser-entry/worker-channel/README.md +238 -0
- package/test/examples/flappy_bird/browser-entry/worker-channel/worker-channel.errors.ts +11 -0
- package/test/examples/flappy_bird/browser-entry/worker-channel/worker-channel.generation.service.ts +12 -0
- package/test/examples/flappy_bird/browser-entry/worker-channel/worker-channel.playback.service.test.ts +143 -0
- package/test/examples/flappy_bird/browser-entry/worker-channel/worker-channel.playback.service.ts +140 -14
- package/test/examples/flappy_bird/browser-entry/worker-channel/worker-channel.request.service.ts +27 -0
- package/test/examples/flappy_bird/browser-entry/worker-channel/worker-channel.ts +8 -0
- package/test/examples/flappy_bird/browser-entry/worker-channel/worker-channel.types.ts +23 -0
- package/test/examples/flappy_bird/browser-entry/worker-channel/worker-channel.url.service.ts +5 -0
- package/test/examples/flappy_bird/constants/README.md +1163 -0
- package/test/examples/flappy_bird/constants/constants.birds.ts +16 -38
- package/test/examples/flappy_bird/constants/constants.difficulty.ts +21 -0
- package/test/examples/flappy_bird/constants/constants.network-view.ts +24 -0
- package/test/examples/flappy_bird/constants/constants.network.ts +1 -1
- package/test/examples/flappy_bird/constants/constants.observation.ts +7 -0
- package/test/examples/flappy_bird/constants/constants.palette.ts +9 -2
- package/test/examples/flappy_bird/constants/constants.physics.ts +9 -0
- package/test/examples/flappy_bird/constants/constants.pipe-render.ts +3 -0
- package/test/examples/flappy_bird/constants/constants.pipes.ts +22 -3
- package/test/examples/flappy_bird/constants/constants.runtime.ts +28 -4
- package/test/examples/flappy_bird/constants/constants.starfield.ts +78 -3
- package/test/examples/flappy_bird/constants/constants.ts +6 -0
- package/test/examples/flappy_bird/environment/README.md +182 -0
- package/test/examples/flappy_bird/environment/environment.collision.utils.ts +7 -0
- package/test/examples/flappy_bird/environment/environment.constants.ts +16 -3
- package/test/examples/flappy_bird/environment/environment.observation.utils.ts +12 -19
- package/test/examples/flappy_bird/environment/environment.state.service.ts +10 -0
- package/test/examples/flappy_bird/environment/environment.step.service.ts +15 -66
- package/test/examples/flappy_bird/environment/environment.types.ts +14 -0
- package/test/examples/flappy_bird/evaluation/README.md +155 -0
- package/test/examples/flappy_bird/evaluation/evaluation.constants.ts +23 -4
- package/test/examples/flappy_bird/evaluation/evaluation.fitness.utils.ts +16 -1
- package/test/examples/flappy_bird/evaluation/evaluation.rollout.service.ts +7 -374
- package/test/examples/flappy_bird/evaluation/evaluation.seed.utils.ts +4 -0
- package/test/examples/flappy_bird/evaluation/evaluation.types.ts +18 -2
- package/test/examples/flappy_bird/evaluation/rollout/README.md +355 -0
- package/test/examples/flappy_bird/evaluation/rollout/evaluation.rollout.constants.ts +38 -0
- package/test/examples/flappy_bird/evaluation/rollout/evaluation.rollout.service.ts +71 -0
- package/test/examples/flappy_bird/evaluation/rollout/evaluation.rollout.services.ts +338 -0
- package/test/examples/flappy_bird/evaluation/rollout/evaluation.rollout.types.ts +69 -0
- package/test/examples/flappy_bird/evaluation/rollout/evaluation.rollout.utils.ts +399 -0
- package/test/examples/flappy_bird/flappy-evolution-worker/README.md +845 -0
- package/test/examples/flappy_bird/flappy-evolution-worker/flappy-evolution-worker.constants.ts +49 -7
- package/test/examples/flappy_bird/flappy-evolution-worker/flappy-evolution-worker.errors.ts +34 -3
- package/test/examples/flappy_bird/flappy-evolution-worker/flappy-evolution-worker.evolution.service.ts +22 -0
- package/test/examples/flappy_bird/flappy-evolution-worker/flappy-evolution-worker.playback.service.ts +62 -26
- package/test/examples/flappy_bird/flappy-evolution-worker/flappy-evolution-worker.protocol.service.ts +27 -1
- package/test/examples/flappy_bird/flappy-evolution-worker/flappy-evolution-worker.runtime.service.ts +23 -0
- package/test/examples/flappy_bird/flappy-evolution-worker/flappy-evolution-worker.simulation.frame.service.ts +378 -0
- package/test/examples/flappy_bird/flappy-evolution-worker/flappy-evolution-worker.simulation.types.ts +22 -0
- package/test/examples/flappy_bird/flappy-evolution-worker/flappy-evolution-worker.simulation.utils.ts +20 -203
- package/test/examples/flappy_bird/flappy-evolution-worker/flappy-evolution-worker.snapshot.utils.test.ts +94 -0
- package/test/examples/flappy_bird/flappy-evolution-worker/flappy-evolution-worker.snapshot.utils.ts +78 -13
- package/test/examples/flappy_bird/flappy-evolution-worker/flappy-evolution-worker.ts +235 -344
- package/test/examples/flappy_bird/flappy-evolution-worker/flappy-evolution-worker.types.ts +170 -22
- package/test/examples/flappy_bird/flappy-evolution-worker/flappy-evolution-worker.warm-start.service.ts +314 -0
- package/test/examples/flappy_bird/flappy.simulation.shared.utils.ts +17 -0
- package/test/examples/flappy_bird/flappyEnvironment.ts +21 -0
- package/test/examples/flappy_bird/flappyEvaluation.ts +12 -0
- package/test/examples/flappy_bird/flappyEvolution.worker.ts +7 -0
- package/test/examples/flappy_bird/index.ts +8 -2
- package/test/examples/flappy_bird/rng.ts +10 -0
- package/test/examples/flappy_bird/simulation-shared/README.md +518 -0
- package/test/examples/flappy_bird/simulation-shared/observation/README.md +255 -0
- package/test/examples/flappy_bird/simulation-shared/observation/observation.features.utils.ts +339 -0
- package/test/examples/flappy_bird/simulation-shared/observation/observation.ts +19 -0
- package/test/examples/flappy_bird/simulation-shared/observation/observation.vector.utils.ts +81 -0
- package/test/examples/flappy_bird/simulation-shared/simulation-shared.constants.ts +3 -0
- package/test/examples/flappy_bird/simulation-shared/simulation-shared.control.utils.ts +6 -0
- package/test/examples/flappy_bird/simulation-shared/simulation-shared.difficulty.utils.ts +9 -0
- package/test/examples/flappy_bird/simulation-shared/simulation-shared.errors.ts +10 -1
- package/test/examples/flappy_bird/simulation-shared/simulation-shared.memory.utils.ts +18 -0
- package/test/examples/flappy_bird/simulation-shared/simulation-shared.observation.utils.ts +7 -402
- package/test/examples/flappy_bird/simulation-shared/simulation-shared.spawn.utils.ts +36 -6
- package/test/examples/flappy_bird/{evaluation/evaluation.statistics.utils.ts → simulation-shared/simulation-shared.statistics.utils.ts} +30 -9
- package/test/examples/flappy_bird/simulation-shared/simulation-shared.types.ts +38 -5
- package/test/examples/flappy_bird/trainFlappyBird.ts +13 -0
- package/test/examples/flappy_bird/trainer/README.md +676 -0
- package/test/examples/flappy_bird/trainer/evaluation/README.md +253 -0
- package/test/examples/flappy_bird/trainer/evaluation/trainer.evaluation.service.constants.ts +15 -0
- package/test/examples/flappy_bird/trainer/evaluation/trainer.evaluation.service.services.ts +86 -0
- package/test/examples/flappy_bird/trainer/evaluation/trainer.evaluation.service.ts +187 -0
- package/test/examples/flappy_bird/trainer/evaluation/trainer.evaluation.service.types.ts +32 -0
- package/test/examples/flappy_bird/trainer/evaluation/trainer.evaluation.service.utils.ts +182 -0
- package/test/examples/flappy_bird/trainer/trainer.evaluation.service.ts +13 -0
- package/test/examples/flappy_bird/trainer/trainer.fitness.service.ts +23 -1
- package/test/examples/flappy_bird/trainer/trainer.loop.service.ts +17 -1
- package/test/examples/flappy_bird/trainer/trainer.report.service.services.ts +181 -0
- package/test/examples/flappy_bird/trainer/trainer.report.service.ts +136 -0
- package/test/examples/flappy_bird/trainer/trainer.selection.utils.ts +89 -0
- package/test/examples/flappy_bird/trainer/trainer.setup.service.ts +22 -0
- package/test/examples/flappy_bird/trainer/trainer.signals.service.ts +8 -0
- package/test/examples/flappy_bird/trainer/trainer.ts +38 -553
- package/test/examples/flappy_bird/trainer/trainer.types.ts +44 -7
- package/test/neat/neat.topology-intent.test.ts +129 -0
- package/test/network/network.topology-intent.test.ts +44 -0
- package/test/examples/flappy_bird/browser-entry/browser-entry.utils.ts +0 -12
- package/test/examples/flappy_bird/environment/environment.ts +0 -7
- package/test/examples/flappy_bird/evaluation/evaluation.ts +0 -7
- package/test/examples/flappy_bird/simulation-shared/simulation-shared.ts +0 -15
- package/test/examples/flappy_bird/trainer/trainer.statistics.utils.ts +0 -78
|
@@ -0,0 +1,378 @@
|
|
|
1
|
+
import { clamp } from '../browser-entry/browser-entry.math.utils';
|
|
2
|
+
import {
|
|
3
|
+
commitObservationMemoryStep,
|
|
4
|
+
resolveFlapDecision,
|
|
5
|
+
resolveObservationVector,
|
|
6
|
+
} from '../browser-entry/browser-entry.observation.utils';
|
|
7
|
+
import {
|
|
8
|
+
resolveNextSpawnGapCenterY,
|
|
9
|
+
resolveNextSpawnGapSize,
|
|
10
|
+
resolveNextSpawnIntervalFrames,
|
|
11
|
+
} from '../browser-entry/browser-entry.spawn.utils';
|
|
12
|
+
import type { RngLike } from '../browser-entry/browser-entry.types';
|
|
13
|
+
import { resolvePipeSpawnXPx } from '../browser-entry/browser-entry.viewport.utils';
|
|
14
|
+
import type { SharedDifficultyProfile } from '../flappy.simulation.shared.utils';
|
|
15
|
+
import { FLAPPY_BIRD_VIEWPORT_X_RATIO } from '../constants/constants';
|
|
16
|
+
import {
|
|
17
|
+
FLAPPY_BIRD_RADIUS_PX,
|
|
18
|
+
FLAPPY_BIRD_X_PX,
|
|
19
|
+
FLAPPY_PIPE_COLLISION_ENTRANCE_EXPAND_PX,
|
|
20
|
+
FLAPPY_PIPE_COLLISION_SIDE_EXPAND_PX,
|
|
21
|
+
FLAPPY_CONTROL_SUBSTEPS_PER_FRAME,
|
|
22
|
+
FLAPPY_ENABLE_RUNTIME_INSTRUMENTATION,
|
|
23
|
+
FLAPPY_FLAP_VELOCITY_PX_PER_FRAME,
|
|
24
|
+
FLAPPY_GRAVITY_PX_PER_FRAME2,
|
|
25
|
+
FLAPPY_MAX_FALL_SPEED_PX_PER_FRAME,
|
|
26
|
+
FLAPPY_PIPE_WIDTH_PX,
|
|
27
|
+
} from '../constants/constants';
|
|
28
|
+
import type {
|
|
29
|
+
WorkerPlaybackState,
|
|
30
|
+
WorkerPopulationBird,
|
|
31
|
+
WorkerPopulationPipe,
|
|
32
|
+
} from './flappy-evolution-worker.types';
|
|
33
|
+
import type { WorkerPlaybackFrameContext } from './flappy-evolution-worker.simulation.types';
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Advances the whole population simulation by one logical frame.
|
|
37
|
+
*
|
|
38
|
+
* Educational note:
|
|
39
|
+
* One logical frame is internally split into smaller control substeps so the
|
|
40
|
+
* worker can make flap decisions, apply gravity, move pipes, spawn new pipes,
|
|
41
|
+
* and resolve collisions with better numerical stability than a single large
|
|
42
|
+
* integration jump.
|
|
43
|
+
*
|
|
44
|
+
* This function is the main simulation ownership boundary for the folder.
|
|
45
|
+
* The companion `simulation.utils` file creates initial state; this service is
|
|
46
|
+
* responsible for mutating that state over time.
|
|
47
|
+
*
|
|
48
|
+
* @param renderState - Mutable simulation state.
|
|
49
|
+
* @param rng - Deterministic random source for spawn variation.
|
|
50
|
+
* @param difficultyProfile - Active dynamic difficulty profile.
|
|
51
|
+
* @returns Number of policy activation calls made in this frame.
|
|
52
|
+
*/
|
|
53
|
+
export function stepWorkerPopulationFrame(
|
|
54
|
+
renderState: WorkerPlaybackState,
|
|
55
|
+
rng: RngLike,
|
|
56
|
+
difficultyProfile: SharedDifficultyProfile,
|
|
57
|
+
): number {
|
|
58
|
+
const controlSubstepCount = Math.max(1, FLAPPY_CONTROL_SUBSTEPS_PER_FRAME);
|
|
59
|
+
const frameContext: WorkerPlaybackFrameContext = {
|
|
60
|
+
renderState,
|
|
61
|
+
rng,
|
|
62
|
+
difficultyProfile,
|
|
63
|
+
controlSubstepDelta: 1 / controlSubstepCount,
|
|
64
|
+
cameraLeftXPx: resolveCameraLeftXPx(renderState.visibleWorldWidthPx),
|
|
65
|
+
birdLeftXPx: FLAPPY_BIRD_X_PX - FLAPPY_BIRD_RADIUS_PX,
|
|
66
|
+
birdRightXPx: FLAPPY_BIRD_X_PX + FLAPPY_BIRD_RADIUS_PX,
|
|
67
|
+
};
|
|
68
|
+
let activationCallsThisFrame = 0;
|
|
69
|
+
|
|
70
|
+
// Step 1: Advance the per-frame survival counters for living birds.
|
|
71
|
+
incrementLivingBirdFrameCounters(renderState);
|
|
72
|
+
|
|
73
|
+
for (
|
|
74
|
+
let controlSubstepIndex = 0;
|
|
75
|
+
controlSubstepIndex < controlSubstepCount;
|
|
76
|
+
controlSubstepIndex++
|
|
77
|
+
) {
|
|
78
|
+
// Step 2: Resolve one control/physics/collision substep.
|
|
79
|
+
activationCallsThisFrame += runWorkerPopulationControlSubstep(frameContext);
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
// Step 3: Publish the completed logical frame index.
|
|
83
|
+
renderState.frameIndex += 1;
|
|
84
|
+
return activationCallsThisFrame;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* Resolves the current left-edge of the visible world in world-space pixels.
|
|
89
|
+
*
|
|
90
|
+
* @param visibleWorldWidthPx - Current visible world width.
|
|
91
|
+
* @returns Left edge x-position in world coordinates.
|
|
92
|
+
*/
|
|
93
|
+
function resolveCameraLeftXPx(visibleWorldWidthPx: number): number {
|
|
94
|
+
const clampedVisibleWorldWidthPx = Math.max(1, visibleWorldWidthPx);
|
|
95
|
+
const desiredBirdScreenXPx =
|
|
96
|
+
clampedVisibleWorldWidthPx * FLAPPY_BIRD_VIEWPORT_X_RATIO;
|
|
97
|
+
return FLAPPY_BIRD_X_PX - desiredBirdScreenXPx;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
/**
|
|
101
|
+
* Increments survival counters for birds that remain active at frame start.
|
|
102
|
+
*
|
|
103
|
+
* @param renderState - Mutable playback state.
|
|
104
|
+
* @returns Nothing.
|
|
105
|
+
*/
|
|
106
|
+
function incrementLivingBirdFrameCounters(
|
|
107
|
+
renderState: WorkerPlaybackState,
|
|
108
|
+
): void {
|
|
109
|
+
renderState.birds.forEach((bird) => {
|
|
110
|
+
if (bird.done) {
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
bird.framesSurvived += 1;
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
/**
|
|
119
|
+
* Advances one control substep of the worker playback simulation.
|
|
120
|
+
*
|
|
121
|
+
* @param frameContext - Shared frame context for this logical frame.
|
|
122
|
+
* @returns Number of activation calls performed in the substep.
|
|
123
|
+
*/
|
|
124
|
+
function runWorkerPopulationControlSubstep(
|
|
125
|
+
frameContext: WorkerPlaybackFrameContext,
|
|
126
|
+
): number {
|
|
127
|
+
const activationCallsThisSubstep = resolveBirdControlActions(frameContext);
|
|
128
|
+
|
|
129
|
+
advanceBirdPhysics(frameContext);
|
|
130
|
+
advancePipes(frameContext);
|
|
131
|
+
spawnPipeIfNeeded(frameContext);
|
|
132
|
+
resolveBirdTerminationAndProgress(frameContext);
|
|
133
|
+
|
|
134
|
+
return activationCallsThisSubstep;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
/**
|
|
138
|
+
* Runs policy evaluation and commits the resulting observation memory updates.
|
|
139
|
+
*
|
|
140
|
+
* @param frameContext - Shared frame context for this logical frame.
|
|
141
|
+
* @returns Number of activation calls performed in the substep.
|
|
142
|
+
*/
|
|
143
|
+
function resolveBirdControlActions(
|
|
144
|
+
frameContext: WorkerPlaybackFrameContext,
|
|
145
|
+
): number {
|
|
146
|
+
const { difficultyProfile, renderState } = frameContext;
|
|
147
|
+
let activationCallsThisSubstep = 0;
|
|
148
|
+
|
|
149
|
+
renderState.birds.forEach((bird) => {
|
|
150
|
+
if (bird.done) {
|
|
151
|
+
return;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
const observation = resolveObservationVector(
|
|
155
|
+
bird.yPx,
|
|
156
|
+
bird.velocityYPxPerFrame,
|
|
157
|
+
renderState.pipes,
|
|
158
|
+
renderState.visibleWorldWidthPx,
|
|
159
|
+
renderState.visibleWorldHeightPx,
|
|
160
|
+
difficultyProfile,
|
|
161
|
+
renderState.lastSpawnedPipeSpawnIntervalFrames,
|
|
162
|
+
bird.observationMemoryState,
|
|
163
|
+
);
|
|
164
|
+
const outputs = bird.network.activate(observation.observationVector);
|
|
165
|
+
if (FLAPPY_ENABLE_RUNTIME_INSTRUMENTATION) {
|
|
166
|
+
activationCallsThisSubstep += 1;
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
const shouldFlap = resolveFlapDecision(outputs);
|
|
170
|
+
commitObservationMemoryStep(
|
|
171
|
+
bird.observationMemoryState,
|
|
172
|
+
observation.observationFeatures,
|
|
173
|
+
shouldFlap,
|
|
174
|
+
);
|
|
175
|
+
|
|
176
|
+
if (shouldFlap) {
|
|
177
|
+
bird.velocityYPxPerFrame = FLAPPY_FLAP_VELOCITY_PX_PER_FRAME;
|
|
178
|
+
}
|
|
179
|
+
});
|
|
180
|
+
|
|
181
|
+
return activationCallsThisSubstep;
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
/**
|
|
185
|
+
* Integrates bird velocity and vertical motion for one control substep.
|
|
186
|
+
*
|
|
187
|
+
* @param frameContext - Shared frame context for this logical frame.
|
|
188
|
+
* @returns Nothing.
|
|
189
|
+
*/
|
|
190
|
+
function advanceBirdPhysics(frameContext: WorkerPlaybackFrameContext): void {
|
|
191
|
+
const { controlSubstepDelta, renderState } = frameContext;
|
|
192
|
+
|
|
193
|
+
renderState.birds.forEach((bird) => {
|
|
194
|
+
if (bird.done) {
|
|
195
|
+
return;
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
bird.velocityYPxPerFrame = clamp(
|
|
199
|
+
bird.velocityYPxPerFrame +
|
|
200
|
+
FLAPPY_GRAVITY_PX_PER_FRAME2 * controlSubstepDelta,
|
|
201
|
+
-Infinity,
|
|
202
|
+
FLAPPY_MAX_FALL_SPEED_PX_PER_FRAME,
|
|
203
|
+
);
|
|
204
|
+
bird.yPx += bird.velocityYPxPerFrame * controlSubstepDelta;
|
|
205
|
+
});
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
/**
|
|
209
|
+
* Advances all visible pipes and culls those that have left the camera window.
|
|
210
|
+
*
|
|
211
|
+
* @param frameContext - Shared frame context for this logical frame.
|
|
212
|
+
* @returns Nothing.
|
|
213
|
+
*/
|
|
214
|
+
function advancePipes(frameContext: WorkerPlaybackFrameContext): void {
|
|
215
|
+
const { controlSubstepDelta, difficultyProfile, renderState, cameraLeftXPx } =
|
|
216
|
+
frameContext;
|
|
217
|
+
const pipeTravelDistancePx =
|
|
218
|
+
difficultyProfile.pipeSpeedPxPerFrame * controlSubstepDelta;
|
|
219
|
+
|
|
220
|
+
renderState.cumulativePipeTravelPx += pipeTravelDistancePx;
|
|
221
|
+
|
|
222
|
+
renderState.pipes.forEach((pipe) => {
|
|
223
|
+
pipe.xPx -= pipeTravelDistancePx;
|
|
224
|
+
});
|
|
225
|
+
|
|
226
|
+
renderState.pipes = renderState.pipes.filter(
|
|
227
|
+
(pipe) => pipe.xPx + FLAPPY_PIPE_WIDTH_PX > cameraLeftXPx,
|
|
228
|
+
);
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
/**
|
|
232
|
+
* Spawns a new pipe when the substep budget crosses the spawn boundary.
|
|
233
|
+
*
|
|
234
|
+
* @param frameContext - Shared frame context for this logical frame.
|
|
235
|
+
* @returns Nothing.
|
|
236
|
+
*/
|
|
237
|
+
function spawnPipeIfNeeded(frameContext: WorkerPlaybackFrameContext): void {
|
|
238
|
+
const { controlSubstepDelta, difficultyProfile, renderState, rng } =
|
|
239
|
+
frameContext;
|
|
240
|
+
|
|
241
|
+
renderState.framesUntilNextPipeSpawn -= controlSubstepDelta;
|
|
242
|
+
if (renderState.framesUntilNextPipeSpawn > 0) {
|
|
243
|
+
return;
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
const nextGapSizePx = resolveNextSpawnGapSize(
|
|
247
|
+
renderState.lastSpawnedPipeGapPx,
|
|
248
|
+
difficultyProfile,
|
|
249
|
+
rng,
|
|
250
|
+
);
|
|
251
|
+
const nextSpawnIntervalFrames = resolveNextSpawnIntervalFrames(
|
|
252
|
+
renderState.lastSpawnedPipeSpawnIntervalFrames,
|
|
253
|
+
difficultyProfile,
|
|
254
|
+
);
|
|
255
|
+
const nextGapCenterYPx = resolveNextSpawnGapCenterY(
|
|
256
|
+
renderState.lastSpawnedPipeGapCenterYPx,
|
|
257
|
+
rng,
|
|
258
|
+
renderState.visibleWorldHeightPx,
|
|
259
|
+
);
|
|
260
|
+
|
|
261
|
+
renderState.pipes.push({
|
|
262
|
+
id: renderState.nextPipeId++,
|
|
263
|
+
xPx: resolvePipeSpawnXPx(renderState.visibleWorldWidthPx),
|
|
264
|
+
gapCenterYPx: nextGapCenterYPx,
|
|
265
|
+
gapSizePx: nextGapSizePx,
|
|
266
|
+
});
|
|
267
|
+
renderState.lastSpawnedPipeGapPx = nextGapSizePx;
|
|
268
|
+
renderState.lastSpawnedPipeGapCenterYPx = nextGapCenterYPx;
|
|
269
|
+
renderState.lastSpawnedPipeSpawnIntervalFrames = nextSpawnIntervalFrames;
|
|
270
|
+
renderState.framesUntilNextPipeSpawn += nextSpawnIntervalFrames;
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
/**
|
|
274
|
+
* Resolves bird deaths and passed-pipe progress after motion is applied.
|
|
275
|
+
*
|
|
276
|
+
* @param frameContext - Shared frame context for this logical frame.
|
|
277
|
+
* @returns Nothing.
|
|
278
|
+
*/
|
|
279
|
+
function resolveBirdTerminationAndProgress(
|
|
280
|
+
frameContext: WorkerPlaybackFrameContext,
|
|
281
|
+
): void {
|
|
282
|
+
const { renderState } = frameContext;
|
|
283
|
+
|
|
284
|
+
renderState.birds.forEach((bird) => {
|
|
285
|
+
if (bird.done) {
|
|
286
|
+
return;
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
if (resolveBirdOutOfBounds(bird, renderState.visibleWorldHeightPx)) {
|
|
290
|
+
bird.done = true;
|
|
291
|
+
bird.doneReason = 'out_of_bounds';
|
|
292
|
+
return;
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
for (const pipe of renderState.pipes) {
|
|
296
|
+
if (resolveBirdCollisionAgainstPipe(bird, pipe, frameContext)) {
|
|
297
|
+
bird.done = true;
|
|
298
|
+
bird.doneReason = 'collision';
|
|
299
|
+
break;
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
commitPassedPipeProgress(bird, pipe);
|
|
303
|
+
}
|
|
304
|
+
});
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
/**
|
|
308
|
+
* Resolves whether a bird has exceeded the vertical play area.
|
|
309
|
+
*
|
|
310
|
+
* @param bird - Mutable bird state.
|
|
311
|
+
* @param visibleWorldHeightPx - Current visible world height.
|
|
312
|
+
* @returns `true` when the bird is outside the vertical bounds.
|
|
313
|
+
*/
|
|
314
|
+
function resolveBirdOutOfBounds(
|
|
315
|
+
bird: WorkerPopulationBird,
|
|
316
|
+
visibleWorldHeightPx: number,
|
|
317
|
+
): boolean {
|
|
318
|
+
const birdTop = bird.yPx - FLAPPY_BIRD_RADIUS_PX;
|
|
319
|
+
const birdBottom = bird.yPx + FLAPPY_BIRD_RADIUS_PX;
|
|
320
|
+
|
|
321
|
+
return birdTop <= 0 || birdBottom >= visibleWorldHeightPx;
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
/**
|
|
325
|
+
* Resolves whether a bird collides with one pipe corridor during this substep.
|
|
326
|
+
*
|
|
327
|
+
* @param bird - Mutable bird state.
|
|
328
|
+
* @param pipe - Pipe candidate to test.
|
|
329
|
+
* @param frameContext - Shared frame context for this logical frame.
|
|
330
|
+
* @returns `true` when the bird overlaps the pipe body instead of the gap.
|
|
331
|
+
*/
|
|
332
|
+
function resolveBirdCollisionAgainstPipe(
|
|
333
|
+
bird: WorkerPopulationBird,
|
|
334
|
+
pipe: WorkerPopulationPipe,
|
|
335
|
+
frameContext: WorkerPlaybackFrameContext,
|
|
336
|
+
): boolean {
|
|
337
|
+
const { birdLeftXPx, birdRightXPx } = frameContext;
|
|
338
|
+
const birdTop = bird.yPx - FLAPPY_BIRD_RADIUS_PX;
|
|
339
|
+
const birdBottom = bird.yPx + FLAPPY_BIRD_RADIUS_PX;
|
|
340
|
+
const pipeLeft = pipe.xPx - FLAPPY_PIPE_COLLISION_SIDE_EXPAND_PX;
|
|
341
|
+
const pipeRight =
|
|
342
|
+
pipe.xPx + FLAPPY_PIPE_WIDTH_PX + FLAPPY_PIPE_COLLISION_SIDE_EXPAND_PX;
|
|
343
|
+
const overlapsHorizontally =
|
|
344
|
+
birdRightXPx >= pipeLeft && birdLeftXPx <= pipeRight;
|
|
345
|
+
|
|
346
|
+
if (!overlapsHorizontally) {
|
|
347
|
+
return false;
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
const gapHalf = pipe.gapSizePx * 0.5;
|
|
351
|
+
const gapTop =
|
|
352
|
+
pipe.gapCenterYPx - gapHalf + FLAPPY_PIPE_COLLISION_ENTRANCE_EXPAND_PX;
|
|
353
|
+
const gapBottom =
|
|
354
|
+
pipe.gapCenterYPx + gapHalf - FLAPPY_PIPE_COLLISION_ENTRANCE_EXPAND_PX;
|
|
355
|
+
|
|
356
|
+
return !(birdTop >= gapTop && birdBottom <= gapBottom);
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
/**
|
|
360
|
+
* Commits one passed-pipe progress increment for a bird when eligible.
|
|
361
|
+
*
|
|
362
|
+
* @param bird - Mutable bird state.
|
|
363
|
+
* @param pipe - Pipe candidate to mark as passed.
|
|
364
|
+
* @returns Nothing.
|
|
365
|
+
*/
|
|
366
|
+
function commitPassedPipeProgress(
|
|
367
|
+
bird: WorkerPopulationBird,
|
|
368
|
+
pipe: WorkerPopulationPipe,
|
|
369
|
+
): void {
|
|
370
|
+
const pipeRight =
|
|
371
|
+
pipe.xPx + FLAPPY_PIPE_WIDTH_PX + FLAPPY_PIPE_COLLISION_SIDE_EXPAND_PX;
|
|
372
|
+
if (pipeRight >= FLAPPY_BIRD_X_PX || bird.passedPipeIds.has(pipe.id)) {
|
|
373
|
+
return;
|
|
374
|
+
}
|
|
375
|
+
|
|
376
|
+
bird.passedPipeIds.add(pipe.id);
|
|
377
|
+
bird.pipesPassed += 1;
|
|
378
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { RngLike } from '../browser-entry/browser-entry.types';
|
|
2
|
+
import type { SharedDifficultyProfile } from '../flappy.simulation.shared.utils';
|
|
3
|
+
import type { WorkerPlaybackState } from './flappy-evolution-worker.types';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Shared mutable inputs for one worker playback frame simulation pass.
|
|
7
|
+
*
|
|
8
|
+
* Educational note:
|
|
9
|
+
* The frame service computes several derived geometry values once per logical
|
|
10
|
+
* frame and threads them through the substep helpers in this context object.
|
|
11
|
+
* That keeps the top-level simulation flow declarative while avoiding repeated
|
|
12
|
+
* argument sprawl across helper calls.
|
|
13
|
+
*/
|
|
14
|
+
export interface WorkerPlaybackFrameContext {
|
|
15
|
+
renderState: WorkerPlaybackState;
|
|
16
|
+
rng: RngLike;
|
|
17
|
+
difficultyProfile: SharedDifficultyProfile;
|
|
18
|
+
controlSubstepDelta: number;
|
|
19
|
+
cameraLeftXPx: number;
|
|
20
|
+
birdLeftXPx: number;
|
|
21
|
+
birdRightXPx: number;
|
|
22
|
+
}
|
|
@@ -1,52 +1,35 @@
|
|
|
1
1
|
import type Network from '../../../../src/architecture/network';
|
|
2
|
-
import { clamp } from '../browser-entry/browser-entry.math.utils';
|
|
3
2
|
import {
|
|
4
|
-
commitObservationMemoryStep,
|
|
5
|
-
resolveFlapDecision,
|
|
6
|
-
resolveObservationVector,
|
|
7
|
-
} from '../browser-entry/browser-entry.observation.utils';
|
|
8
|
-
import {
|
|
9
|
-
createBirdColor,
|
|
10
|
-
resolveDifficultyProfile,
|
|
11
|
-
resolveNextSpawnGapCenterY,
|
|
12
3
|
resolveNextSpawnGapSize,
|
|
13
4
|
resolveNextSpawnIntervalFrames,
|
|
14
5
|
sampleGapCenterY,
|
|
15
6
|
} from '../browser-entry/browser-entry.spawn.utils';
|
|
16
7
|
import type { RngLike } from '../browser-entry/browser-entry.types';
|
|
17
8
|
import { resolvePipeSpawnXPx } from '../browser-entry/browser-entry.viewport.utils';
|
|
18
|
-
import { createSharedObservationMemoryState } from '../flappy.simulation.shared.utils';
|
|
19
|
-
import { FLAPPY_BIRD_VIEWPORT_X_RATIO } from '../constants/constants';
|
|
20
9
|
import {
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
FLAPPY_PIPE_COLLISION_SIDE_EXPAND_PX,
|
|
25
|
-
FLAPPY_CONTROL_SUBSTEPS_PER_FRAME,
|
|
26
|
-
FLAPPY_ENABLE_RUNTIME_INSTRUMENTATION,
|
|
27
|
-
FLAPPY_FLAP_VELOCITY_PX_PER_FRAME,
|
|
28
|
-
FLAPPY_GRAVITY_PX_PER_FRAME2,
|
|
29
|
-
FLAPPY_MAX_FALL_SPEED_PX_PER_FRAME,
|
|
30
|
-
FLAPPY_PIPE_WIDTH_PX,
|
|
31
|
-
} from '../constants/constants';
|
|
10
|
+
createSharedObservationMemoryState,
|
|
11
|
+
resolveAdaptiveDifficultyProfile,
|
|
12
|
+
} from '../flappy.simulation.shared.utils';
|
|
32
13
|
import type { WorkerPlaybackState } from './flappy-evolution-worker.types';
|
|
33
14
|
|
|
34
|
-
/**
|
|
35
|
-
* Resolves the current left-edge of the visible world in world-space pixels.
|
|
36
|
-
*
|
|
37
|
-
* @param visibleWorldWidthPx - Current visible world width.
|
|
38
|
-
* @returns Left edge x-position in world coordinates.
|
|
39
|
-
*/
|
|
40
|
-
function resolveCameraLeftXPx(visibleWorldWidthPx: number): number {
|
|
41
|
-
const clampedVisibleWorldWidthPx = Math.max(1, visibleWorldWidthPx);
|
|
42
|
-
const desiredBirdScreenXPx =
|
|
43
|
-
clampedVisibleWorldWidthPx * FLAPPY_BIRD_VIEWPORT_X_RATIO;
|
|
44
|
-
return FLAPPY_BIRD_X_PX - desiredBirdScreenXPx;
|
|
45
|
-
}
|
|
46
|
-
|
|
47
15
|
/**
|
|
48
16
|
* Creates initial playback state for a population of networks.
|
|
49
17
|
*
|
|
18
|
+
* Educational note:
|
|
19
|
+
* This is the ownership boundary for worker playback initialization. The frame
|
|
20
|
+
* simulation service mutates the returned state on every step, but only this
|
|
21
|
+
* helper decides how a fresh population is placed into the world at time zero.
|
|
22
|
+
*
|
|
23
|
+
* @example
|
|
24
|
+
* ```ts
|
|
25
|
+
* const playbackState = createWorkerPopulationRenderState(
|
|
26
|
+
* currentPopulation,
|
|
27
|
+
* rng,
|
|
28
|
+
* 1280,
|
|
29
|
+
* 720,
|
|
30
|
+
* );
|
|
31
|
+
* ```
|
|
32
|
+
*
|
|
50
33
|
* @param networks - Population to visualize.
|
|
51
34
|
* @param rng - Deterministic random source.
|
|
52
35
|
* @param initialVisibleWorldWidthPx - Initial viewport width from host.
|
|
@@ -59,7 +42,7 @@ export function createWorkerPopulationRenderState(
|
|
|
59
42
|
initialVisibleWorldWidthPx: number,
|
|
60
43
|
initialVisibleWorldHeightPx: number,
|
|
61
44
|
): WorkerPlaybackState {
|
|
62
|
-
const initialDifficultyProfile =
|
|
45
|
+
const initialDifficultyProfile = resolveAdaptiveDifficultyProfile(0, 1);
|
|
63
46
|
const initialGapCenterYPx = sampleGapCenterY(
|
|
64
47
|
rng,
|
|
65
48
|
initialVisibleWorldHeightPx,
|
|
@@ -76,7 +59,6 @@ export function createWorkerPopulationRenderState(
|
|
|
76
59
|
|
|
77
60
|
const birds = networks.map((network, networkIndex) => ({
|
|
78
61
|
network,
|
|
79
|
-
color: createBirdColor(networkIndex, networks.length),
|
|
80
62
|
observationMemoryState: createSharedObservationMemoryState(),
|
|
81
63
|
yPx: initialVisibleWorldHeightPx * 0.5,
|
|
82
64
|
velocityYPxPerFrame: 0,
|
|
@@ -88,6 +70,7 @@ export function createWorkerPopulationRenderState(
|
|
|
88
70
|
|
|
89
71
|
return {
|
|
90
72
|
frameIndex: 0,
|
|
73
|
+
cumulativePipeTravelPx: 0,
|
|
91
74
|
visibleWorldWidthPx: initialVisibleWorldWidthPx,
|
|
92
75
|
visibleWorldHeightPx: initialVisibleWorldHeightPx,
|
|
93
76
|
nextPipeId: 2,
|
|
@@ -106,169 +89,3 @@ export function createWorkerPopulationRenderState(
|
|
|
106
89
|
birds,
|
|
107
90
|
};
|
|
108
91
|
}
|
|
109
|
-
|
|
110
|
-
/**
|
|
111
|
-
* Advances the whole population simulation by one logical frame.
|
|
112
|
-
*
|
|
113
|
-
* @param renderState - Mutable simulation state.
|
|
114
|
-
* @param rng - Deterministic random source for spawn variation.
|
|
115
|
-
* @param difficultyProfile - Active dynamic difficulty profile.
|
|
116
|
-
* @returns Number of policy activation calls made in this frame.
|
|
117
|
-
*/
|
|
118
|
-
export function stepWorkerPopulationFrame(
|
|
119
|
-
renderState: WorkerPlaybackState,
|
|
120
|
-
rng: RngLike,
|
|
121
|
-
difficultyProfile: {
|
|
122
|
-
pipeGapPx: number;
|
|
123
|
-
pipeSpeedPxPerFrame: number;
|
|
124
|
-
pipeSpawnIntervalFrames: number;
|
|
125
|
-
},
|
|
126
|
-
): number {
|
|
127
|
-
const controlSubstepCount = Math.max(1, FLAPPY_CONTROL_SUBSTEPS_PER_FRAME);
|
|
128
|
-
const controlSubstepDelta = 1 / controlSubstepCount;
|
|
129
|
-
let activationCallsThisFrame = 0;
|
|
130
|
-
|
|
131
|
-
renderState.birds.forEach((bird) => {
|
|
132
|
-
if (bird.done) return;
|
|
133
|
-
bird.framesSurvived += 1;
|
|
134
|
-
});
|
|
135
|
-
|
|
136
|
-
for (
|
|
137
|
-
let controlSubstepIndex = 0;
|
|
138
|
-
controlSubstepIndex < controlSubstepCount;
|
|
139
|
-
controlSubstepIndex++
|
|
140
|
-
) {
|
|
141
|
-
renderState.birds.forEach((bird) => {
|
|
142
|
-
if (bird.done) return;
|
|
143
|
-
|
|
144
|
-
const observation = resolveObservationVector(
|
|
145
|
-
bird.yPx,
|
|
146
|
-
bird.velocityYPxPerFrame,
|
|
147
|
-
renderState.pipes,
|
|
148
|
-
renderState.visibleWorldWidthPx,
|
|
149
|
-
renderState.visibleWorldHeightPx,
|
|
150
|
-
difficultyProfile,
|
|
151
|
-
renderState.lastSpawnedPipeSpawnIntervalFrames,
|
|
152
|
-
bird.observationMemoryState,
|
|
153
|
-
);
|
|
154
|
-
const outputs = bird.network.activate(
|
|
155
|
-
observation.observationVector,
|
|
156
|
-
) as unknown;
|
|
157
|
-
if (FLAPPY_ENABLE_RUNTIME_INSTRUMENTATION) {
|
|
158
|
-
activationCallsThisFrame += 1;
|
|
159
|
-
}
|
|
160
|
-
const shouldFlap = resolveFlapDecision(outputs);
|
|
161
|
-
commitObservationMemoryStep(
|
|
162
|
-
bird.observationMemoryState,
|
|
163
|
-
observation.observationFeatures,
|
|
164
|
-
shouldFlap,
|
|
165
|
-
);
|
|
166
|
-
|
|
167
|
-
if (shouldFlap) {
|
|
168
|
-
bird.velocityYPxPerFrame = FLAPPY_FLAP_VELOCITY_PX_PER_FRAME;
|
|
169
|
-
}
|
|
170
|
-
});
|
|
171
|
-
|
|
172
|
-
renderState.birds.forEach((bird) => {
|
|
173
|
-
if (bird.done) return;
|
|
174
|
-
|
|
175
|
-
bird.velocityYPxPerFrame = clamp(
|
|
176
|
-
bird.velocityYPxPerFrame +
|
|
177
|
-
FLAPPY_GRAVITY_PX_PER_FRAME2 * controlSubstepDelta,
|
|
178
|
-
-Infinity,
|
|
179
|
-
FLAPPY_MAX_FALL_SPEED_PX_PER_FRAME,
|
|
180
|
-
);
|
|
181
|
-
bird.yPx += bird.velocityYPxPerFrame * controlSubstepDelta;
|
|
182
|
-
});
|
|
183
|
-
|
|
184
|
-
renderState.pipes.forEach((pipe) => {
|
|
185
|
-
pipe.xPx -= difficultyProfile.pipeSpeedPxPerFrame * controlSubstepDelta;
|
|
186
|
-
});
|
|
187
|
-
|
|
188
|
-
const cameraLeftXPx = resolveCameraLeftXPx(renderState.visibleWorldWidthPx);
|
|
189
|
-
renderState.pipes = renderState.pipes.filter(
|
|
190
|
-
(pipe) => pipe.xPx + FLAPPY_PIPE_WIDTH_PX > cameraLeftXPx,
|
|
191
|
-
);
|
|
192
|
-
|
|
193
|
-
renderState.framesUntilNextPipeSpawn -= controlSubstepDelta;
|
|
194
|
-
if (renderState.framesUntilNextPipeSpawn <= 0) {
|
|
195
|
-
const nextGapSizePx = resolveNextSpawnGapSize(
|
|
196
|
-
renderState.lastSpawnedPipeGapPx,
|
|
197
|
-
difficultyProfile,
|
|
198
|
-
rng,
|
|
199
|
-
);
|
|
200
|
-
const nextSpawnIntervalFrames = resolveNextSpawnIntervalFrames(
|
|
201
|
-
renderState.lastSpawnedPipeSpawnIntervalFrames,
|
|
202
|
-
difficultyProfile,
|
|
203
|
-
);
|
|
204
|
-
const nextGapCenterYPx = resolveNextSpawnGapCenterY(
|
|
205
|
-
renderState.lastSpawnedPipeGapCenterYPx,
|
|
206
|
-
rng,
|
|
207
|
-
renderState.visibleWorldHeightPx,
|
|
208
|
-
);
|
|
209
|
-
renderState.pipes.push({
|
|
210
|
-
id: renderState.nextPipeId++,
|
|
211
|
-
xPx: resolvePipeSpawnXPx(renderState.visibleWorldWidthPx),
|
|
212
|
-
gapCenterYPx: nextGapCenterYPx,
|
|
213
|
-
gapSizePx: nextGapSizePx,
|
|
214
|
-
});
|
|
215
|
-
renderState.lastSpawnedPipeGapPx = nextGapSizePx;
|
|
216
|
-
renderState.lastSpawnedPipeGapCenterYPx = nextGapCenterYPx;
|
|
217
|
-
renderState.lastSpawnedPipeSpawnIntervalFrames = nextSpawnIntervalFrames;
|
|
218
|
-
renderState.framesUntilNextPipeSpawn += nextSpawnIntervalFrames;
|
|
219
|
-
}
|
|
220
|
-
|
|
221
|
-
renderState.birds.forEach((bird) => {
|
|
222
|
-
if (bird.done) return;
|
|
223
|
-
|
|
224
|
-
const birdTop = bird.yPx - FLAPPY_BIRD_RADIUS_PX;
|
|
225
|
-
const birdBottom = bird.yPx + FLAPPY_BIRD_RADIUS_PX;
|
|
226
|
-
|
|
227
|
-
if (birdTop <= 0 || birdBottom >= renderState.visibleWorldHeightPx) {
|
|
228
|
-
bird.done = true;
|
|
229
|
-
bird.doneReason = 'out_of_bounds';
|
|
230
|
-
return;
|
|
231
|
-
}
|
|
232
|
-
|
|
233
|
-
const birdLeft = FLAPPY_BIRD_X_PX - FLAPPY_BIRD_RADIUS_PX;
|
|
234
|
-
const birdRight = FLAPPY_BIRD_X_PX + FLAPPY_BIRD_RADIUS_PX;
|
|
235
|
-
|
|
236
|
-
for (const pipe of renderState.pipes) {
|
|
237
|
-
const pipeLeft = pipe.xPx - FLAPPY_PIPE_COLLISION_SIDE_EXPAND_PX;
|
|
238
|
-
const pipeRight =
|
|
239
|
-
pipe.xPx +
|
|
240
|
-
FLAPPY_PIPE_WIDTH_PX +
|
|
241
|
-
FLAPPY_PIPE_COLLISION_SIDE_EXPAND_PX;
|
|
242
|
-
const overlapsHorizontally =
|
|
243
|
-
birdRight >= pipeLeft && birdLeft <= pipeRight;
|
|
244
|
-
|
|
245
|
-
if (overlapsHorizontally) {
|
|
246
|
-
const gapHalf = pipe.gapSizePx * 0.5;
|
|
247
|
-
const gapTop =
|
|
248
|
-
pipe.gapCenterYPx -
|
|
249
|
-
gapHalf +
|
|
250
|
-
FLAPPY_PIPE_COLLISION_ENTRANCE_EXPAND_PX;
|
|
251
|
-
const gapBottom =
|
|
252
|
-
pipe.gapCenterYPx +
|
|
253
|
-
gapHalf -
|
|
254
|
-
FLAPPY_PIPE_COLLISION_ENTRANCE_EXPAND_PX;
|
|
255
|
-
const isInsideGap = birdTop >= gapTop && birdBottom <= gapBottom;
|
|
256
|
-
|
|
257
|
-
if (!isInsideGap) {
|
|
258
|
-
bird.done = true;
|
|
259
|
-
bird.doneReason = 'collision';
|
|
260
|
-
break;
|
|
261
|
-
}
|
|
262
|
-
}
|
|
263
|
-
|
|
264
|
-
if (pipeRight < FLAPPY_BIRD_X_PX && !bird.passedPipeIds.has(pipe.id)) {
|
|
265
|
-
bird.passedPipeIds.add(pipe.id);
|
|
266
|
-
bird.pipesPassed += 1;
|
|
267
|
-
}
|
|
268
|
-
}
|
|
269
|
-
});
|
|
270
|
-
}
|
|
271
|
-
|
|
272
|
-
renderState.frameIndex += 1;
|
|
273
|
-
return activationCallsThisFrame;
|
|
274
|
-
}
|