@reicek/neataptic-ts 0.1.24 → 0.1.26
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/copilot-instructions.md +11 -0
- package/.github/skills/trace-analyzer-extension/SKILL.md +3 -3
- package/.github/skills/trace-analyzer-extension/assets/extension-checklist.md +1 -1
- package/.github/skills/trace-analyzer-extension/references/analyzer-extension-workflow.md +1 -1
- package/.github/skills/trace-audit-reporting/SKILL.md +3 -3
- package/.github/skills/trace-audit-reporting/references/trace-analysis-workflow.md +1 -1
- package/.github/workflows/ci.yml +3 -3
- package/.github/workflows/deploy-pages.yml +6 -6
- package/.github/workflows/manual_release_pipeline.yml +3 -3
- package/.github/workflows/publish.yml +18 -19
- package/.github/workflows/release_dispatch.yml +3 -3
- package/package.json +26 -20
- package/plans/Flappy_Bird_Folder_Documentation_Pass.md +4 -4
- package/plans/README.md +24 -0
- package/plans/Roadmap.md +62 -40
- package/plans/analyze-trace-solid-split.plans.md +66 -0
- package/plans/architecture-solid-split.plans.md +9 -15
- package/plans/asciiMaze-typescript-repair.plans.md +1 -1
- package/plans/generate-docs-solid-split.plans.md +87 -0
- package/plans/methods-docs.plans.md +25 -1
- package/plans/methods-solid-split.plans.md +14 -14
- package/plans/neat-docs.plans.md +9 -1
- package/plans/neat-test-surface-repair.plans.md +1 -1
- package/plans/render-docs-html-solid-split.plans.md +68 -0
- package/plans/src-no-explicit-any-cleanup.plans.md +1 -1
- package/plans/utils-docs.plans.md +6 -1
- package/scripts/analyze-trace/analyze-trace.analysis.ts +479 -0
- package/scripts/analyze-trace/analyze-trace.constants.ts +35 -0
- package/scripts/analyze-trace/analyze-trace.io.ts +69 -0
- package/scripts/analyze-trace/analyze-trace.report.ts +100 -0
- package/scripts/analyze-trace/analyze-trace.shared.ts +116 -0
- package/scripts/analyze-trace/analyze-trace.ts +45 -0
- package/scripts/analyze-trace/analyze-trace.types.ts +72 -0
- package/scripts/assets/theme.css +80 -23
- package/scripts/copy-examples.ts +239 -0
- package/scripts/export-onnx.ts +223 -0
- package/scripts/generate-bench-tables.ts +378 -37
- package/scripts/generate-docs/generate-docs.constants.ts +107 -0
- package/scripts/generate-docs/generate-docs.order.ts +355 -0
- package/scripts/generate-docs/generate-docs.state.ts +31 -0
- package/scripts/generate-docs/generate-docs.targets.ts +165 -0
- package/scripts/generate-docs/generate-docs.ts +63 -0
- package/scripts/generate-docs/generate-docs.types.ts +112 -0
- package/scripts/generate-docs/output/generate-docs.output.folder-index.utils.ts +167 -0
- package/scripts/generate-docs/output/generate-docs.output.ordering.utils.ts +353 -0
- package/scripts/generate-docs/output/generate-docs.output.readme.utils.ts +420 -0
- package/scripts/generate-docs/output/generate-docs.output.ts +123 -0
- package/scripts/generate-docs/output/generate-docs.output.warnings.utils.ts +219 -0
- package/scripts/generate-docs/symbols/generate-docs.symbols.collection.utils.ts +365 -0
- package/scripts/generate-docs/symbols/generate-docs.symbols.jsdoc.utils.ts +373 -0
- package/scripts/generate-docs/symbols/generate-docs.symbols.normalize.utils.ts +155 -0
- package/scripts/generate-docs/symbols/generate-docs.symbols.render.utils.ts +149 -0
- package/scripts/generate-docs/symbols/generate-docs.symbols.signature.utils.ts +289 -0
- package/scripts/generate-docs/symbols/generate-docs.symbols.ts +11 -0
- package/scripts/mermaid-cli.mjs +102 -22
- package/scripts/mermaid-cli.ts +736 -0
- package/scripts/render-docs-html/render-docs-html.assets.ts +54 -0
- package/scripts/render-docs-html/render-docs-html.mermaid.ts +245 -0
- package/scripts/{render-docs-html.sidebar.ts → render-docs-html/render-docs-html.navigation.ts} +141 -144
- package/scripts/render-docs-html/render-docs-html.pages.ts +333 -0
- package/scripts/render-docs-html/render-docs-html.shared.ts +333 -0
- package/scripts/render-docs-html/render-docs-html.types.ts +42 -0
- package/scripts/render-docs-html.ts +23 -587
- package/scripts/run-docs.ts +238 -0
- package/scripts/write-dist-docs-pkg.ts +40 -0
- package/src/README.md +75 -75
- package/src/architecture/connection/README.md +5 -5
- package/src/architecture/layer/README.md +508 -508
- package/src/architecture/network/README.md +1458 -1458
- package/src/architecture/network/activate/README.md +694 -694
- package/src/architecture/network/bootstrap/README.md +77 -77
- package/src/architecture/network/connect/README.md +74 -74
- package/src/architecture/network/deterministic/README.md +135 -135
- package/src/architecture/network/evolve/README.md +364 -364
- package/src/architecture/network/gating/README.md +130 -130
- package/src/architecture/network/genetic/README.md +399 -399
- package/src/architecture/network/mutate/README.md +897 -897
- package/src/architecture/network/onnx/README.md +720 -720
- package/src/architecture/network/onnx/export/README.md +728 -728
- package/src/architecture/network/onnx/export/layers/README.md +450 -450
- package/src/architecture/network/onnx/import/README.md +618 -618
- package/src/architecture/network/onnx/schema/README.md +32 -32
- package/src/architecture/network/prune/README.md +245 -245
- package/src/architecture/network/remove/README.md +135 -135
- package/src/architecture/network/runtime/README.md +106 -106
- package/src/architecture/network/serialize/README.md +542 -542
- package/src/architecture/network/slab/README.md +608 -608
- package/src/architecture/network/standalone/README.md +212 -212
- package/src/architecture/network/stats/README.md +84 -84
- package/src/architecture/network/topology/README.md +465 -465
- package/src/architecture/network/training/README.md +200 -200
- package/src/architecture/node/README.md +5 -5
- package/src/architecture/nodePool/README.md +14 -14
- package/src/methods/README.md +99 -99
- package/src/methods/activation/README.md +189 -189
- package/src/methods/cost/README.md +131 -131
- package/src/methods/rate/README.md +86 -86
- package/src/multithreading/README.md +77 -77
- package/src/multithreading/workers/browser/README.md +8 -8
- package/src/multithreading/workers/node/README.md +8 -8
- package/src/neat/README.md +148 -148
- package/src/neat/adaptive/README.md +120 -120
- package/src/neat/adaptive/acceptance/README.md +40 -40
- package/src/neat/adaptive/complexity/README.md +137 -137
- package/src/neat/adaptive/core/README.md +197 -197
- package/src/neat/adaptive/lineage/README.md +90 -90
- package/src/neat/adaptive/mutation/README.md +284 -284
- package/src/neat/compat/README.md +43 -43
- package/src/neat/compat/core/README.md +90 -90
- package/src/neat/diversity/README.md +35 -35
- package/src/neat/diversity/core/README.md +88 -88
- package/src/neat/evaluate/README.md +85 -85
- package/src/neat/evaluate/auto-distance/README.md +75 -75
- package/src/neat/evaluate/entropy-compat/README.md +37 -37
- package/src/neat/evaluate/entropy-sharing/README.md +43 -43
- package/src/neat/evaluate/fitness/README.md +23 -23
- package/src/neat/evaluate/novelty/README.md +120 -120
- package/src/neat/evaluate/objectives/README.md +17 -17
- package/src/neat/evaluate/shared/README.md +94 -94
- package/src/neat/evolve/README.md +96 -96
- package/src/neat/evolve/adaptive/README.md +60 -60
- package/src/neat/evolve/objectives/README.md +63 -63
- package/src/neat/evolve/offspring/README.md +56 -56
- package/src/neat/evolve/population/README.md +171 -171
- package/src/neat/evolve/runtime/README.md +79 -79
- package/src/neat/evolve/speciation/README.md +74 -74
- package/src/neat/evolve/warnings/README.md +10 -10
- package/src/neat/export/README.md +114 -114
- package/src/neat/helpers/README.md +50 -50
- package/src/neat/init/README.md +9 -9
- package/src/neat/lineage/core/README.md +101 -101
- package/src/neat/multiobjective/category/README.md +74 -74
- package/src/neat/multiobjective/crowding/README.md +272 -272
- package/src/neat/multiobjective/dominance/README.md +171 -171
- package/src/neat/multiobjective/fronts/README.md +68 -68
- package/src/neat/multiobjective/metrics/README.md +43 -43
- package/src/neat/multiobjective/objectives/README.md +31 -31
- package/src/neat/multiobjective/shared/README.md +27 -27
- package/src/neat/mutation/README.md +97 -97
- package/src/neat/mutation/add-conn/README.md +115 -115
- package/src/neat/mutation/add-node/README.md +126 -126
- package/src/neat/mutation/flow/README.md +149 -149
- package/src/neat/mutation/repair/README.md +185 -185
- package/src/neat/mutation/select/README.md +117 -117
- package/src/neat/mutation/shared/README.md +32 -32
- package/src/neat/objectives/README.md +25 -25
- package/src/neat/objectives/core/README.md +67 -67
- package/src/neat/pruning/README.md +40 -40
- package/src/neat/pruning/core/README.md +171 -171
- package/src/neat/pruning/facade/README.md +32 -32
- package/src/neat/rng/README.md +104 -104
- package/src/neat/rng/core/README.md +137 -137
- package/src/neat/rng/facade/README.md +50 -50
- package/src/neat/selection/README.md +111 -111
- package/src/neat/selection/core/README.md +227 -227
- package/src/neat/selection/facade/README.md +61 -61
- package/src/neat/shared/README.md +163 -163
- package/src/neat/speciation/README.md +31 -31
- package/src/neat/speciation/threshold/README.md +35 -35
- package/src/neat/species/README.md +25 -25
- package/src/neat/species/core/README.md +20 -20
- package/src/neat/species/core/shared/README.md +18 -18
- package/src/neat/species/history/context/README.md +22 -22
- package/src/neat/telemetry/accessors/README.md +58 -58
- package/src/neat/telemetry/exports/README.md +233 -233
- package/src/neat/telemetry/facade/README.md +252 -252
- package/src/neat/telemetry/facade/archive/README.md +57 -57
- package/src/neat/telemetry/facade/buffer/README.md +43 -43
- package/src/neat/telemetry/facade/lineage/README.md +12 -12
- package/src/neat/telemetry/facade/objectives/README.md +44 -44
- package/src/neat/telemetry/facade/runtime/README.md +26 -26
- package/src/neat/telemetry/facade/species/README.md +27 -27
- package/src/neat/telemetry/metrics/README.md +696 -696
- package/src/neat/telemetry/recorder/README.md +57 -57
- package/src/neat/telemetry/types/README.md +32 -32
- package/src/neat/topology-intent/README.md +75 -75
- package/src/utils/README.md +193 -193
- package/test/examples/asciiMaze/browser-entry/README.md +92 -92
- package/test/examples/asciiMaze/dashboardManager/README.md +109 -109
- package/test/examples/asciiMaze/dashboardManager/telemetry/README.md +28 -28
- package/test/examples/asciiMaze/evolutionEngine/README.md +1527 -1527
- package/test/examples/asciiMaze/mazeMovement/README.md +105 -105
- package/test/examples/asciiMaze/mazeMovement/finalization/README.md +16 -16
- package/test/examples/asciiMaze/mazeMovement/policy/README.md +57 -57
- package/test/examples/asciiMaze/mazeMovement/runtime/README.md +52 -52
- package/test/examples/asciiMaze/mazeMovement/shaping/README.md +46 -46
- package/test/examples/flappy_bird/browser-entry/README.md +508 -508
- package/test/examples/flappy_bird/browser-entry/host/README.md +101 -101
- package/test/examples/flappy_bird/browser-entry/host/resize/README.md +144 -144
- package/test/examples/flappy_bird/browser-entry/network-view/README.md +194 -194
- package/test/examples/flappy_bird/browser-entry/playback/README.md +278 -278
- package/test/examples/flappy_bird/browser-entry/playback/background/README.md +129 -129
- package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/README.md +502 -502
- package/test/examples/flappy_bird/browser-entry/playback/frame-render/README.md +139 -139
- package/test/examples/flappy_bird/browser-entry/playback/snapshot/README.md +10 -10
- package/test/examples/flappy_bird/browser-entry/playback/trail/README.md +43 -43
- package/test/examples/flappy_bird/browser-entry/playback/worker-channel/README.md +30 -30
- package/test/examples/flappy_bird/browser-entry/runtime/README.md +59 -59
- package/test/examples/flappy_bird/browser-entry/visualization/README.md +276 -276
- package/test/examples/flappy_bird/browser-entry/worker-channel/README.md +16 -16
- package/test/examples/flappy_bird/constants/README.md +1070 -1070
- package/test/examples/flappy_bird/environment/README.md +22 -22
- package/test/examples/flappy_bird/evaluation/README.md +32 -32
- package/test/examples/flappy_bird/evaluation/rollout/README.md +141 -141
- package/test/examples/flappy_bird/flappy-evolution-worker/README.md +425 -425
- package/test/examples/flappy_bird/simulation-shared/README.md +170 -170
- package/test/examples/flappy_bird/simulation-shared/observation/README.md +109 -109
- package/test/examples/flappy_bird/trainer/README.md +325 -325
- package/test/examples/flappy_bird/trainer/evaluation/README.md +74 -74
- package/scripts/analyze-trace.ts +0 -590
- package/scripts/copy-examples.mjs +0 -114
- package/scripts/export-onnx.mjs +0 -86
- package/scripts/generate-bench-tables.mjs +0 -182
- package/scripts/generate-docs.ts +0 -2900
- package/scripts/write-dist-docs-pkg.mjs +0 -16
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copies browser-viewable examples into docs/examples/* so GitHub Pages can
|
|
3
|
+
* publish them alongside the generated documentation site.
|
|
4
|
+
*
|
|
5
|
+
* The script intentionally keeps one narrow contract: copy each example's
|
|
6
|
+
* browser entrypoint into its published docs folder, then rebuild the shared
|
|
7
|
+
* examples landing page from the demos that were actually published.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import { access, copyFile, mkdir, writeFile } from 'node:fs/promises';
|
|
11
|
+
import path from 'node:path';
|
|
12
|
+
|
|
13
|
+
const DOCS_EXAMPLES_LOG_PREFIX = '[docs:examples]';
|
|
14
|
+
const DOCS_EXAMPLES_DIR = path.resolve('docs', 'examples');
|
|
15
|
+
const EXAMPLE_ENTRY_FILE_NAME = 'index.html';
|
|
16
|
+
const DOCS_THEME_STYLESHEET_PATH = '../assets/theme.css';
|
|
17
|
+
const DOCS_HOME_PATH = '../index.html';
|
|
18
|
+
const EXAMPLES_HOME_PATH = './index.html';
|
|
19
|
+
const GITHUB_REPOSITORY_URL = 'https://github.com/reicek/NeatapticTS';
|
|
20
|
+
|
|
21
|
+
interface ExampleDefinition {
|
|
22
|
+
dirName: string;
|
|
23
|
+
label: string;
|
|
24
|
+
title: string;
|
|
25
|
+
sourceDir: string;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
interface PublishedExample {
|
|
29
|
+
dirName: string;
|
|
30
|
+
label: string;
|
|
31
|
+
title: string;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
const EXAMPLE_DEFINITIONS: readonly ExampleDefinition[] = [
|
|
35
|
+
{
|
|
36
|
+
dirName: 'asciiMaze',
|
|
37
|
+
label: 'asciiMaze',
|
|
38
|
+
title: 'ASCII Maze (NeatapticTS)',
|
|
39
|
+
sourceDir: path.resolve('test', 'examples', 'asciiMaze'),
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
dirName: 'flappy_bird',
|
|
43
|
+
label: 'flappy_bird',
|
|
44
|
+
title: 'Flappy Bird (NeatapticTS)',
|
|
45
|
+
sourceDir: path.resolve('test', 'examples', 'flappy_bird'),
|
|
46
|
+
},
|
|
47
|
+
];
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Runs the example-copy workflow.
|
|
51
|
+
*
|
|
52
|
+
* Step 1 copies published browser entrypoints for all known examples.
|
|
53
|
+
* Step 2 rebuilds the landing page from the demos that were actually copied.
|
|
54
|
+
*
|
|
55
|
+
* @returns Promise resolved when copying and landing-page generation complete.
|
|
56
|
+
*/
|
|
57
|
+
async function main(): Promise<void> {
|
|
58
|
+
const publishedExamples = (
|
|
59
|
+
await Promise.all(EXAMPLE_DEFINITIONS.map(copyExampleEntryPoint))
|
|
60
|
+
).filter(isPublishedExample);
|
|
61
|
+
|
|
62
|
+
await writeExamplesLandingPage(publishedExamples);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Copies one example entrypoint into `docs/examples/<name>/index.html`.
|
|
67
|
+
*
|
|
68
|
+
* @param exampleDefinition - Example publishing definition.
|
|
69
|
+
* @returns Published example metadata when the example entrypoint was copied,
|
|
70
|
+
* otherwise `null`.
|
|
71
|
+
*/
|
|
72
|
+
async function copyExampleEntryPoint(
|
|
73
|
+
exampleDefinition: ExampleDefinition,
|
|
74
|
+
): Promise<PublishedExample | null> {
|
|
75
|
+
const hasSourceDirectory = await pathExists(exampleDefinition.sourceDir);
|
|
76
|
+
if (!hasSourceDirectory) {
|
|
77
|
+
console.warn(
|
|
78
|
+
`${DOCS_EXAMPLES_LOG_PREFIX} ${exampleDefinition.dirName} source directory not found, skipping`,
|
|
79
|
+
);
|
|
80
|
+
return null;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
const sourceIndexPath = path.join(
|
|
84
|
+
exampleDefinition.sourceDir,
|
|
85
|
+
EXAMPLE_ENTRY_FILE_NAME,
|
|
86
|
+
);
|
|
87
|
+
const hasSourceIndex = await pathExists(sourceIndexPath);
|
|
88
|
+
if (!hasSourceIndex) {
|
|
89
|
+
console.warn(
|
|
90
|
+
`${DOCS_EXAMPLES_LOG_PREFIX} ${exampleDefinition.dirName} ${EXAMPLE_ENTRY_FILE_NAME} missing`,
|
|
91
|
+
);
|
|
92
|
+
return null;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
const destinationDirectoryPath = path.join(
|
|
96
|
+
DOCS_EXAMPLES_DIR,
|
|
97
|
+
exampleDefinition.dirName,
|
|
98
|
+
);
|
|
99
|
+
const destinationIndexPath = path.join(
|
|
100
|
+
destinationDirectoryPath,
|
|
101
|
+
EXAMPLE_ENTRY_FILE_NAME,
|
|
102
|
+
);
|
|
103
|
+
|
|
104
|
+
await mkdir(destinationDirectoryPath, { recursive: true });
|
|
105
|
+
await copyFile(sourceIndexPath, destinationIndexPath);
|
|
106
|
+
|
|
107
|
+
console.log(
|
|
108
|
+
`${DOCS_EXAMPLES_LOG_PREFIX} Copied ${exampleDefinition.dirName} ${EXAMPLE_ENTRY_FILE_NAME}`,
|
|
109
|
+
);
|
|
110
|
+
|
|
111
|
+
return {
|
|
112
|
+
dirName: exampleDefinition.dirName,
|
|
113
|
+
label: exampleDefinition.label,
|
|
114
|
+
title: exampleDefinition.title,
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
/**
|
|
119
|
+
* Writes the shared docs/examples landing page.
|
|
120
|
+
*
|
|
121
|
+
* @param publishedExamples - Examples that were published in the current run.
|
|
122
|
+
* @returns Promise resolved when the landing page has been written.
|
|
123
|
+
*/
|
|
124
|
+
async function writeExamplesLandingPage(
|
|
125
|
+
publishedExamples: readonly PublishedExample[],
|
|
126
|
+
): Promise<void> {
|
|
127
|
+
await mkdir(DOCS_EXAMPLES_DIR, { recursive: true });
|
|
128
|
+
|
|
129
|
+
const examplesLandingPageHtml =
|
|
130
|
+
buildExamplesLandingPageHtml(publishedExamples);
|
|
131
|
+
await writeFile(
|
|
132
|
+
path.join(DOCS_EXAMPLES_DIR, EXAMPLE_ENTRY_FILE_NAME),
|
|
133
|
+
examplesLandingPageHtml,
|
|
134
|
+
'utf8',
|
|
135
|
+
);
|
|
136
|
+
|
|
137
|
+
console.log(`${DOCS_EXAMPLES_LOG_PREFIX} Wrote examples landing page`);
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
/**
|
|
141
|
+
* Builds the shared examples landing page HTML.
|
|
142
|
+
*
|
|
143
|
+
* @param publishedExamples - Examples that were published in the current run.
|
|
144
|
+
* @returns Rendered landing page HTML.
|
|
145
|
+
*/
|
|
146
|
+
function buildExamplesLandingPageHtml(
|
|
147
|
+
publishedExamples: readonly PublishedExample[],
|
|
148
|
+
): string {
|
|
149
|
+
const examplesListMarkup = buildExamplesListMarkup(publishedExamples);
|
|
150
|
+
|
|
151
|
+
return `<!doctype html>
|
|
152
|
+
<html lang="en">
|
|
153
|
+
<head>
|
|
154
|
+
<meta charset="utf-8" />
|
|
155
|
+
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
156
|
+
<title>Examples • NeatapticTS Docs</title>
|
|
157
|
+
<link rel="stylesheet" href="${DOCS_THEME_STYLESHEET_PATH}" />
|
|
158
|
+
</head>
|
|
159
|
+
<body>
|
|
160
|
+
<header class="topbar">
|
|
161
|
+
<div class="inner">
|
|
162
|
+
<div class="brand"><a href="${DOCS_HOME_PATH}">NeatapticTS</a></div>
|
|
163
|
+
<nav class="main-nav">
|
|
164
|
+
<a href="${DOCS_HOME_PATH}">Home</a>
|
|
165
|
+
<a href="${DOCS_HOME_PATH}">Docs</a>
|
|
166
|
+
<a href="${EXAMPLES_HOME_PATH}" class="active">Examples</a>
|
|
167
|
+
<a href="${GITHUB_REPOSITORY_URL}" target="_blank" rel="noopener">GitHub</a>
|
|
168
|
+
</nav>
|
|
169
|
+
</div>
|
|
170
|
+
</header>
|
|
171
|
+
<div class="layout">
|
|
172
|
+
<main class="content">
|
|
173
|
+
<h1>Examples</h1>
|
|
174
|
+
<p>Interactive browser demos built from this repository:</p>
|
|
175
|
+
${examplesListMarkup}
|
|
176
|
+
<footer class="site-footer">Generated from source JSDoc • <a href="${GITHUB_REPOSITORY_URL}">GitHub</a></footer>
|
|
177
|
+
</main>
|
|
178
|
+
</div>
|
|
179
|
+
</body>
|
|
180
|
+
</html>`;
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
/**
|
|
184
|
+
* Builds the published examples list markup.
|
|
185
|
+
*
|
|
186
|
+
* @param publishedExamples - Examples that were published in the current run.
|
|
187
|
+
* @returns HTML list markup.
|
|
188
|
+
*/
|
|
189
|
+
function buildExamplesListMarkup(
|
|
190
|
+
publishedExamples: readonly PublishedExample[],
|
|
191
|
+
): string {
|
|
192
|
+
if (publishedExamples.length === 0) {
|
|
193
|
+
return '<p>No interactive examples were published in this run.</p>';
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
const listItemsMarkup = publishedExamples
|
|
197
|
+
.toSorted((leftExample, rightExample) =>
|
|
198
|
+
leftExample.title.localeCompare(rightExample.title),
|
|
199
|
+
)
|
|
200
|
+
.map(
|
|
201
|
+
(publishedExample) =>
|
|
202
|
+
`<li><a href="./${publishedExample.dirName}/${EXAMPLE_ENTRY_FILE_NAME}">${publishedExample.title}</a> <span class="demo-path">(examples/${publishedExample.label})</span></li>`,
|
|
203
|
+
)
|
|
204
|
+
.join('');
|
|
205
|
+
|
|
206
|
+
return `<ul>${listItemsMarkup}</ul>`;
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
/**
|
|
210
|
+
* Resolves whether a filesystem path exists.
|
|
211
|
+
*
|
|
212
|
+
* @param targetPath - Filesystem path to check.
|
|
213
|
+
* @returns True when the path exists.
|
|
214
|
+
*/
|
|
215
|
+
async function pathExists(targetPath: string): Promise<boolean> {
|
|
216
|
+
try {
|
|
217
|
+
await access(targetPath);
|
|
218
|
+
return true;
|
|
219
|
+
} catch {
|
|
220
|
+
return false;
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
/**
|
|
225
|
+
* Narrows `Promise.all` output to the published example shape.
|
|
226
|
+
*
|
|
227
|
+
* @param publishedExample - Candidate example result.
|
|
228
|
+
* @returns `true` when the example was published successfully.
|
|
229
|
+
*/
|
|
230
|
+
function isPublishedExample(
|
|
231
|
+
publishedExample: PublishedExample | null,
|
|
232
|
+
): publishedExample is PublishedExample {
|
|
233
|
+
return publishedExample !== null;
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
main().catch((error: unknown) => {
|
|
237
|
+
console.error(`${DOCS_EXAMPLES_LOG_PREFIX} Failed:`, error);
|
|
238
|
+
process.exit(1);
|
|
239
|
+
});
|
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Minimal CLI to export a JSON ONNX model from a serialized network state.
|
|
3
|
+
*
|
|
4
|
+
* Usage:
|
|
5
|
+
* npm run onnx:export -- --in network.json --out model.onnx.json [--metadata] [--batch] [--legacy] [--partial] [--mixed]
|
|
6
|
+
*
|
|
7
|
+
* This stays intentionally lightweight. For larger automation flows, prefer
|
|
8
|
+
* calling the ONNX export API directly from application code.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import fs from 'node:fs';
|
|
12
|
+
import path from 'node:path';
|
|
13
|
+
import { pathToFileURL } from 'node:url';
|
|
14
|
+
|
|
15
|
+
const PRIMARY_ONNX_MODULE_PATH = path.resolve(
|
|
16
|
+
'dist',
|
|
17
|
+
'architecture',
|
|
18
|
+
'onnx.js',
|
|
19
|
+
);
|
|
20
|
+
const FALLBACK_ONNX_MODULE_PATH = path.resolve(
|
|
21
|
+
'dist',
|
|
22
|
+
'architecture',
|
|
23
|
+
'network',
|
|
24
|
+
'network.onnx.js',
|
|
25
|
+
);
|
|
26
|
+
const NETWORK_MODULE_PATH = path.resolve('dist', 'architecture', 'network.js');
|
|
27
|
+
|
|
28
|
+
interface ExportOnnxOptions {
|
|
29
|
+
includeMetadata: boolean;
|
|
30
|
+
batchDimension: boolean;
|
|
31
|
+
legacyNodeOrdering: boolean;
|
|
32
|
+
allowPartialConnectivity: boolean;
|
|
33
|
+
allowMixedActivations: boolean;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
interface NetworkLike {
|
|
37
|
+
toJSON?: () => unknown;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
interface NetworkFactory<TNetwork extends NetworkLike> {
|
|
41
|
+
fromJSON(raw: unknown): TNetwork;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
interface OnnxExportModule<TNetwork extends NetworkLike> {
|
|
45
|
+
exportToONNX: (network: TNetwork, options: ExportOnnxOptions) => unknown;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
interface DistDependencies<TNetwork extends NetworkLike> {
|
|
49
|
+
Network: NetworkFactory<TNetwork>;
|
|
50
|
+
exportToONNX: OnnxExportModule<TNetwork>['exportToONNX'];
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
interface ParsedCliOptions extends ExportOnnxOptions {
|
|
54
|
+
inputFile: string;
|
|
55
|
+
outputFile: string;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* Runs the ONNX export CLI.
|
|
60
|
+
*
|
|
61
|
+
* @returns Promise resolved when export succeeds.
|
|
62
|
+
*/
|
|
63
|
+
async function main(): Promise<void> {
|
|
64
|
+
const rawArguments = process.argv.slice(2);
|
|
65
|
+
if (hasFlag(rawArguments, '--help') || hasFlag(rawArguments, '-h')) {
|
|
66
|
+
printUsage();
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
const cliOptions = parseCliOptions(rawArguments);
|
|
71
|
+
const { Network, exportToONNX } = await loadDistDependencies<NetworkLike>();
|
|
72
|
+
const networkJson = readJsonFile(cliOptions.inputFile);
|
|
73
|
+
const network = Network.fromJSON(networkJson);
|
|
74
|
+
const onnxJson = exportToONNX(network, cliOptions);
|
|
75
|
+
|
|
76
|
+
fs.writeFileSync(
|
|
77
|
+
path.resolve(cliOptions.outputFile),
|
|
78
|
+
`${JSON.stringify(onnxJson, null, 2)}\n`,
|
|
79
|
+
'utf8',
|
|
80
|
+
);
|
|
81
|
+
console.log(`ONNX JSON written to ${cliOptions.outputFile}`);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* Parses CLI options from raw process arguments.
|
|
86
|
+
*
|
|
87
|
+
* @param rawArguments - CLI arguments after the script path.
|
|
88
|
+
* @returns Parsed and validated CLI options.
|
|
89
|
+
*/
|
|
90
|
+
function parseCliOptions(rawArguments: readonly string[]): ParsedCliOptions {
|
|
91
|
+
const inputFile = resolveOptionValue(rawArguments, '--in');
|
|
92
|
+
const outputFile = resolveOptionValue(rawArguments, '--out');
|
|
93
|
+
|
|
94
|
+
if (!inputFile || !outputFile) {
|
|
95
|
+
printUsageAndExit('Error: --in and --out are required.');
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
return {
|
|
99
|
+
inputFile,
|
|
100
|
+
outputFile,
|
|
101
|
+
includeMetadata: hasFlag(rawArguments, '--metadata'),
|
|
102
|
+
batchDimension: hasFlag(rawArguments, '--batch'),
|
|
103
|
+
legacyNodeOrdering: hasFlag(rawArguments, '--legacy'),
|
|
104
|
+
allowPartialConnectivity: hasFlag(rawArguments, '--partial'),
|
|
105
|
+
allowMixedActivations: hasFlag(rawArguments, '--mixed'),
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* Resolves one option value from `--name value` or `--name=value` syntax.
|
|
111
|
+
*
|
|
112
|
+
* @param rawArguments - CLI arguments after the script path.
|
|
113
|
+
* @param optionName - Long option name including leading dashes.
|
|
114
|
+
* @returns Option value when present.
|
|
115
|
+
*/
|
|
116
|
+
function resolveOptionValue(
|
|
117
|
+
rawArguments: readonly string[],
|
|
118
|
+
optionName: string,
|
|
119
|
+
): string | undefined {
|
|
120
|
+
const exactIndex = rawArguments.indexOf(optionName);
|
|
121
|
+
if (exactIndex >= 0) {
|
|
122
|
+
return rawArguments[exactIndex + 1];
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
const inlineArgument = rawArguments.find((argument) =>
|
|
126
|
+
argument.startsWith(`${optionName}=`),
|
|
127
|
+
);
|
|
128
|
+
return inlineArgument?.slice(optionName.length + 1);
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
/**
|
|
132
|
+
* Checks whether a boolean flag is present.
|
|
133
|
+
*
|
|
134
|
+
* @param rawArguments - CLI arguments after the script path.
|
|
135
|
+
* @param optionName - Flag name including leading dashes.
|
|
136
|
+
* @returns `true` when the flag is present.
|
|
137
|
+
*/
|
|
138
|
+
function hasFlag(rawArguments: readonly string[], optionName: string): boolean {
|
|
139
|
+
return rawArguments.includes(optionName);
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
/**
|
|
143
|
+
* Loads the built network and ONNX export modules from `dist/`.
|
|
144
|
+
*
|
|
145
|
+
* @returns The built network constructor and ONNX export function.
|
|
146
|
+
*/
|
|
147
|
+
async function loadDistDependencies<TNetwork extends NetworkLike>(): Promise<
|
|
148
|
+
DistDependencies<TNetwork>
|
|
149
|
+
> {
|
|
150
|
+
const onnxModule = (await importModuleWithFallback<
|
|
151
|
+
Partial<OnnxExportModule<TNetwork>>
|
|
152
|
+
>(PRIMARY_ONNX_MODULE_PATH, FALLBACK_ONNX_MODULE_PATH)) as Partial<
|
|
153
|
+
OnnxExportModule<TNetwork>
|
|
154
|
+
>;
|
|
155
|
+
const networkModule = (await import(
|
|
156
|
+
pathToFileURL(NETWORK_MODULE_PATH).href
|
|
157
|
+
)) as { default?: NetworkFactory<TNetwork> };
|
|
158
|
+
|
|
159
|
+
if (!networkModule.default || typeof onnxModule.exportToONNX !== 'function') {
|
|
160
|
+
throw new Error(
|
|
161
|
+
'Failed to load built ONNX export dependencies from dist/.',
|
|
162
|
+
);
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
return {
|
|
166
|
+
Network: networkModule.default,
|
|
167
|
+
exportToONNX: onnxModule.exportToONNX,
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
/**
|
|
172
|
+
* Imports the primary built module, falling back to a secondary path when the
|
|
173
|
+
* public layout has shifted.
|
|
174
|
+
*
|
|
175
|
+
* @param primaryModulePath - Preferred built module path.
|
|
176
|
+
* @param fallbackModulePath - Fallback built module path.
|
|
177
|
+
* @returns Imported module namespace.
|
|
178
|
+
*/
|
|
179
|
+
async function importModuleWithFallback<TModule>(
|
|
180
|
+
primaryModulePath: string,
|
|
181
|
+
fallbackModulePath: string,
|
|
182
|
+
): Promise<TModule> {
|
|
183
|
+
try {
|
|
184
|
+
return (await import(pathToFileURL(primaryModulePath).href)) as TModule;
|
|
185
|
+
} catch {
|
|
186
|
+
return (await import(pathToFileURL(fallbackModulePath).href)) as TModule;
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
/**
|
|
191
|
+
* Reads and parses one JSON file.
|
|
192
|
+
*
|
|
193
|
+
* @param filePath - Source JSON file path.
|
|
194
|
+
* @returns Parsed JSON value.
|
|
195
|
+
*/
|
|
196
|
+
function readJsonFile(filePath: string): unknown {
|
|
197
|
+
return JSON.parse(fs.readFileSync(path.resolve(filePath), 'utf8')) as unknown;
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
/** Prints CLI usage text. */
|
|
201
|
+
function printUsage(): void {
|
|
202
|
+
console.log(
|
|
203
|
+
'Usage: npm run onnx:export -- --in network.json --out model.onnx.json [--metadata] [--batch] [--legacy] [--partial] [--mixed]',
|
|
204
|
+
);
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
/**
|
|
208
|
+
* Prints CLI usage text and exits the process with failure.
|
|
209
|
+
*
|
|
210
|
+
* @param message - Error message shown before usage text.
|
|
211
|
+
* @returns Never returns.
|
|
212
|
+
*/
|
|
213
|
+
function printUsageAndExit(message: string): never {
|
|
214
|
+
console.error(message);
|
|
215
|
+
printUsage();
|
|
216
|
+
process.exit(1);
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
main().catch((error: unknown) => {
|
|
220
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
221
|
+
console.error('Export failed:', errorMessage);
|
|
222
|
+
process.exit(1);
|
|
223
|
+
});
|