@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,9 +1,89 @@
|
|
|
1
|
-
import type
|
|
2
|
-
import
|
|
1
|
+
import type Network from '../../../../../src/architecture/network';
|
|
2
|
+
import {
|
|
3
|
+
FLAPPY_FRAME_MONOSPACE_FONT,
|
|
4
|
+
FLAPPY_HEADER_CANVAS_HEIGHT_PX,
|
|
5
|
+
FLAPPY_HEADER_TITLE_TEXT,
|
|
6
|
+
FLAPPY_NEON_PALETTE,
|
|
7
|
+
FLAPPY_SCREEN_PADDING_PX,
|
|
8
|
+
FLAPPY_UI_CANVAS_INSET_SHADOW,
|
|
9
|
+
FLAPPY_UI_CONTENT_COLUMN_TOP_PADDING_PX,
|
|
10
|
+
FLAPPY_UI_DOUBLE_PANEL_BORDER,
|
|
11
|
+
FLAPPY_UI_NETWORK_CANVAS_BACKGROUND,
|
|
12
|
+
FLAPPY_UI_NETWORK_HOST_BACKGROUND,
|
|
13
|
+
FLAPPY_UI_NETWORK_HOST_FIXED_HEIGHT_PX,
|
|
14
|
+
FLAPPY_UI_NETWORK_HOST_INITIAL_HEIGHT_PX,
|
|
15
|
+
FLAPPY_UI_NETWORK_HOST_INSET_PX,
|
|
16
|
+
FLAPPY_UI_OUTER_FRAME_BACKGROUND,
|
|
17
|
+
FLAPPY_UI_OUTER_FRAME_MIN_SIDE_PADDING_PX,
|
|
18
|
+
FLAPPY_UI_OUTER_FRAME_SIDE_PADDING_OFFSET_PX,
|
|
19
|
+
FLAPPY_UI_UNIFIED_INSET_SHADOW,
|
|
20
|
+
FLAPPY_VIEWPORT_VERTICAL_LAYOUT_GUTTER_PX,
|
|
21
|
+
FLAPPY_NETWORK_INPUT_SIZE,
|
|
22
|
+
FLAPPY_NETWORK_OUTPUT_SIZE,
|
|
23
|
+
} from '../../constants/constants';
|
|
24
|
+
import type {
|
|
25
|
+
FlappyStatsTableCells,
|
|
26
|
+
NetworkVisualizationHandle,
|
|
27
|
+
} from '../browser-entry.types';
|
|
28
|
+
import { renderStandaloneTitleBox } from '../browser-entry.text-frame.utils';
|
|
29
|
+
import {
|
|
30
|
+
drawNetworkVisualization,
|
|
31
|
+
resolveNetworkVisualizationHeightPx,
|
|
32
|
+
} from '../network-view/network-view';
|
|
33
|
+
import {
|
|
34
|
+
applyCanvasBackingSize,
|
|
35
|
+
resolveNetworkCanvasSizePx,
|
|
36
|
+
} from './host.canvas.service';
|
|
3
37
|
import {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
38
|
+
FLAPPY_HOST_PANEL_PADDING,
|
|
39
|
+
FLAPPY_HOST_PANEL_TRANSITION,
|
|
40
|
+
FLAPPY_HOST_STATS_SPLIT_GAP,
|
|
41
|
+
FLAPPY_HOST_TABLE_HOST_PADDING,
|
|
42
|
+
} from './host.constants';
|
|
43
|
+
import { resolveRequiredCanvas2dContext } from './host.dom.service';
|
|
44
|
+
import { installResponsiveViewportSizing } from './resize/host.resize.service';
|
|
45
|
+
import {
|
|
46
|
+
createAndAttachHostStatsTable,
|
|
47
|
+
updateStatsTableValues as updateHostStatsTableValues,
|
|
48
|
+
} from './host.stats.service';
|
|
49
|
+
import type { CanvasHostResult, HostStatsPartialValues } from './host.types';
|
|
50
|
+
|
|
51
|
+
type HostVisualPrimitives = {
|
|
52
|
+
unifiedBorder: string;
|
|
53
|
+
unifiedInsetShadow: string;
|
|
54
|
+
sidePaddingPx: number;
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
type HostLayoutElements = {
|
|
58
|
+
outerFrame: HTMLElement;
|
|
59
|
+
contentColumn: HTMLDivElement;
|
|
60
|
+
mainSplitContainer: HTMLDivElement;
|
|
61
|
+
statsContainer: HTMLDivElement;
|
|
62
|
+
statsSplitContainer: HTMLDivElement;
|
|
63
|
+
statsTableHost: HTMLDivElement;
|
|
64
|
+
networkCanvasHost: HTMLDivElement;
|
|
65
|
+
};
|
|
66
|
+
|
|
67
|
+
type HostCanvasElements = {
|
|
68
|
+
headerCanvas: HTMLCanvasElement;
|
|
69
|
+
headerContext: CanvasRenderingContext2D;
|
|
70
|
+
canvas: HTMLCanvasElement;
|
|
71
|
+
context: CanvasRenderingContext2D;
|
|
72
|
+
networkCanvas: HTMLCanvasElement;
|
|
73
|
+
networkContext: CanvasRenderingContext2D;
|
|
74
|
+
};
|
|
75
|
+
|
|
76
|
+
type HostNetworkVisualizationState = {
|
|
77
|
+
previousNetworkForVisualization: Network | undefined;
|
|
78
|
+
previousVisualizationInputSize: number;
|
|
79
|
+
previousVisualizationOutputSize: number;
|
|
80
|
+
};
|
|
81
|
+
|
|
82
|
+
type HostNetworkVisualizationController = {
|
|
83
|
+
renderNetworkArchitecture: NetworkVisualizationHandle['renderNetworkArchitecture'];
|
|
84
|
+
resizeNetworkCanvasToHost: () => void;
|
|
85
|
+
redrawCurrentNetworkArchitecture: () => void;
|
|
86
|
+
};
|
|
7
87
|
|
|
8
88
|
/**
|
|
9
89
|
* Builds the browser demo host tree and returns rendering handles.
|
|
@@ -17,6 +97,72 @@ export function createCanvasHost(
|
|
|
17
97
|
return createCanvasHostInternal(containerElement);
|
|
18
98
|
}
|
|
19
99
|
|
|
100
|
+
/**
|
|
101
|
+
* Builds the browser demo host tree and returns rendering handles.
|
|
102
|
+
*
|
|
103
|
+
* @param containerElement - Root host container.
|
|
104
|
+
* @returns Canvas handles, stats cells and network render callback.
|
|
105
|
+
*/
|
|
106
|
+
export function createCanvasHostInternal(
|
|
107
|
+
containerElement: HTMLElement,
|
|
108
|
+
): CanvasHostResult {
|
|
109
|
+
// Step 1: Reset the host container and resolve shared visual primitives.
|
|
110
|
+
resetHostContainer(containerElement);
|
|
111
|
+
const hostVisualPrimitives = resolveHostVisualPrimitives();
|
|
112
|
+
|
|
113
|
+
// Step 2: Create layout elements, canvases, and stats table state.
|
|
114
|
+
const hostLayoutElements = createHostLayoutElements(hostVisualPrimitives);
|
|
115
|
+
const hostCanvasElements = createHostCanvasElements(hostVisualPrimitives);
|
|
116
|
+
const statsValueByKey = createAndAttachHostStatsTable(
|
|
117
|
+
hostLayoutElements.statsTableHost,
|
|
118
|
+
);
|
|
119
|
+
|
|
120
|
+
// Step 3: Create reusable header and network visualization controllers.
|
|
121
|
+
const drawHeaderFrame = createHeaderFrameRenderer(
|
|
122
|
+
hostCanvasElements.headerCanvas,
|
|
123
|
+
hostCanvasElements.headerContext,
|
|
124
|
+
);
|
|
125
|
+
const hostNetworkVisualizationController =
|
|
126
|
+
createHostNetworkVisualizationController(
|
|
127
|
+
hostLayoutElements.networkCanvasHost,
|
|
128
|
+
hostCanvasElements.networkCanvas,
|
|
129
|
+
hostCanvasElements.networkContext,
|
|
130
|
+
);
|
|
131
|
+
|
|
132
|
+
// Step 4: Mount the host DOM tree in final order.
|
|
133
|
+
mountCanvasHostTree(
|
|
134
|
+
containerElement,
|
|
135
|
+
hostLayoutElements,
|
|
136
|
+
hostCanvasElements.headerCanvas,
|
|
137
|
+
hostCanvasElements.canvas,
|
|
138
|
+
hostCanvasElements.networkCanvas,
|
|
139
|
+
);
|
|
140
|
+
|
|
141
|
+
// Step 5: Install resize hooks that keep the header and network view in sync.
|
|
142
|
+
installCanvasHostResizeHooks(
|
|
143
|
+
hostCanvasElements.canvas,
|
|
144
|
+
hostLayoutElements,
|
|
145
|
+
hostCanvasElements.networkCanvas,
|
|
146
|
+
drawHeaderFrame,
|
|
147
|
+
hostNetworkVisualizationController,
|
|
148
|
+
);
|
|
149
|
+
|
|
150
|
+
// Step 6: Render the initial header and placeholder network visualization.
|
|
151
|
+
renderInitialCanvasHostState(
|
|
152
|
+
drawHeaderFrame,
|
|
153
|
+
hostNetworkVisualizationController.renderNetworkArchitecture,
|
|
154
|
+
);
|
|
155
|
+
|
|
156
|
+
// Step 7: Return the public host handles used by the runtime.
|
|
157
|
+
return {
|
|
158
|
+
canvas: hostCanvasElements.canvas,
|
|
159
|
+
context: hostCanvasElements.context,
|
|
160
|
+
statsValueByKey,
|
|
161
|
+
renderNetworkArchitecture:
|
|
162
|
+
hostNetworkVisualizationController.renderNetworkArchitecture,
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
|
|
20
166
|
/**
|
|
21
167
|
* Applies partial stat updates to the rendered stats table.
|
|
22
168
|
*
|
|
@@ -28,5 +174,415 @@ export function updateStatsTableValues(
|
|
|
28
174
|
statsValueByKey: FlappyStatsTableCells,
|
|
29
175
|
partialValues: HostStatsPartialValues,
|
|
30
176
|
): void {
|
|
31
|
-
|
|
177
|
+
updateHostStatsTableValues(statsValueByKey, partialValues);
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
export { updateStatsTableValues as updateStatsTableValuesInternal };
|
|
181
|
+
|
|
182
|
+
/**
|
|
183
|
+
* Clears any previous runtime DOM before rebuilding the browser host tree.
|
|
184
|
+
*
|
|
185
|
+
* @param containerElement - Root host container.
|
|
186
|
+
* @returns Nothing.
|
|
187
|
+
*/
|
|
188
|
+
function resetHostContainer(containerElement: HTMLElement): void {
|
|
189
|
+
// Step 1: Remove any prior child content before rebuilding the host tree.
|
|
190
|
+
containerElement.innerHTML = '';
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
/**
|
|
194
|
+
* Resolves shared border, shadow, and padding values for host assembly.
|
|
195
|
+
*
|
|
196
|
+
* @returns Shared visual primitives reused across host sections.
|
|
197
|
+
*/
|
|
198
|
+
function resolveHostVisualPrimitives(): HostVisualPrimitives {
|
|
199
|
+
// Step 1: Resolve the responsive outer padding used by the host frame.
|
|
200
|
+
const sidePaddingPx = Math.max(
|
|
201
|
+
FLAPPY_UI_OUTER_FRAME_MIN_SIDE_PADDING_PX,
|
|
202
|
+
FLAPPY_SCREEN_PADDING_PX - FLAPPY_UI_OUTER_FRAME_SIDE_PADDING_OFFSET_PX,
|
|
203
|
+
);
|
|
204
|
+
|
|
205
|
+
// Step 2: Return the shared border, shadow, and padding primitives.
|
|
206
|
+
return {
|
|
207
|
+
unifiedBorder: FLAPPY_UI_DOUBLE_PANEL_BORDER,
|
|
208
|
+
unifiedInsetShadow: FLAPPY_UI_UNIFIED_INSET_SHADOW,
|
|
209
|
+
sidePaddingPx,
|
|
210
|
+
};
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
/**
|
|
214
|
+
* Creates the host layout elements used to assemble the browser UI tree.
|
|
215
|
+
*
|
|
216
|
+
* @param hostVisualPrimitives - Shared visual primitives for border and shadow styling.
|
|
217
|
+
* @returns Layout elements grouped by host responsibility.
|
|
218
|
+
*/
|
|
219
|
+
function createHostLayoutElements(
|
|
220
|
+
hostVisualPrimitives: HostVisualPrimitives,
|
|
221
|
+
): HostLayoutElements {
|
|
222
|
+
// Step 1: Create and style the outer frame shell.
|
|
223
|
+
const outerFrame = document.createElement('section');
|
|
224
|
+
outerFrame.style.width = '100%';
|
|
225
|
+
outerFrame.style.height = '100%';
|
|
226
|
+
outerFrame.style.boxSizing = 'border-box';
|
|
227
|
+
outerFrame.style.padding = `0 ${hostVisualPrimitives.sidePaddingPx}px ${hostVisualPrimitives.sidePaddingPx}px ${hostVisualPrimitives.sidePaddingPx}px`;
|
|
228
|
+
outerFrame.style.border = hostVisualPrimitives.unifiedBorder;
|
|
229
|
+
outerFrame.style.background = FLAPPY_UI_OUTER_FRAME_BACKGROUND;
|
|
230
|
+
outerFrame.style.boxShadow = hostVisualPrimitives.unifiedInsetShadow;
|
|
231
|
+
outerFrame.style.position = 'relative';
|
|
232
|
+
|
|
233
|
+
// Step 2: Create the top-level content and simulation split containers.
|
|
234
|
+
const contentColumn = document.createElement('div');
|
|
235
|
+
contentColumn.style.width = '100%';
|
|
236
|
+
contentColumn.style.height = '100%';
|
|
237
|
+
contentColumn.style.display = 'flex';
|
|
238
|
+
contentColumn.style.flexDirection = 'column';
|
|
239
|
+
contentColumn.style.gap = '0';
|
|
240
|
+
contentColumn.style.alignItems = 'stretch';
|
|
241
|
+
contentColumn.style.overflow = 'hidden';
|
|
242
|
+
contentColumn.style.paddingTop = `${FLAPPY_UI_CONTENT_COLUMN_TOP_PADDING_PX}px`;
|
|
243
|
+
|
|
244
|
+
const mainSplitContainer = document.createElement('div');
|
|
245
|
+
mainSplitContainer.style.width = '100%';
|
|
246
|
+
mainSplitContainer.style.flex = '1 1 0';
|
|
247
|
+
mainSplitContainer.style.minHeight = '0';
|
|
248
|
+
mainSplitContainer.style.display = 'flex';
|
|
249
|
+
mainSplitContainer.style.flexDirection = 'column';
|
|
250
|
+
mainSplitContainer.style.alignItems = 'stretch';
|
|
251
|
+
mainSplitContainer.style.gap = `${FLAPPY_VIEWPORT_VERTICAL_LAYOUT_GUTTER_PX}px`;
|
|
252
|
+
|
|
253
|
+
// Step 3: Create the stats panel and its inner split layout.
|
|
254
|
+
const statsContainer = document.createElement('div');
|
|
255
|
+
statsContainer.style.marginTop = '0';
|
|
256
|
+
statsContainer.style.boxSizing = 'border-box';
|
|
257
|
+
statsContainer.style.background = FLAPPY_NEON_PALETTE.hudPanelBackground;
|
|
258
|
+
statsContainer.style.border = hostVisualPrimitives.unifiedBorder;
|
|
259
|
+
statsContainer.style.boxShadow = hostVisualPrimitives.unifiedInsetShadow;
|
|
260
|
+
statsContainer.style.padding = FLAPPY_HOST_PANEL_PADDING;
|
|
261
|
+
statsContainer.style.overflow = 'hidden';
|
|
262
|
+
statsContainer.style.transition = FLAPPY_HOST_PANEL_TRANSITION;
|
|
263
|
+
statsContainer.style.minHeight = '0';
|
|
264
|
+
|
|
265
|
+
const statsSplitContainer = document.createElement('div');
|
|
266
|
+
statsSplitContainer.style.display = 'flex';
|
|
267
|
+
statsSplitContainer.style.flexDirection = 'row';
|
|
268
|
+
statsSplitContainer.style.alignItems = 'flex-start';
|
|
269
|
+
statsSplitContainer.style.gap = FLAPPY_HOST_STATS_SPLIT_GAP;
|
|
270
|
+
statsSplitContainer.style.width = '100%';
|
|
271
|
+
statsSplitContainer.style.boxSizing = 'border-box';
|
|
272
|
+
|
|
273
|
+
const statsTableHost = document.createElement('div');
|
|
274
|
+
statsTableHost.style.flex = '1 1 0';
|
|
275
|
+
statsTableHost.style.minHeight = '120px';
|
|
276
|
+
statsTableHost.style.minWidth = '0';
|
|
277
|
+
statsTableHost.style.overflow = 'hidden';
|
|
278
|
+
statsTableHost.style.boxSizing = 'border-box';
|
|
279
|
+
statsTableHost.style.border = hostVisualPrimitives.unifiedBorder;
|
|
280
|
+
statsTableHost.style.padding = FLAPPY_HOST_TABLE_HOST_PADDING;
|
|
281
|
+
|
|
282
|
+
// Step 4: Create the network panel host.
|
|
283
|
+
const networkCanvasHost = document.createElement('div');
|
|
284
|
+
networkCanvasHost.style.flex = '1 1 0';
|
|
285
|
+
networkCanvasHost.style.minWidth = '0';
|
|
286
|
+
networkCanvasHost.style.height = `${FLAPPY_UI_NETWORK_HOST_INITIAL_HEIGHT_PX}px`;
|
|
287
|
+
networkCanvasHost.style.background = FLAPPY_UI_NETWORK_HOST_BACKGROUND;
|
|
288
|
+
networkCanvasHost.style.boxSizing = 'border-box';
|
|
289
|
+
networkCanvasHost.style.border = hostVisualPrimitives.unifiedBorder;
|
|
290
|
+
networkCanvasHost.style.padding = `${FLAPPY_UI_NETWORK_HOST_INSET_PX / 2}px`;
|
|
291
|
+
networkCanvasHost.style.boxShadow = FLAPPY_UI_CANVAS_INSET_SHADOW;
|
|
292
|
+
|
|
293
|
+
return {
|
|
294
|
+
outerFrame,
|
|
295
|
+
contentColumn,
|
|
296
|
+
mainSplitContainer,
|
|
297
|
+
statsContainer,
|
|
298
|
+
statsSplitContainer,
|
|
299
|
+
statsTableHost,
|
|
300
|
+
networkCanvasHost,
|
|
301
|
+
};
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
/**
|
|
305
|
+
* Creates the canvases and 2D contexts used by the host UI.
|
|
306
|
+
*
|
|
307
|
+
* @param hostVisualPrimitives - Shared visual primitives for border and shadow styling.
|
|
308
|
+
* @returns Simulation, header, and network canvases with required contexts.
|
|
309
|
+
*/
|
|
310
|
+
function createHostCanvasElements(
|
|
311
|
+
hostVisualPrimitives: HostVisualPrimitives,
|
|
312
|
+
): HostCanvasElements {
|
|
313
|
+
// Step 1: Create the header canvas used by the framed title renderer.
|
|
314
|
+
const headerCanvas = document.createElement('canvas');
|
|
315
|
+
headerCanvas.width = 1;
|
|
316
|
+
headerCanvas.height = 1;
|
|
317
|
+
headerCanvas.style.width = '100%';
|
|
318
|
+
headerCanvas.style.height = `${FLAPPY_HEADER_CANVAS_HEIGHT_PX}px`;
|
|
319
|
+
headerCanvas.style.display = 'block';
|
|
320
|
+
headerCanvas.style.maxWidth = '100%';
|
|
321
|
+
headerCanvas.style.boxSizing = 'border-box';
|
|
322
|
+
headerCanvas.style.background = 'transparent';
|
|
323
|
+
const headerContext = resolveRequiredCanvas2dContext(
|
|
324
|
+
headerCanvas,
|
|
325
|
+
'Header canvas 2D context unavailable',
|
|
326
|
+
);
|
|
327
|
+
|
|
328
|
+
// Step 2: Create the main simulation canvas.
|
|
329
|
+
const canvas = document.createElement('canvas');
|
|
330
|
+
canvas.width = 1;
|
|
331
|
+
canvas.height = 1;
|
|
332
|
+
canvas.style.width = '100%';
|
|
333
|
+
canvas.style.height = '1px';
|
|
334
|
+
canvas.style.display = 'block';
|
|
335
|
+
canvas.style.maxWidth = '100%';
|
|
336
|
+
canvas.style.boxSizing = 'border-box';
|
|
337
|
+
canvas.style.flex = '0 0 auto';
|
|
338
|
+
canvas.style.alignSelf = 'flex-start';
|
|
339
|
+
canvas.style.imageRendering = 'pixelated';
|
|
340
|
+
canvas.style.background = FLAPPY_NEON_PALETTE.background;
|
|
341
|
+
canvas.style.border = hostVisualPrimitives.unifiedBorder;
|
|
342
|
+
canvas.style.boxShadow = FLAPPY_UI_CANVAS_INSET_SHADOW;
|
|
343
|
+
const context = resolveRequiredCanvas2dContext(
|
|
344
|
+
canvas,
|
|
345
|
+
'Canvas 2D context unavailable',
|
|
346
|
+
);
|
|
347
|
+
|
|
348
|
+
// Step 3: Create the network visualization canvas.
|
|
349
|
+
const networkCanvas = document.createElement('canvas');
|
|
350
|
+
networkCanvas.width = 1;
|
|
351
|
+
networkCanvas.height = 1;
|
|
352
|
+
networkCanvas.style.display = 'block';
|
|
353
|
+
networkCanvas.style.width = '100%';
|
|
354
|
+
networkCanvas.style.height = '100%';
|
|
355
|
+
networkCanvas.style.maxWidth = '100%';
|
|
356
|
+
networkCanvas.style.background = FLAPPY_UI_NETWORK_CANVAS_BACKGROUND;
|
|
357
|
+
networkCanvas.style.border = 'none';
|
|
358
|
+
networkCanvas.style.boxSizing = 'border-box';
|
|
359
|
+
const networkContext = resolveRequiredCanvas2dContext(
|
|
360
|
+
networkCanvas,
|
|
361
|
+
'Network canvas 2D context unavailable',
|
|
362
|
+
);
|
|
363
|
+
|
|
364
|
+
return {
|
|
365
|
+
headerCanvas,
|
|
366
|
+
headerContext,
|
|
367
|
+
canvas,
|
|
368
|
+
context,
|
|
369
|
+
networkCanvas,
|
|
370
|
+
networkContext,
|
|
371
|
+
};
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
/**
|
|
375
|
+
* Creates the reusable title-frame renderer for the header canvas.
|
|
376
|
+
*
|
|
377
|
+
* @param headerCanvas - Header canvas element.
|
|
378
|
+
* @param headerContext - Header canvas 2D context.
|
|
379
|
+
* @returns Callback that redraws the framed title.
|
|
380
|
+
*/
|
|
381
|
+
function createHeaderFrameRenderer(
|
|
382
|
+
headerCanvas: HTMLCanvasElement,
|
|
383
|
+
headerContext: CanvasRenderingContext2D,
|
|
384
|
+
): () => void {
|
|
385
|
+
/**
|
|
386
|
+
* Redraws the title box after syncing canvas backing size to display width.
|
|
387
|
+
*
|
|
388
|
+
* @returns Nothing.
|
|
389
|
+
*/
|
|
390
|
+
return () => {
|
|
391
|
+
// Step 1: Sync backing resolution to the current display width.
|
|
392
|
+
const displayWidthPx = Math.max(1, Math.floor(headerCanvas.clientWidth));
|
|
393
|
+
const displayHeightPx = FLAPPY_HEADER_CANVAS_HEIGHT_PX;
|
|
394
|
+
if (
|
|
395
|
+
headerCanvas.width !== displayWidthPx ||
|
|
396
|
+
headerCanvas.height !== displayHeightPx
|
|
397
|
+
) {
|
|
398
|
+
headerCanvas.width = displayWidthPx;
|
|
399
|
+
headerCanvas.height = displayHeightPx;
|
|
400
|
+
}
|
|
401
|
+
|
|
402
|
+
// Step 2: Render the title box using the shared framed-text renderer.
|
|
403
|
+
renderStandaloneTitleBox({
|
|
404
|
+
context: headerContext,
|
|
405
|
+
widthPx: displayWidthPx,
|
|
406
|
+
heightPx: displayHeightPx,
|
|
407
|
+
titleText: FLAPPY_HEADER_TITLE_TEXT,
|
|
408
|
+
glyphColor: FLAPPY_NEON_PALETTE.hudPanelBorder,
|
|
409
|
+
font: FLAPPY_FRAME_MONOSPACE_FONT,
|
|
410
|
+
});
|
|
411
|
+
};
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
/**
|
|
415
|
+
* Creates the network visualization renderer and redraw controller.
|
|
416
|
+
*
|
|
417
|
+
* @param networkCanvasHost - Host element wrapping the network canvas.
|
|
418
|
+
* @param networkCanvas - Network visualization canvas.
|
|
419
|
+
* @param networkContext - Network visualization 2D context.
|
|
420
|
+
* @returns Renderer and redraw callbacks for the network panel.
|
|
421
|
+
*/
|
|
422
|
+
function createHostNetworkVisualizationController(
|
|
423
|
+
networkCanvasHost: HTMLDivElement,
|
|
424
|
+
networkCanvas: HTMLCanvasElement,
|
|
425
|
+
networkContext: CanvasRenderingContext2D,
|
|
426
|
+
): HostNetworkVisualizationController {
|
|
427
|
+
const hostNetworkVisualizationState: HostNetworkVisualizationState = {
|
|
428
|
+
previousNetworkForVisualization: undefined,
|
|
429
|
+
previousVisualizationInputSize: FLAPPY_NETWORK_INPUT_SIZE,
|
|
430
|
+
previousVisualizationOutputSize: FLAPPY_NETWORK_OUTPUT_SIZE,
|
|
431
|
+
};
|
|
432
|
+
|
|
433
|
+
/**
|
|
434
|
+
* Resizes the network canvas backing store to match the host element.
|
|
435
|
+
*
|
|
436
|
+
* @returns Nothing.
|
|
437
|
+
*/
|
|
438
|
+
const resizeNetworkCanvasToHost = (): void => {
|
|
439
|
+
// Step 1: Resolve the drawable network canvas bounds from the host panel.
|
|
440
|
+
const { widthPx, heightPx } = resolveNetworkCanvasSizePx(
|
|
441
|
+
networkCanvasHost,
|
|
442
|
+
FLAPPY_UI_NETWORK_HOST_INSET_PX,
|
|
443
|
+
);
|
|
444
|
+
|
|
445
|
+
// Step 2: Apply backing-store dimensions to the network canvas.
|
|
446
|
+
applyCanvasBackingSize(networkCanvas, widthPx, heightPx);
|
|
447
|
+
};
|
|
448
|
+
|
|
449
|
+
const renderNetworkArchitecture: NetworkVisualizationHandle['renderNetworkArchitecture'] =
|
|
450
|
+
(network, inputSize, outputSize) => {
|
|
451
|
+
// Step 1: Resolve preferred visualization height and lock the panel size.
|
|
452
|
+
resolveNetworkVisualizationHeightPx(network, inputSize, outputSize);
|
|
453
|
+
const fixedNetworkPanelHeightPx = FLAPPY_UI_NETWORK_HOST_FIXED_HEIGHT_PX;
|
|
454
|
+
networkCanvasHost.dataset.preferredHeightPx = String(
|
|
455
|
+
fixedNetworkPanelHeightPx,
|
|
456
|
+
);
|
|
457
|
+
networkCanvasHost.style.height = `${fixedNetworkPanelHeightPx}px`;
|
|
458
|
+
|
|
459
|
+
// Step 2: Resize the canvas and persist the last rendered payload.
|
|
460
|
+
resizeNetworkCanvasToHost();
|
|
461
|
+
hostNetworkVisualizationState.previousNetworkForVisualization = network;
|
|
462
|
+
hostNetworkVisualizationState.previousVisualizationInputSize = inputSize;
|
|
463
|
+
hostNetworkVisualizationState.previousVisualizationOutputSize =
|
|
464
|
+
outputSize;
|
|
465
|
+
|
|
466
|
+
// Step 3: Draw the current network visualization payload.
|
|
467
|
+
drawNetworkVisualization(networkContext, network, inputSize, outputSize);
|
|
468
|
+
};
|
|
469
|
+
|
|
470
|
+
/**
|
|
471
|
+
* Redraws the most recently rendered network visualization payload.
|
|
472
|
+
*
|
|
473
|
+
* @returns Nothing.
|
|
474
|
+
*/
|
|
475
|
+
const redrawCurrentNetworkArchitecture = (): void => {
|
|
476
|
+
// Step 1: Re-render the last known payload after external resize changes.
|
|
477
|
+
renderNetworkArchitecture(
|
|
478
|
+
hostNetworkVisualizationState.previousNetworkForVisualization,
|
|
479
|
+
hostNetworkVisualizationState.previousVisualizationInputSize,
|
|
480
|
+
hostNetworkVisualizationState.previousVisualizationOutputSize,
|
|
481
|
+
);
|
|
482
|
+
};
|
|
483
|
+
|
|
484
|
+
return {
|
|
485
|
+
renderNetworkArchitecture,
|
|
486
|
+
resizeNetworkCanvasToHost,
|
|
487
|
+
redrawCurrentNetworkArchitecture,
|
|
488
|
+
};
|
|
489
|
+
}
|
|
490
|
+
|
|
491
|
+
/**
|
|
492
|
+
* Mounts the completed host DOM tree into the container in final order.
|
|
493
|
+
*
|
|
494
|
+
* @param containerElement - Root host container.
|
|
495
|
+
* @param hostLayoutElements - Prepared layout containers.
|
|
496
|
+
* @param headerCanvas - Header title canvas.
|
|
497
|
+
* @param canvas - Main simulation canvas.
|
|
498
|
+
* @param networkCanvas - Network visualization canvas.
|
|
499
|
+
* @returns Nothing.
|
|
500
|
+
*/
|
|
501
|
+
function mountCanvasHostTree(
|
|
502
|
+
containerElement: HTMLElement,
|
|
503
|
+
hostLayoutElements: HostLayoutElements,
|
|
504
|
+
headerCanvas: HTMLCanvasElement,
|
|
505
|
+
canvas: HTMLCanvasElement,
|
|
506
|
+
networkCanvas: HTMLCanvasElement,
|
|
507
|
+
): void {
|
|
508
|
+
// Step 1: Mount the stats section and network panel into the stats container.
|
|
509
|
+
hostLayoutElements.networkCanvasHost.appendChild(networkCanvas);
|
|
510
|
+
hostLayoutElements.statsSplitContainer.appendChild(
|
|
511
|
+
hostLayoutElements.statsTableHost,
|
|
512
|
+
);
|
|
513
|
+
hostLayoutElements.statsSplitContainer.appendChild(
|
|
514
|
+
hostLayoutElements.networkCanvasHost,
|
|
515
|
+
);
|
|
516
|
+
hostLayoutElements.statsContainer.appendChild(
|
|
517
|
+
hostLayoutElements.statsSplitContainer,
|
|
518
|
+
);
|
|
519
|
+
|
|
520
|
+
// Step 2: Mount the header, simulation canvas, and stats area into the frame.
|
|
521
|
+
hostLayoutElements.contentColumn.appendChild(headerCanvas);
|
|
522
|
+
hostLayoutElements.mainSplitContainer.appendChild(canvas);
|
|
523
|
+
hostLayoutElements.mainSplitContainer.appendChild(
|
|
524
|
+
hostLayoutElements.statsContainer,
|
|
525
|
+
);
|
|
526
|
+
hostLayoutElements.contentColumn.appendChild(
|
|
527
|
+
hostLayoutElements.mainSplitContainer,
|
|
528
|
+
);
|
|
529
|
+
hostLayoutElements.outerFrame.appendChild(hostLayoutElements.contentColumn);
|
|
530
|
+
containerElement.appendChild(hostLayoutElements.outerFrame);
|
|
531
|
+
}
|
|
532
|
+
|
|
533
|
+
/**
|
|
534
|
+
* Installs responsive resize hooks for the simulation canvas and side panel.
|
|
535
|
+
*
|
|
536
|
+
* @param canvas - Simulation canvas.
|
|
537
|
+
* @param hostLayoutElements - Prepared layout containers.
|
|
538
|
+
* @param networkCanvas - Network visualization canvas.
|
|
539
|
+
* @param drawHeaderFrame - Callback that redraws the header title.
|
|
540
|
+
* @param hostNetworkVisualizationController - Network panel resize/redraw controller.
|
|
541
|
+
* @returns Nothing.
|
|
542
|
+
*/
|
|
543
|
+
function installCanvasHostResizeHooks(
|
|
544
|
+
canvas: HTMLCanvasElement,
|
|
545
|
+
hostLayoutElements: HostLayoutElements,
|
|
546
|
+
networkCanvas: HTMLCanvasElement,
|
|
547
|
+
drawHeaderFrame: () => void,
|
|
548
|
+
hostNetworkVisualizationController: HostNetworkVisualizationController,
|
|
549
|
+
): void {
|
|
550
|
+
// Step 1: Install responsive sizing and redraw hooks across host sections.
|
|
551
|
+
installResponsiveViewportSizing(
|
|
552
|
+
canvas,
|
|
553
|
+
hostLayoutElements.contentColumn,
|
|
554
|
+
hostLayoutElements.mainSplitContainer,
|
|
555
|
+
hostLayoutElements.statsContainer,
|
|
556
|
+
hostLayoutElements.statsSplitContainer,
|
|
557
|
+
hostLayoutElements.statsTableHost,
|
|
558
|
+
networkCanvas,
|
|
559
|
+
hostLayoutElements.networkCanvasHost,
|
|
560
|
+
() => {
|
|
561
|
+
drawHeaderFrame();
|
|
562
|
+
hostNetworkVisualizationController.resizeNetworkCanvasToHost();
|
|
563
|
+
hostNetworkVisualizationController.redrawCurrentNetworkArchitecture();
|
|
564
|
+
},
|
|
565
|
+
);
|
|
566
|
+
}
|
|
567
|
+
|
|
568
|
+
/**
|
|
569
|
+
* Renders the initial header and placeholder network visualization state.
|
|
570
|
+
*
|
|
571
|
+
* @param drawHeaderFrame - Callback that redraws the header title.
|
|
572
|
+
* @param renderNetworkArchitecture - Network visualization renderer.
|
|
573
|
+
* @returns Nothing.
|
|
574
|
+
*/
|
|
575
|
+
function renderInitialCanvasHostState(
|
|
576
|
+
drawHeaderFrame: () => void,
|
|
577
|
+
renderNetworkArchitecture: NetworkVisualizationHandle['renderNetworkArchitecture'],
|
|
578
|
+
): void {
|
|
579
|
+
// Step 1: Paint the placeholder network visualization before simulation starts.
|
|
580
|
+
renderNetworkArchitecture(
|
|
581
|
+
undefined,
|
|
582
|
+
FLAPPY_NETWORK_INPUT_SIZE,
|
|
583
|
+
FLAPPY_NETWORK_OUTPUT_SIZE,
|
|
584
|
+
);
|
|
585
|
+
|
|
586
|
+
// Step 2: Render the framed header title.
|
|
587
|
+
drawHeaderFrame();
|
|
32
588
|
}
|