@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
|
@@ -1,580 +1,14 @@
|
|
|
1
|
-
import { BrowserTerminalUtility } from './browserTerminalUtility';
|
|
2
|
-
import { createBrowserLogger } from './browserLogger';
|
|
3
|
-
import { DashboardManager } from './dashboardManager';
|
|
4
|
-
import { EvolutionEngine } from './evolutionEngine';
|
|
5
|
-
import { INetwork } from './interfaces';
|
|
6
|
-
import { MazeGenerator } from './mazes';
|
|
7
|
-
import { NetworkRefinement } from './networkRefinement';
|
|
8
|
-
import type Network from '../../../src/architecture/network';
|
|
9
|
-
|
|
10
|
-
/**
|
|
11
|
-
* Runtime type for DashboardManager with dynamic methods and hooks.
|
|
12
|
-
* Dashboard gains runtime methods like redraw and telemetry hooks.
|
|
13
|
-
*/
|
|
14
|
-
interface RuntimeDashboard {
|
|
15
|
-
_telemetryHook?: (telemetry: Record<string, unknown>) => void;
|
|
16
|
-
redraw?: (data: unknown[], state: unknown) => void;
|
|
17
|
-
getLastTelemetry?: () => Record<string, unknown>;
|
|
18
|
-
[key: string]: unknown;
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
/**
|
|
22
|
-
* Runtime type for AbortSignal with dynamic properties.
|
|
23
|
-
* Some environments extend AbortSignal with additional runtime flags.
|
|
24
|
-
*/
|
|
25
|
-
interface RuntimeAbortSignal {
|
|
26
|
-
aborted?: boolean;
|
|
27
|
-
onabort?: (() => void) | null;
|
|
28
|
-
addEventListener: AbortSignal['addEventListener'];
|
|
29
|
-
removeEventListener: AbortSignal['removeEventListener'];
|
|
30
|
-
dispatchEvent: AbortSignal['dispatchEvent'];
|
|
31
|
-
reason?: unknown;
|
|
32
|
-
throwIfAborted?: () => void;
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
/**
|
|
36
|
-
* Runtime type for AbortSignal constructor with dynamic any method.
|
|
37
|
-
* Modern environments support AbortSignal.any for signal composition.
|
|
38
|
-
*/
|
|
39
|
-
interface RuntimeAbortSignalConstructor {
|
|
40
|
-
prototype: AbortSignal;
|
|
41
|
-
new (): AbortSignal;
|
|
42
|
-
any?: (signals: AbortSignal[]) => AbortSignal;
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
/**
|
|
46
|
-
* Runtime type for evolution result with dynamic properties.
|
|
47
|
-
* Evolution loop returns results with bestResult, bestNetwork, etc.
|
|
48
|
-
*/
|
|
49
|
-
interface RuntimeEvolutionResult {
|
|
50
|
-
bestResult?: {
|
|
51
|
-
progress?: number;
|
|
52
|
-
[key: string]: unknown;
|
|
53
|
-
};
|
|
54
|
-
bestNetwork?: INetwork;
|
|
55
|
-
[key: string]: unknown;
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
/**
|
|
59
|
-
* Runtime type for global window with dynamic asciiMaze namespace.
|
|
60
|
-
* Browser environments extend window with custom global namespaces.
|
|
61
|
-
*/
|
|
62
|
-
interface RuntimeWindow extends Window {
|
|
63
|
-
asciiMaze?: {
|
|
64
|
-
start?: typeof start;
|
|
65
|
-
_autoStarted?: boolean;
|
|
66
|
-
[key: string]: unknown;
|
|
67
|
-
};
|
|
68
|
-
asciiMazeStart?: (containerElement?: unknown) => unknown;
|
|
69
|
-
[key: string]: unknown;
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
/** Default host container id used when a string is supplied to `start`. */
|
|
73
|
-
const DEFAULT_CONTAINER_ID = 'ascii-maze-output';
|
|
74
|
-
/** Width delta (px) that triggers a dashboard redraw to avoid noisy renders. */
|
|
75
|
-
const RESIZE_WIDTH_THRESHOLD = 8;
|
|
76
|
-
/** Debounce for fallback window.resize handler (ms). */
|
|
77
|
-
const RESIZE_DEBOUNCE_MS = 120;
|
|
78
|
-
/** Delay before auto-starting the demo when loaded as a script (ms). */
|
|
79
|
-
const AUTO_START_DELAY_MS = 20;
|
|
80
|
-
/** Minimum progress percentage required to consider a maze solved (mirrors e2e test). */
|
|
81
|
-
const MIN_PROGRESS_TO_PASS = 90;
|
|
82
|
-
/** Default stagnation generation threshold used across most curriculum phases. */
|
|
83
|
-
const DEFAULT_MAX_STAGNANT_GENERATIONS = 50;
|
|
84
|
-
/** Default max generations (hard cap) for most curriculum phases. */
|
|
85
|
-
const DEFAULT_MAX_GENERATIONS = 100;
|
|
86
|
-
/** Per-generation log/telemetry frequency for interactive demo (always 1). */
|
|
87
|
-
const PER_GENERATION_LOG_FREQUENCY = 1;
|
|
88
|
-
/** Initial side length (cells) of the generated procedural maze. */
|
|
89
|
-
const INITIAL_MAZE_DIMENSION = 8;
|
|
90
|
-
/** Maximum side length (cells) to grow the maze to. */
|
|
91
|
-
const MAX_MAZE_DIMENSION = 40;
|
|
92
|
-
/** Dimension increment (cells per axis) applied after each solved maze. */
|
|
93
|
-
const MAZE_DIMENSION_INCREMENT = 4;
|
|
94
|
-
/** Maximum agent steps before termination (scaled mazes). */
|
|
95
|
-
const AGENT_MAX_STEPS = 600;
|
|
96
|
-
/** Population size for evolution across maze scalings. */
|
|
97
|
-
const POPULATION_SIZE = 20;
|
|
98
|
-
|
|
99
|
-
/**
|
|
100
|
-
* Create immutable evolution settings for a given maze dimension.
|
|
101
|
-
*
|
|
102
|
-
* @param dimension - Maze side length in cells (square maze).
|
|
103
|
-
* @returns Readonly configuration object consumed by a single evolution run.
|
|
104
|
-
*/
|
|
105
|
-
const createEvolutionSettings = (dimension: number) => {
|
|
106
|
-
return {
|
|
107
|
-
agentMaxSteps: AGENT_MAX_STEPS,
|
|
108
|
-
popSize: POPULATION_SIZE,
|
|
109
|
-
maxStagnantGenerations: DEFAULT_MAX_STAGNANT_GENERATIONS,
|
|
110
|
-
maxGenerations: DEFAULT_MAX_GENERATIONS,
|
|
111
|
-
lamarckianIterations: 4,
|
|
112
|
-
lamarckianSampleSize: 12,
|
|
113
|
-
mazeFactory: () => new MazeGenerator(dimension, dimension).generate(),
|
|
114
|
-
} as const;
|
|
115
|
-
};
|
|
116
|
-
|
|
117
|
-
/**
|
|
118
|
-
* Lightweight telemetry hub using a Set + snapshot iteration (micro-optimized for small listener counts).
|
|
119
|
-
* EventTarget would work here, but Set keeps call overhead extremely low and avoids string event names.
|
|
120
|
-
*/
|
|
121
|
-
class TelemetryHub<TTelemetry extends Record<string, unknown>> {
|
|
122
|
-
/** Registered listener callbacks (unique). */
|
|
123
|
-
#listeners = new Set<(payload: TTelemetry) => void>();
|
|
124
|
-
|
|
125
|
-
/** Add a listener and return an unsubscribe function. */
|
|
126
|
-
add(listener: (payload: TTelemetry) => void): () => void {
|
|
127
|
-
this.#listeners.add(listener);
|
|
128
|
-
return () => this.#listeners.delete(listener);
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
/** Dispatch to a snapshot of listeners so mutations during iteration are safe. */
|
|
132
|
-
dispatch(payload: TTelemetry): void {
|
|
133
|
-
// Step: Snapshot listeners (defensive against unsubscribe inside callback)
|
|
134
|
-
const snapshot = Array.from(this.#listeners);
|
|
135
|
-
for (const listener of snapshot) {
|
|
136
|
-
try {
|
|
137
|
-
listener(payload);
|
|
138
|
-
} catch {
|
|
139
|
-
// Listener exceptions are isolated so evolution cannot be disrupted.
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
/**
|
|
146
|
-
* Handle returned by {@link start} providing lifecycle & telemetry access.
|
|
147
|
-
*
|
|
148
|
-
* Consumers embedding the ASCII Maze demo can use this object to:
|
|
149
|
-
* - Stop the evolutionary curriculum early (`stop()`)
|
|
150
|
-
* - Check whether evolution is still active (`isRunning()`)
|
|
151
|
-
* - Await natural completion (`done` Promise resolves when curriculum ends or stop() called)
|
|
152
|
-
* - Subscribe to lightweight per-generation telemetry (`onTelemetry(cb)` returning an unsubscribe)
|
|
153
|
-
* - Pull the latest snapshot on demand (`getTelemetry()`)
|
|
154
|
-
*/
|
|
155
|
-
export interface AsciiMazeRunHandle {
|
|
156
|
-
/** Stop the running curriculum. This will also abort the internal signal. */
|
|
157
|
-
stop: () => void;
|
|
158
|
-
/** Whether the curriculum is currently active (not finished or stopped). */
|
|
159
|
-
isRunning: () => boolean;
|
|
160
|
-
/** Promise that resolves when the curriculum naturally finishes or is stopped. */
|
|
161
|
-
done: Promise<void>;
|
|
162
|
-
/** Subscribe to per-generation telemetry events. Returns an unsubscribe function. */
|
|
163
|
-
onTelemetry: (
|
|
164
|
-
listener: (telemetry: Record<string, unknown>) => void,
|
|
165
|
-
) => () => void;
|
|
166
|
-
/** Return the last telemetry snapshot produced by the dashboard, if any. */
|
|
167
|
-
getTelemetry: () => unknown;
|
|
168
|
-
}
|
|
169
|
-
|
|
170
1
|
/**
|
|
171
|
-
*
|
|
172
|
-
*
|
|
173
|
-
* Steps:
|
|
174
|
-
* 1. Generate an initial procedural maze (20x20) and evolve a NEAT population.
|
|
175
|
-
* 2. Emit telemetry each generation (logEvery=1) and pace via requestAnimationFrame for UI responsiveness.
|
|
176
|
-
* 3. When solved (progress >= MIN_PROGRESS_TO_PASS) grow maze size by +2 on each axis (up to 40x40) and repeat.
|
|
177
|
-
* 4. Continue until maximum dimension reached or `stop()` / external abort invoked.
|
|
2
|
+
* Compatibility entrypoint for the dedicated browser-entry module.
|
|
178
3
|
*
|
|
179
|
-
*
|
|
180
|
-
*
|
|
181
|
-
*
|
|
182
|
-
* @param opts - Optional configuration. `opts.signal` (AbortSignal) can be supplied by the caller to
|
|
183
|
-
* cooperatively cancel the curriculum. Calling `stop()` will also trigger an abort.
|
|
184
|
-
* @returns A {@link AsciiMazeRunHandle} exposing lifecycle controls and telemetry hooks.
|
|
4
|
+
* The real implementation now lives under `browser-entry/browser-entry.ts`.
|
|
5
|
+
* This file remains so existing imports such as `./browser-entry` continue to
|
|
6
|
+
* resolve without changes.
|
|
185
7
|
*/
|
|
186
|
-
export const start = async (
|
|
187
|
-
container: string | HTMLElement = DEFAULT_CONTAINER_ID,
|
|
188
|
-
opts: { signal?: AbortSignal } = {},
|
|
189
|
-
): Promise<AsciiMazeRunHandle> => {
|
|
190
|
-
// Step 0: Resolve host elements & loggers
|
|
191
|
-
const hostElement =
|
|
192
|
-
typeof container === 'string'
|
|
193
|
-
? document.getElementById(container)
|
|
194
|
-
: container;
|
|
195
|
-
|
|
196
|
-
const archiveElement = hostElement
|
|
197
|
-
? (hostElement.querySelector('#ascii-maze-archive') as HTMLElement)
|
|
198
|
-
: null;
|
|
199
|
-
const liveElement = hostElement
|
|
200
|
-
? (hostElement.querySelector('#ascii-maze-live') as HTMLElement)
|
|
201
|
-
: null;
|
|
202
|
-
|
|
203
|
-
// clearer will clear only the live area; archive remains
|
|
204
|
-
const clearer = BrowserTerminalUtility.createTerminalClearer(
|
|
205
|
-
liveElement ?? undefined,
|
|
206
|
-
);
|
|
207
|
-
const liveLogger = createBrowserLogger(liveElement ?? undefined);
|
|
208
|
-
const archiveLogger = createBrowserLogger(archiveElement ?? undefined);
|
|
209
|
-
|
|
210
|
-
// DashboardManager will use live logger for ongoing redraws and archive logger to append solved blocks
|
|
211
|
-
const dashboard = new DashboardManager(
|
|
212
|
-
clearer,
|
|
213
|
-
liveLogger as unknown as (...args: unknown[]) => void,
|
|
214
|
-
archiveLogger as unknown as (...args: unknown[]) => void,
|
|
215
|
-
);
|
|
216
|
-
|
|
217
|
-
// Telemetry hub mediating dashboard -> external listeners
|
|
218
|
-
const telemetryHub = new TelemetryHub<Record<string, unknown>>();
|
|
219
|
-
const runtimeDashboard = dashboard as unknown as RuntimeDashboard;
|
|
220
|
-
runtimeDashboard._telemetryHook = (telemetry: Record<string, unknown>) =>
|
|
221
|
-
telemetryHub.dispatch(telemetry);
|
|
222
|
-
|
|
223
|
-
// Responsive resize: re-render dashboard when host width changes significantly.
|
|
224
|
-
try {
|
|
225
|
-
const observeTarget =
|
|
226
|
-
hostElement ?? document.getElementById('ascii-maze-output');
|
|
227
|
-
if (observeTarget && typeof ResizeObserver !== 'undefined') {
|
|
228
|
-
let lastObservedWidth = observeTarget.clientWidth;
|
|
229
|
-
const resizeObserver = new ResizeObserver((entries) => {
|
|
230
|
-
for (const entry of entries) {
|
|
231
|
-
const width = entry.contentRect.width;
|
|
232
|
-
if (Math.abs(width - lastObservedWidth) > RESIZE_WIDTH_THRESHOLD) {
|
|
233
|
-
// threshold to avoid noisy redraws
|
|
234
|
-
lastObservedWidth = width;
|
|
235
|
-
try {
|
|
236
|
-
runtimeDashboard.redraw?.([], undefined);
|
|
237
|
-
} catch {
|
|
238
|
-
// ignore redraw errors
|
|
239
|
-
}
|
|
240
|
-
}
|
|
241
|
-
}
|
|
242
|
-
});
|
|
243
|
-
resizeObserver.observe(observeTarget);
|
|
244
|
-
} else if (observeTarget) {
|
|
245
|
-
// Fallback: window resize listener (debounced)
|
|
246
|
-
let debounceTimer: number | undefined = undefined;
|
|
247
|
-
const handler = () => {
|
|
248
|
-
if (typeof debounceTimer === 'number') clearTimeout(debounceTimer);
|
|
249
|
-
debounceTimer = window.setTimeout(() => {
|
|
250
|
-
try {
|
|
251
|
-
runtimeDashboard.redraw?.([], undefined);
|
|
252
|
-
} catch {
|
|
253
|
-
// ignore
|
|
254
|
-
}
|
|
255
|
-
}, RESIZE_DEBOUNCE_MS);
|
|
256
|
-
};
|
|
257
|
-
window.addEventListener('resize', handler);
|
|
258
|
-
}
|
|
259
|
-
} catch {
|
|
260
|
-
// ignore resize wiring errors
|
|
261
|
-
}
|
|
262
|
-
|
|
263
|
-
// Inner runner (previously assigned to window.asciiMazeStart). Kept internal for ESM API.
|
|
264
|
-
let cancelled = false;
|
|
265
|
-
const internalController = new AbortController();
|
|
266
|
-
const externalSignal = opts.signal;
|
|
267
|
-
|
|
268
|
-
/**
|
|
269
|
-
* Compose an AbortSignal that will abort when either the internal controller
|
|
270
|
-
* or an optional external signal aborts. This helper prefers modern
|
|
271
|
-
* composition via `AbortSignal.any` when available, and falls back to
|
|
272
|
-
* best-effort wiring for older or test environments (jsdom, polyfills).
|
|
273
|
-
*
|
|
274
|
-
* @example
|
|
275
|
-
* // Create a composed signal that aborts when either source aborts
|
|
276
|
-
* const composed = composeAbortSignal(externalSignal);
|
|
277
|
-
* composed.addEventListener('abort', () => console.log('aborted'));
|
|
278
|
-
*
|
|
279
|
-
* @param externalSignalParam - Optional external AbortSignal provided by the caller.
|
|
280
|
-
* When omitted, the returned signal is the internal controller's signal.
|
|
281
|
-
* @returns A signal that will abort when either the internal controller or the external signal aborts.
|
|
282
|
-
*/
|
|
283
|
-
const composeAbortSignal = (
|
|
284
|
-
externalSignalParam?: AbortSignal,
|
|
285
|
-
): AbortSignal => {
|
|
286
|
-
// Step 0: fast-path when no external signal supplied
|
|
287
|
-
if (!externalSignalParam) return internalController.signal;
|
|
288
|
-
|
|
289
|
-
// Convert to descriptive locals for clarity
|
|
290
|
-
const externalSignal = externalSignalParam as RuntimeAbortSignal;
|
|
291
|
-
const internalSignal = internalController.signal;
|
|
292
|
-
|
|
293
|
-
// Use a switch-style flow to replace chained else-if logic and keep branches explicit.
|
|
294
|
-
// We switch on `true` so each case is a predicate; this keeps intent clear and
|
|
295
|
-
// satisfies the requirement to use switch/case rather than else-if chains.
|
|
296
|
-
switch (true) {
|
|
297
|
-
// Case: external already aborted -> return it immediately (race fast-path)
|
|
298
|
-
case !!externalSignal.aborted: {
|
|
299
|
-
return externalSignal as unknown as AbortSignal;
|
|
300
|
-
}
|
|
301
|
-
|
|
302
|
-
// Case: environment supports AbortSignal.any (modern browsers / Node 20+)
|
|
303
|
-
case typeof (AbortSignal as unknown as RuntimeAbortSignalConstructor)
|
|
304
|
-
.any === 'function': {
|
|
305
|
-
try {
|
|
306
|
-
// Prefer native composition when available for clarity & performance.
|
|
307
|
-
const composedSignal = (
|
|
308
|
-
AbortSignal as unknown as RuntimeAbortSignalConstructor
|
|
309
|
-
).any!([externalSignal as unknown as AbortSignal, internalSignal]);
|
|
310
|
-
return composedSignal;
|
|
311
|
-
} catch {
|
|
312
|
-
// If native composition throws, intentionally fall through to manual
|
|
313
|
-
// wiring below so listeners are still attached.
|
|
314
|
-
}
|
|
315
|
-
// fallthrough
|
|
316
|
-
}
|
|
317
|
-
|
|
318
|
-
// Default: manual best-effort wiring for older environments and test runners.
|
|
319
|
-
default: {
|
|
320
|
-
// Step: try to attach an event listener to propagate abort.
|
|
321
|
-
try {
|
|
322
|
-
externalSignal.addEventListener(
|
|
323
|
-
'abort',
|
|
324
|
-
() => {
|
|
325
|
-
// Isolate listener exceptions to avoid destabilizing callers.
|
|
326
|
-
try {
|
|
327
|
-
internalController.abort();
|
|
328
|
-
} catch {
|
|
329
|
-
/* ignore */
|
|
330
|
-
}
|
|
331
|
-
},
|
|
332
|
-
{ once: true },
|
|
333
|
-
);
|
|
334
|
-
} catch {
|
|
335
|
-
// ignore event wiring errors (some polyfills / minimal DOMs may throw)
|
|
336
|
-
}
|
|
337
|
-
|
|
338
|
-
// Step: defensive fallback - attempt to set `onabort` if supported.
|
|
339
|
-
try {
|
|
340
|
-
// Runtime assignment for environments lacking addEventListener
|
|
341
|
-
externalSignal.onabort = () => {
|
|
342
|
-
try {
|
|
343
|
-
internalController.abort();
|
|
344
|
-
} catch {
|
|
345
|
-
/* ignore */
|
|
346
|
-
}
|
|
347
|
-
};
|
|
348
|
-
} catch {
|
|
349
|
-
// ignore
|
|
350
|
-
}
|
|
351
|
-
|
|
352
|
-
// Step: microtask check to catch races where the external signal aborted
|
|
353
|
-
// before wiring handlers. queueMicrotask is preferred but may not exist
|
|
354
|
-
// in some minimal runtimes, so guard defensively.
|
|
355
|
-
try {
|
|
356
|
-
queueMicrotask(() => {
|
|
357
|
-
if (externalSignal.aborted) {
|
|
358
|
-
try {
|
|
359
|
-
internalController.abort();
|
|
360
|
-
} catch {
|
|
361
|
-
/* ignore */
|
|
362
|
-
}
|
|
363
|
-
}
|
|
364
|
-
});
|
|
365
|
-
} catch {
|
|
366
|
-
// queueMicrotask may not be available in some environments; ignore.
|
|
367
|
-
}
|
|
368
|
-
}
|
|
369
|
-
}
|
|
370
|
-
|
|
371
|
-
// Return the internal controller's signal as the composed signal when native
|
|
372
|
-
// composition isn't available. Manual wiring will propagate external aborts.
|
|
373
|
-
return internalSignal;
|
|
374
|
-
};
|
|
375
|
-
|
|
376
|
-
// Create done promise early so immediate-abort handling (below) can resolve it.
|
|
377
|
-
let resolveDone: (() => void) | undefined;
|
|
378
|
-
const donePromise = new Promise<void>((resolve) => (resolveDone = resolve));
|
|
379
|
-
|
|
380
|
-
const combinedSignal = composeAbortSignal(externalSignal);
|
|
381
|
-
let running = true;
|
|
382
|
-
|
|
383
|
-
// Immediate abort reaction: if the combined signal is already aborted (race),
|
|
384
|
-
// reflect the cancelled state immediately so callers polling `isRunning()` see
|
|
385
|
-
// the updated state without waiting for event listeners to be attached.
|
|
386
|
-
if (combinedSignal.aborted) {
|
|
387
|
-
cancelled = true;
|
|
388
|
-
running = false;
|
|
389
|
-
try {
|
|
390
|
-
resolveDone?.();
|
|
391
|
-
} catch {
|
|
392
|
-
/* ignore */
|
|
393
|
-
}
|
|
394
|
-
}
|
|
395
|
-
|
|
396
|
-
// Ensure we capture future abort events when they occur.
|
|
397
|
-
try {
|
|
398
|
-
combinedSignal.addEventListener(
|
|
399
|
-
'abort',
|
|
400
|
-
() => {
|
|
401
|
-
// Step: mark cancelled state so cooperative checks exit early.
|
|
402
|
-
cancelled = true;
|
|
403
|
-
// Step: reflect non-running state immediately for consumers polling isRunning().
|
|
404
|
-
running = false;
|
|
405
|
-
// Step: resolve done Promise eagerly; underlying evolution will short‑circuit soon.
|
|
406
|
-
try {
|
|
407
|
-
resolveDone?.();
|
|
408
|
-
} catch {
|
|
409
|
-
/* ignore */
|
|
410
|
-
}
|
|
411
|
-
},
|
|
412
|
-
{ once: true },
|
|
413
|
-
);
|
|
414
|
-
} catch {
|
|
415
|
-
/* ignore listener wiring errors */
|
|
416
|
-
}
|
|
417
|
-
|
|
418
|
-
// Progressive scaling state
|
|
419
|
-
let currentDimension = INITIAL_MAZE_DIMENSION;
|
|
420
|
-
|
|
421
|
-
// --- Cross-maze curriculum transfer state ---
|
|
422
|
-
// Holds the best network from the most recently completed evolution run.
|
|
423
|
-
// Updated after each run finishes and passed as `initialBestNetwork` into the next
|
|
424
|
-
// run to encourage structural transfer to larger mazes. Starts undefined so the
|
|
425
|
-
// first maze evolves from a fresh random population.
|
|
426
|
-
let previousBestNetwork: INetwork | undefined;
|
|
427
|
-
|
|
428
|
-
/** Schedule a callback on the next animation frame with a setTimeout(0) fallback. */
|
|
429
|
-
const scheduleNextMaze = (cb: () => void) => {
|
|
430
|
-
try {
|
|
431
|
-
if (typeof requestAnimationFrame === 'function')
|
|
432
|
-
requestAnimationFrame(cb);
|
|
433
|
-
else setTimeout(cb, 0);
|
|
434
|
-
} catch {
|
|
435
|
-
setTimeout(cb, 0);
|
|
436
|
-
}
|
|
437
|
-
};
|
|
438
|
-
|
|
439
|
-
const runEvolution = async () => {
|
|
440
|
-
if (cancelled) {
|
|
441
|
-
running = false;
|
|
442
|
-
resolveDone?.();
|
|
443
|
-
return;
|
|
444
|
-
}
|
|
445
|
-
// Best network carried forward across curriculum phases (progressively larger mazes).
|
|
446
|
-
// This lets the next maze seed its population with the prior best to encourage transfer.
|
|
447
|
-
const settings = createEvolutionSettings(currentDimension);
|
|
448
|
-
const mazeLayout = settings.mazeFactory();
|
|
449
|
-
let solved = false;
|
|
450
|
-
try {
|
|
451
|
-
const result = await EvolutionEngine.runMazeEvolution({
|
|
452
|
-
mazeConfig: { maze: mazeLayout },
|
|
453
|
-
agentSimConfig: { maxSteps: settings.agentMaxSteps },
|
|
454
|
-
evolutionAlgorithmConfig: {
|
|
455
|
-
allowRecurrent: true,
|
|
456
|
-
popSize: settings.popSize,
|
|
457
|
-
maxStagnantGenerations: settings.maxStagnantGenerations,
|
|
458
|
-
minProgressToPass: MIN_PROGRESS_TO_PASS,
|
|
459
|
-
maxGenerations: settings.maxGenerations,
|
|
460
|
-
autoPauseOnSolve: false,
|
|
461
|
-
stopOnlyOnSolve: false,
|
|
462
|
-
lamarckianIterations: settings.lamarckianIterations,
|
|
463
|
-
lamarckianSampleSize: settings.lamarckianSampleSize,
|
|
464
|
-
initialBestNetwork: previousBestNetwork,
|
|
465
|
-
},
|
|
466
|
-
reportingConfig: {
|
|
467
|
-
dashboardManager: dashboard,
|
|
468
|
-
logEvery: PER_GENERATION_LOG_FREQUENCY,
|
|
469
|
-
label: `browser-procedural-${currentDimension}x${currentDimension}`,
|
|
470
|
-
paceEveryGeneration: true, // custom flag (consumed if supported) to yield between generations
|
|
471
|
-
},
|
|
472
|
-
cancellation: { isCancelled: () => cancelled },
|
|
473
|
-
signal: combinedSignal,
|
|
474
|
-
});
|
|
475
|
-
const runtimeResult = result as unknown as RuntimeEvolutionResult;
|
|
476
|
-
const progress = runtimeResult.bestResult?.progress;
|
|
477
|
-
// Capture & refine best network for seeding next curriculum phase (if any).
|
|
478
|
-
try {
|
|
479
|
-
const bestNet = runtimeResult.bestNetwork;
|
|
480
|
-
if (bestNet) {
|
|
481
|
-
const refined = NetworkRefinement.refineWinnerWithBackprop(
|
|
482
|
-
bestNet as unknown as Network,
|
|
483
|
-
);
|
|
484
|
-
previousBestNetwork = (refined as unknown as INetwork) || bestNet;
|
|
485
|
-
}
|
|
486
|
-
} catch {
|
|
487
|
-
/* ignore refinement */
|
|
488
|
-
}
|
|
489
|
-
solved = typeof progress === 'number' && progress >= MIN_PROGRESS_TO_PASS;
|
|
490
|
-
try {
|
|
491
|
-
console.log(
|
|
492
|
-
'[asciiMaze] maze complete',
|
|
493
|
-
currentDimension,
|
|
494
|
-
'solved?',
|
|
495
|
-
solved,
|
|
496
|
-
'progress',
|
|
497
|
-
progress,
|
|
498
|
-
);
|
|
499
|
-
} catch {
|
|
500
|
-
/* ignore */
|
|
501
|
-
}
|
|
502
|
-
} catch (error: unknown) {
|
|
503
|
-
console.error(
|
|
504
|
-
'Error while running procedural maze',
|
|
505
|
-
currentDimension,
|
|
506
|
-
error,
|
|
507
|
-
);
|
|
508
|
-
}
|
|
509
|
-
|
|
510
|
-
if (!cancelled && solved && currentDimension < MAX_MAZE_DIMENSION) {
|
|
511
|
-
currentDimension = Math.min(
|
|
512
|
-
currentDimension + MAZE_DIMENSION_INCREMENT,
|
|
513
|
-
MAX_MAZE_DIMENSION,
|
|
514
|
-
);
|
|
515
|
-
scheduleNextMaze(() => runEvolution());
|
|
516
|
-
} else {
|
|
517
|
-
running = false;
|
|
518
|
-
resolveDone?.();
|
|
519
|
-
}
|
|
520
|
-
};
|
|
521
|
-
|
|
522
|
-
// Kick off first maze immediately
|
|
523
|
-
runEvolution();
|
|
524
|
-
|
|
525
|
-
const handle: AsciiMazeRunHandle = {
|
|
526
|
-
stop: () => {
|
|
527
|
-
cancelled = true;
|
|
528
|
-
try {
|
|
529
|
-
internalController.abort();
|
|
530
|
-
} catch {
|
|
531
|
-
// ignore
|
|
532
|
-
}
|
|
533
|
-
// Reflect stopped state immediately.
|
|
534
|
-
running = false;
|
|
535
|
-
},
|
|
536
|
-
// Include AbortSignal aborted state so external aborts flip isRunning() without relying solely on listener side-effects.
|
|
537
|
-
isRunning: () => running && !cancelled && !combinedSignal.aborted,
|
|
538
|
-
done: Promise.resolve(donePromise).catch(() => {}) as Promise<void>,
|
|
539
|
-
onTelemetry: (telemetryCallback) =>
|
|
540
|
-
telemetryHub.add(
|
|
541
|
-
telemetryCallback as unknown as (
|
|
542
|
-
payload: Record<string, unknown>,
|
|
543
|
-
) => void,
|
|
544
|
-
),
|
|
545
|
-
getTelemetry: () => runtimeDashboard.getLastTelemetry?.(),
|
|
546
|
-
};
|
|
547
|
-
|
|
548
|
-
// (Pause UI removed; external host can manage pause via a future API if needed.)
|
|
549
|
-
return handle;
|
|
550
|
-
};
|
|
551
8
|
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
const globalWindow = window as unknown as RuntimeWindow;
|
|
559
|
-
globalWindow.asciiMaze = globalWindow.asciiMaze || {};
|
|
560
|
-
globalWindow.asciiMaze.start = start;
|
|
561
|
-
if (!globalWindow.asciiMazeStart) {
|
|
562
|
-
globalWindow.asciiMazeStart = (containerElement?: unknown) => {
|
|
563
|
-
console.warn(
|
|
564
|
-
'[asciiMaze] window.asciiMazeStart is deprecated; use import { start } ... or window.asciiMaze.start',
|
|
565
|
-
);
|
|
566
|
-
return start(containerElement as string | HTMLElement | undefined);
|
|
567
|
-
};
|
|
568
|
-
}
|
|
569
|
-
// Guard against duplicate auto-start
|
|
570
|
-
if (!globalWindow.asciiMaze._autoStarted) {
|
|
571
|
-
globalWindow.asciiMaze._autoStarted = true;
|
|
572
|
-
setTimeout(() => {
|
|
573
|
-
try {
|
|
574
|
-
if (document.getElementById(DEFAULT_CONTAINER_ID)) start();
|
|
575
|
-
} catch {
|
|
576
|
-
/* ignore */
|
|
577
|
-
}
|
|
578
|
-
}, AUTO_START_DELAY_MS);
|
|
579
|
-
}
|
|
580
|
-
}
|
|
9
|
+
export { start } from './browser-entry/browser-entry';
|
|
10
|
+
export type {
|
|
11
|
+
AsciiMazeRunHandle,
|
|
12
|
+
BrowserEntryStartFunction,
|
|
13
|
+
BrowserEntryStartOptions,
|
|
14
|
+
} from './browser-entry/browser-entry.types';
|