tune(manifold): strengthen default geometric push

This commit is contained in:
monkey-w1n5t0n 2026-07-25 17:18:44 +02:00
parent 13013077d4
commit 326deb9a17
6 changed files with 25 additions and 10 deletions

View file

@ -117,8 +117,10 @@ Legacy a-immersive was mobile-first; Manifold is desktop-first. Defer until user
~1000x change end to end, and now within ~4x of the legacy Diffuse design instead of ~1000x change end to end, and now within ~4x of the legacy Diffuse design instead of
~4100x (`ml_bench` A4). The follow-up now adopts upstream's repeated-all-negatives ~4100x (`ml_bench` A4). The follow-up now adopts upstream's repeated-all-negatives
schedule and full-strength wall-clock lifetime through a deterministic elapsed-time schedule and full-strength wall-clock lifetime through a deterministic elapsed-time
core seam. Manifold defaults to 0.001 LR, 200 Hz and 2500 ms, exposes all three in the core seam. After operator calibration, Manifold defaults to 0.003 LR, 200 Hz and
expanded Learning panel, and allows rate/lifetime zero as an explicit one-shot A/B. 2500 ms, exposes all three in the expanded Learning panel, and allows rate/lifetime
zero as an explicit one-shot A/B. The shared core fallback and the panel's explicit
"Upstream defaults" preset remain 0.001 LR, 200 Hz and 2500 ms.
- 2026-07-25: **`InterfaceRL` is back in the tree (defect 6c).** Vendored verbatim from - 2026-07-25: **`InterfaceRL` is back in the tree (defect 6c).** Vendored verbatim from
memllib `e291192` at `firmware/MEMLNaut-NISPS/lib/memllib/reference/` — outside `src/`, memllib `e291192` at `firmware/MEMLNaut-NISPS/lib/memllib/reference/` — outside `src/`,
so PlatformIO never compiles it. Upstream drift in the feedback subsystem is a `diff` so PlatformIO never compiles it. Upstream drift in the feedback subsystem is a `diff`

View file

@ -15,8 +15,11 @@ supersede the older `0a541cc` constants and synchronous-one-shot wording below:
- a press stores the rejection and performs one immediate update, then - a press stores the rejection and performs one immediate update, then
`FeedbackControllerCore::advance_geometric(dt)` replays **all** live negatives at a `FeedbackControllerCore::advance_geometric(dt)` replays **all** live negatives at a
configurable rate for a full-strength wall-clock lifetime; configurable rate for a full-strength wall-clock lifetime;
- defaults match upstream: LR `0.001`, `200 Hz`, `2500 ms`; rate or lifetime zero is - the shared core fallback and Manifold's "Upstream defaults" experiment preset match
explicit one-shot mode; upstream: LR `0.001`, `200 Hz`, `2500 ms`; rate or lifetime zero is explicit one-shot
mode;
- after operator calibration on 2026-07-25, Manifold starts at LR `0.003`, `200 Hz`,
`2500 ms`; this product default does not change the firmware/core fallback;
- the host supplies elapsed time, but target computation and every weight mutation stay - the host supplies elapsed time, but target computation and every weight mutation stay
in the allocation-free shared C++ core. Native↔WASM parity covers this seam. in the allocation-free shared C++ core. Native↔WASM parity covers this seam.

View file

@ -34,7 +34,7 @@ import type { ExampleResizePolicy, NetworkResizePolicy } from '../engine/io-resh
import { import {
useEngine, useEngine,
useEngineVersion, useEngineVersion,
DEFAULT_GEOMETRIC_FEEDBACK_CONFIG, UPSTREAM_GEOMETRIC_FEEDBACK_CONFIG,
} from '../engine'; } from '../engine';
import { EditorPanel } from '../serial/EditorPanel'; import { EditorPanel } from '../serial/EditorPanel';
import { TrainingHealth } from './TrainingHealth'; import { TrainingHealth } from './TrainingHealth';
@ -362,7 +362,7 @@ function LearningDrawer(ctx: ConsoleCtx, depth: DrawerDepth) {
size="sm" size="sm"
variant="secondary" variant="secondary"
onClick={() => onClick={() =>
ctx.setGeometricConfig({ ...DEFAULT_GEOMETRIC_FEEDBACK_CONFIG }) ctx.setGeometricConfig({ ...UPSTREAM_GEOMETRIC_FEEDBACK_CONFIG })
} }
> >
Upstream defaults Upstream defaults

View file

@ -30,12 +30,19 @@ export interface GeometricFeedbackConfig {
lifetimeMs: number; lifetimeMs: number;
} }
export const DEFAULT_GEOMETRIC_FEEDBACK_CONFIG: Readonly<GeometricFeedbackConfig> = { /** Verified upstream InterfaceRL replay settings, retained as an A/B preset. */
export const UPSTREAM_GEOMETRIC_FEEDBACK_CONFIG: Readonly<GeometricFeedbackConfig> = {
learningRate: 0.001, learningRate: 0.001,
updatesPerSecond: 200, updatesPerSecond: 200,
lifetimeMs: 2500, lifetimeMs: 2500,
}; };
/** Manifold's operator-calibrated product default. */
export const DEFAULT_GEOMETRIC_FEEDBACK_CONFIG: Readonly<GeometricFeedbackConfig> = {
...UPSTREAM_GEOMETRIC_FEEDBACK_CONFIG,
learningRate: 0.003,
};
export interface EngineFeedbackApi { export interface EngineFeedbackApi {
/** Positive feedback (thumbs-up). Returns the FeedbackAction int. */ /** Positive feedback (thumbs-up). Returns the FeedbackAction int. */
thumbsUp(): number; thumbsUp(): number;

View file

@ -9,6 +9,7 @@ export {
EngineApi, EngineApi,
createEngine, createEngine,
DEFAULT_GEOMETRIC_FEEDBACK_CONFIG, DEFAULT_GEOMETRIC_FEEDBACK_CONFIG,
UPSTREAM_GEOMETRIC_FEEDBACK_CONFIG,
} from './engine-api'; } from './engine-api';
export type { export type {
EngineApiOptions, EngineApiOptions,

View file

@ -89,17 +89,19 @@ test.describe('geometric dislike (Mode 1) — core-backed', () => {
expect(result).toEqual({ first: 1, live: 1, second: 1, expired: 0 }); expect(result).toEqual({ first: 1, live: 1, second: 1, expired: 0 });
}); });
test('expanded Learning panel exposes the upstream-default experiment controls', async ({ page }) => { test('expanded Learning panel starts calibrated and can restore upstream defaults', async ({ page }) => {
await page.getByTitle('Learning', { exact: true }).click(); await page.getByTitle('Learning', { exact: true }).click();
await page.getByTitle('Expand', { exact: true }).click(); await page.getByTitle('Expand', { exact: true }).click();
await expect(page.getByText('push · learning rate', { exact: true })).toBeVisible(); await expect(page.getByText('push · learning rate', { exact: true })).toBeVisible();
await expect(page.getByText('push · updates / second', { exact: true })).toBeVisible(); await expect(page.getByText('push · updates / second', { exact: true })).toBeVisible();
await expect(page.getByText('push · lifetime', { exact: true })).toBeVisible(); await expect(page.getByText('push · lifetime', { exact: true })).toBeVisible();
await expect(page.getByText('0.0010', { exact: true })).toBeVisible(); await expect(page.getByText('0.0030', { exact: true })).toBeVisible();
await expect(page.getByText('200 Hz', { exact: true })).toBeVisible(); await expect(page.getByText('200 Hz', { exact: true })).toBeVisible();
await expect(page.getByText('2.5 s', { exact: true })).toBeVisible(); await expect(page.getByText('2.5 s', { exact: true })).toBeVisible();
await expect(page.getByRole('button', { name: 'Upstream defaults' })).toBeVisible();
await expect(page.getByText('≈ 500 replay updates + the press')).toBeVisible(); await expect(page.getByText('≈ 500 replay updates + the press')).toBeVisible();
await page.getByRole('button', { name: 'Upstream defaults' }).click();
await expect(page.getByText('0.0010', { exact: true })).toBeVisible();
}); });
}); });