@vessel-dsp/runtime 0.3.1 → 0.4.1
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/README.md +7 -3
- package/dist/reference-runtime.d.ts +223 -5
- package/dist/reference-runtime.d.ts.map +1 -1
- package/dist/reference-runtime.js +669 -107
- package/dist/reference-runtime.js.map +1 -1
- package/dist/resample.d.ts +68 -0
- package/dist/resample.d.ts.map +1 -0
- package/dist/resample.js +204 -0
- package/dist/resample.js.map +1 -0
- package/dist/v2-wasm-engine.d.ts +32 -0
- package/dist/v2-wasm-engine.d.ts.map +1 -1
- package/dist/v2-wasm-engine.js +49 -1
- package/dist/v2-wasm-engine.js.map +1 -1
- package/dist/wasm/v2_dsp.cjs +1 -1
- package/dist/wasm/v2_dsp.wasm +0 -0
- package/dist/worklet/v2-audio-worklet.js +720 -101
- package/package.json +2 -2
- package/dist/numeric-pivot.d.ts +0 -4
- package/dist/numeric-pivot.d.ts.map +0 -1
- package/dist/numeric-pivot.js +0 -192
- package/dist/numeric-pivot.js.map +0 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vessel-dsp/runtime",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.4.1",
|
|
4
4
|
"description": "Real-time MNA simulation runtime and solver console for VesselDSP Program ROMs.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"guitar-pedal",
|
|
@@ -58,7 +58,7 @@
|
|
|
58
58
|
"generate-kernels": "bun scripts/generate-kernels.ts"
|
|
59
59
|
},
|
|
60
60
|
"dependencies": {
|
|
61
|
-
"@vessel-dsp/compiler": "0.
|
|
61
|
+
"@vessel-dsp/compiler": "0.4.0"
|
|
62
62
|
},
|
|
63
63
|
"publishConfig": {
|
|
64
64
|
"access": "public"
|
package/dist/numeric-pivot.d.ts
DELETED
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
import type { SparseSchedule } from "@vessel-dsp/compiler";
|
|
2
|
-
export declare const NUMERIC_REPIVOT_TAU = 0.001;
|
|
3
|
-
export declare function computeNumericRepivot(schedule: SparseSchedule, size: number, matrix: readonly (readonly number[])[], tau?: number): SparseSchedule | null;
|
|
4
|
-
//# sourceMappingURL=numeric-pivot.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"numeric-pivot.d.ts","sourceRoot":"","sources":["../src/numeric-pivot.ts"],"names":[],"mappings":"AAqBA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAE3D,eAAO,MAAM,mBAAmB,QAAO,CAAC;AAIxC,wBAAgB,qBAAqB,CACpC,QAAQ,EAAE,cAAc,EACxB,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,SAAS,CAAC,SAAS,MAAM,EAAE,CAAC,EAAE,EACtC,GAAG,GAAE,MAA4B,GAC/B,cAAc,GAAG,IAAI,CA8KvB"}
|
package/dist/numeric-pivot.js
DELETED
|
@@ -1,192 +0,0 @@
|
|
|
1
|
-
// Runtime numeric re-pivot: choose a sparse elimination order from the block's
|
|
2
|
-
// actual operating-point matrix instead of the compiler's value-blind pattern.
|
|
3
|
-
//
|
|
4
|
-
// The compiler's schedule is built from symbol sets, so a pivot that is
|
|
5
|
-
// structurally present but numerically tiny (a node diagonal whose only
|
|
6
|
-
// unconditional contributor is `gmin`) can be chosen because it minimises fill.
|
|
7
|
-
// Replaying that order divides by ~1e-12 against entries of order 1e2, which is
|
|
8
|
-
// the `boss-aw-2` non-convergence and the `hiwatt`/`tr-2` sparse-vs-dense
|
|
9
|
-
// disagreement. `settlePivotOrders` validates the shipped order on the assembled
|
|
10
|
-
// operating-point matrix and, when it disagrees with dense, used to drop the
|
|
11
|
-
// block to dense for the life of the engine. This module gives it a second
|
|
12
|
-
// order to try first: threshold Markowitz (a pivot must be at least `tau` of its
|
|
13
|
-
// column's remaining maximum) over the schedule's own filled pattern, with the
|
|
14
|
-
// candidate scan in ascending row/column order so both consoles choose the same
|
|
15
|
-
// pivots.
|
|
16
|
-
//
|
|
17
|
-
// The interpreter (`runSparseSchedule`) and the C++ port in `Engine.cpp` replay
|
|
18
|
-
// the returned schedule exactly as the compiler's; the caller re-validates it
|
|
19
|
-
// against dense before adopting it, so a failed re-pivot degrades to dense
|
|
20
|
-
// rather than to a wrong answer.
|
|
21
|
-
export const NUMERIC_REPIVOT_TAU = 1e-3;
|
|
22
|
-
export function computeNumericRepivot(schedule, size, matrix, tau = NUMERIC_REPIVOT_TAU) {
|
|
23
|
-
const rows = Array.from({ length: size }, () => new Set());
|
|
24
|
-
const columns = Array.from({ length: size }, () => new Set());
|
|
25
|
-
for (let slot = 0; slot < schedule.gatherRow.length; slot += 1) {
|
|
26
|
-
const row = schedule.gatherRow[slot];
|
|
27
|
-
const column = schedule.gatherColumn[slot];
|
|
28
|
-
rows[row].add(column);
|
|
29
|
-
columns[column].add(row);
|
|
30
|
-
}
|
|
31
|
-
const working = matrix.map((row) => [...row]);
|
|
32
|
-
const doneRow = new Array(size).fill(false);
|
|
33
|
-
const doneColumn = new Array(size).fill(false);
|
|
34
|
-
const pivots = [];
|
|
35
|
-
for (let step = 0; step < size; step += 1) {
|
|
36
|
-
let bestRow = -1;
|
|
37
|
-
let bestColumn = -1;
|
|
38
|
-
let bestKey = Infinity;
|
|
39
|
-
for (let row = 0; row < size; row += 1) {
|
|
40
|
-
if (doneRow[row] === true)
|
|
41
|
-
continue;
|
|
42
|
-
const rowSet = rows[row];
|
|
43
|
-
let rowCount = 0;
|
|
44
|
-
for (const column of rowSet) {
|
|
45
|
-
if (doneColumn[column] !== true)
|
|
46
|
-
rowCount += 1;
|
|
47
|
-
}
|
|
48
|
-
if (rowCount === 0)
|
|
49
|
-
continue;
|
|
50
|
-
for (const column of rowSet) {
|
|
51
|
-
if (doneColumn[column] === true)
|
|
52
|
-
continue;
|
|
53
|
-
let columnCount = 0;
|
|
54
|
-
let columnMax = 0;
|
|
55
|
-
for (const other of columns[column]) {
|
|
56
|
-
if (doneRow[other] === true)
|
|
57
|
-
continue;
|
|
58
|
-
columnCount += 1;
|
|
59
|
-
const magnitude = Math.abs(working[other][column] ?? 0);
|
|
60
|
-
if (magnitude > columnMax)
|
|
61
|
-
columnMax = magnitude;
|
|
62
|
-
}
|
|
63
|
-
const value = Math.abs(working[row][column] ?? 0);
|
|
64
|
-
if (!(columnMax > 0) || value < tau * columnMax)
|
|
65
|
-
continue;
|
|
66
|
-
const key = (rowCount - 1) * (columnCount - 1) * 2 + (row === column ? 0 : 1);
|
|
67
|
-
if (key < bestKey ||
|
|
68
|
-
(key === bestKey &&
|
|
69
|
-
(row < bestRow || (row === bestRow && column < bestColumn)))) {
|
|
70
|
-
bestKey = key;
|
|
71
|
-
bestRow = row;
|
|
72
|
-
bestColumn = column;
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
if (bestRow < 0) {
|
|
77
|
-
return null;
|
|
78
|
-
}
|
|
79
|
-
const pivotValue = working[bestRow][bestColumn];
|
|
80
|
-
const pivotRowSymbolic = [...rows[bestRow]].filter((column) => doneColumn[column] !== true && column !== bestColumn);
|
|
81
|
-
const pivotColumnSymbolic = [...columns[bestColumn]].filter((row) => doneRow[row] !== true && row !== bestRow);
|
|
82
|
-
for (const row of pivotColumnSymbolic) {
|
|
83
|
-
for (const column of pivotRowSymbolic) {
|
|
84
|
-
if (!rows[row].has(column)) {
|
|
85
|
-
rows[row].add(column);
|
|
86
|
-
columns[column].add(row);
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
for (const row of pivotColumnSymbolic) {
|
|
91
|
-
const target = working[row];
|
|
92
|
-
const factor = target[bestColumn] / pivotValue;
|
|
93
|
-
if (factor !== 0) {
|
|
94
|
-
const source = working[bestRow];
|
|
95
|
-
for (let column = 0; column < size; column += 1) {
|
|
96
|
-
if (doneColumn[column] !== true && column !== bestColumn) {
|
|
97
|
-
target[column] =
|
|
98
|
-
target[column] - factor * source[column];
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
target[bestColumn] = 0;
|
|
103
|
-
}
|
|
104
|
-
pivots.push({ row: bestRow, column: bestColumn });
|
|
105
|
-
doneRow[bestRow] = true;
|
|
106
|
-
doneColumn[bestColumn] = true;
|
|
107
|
-
}
|
|
108
|
-
if (pivots.length !== size) {
|
|
109
|
-
return null;
|
|
110
|
-
}
|
|
111
|
-
const slotOf = new Map();
|
|
112
|
-
const gatherRow = [];
|
|
113
|
-
const gatherColumn = [];
|
|
114
|
-
for (let row = 0; row < size; row += 1) {
|
|
115
|
-
const sorted = [...rows[row]].sort((a, b) => a - b);
|
|
116
|
-
for (const column of sorted) {
|
|
117
|
-
slotOf.set(row * size + column, gatherRow.length);
|
|
118
|
-
gatherRow.push(row);
|
|
119
|
-
gatherColumn.push(column);
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
const slot = (row, column) => {
|
|
123
|
-
const found = slotOf.get(row * size + column);
|
|
124
|
-
if (found === undefined) {
|
|
125
|
-
throw new Error(`numeric re-pivot: no slot for (${row}, ${column})`);
|
|
126
|
-
}
|
|
127
|
-
return found;
|
|
128
|
-
};
|
|
129
|
-
const liveRows = Array.from({ length: size }, () => new Set());
|
|
130
|
-
const liveColumns = Array.from({ length: size }, () => new Set());
|
|
131
|
-
for (let slotIndex = 0; slotIndex < schedule.gatherRow.length; slotIndex += 1) {
|
|
132
|
-
const row = schedule.gatherRow[slotIndex];
|
|
133
|
-
const column = schedule.gatherColumn[slotIndex];
|
|
134
|
-
liveRows[row].add(column);
|
|
135
|
-
liveColumns[column].add(row);
|
|
136
|
-
}
|
|
137
|
-
const eliminatedRow = new Array(size).fill(false);
|
|
138
|
-
const eliminatedColumn = new Array(size).fill(false);
|
|
139
|
-
const ops = [];
|
|
140
|
-
let factorCount = 0;
|
|
141
|
-
let sparseOps = 0;
|
|
142
|
-
for (const pivot of pivots) {
|
|
143
|
-
ops.push(6, slot(pivot.row, pivot.column), 0, 0);
|
|
144
|
-
const pivotRow = [...liveRows[pivot.row]]
|
|
145
|
-
.filter((column) => eliminatedColumn[column] !== true && column !== pivot.column)
|
|
146
|
-
.sort((a, b) => a - b);
|
|
147
|
-
const pivotColumn = [...liveColumns[pivot.column]]
|
|
148
|
-
.filter((row) => eliminatedRow[row] !== true && row !== pivot.row)
|
|
149
|
-
.sort((a, b) => a - b);
|
|
150
|
-
for (const row of pivotColumn) {
|
|
151
|
-
const factor = factorCount;
|
|
152
|
-
factorCount += 1;
|
|
153
|
-
ops.push(0, factor, slot(row, pivot.column), slot(pivot.row, pivot.column));
|
|
154
|
-
for (const column of pivotRow) {
|
|
155
|
-
if (!liveRows[row].has(column)) {
|
|
156
|
-
liveRows[row].add(column);
|
|
157
|
-
liveColumns[column].add(row);
|
|
158
|
-
}
|
|
159
|
-
ops.push(1, slot(row, column), factor, slot(pivot.row, column));
|
|
160
|
-
sparseOps += 1;
|
|
161
|
-
}
|
|
162
|
-
ops.push(2, row, factor, pivot.row);
|
|
163
|
-
sparseOps += 1;
|
|
164
|
-
}
|
|
165
|
-
eliminatedRow[pivot.row] = true;
|
|
166
|
-
eliminatedColumn[pivot.column] = true;
|
|
167
|
-
}
|
|
168
|
-
for (let step = pivots.length - 1; step >= 0; step -= 1) {
|
|
169
|
-
const pivot = pivots[step];
|
|
170
|
-
ops.push(3, pivot.row, 0, 0);
|
|
171
|
-
for (let later = step + 1; later < pivots.length; later += 1) {
|
|
172
|
-
const column = pivots[later].column;
|
|
173
|
-
if (liveRows[pivot.row].has(column)) {
|
|
174
|
-
ops.push(4, slot(pivot.row, column), column, 0);
|
|
175
|
-
sparseOps += 1;
|
|
176
|
-
}
|
|
177
|
-
}
|
|
178
|
-
ops.push(5, pivot.column, slot(pivot.row, pivot.column), 0);
|
|
179
|
-
}
|
|
180
|
-
return {
|
|
181
|
-
ops,
|
|
182
|
-
slots: gatherRow.length,
|
|
183
|
-
factorCount,
|
|
184
|
-
gatherRow,
|
|
185
|
-
gatherColumn,
|
|
186
|
-
size,
|
|
187
|
-
sparseOps,
|
|
188
|
-
denseOps: (size * size * size - size) / 3,
|
|
189
|
-
unprovenPivots: 0,
|
|
190
|
-
};
|
|
191
|
-
}
|
|
192
|
-
//# sourceMappingURL=numeric-pivot.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"numeric-pivot.js","sourceRoot":"","sources":["../src/numeric-pivot.ts"],"names":[],"mappings":"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"}
|