/** * RESPONSE SHAPE — what does your optimum actually look like? "Find the best setting" hides a question that * changes everything you do next: is the best a sharp PEAK (one precise spot, hold it tight), a RIDGE (a * whole LINE of settings that all work equally well — huge freedom), a SADDLE (improving one knob forces * another to get worse — proceed carefully), a PLATEAU (broad and flat — almost anything nearby is fine), or * a BOWL/EDGE (the best the data shows is at a boundary — push the limits further)? Knowing the shape tells * you how much to trust the optimum, how tightly to hold it, and where to explore. * * SHAPE fits the response curvature (the Hessian) around your data and reads the SIGNS and magnitudes of its * eigenvalues — the geometry of the surface. All curving down → a peak. One flat direction → a ridge. Mixed * up-and-down → a saddle. All curving up (for a maximiser) → you're climbing toward an edge. It's the same * eigen-geometry physicists use to classify critical points, turned into one plain word. * * Honest by construction (DIAKRISIS): a LOCAL second-order picture, valid where your data concentrates; * eigenvalue signs are read with a small dead-band so near-zero curvatures are honestly called "flat". It * abstains when there isn't enough data to fit a curvature. */ import { type Space } from "./space.js"; import { type Observation, type Goal } from "./engine.js"; export type ShapeKind = "peak" | "ridge" | "saddle" | "plateau" | "bowl" | "unknown"; export interface ShapeReport { shape: ShapeKind; curvatures: number[]; flatDirections: number; note: string; } /** Classify the geometric shape of the response around the data (peak / ridge / saddle / plateau / bowl). */ export declare function analyzeShape(obs: ReadonlyArray, space: Space, goal?: Goal): ShapeReport; export declare function shapeGauntlet(): { score: 0 | 100; checks: Array<{ name: string; pass: boolean; detail: string; }>; }; //# sourceMappingURL=shape.d.ts.map