1import { NodeRunner } from "../src/node";
2import {
3 buildRunBundle,
4 cloneSpec,
5 defaultSpec,
6 getMethod,
7 parsePlateResult,
8 type PlateResult,
9 type ProblemSpec,
10 type RunResult,
11} from "../src/index";
13export const runner = new NodeRunner();
15/** A small, fast problem for tests: coarse grid, short windows. */
16export function testSpec(): ProblemSpec {
17 const s = defaultSpec();
18 s.output.duration = 0.05;
19 s.output.nframes = 12;
20 s.output.grid = [31, 21];
21 s.fd.nx = 31;
22 s.fd.ny = 21;
23 s.fd.duration = 0.003;
24 s.listener.patches = [12, 8];
25 s.implicit = { nx: 31, ny: 21, duration: 0.003, steps_per_sample: 1, theta: 0.25 };
26 return s;
27}
29export async function solve(spec: ProblemSpec, methodId: string): Promise<{ run: RunResult; result: PlateResult }> {
30 const run = await runner.run({ bundle: buildRunBundle(spec, getMethod(methodId)) });
31 if (!run.ok) throw new Error(`${methodId} failed: ${run.error}\n${run.output.join("")}`);
32 return { run, result: parsePlateResult(run.value) };
33}
35export function relL2(a: ArrayLike<number>, b: ArrayLike<number>): number {
36 let num = 0;
37 let den = 0;
38 for (let i = 0; i < a.length; i++) {
39 num += (a[i] - b[i]) ** 2;
40 den += a[i] ** 2;
41 }
42 return Math.sqrt(num / Math.max(den, 1e-300));
43}
45export function maxAbs(a: ArrayLike<number>): number {
46 let m = 0;
47 for (let i = 0; i < a.length; i++) m = Math.max(m, Math.abs(a[i]));
48 return m;
49}
51export { cloneSpec };