Generated from the full canonical file for this source snapshot. Line numbers match the library source.
Source SHA256: 5adf9eb8410beff8c45f8c8791c2b299faf7704893db9dd9ec97e6848f2141ee
1"""Private, preregistered recovery comparisons using the production CUDA oracle.23Independent layer integrals supply observations and assess answers, never runtime4proposals. The sampled reference for scattering uses a separate seed pool; it is5not fed back into model construction or candidate acceptance.6"""78# This private experiment driver inspects prepared workspaces for execution evidence.9# pyright: reportPrivateUsage=false10from __future__ import annotations1112import argparse13import hashlib14import json15import math16from dataclasses import asdict17from pathlib import Path18from time import perf_counter19from typing import Any2021from dpt.contracts import ContractError, integer22from dpt.experiments import RunRecorder23from dpt.statistics import mean_standard_error24from dpt.stochastic_recovery import StochasticPolicy, recover_expected_signal2526from .derivatives import TransportParameter27from .experiments import AbsorptionExperiment, _device_metadata, _recovery28from .forward import prepare_transport29from .inverse import prepare_transport_inverse30from .model import MaterialGrid, PlanarDetector, TransportSpec31from .rng import HistoryBatch32from .source import ParallelBeam3334# region book:transport-scattering-worked-inputs35_ABSORPTION = 0.336_SCATTERING = 0.137_OBSERVATION = 0.0838_INITIAL_AMPLITUDE = 0.08394041def _scattering_problem() -> tuple[TransportSpec, ParallelBeam]:42return (43TransportSpec(44MaterialGrid((-0.5, -0.5, 0.0), (1.0, 1.0, 1.0), (1, 1, 1), 1),45PlanarDetector((-2.0, -2.0), (4.0, 4.0), (1, 1), 2.0),4680.0,47"declared isotropic scattering cube for recovery validation",48estimator="continuous-absorption",49),50ParallelBeam((0.0, 0.0, -1.0), (0.0, 0.0)),51)525354# endregion book:transport-scattering-worked-inputs555657def scattering_policy(sampling_multiplier: int = 1) -> StochasticPolicy:58"""Scale original-history work without changing the objective or its gates."""59factor = integer(sampling_multiplier, "sampling_multiplier", minimum=1, maximum=32767)60return StochasticPolicy(61proposal="quadratic",62replicates=8,63initial_batch=4096 * factor,64maximum_batch=65536 * factor,65final_validation_batch=65536 * factor,66unique_history_budget=16_000_000 * factor,67numerical_gradient_allowance=1e-12,68)697071def scattering_configuration(sampling_multiplier: int = 1) -> dict[str, Any]:72policy = scattering_policy(sampling_multiplier)73spec, source = _scattering_problem()74return {75"sampling_multiplier": sampling_multiplier,76"policy": asdict(policy),77"workspace_max_histories": policy.maximum_batch,78"reference_batch": policy.maximum_batch,79"reference_replicates": 256,80"physical_spec": asdict(spec),81"source": asdict(source),82"material_ids": [0],83"absorption_mm_inverse": [_ABSORPTION],84"scattering_mm_inverse": [_SCATTERING],85"active_parameters": ["log-source-amplitude"],86"base_density": [1.0],87"pixel_weights": [1.0],88"observation": _OBSERVATION,89"initial_amplitude": _INITIAL_AMPLITUDE,90}919293def validate_scattering_configuration(configuration: dict[str, Any], multiplier: int) -> None:94"""New references declare the complete model; admit legacy default references."""95if "physical_spec" not in configuration:96if multiplier != 1:97raise ContractError("scaled reference lacks its physical/sampling configuration")98return99expected = {"seed": 419003, **scattering_configuration(multiplier)}100if any(101json.dumps(configuration.get(key), sort_keys=True) != json.dumps(value, sort_keys=True)102for key, value in expected.items()103):104raise ContractError("reference physical/sampling configuration differs from recovery")105106107def validate_scattering_reference(reference: dict[str, Any], sampling_multiplier: int) -> None:108"""Require the separately generated reference to use the declared work scale."""109policy = scattering_policy(sampling_multiplier)110if (111reference.get("batch") != policy.maximum_batch112or len(reference.get("replicates", [])) != 256113or reference.get("histories_traced") != 256 * policy.maximum_batch114or reference.get("seed") != 419003115):116raise ContractError("reference does not match the declared independent sampling design")117mean, standard_error = mean_standard_error(tuple(reference["replicates"]))118uncertainty = reference["absolute_uncertainty"]119if (120not math.isfinite(uncertainty)121or uncertainty < 0122or not math.isclose(mean, reference["mean"], rel_tol=1e-12, abs_tol=1e-15)123or not math.isclose(standard_error, reference["standard_error"], rel_tol=1e-12)124or not math.isclose(uncertainty, 7 * standard_error, rel_tol=1e-12)125or mean <= uncertainty126):127raise ContractError("reference statistics or positive mean interval are invalid")128129130def _scattering_run(131seed: int,132recorder: RunRecorder,133*,134reference: dict[str, Any] | None,135sampling_multiplier: int = 1,136) -> None:137policy = scattering_policy(sampling_multiplier)138if reference is not None:139validate_scattering_reference(reference, sampling_multiplier)140from dpt._runtime import prepare_context141142context = prepare_context()143wp = context.wp144# Fixed mathematical cube, not a surrogate tissue or measured acquisition.145spec, source = _scattering_problem()146workspace = prepare_transport(147spec,148material_ids=wp.array([0], dtype=wp.int32, device=context.device),149absorption=wp.array([_ABSORPTION], dtype=wp.float64, device=context.device),150scattering=wp.array([_SCATTERING], dtype=wp.float64, device=context.device),151max_histories=policy.maximum_batch,152device=str(context.device),153stream=context.stream,154)155# Observation is declared directly. The independent reference locates its156# optimum afterwards; no analytic/reference signal enters the oracle.157observation = _OBSERVATION158oracle = prepare_transport_inverse(159workspace,160source=source,161parameters=(TransportParameter("log-source-amplitude"),),162observation=wp.array([observation], dtype=wp.float64, device=context.device),163pixel_weights=wp.ones(1, dtype=wp.float64, device=context.device),164base_density=(1.0,),165local_model=True,166)167if reference is None:168means: list[float] = []169for replicate in range(256):170oracle._chart((0.0,))171oracle._mean(172HistoryBatch(seed, replicate * policy.maximum_batch, policy.maximum_batch),1731.0,174oracle._arrays["mean_a"],175)176workspace.check_status()177means.append(float(oracle._arrays["mean_a"].numpy()[0]))178mean, standard_error = mean_standard_error(tuple(means))179recorder.set_metadata(**_device_metadata(workspace))180recorder.write_json(181"reference.json",182{183"mean": mean,184"standard_error": standard_error,185"absolute_uncertainty": 7 * standard_error,186"uncertainty_method": (187"seven replicate standard errors; heuristic, not a finite-sample bound"188),189"seed": seed,190"batch": policy.maximum_batch,191"sampling_multiplier": sampling_multiplier,192"allocated_device_bytes": oracle.allocated_bytes,193"replicates": means,194"histories_traced": oracle.histories_traced,195"purpose": "independent held-out forward mean; never optimiser input",196},197)198return199start = perf_counter()200try:201result = recover_expected_signal(202oracle, (math.log(_INITIAL_AMPLITUDE),), seed=seed, policy=policy203)204except Exception as error:205snapshot = getattr(error, "recovery_diagnostics", None)206recorder.write_json(207"failure-diagnostics.json",208{209"error": repr(error),210"controller": asdict(snapshot) if snapshot is not None else None,211"histories_submitted_including_replay": oracle.histories_traced,212"parameter_upload_bytes": oracle.parameter_upload_bytes,213"scalar_download_bytes": oracle.scalar_download_bytes,214},215)216raise217elapsed = perf_counter() - start218amplitude = math.exp(result.parameters[0])219mu = reference["mean"]220error = reference["absolute_uncertainty"]221# Monotone in this positive-signal neighbourhood; evaluate both interval ends222# and its possible quadratic vertex to enclose the reference gradient.223means = [mu - error, mu + error]224vertex = observation / (2 * amplitude)225if means[0] < vertex < means[1]:226means.append(vertex)227gradients = [(amplitude * value - observation) * amplitude * value for value in means]228recorder.set_metadata(**_device_metadata(workspace))229recorder.write_json(230"recovery.json",231{232"seed": seed,233"sampling_multiplier": sampling_multiplier,234"policy": asdict(policy),235"result": asdict(result),236"amplitude": amplitude,237"independent_optimum_interval": [238observation / (mu + error),239observation / (mu - error),240],241"reference_gradient_interval": [min(gradients), max(gradients)],242"reference_stationarity_pass": max(abs(value) for value in gradients)243<= policy.gradient_tolerance,244"histories_traced_including_replay": oracle.histories_traced,245"allocated_device_bytes": oracle.allocated_bytes,246"scalar_download_bytes": oracle.scalar_download_bytes,247"parameter_upload_bytes": oracle.parameter_upload_bytes,248"elapsed_seconds_contended": elapsed,249"deterministic_sampling": oracle.deterministic_sampling,250},251)252253254def main(script: str) -> None:255parser = argparse.ArgumentParser(description=__doc__)256parser.add_argument("--output", type=Path, required=True)257parser.add_argument(258"--mode",259choices=("original", "ablation", "family", "reference", "stochastic"),260required=True,261)262parser.add_argument("--reference", type=Path)263parser.add_argument("--seed-base", type=int, default=9031001)264parser.add_argument(265"--sampling-multiplier",266type=int,267default=1,268help="Scale all scattering batches, reference work and unique-history budget together.",269)270parser.add_argument(271"--repetitions",272type=int,273default=32,274help="Number of consecutive stochastic recovery runs (1-32); final evaluation uses 32.",275)276args = parser.parse_args()277if not 1 <= args.repetitions <= 32:278parser.error("repetitions must lie between 1 and 32")279if args.repetitions != 32 and args.mode != "stochastic":280parser.error("repetitions only applies to stochastic recovery")281if args.sampling_multiplier != 1 and args.mode not in ("reference", "stochastic"):282parser.error("sampling-multiplier only applies to scattering reference/recovery")283try:284sampling = scattering_configuration(args.sampling_multiplier)285except ContractError as error:286parser.error(str(error))287if not 0 <= args.seed_base <= 2**64 - 1 - (args.repetitions - 1) * 104729:288parser.error("the complete seed sequence must fit unsigned 64 bits")289root = Path(script).resolve().parents[2]290output = args.output.resolve()291if output.is_relative_to(root):292raise ValueError("raw execution records must remain outside the authoring tree")293sources = {str(path.relative_to(root)): path for path in (root / "python/dpt").rglob("*.py")}294sources.update({str(Path(script).resolve().relative_to(root)): Path(script).resolve()})295sources.update({name: root / name for name in ("pyproject.toml", "uv.lock")})296cases: list[tuple[str, AbsorptionExperiment]] = []297if args.mode == "original":298cases = [299(300"original",301AbsorptionExperiment(302seed=23971,303histories=256,304recovery_maximum_batch=256,305recovery_history_budget=1_000_000,306estimator="continuous-absorption",307proposal="quadratic",308numerical_gradient_allowance=1e-12,309),310)311]312if args.mode == "ablation":313for estimator in ("analogue", "continuous-absorption"):314for proposal in ("linear", "quadratic"):315cases.append(316(317f"{estimator}-{proposal}",318AbsorptionExperiment(319seed=23971,320histories=256,321estimator=estimator,322proposal=proposal,323numerical_gradient_allowance=1e-12,324final_validation_batch=262144,325),326)327)328if args.mode == "family":329for depth in (0.1, 1.0, 3.0, 6.0):330for target in (0.5, 1.25, 2.0):331for initial in (0.6, 1.0, 1.8):332cases.append(333(334f"depth-{depth}-target-{target}-initial-{initial}",335AbsorptionExperiment(336layer_optical_depths=(depth,),337target_density=target,338initial_density=initial,339histories=16,340replicates=2,341recovery_maximum_batch=16,342recovery_history_budget=1_000_000,343estimator="continuous-absorption",344proposal="quadratic",345numerical_gradient_allowance=1e-12,346),347)348)349for name, config in cases:350with RunRecorder(output / name, configuration=asdict(config), sources=sources) as recorder:351_recovery(config, recorder)352record = json.loads((output / name / "recovery.json").read_text())353print(354name,355record["result"]["reason"],356record["absolute_density_error"],357record["independent_true_gradient"],358flush=True,359)360if args.mode == "reference":361with RunRecorder(362output / "scattering-reference",363configuration={"seed": 419003, **sampling},364sources=sources,365) as recorder:366_scattering_run(367419003, recorder, reference=None, sampling_multiplier=args.sampling_multiplier368)369if args.mode == "stochastic":370if args.reference is None:371raise ValueError("stochastic evaluation requires a frozen independent reference")372reference: dict[str, Any] = json.loads(args.reference.read_text())373validate_scattering_reference(reference, args.sampling_multiplier)374reference_manifest_path = args.reference.parent / "run.json"375reference_manifest = json.loads(reference_manifest_path.read_text())376validate_scattering_configuration(377reference_manifest["configuration"], args.sampling_multiplier378)379reference_sha = hashlib.sha256(args.reference.read_bytes()).hexdigest()380if (381reference_manifest["status"] != "complete"382or not reference_manifest["sources_unchanged"]383or not reference_manifest["recorded_files_unchanged"]384or reference_manifest["output_sha256"].get(args.reference.name) != reference_sha385):386raise ContractError("reference must belong to a completed unchanged run record")387sources["evaluation-reference.json"] = args.reference388sources["evaluation-reference-run.json"] = reference_manifest_path389for i in range(args.repetitions):390seed = args.seed_base + 104729 * i391evaluation_config: dict[str, Any] = {392"seed": seed,393"evaluation_index": i,394"repetitions": args.repetitions,395"reference": reference,396**sampling,397}398with RunRecorder(399output / f"replicate-{i:02d}", configuration=evaluation_config, sources=sources400) as recorder:401_scattering_run(402seed,403recorder,404reference=reference,405sampling_multiplier=args.sampling_multiplier,406)407print(f"completed independent evaluation {i + 1}/{args.repetitions}", flush=True)408