@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,253 @@
|
|
|
1
|
+
# trainer/evaluation
|
|
2
|
+
|
|
3
|
+
## trainer/evaluation/trainer.evaluation.service.types.ts
|
|
4
|
+
|
|
5
|
+
### PopulationAggregateScoringContext
|
|
6
|
+
|
|
7
|
+
Aggregate scoring context shared while computing frame-primary scores.
|
|
8
|
+
|
|
9
|
+
The context precomputes population-wide reference values so per-genome scoring
|
|
10
|
+
can stay simple and deterministic.
|
|
11
|
+
|
|
12
|
+
### PopulationStageEvaluationRequest
|
|
13
|
+
|
|
14
|
+
Candidate-stage request used by the staged population evaluator.
|
|
15
|
+
|
|
16
|
+
Keeping this internal contract narrow lets the orchestration service choose
|
|
17
|
+
a candidate budget without coupling the execution helpers to generation-plan
|
|
18
|
+
details.
|
|
19
|
+
|
|
20
|
+
This shape is intentionally stage-agnostic: quick, full, and reevaluation can
|
|
21
|
+
all use the same execution helper by changing only candidate count, seed set,
|
|
22
|
+
and rollout budget.
|
|
23
|
+
|
|
24
|
+
## trainer/evaluation/trainer.evaluation.service.ts
|
|
25
|
+
|
|
26
|
+
### commitPopulationScores
|
|
27
|
+
|
|
28
|
+
`(population: readonly import("test/examples/flappy_bird/trainer/trainer.types").FlappyTrainerNetwork[], provisionalScoresByGenome: ReadonlyMap<import("test/examples/flappy_bird/trainer/trainer.types").FlappyTrainerNetwork, number>) => void`
|
|
29
|
+
|
|
30
|
+
Commits provisional scores to genome score fields.
|
|
31
|
+
|
|
32
|
+
Provisional scores are kept in a map during staging so each phase can refresh
|
|
33
|
+
them without mutating the genomes too early. This helper performs the final
|
|
34
|
+
write-back once staged evaluation is complete.
|
|
35
|
+
|
|
36
|
+
Parameters:
|
|
37
|
+
- `population` - - Current population.
|
|
38
|
+
- `provisionalScoresByGenome` - - Final provisional score map.
|
|
39
|
+
|
|
40
|
+
Returns: Nothing.
|
|
41
|
+
|
|
42
|
+
### evaluatePopulationFullStage
|
|
43
|
+
|
|
44
|
+
`(population: readonly import("test/examples/flappy_bird/trainer/trainer.types").FlappyTrainerNetwork[], generationEvaluationPlan: import("test/examples/flappy_bird/trainer/trainer.types").FlappyGenerationEvaluationPlan, aggregateByGenome: Map<import("test/examples/flappy_bird/trainer/trainer.types").FlappyTrainerNetwork, import("test/examples/flappy_bird/evaluation/evaluation.types").FlappySeedBatchEvaluation>, provisionalScoresByGenome: Map<import("test/examples/flappy_bird/trainer/trainer.types").FlappyTrainerNetwork, number>, elitismCount: number) => void`
|
|
45
|
+
|
|
46
|
+
Executes the full evaluation stage over the top provisional candidates.
|
|
47
|
+
|
|
48
|
+
This is the middle-cost stage in the ranking ladder: not every genome
|
|
49
|
+
survives into it, but the survivors receive a more trustworthy estimate than
|
|
50
|
+
the quick screen alone can provide.
|
|
51
|
+
|
|
52
|
+
Parameters:
|
|
53
|
+
- `population` - - Current population.
|
|
54
|
+
- `generationEvaluationPlan` - - Per-generation staged evaluation plan.
|
|
55
|
+
- `aggregateByGenome` - - Mutable aggregate cache keyed by genome.
|
|
56
|
+
- `provisionalScoresByGenome` - - Mutable provisional score map.
|
|
57
|
+
- `elitismCount` - - Configured elitism count.
|
|
58
|
+
|
|
59
|
+
Returns: Nothing.
|
|
60
|
+
|
|
61
|
+
### evaluatePopulationQuickStage
|
|
62
|
+
|
|
63
|
+
`(population: readonly import("test/examples/flappy_bird/trainer/trainer.types").FlappyTrainerNetwork[], generationEvaluationPlan: import("test/examples/flappy_bird/trainer/trainer.types").FlappyGenerationEvaluationPlan, aggregateByGenome: Map<import("test/examples/flappy_bird/trainer/trainer.types").FlappyTrainerNetwork, import("test/examples/flappy_bird/evaluation/evaluation.types").FlappySeedBatchEvaluation>, provisionalScoresByGenome: Map<import("test/examples/flappy_bird/trainer/trainer.types").FlappyTrainerNetwork, number>) => void`
|
|
64
|
+
|
|
65
|
+
Executes the quick evaluation stage over the full population.
|
|
66
|
+
|
|
67
|
+
Educational note:
|
|
68
|
+
The quick stage is a cheap screening pass. Every genome is tested on the same
|
|
69
|
+
small shared seed batch so the trainer can discard obviously weak candidates
|
|
70
|
+
before spending more rollout budget on them.
|
|
71
|
+
|
|
72
|
+
Parameters:
|
|
73
|
+
- `population` - - Current population.
|
|
74
|
+
- `generationEvaluationPlan` - - Per-generation staged evaluation plan.
|
|
75
|
+
- `aggregateByGenome` - - Mutable aggregate cache keyed by genome.
|
|
76
|
+
- `provisionalScoresByGenome` - - Mutable provisional score map.
|
|
77
|
+
|
|
78
|
+
Returns: Nothing.
|
|
79
|
+
|
|
80
|
+
### evaluatePopulationReevaluationStage
|
|
81
|
+
|
|
82
|
+
`(population: readonly import("test/examples/flappy_bird/trainer/trainer.types").FlappyTrainerNetwork[], generationEvaluationPlan: import("test/examples/flappy_bird/trainer/trainer.types").FlappyGenerationEvaluationPlan, aggregateByGenome: Map<import("test/examples/flappy_bird/trainer/trainer.types").FlappyTrainerNetwork, import("test/examples/flappy_bird/evaluation/evaluation.types").FlappySeedBatchEvaluation>, provisionalScoresByGenome: Map<import("test/examples/flappy_bird/trainer/trainer.types").FlappyTrainerNetwork, number>, elitismCount: number) => void`
|
|
83
|
+
|
|
84
|
+
Executes the large-seed reevaluation stage over top candidates.
|
|
85
|
+
|
|
86
|
+
Educational note:
|
|
87
|
+
Reevaluation is the trainer's anti-luck pass. The best provisional genomes
|
|
88
|
+
are tested again on a larger shared seed batch so leaderboard positions are
|
|
89
|
+
less sensitive to a fortunate early sample.
|
|
90
|
+
|
|
91
|
+
Parameters:
|
|
92
|
+
- `population` - - Current population.
|
|
93
|
+
- `generationEvaluationPlan` - - Per-generation staged evaluation plan.
|
|
94
|
+
- `aggregateByGenome` - - Mutable aggregate cache keyed by genome.
|
|
95
|
+
- `provisionalScoresByGenome` - - Mutable provisional score map.
|
|
96
|
+
- `elitismCount` - - Configured elitism count.
|
|
97
|
+
|
|
98
|
+
Returns: Nothing.
|
|
99
|
+
|
|
100
|
+
### resolveFullPassCandidateCount
|
|
101
|
+
|
|
102
|
+
`(populationSize: number, elitismCount: number) => number`
|
|
103
|
+
|
|
104
|
+
Resolves how many genomes should advance to the full-pass stage.
|
|
105
|
+
|
|
106
|
+
The trainer uses the larger of two budgets so the full stage stays large
|
|
107
|
+
enough to preserve competitive diversity while still shrinking meaningfully
|
|
108
|
+
relative to the full population.
|
|
109
|
+
|
|
110
|
+
Parameters:
|
|
111
|
+
- `populationSize` - - Population size.
|
|
112
|
+
- `elitismCount` - - Configured elitism count.
|
|
113
|
+
|
|
114
|
+
Returns: Full-pass candidate count.
|
|
115
|
+
|
|
116
|
+
## trainer/evaluation/trainer.evaluation.service.services.ts
|
|
117
|
+
|
|
118
|
+
### evaluatePopulationSelectedCandidateStage
|
|
119
|
+
|
|
120
|
+
`(population: readonly import("test/examples/flappy_bird/trainer/trainer.types").FlappyTrainerNetwork[], populationStageEvaluationRequest: import("test/examples/flappy_bird/trainer/evaluation/trainer.evaluation.service.types").PopulationStageEvaluationRequest, aggregateByGenome: Map<import("test/examples/flappy_bird/trainer/trainer.types").FlappyTrainerNetwork, import("test/examples/flappy_bird/evaluation/evaluation.types").FlappySeedBatchEvaluation>, provisionalScoresByGenome: Map<import("test/examples/flappy_bird/trainer/trainer.types").FlappyTrainerNetwork, number>) => void`
|
|
121
|
+
|
|
122
|
+
Evaluates a selected candidate subset for a population stage.
|
|
123
|
+
|
|
124
|
+
Educational note:
|
|
125
|
+
This helper is the workhorse behind the full and reevaluation stages. It
|
|
126
|
+
turns a stage request into three steps: pick candidates, evaluate them across
|
|
127
|
+
shared seeds, then refresh the provisional ranking for the whole population.
|
|
128
|
+
|
|
129
|
+
Parameters:
|
|
130
|
+
- `population` - - Current population.
|
|
131
|
+
- `populationStageEvaluationRequest` - - Candidate-stage evaluation request.
|
|
132
|
+
- `aggregateByGenome` - - Mutable aggregate cache keyed by genome.
|
|
133
|
+
- `provisionalScoresByGenome` - - Mutable provisional score map.
|
|
134
|
+
|
|
135
|
+
Returns: Nothing.
|
|
136
|
+
|
|
137
|
+
### evaluateSpecificGenomesAcrossSeeds
|
|
138
|
+
|
|
139
|
+
`(genomes: readonly import("test/examples/flappy_bird/trainer/trainer.types").FlappyTrainerNetwork[], sharedSeeds: readonly number[], rolloutOptions: import("test/examples/flappy_bird/evaluation/evaluation.types").FlappyRolloutOptions, aggregateByGenome: Map<import("test/examples/flappy_bird/trainer/trainer.types").FlappyTrainerNetwork, import("test/examples/flappy_bird/evaluation/evaluation.types").FlappySeedBatchEvaluation>) => void`
|
|
140
|
+
|
|
141
|
+
Evaluates a specific genome subset across shared seeds.
|
|
142
|
+
|
|
143
|
+
Shared seeds are the fairness mechanism in this trainer. Every selected genome
|
|
144
|
+
sees the same randomized episode batch for the stage, so comparisons are much
|
|
145
|
+
less noisy than per-genome private seed sampling.
|
|
146
|
+
|
|
147
|
+
For background reading, the Wikipedia article on "control variates" is a good
|
|
148
|
+
intuition pump for why holding part of the randomness fixed can reduce
|
|
149
|
+
variance when comparing alternatives.
|
|
150
|
+
|
|
151
|
+
Parameters:
|
|
152
|
+
- `genomes` - - Genomes selected for evaluation.
|
|
153
|
+
- `sharedSeeds` - - Shared deterministic seeds.
|
|
154
|
+
- `rolloutOptions` - - Rollout options for this stage.
|
|
155
|
+
- `aggregateByGenome` - - Mutable aggregate cache keyed by genome.
|
|
156
|
+
|
|
157
|
+
Returns: Nothing.
|
|
158
|
+
|
|
159
|
+
## trainer/evaluation/trainer.evaluation.service.constants.ts
|
|
160
|
+
|
|
161
|
+
### trainer.evaluation.service.constants
|
|
162
|
+
|
|
163
|
+
Fallback score assigned to genomes that have not yet been evaluated.
|
|
164
|
+
|
|
165
|
+
Using negative infinity guarantees unevaluated genomes lose any ranking tie
|
|
166
|
+
against genomes that already have real aggregate results.
|
|
167
|
+
|
|
168
|
+
### FLAPPY_TRAINER_MIN_PIPE_PROGRESS
|
|
169
|
+
|
|
170
|
+
### FLAPPY_TRAINER_NEGATIVE_INFINITY_SCORE
|
|
171
|
+
|
|
172
|
+
## trainer/evaluation/trainer.evaluation.service.utils.ts
|
|
173
|
+
|
|
174
|
+
### assignFramePrimaryScores
|
|
175
|
+
|
|
176
|
+
`(population: readonly import("test/examples/flappy_bird/trainer/trainer.types").FlappyTrainerNetwork[], aggregateByGenome: ReadonlyMap<import("test/examples/flappy_bird/trainer/trainer.types").FlappyTrainerNetwork, import("test/examples/flappy_bird/evaluation/evaluation.types").FlappySeedBatchEvaluation>, provisionalScoresByGenome: Map<import("test/examples/flappy_bird/trainer/trainer.types").FlappyTrainerNetwork, number>) => void`
|
|
177
|
+
|
|
178
|
+
Assigns refreshed frame-primary scores to the current population.
|
|
179
|
+
|
|
180
|
+
Educational note:
|
|
181
|
+
The trainer does not rank genomes purely by one raw metric. It combines pipe
|
|
182
|
+
progress, survival, and stability into a provisional score so early-stage
|
|
183
|
+
selection remains robust when several genomes are close in quality.
|
|
184
|
+
|
|
185
|
+
Parameters:
|
|
186
|
+
- `population` - - Current population.
|
|
187
|
+
- `aggregateByGenome` - - Aggregate cache keyed by genome.
|
|
188
|
+
- `provisionalScoresByGenome` - - Mutable provisional score map.
|
|
189
|
+
|
|
190
|
+
Returns: Nothing.
|
|
191
|
+
|
|
192
|
+
### collectAggregateValues
|
|
193
|
+
|
|
194
|
+
`(population: readonly import("test/examples/flappy_bird/trainer/trainer.types").FlappyTrainerNetwork[], aggregateByGenome: ReadonlyMap<import("test/examples/flappy_bird/trainer/trainer.types").FlappyTrainerNetwork, import("test/examples/flappy_bird/evaluation/evaluation.types").FlappySeedBatchEvaluation>) => import("test/examples/flappy_bird/evaluation/evaluation.types").FlappySeedBatchEvaluation[]`
|
|
195
|
+
|
|
196
|
+
Collects all currently available aggregate values.
|
|
197
|
+
|
|
198
|
+
Only genomes with completed aggregate results are included. That lets the
|
|
199
|
+
scoring helpers distinguish between genuinely weak genomes and genomes that
|
|
200
|
+
simply have not yet reached a later stage.
|
|
201
|
+
|
|
202
|
+
Parameters:
|
|
203
|
+
- `population` - - Current population.
|
|
204
|
+
- `aggregateByGenome` - - Aggregate cache keyed by genome.
|
|
205
|
+
|
|
206
|
+
Returns: Collected aggregate values.
|
|
207
|
+
|
|
208
|
+
### resolveMaximumMeanPipesPassed
|
|
209
|
+
|
|
210
|
+
`(aggregateValues: readonly import("test/examples/flappy_bird/evaluation/evaluation.types").FlappySeedBatchEvaluation[]) => number`
|
|
211
|
+
|
|
212
|
+
Resolves the leading mean pipe-progress value across available aggregates.
|
|
213
|
+
|
|
214
|
+
Mean pipe progress acts as the leading indicator for the frame-primary score:
|
|
215
|
+
if a genome is far behind the current pipe leader, it falls back to a simpler
|
|
216
|
+
progress-first score.
|
|
217
|
+
|
|
218
|
+
Parameters:
|
|
219
|
+
- `aggregateValues` - - Aggregate values currently available.
|
|
220
|
+
|
|
221
|
+
Returns: Highest mean pipe-progress value.
|
|
222
|
+
|
|
223
|
+
### resolvePopulationAggregateScoringContext
|
|
224
|
+
|
|
225
|
+
`(population: readonly import("test/examples/flappy_bird/trainer/trainer.types").FlappyTrainerNetwork[], aggregateByGenome: ReadonlyMap<import("test/examples/flappy_bird/trainer/trainer.types").FlappyTrainerNetwork, import("test/examples/flappy_bird/evaluation/evaluation.types").FlappySeedBatchEvaluation>) => import("test/examples/flappy_bird/trainer/evaluation/trainer.evaluation.service.types").PopulationAggregateScoringContext`
|
|
226
|
+
|
|
227
|
+
Resolves the aggregate scoring context used by frame-primary scoring.
|
|
228
|
+
|
|
229
|
+
This precomputation step keeps the per-genome scoring loop lean and avoids
|
|
230
|
+
recomputing population-wide maxima for every genome.
|
|
231
|
+
|
|
232
|
+
Parameters:
|
|
233
|
+
- `population` - - Current population.
|
|
234
|
+
- `aggregateByGenome` - - Aggregate cache keyed by genome.
|
|
235
|
+
|
|
236
|
+
Returns: Aggregate scoring context.
|
|
237
|
+
|
|
238
|
+
### scoreAggregateFramePrimary
|
|
239
|
+
|
|
240
|
+
`(aggregate: import("test/examples/flappy_bird/evaluation/evaluation.types").FlappySeedBatchEvaluation, maximumMeanPipesPassed: number) => number`
|
|
241
|
+
|
|
242
|
+
Scores one aggregate using the frame-primary heuristic.
|
|
243
|
+
|
|
244
|
+
Educational note:
|
|
245
|
+
The heuristic intentionally mixes progress and stability. A genome that passes
|
|
246
|
+
many pipes but has wildly inconsistent fitness across seeds is treated more
|
|
247
|
+
cautiously than a similarly strong but steadier genome.
|
|
248
|
+
|
|
249
|
+
Parameters:
|
|
250
|
+
- `aggregate` - - Aggregate evaluation result.
|
|
251
|
+
- `maximumMeanPipesPassed` - - Best mean pipe progress in the population.
|
|
252
|
+
|
|
253
|
+
Returns: Provisional score.
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fallback score assigned to genomes that have not yet been evaluated.
|
|
3
|
+
*
|
|
4
|
+
* Using negative infinity guarantees unevaluated genomes lose any ranking tie
|
|
5
|
+
* against genomes that already have real aggregate results.
|
|
6
|
+
*/
|
|
7
|
+
export const FLAPPY_TRAINER_NEGATIVE_INFINITY_SCORE = Number.NEGATIVE_INFINITY;
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Minimum pipe-progress baseline used when no aggregates are available.
|
|
11
|
+
*
|
|
12
|
+
* This keeps early-stage aggregate scoring well-defined even before any genome
|
|
13
|
+
* has established meaningful pipe progress.
|
|
14
|
+
*/
|
|
15
|
+
export const FLAPPY_TRAINER_MIN_PIPE_PROGRESS = 0;
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import {
|
|
2
|
+
evaluateFlappyFitnessAcrossSeeds,
|
|
3
|
+
type FlappyRolloutOptions,
|
|
4
|
+
type FlappySeedBatchEvaluation,
|
|
5
|
+
} from '../../flappyEvaluation';
|
|
6
|
+
import { selectTopGenomesByScore } from '../trainer.selection.utils';
|
|
7
|
+
import type { FlappyTrainerNetwork } from '../trainer.types';
|
|
8
|
+
import { assignFramePrimaryScores } from './trainer.evaluation.service.utils';
|
|
9
|
+
import type { PopulationStageEvaluationRequest } from './trainer.evaluation.service.types';
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Evaluates a selected candidate subset for a population stage.
|
|
13
|
+
*
|
|
14
|
+
* Educational note:
|
|
15
|
+
* This helper is the workhorse behind the full and reevaluation stages. It
|
|
16
|
+
* turns a stage request into three steps: pick candidates, evaluate them across
|
|
17
|
+
* shared seeds, then refresh the provisional ranking for the whole population.
|
|
18
|
+
*
|
|
19
|
+
* @param population - Current population.
|
|
20
|
+
* @param populationStageEvaluationRequest - Candidate-stage evaluation request.
|
|
21
|
+
* @param aggregateByGenome - Mutable aggregate cache keyed by genome.
|
|
22
|
+
* @param provisionalScoresByGenome - Mutable provisional score map.
|
|
23
|
+
* @returns Nothing.
|
|
24
|
+
*/
|
|
25
|
+
export function evaluatePopulationSelectedCandidateStage(
|
|
26
|
+
population: readonly FlappyTrainerNetwork[],
|
|
27
|
+
populationStageEvaluationRequest: PopulationStageEvaluationRequest,
|
|
28
|
+
aggregateByGenome: Map<FlappyTrainerNetwork, FlappySeedBatchEvaluation>,
|
|
29
|
+
provisionalScoresByGenome: Map<FlappyTrainerNetwork, number>,
|
|
30
|
+
): void {
|
|
31
|
+
// Step 1: Select the top-scoring candidates for the requested stage.
|
|
32
|
+
const selectedCandidates = selectTopGenomesByScore(
|
|
33
|
+
population,
|
|
34
|
+
provisionalScoresByGenome,
|
|
35
|
+
populationStageEvaluationRequest.candidateCount,
|
|
36
|
+
);
|
|
37
|
+
|
|
38
|
+
// Step 2: Evaluate the selected candidates across the stage's shared seeds.
|
|
39
|
+
evaluateSpecificGenomesAcrossSeeds(
|
|
40
|
+
selectedCandidates,
|
|
41
|
+
populationStageEvaluationRequest.sharedSeeds,
|
|
42
|
+
populationStageEvaluationRequest.rolloutOptions,
|
|
43
|
+
aggregateByGenome,
|
|
44
|
+
);
|
|
45
|
+
|
|
46
|
+
// Step 3: Refresh frame-primary scores for the full population.
|
|
47
|
+
assignFramePrimaryScores(
|
|
48
|
+
population,
|
|
49
|
+
aggregateByGenome,
|
|
50
|
+
provisionalScoresByGenome,
|
|
51
|
+
);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Evaluates a specific genome subset across shared seeds.
|
|
56
|
+
*
|
|
57
|
+
* Shared seeds are the fairness mechanism in this trainer. Every selected genome
|
|
58
|
+
* sees the same randomized episode batch for the stage, so comparisons are much
|
|
59
|
+
* less noisy than per-genome private seed sampling.
|
|
60
|
+
*
|
|
61
|
+
* For background reading, the Wikipedia article on "control variates" is a good
|
|
62
|
+
* intuition pump for why holding part of the randomness fixed can reduce
|
|
63
|
+
* variance when comparing alternatives.
|
|
64
|
+
*
|
|
65
|
+
* @param genomes - Genomes selected for evaluation.
|
|
66
|
+
* @param sharedSeeds - Shared deterministic seeds.
|
|
67
|
+
* @param rolloutOptions - Rollout options for this stage.
|
|
68
|
+
* @param aggregateByGenome - Mutable aggregate cache keyed by genome.
|
|
69
|
+
* @returns Nothing.
|
|
70
|
+
*/
|
|
71
|
+
export function evaluateSpecificGenomesAcrossSeeds(
|
|
72
|
+
genomes: readonly FlappyTrainerNetwork[],
|
|
73
|
+
sharedSeeds: readonly number[],
|
|
74
|
+
rolloutOptions: FlappyRolloutOptions,
|
|
75
|
+
aggregateByGenome: Map<FlappyTrainerNetwork, FlappySeedBatchEvaluation>,
|
|
76
|
+
): void {
|
|
77
|
+
// Step 1: Evaluate each selected genome independently across the shared batch.
|
|
78
|
+
for (const genome of genomes) {
|
|
79
|
+
const aggregate = evaluateFlappyFitnessAcrossSeeds(
|
|
80
|
+
genome,
|
|
81
|
+
sharedSeeds,
|
|
82
|
+
rolloutOptions,
|
|
83
|
+
);
|
|
84
|
+
aggregateByGenome.set(genome, aggregate);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
import type { FlappySeedBatchEvaluation } from '../../flappyEvaluation';
|
|
2
|
+
import {
|
|
3
|
+
FLAPPY_TRAINER_FULL_PASS_ELITISM_MULTIPLIER,
|
|
4
|
+
FLAPPY_TRAINER_FULL_PASS_POPULATION_FRACTION,
|
|
5
|
+
FLAPPY_TRAINER_REEVALUATION_MIN_CANDIDATE_COUNT,
|
|
6
|
+
} from '../trainer.constants';
|
|
7
|
+
import type {
|
|
8
|
+
FlappyGenerationEvaluationPlan,
|
|
9
|
+
FlappyTrainerNetwork,
|
|
10
|
+
} from '../trainer.types';
|
|
11
|
+
import { FLAPPY_TRAINER_NEGATIVE_INFINITY_SCORE } from './trainer.evaluation.service.constants';
|
|
12
|
+
import {
|
|
13
|
+
evaluatePopulationSelectedCandidateStage,
|
|
14
|
+
evaluateSpecificGenomesAcrossSeeds,
|
|
15
|
+
} from './trainer.evaluation.service.services';
|
|
16
|
+
import { assignFramePrimaryScores } from './trainer.evaluation.service.utils';
|
|
17
|
+
import type { PopulationStageEvaluationRequest } from './trainer.evaluation.service.types';
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Executes the quick evaluation stage over the full population.
|
|
21
|
+
*
|
|
22
|
+
* Educational note:
|
|
23
|
+
* The quick stage is a cheap screening pass. Every genome is tested on the same
|
|
24
|
+
* small shared seed batch so the trainer can discard obviously weak candidates
|
|
25
|
+
* before spending more rollout budget on them.
|
|
26
|
+
*
|
|
27
|
+
* @param population - Current population.
|
|
28
|
+
* @param generationEvaluationPlan - Per-generation staged evaluation plan.
|
|
29
|
+
* @param aggregateByGenome - Mutable aggregate cache keyed by genome.
|
|
30
|
+
* @param provisionalScoresByGenome - Mutable provisional score map.
|
|
31
|
+
* @returns Nothing.
|
|
32
|
+
*
|
|
33
|
+
* @example
|
|
34
|
+
* ```ts
|
|
35
|
+
* evaluatePopulationQuickStage(
|
|
36
|
+
* population,
|
|
37
|
+
* generationEvaluationPlan,
|
|
38
|
+
* aggregateByGenome,
|
|
39
|
+
* provisionalScoresByGenome,
|
|
40
|
+
* );
|
|
41
|
+
* ```
|
|
42
|
+
*/
|
|
43
|
+
export function evaluatePopulationQuickStage(
|
|
44
|
+
population: readonly FlappyTrainerNetwork[],
|
|
45
|
+
generationEvaluationPlan: FlappyGenerationEvaluationPlan,
|
|
46
|
+
aggregateByGenome: Map<FlappyTrainerNetwork, FlappySeedBatchEvaluation>,
|
|
47
|
+
provisionalScoresByGenome: Map<FlappyTrainerNetwork, number>,
|
|
48
|
+
): void {
|
|
49
|
+
evaluateSpecificGenomesAcrossSeeds(
|
|
50
|
+
population,
|
|
51
|
+
generationEvaluationPlan.quickSeeds,
|
|
52
|
+
generationEvaluationPlan.quickRolloutOptions,
|
|
53
|
+
aggregateByGenome,
|
|
54
|
+
);
|
|
55
|
+
|
|
56
|
+
assignFramePrimaryScores(
|
|
57
|
+
population,
|
|
58
|
+
aggregateByGenome,
|
|
59
|
+
provisionalScoresByGenome,
|
|
60
|
+
);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Executes the full evaluation stage over the top provisional candidates.
|
|
65
|
+
*
|
|
66
|
+
* This is the middle-cost stage in the ranking ladder: not every genome
|
|
67
|
+
* survives into it, but the survivors receive a more trustworthy estimate than
|
|
68
|
+
* the quick screen alone can provide.
|
|
69
|
+
*
|
|
70
|
+
* @param population - Current population.
|
|
71
|
+
* @param generationEvaluationPlan - Per-generation staged evaluation plan.
|
|
72
|
+
* @param aggregateByGenome - Mutable aggregate cache keyed by genome.
|
|
73
|
+
* @param provisionalScoresByGenome - Mutable provisional score map.
|
|
74
|
+
* @param elitismCount - Configured elitism count.
|
|
75
|
+
* @returns Nothing.
|
|
76
|
+
*/
|
|
77
|
+
export function evaluatePopulationFullStage(
|
|
78
|
+
population: readonly FlappyTrainerNetwork[],
|
|
79
|
+
generationEvaluationPlan: FlappyGenerationEvaluationPlan,
|
|
80
|
+
aggregateByGenome: Map<FlappyTrainerNetwork, FlappySeedBatchEvaluation>,
|
|
81
|
+
provisionalScoresByGenome: Map<FlappyTrainerNetwork, number>,
|
|
82
|
+
elitismCount: number,
|
|
83
|
+
): void {
|
|
84
|
+
// Step 1: Resolve the candidate-stage request for the full evaluation pass.
|
|
85
|
+
const populationStageEvaluationRequest = {
|
|
86
|
+
candidateCount: resolveFullPassCandidateCount(
|
|
87
|
+
population.length,
|
|
88
|
+
elitismCount,
|
|
89
|
+
),
|
|
90
|
+
sharedSeeds: generationEvaluationPlan.fullSeeds,
|
|
91
|
+
rolloutOptions: generationEvaluationPlan.fullRolloutOptions,
|
|
92
|
+
} satisfies PopulationStageEvaluationRequest;
|
|
93
|
+
|
|
94
|
+
// Step 2: Evaluate the selected candidates and refresh provisional scores.
|
|
95
|
+
evaluatePopulationSelectedCandidateStage(
|
|
96
|
+
population,
|
|
97
|
+
populationStageEvaluationRequest,
|
|
98
|
+
aggregateByGenome,
|
|
99
|
+
provisionalScoresByGenome,
|
|
100
|
+
);
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* Executes the large-seed reevaluation stage over top candidates.
|
|
105
|
+
*
|
|
106
|
+
* Educational note:
|
|
107
|
+
* Reevaluation is the trainer's anti-luck pass. The best provisional genomes
|
|
108
|
+
* are tested again on a larger shared seed batch so leaderboard positions are
|
|
109
|
+
* less sensitive to a fortunate early sample.
|
|
110
|
+
*
|
|
111
|
+
* @param population - Current population.
|
|
112
|
+
* @param generationEvaluationPlan - Per-generation staged evaluation plan.
|
|
113
|
+
* @param aggregateByGenome - Mutable aggregate cache keyed by genome.
|
|
114
|
+
* @param provisionalScoresByGenome - Mutable provisional score map.
|
|
115
|
+
* @param elitismCount - Configured elitism count.
|
|
116
|
+
* @returns Nothing.
|
|
117
|
+
*/
|
|
118
|
+
export function evaluatePopulationReevaluationStage(
|
|
119
|
+
population: readonly FlappyTrainerNetwork[],
|
|
120
|
+
generationEvaluationPlan: FlappyGenerationEvaluationPlan,
|
|
121
|
+
aggregateByGenome: Map<FlappyTrainerNetwork, FlappySeedBatchEvaluation>,
|
|
122
|
+
provisionalScoresByGenome: Map<FlappyTrainerNetwork, number>,
|
|
123
|
+
elitismCount: number,
|
|
124
|
+
): void {
|
|
125
|
+
// Step 1: Resolve the candidate-stage request for reevaluation.
|
|
126
|
+
const populationStageEvaluationRequest = {
|
|
127
|
+
candidateCount: Math.max(
|
|
128
|
+
elitismCount,
|
|
129
|
+
FLAPPY_TRAINER_REEVALUATION_MIN_CANDIDATE_COUNT,
|
|
130
|
+
),
|
|
131
|
+
sharedSeeds: generationEvaluationPlan.reevaluationSeeds,
|
|
132
|
+
rolloutOptions: generationEvaluationPlan.reevaluationRolloutOptions,
|
|
133
|
+
} satisfies PopulationStageEvaluationRequest;
|
|
134
|
+
|
|
135
|
+
// Step 2: Evaluate the selected candidates and refresh provisional scores.
|
|
136
|
+
evaluatePopulationSelectedCandidateStage(
|
|
137
|
+
population,
|
|
138
|
+
populationStageEvaluationRequest,
|
|
139
|
+
aggregateByGenome,
|
|
140
|
+
provisionalScoresByGenome,
|
|
141
|
+
);
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
/**
|
|
145
|
+
* Commits provisional scores to genome score fields.
|
|
146
|
+
*
|
|
147
|
+
* Provisional scores are kept in a map during staging so each phase can refresh
|
|
148
|
+
* them without mutating the genomes too early. This helper performs the final
|
|
149
|
+
* write-back once staged evaluation is complete.
|
|
150
|
+
*
|
|
151
|
+
* @param population - Current population.
|
|
152
|
+
* @param provisionalScoresByGenome - Final provisional score map.
|
|
153
|
+
* @returns Nothing.
|
|
154
|
+
*/
|
|
155
|
+
export function commitPopulationScores(
|
|
156
|
+
population: readonly FlappyTrainerNetwork[],
|
|
157
|
+
provisionalScoresByGenome: ReadonlyMap<FlappyTrainerNetwork, number>,
|
|
158
|
+
): void {
|
|
159
|
+
// Step 1: Copy provisional scores into the mutable genome score fields.
|
|
160
|
+
for (const genome of population) {
|
|
161
|
+
genome.score =
|
|
162
|
+
provisionalScoresByGenome.get(genome) ??
|
|
163
|
+
FLAPPY_TRAINER_NEGATIVE_INFINITY_SCORE;
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
/**
|
|
168
|
+
* Resolves how many genomes should advance to the full-pass stage.
|
|
169
|
+
*
|
|
170
|
+
* The trainer uses the larger of two budgets so the full stage stays large
|
|
171
|
+
* enough to preserve competitive diversity while still shrinking meaningfully
|
|
172
|
+
* relative to the full population.
|
|
173
|
+
*
|
|
174
|
+
* @param populationSize - Population size.
|
|
175
|
+
* @param elitismCount - Configured elitism count.
|
|
176
|
+
* @returns Full-pass candidate count.
|
|
177
|
+
*/
|
|
178
|
+
function resolveFullPassCandidateCount(
|
|
179
|
+
populationSize: number,
|
|
180
|
+
elitismCount: number,
|
|
181
|
+
): number {
|
|
182
|
+
// Step 1: Use the larger of the elitism-based and population-fraction candidate budgets.
|
|
183
|
+
return Math.max(
|
|
184
|
+
elitismCount * FLAPPY_TRAINER_FULL_PASS_ELITISM_MULTIPLIER,
|
|
185
|
+
Math.floor(populationSize * FLAPPY_TRAINER_FULL_PASS_POPULATION_FRACTION),
|
|
186
|
+
);
|
|
187
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type {
|
|
2
|
+
FlappyRolloutOptions,
|
|
3
|
+
FlappySeedBatchEvaluation,
|
|
4
|
+
} from '../../flappyEvaluation';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Candidate-stage request used by the staged population evaluator.
|
|
8
|
+
*
|
|
9
|
+
* Keeping this internal contract narrow lets the orchestration service choose
|
|
10
|
+
* a candidate budget without coupling the execution helpers to generation-plan
|
|
11
|
+
* details.
|
|
12
|
+
*
|
|
13
|
+
* This shape is intentionally stage-agnostic: quick, full, and reevaluation can
|
|
14
|
+
* all use the same execution helper by changing only candidate count, seed set,
|
|
15
|
+
* and rollout budget.
|
|
16
|
+
*/
|
|
17
|
+
export type PopulationStageEvaluationRequest = {
|
|
18
|
+
candidateCount: number;
|
|
19
|
+
sharedSeeds: readonly number[];
|
|
20
|
+
rolloutOptions: FlappyRolloutOptions;
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Aggregate scoring context shared while computing frame-primary scores.
|
|
25
|
+
*
|
|
26
|
+
* The context precomputes population-wide reference values so per-genome scoring
|
|
27
|
+
* can stay simple and deterministic.
|
|
28
|
+
*/
|
|
29
|
+
export type PopulationAggregateScoringContext = {
|
|
30
|
+
aggregateValues: FlappySeedBatchEvaluation[];
|
|
31
|
+
maximumMeanPipesPassed: number;
|
|
32
|
+
};
|