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
~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
core seam. Manifold defaults to 0.001 LR, 200 Hz and 2500 ms, exposes all three in the
expanded Learning panel, and allows rate/lifetime zero as an explicit one-shot A/B.
core seam. After operator calibration, Manifold defaults to 0.003 LR, 200 Hz and
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
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`

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
`FeedbackControllerCore::advance_geometric(dt)` replays **all** live negatives at a
configurable rate for a full-strength wall-clock lifetime;
- defaults match upstream: LR `0.001`, `200 Hz`, `2500 ms`; rate or lifetime zero is
explicit one-shot mode;
- the shared core fallback and Manifold's "Upstream defaults" experiment preset match
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
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 {
useEngine,
useEngineVersion,
DEFAULT_GEOMETRIC_FEEDBACK_CONFIG,
UPSTREAM_GEOMETRIC_FEEDBACK_CONFIG,
} from '../engine';
import { EditorPanel } from '../serial/EditorPanel';
import { TrainingHealth } from './TrainingHealth';
@ -362,7 +362,7 @@ function LearningDrawer(ctx: ConsoleCtx, depth: DrawerDepth) {
size="sm"
variant="secondary"
onClick={() =>
ctx.setGeometricConfig({ ...DEFAULT_GEOMETRIC_FEEDBACK_CONFIG })
ctx.setGeometricConfig({ ...UPSTREAM_GEOMETRIC_FEEDBACK_CONFIG })
}
>
Upstream defaults

View file

@ -30,12 +30,19 @@ export interface GeometricFeedbackConfig {
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,
updatesPerSecond: 200,
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 {
/** Positive feedback (thumbs-up). Returns the FeedbackAction int. */
thumbsUp(): number;

View file

@ -9,6 +9,7 @@ export {
EngineApi,
createEngine,
DEFAULT_GEOMETRIC_FEEDBACK_CONFIG,
UPSTREAM_GEOMETRIC_FEEDBACK_CONFIG,
} from './engine-api';
export type {
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 });
});
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('Expand', { exact: true }).click();
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 · 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('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 page.getByRole('button', { name: 'Upstream defaults' }).click();
await expect(page.getByText('0.0010', { exact: true })).toBeVisible();
});
});