@reicek/neataptic-ts 0.1.21 → 0.1.22
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 +29 -0
- package/.github/agents/docs-scout.agent.md +29 -0
- package/.github/agents/plan-scout.agent.md +29 -0
- package/.github/agents/solid-split.agent.md +138 -0
- package/.github/copilot-instructions.md +103 -0
- package/package.json +6 -3
- package/plans/ES2023 migration +13 -8
- package/plans/Evolution_Training_Interoperability_Contracts.md +1 -1
- 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/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 +101 -223
- package/src/architecture/README.md +57 -185
- package/src/architecture/layer/README.md +38 -38
- package/src/architecture/network/README.md +33 -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/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/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/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 +562 -568
- 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/Trace-20260309T191949.json +24124 -0
- package/test/examples/flappy_bird/browser-entry/README.md +1129 -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 +6 -399
- package/test/examples/flappy_bird/browser-entry/browser-entry.playback.utils.ts +1 -717
- package/test/examples/flappy_bird/browser-entry/browser-entry.spawn.utils.ts +11 -31
- package/test/examples/flappy_bird/browser-entry/browser-entry.visualization.utils.ts +15 -893
- package/test/examples/flappy_bird/browser-entry/host/README.md +307 -0
- package/test/examples/flappy_bird/browser-entry/host/host.resize.service.ts +1 -295
- package/test/examples/flappy_bird/browser-entry/host/host.ts +562 -6
- package/test/examples/flappy_bird/browser-entry/host/resize/README.md +274 -0
- package/test/examples/flappy_bird/browser-entry/host/resize/host.resize.service.constants.ts +31 -0
- package/test/examples/flappy_bird/browser-entry/host/resize/host.resize.service.services.ts +360 -0
- package/test/examples/flappy_bird/browser-entry/host/resize/host.resize.service.ts +117 -0
- package/test/examples/flappy_bird/browser-entry/host/resize/host.resize.service.types.ts +63 -0
- package/test/examples/flappy_bird/browser-entry/host/resize/host.resize.service.utils.ts +250 -0
- package/test/examples/flappy_bird/browser-entry/network-view/README.md +399 -0
- package/test/examples/flappy_bird/browser-entry/network-view/network-view.topology.utils.ts +255 -0
- package/test/examples/flappy_bird/browser-entry/network-view/network-view.ts +802 -7
- package/test/examples/flappy_bird/browser-entry/playback/README.md +684 -0
- package/test/examples/flappy_bird/browser-entry/playback/background/README.md +277 -0
- package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/README.md +770 -0
- package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/playback.background.ground-grid.cache.services.ts +178 -0
- package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/playback.background.ground-grid.constants.ts +107 -0
- package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/playback.background.ground-grid.geometry.utils.ts +518 -0
- package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/playback.background.ground-grid.math.utils.ts +117 -0
- package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/playback.background.ground-grid.pulse.utils.ts +233 -0
- package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/playback.background.ground-grid.services.ts +211 -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 +212 -0
- package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/playback.background.ground-grid.utils.ts +81 -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 +62 -0
- package/test/examples/flappy_bird/browser-entry/playback/background/playback.background.services.ts +244 -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 +68 -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 +310 -0
- package/test/examples/flappy_bird/browser-entry/playback/frame-render/playback.frame-render.service.ts +92 -0
- package/test/examples/flappy_bird/browser-entry/playback/frame-render/playback.frame-render.services.ts +272 -0
- package/test/examples/flappy_bird/browser-entry/playback/frame-render/playback.frame-render.types.ts +39 -0
- package/test/examples/flappy_bird/browser-entry/playback/frame-render/playback.frame-render.utils.ts +493 -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 +4 -0
- package/test/examples/flappy_bird/browser-entry/playback/playback.snapshot.utils.ts +44 -0
- package/test/examples/flappy_bird/browser-entry/playback/playback.starfield.service.ts +39 -122
- package/test/examples/flappy_bird/browser-entry/playback/playback.starfield.services.ts +272 -0
- package/test/examples/flappy_bird/browser-entry/playback/playback.starfield.types.ts +62 -0
- package/test/examples/flappy_bird/browser-entry/playback/playback.starfield.utils.ts +11 -4
- package/test/examples/flappy_bird/browser-entry/playback/playback.ts +409 -8
- package/test/examples/flappy_bird/browser-entry/playback/playback.types.ts +4 -12
- package/test/examples/flappy_bird/browser-entry/runtime/README.md +235 -0
- package/test/examples/flappy_bird/browser-entry/runtime/runtime.evolution-launch.service.ts +45 -0
- package/test/examples/flappy_bird/browser-entry/runtime/runtime.lifecycle.service.ts +81 -0
- package/test/examples/flappy_bird/browser-entry/runtime/runtime.startup.service.ts +74 -0
- package/test/examples/flappy_bird/browser-entry/runtime/runtime.ts +31 -121
- package/test/examples/flappy_bird/browser-entry/runtime/runtime.types.ts +36 -0
- package/test/examples/flappy_bird/browser-entry/visualization/README.md +557 -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 +957 -19
- package/test/examples/flappy_bird/browser-entry/visualization/visualization.legend.utils.ts +138 -3
- package/test/examples/flappy_bird/browser-entry/visualization/visualization.topology.utils.ts +3 -27
- package/test/examples/flappy_bird/browser-entry/visualization/visualization.ts +1 -23
- package/test/examples/flappy_bird/browser-entry/worker-channel/README.md +156 -0
- package/test/examples/flappy_bird/constants/README.md +1179 -0
- package/test/examples/flappy_bird/constants/constants.network-view.ts +24 -0
- package/test/examples/flappy_bird/constants/constants.palette.ts +7 -0
- package/test/examples/flappy_bird/constants/constants.starfield.ts +78 -3
- package/test/examples/flappy_bird/environment/README.md +143 -0
- package/test/examples/flappy_bird/environment/environment.observation.utils.ts +1 -19
- package/test/examples/flappy_bird/environment/environment.step.service.ts +3 -66
- package/test/examples/flappy_bird/evaluation/README.md +130 -0
- package/test/examples/flappy_bird/evaluation/evaluation.fitness.utils.ts +1 -1
- package/test/examples/flappy_bird/evaluation/evaluation.rollout.service.ts +5 -375
- package/test/examples/flappy_bird/evaluation/rollout/README.md +291 -0
- package/test/examples/flappy_bird/evaluation/rollout/evaluation.rollout.constants.ts +30 -0
- package/test/examples/flappy_bird/evaluation/rollout/evaluation.rollout.service.ts +58 -0
- package/test/examples/flappy_bird/evaluation/rollout/evaluation.rollout.services.ts +310 -0
- package/test/examples/flappy_bird/evaluation/rollout/evaluation.rollout.types.ts +56 -0
- package/test/examples/flappy_bird/evaluation/rollout/evaluation.rollout.utils.ts +368 -0
- package/test/examples/flappy_bird/flappy-evolution-worker/README.md +618 -0
- package/test/examples/flappy_bird/flappy-evolution-worker/flappy-evolution-worker.playback.service.ts +7 -7
- package/test/examples/flappy_bird/flappy-evolution-worker/flappy-evolution-worker.simulation.frame.service.ts +364 -0
- package/test/examples/flappy_bird/flappy-evolution-worker/flappy-evolution-worker.simulation.types.ts +14 -0
- package/test/examples/flappy_bird/flappy-evolution-worker/flappy-evolution-worker.simulation.utils.ts +4 -201
- package/test/examples/flappy_bird/flappy-evolution-worker/flappy-evolution-worker.ts +184 -345
- package/test/examples/flappy_bird/flappy-evolution-worker/flappy-evolution-worker.warm-start.service.ts +291 -0
- package/test/examples/flappy_bird/flappy.simulation.shared.utils.ts +5 -0
- package/test/examples/flappy_bird/simulation-shared/README.md +417 -0
- package/test/examples/flappy_bird/simulation-shared/observation/README.md +183 -0
- package/test/examples/flappy_bird/simulation-shared/observation/observation.features.utils.ts +301 -0
- package/test/examples/flappy_bird/simulation-shared/observation/observation.ts +9 -0
- package/test/examples/flappy_bird/simulation-shared/observation/observation.vector.utils.ts +59 -0
- package/test/examples/flappy_bird/simulation-shared/simulation-shared.observation.utils.ts +5 -403
- package/test/examples/flappy_bird/simulation-shared/simulation-shared.spawn.utils.ts +20 -6
- package/test/examples/flappy_bird/{evaluation/evaluation.statistics.utils.ts → simulation-shared/simulation-shared.statistics.utils.ts} +23 -8
- package/test/examples/flappy_bird/trainer/README.md +563 -0
- package/test/examples/flappy_bird/trainer/evaluation/README.md +199 -0
- package/test/examples/flappy_bird/trainer/evaluation/trainer.evaluation.service.constants.ts +9 -0
- package/test/examples/flappy_bird/trainer/evaluation/trainer.evaluation.service.services.ts +73 -0
- package/test/examples/flappy_bird/trainer/evaluation/trainer.evaluation.service.ts +165 -0
- package/test/examples/flappy_bird/trainer/evaluation/trainer.evaluation.service.types.ts +25 -0
- package/test/examples/flappy_bird/trainer/evaluation/trainer.evaluation.service.utils.ts +161 -0
- package/test/examples/flappy_bird/trainer/trainer.evaluation.service.ts +13 -0
- package/test/examples/flappy_bird/trainer/trainer.report.service.services.ts +181 -0
- package/test/examples/flappy_bird/trainer/trainer.report.service.ts +126 -0
- package/test/examples/flappy_bird/trainer/trainer.selection.utils.ts +89 -0
- package/test/examples/flappy_bird/trainer/trainer.ts +11 -553
- 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,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.
|
|
@@ -90,529 +71,6 @@ export async function runTrainer(): Promise<void> {
|
|
|
90
71
|
console.log(FLAPPY_TRAINER_STOPPED_MESSAGE);
|
|
91
72
|
}
|
|
92
73
|
|
|
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
74
|
/**
|
|
617
75
|
* Handles fatal `main` rejection path.
|
|
618
76
|
*/
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
export * from './browser-entry.math.utils';
|
|
2
|
-
export * from './browser-entry.host.utils';
|
|
3
|
-
export * from './browser-entry.network-view.utils';
|
|
4
|
-
export * from './browser-entry.observation.utils';
|
|
5
|
-
export * from './browser-entry.playback.utils';
|
|
6
|
-
export * from './browser-entry.spawn.utils';
|
|
7
|
-
export * from './browser-entry.stats.utils';
|
|
8
|
-
export * from './browser-entry.telemetry.utils';
|
|
9
|
-
export * from './browser-entry.text-frame.utils';
|
|
10
|
-
export * from './browser-entry.viewport.utils';
|
|
11
|
-
export * from './browser-entry.visualization.utils';
|
|
12
|
-
export * from './browser-entry.worker-channel.utils';
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Shared simulation public entry.
|
|
3
|
-
*
|
|
4
|
-
* This compatibility façade re-exports shared simulation utilities while
|
|
5
|
-
* `flappy.simulation.shared.utils.ts` is decomposed into focused modules.
|
|
6
|
-
*/
|
|
7
|
-
export * from './simulation-shared.constants';
|
|
8
|
-
export * from './simulation-shared.control.utils';
|
|
9
|
-
export * from './simulation-shared.difficulty.utils';
|
|
10
|
-
export * from './simulation-shared.errors';
|
|
11
|
-
export * from './simulation-shared.math.utils';
|
|
12
|
-
export * from './simulation-shared.memory.utils';
|
|
13
|
-
export * from './simulation-shared.observation.utils';
|
|
14
|
-
export * from './simulation-shared.spawn.utils';
|
|
15
|
-
export * from './simulation-shared.types';
|
|
@@ -1,78 +0,0 @@
|
|
|
1
|
-
import { clampValue } from '../flappy.simulation.shared.utils';
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Computes the arithmetic mean of numeric samples.
|
|
5
|
-
*
|
|
6
|
-
* @param values - Numeric samples.
|
|
7
|
-
* @returns Arithmetic mean.
|
|
8
|
-
*/
|
|
9
|
-
export function computeMean(values: readonly number[]): number {
|
|
10
|
-
if (values.length === 0) return 0;
|
|
11
|
-
return (
|
|
12
|
-
values.reduce(function accumulate(sumValue, currentValue): number {
|
|
13
|
-
return sumValue + currentValue;
|
|
14
|
-
}, 0) / values.length
|
|
15
|
-
);
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
/**
|
|
19
|
-
* Computes population standard deviation from numeric samples.
|
|
20
|
-
*
|
|
21
|
-
* @param values - Numeric samples.
|
|
22
|
-
* @param meanValue - Precomputed mean.
|
|
23
|
-
* @returns Population standard deviation.
|
|
24
|
-
*/
|
|
25
|
-
export function computePopulationStandardDeviation(
|
|
26
|
-
values: readonly number[],
|
|
27
|
-
meanValue: number,
|
|
28
|
-
): number {
|
|
29
|
-
if (values.length === 0) return 0;
|
|
30
|
-
|
|
31
|
-
const variance =
|
|
32
|
-
values.reduce(function accumulateVariance(sumValue, currentValue): number {
|
|
33
|
-
const deltaFromMean = currentValue - meanValue;
|
|
34
|
-
return sumValue + deltaFromMean * deltaFromMean;
|
|
35
|
-
}, 0) / values.length;
|
|
36
|
-
|
|
37
|
-
return Math.sqrt(Math.max(0, variance));
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
/**
|
|
41
|
-
* Computes an interpolated percentile value.
|
|
42
|
-
*
|
|
43
|
-
* @param values - Numeric samples.
|
|
44
|
-
* @param percentile - Percentile in [0, 1].
|
|
45
|
-
* @returns Interpolated percentile value.
|
|
46
|
-
*/
|
|
47
|
-
export function computePercentile(
|
|
48
|
-
values: readonly number[],
|
|
49
|
-
percentile: number,
|
|
50
|
-
): number {
|
|
51
|
-
if (values.length === 0) return Number.NaN;
|
|
52
|
-
|
|
53
|
-
const sortedValues = values.toSorted(compareNumbersAscending);
|
|
54
|
-
|
|
55
|
-
const clampedPercentile = clampValue(percentile, 0, 1);
|
|
56
|
-
const percentileIndex = clampedPercentile * (sortedValues.length - 1);
|
|
57
|
-
const lowerIndex = Math.floor(percentileIndex);
|
|
58
|
-
const upperIndex = Math.ceil(percentileIndex);
|
|
59
|
-
const interpolationWeight = percentileIndex - lowerIndex;
|
|
60
|
-
|
|
61
|
-
const lowerValue = sortedValues[lowerIndex] ?? sortedValues[0] ?? Number.NaN;
|
|
62
|
-
const upperValue = sortedValues[upperIndex] ?? lowerValue;
|
|
63
|
-
return lowerValue + (upperValue - lowerValue) * interpolationWeight;
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
/**
|
|
67
|
-
* Numeric ascending comparator.
|
|
68
|
-
*
|
|
69
|
-
* @param leftValue - Left numeric value.
|
|
70
|
-
* @param rightValue - Right numeric value.
|
|
71
|
-
* @returns Ascending comparator delta.
|
|
72
|
-
*/
|
|
73
|
-
export function compareNumbersAscending(
|
|
74
|
-
leftValue: number,
|
|
75
|
-
rightValue: number,
|
|
76
|
-
): number {
|
|
77
|
-
return leftValue - rightValue;
|
|
78
|
-
}
|