import { NodeRunner } from "../src/node"; import { buildRunBundle, cloneSpec, defaultSpec, getMethod, parsePlateResult, type PlateResult, type ProblemSpec, type RunResult, } from "../src/index"; export const runner = new NodeRunner(); /** A small, fast problem for tests: coarse grid, short windows. */ export function testSpec(): ProblemSpec { const s = defaultSpec(); s.output.duration = 0.05; s.output.nframes = 12; s.output.grid = [31, 21]; s.fd.nx = 31; s.fd.ny = 21; s.fd.duration = 0.003; s.listener.patches = [12, 8]; s.implicit = { nx: 31, ny: 21, duration: 0.003, steps_per_sample: 1, theta: 0.25 }; return s; } export async function solve(spec: ProblemSpec, methodId: string): Promise<{ run: RunResult; result: PlateResult }> { const run = await runner.run({ bundle: buildRunBundle(spec, getMethod(methodId)) }); if (!run.ok) throw new Error(`${methodId} failed: ${run.error}\n${run.output.join("")}`); return { run, result: parsePlateResult(run.value) }; } export function relL2(a: ArrayLike, b: ArrayLike): number { let num = 0; let den = 0; for (let i = 0; i < a.length; i++) { num += (a[i] - b[i]) ** 2; den += a[i] ** 2; } return Math.sqrt(num / Math.max(den, 1e-300)); } export function maxAbs(a: ArrayLike): number { let m = 0; for (let i = 0; i < a.length; i++) m = Math.max(m, Math.abs(a[i])); return m; } export { cloneSpec };