Sweep pool size directly, and withdraw the claim that it mattered
The Epic 3 arms appeared to show that a small casting roster was the largest available win. Swept directly across 4, 8, 16 and 32 over twelve songs with three pool draws each, the differences are 0.003 to 0.007 against a run-to-run noise of +/-0.003 to +/-0.005. Pool size does nothing measurable. The arms varied two things at once — smaller pool AND the same pool for every song — and only the stages-versus-legacy comparison inside them held everything else constant. That one still stands at +14%. POOL_SIZE stays at 8, now on grounds the metric cannot see: about nine distinct scenes in a video rather than seventeen. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -96,7 +96,30 @@ const clamp01 = (x) => Math.max(0, Math.min(1, x));
|
||||
* scene declaring two traits is now merely less likely to be drawn than one
|
||||
* declaring four, instead of being ineligible for six tracks in seven.
|
||||
*/
|
||||
function castingPool(rng, signature, size = 24) {
|
||||
/**
|
||||
* How many of the library's scenes one track is allowed to draw on.
|
||||
*
|
||||
* Swept directly — checks.html?sweep=1 — across 4, 8, 16 and 32, over twelve
|
||||
* songs with three pool draws each. The answer is that it does not matter:
|
||||
*
|
||||
* pool 4 spread +0.0061 ±0.0035
|
||||
* pool 8 spread +0.0090 ±0.0040
|
||||
* pool 16 spread +0.0102 ±0.0046
|
||||
* pool 32 spread +0.0035 ±0.0032
|
||||
*
|
||||
* The differences are the same size as the run-to-run noise. This corrects a
|
||||
* claim made when the Epic 3 arms first came in: those arms appeared to show
|
||||
* that a small roster was the largest available win, but they varied two things
|
||||
* at once — the pool was smaller AND it was the same pool for every song — and
|
||||
* the sweep isolating size finds nothing.
|
||||
*
|
||||
* So 8 is chosen on grounds the metric cannot see. It puts about nine distinct
|
||||
* scenes in a video rather than seventeen, and a video a viewer can hold in
|
||||
* their head is worth having even when the instrument is indifferent.
|
||||
*/
|
||||
export const POOL_SIZE = 8;
|
||||
|
||||
function castingPool(rng, signature, size = POOL_SIZE) {
|
||||
const pool = scenes.filter((m) => m.role !== 'accent');
|
||||
const remaining = pool.slice();
|
||||
const weights = remaining.map((m) => signatureWeight(m, signature));
|
||||
@@ -320,7 +343,8 @@ function buildStack(module, accentRoster, overlayRoster, bias, rng, temperament)
|
||||
* @returns {object} LookSpec
|
||||
*/
|
||||
export function generateLook(track, {
|
||||
seed = null, samples = null, overrides = null, pool: poolOverride = null,
|
||||
seed = null, samples = null, overrides = null,
|
||||
pool: poolOverride = null, poolSize = POOL_SIZE,
|
||||
} = {}) {
|
||||
const resolvedSeed = seed !== null
|
||||
? seed >>> 0
|
||||
@@ -350,7 +374,7 @@ export function generateLook(track, {
|
||||
// comparable to the thing it is bounding.
|
||||
const pool = poolOverride && poolOverride.length
|
||||
? poolOverride
|
||||
: castingPool(rng.fork('pool'), personality.signature);
|
||||
: castingPool(rng.fork('pool'), personality.signature, poolSize);
|
||||
const rosterByKind = assignRostersByKind(
|
||||
track.sections, rng.fork('scenes'), personality.signature, director, pool);
|
||||
// The grain treatment: usually none, and when present described rather than
|
||||
|
||||
Reference in New Issue
Block a user