@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,399 +1,6 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
drawWeightedConnectionsLayer as drawWeightedConnections,
|
|
8
|
-
} from './visualization/visualization.draw.service';
|
|
9
|
-
import { resolveDefaultNetworkLegendLayout } from './visualization/visualization.legend.utils';
|
|
10
|
-
import { resolveNetworkVisualizationLayers } from './visualization/visualization';
|
|
11
|
-
import {
|
|
12
|
-
FLAPPY_NETWORK_BASELINE_HEIGHT_PX,
|
|
13
|
-
FLAPPY_NETWORK_GRAPH_BOTTOM_PADDING_PX,
|
|
14
|
-
FLAPPY_NETWORK_GRAPH_INNER_PADDING_PX,
|
|
15
|
-
FLAPPY_NETWORK_GRAPH_LEFT_PADDING_PX,
|
|
16
|
-
FLAPPY_NETWORK_GRAPH_RIGHT_PADDING_PX,
|
|
17
|
-
FLAPPY_NETWORK_GRAPH_TOP_PADDING_PX,
|
|
18
|
-
FLAPPY_NETWORK_INPUT_GROUP_LABEL_BAND_GAP_PX,
|
|
19
|
-
FLAPPY_NETWORK_INPUT_GROUP_LABEL_BAND_WIDTH_PX,
|
|
20
|
-
FLAPPY_NETWORK_INPUT_LAYER_TARGET_GAP_PX,
|
|
21
|
-
FLAPPY_NETWORK_LAYER_COMPLEXITY_HEIGHT_STEP_PX,
|
|
22
|
-
FLAPPY_NETWORK_LEGEND_GRAPH_GAP_PX,
|
|
23
|
-
FLAPPY_NETWORK_MAX_HEIGHT_PX,
|
|
24
|
-
FLAPPY_NETWORK_MAX_NODE_HEIGHT_PX,
|
|
25
|
-
FLAPPY_NETWORK_MAX_NODE_WIDTH_PX,
|
|
26
|
-
FLAPPY_NETWORK_MIN_HEIGHT_PX,
|
|
27
|
-
FLAPPY_NETWORK_MIN_INTER_NODE_GAP_PX,
|
|
28
|
-
FLAPPY_NETWORK_MIN_LABEL_HEIGHT_PX,
|
|
29
|
-
FLAPPY_NETWORK_MIN_NODE_INNER_PADDING_PX,
|
|
30
|
-
FLAPPY_NETWORK_MIN_NODE_HEIGHT_LABEL_EXTRA_PX,
|
|
31
|
-
FLAPPY_NETWORK_MIN_NODE_WIDTH_PX,
|
|
32
|
-
FLAPPY_NETWORK_NODE_DENSITY_HEIGHT_STEP_PX,
|
|
33
|
-
FLAPPY_NETWORK_NODE_DENSITY_BASELINE_COUNT,
|
|
34
|
-
FLAPPY_NETWORK_NODE_HEIGHT_DENSITY_DIVISOR,
|
|
35
|
-
FLAPPY_NETWORK_NODE_HEIGHT_DENSITY_MIN_DENOMINATOR,
|
|
36
|
-
FLAPPY_NETWORK_NODE_HEIGHT_LAYER_WIDTH_DIVISOR,
|
|
37
|
-
FLAPPY_NETWORK_NODE_HEIGHT_LAYER_WIDTH_MIN_DENOMINATOR,
|
|
38
|
-
FLAPPY_NETWORK_NODE_LAYOUT_PADDING_PX,
|
|
39
|
-
FLAPPY_NETWORK_NODE_WIDTH_LAYER_WIDTH_DIVISOR,
|
|
40
|
-
FLAPPY_NETWORK_NODE_WIDTH_LAYER_WIDTH_MIN_DENOMINATOR,
|
|
41
|
-
FLAPPY_NETWORK_NODE_WIDTH_TO_HEIGHT_RATIO,
|
|
42
|
-
FLAPPY_NETWORK_TOPOLOGY_HEIGHT_MULTIPLIER,
|
|
43
|
-
FLAPPY_UI_NETWORK_CANVAS_BACKGROUND,
|
|
44
|
-
FLAPPY_VIEWPORT_NETWORK_OVERLAY_HIDDEN_BREAKPOINT_PX,
|
|
45
|
-
FLAPPY_NETWORK_LAYER_COMPLEXITY_BASELINE_COUNT,
|
|
46
|
-
} from '../constants/constants';
|
|
47
|
-
import type {
|
|
48
|
-
NetworkNodeDimensionsLike as NetworkNodeDimensions,
|
|
49
|
-
PositionedNetworkNodeLike as PositionedNetworkNode,
|
|
50
|
-
VisualNetworkConnectionLike,
|
|
51
|
-
VisualNetworkNodeLike,
|
|
52
|
-
} from './browser-entry.types';
|
|
53
|
-
import {
|
|
54
|
-
centerPositionedNodesInDrawableArea,
|
|
55
|
-
positionNetworkNodes,
|
|
56
|
-
} from './network-view/network-view.layout.utils';
|
|
57
|
-
import { drawInputGroupLabelBands } from './network-view/network-view.draw.service';
|
|
58
|
-
|
|
59
|
-
/**
|
|
60
|
-
* Draws a complete, layer-based visualization of the active network.
|
|
61
|
-
*
|
|
62
|
-
* @param context - Canvas 2D drawing context.
|
|
63
|
-
* @param network - Network to visualize.
|
|
64
|
-
* @param inputSize - Input-layer size.
|
|
65
|
-
* @param outputSize - Output-layer size.
|
|
66
|
-
* @returns Nothing.
|
|
67
|
-
*/
|
|
68
|
-
export function drawNetworkVisualizationInternal(
|
|
69
|
-
context: CanvasRenderingContext2D,
|
|
70
|
-
network: Network | undefined,
|
|
71
|
-
inputSize: number,
|
|
72
|
-
outputSize: number,
|
|
73
|
-
): void {
|
|
74
|
-
// Step 1: Clear the canvas and paint visualization background.
|
|
75
|
-
const canvasWidthPx = context.canvas.width;
|
|
76
|
-
const canvasHeightPx = context.canvas.height;
|
|
77
|
-
context.clearRect(0, 0, canvasWidthPx, canvasHeightPx);
|
|
78
|
-
|
|
79
|
-
context.fillStyle = FLAPPY_UI_NETWORK_CANVAS_BACKGROUND;
|
|
80
|
-
context.fillRect(0, 0, canvasWidthPx, canvasHeightPx);
|
|
81
|
-
|
|
82
|
-
// Step 2: Resolve architecture label and base graph paddings.
|
|
83
|
-
const architectureLabel = resolveNetworkArchitectureLabelInternal(
|
|
84
|
-
network,
|
|
85
|
-
inputSize,
|
|
86
|
-
outputSize,
|
|
87
|
-
);
|
|
88
|
-
|
|
89
|
-
const groupLabelBandReserveWidthPx =
|
|
90
|
-
FLAPPY_NETWORK_INPUT_GROUP_LABEL_BAND_WIDTH_PX +
|
|
91
|
-
FLAPPY_NETWORK_INPUT_GROUP_LABEL_BAND_GAP_PX +
|
|
92
|
-
FLAPPY_NETWORK_NODE_LAYOUT_PADDING_PX;
|
|
93
|
-
const graphLeftPaddingPx =
|
|
94
|
-
FLAPPY_NETWORK_GRAPH_LEFT_PADDING_PX + groupLabelBandReserveWidthPx;
|
|
95
|
-
const graphTopPaddingPx = FLAPPY_NETWORK_GRAPH_TOP_PADDING_PX;
|
|
96
|
-
const graphRightPaddingPx = FLAPPY_NETWORK_GRAPH_RIGHT_PADDING_PX;
|
|
97
|
-
const graphBottomPaddingPx = FLAPPY_NETWORK_GRAPH_BOTTOM_PADDING_PX;
|
|
98
|
-
const legendGraphGapPx = FLAPPY_NETWORK_LEGEND_GRAPH_GAP_PX;
|
|
99
|
-
const viewportWidthPx =
|
|
100
|
-
context.canvas.ownerDocument?.defaultView?.innerWidth ?? canvasWidthPx;
|
|
101
|
-
const hideNetworkOverlays =
|
|
102
|
-
viewportWidthPx < FLAPPY_VIEWPORT_NETWORK_OVERLAY_HIDDEN_BREAKPOINT_PX;
|
|
103
|
-
const nodeLayoutPaddingPx = FLAPPY_NETWORK_NODE_LAYOUT_PADDING_PX;
|
|
104
|
-
const minimumLabelHeightPx = FLAPPY_NETWORK_MIN_LABEL_HEIGHT_PX;
|
|
105
|
-
const minimumNodeHeightPx =
|
|
106
|
-
minimumLabelHeightPx + FLAPPY_NETWORK_MIN_NODE_HEIGHT_LABEL_EXTRA_PX;
|
|
107
|
-
const minimumNodeWidthPx = FLAPPY_NETWORK_MIN_NODE_WIDTH_PX;
|
|
108
|
-
const colorScales = resolveNetworkVisualizationColorScales(network);
|
|
109
|
-
|
|
110
|
-
// Step 3: Resolve legend layout and reserve horizontal graph space around it.
|
|
111
|
-
let adjustedGraphLeftPaddingPx = graphLeftPaddingPx;
|
|
112
|
-
let adjustedGraphRightPaddingPx = graphRightPaddingPx;
|
|
113
|
-
if (!hideNetworkOverlays) {
|
|
114
|
-
const legendLayout = resolveDefaultNetworkLegendLayout(context, network);
|
|
115
|
-
const legendMidpointPx =
|
|
116
|
-
legendLayout.legendLeftPx + legendLayout.legendWidthPx * 0.5;
|
|
117
|
-
if (legendMidpointPx >= canvasWidthPx * 0.5) {
|
|
118
|
-
adjustedGraphRightPaddingPx = Math.max(
|
|
119
|
-
graphRightPaddingPx,
|
|
120
|
-
canvasWidthPx - legendLayout.legendLeftPx + legendGraphGapPx,
|
|
121
|
-
);
|
|
122
|
-
} else {
|
|
123
|
-
adjustedGraphLeftPaddingPx = Math.max(
|
|
124
|
-
graphLeftPaddingPx,
|
|
125
|
-
legendLayout.legendLeftPx +
|
|
126
|
-
legendLayout.legendWidthPx +
|
|
127
|
-
legendGraphGapPx,
|
|
128
|
-
);
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
// Step 4: Resolve drawable graph bounds.
|
|
133
|
-
const drawableWidthPx = Math.max(
|
|
134
|
-
1,
|
|
135
|
-
canvasWidthPx - adjustedGraphLeftPaddingPx - adjustedGraphRightPaddingPx,
|
|
136
|
-
);
|
|
137
|
-
const drawableHeightPx = Math.max(
|
|
138
|
-
1,
|
|
139
|
-
canvasHeightPx - graphTopPaddingPx - graphBottomPaddingPx,
|
|
140
|
-
);
|
|
141
|
-
|
|
142
|
-
// Step 5: Resolve network layers and dynamic node dimensions.
|
|
143
|
-
const networkLayers = resolveNetworkVisualizationLayers(
|
|
144
|
-
network,
|
|
145
|
-
inputSize,
|
|
146
|
-
outputSize,
|
|
147
|
-
);
|
|
148
|
-
const maxLayerNodeCount = Math.max(
|
|
149
|
-
1,
|
|
150
|
-
...networkLayers.map((layerNodes) => layerNodes.length),
|
|
151
|
-
);
|
|
152
|
-
const layerCount = Math.max(1, networkLayers.length);
|
|
153
|
-
const availableNodeStackHeightPx = Math.max(
|
|
154
|
-
1,
|
|
155
|
-
drawableHeightPx - nodeLayoutPaddingPx * 2,
|
|
156
|
-
);
|
|
157
|
-
const strictMaximumNodeHeightByFitPx = Math.max(
|
|
158
|
-
4,
|
|
159
|
-
availableNodeStackHeightPx / maxLayerNodeCount,
|
|
160
|
-
);
|
|
161
|
-
const effectiveMinimumNodeHeightPx = Math.min(
|
|
162
|
-
minimumNodeHeightPx,
|
|
163
|
-
strictMaximumNodeHeightByFitPx,
|
|
164
|
-
);
|
|
165
|
-
const nodeHeightPx = Math.max(
|
|
166
|
-
effectiveMinimumNodeHeightPx,
|
|
167
|
-
Math.min(
|
|
168
|
-
FLAPPY_NETWORK_MAX_NODE_HEIGHT_PX,
|
|
169
|
-
(drawableHeightPx - nodeLayoutPaddingPx * 2) /
|
|
170
|
-
Math.max(
|
|
171
|
-
FLAPPY_NETWORK_NODE_HEIGHT_DENSITY_MIN_DENOMINATOR,
|
|
172
|
-
maxLayerNodeCount * FLAPPY_NETWORK_NODE_HEIGHT_DENSITY_DIVISOR,
|
|
173
|
-
),
|
|
174
|
-
drawableWidthPx /
|
|
175
|
-
Math.max(
|
|
176
|
-
FLAPPY_NETWORK_NODE_HEIGHT_LAYER_WIDTH_MIN_DENOMINATOR,
|
|
177
|
-
layerCount * FLAPPY_NETWORK_NODE_HEIGHT_LAYER_WIDTH_DIVISOR,
|
|
178
|
-
),
|
|
179
|
-
strictMaximumNodeHeightByFitPx,
|
|
180
|
-
),
|
|
181
|
-
);
|
|
182
|
-
const nodeWidthPx = Math.max(
|
|
183
|
-
minimumNodeWidthPx,
|
|
184
|
-
Math.min(
|
|
185
|
-
FLAPPY_NETWORK_MAX_NODE_WIDTH_PX,
|
|
186
|
-
nodeHeightPx * FLAPPY_NETWORK_NODE_WIDTH_TO_HEIGHT_RATIO,
|
|
187
|
-
drawableWidthPx /
|
|
188
|
-
Math.max(
|
|
189
|
-
FLAPPY_NETWORK_NODE_WIDTH_LAYER_WIDTH_MIN_DENOMINATOR,
|
|
190
|
-
layerCount * FLAPPY_NETWORK_NODE_WIDTH_LAYER_WIDTH_DIVISOR,
|
|
191
|
-
),
|
|
192
|
-
),
|
|
193
|
-
);
|
|
194
|
-
const nodeDimensions: NetworkNodeDimensions = {
|
|
195
|
-
widthPx: nodeWidthPx,
|
|
196
|
-
heightPx: nodeHeightPx,
|
|
197
|
-
};
|
|
198
|
-
|
|
199
|
-
// Step 6: Position nodes and build node-index lookup map.
|
|
200
|
-
const positionedNodes = positionNetworkNodes(
|
|
201
|
-
networkLayers,
|
|
202
|
-
adjustedGraphLeftPaddingPx,
|
|
203
|
-
graphTopPaddingPx,
|
|
204
|
-
drawableWidthPx,
|
|
205
|
-
drawableHeightPx,
|
|
206
|
-
nodeLayoutPaddingPx,
|
|
207
|
-
nodeDimensions,
|
|
208
|
-
);
|
|
209
|
-
const centeredPositionedNodes = centerPositionedNodesInDrawableArea(
|
|
210
|
-
positionedNodes,
|
|
211
|
-
adjustedGraphLeftPaddingPx,
|
|
212
|
-
graphTopPaddingPx,
|
|
213
|
-
drawableWidthPx,
|
|
214
|
-
drawableHeightPx,
|
|
215
|
-
nodeLayoutPaddingPx,
|
|
216
|
-
nodeDimensions,
|
|
217
|
-
);
|
|
218
|
-
const positionByNodeIndex = new Map<number, PositionedNetworkNode>(
|
|
219
|
-
centeredPositionedNodes.map((positionedNode) => [
|
|
220
|
-
positionedNode.node.index,
|
|
221
|
-
positionedNode,
|
|
222
|
-
]),
|
|
223
|
-
);
|
|
224
|
-
|
|
225
|
-
const runtimeConnections =
|
|
226
|
-
((network?.connections ?? []) as VisualNetworkConnectionLike[]) ?? [];
|
|
227
|
-
|
|
228
|
-
// Step 7: Draw connections, nodes, and legend (with architecture text above it).
|
|
229
|
-
drawWeightedConnections(
|
|
230
|
-
context,
|
|
231
|
-
runtimeConnections,
|
|
232
|
-
positionByNodeIndex,
|
|
233
|
-
colorScales.connectionScale,
|
|
234
|
-
);
|
|
235
|
-
if (!hideNetworkOverlays) {
|
|
236
|
-
drawInputGroupLabelBands(context, centeredPositionedNodes, nodeDimensions);
|
|
237
|
-
}
|
|
238
|
-
drawBiasNodes(
|
|
239
|
-
context,
|
|
240
|
-
centeredPositionedNodes,
|
|
241
|
-
nodeDimensions,
|
|
242
|
-
colorScales.biasScale,
|
|
243
|
-
);
|
|
244
|
-
drawNetworkColorLegend(context, architectureLabel, colorScales);
|
|
245
|
-
}
|
|
246
|
-
|
|
247
|
-
/**
|
|
248
|
-
* Resolves the recommended network visualization host height.
|
|
249
|
-
*
|
|
250
|
-
* @param network - Network to visualize.
|
|
251
|
-
* @param inputSize - Input-layer size.
|
|
252
|
-
* @param outputSize - Output-layer size.
|
|
253
|
-
* @returns Recommended height in pixels.
|
|
254
|
-
*/
|
|
255
|
-
export function resolveNetworkVisualizationHeightPxInternal(
|
|
256
|
-
network: Network | undefined,
|
|
257
|
-
inputSize: number,
|
|
258
|
-
outputSize: number,
|
|
259
|
-
): number {
|
|
260
|
-
// Step 1: Resolve readability baselines and graph paddings.
|
|
261
|
-
const minimumLabelHeightPx = FLAPPY_NETWORK_MIN_LABEL_HEIGHT_PX;
|
|
262
|
-
const minimumNodeInnerPaddingPx = FLAPPY_NETWORK_MIN_NODE_INNER_PADDING_PX;
|
|
263
|
-
const minimumInterNodeGapPx = FLAPPY_NETWORK_MIN_INTER_NODE_GAP_PX;
|
|
264
|
-
const minimumNodeSidePx =
|
|
265
|
-
minimumLabelHeightPx + minimumNodeInnerPaddingPx * 2;
|
|
266
|
-
const graphTopPaddingPx = FLAPPY_NETWORK_GRAPH_TOP_PADDING_PX;
|
|
267
|
-
const graphBottomPaddingPx = FLAPPY_NETWORK_GRAPH_BOTTOM_PADDING_PX;
|
|
268
|
-
const graphInnerPaddingPx = FLAPPY_NETWORK_GRAPH_INNER_PADDING_PX;
|
|
269
|
-
const layers = resolveNetworkVisualizationLayers(
|
|
270
|
-
network,
|
|
271
|
-
inputSize,
|
|
272
|
-
outputSize,
|
|
273
|
-
);
|
|
274
|
-
const layerCount = Math.max(1, layers.length);
|
|
275
|
-
const maxLayerNodeCount = Math.max(
|
|
276
|
-
1,
|
|
277
|
-
...layers.map((layerNodes) => layerNodes.length),
|
|
278
|
-
);
|
|
279
|
-
|
|
280
|
-
// Step 2: Compute topology-driven minimum readable height.
|
|
281
|
-
const minimumReadableStackHeightPx =
|
|
282
|
-
maxLayerNodeCount <= 1
|
|
283
|
-
? minimumNodeSidePx
|
|
284
|
-
: maxLayerNodeCount * minimumNodeSidePx +
|
|
285
|
-
(maxLayerNodeCount - 1) * minimumInterNodeGapPx;
|
|
286
|
-
const topologyDrivenHeightPx =
|
|
287
|
-
graphTopPaddingPx +
|
|
288
|
-
graphBottomPaddingPx +
|
|
289
|
-
graphInnerPaddingPx +
|
|
290
|
-
minimumReadableStackHeightPx;
|
|
291
|
-
|
|
292
|
-
// Step 3: Add complexity-based height adjustments and choose the max.
|
|
293
|
-
const baselineHeightPx = FLAPPY_NETWORK_BASELINE_HEIGHT_PX;
|
|
294
|
-
const nodeDensityHeightPx =
|
|
295
|
-
Math.max(
|
|
296
|
-
0,
|
|
297
|
-
maxLayerNodeCount - FLAPPY_NETWORK_NODE_DENSITY_BASELINE_COUNT,
|
|
298
|
-
) * FLAPPY_NETWORK_NODE_DENSITY_HEIGHT_STEP_PX;
|
|
299
|
-
const layerComplexityHeightPx =
|
|
300
|
-
Math.max(0, layerCount - FLAPPY_NETWORK_LAYER_COMPLEXITY_BASELINE_COUNT) *
|
|
301
|
-
FLAPPY_NETWORK_LAYER_COMPLEXITY_HEIGHT_STEP_PX;
|
|
302
|
-
const recommendedHeightPx = Math.max(
|
|
303
|
-
Math.ceil(
|
|
304
|
-
topologyDrivenHeightPx * FLAPPY_NETWORK_TOPOLOGY_HEIGHT_MULTIPLIER,
|
|
305
|
-
),
|
|
306
|
-
baselineHeightPx + nodeDensityHeightPx + layerComplexityHeightPx,
|
|
307
|
-
);
|
|
308
|
-
|
|
309
|
-
// Step 4: Clamp final height to configured min/max bounds.
|
|
310
|
-
return Math.floor(
|
|
311
|
-
clamp(
|
|
312
|
-
recommendedHeightPx,
|
|
313
|
-
FLAPPY_NETWORK_MIN_HEIGHT_PX,
|
|
314
|
-
FLAPPY_NETWORK_MAX_HEIGHT_PX,
|
|
315
|
-
),
|
|
316
|
-
);
|
|
317
|
-
}
|
|
318
|
-
|
|
319
|
-
/**
|
|
320
|
-
* Produces a concise neural-network architecture label.
|
|
321
|
-
*
|
|
322
|
-
* @param network - Network to describe.
|
|
323
|
-
* @param inputSize - Configured input size.
|
|
324
|
-
* @param outputSize - Configured output size.
|
|
325
|
-
* @returns Readable architecture label.
|
|
326
|
-
*/
|
|
327
|
-
export function resolveNetworkArchitectureLabelInternal(
|
|
328
|
-
network: Network | undefined,
|
|
329
|
-
inputSize: number,
|
|
330
|
-
outputSize: number,
|
|
331
|
-
): string {
|
|
332
|
-
if (!network) {
|
|
333
|
-
return formatArchitectureLabel(
|
|
334
|
-
inputSize,
|
|
335
|
-
'-',
|
|
336
|
-
outputSize,
|
|
337
|
-
inputSize + outputSize,
|
|
338
|
-
0,
|
|
339
|
-
);
|
|
340
|
-
}
|
|
341
|
-
|
|
342
|
-
const architectureDescriptor = network.describeArchitecture();
|
|
343
|
-
const hiddenLayersLabel = resolveHiddenLayersLabel(
|
|
344
|
-
architectureDescriptor.hiddenLayerSizes,
|
|
345
|
-
architectureDescriptor.source,
|
|
346
|
-
);
|
|
347
|
-
|
|
348
|
-
return formatArchitectureLabel(
|
|
349
|
-
inputSize,
|
|
350
|
-
hiddenLayersLabel,
|
|
351
|
-
outputSize,
|
|
352
|
-
architectureDescriptor.totalNodes,
|
|
353
|
-
architectureDescriptor.totalConnections,
|
|
354
|
-
);
|
|
355
|
-
}
|
|
356
|
-
|
|
357
|
-
/**
|
|
358
|
-
* Formats architecture label text.
|
|
359
|
-
*
|
|
360
|
-
* @param architectureInputSize - Input-layer size.
|
|
361
|
-
* @param hiddenLayersLabel - Hidden-layer section.
|
|
362
|
-
* @param architectureOutputSize - Output-layer size.
|
|
363
|
-
* @param totalNodeCount - Total node count.
|
|
364
|
-
* @param totalConnectionCount - Total connection count.
|
|
365
|
-
* @returns Formatted label.
|
|
366
|
-
*/
|
|
367
|
-
function formatArchitectureLabel(
|
|
368
|
-
architectureInputSize: number,
|
|
369
|
-
hiddenLayersLabel: string,
|
|
370
|
-
architectureOutputSize: number,
|
|
371
|
-
totalNodeCount: number,
|
|
372
|
-
totalConnectionCount: number,
|
|
373
|
-
): string {
|
|
374
|
-
return `${architectureInputSize} | ${hiddenLayersLabel} | ${architectureOutputSize}\n(${totalNodeCount} nodes, ${totalConnectionCount} connections)`;
|
|
375
|
-
}
|
|
376
|
-
|
|
377
|
-
/**
|
|
378
|
-
* Formats hidden-layer section by descriptor source.
|
|
379
|
-
*
|
|
380
|
-
* @param hiddenLayerSizes - Hidden-layer widths.
|
|
381
|
-
* @param architectureSource - Descriptor provenance.
|
|
382
|
-
* @returns Hidden-layer label section.
|
|
383
|
-
*/
|
|
384
|
-
function resolveHiddenLayersLabel(
|
|
385
|
-
hiddenLayerSizes: number[],
|
|
386
|
-
architectureSource: 'layer-metadata' | 'graph-topology' | 'inferred',
|
|
387
|
-
): string {
|
|
388
|
-
if (hiddenLayerSizes.length === 0) {
|
|
389
|
-
return '-';
|
|
390
|
-
}
|
|
391
|
-
|
|
392
|
-
if (architectureSource === 'inferred') {
|
|
393
|
-
return hiddenLayerSizes
|
|
394
|
-
.map((hiddenLayerSize) => `~${hiddenLayerSize}`)
|
|
395
|
-
.join(' - ');
|
|
396
|
-
}
|
|
397
|
-
|
|
398
|
-
return hiddenLayerSizes.join(' - ');
|
|
399
|
-
}
|
|
1
|
+
export {
|
|
2
|
+
drawNetworkVisualization as drawNetworkVisualizationInternal,
|
|
3
|
+
resolveNetworkArchitectureLabel as resolveNetworkArchitectureLabelInternal,
|
|
4
|
+
resolveNetworkVisualizationHeightPx as resolveNetworkVisualizationHeightPxInternal,
|
|
5
|
+
} from './network-view/network-view';
|
|
6
|
+
export { resolveNetworkVisualizationLayers } from './network-view/network-view.topology.utils';
|