# 5改善案の本体統合と再評価 ## 対象 前回評価表の「Numeric tile cache」より上にあった次の5案を `index.html` に統合した。 1. 一般周期検出 2. perturbation series approximation 3. sparse active state 4. dynamic multi-reference 5. CPU Worker fallback `Numeric tile cache` 以下は今回の対象外。基準は統合前の `index.html`(SHA-256 `8355da57...086a935`)。 ## 実装 ### 1. 周期検出 - direct f32 kernel に Brent 型 O(1) candidate search を追加。 - 単純な「近いから内部」判定は再評価で危険と判明したため、候補後に **2周期分の再一致**と **周期乗数 `|μ| < 0.95`** を確認してから `FIELD_INTERIOR_HEURISTIC=2` にする。 - `FIELD_INTERIOR_PROVEN=3` とは分離し、heuristic が1画素でもあれば `membershipCertified=false`。 - strict/export では無効。 - FAST perturbation 上の周期早期停止は撤回。forced-direct 診断で deep seahorse に false candidate が残ったため、deep path は series / continuation に任せる。 ### 2. Series approximation - reference worker で 1〜6次係数を更新。 - GPU に送るのは 1〜4次係数。5・6次は truncation error の安全側判定に使用。 - validity 条件を満たす最大 jump を reference ごとに計算し、FAST perturbation の初期反復を4次多項式評価へ置換。 - strict/export では series jump を無効化し、従来 recurrence を使う。 ### 3. Sparse active state 旧 continuation は state/queues/mark をほぼ全画素サイズで持っていた。新構成は以下。 - `DeepState`: active slot ごと 32 B - queue A/B: active slot ID - `pixelMap`: active slot → pixel index - membership: 1 bit/pixel bitset - 初期 capacity: `active * 1.25 + 256`(全画素上限) - correction により新しい `OPERATION_LIMIT` が生じた場合は、slot allocator を複雑化せず metadata から compact session を再構築する。 ### 4. Dynamic multi-reference - failure-guided reference recovery を最大3 passまで反復。 - 既に試した reference identity は再試行しない。 - 1 pass の改善が `max(8 pixels, 2%)` 未満なら打ち切る。 - 固定 2x2 / 3x3 配置ではなく、既存 failure sample + scorer を使って必要箇所だけ reference を追加する。 ### 5. CPU Worker fallback - WebGPU 非対応/初期化失敗時に最大4 Workerで direct Mandelbrot を描画。 - cardioid / period-2 bulb、有限 iteration、既存 palette の主要表示をサポート。 - JS `Number` で adjacent pixel を区別できない deep zoom では停止し、誤った deep image を出さない。 - CPU fallback の `OPERATION_LIMIT` と周期 heuristic は未確定扱い。WebGPU の high-precision path の代替ではなく互換経路。 ## 再評価結果 ### 周期検出 96×64、maxIter=8192、candidate は 65,536 iteration まで escape を追跡。 | view | production backend | 反復仕事量削減 | false candidate | |---|---|---:|---:| | overview | direct | 84.9% | 0 | | period3-bulb | direct | 99.09% | 0 | | period3-core | direct | 99.12% | 0 | | seahorse-boundary | direct | 0% | 0 | | exterior | direct | 80.0% | 0 | | seahorse-deep | fast-extended | **周期停止を使用しない** | — | forced-direct では seahorse-deep に false candidate が残るため、FAST 側を無効化した判断は維持する。 ### Series approximation production fast-reference worker の実出力を使用し、4次 series と直接 perturbation の delta を8点で比較。 | span | jump | 最大絶対誤差 | |---:|---:|---:| | 1e-5 | 53 | 7.11e-9 | | 1e-7 | 446 | 7.74e-9 | | 1e-9 | 930 | 7.46e-9 | | 1e-11 | 1037 | 2.28e-9 | reference build の一部として係数を作るため CPU 側の追加仕事はあるが、deep zoom ほど jump が大きい。実 GPU frame time はこの環境では測れていない。 ### Sparse active state standard 1,048,576 px の continuation workspace モデル。 | active ratio | 旧 | 新 | 削減 | |---:|---:|---:|---:| | 100% | 44.0 MiB | 44.13 MiB | -0.28% | | 25% | 44.0 MiB | 13.89 MiB | 68.4% | | 10% | 44.0 MiB | 5.64 MiB | 87.2% | | 1% | 44.0 MiB | 0.686 MiB | 98.4% | active がほぼ全画面なら pixel map + bitset の分だけわずかに悪化する。狙いは sparse frontier であり、その条件では効果が大きい。 ### Dynamic multi-reference production は failure-guided 最大3追加 reference。GPU end-to-end の `A_num` は実 GPU 不在で測れないため、前回と同じ f32 perturbation locality surrogate を再実行した。 seahorse span=1e-7: - center 1 ref: class mismatch 2.578% - center + 2x2 (5 refs): **1.445%** - center + 3x3 (9 refs): 1.953% reference を無制限に増やすのは逆効果になり得るため、「失敗箇所から選ぶ + 3 pass cap」は妥当。 ### CPU fallback production `cpuFallbackWorkerSource()` 自体を Node worker shim で実行。640×360、350 iter、7 run median。 - 1 Worker: 約 97.2 ms - 4 Workers: 約 36.0 ms - speedup: **2.70×** - escaped / OP_LIMIT / heuristic / work count は 1 Worker と4 Workerで一致。 これはブラウザ 2D canvas compositing を含まない worker compute 値。 ## 回帰・サイズ - JS syntax: PASS - production regression: **5/5 PASS** - regression median: 約 0.08 s - WGSL kernels: 19本、hash 更新済み - `index.html`: 208,576 → 223,672 bytes(+7.24%) - gzip -9: 52,563 → 57,198 bytes(+8.82%) ## 実 GPU 検証の限界 コンテナの Headless Chromium + SwiftShader は EGL 初期化に失敗し、WebGPU smoke を開始できなかった。そのため以下は未測定。 - stable frame p50/p95 - GPU series jump の実時間短縮 - sparse scatter/gather の実 GPU overhead - dynamic multi-reference 導入後の production `A_num` したがって **CPU/数値 surrogate を GPU frame-time として扱わない**。 ## 結論 | 改善 | 統合判断 | 再評価 | |---|---|---| | 周期検出 | 採用(directのみ) | 高周期内部で非常に有効。FASTでは安全性不足のため無効 | | Series | 採用(interactive) | deepほど jump が増え、有望 | | Sparse active state | 採用 | active≪100%ならメモリ効果が明確 | | Dynamic multi-reference | 採用(最大3 pass) | reference増加は非単調。failure-guided capが妥当 | | CPU fallback | 採用 | 互換性改善。4 Workerで約2.7×、deep precision代替ではない | 次に実機で確認すべき優先順位は **series GPU frame time → sparse continuation latency → multi-reference の `A_num`**。