@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
|
@@ -4,10 +4,21 @@ import type {
|
|
|
4
4
|
SharedObservationMemoryState,
|
|
5
5
|
} from '../flappy.simulation.shared.utils';
|
|
6
6
|
|
|
7
|
-
/**
|
|
7
|
+
/**
|
|
8
|
+
* Loose JSON-compatible network payload used by worker messages.
|
|
9
|
+
*
|
|
10
|
+
* The worker never posts live `Network` instances back to the browser host.
|
|
11
|
+
* Instead it sends the result of `network.toJSON()` so the payload stays
|
|
12
|
+
* structured-clone safe and easy to inspect in devtools.
|
|
13
|
+
*/
|
|
8
14
|
export type SerializedNetwork = Record<string, unknown>;
|
|
9
15
|
|
|
10
|
-
/**
|
|
16
|
+
/**
|
|
17
|
+
* Mutable pipe state tracked by the worker playback simulation.
|
|
18
|
+
*
|
|
19
|
+
* These objects exist only inside the worker runtime. The host later receives a
|
|
20
|
+
* packed snapshot derived from them rather than these live mutable records.
|
|
21
|
+
*/
|
|
11
22
|
export interface WorkerPopulationPipe {
|
|
12
23
|
id: number;
|
|
13
24
|
xPx: number;
|
|
@@ -15,10 +26,16 @@ export interface WorkerPopulationPipe {
|
|
|
15
26
|
gapSizePx: number;
|
|
16
27
|
}
|
|
17
28
|
|
|
18
|
-
/**
|
|
29
|
+
/**
|
|
30
|
+
* Mutable bird state tracked by the worker playback simulation.
|
|
31
|
+
*
|
|
32
|
+
* Educational note:
|
|
33
|
+
* Each bird keeps both physics state and policy state. The observation-memory
|
|
34
|
+
* field lets feed-forward networks approximate short-term temporal memory by
|
|
35
|
+
* carrying previous observation features between simulation steps.
|
|
36
|
+
*/
|
|
19
37
|
export interface WorkerPopulationBird {
|
|
20
38
|
network: Network;
|
|
21
|
-
color: string;
|
|
22
39
|
observationMemoryState: SharedObservationMemoryState;
|
|
23
40
|
yPx: number;
|
|
24
41
|
velocityYPxPerFrame: number;
|
|
@@ -29,9 +46,16 @@ export interface WorkerPopulationBird {
|
|
|
29
46
|
doneReason?: 'collision' | 'out_of_bounds';
|
|
30
47
|
}
|
|
31
48
|
|
|
32
|
-
/**
|
|
49
|
+
/**
|
|
50
|
+
* Mutable simulation state stored between worker playback requests.
|
|
51
|
+
*
|
|
52
|
+
* A `start-playback` message creates this state once, and each
|
|
53
|
+
* `request-playback-step` message advances it by a host-selected number of
|
|
54
|
+
* simulation steps.
|
|
55
|
+
*/
|
|
33
56
|
export interface WorkerPlaybackState {
|
|
34
57
|
frameIndex: number;
|
|
58
|
+
cumulativePipeTravelPx: number;
|
|
35
59
|
visibleWorldWidthPx: number;
|
|
36
60
|
visibleWorldHeightPx: number;
|
|
37
61
|
nextPipeId: number;
|
|
@@ -43,16 +67,25 @@ export interface WorkerPlaybackState {
|
|
|
43
67
|
birds: WorkerPopulationBird[];
|
|
44
68
|
}
|
|
45
69
|
|
|
46
|
-
/**
|
|
70
|
+
/**
|
|
71
|
+
* Render-only bird snapshot DTO posted to host.
|
|
72
|
+
*
|
|
73
|
+
* This shape is useful conceptually, but the current transport uses the packed
|
|
74
|
+
* typed-array variant for lower allocation and transfer cost.
|
|
75
|
+
*/
|
|
47
76
|
export interface WorkerFrameBirdSnapshot {
|
|
48
|
-
color: string;
|
|
49
77
|
yPx: number;
|
|
50
78
|
pipesPassed: number;
|
|
51
79
|
framesSurvived: number;
|
|
52
80
|
done: boolean;
|
|
53
81
|
}
|
|
54
82
|
|
|
55
|
-
/**
|
|
83
|
+
/**
|
|
84
|
+
* Render-only pipe snapshot DTO posted to host.
|
|
85
|
+
*
|
|
86
|
+
* Like `WorkerFrameBirdSnapshot`, this documents the logical payload shape even
|
|
87
|
+
* though the worker currently sends the packed transport form.
|
|
88
|
+
*/
|
|
56
89
|
export interface WorkerFramePipeSnapshot {
|
|
57
90
|
id: number;
|
|
58
91
|
xPx: number;
|
|
@@ -60,16 +93,70 @@ export interface WorkerFramePipeSnapshot {
|
|
|
60
93
|
gapSizePx: number;
|
|
61
94
|
}
|
|
62
95
|
|
|
63
|
-
/**
|
|
96
|
+
/**
|
|
97
|
+
* Packed typed-array payload for playback pipe snapshot transport.
|
|
98
|
+
*
|
|
99
|
+
* Packing the per-pipe fields into column-oriented typed arrays makes the
|
|
100
|
+
* browser/worker boundary cheaper than sending large arrays of object literals
|
|
101
|
+
* on every animation frame.
|
|
102
|
+
*/
|
|
103
|
+
export interface WorkerPackedPlaybackPipeSnapshot {
|
|
104
|
+
xPositionsPx: Float32Array;
|
|
105
|
+
gapCenterYPositionsPx: Float32Array;
|
|
106
|
+
gapSizesPx: Float32Array;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* Packed typed-array payload for playback bird snapshot transport.
|
|
111
|
+
*
|
|
112
|
+
* The host can reconstruct renderer-friendly bird views from these arrays while
|
|
113
|
+
* the worker keeps the authoritative mutable simulation objects private.
|
|
114
|
+
*/
|
|
115
|
+
export interface WorkerPackedPlaybackBirdSnapshot {
|
|
116
|
+
yPositionsPx: Float32Array;
|
|
117
|
+
pipesPassed: Uint32Array;
|
|
118
|
+
framesSurvived: Uint32Array;
|
|
119
|
+
doneFlags: Uint8Array;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/**
|
|
123
|
+
* Full frame snapshot payload posted to host.
|
|
124
|
+
*
|
|
125
|
+
* Educational note:
|
|
126
|
+
* `packed-v1` is a transport contract, not a rendering primitive. The versioned
|
|
127
|
+
* format string gives the browser host a stable way to decode snapshots even if
|
|
128
|
+
* the worker later gains additional packed fields or alternate transport modes.
|
|
129
|
+
*
|
|
130
|
+
* @example
|
|
131
|
+
* ```ts
|
|
132
|
+
* const message = {
|
|
133
|
+
* type: 'playback-step',
|
|
134
|
+
* payload: {
|
|
135
|
+
* requestId: 7,
|
|
136
|
+
* snapshot,
|
|
137
|
+
* done: false,
|
|
138
|
+
* },
|
|
139
|
+
* };
|
|
140
|
+
* ```
|
|
141
|
+
*/
|
|
64
142
|
export interface WorkerPlaybackFrameSnapshot {
|
|
143
|
+
format: 'packed-v1';
|
|
65
144
|
frameIndex: number;
|
|
145
|
+
cumulativePipeTravelPx: number;
|
|
66
146
|
visibleWorldWidthPx: number;
|
|
67
147
|
visibleWorldHeightPx: number;
|
|
68
|
-
|
|
69
|
-
|
|
148
|
+
pipeCount: number;
|
|
149
|
+
birdCount: number;
|
|
150
|
+
pipes: WorkerPackedPlaybackPipeSnapshot;
|
|
151
|
+
birds: WorkerPackedPlaybackBirdSnapshot;
|
|
70
152
|
}
|
|
71
153
|
|
|
72
|
-
/**
|
|
154
|
+
/**
|
|
155
|
+
* Worker init request message.
|
|
156
|
+
*
|
|
157
|
+
* This is the first message the host should send. It seeds deterministic RNG
|
|
158
|
+
* state and configures the worker-local NEAT runtime.
|
|
159
|
+
*/
|
|
73
160
|
export interface WorkerInitMessage {
|
|
74
161
|
type: 'init';
|
|
75
162
|
payload: {
|
|
@@ -79,12 +166,23 @@ export interface WorkerInitMessage {
|
|
|
79
166
|
};
|
|
80
167
|
}
|
|
81
168
|
|
|
82
|
-
/**
|
|
169
|
+
/**
|
|
170
|
+
* Worker request asking to evolve one generation.
|
|
171
|
+
*
|
|
172
|
+
* The worker responds with `generation-ready` once the NEAT runtime finishes
|
|
173
|
+
* one evolution pass.
|
|
174
|
+
*/
|
|
83
175
|
export interface WorkerRequestGenerationMessage {
|
|
84
176
|
type: 'request-generation';
|
|
85
177
|
}
|
|
86
178
|
|
|
87
|
-
/**
|
|
179
|
+
/**
|
|
180
|
+
* Worker request asking to initialize playback state.
|
|
181
|
+
*
|
|
182
|
+
* This materializes the mutable world state for the current evolved population.
|
|
183
|
+
* After this message succeeds, the host can begin issuing playback-step
|
|
184
|
+
* requests.
|
|
185
|
+
*/
|
|
88
186
|
export interface WorkerStartPlaybackMessage {
|
|
89
187
|
type: 'start-playback';
|
|
90
188
|
payload: {
|
|
@@ -93,22 +191,40 @@ export interface WorkerStartPlaybackMessage {
|
|
|
93
191
|
};
|
|
94
192
|
}
|
|
95
193
|
|
|
96
|
-
/**
|
|
194
|
+
/**
|
|
195
|
+
* Worker request asking to advance playback by N simulation steps.
|
|
196
|
+
*
|
|
197
|
+
* The host typically sends this once per animation frame and chooses
|
|
198
|
+
* `simulationSteps` based on how much simulation throughput it wants relative to
|
|
199
|
+
* rendering smoothness.
|
|
200
|
+
*/
|
|
97
201
|
export interface WorkerRequestPlaybackStepMessage {
|
|
98
202
|
type: 'request-playback-step';
|
|
99
203
|
payload: {
|
|
204
|
+
requestId: number;
|
|
100
205
|
simulationSteps: number;
|
|
101
206
|
visibleWorldWidthPx: number;
|
|
102
207
|
visibleWorldHeightPx: number;
|
|
103
208
|
};
|
|
104
209
|
}
|
|
105
210
|
|
|
106
|
-
/**
|
|
211
|
+
/**
|
|
212
|
+
* Worker stop request message.
|
|
213
|
+
*
|
|
214
|
+
* This is a cooperative shutdown signal. Long-running worker flows can observe
|
|
215
|
+
* the stopped flag and fail fast instead of continuing work the UI no longer
|
|
216
|
+
* cares about.
|
|
217
|
+
*/
|
|
107
218
|
export interface WorkerStopMessage {
|
|
108
219
|
type: 'stop';
|
|
109
220
|
}
|
|
110
221
|
|
|
111
|
-
/**
|
|
222
|
+
/**
|
|
223
|
+
* Union of inbound worker request messages.
|
|
224
|
+
*
|
|
225
|
+
* Reading this union top-to-bottom is the quickest way to understand the worker
|
|
226
|
+
* protocol: initialize, evolve, start playback, step playback, then stop.
|
|
227
|
+
*/
|
|
112
228
|
export type WorkerRequestMessage =
|
|
113
229
|
| WorkerInitMessage
|
|
114
230
|
| WorkerRequestGenerationMessage
|
|
@@ -116,7 +232,12 @@ export type WorkerRequestMessage =
|
|
|
116
232
|
| WorkerRequestPlaybackStepMessage
|
|
117
233
|
| WorkerStopMessage;
|
|
118
234
|
|
|
119
|
-
/**
|
|
235
|
+
/**
|
|
236
|
+
* Worker generation-ready response message.
|
|
237
|
+
*
|
|
238
|
+
* The browser host uses this message to refresh HUD state and optionally render
|
|
239
|
+
* the current best network visualization.
|
|
240
|
+
*/
|
|
120
241
|
export interface WorkerGenerationReadyMessage {
|
|
121
242
|
type: 'generation-ready';
|
|
122
243
|
payload: {
|
|
@@ -126,10 +247,21 @@ export interface WorkerGenerationReadyMessage {
|
|
|
126
247
|
};
|
|
127
248
|
}
|
|
128
249
|
|
|
129
|
-
/**
|
|
250
|
+
/**
|
|
251
|
+
* Worker playback-step response message.
|
|
252
|
+
*
|
|
253
|
+
* The message carries the packed frame snapshot plus optional instrumentation
|
|
254
|
+
* and end-of-run summary statistics when the whole simulated population has
|
|
255
|
+
* been eliminated.
|
|
256
|
+
*
|
|
257
|
+
* The split between per-frame snapshot data and end-of-run summary fields keeps
|
|
258
|
+
* the hot path compact while still giving the host enough telemetry to update
|
|
259
|
+
* HUD metrics when a playback session completes.
|
|
260
|
+
*/
|
|
130
261
|
export interface WorkerPlaybackStepMessage {
|
|
131
262
|
type: 'playback-step';
|
|
132
263
|
payload: {
|
|
264
|
+
requestId: number;
|
|
133
265
|
snapshot: WorkerPlaybackFrameSnapshot;
|
|
134
266
|
instrumentation?: {
|
|
135
267
|
activationCallsPerFrame: number;
|
|
@@ -143,7 +275,12 @@ export interface WorkerPlaybackStepMessage {
|
|
|
143
275
|
};
|
|
144
276
|
}
|
|
145
277
|
|
|
146
|
-
/**
|
|
278
|
+
/**
|
|
279
|
+
* Worker error response message.
|
|
280
|
+
*
|
|
281
|
+
* Errors are normalized into a display-safe string so the host UI can surface
|
|
282
|
+
* failures without depending on worker-specific exception classes.
|
|
283
|
+
*/
|
|
147
284
|
export interface WorkerErrorMessage {
|
|
148
285
|
type: 'error';
|
|
149
286
|
payload: {
|
|
@@ -151,11 +288,22 @@ export interface WorkerErrorMessage {
|
|
|
151
288
|
};
|
|
152
289
|
}
|
|
153
290
|
|
|
154
|
-
/**
|
|
291
|
+
/**
|
|
292
|
+
* Union of outbound worker response messages.
|
|
293
|
+
*
|
|
294
|
+
* Together with `WorkerRequestMessage`, this forms the full host/worker
|
|
295
|
+
* protocol contract for the demo.
|
|
296
|
+
*/
|
|
155
297
|
export type WorkerResponseMessage =
|
|
156
298
|
| WorkerGenerationReadyMessage
|
|
157
299
|
| WorkerPlaybackStepMessage
|
|
158
300
|
| WorkerErrorMessage;
|
|
159
301
|
|
|
160
|
-
/**
|
|
302
|
+
/**
|
|
303
|
+
* Structured features used by heuristic generation-0 teacher policy.
|
|
304
|
+
*
|
|
305
|
+
* The warm-start service reuses the same high-level observation semantics as the
|
|
306
|
+
* real policy inference path, which keeps the heuristic teacher aligned with the
|
|
307
|
+
* features evolved networks will later see.
|
|
308
|
+
*/
|
|
161
309
|
export type WorkerHeuristicObservationFeatures = SharedObservationFeatures;
|
|
@@ -0,0 +1,314 @@
|
|
|
1
|
+
import type { Neat } from '../../../../src/neataptic';
|
|
2
|
+
import type Network from '../../../../src/architecture/network';
|
|
3
|
+
import { createXorshift32 } from '../rng';
|
|
4
|
+
import {
|
|
5
|
+
commitObservationMemoryStep,
|
|
6
|
+
resolveFlapDecision,
|
|
7
|
+
resolveObservationVector,
|
|
8
|
+
} from '../browser-entry/browser-entry.observation.utils';
|
|
9
|
+
import { sampleGapCenterY } from '../browser-entry/browser-entry.spawn.utils';
|
|
10
|
+
import type {
|
|
11
|
+
WorkerHeuristicObservationFeatures,
|
|
12
|
+
WorkerPopulationPipe,
|
|
13
|
+
} from './flappy-evolution-worker.types';
|
|
14
|
+
import { FLAPPY_BIRD_VIEWPORT_X_RATIO } from '../constants/constants';
|
|
15
|
+
import {
|
|
16
|
+
FLAPPY_BIRD_RADIUS_PX,
|
|
17
|
+
FLAPPY_BIRD_X_PX,
|
|
18
|
+
FLAPPY_PIPE_COLLISION_ENTRANCE_EXPAND_PX,
|
|
19
|
+
FLAPPY_PIPE_COLLISION_SIDE_EXPAND_PX,
|
|
20
|
+
FLAPPY_CONTROL_SUBSTEPS_PER_FRAME,
|
|
21
|
+
FLAPPY_FLAP_VELOCITY_PX_PER_FRAME,
|
|
22
|
+
FLAPPY_GRAVITY_PX_PER_FRAME2,
|
|
23
|
+
FLAPPY_MAX_FALL_SPEED_PX_PER_FRAME,
|
|
24
|
+
FLAPPY_PIPE_WIDTH_PX,
|
|
25
|
+
FLAPPY_WORLD_HEIGHT_PX,
|
|
26
|
+
} from '../constants/constants';
|
|
27
|
+
import {
|
|
28
|
+
FLAPPY_WORKER_GEN0_PRETRAIN_BATCH_SIZE,
|
|
29
|
+
FLAPPY_WORKER_GEN0_PRETRAIN_BIAS_NOISE_STDDEV,
|
|
30
|
+
FLAPPY_WORKER_GEN0_PRETRAIN_ITERATIONS,
|
|
31
|
+
FLAPPY_WORKER_GEN0_PRETRAIN_RATE,
|
|
32
|
+
FLAPPY_WORKER_GEN0_PRETRAIN_SAMPLE_COUNT,
|
|
33
|
+
FLAPPY_WORKER_GEN0_PRETRAIN_VISIBLE_WORLD_WIDTH_PX,
|
|
34
|
+
FLAPPY_WORKER_GEN0_PRETRAIN_WEIGHT_NOISE_STDDEV,
|
|
35
|
+
} from './flappy-evolution-worker.constants';
|
|
36
|
+
import {
|
|
37
|
+
createSharedObservationMemoryState,
|
|
38
|
+
resolveAdaptiveDifficultyProfile,
|
|
39
|
+
} from '../flappy.simulation.shared.utils';
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* State carried between generation requests for one worker runtime.
|
|
43
|
+
*
|
|
44
|
+
* The warm-start service is intentionally one-shot. These fields let the worker
|
|
45
|
+
* remember whether generation 0 has already been bootstrapped and which initial
|
|
46
|
+
* RNG seed should be reused for deterministic synthetic sample generation.
|
|
47
|
+
*/
|
|
48
|
+
export interface WorkerWarmStartState {
|
|
49
|
+
workerInitSeed: number;
|
|
50
|
+
generationZeroWarmStartApplied: boolean;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Applies a one-time generation-0 warm-start to improve initial demo quality.
|
|
55
|
+
*
|
|
56
|
+
* Educational note:
|
|
57
|
+
* The worker entry should stay protocol-first. This service owns the short
|
|
58
|
+
* supervised bootstrap pass that nudges generation 0 away from pure noise while
|
|
59
|
+
* preserving the later NEAT-driven search loop.
|
|
60
|
+
*
|
|
61
|
+
* Conceptually this is a lightweight behavior-cloning pass. If you want more
|
|
62
|
+
* background, the Wikipedia article on "imitation learning" is a helpful bridge
|
|
63
|
+
* between the heuristic teacher used here and the later evolutionary search.
|
|
64
|
+
*
|
|
65
|
+
* @param neatController - Initialized NEAT runtime.
|
|
66
|
+
* @param warmStartState - Mutable warm-start lifecycle state.
|
|
67
|
+
* @returns Promise resolved when warm-start evaluation finishes.
|
|
68
|
+
* @example
|
|
69
|
+
* ```ts
|
|
70
|
+
* await warmStartWorkerGenerationZeroIfNeeded(neatRuntime, {
|
|
71
|
+
* workerInitSeed: 123,
|
|
72
|
+
* generationZeroWarmStartApplied: false,
|
|
73
|
+
* });
|
|
74
|
+
* ```
|
|
75
|
+
*/
|
|
76
|
+
export async function warmStartWorkerGenerationZeroIfNeeded(
|
|
77
|
+
neatController: Neat,
|
|
78
|
+
warmStartState: WorkerWarmStartState,
|
|
79
|
+
): Promise<void> {
|
|
80
|
+
// Step 1: Exit fast when warm-start is already processed.
|
|
81
|
+
if (warmStartState.generationZeroWarmStartApplied) return;
|
|
82
|
+
|
|
83
|
+
// Step 2: Warm-start only generation 0 to avoid skewing later evolution.
|
|
84
|
+
if (neatController.generation !== 0) {
|
|
85
|
+
warmStartState.generationZeroWarmStartApplied = true;
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
// Step 3: Validate population availability.
|
|
90
|
+
const population = neatController.population;
|
|
91
|
+
if (!Array.isArray(population) || population.length === 0) {
|
|
92
|
+
warmStartState.generationZeroWarmStartApplied = true;
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
// Step 4: Build a small synthetic dataset labeled by a simple heuristic.
|
|
97
|
+
const warmStartRng = createXorshift32(
|
|
98
|
+
warmStartState.workerInitSeed ^ 0x9e37_79b9,
|
|
99
|
+
);
|
|
100
|
+
const trainingSet = buildHeuristicPretrainSet(
|
|
101
|
+
warmStartRng,
|
|
102
|
+
FLAPPY_WORKER_GEN0_PRETRAIN_SAMPLE_COUNT,
|
|
103
|
+
);
|
|
104
|
+
|
|
105
|
+
// Step 5: Train a single template network, then seed the whole population from it.
|
|
106
|
+
const templateNetwork = population[0]?.clone();
|
|
107
|
+
if (!templateNetwork) {
|
|
108
|
+
warmStartState.generationZeroWarmStartApplied = true;
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
try {
|
|
113
|
+
templateNetwork.train(trainingSet, {
|
|
114
|
+
iterations: FLAPPY_WORKER_GEN0_PRETRAIN_ITERATIONS,
|
|
115
|
+
rate: FLAPPY_WORKER_GEN0_PRETRAIN_RATE,
|
|
116
|
+
batchSize: FLAPPY_WORKER_GEN0_PRETRAIN_BATCH_SIZE,
|
|
117
|
+
optimizer: 'adam',
|
|
118
|
+
mixedPrecision: false,
|
|
119
|
+
});
|
|
120
|
+
} catch {
|
|
121
|
+
// If training fails for any reason, fall back to pure noise seeding.
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
// Step 6: Copy trained weights/biases into each genome with small noise for diversity.
|
|
125
|
+
for (const genome of population) {
|
|
126
|
+
applyTemplateWeightsWithNoise(genome, templateNetwork, warmStartRng, {
|
|
127
|
+
weightStdDev: FLAPPY_WORKER_GEN0_PRETRAIN_WEIGHT_NOISE_STDDEV,
|
|
128
|
+
biasStdDev: FLAPPY_WORKER_GEN0_PRETRAIN_BIAS_NOISE_STDDEV,
|
|
129
|
+
});
|
|
130
|
+
(genome as unknown as { score?: number }).score = undefined;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
warmStartState.generationZeroWarmStartApplied = true;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
/**
|
|
137
|
+
* Builds synthetic supervised samples for generation-0 behavior cloning.
|
|
138
|
+
*
|
|
139
|
+
* Educational note:
|
|
140
|
+
* These samples are not recorded gameplay traces. They are synthetic states
|
|
141
|
+
* generated from the same observation pipeline used during real playback so the
|
|
142
|
+
* teacher labels and the evolved policy inputs stay in the same feature space.
|
|
143
|
+
*
|
|
144
|
+
* @param rng - Deterministic random source.
|
|
145
|
+
* @param sampleCount - Requested number of synthetic samples.
|
|
146
|
+
* @returns Supervised dataset of input/output pairs.
|
|
147
|
+
*/
|
|
148
|
+
function buildHeuristicPretrainSet(
|
|
149
|
+
rng: ReturnType<typeof createXorshift32>,
|
|
150
|
+
sampleCount: number,
|
|
151
|
+
): Array<{ input: number[]; output: number[] }> {
|
|
152
|
+
// Step 1: Resolve bounded sample count and a baseline difficulty profile.
|
|
153
|
+
const clampedSampleCount = Math.max(8, Math.trunc(sampleCount));
|
|
154
|
+
const difficultyProfile = resolveAdaptiveDifficultyProfile(0, 1);
|
|
155
|
+
const trainingSet: Array<{ input: number[]; output: number[] }> = [];
|
|
156
|
+
|
|
157
|
+
// Step 2: Sample state tuples, encode observations, and attach heuristic labels.
|
|
158
|
+
for (let sampleIndex = 0; sampleIndex < clampedSampleCount; sampleIndex++) {
|
|
159
|
+
const pipeGapPx = difficultyProfile.pipeGapPx;
|
|
160
|
+
const gapHalfPx = pipeGapPx * 0.5;
|
|
161
|
+
|
|
162
|
+
const birdYPx = rng.nextFloat01() * FLAPPY_WORLD_HEIGHT_PX;
|
|
163
|
+
const velocityYPxPerFrame =
|
|
164
|
+
(rng.nextFloat01() * 2 - 1) * FLAPPY_MAX_FALL_SPEED_PX_PER_FRAME;
|
|
165
|
+
|
|
166
|
+
const pipeXMinPx = FLAPPY_BIRD_X_PX + 40;
|
|
167
|
+
const pipeXMaxPx =
|
|
168
|
+
FLAPPY_BIRD_X_PX +
|
|
169
|
+
FLAPPY_WORKER_GEN0_PRETRAIN_VISIBLE_WORLD_WIDTH_PX * 0.92;
|
|
170
|
+
const pipeXSamplePx =
|
|
171
|
+
pipeXMinPx + rng.nextFloat01() * Math.max(1, pipeXMaxPx - pipeXMinPx);
|
|
172
|
+
|
|
173
|
+
const minGapCenterYPx = gapHalfPx;
|
|
174
|
+
const maxGapCenterYPx = Math.max(
|
|
175
|
+
minGapCenterYPx,
|
|
176
|
+
FLAPPY_WORLD_HEIGHT_PX - gapHalfPx,
|
|
177
|
+
);
|
|
178
|
+
const gapCenterYPx =
|
|
179
|
+
minGapCenterYPx + rng.nextFloat01() * (maxGapCenterYPx - minGapCenterYPx);
|
|
180
|
+
|
|
181
|
+
const pipes: WorkerPopulationPipe[] = [
|
|
182
|
+
{
|
|
183
|
+
id: 1,
|
|
184
|
+
xPx: pipeXSamplePx,
|
|
185
|
+
gapCenterYPx,
|
|
186
|
+
gapSizePx: pipeGapPx,
|
|
187
|
+
},
|
|
188
|
+
];
|
|
189
|
+
|
|
190
|
+
const observationMemoryState = createSharedObservationMemoryState();
|
|
191
|
+
const observation = resolveObservationVector(
|
|
192
|
+
birdYPx,
|
|
193
|
+
velocityYPxPerFrame,
|
|
194
|
+
pipes,
|
|
195
|
+
FLAPPY_WORKER_GEN0_PRETRAIN_VISIBLE_WORLD_WIDTH_PX,
|
|
196
|
+
FLAPPY_WORLD_HEIGHT_PX,
|
|
197
|
+
difficultyProfile,
|
|
198
|
+
difficultyProfile.pipeSpawnIntervalFrames,
|
|
199
|
+
observationMemoryState,
|
|
200
|
+
);
|
|
201
|
+
|
|
202
|
+
const shouldFlap = resolveHeuristicTeacherFlapDecision(
|
|
203
|
+
observation.observationFeatures,
|
|
204
|
+
);
|
|
205
|
+
trainingSet.push({
|
|
206
|
+
input: observation.observationVector,
|
|
207
|
+
output: shouldFlap ? [0, 1] : [1, 0],
|
|
208
|
+
});
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
// Step 3: Return immutable training pairs consumed by Network.train.
|
|
212
|
+
return trainingSet;
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
/**
|
|
216
|
+
* Heuristic teacher policy used to label synthetic pretraining samples.
|
|
217
|
+
*
|
|
218
|
+
* The rule intentionally stays simple and interpretable: flap when the bird is
|
|
219
|
+
* meaningfully below the next gap center, not already rising fast, and either
|
|
220
|
+
* close to the gap entry or in an urgent approach state.
|
|
221
|
+
*
|
|
222
|
+
* @param features - Structured observation features for one synthetic state.
|
|
223
|
+
* @returns True when the teacher says to flap.
|
|
224
|
+
*/
|
|
225
|
+
function resolveHeuristicTeacherFlapDecision(
|
|
226
|
+
features: WorkerHeuristicObservationFeatures,
|
|
227
|
+
): boolean {
|
|
228
|
+
// Step 1: Resolve the few interpretable teacher conditions.
|
|
229
|
+
const isBelowNextGapCenter = features.normalizedDeltaToNextGap > 0.035;
|
|
230
|
+
const isNotAlreadyRisingFast = features.normalizedVelocity > -0.25;
|
|
231
|
+
const isNearGapEntry = features.normalizedFramesToGapEntry < 0.8;
|
|
232
|
+
const isUrgent = features.normalizedEntryUrgency > 0.18;
|
|
233
|
+
|
|
234
|
+
// Step 2: Fold the teacher decision from those conditions.
|
|
235
|
+
return (
|
|
236
|
+
isBelowNextGapCenter &&
|
|
237
|
+
isNotAlreadyRisingFast &&
|
|
238
|
+
(isNearGapEntry || isUrgent)
|
|
239
|
+
);
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
/**
|
|
243
|
+
* Copies template parameters into a genome and injects small Gaussian noise.
|
|
244
|
+
*
|
|
245
|
+
* Educational note:
|
|
246
|
+
* The template network gives generation 0 a shared prior, while the noise terms
|
|
247
|
+
* restore diversity so the population is still worth evolving.
|
|
248
|
+
*
|
|
249
|
+
* @param genome - Target genome to mutate in-place.
|
|
250
|
+
* @param template - Trained template source network.
|
|
251
|
+
* @param rng - Deterministic random source for noise sampling.
|
|
252
|
+
* @param noise - Standard deviations for weight and bias perturbations.
|
|
253
|
+
* @returns Nothing.
|
|
254
|
+
*/
|
|
255
|
+
function applyTemplateWeightsWithNoise(
|
|
256
|
+
genome: Network,
|
|
257
|
+
template: Network,
|
|
258
|
+
rng: ReturnType<typeof createXorshift32>,
|
|
259
|
+
noise: { weightStdDev: number; biasStdDev: number },
|
|
260
|
+
): void {
|
|
261
|
+
// Step 1: Clamp noise scales to valid non-negative values.
|
|
262
|
+
const weightStdDev = Math.max(0, noise.weightStdDev);
|
|
263
|
+
const biasStdDev = Math.max(0, noise.biasStdDev);
|
|
264
|
+
|
|
265
|
+
// Step 2: Copy node biases with additive Gaussian noise.
|
|
266
|
+
const genomeNodes = genome.nodes;
|
|
267
|
+
const templateNodes = template.nodes;
|
|
268
|
+
const nodeCopyCount = Math.min(genomeNodes.length, templateNodes.length);
|
|
269
|
+
for (let nodeIndex = 0; nodeIndex < nodeCopyCount; nodeIndex++) {
|
|
270
|
+
const templateBias = templateNodes[nodeIndex]?.bias ?? 0;
|
|
271
|
+
genomeNodes[nodeIndex].bias =
|
|
272
|
+
templateBias + sampleGaussian(rng) * biasStdDev;
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
// Step 3: Copy connection weights with additive Gaussian noise.
|
|
276
|
+
const genomeConnections = genome.connections;
|
|
277
|
+
const templateConnections = template.connections;
|
|
278
|
+
const connectionCopyCount = Math.min(
|
|
279
|
+
genomeConnections.length,
|
|
280
|
+
templateConnections.length,
|
|
281
|
+
);
|
|
282
|
+
for (
|
|
283
|
+
let connectionIndex = 0;
|
|
284
|
+
connectionIndex < connectionCopyCount;
|
|
285
|
+
connectionIndex++
|
|
286
|
+
) {
|
|
287
|
+
const templateWeight = templateConnections[connectionIndex]?.weight ?? 0;
|
|
288
|
+
genomeConnections[connectionIndex].weight =
|
|
289
|
+
templateWeight + sampleGaussian(rng) * weightStdDev;
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
/**
|
|
294
|
+
* Samples one standard-normal value using the Box-Muller transform.
|
|
295
|
+
*
|
|
296
|
+
* If you are unfamiliar with the transform, the Wikipedia article on
|
|
297
|
+
* "Box-Muller transform" is a useful short background read. The worker uses it
|
|
298
|
+
* here because it is deterministic, dependency-light, and good enough for small
|
|
299
|
+
* noise injection during warm-start diversification.
|
|
300
|
+
*
|
|
301
|
+
* @param rng - Deterministic random source.
|
|
302
|
+
* @returns One approximately standard-normal random value.
|
|
303
|
+
*/
|
|
304
|
+
function sampleGaussian(rng: ReturnType<typeof createXorshift32>): number {
|
|
305
|
+
// Step 1: Avoid log(0) by flooring uniforms away from zero.
|
|
306
|
+
const epsilon = 1e-12;
|
|
307
|
+
const uniformA = Math.max(epsilon, rng.nextFloat01());
|
|
308
|
+
const uniformB = Math.max(epsilon, rng.nextFloat01());
|
|
309
|
+
|
|
310
|
+
// Step 2: Convert two uniforms into one normal sample.
|
|
311
|
+
const magnitude = Math.sqrt(-2 * Math.log(uniformA));
|
|
312
|
+
const angle = 2 * Math.PI * uniformB;
|
|
313
|
+
return magnitude * Math.cos(angle);
|
|
314
|
+
}
|
|
@@ -1,3 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Compatibility facade for the shared Flappy Bird simulation helpers.
|
|
3
|
+
*
|
|
4
|
+
* Educational note:
|
|
5
|
+
* The Flappy example uses the same observation, spawning, math, and difficulty
|
|
6
|
+
* logic in multiple places: Node-side evaluation, browser playback, and the
|
|
7
|
+
* worker runtime. This facade keeps those shared concepts discoverable from the
|
|
8
|
+
* root folder while the real implementation lives under `simulation-shared/`.
|
|
9
|
+
*
|
|
10
|
+
* If you are new to the example, start here to see the cross-cutting helpers,
|
|
11
|
+
* then follow the re-export targets into the focused submodules.
|
|
12
|
+
*/
|
|
1
13
|
export { resolveAdaptiveDifficultyProfile } from './simulation-shared/simulation-shared.difficulty.utils';
|
|
2
14
|
export { resolveFlapDecision } from './simulation-shared/simulation-shared.control.utils';
|
|
3
15
|
export {
|
|
@@ -16,6 +28,11 @@ export {
|
|
|
16
28
|
clampValue,
|
|
17
29
|
interpolateValue,
|
|
18
30
|
} from './simulation-shared/simulation-shared.math.utils';
|
|
31
|
+
export {
|
|
32
|
+
computeMean,
|
|
33
|
+
computePercentile,
|
|
34
|
+
computePopulationStandardDeviation,
|
|
35
|
+
} from './simulation-shared/simulation-shared.statistics.utils';
|
|
19
36
|
export {
|
|
20
37
|
resolveNextSpawnGapCenterY,
|
|
21
38
|
resolveNextSpawnGapSize,
|
|
@@ -1,3 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Public environment facade for the Flappy Bird example.
|
|
3
|
+
*
|
|
4
|
+
* Educational note:
|
|
5
|
+
* This file presents the Flappy world as a small environment API: create state,
|
|
6
|
+
* step it forward, and read observations. That makes it the most convenient
|
|
7
|
+
* entrypoint when you want to treat the game as a control problem rather than a
|
|
8
|
+
* rendering demo.
|
|
9
|
+
*
|
|
10
|
+
* For background reading, the Wikipedia article on "Markov decision process" is
|
|
11
|
+
* a useful mental model for why the example separates state transition,
|
|
12
|
+
* observation extraction, and action selection.
|
|
13
|
+
*/
|
|
1
14
|
import type { FlappyRng } from './rng';
|
|
2
15
|
import {
|
|
3
16
|
resolveNextSpawnGapCenterY as resolveSharedNextSpawnGapCenterY,
|
|
@@ -24,6 +37,10 @@ export {
|
|
|
24
37
|
/**
|
|
25
38
|
* Sample a gap center height inside configured bounds.
|
|
26
39
|
*
|
|
40
|
+
* This root-level helper exists as a convenience export. The underlying spawn
|
|
41
|
+
* logic lives in the shared simulation layer so browser playback and evaluation
|
|
42
|
+
* use the same world-generation rules.
|
|
43
|
+
*
|
|
27
44
|
* @param rng - Random source.
|
|
28
45
|
* @returns Gap center y coordinate (pixels).
|
|
29
46
|
*/
|
|
@@ -34,6 +51,10 @@ export function sampleGapCenterY(rng: FlappyRng): number {
|
|
|
34
51
|
/**
|
|
35
52
|
* Resolves next gap-center y while limiting abrupt consecutive transitions.
|
|
36
53
|
*
|
|
54
|
+
* Keeping consecutive gap centers locally smooth prevents the environment from
|
|
55
|
+
* generating visually unfair jumps that a feed-forward policy could not react to
|
|
56
|
+
* consistently.
|
|
57
|
+
*
|
|
37
58
|
* @param previousGapCenterYPx - Previous spawned gap-center y value.
|
|
38
59
|
* @param rng - Random source.
|
|
39
60
|
* @returns Next gap-center y constrained by transition and world bounds.
|
|
@@ -1,3 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Public evaluation facade for the Flappy Bird example.
|
|
3
|
+
*
|
|
4
|
+
* Educational note:
|
|
5
|
+
* The trainer and worker both need a compact way to score policies. This facade
|
|
6
|
+
* exposes the evaluation surface without forcing callers to know the internal
|
|
7
|
+
* rollout and seed-batching module layout.
|
|
8
|
+
*
|
|
9
|
+
* The important idea is variance control: the example compares genomes across
|
|
10
|
+
* shared random seeds so evolution is rewarded for genuinely better behavior,
|
|
11
|
+
* not for getting an unusually lucky pipe sequence.
|
|
12
|
+
*/
|
|
1
13
|
export {
|
|
2
14
|
evaluateFlappyFitness,
|
|
3
15
|
evaluateFlappyFitnessAcrossSeeds,
|