@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,399 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Rollout shaping and result helpers.
|
|
3
|
+
*
|
|
4
|
+
* This file will host rollout-local fitness composition, shaping utilities,
|
|
5
|
+
* and terminal result assembly helpers.
|
|
6
|
+
*
|
|
7
|
+
* Educational note:
|
|
8
|
+
* The rollout subsystem separates simulation from scoring on purpose. The
|
|
9
|
+
* services file determines what happened; this file determines how that episode
|
|
10
|
+
* should be interpreted as fitness.
|
|
11
|
+
*/
|
|
12
|
+
import {
|
|
13
|
+
FLAPPY_FITNESS_ALIGNMENT_WEIGHT_PER_FRAME,
|
|
14
|
+
FLAPPY_FITNESS_APPROACH_PROGRESS_WEIGHT,
|
|
15
|
+
FLAPPY_FITNESS_BONUS_PER_PIPE,
|
|
16
|
+
FLAPPY_FITNESS_CENTERING_PROGRESS_WEIGHT,
|
|
17
|
+
FLAPPY_FITNESS_CLEARANCE_WEIGHT_PER_FRAME,
|
|
18
|
+
FLAPPY_FITNESS_SECOND_GAP_ALIGNMENT_WEIGHT_PER_FRAME,
|
|
19
|
+
FLAPPY_FITNESS_STABLE_VELOCITY_WEIGHT_PER_FRAME,
|
|
20
|
+
FLAPPY_FITNESS_SURVIVAL_WEIGHT,
|
|
21
|
+
FLAPPY_FITNESS_TERMINAL_ALIGNMENT_BONUS_WEIGHT,
|
|
22
|
+
FLAPPY_FITNESS_TERMINAL_PROGRESS_BONUS_WEIGHT,
|
|
23
|
+
} from '../../constants/constants';
|
|
24
|
+
import {
|
|
25
|
+
FLAPPY_EVALUATION_DEFAULT_PIPE_PROGRESS_TARGET,
|
|
26
|
+
FLAPPY_EVALUATION_DENSE_SHAPING_FRAMES_NORMALIZER,
|
|
27
|
+
FLAPPY_EVALUATION_NORMALIZED_DENSE_WEIGHT,
|
|
28
|
+
FLAPPY_EVALUATION_NORMALIZED_PROGRESS_WEIGHT,
|
|
29
|
+
FLAPPY_EVALUATION_NORMALIZED_SURVIVAL_WEIGHT,
|
|
30
|
+
FLAPPY_EVALUATION_NORMALIZED_TERMINAL_WEIGHT,
|
|
31
|
+
FLAPPY_EVALUATION_UNRECOVERABLE_ABOVE_GAP_DELTA,
|
|
32
|
+
FLAPPY_EVALUATION_UNRECOVERABLE_BELOW_GAP_DELTA,
|
|
33
|
+
FLAPPY_EVALUATION_UNRECOVERABLE_CLEARANCE_THRESHOLD,
|
|
34
|
+
FLAPPY_EVALUATION_UNRECOVERABLE_FALLING_VELOCITY,
|
|
35
|
+
FLAPPY_EVALUATION_UNRECOVERABLE_RISING_VELOCITY,
|
|
36
|
+
} from '../evaluation.constants';
|
|
37
|
+
import {
|
|
38
|
+
getFlappyObservationFeatures,
|
|
39
|
+
type FlappyGameState,
|
|
40
|
+
type FlappyObservationFeatures,
|
|
41
|
+
} from '../../flappyEnvironment.ts';
|
|
42
|
+
import { clampValue } from '../../flappy.simulation.shared.utils';
|
|
43
|
+
import {
|
|
44
|
+
FLAPPY_ROLLOUT_MIN_MAX_FRAMES,
|
|
45
|
+
FLAPPY_ROLLOUT_ZERO_FITNESS,
|
|
46
|
+
} from './evaluation.rollout.constants';
|
|
47
|
+
import type {
|
|
48
|
+
DenseShapingRewardComponents,
|
|
49
|
+
RolloutEpisodeContext,
|
|
50
|
+
RolloutEpisodeRuntimeState,
|
|
51
|
+
RolloutFitnessBreakdown,
|
|
52
|
+
} from './evaluation.rollout.types';
|
|
53
|
+
import type { FlappyEpisodeResult } from '../evaluation.types';
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Composes the final rollout result from the terminal game state.
|
|
57
|
+
*
|
|
58
|
+
* This is the final fold step for rollout execution: internal counters and
|
|
59
|
+
* shaping channels become the public `FlappyEpisodeResult` consumed by training
|
|
60
|
+
* and reporting.
|
|
61
|
+
*
|
|
62
|
+
* @param rolloutEpisodeContext - Normalized rollout configuration.
|
|
63
|
+
* @param rolloutEpisodeRuntimeState - Mutable runtime state.
|
|
64
|
+
* @returns Episode result details.
|
|
65
|
+
*/
|
|
66
|
+
export function composeRolloutEpisodeResult(
|
|
67
|
+
rolloutEpisodeContext: RolloutEpisodeContext,
|
|
68
|
+
rolloutEpisodeRuntimeState: RolloutEpisodeRuntimeState,
|
|
69
|
+
): FlappyEpisodeResult {
|
|
70
|
+
// Step 1: Resolve fitness-channel breakdown values from the final game state.
|
|
71
|
+
const framesSurvived = rolloutEpisodeRuntimeState.state.frameIndex;
|
|
72
|
+
const pipesPassed = rolloutEpisodeRuntimeState.state.pipesPassed;
|
|
73
|
+
const rolloutFitnessBreakdown = resolveRolloutFitnessBreakdown(
|
|
74
|
+
rolloutEpisodeContext,
|
|
75
|
+
rolloutEpisodeRuntimeState,
|
|
76
|
+
framesSurvived,
|
|
77
|
+
pipesPassed,
|
|
78
|
+
);
|
|
79
|
+
|
|
80
|
+
// Step 2: Compose normalized or raw fitness from the resolved breakdown.
|
|
81
|
+
const fitness = rolloutEpisodeContext.normalizeFitness
|
|
82
|
+
? composeNormalizedFitness(
|
|
83
|
+
framesSurvived,
|
|
84
|
+
pipesPassed,
|
|
85
|
+
rolloutFitnessBreakdown.denseShapingFitness,
|
|
86
|
+
rolloutFitnessBreakdown.terminalShapingFitness,
|
|
87
|
+
rolloutEpisodeContext.maxFramesPerEpisode,
|
|
88
|
+
rolloutEpisodeContext.pipeProgressTarget,
|
|
89
|
+
)
|
|
90
|
+
: resolveUnnormalizedRolloutFitness(rolloutFitnessBreakdown);
|
|
91
|
+
|
|
92
|
+
// Step 3: Return the public episode result payload.
|
|
93
|
+
return {
|
|
94
|
+
framesSurvived,
|
|
95
|
+
pipesPassed,
|
|
96
|
+
done: rolloutEpisodeRuntimeState.state.done,
|
|
97
|
+
doneReason: rolloutEpisodeRuntimeState.state.doneReason,
|
|
98
|
+
fitness,
|
|
99
|
+
fitnessBreakdown: {
|
|
100
|
+
survival: rolloutFitnessBreakdown.survivalFitness,
|
|
101
|
+
pipeProgress: rolloutFitnessBreakdown.pipePassFitness,
|
|
102
|
+
denseShaping: rolloutFitnessBreakdown.denseShapingFitness,
|
|
103
|
+
terminalShaping: rolloutFitnessBreakdown.terminalShapingFitness,
|
|
104
|
+
},
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* Computes dense reward shaping from consecutive observations.
|
|
110
|
+
*
|
|
111
|
+
* Dense shaping rewards incremental improvement throughout an episode instead of
|
|
112
|
+
* paying out only at the end, which gives evolution a more informative signal.
|
|
113
|
+
*
|
|
114
|
+
* @param previousFeatures - Observation before stepping the environment.
|
|
115
|
+
* @param currentFeatures - Observation after stepping the environment.
|
|
116
|
+
* @returns Per-step shaped reward.
|
|
117
|
+
*/
|
|
118
|
+
export function computeDenseShapingReward(
|
|
119
|
+
previousFeatures: FlappyObservationFeatures,
|
|
120
|
+
currentFeatures: FlappyObservationFeatures,
|
|
121
|
+
): number {
|
|
122
|
+
// Step 1: Resolve each shaping component from the consecutive observations.
|
|
123
|
+
const denseShapingRewardComponents = resolveDenseShapingRewardComponents(
|
|
124
|
+
previousFeatures,
|
|
125
|
+
currentFeatures,
|
|
126
|
+
);
|
|
127
|
+
|
|
128
|
+
// Step 2: Sum the shaping channels into one per-frame reward.
|
|
129
|
+
return (
|
|
130
|
+
denseShapingRewardComponents.nextGapAlignmentReward +
|
|
131
|
+
denseShapingRewardComponents.approachProgressReward +
|
|
132
|
+
denseShapingRewardComponents.centeringProgressReward +
|
|
133
|
+
denseShapingRewardComponents.clearanceReward +
|
|
134
|
+
denseShapingRewardComponents.secondGapAlignmentReward +
|
|
135
|
+
denseShapingRewardComponents.velocityStabilityReward
|
|
136
|
+
);
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
/**
|
|
140
|
+
* Detects trajectories that are usually irrecoverable in early warmup.
|
|
141
|
+
*
|
|
142
|
+
* The heuristic focuses on obvious early failures, where spending more rollout
|
|
143
|
+
* budget is least informative.
|
|
144
|
+
*
|
|
145
|
+
* @param observationFeatures - Post-step observation features.
|
|
146
|
+
* @returns Whether the current trajectory appears unrecoverable.
|
|
147
|
+
*/
|
|
148
|
+
export function isBirdLikelyUnrecoverable(
|
|
149
|
+
observationFeatures: FlappyObservationFeatures,
|
|
150
|
+
): boolean {
|
|
151
|
+
const farOutsideGap =
|
|
152
|
+
observationFeatures.normalizedNextGapClearance <
|
|
153
|
+
FLAPPY_EVALUATION_UNRECOVERABLE_CLEARANCE_THRESHOLD;
|
|
154
|
+
const belowGapAndStillFalling =
|
|
155
|
+
observationFeatures.normalizedDeltaToNextGap >
|
|
156
|
+
FLAPPY_EVALUATION_UNRECOVERABLE_BELOW_GAP_DELTA &&
|
|
157
|
+
observationFeatures.normalizedVelocity >
|
|
158
|
+
FLAPPY_EVALUATION_UNRECOVERABLE_FALLING_VELOCITY;
|
|
159
|
+
const aboveGapAndStillRising =
|
|
160
|
+
observationFeatures.normalizedDeltaToNextGap <
|
|
161
|
+
FLAPPY_EVALUATION_UNRECOVERABLE_ABOVE_GAP_DELTA &&
|
|
162
|
+
observationFeatures.normalizedVelocity <
|
|
163
|
+
FLAPPY_EVALUATION_UNRECOVERABLE_RISING_VELOCITY;
|
|
164
|
+
|
|
165
|
+
return farOutsideGap && (belowGapAndStillFalling || aboveGapAndStillRising);
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
/**
|
|
169
|
+
* Resolves the raw fitness channels from the final episode state.
|
|
170
|
+
*
|
|
171
|
+
* Separating raw channels from final composition makes reward rebalancing much
|
|
172
|
+
* easier to reason about.
|
|
173
|
+
*
|
|
174
|
+
* @param rolloutEpisodeContext - Normalized rollout configuration.
|
|
175
|
+
* @param rolloutEpisodeRuntimeState - Mutable runtime state.
|
|
176
|
+
* @param framesSurvived - Final frame count.
|
|
177
|
+
* @param pipesPassed - Final pipe-pass count.
|
|
178
|
+
* @returns Fitness-channel breakdown.
|
|
179
|
+
*/
|
|
180
|
+
function resolveRolloutFitnessBreakdown(
|
|
181
|
+
rolloutEpisodeContext: RolloutEpisodeContext,
|
|
182
|
+
rolloutEpisodeRuntimeState: RolloutEpisodeRuntimeState,
|
|
183
|
+
framesSurvived: number,
|
|
184
|
+
pipesPassed: number,
|
|
185
|
+
): RolloutFitnessBreakdown {
|
|
186
|
+
// Step 1: Resolve the direct survival and progress channels.
|
|
187
|
+
const survivalFitness = framesSurvived * FLAPPY_FITNESS_SURVIVAL_WEIGHT;
|
|
188
|
+
const pipePassFitness = pipesPassed * FLAPPY_FITNESS_BONUS_PER_PIPE;
|
|
189
|
+
|
|
190
|
+
// Step 2: Resolve the terminal shaping bonus from the final observation.
|
|
191
|
+
const terminalShapingFitness = computeTerminalShapingFitness(
|
|
192
|
+
rolloutEpisodeRuntimeState.state,
|
|
193
|
+
rolloutEpisodeContext.difficultyScale,
|
|
194
|
+
);
|
|
195
|
+
|
|
196
|
+
return {
|
|
197
|
+
survivalFitness,
|
|
198
|
+
pipePassFitness,
|
|
199
|
+
denseShapingFitness: rolloutEpisodeRuntimeState.denseShapingFitness,
|
|
200
|
+
terminalShapingFitness,
|
|
201
|
+
};
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
/**
|
|
205
|
+
* Resolves raw fitness by summing every fitness channel.
|
|
206
|
+
*
|
|
207
|
+
* This is the legacy unnormalized objective. The normalized path below caps
|
|
208
|
+
* channels so no single term dominates the whole score.
|
|
209
|
+
*
|
|
210
|
+
* @param rolloutFitnessBreakdown - Fitness-channel breakdown.
|
|
211
|
+
* @returns Raw unnormalized fitness.
|
|
212
|
+
*/
|
|
213
|
+
function resolveUnnormalizedRolloutFitness(
|
|
214
|
+
rolloutFitnessBreakdown: RolloutFitnessBreakdown,
|
|
215
|
+
): number {
|
|
216
|
+
// Step 1: Sum all channels directly for the legacy unnormalized objective.
|
|
217
|
+
return (
|
|
218
|
+
rolloutFitnessBreakdown.survivalFitness +
|
|
219
|
+
rolloutFitnessBreakdown.pipePassFitness +
|
|
220
|
+
rolloutFitnessBreakdown.denseShapingFitness +
|
|
221
|
+
rolloutFitnessBreakdown.terminalShapingFitness
|
|
222
|
+
);
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
/**
|
|
226
|
+
* Resolves every dense-shaping reward component from consecutive observations.
|
|
227
|
+
*
|
|
228
|
+
* If you want background reading, the Wikipedia article on "reward shaping" is
|
|
229
|
+
* a good high-level companion concept for why these components exist.
|
|
230
|
+
*
|
|
231
|
+
* @param previousFeatures - Observation before stepping the environment.
|
|
232
|
+
* @param currentFeatures - Observation after stepping the environment.
|
|
233
|
+
* @returns Dense-shaping reward components.
|
|
234
|
+
*/
|
|
235
|
+
function resolveDenseShapingRewardComponents(
|
|
236
|
+
previousFeatures: FlappyObservationFeatures,
|
|
237
|
+
currentFeatures: FlappyObservationFeatures,
|
|
238
|
+
): DenseShapingRewardComponents {
|
|
239
|
+
// Step 1: Reward alignment with the next immediate pipe gap.
|
|
240
|
+
const nextGapAlignmentReward =
|
|
241
|
+
Math.max(
|
|
242
|
+
FLAPPY_ROLLOUT_ZERO_FITNESS,
|
|
243
|
+
FLAPPY_ROLLOUT_MIN_MAX_FRAMES -
|
|
244
|
+
Math.abs(currentFeatures.normalizedDeltaToNextGap),
|
|
245
|
+
) * FLAPPY_FITNESS_ALIGNMENT_WEIGHT_PER_FRAME;
|
|
246
|
+
|
|
247
|
+
// Step 2: Reward forward progress toward the next pipe.
|
|
248
|
+
const approachProgressReward =
|
|
249
|
+
Math.max(
|
|
250
|
+
FLAPPY_ROLLOUT_ZERO_FITNESS,
|
|
251
|
+
previousFeatures.normalizedDistanceToNextPipe -
|
|
252
|
+
currentFeatures.normalizedDistanceToNextPipe,
|
|
253
|
+
) * FLAPPY_FITNESS_APPROACH_PROGRESS_WEIGHT;
|
|
254
|
+
|
|
255
|
+
// Step 3: Reward reduction in absolute next-gap centering error.
|
|
256
|
+
const centeringProgressReward =
|
|
257
|
+
Math.max(
|
|
258
|
+
FLAPPY_ROLLOUT_ZERO_FITNESS,
|
|
259
|
+
Math.abs(previousFeatures.normalizedDeltaToNextGap) -
|
|
260
|
+
Math.abs(currentFeatures.normalizedDeltaToNextGap),
|
|
261
|
+
) * FLAPPY_FITNESS_CENTERING_PROGRESS_WEIGHT;
|
|
262
|
+
|
|
263
|
+
// Step 4: Reward maintaining positive clearance around the next gap.
|
|
264
|
+
const clearanceReward =
|
|
265
|
+
Math.max(
|
|
266
|
+
FLAPPY_ROLLOUT_ZERO_FITNESS,
|
|
267
|
+
currentFeatures.normalizedNextGapClearance,
|
|
268
|
+
) * FLAPPY_FITNESS_CLEARANCE_WEIGHT_PER_FRAME;
|
|
269
|
+
|
|
270
|
+
// Step 5: Reward alignment with the second upcoming gap to encourage stability.
|
|
271
|
+
const secondGapAlignmentReward =
|
|
272
|
+
Math.max(
|
|
273
|
+
FLAPPY_ROLLOUT_ZERO_FITNESS,
|
|
274
|
+
FLAPPY_ROLLOUT_MIN_MAX_FRAMES -
|
|
275
|
+
Math.abs(currentFeatures.normalizedDeltaToSecondGap),
|
|
276
|
+
) * FLAPPY_FITNESS_SECOND_GAP_ALIGNMENT_WEIGHT_PER_FRAME;
|
|
277
|
+
|
|
278
|
+
// Step 6: Reward stable velocity magnitudes that avoid extreme oscillation.
|
|
279
|
+
const velocityStabilityReward =
|
|
280
|
+
Math.max(
|
|
281
|
+
FLAPPY_ROLLOUT_ZERO_FITNESS,
|
|
282
|
+
FLAPPY_ROLLOUT_MIN_MAX_FRAMES -
|
|
283
|
+
Math.abs(currentFeatures.normalizedVelocity),
|
|
284
|
+
) * FLAPPY_FITNESS_STABLE_VELOCITY_WEIGHT_PER_FRAME;
|
|
285
|
+
|
|
286
|
+
return {
|
|
287
|
+
nextGapAlignmentReward,
|
|
288
|
+
approachProgressReward,
|
|
289
|
+
centeringProgressReward,
|
|
290
|
+
clearanceReward,
|
|
291
|
+
secondGapAlignmentReward,
|
|
292
|
+
velocityStabilityReward,
|
|
293
|
+
};
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
/**
|
|
297
|
+
* Adds small terminal bonuses from final progress/alignment signals.
|
|
298
|
+
*
|
|
299
|
+
* Terminal bonuses refine the final ranking, but they are intentionally smaller
|
|
300
|
+
* than the main survival and pipe-progress channels.
|
|
301
|
+
*
|
|
302
|
+
* @param episodeState - Final rollout state.
|
|
303
|
+
* @param difficultyScale - Active rollout difficulty scale.
|
|
304
|
+
* @returns Terminal shaping reward.
|
|
305
|
+
*/
|
|
306
|
+
function computeTerminalShapingFitness(
|
|
307
|
+
episodeState: FlappyGameState,
|
|
308
|
+
difficultyScale: number,
|
|
309
|
+
): number {
|
|
310
|
+
const finalObservationFeatures = getFlappyObservationFeatures(
|
|
311
|
+
episodeState,
|
|
312
|
+
difficultyScale,
|
|
313
|
+
);
|
|
314
|
+
const finalAlignment =
|
|
315
|
+
1 - Math.abs(finalObservationFeatures.normalizedDeltaToNextGap);
|
|
316
|
+
const finalProgress =
|
|
317
|
+
1 -
|
|
318
|
+
Math.max(
|
|
319
|
+
0,
|
|
320
|
+
Math.min(1, finalObservationFeatures.normalizedDistanceToNextPipe),
|
|
321
|
+
);
|
|
322
|
+
|
|
323
|
+
const terminalAlignmentBonus =
|
|
324
|
+
Math.max(0, finalAlignment) *
|
|
325
|
+
FLAPPY_FITNESS_TERMINAL_ALIGNMENT_BONUS_WEIGHT;
|
|
326
|
+
const terminalProgressBonus =
|
|
327
|
+
Math.max(0, finalProgress) * FLAPPY_FITNESS_TERMINAL_PROGRESS_BONUS_WEIGHT;
|
|
328
|
+
|
|
329
|
+
return terminalAlignmentBonus + terminalProgressBonus;
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
/**
|
|
333
|
+
* Normalize and cap fitness channels so no single reward term dominates.
|
|
334
|
+
*
|
|
335
|
+
* Educational note:
|
|
336
|
+
* Channel normalization is a pragmatic way to keep the objective balanced across
|
|
337
|
+
* episodes of different lengths and levels of progress.
|
|
338
|
+
*
|
|
339
|
+
* @param framesValue - Frames survived for the episode.
|
|
340
|
+
* @param pipesPassedValue - Pipes passed during the episode.
|
|
341
|
+
* @param denseShapingValue - Accumulated dense shaping reward.
|
|
342
|
+
* @param terminalShapingValue - Terminal shaping reward.
|
|
343
|
+
* @param maxFramesValue - Frame budget used for the episode.
|
|
344
|
+
* @param pipeProgressTarget - Optional target used to normalize pipe progress.
|
|
345
|
+
* @returns Normalized composite fitness.
|
|
346
|
+
*/
|
|
347
|
+
function composeNormalizedFitness(
|
|
348
|
+
framesValue: number,
|
|
349
|
+
pipesPassedValue: number,
|
|
350
|
+
denseShapingValue: number,
|
|
351
|
+
terminalShapingValue: number,
|
|
352
|
+
maxFramesValue: number,
|
|
353
|
+
pipeProgressTarget: number | undefined,
|
|
354
|
+
): number {
|
|
355
|
+
const effectivePipeProgressTarget = Math.max(
|
|
356
|
+
1,
|
|
357
|
+
Math.trunc(
|
|
358
|
+
pipeProgressTarget ?? FLAPPY_EVALUATION_DEFAULT_PIPE_PROGRESS_TARGET,
|
|
359
|
+
),
|
|
360
|
+
);
|
|
361
|
+
const normalizedSurvival = clampValue(
|
|
362
|
+
framesValue / Math.max(1, maxFramesValue),
|
|
363
|
+
0,
|
|
364
|
+
1,
|
|
365
|
+
);
|
|
366
|
+
const normalizedPipeProgress = clampValue(
|
|
367
|
+
pipesPassedValue / effectivePipeProgressTarget,
|
|
368
|
+
0,
|
|
369
|
+
1,
|
|
370
|
+
);
|
|
371
|
+
const normalizedDenseShaping = clampValue(
|
|
372
|
+
denseShapingValue /
|
|
373
|
+
Math.max(
|
|
374
|
+
1,
|
|
375
|
+
framesValue * FLAPPY_EVALUATION_DENSE_SHAPING_FRAMES_NORMALIZER,
|
|
376
|
+
),
|
|
377
|
+
0,
|
|
378
|
+
1,
|
|
379
|
+
);
|
|
380
|
+
const normalizedTerminalShaping = clampValue(
|
|
381
|
+
terminalShapingValue /
|
|
382
|
+
Math.max(
|
|
383
|
+
1,
|
|
384
|
+
FLAPPY_FITNESS_TERMINAL_ALIGNMENT_BONUS_WEIGHT +
|
|
385
|
+
FLAPPY_FITNESS_TERMINAL_PROGRESS_BONUS_WEIGHT,
|
|
386
|
+
),
|
|
387
|
+
0,
|
|
388
|
+
1,
|
|
389
|
+
);
|
|
390
|
+
|
|
391
|
+
return (
|
|
392
|
+
normalizedSurvival *
|
|
393
|
+
FLAPPY_EVALUATION_NORMALIZED_SURVIVAL_WEIGHT *
|
|
394
|
+
FLAPPY_FITNESS_SURVIVAL_WEIGHT +
|
|
395
|
+
normalizedPipeProgress * FLAPPY_EVALUATION_NORMALIZED_PROGRESS_WEIGHT +
|
|
396
|
+
normalizedDenseShaping * FLAPPY_EVALUATION_NORMALIZED_DENSE_WEIGHT +
|
|
397
|
+
normalizedTerminalShaping * FLAPPY_EVALUATION_NORMALIZED_TERMINAL_WEIGHT
|
|
398
|
+
);
|
|
399
|
+
}
|