@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
|
@@ -21,6 +21,11 @@ import type {
|
|
|
21
21
|
/**
|
|
22
22
|
* Creates immutable setup values for the trainer.
|
|
23
23
|
*
|
|
24
|
+
* Educational note:
|
|
25
|
+
* The setup object freezes the core training shape up front: input width,
|
|
26
|
+
* output width, population size, and elitism count. Centralizing those values
|
|
27
|
+
* makes the rest of the trainer read as policy rather than configuration noise.
|
|
28
|
+
*
|
|
24
29
|
* @returns Default trainer setup values used for NEAT configuration.
|
|
25
30
|
*/
|
|
26
31
|
export function createTrainerSetup(): FlappyTrainerSetup {
|
|
@@ -35,6 +40,9 @@ export function createTrainerSetup(): FlappyTrainerSetup {
|
|
|
35
40
|
/**
|
|
36
41
|
* Creates mutable runtime state container.
|
|
37
42
|
*
|
|
43
|
+
* The runtime state is intentionally tiny. It only tracks stop intent and the
|
|
44
|
+
* latest report so the outer loop can remain easy to reason about.
|
|
45
|
+
*
|
|
38
46
|
* @returns Fresh runtime state used by loop orchestration.
|
|
39
47
|
*/
|
|
40
48
|
export function createTrainerRuntimeState(): FlappyTrainerRuntimeState {
|
|
@@ -47,6 +55,17 @@ export function createTrainerRuntimeState(): FlappyTrainerRuntimeState {
|
|
|
47
55
|
/**
|
|
48
56
|
* Builds the NEAT controller with baseline options.
|
|
49
57
|
*
|
|
58
|
+
* Educational note:
|
|
59
|
+
* The trainer enables population-level fitness mode because the quality of a
|
|
60
|
+
* Flappy policy depends on fair comparison across shared seed batches, not on a
|
|
61
|
+
* one-network-at-a-time scoring callback.
|
|
62
|
+
*
|
|
63
|
+
* @example
|
|
64
|
+
* ```ts
|
|
65
|
+
* const trainerSetup = createTrainerSetup();
|
|
66
|
+
* const neatController = createNeatController(trainerSetup);
|
|
67
|
+
* ```
|
|
68
|
+
*
|
|
50
69
|
* @param trainerSetup - Immutable trainer setup values.
|
|
51
70
|
* @returns Typed NEAT controller used by the trainer loop.
|
|
52
71
|
*/
|
|
@@ -81,6 +100,9 @@ export function createNeatController(
|
|
|
81
100
|
/**
|
|
82
101
|
* Trivial baseline fitness used before attaching population evaluator.
|
|
83
102
|
*
|
|
103
|
+
* This placeholder keeps controller construction simple. The real staged
|
|
104
|
+
* evaluator is attached immediately afterward by the fitness service.
|
|
105
|
+
*
|
|
84
106
|
* @returns Constant zero fitness.
|
|
85
107
|
*/
|
|
86
108
|
function resolveNoopFitness(): number {
|
|
@@ -3,7 +3,13 @@ import type { FlappyTrainerRuntimeState } from './trainer.types';
|
|
|
3
3
|
/**
|
|
4
4
|
* Registers graceful stop signal handlers.
|
|
5
5
|
*
|
|
6
|
+
* Educational note:
|
|
7
|
+
* Long-running evolutionary runs should stop cleanly when the user presses
|
|
8
|
+
* `Ctrl+C`. This service flips runtime intent instead of abruptly tearing down
|
|
9
|
+
* the process mid-generation.
|
|
10
|
+
*
|
|
6
11
|
* @param trainerRuntimeState - Mutable trainer runtime state.
|
|
12
|
+
* @returns Nothing.
|
|
7
13
|
*/
|
|
8
14
|
export function registerTrainerStopSignals(
|
|
9
15
|
trainerRuntimeState: FlappyTrainerRuntimeState,
|
|
@@ -20,6 +26,8 @@ export function registerTrainerStopSignals(
|
|
|
20
26
|
/**
|
|
21
27
|
* Handles one stop signal update.
|
|
22
28
|
*
|
|
29
|
+
* @returns Nothing.
|
|
30
|
+
*
|
|
23
31
|
* @param trainerRuntimeState - Mutable trainer runtime state.
|
|
24
32
|
*/
|
|
25
33
|
function handleTrainerStopSignal(
|
|
@@ -1,37 +1,20 @@
|
|
|
1
1
|
import { pathToFileURL } from 'node:url';
|
|
2
|
-
import {
|
|
3
|
-
evaluateFlappyFitnessAcrossSeeds,
|
|
4
|
-
rolloutEpisode,
|
|
5
|
-
type FlappyRolloutOptions,
|
|
6
|
-
type FlappySeedBatchEvaluation,
|
|
7
|
-
} from '../flappyEvaluation';
|
|
2
|
+
import { rolloutEpisode } from '../flappyEvaluation';
|
|
8
3
|
import type {
|
|
9
|
-
FlappyGenerationEvaluationPlan,
|
|
10
|
-
FlappyGenerationReport,
|
|
11
4
|
FlappyTrainerNetwork,
|
|
12
5
|
FlappyTrainerRuntimeState,
|
|
13
6
|
FlappyTrainerSetup,
|
|
14
|
-
ScoredGenomeEntry,
|
|
15
7
|
} from './trainer.types';
|
|
16
8
|
import {
|
|
17
9
|
FLAPPY_TRAINER_DEFAULT_RNG_SEED,
|
|
18
|
-
FLAPPY_TRAINER_DUMMY_FLAP_OUTPUT,
|
|
19
|
-
FLAPPY_TRAINER_DUMMY_NETWORK_ID,
|
|
20
|
-
FLAPPY_TRAINER_DUMMY_NO_FLAP_OUTPUT,
|
|
21
|
-
FLAPPY_TRAINER_FRAME_PRIMARY_BASE_SCORE,
|
|
22
|
-
FLAPPY_TRAINER_FRAME_PRIMARY_PIPE_WEIGHT,
|
|
23
|
-
FLAPPY_TRAINER_FRAME_PRIMARY_SURVIVAL_WEIGHT,
|
|
24
|
-
FLAPPY_TRAINER_FRAME_STABILITY_STDDEV_WEIGHT,
|
|
25
|
-
FLAPPY_TRAINER_FULL_PASS_ELITISM_MULTIPLIER,
|
|
26
|
-
FLAPPY_TRAINER_FULL_PASS_POPULATION_FRACTION,
|
|
27
|
-
FLAPPY_TRAINER_LOG_PARTS_DELIMITER,
|
|
28
|
-
FLAPPY_TRAINER_PIPE_FALLBACK_PIPE_WEIGHT,
|
|
29
|
-
FLAPPY_TRAINER_PIPE_FILTER_TOLERANCE,
|
|
30
|
-
FLAPPY_TRAINER_REEVALUATION_MIN_CANDIDATE_COUNT,
|
|
31
|
-
FLAPPY_TRAINER_SCORE_MEDIAN_PERCENTILE,
|
|
32
|
-
FLAPPY_TRAINER_SCORE_P90_PERCENTILE,
|
|
33
10
|
FLAPPY_TRAINER_STOPPED_MESSAGE,
|
|
34
11
|
} from './trainer.constants';
|
|
12
|
+
import {
|
|
13
|
+
commitPopulationScores,
|
|
14
|
+
evaluatePopulationFullStage,
|
|
15
|
+
evaluatePopulationQuickStage,
|
|
16
|
+
evaluatePopulationReevaluationStage,
|
|
17
|
+
} from './trainer.evaluation.service';
|
|
35
18
|
import { formatTrainerErrorMessage } from './trainer.errors';
|
|
36
19
|
import { resolveGenerationEvaluationPlan } from './trainer.evaluation-plan.utils';
|
|
37
20
|
import {
|
|
@@ -40,14 +23,12 @@ import {
|
|
|
40
23
|
createTrainerSetup,
|
|
41
24
|
} from './trainer.setup.service';
|
|
42
25
|
import { attachPopulationFitnessEvaluator } from './trainer.fitness.service';
|
|
43
|
-
import { buildGenerationLogParts } from './trainer.reporting.utils';
|
|
44
26
|
import { runTrainerEvolutionLoop } from './trainer.loop.service';
|
|
45
|
-
import { registerTrainerStopSignals } from './trainer.signals.service';
|
|
46
27
|
import {
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
} from './trainer.
|
|
28
|
+
buildGenerationReport,
|
|
29
|
+
logGenerationSummary,
|
|
30
|
+
} from './trainer.report.service';
|
|
31
|
+
import { registerTrainerStopSignals } from './trainer.signals.service';
|
|
51
32
|
|
|
52
33
|
/**
|
|
53
34
|
* Flappy Bird neuroevolution demo.
|
|
@@ -56,8 +37,24 @@ import {
|
|
|
56
37
|
* The network sees a temporal observation (38 floats) and outputs two competing
|
|
57
38
|
* action scores (`no flap` vs `flap`).
|
|
58
39
|
*
|
|
40
|
+
* Educational note:
|
|
41
|
+
* The trainer is intentionally orchestration-first. It wires together setup,
|
|
42
|
+
* staged population evaluation, the outer evolution loop, graceful shutdown,
|
|
43
|
+
* and compact generation logging without burying those responsibilities inside a
|
|
44
|
+
* single monolithic file.
|
|
45
|
+
*
|
|
46
|
+
* The mutation schedule gradually cools over early generations. If you want a
|
|
47
|
+
* conceptual parallel, the Wikipedia article on "simulated annealing" is a
|
|
48
|
+
* useful mental model for why early exploration is broader and later updates are
|
|
49
|
+
* more conservative.
|
|
50
|
+
*
|
|
59
51
|
* Run (from repo root):
|
|
60
52
|
* `npx ts-node test/examples/flappy_bird/trainFlappyBird.ts`
|
|
53
|
+
*
|
|
54
|
+
* @example
|
|
55
|
+
* ```ts
|
|
56
|
+
* await runTrainer();
|
|
57
|
+
* ```
|
|
61
58
|
*/
|
|
62
59
|
export async function runTrainer(): Promise<void> {
|
|
63
60
|
const trainerSetup = createTrainerSetup();
|
|
@@ -90,531 +87,14 @@ export async function runTrainer(): Promise<void> {
|
|
|
90
87
|
console.log(FLAPPY_TRAINER_STOPPED_MESSAGE);
|
|
91
88
|
}
|
|
92
89
|
|
|
93
|
-
/**
|
|
94
|
-
* Executes quick evaluation stage over the full population.
|
|
95
|
-
*/
|
|
96
|
-
function evaluatePopulationQuickStage(
|
|
97
|
-
population: readonly FlappyTrainerNetwork[],
|
|
98
|
-
generationEvaluationPlan: FlappyGenerationEvaluationPlan,
|
|
99
|
-
aggregateByGenome: Map<FlappyTrainerNetwork, FlappySeedBatchEvaluation>,
|
|
100
|
-
provisionalScoresByGenome: Map<FlappyTrainerNetwork, number>,
|
|
101
|
-
): void {
|
|
102
|
-
evaluateSpecificGenomesAcrossSeeds(
|
|
103
|
-
population,
|
|
104
|
-
generationEvaluationPlan.quickSeeds,
|
|
105
|
-
generationEvaluationPlan.quickRolloutOptions,
|
|
106
|
-
aggregateByGenome,
|
|
107
|
-
);
|
|
108
|
-
|
|
109
|
-
assignFramePrimaryScores(
|
|
110
|
-
population,
|
|
111
|
-
aggregateByGenome,
|
|
112
|
-
provisionalScoresByGenome,
|
|
113
|
-
);
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
/**
|
|
117
|
-
* Executes full evaluation stage over top provisional candidates.
|
|
118
|
-
*/
|
|
119
|
-
function evaluatePopulationFullStage(
|
|
120
|
-
population: readonly FlappyTrainerNetwork[],
|
|
121
|
-
generationEvaluationPlan: FlappyGenerationEvaluationPlan,
|
|
122
|
-
aggregateByGenome: Map<FlappyTrainerNetwork, FlappySeedBatchEvaluation>,
|
|
123
|
-
provisionalScoresByGenome: Map<FlappyTrainerNetwork, number>,
|
|
124
|
-
elitismCount: number,
|
|
125
|
-
): void {
|
|
126
|
-
const fullPassCandidateCount = resolveFullPassCandidateCount(
|
|
127
|
-
population.length,
|
|
128
|
-
elitismCount,
|
|
129
|
-
);
|
|
130
|
-
const fullPassCandidates = selectTopGenomesByScore(
|
|
131
|
-
population,
|
|
132
|
-
provisionalScoresByGenome,
|
|
133
|
-
fullPassCandidateCount,
|
|
134
|
-
);
|
|
135
|
-
|
|
136
|
-
evaluateSpecificGenomesAcrossSeeds(
|
|
137
|
-
fullPassCandidates,
|
|
138
|
-
generationEvaluationPlan.fullSeeds,
|
|
139
|
-
generationEvaluationPlan.fullRolloutOptions,
|
|
140
|
-
aggregateByGenome,
|
|
141
|
-
);
|
|
142
|
-
|
|
143
|
-
assignFramePrimaryScores(
|
|
144
|
-
population,
|
|
145
|
-
aggregateByGenome,
|
|
146
|
-
provisionalScoresByGenome,
|
|
147
|
-
);
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
/**
|
|
151
|
-
* Executes large-seed reevaluation stage over top candidates.
|
|
152
|
-
*/
|
|
153
|
-
function evaluatePopulationReevaluationStage(
|
|
154
|
-
population: readonly FlappyTrainerNetwork[],
|
|
155
|
-
generationEvaluationPlan: FlappyGenerationEvaluationPlan,
|
|
156
|
-
aggregateByGenome: Map<FlappyTrainerNetwork, FlappySeedBatchEvaluation>,
|
|
157
|
-
provisionalScoresByGenome: Map<FlappyTrainerNetwork, number>,
|
|
158
|
-
elitismCount: number,
|
|
159
|
-
): void {
|
|
160
|
-
const reevaluationCount = Math.max(
|
|
161
|
-
elitismCount,
|
|
162
|
-
FLAPPY_TRAINER_REEVALUATION_MIN_CANDIDATE_COUNT,
|
|
163
|
-
);
|
|
164
|
-
const reevaluationCandidates = selectTopGenomesByScore(
|
|
165
|
-
population,
|
|
166
|
-
provisionalScoresByGenome,
|
|
167
|
-
reevaluationCount,
|
|
168
|
-
);
|
|
169
|
-
|
|
170
|
-
evaluateSpecificGenomesAcrossSeeds(
|
|
171
|
-
reevaluationCandidates,
|
|
172
|
-
generationEvaluationPlan.reevaluationSeeds,
|
|
173
|
-
generationEvaluationPlan.reevaluationRolloutOptions,
|
|
174
|
-
aggregateByGenome,
|
|
175
|
-
);
|
|
176
|
-
|
|
177
|
-
assignFramePrimaryScores(
|
|
178
|
-
population,
|
|
179
|
-
aggregateByGenome,
|
|
180
|
-
provisionalScoresByGenome,
|
|
181
|
-
);
|
|
182
|
-
}
|
|
183
|
-
|
|
184
|
-
/**
|
|
185
|
-
* Evaluates a specific genome set across a shared seed batch.
|
|
186
|
-
*/
|
|
187
|
-
function evaluateSpecificGenomesAcrossSeeds(
|
|
188
|
-
genomes: readonly FlappyTrainerNetwork[],
|
|
189
|
-
sharedSeeds: readonly number[],
|
|
190
|
-
rolloutOptions: FlappyRolloutOptions,
|
|
191
|
-
aggregateByGenome: Map<FlappyTrainerNetwork, FlappySeedBatchEvaluation>,
|
|
192
|
-
): void {
|
|
193
|
-
for (const genome of genomes) {
|
|
194
|
-
const aggregate = evaluateFlappyFitnessAcrossSeeds(
|
|
195
|
-
genome,
|
|
196
|
-
sharedSeeds,
|
|
197
|
-
rolloutOptions,
|
|
198
|
-
);
|
|
199
|
-
aggregateByGenome.set(genome, aggregate);
|
|
200
|
-
}
|
|
201
|
-
}
|
|
202
|
-
|
|
203
|
-
/**
|
|
204
|
-
* Commits provisional scores to genome `.score` fields.
|
|
205
|
-
*/
|
|
206
|
-
function commitPopulationScores(
|
|
207
|
-
population: readonly FlappyTrainerNetwork[],
|
|
208
|
-
provisionalScoresByGenome: ReadonlyMap<FlappyTrainerNetwork, number>,
|
|
209
|
-
): void {
|
|
210
|
-
for (const genome of population) {
|
|
211
|
-
genome.score =
|
|
212
|
-
provisionalScoresByGenome.get(genome) ?? Number.NEGATIVE_INFINITY;
|
|
213
|
-
}
|
|
214
|
-
}
|
|
215
|
-
|
|
216
|
-
/**
|
|
217
|
-
* Builds compact report for current generation.
|
|
218
|
-
*/
|
|
219
|
-
function buildGenerationReport(
|
|
220
|
-
population: readonly FlappyTrainerNetwork[],
|
|
221
|
-
aggregateByGenome: ReadonlyMap<
|
|
222
|
-
FlappyTrainerNetwork,
|
|
223
|
-
FlappySeedBatchEvaluation
|
|
224
|
-
>,
|
|
225
|
-
generationEvaluationPlan: FlappyGenerationEvaluationPlan,
|
|
226
|
-
): FlappyGenerationReport {
|
|
227
|
-
const finalScores = collectFiniteGenomeScores(population);
|
|
228
|
-
const scoreMean = computeMean(finalScores);
|
|
229
|
-
const scoreStdDev = computePopulationStandardDeviation(
|
|
230
|
-
finalScores,
|
|
231
|
-
scoreMean,
|
|
232
|
-
);
|
|
233
|
-
const bestGenome = resolveBestGenomeByScore(population);
|
|
234
|
-
const bestAggregate = resolveBestAggregate(
|
|
235
|
-
population,
|
|
236
|
-
bestGenome,
|
|
237
|
-
aggregateByGenome,
|
|
238
|
-
generationEvaluationPlan.reevaluationSeeds,
|
|
239
|
-
generationEvaluationPlan.reevaluationRolloutOptions,
|
|
240
|
-
);
|
|
241
|
-
const bestEpisode = resolveBestEpisode(
|
|
242
|
-
population,
|
|
243
|
-
bestGenome,
|
|
244
|
-
generationEvaluationPlan.reevaluationSeeds,
|
|
245
|
-
generationEvaluationPlan.reevaluationRolloutOptions,
|
|
246
|
-
);
|
|
247
|
-
|
|
248
|
-
return {
|
|
249
|
-
generationIndex: generationEvaluationPlan.generationIndex,
|
|
250
|
-
difficultyScale: generationEvaluationPlan.difficultyScale,
|
|
251
|
-
mutationRate: generationEvaluationPlan.mutationRate,
|
|
252
|
-
mutationAmount: generationEvaluationPlan.mutationAmount,
|
|
253
|
-
quickSeedCount: generationEvaluationPlan.quickSeeds.length,
|
|
254
|
-
fullSeedCount: generationEvaluationPlan.fullSeeds.length,
|
|
255
|
-
reevaluationSeedCount: generationEvaluationPlan.reevaluationSeeds.length,
|
|
256
|
-
evaluatedPopulationSize: population.length,
|
|
257
|
-
scoreMean,
|
|
258
|
-
scoreMedian: computePercentile(
|
|
259
|
-
finalScores,
|
|
260
|
-
FLAPPY_TRAINER_SCORE_MEDIAN_PERCENTILE,
|
|
261
|
-
),
|
|
262
|
-
scoreP90: computePercentile(
|
|
263
|
-
finalScores,
|
|
264
|
-
FLAPPY_TRAINER_SCORE_P90_PERCENTILE,
|
|
265
|
-
),
|
|
266
|
-
scoreStdDev,
|
|
267
|
-
bestRobustFitness: bestGenome?.score ?? Number.NaN,
|
|
268
|
-
bestMeanFitness: bestAggregate.meanFitness,
|
|
269
|
-
bestPipesPassed: bestEpisode.pipesPassed,
|
|
270
|
-
bestFramesSurvived: bestEpisode.framesSurvived,
|
|
271
|
-
};
|
|
272
|
-
}
|
|
273
|
-
|
|
274
|
-
/**
|
|
275
|
-
* Collects finite genome scores from population.
|
|
276
|
-
*/
|
|
277
|
-
function collectFiniteGenomeScores(
|
|
278
|
-
population: readonly FlappyTrainerNetwork[],
|
|
279
|
-
): number[] {
|
|
280
|
-
const finiteScores: number[] = [];
|
|
281
|
-
|
|
282
|
-
for (const genome of population) {
|
|
283
|
-
const genomeScore = genome.score ?? Number.NEGATIVE_INFINITY;
|
|
284
|
-
if (Number.isFinite(genomeScore)) {
|
|
285
|
-
finiteScores.push(genomeScore);
|
|
286
|
-
}
|
|
287
|
-
}
|
|
288
|
-
|
|
289
|
-
return finiteScores;
|
|
290
|
-
}
|
|
291
|
-
|
|
292
|
-
/**
|
|
293
|
-
* Resolves the best genome by current score.
|
|
294
|
-
*/
|
|
295
|
-
function resolveBestGenomeByScore(
|
|
296
|
-
population: readonly FlappyTrainerNetwork[],
|
|
297
|
-
): FlappyTrainerNetwork | undefined {
|
|
298
|
-
const scoredGenomes = buildScoredGenomeEntries(population, undefined);
|
|
299
|
-
scoredGenomes.sort(compareScoredGenomeEntriesDescending);
|
|
300
|
-
return scoredGenomes[0]?.genome;
|
|
301
|
-
}
|
|
302
|
-
|
|
303
|
-
/**
|
|
304
|
-
* Resolves aggregate for the selected best genome.
|
|
305
|
-
*/
|
|
306
|
-
function resolveBestAggregate(
|
|
307
|
-
population: readonly FlappyTrainerNetwork[],
|
|
308
|
-
bestGenome: FlappyTrainerNetwork | undefined,
|
|
309
|
-
aggregateByGenome: ReadonlyMap<
|
|
310
|
-
FlappyTrainerNetwork,
|
|
311
|
-
FlappySeedBatchEvaluation
|
|
312
|
-
>,
|
|
313
|
-
fallbackSeeds: readonly number[],
|
|
314
|
-
fallbackRolloutOptions: FlappyRolloutOptions,
|
|
315
|
-
): FlappySeedBatchEvaluation {
|
|
316
|
-
const fallbackGenome = resolveFallbackGenome(population, bestGenome);
|
|
317
|
-
if (!fallbackGenome) {
|
|
318
|
-
return buildEmptySeedBatchEvaluation();
|
|
319
|
-
}
|
|
320
|
-
|
|
321
|
-
const cachedAggregate = aggregateByGenome.get(fallbackGenome);
|
|
322
|
-
if (cachedAggregate) {
|
|
323
|
-
return cachedAggregate;
|
|
324
|
-
}
|
|
325
|
-
|
|
326
|
-
return evaluateFlappyFitnessAcrossSeeds(
|
|
327
|
-
fallbackGenome,
|
|
328
|
-
fallbackSeeds,
|
|
329
|
-
fallbackRolloutOptions,
|
|
330
|
-
);
|
|
331
|
-
}
|
|
332
|
-
|
|
333
|
-
/**
|
|
334
|
-
* Resolves one representative episode for the selected best genome.
|
|
335
|
-
*/
|
|
336
|
-
function resolveBestEpisode(
|
|
337
|
-
population: readonly FlappyTrainerNetwork[],
|
|
338
|
-
bestGenome: FlappyTrainerNetwork | undefined,
|
|
339
|
-
fallbackSeeds: readonly number[],
|
|
340
|
-
fallbackRolloutOptions: FlappyRolloutOptions,
|
|
341
|
-
): ReturnType<typeof rolloutEpisode> {
|
|
342
|
-
const fallbackGenome = resolveFallbackGenome(population, bestGenome);
|
|
343
|
-
if (!fallbackGenome) {
|
|
344
|
-
return rolloutEpisode(resolveDummyNetwork(), fallbackRolloutOptions);
|
|
345
|
-
}
|
|
346
|
-
|
|
347
|
-
const episodeSeed = fallbackSeeds[0];
|
|
348
|
-
return rolloutEpisode(fallbackGenome, {
|
|
349
|
-
...fallbackRolloutOptions,
|
|
350
|
-
seed: episodeSeed,
|
|
351
|
-
});
|
|
352
|
-
}
|
|
353
|
-
|
|
354
|
-
/**
|
|
355
|
-
* Picks the best genome when available, else falls back to the first genome.
|
|
356
|
-
*/
|
|
357
|
-
function resolveFallbackGenome(
|
|
358
|
-
population: readonly FlappyTrainerNetwork[],
|
|
359
|
-
bestGenome: FlappyTrainerNetwork | undefined,
|
|
360
|
-
): FlappyTrainerNetwork | undefined {
|
|
361
|
-
return bestGenome ?? population[0];
|
|
362
|
-
}
|
|
363
|
-
|
|
364
|
-
/**
|
|
365
|
-
* Builds empty aggregate object for defensive fallback paths.
|
|
366
|
-
*/
|
|
367
|
-
function buildEmptySeedBatchEvaluation(): FlappySeedBatchEvaluation {
|
|
368
|
-
return {
|
|
369
|
-
seedCount: 0,
|
|
370
|
-
meanFitness: 0,
|
|
371
|
-
medianFitness: 0,
|
|
372
|
-
p90Fitness: 0,
|
|
373
|
-
fitnessStdDev: 0,
|
|
374
|
-
robustFitness: 0,
|
|
375
|
-
meanPipesPassed: 0,
|
|
376
|
-
meanFramesSurvived: 0,
|
|
377
|
-
};
|
|
378
|
-
}
|
|
379
|
-
|
|
380
|
-
/**
|
|
381
|
-
* Builds a minimal dummy network used only by fallback episode path.
|
|
382
|
-
*/
|
|
383
|
-
function resolveDummyNetwork(): FlappyTrainerNetwork {
|
|
384
|
-
return {
|
|
385
|
-
activate: activateWithoutFlap,
|
|
386
|
-
_id: FLAPPY_TRAINER_DUMMY_NETWORK_ID,
|
|
387
|
-
};
|
|
388
|
-
}
|
|
389
|
-
|
|
390
|
-
/**
|
|
391
|
-
* Dummy network activation used by fallback code paths.
|
|
392
|
-
*/
|
|
393
|
-
function activateWithoutFlap(): number[] {
|
|
394
|
-
return [
|
|
395
|
-
FLAPPY_TRAINER_DUMMY_NO_FLAP_OUTPUT,
|
|
396
|
-
FLAPPY_TRAINER_DUMMY_FLAP_OUTPUT,
|
|
397
|
-
];
|
|
398
|
-
}
|
|
399
|
-
|
|
400
|
-
/**
|
|
401
|
-
* Emits one compact generation log line.
|
|
402
|
-
*/
|
|
403
|
-
function logGenerationSummary(
|
|
404
|
-
generationLabel: number,
|
|
405
|
-
mutationSchedule: { mutationRate: number; mutationAmount: number },
|
|
406
|
-
report: FlappyGenerationReport | undefined,
|
|
407
|
-
fittestGenome: FlappyTrainerNetwork,
|
|
408
|
-
fallbackEpisode: ReturnType<typeof rolloutEpisode>,
|
|
409
|
-
): void {
|
|
410
|
-
const bestFitness =
|
|
411
|
-
report?.bestRobustFitness ??
|
|
412
|
-
(fittestGenome.score as number) ??
|
|
413
|
-
fallbackEpisode.fitness;
|
|
414
|
-
const bestPipesPassed =
|
|
415
|
-
report?.bestPipesPassed ?? fallbackEpisode.pipesPassed;
|
|
416
|
-
const bestFramesSurvived =
|
|
417
|
-
report?.bestFramesSurvived ?? fallbackEpisode.framesSurvived;
|
|
418
|
-
|
|
419
|
-
const logParts = buildGenerationLogParts(
|
|
420
|
-
generationLabel,
|
|
421
|
-
bestFitness,
|
|
422
|
-
bestPipesPassed,
|
|
423
|
-
bestFramesSurvived,
|
|
424
|
-
report,
|
|
425
|
-
mutationSchedule,
|
|
426
|
-
);
|
|
427
|
-
|
|
428
|
-
// eslint-disable-next-line no-console
|
|
429
|
-
console.log(logParts.join(FLAPPY_TRAINER_LOG_PARTS_DELIMITER));
|
|
430
|
-
}
|
|
431
|
-
|
|
432
|
-
/**
|
|
433
|
-
* Rebuild provisional scores using frame-primary ranking with a pipe filter.
|
|
434
|
-
*/
|
|
435
|
-
function assignFramePrimaryScores(
|
|
436
|
-
population: readonly FlappyTrainerNetwork[],
|
|
437
|
-
aggregateByGenome: ReadonlyMap<
|
|
438
|
-
FlappyTrainerNetwork,
|
|
439
|
-
FlappySeedBatchEvaluation
|
|
440
|
-
>,
|
|
441
|
-
provisionalScoresByGenome: Map<FlappyTrainerNetwork, number>,
|
|
442
|
-
): void {
|
|
443
|
-
const aggregateValues = collectAggregateValues(population, aggregateByGenome);
|
|
444
|
-
const maxMeanPipesPassed = resolveMaxMeanPipesPassed(aggregateValues);
|
|
445
|
-
|
|
446
|
-
for (const genome of population) {
|
|
447
|
-
const aggregate = aggregateByGenome.get(genome);
|
|
448
|
-
if (!aggregate) {
|
|
449
|
-
provisionalScoresByGenome.set(genome, Number.NEGATIVE_INFINITY);
|
|
450
|
-
continue;
|
|
451
|
-
}
|
|
452
|
-
|
|
453
|
-
provisionalScoresByGenome.set(
|
|
454
|
-
genome,
|
|
455
|
-
scoreAggregateFramePrimary(aggregate, maxMeanPipesPassed),
|
|
456
|
-
);
|
|
457
|
-
}
|
|
458
|
-
}
|
|
459
|
-
|
|
460
|
-
/**
|
|
461
|
-
* Collects present aggregate values in population order.
|
|
462
|
-
*/
|
|
463
|
-
function collectAggregateValues(
|
|
464
|
-
population: readonly FlappyTrainerNetwork[],
|
|
465
|
-
aggregateByGenome: ReadonlyMap<
|
|
466
|
-
FlappyTrainerNetwork,
|
|
467
|
-
FlappySeedBatchEvaluation
|
|
468
|
-
>,
|
|
469
|
-
): FlappySeedBatchEvaluation[] {
|
|
470
|
-
const aggregateValues: FlappySeedBatchEvaluation[] = [];
|
|
471
|
-
|
|
472
|
-
for (const genome of population) {
|
|
473
|
-
const aggregate = aggregateByGenome.get(genome);
|
|
474
|
-
if (aggregate) {
|
|
475
|
-
aggregateValues.push(aggregate);
|
|
476
|
-
}
|
|
477
|
-
}
|
|
478
|
-
|
|
479
|
-
return aggregateValues;
|
|
480
|
-
}
|
|
481
|
-
|
|
482
|
-
/**
|
|
483
|
-
* Resolves best mean pipe progress across aggregates.
|
|
484
|
-
*/
|
|
485
|
-
function resolveMaxMeanPipesPassed(
|
|
486
|
-
aggregateValues: readonly FlappySeedBatchEvaluation[],
|
|
487
|
-
): number {
|
|
488
|
-
return aggregateValues.reduce(function resolveBest(
|
|
489
|
-
bestPipeProgress,
|
|
490
|
-
aggregate,
|
|
491
|
-
): number {
|
|
492
|
-
return Math.max(bestPipeProgress, aggregate.meanPipesPassed);
|
|
493
|
-
}, 0);
|
|
494
|
-
}
|
|
495
|
-
|
|
496
|
-
/**
|
|
497
|
-
* Score one aggregate with pipes as filter and frames as primary objective.
|
|
498
|
-
*/
|
|
499
|
-
function scoreAggregateFramePrimary(
|
|
500
|
-
aggregate: FlappySeedBatchEvaluation,
|
|
501
|
-
maxMeanPipesPassed: number,
|
|
502
|
-
): number {
|
|
503
|
-
const frameStabilityPenalty =
|
|
504
|
-
aggregate.fitnessStdDev * FLAPPY_TRAINER_FRAME_STABILITY_STDDEV_WEIGHT;
|
|
505
|
-
const passesPipeFilter =
|
|
506
|
-
aggregate.meanPipesPassed >=
|
|
507
|
-
maxMeanPipesPassed - FLAPPY_TRAINER_PIPE_FILTER_TOLERANCE;
|
|
508
|
-
|
|
509
|
-
if (passesPipeFilter) {
|
|
510
|
-
return (
|
|
511
|
-
FLAPPY_TRAINER_FRAME_PRIMARY_BASE_SCORE +
|
|
512
|
-
aggregate.meanFramesSurvived *
|
|
513
|
-
FLAPPY_TRAINER_FRAME_PRIMARY_SURVIVAL_WEIGHT +
|
|
514
|
-
aggregate.meanPipesPassed * FLAPPY_TRAINER_FRAME_PRIMARY_PIPE_WEIGHT -
|
|
515
|
-
frameStabilityPenalty
|
|
516
|
-
);
|
|
517
|
-
}
|
|
518
|
-
|
|
519
|
-
return (
|
|
520
|
-
aggregate.meanPipesPassed * FLAPPY_TRAINER_PIPE_FALLBACK_PIPE_WEIGHT +
|
|
521
|
-
aggregate.meanFramesSurvived -
|
|
522
|
-
frameStabilityPenalty
|
|
523
|
-
);
|
|
524
|
-
}
|
|
525
|
-
|
|
526
|
-
/**
|
|
527
|
-
* Resolves full-stage candidate count from population and elitism.
|
|
528
|
-
*/
|
|
529
|
-
function resolveFullPassCandidateCount(
|
|
530
|
-
populationSize: number,
|
|
531
|
-
elitismCount: number,
|
|
532
|
-
): number {
|
|
533
|
-
return Math.max(
|
|
534
|
-
elitismCount * FLAPPY_TRAINER_FULL_PASS_ELITISM_MULTIPLIER,
|
|
535
|
-
Math.floor(populationSize * FLAPPY_TRAINER_FULL_PASS_POPULATION_FRACTION),
|
|
536
|
-
);
|
|
537
|
-
}
|
|
538
|
-
|
|
539
|
-
/**
|
|
540
|
-
* Returns top genomes ordered by current provisional score.
|
|
541
|
-
*/
|
|
542
|
-
function selectTopGenomesByScore(
|
|
543
|
-
population: readonly FlappyTrainerNetwork[],
|
|
544
|
-
provisionalScoresByGenome: ReadonlyMap<FlappyTrainerNetwork, number>,
|
|
545
|
-
targetCount: number,
|
|
546
|
-
): FlappyTrainerNetwork[] {
|
|
547
|
-
const scoredEntries = buildScoredGenomeEntries(
|
|
548
|
-
population,
|
|
549
|
-
provisionalScoresByGenome,
|
|
550
|
-
);
|
|
551
|
-
|
|
552
|
-
scoredEntries.sort(compareScoredGenomeEntriesDescending);
|
|
553
|
-
|
|
554
|
-
const selectedGenomes: FlappyTrainerNetwork[] = [];
|
|
555
|
-
const maxSelectionCount = Math.max(
|
|
556
|
-
0,
|
|
557
|
-
Math.min(targetCount, scoredEntries.length),
|
|
558
|
-
);
|
|
559
|
-
|
|
560
|
-
let selectedIndex = 0;
|
|
561
|
-
while (selectedIndex < maxSelectionCount) {
|
|
562
|
-
const scoredEntry = scoredEntries[selectedIndex];
|
|
563
|
-
if (scoredEntry) {
|
|
564
|
-
selectedGenomes.push(scoredEntry.genome);
|
|
565
|
-
}
|
|
566
|
-
selectedIndex++;
|
|
567
|
-
}
|
|
568
|
-
|
|
569
|
-
return selectedGenomes;
|
|
570
|
-
}
|
|
571
|
-
|
|
572
|
-
/**
|
|
573
|
-
* Builds sortable scored entries from genomes.
|
|
574
|
-
*/
|
|
575
|
-
function buildScoredGenomeEntries(
|
|
576
|
-
population: readonly FlappyTrainerNetwork[],
|
|
577
|
-
provisionalScoresByGenome:
|
|
578
|
-
| ReadonlyMap<FlappyTrainerNetwork, number>
|
|
579
|
-
| undefined,
|
|
580
|
-
): ScoredGenomeEntry[] {
|
|
581
|
-
const scoredEntries: ScoredGenomeEntry[] = [];
|
|
582
|
-
|
|
583
|
-
for (const genome of population) {
|
|
584
|
-
const score = resolveGenomeScore(genome, provisionalScoresByGenome);
|
|
585
|
-
scoredEntries.push({ genome, score });
|
|
586
|
-
}
|
|
587
|
-
|
|
588
|
-
return scoredEntries;
|
|
589
|
-
}
|
|
590
|
-
|
|
591
|
-
/**
|
|
592
|
-
* Resolves genome score either from map or direct genome field.
|
|
593
|
-
*/
|
|
594
|
-
function resolveGenomeScore(
|
|
595
|
-
genome: FlappyTrainerNetwork,
|
|
596
|
-
provisionalScoresByGenome:
|
|
597
|
-
| ReadonlyMap<FlappyTrainerNetwork, number>
|
|
598
|
-
| undefined,
|
|
599
|
-
): number {
|
|
600
|
-
if (provisionalScoresByGenome) {
|
|
601
|
-
return provisionalScoresByGenome.get(genome) ?? Number.NEGATIVE_INFINITY;
|
|
602
|
-
}
|
|
603
|
-
return genome.score ?? Number.NEGATIVE_INFINITY;
|
|
604
|
-
}
|
|
605
|
-
|
|
606
|
-
/**
|
|
607
|
-
* Sort comparator for scored genome entries (descending by score).
|
|
608
|
-
*/
|
|
609
|
-
function compareScoredGenomeEntriesDescending(
|
|
610
|
-
leftEntry: ScoredGenomeEntry,
|
|
611
|
-
rightEntry: ScoredGenomeEntry,
|
|
612
|
-
): number {
|
|
613
|
-
return rightEntry.score - leftEntry.score;
|
|
614
|
-
}
|
|
615
|
-
|
|
616
90
|
/**
|
|
617
91
|
* Handles fatal `main` rejection path.
|
|
92
|
+
*
|
|
93
|
+
* The trainer keeps this boundary small so unexpected failures are formatted in
|
|
94
|
+
* one consistent place before reaching the CLI.
|
|
95
|
+
*
|
|
96
|
+
* @param error - Unknown rejection reason from trainer execution.
|
|
97
|
+
* @returns Nothing.
|
|
618
98
|
*/
|
|
619
99
|
export function handleTrainerMainError(error: unknown): void {
|
|
620
100
|
// eslint-disable-next-line no-console
|
|
@@ -626,6 +106,11 @@ if (isDirectTrainerExecution()) {
|
|
|
626
106
|
runTrainer().catch(handleTrainerMainError);
|
|
627
107
|
}
|
|
628
108
|
|
|
109
|
+
/**
|
|
110
|
+
* Resolves whether this module is the direct Node entrypoint.
|
|
111
|
+
*
|
|
112
|
+
* @returns `true` when Node launched this file directly.
|
|
113
|
+
*/
|
|
629
114
|
function isDirectTrainerExecution(): boolean {
|
|
630
115
|
const entryScriptPath = process.argv[1];
|
|
631
116
|
if (!entryScriptPath) {
|