@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,255 @@
|
|
|
1
|
+
# simulation-shared/observation
|
|
2
|
+
|
|
3
|
+
## simulation-shared/observation/observation.ts
|
|
4
|
+
|
|
5
|
+
### observation
|
|
6
|
+
|
|
7
|
+
Shared observation public entry.
|
|
8
|
+
|
|
9
|
+
This focused boundary keeps observation feature assembly separate from
|
|
10
|
+
observation-vector projection so browser, environment, and worker callers can
|
|
11
|
+
depend on a smaller, clearer public surface.
|
|
12
|
+
|
|
13
|
+
Conceptually, this folder is the "state representation" layer for the
|
|
14
|
+
Flappy Bird example. Instead of learning directly from pixels, the agent sees
|
|
15
|
+
a compact set of geometric and kinematic signals derived from the current
|
|
16
|
+
world state. That makes the example easier to study, faster to evaluate, and
|
|
17
|
+
closer to classic feature-engineering pipelines used in small control tasks.
|
|
18
|
+
|
|
19
|
+
If you want background reading, the Wikipedia articles on "feature
|
|
20
|
+
engineering" and "state space representation" give useful intuition for why
|
|
21
|
+
this boundary exists at all.
|
|
22
|
+
|
|
23
|
+
### resolveCoreObservationVectorFromFeatures
|
|
24
|
+
|
|
25
|
+
`(features: import("test/examples/flappy_bird/simulation-shared/simulation-shared.types").SharedObservationFeatures) => number[]`
|
|
26
|
+
|
|
27
|
+
Resolves the compact core vector used for temporal stacking.
|
|
28
|
+
|
|
29
|
+
The core intentionally keeps directly observed kinematic and geometric
|
|
30
|
+
channels while dropping derived one-step predictors that become redundant
|
|
31
|
+
once short-term temporal memory is available.
|
|
32
|
+
|
|
33
|
+
This is the representation used when the example wants a short history of raw
|
|
34
|
+
observation slices. The idea is similar to frame stacking in reinforcement
|
|
35
|
+
learning: a feed-forward policy can recover some sense of motion by looking
|
|
36
|
+
at several recent compact frames at once.
|
|
37
|
+
|
|
38
|
+
The Wikipedia article on "frame stacking" is a useful conceptual reference.
|
|
39
|
+
|
|
40
|
+
Parameters:
|
|
41
|
+
- `features` - - Structured observation features.
|
|
42
|
+
|
|
43
|
+
Returns: Core per-frame vector.
|
|
44
|
+
|
|
45
|
+
### resolveObservationFeatures
|
|
46
|
+
|
|
47
|
+
`(input: import("test/examples/flappy_bird/simulation-shared/simulation-shared.types").SharedObservationInput) => import("test/examples/flappy_bird/simulation-shared/simulation-shared.types").SharedObservationFeatures`
|
|
48
|
+
|
|
49
|
+
Builds the shared normalized observation feature set consumed by policies.
|
|
50
|
+
|
|
51
|
+
Educational note:
|
|
52
|
+
This helper stays focused on semantic feature assembly only. Projection into
|
|
53
|
+
the canonical network vectors now lives in the neighboring vector module so
|
|
54
|
+
observation policy and network-shape concerns can evolve independently.
|
|
55
|
+
|
|
56
|
+
The features deliberately mix three kinds of signal:
|
|
57
|
+
1. Current state, such as bird height and vertical velocity.
|
|
58
|
+
2. Near-term geometry, such as gap bounds and upcoming-pipe distances.
|
|
59
|
+
3. Simple forward-looking control hints, such as urgency and one-flap
|
|
60
|
+
reachability.
|
|
61
|
+
|
|
62
|
+
This is a compact example of feature engineering for control. Instead of
|
|
63
|
+
asking NEAT to rediscover basic geometry from raw sensory input, the example
|
|
64
|
+
hands the network semantically meaningful signals and lets evolution focus on
|
|
65
|
+
policy search.
|
|
66
|
+
|
|
67
|
+
For broader context, the Wikipedia article on "feature engineering" is a
|
|
68
|
+
good companion reference.
|
|
69
|
+
|
|
70
|
+
Parameters:
|
|
71
|
+
- `input` - - Observation input bundle.
|
|
72
|
+
|
|
73
|
+
Returns: Structured observation features.
|
|
74
|
+
|
|
75
|
+
### resolveObservationVectorFromFeatures
|
|
76
|
+
|
|
77
|
+
`(features: import("test/examples/flappy_bird/simulation-shared/simulation-shared.types").SharedObservationFeatures) => number[]`
|
|
78
|
+
|
|
79
|
+
Converts observation features to the canonical 12-value network input vector.
|
|
80
|
+
|
|
81
|
+
Educational note:
|
|
82
|
+
This module owns the network-shape projection so feature semantics can change
|
|
83
|
+
independently from how the policy input is ordered.
|
|
84
|
+
|
|
85
|
+
The 12-value vector is the compact feed-forward policy input used by the main
|
|
86
|
+
evaluation and training flow. Its ordering is stable on purpose: once a
|
|
87
|
+
network topology has evolved against one input layout, silent channel
|
|
88
|
+
reshuffles would invalidate learned behavior.
|
|
89
|
+
|
|
90
|
+
Parameters:
|
|
91
|
+
- `features` - - Structured feature object.
|
|
92
|
+
|
|
93
|
+
Returns: Ordered feature vector.
|
|
94
|
+
|
|
95
|
+
### resolveUpcomingPipes
|
|
96
|
+
|
|
97
|
+
`(pipes: import("test/examples/flappy_bird/simulation-shared/simulation-shared.types").SharedPipeLike[], birdCenterXPx: number, birdRadiusPx: number, pipeWidthPx: number) => [import("test/examples/flappy_bird/simulation-shared/simulation-shared.types").SharedPipeLike | undefined, import("test/examples/flappy_bird/simulation-shared/simulation-shared.types").SharedPipeLike | undefined]`
|
|
98
|
+
|
|
99
|
+
Resolves the next two upcoming pipes in front of the bird.
|
|
100
|
+
|
|
101
|
+
The observation pipeline only cares about the immediate near future, because
|
|
102
|
+
Flappy Bird decisions are dominated by the next gap and the transition after
|
|
103
|
+
it. Looking further ahead adds noise faster than it adds useful control
|
|
104
|
+
signal.
|
|
105
|
+
|
|
106
|
+
Parameters:
|
|
107
|
+
- `pipes` - - Current pipe list.
|
|
108
|
+
- `birdCenterXPx` - - Bird center x-position.
|
|
109
|
+
- `birdRadiusPx` - - Bird radius.
|
|
110
|
+
- `pipeWidthPx` - - Pipe width.
|
|
111
|
+
|
|
112
|
+
Returns: Tuple of first and second upcoming pipes.
|
|
113
|
+
|
|
114
|
+
## simulation-shared/observation/observation.vector.utils.ts
|
|
115
|
+
|
|
116
|
+
### resolveCoreObservationVectorFromFeatures
|
|
117
|
+
|
|
118
|
+
`(features: import("test/examples/flappy_bird/simulation-shared/simulation-shared.types").SharedObservationFeatures) => number[]`
|
|
119
|
+
|
|
120
|
+
Resolves the compact core vector used for temporal stacking.
|
|
121
|
+
|
|
122
|
+
The core intentionally keeps directly observed kinematic and geometric
|
|
123
|
+
channels while dropping derived one-step predictors that become redundant
|
|
124
|
+
once short-term temporal memory is available.
|
|
125
|
+
|
|
126
|
+
This is the representation used when the example wants a short history of raw
|
|
127
|
+
observation slices. The idea is similar to frame stacking in reinforcement
|
|
128
|
+
learning: a feed-forward policy can recover some sense of motion by looking
|
|
129
|
+
at several recent compact frames at once.
|
|
130
|
+
|
|
131
|
+
The Wikipedia article on "frame stacking" is a useful conceptual reference.
|
|
132
|
+
|
|
133
|
+
Parameters:
|
|
134
|
+
- `features` - - Structured observation features.
|
|
135
|
+
|
|
136
|
+
Returns: Core per-frame vector.
|
|
137
|
+
|
|
138
|
+
### resolveObservationVectorFromFeatures
|
|
139
|
+
|
|
140
|
+
`(features: import("test/examples/flappy_bird/simulation-shared/simulation-shared.types").SharedObservationFeatures) => number[]`
|
|
141
|
+
|
|
142
|
+
Converts observation features to the canonical 12-value network input vector.
|
|
143
|
+
|
|
144
|
+
Educational note:
|
|
145
|
+
This module owns the network-shape projection so feature semantics can change
|
|
146
|
+
independently from how the policy input is ordered.
|
|
147
|
+
|
|
148
|
+
The 12-value vector is the compact feed-forward policy input used by the main
|
|
149
|
+
evaluation and training flow. Its ordering is stable on purpose: once a
|
|
150
|
+
network topology has evolved against one input layout, silent channel
|
|
151
|
+
reshuffles would invalidate learned behavior.
|
|
152
|
+
|
|
153
|
+
Parameters:
|
|
154
|
+
- `features` - - Structured feature object.
|
|
155
|
+
|
|
156
|
+
Returns: Ordered feature vector.
|
|
157
|
+
|
|
158
|
+
## simulation-shared/observation/observation.features.utils.ts
|
|
159
|
+
|
|
160
|
+
### clamp
|
|
161
|
+
|
|
162
|
+
`(value: number, min: number, max: number) => number`
|
|
163
|
+
|
|
164
|
+
Clamps a numeric value to the inclusive [min, max] interval.
|
|
165
|
+
|
|
166
|
+
Observation synthesis normalizes many raw measurements, so this helper keeps
|
|
167
|
+
derived channels inside their documented ranges.
|
|
168
|
+
|
|
169
|
+
Parameters:
|
|
170
|
+
- `value` - - Candidate value.
|
|
171
|
+
- `min` - - Inclusive lower bound.
|
|
172
|
+
- `max` - - Inclusive upper bound.
|
|
173
|
+
|
|
174
|
+
Returns: Clamped value.
|
|
175
|
+
|
|
176
|
+
### clamp01
|
|
177
|
+
|
|
178
|
+
`(value: number) => number`
|
|
179
|
+
|
|
180
|
+
Clamps a numeric value to the inclusive [0, 1] interval.
|
|
181
|
+
|
|
182
|
+
This is used for channels that are naturally interpreted as normalized
|
|
183
|
+
proportions or bounded progress values.
|
|
184
|
+
|
|
185
|
+
Parameters:
|
|
186
|
+
- `value` - - Candidate value.
|
|
187
|
+
|
|
188
|
+
Returns: Value clamped between 0 and 1.
|
|
189
|
+
|
|
190
|
+
### resolveObservationFeatures
|
|
191
|
+
|
|
192
|
+
`(input: import("test/examples/flappy_bird/simulation-shared/simulation-shared.types").SharedObservationInput) => import("test/examples/flappy_bird/simulation-shared/simulation-shared.types").SharedObservationFeatures`
|
|
193
|
+
|
|
194
|
+
Builds the shared normalized observation feature set consumed by policies.
|
|
195
|
+
|
|
196
|
+
Educational note:
|
|
197
|
+
This helper stays focused on semantic feature assembly only. Projection into
|
|
198
|
+
the canonical network vectors now lives in the neighboring vector module so
|
|
199
|
+
observation policy and network-shape concerns can evolve independently.
|
|
200
|
+
|
|
201
|
+
The features deliberately mix three kinds of signal:
|
|
202
|
+
1. Current state, such as bird height and vertical velocity.
|
|
203
|
+
2. Near-term geometry, such as gap bounds and upcoming-pipe distances.
|
|
204
|
+
3. Simple forward-looking control hints, such as urgency and one-flap
|
|
205
|
+
reachability.
|
|
206
|
+
|
|
207
|
+
This is a compact example of feature engineering for control. Instead of
|
|
208
|
+
asking NEAT to rediscover basic geometry from raw sensory input, the example
|
|
209
|
+
hands the network semantically meaningful signals and lets evolution focus on
|
|
210
|
+
policy search.
|
|
211
|
+
|
|
212
|
+
For broader context, the Wikipedia article on "feature engineering" is a
|
|
213
|
+
good companion reference.
|
|
214
|
+
|
|
215
|
+
Parameters:
|
|
216
|
+
- `input` - - Observation input bundle.
|
|
217
|
+
|
|
218
|
+
Returns: Structured observation features.
|
|
219
|
+
|
|
220
|
+
### resolvePredictedBirdYAtFrames
|
|
221
|
+
|
|
222
|
+
`(startYPx: number, initialVerticalVelocityPxPerFrame: number, frameHorizon: number) => number`
|
|
223
|
+
|
|
224
|
+
Predicts bird y-position after a frame horizon with constant gravity.
|
|
225
|
+
|
|
226
|
+
This is a deliberately cheap forward model. It ignores richer control
|
|
227
|
+
sequences and simply answers: "where would the bird be after N frames under
|
|
228
|
+
the current physics assumption?" That small prediction is enough to build the
|
|
229
|
+
reachability and urgency features used by the controller.
|
|
230
|
+
|
|
231
|
+
Parameters:
|
|
232
|
+
- `startYPx` - - Current bird y-position.
|
|
233
|
+
- `initialVerticalVelocityPxPerFrame` - - Initial vertical velocity.
|
|
234
|
+
- `frameHorizon` - - Predicted horizon in simulation frames.
|
|
235
|
+
|
|
236
|
+
Returns: Predicted y-position.
|
|
237
|
+
|
|
238
|
+
### resolveUpcomingPipes
|
|
239
|
+
|
|
240
|
+
`(pipes: import("test/examples/flappy_bird/simulation-shared/simulation-shared.types").SharedPipeLike[], birdCenterXPx: number, birdRadiusPx: number, pipeWidthPx: number) => [import("test/examples/flappy_bird/simulation-shared/simulation-shared.types").SharedPipeLike | undefined, import("test/examples/flappy_bird/simulation-shared/simulation-shared.types").SharedPipeLike | undefined]`
|
|
241
|
+
|
|
242
|
+
Resolves the next two upcoming pipes in front of the bird.
|
|
243
|
+
|
|
244
|
+
The observation pipeline only cares about the immediate near future, because
|
|
245
|
+
Flappy Bird decisions are dominated by the next gap and the transition after
|
|
246
|
+
it. Looking further ahead adds noise faster than it adds useful control
|
|
247
|
+
signal.
|
|
248
|
+
|
|
249
|
+
Parameters:
|
|
250
|
+
- `pipes` - - Current pipe list.
|
|
251
|
+
- `birdCenterXPx` - - Bird center x-position.
|
|
252
|
+
- `birdRadiusPx` - - Bird radius.
|
|
253
|
+
- `pipeWidthPx` - - Pipe width.
|
|
254
|
+
|
|
255
|
+
Returns: Tuple of first and second upcoming pipes.
|
|
@@ -0,0 +1,339 @@
|
|
|
1
|
+
import {
|
|
2
|
+
FLAPPY_BIRD_RADIUS_PX,
|
|
3
|
+
FLAPPY_BIRD_X_PX,
|
|
4
|
+
FLAPPY_FLAP_VELOCITY_PX_PER_FRAME,
|
|
5
|
+
FLAPPY_GRAVITY_PX_PER_FRAME2,
|
|
6
|
+
FLAPPY_MAX_FALL_SPEED_PX_PER_FRAME,
|
|
7
|
+
FLAPPY_PIPE_GAP_PX,
|
|
8
|
+
FLAPPY_PIPE_WIDTH_PX,
|
|
9
|
+
FLAPPY_WORLD_HEIGHT_PX,
|
|
10
|
+
} from '../../constants/constants';
|
|
11
|
+
import { FLAPPY_SHARED_DEFAULT_NORMALIZATION_EPSILON } from '../simulation-shared.constants';
|
|
12
|
+
import type {
|
|
13
|
+
SharedObservationFeatures,
|
|
14
|
+
SharedObservationInput,
|
|
15
|
+
SharedPipeLike,
|
|
16
|
+
} from '../simulation-shared.types';
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Resolves the next two upcoming pipes in front of the bird.
|
|
20
|
+
*
|
|
21
|
+
* The observation pipeline only cares about the immediate near future, because
|
|
22
|
+
* Flappy Bird decisions are dominated by the next gap and the transition after
|
|
23
|
+
* it. Looking further ahead adds noise faster than it adds useful control
|
|
24
|
+
* signal.
|
|
25
|
+
*
|
|
26
|
+
* @param pipes - Current pipe list.
|
|
27
|
+
* @param birdCenterXPx - Bird center x-position.
|
|
28
|
+
* @param birdRadiusPx - Bird radius.
|
|
29
|
+
* @param pipeWidthPx - Pipe width.
|
|
30
|
+
* @returns Tuple of first and second upcoming pipes.
|
|
31
|
+
* @example
|
|
32
|
+
* ```ts
|
|
33
|
+
* const [nextPipe, secondPipe] = resolveUpcomingPipes(pipes);
|
|
34
|
+
* ```
|
|
35
|
+
*/
|
|
36
|
+
export function resolveUpcomingPipes(
|
|
37
|
+
pipes: SharedPipeLike[],
|
|
38
|
+
birdCenterXPx = FLAPPY_BIRD_X_PX,
|
|
39
|
+
birdRadiusPx = FLAPPY_BIRD_RADIUS_PX,
|
|
40
|
+
pipeWidthPx = FLAPPY_PIPE_WIDTH_PX,
|
|
41
|
+
): [SharedPipeLike | undefined, SharedPipeLike | undefined] {
|
|
42
|
+
const birdFrontX = birdCenterXPx - birdRadiusPx;
|
|
43
|
+
const upcomingPipes = pipes.filter(
|
|
44
|
+
(pipe) => pipe.xPx + pipeWidthPx >= birdFrontX,
|
|
45
|
+
);
|
|
46
|
+
return [upcomingPipes[0], upcomingPipes[1]];
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Builds the shared normalized observation feature set consumed by policies.
|
|
51
|
+
*
|
|
52
|
+
* Educational note:
|
|
53
|
+
* This helper stays focused on semantic feature assembly only. Projection into
|
|
54
|
+
* the canonical network vectors now lives in the neighboring vector module so
|
|
55
|
+
* observation policy and network-shape concerns can evolve independently.
|
|
56
|
+
*
|
|
57
|
+
* The features deliberately mix three kinds of signal:
|
|
58
|
+
* 1. Current state, such as bird height and vertical velocity.
|
|
59
|
+
* 2. Near-term geometry, such as gap bounds and upcoming-pipe distances.
|
|
60
|
+
* 3. Simple forward-looking control hints, such as urgency and one-flap
|
|
61
|
+
* reachability.
|
|
62
|
+
*
|
|
63
|
+
* This is a compact example of feature engineering for control. Instead of
|
|
64
|
+
* asking NEAT to rediscover basic geometry from raw sensory input, the example
|
|
65
|
+
* hands the network semantically meaningful signals and lets evolution focus on
|
|
66
|
+
* policy search.
|
|
67
|
+
*
|
|
68
|
+
* For broader context, the Wikipedia article on "feature engineering" is a
|
|
69
|
+
* good companion reference.
|
|
70
|
+
*
|
|
71
|
+
* @param input - Observation input bundle.
|
|
72
|
+
* @returns Structured observation features.
|
|
73
|
+
* @example
|
|
74
|
+
* ```ts
|
|
75
|
+
* const features = resolveObservationFeatures({
|
|
76
|
+
* birdYPx: 120,
|
|
77
|
+
* velocityYPxPerFrame: 2,
|
|
78
|
+
* pipes,
|
|
79
|
+
* visibleWorldWidthPx: 640,
|
|
80
|
+
* difficultyProfile,
|
|
81
|
+
* activeSpawnIntervalFrames: 90,
|
|
82
|
+
* });
|
|
83
|
+
*
|
|
84
|
+
* if (features.normalizedEntryUrgency > 0.8) {
|
|
85
|
+
* // The bird is misaligned and running out of time to recover.
|
|
86
|
+
* }
|
|
87
|
+
* ```
|
|
88
|
+
*/
|
|
89
|
+
export function resolveObservationFeatures(
|
|
90
|
+
input: SharedObservationInput,
|
|
91
|
+
): SharedObservationFeatures {
|
|
92
|
+
// Step 1: Resolve normalization and geometry defaults.
|
|
93
|
+
const worldHeightPx = input.worldHeightPx ?? FLAPPY_WORLD_HEIGHT_PX;
|
|
94
|
+
const maxFallSpeedPxPerFrame =
|
|
95
|
+
input.maxFallSpeedPxPerFrame ?? FLAPPY_MAX_FALL_SPEED_PX_PER_FRAME;
|
|
96
|
+
const birdCenterXPx = input.birdCenterXPx ?? FLAPPY_BIRD_X_PX;
|
|
97
|
+
const birdRadiusPx = input.birdRadiusPx ?? FLAPPY_BIRD_RADIUS_PX;
|
|
98
|
+
const pipeWidthPx = input.pipeWidthPx ?? FLAPPY_PIPE_WIDTH_PX;
|
|
99
|
+
const defaultGapSizePx = input.defaultGapSizePx ?? FLAPPY_PIPE_GAP_PX;
|
|
100
|
+
const normalizationEpsilon =
|
|
101
|
+
input.normalizationEpsilon ?? FLAPPY_SHARED_DEFAULT_NORMALIZATION_EPSILON;
|
|
102
|
+
|
|
103
|
+
// Step 2: Resolve next-pipe geometry used by all near-term features.
|
|
104
|
+
const [nextPipe, secondPipe] = resolveUpcomingPipes(
|
|
105
|
+
input.pipes,
|
|
106
|
+
birdCenterXPx,
|
|
107
|
+
birdRadiusPx,
|
|
108
|
+
pipeWidthPx,
|
|
109
|
+
);
|
|
110
|
+
const normalizedBirdY = clamp01(input.birdYPx / worldHeightPx);
|
|
111
|
+
const normalizedVelocity = clamp(
|
|
112
|
+
input.velocityYPxPerFrame / maxFallSpeedPxPerFrame,
|
|
113
|
+
-1,
|
|
114
|
+
1,
|
|
115
|
+
);
|
|
116
|
+
|
|
117
|
+
const distanceToNextPipePx = nextPipe
|
|
118
|
+
? nextPipe.xPx + pipeWidthPx - birdCenterXPx
|
|
119
|
+
: input.visibleWorldWidthPx;
|
|
120
|
+
const normalizedDistanceToNextPipe = clamp01(
|
|
121
|
+
distanceToNextPipePx / input.visibleWorldWidthPx,
|
|
122
|
+
);
|
|
123
|
+
|
|
124
|
+
const nextGapCenterYPx = nextPipe?.gapCenterYPx ?? worldHeightPx * 0.5;
|
|
125
|
+
const nextGapHalfPx = (nextPipe?.gapSizePx ?? defaultGapSizePx) * 0.5;
|
|
126
|
+
const normalizedNextGapTop = clamp01(
|
|
127
|
+
(nextGapCenterYPx - nextGapHalfPx) / worldHeightPx,
|
|
128
|
+
);
|
|
129
|
+
const normalizedNextGapBottom = clamp01(
|
|
130
|
+
(nextGapCenterYPx + nextGapHalfPx) / worldHeightPx,
|
|
131
|
+
);
|
|
132
|
+
const normalizedDeltaToNextGap = clamp(
|
|
133
|
+
(input.birdYPx - nextGapCenterYPx) / worldHeightPx,
|
|
134
|
+
-1,
|
|
135
|
+
1,
|
|
136
|
+
);
|
|
137
|
+
|
|
138
|
+
const distanceToSecondPipePx = secondPipe
|
|
139
|
+
? secondPipe.xPx + pipeWidthPx - birdCenterXPx
|
|
140
|
+
: input.visibleWorldWidthPx;
|
|
141
|
+
const normalizedDistanceToSecondPipe = clamp01(
|
|
142
|
+
distanceToSecondPipePx / input.visibleWorldWidthPx,
|
|
143
|
+
);
|
|
144
|
+
|
|
145
|
+
const secondGapCenterYPx = secondPipe?.gapCenterYPx ?? nextGapCenterYPx;
|
|
146
|
+
const normalizedDeltaToSecondGap = clamp(
|
|
147
|
+
(input.birdYPx - secondGapCenterYPx) / worldHeightPx,
|
|
148
|
+
-1,
|
|
149
|
+
1,
|
|
150
|
+
);
|
|
151
|
+
|
|
152
|
+
// Step 3: Resolve timing, clearance, and controllability signals.
|
|
153
|
+
const estimatedFramesToNextPipe =
|
|
154
|
+
distanceToNextPipePx /
|
|
155
|
+
Math.max(normalizationEpsilon, input.difficultyProfile.pipeSpeedPxPerFrame);
|
|
156
|
+
const normalizedTimeToNextPipe = clamp01(
|
|
157
|
+
1 -
|
|
158
|
+
estimatedFramesToNextPipe / Math.max(1, input.activeSpawnIntervalFrames),
|
|
159
|
+
);
|
|
160
|
+
|
|
161
|
+
const distanceToNextGapCenterPx = Math.abs(input.birdYPx - nextGapCenterYPx);
|
|
162
|
+
const normalizedNextGapClearance = clamp(
|
|
163
|
+
(nextGapHalfPx - distanceToNextGapCenterPx) / Math.max(1, nextGapHalfPx),
|
|
164
|
+
-1,
|
|
165
|
+
1,
|
|
166
|
+
);
|
|
167
|
+
|
|
168
|
+
const distanceToGapEntryPx = nextPipe
|
|
169
|
+
? nextPipe.xPx - (birdCenterXPx + birdRadiusPx)
|
|
170
|
+
: input.visibleWorldWidthPx;
|
|
171
|
+
const distanceToGapExitPx = nextPipe
|
|
172
|
+
? nextPipe.xPx + pipeWidthPx - (birdCenterXPx - birdRadiusPx)
|
|
173
|
+
: input.visibleWorldWidthPx;
|
|
174
|
+
|
|
175
|
+
const framesToGapEntry = Math.max(
|
|
176
|
+
0,
|
|
177
|
+
distanceToGapEntryPx /
|
|
178
|
+
Math.max(
|
|
179
|
+
normalizationEpsilon,
|
|
180
|
+
input.difficultyProfile.pipeSpeedPxPerFrame,
|
|
181
|
+
),
|
|
182
|
+
);
|
|
183
|
+
const framesToGapExit = Math.max(
|
|
184
|
+
framesToGapEntry,
|
|
185
|
+
distanceToGapExitPx /
|
|
186
|
+
Math.max(
|
|
187
|
+
normalizationEpsilon,
|
|
188
|
+
input.difficultyProfile.pipeSpeedPxPerFrame,
|
|
189
|
+
),
|
|
190
|
+
);
|
|
191
|
+
|
|
192
|
+
const normalizedFramesToGapEntry = clamp01(
|
|
193
|
+
framesToGapEntry / Math.max(1, input.activeSpawnIntervalFrames),
|
|
194
|
+
);
|
|
195
|
+
const normalizedFramesToGapExit = clamp01(
|
|
196
|
+
framesToGapExit / Math.max(1, input.activeSpawnIntervalFrames),
|
|
197
|
+
);
|
|
198
|
+
|
|
199
|
+
const requiredVerticalVelocityToNextGapPxPerFrame = clamp(
|
|
200
|
+
(nextGapCenterYPx - input.birdYPx) / Math.max(1, estimatedFramesToNextPipe),
|
|
201
|
+
-maxFallSpeedPxPerFrame,
|
|
202
|
+
maxFallSpeedPxPerFrame,
|
|
203
|
+
);
|
|
204
|
+
const normalizedRequiredVerticalVelocityToNextGap = clamp(
|
|
205
|
+
requiredVerticalVelocityToNextGapPxPerFrame / maxFallSpeedPxPerFrame,
|
|
206
|
+
-1,
|
|
207
|
+
1,
|
|
208
|
+
);
|
|
209
|
+
|
|
210
|
+
const requiredVerticalVelocityAtGapEntryPxPerFrame = clamp(
|
|
211
|
+
(nextGapCenterYPx - input.birdYPx) / Math.max(1, framesToGapEntry),
|
|
212
|
+
-maxFallSpeedPxPerFrame,
|
|
213
|
+
maxFallSpeedPxPerFrame,
|
|
214
|
+
);
|
|
215
|
+
const requiredVerticalVelocityAtGapExitPxPerFrame = clamp(
|
|
216
|
+
(nextGapCenterYPx - input.birdYPx) / Math.max(1, framesToGapExit),
|
|
217
|
+
-maxFallSpeedPxPerFrame,
|
|
218
|
+
maxFallSpeedPxPerFrame,
|
|
219
|
+
);
|
|
220
|
+
const normalizedRequiredVerticalVelocityAtGapEntry = clamp(
|
|
221
|
+
requiredVerticalVelocityAtGapEntryPxPerFrame / maxFallSpeedPxPerFrame,
|
|
222
|
+
-1,
|
|
223
|
+
1,
|
|
224
|
+
);
|
|
225
|
+
const normalizedRequiredVerticalVelocityAtGapExit = clamp(
|
|
226
|
+
requiredVerticalVelocityAtGapExitPxPerFrame / maxFallSpeedPxPerFrame,
|
|
227
|
+
-1,
|
|
228
|
+
1,
|
|
229
|
+
);
|
|
230
|
+
|
|
231
|
+
const normalizedEntryUrgency = clamp(
|
|
232
|
+
Math.abs(normalizedDeltaToNextGap) /
|
|
233
|
+
Math.max(normalizationEpsilon, normalizedFramesToGapEntry),
|
|
234
|
+
0,
|
|
235
|
+
1,
|
|
236
|
+
);
|
|
237
|
+
|
|
238
|
+
const predictedBirdYAtEntryWithoutFlap = resolvePredictedBirdYAtFrames(
|
|
239
|
+
input.birdYPx,
|
|
240
|
+
input.velocityYPxPerFrame,
|
|
241
|
+
framesToGapEntry,
|
|
242
|
+
);
|
|
243
|
+
const predictedBirdYAtEntryWithOneFlap = resolvePredictedBirdYAtFrames(
|
|
244
|
+
input.birdYPx,
|
|
245
|
+
FLAPPY_FLAP_VELOCITY_PX_PER_FRAME,
|
|
246
|
+
framesToGapEntry,
|
|
247
|
+
);
|
|
248
|
+
const noFlapEntryErrorPx = Math.abs(
|
|
249
|
+
predictedBirdYAtEntryWithoutFlap - nextGapCenterYPx,
|
|
250
|
+
);
|
|
251
|
+
const oneFlapEntryErrorPx = Math.abs(
|
|
252
|
+
predictedBirdYAtEntryWithOneFlap - nextGapCenterYPx,
|
|
253
|
+
);
|
|
254
|
+
const minimalEntryErrorPx = Math.min(noFlapEntryErrorPx, oneFlapEntryErrorPx);
|
|
255
|
+
const normalizedOneFlapReachabilityAtGapEntry =
|
|
256
|
+
minimalEntryErrorPx <= nextGapHalfPx ? 1 : 0;
|
|
257
|
+
|
|
258
|
+
const normalizedNextToSecondGapTransition = clamp(
|
|
259
|
+
(secondGapCenterYPx - nextGapCenterYPx) / worldHeightPx,
|
|
260
|
+
-1,
|
|
261
|
+
1,
|
|
262
|
+
);
|
|
263
|
+
|
|
264
|
+
// Step 4: Return the structured feature record consumed by both runtimes.
|
|
265
|
+
return {
|
|
266
|
+
normalizedBirdY,
|
|
267
|
+
normalizedVelocity,
|
|
268
|
+
normalizedDistanceToNextPipe,
|
|
269
|
+
normalizedDeltaToNextGap,
|
|
270
|
+
normalizedNextGapTop,
|
|
271
|
+
normalizedNextGapBottom,
|
|
272
|
+
normalizedDistanceToSecondPipe,
|
|
273
|
+
normalizedDeltaToSecondGap,
|
|
274
|
+
normalizedTimeToNextPipe,
|
|
275
|
+
normalizedNextGapClearance,
|
|
276
|
+
normalizedRequiredVerticalVelocityToNextGap,
|
|
277
|
+
normalizedNextToSecondGapTransition,
|
|
278
|
+
normalizedFramesToGapEntry,
|
|
279
|
+
normalizedFramesToGapExit,
|
|
280
|
+
normalizedRequiredVerticalVelocityAtGapEntry,
|
|
281
|
+
normalizedRequiredVerticalVelocityAtGapExit,
|
|
282
|
+
normalizedEntryUrgency,
|
|
283
|
+
normalizedOneFlapReachabilityAtGapEntry,
|
|
284
|
+
};
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
/**
|
|
288
|
+
* Predicts bird y-position after a frame horizon with constant gravity.
|
|
289
|
+
*
|
|
290
|
+
* This is a deliberately cheap forward model. It ignores richer control
|
|
291
|
+
* sequences and simply answers: "where would the bird be after N frames under
|
|
292
|
+
* the current physics assumption?" That small prediction is enough to build the
|
|
293
|
+
* reachability and urgency features used by the controller.
|
|
294
|
+
*
|
|
295
|
+
* @param startYPx - Current bird y-position.
|
|
296
|
+
* @param initialVerticalVelocityPxPerFrame - Initial vertical velocity.
|
|
297
|
+
* @param frameHorizon - Predicted horizon in simulation frames.
|
|
298
|
+
* @returns Predicted y-position.
|
|
299
|
+
*/
|
|
300
|
+
function resolvePredictedBirdYAtFrames(
|
|
301
|
+
startYPx: number,
|
|
302
|
+
initialVerticalVelocityPxPerFrame: number,
|
|
303
|
+
frameHorizon: number,
|
|
304
|
+
): number {
|
|
305
|
+
const safeFrameHorizon = Math.max(0, frameHorizon);
|
|
306
|
+
return (
|
|
307
|
+
startYPx +
|
|
308
|
+
initialVerticalVelocityPxPerFrame * safeFrameHorizon +
|
|
309
|
+
0.5 * FLAPPY_GRAVITY_PX_PER_FRAME2 * safeFrameHorizon * safeFrameHorizon
|
|
310
|
+
);
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
/**
|
|
314
|
+
* Clamps a numeric value to the inclusive [min, max] interval.
|
|
315
|
+
*
|
|
316
|
+
* Observation synthesis normalizes many raw measurements, so this helper keeps
|
|
317
|
+
* derived channels inside their documented ranges.
|
|
318
|
+
*
|
|
319
|
+
* @param value - Candidate value.
|
|
320
|
+
* @param min - Inclusive lower bound.
|
|
321
|
+
* @param max - Inclusive upper bound.
|
|
322
|
+
* @returns Clamped value.
|
|
323
|
+
*/
|
|
324
|
+
function clamp(value: number, min: number, max: number): number {
|
|
325
|
+
return Math.min(max, Math.max(min, value));
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
/**
|
|
329
|
+
* Clamps a numeric value to the inclusive [0, 1] interval.
|
|
330
|
+
*
|
|
331
|
+
* This is used for channels that are naturally interpreted as normalized
|
|
332
|
+
* proportions or bounded progress values.
|
|
333
|
+
*
|
|
334
|
+
* @param value - Candidate value.
|
|
335
|
+
* @returns Value clamped between 0 and 1.
|
|
336
|
+
*/
|
|
337
|
+
function clamp01(value: number): number {
|
|
338
|
+
return clamp(value, 0, 1);
|
|
339
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared observation public entry.
|
|
3
|
+
*
|
|
4
|
+
* This focused boundary keeps observation feature assembly separate from
|
|
5
|
+
* observation-vector projection so browser, environment, and worker callers can
|
|
6
|
+
* depend on a smaller, clearer public surface.
|
|
7
|
+
*
|
|
8
|
+
* Conceptually, this folder is the "state representation" layer for the
|
|
9
|
+
* Flappy Bird example. Instead of learning directly from pixels, the agent sees
|
|
10
|
+
* a compact set of geometric and kinematic signals derived from the current
|
|
11
|
+
* world state. That makes the example easier to study, faster to evaluate, and
|
|
12
|
+
* closer to classic feature-engineering pipelines used in small control tasks.
|
|
13
|
+
*
|
|
14
|
+
* If you want background reading, the Wikipedia articles on "feature
|
|
15
|
+
* engineering" and "state space representation" give useful intuition for why
|
|
16
|
+
* this boundary exists at all.
|
|
17
|
+
*/
|
|
18
|
+
export * from './observation.features.utils';
|
|
19
|
+
export * from './observation.vector.utils';
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import type { SharedObservationFeatures } from '../simulation-shared.types';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Converts observation features to the canonical 12-value network input vector.
|
|
5
|
+
*
|
|
6
|
+
* Educational note:
|
|
7
|
+
* This module owns the network-shape projection so feature semantics can change
|
|
8
|
+
* independently from how the policy input is ordered.
|
|
9
|
+
*
|
|
10
|
+
* The 12-value vector is the compact feed-forward policy input used by the main
|
|
11
|
+
* evaluation and training flow. Its ordering is stable on purpose: once a
|
|
12
|
+
* network topology has evolved against one input layout, silent channel
|
|
13
|
+
* reshuffles would invalidate learned behavior.
|
|
14
|
+
*
|
|
15
|
+
* @param features - Structured feature object.
|
|
16
|
+
* @returns Ordered feature vector.
|
|
17
|
+
* @example
|
|
18
|
+
* ```ts
|
|
19
|
+
* const features = resolveObservationFeatures(input);
|
|
20
|
+
* const networkInput = resolveObservationVectorFromFeatures(features);
|
|
21
|
+
* ```
|
|
22
|
+
*/
|
|
23
|
+
export function resolveObservationVectorFromFeatures(
|
|
24
|
+
features: SharedObservationFeatures,
|
|
25
|
+
): number[] {
|
|
26
|
+
return [
|
|
27
|
+
features.normalizedBirdY,
|
|
28
|
+
features.normalizedVelocity,
|
|
29
|
+
features.normalizedDistanceToNextPipe,
|
|
30
|
+
features.normalizedDeltaToNextGap,
|
|
31
|
+
features.normalizedNextGapTop,
|
|
32
|
+
features.normalizedNextGapBottom,
|
|
33
|
+
features.normalizedDistanceToSecondPipe,
|
|
34
|
+
features.normalizedDeltaToSecondGap,
|
|
35
|
+
features.normalizedTimeToNextPipe,
|
|
36
|
+
features.normalizedNextGapClearance,
|
|
37
|
+
features.normalizedRequiredVerticalVelocityToNextGap,
|
|
38
|
+
features.normalizedNextToSecondGapTransition,
|
|
39
|
+
];
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Resolves the compact core vector used for temporal stacking.
|
|
44
|
+
*
|
|
45
|
+
* The core intentionally keeps directly observed kinematic and geometric
|
|
46
|
+
* channels while dropping derived one-step predictors that become redundant
|
|
47
|
+
* once short-term temporal memory is available.
|
|
48
|
+
*
|
|
49
|
+
* This is the representation used when the example wants a short history of raw
|
|
50
|
+
* observation slices. The idea is similar to frame stacking in reinforcement
|
|
51
|
+
* learning: a feed-forward policy can recover some sense of motion by looking
|
|
52
|
+
* at several recent compact frames at once.
|
|
53
|
+
*
|
|
54
|
+
* The Wikipedia article on "frame stacking" is a useful conceptual reference.
|
|
55
|
+
*
|
|
56
|
+
* @param features - Structured observation features.
|
|
57
|
+
* @returns Core per-frame vector.
|
|
58
|
+
* @example
|
|
59
|
+
* ```ts
|
|
60
|
+
* const coreFrame = resolveCoreObservationVectorFromFeatures(features);
|
|
61
|
+
* observationMemoryState.previousCoreFrames.push(coreFrame);
|
|
62
|
+
* ```
|
|
63
|
+
*/
|
|
64
|
+
export function resolveCoreObservationVectorFromFeatures(
|
|
65
|
+
features: SharedObservationFeatures,
|
|
66
|
+
): number[] {
|
|
67
|
+
return [
|
|
68
|
+
features.normalizedBirdY,
|
|
69
|
+
features.normalizedVelocity,
|
|
70
|
+
features.normalizedDistanceToNextPipe,
|
|
71
|
+
features.normalizedDeltaToNextGap,
|
|
72
|
+
features.normalizedNextGapTop,
|
|
73
|
+
features.normalizedNextGapBottom,
|
|
74
|
+
features.normalizedDistanceToSecondPipe,
|
|
75
|
+
features.normalizedDeltaToSecondGap,
|
|
76
|
+
features.normalizedNextGapClearance,
|
|
77
|
+
features.normalizedRequiredVerticalVelocityToNextGap,
|
|
78
|
+
features.normalizedEntryUrgency,
|
|
79
|
+
features.normalizedOneFlapReachabilityAtGapEntry,
|
|
80
|
+
];
|
|
81
|
+
}
|