@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
|
@@ -7,5 +7,8 @@ export const FLAPPY_SHARED_DEFAULT_DIFFICULTY_SCALE = 1;
|
|
|
7
7
|
|
|
8
8
|
/**
|
|
9
9
|
* Small positive epsilon used to guard divisions in normalized timing features.
|
|
10
|
+
*
|
|
11
|
+
* The epsilon avoids unstable divide-by-zero behavior when distances or speeds
|
|
12
|
+
* collapse toward zero during normalization.
|
|
10
13
|
*/
|
|
11
14
|
export const FLAPPY_SHARED_DEFAULT_NORMALIZATION_EPSILON = 0.001;
|
|
@@ -1,6 +1,12 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Resolves flap/no-flap decision from network outputs.
|
|
3
3
|
*
|
|
4
|
+
* Educational note:
|
|
5
|
+
* The shared control layer accepts both two-output competitive policies
|
|
6
|
+
* (`no flap` vs `flap`) and simpler single-output thresholded policies. That
|
|
7
|
+
* flexibility makes the helper reusable across experiments without forcing every
|
|
8
|
+
* caller to reshape its outputs first.
|
|
9
|
+
*
|
|
4
10
|
* @param rawOutputs - Activation output payload.
|
|
5
11
|
* @param flapThreshold - Scalar threshold for single-output policies.
|
|
6
12
|
* @returns True when flap should trigger.
|
|
@@ -14,6 +14,15 @@ import type { SharedDifficultyProfile } from './simulation-shared.types';
|
|
|
14
14
|
/**
|
|
15
15
|
* Resolves adaptive difficulty profile from passed-pipe progress.
|
|
16
16
|
*
|
|
17
|
+
* Educational note:
|
|
18
|
+
* Difficulty is ramped as a smooth profile rather than as a sequence of hard
|
|
19
|
+
* level jumps. That keeps the task readable for humans and less noisy for
|
|
20
|
+
* evolution.
|
|
21
|
+
*
|
|
22
|
+
* The idea is closely related to curriculum learning: easier versions of the
|
|
23
|
+
* task dominate early, then the example interpolates toward the harder target
|
|
24
|
+
* settings as progress increases.
|
|
25
|
+
*
|
|
17
26
|
* @param pipesPassed - Number of passed pipes.
|
|
18
27
|
* @param difficultyScale - Curriculum scale in `[0, 1]`.
|
|
19
28
|
* @returns Active difficulty profile.
|
|
@@ -1,9 +1,18 @@
|
|
|
1
|
-
/**
|
|
1
|
+
/**
|
|
2
|
+
* Prefix used when formatting unexpected shared-simulation errors.
|
|
3
|
+
*
|
|
4
|
+
* A stable prefix makes logs easier to scan when multiple Flappy subsystems are
|
|
5
|
+
* emitting diagnostics.
|
|
6
|
+
*/
|
|
2
7
|
export const FLAPPY_SHARED_SIMULATION_ERROR_PREFIX = 'Shared simulation error:';
|
|
3
8
|
|
|
4
9
|
/**
|
|
5
10
|
* Formats unknown shared-simulation errors for stable logs.
|
|
6
11
|
*
|
|
12
|
+
* Shared utilities are used from several runtime contexts, so this helper keeps
|
|
13
|
+
* the error surface human-readable even when the thrown value is not an
|
|
14
|
+
* `Error` instance.
|
|
15
|
+
*
|
|
7
16
|
* @param error - Unknown error value.
|
|
8
17
|
* @returns Readable error message.
|
|
9
18
|
*/
|
|
@@ -12,6 +12,11 @@ import type {
|
|
|
12
12
|
/**
|
|
13
13
|
* Creates an empty temporal observation memory state.
|
|
14
14
|
*
|
|
15
|
+
* @example
|
|
16
|
+
* ```ts
|
|
17
|
+
* const memoryState = createSharedObservationMemoryState();
|
|
18
|
+
* ```
|
|
19
|
+
*
|
|
15
20
|
* @returns Fresh mutable memory buffers for one bird/controller.
|
|
16
21
|
*/
|
|
17
22
|
export function createSharedObservationMemoryState(): SharedObservationMemoryState {
|
|
@@ -24,6 +29,12 @@ export function createSharedObservationMemoryState(): SharedObservationMemorySta
|
|
|
24
29
|
/**
|
|
25
30
|
* Builds the temporal policy input vector (stacked observation + action memory).
|
|
26
31
|
*
|
|
32
|
+
* Educational note:
|
|
33
|
+
* This helper turns an interpretable feature object into the exact flat vector a
|
|
34
|
+
* feed-forward network consumes. That is why the output layout is documented so
|
|
35
|
+
* explicitly: changing the order would change the meaning of every trained
|
|
36
|
+
* weight in the policy.
|
|
37
|
+
*
|
|
27
38
|
* Output layout:
|
|
28
39
|
* 1) current core observation frame
|
|
29
40
|
* 2) previous core frames (newest to oldest) with zero padding
|
|
@@ -60,6 +71,10 @@ export function resolveTemporalObservationVector(
|
|
|
60
71
|
/**
|
|
61
72
|
* Commits one observation-action step into temporal memory.
|
|
62
73
|
*
|
|
74
|
+
* The memory update happens after the decision is made so the next step can see
|
|
75
|
+
* both the recent observation context and the action history that produced the
|
|
76
|
+
* current trajectory.
|
|
77
|
+
*
|
|
63
78
|
* @param observationMemoryState - Mutable temporal memory for the active bird.
|
|
64
79
|
* @param features - Structured observation features used for the decision.
|
|
65
80
|
* @param didFlap - Decision taken at this step.
|
|
@@ -93,6 +108,9 @@ export function commitSharedObservationMemoryStep(
|
|
|
93
108
|
/**
|
|
94
109
|
* Resolves previous core frames (newest-first) with deterministic zero padding.
|
|
95
110
|
*
|
|
111
|
+
* Zero padding keeps the policy input width stable during the first few frames
|
|
112
|
+
* of an episode before enough history has accumulated.
|
|
113
|
+
*
|
|
96
114
|
* @param observationMemoryState - Mutable temporal memory for the active bird.
|
|
97
115
|
* @returns Previous core frame list with fixed target length.
|
|
98
116
|
*/
|
|
@@ -1,406 +1,11 @@
|
|
|
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_MIN_PIPE_RECOVERY_FRAMES,
|
|
8
|
-
FLAPPY_PIPE_GAP_PX,
|
|
9
|
-
FLAPPY_PIPE_WIDTH_PX,
|
|
10
|
-
FLAPPY_WORLD_HEIGHT_PX,
|
|
11
|
-
} from '../constants/constants';
|
|
12
|
-
import { FLAPPY_SHARED_DEFAULT_NORMALIZATION_EPSILON } from './simulation-shared.constants';
|
|
13
|
-
import type {
|
|
14
|
-
SharedObservationFeatures,
|
|
15
|
-
SharedObservationInput,
|
|
16
|
-
SharedPipeLike,
|
|
17
|
-
} from './simulation-shared.types';
|
|
18
|
-
|
|
19
1
|
/**
|
|
20
|
-
*
|
|
2
|
+
* Shared observation compatibility façade.
|
|
21
3
|
*
|
|
22
|
-
*
|
|
23
|
-
*
|
|
24
|
-
*
|
|
25
|
-
* @param pipeWidthPx - Pipe width.
|
|
26
|
-
* @returns Tuple of first and second upcoming pipes.
|
|
27
|
-
*/
|
|
28
|
-
export function resolveUpcomingPipes(
|
|
29
|
-
pipes: SharedPipeLike[],
|
|
30
|
-
birdCenterXPx = FLAPPY_BIRD_X_PX,
|
|
31
|
-
birdRadiusPx = FLAPPY_BIRD_RADIUS_PX,
|
|
32
|
-
pipeWidthPx = FLAPPY_PIPE_WIDTH_PX,
|
|
33
|
-
): [SharedPipeLike | undefined, SharedPipeLike | undefined] {
|
|
34
|
-
const birdFrontX = birdCenterXPx - birdRadiusPx;
|
|
35
|
-
const upcomingPipes = pipes.filter(
|
|
36
|
-
(pipe) => pipe.xPx + pipeWidthPx >= birdFrontX,
|
|
37
|
-
);
|
|
38
|
-
return [upcomingPipes[0], upcomingPipes[1]];
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
/**
|
|
42
|
-
* Builds the shared normalized observation feature set consumed by policies.
|
|
43
|
-
*
|
|
44
|
-
* @param input - Observation input bundle.
|
|
45
|
-
* @returns Structured observation features.
|
|
46
|
-
*/
|
|
47
|
-
export function resolveObservationFeatures(
|
|
48
|
-
input: SharedObservationInput,
|
|
49
|
-
): SharedObservationFeatures {
|
|
50
|
-
/**
|
|
51
|
-
* Effective world height used for all vertical normalization.
|
|
52
|
-
*
|
|
53
|
-
* Why it matters: scaling by a stable height keeps feature magnitudes
|
|
54
|
-
* comparable across episodes and prevents value drift when display sizes vary.
|
|
55
|
-
*/
|
|
56
|
-
const worldHeightPx = input.worldHeightPx ?? FLAPPY_WORLD_HEIGHT_PX;
|
|
57
|
-
/**
|
|
58
|
-
* Maximum downward speed used to normalize velocity-like channels.
|
|
59
|
-
*
|
|
60
|
-
* Why it matters: velocity channels become dimensionless and bounded in [-1, 1],
|
|
61
|
-
* making policy optimization numerically easier.
|
|
62
|
-
*/
|
|
63
|
-
const maxFallSpeedPxPerFrame =
|
|
64
|
-
input.maxFallSpeedPxPerFrame ?? FLAPPY_MAX_FALL_SPEED_PX_PER_FRAME;
|
|
65
|
-
/** Bird center x-position used to measure forward distances to pipes. */
|
|
66
|
-
const birdCenterXPx = input.birdCenterXPx ?? FLAPPY_BIRD_X_PX;
|
|
67
|
-
/** Bird collision radius used by upcoming-pipe selection and entry/exit timing. */
|
|
68
|
-
const birdRadiusPx = input.birdRadiusPx ?? FLAPPY_BIRD_RADIUS_PX;
|
|
69
|
-
/** Pipe width used for distance-to-entry/exit and visibility checks. */
|
|
70
|
-
const pipeWidthPx = input.pipeWidthPx ?? FLAPPY_PIPE_WIDTH_PX;
|
|
71
|
-
/** Default gap size fallback when no upcoming pipe is available yet. */
|
|
72
|
-
const defaultGapSizePx = input.defaultGapSizePx ?? FLAPPY_PIPE_GAP_PX;
|
|
73
|
-
/**
|
|
74
|
-
* Small denominator guard used in time/urgency calculations.
|
|
75
|
-
*
|
|
76
|
-
* Why it matters: avoids division by zero and explosive values when
|
|
77
|
-
* speed or time-to-event become extremely small.
|
|
78
|
-
*/
|
|
79
|
-
const normalizationEpsilon =
|
|
80
|
-
input.normalizationEpsilon ?? FLAPPY_SHARED_DEFAULT_NORMALIZATION_EPSILON;
|
|
81
|
-
|
|
82
|
-
/** First and second upcoming pipes used for near-term and lookahead guidance. */
|
|
83
|
-
const [nextPipe, secondPipe] = resolveUpcomingPipes(
|
|
84
|
-
input.pipes,
|
|
85
|
-
birdCenterXPx,
|
|
86
|
-
birdRadiusPx,
|
|
87
|
-
pipeWidthPx,
|
|
88
|
-
);
|
|
89
|
-
/** Bird y-position normalized to [0, 1]. */
|
|
90
|
-
const normalizedBirdY = clamp01(input.birdYPx / worldHeightPx);
|
|
91
|
-
/** Bird vertical velocity normalized to [-1, 1]. */
|
|
92
|
-
const normalizedVelocity = clamp(
|
|
93
|
-
input.velocityYPxPerFrame / maxFallSpeedPxPerFrame,
|
|
94
|
-
-1,
|
|
95
|
-
1,
|
|
96
|
-
);
|
|
97
|
-
|
|
98
|
-
/** Forward distance from bird to the next pipe corridor (pixels). */
|
|
99
|
-
const distanceToNextPipePx = nextPipe
|
|
100
|
-
? nextPipe.xPx + pipeWidthPx - birdCenterXPx
|
|
101
|
-
: input.visibleWorldWidthPx;
|
|
102
|
-
/** Next-pipe forward distance normalized to [0, 1]. */
|
|
103
|
-
const normalizedDistanceToNextPipe = clamp01(
|
|
104
|
-
distanceToNextPipePx / input.visibleWorldWidthPx,
|
|
105
|
-
);
|
|
106
|
-
|
|
107
|
-
/** Next gap center y-position (fallback to mid-world when absent). */
|
|
108
|
-
const nextGapCenterYPx = nextPipe?.gapCenterYPx ?? worldHeightPx * 0.5;
|
|
109
|
-
/** Half-gap height for clearance and boundary calculations. */
|
|
110
|
-
const nextGapHalfPx = (nextPipe?.gapSizePx ?? defaultGapSizePx) * 0.5;
|
|
111
|
-
/** Normalized top boundary of the next gap opening. */
|
|
112
|
-
const normalizedNextGapTop = clamp01(
|
|
113
|
-
(nextGapCenterYPx - nextGapHalfPx) / worldHeightPx,
|
|
114
|
-
);
|
|
115
|
-
/** Normalized bottom boundary of the next gap opening. */
|
|
116
|
-
const normalizedNextGapBottom = clamp01(
|
|
117
|
-
(nextGapCenterYPx + nextGapHalfPx) / worldHeightPx,
|
|
118
|
-
);
|
|
119
|
-
/** Signed bird-to-next-gap-center vertical offset normalized to [-1, 1]. */
|
|
120
|
-
const normalizedDeltaToNextGap = clamp(
|
|
121
|
-
(input.birdYPx - nextGapCenterYPx) / worldHeightPx,
|
|
122
|
-
-1,
|
|
123
|
-
1,
|
|
124
|
-
);
|
|
125
|
-
|
|
126
|
-
/** Forward distance from bird to the second upcoming pipe (pixels). */
|
|
127
|
-
const distanceToSecondPipePx = secondPipe
|
|
128
|
-
? secondPipe.xPx + pipeWidthPx - birdCenterXPx
|
|
129
|
-
: input.visibleWorldWidthPx;
|
|
130
|
-
/** Second-pipe forward distance normalized to [0, 1]. */
|
|
131
|
-
const normalizedDistanceToSecondPipe = clamp01(
|
|
132
|
-
distanceToSecondPipePx / input.visibleWorldWidthPx,
|
|
133
|
-
);
|
|
134
|
-
|
|
135
|
-
/** Second gap center y-position (fallback to next center when absent). */
|
|
136
|
-
const secondGapCenterYPx = secondPipe?.gapCenterYPx ?? nextGapCenterYPx;
|
|
137
|
-
/** Signed bird-to-second-gap-center vertical offset normalized to [-1, 1]. */
|
|
138
|
-
const normalizedDeltaToSecondGap = clamp(
|
|
139
|
-
(input.birdYPx - secondGapCenterYPx) / worldHeightPx,
|
|
140
|
-
-1,
|
|
141
|
-
1,
|
|
142
|
-
);
|
|
143
|
-
|
|
144
|
-
/** Estimated frames until reaching the next pipe (continuous-time approximation). */
|
|
145
|
-
const estimatedFramesToNextPipe =
|
|
146
|
-
distanceToNextPipePx /
|
|
147
|
-
Math.max(normalizationEpsilon, input.difficultyProfile.pipeSpeedPxPerFrame);
|
|
148
|
-
/** Urgency-like proximity to next pipe in [0, 1], where 1 means imminent. */
|
|
149
|
-
const normalizedTimeToNextPipe = clamp01(
|
|
150
|
-
1 -
|
|
151
|
-
estimatedFramesToNextPipe / Math.max(1, input.activeSpawnIntervalFrames),
|
|
152
|
-
);
|
|
153
|
-
|
|
154
|
-
/** Absolute vertical distance from bird to next gap center (pixels). */
|
|
155
|
-
const distanceToNextGapCenterPx = Math.abs(input.birdYPx - nextGapCenterYPx);
|
|
156
|
-
/** Signed clearance relative to half-gap height, normalized to [-1, 1]. */
|
|
157
|
-
const normalizedNextGapClearance = clamp(
|
|
158
|
-
(nextGapHalfPx - distanceToNextGapCenterPx) / Math.max(1, nextGapHalfPx),
|
|
159
|
-
-1,
|
|
160
|
-
1,
|
|
161
|
-
);
|
|
162
|
-
|
|
163
|
-
/** Horizontal distance to the gap entry plane (pixels). */
|
|
164
|
-
const distanceToGapEntryPx = nextPipe
|
|
165
|
-
? nextPipe.xPx - (birdCenterXPx + birdRadiusPx)
|
|
166
|
-
: input.visibleWorldWidthPx;
|
|
167
|
-
/** Horizontal distance to the gap exit plane (pixels). */
|
|
168
|
-
const distanceToGapExitPx = nextPipe
|
|
169
|
-
? nextPipe.xPx + pipeWidthPx - (birdCenterXPx - birdRadiusPx)
|
|
170
|
-
: input.visibleWorldWidthPx;
|
|
171
|
-
|
|
172
|
-
/** Frames until gap entry; clamped to non-negative values. */
|
|
173
|
-
const framesToGapEntry = Math.max(
|
|
174
|
-
0,
|
|
175
|
-
distanceToGapEntryPx /
|
|
176
|
-
Math.max(
|
|
177
|
-
normalizationEpsilon,
|
|
178
|
-
input.difficultyProfile.pipeSpeedPxPerFrame,
|
|
179
|
-
),
|
|
180
|
-
);
|
|
181
|
-
/**
|
|
182
|
-
* Frames until gap exit; never smaller than entry time.
|
|
183
|
-
*
|
|
184
|
-
* Why it matters: captures tube traversal duration, which is crucial for
|
|
185
|
-
* wide-pipe timing and potential two-flap planning.
|
|
186
|
-
*/
|
|
187
|
-
const framesToGapExit = Math.max(
|
|
188
|
-
framesToGapEntry,
|
|
189
|
-
distanceToGapExitPx /
|
|
190
|
-
Math.max(
|
|
191
|
-
normalizationEpsilon,
|
|
192
|
-
input.difficultyProfile.pipeSpeedPxPerFrame,
|
|
193
|
-
),
|
|
194
|
-
);
|
|
195
|
-
|
|
196
|
-
/** Frames-to-entry normalized to [0, 1] using spawn-interval scale. */
|
|
197
|
-
const normalizedFramesToGapEntry = clamp01(
|
|
198
|
-
framesToGapEntry / Math.max(1, input.activeSpawnIntervalFrames),
|
|
199
|
-
);
|
|
200
|
-
/** Frames-to-exit normalized to [0, 1] using spawn-interval scale. */
|
|
201
|
-
const normalizedFramesToGapExit = clamp01(
|
|
202
|
-
framesToGapExit / Math.max(1, input.activeSpawnIntervalFrames),
|
|
203
|
-
);
|
|
204
|
-
|
|
205
|
-
/** Required mean vertical velocity to center at next-pipe contact window. */
|
|
206
|
-
const requiredVerticalVelocityToNextGapPxPerFrame = clamp(
|
|
207
|
-
(nextGapCenterYPx - input.birdYPx) / Math.max(1, estimatedFramesToNextPipe),
|
|
208
|
-
-maxFallSpeedPxPerFrame,
|
|
209
|
-
maxFallSpeedPxPerFrame,
|
|
210
|
-
);
|
|
211
|
-
/** Required velocity-to-next-gap channel normalized to [-1, 1]. */
|
|
212
|
-
const normalizedRequiredVerticalVelocityToNextGap = clamp(
|
|
213
|
-
requiredVerticalVelocityToNextGapPxPerFrame / maxFallSpeedPxPerFrame,
|
|
214
|
-
-1,
|
|
215
|
-
1,
|
|
216
|
-
);
|
|
217
|
-
|
|
218
|
-
/** Required mean vertical velocity to center precisely at gap entry. */
|
|
219
|
-
const requiredVerticalVelocityAtGapEntryPxPerFrame = clamp(
|
|
220
|
-
(nextGapCenterYPx - input.birdYPx) / Math.max(1, framesToGapEntry),
|
|
221
|
-
-maxFallSpeedPxPerFrame,
|
|
222
|
-
maxFallSpeedPxPerFrame,
|
|
223
|
-
);
|
|
224
|
-
/** Required mean vertical velocity to remain centered by gap exit. */
|
|
225
|
-
const requiredVerticalVelocityAtGapExitPxPerFrame = clamp(
|
|
226
|
-
(nextGapCenterYPx - input.birdYPx) / Math.max(1, framesToGapExit),
|
|
227
|
-
-maxFallSpeedPxPerFrame,
|
|
228
|
-
maxFallSpeedPxPerFrame,
|
|
229
|
-
);
|
|
230
|
-
/** Entry-target velocity normalized to [-1, 1]. */
|
|
231
|
-
const normalizedRequiredVerticalVelocityAtGapEntry = clamp(
|
|
232
|
-
requiredVerticalVelocityAtGapEntryPxPerFrame / maxFallSpeedPxPerFrame,
|
|
233
|
-
-1,
|
|
234
|
-
1,
|
|
235
|
-
);
|
|
236
|
-
/** Exit-target velocity normalized to [-1, 1]. */
|
|
237
|
-
const normalizedRequiredVerticalVelocityAtGapExit = clamp(
|
|
238
|
-
requiredVerticalVelocityAtGapExitPxPerFrame / maxFallSpeedPxPerFrame,
|
|
239
|
-
-1,
|
|
240
|
-
1,
|
|
241
|
-
);
|
|
242
|
-
|
|
243
|
-
/**
|
|
244
|
-
* Centering urgency in [0, 1]: large offset with little time-to-entry yields
|
|
245
|
-
* stronger urgency.
|
|
246
|
-
*/
|
|
247
|
-
const normalizedEntryUrgency = clamp(
|
|
248
|
-
Math.abs(normalizedDeltaToNextGap) /
|
|
249
|
-
Math.max(normalizationEpsilon, normalizedFramesToGapEntry),
|
|
250
|
-
0,
|
|
251
|
-
1,
|
|
252
|
-
);
|
|
253
|
-
|
|
254
|
-
/** Predicted entry y-position if no flap occurs before entry. */
|
|
255
|
-
const predictedBirdYAtEntryWithoutFlap = resolvePredictedBirdYAtFrames(
|
|
256
|
-
input.birdYPx,
|
|
257
|
-
input.velocityYPxPerFrame,
|
|
258
|
-
framesToGapEntry,
|
|
259
|
-
);
|
|
260
|
-
/** Predicted entry y-position if one immediate flap occurs before entry. */
|
|
261
|
-
const predictedBirdYAtEntryWithOneFlap = resolvePredictedBirdYAtFrames(
|
|
262
|
-
input.birdYPx,
|
|
263
|
-
FLAPPY_FLAP_VELOCITY_PX_PER_FRAME,
|
|
264
|
-
framesToGapEntry,
|
|
265
|
-
);
|
|
266
|
-
/** Entry centering error (pixels) under no-flap trajectory. */
|
|
267
|
-
const noFlapEntryErrorPx = Math.abs(
|
|
268
|
-
predictedBirdYAtEntryWithoutFlap - nextGapCenterYPx,
|
|
269
|
-
);
|
|
270
|
-
/** Entry centering error (pixels) under one-flap trajectory. */
|
|
271
|
-
const oneFlapEntryErrorPx = Math.abs(
|
|
272
|
-
predictedBirdYAtEntryWithOneFlap - nextGapCenterYPx,
|
|
273
|
-
);
|
|
274
|
-
/** Best (minimum) entry error among one-step action hypotheses. */
|
|
275
|
-
const minimalEntryErrorPx = Math.min(noFlapEntryErrorPx, oneFlapEntryErrorPx);
|
|
276
|
-
/** Binary reachability feature: 1 when entry center is recoverable within <=1 flap. */
|
|
277
|
-
const normalizedOneFlapReachabilityAtGapEntry =
|
|
278
|
-
minimalEntryErrorPx <= nextGapHalfPx ? 1 : 0;
|
|
279
|
-
|
|
280
|
-
/** Signed centerline transition from next gap to second gap, normalized to [-1, 1]. */
|
|
281
|
-
const normalizedNextToSecondGapTransition = clamp(
|
|
282
|
-
(secondGapCenterYPx - nextGapCenterYPx) / worldHeightPx,
|
|
283
|
-
-1,
|
|
284
|
-
1,
|
|
285
|
-
);
|
|
286
|
-
|
|
287
|
-
return {
|
|
288
|
-
normalizedBirdY,
|
|
289
|
-
normalizedVelocity,
|
|
290
|
-
normalizedDistanceToNextPipe,
|
|
291
|
-
normalizedDeltaToNextGap,
|
|
292
|
-
normalizedNextGapTop,
|
|
293
|
-
normalizedNextGapBottom,
|
|
294
|
-
normalizedDistanceToSecondPipe,
|
|
295
|
-
normalizedDeltaToSecondGap,
|
|
296
|
-
normalizedTimeToNextPipe,
|
|
297
|
-
normalizedNextGapClearance,
|
|
298
|
-
normalizedRequiredVerticalVelocityToNextGap,
|
|
299
|
-
normalizedNextToSecondGapTransition,
|
|
300
|
-
normalizedFramesToGapEntry,
|
|
301
|
-
normalizedFramesToGapExit,
|
|
302
|
-
normalizedRequiredVerticalVelocityAtGapEntry,
|
|
303
|
-
normalizedRequiredVerticalVelocityAtGapExit,
|
|
304
|
-
normalizedEntryUrgency,
|
|
305
|
-
normalizedOneFlapReachabilityAtGapEntry,
|
|
306
|
-
};
|
|
307
|
-
}
|
|
308
|
-
|
|
309
|
-
/**
|
|
310
|
-
* Converts observation features to the canonical 12-value network input vector.
|
|
311
|
-
*
|
|
312
|
-
* @param features - Structured feature object.
|
|
313
|
-
* @returns Ordered feature vector.
|
|
314
|
-
*/
|
|
315
|
-
export function resolveObservationVectorFromFeatures(
|
|
316
|
-
features: SharedObservationFeatures,
|
|
317
|
-
): number[] {
|
|
318
|
-
return [
|
|
319
|
-
features.normalizedBirdY,
|
|
320
|
-
features.normalizedVelocity,
|
|
321
|
-
features.normalizedDistanceToNextPipe,
|
|
322
|
-
features.normalizedDeltaToNextGap,
|
|
323
|
-
features.normalizedNextGapTop,
|
|
324
|
-
features.normalizedNextGapBottom,
|
|
325
|
-
features.normalizedDistanceToSecondPipe,
|
|
326
|
-
features.normalizedDeltaToSecondGap,
|
|
327
|
-
features.normalizedTimeToNextPipe,
|
|
328
|
-
features.normalizedNextGapClearance,
|
|
329
|
-
features.normalizedRequiredVerticalVelocityToNextGap,
|
|
330
|
-
features.normalizedNextToSecondGapTransition,
|
|
331
|
-
];
|
|
332
|
-
}
|
|
333
|
-
|
|
334
|
-
/**
|
|
335
|
-
* Resolves the compact core vector used for temporal stacking.
|
|
336
|
-
*
|
|
337
|
-
* The core intentionally keeps directly observed kinematic/geometric channels
|
|
338
|
-
* and drops derived one-step predictors that become redundant once temporal
|
|
339
|
-
* context is available.
|
|
340
|
-
*
|
|
341
|
-
* @param features - Structured observation features.
|
|
342
|
-
* @returns Core per-frame vector.
|
|
343
|
-
*/
|
|
344
|
-
export function resolveCoreObservationVectorFromFeatures(
|
|
345
|
-
features: SharedObservationFeatures,
|
|
346
|
-
): number[] {
|
|
347
|
-
return [
|
|
348
|
-
features.normalizedBirdY,
|
|
349
|
-
features.normalizedVelocity,
|
|
350
|
-
features.normalizedDistanceToNextPipe,
|
|
351
|
-
features.normalizedDeltaToNextGap,
|
|
352
|
-
features.normalizedNextGapTop,
|
|
353
|
-
features.normalizedNextGapBottom,
|
|
354
|
-
features.normalizedDistanceToSecondPipe,
|
|
355
|
-
features.normalizedDeltaToSecondGap,
|
|
356
|
-
features.normalizedNextGapClearance,
|
|
357
|
-
features.normalizedRequiredVerticalVelocityToNextGap,
|
|
358
|
-
features.normalizedEntryUrgency,
|
|
359
|
-
features.normalizedOneFlapReachabilityAtGapEntry,
|
|
360
|
-
];
|
|
361
|
-
}
|
|
362
|
-
|
|
363
|
-
/**
|
|
364
|
-
* Predicts bird y-position after a frame horizon with constant gravity.
|
|
365
|
-
*
|
|
366
|
-
* This lightweight estimate is used for reachability signals only.
|
|
367
|
-
*
|
|
368
|
-
* @param startYPx - Current bird y-position.
|
|
369
|
-
* @param initialVerticalVelocityPxPerFrame - Initial vertical velocity.
|
|
370
|
-
* @param frameHorizon - Predicted horizon in simulation frames.
|
|
371
|
-
* @returns Predicted y-position.
|
|
372
|
-
*/
|
|
373
|
-
function resolvePredictedBirdYAtFrames(
|
|
374
|
-
startYPx: number,
|
|
375
|
-
initialVerticalVelocityPxPerFrame: number,
|
|
376
|
-
frameHorizon: number,
|
|
377
|
-
): number {
|
|
378
|
-
const safeFrameHorizon = Math.max(0, frameHorizon);
|
|
379
|
-
return (
|
|
380
|
-
startYPx +
|
|
381
|
-
initialVerticalVelocityPxPerFrame * safeFrameHorizon +
|
|
382
|
-
0.5 * FLAPPY_GRAVITY_PX_PER_FRAME2 * safeFrameHorizon * safeFrameHorizon
|
|
383
|
-
);
|
|
384
|
-
}
|
|
385
|
-
|
|
386
|
-
/**
|
|
387
|
-
* Clamps a numeric value to the inclusive `[min, max]` interval.
|
|
388
|
-
*
|
|
389
|
-
* @param value - Candidate value.
|
|
390
|
-
* @param min - Inclusive lower bound.
|
|
391
|
-
* @param max - Inclusive upper bound.
|
|
392
|
-
* @returns Clamped value.
|
|
393
|
-
*/
|
|
394
|
-
function clamp(value: number, min: number, max: number): number {
|
|
395
|
-
return Math.min(max, Math.max(min, value));
|
|
396
|
-
}
|
|
397
|
-
|
|
398
|
-
/**
|
|
399
|
-
* Clamps a numeric value to the inclusive `[0, 1]` interval.
|
|
4
|
+
* The observation implementation now lives under `simulation-shared/observation/`
|
|
5
|
+
* so feature synthesis and vector projection can evolve behind a focused module
|
|
6
|
+
* boundary. This file stays as the stable import path for existing callers.
|
|
400
7
|
*
|
|
401
|
-
*
|
|
402
|
-
*
|
|
8
|
+
* That split keeps the high-level import path simple while allowing the
|
|
9
|
+
* observation subsystem to grow into its own documented folder.
|
|
403
10
|
*/
|
|
404
|
-
|
|
405
|
-
return clamp(value, 0, 1);
|
|
406
|
-
}
|
|
11
|
+
export * from './observation/observation';
|
|
@@ -17,46 +17,72 @@ import type {
|
|
|
17
17
|
/**
|
|
18
18
|
* Samples a random gap center y-position.
|
|
19
19
|
*
|
|
20
|
+
* The sampled center is bounded so the resulting pipe gap always remains inside
|
|
21
|
+
* the visible play area.
|
|
22
|
+
*
|
|
20
23
|
* @param rng - Deterministic RNG.
|
|
24
|
+
* @param maximumGapCenterYPx - Optional inclusive upper bound for smaller viewports.
|
|
21
25
|
* @returns Sampled y-position.
|
|
22
26
|
*/
|
|
23
|
-
export function sampleGapCenterY(
|
|
27
|
+
export function sampleGapCenterY(
|
|
28
|
+
rng: SharedRngLike,
|
|
29
|
+
maximumGapCenterYPx: number = FLAPPY_PIPE_GAP_CENTER_MAX_Y_PX,
|
|
30
|
+
): number {
|
|
31
|
+
const boundedMaximumGapCenterYPx = Math.max(
|
|
32
|
+
FLAPPY_PIPE_GAP_CENTER_MIN_Y_PX,
|
|
33
|
+
maximumGapCenterYPx,
|
|
34
|
+
);
|
|
24
35
|
return rng.nextInt(
|
|
25
36
|
FLAPPY_PIPE_GAP_CENTER_MIN_Y_PX,
|
|
26
|
-
|
|
37
|
+
boundedMaximumGapCenterYPx,
|
|
27
38
|
);
|
|
28
39
|
}
|
|
29
40
|
|
|
30
41
|
/**
|
|
31
42
|
* Resolves next gap center with bounded per-pipe delta.
|
|
32
43
|
*
|
|
44
|
+
* Educational note:
|
|
45
|
+
* Consecutive gaps are deliberately constrained to avoid unfair zig-zag jumps.
|
|
46
|
+
* The environment should still be challenging, but it should not demand an
|
|
47
|
+
* impossible vertical correction from one pipe to the next.
|
|
48
|
+
*
|
|
33
49
|
* @param previousGapCenterYPx - Previous spawn gap center.
|
|
34
50
|
* @param rng - Deterministic RNG.
|
|
51
|
+
* @param maximumGapCenterYPx - Optional inclusive upper bound for smaller viewports.
|
|
35
52
|
* @returns Next gap center y-position.
|
|
36
53
|
*/
|
|
37
54
|
export function resolveNextSpawnGapCenterY(
|
|
38
55
|
previousGapCenterYPx: number,
|
|
39
56
|
rng: SharedRngLike,
|
|
57
|
+
maximumGapCenterYPx: number = FLAPPY_PIPE_GAP_CENTER_MAX_Y_PX,
|
|
40
58
|
): number {
|
|
41
|
-
const
|
|
59
|
+
const boundedMaximumGapCenterYPx = Math.max(
|
|
60
|
+
FLAPPY_PIPE_GAP_CENTER_MIN_Y_PX,
|
|
61
|
+
maximumGapCenterYPx,
|
|
62
|
+
);
|
|
63
|
+
const sampledGapCenterYPx = sampleGapCenterY(rng, boundedMaximumGapCenterYPx);
|
|
42
64
|
const minimumGapCenterYPx = Math.max(
|
|
43
65
|
FLAPPY_PIPE_GAP_CENTER_MIN_Y_PX,
|
|
44
66
|
previousGapCenterYPx - FLAPPY_PIPE_GAP_CENTER_MAX_DELTA_PX,
|
|
45
67
|
);
|
|
46
|
-
const
|
|
47
|
-
|
|
68
|
+
const clampedMaximumGapCenterYPx = Math.min(
|
|
69
|
+
boundedMaximumGapCenterYPx,
|
|
48
70
|
previousGapCenterYPx + FLAPPY_PIPE_GAP_CENTER_MAX_DELTA_PX,
|
|
49
71
|
);
|
|
50
72
|
return clampValue(
|
|
51
73
|
sampledGapCenterYPx,
|
|
52
74
|
minimumGapCenterYPx,
|
|
53
|
-
|
|
75
|
+
clampedMaximumGapCenterYPx,
|
|
54
76
|
);
|
|
55
77
|
}
|
|
56
78
|
|
|
57
79
|
/**
|
|
58
80
|
* Resolves next spawn gap size using progressive shrink and jitter.
|
|
59
81
|
*
|
|
82
|
+
* The gap starts wider than the current hardest target, then shrinks toward the
|
|
83
|
+
* active difficulty profile with a small amount of deterministic jitter so runs
|
|
84
|
+
* do not feel mechanically repetitive.
|
|
85
|
+
*
|
|
60
86
|
* @param previousSpawnGapPx - Previous spawn gap size.
|
|
61
87
|
* @param difficultyProfile - Active difficulty profile.
|
|
62
88
|
* @param rng - Deterministic RNG.
|
|
@@ -94,6 +120,10 @@ export function resolveNextSpawnGapSize(
|
|
|
94
120
|
/**
|
|
95
121
|
* Resolves next spawn interval using progressive shrink.
|
|
96
122
|
*
|
|
123
|
+
* This mirrors the gap-size logic: early pipes are spaced more generously, then
|
|
124
|
+
* spacing contracts toward the current difficulty target as the episode settles
|
|
125
|
+
* into its harder rhythm.
|
|
126
|
+
*
|
|
97
127
|
* @param previousSpawnIntervalFrames - Previous spawn interval.
|
|
98
128
|
* @param difficultyProfile - Active difficulty profile.
|
|
99
129
|
* @returns Next spawn interval in frames.
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { clampValue } from '
|
|
1
|
+
import { clampValue } from './simulation-shared.math.utils';
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
* Computes arithmetic mean for numeric samples.
|
|
@@ -13,10 +13,13 @@ export function computeMean(values: readonly number[]): number {
|
|
|
13
13
|
values.length
|
|
14
14
|
);
|
|
15
15
|
}
|
|
16
|
-
|
|
17
16
|
/**
|
|
18
17
|
* Computes population standard deviation.
|
|
19
18
|
*
|
|
19
|
+
* This uses population variance rather than sample variance because the trainer
|
|
20
|
+
* is summarizing the whole evolved population for that generation, not estimating
|
|
21
|
+
* a larger hidden distribution from a subsample.
|
|
22
|
+
*
|
|
20
23
|
* @param values - Numeric samples.
|
|
21
24
|
* @param meanValue - Precomputed mean.
|
|
22
25
|
* @returns Population standard deviation.
|
|
@@ -26,17 +29,22 @@ export function computePopulationStandardDeviation(
|
|
|
26
29
|
meanValue: number,
|
|
27
30
|
): number {
|
|
28
31
|
if (values.length === 0) return 0;
|
|
32
|
+
|
|
29
33
|
const variance =
|
|
30
34
|
values.reduce((accumulator, value) => {
|
|
31
|
-
const
|
|
32
|
-
return accumulator +
|
|
35
|
+
const deltaFromMean = value - meanValue;
|
|
36
|
+
return accumulator + deltaFromMean * deltaFromMean;
|
|
33
37
|
}, 0) / values.length;
|
|
38
|
+
|
|
34
39
|
return Math.sqrt(Math.max(0, variance));
|
|
35
40
|
}
|
|
36
41
|
|
|
37
42
|
/**
|
|
38
43
|
* Computes percentile value via linear interpolation between nearest ranks.
|
|
39
44
|
*
|
|
45
|
+
* Percentiles are useful in the trainer because they reveal whether strong
|
|
46
|
+
* performance is broad across the population or concentrated in a single outlier.
|
|
47
|
+
*
|
|
40
48
|
* @param values - Numeric samples.
|
|
41
49
|
* @param percentile - Percentile in [0, 1].
|
|
42
50
|
* @returns Percentile value, or `Number.NaN` when `values` is empty.
|
|
@@ -46,16 +54,29 @@ export function computePercentile(
|
|
|
46
54
|
percentile: number,
|
|
47
55
|
): number {
|
|
48
56
|
if (values.length === 0) return Number.NaN;
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
);
|
|
57
|
+
|
|
58
|
+
const sortedValues = values.toSorted(compareNumbersAscending);
|
|
52
59
|
const clampedPercentile = clampValue(percentile, 0, 1);
|
|
53
60
|
const rawIndex = clampedPercentile * (sortedValues.length - 1);
|
|
54
61
|
const lowerIndex = Math.floor(rawIndex);
|
|
55
62
|
const upperIndex = Math.ceil(rawIndex);
|
|
56
|
-
const
|
|
63
|
+
const interpolationWeight = rawIndex - lowerIndex;
|
|
57
64
|
|
|
58
65
|
const lowerValue = sortedValues[lowerIndex] ?? sortedValues[0] ?? Number.NaN;
|
|
59
66
|
const upperValue = sortedValues[upperIndex] ?? lowerValue;
|
|
60
|
-
return lowerValue + (upperValue - lowerValue) *
|
|
67
|
+
return lowerValue + (upperValue - lowerValue) * interpolationWeight;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Compares two numeric values in ascending order.
|
|
72
|
+
*
|
|
73
|
+
* @param leftValue - Left numeric value.
|
|
74
|
+
* @param rightValue - Right numeric value.
|
|
75
|
+
* @returns Comparator delta for `Array.prototype.toSorted`.
|
|
76
|
+
*/
|
|
77
|
+
function compareNumbersAscending(
|
|
78
|
+
leftValue: number,
|
|
79
|
+
rightValue: number,
|
|
80
|
+
): number {
|
|
81
|
+
return leftValue - rightValue;
|
|
61
82
|
}
|