tune(manifold): strengthen default geometric push
This commit is contained in:
parent
13013077d4
commit
326deb9a17
6 changed files with 25 additions and 10 deletions
|
|
@ -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`
|
||||||
|
|
|
||||||
|
|
@ -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.
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
|
|
|
||||||
|
|
@ -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();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue