From 311c7e61f3ea9511991dba035f97fcad81fddf73 Mon Sep 17 00:00:00 2001 From: Jammy2211 Date: Sun, 27 Sep 2026 11:13:49 +0100 Subject: [PATCH 01/10] feat(point_source_image): --step0-route library A/B in solver_config_sweep (PyAutoArray#579) --step0-route (comma list of control,gather,nopad,components,structured) replaces the geometry sweep with step0_ configs beside control at the production geometry. Each sets autoarray's _STEP0_CONTAINMENT for the duration of tracing only (fresh closure + clear_caches per route, as before). Every route gets the timing rounds, completeness draws, grad gate, vmap 1/4/16 and its own step-0 prefix split. A new gate, gates.step0_route_bit_identity, requires stream / fiducial / prior log L, prior + stress positions, image counts, gradients and vmap values to be bit-identical to the control. Output: solver_config_sweep_step0_. Also fix the MAX_CONTAINING_SIZE patch so it keeps the later __init__ defaults. Overwriting __defaults__ with a 1-tuple bound the new step0_layout=None default to max_containing_size. Co-Authored-By: Claude Opus 5.5 --- .../solver_config_sweep.py | 189 ++++++++++++++++-- 1 file changed, 169 insertions(+), 20 deletions(-) diff --git a/scripts/point_source_image/likelihood_breakdown/solver_config_sweep.py b/scripts/point_source_image/likelihood_breakdown/solver_config_sweep.py index 50ce03600..6927c8b77 100644 --- a/scripts/point_source_image/likelihood_breakdown/solver_config_sweep.py +++ b/scripts/point_source_image/likelihood_breakdown/solver_config_sweep.py @@ -95,6 +95,21 @@ - The ``MAX_CONTAINING_SIZE`` patch is proved per route from the traced shapes (the padded solution has ``MAX_CONTAINING_SIZE`` rows). +Step-0 containment routes (phase 4b) +------------------------------------ + +``--step0-route`` (a comma list of ``control,gather,nopad,components,structured``) +replaces the geometry sweep with a library-route A/B at the production geometry +(PyAutoArray#579): each named route is a config ``step0_`` beside +``control`` that sets ``autoarray.structures.triangles.array._STEP0_CONTAINMENT`` +for the duration of **tracing** (the switch is read at trace time; see +:func:`step0_containment`). ``control`` is the production default, unpatched. +Every route is timed, completeness-checked, grad-checked and ``vmap``-ed at +1 / 4 / 16, gets its own step-0 prefix split, and must be bit-identical to the +control on the stream / fiducial log L, the prior + stress positions, the +gradients and the ``vmap`` values (``gates["step0_route_bit_identity"]``). Output +``solver_config_sweep_step0_``. + Output ------ @@ -167,6 +182,16 @@ def _profiling_root() -> Path: _cell_parser.add_argument("--step0-rounds", type=int, default=None) _cell_parser.add_argument("--seed", type=int, default=314) _cell_parser.add_argument("--list-configs", action="store_true") +STEP0_ROUTE_CHOICES = ("control", "gather", "nopad", "components", "structured") +_cell_parser.add_argument( + "--step0-route", + default=None, + help=( + "comma list of step-0 containment library routes " + f"({','.join(STEP0_ROUTE_CHOICES)}): replaces the geometry sweep with a route A/B " + "at the production geometry (phase 4b, PyAutoArray#579)" + ), +) _cell_parser.add_argument( "--quick", action="store_true", @@ -223,6 +248,7 @@ def _cfg( precision=PRODUCTION_PRECISION, mcs=None, neighbor_degree=1, + step0_route=None, ): return { "name": name, @@ -232,6 +258,7 @@ def _cfg( "precision": precision, "max_containing_size": PRODUCTION_MCS if mcs is None else mcs, "neighbor_degree": neighbor_degree, + "step0_route": step0_route, } @@ -282,6 +309,24 @@ def _cfg( if unknown: raise SystemExit(f"--configs: unknown {unknown}; see --list-configs") CONFIGS = [c for c in CONFIGS if c["name"] == "control" or c["name"] in wanted] +STEP0_ROUTES = None +if _args.step0_route: + if not hasattr(_triangles_array, "_STEP0_CONTAINMENT"): + raise SystemExit( + "--step0-route: the imported PyAutoArray has no _STEP0_CONTAINMENT switch " + f"({_triangles_array.__file__})" + ) + STEP0_ROUTES = [r.strip() for r in _args.step0_route.split(",") if r.strip()] + unknown = [r for r in STEP0_ROUTES if r not in STEP0_ROUTE_CHOICES] + if unknown: + raise SystemExit(f"--step0-route: unknown {unknown}; choose from {STEP0_ROUTE_CHOICES}") + CONFIGS = [c for c in CONFIGS if c["name"] == "control"] + [ + _cfg(f"step0_{r}", "step0_route", step0_route=r) + for r in dict.fromkeys(STEP0_ROUTES) + if r != "control" + ] +STEP0_MODE = STEP0_ROUTES is not None +LIBRARY_STEP0_DEFAULT = getattr(_triangles_array, "_STEP0_CONTAINMENT", None) CONFIG_NAMES = [c["name"] for c in CONFIGS] _GRID = al.Grid2D.uniform(shape_native=GRID_SHAPE, pixel_scales=GRID_PIXEL_SCALE) @@ -335,6 +380,7 @@ def static_description(cfg) -> dict: "step0_rows": int(vertices.shape[0]), "max_containing_size": cfg["max_containing_size"], "neighbor_degree": cfg["neighbor_degree"], + "step0_route": cfg.get("step0_route") or f"library default ({LIBRARY_STEP0_DEFAULT})", } @@ -356,8 +402,10 @@ def max_containing_size(mcs: int): init = _triangles_array.ArrayTriangles.__init__ fls = _triangles_array.ArrayTriangles.for_limits_and_scale.__func__ saved = (init.__defaults__, fls.__defaults__, _triangles_array.MAX_CONTAINING_SIZE) - init.__defaults__ = (int(mcs),) - fls.__defaults__ = (int(mcs),) + # max_containing_size is the FIRST defaulted parameter of both; keep any later defaults + # (e.g. ArrayTriangles.__init__'s step0_layout=None, PyAutoArray#579) in place. + init.__defaults__ = (int(mcs),) + tuple(saved[0][1:]) + fls.__defaults__ = (int(mcs),) + tuple(saved[1][1:]) _triangles_array.MAX_CONTAINING_SIZE = int(mcs) try: yield @@ -365,6 +413,28 @@ def max_containing_size(mcs: int): init.__defaults__, fls.__defaults__, _triangles_array.MAX_CONTAINING_SIZE = saved +_ORIGINAL_INIT_DEFAULTS = _triangles_array.ArrayTriangles.__init__.__defaults__ + + +@contextlib.contextmanager +def step0_containment(route): + """Set the library's step-0 containment route for the duration of tracing. + + ``route`` None (the control) leaves the library default untouched. The switch is + read at trace time, so patching the lowering is enough; ``compile_route`` already + uses a fresh closure and ``jax.clear_caches()`` per route. + """ + if route is None: + yield + return + saved = _triangles_array._STEP0_CONTAINMENT + _triangles_array._STEP0_CONTAINMENT = route + try: + yield + finally: + _triangles_array._STEP0_CONTAINMENT = saved + + @contextlib.contextmanager def trace_recorder(): """Record the ray-traced row count of every solver step while tracing.""" @@ -619,7 +689,11 @@ def compile_route( jax.clear_caches() fn = factory() rss0 = _rss_bytes() - with max_containing_size(cfg["max_containing_size"]), trace_recorder() as record: + with ( + max_containing_size(cfg["max_containing_size"]), + step0_containment(cfg.get("step0_route")), + trace_recorder() as record, + ): t0 = time.perf_counter() lowered = jax.jit(fn).lower(example) lower_s = time.perf_counter() - t0 @@ -1048,8 +1122,11 @@ def _image_extent(pos_list): "patch_restored": { "module_constant": int(_triangles_array.MAX_CONTAINING_SIZE), "init_default": _triangles_array.ArrayTriangles.__init__.__defaults__, + "step0_containment": LIBRARY_STEP0_DEFAULT, "pass": int(_triangles_array.MAX_CONTAINING_SIZE) == PRODUCTION_MCS - and _triangles_array.ArrayTriangles.__init__.__defaults__ == (PRODUCTION_MCS,), + and _triangles_array.ArrayTriangles.__init__.__defaults__ == _ORIGINAL_INIT_DEFAULTS + and _ORIGINAL_INIT_DEFAULTS[0] == PRODUCTION_MCS + and getattr(_triangles_array, "_STEP0_CONTAINMENT", None) == LIBRARY_STEP0_DEFAULT, }, } note( @@ -1059,7 +1136,7 @@ def _image_extent(pos_list): grad_gate = {} for cfg in CONFIGS: name = cfg["name"] - if not (admissibility[name] or name == "control"): + if not (admissibility[name] or name == "control" or STEP0_MODE): continue def gfactory(cfg=cfg): @@ -1105,8 +1182,10 @@ def _fastest(names): note(f"best admissible (precision-equivalent): {best}; any precision: {best_any_precision}") vmap_block = None -if best is not None: - vroutes = [(n, b) for n in ("control", best) for b in VMAP_BATCHES] +vvals = {} +if best is not None or STEP0_MODE: + vmap_names = CONFIG_NAMES if STEP0_MODE else ["control", best] + vroutes = [(n, b) for n in vmap_names for b in VMAP_BATCHES] vexec, vcompile, vargs = {}, {}, {} for n, b in vroutes: cfg = next(c for c in CONFIGS if c["name"] == n) @@ -1135,7 +1214,7 @@ def vfactory(cfg=cfg): dt, out = _timed_call(vexec[key], vargs[key][k]) vtimes[key].append(dt) vvals[key].setdefault(k, np.asarray(out, dtype=float).tolist()) - vmap_block = {"best": best, "batches": list(VMAP_BATCHES), "rows": {}} + vmap_block = {"best": best, "routes": vmap_names, "batches": list(VMAP_BATCHES), "rows": {}} for i, (n, b) in enumerate(vroutes): st = _stats_ms(vtimes[(n, b)]) vmap_block["rows"][f"{n}_vmap{b}"] = { @@ -1146,12 +1225,15 @@ def vfactory(cfg=cfg): "compile": vcompile[(n, b)], "values_first_batch": vvals[(n, b)].get(0), } - for b in VMAP_BATCHES: - vmap_block["rows"][f"{best}_vmap{b}"]["speedup_vs_control_same_batch"] = _median_ratio( - vtimes[("control", b)], vtimes[(best, b)], BOOTSTRAP_SEED + 100 + b - ) - # vmap vs scalar consistency (control, first batch) - for n in ("control", best): + for j, n in enumerate(vmap_names): + if n == "control": + continue + for b in VMAP_BATCHES: + vmap_block["rows"][f"{n}_vmap{b}"]["speedup_vs_control_same_batch"] = _median_ratio( + vtimes[("control", b)], vtimes[(n, b)], BOOTSTRAP_SEED + 100 + 17 * j + b + ) + # vmap vs scalar consistency (first batch) + for n in vmap_names: for b in VMAP_BATCHES: first = vvals[(n, b)].get(0) scalar = [values[n].get(k) for k in range(b)] @@ -1165,6 +1247,67 @@ def vfactory(cfg=cfg): ) ) +# --- 5b. step-0 route bit-identity gate (phase 4b) ------------------------------ + + +def _same(a, b) -> bool: + return bool(np.array_equal(np.asarray(a, float), np.asarray(b, float), equal_nan=True)) + + +if STEP0_MODE: + identity = {} + for name in CONFIG_NAMES: + if name == "control": + continue + counts = { + s: [ + (int(finite_positions(a).shape[0]), int(finite_positions(b).shape[0])) + for a, b in zip(raw_positions[s]["control"], raw_positions[s][name]) + ] + for s in raw_positions + if name in raw_positions[s] + } + checks = { + "stream_log_likelihood": [values[name].get(k) for k in sorted(values["control"])] + == [values["control"][k] for k in sorted(values["control"])], + "fiducial_log_likelihood": values[name].get(0) == values["control"].get(0), + "prior_log_likelihood": _same(config_logl[name], config_logl["control"]), + "prior_positions": all( + _same(a, b) + for a, b in zip(raw_positions["prior"]["control"], raw_positions["prior"][name]) + ), + "stress_positions": all( + _same(a, b) + for a, b in zip( + raw_positions["stress"].get("control", []), + raw_positions["stress"].get(name, []), + ) + ), + "image_counts": all(a == b for c in counts.values() for a, b in c), + "grad": name in grad_gate + and _same(grad_gate[name]["gradients"], grad_gate["control"]["gradients"]), + "vmap": all( + vvals.get((name, b)) == vvals.get(("control", b)) and vvals.get((name, b)) + for b in VMAP_BATCHES + ), + } + identity[name] = { + "checks": checks, + "pass": all(checks.values()), + "image_count_histogram": { + s: { + str(k): int(v) + for k, v in zip(*np.unique([b for _, b in c], return_counts=True)) + } + for s, c in counts.items() + }, + } + gates["step0_route_bit_identity"] = identity + note( + "step-0 route bit-identity vs control: " + + ", ".join(f"{n}={v['pass']}" for n, v in identity.items()) + ) + # --- 6. step-0 ray trace vs containment split per geometry --------------------- note("step-0 split: ray trace vs ray trace + containment per geometry") @@ -1201,7 +1344,7 @@ def fn(vector): geoms = {} for cfg in CONFIGS: - key = (cfg["extent"], cfg["scale"]) + key = (cfg["extent"], cfg["scale"], cfg.get("step0_route")) geoms.setdefault(key, cfg) s0_exec = {} stages = ("source_centre", "ray_trace", "ray_trace_materialised", "containment") @@ -1237,6 +1380,7 @@ def fn(vector): "ray_trace_ms": trace, "containment_ms": contain, "triangle_materialisation_ms": med["ray_trace_materialised"] - med["ray_trace"], + "step0_route": descriptions[cfg["name"]]["step0_route"], "method": ( "prefix medians; ray_trace = jnp.sum(plane.vertices) minus source_centre; " "containment = containing_indices minus ray_trace (includes the vertices[indices] " @@ -1368,12 +1512,15 @@ def containing_counts(cfg, draws): and gates["patch_restored"]["pass"] and all(g["pass"] for g in gates["max_containing_size_patch"].values() if g) and all(g["pass"] for g in grad_gate.values()) + and all(g["pass"] for g in gates.get("step0_route_bit_identity", {}).values()) ) summary = { - "cell": "solver_config_sweep", - "issue": "PyAutoLabs/autolens_profiling#314", - "phase": "4a", + "cell": "solver_config_sweep_step0" if STEP0_MODE else "solver_config_sweep", + "issue": "PyAutoLabs/PyAutoArray#579" if STEP0_MODE else "PyAutoLabs/autolens_profiling#314", + "phase": "4b" if STEP0_MODE else "4a", + "step0_routes": STEP0_ROUTES, + "library_step0_default": LIBRARY_STEP0_DEFAULT, "config_name": config_name, "quotable": not config_name.startswith(("laptop", "local")), "host_note": ( @@ -1468,8 +1615,10 @@ def containing_counts(cfg, draws): dict_path, chart_path = resolve_output_paths( _cli, default_dir=_ROOT / "results" / "breakdown" / "point_source_image", - default_basename="solver_config_sweep_local", - cell="solver_config_sweep", + default_basename="solver_config_sweep_step0_local" + if STEP0_MODE + else "solver_config_sweep_local", + cell="solver_config_sweep_step0" if STEP0_MODE else "solver_config_sweep", ) dict_path.write_text(json.dumps(_scrub(summary), indent=2, default=str)) From 767c3919ff89769d3a3993292e8643f14d82ee31 Mon Sep 17 00:00:00 2001 From: Jammy2211 Date: Sun, 27 Sep 2026 11:21:32 +0100 Subject: [PATCH 02/10] results(point_source_image): laptop step-0 route A/B, not quotable (PyAutoArray#579) WSL2 laptop, 20 rounds x 20 calls, 200 prior + 200 stress draws, vmap 1/4/16, PyAutoArray c13b2d73 (library default "structured"). All routes are bit-identical to control and all_gates_pass is True. Median ms per call: control(=structured) 1.631, gather 2.221, nopad 2.249, components 1.555, structured 1.613. The ship evidence is the RAL 8490H and A100 rows, which come later. Co-Authored-By: Claude Opus 5.5 --- ...er_config_sweep_step0_laptop_cpu_fp64.json | 5712 +++++++++++++++++ ...ver_config_sweep_step0_laptop_cpu_fp64.png | Bin 0 -> 108949 bytes 2 files changed, 5712 insertions(+) create mode 100644 results/breakdown/point_source_image/solver_config_sweep_step0_laptop_cpu_fp64.json create mode 100644 results/breakdown/point_source_image/solver_config_sweep_step0_laptop_cpu_fp64.png diff --git a/results/breakdown/point_source_image/solver_config_sweep_step0_laptop_cpu_fp64.json b/results/breakdown/point_source_image/solver_config_sweep_step0_laptop_cpu_fp64.json new file mode 100644 index 000000000..9da3ec130 --- /dev/null +++ b/results/breakdown/point_source_image/solver_config_sweep_step0_laptop_cpu_fp64.json @@ -0,0 +1,5712 @@ +{ + "cell": "solver_config_sweep_step0", + "issue": "PyAutoLabs/PyAutoArray#579", + "phase": "4b", + "step0_routes": [ + "control", + "gather", + "nopad", + "components", + "structured" + ], + "library_step0_default": "structured", + "config_name": "laptop_cpu_fp64", + "quotable": false, + "host_note": "laptop witness: WSL2, interactive load, NOT quotable", + "quick": false, + "library_versions": { + "autolens": "2026.8.17.1", + "autoarray": "2026.8.17.1", + "autofit": "2026.8.17.1" + }, + "package_versions": { + "jax": "0.10.2", + "jaxlib": "0.10.2" + }, + "source_revisions": { + "autolens_profiling": "da4656310c16fb60d78c1ed243141e7ce91975e9", + "PyAutoNerves": "2b3bc53388a15e1d51fb70b583061bc2ee3294f0", + "PyAutoFit": "cf83504e8c7f3cc196ffef4d8a4ff86dd456bb6b", + "PyAutoArray": "c13b2d733538bec86cff3a15eccd9a0940a68463", + "PyAutoGalaxy": "0e4b89cff42882a6cf5bbed6c9686f7212d7e24c", + "PyAutoLens": "4487eb471baa35841e90d3db0911799239594bce" + }, + "autoarray_imported_from": "~/Code/PyAutoLabs-wt/pointsolver-step0-gather/PyAutoArray", + "autolens_imported_from": "~/Code/PyAutoLabs/lens/PyAutoLens", + "device": { + "backend": "cpu", + "device": "cpu:0", + "hostname": "DESKTOP-H143S82", + "xla_flags": "--xla_disable_hlo_passes=constant_folding --xla_gpu_autotune_level=0 --xla_gpu_enable_triton_gemm=false", + "omp_num_threads": "8", + "cpu_count": 8, + "jax_compilation_cache_dir": null, + "autotune_cache_entries_at_start": 0, + "cache_fresh": false + }, + "jax_devices": [ + "cpu:0" + ], + "machine": { + "cpu_model": "Intel(R) Core(TM) i9-10885H CPU @ 2.40GHz", + "cpu_count_os": 8, + "nproc": 8, + "nproc_all": 8, + "nproc_note": "GNU nproc honours OMP_NUM_THREADS, so `nproc` can print 1 on a multi-core host; `nproc_all` is the core count.", + "ram_total": "16392692 kB", + "kernel": "5.10.16.3-microsoft-standard-WSL2", + "platform": "Linux-5.10.16.3-microsoft-standard-WSL2-x86_64-with-glibc2.35", + "python": "3.12.10", + "jax_thread_env": { + "NPROC": "8" + }, + "blas_thread_env": { + "OMP_NUM_THREADS": "8", + "OPENBLAS_NUM_THREADS": "8", + "MKL_NUM_THREADS": "8", + "VECLIB_MAXIMUM_THREADS": "1", + "NUMEXPR_NUM_THREADS": "1" + }, + "thread_env_note": "NPROC sizes XLA's CPU intra-op pool (the JAX rows); the BLAS knobs pin OpenBLAS/MKL/OpenMP (the numpy/scipy rows) and do not touch JAX. Two disjoint families; both are recorded on every CPU timing.", + "gpu": "NVIDIA GeForce RTX 2060 with Max-Q Design, 6144 MiB, 580.97" + }, + "thread_environment": { + "NPROC": "8", + "OMP_NUM_THREADS": "8", + "OPENBLAS_NUM_THREADS": "8", + "MKL_NUM_THREADS": "8" + }, + "sched_affinity": 8, + "os_cpu_count": 8, + "xla_flags": "--xla_disable_hlo_passes=constant_folding --xla_gpu_autotune_level=0 --xla_gpu_enable_triton_gemm=false", + "jax_platforms": "cpu", + "jax_enable_x64": true, + "loadavg_start": [ + 1.24951171875, + 2.0166015625, + 2.5068359375 + ], + "loadavg_end": [ + 1.31396484375, + 1.54833984375, + 2.08447265625 + ], + "protocol": { + "n_rounds": 20, + "n_calls_per_round": 20, + "n_warm": 3, + "n_stream": 16, + "seed": 314, + "n_prior_draws": 200, + "n_stress_draws": 200, + "step0_rounds": 10, + "vmap_batches": [ + 1, + 4, + 16 + ], + "route_order": "round-robin over every config, start rotated each round", + "cache_trap_guard": "fresh closure + fresh solver/analysis per route; jax.clear_caches()", + "bootstrap": { + "samples": 2000, + "seed": 12345, + "interval": "90%" + }, + "admissible": "100% distinct-multiplicity agreement with the reference on the prior draws AND max position error <= 0.002\"", + "admissible_position_tol": 0.002, + "position_noise_sigma": 0.05, + "distinct_tol": 0.005, + "prior_draws": "full prior: vector_from_unit_vector(U(1e-4, 1-1e-4)); source = solved beta*", + "stress_draws": "OUTSIDE the prior: Isothermal centre U(-0.05,0.05), theta_E U(1,2), ell_comps U(-0.2,0.2), source centre U(-0.4,0.4); plain FitPositionsImagePairAll positions", + "reference": { + "name": "reference", + "block": "reference", + "extent": 12.0, + "scale": 0.05, + "precision": 0.0001, + "max_containing_size": 60, + "neighbor_degree": 1, + "step0_route": null + }, + "reference_b": { + "name": "reference_b", + "block": "reference", + "extent": 11.0, + "scale": 0.07, + "precision": 0.0001, + "max_containing_size": 60, + "neighbor_degree": 1, + "step0_route": null + }, + "max_containing_size_patch": "ArrayTriangles.__init__ / for_limits_and_scale __defaults__ + module constant, tracing only, restored by value", + "pytrees": "autofit.jax.register_model(model) for both models before any trace" + }, + "configs": [ + { + "name": "control", + "block": "control", + "extent": null, + "scale": 0.2, + "precision": 0.001, + "max_containing_size": 15, + "neighbor_degree": 1, + "step0_route": null + }, + { + "name": "step0_gather", + "block": "step0_route", + "extent": null, + "scale": 0.2, + "precision": 0.001, + "max_containing_size": 15, + "neighbor_degree": 1, + "step0_route": "gather" + }, + { + "name": "step0_nopad", + "block": "step0_route", + "extent": null, + "scale": 0.2, + "precision": 0.001, + "max_containing_size": 15, + "neighbor_degree": 1, + "step0_route": "nopad" + }, + { + "name": "step0_components", + "block": "step0_route", + "extent": null, + "scale": 0.2, + "precision": 0.001, + "max_containing_size": 15, + "neighbor_degree": 1, + "step0_route": "components" + }, + { + "name": "step0_structured", + "block": "step0_route", + "extent": null, + "scale": 0.2, + "precision": 0.001, + "max_containing_size": 15, + "neighbor_degree": 1, + "step0_route": "structured" + } + ], + "static": { + "control": { + "extent_half_width": [ + 9.9, + 9.9 + ], + "limits": [ + -9.9, + 9.9, + -9.9, + 9.9 + ], + "scale": 0.2, + "pixel_scale_precision": 0.001, + "n_steps": 8, + "n_steps_formula": "ceil(log2(0.2 / 0.001))", + "last_step_triangle_side": 0.0015625, + "step0_triangles": 23283, + "step0_rows": 11859, + "max_containing_size": 15, + "neighbor_degree": 1, + "step0_route": "library default (structured)" + }, + "step0_gather": { + "extent_half_width": [ + 9.9, + 9.9 + ], + "limits": [ + -9.9, + 9.9, + -9.9, + 9.9 + ], + "scale": 0.2, + "pixel_scale_precision": 0.001, + "n_steps": 8, + "n_steps_formula": "ceil(log2(0.2 / 0.001))", + "last_step_triangle_side": 0.0015625, + "step0_triangles": 23283, + "step0_rows": 11859, + "max_containing_size": 15, + "neighbor_degree": 1, + "step0_route": "gather" + }, + "step0_nopad": { + "extent_half_width": [ + 9.9, + 9.9 + ], + "limits": [ + -9.9, + 9.9, + -9.9, + 9.9 + ], + "scale": 0.2, + "pixel_scale_precision": 0.001, + "n_steps": 8, + "n_steps_formula": "ceil(log2(0.2 / 0.001))", + "last_step_triangle_side": 0.0015625, + "step0_triangles": 23283, + "step0_rows": 11859, + "max_containing_size": 15, + "neighbor_degree": 1, + "step0_route": "nopad" + }, + "step0_components": { + "extent_half_width": [ + 9.9, + 9.9 + ], + "limits": [ + -9.9, + 9.9, + -9.9, + 9.9 + ], + "scale": 0.2, + "pixel_scale_precision": 0.001, + "n_steps": 8, + "n_steps_formula": "ceil(log2(0.2 / 0.001))", + "last_step_triangle_side": 0.0015625, + "step0_triangles": 23283, + "step0_rows": 11859, + "max_containing_size": 15, + "neighbor_degree": 1, + "step0_route": "components" + }, + "step0_structured": { + "extent_half_width": [ + 9.9, + 9.9 + ], + "limits": [ + -9.9, + 9.9, + -9.9, + 9.9 + ], + "scale": 0.2, + "pixel_scale_precision": 0.001, + "n_steps": 8, + "n_steps_formula": "ceil(log2(0.2 / 0.001))", + "last_step_triangle_side": 0.0015625, + "step0_triangles": 23283, + "step0_rows": 11859, + "max_containing_size": 15, + "neighbor_degree": 1, + "step0_route": "structured" + }, + "reference": { + "extent_half_width": [ + 12.0, + 12.0 + ], + "limits": [ + -12.0, + 12.0, + -12.0, + 12.0 + ], + "scale": 0.05, + "pixel_scale_precision": 0.0001, + "n_steps": 9, + "n_steps_formula": "ceil(log2(0.05 / 0.0001))", + "last_step_triangle_side": 0.0001953125, + "step0_triangles": 535277, + "step0_rows": 268677, + "max_containing_size": 60, + "neighbor_degree": 1, + "step0_route": "library default (structured)" + }, + "reference_b": { + "extent_half_width": [ + 11.0, + 11.0 + ], + "limits": [ + -11.0, + 11.0, + -11.0, + 11.0 + ], + "scale": 0.07, + "pixel_scale_precision": 0.0001, + "n_steps": 10, + "n_steps_formula": "ceil(log2(0.07 / 0.0001))", + "last_step_triangle_side": 0.00013671875, + "step0_triangles": 229585, + "step0_rows": 115473, + "max_containing_size": 60, + "neighbor_degree": 1, + "step0_route": "library default (structured)" + } + }, + "reference_floor": { + "prior": { + "n_draws": 200, + "multiplicity_agreement": 1.0, + "raw_count_agreement": 1.0, + "n_multiplicity_mismatch": 0, + "mismatch_examples": [], + "max_position_error": 0.00015786921423151782, + "p99_position_error": 0.0001280749711777913, + "median_position_error": 5.9668954361473236e-05, + "ref_distinct_histogram": { + "2": 21, + "4": 179 + }, + "abs_delta_logl_vs_reference": { + "max": 0.09204751533968647, + "p99": 0.06845503627316121, + "median": 0.004628222675307825, + "n_nonfinite_mismatch": 0 + } + }, + "stress": { + "n_draws": 200, + "multiplicity_agreement": 1.0, + "raw_count_agreement": 1.0, + "n_multiplicity_mismatch": 0, + "mismatch_examples": [], + "max_position_error": 0.00015786921423129578, + "p99_position_error": 0.00014084184669768283, + "median_position_error": 5.966895436132821e-05, + "ref_distinct_histogram": { + "2": 163, + "4": 37 + } + } + }, + "reference_max_finite_positions": { + "prior": 4, + "stress": 4 + }, + "reference_compile": { + "reference_prior": { + "lower_s": 7.091287199999897, + "compile_s": 6.911603600000035, + "first_call_s": 0.019721900000149617, + "traced_rows_per_step": [ + 268677, + 2880, + 2880, + 2880, + 2880, + 2880, + 2880, + 2880, + 2880, + 268677, + 2880, + 2880, + 2880, + 2880, + 2880, + 2880, + 2880, + 2880, + 268677, + 2880, + 2880, + 2880, + 2880, + 2880, + 2880, + 2880, + 2880 + ], + "output_shapes": [ + [], + [ + 60, + 2 + ] + ], + "flops": 48502648.0, + "memory_analysis": { + "argument_size_in_bytes": 40, + "output_size_in_bytes": 984, + "temp_size_in_bytes": 17361496, + "alias_size_in_bytes": 0, + "generated_code_size_in_bytes": 0, + "host_temp_size_in_bytes": 0 + }, + "rss_delta_bytes": 440393728, + "max_containing_size_proof": { + "positions_shape": [ + 60, + 2 + ], + "expected_rows": 60, + "pass": true + } + }, + "reference_stress": { + "lower_s": 1.5862882000001264, + "compile_s": 1.9338870000001407, + "first_call_s": 0.021159200000056444, + "traced_rows_per_step": [ + 268677, + 2880, + 2880, + 2880, + 2880, + 2880, + 2880, + 2880, + 2880 + ], + "output_shapes": [ + [ + 60, + 2 + ] + ], + "flops": 47671892.0, + "memory_analysis": { + "argument_size_in_bytes": 64, + "output_size_in_bytes": 960, + "temp_size_in_bytes": 17361048, + "alias_size_in_bytes": 0, + "generated_code_size_in_bytes": 0, + "host_temp_size_in_bytes": 0 + }, + "rss_delta_bytes": 7065600, + "max_containing_size_proof": { + "positions_shape": [ + 60, + 2 + ], + "expected_rows": 60, + "pass": true + } + }, + "reference_b_prior": { + "lower_s": 5.504514400000062, + "compile_s": 7.305678700000044, + "first_call_s": 0.00996900000018286, + "traced_rows_per_step": [ + 115473, + 2880, + 2880, + 2880, + 2880, + 2880, + 2880, + 2880, + 2880, + 2880, + 115473, + 2880, + 2880, + 2880, + 2880, + 2880, + 2880, + 2880, + 2880, + 2880, + 115473, + 2880, + 2880, + 2880, + 2880, + 2880, + 2880, + 2880, + 2880, + 2880 + ], + "output_shapes": [ + [], + [ + 60, + 2 + ] + ], + "flops": 23082492.0, + "memory_analysis": { + "argument_size_in_bytes": 40, + "output_size_in_bytes": 984, + "temp_size_in_bytes": 7566936, + "alias_size_in_bytes": 0, + "generated_code_size_in_bytes": 0, + "host_temp_size_in_bytes": 0 + }, + "rss_delta_bytes": 49766400, + "max_containing_size_proof": { + "positions_shape": [ + 60, + 2 + ], + "expected_rows": 60, + "pass": true + } + }, + "reference_b_stress": { + "lower_s": 1.4302029000000402, + "compile_s": 2.0732711000000563, + "first_call_s": 0.009526199999982055, + "traced_rows_per_step": [ + 115473, + 2880, + 2880, + 2880, + 2880, + 2880, + 2880, + 2880, + 2880, + 2880 + ], + "output_shapes": [ + [ + 60, + 2 + ] + ], + "flops": 22251710.0, + "memory_analysis": { + "argument_size_in_bytes": 64, + "output_size_in_bytes": 960, + "temp_size_in_bytes": 7566488, + "alias_size_in_bytes": 0, + "generated_code_size_in_bytes": 0, + "host_temp_size_in_bytes": 0 + }, + "rss_delta_bytes": 1617920, + "max_containing_size_proof": { + "positions_shape": [ + 60, + 2 + ], + "expected_rows": 60, + "pass": true + } + } + }, + "default_vs_reference": { + "prior": { + "n_draws": 200, + "multiplicity_agreement": 1.0, + "raw_count_agreement": 1.0, + "n_multiplicity_mismatch": 0, + "mismatch_examples": [], + "max_position_error": 0.0008513474499103632, + "p99_position_error": 0.0007893460711577849, + "median_position_error": 0.00040657539052049436, + "ref_distinct_histogram": { + "2": 21, + "4": 179 + }, + "abs_delta_logl_vs_reference": { + "max": 0.8682473458375171, + "p99": 0.5684387609120645, + "median": 0.030920850414809298, + "n_nonfinite_mismatch": 0 + }, + "abs_delta_logl_vs_control": { + "max": 0.0, + "p99": 0.0, + "median": 0.0, + "n_nonfinite_mismatch": 0 + } + }, + "stress": { + "n_draws": 200, + "multiplicity_agreement": 1.0, + "raw_count_agreement": 1.0, + "n_multiplicity_mismatch": 0, + "mismatch_examples": [], + "max_position_error": 0.0007893460711579142, + "p99_position_error": 0.0007893460711576755, + "median_position_error": 0.0004065753905207063, + "ref_distinct_histogram": { + "2": 163, + "4": 37 + } + }, + "agrees_on_every_prior_draw": true, + "agrees_on_every_stress_draw": true, + "stress_mismatch_examples": [] + }, + "admissibility": { + "control": true, + "step0_gather": true, + "step0_nopad": true, + "step0_components": true, + "step0_structured": true + }, + "precision_equivalent": { + "control": true, + "step0_gather": true, + "step0_nopad": true, + "step0_components": true, + "step0_structured": true + }, + "reference_image_extent": { + "prior": { + "max_abs_y": 1.77939453125, + "max_abs_x": 1.7773254429359933, + "max_abs_coord": 1.77939453125, + "p99_abs_coord": 1.7590830914129167, + "max_radius": 1.8116226317743076 + }, + "stress": { + "max_abs_y": 2.2498046875, + "max_abs_x": 2.300267215077964, + "max_abs_coord": 2.300267215077964, + "p99_abs_coord": 2.2027852305644777, + "max_radius": 2.5191249773380773 + } + }, + "extent_working": "prior: theta_E <= 1.6 + 4*0.05 = 1.8; |e| <= 0.0526 + 4*0.01 ~ 0.09 -> q ~ 0.83; SIE images lie within ~theta_E/sqrt(q) + |beta| ~ 1.98 + 0.1 ~ 2.1 arcsec of the centre, so boxes of +-6 / +-4 / +-3 / +-2.5 bracket it; reference_image_extent is the measured value", + "best_admissible": "step0_components", + "best_admissible_any_precision": "step0_components", + "table": [ + { + "config": "control", + "block": "control", + "extent": 9.9, + "scale": 0.2, + "precision": 0.001, + "mcs": 15, + "neighbor_degree": 1, + "n_steps": 8, + "step0_rows": 11859, + "step0_triangles": 23283, + "median_ms": 1.6314000001784734, + "speedup": 1.0, + "speedup_ci90": [ + 0.9927352031311591, + 1.0069516162502639 + ], + "admissible": true, + "precision_equivalent": true, + "last_step_triangle_side": 0.0015625, + "prior_multiplicity_agreement": 1.0, + "prior_raw_count_agreement": 1.0, + "prior_max_err": 0.0008513474499103632, + "prior_p99_err": 0.0007893460711577849, + "prior_abs_dlogl_ref_max": 0.8682473458375171, + "prior_abs_dlogl_control_max": 0.0, + "stress_multiplicity_agreement": 1.0, + "stress_max_err": 0.0007893460711579142, + "compile_s": 3.4614047000000028, + "flops": 2801341.0, + "temp_bytes": 901656 + }, + { + "config": "step0_gather", + "block": "step0_route", + "extent": 9.9, + "scale": 0.2, + "precision": 0.001, + "mcs": 15, + "neighbor_degree": 1, + "n_steps": 8, + "step0_rows": 11859, + "step0_triangles": 23283, + "median_ms": 2.2212000001218257, + "speedup": 0.7344678552534649, + "speedup_ci90": [ + 0.7305465775683629, + 0.7393326429881116 + ], + "admissible": true, + "precision_equivalent": true, + "last_step_triangle_side": 0.0015625, + "prior_multiplicity_agreement": 1.0, + "prior_raw_count_agreement": 1.0, + "prior_max_err": 0.0008513474499103632, + "prior_p99_err": 0.0007893460711577849, + "prior_abs_dlogl_ref_max": 0.8682473458375171, + "prior_abs_dlogl_control_max": 0.0, + "stress_multiplicity_agreement": 1.0, + "stress_max_err": 0.0007893460711579142, + "compile_s": 3.3329564000000573, + "flops": 3383414.0, + "temp_bytes": 1692120 + }, + { + "config": "step0_nopad", + "block": "step0_route", + "extent": 9.9, + "scale": 0.2, + "precision": 0.001, + "mcs": 15, + "neighbor_degree": 1, + "n_steps": 8, + "step0_rows": 11859, + "step0_triangles": 23283, + "median_ms": 2.249199999823759, + "speedup": 0.725324559979684, + "speedup_ci90": [ + 0.7220247144024469, + 0.7307215192002263 + ], + "admissible": true, + "precision_equivalent": true, + "last_step_triangle_side": 0.0015625, + "prior_multiplicity_agreement": 1.0, + "prior_raw_count_agreement": 1.0, + "prior_max_err": 0.0008513474499103632, + "prior_p99_err": 0.0007893460711577849, + "prior_abs_dlogl_ref_max": 0.8682473458375171, + "prior_abs_dlogl_control_max": 0.0, + "stress_multiplicity_agreement": 1.0, + "stress_max_err": 0.0007893460711579142, + "compile_s": 3.493998399999782, + "flops": 3173867.0, + "temp_bytes": 1692120 + }, + { + "config": "step0_components", + "block": "step0_route", + "extent": 9.9, + "scale": 0.2, + "precision": 0.001, + "mcs": 15, + "neighbor_degree": 1, + "n_steps": 8, + "step0_rows": 11859, + "step0_triangles": 23283, + "median_ms": 1.5553499999896303, + "speedup": 1.0488957470597293, + "speedup_ci90": [ + 1.0438247013366706, + 1.058413486712005 + ], + "admissible": true, + "precision_equivalent": true, + "last_step_triangle_side": 0.0015625, + "prior_multiplicity_agreement": 1.0, + "prior_raw_count_agreement": 1.0, + "prior_max_err": 0.0008513474499103632, + "prior_p99_err": 0.0007893460711577849, + "prior_abs_dlogl_ref_max": 0.8682473458375171, + "prior_abs_dlogl_control_max": 0.0, + "stress_multiplicity_agreement": 1.0, + "stress_max_err": 0.0007893460711579142, + "compile_s": 3.5461411000001135, + "flops": 3578378.0, + "temp_bytes": 1506264 + }, + { + "config": "step0_structured", + "block": "step0_route", + "extent": 9.9, + "scale": 0.2, + "precision": 0.001, + "mcs": 15, + "neighbor_degree": 1, + "n_steps": 8, + "step0_rows": 11859, + "step0_triangles": 23283, + "median_ms": 1.613299999917217, + "speedup": 1.0112192402294584, + "speedup_ci90": [ + 1.0041774461239126, + 1.019301899084189 + ], + "admissible": true, + "precision_equivalent": true, + "last_step_triangle_side": 0.0015625, + "prior_multiplicity_agreement": 1.0, + "prior_raw_count_agreement": 1.0, + "prior_max_err": 0.0008513474499103632, + "prior_p99_err": 0.0007893460711577849, + "prior_abs_dlogl_ref_max": 0.8682473458375171, + "prior_abs_dlogl_control_max": 0.0, + "stress_multiplicity_agreement": 1.0, + "stress_max_err": 0.0007893460711579142, + "compile_s": 3.645019500000217, + "flops": 2801341.0, + "temp_bytes": 901656 + } + ], + "rows": { + "control": { + "config": { + "name": "control", + "block": "control", + "extent": null, + "scale": 0.2, + "precision": 0.001, + "max_containing_size": 15, + "neighbor_degree": 1, + "step0_route": null + }, + "static": { + "extent_half_width": [ + 9.9, + 9.9 + ], + "limits": [ + -9.9, + 9.9, + -9.9, + 9.9 + ], + "scale": 0.2, + "pixel_scale_precision": 0.001, + "n_steps": 8, + "n_steps_formula": "ceil(log2(0.2 / 0.001))", + "last_step_triangle_side": 0.0015625, + "step0_triangles": 23283, + "step0_rows": 11859, + "max_containing_size": 15, + "neighbor_degree": 1, + "step0_route": "library default (structured)" + }, + "stats": { + "n": 400, + "median_ms": 1.6314000001784734, + "p10_ms": 1.5372999998362502, + "p90_ms": 1.7334300000584335, + "min_ms": 1.4624000000367232, + "max_ms": 2.4349999998776184, + "mean_ms": 1.6443707499865923 + }, + "speedup_vs_control": { + "ratio": 1.0, + "ci90_low": 0.9927352031311591, + "ci90_high": 1.0069516162502639, + "bootstrap_samples": 2000 + }, + "paired_round_speedup": { + "median": 1.0, + "p10": 1.0, + "p90": 1.0 + }, + "compile": { + "lower_s": 2.5147695999999087, + "compile_s": 3.4614047000000028, + "first_call_s": 0.0028734999996231636, + "traced_rows_per_step": [ + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720, + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720 + ], + "output_shapes": [ + [] + ], + "flops": 2801341.0, + "memory_analysis": { + "argument_size_in_bytes": 40, + "output_size_in_bytes": 8, + "temp_size_in_bytes": 901656, + "alias_size_in_bytes": 0, + "generated_code_size_in_bytes": 0, + "host_temp_size_in_bytes": 0 + }, + "rss_delta_bytes": 3244032, + "max_containing_size_proof": null + }, + "warm_ms": [ + 3.47009999995862, + 1.8967999999404128, + 1.8930000001091685 + ], + "per_call_ms": [ + 1.9017999998141022, + 1.700799999980518, + 1.687700000275072, + 1.6297000001941342, + 1.727500000015425, + 1.6652999997859297, + 1.633299999866722, + 1.644399999804591, + 1.6284999996969418, + 1.6009000000849483, + 1.59929999972519, + 1.6679000000294764, + 1.6398999996454222, + 1.6594999997323612, + 1.6298000000460888, + 1.7324999998891144, + 1.5881999997873208, + 1.608700000360841, + 1.724800000374671, + 1.7675999997663894, + 1.6626999999971304, + 1.7118000000664324, + 1.6491000001224165, + 1.5610999998898478, + 1.5838999997868086, + 1.5918999997666106, + 1.5078999999786902, + 1.5792999997756851, + 1.643800000238116, + 1.6654999999445863, + 1.6290999997181643, + 1.66700000045239, + 1.5915999997559993, + 1.6045000002122833, + 1.7086000002564106, + 1.6086999999060936, + 1.6528000001017062, + 1.6307999999298772, + 1.72629999997298, + 1.6548000003240304, + 1.569900000049529, + 1.6298000000460888, + 1.6177000002244313, + 1.5180999998847255, + 1.5140999998948246, + 1.5799999996488623, + 1.5514000001530803, + 1.666900000145688, + 1.5535000002273591, + 1.5350999997281178, + 1.5455000002475572, + 1.6048000002228946, + 1.5424999996866973, + 1.537499999813008, + 1.600600000074337, + 1.619699999992008, + 1.624900000024354, + 1.5886999999565887, + 1.5455000002475572, + 1.52909999997064, + 1.6767000001891574, + 1.6657999999551976, + 1.579799999944953, + 1.7149999998764542, + 1.544000000194501, + 1.5975000001162698, + 1.5756000002511428, + 1.577500000166765, + 1.549099999920145, + 1.5814000003047113, + 1.6568999999435619, + 1.5889999999672, + 1.6152999996847939, + 1.561900000069727, + 1.5920999999252672, + 1.5456999999514665, + 1.6055999999480264, + 1.674399999956222, + 1.5455000002475572, + 1.51400000004287, + 1.7283000001953042, + 1.7472999998062733, + 1.683200000115903, + 1.629999999749998, + 1.6232000002673885, + 1.6429000002062821, + 1.7502999999123858, + 1.6316000001097564, + 1.6024999999899592, + 1.573000000007596, + 1.5701999996053928, + 1.6669999999976426, + 1.6591000003245426, + 1.609299999927316, + 1.6648000000714092, + 1.5945000000101572, + 1.6114999998535495, + 1.6031999998631363, + 1.5564999998787243, + 1.5649000001758395, + 1.8057999996017315, + 1.6107999999803724, + 1.6592000001764973, + 1.6236000001299544, + 1.8037999998341547, + 1.6553999998905056, + 1.8230999999104824, + 1.675599999998667, + 1.6466000001855718, + 1.857099999597267, + 1.6916999998102256, + 1.582700000199111, + 1.670799999828887, + 1.550999999835767, + 1.6234000004260452, + 1.534699999865552, + 1.565500000197062, + 1.5733000000182074, + 1.6979000001811073, + 1.5024999997876876, + 1.8592000001262932, + 1.7225999999936903, + 1.7345999999633932, + 1.700400000117952, + 1.700799999980518, + 1.7305999999734922, + 1.748599999700673, + 1.8569999997453124, + 1.725099999930535, + 1.6989999999168504, + 1.7308000001321489, + 1.7317000001639826, + 1.7496999998911633, + 1.7333000000689935, + 1.67669999973441, + 1.714199999696575, + 1.6669999999976426, + 1.714699999865843, + 1.788200000191864, + 1.8872999999075546, + 1.6100999996524479, + 1.679599999988568, + 2.106400000229769, + 1.915499999995518, + 1.6579000002820976, + 2.395999999862397, + 1.729799999793613, + 1.633299999866722, + 1.6892999997253355, + 1.659999999901629, + 1.7153000003418128, + 1.7118000000664324, + 1.6011000002436049, + 1.6322000001309789, + 1.660500000070897, + 1.6419000003224937, + 1.7069999998966523, + 1.5924000003906258, + 1.6130999997585604, + 1.6031999998631363, + 1.6654999999445863, + 1.6986000000542845, + 1.6040000000430155, + 1.581500000156666, + 1.5569000001960376, + 1.7146000000138883, + 1.7775999999685155, + 1.6269999996438855, + 1.6350000000784348, + 1.6544000000067172, + 1.5194000002338726, + 1.6381999998884567, + 1.6213999997489736, + 1.5943999997034553, + 1.5515999998569896, + 1.5576000000692147, + 1.61980000029871, + 1.614600000266364, + 1.583699999628152, + 1.5717000001131964, + 1.7635999997764884, + 1.6654999999445863, + 2.4349999998776184, + 1.6467999998894811, + 1.7164000000775559, + 1.8476000000191561, + 1.601800000116782, + 1.6871000002538494, + 1.5651000003344961, + 1.6727000001992565, + 1.7891999996209051, + 2.177800000026764, + 1.681199999893579, + 1.7307000002801942, + 1.664399999754096, + 1.6273999999611988, + 1.7013000001497858, + 1.6933999995671911, + 1.6666999999870313, + 1.675999999861233, + 1.5755999997963954, + 1.6003000000637257, + 1.622399999632762, + 1.490799999828596, + 1.5688999997109931, + 1.582200000029843, + 1.5113999997993233, + 1.501899999766465, + 1.5078000001267355, + 1.5229999999064603, + 1.4912999999978638, + 1.507200000105513, + 1.5150000003814057, + 1.6715000001568114, + 1.4952999999877647, + 1.6491000001224165, + 1.545799999803421, + 1.5257999998539162, + 1.5337999998337182, + 1.743399999668327, + 1.7238000000361353, + 1.62529999988692, + 1.566499999626103, + 1.593699999830278, + 1.7144999997071864, + 1.527099999748316, + 1.5717000001131964, + 1.6159000001607637, + 1.5314999996007828, + 1.5591999999742256, + 1.5465000001313456, + 1.5831000000616768, + 1.5915999997559993, + 1.6336999997292878, + 1.5576999999211694, + 1.5883999999459775, + 1.6264000000774104, + 1.644899999973859, + 1.5975999999682244, + 1.630499999919266, + 1.6666000001350767, + 1.613199999610515, + 1.6814000000522356, + 1.6153000001395412, + 1.6161999997166276, + 1.5564999998787243, + 1.6129000000546512, + 1.6488000001118053, + 1.6638000001876208, + 1.7119000003731344, + 1.6394999997828563, + 1.6694999999344873, + 1.6147999999702733, + 1.617800000076386, + 1.6544999998586718, + 1.725200000237237, + 1.7776999998204701, + 1.6967000001386623, + 1.6958000001068285, + 1.6749999999774445, + 1.7636000002312358, + 1.7544000002089888, + 1.696400000128051, + 1.65919999972175, + 1.7265000001316366, + 1.6590000000178406, + 1.6810000001896697, + 1.756999999997788, + 1.6090000003714522, + 1.685899999756657, + 1.6946000000643835, + 1.706800000192743, + 1.7106000000239874, + 1.6777999999249005, + 1.6402000001107808, + 1.7000000002553861, + 1.7404000000169617, + 1.660399999764195, + 1.6679000000294764, + 1.7268999999942025, + 1.7361000000164495, + 1.7250000000785803, + 1.6621000004306552, + 1.7614000003050023, + 1.6544999998586718, + 1.7149999998764542, + 1.6155999996954051, + 1.7279999997299456, + 1.5764999998282292, + 1.597699999820179, + 1.6200000000026193, + 1.6562000000703847, + 1.6788000002634362, + 1.6815999997561448, + 1.6889999997147243, + 1.7097999998441082, + 1.5196999997897365, + 1.6352000002370914, + 1.5999000002011599, + 1.6293000003315683, + 1.7131000004155794, + 1.566599999932805, + 1.517499999863503, + 1.5460999998140323, + 1.5001000001575449, + 1.6057999996519357, + 1.5913999995973427, + 1.5117000002646819, + 1.5958999997565115, + 1.534199999696284, + 1.89989999989848, + 1.5293000001292967, + 1.5644000000065716, + 1.5315999999074847, + 1.600999999936903, + 1.5069999999468564, + 1.4756000000488712, + 1.5155999999478809, + 1.49039999996603, + 1.5144000003601832, + 1.687200000105804, + 1.6586000001552748, + 1.6845000000103028, + 1.6399000001001696, + 1.5758999998070067, + 1.5678999998272047, + 1.66159999980664, + 1.6388999997616338, + 1.6239000001405657, + 1.6312000002471905, + 1.6510999998899933, + 1.545900000110123, + 1.5932000001157576, + 1.5536999999312684, + 1.5315999999074847, + 1.6029000003072724, + 1.6798000001472246, + 1.6319999999723223, + 1.638399999592366, + 1.5842999996493745, + 1.6312000002471905, + 1.6924999999901047, + 1.5479000003324472, + 1.4624000000367232, + 1.5570000000479922, + 1.6638000001876208, + 1.6330999997080653, + 1.573500000176864, + 1.6083999998954823, + 1.5781000001879875, + 1.5854999996918195, + 1.5748999999232183, + 1.4816999996583036, + 1.5257000000019616, + 1.6401000002588262, + 1.588600000104634, + 1.5678999998272047, + 1.5764999998282292, + 1.5591999999742256, + 1.547399999708432, + 1.7224999996869883, + 1.691099999789003, + 1.667999999881431, + 1.6263000002254557, + 1.5778000001773762, + 1.8671000002541405, + 1.7846999999164836, + 1.6829999999572465, + 1.799000000119122, + 1.764199999797711, + 1.5481000000363565, + 1.540999999633641, + 1.6946999999163381, + 1.553799999783223, + 1.5459999999620777, + 1.535500000045431, + 1.5241000000969507, + 1.7437999999856402, + 1.6041000003497174, + 1.5726000001450302, + 1.7123000002357003, + 1.8239999999423162, + 1.7072999999072636, + 1.6759000000092783, + 1.619000000118831, + 1.709499999833497, + 1.7293999999310472, + 1.6737999999349995, + 1.7023000000335742, + 1.9666000002871442, + 1.7035999999279738, + 1.609699999789882, + 1.593699999830278, + 1.5930000004118483, + 1.686000000063359, + 1.600999999936903, + 1.6273999999611988, + 1.683200000115903, + 1.647599999614613, + 1.691599999958271 + ], + "deterministic": true, + "fiducial_log_likelihood": 7.743201200876812, + "stream_log_likelihood": [ + 7.743201200876812, + -4.1609527513907665, + 7.657972665309639, + 9.36455094905725, + 7.051561357429164, + 9.219327498422563, + 0.8907045816755463, + -34.37790701671691, + -24.578291065194456, + -0.4990240338966814, + 0.702590691739907, + 7.669569297550711, + -0.4639011650528264, + -5.412376751794213, + 5.343244353416, + -20.481275097418568 + ], + "admissible": true, + "completeness_prior": { + "n_draws": 200, + "multiplicity_agreement": 1.0, + "raw_count_agreement": 1.0, + "n_multiplicity_mismatch": 0, + "mismatch_examples": [], + "max_position_error": 0.0008513474499103632, + "p99_position_error": 0.0007893460711577849, + "median_position_error": 0.00040657539052049436, + "ref_distinct_histogram": { + "2": 21, + "4": 179 + }, + "abs_delta_logl_vs_reference": { + "max": 0.8682473458375171, + "p99": 0.5684387609120645, + "median": 0.030920850414809298, + "n_nonfinite_mismatch": 0 + }, + "abs_delta_logl_vs_control": { + "max": 0.0, + "p99": 0.0, + "median": 0.0, + "n_nonfinite_mismatch": 0 + } + }, + "completeness_stress": { + "n_draws": 200, + "multiplicity_agreement": 1.0, + "raw_count_agreement": 1.0, + "n_multiplicity_mismatch": 0, + "mismatch_examples": [], + "max_position_error": 0.0007893460711579142, + "p99_position_error": 0.0007893460711576755, + "median_position_error": 0.0004065753905207063, + "ref_distinct_histogram": { + "2": 163, + "4": 37 + } + } + }, + "step0_gather": { + "config": { + "name": "step0_gather", + "block": "step0_route", + "extent": null, + "scale": 0.2, + "precision": 0.001, + "max_containing_size": 15, + "neighbor_degree": 1, + "step0_route": "gather" + }, + "static": { + "extent_half_width": [ + 9.9, + 9.9 + ], + "limits": [ + -9.9, + 9.9, + -9.9, + 9.9 + ], + "scale": 0.2, + "pixel_scale_precision": 0.001, + "n_steps": 8, + "n_steps_formula": "ceil(log2(0.2 / 0.001))", + "last_step_triangle_side": 0.0015625, + "step0_triangles": 23283, + "step0_rows": 11859, + "max_containing_size": 15, + "neighbor_degree": 1, + "step0_route": "gather" + }, + "stats": { + "n": 400, + "median_ms": 2.2212000001218257, + "p10_ms": 2.1205500001087785, + "p90_ms": 2.3378099999263213, + "min_ms": 1.9596000001911307, + "max_ms": 3.0781000000388303, + "mean_ms": 2.2332354999878135 + }, + "speedup_vs_control": { + "ratio": 0.7344678552534649, + "ci90_low": 0.7305465775683629, + "ci90_high": 0.7393326429881116, + "bootstrap_samples": 2000 + }, + "paired_round_speedup": { + "median": 0.7297572216373517, + "p10": 0.7112074482553258, + "p90": 0.7653154923242464 + }, + "compile": { + "lower_s": 2.535207200000059, + "compile_s": 3.3329564000000573, + "first_call_s": 0.0032188999998652434, + "traced_rows_per_step": [ + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720, + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720 + ], + "output_shapes": [ + [] + ], + "flops": 3383414.0, + "memory_analysis": { + "argument_size_in_bytes": 40, + "output_size_in_bytes": 8, + "temp_size_in_bytes": 1692120, + "alias_size_in_bytes": 0, + "generated_code_size_in_bytes": 0, + "host_temp_size_in_bytes": 0 + }, + "rss_delta_bytes": 2162688, + "max_containing_size_proof": null + }, + "warm_ms": [ + 2.559699999892473, + 2.4045999998634215, + 2.324199999748089 + ], + "per_call_ms": [ + 2.376899999944726, + 2.295499999945605, + 2.369799999996758, + 2.273499999773776, + 2.1117000001140696, + 2.264500000364933, + 2.242500000193104, + 2.2717000001648557, + 2.244100000098115, + 2.261499999804073, + 2.3375999999188934, + 2.3870999998507614, + 2.280400000017835, + 2.2899999999026477, + 2.2943999997551145, + 2.330700000129582, + 2.306200000020908, + 2.2692999996252183, + 2.2865000000820146, + 2.302599999893573, + 2.290700000230572, + 2.3514999998042185, + 2.394600000116043, + 2.237199999854056, + 2.2702000001117995, + 2.328200000192737, + 2.2963999999774387, + 2.255899999909161, + 2.2493999999824155, + 2.1541000000979693, + 2.290999999786436, + 2.329699999791046, + 2.282900000409427, + 2.327400000012858, + 2.1948000003249035, + 2.3507999999310414, + 2.23679999999149, + 2.2840999999971245, + 2.217700000073819, + 2.313899999990099, + 2.105799999753799, + 2.2410999999920023, + 2.1471000000019558, + 2.1501000001080683, + 2.1943000001556356, + 2.1054000003459805, + 2.2461999997176463, + 2.26829999974143, + 2.1836000000803324, + 2.381299999797193, + 2.2733000000698667, + 2.4536999999327236, + 2.2618000002694316, + 2.213700000083918, + 2.3436000001311186, + 2.2711000001436332, + 2.2745000001123117, + 2.343399999972462, + 2.227599999969243, + 2.3085000002538436, + 2.207300000009127, + 2.17930000007982, + 2.1830999999110645, + 2.2601999999096734, + 2.174100000047474, + 2.2066999999879044, + 2.1904000000176893, + 2.185599999847909, + 2.104599999711354, + 2.167399999962072, + 2.1255999999993946, + 2.184500000112166, + 2.3163999999269436, + 2.203699999881792, + 2.1395999997366744, + 2.189799999996467, + 2.1163999999771477, + 2.1143999997548235, + 2.34390000014173, + 2.175500000248576, + 2.207599999564991, + 2.1273000002111075, + 2.106699999785633, + 2.0912999998472515, + 2.1304000001691747, + 1.9596000001911307, + 2.1206000001257053, + 2.08199999997305, + 2.106699999785633, + 2.1317000000635744, + 2.123799999935727, + 2.1535999999287014, + 2.1759000001111417, + 2.0501999997577514, + 2.089999999952852, + 2.1980000001349254, + 2.192099999774655, + 2.2733000000698667, + 2.221000000190543, + 2.1916000000601343, + 2.1032999998169544, + 2.1083999999973457, + 2.1870999999009655, + 2.1275999997669715, + 2.04200000007404, + 2.1249000001262175, + 2.1283999999468506, + 2.107899999828078, + 2.1242000002530403, + 2.1230000002105953, + 2.1839000000909436, + 2.1735000000262517, + 2.29910000007294, + 2.2140000000945292, + 2.231099999789876, + 2.180899999984831, + 2.0841000000473286, + 2.1704000000681845, + 2.0632999999179447, + 2.087099999698694, + 2.1457000002556015, + 2.25430000000415, + 2.189900000303169, + 2.1285000002535526, + 2.1135999995749444, + 2.0879999997305276, + 2.063599999928556, + 2.0761999999194813, + 2.2934000003260735, + 2.1217000003161957, + 2.1409000000858214, + 2.1131999997123785, + 2.146599999832688, + 2.1797999997943407, + 2.199300000029325, + 2.4698000001990295, + 2.185299999837298, + 2.201400000103604, + 2.208500000051572, + 2.2004000002198154, + 2.845500000148604, + 2.3924000001898094, + 2.2758000000067113, + 2.249099999971804, + 2.267099999698985, + 2.235999999811611, + 2.211800000168296, + 2.8133000000707398, + 2.2755999998480547, + 2.5777999999263557, + 2.2457999998550804, + 2.1633000001202163, + 2.210900000136462, + 2.276300000175979, + 2.4117999996633444, + 2.337400000214984, + 2.2631999995610386, + 2.101099999890721, + 2.0933999999215303, + 2.274299999953655, + 2.221000000190543, + 2.26280000015322, + 2.133500000127242, + 2.32209999967381, + 2.1924999996372208, + 2.22170000006372, + 2.2598000000471075, + 2.2575999996661267, + 2.2445999998126354, + 2.2058999998080253, + 2.2164000001794193, + 2.189799999996467, + 2.2030000000086147, + 2.2074999997130362, + 2.222799999799463, + 2.2238999999899534, + 2.2157999997034494, + 2.70379999983561, + 2.2481999999399704, + 2.204500000061671, + 2.3120000000744767, + 2.1931999999651453, + 2.248100000088016, + 2.180200000111654, + 2.128600000105507, + 2.150099999653321, + 2.223200000116776, + 2.1834999997736304, + 2.1669000002475514, + 2.2132999997666047, + 2.244100000098115, + 2.258400000300753, + 2.2240000002966553, + 2.272000000175467, + 2.2196999998413958, + 2.152899999600777, + 2.227599999969243, + 2.251099999739381, + 2.2475000000667933, + 2.2207000001799315, + 2.1264000001792738, + 2.1243999999569496, + 2.1200999999564374, + 2.246000000013737, + 2.1584000000984815, + 2.232299999832321, + 2.1435999997265753, + 2.2605999997722392, + 2.2174999999151623, + 2.1716000001106295, + 2.216800000041985, + 2.2292000003290013, + 2.1485999996002647, + 2.205599999797414, + 2.131900000222231, + 2.320499999768799, + 2.133500000127242, + 2.1433000001707114, + 2.0865000001322187, + 2.2544999997080595, + 2.3214000002553803, + 2.29120000039984, + 2.229700000043522, + 2.137100000254577, + 2.2042999999030144, + 2.137899999979709, + 2.274299999953655, + 2.1652000000358385, + 2.399599999989732, + 2.1696000003430527, + 2.188600000408769, + 2.1982999996907893, + 2.1787000000585977, + 2.2933000000193715, + 2.1864000000277883, + 2.2964999998293933, + 2.2251000000323984, + 2.230399999916699, + 2.1997999997438455, + 2.2353999997903884, + 2.364599999964412, + 2.3396999999931722, + 2.253400000427064, + 2.2589999998672283, + 2.28400000014517, + 2.1964999996271217, + 2.399299999979121, + 2.356200000122044, + 2.383300000019517, + 2.4356999997507955, + 2.36620000032417, + 2.3175999999693886, + 2.2446000002673827, + 2.226399999926798, + 2.319299999726354, + 2.202399999987392, + 2.271899999868765, + 2.1209000001363165, + 2.183699999932287, + 2.1693000003324414, + 2.360200000111945, + 2.3836000000301283, + 2.3444000003109977, + 2.377700000124605, + 2.260699999624194, + 2.2584999996979604, + 2.2201999995559163, + 2.271500000006199, + 2.375199999733013, + 2.347399999962363, + 2.2937000003366848, + 2.24400000024616, + 2.266800000143121, + 2.1891999999752443, + 2.244299999802024, + 2.4023000000852335, + 2.2578000002795307, + 2.7536000002328365, + 2.28030000016588, + 2.2547999997186707, + 2.319100000022445, + 2.2822000000815024, + 2.2607000000789412, + 2.2669999998470303, + 2.3249000000760134, + 2.1457999996528088, + 2.207199999702425, + 2.6003000002674526, + 2.323799999885523, + 2.184700000270823, + 2.2321999999803666, + 2.3360000000138825, + 2.311900000222522, + 2.264700000068842, + 2.280000000155269, + 2.2423000000344473, + 2.3146000003180234, + 2.2069999999985157, + 2.218200000243087, + 2.175399999941874, + 2.246000000013737, + 2.0881000000372296, + 2.1434999998746207, + 2.1402000002126442, + 2.1686999998564715, + 2.1722999999838066, + 2.1393999995780177, + 2.136999999947875, + 2.1582999997917796, + 2.06930000013017, + 2.0863999998255167, + 2.1973999996589555, + 2.2650000000794535, + 2.1603000000141037, + 2.092000000175176, + 2.1382999998422747, + 2.154700000119192, + 2.1529000000555243, + 2.2174999999151623, + 2.1632000002682616, + 2.2275000001172884, + 2.2641000000476197, + 2.182899999752408, + 2.2060000001147273, + 2.25799999998344, + 2.0988999999644875, + 2.1887000002607238, + 2.198600000156148, + 2.065099999981612, + 2.2345999996105093, + 2.2404999999707798, + 2.1882999999434105, + 2.223299999968731, + 2.119799999945826, + 2.209599999787315, + 2.1757999998044397, + 2.1618999999191146, + 2.2290000001703447, + 2.223599999979342, + 2.207300000009127, + 2.21689999989394, + 2.160899999580579, + 2.131699999608827, + 2.3341000000982604, + 2.233899999737332, + 2.7847000001202105, + 2.2853000000395696, + 2.1523000000343018, + 2.1301000001585635, + 2.1001000000069325, + 2.262699999846518, + 2.30699999974604, + 2.210600000125851, + 2.1806999998261745, + 2.1886999998059764, + 2.118200000040815, + 2.216800000041985, + 2.1698999998989166, + 2.150599999822589, + 2.3030999996080936, + 2.0670000003519817, + 2.1050000000286673, + 2.3092999999789754, + 2.1510999999918567, + 2.1969999997963896, + 2.1990999998706684, + 2.1357000000534754, + 2.1228999999038933, + 2.1298000001479522, + 2.2498000002997287, + 2.2522000003846188, + 2.1830999999110645, + 2.314999999725842, + 2.2214000000531087, + 3.0781000000388303, + 2.2752999998374435, + 2.2761000000173226, + 2.2951999999349937, + 2.2724999998899875, + 2.2552999998879386, + 2.310200000010809, + 2.249200000278506, + 2.198499999849446, + 2.233499999874766, + 2.2146999999677064, + 2.7366999997866515, + 2.3976999996193626, + 2.3494999995818944, + 2.2656999999526306, + 2.2396999997909006, + 2.239599999938946, + 2.2886000001562934, + 2.297900000030495, + 2.2343999999066, + 2.2315000001071894, + 2.2278999999798543, + 2.1657000002051063, + 2.190799999880255, + 2.274699999816221, + 2.28160000006028 + ], + "deterministic": true, + "fiducial_log_likelihood": 7.743201200876812, + "stream_log_likelihood": [ + 7.743201200876812, + -4.1609527513907665, + 7.657972665309639, + 9.36455094905725, + 7.051561357429164, + 9.219327498422563, + 0.8907045816755463, + -34.37790701671691, + -24.578291065194456, + -0.4990240338966814, + 0.702590691739907, + 7.669569297550711, + -0.4639011650528264, + -5.412376751794213, + 5.343244353416, + -20.481275097418568 + ], + "admissible": true, + "completeness_prior": { + "n_draws": 200, + "multiplicity_agreement": 1.0, + "raw_count_agreement": 1.0, + "n_multiplicity_mismatch": 0, + "mismatch_examples": [], + "max_position_error": 0.0008513474499103632, + "p99_position_error": 0.0007893460711577849, + "median_position_error": 0.00040657539052049436, + "ref_distinct_histogram": { + "2": 21, + "4": 179 + }, + "abs_delta_logl_vs_reference": { + "max": 0.8682473458375171, + "p99": 0.5684387609120645, + "median": 0.030920850414809298, + "n_nonfinite_mismatch": 0 + }, + "abs_delta_logl_vs_control": { + "max": 0.0, + "p99": 0.0, + "median": 0.0, + "n_nonfinite_mismatch": 0 + } + }, + "completeness_stress": { + "n_draws": 200, + "multiplicity_agreement": 1.0, + "raw_count_agreement": 1.0, + "n_multiplicity_mismatch": 0, + "mismatch_examples": [], + "max_position_error": 0.0007893460711579142, + "p99_position_error": 0.0007893460711576755, + "median_position_error": 0.0004065753905207063, + "ref_distinct_histogram": { + "2": 163, + "4": 37 + } + } + }, + "step0_nopad": { + "config": { + "name": "step0_nopad", + "block": "step0_route", + "extent": null, + "scale": 0.2, + "precision": 0.001, + "max_containing_size": 15, + "neighbor_degree": 1, + "step0_route": "nopad" + }, + "static": { + "extent_half_width": [ + 9.9, + 9.9 + ], + "limits": [ + -9.9, + 9.9, + -9.9, + 9.9 + ], + "scale": 0.2, + "pixel_scale_precision": 0.001, + "n_steps": 8, + "n_steps_formula": "ceil(log2(0.2 / 0.001))", + "last_step_triangle_side": 0.0015625, + "step0_triangles": 23283, + "step0_rows": 11859, + "max_containing_size": 15, + "neighbor_degree": 1, + "step0_route": "nopad" + }, + "stats": { + "n": 400, + "median_ms": 2.249199999823759, + "p10_ms": 2.142979999734962, + "p90_ms": 2.367040000308407, + "min_ms": 2.033199999914359, + "max_ms": 3.0933000002733024, + "mean_ms": 2.2564005000015186 + }, + "speedup_vs_control": { + "ratio": 0.725324559979684, + "ci90_low": 0.7220247144024469, + "ci90_high": 0.7307215192002263, + "bootstrap_samples": 2000 + }, + "paired_round_speedup": { + "median": 0.7281653136469417, + "p10": 0.6900362901376941, + "p90": 0.7598515631045025 + }, + "compile": { + "lower_s": 2.620164299999942, + "compile_s": 3.493998399999782, + "first_call_s": 0.003382800000053976, + "traced_rows_per_step": [ + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720, + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720 + ], + "output_shapes": [ + [] + ], + "flops": 3173867.0, + "memory_analysis": { + "argument_size_in_bytes": 40, + "output_size_in_bytes": 8, + "temp_size_in_bytes": 1692120, + "alias_size_in_bytes": 0, + "generated_code_size_in_bytes": 0, + "host_temp_size_in_bytes": 0 + }, + "rss_delta_bytes": 6463488, + "max_containing_size_proof": null + }, + "warm_ms": [ + 2.4974000002657704, + 2.4033999998209765, + 2.342499999940628 + ], + "per_call_ms": [ + 2.484300000105577, + 2.34630000022662, + 2.4248999998235377, + 2.2986999997556268, + 2.315900000212423, + 2.328200000192737, + 2.281099999891012, + 2.408100000138802, + 2.2495000002891175, + 2.2641999998995743, + 2.306200000020908, + 2.249199999823759, + 2.197599999817612, + 2.1704000000681845, + 2.2604999999202846, + 2.261099999941507, + 2.2700999998050975, + 2.289600000040082, + 2.23199999982171, + 2.226399999926798, + 2.25010000031034, + 2.250699999876815, + 2.2828999999546795, + 2.1875000002182787, + 2.2084000001996174, + 2.3237000000335684, + 2.317399999810732, + 2.228800000011688, + 2.250500000172906, + 2.170099999602826, + 2.290400000219961, + 2.235599999949045, + 2.331000000140193, + 2.24709999974948, + 2.383400000326219, + 2.2858000002088374, + 2.3334999996222905, + 2.362600000196835, + 2.2586000000046624, + 2.3196000001917128, + 2.443700000185345, + 2.4078999999801454, + 2.235200000086479, + 2.196200000071258, + 2.2318000001178007, + 2.215699999851495, + 2.3948000002746994, + 2.3984999997992418, + 2.2835999998278567, + 2.237399999557965, + 2.3194999998850108, + 2.2384999997484556, + 2.1775000000161526, + 2.3403000000143948, + 2.2549999998773274, + 2.216800000041985, + 2.3205000002235465, + 2.323200000319048, + 2.283899999838468, + 2.2863999997753126, + 2.2982000000411063, + 2.223700000286044, + 2.179500000238477, + 2.298000000337197, + 2.157400000214693, + 2.2674000001643435, + 2.2623000004386995, + 2.227200000106677, + 2.1509000002879475, + 2.200399999765068, + 2.1332000001166307, + 2.22170000006372, + 2.226799999789364, + 2.1880000003875466, + 2.17689999999493, + 2.2266999999374093, + 2.2479000003841065, + 2.2039000000404485, + 2.50659999983327, + 2.2632999998677406, + 2.196399999775167, + 2.28640000023006, + 2.086000000417698, + 2.112000000124681, + 3.0933000002733024, + 2.225599999746919, + 2.1481000003404915, + 2.254399999856105, + 2.26349999957165, + 2.324199999748089, + 2.1523000000343018, + 2.1821999998792307, + 2.096700000038254, + 2.2276999998211977, + 2.104700000018056, + 2.0673999997598003, + 2.1023000003879133, + 2.229800000350224, + 2.2018999998181243, + 2.273200000217912, + 2.14910000022428, + 2.3137000002861896, + 2.255899999909161, + 2.427099999749771, + 2.2008000000823813, + 2.15939999998227, + 2.1617999996124126, + 2.2551999995812366, + 2.180700000280922, + 2.194900000176858, + 2.3012999999991735, + 2.3280000000340806, + 2.2278999999798543, + 2.2273999998105865, + 2.2816999999122345, + 2.269099999921309, + 2.255099999729282, + 2.279099999668688, + 2.2302000002127897, + 2.2834000001239474, + 2.1600000000034925, + 2.2226000000955537, + 2.5149000002784305, + 2.3502999997617735, + 2.2657999998045852, + 2.1814999995513062, + 2.265499999793974, + 2.257600000120874, + 2.2422999995797, + 2.1905000003243913, + 2.2659000001112872, + 2.3197000000436674, + 2.286800000092626, + 2.3099999998521525, + 2.2414000000026135, + 2.3390999999719497, + 2.310999999735941, + 2.3691999999755353, + 2.288700000008248, + 2.282299999933457, + 2.387300000009418, + 2.3668000003453926, + 2.129399999830639, + 2.3584000000482774, + 2.2343999999066, + 2.2905000000719156, + 2.3349999996753468, + 2.234500000213302, + 2.2733999999218213, + 2.175300000089919, + 2.2522000003846188, + 2.4883999999474327, + 2.267899999878864, + 2.1887000002607238, + 2.2954000000936503, + 2.2693000000799657, + 2.2727999999005988, + 2.380899999934627, + 2.391999999872496, + 2.1966999997857783, + 2.3637999997845327, + 2.343800000289775, + 2.314000000296801, + 2.255200000035984, + 2.162199999929726, + 2.262399999835907, + 2.4139000001923705, + 2.304300000105286, + 2.162599999792292, + 2.233499999874766, + 2.2443000002567715, + 2.275600000302802, + 2.38679999984015, + 2.25799999998344, + 2.280700000028446, + 2.2785999999541673, + 2.4690000000191503, + 2.510700000129873, + 2.269499999783875, + 2.251599999908649, + 2.3132999999688764, + 2.3394999998345156, + 2.2979999998824496, + 2.2596999997404055, + 2.2008000000823813, + 2.2942000000512053, + 2.2837999999865133, + 2.260999999634805, + 2.134300000307121, + 2.1806999998261745, + 2.231599999959144, + 2.189299999827199, + 2.2455999996964238, + 2.256400000078429, + 2.3525000001427543, + 2.274400000260357, + 2.226799999789364, + 2.267399999709596, + 2.198600000156148, + 2.3285000002033485, + 2.3496000003433437, + 2.2017999999661697, + 2.1825000003445894, + 2.21079999982976, + 2.128899999661371, + 2.1633000001202163, + 2.175399999941874, + 2.220899999883841, + 2.232400000139023, + 2.084900000227208, + 2.238100000340637, + 2.2471000002042274, + 2.2186999999576074, + 2.289099999870814, + 2.210499999819149, + 2.2125999998934276, + 2.288300000145682, + 2.2396999997909006, + 2.175599999645783, + 2.2568000003957422, + 2.777700000024197, + 2.2942000000512053, + 2.4177999998755695, + 2.4224999997386476, + 2.1375999999690976, + 2.2422999995797, + 2.3343999996541243, + 2.2171000000525964, + 2.237300000160758, + 2.409899999747722, + 2.344600000014907, + 2.315799999905721, + 2.2899999999026477, + 2.202600000146049, + 2.3390999999719497, + 2.256799999940995, + 2.3120999999264313, + 2.3486999998567626, + 2.2579000001314853, + 2.410900000086258, + 2.1901999998590327, + 2.2470000003522728, + 2.249199999823759, + 2.1953999998913787, + 2.0952999998371524, + 2.2525999997924373, + 2.137500000117143, + 2.1391999998741085, + 2.17270000030112, + 2.17030000021623, + 2.136600000085309, + 2.124199999798293, + 2.177400000164198, + 2.117900000030204, + 2.1049000001767126, + 2.0546000000649656, + 2.2137999999358726, + 2.1802999999636086, + 2.153400000224792, + 2.1148000000721368, + 2.3654999999962456, + 2.442299999984243, + 2.264299999751529, + 2.267099999698985, + 2.224800000021787, + 2.4238000000877946, + 2.3264999999810243, + 2.389400000083697, + 2.2410000001400476, + 2.2045999999136257, + 2.3224999999911233, + 2.2063000001253386, + 2.3572000000058324, + 2.3756000000503263, + 2.222099999926286, + 2.2653999999420193, + 2.391999999872496, + 2.2445999998126354, + 2.198600000156148, + 2.2383000000445463, + 2.1693000003324414, + 2.230100000360835, + 2.272599999741942, + 2.226799999789364, + 2.195400000346126, + 2.2993000002315966, + 2.291900000273017, + 2.183699999932287, + 2.3524000002907997, + 2.1511999998438114, + 2.207999999882304, + 2.2625000001426088, + 2.2638000000370084, + 2.1990999998706684, + 2.423599999929138, + 2.2762000003240246, + 2.337699999770848, + 2.3805999999240157, + 2.2405999998227344, + 2.295499999945605, + 2.2202000000106636, + 2.154199999949924, + 2.1176999998715473, + 2.1400999999059422, + 2.2693000000799657, + 2.033199999914359, + 2.0969000001969107, + 2.136899999641173, + 2.217000000200642, + 2.226000000064232, + 2.191300000049523, + 2.2214999999050633, + 2.3613999996996426, + 2.2773999999117223, + 2.3912000001473643, + 2.3200999999062333, + 2.324999999927968, + 2.2146999999677064, + 2.274800000122923, + 2.268599999752041, + 2.1133000000190805, + 2.1778999998787185, + 2.177400000164198, + 2.2421999997277453, + 2.1035999998275656, + 2.1922999999333115, + 2.11459999991348, + 2.1205000002737506, + 2.064000000245869, + 2.108700000007957, + 2.1332000001166307, + 2.180500000122265, + 2.1018999996158527, + 2.2478000000774045, + 2.1573000003627385, + 2.139100000022154, + 2.0523000002867775, + 2.1707000000787957, + 2.1615999999085034, + 2.1615999999085034, + 2.1868000003451016, + 2.1298000001479522, + 2.1873999999115767, + 2.084799999920506, + 2.1162000002732384, + 2.2205999998732295, + 2.2592999998778396, + 2.2408999998333456, + 2.2146999999677064, + 2.17449999991004, + 2.143299999715964, + 2.321899999969901, + 2.177299999857496, + 2.3422999997819716, + 2.3020999997243052, + 2.284300000155781, + 2.234000000044034, + 2.3125000002437446, + 2.2404999999707798, + 2.263599999878352, + 2.3597999997946317, + 2.4056999995991646, + 2.3387999999613385, + 2.4590000002717716, + 2.29910000007294, + 2.391999999872496, + 2.2493999999824155, + 2.3224000001391687, + 2.3755000001983717, + 2.3446999998668616, + 2.248299999791925, + 2.35179999981483, + 2.37169999991238, + 2.270800000133022, + 2.227200000106677, + 2.285900000060792, + 2.211800000168296, + 2.205400000093505, + 2.210399999967194, + 2.312999999958265, + 2.2923999999875377, + 2.3347999999714375, + 2.208899999914138, + 2.257499999814172, + 2.1652000000358385, + 2.1051000003353693, + 2.164600000014616, + 2.190100000007078, + 2.2287000001597335, + 2.191000000038912, + 2.1721000002798974, + 2.237700000023324, + 2.263899999888963, + 2.228500000001077, + 2.1781999998893298, + 2.196200000071258, + 2.3054999996929837, + 2.2259000002122775, + 2.1641000003000954, + 2.94690000009723 + ], + "deterministic": true, + "fiducial_log_likelihood": 7.743201200876812, + "stream_log_likelihood": [ + 7.743201200876812, + -4.1609527513907665, + 7.657972665309639, + 9.36455094905725, + 7.051561357429164, + 9.219327498422563, + 0.8907045816755463, + -34.37790701671691, + -24.578291065194456, + -0.4990240338966814, + 0.702590691739907, + 7.669569297550711, + -0.4639011650528264, + -5.412376751794213, + 5.343244353416, + -20.481275097418568 + ], + "admissible": true, + "completeness_prior": { + "n_draws": 200, + "multiplicity_agreement": 1.0, + "raw_count_agreement": 1.0, + "n_multiplicity_mismatch": 0, + "mismatch_examples": [], + "max_position_error": 0.0008513474499103632, + "p99_position_error": 0.0007893460711577849, + "median_position_error": 0.00040657539052049436, + "ref_distinct_histogram": { + "2": 21, + "4": 179 + }, + "abs_delta_logl_vs_reference": { + "max": 0.8682473458375171, + "p99": 0.5684387609120645, + "median": 0.030920850414809298, + "n_nonfinite_mismatch": 0 + }, + "abs_delta_logl_vs_control": { + "max": 0.0, + "p99": 0.0, + "median": 0.0, + "n_nonfinite_mismatch": 0 + } + }, + "completeness_stress": { + "n_draws": 200, + "multiplicity_agreement": 1.0, + "raw_count_agreement": 1.0, + "n_multiplicity_mismatch": 0, + "mismatch_examples": [], + "max_position_error": 0.0007893460711579142, + "p99_position_error": 0.0007893460711576755, + "median_position_error": 0.0004065753905207063, + "ref_distinct_histogram": { + "2": 163, + "4": 37 + } + } + }, + "step0_components": { + "config": { + "name": "step0_components", + "block": "step0_route", + "extent": null, + "scale": 0.2, + "precision": 0.001, + "max_containing_size": 15, + "neighbor_degree": 1, + "step0_route": "components" + }, + "static": { + "extent_half_width": [ + 9.9, + 9.9 + ], + "limits": [ + -9.9, + 9.9, + -9.9, + 9.9 + ], + "scale": 0.2, + "pixel_scale_precision": 0.001, + "n_steps": 8, + "n_steps_formula": "ceil(log2(0.2 / 0.001))", + "last_step_triangle_side": 0.0015625, + "step0_triangles": 23283, + "step0_rows": 11859, + "max_containing_size": 15, + "neighbor_degree": 1, + "step0_route": "components" + }, + "stats": { + "n": 400, + "median_ms": 1.5553499999896303, + "p10_ms": 1.4607999999498134, + "p90_ms": 1.6951399999470596, + "min_ms": 1.3519000003725523, + "max_ms": 2.227200000106677, + "mean_ms": 1.5703824999934568 + }, + "speedup_vs_control": { + "ratio": 1.0488957470597293, + "ci90_low": 1.0438247013366706, + "ci90_high": 1.058413486712005, + "bootstrap_samples": 2000 + }, + "paired_round_speedup": { + "median": 1.0490490248554991, + "p10": 0.9933596100218389, + "p90": 1.0916629529652018 + }, + "compile": { + "lower_s": 2.506862000000183, + "compile_s": 3.5461411000001135, + "first_call_s": 0.002373900000293361, + "traced_rows_per_step": [ + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720, + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720 + ], + "output_shapes": [ + [] + ], + "flops": 3578378.0, + "memory_analysis": { + "argument_size_in_bytes": 40, + "output_size_in_bytes": 8, + "temp_size_in_bytes": 1506264, + "alias_size_in_bytes": 0, + "generated_code_size_in_bytes": 0, + "host_temp_size_in_bytes": 0 + }, + "rss_delta_bytes": 2162688, + "max_containing_size_proof": null + }, + "warm_ms": [ + 1.9029000000045926, + 1.7560999999659543, + 1.5510999996877217 + ], + "per_call_ms": [ + 1.7115000000558211, + 1.6200000000026193, + 1.5843000001041219, + 1.656500000080996, + 1.5975000001162698, + 1.7262000001210254, + 1.5538000002379704, + 1.6196000001400535, + 1.6380999995817547, + 1.469999999699212, + 1.5011000000413333, + 1.5753000002405315, + 1.5816999998605752, + 1.5301000003091758, + 1.4691000001221255, + 1.420499999767344, + 1.4741999998477695, + 1.638100000036502, + 1.5100999999049236, + 1.3894999997319246, + 1.831699999911507, + 1.769100000274193, + 1.6645999999127525, + 1.6617999999652966, + 1.64889999996376, + 1.6104999999697611, + 1.7069999998966523, + 1.692299999831448, + 1.6371000001527136, + 1.6472000002067944, + 1.5091000000211352, + 1.4922000000296975, + 1.484100000197941, + 1.5925000002425804, + 1.6055000000960717, + 1.5748999999232183, + 1.5043999997033097, + 1.498399999945832, + 1.4912000001459091, + 1.4814999999543943, + 1.8409999997857085, + 1.6640999997434847, + 1.6860999999153137, + 1.602099999672646, + 1.6980999998850166, + 1.5402999997604638, + 1.596700000391138, + 1.4611999999942782, + 1.4670999998998013, + 1.5570999998999469, + 1.6923000002861954, + 1.5662999999221938, + 1.4297000002443383, + 1.6029999997044797, + 1.4688000001115142, + 1.5453000000889006, + 1.5911000000414788, + 1.4935000003788446, + 1.4638000002378249, + 1.6112000002976856, + 1.6774999999142892, + 1.6404999996666447, + 1.6594999997323612, + 1.5582999999423919, + 1.542299999982788, + 1.8104000000676024, + 1.556599999730679, + 1.6150999999808846, + 1.5327000000979751, + 1.4850000002297747, + 1.4471999998022511, + 1.624200000151177, + 1.5059000002111134, + 1.4477999998234736, + 1.5106999999261461, + 1.4712999995936116, + 1.4771000001019274, + 1.5106999999261461, + 1.4405000001715962, + 1.4574999995602411, + 1.5977999996721337, + 1.679599999988568, + 1.5756000002511428, + 1.5988000000106695, + 1.5985000000000582, + 1.5201999999590043, + 1.4618000000155007, + 1.497199999903387, + 1.6110999999909836, + 1.4619000003222027, + 1.5897000002951245, + 1.5480000001844019, + 1.5198000000964385, + 1.507200000105513, + 1.4697999999953026, + 1.643300000068848, + 1.513899999736168, + 1.6673000000082538, + 1.720000000204891, + 1.8810999999914202, + 1.8586999999570253, + 1.703200000065408, + 1.579799999944953, + 1.9186000004083326, + 1.586300000326446, + 1.6150999999808846, + 1.5662999999221938, + 1.62769999997181, + 1.4323000000331376, + 1.644500000111293, + 1.5662999999221938, + 1.5534999997726118, + 1.5469999998458661, + 1.6514999997525592, + 1.4999999998508429, + 1.4171000002534129, + 1.4804000002186513, + 1.4941999997972744, + 1.5141999997467792, + 1.5456999999514665, + 1.7534999997224077, + 2.227200000106677, + 1.7121999999289983, + 1.6300000002047454, + 1.7155000000457221, + 1.855999999861524, + 1.600999999936903, + 1.607500000318396, + 1.6725999998925545, + 1.5392000000247208, + 1.6024000001380045, + 1.6469999995933904, + 1.5235000000757282, + 1.6378999998778454, + 1.583400000072288, + 1.6000000000531145, + 1.5548999999737134, + 1.5605000003233727, + 1.5455999996447645, + 1.4751000003343506, + 1.6292000000248663, + 1.731899999867892, + 1.6660000001138542, + 1.6310999999404885, + 1.5443000002051122, + 1.5378000002783665, + 1.7339999999421707, + 1.5885999996498867, + 1.6582000002927089, + 1.5035000001262233, + 1.5612000001965498, + 1.4656000003014924, + 1.5714000001025852, + 1.645999999709602, + 1.6273999999611988, + 1.5794999999343418, + 1.507599999968079, + 1.632099999824277, + 1.564599999710481, + 1.4966000003369118, + 1.6416000003118825, + 1.6583000001446635, + 1.523200000065117, + 1.5890999998191546, + 1.5604000000166707, + 1.6144000001077075, + 1.4873999998599174, + 1.6608999999334628, + 1.5253999999913503, + 1.4724000002388493, + 1.5439999997397535, + 1.617800000076386, + 1.542299999982788, + 1.4555000002474117, + 1.5381000002889778, + 1.533499999823107, + 1.6644000002088433, + 1.5146000000640925, + 1.5215999997053586, + 1.5343999998549407, + 1.8321000002288201, + 1.875099999779195, + 1.6926000002968067, + 1.5465999999833002, + 1.551600000311737, + 1.5167999999903259, + 1.5026999999463442, + 1.6279999999824213, + 1.46679999988919, + 1.696400000128051, + 1.50610000036977, + 1.4367999997375591, + 1.5026999999463442, + 1.460899999983667, + 1.4553999999407097, + 1.4482999999927415, + 1.489300000230287, + 1.388199999837525, + 1.3523000002351182, + 1.3944000002084067, + 1.6933999995671911, + 1.7710000001898152, + 1.7548000000715547, + 1.619699999992008, + 1.5346000000135973, + 1.5293999999812513, + 1.5484000000469678, + 1.5558000000055472, + 1.53699999964374, + 1.5942999998515006, + 1.5119999998205458, + 1.5320999996220053, + 1.5630000002602173, + 1.595400000041991, + 1.434899999821937, + 1.6178999999283405, + 1.4874000003146648, + 1.529499999833206, + 1.5296999999918626, + 1.491600000008475, + 1.776600000084727, + 1.6424999998889689, + 1.7346999998153478, + 1.6107000001284177, + 1.6997999996419821, + 1.5570999998999469, + 1.5513000003011257, + 1.451800000268122, + 1.7392999998264713, + 1.5346000000135973, + 1.5493999999307562, + 1.5425000001414446, + 1.5800999999555643, + 1.5474000001631794, + 1.60230000028605, + 1.530199999706383, + 1.509499999883701, + 1.579799999944953, + 1.606199999969249, + 1.5425999999933993, + 1.5284999999494175, + 1.6223000002355548, + 1.5361000000666536, + 1.5798999997969077, + 1.5441999998984102, + 1.617800000076386, + 1.6184000000976084, + 1.544000000194501, + 1.5146000000640925, + 1.5381000002889778, + 1.5201999999590043, + 1.4625000003434252, + 1.4413000003514753, + 1.4679000000796805, + 1.466900000195892, + 1.4475000002676097, + 1.4897999999448075, + 1.567100000102073, + 1.390599999922415, + 1.5072999999574677, + 1.7418000002180634, + 1.6854999998940912, + 1.518000000032771, + 1.5602999997099687, + 1.5569000001960376, + 1.523300000371819, + 1.5570999998999469, + 1.4732999998159357, + 1.5106999999261461, + 1.4586000002054789, + 1.5491999997720995, + 1.4884000001984532, + 1.5413000000989996, + 1.4949000001251989, + 1.3571999998021056, + 1.4255000000957807, + 1.499099999819009, + 1.3918999998168147, + 1.3963999999759835, + 1.4986999999564432, + 1.749799999743118, + 1.665599999796541, + 1.6528000001017062, + 1.627599999665108, + 1.6150999999808846, + 1.6937000000325497, + 1.6233000001193432, + 1.581500000156666, + 1.556199999868113, + 1.5726999999969848, + 1.537499999813008, + 1.433199999610224, + 1.499200000125711, + 1.626899999791931, + 1.5732000001662527, + 1.4734999999745924, + 1.5937000002850255, + 1.4339999997901032, + 1.5364999999292195, + 1.5616999999110703, + 1.7746999997143575, + 1.7236999997294333, + 1.6833999998198124, + 1.543899999887799, + 1.5496999999413674, + 1.5663999997741485, + 1.597800000126881, + 1.5367999999398307, + 1.5944000001582026, + 1.5441000000464555, + 1.5171000000009371, + 1.5359999997599516, + 1.539600000342034, + 1.5253999999913503, + 1.437400000213529, + 1.472399999784102, + 1.5418000002682675, + 1.4612999998462328, + 1.426600000286271, + 1.59929999972519, + 1.6301000000567, + 1.707099999748607, + 1.5878999997767096, + 1.4147000001685228, + 1.3519000003725523, + 1.5315999999074847, + 1.5578000002278714, + 1.4765999999326596, + 1.463199999761855, + 1.547399999708432, + 1.5581000002384826, + 1.4610999996875762, + 1.4838000001873297, + 1.5384999996967963, + 1.5580999997837353, + 1.4555000002474117, + 1.4233000001695473, + 1.4067000001887209, + 1.515099999778613, + 1.5205999998215702, + 1.8022999997810984, + 1.6769999997450213, + 1.6035999997257022, + 1.6227999999500753, + 1.6440999997939798, + 1.581399999849964, + 1.570700000229408, + 1.577500000166765, + 1.5690000000176951, + 1.7014000000017404, + 1.674399999956222, + 1.4618000000155007, + 1.4598999996451312, + 1.5834999999242427, + 1.4786000001549837, + 1.4822000002823188, + 1.5321999999287073, + 1.461700000163546, + 1.4779000002818066, + 1.7646999999669788, + 1.708400000097754, + 1.6536000002815854, + 1.5419999999721767, + 1.546299999972689, + 1.473700000133249, + 1.4664999998785788, + 1.5621999996255909, + 1.5135999997255567, + 1.6949999999269494, + 1.758599999902799, + 1.5625000000909495, + 2.0798000000468164, + 1.626899999791931, + 1.6343000002052577, + 1.6043000000536267, + 1.5630999996574246, + 1.507200000105513, + 1.5747999996165163, + 1.4307000001281267, + 1.4800999997532926, + 1.640899999983958, + 1.6866999999365362, + 1.6526999997950043, + 1.6214999996009283, + 1.5458999996553757, + 1.5570999998999469, + 1.6018999999687367, + 1.6451000001325156, + 1.650799999879382, + 1.504299999851355, + 1.5105999996194441, + 1.6791000002740475, + 1.5304999997169944, + 1.4550000000781438, + 1.5201999999590043, + 1.433800000086194, + 1.4280000000326254, + 1.507200000105513, + 1.534800000172254, + 1.5647999998691375 + ], + "deterministic": true, + "fiducial_log_likelihood": 7.743201200876812, + "stream_log_likelihood": [ + 7.743201200876812, + -4.1609527513907665, + 7.657972665309639, + 9.36455094905725, + 7.051561357429164, + 9.219327498422563, + 0.8907045816755463, + -34.37790701671691, + -24.578291065194456, + -0.4990240338966814, + 0.702590691739907, + 7.669569297550711, + -0.4639011650528264, + -5.412376751794213, + 5.343244353416, + -20.481275097418568 + ], + "admissible": true, + "completeness_prior": { + "n_draws": 200, + "multiplicity_agreement": 1.0, + "raw_count_agreement": 1.0, + "n_multiplicity_mismatch": 0, + "mismatch_examples": [], + "max_position_error": 0.0008513474499103632, + "p99_position_error": 0.0007893460711577849, + "median_position_error": 0.00040657539052049436, + "ref_distinct_histogram": { + "2": 21, + "4": 179 + }, + "abs_delta_logl_vs_reference": { + "max": 0.8682473458375171, + "p99": 0.5684387609120645, + "median": 0.030920850414809298, + "n_nonfinite_mismatch": 0 + }, + "abs_delta_logl_vs_control": { + "max": 0.0, + "p99": 0.0, + "median": 0.0, + "n_nonfinite_mismatch": 0 + } + }, + "completeness_stress": { + "n_draws": 200, + "multiplicity_agreement": 1.0, + "raw_count_agreement": 1.0, + "n_multiplicity_mismatch": 0, + "mismatch_examples": [], + "max_position_error": 0.0007893460711579142, + "p99_position_error": 0.0007893460711576755, + "median_position_error": 0.0004065753905207063, + "ref_distinct_histogram": { + "2": 163, + "4": 37 + } + } + }, + "step0_structured": { + "config": { + "name": "step0_structured", + "block": "step0_route", + "extent": null, + "scale": 0.2, + "precision": 0.001, + "max_containing_size": 15, + "neighbor_degree": 1, + "step0_route": "structured" + }, + "static": { + "extent_half_width": [ + 9.9, + 9.9 + ], + "limits": [ + -9.9, + 9.9, + -9.9, + 9.9 + ], + "scale": 0.2, + "pixel_scale_precision": 0.001, + "n_steps": 8, + "n_steps_formula": "ceil(log2(0.2 / 0.001))", + "last_step_triangle_side": 0.0015625, + "step0_triangles": 23283, + "step0_rows": 11859, + "max_containing_size": 15, + "neighbor_degree": 1, + "step0_route": "structured" + }, + "stats": { + "n": 400, + "median_ms": 1.613299999917217, + "p10_ms": 1.5251900001203467, + "p90_ms": 1.7179100001158076, + "min_ms": 1.4363999998749932, + "max_ms": 2.4974000002657704, + "mean_ms": 1.6218447500000366 + }, + "speedup_vs_control": { + "ratio": 1.0112192402294584, + "ci90_low": 1.0041774461239126, + "ci90_high": 1.019301899084189, + "bootstrap_samples": 2000 + }, + "paired_round_speedup": { + "median": 1.0164174552888547, + "p10": 0.9682389868583244, + "p90": 1.0426169579091724 + }, + "compile": { + "lower_s": 2.653325700000096, + "compile_s": 3.645019500000217, + "first_call_s": 0.0030770000003030873, + "traced_rows_per_step": [ + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720, + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720 + ], + "output_shapes": [ + [] + ], + "flops": 2801341.0, + "memory_analysis": { + "argument_size_in_bytes": 40, + "output_size_in_bytes": 8, + "temp_size_in_bytes": 901656, + "alias_size_in_bytes": 0, + "generated_code_size_in_bytes": 0, + "host_temp_size_in_bytes": 0 + }, + "rss_delta_bytes": 3244032, + "max_containing_size_proof": null + }, + "warm_ms": [ + 1.9126000001961074, + 1.7886999999063846, + 1.79340000022421 + ], + "per_call_ms": [ + 1.5876000002208457, + 1.638499999899068, + 1.5889999999672, + 1.57809999973324, + 1.545200000236946, + 1.5410000000883883, + 1.4363999998749932, + 1.61740000021382, + 1.5902999998615996, + 1.5349999998761632, + 1.566599999932805, + 1.5418000002682675, + 1.6261999999187537, + 1.6672000001562992, + 1.5584000002490939, + 1.5846000001147331, + 1.595500000348693, + 1.6062999998212035, + 1.566999999795371, + 1.624099999844475, + 1.6857000000527478, + 1.6893000001800829, + 1.6101000001071952, + 1.534300000002986, + 1.6781999997874664, + 1.6024999999899592, + 1.6272000002572895, + 1.547100000152568, + 1.5376999999716645, + 1.6544999998586718, + 1.5878999997767096, + 1.5872000003582798, + 1.6076000001703505, + 1.605400000244117, + 1.703200000065408, + 1.5951000000313797, + 1.6264000000774104, + 1.6472000002067944, + 1.6012999999475142, + 1.5604000000166707, + 1.600600000074337, + 1.5937000002850255, + 1.55270000004748, + 1.482399999986228, + 1.4510999999401974, + 1.4908999996805505, + 1.576999999997497, + 1.5816999998605752, + 1.541900000120222, + 1.5392999998766754, + 1.5951000000313797, + 1.5571999997519015, + 1.6055999999480264, + 1.5616999999110703, + 1.5303999998650397, + 1.4618999998674553, + 1.5229000000545057, + 1.4702999997098232, + 1.520299999810959, + 1.5451999997821986, + 1.5693000000283064, + 1.592499999787833, + 1.4745999997103354, + 1.4685999999528576, + 1.4739000002919056, + 1.558999999815569, + 1.5014000000519445, + 1.5684999998484273, + 1.5367999999398307, + 1.5472999998564774, + 1.5467000002900022, + 1.4644999996562547, + 1.502500000242435, + 1.5622000000803382, + 1.5084999999999127, + 1.4718000002176268, + 1.5229999999064603, + 1.6925999998420593, + 1.6355000002477027, + 1.551500000005035, + 1.7028999996000493, + 1.729799999793613, + 1.6011000002436049, + 1.6485999999531487, + 1.6411999999945692, + 1.5149000000747037, + 1.7296999999416585, + 2.4974000002657704, + 1.5945999998621119, + 1.5687999998590385, + 1.6496999996888917, + 1.6227999999500753, + 1.613800000086485, + 1.6187000001082197, + 1.5766999999868858, + 1.6751999996813538, + 1.5121999999792024, + 1.5478000000257452, + 1.5983999996933562, + 1.6193999999813968, + 1.7017000000123517, + 1.634100000046601, + 1.708400000097754, + 1.6156000001501525, + 1.5241999999489053, + 1.5526000001955254, + 1.465700000153447, + 1.499700000294979, + 1.455800000258023, + 1.5292999996745493, + 1.5391000001727662, + 1.5494999997827108, + 1.5096999995876104, + 1.5524999998888234, + 1.6012000000955595, + 1.505600000200502, + 1.5303999998650397, + 1.5410000000883883, + 1.545900000110123, + 1.576199999817618, + 1.6346999996130762, + 1.9987000000583066, + 1.5880999999353662, + 1.5856999998504762, + 1.693499999873893, + 1.583900000241556, + 1.7643999999563675, + 1.6835000001265144, + 1.6817999999148014, + 1.6932000003180292, + 1.702800000202842, + 1.6324000002896355, + 1.6692999997758307, + 1.717600000120001, + 1.6674999997121631, + 1.6719000000193773, + 1.6465000003336172, + 1.730299999962881, + 1.6143000002557528, + 1.5953000001900364, + 1.7468999999437074, + 1.6827999997985899, + 1.678000000083557, + 1.6375000000152795, + 1.5253000001393957, + 1.6135000000758737, + 1.6287000003103458, + 1.5846999999666878, + 1.6130999997585604, + 1.6315000002578017, + 1.6374000001633249, + 1.5986000003067602, + 1.7261000002690707, + 1.6442999999526364, + 1.6847000001689594, + 1.7581000001882785, + 1.6332000000147673, + 1.6699999996490078, + 1.5708000000813627, + 1.6289999998662097, + 1.640899999983958, + 1.6097000002446293, + 1.56779999997525, + 1.5022000002318237, + 1.6374000001633249, + 1.5558999998575018, + 1.634499999909167, + 1.633299999866722, + 1.6848999998728686, + 1.583400000072288, + 1.6402999999627355, + 1.6286999998555984, + 1.640899999983958, + 1.7898999999488296, + 1.7173999999613443, + 1.6402999999627355, + 1.6775999997662439, + 1.7164999999295105, + 1.6574999999647844, + 1.6719000000193773, + 1.8242000001009728, + 1.7277000001740817, + 1.6675000001669105, + 1.6338000000359898, + 1.721099999940634, + 1.7838000003393972, + 1.6696999996383965, + 1.6058999999586376, + 1.5618000002177723, + 1.5886999999565887, + 1.6252000000349653, + 1.680800000031013, + 1.6095000000859727, + 1.5439999997397535, + 1.5845999996599858, + 1.678000000083557, + 1.6279999999824213, + 1.6362999999728345, + 1.5886999999565887, + 1.6774000000623346, + 1.6355000002477027, + 1.8055999998978223, + 1.7025000001922308, + 1.6534000001229288, + 1.7207000000780681, + 1.6270999999505875, + 1.5818999995644845, + 1.7336999999315594, + 1.6568999999435619, + 1.6243000000031316, + 1.6749999999774445, + 1.8004000003202236, + 1.6694000000825326, + 1.6020000002754387, + 1.6105999998217158, + 1.69000000005326, + 1.6290999997181643, + 1.790099999652739, + 1.5972000001056585, + 1.6439000000900705, + 1.649599999836937, + 1.706699999886041, + 1.5644000000065716, + 1.61500000012893, + 1.64889999996376, + 1.6784999997980776, + 1.6011999996408122, + 1.993400000174006, + 1.7149000000244996, + 1.6672000001562992, + 1.6698999997970532, + 1.6716999998607207, + 1.5831999999136315, + 1.556700000037381, + 1.5942999998515006, + 1.6304000000673113, + 1.5503999998145446, + 1.5431000001626671, + 1.5773000000081083, + 1.6584999998485728, + 1.6129000000546512, + 1.5642999996998697, + 1.5349999998761632, + 1.5809000001354434, + 1.5844999998080311, + 1.5844000004108238, + 1.626200000373501, + 1.5278000000762404, + 1.6378000000258908, + 1.621299999897019, + 1.6004000003704277, + 1.5760000001137087, + 1.594199999999546, + 1.6181999999389518, + 2.0144000000072992, + 1.5963000000738248, + 1.6537999999854947, + 1.6066999996837694, + 1.6445999999632477, + 1.6533000002709741, + 1.6512000001966953, + 1.748599999700673, + 1.5883000000940228, + 1.5484999998989224, + 1.5668000000914617, + 1.4878000001772307, + 1.544599999760976, + 1.6051999996307131, + 1.614899999822228, + 1.6765999998824554, + 1.574599999912607, + 1.731899999867892, + 1.606899999842426, + 1.489199999923585, + 1.6275000002679008, + 1.7293999999310472, + 1.5745000000606524, + 1.7265000001316366, + 1.70269999989614, + 1.8006999998760875, + 1.8378999998276413, + 1.7333000000689935, + 1.6908000002331391, + 1.7949000002772664, + 1.6708000002836343, + 1.5711999999439286, + 1.6212000000450644, + 1.6296000003421796, + 1.6049999999268039, + 1.6384000000471133, + 1.6802000000097905, + 1.7078000000765314, + 1.6605999999228516, + 1.6952999999375606, + 1.7477999999755411, + 1.640899999983958, + 1.682000000073458, + 1.561299999593757, + 1.6796999998405227, + 1.5680000001339067, + 1.6404000002694374, + 1.7343999998047366, + 1.6217000002143322, + 1.6033999995670456, + 1.5507999996771105, + 1.561399999900459, + 1.5446000002157234, + 1.5029000001050008, + 1.4416999997592939, + 1.5278000000762404, + 2.210900000136462, + 1.6149999996741826, + 1.703899999938585, + 1.6500000001542503, + 1.638499999899068, + 1.646900000196183, + 1.5997999998944579, + 1.6617999999652966, + 1.6634000003250549, + 1.817999999730091, + 1.7369000001963286, + 1.6362000001208798, + 1.6324000002896355, + 1.572199999827717, + 1.572300000134419, + 1.5190000003713067, + 1.5307000003303983, + 1.489199999923585, + 1.5844999998080311, + 1.6480000003866735, + 1.5536000000793138, + 1.6302999997606094, + 1.4637999997830775, + 1.6307000000779226, + 1.5730999998595507, + 1.5211999998427927, + 1.5564999998787243, + 1.538699999855453, + 1.5300000000024738, + 1.6405999999733467, + 1.6437999997833685, + 1.6971999998531828, + 1.6031000000111817, + 1.6184000000976084, + 1.5272000000550179, + 1.4694999999846914, + 1.5501000002586807, + 1.5985000000000582, + 1.630499999919266, + 1.507200000105513, + 1.5214000000014494, + 1.5850999998292536, + 1.5906000003269583, + 1.5183999998953368, + 1.5496000000894128, + 1.5576000000692147, + 1.508400000147958, + 1.5542000001005363, + 1.586200000019744, + 1.5738000001874752, + 1.6916999998102256, + 1.7069000000446977, + 1.6120000000228174, + 1.532999999653839, + 1.5195000000858272, + 1.5587000002597051, + 1.6067999999904714, + 1.7256000000998029, + 1.583299999765586, + 1.5451000003849913, + 1.6005000002223824, + 1.5285999998013722, + 1.6543000001547625, + 1.6484000002492394, + 1.6943000000537722, + 1.6751999996813538, + 1.7049999996743281, + 1.6619000002719986, + 1.6163000000233296, + 1.64889999996376, + 1.7573000000083994, + 1.7327999998997257, + 1.771900000221649, + 1.950099999703525, + 1.6390000000683358, + 1.6816000002108922, + 1.6533999996681814, + 1.7229999998562562, + 1.657599999816739, + 1.6528999999536609, + 1.5946999997140665, + 1.5347000003202993, + 1.6024999999899592, + 1.6453999996883795, + 1.6734000000724336, + 1.6077999998742598, + 1.6657999999551976, + 1.6630000000077416, + 1.6123999998853833, + 1.6076000001703505 + ], + "deterministic": true, + "fiducial_log_likelihood": 7.743201200876812, + "stream_log_likelihood": [ + 7.743201200876812, + -4.1609527513907665, + 7.657972665309639, + 9.36455094905725, + 7.051561357429164, + 9.219327498422563, + 0.8907045816755463, + -34.37790701671691, + -24.578291065194456, + -0.4990240338966814, + 0.702590691739907, + 7.669569297550711, + -0.4639011650528264, + -5.412376751794213, + 5.343244353416, + -20.481275097418568 + ], + "admissible": true, + "completeness_prior": { + "n_draws": 200, + "multiplicity_agreement": 1.0, + "raw_count_agreement": 1.0, + "n_multiplicity_mismatch": 0, + "mismatch_examples": [], + "max_position_error": 0.0008513474499103632, + "p99_position_error": 0.0007893460711577849, + "median_position_error": 0.00040657539052049436, + "ref_distinct_histogram": { + "2": 21, + "4": 179 + }, + "abs_delta_logl_vs_reference": { + "max": 0.8682473458375171, + "p99": 0.5684387609120645, + "median": 0.030920850414809298, + "n_nonfinite_mismatch": 0 + }, + "abs_delta_logl_vs_control": { + "max": 0.0, + "p99": 0.0, + "median": 0.0, + "n_nonfinite_mismatch": 0 + } + }, + "completeness_stress": { + "n_draws": 200, + "multiplicity_agreement": 1.0, + "raw_count_agreement": 1.0, + "n_multiplicity_mismatch": 0, + "mismatch_examples": [], + "max_position_error": 0.0007893460711579142, + "p99_position_error": 0.0007893460711576755, + "median_position_error": 0.0004065753905207063, + "ref_distinct_histogram": { + "2": 163, + "4": 37 + } + } + } + }, + "vmap": { + "best": "step0_components", + "routes": [ + "control", + "step0_gather", + "step0_nopad", + "step0_components", + "step0_structured" + ], + "batches": [ + 1, + 4, + 16 + ], + "rows": { + "control_vmap1": { + "config": "control", + "batch": 1, + "stats_per_batch": { + "n": 400, + "median_ms": 1.8210499999895546, + "p10_ms": 1.6839799998251692, + "p90_ms": 2.109640000071522, + "min_ms": 1.603000000159227, + "max_ms": 3.166899999996531, + "mean_ms": 1.8732737500056373 + }, + "median_ms_per_likelihood": 1.8210499999895546, + "compile": { + "lower_s": 3.959113299999899, + "compile_s": 4.35098489999973, + "first_call_s": 0.0028359999996609986, + "traced_rows_per_step": [ + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720, + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720 + ], + "output_shapes": [ + [ + 1 + ] + ], + "flops": 2813353.0, + "memory_analysis": { + "argument_size_in_bytes": 40, + "output_size_in_bytes": 8, + "temp_size_in_bytes": 901720, + "alias_size_in_bytes": 0, + "generated_code_size_in_bytes": 0, + "host_temp_size_in_bytes": 0 + }, + "rss_delta_bytes": 2162688, + "max_containing_size_proof": null + }, + "values_first_batch": [ + 7.743201200876812 + ], + "max_abs_delta_vs_scalar": 0.0 + }, + "control_vmap4": { + "config": "control", + "batch": 4, + "stats_per_batch": { + "n": 400, + "median_ms": 4.099949999954333, + "p10_ms": 3.8994300000013027, + "p90_ms": 4.86259000008431, + "min_ms": 3.7290000000211876, + "max_ms": 8.055199999944307, + "mean_ms": 4.251975750005386 + }, + "median_ms_per_likelihood": 1.0249874999885833, + "compile": { + "lower_s": 4.227951299999859, + "compile_s": 4.498397300000306, + "first_call_s": 0.0056098000000019965, + "traced_rows_per_step": [ + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720, + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720 + ], + "output_shapes": [ + [ + 4 + ] + ], + "flops": 10339222.0, + "memory_analysis": { + "argument_size_in_bytes": 160, + "output_size_in_bytes": 32, + "temp_size_in_bytes": 3200344, + "alias_size_in_bytes": 0, + "generated_code_size_in_bytes": 0, + "host_temp_size_in_bytes": 0 + }, + "rss_delta_bytes": 1859584, + "max_containing_size_proof": null + }, + "values_first_batch": [ + 7.743201200876812, + -4.1609527513907665, + 7.657972665309639, + 9.36455094905725 + ], + "max_abs_delta_vs_scalar": 0.0 + }, + "control_vmap16": { + "config": "control", + "batch": 16, + "stats_per_batch": { + "n": 400, + "median_ms": 12.509050000062416, + "p10_ms": 11.91514999991341, + "p90_ms": 14.27112000019406, + "min_ms": 11.500900000100955, + "max_ms": 45.21270000032018, + "mean_ms": 13.32520800000907 + }, + "median_ms_per_likelihood": 0.781815625003901, + "compile": { + "lower_s": 3.6904914000001554, + "compile_s": 4.744496000000254, + "first_call_s": 0.015247100000124192, + "traced_rows_per_step": [ + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720, + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720 + ], + "output_shapes": [ + [ + 16 + ] + ], + "flops": 40452632.0, + "memory_analysis": { + "argument_size_in_bytes": 640, + "output_size_in_bytes": 128, + "temp_size_in_bytes": 12396824, + "alias_size_in_bytes": 0, + "generated_code_size_in_bytes": 0, + "host_temp_size_in_bytes": 0 + }, + "rss_delta_bytes": 13971456, + "max_containing_size_proof": null + }, + "values_first_batch": [ + 7.743201200876812, + -4.1609527513907665, + 7.657972665309639, + 9.36455094905725, + 7.051561357429164, + 9.219327498422563, + 0.8907045816755463, + -34.37790701671691, + -24.578291065194456, + -0.4990240338966814, + 0.702590691739907, + 7.669569297550711, + -0.4639011650528264, + -5.412376751794213, + 5.343244353416, + -20.481275097418568 + ], + "max_abs_delta_vs_scalar": 0.0 + }, + "step0_gather_vmap1": { + "config": "step0_gather", + "batch": 1, + "stats_per_batch": { + "n": 400, + "median_ms": 2.41369999980634, + "p10_ms": 2.291129999957775, + "p90_ms": 2.8907999998409655, + "min_ms": 2.163799999834737, + "max_ms": 5.1782999998977175, + "mean_ms": 2.5773157500032084 + }, + "median_ms_per_likelihood": 2.41369999980634, + "compile": { + "lower_s": 3.814376799999991, + "compile_s": 3.9242475000000923, + "first_call_s": 0.0028922999999849708, + "traced_rows_per_step": [ + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720, + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720 + ], + "output_shapes": [ + [ + 1 + ] + ], + "flops": 3395426.0, + "memory_analysis": { + "argument_size_in_bytes": 40, + "output_size_in_bytes": 8, + "temp_size_in_bytes": 1692184, + "alias_size_in_bytes": 0, + "generated_code_size_in_bytes": 0, + "host_temp_size_in_bytes": 0 + }, + "rss_delta_bytes": 32096256, + "max_containing_size_proof": null + }, + "values_first_batch": [ + 7.743201200876812 + ], + "speedup_vs_control_same_batch": { + "ratio": 0.754464100814378, + "ci90_low": 0.747729414063601, + "ci90_high": 0.7603227059524384, + "bootstrap_samples": 2000 + }, + "max_abs_delta_vs_scalar": 0.0 + }, + "step0_gather_vmap4": { + "config": "step0_gather", + "batch": 4, + "stats_per_batch": { + "n": 400, + "median_ms": 6.688250000024709, + "p10_ms": 6.398300000000745, + "p90_ms": 7.956209999656494, + "min_ms": 6.1811000000489, + "max_ms": 13.616100000035658, + "mean_ms": 7.0869129999948655 + }, + "median_ms_per_likelihood": 1.6720625000061773, + "compile": { + "lower_s": 3.4136656999999104, + "compile_s": 4.269349199999851, + "first_call_s": 0.007538800000020274, + "traced_rows_per_step": [ + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720, + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720 + ], + "output_shapes": [ + [ + 4 + ] + ], + "flops": 11829332.0, + "memory_analysis": { + "argument_size_in_bytes": 160, + "output_size_in_bytes": 32, + "temp_size_in_bytes": 6763032, + "alias_size_in_bytes": 0, + "generated_code_size_in_bytes": 0, + "host_temp_size_in_bytes": 0 + }, + "rss_delta_bytes": 37920768, + "max_containing_size_proof": null + }, + "values_first_batch": [ + 7.743201200876812, + -4.1609527513907665, + 7.657972665309639, + 9.36455094905725 + ], + "speedup_vs_control_same_batch": { + "ratio": 0.6130078869568552, + "ci90_low": 0.6092011445630574, + "ci90_high": 0.6177930437104073, + "bootstrap_samples": 2000 + }, + "max_abs_delta_vs_scalar": 0.0 + }, + "step0_gather_vmap16": { + "config": "step0_gather", + "batch": 16, + "stats_per_batch": { + "n": 400, + "median_ms": 24.00995000016337, + "p10_ms": 22.903530000303363, + "p90_ms": 30.240289999937893, + "min_ms": 22.1996999998737, + "max_ms": 54.59350000000995, + "mean_ms": 25.71583125000302 + }, + "median_ms_per_likelihood": 1.5006218750102107, + "compile": { + "lower_s": 3.568205200000193, + "compile_s": 4.660480399999869, + "first_call_s": 0.02767180000000735, + "traced_rows_per_step": [ + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720, + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720 + ], + "output_shapes": [ + [ + 16 + ] + ], + "flops": 45574880.0, + "memory_analysis": { + "argument_size_in_bytes": 640, + "output_size_in_bytes": 128, + "temp_size_in_bytes": 27047448, + "alias_size_in_bytes": 0, + "generated_code_size_in_bytes": 0, + "host_temp_size_in_bytes": 0 + }, + "rss_delta_bytes": 37695488, + "max_containing_size_proof": null + }, + "values_first_batch": [ + 7.743201200876812, + -4.1609527513907665, + 7.657972665309639, + 9.36455094905725, + 7.051561357429164, + 9.219327498422563, + 0.8907045816755463, + -34.37790701671691, + -24.578291065194456, + -0.4990240338966814, + 0.702590691739907, + 7.669569297550711, + -0.4639011650528264, + -5.412376751794213, + 5.343244353416, + -20.481275097418568 + ], + "speedup_vs_control_same_batch": { + "ratio": 0.5209944210619889, + "ci90_low": 0.5174219345057998, + "ci90_high": 0.5242746071465546, + "bootstrap_samples": 2000 + }, + "max_abs_delta_vs_scalar": 0.0 + }, + "step0_nopad_vmap1": { + "config": "step0_nopad", + "batch": 1, + "stats_per_batch": { + "n": 400, + "median_ms": 2.4482999999690946, + "p10_ms": 2.2733899998002016, + "p90_ms": 2.822719999949186, + "min_ms": 2.1062000000711123, + "max_ms": 5.513800000244373, + "mean_ms": 2.5611862499931703 + }, + "median_ms_per_likelihood": 2.4482999999690946, + "compile": { + "lower_s": 3.431691999999657, + "compile_s": 3.9559767999999167, + "first_call_s": 0.002943699999832461, + "traced_rows_per_step": [ + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720, + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720 + ], + "output_shapes": [ + [ + 1 + ] + ], + "flops": 3185879.0, + "memory_analysis": { + "argument_size_in_bytes": 40, + "output_size_in_bytes": 8, + "temp_size_in_bytes": 1692184, + "alias_size_in_bytes": 0, + "generated_code_size_in_bytes": 0, + "host_temp_size_in_bytes": 0 + }, + "rss_delta_bytes": 34414592, + "max_containing_size_proof": null + }, + "values_first_batch": [ + 7.743201200876812 + ], + "speedup_vs_control_same_batch": { + "ratio": 0.7438018216773035, + "ci90_low": 0.7368495090576406, + "ci90_high": 0.7512094251698754, + "bootstrap_samples": 2000 + }, + "max_abs_delta_vs_scalar": 0.0 + }, + "step0_nopad_vmap4": { + "config": "step0_nopad", + "batch": 4, + "stats_per_batch": { + "n": 400, + "median_ms": 6.742399999893678, + "p10_ms": 6.350389999988693, + "p90_ms": 7.57320000029722, + "min_ms": 6.022800000209827, + "max_ms": 11.261900000135938, + "mean_ms": 6.899136500005625 + }, + "median_ms_per_likelihood": 1.6855999999734195, + "compile": { + "lower_s": 3.4046909999997297, + "compile_s": 4.824248500000067, + "first_call_s": 0.00871789999973771, + "traced_rows_per_step": [ + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720, + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720 + ], + "output_shapes": [ + [ + 4 + ] + ], + "flops": 11619785.0, + "memory_analysis": { + "argument_size_in_bytes": 160, + "output_size_in_bytes": 32, + "temp_size_in_bytes": 6763032, + "alias_size_in_bytes": 0, + "generated_code_size_in_bytes": 0, + "host_temp_size_in_bytes": 0 + }, + "rss_delta_bytes": 40685568, + "max_containing_size_proof": null + }, + "values_first_batch": [ + 7.743201200876812, + -4.1609527513907665, + 7.657972665309639, + 9.36455094905725 + ], + "speedup_vs_control_same_batch": { + "ratio": 0.6080846582847333, + "ci90_low": 0.6033949130174732, + "ci90_high": 0.6130739114885783, + "bootstrap_samples": 2000 + }, + "max_abs_delta_vs_scalar": 0.0 + }, + "step0_nopad_vmap16": { + "config": "step0_nopad", + "batch": 16, + "stats_per_batch": { + "n": 400, + "median_ms": 23.9974500000244, + "p10_ms": 22.67705000017486, + "p90_ms": 28.985770000008415, + "min_ms": 21.776800000225194, + "max_ms": 62.582200000179, + "mean_ms": 25.177011249992347 + }, + "median_ms_per_likelihood": 1.499840625001525, + "compile": { + "lower_s": 3.476272699999754, + "compile_s": 4.710011300000133, + "first_call_s": 0.02720099999987724, + "traced_rows_per_step": [ + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720, + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720 + ], + "output_shapes": [ + [ + 16 + ] + ], + "flops": 45365328.0, + "memory_analysis": { + "argument_size_in_bytes": 640, + "output_size_in_bytes": 128, + "temp_size_in_bytes": 27047448, + "alias_size_in_bytes": 0, + "generated_code_size_in_bytes": 0, + "host_temp_size_in_bytes": 0 + }, + "rss_delta_bytes": 37502976, + "max_containing_size_proof": null + }, + "values_first_batch": [ + 7.743201200876812, + -4.1609527513907665, + 7.657972665309639, + 9.36455094905725, + 7.051561357429164, + 9.219327498422563, + 0.8907045816755463, + -34.37790701671691, + -24.578291065194456, + -0.4990240338966814, + 0.702590691739907, + 7.669569297550711, + -0.4639011650528264, + -5.412376751794213, + 5.343244353416, + -20.481275097418568 + ], + "speedup_vs_control_same_batch": { + "ratio": 0.5212658011601107, + "ci90_low": 0.5181579180910487, + "ci90_high": 0.5251259475817565, + "bootstrap_samples": 2000 + }, + "max_abs_delta_vs_scalar": 0.0 + }, + "step0_components_vmap1": { + "config": "step0_components", + "batch": 1, + "stats_per_batch": { + "n": 400, + "median_ms": 1.7880000000332075, + "p10_ms": 1.5960399997766217, + "p90_ms": 2.077229999940755, + "min_ms": 1.45169999996142, + "max_ms": 5.426000000170461, + "mean_ms": 1.8940795000014532 + }, + "median_ms_per_likelihood": 1.7880000000332075, + "compile": { + "lower_s": 3.5325733999998192, + "compile_s": 4.061815699999897, + "first_call_s": 0.002672199999778968, + "traced_rows_per_step": [ + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720, + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720 + ], + "output_shapes": [ + [ + 1 + ] + ], + "flops": 3590390.0, + "memory_analysis": { + "argument_size_in_bytes": 40, + "output_size_in_bytes": 8, + "temp_size_in_bytes": 1506328, + "alias_size_in_bytes": 0, + "generated_code_size_in_bytes": 0, + "host_temp_size_in_bytes": 0 + }, + "rss_delta_bytes": 36700160, + "max_containing_size_proof": null + }, + "values_first_batch": [ + 7.743201200876812 + ], + "speedup_vs_control_same_batch": { + "ratio": 1.018484340019985, + "ci90_low": 1.006270626504205, + "ci90_high": 1.0294113818117003, + "bootstrap_samples": 2000 + }, + "max_abs_delta_vs_scalar": 0.0 + }, + "step0_components_vmap4": { + "config": "step0_components", + "batch": 4, + "stats_per_batch": { + "n": 400, + "median_ms": 4.723099999864644, + "p10_ms": 4.360090000045602, + "p90_ms": 5.576799999971627, + "min_ms": 4.095300000244606, + "max_ms": 11.587699999836332, + "mean_ms": 5.0109570000074655 + }, + "median_ms_per_likelihood": 1.180774999966161, + "compile": { + "lower_s": 3.5619708999997783, + "compile_s": 4.719133000000056, + "first_call_s": 0.005295699999805947, + "traced_rows_per_step": [ + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720, + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720 + ], + "output_shapes": [ + [ + 4 + ] + ], + "flops": 13447376.0, + "memory_analysis": { + "argument_size_in_bytes": 160, + "output_size_in_bytes": 32, + "temp_size_in_bytes": 6777112, + "alias_size_in_bytes": 0, + "generated_code_size_in_bytes": 0, + "host_temp_size_in_bytes": 0 + }, + "rss_delta_bytes": 37777408, + "max_containing_size_proof": null + }, + "values_first_batch": [ + 7.743201200876812, + -4.1609527513907665, + 7.657972665309639, + 9.36455094905725 + ], + "speedup_vs_control_same_batch": { + "ratio": 0.8680633482398914, + "ci90_low": 0.8632756947522906, + "ci90_high": 0.8769551691278973, + "bootstrap_samples": 2000 + }, + "max_abs_delta_vs_scalar": 0.0 + }, + "step0_components_vmap16": { + "config": "step0_components", + "batch": 16, + "stats_per_batch": { + "n": 400, + "median_ms": 16.013749999956417, + "p10_ms": 15.0927900001534, + "p90_ms": 17.716930000142384, + "min_ms": 14.20670000015889, + "max_ms": 48.531399999774294, + "mean_ms": 16.608099249997395 + }, + "median_ms_per_likelihood": 1.000859374997276, + "compile": { + "lower_s": 3.4487746999998308, + "compile_s": 4.67463190000035, + "first_call_s": 0.017275200000312907, + "traced_rows_per_step": [ + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720, + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720 + ], + "output_shapes": [ + [ + 16 + ] + ], + "flops": 52885240.0, + "memory_analysis": { + "argument_size_in_bytes": 640, + "output_size_in_bytes": 128, + "temp_size_in_bytes": 27103128, + "alias_size_in_bytes": 0, + "generated_code_size_in_bytes": 0, + "host_temp_size_in_bytes": 0 + }, + "rss_delta_bytes": 36622336, + "max_containing_size_proof": null + }, + "values_first_batch": [ + 7.743201200876812, + -4.1609527513907665, + 7.657972665309639, + 9.36455094905725, + 7.051561357429164, + 9.219327498422563, + 0.8907045816755463, + -34.37790701671691, + -24.578291065194456, + -0.4990240338966814, + 0.702590691739907, + 7.669569297550711, + -0.4639011650528264, + -5.412376751794213, + 5.343244353416, + -20.481275097418568 + ], + "speedup_vs_control_same_batch": { + "ratio": 0.78114432909821, + "ci90_low": 0.7748089092464076, + "ci90_high": 0.7873557720572114, + "bootstrap_samples": 2000 + }, + "max_abs_delta_vs_scalar": 0.0 + }, + "step0_structured_vmap1": { + "config": "step0_structured", + "batch": 1, + "stats_per_batch": { + "n": 400, + "median_ms": 1.864049999994677, + "p10_ms": 1.7074200000479323, + "p90_ms": 2.8370599999561823, + "min_ms": 1.6095999999379274, + "max_ms": 7.8016000002207875, + "mean_ms": 2.110763750007436 + }, + "median_ms_per_likelihood": 1.864049999994677, + "compile": { + "lower_s": 3.4049659000002066, + "compile_s": 4.014056299999993, + "first_call_s": 0.002459499999986292, + "traced_rows_per_step": [ + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720, + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720 + ], + "output_shapes": [ + [ + 1 + ] + ], + "flops": 2813353.0, + "memory_analysis": { + "argument_size_in_bytes": 40, + "output_size_in_bytes": 8, + "temp_size_in_bytes": 901720, + "alias_size_in_bytes": 0, + "generated_code_size_in_bytes": 0, + "host_temp_size_in_bytes": 0 + }, + "rss_delta_bytes": 39325696, + "max_containing_size_proof": null + }, + "values_first_batch": [ + 7.743201200876812 + ], + "speedup_vs_control_same_batch": { + "ratio": 0.9769319492474745, + "ci90_low": 0.9646268430651849, + "ci90_high": 0.9884193230456836, + "bootstrap_samples": 2000 + }, + "max_abs_delta_vs_scalar": 0.0 + }, + "step0_structured_vmap4": { + "config": "step0_structured", + "batch": 4, + "stats_per_batch": { + "n": 400, + "median_ms": 4.203049999887298, + "p10_ms": 3.8933100000576815, + "p90_ms": 5.51123999994161, + "min_ms": 3.690200000164623, + "max_ms": 8.208799999920302, + "mean_ms": 4.48269625000421 + }, + "median_ms_per_likelihood": 1.0507624999718246, + "compile": { + "lower_s": 3.603877900000043, + "compile_s": 4.44666559999996, + "first_call_s": 0.00520360000018627, + "traced_rows_per_step": [ + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720, + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720 + ], + "output_shapes": [ + [ + 4 + ] + ], + "flops": 10339222.0, + "memory_analysis": { + "argument_size_in_bytes": 160, + "output_size_in_bytes": 32, + "temp_size_in_bytes": 3200344, + "alias_size_in_bytes": 0, + "generated_code_size_in_bytes": 0, + "host_temp_size_in_bytes": 0 + }, + "rss_delta_bytes": 36081664, + "max_containing_size_proof": null + }, + "values_first_batch": [ + 7.743201200876812, + -4.1609527513907665, + 7.657972665309639, + 9.36455094905725 + ], + "speedup_vs_control_same_batch": { + "ratio": 0.9754701942789809, + "ci90_low": 0.9687252553227009, + "ci90_high": 0.9843631946642564, + "bootstrap_samples": 2000 + }, + "max_abs_delta_vs_scalar": 0.0 + }, + "step0_structured_vmap16": { + "config": "step0_structured", + "batch": 16, + "stats_per_batch": { + "n": 400, + "median_ms": 12.545050000198898, + "p10_ms": 11.950090000073033, + "p90_ms": 15.324890000101732, + "min_ms": 11.353900000358408, + "max_ms": 24.37480000025971, + "mean_ms": 13.168549750009788 + }, + "median_ms_per_likelihood": 0.7840656250124312, + "compile": { + "lower_s": 4.123745400000189, + "compile_s": 4.569978100000299, + "first_call_s": 0.012225599999965198, + "traced_rows_per_step": [ + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720, + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720 + ], + "output_shapes": [ + [ + 16 + ] + ], + "flops": 40452632.0, + "memory_analysis": { + "argument_size_in_bytes": 640, + "output_size_in_bytes": 128, + "temp_size_in_bytes": 12396824, + "alias_size_in_bytes": 0, + "generated_code_size_in_bytes": 0, + "host_temp_size_in_bytes": 0 + }, + "rss_delta_bytes": 40210432, + "max_containing_size_proof": null + }, + "values_first_batch": [ + 7.743201200876812, + -4.1609527513907665, + 7.657972665309639, + 9.36455094905725, + 7.051561357429164, + 9.219327498422563, + 0.8907045816755463, + -34.37790701671691, + -24.578291065194456, + -0.4990240338966814, + 0.702590691739907, + 7.669569297550711, + -0.4639011650528264, + -5.412376751794213, + 5.343244353416, + -20.481275097418568 + ], + "speedup_vs_control_same_batch": { + "ratio": 0.9971303422357096, + "ci90_low": 0.991929141684525, + "ci90_high": 1.000884115340274, + "bootstrap_samples": 2000 + }, + "max_abs_delta_vs_scalar": 0.0 + } + } + }, + "step0_split": { + "control": { + "extent": null, + "scale": 0.2, + "step0_rows": 11859, + "step0_triangles": 23283, + "prefix_median_ms": { + "source_centre": 0.25949999985641625, + "ray_trace": 0.550799999928131, + "ray_trace_materialised": 1.318000000082975, + "containment": 1.119549999884839 + }, + "ray_trace_ms": 0.29130000007171475, + "containment_ms": 0.568749999956708, + "triangle_materialisation_ms": 0.767200000154844, + "step0_route": "library default (structured)", + "method": "prefix medians; ray_trace = jnp.sum(plane.vertices) minus source_centre; containment = containing_indices minus ray_trace (includes the vertices[indices] gather + Point.mask + jnp.where); ray_trace_materialised = image_plane.py's prefix", + "step0_ms": 0.8600500000284228, + "containment_share_of_step0": 0.6612987616277102, + "step0_share_of_likelihood": 0.5271852396311967, + "containment_share_of_likelihood": 0.34862694611651796 + }, + "step0_gather": { + "extent": null, + "scale": 0.2, + "step0_rows": 11859, + "step0_triangles": 23283, + "prefix_median_ms": { + "source_centre": 0.23589999977957632, + "ray_trace": 0.5472999998801242, + "ray_trace_materialised": 1.3076999998702377, + "containment": 1.7861500000435626 + }, + "ray_trace_ms": 0.3114000001005479, + "containment_ms": 1.2388500001634384, + "triangle_materialisation_ms": 0.7603999999901134, + "step0_route": "gather", + "method": "prefix medians; ray_trace = jnp.sum(plane.vertices) minus source_centre; containment = containing_indices minus ray_trace (includes the vertices[indices] gather + Point.mask + jnp.where); ray_trace_materialised = image_plane.py's prefix", + "step0_ms": 1.5502500002639863, + "containment_share_of_step0": 0.7991291726834248, + "step0_share_of_likelihood": 0.6979335495133081, + "containment_share_of_likelihood": 0.557739060010576 + }, + "step0_nopad": { + "extent": null, + "scale": 0.2, + "step0_rows": 11859, + "step0_triangles": 23283, + "prefix_median_ms": { + "source_centre": 0.2503499999875203, + "ray_trace": 0.5529500001557608, + "ray_trace_materialised": 1.3191000000460917, + "containment": 1.7641500000991073 + }, + "ray_trace_ms": 0.3026000001682405, + "containment_ms": 1.2111999999433465, + "triangle_materialisation_ms": 0.766149999890331, + "step0_route": "nopad", + "method": "prefix medians; ray_trace = jnp.sum(plane.vertices) minus source_centre; containment = containing_indices minus ray_trace (includes the vertices[indices] gather + Point.mask + jnp.where); ray_trace_materialised = image_plane.py's prefix", + "step0_ms": 1.513800000111587, + "containment_share_of_step0": 0.8001056941828941, + "step0_share_of_likelihood": 0.6730393029655897, + "containment_share_of_likelihood": 0.5385025787116543 + }, + "step0_components": { + "extent": null, + "scale": 0.2, + "step0_rows": 11859, + "step0_triangles": 23283, + "prefix_median_ms": { + "source_centre": 0.25655000013102836, + "ray_trace": 0.5496499998116633, + "ray_trace_materialised": 1.3075000001663284, + "containment": 1.0304000002179237 + }, + "ray_trace_ms": 0.29309999968063494, + "containment_ms": 0.48075000040626037, + "triangle_materialisation_ms": 0.7578500003546651, + "step0_route": "components", + "method": "prefix medians; ray_trace = jnp.sum(plane.vertices) minus source_centre; containment = containing_indices minus ray_trace (includes the vertices[indices] gather + Point.mask + jnp.where); ray_trace_materialised = image_plane.py's prefix", + "step0_ms": 0.7738500000868953, + "containment_share_of_step0": 0.6212444276698031, + "step0_share_of_likelihood": 0.4975407465149675, + "containment_share_of_likelihood": 0.3090944163110976 + }, + "step0_structured": { + "extent": null, + "scale": 0.2, + "step0_rows": 11859, + "step0_triangles": 23283, + "prefix_median_ms": { + "source_centre": 0.22819999981038563, + "ray_trace": 0.5520499998965533, + "ray_trace_materialised": 1.319599999987986, + "containment": 1.15195000012136 + }, + "ray_trace_ms": 0.3238500000861677, + "containment_ms": 0.5999000002248067, + "triangle_materialisation_ms": 0.7675500000914326, + "step0_route": "structured", + "method": "prefix medians; ray_trace = jnp.sum(plane.vertices) minus source_centre; containment = containing_indices minus ray_trace (includes the vertices[indices] gather + Point.mask + jnp.where); ray_trace_materialised = image_plane.py's prefix", + "step0_ms": 0.9237500003109744, + "containment_share_of_step0": 0.6494181326363782, + "step0_share_of_likelihood": 0.5725841445226397, + "containment_share_of_likelihood": 0.3718465259130907 + } + }, + "uncapped_containing_counts": { + "control": { + "n_draws": 200, + "max_per_step": [ + 17, + 13, + 11, + 9, + 7, + 5, + 5, + 5 + ], + "p99_per_step": [ + 15.0, + 11.019999999999982, + 9.019999999999982, + 7.019999999999982, + 5.019999999999982, + 5.0, + 5.0, + 5.0 + ], + "median_per_step": [ + 9.0, + 5.0, + 5.0, + 5.0, + 5.0, + 5.0, + 5.0, + 5.0 + ], + "max_over_steps": 17, + "draws_exceeding_cap": [ + 12 + ], + "n_draws_exceeding": { + "6": 185, + "8": 117, + "10": 51, + "12": 23, + "15": 1 + }, + "histogram_max_over_steps": { + "3": 3, + "5": 12, + "7": 68, + "9": 66, + "11": 28, + "13": 16, + "15": 6, + "17": 1 + } + }, + "step0_components": { + "n_draws": 200, + "max_per_step": [ + 17, + 13, + 11, + 9, + 7, + 5, + 5, + 5 + ], + "p99_per_step": [ + 15.0, + 11.019999999999982, + 9.019999999999982, + 7.019999999999982, + 5.019999999999982, + 5.0, + 5.0, + 5.0 + ], + "median_per_step": [ + 9.0, + 5.0, + 5.0, + 5.0, + 5.0, + 5.0, + 5.0, + 5.0 + ], + "max_over_steps": 17, + "draws_exceeding_cap": [ + 12 + ], + "n_draws_exceeding": { + "6": 185, + "8": 117, + "10": 51, + "12": 23, + "15": 1 + }, + "histogram_max_over_steps": { + "3": 3, + "5": 12, + "7": 68, + "9": 66, + "11": 28, + "13": 16, + "15": 6, + "17": 1 + } + } + }, + "gates": { + "fiducial_bit_exact": { + "value": 7.743201200876812, + "expected": 7.743201200876812, + "repr": "7.743201200876812", + "pass": true + }, + "max_containing_size_patch": { + "control": { + "positions_shape": [ + 15, + 2 + ], + "expected_rows": 15, + "pass": true + }, + "step0_gather": { + "positions_shape": [ + 15, + 2 + ], + "expected_rows": 15, + "pass": true + }, + "step0_nopad": { + "positions_shape": [ + 15, + 2 + ], + "expected_rows": 15, + "pass": true + }, + "step0_components": { + "positions_shape": [ + 15, + 2 + ], + "expected_rows": 15, + "pass": true + }, + "step0_structured": { + "positions_shape": [ + 15, + 2 + ], + "expected_rows": 15, + "pass": true + } + }, + "patch_restored": { + "module_constant": 15, + "init_default": [ + 15, + null + ], + "step0_containment": "structured", + "pass": true + }, + "grad": { + "control": { + "compile_s": 5.648861500000294, + "all_finite": true, + "non_zero_per_instance": [ + true, + true, + true + ], + "gradients": [ + [ + -41.62226304412241, + 53.13429595959836, + 31.78649237783334, + 2.804131922250644, + 1781.7386158499905 + ], + [ + 249.25847095708434, + 214.72130119062592, + 374.3919459816191, + 813.0025446226265, + 3314.449436325265 + ], + [ + -30.04618316624788, + 41.85589438434542, + 53.1291530813268, + -17.18919451496142, + 1304.418583766583 + ] + ], + "pass": true, + "max_rel_delta_vs_control": 0.0 + }, + "step0_gather": { + "compile_s": 5.618470399999751, + "all_finite": true, + "non_zero_per_instance": [ + true, + true, + true + ], + "gradients": [ + [ + -41.62226304412241, + 53.13429595959836, + 31.78649237783334, + 2.804131922250644, + 1781.7386158499905 + ], + [ + 249.25847095708434, + 214.72130119062592, + 374.3919459816191, + 813.0025446226265, + 3314.449436325265 + ], + [ + -30.04618316624788, + 41.85589438434542, + 53.1291530813268, + -17.18919451496142, + 1304.418583766583 + ] + ], + "pass": true, + "max_rel_delta_vs_control": 0.0 + }, + "step0_nopad": { + "compile_s": 5.868889200000012, + "all_finite": true, + "non_zero_per_instance": [ + true, + true, + true + ], + "gradients": [ + [ + -41.62226304412241, + 53.13429595959836, + 31.78649237783334, + 2.804131922250644, + 1781.7386158499905 + ], + [ + 249.25847095708434, + 214.72130119062592, + 374.3919459816191, + 813.0025446226265, + 3314.449436325265 + ], + [ + -30.04618316624788, + 41.85589438434542, + 53.1291530813268, + -17.18919451496142, + 1304.418583766583 + ] + ], + "pass": true, + "max_rel_delta_vs_control": 0.0 + }, + "step0_components": { + "compile_s": 6.105015900000126, + "all_finite": true, + "non_zero_per_instance": [ + true, + true, + true + ], + "gradients": [ + [ + -41.62226304412241, + 53.13429595959836, + 31.78649237783334, + 2.804131922250644, + 1781.7386158499905 + ], + [ + 249.25847095708434, + 214.72130119062592, + 374.3919459816191, + 813.0025446226265, + 3314.449436325265 + ], + [ + -30.04618316624788, + 41.85589438434542, + 53.1291530813268, + -17.18919451496142, + 1304.418583766583 + ] + ], + "pass": true, + "max_rel_delta_vs_control": 0.0 + }, + "step0_structured": { + "compile_s": 5.95346040000004, + "all_finite": true, + "non_zero_per_instance": [ + true, + true, + true + ], + "gradients": [ + [ + -41.62226304412241, + 53.13429595959836, + 31.78649237783334, + 2.804131922250644, + 1781.7386158499905 + ], + [ + 249.25847095708434, + 214.72130119062592, + 374.3919459816191, + 813.0025446226265, + 3314.449436325265 + ], + [ + -30.04618316624788, + 41.85589438434542, + 53.1291530813268, + -17.18919451496142, + 1304.418583766583 + ] + ], + "pass": true, + "max_rel_delta_vs_control": 0.0 + } + }, + "step0_route_bit_identity": { + "step0_gather": { + "checks": { + "stream_log_likelihood": true, + "fiducial_log_likelihood": true, + "prior_log_likelihood": true, + "prior_positions": true, + "stress_positions": true, + "image_counts": true, + "grad": true, + "vmap": true + }, + "pass": true, + "image_count_histogram": { + "prior": { + "2": 21, + "4": 179 + }, + "stress": { + "2": 163, + "4": 37 + } + } + }, + "step0_nopad": { + "checks": { + "stream_log_likelihood": true, + "fiducial_log_likelihood": true, + "prior_log_likelihood": true, + "prior_positions": true, + "stress_positions": true, + "image_counts": true, + "grad": true, + "vmap": true + }, + "pass": true, + "image_count_histogram": { + "prior": { + "2": 21, + "4": 179 + }, + "stress": { + "2": 163, + "4": 37 + } + } + }, + "step0_components": { + "checks": { + "stream_log_likelihood": true, + "fiducial_log_likelihood": true, + "prior_log_likelihood": true, + "prior_positions": true, + "stress_positions": true, + "image_counts": true, + "grad": true, + "vmap": true + }, + "pass": true, + "image_count_histogram": { + "prior": { + "2": 21, + "4": 179 + }, + "stress": { + "2": 163, + "4": 37 + } + } + }, + "step0_structured": { + "checks": { + "stream_log_likelihood": true, + "fiducial_log_likelihood": true, + "prior_log_likelihood": true, + "prior_positions": true, + "stress_positions": true, + "image_counts": true, + "grad": true, + "vmap": true + }, + "pass": true, + "image_count_histogram": { + "prior": { + "2": 21, + "4": 179 + }, + "stress": { + "2": 163, + "4": 37 + } + } + } + } + }, + "all_gates_pass": true, + "completeness_compile": { + "control_prior": { + "lower_s": 3.695778700000119, + "compile_s": 4.802585800000088, + "first_call_s": 0.0029301999998097017, + "traced_rows_per_step": [ + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720, + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720, + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720 + ], + "output_shapes": [ + [], + [ + 15, + 2 + ] + ], + "flops": 2801341.0, + "memory_analysis": { + "argument_size_in_bytes": 40, + "output_size_in_bytes": 264, + "temp_size_in_bytes": 901592, + "alias_size_in_bytes": 0, + "generated_code_size_in_bytes": 0, + "host_temp_size_in_bytes": 0 + }, + "rss_delta_bytes": 8843264, + "max_containing_size_proof": { + "positions_shape": [ + 15, + 2 + ], + "expected_rows": 15, + "pass": true + } + }, + "control_stress": { + "lower_s": 1.7866205999998783, + "compile_s": 1.5895182999997814, + "first_call_s": 0.002370600000176637, + "traced_rows_per_step": [ + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720 + ], + "output_shapes": [ + [ + 15, + 2 + ] + ], + "flops": 2746879.0, + "memory_analysis": { + "argument_size_in_bytes": 64, + "output_size_in_bytes": 240, + "temp_size_in_bytes": 901144, + "alias_size_in_bytes": 0, + "generated_code_size_in_bytes": 0, + "host_temp_size_in_bytes": 0 + }, + "rss_delta_bytes": 1400832, + "max_containing_size_proof": { + "positions_shape": [ + 15, + 2 + ], + "expected_rows": 15, + "pass": true + } + }, + "step0_gather_prior": { + "lower_s": 3.377621099999942, + "compile_s": 4.317162199999984, + "first_call_s": 0.0032763999997769133, + "traced_rows_per_step": [ + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720, + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720, + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720 + ], + "output_shapes": [ + [], + [ + 15, + 2 + ] + ], + "flops": 3383414.0, + "memory_analysis": { + "argument_size_in_bytes": 40, + "output_size_in_bytes": 264, + "temp_size_in_bytes": 1692120, + "alias_size_in_bytes": 0, + "generated_code_size_in_bytes": 0, + "host_temp_size_in_bytes": 0 + }, + "rss_delta_bytes": 4325376, + "max_containing_size_proof": { + "positions_shape": [ + 15, + 2 + ], + "expected_rows": 15, + "pass": true + } + }, + "step0_gather_stress": { + "lower_s": 1.0083435999999892, + "compile_s": 1.47187729999996, + "first_call_s": 0.0031084000002010725, + "traced_rows_per_step": [ + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720 + ], + "output_shapes": [ + [ + 15, + 2 + ] + ], + "flops": 3328952.0, + "memory_analysis": { + "argument_size_in_bytes": 64, + "output_size_in_bytes": 240, + "temp_size_in_bytes": 1692184, + "alias_size_in_bytes": 0, + "generated_code_size_in_bytes": 0, + "host_temp_size_in_bytes": 0 + }, + "rss_delta_bytes": 1351680, + "max_containing_size_proof": { + "positions_shape": [ + 15, + 2 + ], + "expected_rows": 15, + "pass": true + } + }, + "step0_nopad_prior": { + "lower_s": 3.448235100000147, + "compile_s": 4.380214700000124, + "first_call_s": 0.002937599999768281, + "traced_rows_per_step": [ + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720, + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720, + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720 + ], + "output_shapes": [ + [], + [ + 15, + 2 + ] + ], + "flops": 3173867.0, + "memory_analysis": { + "argument_size_in_bytes": 40, + "output_size_in_bytes": 264, + "temp_size_in_bytes": 1692120, + "alias_size_in_bytes": 0, + "generated_code_size_in_bytes": 0, + "host_temp_size_in_bytes": 0 + }, + "rss_delta_bytes": 4055040, + "max_containing_size_proof": { + "positions_shape": [ + 15, + 2 + ], + "expected_rows": 15, + "pass": true + } + }, + "step0_nopad_stress": { + "lower_s": 1.0918421999999737, + "compile_s": 1.475912899999912, + "first_call_s": 0.003976700000293931, + "traced_rows_per_step": [ + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720 + ], + "output_shapes": [ + [ + 15, + 2 + ] + ], + "flops": 3119405.0, + "memory_analysis": { + "argument_size_in_bytes": 64, + "output_size_in_bytes": 240, + "temp_size_in_bytes": 1692184, + "alias_size_in_bytes": 0, + "generated_code_size_in_bytes": 0, + "host_temp_size_in_bytes": 0 + }, + "rss_delta_bytes": 2162688, + "max_containing_size_proof": { + "positions_shape": [ + 15, + 2 + ], + "expected_rows": 15, + "pass": true + } + }, + "step0_components_prior": { + "lower_s": 4.340388999999959, + "compile_s": 4.5443592000001445, + "first_call_s": 0.002577000000201224, + "traced_rows_per_step": [ + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720, + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720, + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720 + ], + "output_shapes": [ + [], + [ + 15, + 2 + ] + ], + "flops": 3578378.0, + "memory_analysis": { + "argument_size_in_bytes": 40, + "output_size_in_bytes": 264, + "temp_size_in_bytes": 1506200, + "alias_size_in_bytes": 0, + "generated_code_size_in_bytes": 0, + "host_temp_size_in_bytes": 0 + }, + "rss_delta_bytes": 3514368, + "max_containing_size_proof": { + "positions_shape": [ + 15, + 2 + ], + "expected_rows": 15, + "pass": true + } + }, + "step0_components_stress": { + "lower_s": 1.0252224000000751, + "compile_s": 1.4664577999997164, + "first_call_s": 0.0024602000003142166, + "traced_rows_per_step": [ + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720 + ], + "output_shapes": [ + [ + 15, + 2 + ] + ], + "flops": 3523916.0, + "memory_analysis": { + "argument_size_in_bytes": 64, + "output_size_in_bytes": 240, + "temp_size_in_bytes": 1506072, + "alias_size_in_bytes": 0, + "generated_code_size_in_bytes": 0, + "host_temp_size_in_bytes": 0 + }, + "rss_delta_bytes": 4325376, + "max_containing_size_proof": { + "positions_shape": [ + 15, + 2 + ], + "expected_rows": 15, + "pass": true + } + }, + "step0_structured_prior": { + "lower_s": 3.7101361999998517, + "compile_s": 4.605778099999952, + "first_call_s": 0.002664300000105868, + "traced_rows_per_step": [ + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720, + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720, + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720 + ], + "output_shapes": [ + [], + [ + 15, + 2 + ] + ], + "flops": 2801341.0, + "memory_analysis": { + "argument_size_in_bytes": 40, + "output_size_in_bytes": 264, + "temp_size_in_bytes": 901592, + "alias_size_in_bytes": 0, + "generated_code_size_in_bytes": 0, + "host_temp_size_in_bytes": 0 + }, + "rss_delta_bytes": 5136384, + "max_containing_size_proof": { + "positions_shape": [ + 15, + 2 + ], + "expected_rows": 15, + "pass": true + } + }, + "step0_structured_stress": { + "lower_s": 1.0649515000000065, + "compile_s": 1.5464139999999134, + "first_call_s": 0.0023129000001063105, + "traced_rows_per_step": [ + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720 + ], + "output_shapes": [ + [ + 15, + 2 + ] + ], + "flops": 2746879.0, + "memory_analysis": { + "argument_size_in_bytes": 64, + "output_size_in_bytes": 240, + "temp_size_in_bytes": 901144, + "alias_size_in_bytes": 0, + "generated_code_size_in_bytes": 0, + "host_temp_size_in_bytes": 0 + }, + "rss_delta_bytes": 540672, + "max_containing_size_proof": { + "positions_shape": [ + 15, + 2 + ], + "expected_rows": 15, + "pass": true + } + } + }, + "progress": [ + "[ 3.8 s] configs: control(n=8,rows=11859), step0_gather(n=8,rows=11859), step0_nopad(n=8,rows=11859), step0_components(n=8,rows=11859), step0_structured(n=8,rows=11859), reference(n=9,rows=268677), reference_b(n=10,rows=115473)", + "[ 29.4 s] reference reference solved on 200 prior + 200 stress draws (compile 1.9 s)", + "[ 49.6 s] reference reference_b solved on 200 prior + 200 stress draws (compile 2.1 s)", + "[ 49.7 s] reference floor: {\"prior\": {\"n_draws\": 200, \"multiplicity_agreement\": 1.0, \"raw_count_agreement\": 1.0, \"n_multiplicity_mismatch\": 0, \"max_position_error\": 0.00015786921423151782, \"p99_position_error\": 0.0001280749711777913, \"median_position_error\": 5.9668954361473236e-05, \"ref_distinct_histogram\": {\"2\": 21, \"4\": 179}, \"abs_delta_logl_vs_reference\": {\"max\": 0.09204751533968647, \"p99\": 0.06845503627316121, \"median\": 0.004628222675307825, \"n_nonfinite_mismatch\": 0}}, \"stress\": {\"n_draws\": 200, \"multiplicity_agreement\": 1.0, \"raw_count_agreement\": 1.0, \"n_multiplicity_mismatch\": 0, \"max_position_error\": 0.00015786921423129578, \"p99_position_error\": 0.00014084184669768283, \"median_position_error\": 5.966895436132821e-05, \"ref_distinct_histogram\": {\"2\": 163, \"4\": 37}}}", + "[ 109.7 s] completeness control prior mult 1.000 raw 1.000 maxerr 0.0008513474499103632 |dlogL|ref 0.8682473458375171 stress mult 1.0 maxerr 0.0007893460711579142", + "[ 109.7 s] completeness step0_gather prior mult 1.000 raw 1.000 maxerr 0.0008513474499103632 |dlogL|ref 0.8682473458375171 stress mult 1.0 maxerr 0.0007893460711579142", + "[ 109.8 s] completeness step0_nopad prior mult 1.000 raw 1.000 maxerr 0.0008513474499103632 |dlogL|ref 0.8682473458375171 stress mult 1.0 maxerr 0.0007893460711579142", + "[ 109.8 s] completeness step0_components prior mult 1.000 raw 1.000 maxerr 0.0008513474499103632 |dlogL|ref 0.8682473458375171 stress mult 1.0 maxerr 0.0007893460711579142", + "[ 109.8 s] completeness step0_structured prior mult 1.000 raw 1.000 maxerr 0.0008513474499103632 |dlogL|ref 0.8682473458375171 stress mult 1.0 maxerr 0.0007893460711579142", + "[ 109.8 s] reference image extent: {'prior': {'max_abs_y': 1.77939453125, 'max_abs_x': 1.7773254429359933, 'max_abs_coord': 1.77939453125, 'p99_abs_coord': 1.7590830914129167, 'max_radius': 1.8116226317743076}, 'stress': {'max_abs_y': 2.2498046875, 'max_abs_x': 2.300267215077964, 'max_abs_coord': 2.300267215077964, 'p99_abs_coord': 2.2027852305644777, 'max_radius': 2.5191249773380773}}", + "[ 109.8 s] timing: compiling every route (fresh closure + clear_caches)", + "[ 144.5 s] timing: 20 rounds x 20 calls x 5 routes done", + "[ 145.4 s] fiducial gate: 7.743201200876812 == 7.743201200876812: True", + "[ 197.6 s] grad gate: control=True, step0_gather=True, step0_nopad=True, step0_components=True, step0_structured=True", + "[ 197.6 s] best admissible (precision-equivalent): step0_components; any precision: step0_components", + "[ 376.8 s] vmap: control_vmap1 1.821 ms/L, control_vmap4 1.025 ms/L, control_vmap16 0.782 ms/L, step0_gather_vmap1 2.414 ms/L, step0_gather_vmap4 1.672 ms/L, step0_gather_vmap16 1.501 ms/L, step0_nopad_vmap1 2.448 ms/L, step0_nopad_vmap4 1.686 ms/L, step0_nopad_vmap16 1.500 ms/L, step0_components_vmap1 1.788 ms/L, step0_components_vmap4 1.181 ms/L, step0_components_vmap16 1.001 ms/L, step0_structured_vmap1 1.864 ms/L, step0_structured_vmap4 1.051 ms/L, step0_structured_vmap16 0.784 ms/L", + "[ 376.8 s] step-0 route bit-identity vs control: step0_gather=True, step0_nopad=True, step0_components=True, step0_structured=True", + "[ 376.8 s] step-0 split: ray trace vs ray trace + containment per geometry", + "[ 397.3 s] step-0 split: control trace 0.291 contain 0.569, step0_gather trace 0.311 contain 1.239, step0_nopad trace 0.303 contain 1.211, step0_components trace 0.293 contain 0.481, step0_structured trace 0.324 contain 0.600", + "[ 397.3 s] uncapped containing counts (NumPy path) on the prior draws", + "[ 414.6 s] uncapped control: max per step [17, 13, 11, 9, 7, 5, 5, 5]; draws exceeding cap 15: [12]", + "[ 431.7 s] uncapped step0_components: max per step [17, 13, 11, 9, 7, 5, 5, 5]; draws exceeding cap 15: [12]" + ], + "wall_s": 433.3467830999998 +} \ No newline at end of file diff --git a/results/breakdown/point_source_image/solver_config_sweep_step0_laptop_cpu_fp64.png b/results/breakdown/point_source_image/solver_config_sweep_step0_laptop_cpu_fp64.png new file mode 100644 index 0000000000000000000000000000000000000000..c5a668dea02bb651f3e4e90f8c354728c6b17b09 GIT binary patch literal 108949 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 Date: Sun, 27 Sep 2026 11:33:43 +0100 Subject: [PATCH 03/10] fix(point_source_image): route-aware step-0 materialisation prefix; image_plane ray-trace prefix excludes the gather (PyAutoArray#579) solver_config_sweep: the step0_split 'ray_trace_materialised' prefix returned plane.triangles, the general (N,3,2) gather, on every route, so it read ~0.8 ms whatever the route. It is now two prefixes: route_inputs (the six barycentric input components the ACTIVE route feeds _barycentric_contains, captured at trace time) -> route_input_materialisation_ms, and general_gather (plane.triangles, route-independent reference; phase 4a's triangle_materialisation_ms) -> general_gather_reference_ms. Containment stays the headline number. image_plane: each step's ray-trace prefix is now jnp.sum(plane.vertices), so the vertices[indices] gather is counted in containment, not ray trace. Pre-#579 rows (job 356365) keep the old split and are marked not quotable in the docstring. Co-Authored-By: Claude Opus 5.5 --- .../likelihood_breakdown/image_plane.py | 16 ++++- .../solver_config_sweep.py | 65 +++++++++++++++++-- 2 files changed, 73 insertions(+), 8 deletions(-) diff --git a/scripts/point_source_image/likelihood_breakdown/image_plane.py b/scripts/point_source_image/likelihood_breakdown/image_plane.py index 5c2d7cdd6..a026ff02d 100644 --- a/scripts/point_source_image/likelihood_breakdown/image_plane.py +++ b/scripts/point_source_image/likelihood_breakdown/image_plane.py @@ -15,6 +15,12 @@ is retained as measurement noise. The fused end-to-end likelihood is the authoritative runtime control. +Each step's ray-trace prefix is ``jnp.sum`` of the traced vertices, so the +``vertices[indices]`` triangle gather is counted in containment. Rows committed +before PyAutoArray#579 (e.g. RAL job 356365) returned the materialised triangles +at that prefix, which put the gather in the ray-trace row; their per-step +ray-trace / containment split is not quotable. + The primary path uses ``PointSolved`` and ``FitPositionsImagePairAllSolved``. A separately labelled free-centre ``PointFlux`` / ``FitPositionsImagePairAll`` full-likelihood control confirms @@ -189,7 +195,11 @@ def _solver_prefix(params, *, stop_step: int, stop_stage: str): plane_redshift=fit.plane_redshift, ) if step_number == stop_step and stop_stage == "ray_trace": - return plane_triangles.triangles + # A scalar reduction forces every deflection of this step but writes no + # (N, 3, 2) output. Returning ``plane_triangles.triangles`` here (job 356365 + # and earlier) counted the ``vertices[indices]`` gather as ray trace; the + # gather now lands in the containment row, where the solver pays for it. + return jnp.sum(plane_triangles.vertices) indexes = plane_triangles.containing_indices(shape=shape) if step_number == stop_step and stop_stage == "containment": @@ -418,6 +428,10 @@ def magnification_filter_prefix(params): "prefix_rows": "successive differences of cumulative JIT prefixes", "negative_rows": "retained; XLA fusion and timing noise can move work across boundaries", "authoritative_runtime": "fused_full_solved_s", + "ray_trace_prefix": ( + "jnp.sum(plane_triangles.vertices): deflections only; the vertices[indices] " + "gather is counted in containment (PyAutoArray#579 fix)" + ), }, } diff --git a/scripts/point_source_image/likelihood_breakdown/solver_config_sweep.py b/scripts/point_source_image/likelihood_breakdown/solver_config_sweep.py index 6927c8b77..f0331869c 100644 --- a/scripts/point_source_image/likelihood_breakdown/solver_config_sweep.py +++ b/scripts/point_source_image/likelihood_breakdown/solver_config_sweep.py @@ -79,7 +79,11 @@ ``compile_s``, FLOPs (``cost_analysis``), XLA ``memory_analysis`` and ``vmap`` batches 1 / 4 / 16 for the control and the best admissible configuration. For each distinct step-0 geometry the step-0 ray trace and ray trace + containment are timed -as their own jitted prefixes, so the containment share is recorded. +as their own jitted prefixes, so the containment share is recorded. Two further +prefixes size the materialisation: ``route_inputs`` returns the six barycentric +input components the ACTIVE step-0 route feeds the sign test (route-aware), and +``general_gather`` returns ``plane.triangles`` (the general ``(N, 3, 2)`` gather, +route-independent reference). Containment is the headline before/after number. Finally, the NumPy solver (dynamic shapes, no ``MAX_CONTAINING_SIZE`` cap) counts how many triangles contain β* at every step on the prior draws, for the control and the best admissible geometries: the margin the production cap of 15 actually has. @@ -1311,6 +1315,36 @@ def _same(a, b) -> bool: # --- 6. step-0 ray trace vs containment split per geometry --------------------- note("step-0 split: ray trace vs ray trace + containment per geometry") +from autoarray.structures.triangles import shape as _triangles_shape # noqa: E402 + + +@contextlib.contextmanager +def capture_barycentric_inputs(): + """Capture, at trace time, what the ACTIVE step-0 route feeds the sign test. + + Every containment route -- the general ``Point.mask(self.triangles)`` path and the + PyAutoArray#579 routes -- ends in ``_barycentric_contains(x0, y0, x1, y1, x2, y2, px, + py)``. While this is active that helper is swapped (in both modules that bind it) for + one that records its six vertex-component arguments and returns an all-False mask of + the right shape, so the downstream ``jnp.where`` still traces. The step-0 prefix + returns the recorded components: the route's own input materialisation (the + ``(N, 3, 2)`` gather for ``gather``, six 1-D gathers for ``components``, strided + slices for ``structured``), not a fixed ``plane.triangles`` gather. + """ + captured = [] + + def recording(x0, y0, x1, y1, x2, y2, px, py): + captured.extend((x0, y0, x1, y1, x2, y2)) + return jnp.zeros(jnp.shape(x0), dtype=bool) + + saved = (_triangles_array._barycentric_contains, _triangles_shape._barycentric_contains) + _triangles_array._barycentric_contains = recording + _triangles_shape._barycentric_contains = recording + try: + yield captured + finally: + _triangles_array._barycentric_contains, _triangles_shape._barycentric_contains = saved + def step0_factory(cfg, stage): def factory(): @@ -1331,10 +1365,18 @@ def fn(vector): # A scalar reduction forces every step-0 deflection but writes no # (N, 3, 2) output, so containment is measured against it. return jnp.sum(plane.vertices) - if stage == "ray_trace_materialised": - # image_plane.py's ray-trace prefix (job 356365): returns the - # gathered (N, 3, 2) triangles, i.e. includes their materialisation. + if stage == "general_gather": + # The general path's (N, 3, 2) gather (image_plane.py's pre-#579 + # ray-trace prefix, job 356365). Route-INDEPENDENT: every route reads the + # same ~0.9 ms here, so it is a reference, not the route's cost. return plane.triangles + if stage == "route_inputs": + # What THIS route materialises for the sign test (route-aware). + with capture_barycentric_inputs() as captured: + plane.containing_indices(shape=shape) + if len(captured) % 6 or not captured: + raise RuntimeError(f"route_inputs: captured {len(captured)} components") + return tuple(captured) return plane.containing_indices(shape=shape) return fn @@ -1347,7 +1389,7 @@ def fn(vector): key = (cfg["extent"], cfg["scale"], cfg.get("step0_route")) geoms.setdefault(key, cfg) s0_exec = {} -stages = ("source_centre", "ray_trace", "ray_trace_materialised", "containment") +stages = ("source_centre", "ray_trace", "general_gather", "route_inputs", "containment") for key, cfg in geoms.items(): for stage in stages: s0_exec[(key, stage)], _ = compile_route( @@ -1379,12 +1421,21 @@ def fn(vector): "prefix_median_ms": med, "ray_trace_ms": trace, "containment_ms": contain, - "triangle_materialisation_ms": med["ray_trace_materialised"] - med["ray_trace"], + # Route-aware: the route's own barycentric inputs written out as jit outputs, + # minus ray trace. An upper bound on what the fused containment pays for them + # (XLA may fuse the inputs into the sign test and never write them). + "route_input_materialisation_ms": med["route_inputs"] - med["ray_trace"], + # Route-independent reference: the general (N, 3, 2) gather, whatever the route. + # Phase 4a's "triangle_materialisation_ms" (job 356367) is this quantity. + "general_gather_reference_ms": med["general_gather"] - med["ray_trace"], "step0_route": descriptions[cfg["name"]]["step0_route"], "method": ( "prefix medians; ray_trace = jnp.sum(plane.vertices) minus source_centre; " "containment = containing_indices minus ray_trace (includes the vertices[indices] " - "gather + Point.mask + jnp.where); ray_trace_materialised = image_plane.py's prefix" + "gather + Point.mask + jnp.where) and is the headline before/after number; " + "route_input_materialisation = the route's six barycentric input components " + "returned as outputs (captured at trace time) minus ray_trace; " + "general_gather_reference = plane.triangles minus ray_trace, route-independent" ), "step0_ms": trace + contain, "containment_share_of_step0": contain / (trace + contain) if trace + contain > 0 else None, From 64e486a78a37abdf4fb3f15e0902435bf8c37316 Mon Sep 17 00:00:00 2001 From: Jammy2211 Date: Sun, 27 Sep 2026 11:44:30 +0100 Subject: [PATCH 04/10] hpc(point_source_image): RAL CPU + A100 submits for the step-0 route A/B (PyAutoArray#579) The unpushed PyAutoArray branch is a bundle-fetched clone of the shared mirror prepended to PYTHONPATH; the job refuses to run unless autoarray imports from it (and the rest from the mirror), and asserts the JSON source_revisions after the run, including that PyAutoArray descends from c13b2d73. CPU pinned to the phase-4a 8490H node euclid-ral-compute-10-4; A100 asserts the gpu backend. Co-Authored-By: Claude Opus 5.5 --- ...age_solver_config_sweep_step0_ral_cpu_fp64 | 148 +++++++++++++++++ ..._image_solver_config_sweep_step0_a100_fp64 | 153 ++++++++++++++++++ 2 files changed, 301 insertions(+) create mode 100644 hpc/batch_cpu/submit_breakdown_point_source_image_solver_config_sweep_step0_ral_cpu_fp64 create mode 100644 hpc/batch_gpu/submit_breakdown_point_source_image_solver_config_sweep_step0_a100_fp64 diff --git a/hpc/batch_cpu/submit_breakdown_point_source_image_solver_config_sweep_step0_ral_cpu_fp64 b/hpc/batch_cpu/submit_breakdown_point_source_image_solver_config_sweep_step0_ral_cpu_fp64 new file mode 100644 index 000000000..208e2bda5 --- /dev/null +++ b/hpc/batch_cpu/submit_breakdown_point_source_image_solver_config_sweep_step0_ral_cpu_fp64 @@ -0,0 +1,148 @@ +#!/bin/bash -l +# +# 2026-09 point-source CPU speed-up campaign, phase 4b: the step-0 containment +# route A/B (PyAutoArray#579) on RAL CPU. +# +# WHAT THIS MEASURES. scripts/point_source_image/likelihood_breakdown/ +# solver_config_sweep.py --step0-route control,gather,components,structured: +# the production FitPositionsImagePairAllSolved likelihood at the production +# geometry (+-9.9" / 0.2 / 1e-3 / MCS 15) with autoarray's _STEP0_CONTAINMENT +# set per route for tracing only (fresh closure + jax.clear_caches() per route), +# interleaved 20 rounds x 20 calls, bootstrap 90 % CI, vmap 1/4/16, compile_s, +# XLA memory, the route-aware step-0 prefix split, the 200 prior + 200 stress +# completeness draws, and gates.step0_route_bit_identity (stream / fiducial / +# prior log L, prior + stress positions, image counts, grad, vmap bit-identical +# to the control). "control" is the branch's library default ("structured"); +# "gather" is the pre-#579 general path, i.e. the "before". +# +# LIBRARY. The branch is unpushed, so its PyAutoArray is a git clone of the +# shared mirror with the branch fetched from a bundle, checked out detached at +# the measured commit (AA_BRANCH_SRC below), prepended to PYTHONPATH. Every +# other library is the shared mirror (/mnt/ral/jnightin/PyAuto, via +# activate.sh); PyAutoLens is mirror main 4487eb47, unchanged by #579. The job +# refuses to run unless autoarray imports from the clone and the rest from the +# mirror, and asserts the JSON source_revisions afterwards. +# +# THREADS. OMP/MKL/OPENBLAS pinned to 1 (BLAS family only); the JAX CPU backend +# sizes its Eigen pool from the 8 CPUs of --cpus-per-task=8, as phases 1-4a. +# XLA_FLAGS are the phase-1 row's, byte for byte. +# +# NODE. Pinned to the Xeon Platinum 8490H node of phase 4a (euclid-ral-compute-10-4, +# jobs 356365 / 356367). Check `sinfo -p ral -N -o "%N %T %C"` first: `idle*` +# nodes are unreachable. + +# WALL-BASIS: +# Laptop run of this cell (same 4 routes + nopad, 200 + 200 draws, 20 x 20): +# 433 s. RAL job 356367 (26 configs) ran 787 s. 1500 s declared, headroom ~3. +# cell: point_source_image/solver_config_sweep_step0/simple device: cpu precision: fp64 +# source: measured-wall wall: 1500 ref: laptop-solver_config_sweep_step0 headroom: 3.0 + +#SBATCH -J point_source_step0_p4b +#SBATCH --partition=ral +#SBATCH --nodelist=euclid-ral-compute-10-4 +#SBATCH --ntasks=1 +#SBATCH --cpus-per-task=8 +#SBATCH --mem=32gb +#SBATCH --time=1:30:00 +#SBATCH -o output/output.%A.out +#SBATCH -e error/error.%A.err +#SBATCH --mail-type=END,FAIL +#SBATCH --mail-user=james.w.nightingale@durham.ac.uk + +export AP_ROOT="$(cd "${SLURM_SUBMIT_DIR:-$(dirname "$0")}/../.." && pwd)" +echo "AP_ROOT=$AP_ROOT" +source $AP_ROOT/activate.sh + +export AA_BRANCH_SRC="${AA_BRANCH_SRC:-/mnt/ral/jnightin/autolens_profiling_wt/PyAutoArray_pointsolver-step0-gather}" +if [ ! -f "$AA_BRANCH_SRC/autoarray/__init__.py" ]; then + echo "FATAL: $AA_BRANCH_SRC is not a PyAutoArray checkout (see LIBRARY)" >&2 + exit 2 +fi +export PYTHONPATH="$AA_BRANCH_SRC:$PYTHONPATH" + +export OMP_NUM_THREADS=1 +export MKL_NUM_THREADS=1 +export OPENBLAS_NUM_THREADS=1 +export NPROC=${SLURM_CPUS_PER_TASK:-8} +export JAX_PLATFORMS=cpu +export JAX_ENABLE_X64=1 +export XLA_FLAGS="--xla_disable_hlo_passes=constant_folding --xla_gpu_autotune_level=0 --xla_gpu_enable_triton_gemm=false" +export NUMBA_CACHE_DIR=$AP_ROOT/output/numba_cache_${SLURM_JOB_ID:-local} +mkdir -p "$NUMBA_CACHE_DIR" "$MPLCONFIGDIR" +# No persistent compile cache: compile_s is a gate and must be cold per route. +unset JAX_COMPILATION_CACHE_DIR + +CONFIG_NAME=hpc_ral_cpu_fp64 +RESULTS_DIR=$AP_ROOT/results/breakdown/point_source_image +mkdir -p "$RESULTS_DIR" + +echo "==========================================" +date +hostname +lscpu | grep 'Model name' || true +echo "partition: ${SLURM_JOB_PARTITION:-unset}" +echo "cpus-per-task: ${SLURM_CPUS_PER_TASK:-unset}" +echo "sched_affinity: $(python3 -c 'import os; print(len(os.sched_getaffinity(0)))')" +echo "loadavg: $(cat /proc/loadavg)" +echo "Cell: point_source_image/likelihood_breakdown/solver_config_sweep --step0-route" +echo "Thread env: OMP=$OMP_NUM_THREADS MKL=$MKL_NUM_THREADS OPENBLAS=$OPENBLAS_NUM_THREADS NPROC=$NPROC" +echo "XLA_FLAGS: $XLA_FLAGS" +echo "PYTHONPATH: $PYTHONPATH" + +echo "=== source revisions ===" +for r in PyAutoNerves PyAutoFit PyAutoArray PyAutoGalaxy PyAutoLens; do + printf '%-14s %s\n' "$r (mirror)" "$(git -C /mnt/ral/jnightin/PyAuto/$r rev-parse HEAD 2>&1)" +done +echo "PyAutoArray (branch clone, IMPORTED): $(git -C $AA_BRANCH_SRC rev-parse HEAD 2>&1)" +echo "AP_ROOT rev: $(git -C $AP_ROOT rev-parse HEAD 2>&1)" + +cd $AP_ROOT + +echo "=== import provenance ===" +python3 - <<'PYEOF' || exit 3 +import os, autoarray, autofit, autogalaxy, autolens, jax, jaxlib, numpy +aa = os.path.realpath(os.environ["AA_BRANCH_SRC"]) +for m in (autoarray, autofit, autogalaxy, autolens): + print(f"{m.__name__:<11} {m.__version__:<12} {m.__file__}") +if not os.path.realpath(autoarray.__file__).startswith(aa + "/"): + raise SystemExit(f"REFUSING: autoarray from {autoarray.__file__}, not {aa}") +for m in (autofit, autogalaxy, autolens): + if not m.__file__.startswith("/mnt/ral/jnightin/PyAuto/"): + raise SystemExit(f"REFUSING: {m.__name__} from {m.__file__}, not the shared mirror") +from autoarray.structures.triangles import array as a +print("_STEP0_CONTAINMENT", a._STEP0_CONTAINMENT) +print("jax", jax.__version__, "jaxlib", jaxlib.__version__, "numpy", numpy.__version__, jax.devices()) +PYEOF + +echo "==========================================" +echo "RUN ${CONFIG_NAME} -> ${RESULTS_DIR}" +date +echo "loadavg: $(cat /proc/loadavg)" +PYTHONUNBUFFERED=1 python3 scripts/point_source_image/likelihood_breakdown/solver_config_sweep.py \ + --config-name "$CONFIG_NAME" --output-dir "$RESULTS_DIR" \ + --step0-route control,gather,components,structured \ + --n-draws 200 --n-stress 200 --rounds 20 --calls 20 + +echo "=== source_revisions check (JSON vs imported HEADs) ===" +python3 - "$RESULTS_DIR/solver_config_sweep_step0_${CONFIG_NAME}.json" <<'PYEOF' +import json, os, subprocess, sys +path = sys.argv[1] +d = json.load(open(path)) +revs = d["source_revisions"] +def head(p): + return subprocess.check_output(["git", "-C", p, "rev-parse", "HEAD"], text=True).strip() +want = {r: head(f"/mnt/ral/jnightin/PyAuto/{r}") for r in ("PyAutoNerves", "PyAutoFit", "PyAutoGalaxy", "PyAutoLens")} +want["PyAutoArray"] = head(os.environ["AA_BRANCH_SRC"]) +for r, h in want.items(): + if revs[r] != h: + raise SystemExit(f"MISMATCH {path}: {r} JSON {revs[r]} != {h}") +subprocess.check_call(["git", "-C", os.environ["AA_BRANCH_SRC"], "merge-base", "--is-ancestor", + "c13b2d733538bec86cff3a15eccd9a0940a68463", revs["PyAutoArray"]]) +print("autoarray_imported_from", d.get("autoarray_imported_from")) +print("OK", path, "all_gates_pass", d.get("all_gates_pass")) +PYEOF + +echo "==========================================" +echo "loadavg: $(cat /proc/loadavg)" +echo "Finished." +date diff --git a/hpc/batch_gpu/submit_breakdown_point_source_image_solver_config_sweep_step0_a100_fp64 b/hpc/batch_gpu/submit_breakdown_point_source_image_solver_config_sweep_step0_a100_fp64 new file mode 100644 index 000000000..0e0c5aa08 --- /dev/null +++ b/hpc/batch_gpu/submit_breakdown_point_source_image_solver_config_sweep_step0_a100_fp64 @@ -0,0 +1,153 @@ +#!/bin/bash -l +# +# 2026-09 point-source CPU speed-up campaign, phase 4b: the step-0 containment +# route A/B (PyAutoArray#579): the A100 no-regression leg. The A100 is +# launch-bound for this likelihood (phase 3), so ~1x is the expectation. +# +# WHAT THIS MEASURES. scripts/point_source_image/likelihood_breakdown/ +# solver_config_sweep.py --step0-route control,gather,components,structured: +# the production FitPositionsImagePairAllSolved likelihood at the production +# geometry (+-9.9" / 0.2 / 1e-3 / MCS 15) with autoarray's _STEP0_CONTAINMENT +# set per route for tracing only (fresh closure + jax.clear_caches() per route), +# interleaved 20 rounds x 20 calls, bootstrap 90 % CI, vmap 1/4/16, compile_s, +# XLA memory, the route-aware step-0 prefix split, the 200 prior + 200 stress +# completeness draws, and gates.step0_route_bit_identity (stream / fiducial / +# prior log L, prior + stress positions, image counts, grad, vmap bit-identical +# to the control). "control" is the branch's library default ("structured"); +# "gather" is the pre-#579 general path, i.e. the "before". +# +# LIBRARY. The branch is unpushed, so its PyAutoArray is a git clone of the +# shared mirror with the branch fetched from a bundle, checked out detached at +# the measured commit (AA_BRANCH_SRC below), prepended to PYTHONPATH. Every +# other library is the shared mirror (/mnt/ral/jnightin/PyAuto, via +# activate.sh); PyAutoLens is mirror main 4487eb47, unchanged by #579. The job +# refuses to run unless autoarray imports from the clone and the rest from the +# mirror, and asserts the JSON source_revisions afterwards. +# +# BACKEND. JAX_PLATFORMS=cuda (NOT "cuda,cpu": a list can silently fall back to +# CPU) and JAX_PLATFORM_NAME=cuda; the job asserts jax.default_backend()=="gpu". +# XLA_FLAGS are byte-identical to the CPU submit's. + +# WALL-BASIS: +# No A100 run of this cell yet; the laptop CPU run took 433 s. The A100 is +# launch-bound (per-call ~1-2 ms, the completeness draws dominate), so 3600 s +# is declared as an estimate. +# cell: point_source_image/solver_config_sweep_step0/simple device: gpu precision: fp64 +# source: estimate wall: 3600 ref: laptop-solver_config_sweep_step0 headroom: 2.0 + +#SBATCH -J point_source_step0_p4b_gpu +#SBATCH --partition=gpu +#SBATCH --gres=gpu:1 +#SBATCH --ntasks=1 +#SBATCH --cpus-per-task=8 +#SBATCH --mem=32gb +#SBATCH --time=3:00:00 +#SBATCH -o output/output.%A.out +#SBATCH -e error/error.%A.err +#SBATCH --mail-type=END,FAIL +#SBATCH --mail-user=james.w.nightingale@durham.ac.uk + +export AP_ROOT="$(cd "${SLURM_SUBMIT_DIR:-$(dirname "$0")}/../.." && pwd)" +echo "AP_ROOT=$AP_ROOT" +source $AP_ROOT/activate.sh + +export AA_BRANCH_SRC="${AA_BRANCH_SRC:-/mnt/ral/jnightin/autolens_profiling_wt/PyAutoArray_pointsolver-step0-gather}" +if [ ! -f "$AA_BRANCH_SRC/autoarray/__init__.py" ]; then + echo "FATAL: $AA_BRANCH_SRC is not a PyAutoArray checkout (see LIBRARY)" >&2 + exit 2 +fi +export PYTHONPATH="$AA_BRANCH_SRC:$PYTHONPATH" + +export OMP_NUM_THREADS=1 +export MKL_NUM_THREADS=1 +export OPENBLAS_NUM_THREADS=1 +export NPROC=${SLURM_CPUS_PER_TASK:-8} +export JAX_PLATFORM_NAME=cuda +export JAX_PLATFORMS=cuda +export XLA_PYTHON_CLIENT_PREALLOCATE=false +export JAX_ENABLE_X64=1 +export XLA_FLAGS="--xla_disable_hlo_passes=constant_folding --xla_gpu_autotune_level=0 --xla_gpu_enable_triton_gemm=false" +export NUMBA_CACHE_DIR=$AP_ROOT/output/numba_cache_${SLURM_JOB_ID:-local} +mkdir -p "$NUMBA_CACHE_DIR" "$MPLCONFIGDIR" +# No persistent compile cache: compile_s is a gate and must be cold per route. +unset JAX_COMPILATION_CACHE_DIR + +CONFIG_NAME=hpc_ral_a100_fp64 +RESULTS_DIR=$AP_ROOT/results/breakdown/point_source_image +mkdir -p "$RESULTS_DIR" + +echo "==========================================" +date +hostname +lscpu | grep 'Model name' || true +nvidia-smi --query-gpu=name,driver_version,memory.total,utilization.gpu --format=csv || true +echo "gpus: ${CUDA_VISIBLE_DEVICES:-unset}" +echo "partition: ${SLURM_JOB_PARTITION:-unset}" +echo "cpus-per-task: ${SLURM_CPUS_PER_TASK:-unset}" +echo "sched_affinity: $(python3 -c 'import os; print(len(os.sched_getaffinity(0)))')" +echo "loadavg: $(cat /proc/loadavg)" +echo "Cell: point_source_image/likelihood_breakdown/solver_config_sweep --step0-route" +echo "Thread env: OMP=$OMP_NUM_THREADS MKL=$MKL_NUM_THREADS OPENBLAS=$OPENBLAS_NUM_THREADS NPROC=$NPROC" +echo "XLA_FLAGS: $XLA_FLAGS" +echo "PYTHONPATH: $PYTHONPATH" + +echo "=== source revisions ===" +for r in PyAutoNerves PyAutoFit PyAutoArray PyAutoGalaxy PyAutoLens; do + printf '%-14s %s\n' "$r (mirror)" "$(git -C /mnt/ral/jnightin/PyAuto/$r rev-parse HEAD 2>&1)" +done +echo "PyAutoArray (branch clone, IMPORTED): $(git -C $AA_BRANCH_SRC rev-parse HEAD 2>&1)" +echo "AP_ROOT rev: $(git -C $AP_ROOT rev-parse HEAD 2>&1)" + +cd $AP_ROOT + +echo "=== import provenance ===" +python3 - <<'PYEOF' || exit 3 +import os, autoarray, autofit, autogalaxy, autolens, jax, jaxlib, numpy +aa = os.path.realpath(os.environ["AA_BRANCH_SRC"]) +for m in (autoarray, autofit, autogalaxy, autolens): + print(f"{m.__name__:<11} {m.__version__:<12} {m.__file__}") +if not os.path.realpath(autoarray.__file__).startswith(aa + "/"): + raise SystemExit(f"REFUSING: autoarray from {autoarray.__file__}, not {aa}") +for m in (autofit, autogalaxy, autolens): + if not m.__file__.startswith("/mnt/ral/jnightin/PyAuto/"): + raise SystemExit(f"REFUSING: {m.__name__} from {m.__file__}, not the shared mirror") +from autoarray.structures.triangles import array as a +print("_STEP0_CONTAINMENT", a._STEP0_CONTAINMENT) +print("jax", jax.__version__, "jaxlib", jaxlib.__version__, "numpy", numpy.__version__, jax.devices()) +if jax.default_backend() != "gpu": + raise SystemExit(f"REFUSING: JAX backend is {jax.default_backend()}, not gpu") +PYEOF + +echo "==========================================" +echo "RUN ${CONFIG_NAME} -> ${RESULTS_DIR}" +date +echo "loadavg: $(cat /proc/loadavg)" +PYTHONUNBUFFERED=1 python3 scripts/point_source_image/likelihood_breakdown/solver_config_sweep.py \ + --config-name "$CONFIG_NAME" --output-dir "$RESULTS_DIR" \ + --step0-route control,gather,components,structured \ + --n-draws 200 --n-stress 200 --rounds 20 --calls 20 + +echo "=== source_revisions check (JSON vs imported HEADs) ===" +python3 - "$RESULTS_DIR/solver_config_sweep_step0_${CONFIG_NAME}.json" <<'PYEOF' +import json, os, subprocess, sys +path = sys.argv[1] +d = json.load(open(path)) +revs = d["source_revisions"] +def head(p): + return subprocess.check_output(["git", "-C", p, "rev-parse", "HEAD"], text=True).strip() +want = {r: head(f"/mnt/ral/jnightin/PyAuto/{r}") for r in ("PyAutoNerves", "PyAutoFit", "PyAutoGalaxy", "PyAutoLens")} +want["PyAutoArray"] = head(os.environ["AA_BRANCH_SRC"]) +for r, h in want.items(): + if revs[r] != h: + raise SystemExit(f"MISMATCH {path}: {r} JSON {revs[r]} != {h}") +subprocess.check_call(["git", "-C", os.environ["AA_BRANCH_SRC"], "merge-base", "--is-ancestor", + "c13b2d733538bec86cff3a15eccd9a0940a68463", revs["PyAutoArray"]]) +print("autoarray_imported_from", d.get("autoarray_imported_from")) +print("OK", path, "all_gates_pass", d.get("all_gates_pass")) +PYEOF + +echo "==========================================" +echo "loadavg: $(cat /proc/loadavg)" +nvidia-smi --query-gpu=name,memory.used --format=csv || true +echo "Finished." +date From d745d679285db20db7591c0f756ceaf9ab532fa8 Mon Sep 17 00:00:00 2001 From: Jammy2211 Date: Sun, 27 Sep 2026 12:01:01 +0100 Subject: [PATCH 05/10] hpc(point_source_image): gpu-partition CPU-only fallback submit for the step-0 A/B (PyAutoArray#579) ral is saturated (10-4 memory fully allocated, load ~155); the known fallback is an idle gpu-partition node with no --gres. Pinned to euclid-ral-gpu-2, away from the A100 leg; refuses to run if a GPU is visible. Co-Authored-By: Claude Opus 5.5 --- ...olver_config_sweep_step0_gpu_node_cpu_fp64 | 154 ++++++++++++++++++ 1 file changed, 154 insertions(+) create mode 100644 hpc/batch_cpu/submit_breakdown_point_source_image_solver_config_sweep_step0_gpu_node_cpu_fp64 diff --git a/hpc/batch_cpu/submit_breakdown_point_source_image_solver_config_sweep_step0_gpu_node_cpu_fp64 b/hpc/batch_cpu/submit_breakdown_point_source_image_solver_config_sweep_step0_gpu_node_cpu_fp64 new file mode 100644 index 000000000..52fb83441 --- /dev/null +++ b/hpc/batch_cpu/submit_breakdown_point_source_image_solver_config_sweep_step0_gpu_node_cpu_fp64 @@ -0,0 +1,154 @@ +#!/bin/bash -l +# +# 2026-09 point-source CPU speed-up campaign, phase 4b: the step-0 containment +# route A/B (PyAutoArray#579) on RAL CPU. +# +# WHAT THIS MEASURES. scripts/point_source_image/likelihood_breakdown/ +# solver_config_sweep.py --step0-route control,gather,components,structured: +# the production FitPositionsImagePairAllSolved likelihood at the production +# geometry (+-9.9" / 0.2 / 1e-3 / MCS 15) with autoarray's _STEP0_CONTAINMENT +# set per route for tracing only (fresh closure + jax.clear_caches() per route), +# interleaved 20 rounds x 20 calls, bootstrap 90 % CI, vmap 1/4/16, compile_s, +# XLA memory, the route-aware step-0 prefix split, the 200 prior + 200 stress +# completeness draws, and gates.step0_route_bit_identity (stream / fiducial / +# prior log L, prior + stress positions, image counts, grad, vmap bit-identical +# to the control). "control" is the branch's library default ("structured"); +# "gather" is the pre-#579 general path, i.e. the "before". +# +# LIBRARY. The branch is unpushed, so its PyAutoArray is a git clone of the +# shared mirror with the branch fetched from a bundle, checked out detached at +# the measured commit (AA_BRANCH_SRC below), prepended to PYTHONPATH. Every +# other library is the shared mirror (/mnt/ral/jnightin/PyAuto, via +# activate.sh); PyAutoLens is mirror main 4487eb47, unchanged by #579. The job +# refuses to run unless autoarray imports from the clone and the rest from the +# mirror, and asserts the JSON source_revisions afterwards. +# +# THREADS. OMP/MKL/OPENBLAS pinned to 1 (BLAS family only); the JAX CPU backend +# sizes its Eigen pool from the 8 CPUs of --cpus-per-task=8, as phases 1-4a. +# XLA_FLAGS are the phase-1 row's, byte for byte. +# +# NODE. FALLBACK for the 8490H submit (..._ral_cpu_fp64): on 2026-09-27 the `ral` +# partition was saturated (euclid_dr1 arrays; 10-4 had its memory fully +# allocated at load ~155), so this leg runs CPU-only on an idle node of the `gpu` +# partition (AMD EPYC 7702), with NO --gres: JAX_PLATFORMS=cpu and no GPU is +# visible. Pinned to euclid-ral-gpu-2 so it does not share a node with the A100 +# leg on gpu-1. Only in-job ratios compare with the 8490H rows of phase 4a. + +# WALL-BASIS: +# Laptop run of this cell (same 4 routes + nopad, 200 + 200 draws, 20 x 20): +# 433 s. RAL job 356367 (26 configs) ran 787 s. 1500 s declared, headroom ~3. +# cell: point_source_image/solver_config_sweep_step0/simple device: cpu precision: fp64 +# source: measured-wall wall: 1500 ref: laptop-solver_config_sweep_step0 headroom: 3.0 + +#SBATCH -J point_source_step0_p4b_epyc +#SBATCH --partition=gpu +#SBATCH --nodelist=euclid-ral-gpu-2 +#SBATCH --ntasks=1 +#SBATCH --cpus-per-task=8 +#SBATCH --mem=32gb +#SBATCH --time=1:30:00 +#SBATCH -o output/output.%A.out +#SBATCH -e error/error.%A.err +#SBATCH --mail-type=END,FAIL +#SBATCH --mail-user=james.w.nightingale@durham.ac.uk + +export AP_ROOT="$(cd "${SLURM_SUBMIT_DIR:-$(dirname "$0")}/../.." && pwd)" +echo "AP_ROOT=$AP_ROOT" +source $AP_ROOT/activate.sh + +export AA_BRANCH_SRC="${AA_BRANCH_SRC:-/mnt/ral/jnightin/autolens_profiling_wt/PyAutoArray_pointsolver-step0-gather}" +if [ ! -f "$AA_BRANCH_SRC/autoarray/__init__.py" ]; then + echo "FATAL: $AA_BRANCH_SRC is not a PyAutoArray checkout (see LIBRARY)" >&2 + exit 2 +fi +export PYTHONPATH="$AA_BRANCH_SRC:$PYTHONPATH" + +export OMP_NUM_THREADS=1 +export MKL_NUM_THREADS=1 +export OPENBLAS_NUM_THREADS=1 +export NPROC=${SLURM_CPUS_PER_TASK:-8} +export JAX_PLATFORMS=cpu +export JAX_ENABLE_X64=1 +export XLA_FLAGS="--xla_disable_hlo_passes=constant_folding --xla_gpu_autotune_level=0 --xla_gpu_enable_triton_gemm=false" +export NUMBA_CACHE_DIR=$AP_ROOT/output/numba_cache_${SLURM_JOB_ID:-local} +mkdir -p "$NUMBA_CACHE_DIR" "$MPLCONFIGDIR" +# No persistent compile cache: compile_s is a gate and must be cold per route. +unset JAX_COMPILATION_CACHE_DIR + +CONFIG_NAME=hpc_ral_cpu_epyc7702_fp64 +RESULTS_DIR=$AP_ROOT/results/breakdown/point_source_image +mkdir -p "$RESULTS_DIR" + +echo "==========================================" +date +hostname +lscpu | grep 'Model name' || true +echo "partition: ${SLURM_JOB_PARTITION:-unset}" +echo "cpus-per-task: ${SLURM_CPUS_PER_TASK:-unset}" +echo "sched_affinity: $(python3 -c 'import os; print(len(os.sched_getaffinity(0)))')" +echo "loadavg: $(cat /proc/loadavg)" +echo "Cell: point_source_image/likelihood_breakdown/solver_config_sweep --step0-route" +echo "Thread env: OMP=$OMP_NUM_THREADS MKL=$MKL_NUM_THREADS OPENBLAS=$OPENBLAS_NUM_THREADS NPROC=$NPROC" +echo "XLA_FLAGS: $XLA_FLAGS" +echo "PYTHONPATH: $PYTHONPATH" + +echo "=== source revisions ===" +for r in PyAutoNerves PyAutoFit PyAutoArray PyAutoGalaxy PyAutoLens; do + printf '%-14s %s\n' "$r (mirror)" "$(git -C /mnt/ral/jnightin/PyAuto/$r rev-parse HEAD 2>&1)" +done +echo "PyAutoArray (branch clone, IMPORTED): $(git -C $AA_BRANCH_SRC rev-parse HEAD 2>&1)" +echo "AP_ROOT rev: $(git -C $AP_ROOT rev-parse HEAD 2>&1)" + +cd $AP_ROOT + +echo "=== import provenance ===" +python3 - <<'PYEOF' || exit 3 +import os +if os.environ.get("CUDA_VISIBLE_DEVICES") not in (None, "", "NoDevFiles"): + raise SystemExit(f"REFUSING: a GPU is visible ({os.environ['CUDA_VISIBLE_DEVICES']}) on the CPU leg") +import autoarray, autofit, autogalaxy, autolens, jax, jaxlib, numpy +aa = os.path.realpath(os.environ["AA_BRANCH_SRC"]) +for m in (autoarray, autofit, autogalaxy, autolens): + print(f"{m.__name__:<11} {m.__version__:<12} {m.__file__}") +if not os.path.realpath(autoarray.__file__).startswith(aa + "/"): + raise SystemExit(f"REFUSING: autoarray from {autoarray.__file__}, not {aa}") +for m in (autofit, autogalaxy, autolens): + if not m.__file__.startswith("/mnt/ral/jnightin/PyAuto/"): + raise SystemExit(f"REFUSING: {m.__name__} from {m.__file__}, not the shared mirror") +from autoarray.structures.triangles import array as a +print("_STEP0_CONTAINMENT", a._STEP0_CONTAINMENT) +print("jax", jax.__version__, "jaxlib", jaxlib.__version__, "numpy", numpy.__version__, jax.devices()) +PYEOF + +echo "==========================================" +echo "RUN ${CONFIG_NAME} -> ${RESULTS_DIR}" +date +echo "loadavg: $(cat /proc/loadavg)" +PYTHONUNBUFFERED=1 python3 scripts/point_source_image/likelihood_breakdown/solver_config_sweep.py \ + --config-name "$CONFIG_NAME" --output-dir "$RESULTS_DIR" \ + --step0-route control,gather,components,structured \ + --n-draws 200 --n-stress 200 --rounds 20 --calls 20 + +echo "=== source_revisions check (JSON vs imported HEADs) ===" +python3 - "$RESULTS_DIR/solver_config_sweep_step0_${CONFIG_NAME}.json" <<'PYEOF' +import json, os, subprocess, sys +path = sys.argv[1] +d = json.load(open(path)) +revs = d["source_revisions"] +def head(p): + return subprocess.check_output(["git", "-C", p, "rev-parse", "HEAD"], text=True).strip() +want = {r: head(f"/mnt/ral/jnightin/PyAuto/{r}") for r in ("PyAutoNerves", "PyAutoFit", "PyAutoGalaxy", "PyAutoLens")} +want["PyAutoArray"] = head(os.environ["AA_BRANCH_SRC"]) +for r, h in want.items(): + if revs[r] != h: + raise SystemExit(f"MISMATCH {path}: {r} JSON {revs[r]} != {h}") +subprocess.check_call(["git", "-C", os.environ["AA_BRANCH_SRC"], "merge-base", "--is-ancestor", + "c13b2d733538bec86cff3a15eccd9a0940a68463", revs["PyAutoArray"]]) +print("autoarray_imported_from", d.get("autoarray_imported_from")) +print("OK", path, "all_gates_pass", d.get("all_gates_pass")) +PYEOF + +echo "==========================================" +echo "loadavg: $(cat /proc/loadavg)" +echo "Finished." +date From 54c5294e462da17c4d6ac992d3f7500080ce038a Mon Sep 17 00:00:00 2001 From: Jammy2211 Date: Sun, 27 Sep 2026 12:13:56 +0100 Subject: [PATCH 06/10] results(point_source_image): step-0 route A/B on RAL A100 (357322) and EPYC 7702 CPU (357335, supplementary) (PyAutoArray#579) A100: every route 1.00x gather (launch-bound, as expected). EPYC 7702 CPU-only on gpu-2 (ral saturated): structured 1.62x / components 1.61x over gather; labelled supplementary, a different CPU from phase 4a's 8490H. Every route is bit-identical to the control on both; 200/200 + 200/200 completeness. Co-Authored-By: Claude Opus 5.5 --- ..._config_sweep_step0_hpc_ral_a100_fp64.json | 4705 +++++++++++++++++ ...r_config_sweep_step0_hpc_ral_a100_fp64.png | Bin 0 -> 109009 bytes ...sweep_step0_hpc_ral_cpu_epyc7702_fp64.json | 4704 ++++++++++++++++ ..._sweep_step0_hpc_ral_cpu_epyc7702_fp64.png | Bin 0 -> 104301 bytes ..._27_ral_job_357322_step0_route_ab_a100.out | 85 + ...job_357335_step0_route_ab_epyc7702_cpu.out | 80 + 6 files changed, 9574 insertions(+) create mode 100644 results/breakdown/point_source_image/solver_config_sweep_step0_hpc_ral_a100_fp64.json create mode 100644 results/breakdown/point_source_image/solver_config_sweep_step0_hpc_ral_a100_fp64.png create mode 100644 results/breakdown/point_source_image/solver_config_sweep_step0_hpc_ral_cpu_epyc7702_fp64.json create mode 100644 results/breakdown/point_source_image/solver_config_sweep_step0_hpc_ral_cpu_epyc7702_fp64.png create mode 100644 results/notes/point_source_cpu_2026_09_27_ral_job_357322_step0_route_ab_a100.out create mode 100644 results/notes/point_source_cpu_2026_09_27_ral_job_357335_step0_route_ab_epyc7702_cpu.out diff --git a/results/breakdown/point_source_image/solver_config_sweep_step0_hpc_ral_a100_fp64.json b/results/breakdown/point_source_image/solver_config_sweep_step0_hpc_ral_a100_fp64.json new file mode 100644 index 000000000..a85c3bbdc --- /dev/null +++ b/results/breakdown/point_source_image/solver_config_sweep_step0_hpc_ral_a100_fp64.json @@ -0,0 +1,4705 @@ +{ + "cell": "solver_config_sweep_step0", + "issue": "PyAutoLabs/PyAutoArray#579", + "phase": "4b", + "step0_routes": [ + "control", + "gather", + "components", + "structured" + ], + "library_step0_default": "structured", + "config_name": "hpc_ral_a100_fp64", + "quotable": true, + "host_note": "A100 no-regression leg, RAL job 357322, euclid-ral-gpu-1 (post-run label). gates.fiducial_bit_exact fails only because its expected value is the CPU one (...812): the A100 fiducial ...806 equals the phase-2/3 A100 rows (static_lattice_ab / vertex_dedup_ab hpc_ral_a100_fp64) bit for bit, and every route is bit-identical to the control (gates.step0_route_bit_identity).", + "quick": false, + "library_versions": { + "autolens": "2026.8.17.1", + "autoarray": "2026.8.17.1", + "autofit": "2026.8.17.1" + }, + "package_versions": { + "jax": "0.10.2", + "jaxlib": "0.10.2" + }, + "source_revisions": { + "autolens_profiling": "311e690fd6c843fe38e5a228628b4417890694f2", + "PyAutoNerves": "eb27da2464e2f07e0ad67e7fb18ee84be76c479a", + "PyAutoFit": "5468c6cefa0ae8bb08a449497cbd3c620f3720e2", + "PyAutoArray": "c13b2d733538bec86cff3a15eccd9a0940a68463", + "PyAutoGalaxy": "879a9308b709b3705eb95904de6b349a5c034d61", + "PyAutoLens": "def4decf68a245a9c3dd1eb276ee0578897b220c" + }, + "autoarray_imported_from": "/mnt/ral/jnightin/autolens_profiling_wt/PyAutoArray_pointsolver-step0-gather", + "autolens_imported_from": "/mnt/ral/jnightin/PyAuto/PyAutoLens", + "device": { + "backend": "gpu", + "device": "cuda:0", + "hostname": "euclid-ral-gpu-1", + "xla_flags": "--xla_disable_hlo_passes=constant_folding --xla_gpu_autotune_level=0 --xla_gpu_enable_triton_gemm=false", + "omp_num_threads": "1", + "cpu_count": 124, + "jax_compilation_cache_dir": null, + "autotune_cache_entries_at_start": 0, + "cache_fresh": false, + "nvidia_smi": "NVIDIA A100 80GB PCIe, 541 MiB, 81920 MiB" + }, + "jax_devices": [ + "cuda:0" + ], + "machine": { + "cpu_model": "AMD EPYC 7702 64-Core Processor", + "cpu_count_os": 124, + "nproc": 1, + "nproc_all": 124, + "nproc_note": "GNU nproc honours OMP_NUM_THREADS, so `nproc` can print 1 on a multi-core host; `nproc_all` is the core count.", + "ram_total": "928298200 kB", + "kernel": "5.14.0-687.50.1.el9_8.x86_64", + "platform": "Linux-5.14.0-687.50.1.el9_8.x86_64-x86_64-with-glibc2.34", + "python": "3.12.4", + "jax_thread_env": { + "NPROC": "8" + }, + "blas_thread_env": { + "OMP_NUM_THREADS": "1", + "OPENBLAS_NUM_THREADS": "1", + "MKL_NUM_THREADS": "1", + "VECLIB_MAXIMUM_THREADS": null, + "NUMEXPR_NUM_THREADS": null + }, + "thread_env_note": "NPROC sizes XLA's CPU intra-op pool (the JAX rows); the BLAS knobs pin OpenBLAS/MKL/OpenMP (the numpy/scipy rows) and do not touch JAX. Two disjoint families; both are recorded on every CPU timing.", + "gpu": "NVIDIA A100 80GB PCIe, 81920 MiB, 610.57.04" + }, + "thread_environment": { + "NPROC": "8", + "OMP_NUM_THREADS": "1", + "OPENBLAS_NUM_THREADS": "1", + "MKL_NUM_THREADS": "1" + }, + "sched_affinity": 8, + "os_cpu_count": 124, + "xla_flags": "--xla_disable_hlo_passes=constant_folding --xla_gpu_autotune_level=0 --xla_gpu_enable_triton_gemm=false", + "jax_platforms": "cuda", + "jax_enable_x64": true, + "loadavg_start": [ + 0.28, + 0.07, + 0.02 + ], + "loadavg_end": [ + 0.98, + 0.9, + 0.47 + ], + "protocol": { + "n_rounds": 20, + "n_calls_per_round": 20, + "n_warm": 3, + "n_stream": 16, + "seed": 314, + "n_prior_draws": 200, + "n_stress_draws": 200, + "step0_rounds": 10, + "vmap_batches": [ + 1, + 4, + 16 + ], + "route_order": "round-robin over every config, start rotated each round", + "cache_trap_guard": "fresh closure + fresh solver/analysis per route; jax.clear_caches()", + "bootstrap": { + "samples": 2000, + "seed": 12345, + "interval": "90%" + }, + "admissible": "100% distinct-multiplicity agreement with the reference on the prior draws AND max position error <= 0.002\"", + "admissible_position_tol": 0.002, + "position_noise_sigma": 0.05, + "distinct_tol": 0.005, + "prior_draws": "full prior: vector_from_unit_vector(U(1e-4, 1-1e-4)); source = solved beta*", + "stress_draws": "OUTSIDE the prior: Isothermal centre U(-0.05,0.05), theta_E U(1,2), ell_comps U(-0.2,0.2), source centre U(-0.4,0.4); plain FitPositionsImagePairAll positions", + "reference": { + "name": "reference", + "block": "reference", + "extent": 12.0, + "scale": 0.05, + "precision": 0.0001, + "max_containing_size": 60, + "neighbor_degree": 1, + "step0_route": null + }, + "reference_b": { + "name": "reference_b", + "block": "reference", + "extent": 11.0, + "scale": 0.07, + "precision": 0.0001, + "max_containing_size": 60, + "neighbor_degree": 1, + "step0_route": null + }, + "max_containing_size_patch": "ArrayTriangles.__init__ / for_limits_and_scale __defaults__ + module constant, tracing only, restored by value", + "pytrees": "autofit.jax.register_model(model) for both models before any trace" + }, + "configs": [ + { + "name": "control", + "block": "control", + "extent": null, + "scale": 0.2, + "precision": 0.001, + "max_containing_size": 15, + "neighbor_degree": 1, + "step0_route": null + }, + { + "name": "step0_gather", + "block": "step0_route", + "extent": null, + "scale": 0.2, + "precision": 0.001, + "max_containing_size": 15, + "neighbor_degree": 1, + "step0_route": "gather" + }, + { + "name": "step0_components", + "block": "step0_route", + "extent": null, + "scale": 0.2, + "precision": 0.001, + "max_containing_size": 15, + "neighbor_degree": 1, + "step0_route": "components" + }, + { + "name": "step0_structured", + "block": "step0_route", + "extent": null, + "scale": 0.2, + "precision": 0.001, + "max_containing_size": 15, + "neighbor_degree": 1, + "step0_route": "structured" + } + ], + "static": { + "control": { + "extent_half_width": [ + 9.9, + 9.9 + ], + "limits": [ + -9.9, + 9.9, + -9.9, + 9.9 + ], + "scale": 0.2, + "pixel_scale_precision": 0.001, + "n_steps": 8, + "n_steps_formula": "ceil(log2(0.2 / 0.001))", + "last_step_triangle_side": 0.0015625, + "step0_triangles": 23283, + "step0_rows": 11859, + "max_containing_size": 15, + "neighbor_degree": 1, + "step0_route": "library default (structured)" + }, + "step0_gather": { + "extent_half_width": [ + 9.9, + 9.9 + ], + "limits": [ + -9.9, + 9.9, + -9.9, + 9.9 + ], + "scale": 0.2, + "pixel_scale_precision": 0.001, + "n_steps": 8, + "n_steps_formula": "ceil(log2(0.2 / 0.001))", + "last_step_triangle_side": 0.0015625, + "step0_triangles": 23283, + "step0_rows": 11859, + "max_containing_size": 15, + "neighbor_degree": 1, + "step0_route": "gather" + }, + "step0_components": { + "extent_half_width": [ + 9.9, + 9.9 + ], + "limits": [ + -9.9, + 9.9, + -9.9, + 9.9 + ], + "scale": 0.2, + "pixel_scale_precision": 0.001, + "n_steps": 8, + "n_steps_formula": "ceil(log2(0.2 / 0.001))", + "last_step_triangle_side": 0.0015625, + "step0_triangles": 23283, + "step0_rows": 11859, + "max_containing_size": 15, + "neighbor_degree": 1, + "step0_route": "components" + }, + "step0_structured": { + "extent_half_width": [ + 9.9, + 9.9 + ], + "limits": [ + -9.9, + 9.9, + -9.9, + 9.9 + ], + "scale": 0.2, + "pixel_scale_precision": 0.001, + "n_steps": 8, + "n_steps_formula": "ceil(log2(0.2 / 0.001))", + "last_step_triangle_side": 0.0015625, + "step0_triangles": 23283, + "step0_rows": 11859, + "max_containing_size": 15, + "neighbor_degree": 1, + "step0_route": "structured" + }, + "reference": { + "extent_half_width": [ + 12.0, + 12.0 + ], + "limits": [ + -12.0, + 12.0, + -12.0, + 12.0 + ], + "scale": 0.05, + "pixel_scale_precision": 0.0001, + "n_steps": 9, + "n_steps_formula": "ceil(log2(0.05 / 0.0001))", + "last_step_triangle_side": 0.0001953125, + "step0_triangles": 535277, + "step0_rows": 268677, + "max_containing_size": 60, + "neighbor_degree": 1, + "step0_route": "library default (structured)" + }, + "reference_b": { + "extent_half_width": [ + 11.0, + 11.0 + ], + "limits": [ + -11.0, + 11.0, + -11.0, + 11.0 + ], + "scale": 0.07, + "pixel_scale_precision": 0.0001, + "n_steps": 10, + "n_steps_formula": "ceil(log2(0.07 / 0.0001))", + "last_step_triangle_side": 0.00013671875, + "step0_triangles": 229585, + "step0_rows": 115473, + "max_containing_size": 60, + "neighbor_degree": 1, + "step0_route": "library default (structured)" + } + }, + "reference_floor": { + "prior": { + "n_draws": 200, + "multiplicity_agreement": 1.0, + "raw_count_agreement": 1.0, + "n_multiplicity_mismatch": 0, + "mismatch_examples": [], + "max_position_error": 0.0001578692142314068, + "p99_position_error": 0.0001280749711778143, + "median_position_error": 5.966895436149997e-05, + "ref_distinct_histogram": { + "2": 21, + "4": 179 + }, + "abs_delta_logl_vs_reference": { + "max": 0.09204751533957278, + "p99": 0.06845503627316349, + "median": 0.004628222675297167, + "n_nonfinite_mismatch": 0 + } + }, + "stress": { + "n_draws": 200, + "multiplicity_agreement": 1.0, + "raw_count_agreement": 1.0, + "n_multiplicity_mismatch": 0, + "mismatch_examples": [], + "max_position_error": 0.00015786921423129578, + "p99_position_error": 0.00014084184669768283, + "median_position_error": 5.966895436134919e-05, + "ref_distinct_histogram": { + "2": 163, + "4": 37 + } + } + }, + "reference_max_finite_positions": { + "prior": 4, + "stress": 4 + }, + "reference_compile": { + "reference_prior": { + "lower_s": 8.763231606018962, + "compile_s": 9.803126472979784, + "first_call_s": 0.018836133007425815, + "traced_rows_per_step": [ + 268677, + 2880, + 2880, + 2880, + 2880, + 2880, + 2880, + 2880, + 2880, + 268677, + 2880, + 2880, + 2880, + 2880, + 2880, + 2880, + 2880, + 2880, + 268677, + 2880, + 2880, + 2880, + 2880, + 2880, + 2880, + 2880, + 2880 + ], + "output_shapes": [ + [], + [ + 60, + 2 + ] + ], + "flops": 51715080.0, + "memory_analysis": { + "argument_size_in_bytes": 40, + "output_size_in_bytes": 984, + "temp_size_in_bytes": 8609360, + "alias_size_in_bytes": 0, + "generated_code_size_in_bytes": 12869616, + "host_temp_size_in_bytes": 0 + }, + "rss_delta_bytes": 418983936, + "max_containing_size_proof": { + "positions_shape": [ + 60, + 2 + ], + "expected_rows": 60, + "pass": true + } + }, + "reference_stress": { + "lower_s": 1.7778689689876046, + "compile_s": 4.2338678399974015, + "first_call_s": 0.014639233006164432, + "traced_rows_per_step": [ + 268677, + 2880, + 2880, + 2880, + 2880, + 2880, + 2880, + 2880, + 2880 + ], + "output_shapes": [ + [ + 60, + 2 + ] + ], + "flops": 51709944.0, + "memory_analysis": { + "argument_size_in_bytes": 64, + "output_size_in_bytes": 960, + "temp_size_in_bytes": 8607056, + "alias_size_in_bytes": 0, + "generated_code_size_in_bytes": 12869232, + "host_temp_size_in_bytes": 0 + }, + "rss_delta_bytes": 26292224, + "max_containing_size_proof": { + "positions_shape": [ + 60, + 2 + ], + "expected_rows": 60, + "pass": true + } + }, + "reference_b_prior": { + "lower_s": 6.440029517019866, + "compile_s": 10.535469993017614, + "first_call_s": 0.01871165499323979, + "traced_rows_per_step": [ + 115473, + 2880, + 2880, + 2880, + 2880, + 2880, + 2880, + 2880, + 2880, + 2880, + 115473, + 2880, + 2880, + 2880, + 2880, + 2880, + 2880, + 2880, + 2880, + 2880, + 115473, + 2880, + 2880, + 2880, + 2880, + 2880, + 2880, + 2880, + 2880, + 2880 + ], + "output_shapes": [ + [], + [ + 60, + 2 + ] + ], + "flops": 23815908.0, + "memory_analysis": { + "argument_size_in_bytes": 40, + "output_size_in_bytes": 984, + "temp_size_in_bytes": 3706200, + "alias_size_in_bytes": 0, + "generated_code_size_in_bytes": 5527648, + "host_temp_size_in_bytes": 0 + }, + "rss_delta_bytes": 77582336, + "max_containing_size_proof": { + "positions_shape": [ + 60, + 2 + ], + "expected_rows": 60, + "pass": true + } + }, + "reference_b_stress": { + "lower_s": 1.4927302100113593, + "compile_s": 4.915731057000812, + "first_call_s": 0.014642644993728027, + "traced_rows_per_step": [ + 115473, + 2880, + 2880, + 2880, + 2880, + 2880, + 2880, + 2880, + 2880, + 2880 + ], + "output_shapes": [ + [ + 60, + 2 + ] + ], + "flops": 23810776.0, + "memory_analysis": { + "argument_size_in_bytes": 64, + "output_size_in_bytes": 960, + "temp_size_in_bytes": 3704920, + "alias_size_in_bytes": 0, + "generated_code_size_in_bytes": 5527520, + "host_temp_size_in_bytes": 0 + }, + "rss_delta_bytes": 4014080, + "max_containing_size_proof": { + "positions_shape": [ + 60, + 2 + ], + "expected_rows": 60, + "pass": true + } + } + }, + "default_vs_reference": { + "prior": { + "n_draws": 200, + "multiplicity_agreement": 1.0, + "raw_count_agreement": 1.0, + "n_multiplicity_mismatch": 0, + "mismatch_examples": [], + "max_position_error": 0.00085134744991033, + "p99_position_error": 0.0007893460711577928, + "median_position_error": 0.00040657539052049664, + "ref_distinct_histogram": { + "2": 21, + "4": 179 + }, + "abs_delta_logl_vs_reference": { + "max": 0.8682473458375171, + "p99": 0.5684387609119508, + "median": 0.030920850414811074, + "n_nonfinite_mismatch": 0 + }, + "abs_delta_logl_vs_control": { + "max": 0.0, + "p99": 0.0, + "median": 0.0, + "n_nonfinite_mismatch": 0 + } + }, + "stress": { + "n_draws": 200, + "multiplicity_agreement": 1.0, + "raw_count_agreement": 1.0, + "n_multiplicity_mismatch": 0, + "mismatch_examples": [], + "max_position_error": 0.0007893460711581035, + "p99_position_error": 0.0007893460711577219, + "median_position_error": 0.0004065753905207064, + "ref_distinct_histogram": { + "2": 163, + "4": 37 + } + }, + "agrees_on_every_prior_draw": true, + "agrees_on_every_stress_draw": true, + "stress_mismatch_examples": [] + }, + "admissibility": { + "control": true, + "step0_gather": true, + "step0_components": true, + "step0_structured": true + }, + "precision_equivalent": { + "control": true, + "step0_gather": true, + "step0_components": true, + "step0_structured": true + }, + "reference_image_extent": { + "prior": { + "max_abs_y": 1.77939453125, + "max_abs_x": 1.7773254429359935, + "max_abs_coord": 1.77939453125, + "p99_abs_coord": 1.759083091412917, + "max_radius": 1.8116226317743076 + }, + "stress": { + "max_abs_y": 2.2498046875, + "max_abs_x": 2.300267215077964, + "max_abs_coord": 2.300267215077964, + "p99_abs_coord": 2.2027852305644777, + "max_radius": 2.5191249773380773 + } + }, + "extent_working": "prior: theta_E <= 1.6 + 4*0.05 = 1.8; |e| <= 0.0526 + 4*0.01 ~ 0.09 -> q ~ 0.83; SIE images lie within ~theta_E/sqrt(q) + |beta| ~ 1.98 + 0.1 ~ 2.1 arcsec of the centre, so boxes of +-6 / +-4 / +-3 / +-2.5 bracket it; reference_image_extent is the measured value", + "best_admissible": "step0_gather", + "best_admissible_any_precision": "step0_gather", + "table": [ + { + "config": "control", + "block": "control", + "extent": 9.9, + "scale": 0.2, + "precision": 0.001, + "mcs": 15, + "neighbor_degree": 1, + "n_steps": 8, + "step0_rows": 11859, + "step0_triangles": 23283, + "median_ms": 0.83765501040034, + "speedup": 1.0, + "speedup_ci90": [ + 0.9959325710740744, + 1.0039575889655354 + ], + "admissible": true, + "precision_equivalent": true, + "last_step_triangle_side": 0.0015625, + "prior_multiplicity_agreement": 1.0, + "prior_raw_count_agreement": 1.0, + "prior_max_err": 0.00085134744991033, + "prior_p99_err": 0.0007893460711577928, + "prior_abs_dlogl_ref_max": 0.8682473458375171, + "prior_abs_dlogl_control_max": 0.0, + "stress_multiplicity_agreement": 1.0, + "stress_max_err": 0.0007893460711581035, + "compile_s": 5.510965514025884, + "flops": 2787435.0, + "temp_bytes": 390472 + }, + { + "config": "step0_gather", + "block": "step0_route", + "extent": 9.9, + "scale": 0.2, + "precision": 0.001, + "mcs": 15, + "neighbor_degree": 1, + "n_steps": 8, + "step0_rows": 11859, + "step0_triangles": 23283, + "median_ms": 0.8374445023946464, + "speedup": 1.0002513694998196, + "speedup_ci90": [ + 0.996329114275808, + 1.0041380217034832 + ], + "admissible": true, + "precision_equivalent": true, + "last_step_triangle_side": 0.0015625, + "prior_multiplicity_agreement": 1.0, + "prior_raw_count_agreement": 1.0, + "prior_max_err": 0.00085134744991033, + "prior_p99_err": 0.0007893460711577928, + "prior_abs_dlogl_ref_max": 0.8682473458375171, + "prior_abs_dlogl_control_max": 0.0, + "stress_multiplicity_agreement": 1.0, + "stress_max_err": 0.0007893460711581035, + "compile_s": 5.54681887399056, + "flops": 3066830.0, + "temp_bytes": 389704 + }, + { + "config": "step0_components", + "block": "step0_route", + "extent": 9.9, + "scale": 0.2, + "precision": 0.001, + "mcs": 15, + "neighbor_degree": 1, + "n_steps": 8, + "step0_rows": 11859, + "step0_triangles": 23283, + "median_ms": 0.8385800028918311, + "speedup": 0.998896953792958, + "speedup_ci90": [ + 0.9957632747405274, + 1.0025965713954643 + ], + "admissible": true, + "precision_equivalent": true, + "last_step_triangle_side": 0.0015625, + "prior_multiplicity_agreement": 1.0, + "prior_raw_count_agreement": 1.0, + "prior_max_err": 0.00085134744991033, + "prior_p99_err": 0.0007893460711577928, + "prior_abs_dlogl_ref_max": 0.8682473458375171, + "prior_abs_dlogl_control_max": 0.0, + "stress_multiplicity_agreement": 1.0, + "stress_max_err": 0.0007893460711581035, + "compile_s": 5.648363950982457, + "flops": 2787434.0, + "temp_bytes": 389960 + }, + { + "config": "step0_structured", + "block": "step0_route", + "extent": 9.9, + "scale": 0.2, + "precision": 0.001, + "mcs": 15, + "neighbor_degree": 1, + "n_steps": 8, + "step0_rows": 11859, + "step0_triangles": 23283, + "median_ms": 0.8381294901482761, + "speedup": 0.9994338825282807, + "speedup_ci90": [ + 0.9952739001170396, + 1.0029508460025336 + ], + "admissible": true, + "precision_equivalent": true, + "last_step_triangle_side": 0.0015625, + "prior_multiplicity_agreement": 1.0, + "prior_raw_count_agreement": 1.0, + "prior_max_err": 0.00085134744991033, + "prior_p99_err": 0.0007893460711577928, + "prior_abs_dlogl_ref_max": 0.8682473458375171, + "prior_abs_dlogl_control_max": 0.0, + "stress_multiplicity_agreement": 1.0, + "stress_max_err": 0.0007893460711581035, + "compile_s": 5.72994618001394, + "flops": 2787435.0, + "temp_bytes": 390472 + } + ], + "rows": { + "control": { + "config": { + "name": "control", + "block": "control", + "extent": null, + "scale": 0.2, + "precision": 0.001, + "max_containing_size": 15, + "neighbor_degree": 1, + "step0_route": null + }, + "static": { + "extent_half_width": [ + 9.9, + 9.9 + ], + "limits": [ + -9.9, + 9.9, + -9.9, + 9.9 + ], + "scale": 0.2, + "pixel_scale_precision": 0.001, + "n_steps": 8, + "n_steps_formula": "ceil(log2(0.2 / 0.001))", + "last_step_triangle_side": 0.0015625, + "step0_triangles": 23283, + "step0_rows": 11859, + "max_containing_size": 15, + "neighbor_degree": 1, + "step0_route": "library default (structured)" + }, + "stats": { + "n": 400, + "median_ms": 0.83765501040034, + "p10_ms": 0.8213600929593667, + "p90_ms": 0.9404880867805332, + "min_ms": 0.8096590172499418, + "max_ms": 1.5494510007556528, + "mean_ms": 0.8628866681829095 + }, + "speedup_vs_control": { + "ratio": 1.0, + "ci90_low": 0.9959325710740744, + "ci90_high": 1.0039575889655354, + "bootstrap_samples": 2000 + }, + "paired_round_speedup": { + "median": 1.0, + "p10": 1.0, + "p90": 1.0 + }, + "compile": { + "lower_s": 2.6268497959827073, + "compile_s": 5.510965514025884, + "first_call_s": 0.01229522199719213, + "traced_rows_per_step": [ + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720, + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720 + ], + "output_shapes": [ + [] + ], + "flops": 2787435.0, + "memory_analysis": { + "argument_size_in_bytes": 40, + "output_size_in_bytes": 8, + "temp_size_in_bytes": 390472, + "alias_size_in_bytes": 0, + "generated_code_size_in_bytes": 568256, + "host_temp_size_in_bytes": 0 + }, + "rss_delta_bytes": 4042752, + "max_containing_size_proof": null + }, + "warm_ms": [ + 12.176844000350684, + 1.0756269912235439, + 0.9216390026267618 + ], + "per_call_ms": [ + 1.0360869928263128, + 1.481501996750012, + 0.9500390151515603, + 0.9498079889453948, + 0.9404179872944951, + 0.9631590219214559, + 0.950128014665097, + 0.942237995332107, + 0.9619990014471114, + 0.9654579916968942, + 0.9428900084458292, + 0.9365890000481158, + 0.9601879864931107, + 0.9447690099477768, + 0.978858006419614, + 0.9374679939355701, + 0.941118982154876, + 0.9658979834057391, + 0.9494179976172745, + 0.9595690062269568, + 1.0221170086879283, + 0.8656489953864366, + 0.8608500065747648, + 0.8370889991056174, + 0.8961889834608883, + 0.8704790088813752, + 0.8592309895902872, + 0.8497599919792265, + 0.8356700127478689, + 0.8583800226915628, + 0.8527089958079159, + 0.8410500013269484, + 0.8497090020682663, + 0.8460509998258203, + 0.8442789840046316, + 0.8392689924221486, + 0.8346399990841746, + 1.0465170198585838, + 0.8592510130256414, + 0.8526699966751039, + 0.8779990021139383, + 0.8430999878328294, + 0.8617689891252667, + 0.8385200053453445, + 1.158255006885156, + 0.8638290164526552, + 1.156826998339966, + 0.8520900155417621, + 0.8430900052189827, + 0.8361389918718487, + 0.8525589946657419, + 0.8666400099173188, + 0.8477089868392795, + 0.8714800060261041, + 1.5410110063385218, + 0.8721990161575377, + 0.8466909930575639, + 0.9177490137517452, + 0.843518995679915, + 0.8587000193074346, + 0.8640190062578768, + 0.8777499897405505, + 0.8407789864577353, + 0.8584800234530121, + 0.8482290140818805, + 0.8343910158146173, + 0.8392400050070137, + 0.8333910082001239, + 0.8422590035479516, + 0.8566890028305352, + 0.8386909903492779, + 0.8684289932716638, + 0.8442699909210205, + 0.8337390027008951, + 0.910178991034627, + 0.8428090077359229, + 0.859778985613957, + 0.8604600152466446, + 0.8422090031672269, + 0.8479509851895273, + 0.8561399881727993, + 0.8604809991084039, + 0.8432190224993974, + 0.8519999973941594, + 0.8382590021938086, + 0.8358200138900429, + 0.8477189985569566, + 0.8417209901381284, + 0.8615400001872331, + 0.8596990082878619, + 0.8470299944747239, + 0.8451389730907977, + 0.8489209867548198, + 0.8476100047118962, + 0.8441300014965236, + 0.8438790100626647, + 0.8583989983890206, + 0.8357409969903529, + 0.8601990120951086, + 0.8499500108882785, + 1.140916021540761, + 0.8688299858476967, + 0.8574289968237281, + 0.8689200039952993, + 0.8626490016467869, + 0.8786700200289488, + 0.8828790159896016, + 0.85427999147214, + 0.8944699948187917, + 0.8539500122424215, + 0.8644709887448698, + 0.8400299993809313, + 0.836870982311666, + 0.8551790087949485, + 0.8507290040142834, + 0.836159975733608, + 0.8532700012437999, + 0.8282809867523611, + 0.8265500073321164, + 0.8299300097860396, + 0.8406609995290637, + 0.8176199917215854, + 0.8247299992945045, + 0.8203000179491937, + 0.8145099855028093, + 0.8216399874072522, + 0.8446600113529712, + 0.8315189916174859, + 0.8137800032272935, + 0.8178700227290392, + 0.8548189944121987, + 0.8186399936676025, + 0.8099999977275729, + 0.8139210112858564, + 0.824349990580231, + 0.8254800050053746, + 1.0827959922607988, + 0.815350009361282, + 0.8169010106939822, + 0.8393000171054155, + 0.8413699979428202, + 0.8356500184163451, + 0.8213699911721051, + 0.8382099913433194, + 0.8345200039912015, + 0.8115410164464265, + 0.8096590172499418, + 0.8249710081145167, + 0.8190000080503523, + 0.8123510051518679, + 0.8226489881053567, + 1.0658279934432358, + 0.8440709789283574, + 0.832240009913221, + 0.8123810112010688, + 0.8103789878077805, + 0.82835101056844, + 0.8201900054700673, + 0.8175510156434029, + 0.8383700042031705, + 0.8211500244215131, + 0.8271110127680004, + 0.8248189988080412, + 0.8336309983860701, + 0.8161199802998453, + 0.8361299987882376, + 0.8137400145642459, + 0.817849999293685, + 0.8154499810189009, + 0.8323710062541068, + 1.147975999629125, + 0.8183299796655774, + 0.8355210011359304, + 0.8163489983417094, + 0.8268509991466999, + 0.8278189925476909, + 0.8335699967574328, + 0.8358900086022913, + 0.8161900041159242, + 0.84863998927176, + 0.8733489958103746, + 0.826111005153507, + 0.8228399965446442, + 0.8343899971805513, + 0.8311099954880774, + 0.8256089931819588, + 0.8302810019813478, + 0.8276200096588582, + 0.8251899853348732, + 0.8257899899035692, + 0.8496200025547296, + 0.8433790062554181, + 0.8271299884654582, + 0.8372890006285161, + 0.835829006973654, + 0.827120995381847, + 0.8280399779323488, + 0.8282600028906018, + 0.8237099973484874, + 0.8380210201721638, + 0.8340310014318675, + 0.834630016470328, + 0.8305399969685823, + 0.8295600127894431, + 0.8478100062347949, + 0.846288981847465, + 0.8245799981523305, + 1.1495360231492668, + 1.3294130039867014, + 0.8367789851035923, + 0.8267810044344515, + 0.8273290004581213, + 0.8360299980267882, + 0.8256399887613952, + 1.0295980027876794, + 0.8280699839815497, + 0.8337390027008951, + 0.8533099899068475, + 0.8278699824586511, + 0.8283010101877153, + 0.8507989987265319, + 0.9269290021620691, + 0.823200010927394, + 0.8461799880024046, + 0.8340789936482906, + 0.832649995572865, + 0.8297199965454638, + 0.8275200088974088, + 0.8204510086216033, + 0.8280199836008251, + 0.844380003400147, + 0.8416390046477318, + 0.8206409984268248, + 0.8324099762830883, + 0.8365099783986807, + 0.8210010128095746, + 0.825029012048617, + 0.8330109994858503, + 0.9303079859819263, + 0.8434100018348545, + 0.8269099926110357, + 0.825850002001971, + 0.835451006423682, + 0.8452099864371121, + 0.842440000269562, + 0.8385609835386276, + 0.829850003356114, + 0.8288699900731444, + 0.8517690002918243, + 0.8557999972254038, + 0.8380600193049759, + 0.8581400034017861, + 0.9858280245680362, + 0.8967790054157376, + 0.834591017337516, + 0.844419002532959, + 0.885969988303259, + 0.8294699946418405, + 0.8744689985178411, + 0.8789999992586672, + 0.8611390076112002, + 0.8240499882958829, + 0.8360299980267882, + 0.8307590032927692, + 0.8213909750338644, + 0.8407100103795528, + 0.8468909945804626, + 0.8177300042007118, + 0.8288609969895333, + 0.8305300143547356, + 0.8225190103985369, + 0.8183890022337437, + 0.8270100224763155, + 0.8212710090447217, + 0.8317489991895854, + 0.8457600197289139, + 0.8407690038438886, + 1.0932470031548291, + 0.8461189863737673, + 0.836799998069182, + 0.823609996587038, + 0.8460299868602306, + 0.8462189871352166, + 0.8244110213126987, + 0.8233400003518909, + 0.8457509975414723, + 0.8236400026362389, + 0.8172700181603432, + 0.823159993160516, + 0.8281889895442873, + 0.8258410089183599, + 0.8264400239568204, + 0.8504310098942369, + 0.8206400088965893, + 0.8260099857579917, + 0.8607689815107733, + 1.17674600915052, + 0.8218010189011693, + 0.8467299921903759, + 0.8431110181845725, + 0.8332800061907619, + 0.8301499765366316, + 0.8252210100181401, + 0.8491490152664483, + 0.8454000053461641, + 0.8258399902842939, + 0.8533200016245246, + 0.8363999950233847, + 0.829770986456424, + 0.8228399965446442, + 0.833988975500688, + 0.827941024908796, + 0.8287800010293722, + 0.8478410018142313, + 0.8515289810020477, + 0.8299800101667643, + 0.8343989902641624, + 0.8283310162369162, + 0.922248000279069, + 0.8296690066345036, + 1.5494510007556528, + 0.8235900022555143, + 0.8277000160887837, + 0.8323790098074824, + 0.8246509823948145, + 1.002367993351072, + 0.8293400169350207, + 0.8343399967998266, + 0.9480190055910498, + 0.824540009489283, + 0.8292490092571825, + 0.826520990813151, + 0.8261589973699301, + 0.8464299899060279, + 0.8397689962293953, + 0.8215209818445146, + 0.8668890222907066, + 0.981779012363404, + 0.8318600011989474, + 0.8339890046045184, + 0.90827900567092, + 0.8810500148683786, + 0.8414989861194044, + 0.8288800017908216, + 0.8457599906250834, + 0.8461590041406453, + 0.8310409903060645, + 0.8351790020242333, + 0.8411500020883977, + 0.8228090009652078, + 0.8334910089615732, + 0.829399999929592, + 1.1732860002666712, + 0.8270999824162573, + 0.8338690095115453, + 0.842590001411736, + 0.8212490065488964, + 0.834960985230282, + 0.8248300000559539, + 0.8250499959103763, + 1.0061970097012818, + 0.8420599915552884, + 0.8247890218626708, + 0.8415899937972426, + 0.8273489947896451, + 0.8197310089599341, + 0.8167900086846203, + 0.8286800002679229, + 1.2161259946879, + 0.8308489923365414, + 0.8488410094287246, + 0.8238999871537089, + 0.8179510186892003, + 0.8303300128318369, + 0.8191889792215079, + 0.8216100104618818, + 0.8381600200664252, + 0.8402600069530308, + 0.8420099911745638, + 0.8336809987667948, + 0.8303399954456836, + 0.8237109868787229, + 0.8208490035030991, + 0.8344709931407124, + 0.8241600007750094, + 0.9677479974925518, + 0.8401109953410923, + 0.8303299837280065, + 0.8426810090895742, + 0.8448699954897165, + 0.8442509861197323, + 0.8517499954905361, + 0.823200010927394, + 0.8234900014940649, + 0.8238390146289021, + 0.8386510016862303, + 0.8409400179516524, + 0.8231400279328227, + 0.8274489955510944, + 0.826780975330621 + ], + "deterministic": true, + "fiducial_log_likelihood": 7.743201200876806, + "stream_log_likelihood": [ + 7.743201200876806, + -4.160952751390761, + 7.657972665309621, + 9.364550949057252, + 7.051561357429162, + 9.219327498422556, + 0.8907045816755392, + -34.37790701671691, + -24.578291065194456, + -0.4990240338966778, + 0.7025906917399034, + 7.669569297550706, + -0.46390116505282464, + -5.412376751794209, + 5.343244353415997, + -20.481275097418546 + ], + "admissible": true, + "completeness_prior": { + "n_draws": 200, + "multiplicity_agreement": 1.0, + "raw_count_agreement": 1.0, + "n_multiplicity_mismatch": 0, + "mismatch_examples": [], + "max_position_error": 0.00085134744991033, + "p99_position_error": 0.0007893460711577928, + "median_position_error": 0.00040657539052049664, + "ref_distinct_histogram": { + "2": 21, + "4": 179 + }, + "abs_delta_logl_vs_reference": { + "max": 0.8682473458375171, + "p99": 0.5684387609119508, + "median": 0.030920850414811074, + "n_nonfinite_mismatch": 0 + }, + "abs_delta_logl_vs_control": { + "max": 0.0, + "p99": 0.0, + "median": 0.0, + "n_nonfinite_mismatch": 0 + } + }, + "completeness_stress": { + "n_draws": 200, + "multiplicity_agreement": 1.0, + "raw_count_agreement": 1.0, + "n_multiplicity_mismatch": 0, + "mismatch_examples": [], + "max_position_error": 0.0007893460711581035, + "p99_position_error": 0.0007893460711577219, + "median_position_error": 0.0004065753905207064, + "ref_distinct_histogram": { + "2": 163, + "4": 37 + } + } + }, + "step0_gather": { + "config": { + "name": "step0_gather", + "block": "step0_route", + "extent": null, + "scale": 0.2, + "precision": 0.001, + "max_containing_size": 15, + "neighbor_degree": 1, + "step0_route": "gather" + }, + "static": { + "extent_half_width": [ + 9.9, + 9.9 + ], + "limits": [ + -9.9, + 9.9, + -9.9, + 9.9 + ], + "scale": 0.2, + "pixel_scale_precision": 0.001, + "n_steps": 8, + "n_steps_formula": "ceil(log2(0.2 / 0.001))", + "last_step_triangle_side": 0.0015625, + "step0_triangles": 23283, + "step0_rows": 11859, + "max_containing_size": 15, + "neighbor_degree": 1, + "step0_route": "gather" + }, + "stats": { + "n": 400, + "median_ms": 0.8374445023946464, + "p10_ms": 0.8191139990231022, + "p90_ms": 0.903601897880435, + "min_ms": 0.809110002592206, + "max_ms": 1.6034409927669913, + "mean_ms": 0.8581692949519493 + }, + "speedup_vs_control": { + "ratio": 1.0002513694998196, + "ci90_low": 0.996329114275808, + "ci90_high": 1.0041380217034832, + "bootstrap_samples": 2000 + }, + "paired_round_speedup": { + "median": 1.0017047202584544, + "p10": 0.9953258013712701, + "p90": 1.0151202245709903 + }, + "compile": { + "lower_s": 2.5812834140087944, + "compile_s": 5.54681887399056, + "first_call_s": 0.012314492021687329, + "traced_rows_per_step": [ + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720, + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720 + ], + "output_shapes": [ + [] + ], + "flops": 3066830.0, + "memory_analysis": { + "argument_size_in_bytes": 40, + "output_size_in_bytes": 8, + "temp_size_in_bytes": 389704, + "alias_size_in_bytes": 0, + "generated_code_size_in_bytes": 1127048, + "host_temp_size_in_bytes": 0 + }, + "rss_delta_bytes": 262144, + "max_containing_size_proof": null + }, + "warm_ms": [ + 2.369630994508043, + 0.913469004444778, + 0.9067989885807037 + ], + "per_call_ms": [ + 1.6034409927669913, + 0.9203680092468858, + 0.9586680098436773, + 0.9600489865988493, + 0.9466590126976371, + 0.9344499849248677, + 0.9307099971920252, + 0.9478580032009631, + 0.9432189981453121, + 0.962718011578545, + 0.903378997463733, + 0.9261090017389506, + 0.9164990042336285, + 0.8996689866762608, + 0.9011999936774373, + 0.9149579855147749, + 0.8997390104923397, + 0.8980690035969019, + 0.8902999979909509, + 0.8930900075938553, + 0.9109590027946979, + 0.859480001963675, + 0.9816189995035529, + 0.8826389966998249, + 0.8664900087751448, + 0.8624790061730891, + 0.8687989902682602, + 0.8627100032754242, + 0.8872089965734631, + 0.869679992320016, + 0.8661889878567308, + 0.8631199889350682, + 0.8860389934852719, + 0.8596699917688966, + 0.8903899870347232, + 0.8680690079927444, + 0.8665499917697161, + 0.8908479940146208, + 0.8711400150787085, + 1.1020770180039108, + 0.934357987716794, + 0.8569510246161371, + 0.8445499988738447, + 0.8460899989586323, + 0.8365289831999689, + 0.8358790073543787, + 0.8528400212526321, + 0.8328190015163273, + 0.8438499935436994, + 0.8543490257579833, + 0.8351209980901331, + 0.842139997985214, + 1.0944779787678272, + 0.8354309829883277, + 0.8736089803278446, + 0.8439199882559478, + 0.8339399937540293, + 0.8410109730903059, + 0.8418700017500669, + 0.84374999278225, + 0.8572499791625887, + 0.8408200228586793, + 0.9415280073881149, + 0.8687690133228898, + 0.8524600125383586, + 0.8552900108043104, + 0.8456409850623459, + 0.8463189878966659, + 0.8407100103795528, + 0.8389389840885997, + 0.8618189895059913, + 0.8610200020484626, + 0.8474299975205213, + 0.8523300057277083, + 0.8409490110352635, + 0.8465699793305248, + 0.8431189926341176, + 0.8382890082430094, + 0.8605890034232289, + 0.8563890005461872, + 0.9186879906337708, + 0.8497599919792265, + 0.8630590164102614, + 0.8627990027889609, + 0.8390499860979617, + 1.2497150164563209, + 0.840240012621507, + 0.8606210176367313, + 0.8427299908362329, + 0.8432909962721169, + 0.857609004015103, + 0.8405910048168153, + 0.8452300098724663, + 0.8308210235554725, + 0.8601699955761433, + 0.8570690115448087, + 0.8410599839407951, + 0.8451190078631043, + 1.1260560131631792, + 0.8403800020460039, + 0.8710389956831932, + 0.8374699973501265, + 0.8339290216099471, + 0.8418709912803024, + 0.838890002341941, + 0.8543390140403062, + 0.8554210071451962, + 0.842929002828896, + 0.8416709897574037, + 0.8279700123239309, + 0.8437609940301627, + 0.8443389961030334, + 0.8413710165768862, + 0.8518389950040728, + 0.8346789982169867, + 0.8485500002279878, + 0.8668389928061515, + 0.84113102639094, + 0.8431690221186727, + 0.8385399996768683, + 1.0904569935519248, + 0.8151300135068595, + 1.0499979835003614, + 0.8208710059989244, + 1.205405016662553, + 0.812020996818319, + 0.8138499979395419, + 0.8360210049431771, + 0.8307899988722056, + 0.8154799870681018, + 0.8396499906666577, + 0.8276199805550277, + 0.8110610069707036, + 0.809110002592206, + 0.8394009782932699, + 0.8169400098267943, + 0.8098910038825125, + 0.8110589988064021, + 0.8349909912794828, + 0.8315499871969223, + 0.8220089948736131, + 0.8152799855452031, + 0.8580790017731488, + 0.8180209842976183, + 0.8111589995678514, + 0.8279109897557646, + 0.810900004580617, + 0.8493610075674951, + 0.8261400216724724, + 0.8285089861601591, + 0.8276299922727048, + 0.8306700037792325, + 0.8206909988075495, + 0.8164900064002723, + 0.8367300033569336, + 0.8247700170613825, + 0.8168600033968687, + 0.8360400097444654, + 0.8357810147572309, + 0.8149099885486066, + 0.8234090055339038, + 0.8171800000127405, + 0.8142900187522173, + 0.8201199816539884, + 0.8098000253085047, + 1.087326993001625, + 0.8128590125124902, + 0.8479889947921038, + 0.8240110182669014, + 0.8116499811876565, + 0.8414000039920211, + 0.8154200040735304, + 0.815870997030288, + 0.8136200194712728, + 0.8358310151379555, + 0.8374190074391663, + 0.8207499922718853, + 0.8156799885910004, + 0.8343099907506257, + 0.8225600176956505, + 1.468343019951135, + 0.8273590065073222, + 0.8357389888260514, + 0.8541599963791668, + 0.8203200122807175, + 0.8366309921257198, + 0.8329999982379377, + 0.8272900013253093, + 0.8455289935227484, + 0.8420110098086298, + 0.8246199868153781, + 0.82154999836348, + 0.8346799877472222, + 0.824949995148927, + 0.8224909834098071, + 0.8235790010076016, + 0.8430599991697818, + 0.8263800118584186, + 1.101948000723496, + 0.8547089819330722, + 0.8419689838774502, + 0.8301310008391738, + 0.8486599836032838, + 0.9335590002592653, + 0.8335390011779964, + 0.8532089996151626, + 0.8322299981955439, + 0.8398190257139504, + 0.8254900167230517, + 0.8225800120271742, + 0.8205900085158646, + 0.8442500256933272, + 0.8377310005016625, + 0.8218300063163042, + 0.8321489731315523, + 0.841878994833678, + 0.8181800076272339, + 0.821770983748138, + 0.8339689811691642, + 0.8227310026995838, + 0.8265390060842037, + 1.2914050021208823, + 0.8360109932255, + 0.8233000116888434, + 0.8554499945603311, + 0.8371090225409716, + 0.8267310040537268, + 0.8429699810221791, + 0.8339400228578597, + 0.8264100179076195, + 0.8207189966924489, + 0.8310510020237416, + 0.8236599969677627, + 0.8229099912568927, + 0.8504590077791363, + 0.842030014609918, + 0.8232799882534891, + 0.8309400000143796, + 0.8279999892693013, + 0.9056080016307533, + 0.8427290013059974, + 0.8206509810406715, + 0.8191899978555739, + 0.84165099542588, + 0.846290000481531, + 0.8228099904954433, + 0.8268000092357397, + 0.8484499994665384, + 0.8286400116048753, + 0.8225300116464496, + 0.8358400082215667, + 1.2481640151236206, + 0.830889999633655, + 0.839079002616927, + 0.8237400033976883, + 0.8538500114809722, + 0.8348890114575624, + 0.8244510099757463, + 0.8259289897978306, + 0.8465299906674773, + 0.8303810027427971, + 0.8450799796264619, + 1.1342259822413325, + 0.8251100080087781, + 0.826859992230311, + 0.8488610037602484, + 0.8440490055363625, + 0.82196100265719, + 0.8493789937347174, + 0.8290490077342838, + 0.819350010715425, + 0.8214600093197078, + 0.8396499906666577, + 0.8200790034607053, + 0.8209109946619719, + 0.8462689875159413, + 0.8379609789699316, + 0.8232500113081187, + 0.8513999928254634, + 0.8309199765790254, + 0.8720489859115332, + 0.8295710140373558, + 0.8195300179067999, + 0.8174499962478876, + 0.8276500157080591, + 0.8426189888268709, + 0.8195909904316068, + 0.8430099987890571, + 0.8407509885728359, + 0.8192189852707088, + 0.8199909934774041, + 0.8377800113521516, + 0.8283209754154086, + 0.81691998639144, + 0.8127799956128001, + 0.8565699972677976, + 0.8217889990191907, + 1.1492070043459535, + 0.8343599911313504, + 0.8387110137846321, + 0.8241210016421974, + 0.823008973384276, + 0.8504110155627131, + 0.8443290134891868, + 0.9957180009223521, + 0.8298300090245903, + 0.8254109998233616, + 0.8228289952967316, + 0.8284090145025402, + 0.8222010219469666, + 0.99200799013488, + 0.8246710058301687, + 0.8666689973324537, + 0.8323600050061941, + 0.8248800004366785, + 0.8309599943459034, + 0.8274310093838722, + 0.825029012048617, + 0.8441499958280474, + 0.840390013763681, + 0.8587999909650534, + 0.8469989988952875, + 0.8269600220955908, + 0.8390589791815728, + 1.1930270120501518, + 0.827080977614969, + 0.8438400109298527, + 0.8413000032305717, + 0.8243189950007945, + 0.8458999800495803, + 0.8363990054931492, + 0.8176009869202971, + 0.8234999841079116, + 0.8315600280184299, + 0.8260899921879172, + 0.8241499890573323, + 0.8554909727536142, + 0.8430799935013056, + 0.8224899938795716, + 0.8312989957630634, + 0.8337300096172839, + 0.8312510035466403, + 0.824688991997391, + 0.8195409900508821, + 0.824349990580231, + 0.8206299971789122, + 0.8289809920825064, + 0.846178998472169, + 0.8401800005231053, + 0.8248990052379668, + 0.841689994558692, + 0.8377990161534399, + 0.8216910064220428, + 0.8251090184785426, + 0.8173399837687612, + 0.8214399858843535, + 0.8452190086245537, + 1.0620479879435152, + 0.8403889951296151, + 0.820730987470597, + 0.849019008455798, + 0.8182000019587576, + 0.8199200092349201, + 0.8339300111401826, + 0.8280399779323488, + 0.8271989936474711, + 0.8200200099963695, + 0.8396789780817926, + 0.8368600101675838, + 0.8211200183723122, + 0.8244410273618996, + 0.9564580104779452, + 0.8167409978341311, + 0.8178399875760078, + 0.8318600011989474, + 0.8322599751409143, + 0.8216299756895751, + 0.8396699849981815, + 0.8429399749729782, + 0.81808099639602, + 0.8418599900323898, + 0.8274709980469197, + 0.8295690058730543, + 0.8202799945138395, + 0.8413699979428202, + 0.8431890164501965, + 0.8165510080289096, + 0.8167700143530965, + 0.8238509763032198, + 0.8419700025115162, + 0.8181700250133872, + 0.8275090076494962, + 0.8286309894174337, + 0.8182690071407706, + 0.8247499936260283, + 0.8184300095308572, + 0.9645380196161568, + 0.8281299960799515, + 0.8730789995752275, + 0.8339000050909817 + ], + "deterministic": true, + "fiducial_log_likelihood": 7.743201200876806, + "stream_log_likelihood": [ + 7.743201200876806, + -4.160952751390761, + 7.657972665309621, + 9.364550949057252, + 7.051561357429162, + 9.219327498422556, + 0.8907045816755392, + -34.37790701671691, + -24.578291065194456, + -0.4990240338966778, + 0.7025906917399034, + 7.669569297550706, + -0.46390116505282464, + -5.412376751794209, + 5.343244353415997, + -20.481275097418546 + ], + "admissible": true, + "completeness_prior": { + "n_draws": 200, + "multiplicity_agreement": 1.0, + "raw_count_agreement": 1.0, + "n_multiplicity_mismatch": 0, + "mismatch_examples": [], + "max_position_error": 0.00085134744991033, + "p99_position_error": 0.0007893460711577928, + "median_position_error": 0.00040657539052049664, + "ref_distinct_histogram": { + "2": 21, + "4": 179 + }, + "abs_delta_logl_vs_reference": { + "max": 0.8682473458375171, + "p99": 0.5684387609119508, + "median": 0.030920850414811074, + "n_nonfinite_mismatch": 0 + }, + "abs_delta_logl_vs_control": { + "max": 0.0, + "p99": 0.0, + "median": 0.0, + "n_nonfinite_mismatch": 0 + } + }, + "completeness_stress": { + "n_draws": 200, + "multiplicity_agreement": 1.0, + "raw_count_agreement": 1.0, + "n_multiplicity_mismatch": 0, + "mismatch_examples": [], + "max_position_error": 0.0007893460711581035, + "p99_position_error": 0.0007893460711577219, + "median_position_error": 0.0004065753905207064, + "ref_distinct_histogram": { + "2": 163, + "4": 37 + } + } + }, + "step0_components": { + "config": { + "name": "step0_components", + "block": "step0_route", + "extent": null, + "scale": 0.2, + "precision": 0.001, + "max_containing_size": 15, + "neighbor_degree": 1, + "step0_route": "components" + }, + "static": { + "extent_half_width": [ + 9.9, + 9.9 + ], + "limits": [ + -9.9, + 9.9, + -9.9, + 9.9 + ], + "scale": 0.2, + "pixel_scale_precision": 0.001, + "n_steps": 8, + "n_steps_formula": "ceil(log2(0.2 / 0.001))", + "last_step_triangle_side": 0.0015625, + "step0_triangles": 23283, + "step0_rows": 11859, + "max_containing_size": 15, + "neighbor_degree": 1, + "step0_route": "components" + }, + "stats": { + "n": 400, + "median_ms": 0.8385800028918311, + "p10_ms": 0.8199548959964886, + "p90_ms": 0.8959699014667422, + "min_ms": 0.807090982561931, + "max_ms": 1.4753630093764514, + "mean_ms": 0.8566193807928357 + }, + "speedup_vs_control": { + "ratio": 0.998896953792958, + "ci90_low": 0.9957632747405274, + "ci90_high": 1.0025965713954643, + "bootstrap_samples": 2000 + }, + "paired_round_speedup": { + "median": 1.0028574255405651, + "p10": 0.9894803345222816, + "p90": 1.0186321177807776 + }, + "compile": { + "lower_s": 2.581703657982871, + "compile_s": 5.648363950982457, + "first_call_s": 0.013408889004494995, + "traced_rows_per_step": [ + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720, + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720 + ], + "output_shapes": [ + [] + ], + "flops": 2787434.0, + "memory_analysis": { + "argument_size_in_bytes": 40, + "output_size_in_bytes": 8, + "temp_size_in_bytes": 389960, + "alias_size_in_bytes": 0, + "generated_code_size_in_bytes": 847652, + "host_temp_size_in_bytes": 0 + }, + "rss_delta_bytes": 7684096, + "max_containing_size_proof": null + }, + "warm_ms": [ + 2.550399018218741, + 0.9462489979341626, + 0.9139990143012255 + ], + "per_call_ms": [ + 1.4569019840564579, + 0.9035589755512774, + 0.9154999861493707, + 0.9076380229089409, + 0.8999900019261986, + 0.9004189923871309, + 0.9224090026691556, + 0.9220100182574242, + 0.9105780045501888, + 0.9380090050399303, + 0.8919299871195108, + 0.9025190083775669, + 0.9110590035561472, + 0.8969679765868932, + 0.8927590097300708, + 0.890490016900003, + 0.880889012478292, + 0.8676500001456589, + 0.8929289760999382, + 0.8734699804335833, + 0.9047490020748228, + 0.8789400162640959, + 0.8717890013940632, + 0.8596390252932906, + 0.8584499882999808, + 0.8866290154401213, + 0.8639009902253747, + 0.8874089980963618, + 0.8820700168143958, + 0.8628190262243152, + 0.8671489777043462, + 0.8812299929559231, + 0.8884889830369502, + 0.8612810051999986, + 0.8958590042311698, + 0.8562199946027249, + 0.8676290162838995, + 0.8566190081182867, + 0.8818499918561429, + 0.8599889988545328, + 0.8739999902900308, + 0.8386900008190423, + 1.060237002093345, + 0.8610410150140524, + 0.8389199792873114, + 0.8438399818260223, + 0.8428489963989705, + 0.8371290168724954, + 0.8571200014557689, + 0.8570099889766425, + 0.8325600065290928, + 0.8454790222458541, + 0.8476799994241446, + 0.8392700110562146, + 0.836828985484317, + 0.8282689959742129, + 0.8575890096835792, + 0.8492199995089322, + 0.8435400086455047, + 0.851589982630685, + 0.9295400232076645, + 0.8424799889326096, + 0.8338610059581697, + 0.8376799814868718, + 0.8401900122407824, + 0.86167998961173, + 0.8583400049246848, + 0.8475199865642935, + 0.8472090121358633, + 0.8387900015804917, + 0.8396290068048984, + 0.8373900200240314, + 0.834588980069384, + 0.8566690084990114, + 0.8579000132158399, + 0.8399499929510057, + 0.8423610124737024, + 0.830000004498288, + 0.8385810069739819, + 0.8373199962079525, + 0.8912289922591299, + 0.8357909973710775, + 0.9699880029074848, + 0.8608000061940402, + 0.841169006889686, + 0.8386390109080821, + 0.864218978676945, + 0.8416989876423031, + 0.8549499907530844, + 0.8545599994249642, + 0.839599990285933, + 0.8448389999102801, + 0.8424499828834087, + 0.8591889927629381, + 0.8589889912400395, + 0.843301007989794, + 0.8716490119695663, + 0.8325109956786036, + 0.8372399897780269, + 0.8381810039281845, + 0.8827289857435971, + 0.8501700067427009, + 0.8684300119057298, + 0.8474589849356562, + 0.8348110131919384, + 0.8408599824178964, + 0.838441017549485, + 0.8697590092197061, + 0.8418590005021542, + 0.8499010000377893, + 0.8653689874336123, + 0.8368100097868592, + 0.8440900128334761, + 0.8281700138468295, + 1.4498730015475303, + 1.4753630093764514, + 0.9223879897035658, + 0.9254079777747393, + 0.9315290080849081, + 0.9091789834201336, + 1.1555460223462433, + 0.8351290016435087, + 0.8516800007782876, + 0.8273089770227671, + 0.8639000006951392, + 0.8379200007766485, + 0.8274599967990071, + 0.8458000083919615, + 0.842369016027078, + 0.8257690060418099, + 0.8212999964598566, + 0.8483710116706789, + 0.8384990214835852, + 0.8217910071834922, + 0.8259899914264679, + 0.8300509944092482, + 0.8233300177380443, + 0.8210410014726222, + 0.8444790146313608, + 0.8659200102556497, + 0.8627389906905591, + 0.8182799792848527, + 0.8122400031425059, + 0.8078509999904782, + 0.8175300026778132, + 0.807090982561931, + 0.8109890040941536, + 0.8367210102733225, + 0.8627790084574372, + 0.8108300098683685, + 0.8531709900125861, + 0.8172300003934652, + 0.8177509880624712, + 0.8151099900715053, + 0.8098609978333116, + 0.8203999896068126, + 0.8163409947883338, + 0.8168299973476678, + 0.8715500007383525, + 0.8336989849340171, + 0.8120900020003319, + 0.8161500154528767, + 0.8189099899027497, + 0.8158110140357167, + 1.1102660209871829, + 0.8193799876607955, + 0.8623900066595525, + 0.8790989813860506, + 0.8444309933111072, + 0.8318600011989474, + 0.8762099896557629, + 0.8460800163447857, + 1.161205000244081, + 0.8395399781875312, + 0.829138996778056, + 0.8367810223717242, + 0.8284500217996538, + 0.8460899989586323, + 0.8229589730035514, + 0.8267300145234913, + 0.8333990117534995, + 0.8235410205088556, + 0.8287700184155256, + 0.8233910193666816, + 0.8187200000975281, + 0.8443699916824698, + 0.8461689867544919, + 0.8212699904106557, + 0.8331690041813999, + 0.8407790155615658, + 0.8290309924632311, + 0.8304599905386567, + 0.8309610129799694, + 0.824879010906443, + 0.8217909780796617, + 0.8445190032944083, + 0.8442100079264492, + 0.8275590080302209, + 0.8623489993624389, + 0.8398710051551461, + 0.8498689858242869, + 0.8239310118369758, + 0.8488399907946587, + 0.8281199843622744, + 0.8222600154113024, + 0.8217099821195006, + 0.8278210007119924, + 0.819908978883177, + 0.8188109786715358, + 0.8411089947912842, + 0.8392009767703712, + 0.8879390079528093, + 0.8313000143971294, + 0.8319600019603968, + 0.8192989917006344, + 0.826450006570667, + 0.8355600002687424, + 0.8235910208895802, + 0.8241890172939748, + 0.8468299929518253, + 0.8375300094485283, + 0.826450006570667, + 0.8454500057268888, + 0.8412690076511353, + 0.8211010135710239, + 0.8407600107602775, + 0.8226990175899118, + 0.8242710027843714, + 0.820169982034713, + 0.8300800109282136, + 0.8196400012820959, + 0.8239909948315471, + 0.8444490085821599, + 0.8405999979004264, + 0.8223500044550747, + 0.9716990171000361, + 0.8323609945364296, + 0.8759890042711049, + 0.8333000005222857, + 0.8456500072497874, + 0.8237999863922596, + 0.827599986223504, + 0.8436890202574432, + 0.823830021545291, + 0.8187200000975281, + 0.825588998850435, + 0.8297009917441756, + 0.8253400155808777, + 0.8291199919767678, + 0.9927279897965491, + 0.8251910039689392, + 0.86840899894014, + 1.235333998920396, + 0.8433109906036407, + 0.8446990104857832, + 0.8204510086216033, + 0.8385789988096803, + 0.8230200037360191, + 0.8148190099745989, + 0.8158900018315762, + 0.8212290122173727, + 0.979719014139846, + 0.82677899627015, + 0.8491000044159591, + 0.8386200061067939, + 0.8260809991043061, + 0.8383390086237341, + 0.8499489922542125, + 0.8247990044765174, + 0.8224390039686114, + 0.8180509903468192, + 0.8190000080503523, + 0.8372299780603498, + 0.8368789858650416, + 0.8189409854821861, + 0.8463690173812211, + 0.8277410233858973, + 0.8208290091715753, + 0.818150001578033, + 0.8252709812950343, + 0.8271300175692886, + 0.9524479974061251, + 0.8250009850598872, + 0.8609599899500608, + 0.8253499981947243, + 0.8210200176108629, + 0.8224190096370876, + 0.8223610057029873, + 0.8209299994632602, + 0.8388599962927401, + 0.8374290191568434, + 0.8242600015364587, + 0.8459289965685457, + 0.8305399969685823, + 0.8197890128940344, + 0.9929770021699369, + 0.8258809975814074, + 0.8363689994439483, + 0.8420209924224764, + 0.8192800160031766, + 0.8489910105708987, + 0.8311000128742307, + 1.0039589833468199, + 0.8213410037569702, + 0.8231890096794814, + 0.8425999840255827, + 0.8431190217379481, + 0.8282210037577897, + 0.8983879815787077, + 0.8211909735109657, + 0.8400089864153415, + 0.8282999915536493, + 0.8223410113714635, + 0.8216600108426064, + 0.8501409902237356, + 0.8424599946010858, + 0.8299110049847513, + 0.8515800000168383, + 0.8217809954658151, + 0.8195590053219348, + 1.2168560060672462, + 0.8225500059779733, + 1.051686005666852, + 0.8512600034009665, + 0.8216300047934055, + 0.8228210208471864, + 0.8274999854620546, + 0.8227200014516711, + 0.8232899999711663, + 0.8432589820586145, + 0.8438510121777654, + 0.8200999873224646, + 0.8165409963112324, + 1.0739870194811374, + 0.8414599869865924, + 0.824169983388856, + 0.8257700246758759, + 0.839410990010947, + 0.8418290235567838, + 0.8251600083895028, + 0.8335190068464726, + 0.8199599978979677, + 0.8224800112657249, + 0.8419689838774502, + 0.8377510239370167, + 0.825809984235093, + 0.849091011332348, + 0.8278799941763282, + 0.9620880009606481, + 0.8372000011149794, + 0.8198189898394048, + 0.8188310021068901, + 0.8415289921686053, + 0.8376000041607767, + 0.8201999880839139, + 0.8526899910066277, + 1.2061249872203916, + 0.8221600146498531, + 0.8421409875154495, + 0.8251800027210265, + 0.8478100062347949, + 0.8606589981354773, + 0.8277599990833551, + 0.8376990153919905, + 0.8535810047760606, + 0.8229890081565827, + 0.8503800199832767, + 0.8318200125358999, + 0.8236599969677627, + 0.8419700025115162, + 0.8834589971229434, + 0.8242600015364587, + 0.8306899981107563, + 0.8671499963384122, + 0.8237900037784129, + 0.8411010203417391, + 0.8396199846174568, + 0.8217789873015136, + 0.9943879849743098, + 0.8249399834312499, + 0.8441399841103703, + 0.8480210090056062, + 0.8205390186049044, + 0.8258699963334948, + 0.8377890044357628, + 0.8366389956790954, + 0.8161109872162342, + 0.8282299968414009, + 0.8250310202129185, + 0.8179490105248988, + 0.8222409815061837, + 0.8195590053219348, + 0.8265909855253994, + 0.8187000057660043, + 0.8211600070353597, + 0.822750007500872, + 0.8395490003749728, + 0.8429900044575334, + 0.8223599870689213, + 0.8335710153914988 + ], + "deterministic": true, + "fiducial_log_likelihood": 7.743201200876806, + "stream_log_likelihood": [ + 7.743201200876806, + -4.160952751390761, + 7.657972665309621, + 9.364550949057252, + 7.051561357429162, + 9.219327498422556, + 0.8907045816755392, + -34.37790701671691, + -24.578291065194456, + -0.4990240338966778, + 0.7025906917399034, + 7.669569297550706, + -0.46390116505282464, + -5.412376751794209, + 5.343244353415997, + -20.481275097418546 + ], + "admissible": true, + "completeness_prior": { + "n_draws": 200, + "multiplicity_agreement": 1.0, + "raw_count_agreement": 1.0, + "n_multiplicity_mismatch": 0, + "mismatch_examples": [], + "max_position_error": 0.00085134744991033, + "p99_position_error": 0.0007893460711577928, + "median_position_error": 0.00040657539052049664, + "ref_distinct_histogram": { + "2": 21, + "4": 179 + }, + "abs_delta_logl_vs_reference": { + "max": 0.8682473458375171, + "p99": 0.5684387609119508, + "median": 0.030920850414811074, + "n_nonfinite_mismatch": 0 + }, + "abs_delta_logl_vs_control": { + "max": 0.0, + "p99": 0.0, + "median": 0.0, + "n_nonfinite_mismatch": 0 + } + }, + "completeness_stress": { + "n_draws": 200, + "multiplicity_agreement": 1.0, + "raw_count_agreement": 1.0, + "n_multiplicity_mismatch": 0, + "mismatch_examples": [], + "max_position_error": 0.0007893460711581035, + "p99_position_error": 0.0007893460711577219, + "median_position_error": 0.0004065753905207064, + "ref_distinct_histogram": { + "2": 163, + "4": 37 + } + } + }, + "step0_structured": { + "config": { + "name": "step0_structured", + "block": "step0_route", + "extent": null, + "scale": 0.2, + "precision": 0.001, + "max_containing_size": 15, + "neighbor_degree": 1, + "step0_route": "structured" + }, + "static": { + "extent_half_width": [ + 9.9, + 9.9 + ], + "limits": [ + -9.9, + 9.9, + -9.9, + 9.9 + ], + "scale": 0.2, + "pixel_scale_precision": 0.001, + "n_steps": 8, + "n_steps_formula": "ceil(log2(0.2 / 0.001))", + "last_step_triangle_side": 0.0015625, + "step0_triangles": 23283, + "step0_rows": 11859, + "max_containing_size": 15, + "neighbor_degree": 1, + "step0_route": "structured" + }, + "stats": { + "n": 400, + "median_ms": 0.8381294901482761, + "p10_ms": 0.8211640059016645, + "p90_ms": 0.8904601854737848, + "min_ms": 0.8089609909802675, + "max_ms": 1.5217220061458647, + "mean_ms": 0.8566515373240691 + }, + "speedup_vs_control": { + "ratio": 0.9994338825282807, + "ci90_low": 0.9952739001170396, + "ci90_high": 1.0029508460025336, + "bootstrap_samples": 2000 + }, + "paired_round_speedup": { + "median": 1.0009711334706575, + "p10": 0.9771974191721321, + "p90": 1.017323623641774 + }, + "compile": { + "lower_s": 2.6107569689920638, + "compile_s": 5.72994618001394, + "first_call_s": 0.013577006990090013, + "traced_rows_per_step": [ + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720, + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720 + ], + "output_shapes": [ + [] + ], + "flops": 2787435.0, + "memory_analysis": { + "argument_size_in_bytes": 40, + "output_size_in_bytes": 8, + "temp_size_in_bytes": 390472, + "alias_size_in_bytes": 0, + "generated_code_size_in_bytes": 568256, + "host_temp_size_in_bytes": 0 + }, + "rss_delta_bytes": 4243456, + "max_containing_size_proof": null + }, + "warm_ms": [ + 0.9911080123856664, + 0.9894579998217523, + 0.8959000115282834 + ], + "per_call_ms": [ + 1.5217220061458647, + 0.9037489944603294, + 0.8741889905650169, + 0.8677900186739862, + 0.8903679845388979, + 0.8990390051621944, + 0.9002279839478433, + 0.8620299922768027, + 0.8696890145074576, + 0.8642789907753468, + 0.8866800053510815, + 0.8658090082462877, + 0.8738500182516873, + 0.8982390281744301, + 0.9212690056301653, + 0.857610022649169, + 0.8801690128166229, + 0.8708499954082072, + 0.8858289802446961, + 0.8630510128568858, + 0.8902889967430383, + 0.8604890026617795, + 0.8602500020060688, + 0.8800590003374964, + 0.8793489832896739, + 0.8873300103005022, + 0.8939190011005849, + 0.8974499942269176, + 0.8858189976308495, + 0.8562989823985845, + 0.8837489876896143, + 0.8833090250845999, + 0.8912899938877672, + 0.8712590206414461, + 0.8748199907131493, + 0.8650689851492643, + 0.8580400026403368, + 0.8859299996402115, + 0.8677500009071082, + 0.8837800123728812, + 1.3409139937721193, + 0.8361990039702505, + 0.8926699811127037, + 0.8366100082639605, + 0.836801016703248, + 0.8458390075247735, + 0.8334190060850233, + 0.8657999860588461, + 0.8584090101066977, + 0.8521010167896748, + 0.8456590003333986, + 0.8398699865210801, + 0.8398889913223684, + 0.8399899816140532, + 1.1387370177544653, + 0.8597690030001104, + 0.8491599874105304, + 0.8343599911313504, + 0.8804399985820055, + 0.8314199803862721, + 0.878719991305843, + 0.8471100009046495, + 0.8484800055157393, + 0.8423590043094009, + 0.8607609779573977, + 0.8362900116480887, + 0.8440499950665981, + 0.8637999999336898, + 0.8334289886988699, + 0.8511400083079934, + 0.8425999840255827, + 0.8455309725832194, + 0.8476889925077558, + 0.8380989893339574, + 0.8660689927637577, + 0.8574789972044528, + 0.8429510053247213, + 0.8620389853604138, + 0.8486110018566251, + 0.8533189829904586, + 1.2877350091002882, + 0.8416089985985309, + 0.8478800009470433, + 0.845919013954699, + 0.8625290065538138, + 0.8617099956609309, + 0.8371190051548183, + 0.8526600140612572, + 0.8372589945793152, + 0.8416399941779673, + 0.8413790201302618, + 0.83466901560314, + 0.8716390002518892, + 1.0429169924464077, + 0.8360200154129416, + 0.8581989968661219, + 0.8371309959329665, + 0.8381599909625947, + 0.8687690133228898, + 0.8483099809382111, + 1.2155959848314524, + 0.9081400057766587, + 0.8984680171124637, + 0.8941790147218853, + 0.9151980048045516, + 0.8881880203261971, + 0.9019600111059844, + 0.8886389841791242, + 0.8974800002761185, + 0.9260679944418371, + 0.9217290207743645, + 0.8778399787843227, + 0.8947290189098567, + 0.918739999178797, + 1.0679280094336718, + 0.8789289859123528, + 0.8617500134278089, + 0.8638289873488247, + 0.8588699856773019, + 0.8559999987483025, + 0.9252100135199726, + 0.8522190037183464, + 0.8249209786299616, + 0.8388400019612163, + 0.8487100130878389, + 0.8236400026362389, + 0.8432109898421913, + 0.8432089816778898, + 0.839490006910637, + 0.824951013782993, + 0.8471189939882606, + 0.8367600094061345, + 0.8187600178644061, + 0.8211710082832724, + 0.854468991747126, + 1.0052279976662248, + 0.8412589959334582, + 0.8228499791584909, + 0.8089609909802675, + 0.8383689855691046, + 0.8193799876607955, + 0.8353909943252802, + 0.8253190026152879, + 0.810230994829908, + 0.8110390044748783, + 0.8105209853965789, + 0.8163189922925085, + 0.8131309878081083, + 0.8145199972204864, + 0.8137509867083281, + 0.8397689962293953, + 0.8313299913424999, + 0.8172100060619414, + 0.8372900192625821, + 0.8351500146090984, + 0.8314290025737137, + 0.8139210112858564, + 0.8177999989129603, + 0.8103009895421565, + 0.818859989522025, + 0.8597109990660101, + 0.8326200186274946, + 0.8251809922512621, + 0.8347489929292351, + 0.8308010001201183, + 0.8287699893116951, + 0.8457209914922714, + 0.8441690006293356, + 0.8196790004149079, + 0.8379300124943256, + 0.8381689840462059, + 0.8242009789682925, + 0.8237800211645663, + 0.8284399809781462, + 0.8250499959103763, + 0.8259110036306083, + 0.847559014800936, + 0.8425400010310113, + 0.8250399841926992, + 0.8525490120518953, + 0.8479789830744267, + 0.8262099872808903, + 0.824238988570869, + 0.8472309855278581, + 0.845430011395365, + 0.8252600091509521, + 0.8386700064875185, + 0.8287189994007349, + 0.8253309933934361, + 0.8217499998863786, + 0.8265200012829155, + 0.8238700102083385, + 0.8213200198952109, + 0.8411399903707206, + 0.8893799968063831, + 0.826000003144145, + 0.8395689947064966, + 1.0940470092464238, + 0.825140014057979, + 0.8224709890782833, + 0.8270000107586384, + 0.8469299937132746, + 0.8317810134030879, + 0.8202400058507919, + 0.8285100047942251, + 0.8334490121342242, + 0.8246310171671212, + 0.8233999833464622, + 0.8461700053885579, + 1.078556990250945, + 0.8325900125782937, + 0.8398409991059452, + 0.8503190183546394, + 0.8264509961009026, + 0.8274790016002953, + 0.8491099870298058, + 0.8451189787592739, + 0.8269509999081492, + 0.8372089941985905, + 0.8380000072065741, + 0.8256889996118844, + 0.8615309779997915, + 0.8219699957408011, + 0.8295710140373558, + 0.8352200093213469, + 0.8265099895652384, + 0.8234810084104538, + 0.8319290063809603, + 0.8344610105268657, + 0.8248900121543556, + 0.8213400142267346, + 0.8454599883407354, + 0.8392799936700612, + 0.8202090102713555, + 0.8411190065089613, + 0.83466901560314, + 0.8329600095748901, + 0.8222309988923371, + 0.8274590072687715, + 0.8212410029955208, + 0.8444100094493479, + 0.8216099813580513, + 0.8216910064220428, + 0.8465390128549188, + 0.835151004139334, + 0.8220699965022504, + 0.8511600026395172, + 0.8371089934371412, + 0.8243700140155852, + 0.8257910085376352, + 1.2019849964417517, + 0.8314000151585788, + 0.8360999927390367, + 0.8195889822673053, + 0.8182399906218052, + 0.8238700102083385, + 0.8294699946418405, + 0.8184300095308572, + 0.8217499998863786, + 0.8435490017291158, + 0.8198490249924362, + 1.0514780005905777, + 0.8277500164695084, + 0.8309900003951043, + 0.8352390141226351, + 1.0082469962071627, + 0.8322810172103345, + 0.8255800057668239, + 0.8463309786748141, + 0.829249998787418, + 0.8179810247384012, + 0.8278399764094502, + 0.821740017272532, + 0.8187589992303401, + 0.8272299892269075, + 0.823120994027704, + 0.8226289937738329, + 0.8443599799647927, + 0.8424700063187629, + 0.9097100119106472, + 0.866350979777053, + 0.8210100058931857, + 0.8253600099124014, + 0.8229200029745698, + 1.1491859913803637, + 0.8228109800256789, + 0.884398992639035, + 0.8340500062331557, + 0.8174800022970885, + 0.8373900200240314, + 0.8305700030177832, + 0.8311099954880774, + 0.8208299987018108, + 0.9132890263572335, + 0.8211009844671935, + 0.8578000124543905, + 0.8267709927167743, + 0.8194200054276735, + 0.8456489886157215, + 0.8412199968006462, + 0.8234900014940649, + 0.8280500187538564, + 0.8221909811254591, + 0.821438996354118, + 0.8472100016660988, + 0.8448299777228385, + 0.8283010101877153, + 0.8687000081408769, + 0.8291910053230822, + 0.8187599887605757, + 0.8193299872800708, + 0.8525990124326199, + 0.8238799928221852, + 0.884169974597171, + 0.851630000397563, + 0.8436309872195125, + 0.8258999732788652, + 0.8332899888046086, + 0.8301000052597374, + 0.8201310120057315, + 0.8699590107426047, + 0.8317100000567734, + 0.8163499878719449, + 0.8258399902842939, + 0.8277700108010322, + 0.8220789895858616, + 0.8241009782068431, + 0.8413099858444184, + 0.8446900174021721, + 0.8224199991673231, + 0.8546999888494611, + 0.8317600004374981, + 0.8429410227108747, + 0.8286600059363991, + 0.8402899838984013, + 0.8248900121543556, + 0.8274500141851604, + 0.8472299959976226, + 0.8498289971612394, + 0.8359009807463735, + 0.8814400061964989, + 0.8224600169342011, + 0.822261004941538, + 0.8259700261987746, + 0.822939007775858, + 0.822670990601182, + 0.8430090092588216, + 0.8476199873257428, + 0.8250900136772543, + 0.8181610028259456, + 0.8280400070361793, + 0.8412099850829691, + 0.8215389971155673, + 0.8179310243576765, + 1.317014015512541, + 0.9891570080071688, + 0.8377199992537498, + 0.8352390141226351, + 0.9118880261667073, + 0.8476699877064675, + 0.8552699873689562, + 0.8373199962079525, + 0.8306209929287434, + 0.8286699885502458, + 0.8228789956774563, + 0.8186699997168034, + 0.8397790079470724, + 0.8426100248470902, + 0.8220899908337742, + 0.8503900025971234, + 0.8262589981313795, + 0.8312409918289632, + 0.8397089841309935, + 0.8294589933939278, + 0.8222400210797787, + 1.1507559975143522, + 0.8324909722432494, + 0.8266799850389361, + 0.8509299950674176, + 0.824349990580231, + 0.8349389827344567, + 0.8416210184805095, + 0.8229799859691411, + 0.8402109961025417, + 0.8368399867322296, + 0.8207299979403615, + 0.8192599925678223, + 0.8466890139970928, + 0.8367199916392565, + 0.8278789755422622, + 0.8462799887638539, + 0.8318399777635932, + 0.8278510067611933, + 0.8220290183089674, + 0.8497000089846551, + 0.8164099999703467, + 0.8260089962277561, + 0.853839999763295, + 0.8455689821857959, + 0.8206409984268248 + ], + "deterministic": true, + "fiducial_log_likelihood": 7.743201200876806, + "stream_log_likelihood": [ + 7.743201200876806, + -4.160952751390761, + 7.657972665309621, + 9.364550949057252, + 7.051561357429162, + 9.219327498422556, + 0.8907045816755392, + -34.37790701671691, + -24.578291065194456, + -0.4990240338966778, + 0.7025906917399034, + 7.669569297550706, + -0.46390116505282464, + -5.412376751794209, + 5.343244353415997, + -20.481275097418546 + ], + "admissible": true, + "completeness_prior": { + "n_draws": 200, + "multiplicity_agreement": 1.0, + "raw_count_agreement": 1.0, + "n_multiplicity_mismatch": 0, + "mismatch_examples": [], + "max_position_error": 0.00085134744991033, + "p99_position_error": 0.0007893460711577928, + "median_position_error": 0.00040657539052049664, + "ref_distinct_histogram": { + "2": 21, + "4": 179 + }, + "abs_delta_logl_vs_reference": { + "max": 0.8682473458375171, + "p99": 0.5684387609119508, + "median": 0.030920850414811074, + "n_nonfinite_mismatch": 0 + }, + "abs_delta_logl_vs_control": { + "max": 0.0, + "p99": 0.0, + "median": 0.0, + "n_nonfinite_mismatch": 0 + } + }, + "completeness_stress": { + "n_draws": 200, + "multiplicity_agreement": 1.0, + "raw_count_agreement": 1.0, + "n_multiplicity_mismatch": 0, + "mismatch_examples": [], + "max_position_error": 0.0007893460711581035, + "p99_position_error": 0.0007893460711577219, + "median_position_error": 0.0004065753905207064, + "ref_distinct_histogram": { + "2": 163, + "4": 37 + } + } + } + }, + "vmap": { + "best": "step0_gather", + "routes": [ + "control", + "step0_gather", + "step0_components", + "step0_structured" + ], + "batches": [ + 1, + 4, + 16 + ], + "rows": { + "control_vmap1": { + "config": "control", + "batch": 1, + "stats_per_batch": { + "n": 400, + "median_ms": 0.8336004830198362, + "p10_ms": 0.8113289950415492, + "p90_ms": 0.9583760023815558, + "min_ms": 0.7996800122782588, + "max_ms": 1.5689920110162348, + "mean_ms": 0.8677728669863427 + }, + "median_ms_per_likelihood": 0.8336004830198362, + "compile": { + "lower_s": 3.534118679992389, + "compile_s": 6.123841880995315, + "first_call_s": 0.015827780007384717, + "traced_rows_per_step": [ + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720, + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720 + ], + "output_shapes": [ + [ + 1 + ] + ], + "flops": 2785711.0, + "memory_analysis": { + "argument_size_in_bytes": 40, + "output_size_in_bytes": 8, + "temp_size_in_bytes": 390216, + "alias_size_in_bytes": 0, + "generated_code_size_in_bytes": 568256, + "host_temp_size_in_bytes": 0 + }, + "rss_delta_bytes": 12288, + "max_containing_size_proof": null + }, + "values_first_batch": [ + 7.743201200876806 + ], + "max_abs_delta_vs_scalar": 0.0 + }, + "control_vmap4": { + "config": "control", + "batch": 4, + "stats_per_batch": { + "n": 400, + "median_ms": 0.9222634980687872, + "p10_ms": 0.899898906936869, + "p90_ms": 1.0289020108757543, + "min_ms": 0.891309988219291, + "max_ms": 1.8543879850767553, + "mean_ms": 0.9520257918484276 + }, + "median_ms_per_likelihood": 0.2305658745171968, + "compile": { + "lower_s": 3.6502856320003048, + "compile_s": 6.16853548301151, + "first_call_s": 0.015554703015368432, + "traced_rows_per_step": [ + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720, + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720 + ], + "output_shapes": [ + [ + 4 + ] + ], + "flops": 10540188.0, + "memory_analysis": { + "argument_size_in_bytes": 160, + "output_size_in_bytes": 32, + "temp_size_in_bytes": 1528136, + "alias_size_in_bytes": 0, + "generated_code_size_in_bytes": 568256, + "host_temp_size_in_bytes": 0 + }, + "rss_delta_bytes": 5783552, + "max_containing_size_proof": null + }, + "values_first_batch": [ + 7.743201200876806, + -4.160952751390761, + 7.657972665309621, + 9.364550949057252 + ], + "max_abs_delta_vs_scalar": 0.0 + }, + "control_vmap16": { + "config": "control", + "batch": 16, + "stats_per_batch": { + "n": 400, + "median_ms": 1.124436515965499, + "p10_ms": 1.102638989686966, + "p90_ms": 1.194823003606871, + "min_ms": 1.09016802161932, + "max_ms": 1.7639689904171973, + "mean_ms": 1.1547457618871704 + }, + "median_ms_per_likelihood": 0.07027728224784369, + "compile": { + "lower_s": 3.5472289780154824, + "compile_s": 6.479978011979256, + "first_call_s": 0.016334515006747097, + "traced_rows_per_step": [ + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720, + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720 + ], + "output_shapes": [ + [ + 16 + ] + ], + "flops": 42100100.0, + "memory_analysis": { + "argument_size_in_bytes": 640, + "output_size_in_bytes": 128, + "temp_size_in_bytes": 6084936, + "alias_size_in_bytes": 0, + "generated_code_size_in_bytes": 568256, + "host_temp_size_in_bytes": 0 + }, + "rss_delta_bytes": 94208, + "max_containing_size_proof": null + }, + "values_first_batch": [ + 7.743201200876806, + -4.160952751390761, + 7.657972665309621, + 9.364550949057252, + 7.051561357429162, + 9.219327498422556, + 0.8907045816755392, + -34.37790701671691, + -24.578291065194456, + -0.4990240338966778, + 0.7025906917399034, + 7.669569297550706, + -0.46390116505282464, + -5.412376751794209, + 5.343244353415997, + -20.481275097418546 + ], + "max_abs_delta_vs_scalar": 0.0 + }, + "step0_gather_vmap1": { + "config": "step0_gather", + "batch": 1, + "stats_per_batch": { + "n": 400, + "median_ms": 0.8298010070575401, + "p10_ms": 0.8061839936999604, + "p90_ms": 0.8788271079538391, + "min_ms": 0.7891699788160622, + "max_ms": 1.4457940123975277, + "mean_ms": 0.8525084068241995 + }, + "median_ms_per_likelihood": 0.8298010070575401, + "compile": { + "lower_s": 3.4645191179879475, + "compile_s": 6.1214333820098545, + "first_call_s": 0.015254117985023186, + "traced_rows_per_step": [ + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720, + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720 + ], + "output_shapes": [ + [ + 1 + ] + ], + "flops": 3065106.0, + "memory_analysis": { + "argument_size_in_bytes": 40, + "output_size_in_bytes": 8, + "temp_size_in_bytes": 389448, + "alias_size_in_bytes": 0, + "generated_code_size_in_bytes": 1127048, + "host_temp_size_in_bytes": 0 + }, + "rss_delta_bytes": 57344, + "max_containing_size_proof": null + }, + "values_first_batch": [ + 7.743201200876806 + ], + "speedup_vs_control_same_batch": { + "ratio": 1.0045787796471457, + "ci90_low": 1.0011201212303857, + "ci90_high": 1.0079889399136905, + "bootstrap_samples": 2000 + }, + "max_abs_delta_vs_scalar": 0.0 + }, + "step0_gather_vmap4": { + "config": "step0_gather", + "batch": 4, + "stats_per_batch": { + "n": 400, + "median_ms": 0.9133589774137363, + "p10_ms": 0.890255780541338, + "p90_ms": 0.9879971010377632, + "min_ms": 0.879510014783591, + "max_ms": 1.4964329893700778, + "mean_ms": 0.9443198823282728 + }, + "median_ms_per_likelihood": 0.22833974435343407, + "compile": { + "lower_s": 3.569131350988755, + "compile_s": 6.086117453989573, + "first_call_s": 0.015755732980323955, + "traced_rows_per_step": [ + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720, + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720 + ], + "output_shapes": [ + [ + 4 + ] + ], + "flops": 10819583.0, + "memory_analysis": { + "argument_size_in_bytes": 160, + "output_size_in_bytes": 32, + "temp_size_in_bytes": 1528136, + "alias_size_in_bytes": 0, + "generated_code_size_in_bytes": 1127048, + "host_temp_size_in_bytes": 0 + }, + "rss_delta_bytes": 4268032, + "max_containing_size_proof": null + }, + "values_first_batch": [ + 7.743201200876806, + -4.160952751390761, + 7.657972665309621, + 9.364550949057252 + ], + "speedup_vs_control_same_batch": { + "ratio": 1.0097492014369476, + "ci90_low": 1.007067394883651, + "ci90_high": 1.01319945664046, + "bootstrap_samples": 2000 + }, + "max_abs_delta_vs_scalar": 0.0 + }, + "step0_gather_vmap16": { + "config": "step0_gather", + "batch": 16, + "stats_per_batch": { + "n": 400, + "median_ms": 1.0986514971591532, + "p10_ms": 1.072304995614104, + "p90_ms": 1.1540229053935036, + "min_ms": 1.0601280082482845, + "max_ms": 1.6151310119312257, + "mean_ms": 1.1226303457806353 + }, + "median_ms_per_likelihood": 0.06866571857244708, + "compile": { + "lower_s": 3.475108950980939, + "compile_s": 6.429651493002893, + "first_call_s": 0.01625527601572685, + "traced_rows_per_step": [ + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720, + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720 + ], + "output_shapes": [ + [ + 16 + ] + ], + "flops": 42379492.0, + "memory_analysis": { + "argument_size_in_bytes": 640, + "output_size_in_bytes": 128, + "temp_size_in_bytes": 6084936, + "alias_size_in_bytes": 0, + "generated_code_size_in_bytes": 1127048, + "host_temp_size_in_bytes": 0 + }, + "rss_delta_bytes": 5533696, + "max_containing_size_proof": null + }, + "values_first_batch": [ + 7.743201200876806, + -4.160952751390761, + 7.657972665309621, + 9.364550949057252, + 7.051561357429162, + 9.219327498422556, + 0.8907045816755392, + -34.37790701671691, + -24.578291065194456, + -0.4990240338966778, + 0.7025906917399034, + 7.669569297550706, + -0.46390116505282464, + -5.412376751794209, + 5.343244353415997, + -20.481275097418546 + ], + "speedup_vs_control_same_batch": { + "ratio": 1.023469697964295, + "ci90_low": 1.0200106499257122, + "ci90_high": 1.0283196965585484, + "bootstrap_samples": 2000 + }, + "max_abs_delta_vs_scalar": 0.0 + }, + "step0_components_vmap1": { + "config": "step0_components", + "batch": 1, + "stats_per_batch": { + "n": 400, + "median_ms": 0.8306700037792325, + "p10_ms": 0.8075150137301534, + "p90_ms": 0.8915641083149239, + "min_ms": 0.7975199841894209, + "max_ms": 1.4586829929612577, + "mean_ms": 0.8559700075420551 + }, + "median_ms_per_likelihood": 0.8306700037792325, + "compile": { + "lower_s": 3.4610606679925695, + "compile_s": 6.079748970019864, + "first_call_s": 0.015412937005748972, + "traced_rows_per_step": [ + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720, + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720 + ], + "output_shapes": [ + [ + 1 + ] + ], + "flops": 2785710.0, + "memory_analysis": { + "argument_size_in_bytes": 40, + "output_size_in_bytes": 8, + "temp_size_in_bytes": 389704, + "alias_size_in_bytes": 0, + "generated_code_size_in_bytes": 847652, + "host_temp_size_in_bytes": 0 + }, + "rss_delta_bytes": 16961536, + "max_containing_size_proof": null + }, + "values_first_batch": [ + 7.743201200876806 + ], + "speedup_vs_control_same_batch": { + "ratio": 1.003527850081586, + "ci90_low": 1.0001906883279912, + "ci90_high": 1.0068348298883827, + "bootstrap_samples": 2000 + }, + "max_abs_delta_vs_scalar": 0.0 + }, + "step0_components_vmap4": { + "config": "step0_components", + "batch": 4, + "stats_per_batch": { + "n": 400, + "median_ms": 0.9160945046460256, + "p10_ms": 0.8923058921936899, + "p90_ms": 0.965451990487054, + "min_ms": 0.8838490175548941, + "max_ms": 1.3916229945607483, + "mean_ms": 0.9394609701848822 + }, + "median_ms_per_likelihood": 0.2290236261615064, + "compile": { + "lower_s": 3.5582027710042894, + "compile_s": 6.144133021996822, + "first_call_s": 0.016104367998195812, + "traced_rows_per_step": [ + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720, + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720 + ], + "output_shapes": [ + [ + 4 + ] + ], + "flops": 10540187.0, + "memory_analysis": { + "argument_size_in_bytes": 160, + "output_size_in_bytes": 32, + "temp_size_in_bytes": 1528648, + "alias_size_in_bytes": 0, + "generated_code_size_in_bytes": 847652, + "host_temp_size_in_bytes": 0 + }, + "rss_delta_bytes": 20766720, + "max_containing_size_proof": null + }, + "values_first_batch": [ + 7.743201200876806, + -4.160952751390761, + 7.657972665309621, + 9.364550949057252 + ], + "speedup_vs_control_same_batch": { + "ratio": 1.006734014221759, + "ci90_low": 1.0037835766691527, + "ci90_high": 1.0100836384406002, + "bootstrap_samples": 2000 + }, + "max_abs_delta_vs_scalar": 0.0 + }, + "step0_components_vmap16": { + "config": "step0_components", + "batch": 16, + "stats_per_batch": { + "n": 400, + "median_ms": 1.091177502530627, + "p10_ms": 1.0699820006266236, + "p90_ms": 1.1659178882837298, + "min_ms": 1.0605580173432827, + "max_ms": 1.7549500043969601, + "mean_ms": 1.123378486809088 + }, + "median_ms_per_likelihood": 0.06819859390816418, + "compile": { + "lower_s": 3.484036854992155, + "compile_s": 6.309605831978843, + "first_call_s": 0.016645872994558886, + "traced_rows_per_step": [ + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720, + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720 + ], + "output_shapes": [ + [ + 16 + ] + ], + "flops": 42100100.0, + "memory_analysis": { + "argument_size_in_bytes": 640, + "output_size_in_bytes": 128, + "temp_size_in_bytes": 6085448, + "alias_size_in_bytes": 0, + "generated_code_size_in_bytes": 847652, + "host_temp_size_in_bytes": 0 + }, + "rss_delta_bytes": 35733504, + "max_containing_size_proof": null + }, + "values_first_batch": [ + 7.743201200876806, + -4.160952751390761, + 7.657972665309621, + 9.364550949057252, + 7.051561357429162, + 9.219327498422556, + 0.8907045816755392, + -34.37790701671691, + -24.578291065194456, + -0.4990240338966778, + 0.7025906917399034, + 7.669569297550706, + -0.46390116505282464, + -5.412376751794209, + 5.343244353415997, + -20.481275097418546 + ], + "speedup_vs_control_same_batch": { + "ratio": 1.0304799295785871, + "ci90_low": 1.027709439281646, + "ci90_high": 1.034789270963167, + "bootstrap_samples": 2000 + }, + "max_abs_delta_vs_scalar": 0.0 + }, + "step0_structured_vmap1": { + "config": "step0_structured", + "batch": 1, + "stats_per_batch": { + "n": 400, + "median_ms": 0.8377755002584308, + "p10_ms": 0.813393120188266, + "p90_ms": 0.8837282250169665, + "min_ms": 0.8032910118345171, + "max_ms": 1.7126599850598723, + "mean_ms": 0.8641045467084041 + }, + "median_ms_per_likelihood": 0.8377755002584308, + "compile": { + "lower_s": 3.533376956009306, + "compile_s": 6.26782644999912, + "first_call_s": 0.015070449997438118, + "traced_rows_per_step": [ + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720, + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720 + ], + "output_shapes": [ + [ + 1 + ] + ], + "flops": 2785711.0, + "memory_analysis": { + "argument_size_in_bytes": 40, + "output_size_in_bytes": 8, + "temp_size_in_bytes": 390216, + "alias_size_in_bytes": 0, + "generated_code_size_in_bytes": 568256, + "host_temp_size_in_bytes": 0 + }, + "rss_delta_bytes": 48377856, + "max_containing_size_proof": null + }, + "values_first_batch": [ + 7.743201200876806 + ], + "speedup_vs_control_same_batch": { + "ratio": 0.9950165441251186, + "ci90_low": 0.9918015001553566, + "ci90_high": 0.9979441278851563, + "bootstrap_samples": 2000 + }, + "max_abs_delta_vs_scalar": 0.0 + }, + "step0_structured_vmap4": { + "config": "step0_structured", + "batch": 4, + "stats_per_batch": { + "n": 400, + "median_ms": 0.9235235047526658, + "p10_ms": 0.9013379894895479, + "p90_ms": 0.9982599935028702, + "min_ms": 0.8893790072761476, + "max_ms": 1.4616929984185845, + "mean_ms": 0.9565310547623085 + }, + "median_ms_per_likelihood": 0.23088087618816644, + "compile": { + "lower_s": 3.6353171129885595, + "compile_s": 6.200072256004205, + "first_call_s": 0.017819117987528443, + "traced_rows_per_step": [ + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720, + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720 + ], + "output_shapes": [ + [ + 4 + ] + ], + "flops": 10540188.0, + "memory_analysis": { + "argument_size_in_bytes": 160, + "output_size_in_bytes": 32, + "temp_size_in_bytes": 1528136, + "alias_size_in_bytes": 0, + "generated_code_size_in_bytes": 568256, + "host_temp_size_in_bytes": 0 + }, + "rss_delta_bytes": 23318528, + "max_containing_size_proof": null + }, + "values_first_batch": [ + 7.743201200876806, + -4.160952751390761, + 7.657972665309621, + 9.364550949057252 + ], + "speedup_vs_control_same_batch": { + "ratio": 0.9986356528259495, + "ci90_low": 0.9956359467729642, + "ci90_high": 1.0026098578839509, + "bootstrap_samples": 2000 + }, + "max_abs_delta_vs_scalar": 0.0 + }, + "step0_structured_vmap16": { + "config": "step0_structured", + "batch": 16, + "stats_per_batch": { + "n": 400, + "median_ms": 1.128961012000218, + "p10_ms": 1.1052449903218076, + "p90_ms": 1.2018649140372875, + "min_ms": 1.0960969957523048, + "max_ms": 1.7728589882608503, + "mean_ms": 1.1621802497393219 + }, + "median_ms_per_likelihood": 0.07056006325001363, + "compile": { + "lower_s": 3.544565604010131, + "compile_s": 6.466160877986113, + "first_call_s": 0.01842924000811763, + "traced_rows_per_step": [ + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720, + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720 + ], + "output_shapes": [ + [ + 16 + ] + ], + "flops": 42100100.0, + "memory_analysis": { + "argument_size_in_bytes": 640, + "output_size_in_bytes": 128, + "temp_size_in_bytes": 6084936, + "alias_size_in_bytes": 0, + "generated_code_size_in_bytes": 568256, + "host_temp_size_in_bytes": 0 + }, + "rss_delta_bytes": 37470208, + "max_containing_size_proof": null + }, + "values_first_batch": [ + 7.743201200876806, + -4.160952751390761, + 7.657972665309621, + 9.364550949057252, + 7.051561357429162, + 9.219327498422556, + 0.8907045816755392, + -34.37790701671691, + -24.578291065194456, + -0.4990240338966778, + 0.7025906917399034, + 7.669569297550706, + -0.46390116505282464, + -5.412376751794209, + 5.343244353415997, + -20.481275097418546 + ], + "speedup_vs_control_same_batch": { + "ratio": 0.9959923363281582, + "ci90_low": 0.993009605119989, + "ci90_high": 0.9994402289979405, + "bootstrap_samples": 2000 + }, + "max_abs_delta_vs_scalar": 0.0 + } + } + }, + "step0_split": { + "control": { + "extent": null, + "scale": 0.2, + "step0_rows": 11859, + "step0_triangles": 23283, + "prefix_median_ms": { + "source_centre": 0.16328298079315573, + "ray_trace": 0.14671350072603673, + "general_gather": 0.14574799570254982, + "route_inputs": 0.22475700825452805, + "containment": 0.23401748330798 + }, + "ray_trace_ms": -0.016569480067119002, + "containment_ms": 0.08730398258194327, + "route_input_materialisation_ms": 0.07804350752849132, + "general_gather_reference_ms": -0.0009655050234869123, + "step0_route": "library default (structured)", + "method": "prefix medians; ray_trace = jnp.sum(plane.vertices) minus source_centre; containment = containing_indices minus ray_trace (includes the vertices[indices] gather + Point.mask + jnp.where) and is the headline before/after number; route_input_materialisation = the route's six barycentric input components returned as outputs (captured at trace time) minus ray_trace; general_gather_reference = plane.triangles minus ray_trace, route-independent", + "step0_ms": 0.07073450251482427, + "containment_share_of_step0": 1.2342489093444382, + "step0_share_of_likelihood": 0.08444347808654326, + "containment_share_of_likelihood": 0.10422427072956697 + }, + "step0_gather": { + "extent": null, + "scale": 0.2, + "step0_rows": 11859, + "step0_triangles": 23283, + "prefix_median_ms": { + "source_centre": 0.16242348647210747, + "ray_trace": 0.14666799688711762, + "general_gather": 0.14600348367821425, + "route_inputs": 0.16110300202853978, + "containment": 0.23141250130720437 + }, + "ray_trace_ms": -0.015755489584989846, + "containment_ms": 0.08474450442008674, + "route_input_materialisation_ms": 0.014435005141422153, + "general_gather_reference_ms": -0.0006645132089033723, + "step0_route": "gather", + "method": "prefix medians; ray_trace = jnp.sum(plane.vertices) minus source_centre; containment = containing_indices minus ray_trace (includes the vertices[indices] gather + Point.mask + jnp.where) and is the headline before/after number; route_input_materialisation = the route's six barycentric input components returned as outputs (captured at trace time) minus ray_trace; general_gather_reference = plane.triangles minus ray_trace, route-independent", + "step0_ms": 0.0689890148350969, + "containment_share_of_step0": 1.2283767875603078, + "step0_share_of_likelihood": 0.08238040208972053, + "containment_share_of_likelihood": 0.10119417367689737 + }, + "step0_components": { + "extent": null, + "scale": 0.2, + "step0_rows": 11859, + "step0_triangles": 23283, + "prefix_median_ms": { + "source_centre": 0.1630180049687624, + "ray_trace": 0.14600850408896804, + "general_gather": 0.14685351925436407, + "route_inputs": 0.1609479950275272, + "containment": 0.22890752006787807 + }, + "ray_trace_ms": -0.01700950087979436, + "containment_ms": 0.08289901597891003, + "route_input_materialisation_ms": 0.014939490938559175, + "general_gather_reference_ms": 0.0008450151653960347, + "step0_route": "components", + "method": "prefix medians; ray_trace = jnp.sum(plane.vertices) minus source_centre; containment = containing_indices minus ray_trace (includes the vertices[indices] gather + Point.mask + jnp.where) and is the headline before/after number; route_input_materialisation = the route's six barycentric input components returned as outputs (captured at trace time) minus ray_trace; general_gather_reference = plane.triangles minus ray_trace, route-independent", + "step0_ms": 0.06588951509911567, + "containment_share_of_step0": 1.2581518600373287, + "step0_share_of_likelihood": 0.07857272397612228, + "containment_share_of_likelihood": 0.09885641881875785 + }, + "step0_structured": { + "extent": null, + "scale": 0.2, + "step0_rows": 11859, + "step0_triangles": 23283, + "prefix_median_ms": { + "source_centre": 0.16088849224615842, + "ray_trace": 0.14582800213247538, + "general_gather": 0.14478800585493445, + "route_inputs": 0.2240129979327321, + "containment": 0.23568750475533307 + }, + "ray_trace_ms": -0.015060490113683045, + "containment_ms": 0.08985950262285769, + "route_input_materialisation_ms": 0.07818499580025673, + "general_gather_reference_ms": -0.0010399962775409222, + "step0_route": "structured", + "method": "prefix medians; ray_trace = jnp.sum(plane.vertices) minus source_centre; containment = containing_indices minus ray_trace (includes the vertices[indices] gather + Point.mask + jnp.where) and is the headline before/after number; route_input_materialisation = the route's six barycentric input components returned as outputs (captured at trace time) minus ray_trace; general_gather_reference = plane.triangles minus ray_trace, route-independent", + "step0_ms": 0.07479901250917464, + "containment_share_of_step0": 1.2013461088384791, + "step0_share_of_likelihood": 0.08924517438939145, + "containment_share_of_likelihood": 0.10721434298530692 + } + }, + "uncapped_containing_counts": { + "control": { + "n_draws": 200, + "max_per_step": [ + 17, + 13, + 11, + 9, + 7, + 5, + 5, + 5 + ], + "p99_per_step": [ + 15.0, + 11.019999999999982, + 9.019999999999982, + 7.019999999999982, + 5.019999999999982, + 5.0, + 5.0, + 5.0 + ], + "median_per_step": [ + 9.0, + 5.0, + 5.0, + 5.0, + 5.0, + 5.0, + 5.0, + 5.0 + ], + "max_over_steps": 17, + "draws_exceeding_cap": [ + 12 + ], + "n_draws_exceeding": { + "6": 185, + "8": 117, + "10": 51, + "12": 23, + "15": 1 + }, + "histogram_max_over_steps": { + "3": 3, + "5": 12, + "7": 68, + "9": 66, + "11": 28, + "13": 16, + "15": 6, + "17": 1 + } + }, + "step0_gather": { + "n_draws": 200, + "max_per_step": [ + 17, + 13, + 11, + 9, + 7, + 5, + 5, + 5 + ], + "p99_per_step": [ + 15.0, + 11.019999999999982, + 9.019999999999982, + 7.019999999999982, + 5.019999999999982, + 5.0, + 5.0, + 5.0 + ], + "median_per_step": [ + 9.0, + 5.0, + 5.0, + 5.0, + 5.0, + 5.0, + 5.0, + 5.0 + ], + "max_over_steps": 17, + "draws_exceeding_cap": [ + 12 + ], + "n_draws_exceeding": { + "6": 185, + "8": 117, + "10": 51, + "12": 23, + "15": 1 + }, + "histogram_max_over_steps": { + "3": 3, + "5": 12, + "7": 68, + "9": 66, + "11": 28, + "13": 16, + "15": 6, + "17": 1 + } + } + }, + "gates": { + "fiducial_bit_exact": { + "value": 7.743201200876806, + "expected": 7.743201200876812, + "repr": "7.743201200876806", + "pass": false + }, + "max_containing_size_patch": { + "control": { + "positions_shape": [ + 15, + 2 + ], + "expected_rows": 15, + "pass": true + }, + "step0_gather": { + "positions_shape": [ + 15, + 2 + ], + "expected_rows": 15, + "pass": true + }, + "step0_components": { + "positions_shape": [ + 15, + 2 + ], + "expected_rows": 15, + "pass": true + }, + "step0_structured": { + "positions_shape": [ + 15, + 2 + ], + "expected_rows": 15, + "pass": true + } + }, + "patch_restored": { + "module_constant": 15, + "init_default": [ + 15, + null + ], + "step0_containment": "structured", + "pass": true + }, + "grad": { + "control": { + "compile_s": 16.52882811400923, + "all_finite": true, + "non_zero_per_instance": [ + true, + true, + true + ], + "gradients": [ + [ + -41.62226304409438, + 53.13429595961162, + 31.78649237786796, + 2.8041319222743963, + 1781.7386158499723 + ], + [ + 249.25847095707593, + 214.72130119062194, + 374.3919459816108, + 813.0025446225928, + 3314.449436325227 + ], + [ + -30.046183166260203, + 41.85589438433415, + 53.129153081302505, + -17.18919451496857, + 1304.4185837665627 + ] + ], + "pass": true, + "max_rel_delta_vs_control": 0.0 + }, + "step0_gather": { + "compile_s": 15.902298842003802, + "all_finite": true, + "non_zero_per_instance": [ + true, + true, + true + ], + "gradients": [ + [ + -41.62226304409438, + 53.13429595961162, + 31.78649237786796, + 2.8041319222743963, + 1781.7386158499723 + ], + [ + 249.25847095707593, + 214.72130119062194, + 374.3919459816108, + 813.0025446225928, + 3314.449436325227 + ], + [ + -30.046183166260203, + 41.85589438433415, + 53.129153081302505, + -17.18919451496857, + 1304.4185837665627 + ] + ], + "pass": true, + "max_rel_delta_vs_control": 0.0 + }, + "step0_components": { + "compile_s": 16.629773179010954, + "all_finite": true, + "non_zero_per_instance": [ + true, + true, + true + ], + "gradients": [ + [ + -41.62226304409438, + 53.13429595961162, + 31.78649237786796, + 2.8041319222743963, + 1781.7386158499723 + ], + [ + 249.25847095707593, + 214.72130119062194, + 374.3919459816108, + 813.0025446225928, + 3314.449436325227 + ], + [ + -30.046183166260203, + 41.85589438433415, + 53.129153081302505, + -17.18919451496857, + 1304.4185837665627 + ] + ], + "pass": true, + "max_rel_delta_vs_control": 0.0 + }, + "step0_structured": { + "compile_s": 16.732731691008667, + "all_finite": true, + "non_zero_per_instance": [ + true, + true, + true + ], + "gradients": [ + [ + -41.62226304409438, + 53.13429595961162, + 31.78649237786796, + 2.8041319222743963, + 1781.7386158499723 + ], + [ + 249.25847095707593, + 214.72130119062194, + 374.3919459816108, + 813.0025446225928, + 3314.449436325227 + ], + [ + -30.046183166260203, + 41.85589438433415, + 53.129153081302505, + -17.18919451496857, + 1304.4185837665627 + ] + ], + "pass": true, + "max_rel_delta_vs_control": 0.0 + } + }, + "step0_route_bit_identity": { + "step0_gather": { + "checks": { + "stream_log_likelihood": true, + "fiducial_log_likelihood": true, + "prior_log_likelihood": true, + "prior_positions": true, + "stress_positions": true, + "image_counts": true, + "grad": true, + "vmap": true + }, + "pass": true, + "image_count_histogram": { + "prior": { + "2": 21, + "4": 179 + }, + "stress": { + "2": 163, + "4": 37 + } + } + }, + "step0_components": { + "checks": { + "stream_log_likelihood": true, + "fiducial_log_likelihood": true, + "prior_log_likelihood": true, + "prior_positions": true, + "stress_positions": true, + "image_counts": true, + "grad": true, + "vmap": true + }, + "pass": true, + "image_count_histogram": { + "prior": { + "2": 21, + "4": 179 + }, + "stress": { + "2": 163, + "4": 37 + } + } + }, + "step0_structured": { + "checks": { + "stream_log_likelihood": true, + "fiducial_log_likelihood": true, + "prior_log_likelihood": true, + "prior_positions": true, + "stress_positions": true, + "image_counts": true, + "grad": true, + "vmap": true + }, + "pass": true, + "image_count_histogram": { + "prior": { + "2": 21, + "4": 179 + }, + "stress": { + "2": 163, + "4": 37 + } + } + } + } + }, + "all_gates_pass": false, + "completeness_compile": { + "control_prior": { + "lower_s": 3.8373180710186716, + "compile_s": 6.4766654259874485, + "first_call_s": 0.013670084998011589, + "traced_rows_per_step": [ + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720, + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720, + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720 + ], + "output_shapes": [ + [], + [ + 15, + 2 + ] + ], + "flops": 2787435.0, + "memory_analysis": { + "argument_size_in_bytes": 40, + "output_size_in_bytes": 264, + "temp_size_in_bytes": 390472, + "alias_size_in_bytes": 0, + "generated_code_size_in_bytes": 568256, + "host_temp_size_in_bytes": 0 + }, + "rss_delta_bytes": 4263936, + "max_containing_size_proof": { + "positions_shape": [ + 15, + 2 + ], + "expected_rows": 15, + "pass": true + } + }, + "control_stress": { + "lower_s": 1.0753604119818192, + "compile_s": 3.6217841939942446, + "first_call_s": 0.010213997011305764, + "traced_rows_per_step": [ + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720 + ], + "output_shapes": [ + [ + 15, + 2 + ] + ], + "flops": 2785566.0, + "memory_analysis": { + "argument_size_in_bytes": 64, + "output_size_in_bytes": 240, + "temp_size_in_bytes": 388936, + "alias_size_in_bytes": 0, + "generated_code_size_in_bytes": 567872, + "host_temp_size_in_bytes": 0 + }, + "rss_delta_bytes": 2203648, + "max_containing_size_proof": { + "positions_shape": [ + 15, + 2 + ], + "expected_rows": 15, + "pass": true + } + }, + "step0_gather_prior": { + "lower_s": 3.7094068009755574, + "compile_s": 6.3733586779853795, + "first_call_s": 0.012994163989787921, + "traced_rows_per_step": [ + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720, + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720, + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720 + ], + "output_shapes": [ + [], + [ + 15, + 2 + ] + ], + "flops": 3066830.0, + "memory_analysis": { + "argument_size_in_bytes": 40, + "output_size_in_bytes": 264, + "temp_size_in_bytes": 389704, + "alias_size_in_bytes": 0, + "generated_code_size_in_bytes": 1127048, + "host_temp_size_in_bytes": 0 + }, + "rss_delta_bytes": 6168576, + "max_containing_size_proof": { + "positions_shape": [ + 15, + 2 + ], + "expected_rows": 15, + "pass": true + } + }, + "step0_gather_stress": { + "lower_s": 1.0549887570086867, + "compile_s": 3.5271897230122704, + "first_call_s": 0.010571781982434914, + "traced_rows_per_step": [ + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720 + ], + "output_shapes": [ + [ + 15, + 2 + ] + ], + "flops": 3064961.0, + "memory_analysis": { + "argument_size_in_bytes": 64, + "output_size_in_bytes": 240, + "temp_size_in_bytes": 388168, + "alias_size_in_bytes": 0, + "generated_code_size_in_bytes": 1126664, + "host_temp_size_in_bytes": 0 + }, + "rss_delta_bytes": 2576384, + "max_containing_size_proof": { + "positions_shape": [ + 15, + 2 + ], + "expected_rows": 15, + "pass": true + } + }, + "step0_components_prior": { + "lower_s": 3.7382403440133203, + "compile_s": 6.351212826004485, + "first_call_s": 0.013302220002515242, + "traced_rows_per_step": [ + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720, + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720, + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720 + ], + "output_shapes": [ + [], + [ + 15, + 2 + ] + ], + "flops": 2787434.0, + "memory_analysis": { + "argument_size_in_bytes": 40, + "output_size_in_bytes": 264, + "temp_size_in_bytes": 389960, + "alias_size_in_bytes": 0, + "generated_code_size_in_bytes": 847652, + "host_temp_size_in_bytes": 0 + }, + "rss_delta_bytes": 3911680, + "max_containing_size_proof": { + "positions_shape": [ + 15, + 2 + ], + "expected_rows": 15, + "pass": true + } + }, + "step0_components_stress": { + "lower_s": 1.0642562459979672, + "compile_s": 3.56419834800181, + "first_call_s": 0.010113538010045886, + "traced_rows_per_step": [ + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720 + ], + "output_shapes": [ + [ + 15, + 2 + ] + ], + "flops": 2785565.0, + "memory_analysis": { + "argument_size_in_bytes": 64, + "output_size_in_bytes": 240, + "temp_size_in_bytes": 388424, + "alias_size_in_bytes": 0, + "generated_code_size_in_bytes": 847524, + "host_temp_size_in_bytes": 0 + }, + "rss_delta_bytes": 1921024, + "max_containing_size_proof": { + "positions_shape": [ + 15, + 2 + ], + "expected_rows": 15, + "pass": true + } + }, + "step0_structured_prior": { + "lower_s": 3.664924925978994, + "compile_s": 6.375978806987405, + "first_call_s": 0.013340648991288617, + "traced_rows_per_step": [ + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720, + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720, + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720 + ], + "output_shapes": [ + [], + [ + 15, + 2 + ] + ], + "flops": 2787435.0, + "memory_analysis": { + "argument_size_in_bytes": 40, + "output_size_in_bytes": 264, + "temp_size_in_bytes": 390472, + "alias_size_in_bytes": 0, + "generated_code_size_in_bytes": 568256, + "host_temp_size_in_bytes": 0 + }, + "rss_delta_bytes": 2744320, + "max_containing_size_proof": { + "positions_shape": [ + 15, + 2 + ], + "expected_rows": 15, + "pass": true + } + }, + "step0_structured_stress": { + "lower_s": 1.162414644000819, + "compile_s": 3.7145927469828166, + "first_call_s": 0.010224707017187029, + "traced_rows_per_step": [ + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720 + ], + "output_shapes": [ + [ + 15, + 2 + ] + ], + "flops": 2785566.0, + "memory_analysis": { + "argument_size_in_bytes": 64, + "output_size_in_bytes": 240, + "temp_size_in_bytes": 388936, + "alias_size_in_bytes": 0, + "generated_code_size_in_bytes": 567872, + "host_temp_size_in_bytes": 0 + }, + "rss_delta_bytes": 1343488, + "max_containing_size_proof": { + "positions_shape": [ + 15, + 2 + ], + "expected_rows": 15, + "pass": true + } + } + }, + "progress": [ + "[ 5.7 s] configs: control(n=8,rows=11859), step0_gather(n=8,rows=11859), step0_components(n=8,rows=11859), step0_structured(n=8,rows=11859), reference(n=9,rows=268677), reference_b(n=10,rows=115473)", + "[ 32.1 s] reference reference solved on 200 prior + 200 stress draws (compile 4.2 s)", + "[ 56.7 s] reference reference_b solved on 200 prior + 200 stress draws (compile 4.9 s)", + "[ 56.7 s] reference floor: {\"prior\": {\"n_draws\": 200, \"multiplicity_agreement\": 1.0, \"raw_count_agreement\": 1.0, \"n_multiplicity_mismatch\": 0, \"max_position_error\": 0.0001578692142314068, \"p99_position_error\": 0.0001280749711778143, \"median_position_error\": 5.966895436149997e-05, \"ref_distinct_histogram\": {\"2\": 21, \"4\": 179}, \"abs_delta_logl_vs_reference\": {\"max\": 0.09204751533957278, \"p99\": 0.06845503627316349, \"median\": 0.004628222675297167, \"n_nonfinite_mismatch\": 0}}, \"stress\": {\"n_draws\": 200, \"multiplicity_agreement\": 1.0, \"raw_count_agreement\": 1.0, \"n_multiplicity_mismatch\": 0, \"max_position_error\": 0.00015786921423129578, \"p99_position_error\": 0.00014084184669768283, \"median_position_error\": 5.966895436134919e-05, \"ref_distinct_histogram\": {\"2\": 163, \"4\": 37}}}", + "[ 119.8 s] completeness control prior mult 1.000 raw 1.000 maxerr 0.00085134744991033 |dlogL|ref 0.8682473458375171 stress mult 1.0 maxerr 0.0007893460711581035", + "[ 119.9 s] completeness step0_gather prior mult 1.000 raw 1.000 maxerr 0.00085134744991033 |dlogL|ref 0.8682473458375171 stress mult 1.0 maxerr 0.0007893460711581035", + "[ 119.9 s] completeness step0_components prior mult 1.000 raw 1.000 maxerr 0.00085134744991033 |dlogL|ref 0.8682473458375171 stress mult 1.0 maxerr 0.0007893460711581035", + "[ 119.9 s] completeness step0_structured prior mult 1.000 raw 1.000 maxerr 0.00085134744991033 |dlogL|ref 0.8682473458375171 stress mult 1.0 maxerr 0.0007893460711581035", + "[ 119.9 s] reference image extent: {'prior': {'max_abs_y': 1.77939453125, 'max_abs_x': 1.7773254429359935, 'max_abs_coord': 1.77939453125, 'p99_abs_coord': 1.759083091412917, 'max_radius': 1.8116226317743076}, 'stress': {'max_abs_y': 2.2498046875, 'max_abs_x': 2.300267215077964, 'max_abs_coord': 2.300267215077964, 'p99_abs_coord': 2.2027852305644777, 'max_radius': 2.5191249773380773}}", + "[ 119.9 s] timing: compiling every route (fresh closure + clear_caches)", + "[ 155.0 s] timing: 20 rounds x 20 calls x 4 routes done", + "[ 155.7 s] fiducial gate: 7.743201200876806 == 7.743201200876812: False", + "[ 240.1 s] grad gate: control=True, step0_gather=True, step0_components=True, step0_structured=True", + "[ 240.1 s] best admissible (precision-equivalent): step0_gather; any precision: step0_gather", + "[ 366.8 s] vmap: control_vmap1 0.834 ms/L, control_vmap4 0.231 ms/L, control_vmap16 0.070 ms/L, step0_gather_vmap1 0.830 ms/L, step0_gather_vmap4 0.228 ms/L, step0_gather_vmap16 0.069 ms/L, step0_components_vmap1 0.831 ms/L, step0_components_vmap4 0.229 ms/L, step0_components_vmap16 0.068 ms/L, step0_structured_vmap1 0.838 ms/L, step0_structured_vmap4 0.231 ms/L, step0_structured_vmap16 0.071 ms/L", + "[ 366.8 s] step-0 route bit-identity vs control: step0_gather=True, step0_components=True, step0_structured=True", + "[ 366.8 s] step-0 split: ray trace vs ray trace + containment per geometry", + "[ 387.0 s] step-0 split: control trace -0.017 contain 0.087, step0_gather trace -0.016 contain 0.085, step0_components trace -0.017 contain 0.083, step0_structured trace -0.015 contain 0.090", + "[ 387.0 s] uncapped containing counts (NumPy path) on the prior draws", + "[ 410.2 s] uncapped control: max per step [17, 13, 11, 9, 7, 5, 5, 5]; draws exceeding cap 15: [12]", + "[ 432.4 s] uncapped step0_gather: max per step [17, 13, 11, 9, 7, 5, 5, 5]; draws exceeding cap 15: [12]" + ], + "wall_s": 432.49594629197964 +} \ No newline at end of file diff --git a/results/breakdown/point_source_image/solver_config_sweep_step0_hpc_ral_a100_fp64.png b/results/breakdown/point_source_image/solver_config_sweep_step0_hpc_ral_a100_fp64.png new file mode 100644 index 0000000000000000000000000000000000000000..47a21719ce59ad66dc2a6a2ca0255e754cc34d09 GIT binary patch literal 109009 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 Z$5+`bw%t~PB!=5d6Rf6MUbK*H`Co{khhhK# literal 0 HcmV?d00001 diff --git a/results/breakdown/point_source_image/solver_config_sweep_step0_hpc_ral_cpu_epyc7702_fp64.json b/results/breakdown/point_source_image/solver_config_sweep_step0_hpc_ral_cpu_epyc7702_fp64.json new file mode 100644 index 000000000..26d996089 --- /dev/null +++ b/results/breakdown/point_source_image/solver_config_sweep_step0_hpc_ral_cpu_epyc7702_fp64.json @@ -0,0 +1,4704 @@ +{ + "cell": "solver_config_sweep_step0", + "issue": "PyAutoLabs/PyAutoArray#579", + "phase": "4b", + "step0_routes": [ + "control", + "gather", + "components", + "structured" + ], + "library_step0_default": "structured", + "config_name": "hpc_ral_cpu_epyc7702_fp64", + "quotable": "supplementary", + "host_note": "SUPPLEMENTARY (post-run label): AMD EPYC 7702 CPU-only on gpu-partition node euclid-ral-gpu-2 (no --gres), RAL job 357335, run because the ral partition was saturated. A different CPU from the phase-4a Xeon Platinum 8490H (euclid-ral-compute-10-4): within-node route ratios (x gather) are valid, absolute ms are NOT comparable to phase 4a.", + "quick": false, + "library_versions": { + "autolens": "2026.8.17.1", + "autoarray": "2026.8.17.1", + "autofit": "2026.8.17.1" + }, + "package_versions": { + "jax": "0.10.2", + "jaxlib": "0.10.2" + }, + "source_revisions": { + "autolens_profiling": "311e690fd6c843fe38e5a228628b4417890694f2", + "PyAutoNerves": "eb27da2464e2f07e0ad67e7fb18ee84be76c479a", + "PyAutoFit": "5468c6cefa0ae8bb08a449497cbd3c620f3720e2", + "PyAutoArray": "c13b2d733538bec86cff3a15eccd9a0940a68463", + "PyAutoGalaxy": "879a9308b709b3705eb95904de6b349a5c034d61", + "PyAutoLens": "def4decf68a245a9c3dd1eb276ee0578897b220c" + }, + "autoarray_imported_from": "/mnt/ral/jnightin/autolens_profiling_wt/PyAutoArray_pointsolver-step0-gather", + "autolens_imported_from": "/mnt/ral/jnightin/PyAuto/PyAutoLens", + "device": { + "backend": "cpu", + "device": "cpu:0", + "hostname": "euclid-ral-gpu-2", + "xla_flags": "--xla_disable_hlo_passes=constant_folding --xla_gpu_autotune_level=0 --xla_gpu_enable_triton_gemm=false", + "omp_num_threads": "1", + "cpu_count": 124, + "jax_compilation_cache_dir": null, + "autotune_cache_entries_at_start": 0, + "cache_fresh": false + }, + "jax_devices": [ + "cpu:0" + ], + "machine": { + "cpu_model": "AMD EPYC 7702 64-Core Processor", + "cpu_count_os": 124, + "nproc": 1, + "nproc_all": 124, + "nproc_note": "GNU nproc honours OMP_NUM_THREADS, so `nproc` can print 1 on a multi-core host; `nproc_all` is the core count.", + "ram_total": "928298204 kB", + "kernel": "5.14.0-687.50.1.el9_8.x86_64", + "platform": "Linux-5.14.0-687.50.1.el9_8.x86_64-x86_64-with-glibc2.34", + "python": "3.12.4", + "jax_thread_env": { + "NPROC": "8" + }, + "blas_thread_env": { + "OMP_NUM_THREADS": "1", + "OPENBLAS_NUM_THREADS": "1", + "MKL_NUM_THREADS": "1", + "VECLIB_MAXIMUM_THREADS": null, + "NUMEXPR_NUM_THREADS": null + }, + "thread_env_note": "NPROC sizes XLA's CPU intra-op pool (the JAX rows); the BLAS knobs pin OpenBLAS/MKL/OpenMP (the numpy/scipy rows) and do not touch JAX. Two disjoint families; both are recorded on every CPU timing.", + "gpu": null + }, + "thread_environment": { + "NPROC": "8", + "OMP_NUM_THREADS": "1", + "OPENBLAS_NUM_THREADS": "1", + "MKL_NUM_THREADS": "1" + }, + "sched_affinity": 8, + "os_cpu_count": 124, + "xla_flags": "--xla_disable_hlo_passes=constant_folding --xla_gpu_autotune_level=0 --xla_gpu_enable_triton_gemm=false", + "jax_platforms": "cpu", + "jax_enable_x64": true, + "loadavg_start": [ + 0.29, + 0.07, + 0.02 + ], + "loadavg_end": [ + 1.48, + 1.33, + 0.66 + ], + "protocol": { + "n_rounds": 20, + "n_calls_per_round": 20, + "n_warm": 3, + "n_stream": 16, + "seed": 314, + "n_prior_draws": 200, + "n_stress_draws": 200, + "step0_rounds": 10, + "vmap_batches": [ + 1, + 4, + 16 + ], + "route_order": "round-robin over every config, start rotated each round", + "cache_trap_guard": "fresh closure + fresh solver/analysis per route; jax.clear_caches()", + "bootstrap": { + "samples": 2000, + "seed": 12345, + "interval": "90%" + }, + "admissible": "100% distinct-multiplicity agreement with the reference on the prior draws AND max position error <= 0.002\"", + "admissible_position_tol": 0.002, + "position_noise_sigma": 0.05, + "distinct_tol": 0.005, + "prior_draws": "full prior: vector_from_unit_vector(U(1e-4, 1-1e-4)); source = solved beta*", + "stress_draws": "OUTSIDE the prior: Isothermal centre U(-0.05,0.05), theta_E U(1,2), ell_comps U(-0.2,0.2), source centre U(-0.4,0.4); plain FitPositionsImagePairAll positions", + "reference": { + "name": "reference", + "block": "reference", + "extent": 12.0, + "scale": 0.05, + "precision": 0.0001, + "max_containing_size": 60, + "neighbor_degree": 1, + "step0_route": null + }, + "reference_b": { + "name": "reference_b", + "block": "reference", + "extent": 11.0, + "scale": 0.07, + "precision": 0.0001, + "max_containing_size": 60, + "neighbor_degree": 1, + "step0_route": null + }, + "max_containing_size_patch": "ArrayTriangles.__init__ / for_limits_and_scale __defaults__ + module constant, tracing only, restored by value", + "pytrees": "autofit.jax.register_model(model) for both models before any trace" + }, + "configs": [ + { + "name": "control", + "block": "control", + "extent": null, + "scale": 0.2, + "precision": 0.001, + "max_containing_size": 15, + "neighbor_degree": 1, + "step0_route": null + }, + { + "name": "step0_gather", + "block": "step0_route", + "extent": null, + "scale": 0.2, + "precision": 0.001, + "max_containing_size": 15, + "neighbor_degree": 1, + "step0_route": "gather" + }, + { + "name": "step0_components", + "block": "step0_route", + "extent": null, + "scale": 0.2, + "precision": 0.001, + "max_containing_size": 15, + "neighbor_degree": 1, + "step0_route": "components" + }, + { + "name": "step0_structured", + "block": "step0_route", + "extent": null, + "scale": 0.2, + "precision": 0.001, + "max_containing_size": 15, + "neighbor_degree": 1, + "step0_route": "structured" + } + ], + "static": { + "control": { + "extent_half_width": [ + 9.9, + 9.9 + ], + "limits": [ + -9.9, + 9.9, + -9.9, + 9.9 + ], + "scale": 0.2, + "pixel_scale_precision": 0.001, + "n_steps": 8, + "n_steps_formula": "ceil(log2(0.2 / 0.001))", + "last_step_triangle_side": 0.0015625, + "step0_triangles": 23283, + "step0_rows": 11859, + "max_containing_size": 15, + "neighbor_degree": 1, + "step0_route": "library default (structured)" + }, + "step0_gather": { + "extent_half_width": [ + 9.9, + 9.9 + ], + "limits": [ + -9.9, + 9.9, + -9.9, + 9.9 + ], + "scale": 0.2, + "pixel_scale_precision": 0.001, + "n_steps": 8, + "n_steps_formula": "ceil(log2(0.2 / 0.001))", + "last_step_triangle_side": 0.0015625, + "step0_triangles": 23283, + "step0_rows": 11859, + "max_containing_size": 15, + "neighbor_degree": 1, + "step0_route": "gather" + }, + "step0_components": { + "extent_half_width": [ + 9.9, + 9.9 + ], + "limits": [ + -9.9, + 9.9, + -9.9, + 9.9 + ], + "scale": 0.2, + "pixel_scale_precision": 0.001, + "n_steps": 8, + "n_steps_formula": "ceil(log2(0.2 / 0.001))", + "last_step_triangle_side": 0.0015625, + "step0_triangles": 23283, + "step0_rows": 11859, + "max_containing_size": 15, + "neighbor_degree": 1, + "step0_route": "components" + }, + "step0_structured": { + "extent_half_width": [ + 9.9, + 9.9 + ], + "limits": [ + -9.9, + 9.9, + -9.9, + 9.9 + ], + "scale": 0.2, + "pixel_scale_precision": 0.001, + "n_steps": 8, + "n_steps_formula": "ceil(log2(0.2 / 0.001))", + "last_step_triangle_side": 0.0015625, + "step0_triangles": 23283, + "step0_rows": 11859, + "max_containing_size": 15, + "neighbor_degree": 1, + "step0_route": "structured" + }, + "reference": { + "extent_half_width": [ + 12.0, + 12.0 + ], + "limits": [ + -12.0, + 12.0, + -12.0, + 12.0 + ], + "scale": 0.05, + "pixel_scale_precision": 0.0001, + "n_steps": 9, + "n_steps_formula": "ceil(log2(0.05 / 0.0001))", + "last_step_triangle_side": 0.0001953125, + "step0_triangles": 535277, + "step0_rows": 268677, + "max_containing_size": 60, + "neighbor_degree": 1, + "step0_route": "library default (structured)" + }, + "reference_b": { + "extent_half_width": [ + 11.0, + 11.0 + ], + "limits": [ + -11.0, + 11.0, + -11.0, + 11.0 + ], + "scale": 0.07, + "pixel_scale_precision": 0.0001, + "n_steps": 10, + "n_steps_formula": "ceil(log2(0.07 / 0.0001))", + "last_step_triangle_side": 0.00013671875, + "step0_triangles": 229585, + "step0_rows": 115473, + "max_containing_size": 60, + "neighbor_degree": 1, + "step0_route": "library default (structured)" + } + }, + "reference_floor": { + "prior": { + "n_draws": 200, + "multiplicity_agreement": 1.0, + "raw_count_agreement": 1.0, + "n_multiplicity_mismatch": 0, + "mismatch_examples": [], + "max_position_error": 0.00015786921423151782, + "p99_position_error": 0.0001280749711777913, + "median_position_error": 5.9668954361473236e-05, + "ref_distinct_histogram": { + "2": 21, + "4": 179 + }, + "abs_delta_logl_vs_reference": { + "max": 0.09204751533968647, + "p99": 0.06845503627316121, + "median": 0.004628222675307825, + "n_nonfinite_mismatch": 0 + } + }, + "stress": { + "n_draws": 200, + "multiplicity_agreement": 1.0, + "raw_count_agreement": 1.0, + "n_multiplicity_mismatch": 0, + "mismatch_examples": [], + "max_position_error": 0.00015786921423129578, + "p99_position_error": 0.00014084184669768283, + "median_position_error": 5.966895436132821e-05, + "ref_distinct_histogram": { + "2": 163, + "4": 37 + } + } + }, + "reference_max_finite_positions": { + "prior": 4, + "stress": 4 + }, + "reference_compile": { + "reference_prior": { + "lower_s": 8.750041433988372, + "compile_s": 8.308000456017908, + "first_call_s": 0.024183892004657537, + "traced_rows_per_step": [ + 268677, + 2880, + 2880, + 2880, + 2880, + 2880, + 2880, + 2880, + 2880, + 268677, + 2880, + 2880, + 2880, + 2880, + 2880, + 2880, + 2880, + 2880, + 268677, + 2880, + 2880, + 2880, + 2880, + 2880, + 2880, + 2880, + 2880 + ], + "output_shapes": [ + [], + [ + 60, + 2 + ] + ], + "flops": 48502648.0, + "memory_analysis": { + "argument_size_in_bytes": 40, + "output_size_in_bytes": 984, + "temp_size_in_bytes": 17361496, + "alias_size_in_bytes": 0, + "generated_code_size_in_bytes": 0, + "host_temp_size_in_bytes": 0 + }, + "rss_delta_bytes": 452059136, + "max_containing_size_proof": { + "positions_shape": [ + 60, + 2 + ], + "expected_rows": 60, + "pass": true + } + }, + "reference_stress": { + "lower_s": 1.7536962699959986, + "compile_s": 2.0874339919828344, + "first_call_s": 0.02349727600812912, + "traced_rows_per_step": [ + 268677, + 2880, + 2880, + 2880, + 2880, + 2880, + 2880, + 2880, + 2880 + ], + "output_shapes": [ + [ + 60, + 2 + ] + ], + "flops": 47671892.0, + "memory_analysis": { + "argument_size_in_bytes": 64, + "output_size_in_bytes": 960, + "temp_size_in_bytes": 17361048, + "alias_size_in_bytes": 0, + "generated_code_size_in_bytes": 0, + "host_temp_size_in_bytes": 0 + }, + "rss_delta_bytes": 5283840, + "max_containing_size_proof": { + "positions_shape": [ + 60, + 2 + ], + "expected_rows": 60, + "pass": true + } + }, + "reference_b_prior": { + "lower_s": 6.3681287489889655, + "compile_s": 9.030520883999998, + "first_call_s": 0.011626578983850777, + "traced_rows_per_step": [ + 115473, + 2880, + 2880, + 2880, + 2880, + 2880, + 2880, + 2880, + 2880, + 2880, + 115473, + 2880, + 2880, + 2880, + 2880, + 2880, + 2880, + 2880, + 2880, + 2880, + 115473, + 2880, + 2880, + 2880, + 2880, + 2880, + 2880, + 2880, + 2880, + 2880 + ], + "output_shapes": [ + [], + [ + 60, + 2 + ] + ], + "flops": 23082492.0, + "memory_analysis": { + "argument_size_in_bytes": 40, + "output_size_in_bytes": 984, + "temp_size_in_bytes": 7566936, + "alias_size_in_bytes": 0, + "generated_code_size_in_bytes": 0, + "host_temp_size_in_bytes": 0 + }, + "rss_delta_bytes": 50667520, + "max_containing_size_proof": { + "positions_shape": [ + 60, + 2 + ], + "expected_rows": 60, + "pass": true + } + }, + "reference_b_stress": { + "lower_s": 1.5515906600048766, + "compile_s": 2.27375302001019, + "first_call_s": 0.011668908002320677, + "traced_rows_per_step": [ + 115473, + 2880, + 2880, + 2880, + 2880, + 2880, + 2880, + 2880, + 2880, + 2880 + ], + "output_shapes": [ + [ + 60, + 2 + ] + ], + "flops": 22251710.0, + "memory_analysis": { + "argument_size_in_bytes": 64, + "output_size_in_bytes": 960, + "temp_size_in_bytes": 7566488, + "alias_size_in_bytes": 0, + "generated_code_size_in_bytes": 0, + "host_temp_size_in_bytes": 0 + }, + "rss_delta_bytes": 1232896, + "max_containing_size_proof": { + "positions_shape": [ + 60, + 2 + ], + "expected_rows": 60, + "pass": true + } + } + }, + "default_vs_reference": { + "prior": { + "n_draws": 200, + "multiplicity_agreement": 1.0, + "raw_count_agreement": 1.0, + "n_multiplicity_mismatch": 0, + "mismatch_examples": [], + "max_position_error": 0.0008513474499103632, + "p99_position_error": 0.0007893460711577849, + "median_position_error": 0.00040657539052049436, + "ref_distinct_histogram": { + "2": 21, + "4": 179 + }, + "abs_delta_logl_vs_reference": { + "max": 0.8682473458375171, + "p99": 0.5684387609120645, + "median": 0.030920850414809298, + "n_nonfinite_mismatch": 0 + }, + "abs_delta_logl_vs_control": { + "max": 0.0, + "p99": 0.0, + "median": 0.0, + "n_nonfinite_mismatch": 0 + } + }, + "stress": { + "n_draws": 200, + "multiplicity_agreement": 1.0, + "raw_count_agreement": 1.0, + "n_multiplicity_mismatch": 0, + "mismatch_examples": [], + "max_position_error": 0.0007893460711579142, + "p99_position_error": 0.0007893460711576755, + "median_position_error": 0.0004065753905207063, + "ref_distinct_histogram": { + "2": 163, + "4": 37 + } + }, + "agrees_on_every_prior_draw": true, + "agrees_on_every_stress_draw": true, + "stress_mismatch_examples": [] + }, + "admissibility": { + "control": true, + "step0_gather": true, + "step0_components": true, + "step0_structured": true + }, + "precision_equivalent": { + "control": true, + "step0_gather": true, + "step0_components": true, + "step0_structured": true + }, + "reference_image_extent": { + "prior": { + "max_abs_y": 1.77939453125, + "max_abs_x": 1.7773254429359933, + "max_abs_coord": 1.77939453125, + "p99_abs_coord": 1.7590830914129167, + "max_radius": 1.8116226317743076 + }, + "stress": { + "max_abs_y": 2.2498046875, + "max_abs_x": 2.300267215077964, + "max_abs_coord": 2.300267215077964, + "p99_abs_coord": 2.2027852305644777, + "max_radius": 2.5191249773380773 + } + }, + "extent_working": "prior: theta_E <= 1.6 + 4*0.05 = 1.8; |e| <= 0.0526 + 4*0.01 ~ 0.09 -> q ~ 0.83; SIE images lie within ~theta_E/sqrt(q) + |beta| ~ 1.98 + 0.1 ~ 2.1 arcsec of the centre, so boxes of +-6 / +-4 / +-3 / +-2.5 bracket it; reference_image_extent is the measured value", + "best_admissible": "step0_structured", + "best_admissible_any_precision": "step0_structured", + "table": [ + { + "config": "control", + "block": "control", + "extent": 9.9, + "scale": 0.2, + "precision": 0.001, + "mcs": 15, + "neighbor_degree": 1, + "n_steps": 8, + "step0_rows": 11859, + "step0_triangles": 23283, + "median_ms": 1.9813075050478801, + "speedup": 1.0, + "speedup_ci90": [ + 0.9892159090440629, + 1.0108369243245885 + ], + "admissible": true, + "precision_equivalent": true, + "last_step_triangle_side": 0.0015625, + "prior_multiplicity_agreement": 1.0, + "prior_raw_count_agreement": 1.0, + "prior_max_err": 0.0008513474499103632, + "prior_p99_err": 0.0007893460711577849, + "prior_abs_dlogl_ref_max": 0.8682473458375171, + "prior_abs_dlogl_control_max": 0.0, + "stress_multiplicity_agreement": 1.0, + "stress_max_err": 0.0007893460711579142, + "compile_s": 4.055132859997684, + "flops": 2801341.0, + "temp_bytes": 901656 + }, + { + "config": "step0_gather", + "block": "step0_route", + "extent": 9.9, + "scale": 0.2, + "precision": 0.001, + "mcs": 15, + "neighbor_degree": 1, + "n_steps": 8, + "step0_rows": 11859, + "step0_triangles": 23283, + "median_ms": 3.1836355046834797, + "speedup": 0.6223411889122225, + "speedup_ci90": [ + 0.6156395466100351, + 0.6275383662532038 + ], + "admissible": true, + "precision_equivalent": true, + "last_step_triangle_side": 0.0015625, + "prior_multiplicity_agreement": 1.0, + "prior_raw_count_agreement": 1.0, + "prior_max_err": 0.0008513474499103632, + "prior_p99_err": 0.0007893460711577849, + "prior_abs_dlogl_ref_max": 0.8682473458375171, + "prior_abs_dlogl_control_max": 0.0, + "stress_multiplicity_agreement": 1.0, + "stress_max_err": 0.0007893460711579142, + "compile_s": 3.9973594350158237, + "flops": 3383414.0, + "temp_bytes": 1692120 + }, + { + "config": "step0_components", + "block": "step0_route", + "extent": 9.9, + "scale": 0.2, + "precision": 0.001, + "mcs": 15, + "neighbor_degree": 1, + "n_steps": 8, + "step0_rows": 11859, + "step0_triangles": 23283, + "median_ms": 1.9792630046140403, + "speedup": 1.0010329604651194, + "speedup_ci90": [ + 0.9915762775510888, + 1.0099727645188283 + ], + "admissible": true, + "precision_equivalent": true, + "last_step_triangle_side": 0.0015625, + "prior_multiplicity_agreement": 1.0, + "prior_raw_count_agreement": 1.0, + "prior_max_err": 0.0008513474499103632, + "prior_p99_err": 0.0007893460711577849, + "prior_abs_dlogl_ref_max": 0.8682473458375171, + "prior_abs_dlogl_control_max": 0.0, + "stress_multiplicity_agreement": 1.0, + "stress_max_err": 0.0007893460711579142, + "compile_s": 4.1208400769974105, + "flops": 3578378.0, + "temp_bytes": 1506264 + }, + { + "config": "step0_structured", + "block": "step0_route", + "extent": 9.9, + "scale": 0.2, + "precision": 0.001, + "mcs": 15, + "neighbor_degree": 1, + "n_steps": 8, + "step0_rows": 11859, + "step0_triangles": 23283, + "median_ms": 1.971192512428388, + "speedup": 1.0051314077928548, + "speedup_ci90": [ + 0.9950336108192507, + 1.0138289471971313 + ], + "admissible": true, + "precision_equivalent": true, + "last_step_triangle_side": 0.0015625, + "prior_multiplicity_agreement": 1.0, + "prior_raw_count_agreement": 1.0, + "prior_max_err": 0.0008513474499103632, + "prior_p99_err": 0.0007893460711577849, + "prior_abs_dlogl_ref_max": 0.8682473458375171, + "prior_abs_dlogl_control_max": 0.0, + "stress_multiplicity_agreement": 1.0, + "stress_max_err": 0.0007893460711579142, + "compile_s": 4.190009113022825, + "flops": 2801341.0, + "temp_bytes": 901656 + } + ], + "rows": { + "control": { + "config": { + "name": "control", + "block": "control", + "extent": null, + "scale": 0.2, + "precision": 0.001, + "max_containing_size": 15, + "neighbor_degree": 1, + "step0_route": null + }, + "static": { + "extent_half_width": [ + 9.9, + 9.9 + ], + "limits": [ + -9.9, + 9.9, + -9.9, + 9.9 + ], + "scale": 0.2, + "pixel_scale_precision": 0.001, + "n_steps": 8, + "n_steps_formula": "ceil(log2(0.2 / 0.001))", + "last_step_triangle_side": 0.0015625, + "step0_triangles": 23283, + "step0_rows": 11859, + "max_containing_size": 15, + "neighbor_degree": 1, + "step0_route": "library default (structured)" + }, + "stats": { + "n": 400, + "median_ms": 1.9813075050478801, + "p10_ms": 1.8009490187978372, + "p90_ms": 2.1719150099670514, + "min_ms": 1.4919799868948758, + "max_ms": 3.1976399768609554, + "mean_ms": 1.986411474426859 + }, + "speedup_vs_control": { + "ratio": 1.0, + "ci90_low": 0.9892159090440629, + "ci90_high": 1.0108369243245885, + "bootstrap_samples": 2000 + }, + "paired_round_speedup": { + "median": 1.0, + "p10": 1.0, + "p90": 1.0 + }, + "compile": { + "lower_s": 2.687993858009577, + "compile_s": 4.055132859997684, + "first_call_s": 0.0031670609896536916, + "traced_rows_per_step": [ + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720, + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720 + ], + "output_shapes": [ + [] + ], + "flops": 2801341.0, + "memory_analysis": { + "argument_size_in_bytes": 40, + "output_size_in_bytes": 8, + "temp_size_in_bytes": 901656, + "alias_size_in_bytes": 0, + "generated_code_size_in_bytes": 0, + "host_temp_size_in_bytes": 0 + }, + "rss_delta_bytes": 2813952, + "max_containing_size_proof": null + }, + "warm_ms": [ + 2.8663020057138056, + 2.255575993331149, + 1.909148006234318 + ], + "per_call_ms": [ + 1.9479180045891553, + 2.0338470058050007, + 2.1504369797185063, + 1.989628013689071, + 1.982488000066951, + 1.8972889811266214, + 2.030338015174493, + 2.2460779873654246, + 1.8577289883978665, + 1.911867002490908, + 1.8023680022452027, + 1.7189200152643025, + 1.9810170051641762, + 1.9189290178474039, + 2.0584979793056846, + 1.9983079982921481, + 1.90369802294299, + 2.021517982939258, + 2.067027991870418, + 1.9562880042940378, + 1.8247189873363823, + 1.7156579997390509, + 1.9590979791246355, + 1.5846599999349564, + 1.9478780159261078, + 1.7571790085639805, + 1.6997400089167058, + 1.9188489823136479, + 1.8309589941054583, + 1.7367689870297909, + 1.6067399992607534, + 1.5828199975658208, + 1.6023409843910486, + 2.0344080112408847, + 2.180386014515534, + 1.9578680221457034, + 2.0655870030168444, + 2.018127008341253, + 1.9226779986638576, + 1.9964480015914887, + 2.024266985245049, + 1.7002790118567646, + 2.2777960111852735, + 1.894457993330434, + 2.0788770052604377, + 1.9737980037461966, + 2.198845992097631, + 1.9265279988758266, + 2.0480669918470085, + 1.9449280225671828, + 1.917557994602248, + 1.8872780201490968, + 1.8720380030572414, + 1.9044979999307543, + 2.0176279940642416, + 1.9941469945479184, + 2.0773769938386977, + 1.9275079830549657, + 1.899388007586822, + 1.926597993588075, + 2.9493010079022497, + 3.1976399768609554, + 2.4854640068951994, + 2.2059960174374282, + 2.1445369930006564, + 2.105527004459873, + 1.9453580025583506, + 2.8891830006614327, + 2.0161969878245145, + 2.1354469936341047, + 2.5367549969814718, + 1.6596099885646254, + 1.9885980000253767, + 2.0001980010420084, + 2.3444549879059196, + 2.1984369959682226, + 2.017138001974672, + 2.037407015450299, + 2.4403060087934136, + 2.711083012400195, + 2.0593480148818344, + 2.1851870114915073, + 1.9016680016648024, + 2.1891259821131825, + 2.0436169870663434, + 1.7685290076769888, + 1.9823180045932531, + 2.0188269845675677, + 1.9756280235014856, + 1.672129990765825, + 1.8438489933032542, + 2.0658569992519915, + 1.8002289871219546, + 1.8985980132129043, + 1.9740679999813437, + 2.1892559889238328, + 1.952967984834686, + 1.9731879874598235, + 2.046737994533032, + 2.0156879909336567, + 1.8147089867852628, + 1.6101000073831528, + 1.8396789964754134, + 2.0054370106663555, + 2.137827017577365, + 1.9180670205969363, + 2.2309169871732593, + 1.931828010128811, + 1.986946997931227, + 1.8816990195773542, + 1.9253889913670719, + 1.8185380031354725, + 2.063516993075609, + 1.8773479969240725, + 1.8865169840864837, + 1.9680479890666902, + 2.239536988781765, + 1.9069580012001097, + 1.8420190026517957, + 2.038287988398224, + 1.8631590064615011, + 2.1543460024986416, + 1.981598004931584, + 1.8740679952315986, + 1.9506180251482874, + 2.0061669929418713, + 2.154846995836124, + 1.782259001629427, + 1.9608470029197633, + 1.9133890164084733, + 2.0543380232993513, + 1.9346780027262866, + 1.945608004461974, + 2.080937003483996, + 1.9582379900384694, + 1.9949479901697487, + 1.8854289955925196, + 1.7828690179158002, + 1.4919799868948758, + 1.7745399964042008, + 1.7607889894861728, + 1.8097090069204569, + 2.049517002888024, + 2.023987006396055, + 2.070036978693679, + 2.287615992827341, + 1.931348000653088, + 1.9750780193135142, + 2.1129570086486638, + 1.8269690044689924, + 2.0793579751625657, + 1.8411980126984417, + 1.9027089874725789, + 1.9564479880500585, + 2.04237800789997, + 1.950617996044457, + 2.0328079990576953, + 1.699159009149298, + 1.5488200006075203, + 1.9225179858040065, + 1.8321290262974799, + 2.0642669987864792, + 2.1134470007382333, + 2.0063769770786166, + 2.0621169824153185, + 1.8984190246555954, + 1.9502579816617072, + 1.7907790024764836, + 1.8222189974039793, + 1.926587981870398, + 1.6782799793872982, + 1.6350600053556263, + 1.7110590124502778, + 1.829218992497772, + 1.8968570220749825, + 1.7143879958894104, + 2.0685170020442456, + 2.024857996730134, + 1.8500880105420947, + 1.8835680093616247, + 1.8961990135721862, + 2.0025179837830365, + 2.0586670143529773, + 2.0222079765517265, + 2.088156994432211, + 2.1396469965111464, + 2.0141669956501573, + 2.033127995673567, + 1.951518002897501, + 2.0275080169085413, + 2.0256479911040515, + 1.9978769996669143, + 1.9405079947318882, + 2.2244760184548795, + 1.8438980041537434, + 1.9248180033173412, + 1.9417580042500049, + 1.9179380033165216, + 2.1129669912625104, + 1.8760179809760302, + 1.811438996810466, + 2.024576999247074, + 2.0859869837295264, + 2.3138149990700185, + 2.5366350018884987, + 1.9752180087380111, + 2.207275974797085, + 1.9700279808603227, + 2.1571370016317815, + 2.062987012322992, + 2.018098020926118, + 2.235275984276086, + 2.075337019050494, + 1.9591680029407144, + 2.0140870183240622, + 2.185117016779259, + 2.139696996891871, + 1.8847280007321388, + 1.9975079922005534, + 1.9210379978176206, + 2.0264269842300564, + 1.9991970038972795, + 2.083706989651546, + 1.8958179862238467, + 1.9567779963836074, + 1.9184389966540039, + 2.1116870047990233, + 2.0273280097171664, + 1.947777986060828, + 2.1085670159664005, + 2.034717006608844, + 2.081286977045238, + 1.9560480141080916, + 1.9478879985399544, + 1.8527590145822614, + 2.1595259895548224, + 1.7771990096662194, + 2.089037006953731, + 2.0633770036511123, + 1.9554980099201202, + 1.8571990076452494, + 1.9665379950311035, + 2.0394780149217695, + 1.9494479929562658, + 1.962238020496443, + 1.856758986832574, + 2.0230569934938103, + 1.908517995616421, + 1.8609580001793802, + 1.775228010956198, + 2.007958013564348, + 1.7924789863172919, + 1.8165489891543984, + 1.8793080234900117, + 2.266105992021039, + 2.013318007811904, + 1.9833680125884712, + 2.0876080088783056, + 1.8439679988659918, + 1.9933480070903897, + 1.8104180053342134, + 1.9344979955349118, + 1.9893179996870458, + 1.9646569853648543, + 1.6190299938898534, + 1.5826699964236468, + 1.623000018298626, + 1.7671179957687855, + 1.939528010552749, + 2.218206995166838, + 2.0379070192575455, + 1.919757982250303, + 1.9866980146616697, + 1.9551279838196933, + 1.9393079855944961, + 1.8665090028662235, + 2.239916007965803, + 1.8837090174201876, + 1.8666789983399212, + 1.9065079977735877, + 1.8010290223173797, + 2.2301669814623892, + 1.9377190037630498, + 1.9695780065376312, + 2.088716981234029, + 2.0193169766571373, + 2.138087002094835, + 2.0687969808932394, + 2.130806999048218, + 1.978498010430485, + 2.0125070004723966, + 1.9921379862353206, + 1.9802979950327426, + 2.0249579974915832, + 2.2463269997388124, + 2.028416987741366, + 2.136316994437948, + 2.1657370089087635, + 1.975207997020334, + 1.9247790041845292, + 1.6525500104762614, + 2.153537003323436, + 2.0296970033086836, + 1.9418780284468085, + 2.08426799508743, + 2.0344869990367442, + 1.980967994313687, + 2.123656013282016, + 1.9563579990062863, + 2.050656999927014, + 2.1089369838591665, + 2.0152470096945763, + 2.2075460001360625, + 1.7705389764159918, + 2.006587979849428, + 2.1009369811508805, + 2.0529080065898597, + 2.0454180194064975, + 1.8761279934551567, + 2.0165180030744523, + 1.9198679947294295, + 2.0079380192328244, + 2.101097023114562, + 2.0945569849573076, + 2.0237379940226674, + 2.1895969985052943, + 2.0096070074941963, + 1.8563889898359776, + 2.02232800074853, + 2.2636959911324084, + 2.049377973889932, + 2.0444569818209857, + 1.9417779985815287, + 1.984148024348542, + 1.89471899648197, + 1.9178889924660325, + 1.9295579986646771, + 2.151897002477199, + 2.1453869994729757, + 2.063767984509468, + 1.8521889869589359, + 1.8855590024031699, + 2.034028002526611, + 1.8919889989774674, + 2.2921359923202544, + 2.091727015795186, + 1.7862190143205225, + 2.1816760126966983, + 1.9860879983752966, + 1.9195890054106712, + 2.0598379778675735, + 2.068547997623682, + 1.824028993723914, + 1.8019490235019475, + 1.927498000441119, + 1.982756977668032, + 2.0239180012140423, + 1.9418979936745018, + 1.9571979937609285, + 2.2017359733581543, + 1.7660790181253105, + 1.8853289948310703, + 2.176756999688223, + 1.8564079946372658, + 2.1713770111091435, + 1.9101679790765047, + 1.869198022177443, + 1.9338080019224435, + 1.8956679850816727, + 1.7824189853854477, + 1.654980005696416, + 1.9379680161364377, + 2.130415989086032, + 1.8900379945989698, + 1.822129008360207, + 1.8920589936897159, + 2.0070269820280373, + 1.9370480149518698, + 2.018137980485335, + 1.9939379999414086, + 2.0138770050834864, + 2.03047800459899, + 1.8525990017224103, + 1.9231079786550254, + 2.0661370072048157, + 2.0375669992063195, + 2.0618670096155256, + 2.081926999380812, + 2.2768069757148623, + 2.1798970119562, + 2.0874869951512665, + 2.0632779924198985, + 1.9220979884266853, + 1.952488993993029, + 1.9236789958085865, + 1.9542480004020035, + 2.0658169814851135, + 2.039836981566623, + 2.033547993050888, + 2.0193069940432906 + ], + "deterministic": true, + "fiducial_log_likelihood": 7.743201200876812, + "stream_log_likelihood": [ + 7.743201200876812, + -4.1609527513907665, + 7.657972665309639, + 9.36455094905725, + 7.051561357429164, + 9.219327498422563, + 0.8907045816755463, + -34.37790701671691, + -24.578291065194456, + -0.4990240338966814, + 0.702590691739907, + 7.669569297550711, + -0.4639011650528264, + -5.412376751794213, + 5.343244353416, + -20.481275097418568 + ], + "admissible": true, + "completeness_prior": { + "n_draws": 200, + "multiplicity_agreement": 1.0, + "raw_count_agreement": 1.0, + "n_multiplicity_mismatch": 0, + "mismatch_examples": [], + "max_position_error": 0.0008513474499103632, + "p99_position_error": 0.0007893460711577849, + "median_position_error": 0.00040657539052049436, + "ref_distinct_histogram": { + "2": 21, + "4": 179 + }, + "abs_delta_logl_vs_reference": { + "max": 0.8682473458375171, + "p99": 0.5684387609120645, + "median": 0.030920850414809298, + "n_nonfinite_mismatch": 0 + }, + "abs_delta_logl_vs_control": { + "max": 0.0, + "p99": 0.0, + "median": 0.0, + "n_nonfinite_mismatch": 0 + } + }, + "completeness_stress": { + "n_draws": 200, + "multiplicity_agreement": 1.0, + "raw_count_agreement": 1.0, + "n_multiplicity_mismatch": 0, + "mismatch_examples": [], + "max_position_error": 0.0007893460711579142, + "p99_position_error": 0.0007893460711576755, + "median_position_error": 0.0004065753905207063, + "ref_distinct_histogram": { + "2": 163, + "4": 37 + } + } + }, + "step0_gather": { + "config": { + "name": "step0_gather", + "block": "step0_route", + "extent": null, + "scale": 0.2, + "precision": 0.001, + "max_containing_size": 15, + "neighbor_degree": 1, + "step0_route": "gather" + }, + "static": { + "extent_half_width": [ + 9.9, + 9.9 + ], + "limits": [ + -9.9, + 9.9, + -9.9, + 9.9 + ], + "scale": 0.2, + "pixel_scale_precision": 0.001, + "n_steps": 8, + "n_steps_formula": "ceil(log2(0.2 / 0.001))", + "last_step_triangle_side": 0.0015625, + "step0_triangles": 23283, + "step0_rows": 11859, + "max_containing_size": 15, + "neighbor_degree": 1, + "step0_route": "gather" + }, + "stats": { + "n": 400, + "median_ms": 3.1836355046834797, + "p10_ms": 2.8291361057199538, + "p90_ms": 3.5758650832576677, + "min_ms": 2.3185760073829442, + "max_ms": 3.8922770181670785, + "mean_ms": 3.1937458828178933 + }, + "speedup_vs_control": { + "ratio": 0.6223411889122225, + "ci90_low": 0.6156395466100351, + "ci90_high": 0.6275383662532038, + "bootstrap_samples": 2000 + }, + "paired_round_speedup": { + "median": 0.6200591642378285, + "p10": 0.6012462472507466, + "p90": 0.6450524273383553 + }, + "compile": { + "lower_s": 2.5578584960021544, + "compile_s": 3.9973594350158237, + "first_call_s": 0.003534618008416146, + "traced_rows_per_step": [ + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720, + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720 + ], + "output_shapes": [ + [] + ], + "flops": 3383414.0, + "memory_analysis": { + "argument_size_in_bytes": 40, + "output_size_in_bytes": 8, + "temp_size_in_bytes": 1692120, + "alias_size_in_bytes": 0, + "generated_code_size_in_bytes": 0, + "host_temp_size_in_bytes": 0 + }, + "rss_delta_bytes": 3964928, + "max_containing_size_proof": null + }, + "warm_ms": [ + 2.7973440010100603, + 3.3909880148712546, + 3.3743699896149337 + ], + "per_call_ms": [ + 2.8701419942080975, + 3.55758800287731, + 3.137020015856251, + 3.6074279923923314, + 3.224560001399368, + 3.134639991912991, + 2.8308229811955243, + 3.050169994821772, + 3.250601002946496, + 3.4460389870218933, + 2.8640620002988726, + 2.7960430015809834, + 2.7733529859688133, + 3.2832410070113838, + 3.068240999709815, + 3.213579999282956, + 3.170961019350216, + 3.3585789788048714, + 2.3185760073829442, + 2.78099300339818, + 2.3997650132514536, + 3.4210779995191842, + 3.1625110132154077, + 3.0814220081083477, + 3.0872900097165257, + 3.013192006619647, + 3.1405200134031475, + 3.648126992629841, + 3.0852020136080682, + 3.1702900014352053, + 3.1822409946471453, + 3.158029983751476, + 2.967251988593489, + 2.992942987475544, + 2.7546630008146167, + 3.1853410182520747, + 3.397199005121365, + 3.161930973874405, + 3.0126009951345623, + 3.4433790133334696, + 3.06120200548321, + 3.20984999416396, + 3.2319099991582334, + 2.8511419950518757, + 3.2575700024608523, + 3.4720090043265373, + 3.085889999056235, + 3.255960007663816, + 3.122109977994114, + 3.433438978390768, + 3.167821007082239, + 3.1025009811855853, + 3.1639910012017936, + 3.4805290051735938, + 3.1397500133607537, + 3.3829190069809556, + 2.807231998303905, + 3.589667991036549, + 2.882333006709814, + 3.3487780019640923, + 2.9466929845511913, + 3.8922770181670785, + 3.501697996398434, + 3.010852000443265, + 2.8642120014410466, + 3.703568014316261, + 3.0248120019678026, + 3.210429014870897, + 3.5197090182919055, + 3.4664489794522524, + 3.675777988974005, + 3.3855299989227206, + 3.175049991114065, + 3.1026119831949472, + 3.1275899964384735, + 3.5033280146308243, + 3.5789980029221624, + 3.354349988512695, + 3.520736994687468, + 3.335949993925169, + 2.9663220047950745, + 3.6802859976887703, + 3.2438999915029854, + 3.15308099379763, + 3.0715210014022887, + 3.192790987668559, + 3.4795289975591004, + 2.775543020106852, + 3.0365519924089313, + 3.1987999973353, + 2.745973994024098, + 3.2063999969977885, + 3.3017899841070175, + 3.599917981773615, + 3.3306289988104254, + 3.1072119891177863, + 3.1671110191382468, + 3.0292809824459255, + 2.81059299595654, + 2.903781976783648, + 3.341537987580523, + 3.12061098520644, + 3.560568002285436, + 3.2635789830237627, + 3.713766986038536, + 3.0725719989277422, + 3.1247510050889105, + 3.1835510162636638, + 3.267049993155524, + 3.575516981072724, + 3.1030609970912337, + 3.201731014996767, + 3.09059998835437, + 2.898342994740233, + 2.9712409886997193, + 3.178601007675752, + 3.087270015385002, + 3.082570998230949, + 2.7267529803793877, + 3.44904899247922, + 2.791222999803722, + 3.352688974700868, + 3.1972310098353773, + 3.021501994226128, + 3.2507500145584345, + 3.2901300000958145, + 2.8167529962956905, + 3.5642389848362654, + 3.3022610004991293, + 3.6696379829663783, + 2.9657609993591905, + 3.2134999928530306, + 3.1737899989821017, + 3.2032209855969995, + 3.0804620182607323, + 3.3600080059841275, + 2.792562998365611, + 2.8722620045300573, + 3.445938986260444, + 3.7614870234392583, + 2.9348829993978143, + 3.5277190036140382, + 3.3248479885514826, + 3.183911001542583, + 2.830512006767094, + 3.5096580104436725, + 3.2191310019697994, + 3.654906991869211, + 2.7235830202698708, + 3.1358510022982955, + 2.997231000335887, + 3.192650998244062, + 3.614476998336613, + 3.4922189952339977, + 3.0584520136471838, + 3.604148019803688, + 3.3904879819601774, + 2.860962995328009, + 2.753322012722492, + 3.112981008598581, + 2.5537150213494897, + 2.8779720014426857, + 2.57377399248071, + 2.458034985465929, + 3.206808993127197, + 3.09494198882021, + 2.7668029943015426, + 3.2667700143065304, + 3.2443399832118303, + 3.2356290030293167, + 2.9584119911305606, + 3.468629001872614, + 2.8899619937874377, + 3.532697999617085, + 2.479424001649022, + 2.7981940074823797, + 3.0078210111241788, + 3.248030989198014, + 3.6888679896946996, + 2.98296200344339, + 3.3383000118192285, + 3.4224989940412343, + 3.0695120221935213, + 3.375769010744989, + 3.5119880049023777, + 3.2865109969861805, + 2.733364002779126, + 3.223629028070718, + 3.5407090035732836, + 3.081581002334133, + 3.1566099787596613, + 3.3252499997615814, + 3.520958998706192, + 3.4639980003703386, + 3.6151980166323483, + 3.0087120248936117, + 2.857351995771751, + 3.0864920117892325, + 3.1817889830563217, + 3.553308022674173, + 2.9905509727541357, + 3.5502190003171563, + 3.1393909885082394, + 3.073921980103478, + 3.6395979986991733, + 3.4044999920297414, + 3.446549002546817, + 3.260751022025943, + 3.5232490045018494, + 2.5799339928198606, + 3.1587420089636, + 3.2105800055433065, + 2.9917820065747947, + 3.0103710014373064, + 3.3169499947689474, + 3.095621010288596, + 2.843841997673735, + 2.9754110146313906, + 2.7074540266767144, + 2.875821985071525, + 2.6901240053121, + 3.217518999008462, + 2.8912629932165146, + 2.6727229997050017, + 2.6900840166490525, + 2.993711008457467, + 2.9993130010552704, + 3.2030300062615424, + 3.0998610018286854, + 2.8964020020794123, + 3.049321996513754, + 3.62542801303789, + 2.920161990914494, + 3.657067019958049, + 3.6483780131675303, + 3.319390001706779, + 3.2533599878661335, + 3.3095600083470345, + 3.32645999151282, + 3.5081479873042554, + 3.179909981554374, + 2.7344939881004393, + 3.0830010073259473, + 3.129660995909944, + 3.3707779948599637, + 3.2880399958230555, + 3.4884290071204305, + 3.146099974401295, + 3.5397879837546498, + 3.0122019816190004, + 3.6791279853787273, + 3.3870080078486353, + 3.6822569963987917, + 3.179010993335396, + 3.265678999014199, + 2.967041014926508, + 2.8511519776657224, + 3.1110119889490306, + 3.0720210052095354, + 3.4252979967277497, + 2.7999120065942407, + 2.77962299878709, + 3.1893900013528764, + 3.0092429951764643, + 3.1482400081586093, + 3.275590017437935, + 3.5076490021310747, + 3.435029007960111, + 3.6641769984271377, + 3.4700980177149177, + 2.785464021144435, + 3.055290988413617, + 3.4526989911682904, + 3.0123110045678914, + 3.41903799562715, + 3.603897988796234, + 3.0155220010783523, + 3.5962479887530208, + 3.045311983441934, + 3.2193099905271083, + 3.251490998081863, + 3.2909290166571736, + 3.610067971749231, + 3.7344270094763488, + 3.3465299929957837, + 3.532078000716865, + 2.90288298856467, + 3.123311005765572, + 3.2376509916502982, + 3.6920770071446896, + 3.6091379879508168, + 3.1518810137640685, + 3.1473609851673245, + 3.1965910166036338, + 3.5720769956242293, + 3.1275209912564605, + 3.2239410211332142, + 2.986141014844179, + 3.18542099557817, + 3.233510011341423, + 2.491405000910163, + 3.569709020666778, + 2.8035940194968134, + 2.9327410156838596, + 3.094650979619473, + 2.443425008095801, + 3.1464409839827567, + 3.467118978733197, + 3.4454489941708744, + 2.6753929851111025, + 3.213660995243117, + 3.050111001357436, + 2.7721640071831644, + 3.015580994542688, + 3.589008003473282, + 3.5057189816143364, + 2.94984201900661, + 3.5077079955954105, + 3.5927779972553253, + 3.167971008224413, + 2.9325520154088736, + 3.59535901225172, + 3.1546899990644306, + 3.049371996894479, + 2.7300429937895387, + 3.5426290123723447, + 3.071172017371282, + 3.582198027288541, + 3.176850004820153, + 3.298420022474602, + 3.5897690104320645, + 3.082071023527533, + 3.2512510078959167, + 3.1757199903950095, + 3.6201070179231465, + 3.524109022691846, + 3.283130005002022, + 3.593547997297719, + 3.2046590058598667, + 3.101420996244997, + 3.223601001081988, + 3.536959004122764, + 2.8330530039966106, + 2.8458739980123937, + 3.1952699937392026, + 3.320669988170266, + 3.2071699970401824, + 3.7664760020561516, + 3.1064809882082045, + 3.0085620237514377, + 3.508207999402657, + 2.4476149992551655, + 3.2077900250442326, + 3.5140080144628882, + 3.5014990135096014, + 3.1631500169169158, + 3.2225009927060455, + 3.555068018613383, + 3.1798190029803663, + 3.4189799916930497, + 2.958601020509377, + 3.1676910002715886, + 3.132649988401681, + 3.249920002417639, + 3.0803109984844923, + 2.9084320121910423, + 3.6238479951862246, + 3.0247819959186018, + 3.185470006428659, + 3.0713620071765035, + 3.262548998463899, + 3.381128975888714, + 3.2068210130091757, + 3.2256199920084327, + 3.2671799999661744, + 3.0591009999625385, + 3.070141014177352, + 3.596497990656644, + 2.913042000727728, + 3.1777709955349565, + 3.084541007410735, + 3.1837199931032956, + 3.2947809959296137, + 3.2651799847371876, + 3.5679879947565496, + 3.4820190048776567, + 3.3236600283998996, + 3.1734200019855052, + 3.3804900012910366, + 3.0926110048312694, + 3.209569986211136, + 3.4922089835163206, + 3.0516420083586127, + 3.0379510135389864, + 2.7003430004697293, + 3.013492008903995, + 3.4616090124472976, + 3.0706610123161227, + 3.1983710068743676, + 3.0000109982211143 + ], + "deterministic": true, + "fiducial_log_likelihood": 7.743201200876812, + "stream_log_likelihood": [ + 7.743201200876812, + -4.1609527513907665, + 7.657972665309639, + 9.36455094905725, + 7.051561357429164, + 9.219327498422563, + 0.8907045816755463, + -34.37790701671691, + -24.578291065194456, + -0.4990240338966814, + 0.702590691739907, + 7.669569297550711, + -0.4639011650528264, + -5.412376751794213, + 5.343244353416, + -20.481275097418568 + ], + "admissible": true, + "completeness_prior": { + "n_draws": 200, + "multiplicity_agreement": 1.0, + "raw_count_agreement": 1.0, + "n_multiplicity_mismatch": 0, + "mismatch_examples": [], + "max_position_error": 0.0008513474499103632, + "p99_position_error": 0.0007893460711577849, + "median_position_error": 0.00040657539052049436, + "ref_distinct_histogram": { + "2": 21, + "4": 179 + }, + "abs_delta_logl_vs_reference": { + "max": 0.8682473458375171, + "p99": 0.5684387609120645, + "median": 0.030920850414809298, + "n_nonfinite_mismatch": 0 + }, + "abs_delta_logl_vs_control": { + "max": 0.0, + "p99": 0.0, + "median": 0.0, + "n_nonfinite_mismatch": 0 + } + }, + "completeness_stress": { + "n_draws": 200, + "multiplicity_agreement": 1.0, + "raw_count_agreement": 1.0, + "n_multiplicity_mismatch": 0, + "mismatch_examples": [], + "max_position_error": 0.0007893460711579142, + "p99_position_error": 0.0007893460711576755, + "median_position_error": 0.0004065753905207063, + "ref_distinct_histogram": { + "2": 163, + "4": 37 + } + } + }, + "step0_components": { + "config": { + "name": "step0_components", + "block": "step0_route", + "extent": null, + "scale": 0.2, + "precision": 0.001, + "max_containing_size": 15, + "neighbor_degree": 1, + "step0_route": "components" + }, + "static": { + "extent_half_width": [ + 9.9, + 9.9 + ], + "limits": [ + -9.9, + 9.9, + -9.9, + 9.9 + ], + "scale": 0.2, + "pixel_scale_precision": 0.001, + "n_steps": 8, + "n_steps_formula": "ceil(log2(0.2 / 0.001))", + "last_step_triangle_side": 0.0015625, + "step0_triangles": 23283, + "step0_rows": 11859, + "max_containing_size": 15, + "neighbor_degree": 1, + "step0_route": "components" + }, + "stats": { + "n": 400, + "median_ms": 1.9792630046140403, + "p10_ms": 1.8095480103511363, + "p90_ms": 2.146816995809786, + "min_ms": 1.5161810151766986, + "max_ms": 2.4881939752958715, + "mean_ms": 1.9813577875174815 + }, + "speedup_vs_control": { + "ratio": 1.0010329604651194, + "ci90_low": 0.9915762775510888, + "ci90_high": 1.0099727645188283, + "bootstrap_samples": 2000 + }, + "paired_round_speedup": { + "median": 1.0063807441634844, + "p10": 0.9570340954335629, + "p90": 1.0465114178156316 + }, + "compile": { + "lower_s": 2.5268545360013377, + "compile_s": 4.1208400769974105, + "first_call_s": 0.002543174021411687, + "traced_rows_per_step": [ + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720, + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720 + ], + "output_shapes": [ + [] + ], + "flops": 3578378.0, + "memory_analysis": { + "argument_size_in_bytes": 40, + "output_size_in_bytes": 8, + "temp_size_in_bytes": 1506264, + "alias_size_in_bytes": 0, + "generated_code_size_in_bytes": 0, + "host_temp_size_in_bytes": 0 + }, + "rss_delta_bytes": 6008832, + "max_containing_size_proof": null + }, + "warm_ms": [ + 2.0427979761734605, + 1.781358994776383, + 2.093037008307874 + ], + "per_call_ms": [ + 1.7138099938165396, + 1.9275990198366344, + 2.0385379903018475, + 2.2241270053200424, + 1.860949007095769, + 1.7996990063693374, + 1.9806569907814264, + 2.2349960054270923, + 2.053898002486676, + 1.9730679923668504, + 1.9364079926162958, + 1.9139779906254262, + 2.0105779985897243, + 1.659539993852377, + 2.4881939752958715, + 2.0005280093755573, + 2.1073569951113313, + 1.9651280017569661, + 1.8488189962226897, + 1.9168180006090552, + 2.1373370254877955, + 1.9355980039108545, + 2.0434079924598336, + 2.0770780101884156, + 1.97042798390612, + 2.1420069970190525, + 2.0449479925446212, + 2.000256994506344, + 2.0700470195151865, + 2.0529269822873175, + 2.161056996555999, + 1.966957002878189, + 1.919608999742195, + 2.0162879955023527, + 1.9802280003204942, + 1.969827979337424, + 2.1949759975541383, + 1.8111590179614723, + 1.9931179995182902, + 1.9055889861192554, + 1.7869980074465275, + 2.0575789967551827, + 1.8997680163010955, + 1.9583679968491197, + 1.982757996302098, + 1.6917390166781843, + 2.079258003504947, + 2.109207009198144, + 1.8718880019150674, + 1.9956979958806187, + 2.102447993820533, + 1.7747879901435226, + 1.7403090023435652, + 2.123137004673481, + 1.9011789991054684, + 1.9204290001653135, + 1.9335190008860081, + 1.8078289867844433, + 1.923798001371324, + 1.7918590165209025, + 1.8217189935967326, + 2.0599270064849406, + 2.1057169942650944, + 2.3566560121253133, + 2.103667997289449, + 2.137326984666288, + 2.1444259909912944, + 1.9001580076292157, + 1.8869279883801937, + 1.8994279962498695, + 2.052976982668042, + 1.9353580137249082, + 2.0823670201934874, + 1.9172280153725296, + 1.7220790032297373, + 2.0038780057802796, + 1.8473590025678277, + 2.2127059928607196, + 1.8718780193012208, + 1.9979279895778745, + 1.8822179990820587, + 1.9036180165130645, + 1.938587985932827, + 1.9991669978480786, + 2.092737006023526, + 1.8650690035428852, + 2.101156977005303, + 1.8639889894984663, + 1.9186080025974661, + 1.9862879998981953, + 2.0916369976475835, + 1.9426790240686387, + 1.9263990106992424, + 2.0392980077303946, + 2.0170369825791568, + 1.8051990191452205, + 1.7300689942203462, + 1.737518992740661, + 1.6495599993504584, + 1.9160480005666614, + 1.9172079919371754, + 1.891218009404838, + 1.9428379891905934, + 1.917137997224927, + 2.1040669817011803, + 1.916239009005949, + 2.105496998410672, + 1.9852480036206543, + 2.0804270170629025, + 1.959927991265431, + 1.9969179993495345, + 1.9842970068566501, + 1.8213290022686124, + 2.0913170010317117, + 1.9638479861896485, + 1.9686479936353862, + 2.0243570033926517, + 2.0774069998878986, + 1.9344580068718642, + 2.245655981823802, + 2.0666869822889566, + 1.9978079944849014, + 1.8997479928657413, + 1.8626390083227307, + 2.0227570203132927, + 1.9803479954134673, + 2.1742760145571083, + 1.9938180048484355, + 1.923228002851829, + 1.981937006348744, + 2.0896769710816443, + 2.002348017413169, + 1.975428021978587, + 2.031878015259281, + 1.8217390170320868, + 2.2202060208655894, + 1.773099007550627, + 2.0461670064833015, + 2.1516770066227764, + 1.8330290040466934, + 1.9512080179993063, + 2.140955999493599, + 1.9708580221049488, + 1.8938079883810133, + 1.957278000190854, + 2.101777005009353, + 2.1462769946083426, + 2.0801170030608773, + 2.0070169994141906, + 1.827049010898918, + 2.0052670151926577, + 1.9864380010403693, + 2.1863360016141087, + 2.0219970028847456, + 2.0336779998615384, + 1.9291280186735094, + 1.8698489875532687, + 1.616719993762672, + 1.625770004466176, + 2.0946579752489924, + 1.7003290122374892, + 2.0479270024225116, + 2.1613869757857174, + 2.0435669866856188, + 2.1184670040383935, + 2.335927012609318, + 1.854446978541091, + 2.096458018058911, + 1.9956979958806187, + 1.9744070013985038, + 2.1119470184203237, + 1.9848380179610103, + 2.0593280205503106, + 2.0093769999220967, + 2.249606011901051, + 1.9457880116533488, + 2.2329160128720105, + 1.9757469999603927, + 2.1461369760800153, + 1.9728770130313933, + 1.7793590086512268, + 1.996576989768073, + 1.976367988390848, + 1.9427580118644983, + 1.9556180050130934, + 2.1107470092829317, + 1.9570479926187545, + 1.9409780215937644, + 2.1844459988642484, + 2.199135982664302, + 1.979838008992374, + 1.9638679805211723, + 1.9828379736281931, + 2.0175680110696703, + 2.0789779955521226, + 2.0522979903034866, + 1.9166679994668812, + 2.2541260113939643, + 2.0578269904945046, + 1.9730679923668504, + 1.9168879953213036, + 2.057336998404935, + 1.9412279943935573, + 1.954437990207225, + 1.8522989994380623, + 1.8896980036515743, + 1.9037279998883605, + 1.9161879899911582, + 1.9824279879685491, + 1.930897997226566, + 1.7901689861901104, + 1.849697990110144, + 2.120637014741078, + 2.055966993793845, + 1.8884079763665795, + 2.2577559866476804, + 1.8865979800466448, + 2.2293259971775115, + 1.915978005854413, + 2.0381869981065392, + 1.9717680115718395, + 1.9727179897017777, + 2.0798469777218997, + 2.217656990978867, + 2.179417002480477, + 2.0727669761981815, + 1.9613679905887693, + 1.8121690081898123, + 1.5825100126676261, + 2.080917009152472, + 2.3124059953261167, + 2.0950879843439907, + 1.8930189835373312, + 1.7560800188221037, + 1.5730989980511367, + 1.951366983121261, + 1.9999569922219962, + 1.8755179771687835, + 1.9768879865296185, + 2.049419010290876, + 1.886007987195626, + 2.1952059760224074, + 2.050048002274707, + 2.039497980149463, + 1.7678579897619784, + 2.122776990290731, + 2.1349070011638105, + 2.2077170142438263, + 1.8212089780718088, + 1.9089679990429431, + 2.036707999650389, + 2.0483880070969462, + 2.087877976009622, + 1.9786880002357066, + 1.7305889923591167, + 1.8137589795514941, + 2.273885009344667, + 1.9602379761636257, + 2.1185969817452133, + 1.964077993761748, + 1.7906090070027858, + 2.022538013989106, + 1.929099002154544, + 2.00752800446935, + 2.054157026577741, + 1.9634480122476816, + 1.9092580187134445, + 1.8864180019591004, + 1.9431979744695127, + 1.901257986901328, + 2.0377470063976943, + 1.9313580123707652, + 2.0845370017923415, + 2.085087005980313, + 1.9301279971841723, + 1.8769190064631402, + 2.025906986091286, + 1.7491690232418478, + 1.9331779913045466, + 2.0784570078831166, + 1.79991900222376, + 2.0068880112376064, + 1.9720179843716323, + 2.012748009292409, + 1.949537982000038, + 2.081987011479214, + 1.9455080037005246, + 1.9642280240077525, + 2.10693699773401, + 2.072606992442161, + 2.1083870087750256, + 2.006227005040273, + 1.9843880145344883, + 2.0809079869650304, + 2.1697269985452294, + 2.0119280088692904, + 2.075137017527595, + 2.053456992143765, + 1.9649480236694217, + 1.9826370116788894, + 1.8960279994644225, + 2.0466669811867177, + 2.0106180163566023, + 2.2979360073804855, + 2.1162469929549843, + 1.929738005856052, + 1.8568079976830631, + 1.8751989991869777, + 2.153977024136111, + 2.211806015111506, + 1.9585980044212192, + 2.1662460057996213, + 1.9616679928731173, + 1.939978013979271, + 2.0348469843156636, + 2.3108249879442155, + 1.9216980144847184, + 2.2696670203004032, + 2.108736982336268, + 2.0959069952368736, + 1.8097390129696578, + 2.0044379925820976, + 1.9933669827878475, + 1.971518009668216, + 1.868677994934842, + 1.9965980027336627, + 2.008187002502382, + 1.9974680035375059, + 1.919049012940377, + 2.1049469942227006, + 2.0589880004990846, + 2.179477014578879, + 1.8998580053448677, + 1.9402180041652173, + 2.1394159994088113, + 2.1161370095796883, + 2.2256060037761927, + 1.6338999848812819, + 1.7931289912667125, + 1.7050200258381665, + 1.8038490088656545, + 1.8965989875141531, + 1.9824169867206365, + 1.9051790004596114, + 1.9942680082749575, + 1.9703680009115487, + 2.0056880021002144, + 1.6947599942795932, + 1.5766310098115355, + 1.9542380177881569, + 2.1022970031481236, + 1.9364279869478196, + 1.922887982800603, + 1.8047390040010214, + 2.0007679995615035, + 1.871597982244566, + 1.8859690171666443, + 2.0171479845885187, + 1.959957997314632, + 1.940838003065437, + 1.7920690006576478, + 1.986498013138771, + 2.0772569987457246, + 2.1875370002817363, + 2.011967997532338, + 1.8832269997801632, + 2.0409970020409673, + 1.8891679937951267, + 1.8778180237859488, + 1.9749380007851869, + 2.069868001854047, + 1.8756880017463118, + 1.9951580034103245, + 1.9678479875437915, + 1.939927984494716, + 1.9324669847264886, + 1.8945680058095604, + 2.1736279886681587, + 1.9166390120517462, + 1.8949790101032704, + 1.930147991515696, + 2.0547780150081962, + 2.018587983911857, + 1.8405779846943915, + 1.5862899890635163, + 1.5161810151766986, + 1.6881100018508732, + 1.5981399919837713, + 2.0227870263624936, + 1.9352880190126598, + 1.850739005021751, + 1.8762389954645187, + 1.9653280032798648, + 2.06483798683621, + 2.180726994993165, + 2.136795985279605, + 1.9212679762858897, + 2.2371459926944226, + 2.0642570161726326, + 1.961428002687171 + ], + "deterministic": true, + "fiducial_log_likelihood": 7.743201200876812, + "stream_log_likelihood": [ + 7.743201200876812, + -4.1609527513907665, + 7.657972665309639, + 9.36455094905725, + 7.051561357429164, + 9.219327498422563, + 0.8907045816755463, + -34.37790701671691, + -24.578291065194456, + -0.4990240338966814, + 0.702590691739907, + 7.669569297550711, + -0.4639011650528264, + -5.412376751794213, + 5.343244353416, + -20.481275097418568 + ], + "admissible": true, + "completeness_prior": { + "n_draws": 200, + "multiplicity_agreement": 1.0, + "raw_count_agreement": 1.0, + "n_multiplicity_mismatch": 0, + "mismatch_examples": [], + "max_position_error": 0.0008513474499103632, + "p99_position_error": 0.0007893460711577849, + "median_position_error": 0.00040657539052049436, + "ref_distinct_histogram": { + "2": 21, + "4": 179 + }, + "abs_delta_logl_vs_reference": { + "max": 0.8682473458375171, + "p99": 0.5684387609120645, + "median": 0.030920850414809298, + "n_nonfinite_mismatch": 0 + }, + "abs_delta_logl_vs_control": { + "max": 0.0, + "p99": 0.0, + "median": 0.0, + "n_nonfinite_mismatch": 0 + } + }, + "completeness_stress": { + "n_draws": 200, + "multiplicity_agreement": 1.0, + "raw_count_agreement": 1.0, + "n_multiplicity_mismatch": 0, + "mismatch_examples": [], + "max_position_error": 0.0007893460711579142, + "p99_position_error": 0.0007893460711576755, + "median_position_error": 0.0004065753905207063, + "ref_distinct_histogram": { + "2": 163, + "4": 37 + } + } + }, + "step0_structured": { + "config": { + "name": "step0_structured", + "block": "step0_route", + "extent": null, + "scale": 0.2, + "precision": 0.001, + "max_containing_size": 15, + "neighbor_degree": 1, + "step0_route": "structured" + }, + "static": { + "extent_half_width": [ + 9.9, + 9.9 + ], + "limits": [ + -9.9, + 9.9, + -9.9, + 9.9 + ], + "scale": 0.2, + "pixel_scale_precision": 0.001, + "n_steps": 8, + "n_steps_formula": "ceil(log2(0.2 / 0.001))", + "last_step_triangle_side": 0.0015625, + "step0_triangles": 23283, + "step0_rows": 11859, + "max_containing_size": 15, + "neighbor_degree": 1, + "step0_route": "structured" + }, + "stats": { + "n": 400, + "median_ms": 1.971192512428388, + "p10_ms": 1.784380996832624, + "p90_ms": 2.1547600044868886, + "min_ms": 1.5221810026559979, + "max_ms": 3.1426610075868666, + "mean_ms": 1.969261312042363 + }, + "speedup_vs_control": { + "ratio": 1.0051314077928548, + "ci90_low": 0.9950336108192507, + "ci90_high": 1.0138289471971313, + "bootstrap_samples": 2000 + }, + "paired_round_speedup": { + "median": 1.0069041756956367, + "p10": 0.9571048675261754, + "p90": 1.047675588365404 + }, + "compile": { + "lower_s": 2.6010064609872643, + "compile_s": 4.190009113022825, + "first_call_s": 0.002868412993848324, + "traced_rows_per_step": [ + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720, + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720 + ], + "output_shapes": [ + [] + ], + "flops": 2801341.0, + "memory_analysis": { + "argument_size_in_bytes": 40, + "output_size_in_bytes": 8, + "temp_size_in_bytes": 901656, + "alias_size_in_bytes": 0, + "generated_code_size_in_bytes": 0, + "host_temp_size_in_bytes": 0 + }, + "rss_delta_bytes": 2551808, + "max_containing_size_proof": null + }, + "warm_ms": [ + 2.0692870020866394, + 2.165937010431662, + 2.0677869906648993 + ], + "per_call_ms": [ + 1.9867269729729742, + 2.02796800294891, + 1.941208989592269, + 2.2685760050080717, + 2.0281779870856553, + 1.98144800378941, + 2.033616998232901, + 2.0870269800070673, + 2.0083480048924685, + 1.9351569935679436, + 1.942058006534353, + 1.913778978632763, + 1.9443279888946563, + 1.8544190097600222, + 1.9882270134985447, + 1.8651790160220116, + 1.914908003527671, + 1.9319479761179537, + 1.8638689944054931, + 2.1894359961152077, + 1.75319000845775, + 1.6972000012174249, + 1.5588789829052985, + 1.5717610076535493, + 1.991197990719229, + 1.7914889904204756, + 1.6079700144473463, + 1.921178016345948, + 2.2444960195571184, + 2.114575996529311, + 2.1676670003216714, + 2.145097008906305, + 2.084306994220242, + 1.9442980119492859, + 2.0826880063395947, + 2.0256769785191864, + 1.9103779923170805, + 1.9392879912629724, + 2.011637989198789, + 1.9916080054827034, + 1.7278589948546141, + 1.8168089736718684, + 2.1116269927006215, + 2.160896983696148, + 1.802548998966813, + 1.9070389971602708, + 1.8695589969865978, + 1.9541179935913533, + 2.022027998464182, + 1.7795090097934008, + 1.5663410013075918, + 1.5811100020073354, + 1.874589012004435, + 1.958178007043898, + 2.0355680026113987, + 1.9650180183816701, + 1.9230979960411787, + 1.9591879972722381, + 1.8416290113236755, + 1.9523579976521432, + 1.7490379977971315, + 2.148108003893867, + 2.100306999636814, + 2.2100359783507884, + 1.8332990002818406, + 2.193546009948477, + 1.9166390120517462, + 1.9162980024702847, + 2.0566479943227023, + 2.0345370285212994, + 1.9735280075110495, + 2.079077996313572, + 1.8783390114549547, + 1.874169014627114, + 1.926887984154746, + 1.9785879994742572, + 1.9844880152959377, + 2.5173040048684925, + 3.1426610075868666, + 3.050561004783958, + 1.7784290248528123, + 1.994036982068792, + 1.9931179995182902, + 2.027876995271072, + 1.97805801872164, + 2.2430060198530555, + 2.063388004899025, + 2.017738006543368, + 2.2029560059309006, + 2.234596002381295, + 1.9678680109791458, + 2.0130279881414026, + 1.9791980157606304, + 2.0713169942609966, + 1.8293489993084222, + 1.9997970084659755, + 1.9754779932554811, + 1.977707986952737, + 1.9647279987111688, + 1.9892480049747974, + 1.7512000049464405, + 1.9407079962547868, + 1.9775880209635943, + 1.9188389996998012, + 2.1402770071290433, + 1.9930069975089282, + 1.75984000088647, + 1.6682890127412975, + 1.8983379995916039, + 2.0053279877174646, + 1.9892080163117498, + 2.1313769975677133, + 1.8665480019990355, + 2.202277013566345, + 1.8763179832603782, + 1.95787800475955, + 2.0072979968972504, + 1.9638680096250027, + 2.0422569941729307, + 2.006358001381159, + 1.968487980775535, + 1.9346880144439638, + 1.9643179839476943, + 2.0445469999685884, + 1.919157977681607, + 1.9438879971858114, + 1.9821279856842011, + 1.9047780078835785, + 1.9660579855553806, + 2.0077970111742616, + 2.0482679829001427, + 1.7550699994899333, + 2.021067979512736, + 2.2114360181149095, + 1.9630180031526834, + 1.9663379935082048, + 1.9908779941033572, + 1.9681580015458167, + 2.156597009161487, + 2.116826013661921, + 2.0015480113215744, + 1.8792279879562557, + 2.262555994093418, + 1.9433889829088002, + 1.9713679794222116, + 2.072347007924691, + 2.0021879754494876, + 1.671089994488284, + 1.5221810026559979, + 2.040937019046396, + 1.7885690031107515, + 1.6103899979498237, + 1.7367480031680316, + 1.8453380034770817, + 1.6181200044229627, + 1.7843090172391385, + 1.8404489965178072, + 2.0807379914913327, + 2.0582379947882146, + 1.9440079922787845, + 2.0067470031790435, + 2.290005999384448, + 1.8876380054280162, + 1.979617984034121, + 1.9358290010131896, + 1.9873879791703075, + 2.220205991761759, + 1.9880469772033393, + 2.158036979380995, + 2.0688280055765063, + 1.7417000199202448, + 2.2030469845049083, + 2.049786999123171, + 2.0488270092755556, + 2.209255995694548, + 2.016118000028655, + 2.0252380054444075, + 1.7425100086256862, + 1.9652580085676163, + 2.0095480140298605, + 1.9556280167307705, + 2.0237970165908337, + 2.2006260114721954, + 1.9274279766250402, + 2.058226993540302, + 2.018538012634963, + 2.259025990497321, + 2.2157159983180463, + 1.9642780243884772, + 1.9229780009482056, + 1.9345179898664355, + 1.9670180045068264, + 1.9929280097130686, + 2.1038370032329112, + 1.8337579967919737, + 1.976967992959544, + 2.133077010512352, + 2.2218280064407736, + 2.214687003288418, + 2.0165779860690236, + 1.920357986818999, + 1.9803880131803453, + 1.8428770126774907, + 1.9609770097304136, + 1.870506996056065, + 1.9432579865679145, + 1.9814479746855795, + 1.897117996122688, + 1.9181779935024679, + 1.9980079960078, + 1.908168982481584, + 1.8515289993956685, + 1.620470022317022, + 1.8920879811048508, + 1.9412380061112344, + 1.8677980115171522, + 2.103587001329288, + 1.9292679789941758, + 1.9609180162660778, + 1.8502279999665916, + 1.7898289952427149, + 2.082246995996684, + 1.7919589881785214, + 1.9043079810217023, + 2.096266980515793, + 2.216416993178427, + 1.9014569988939911, + 2.0097570086363703, + 2.00540799414739, + 2.00338801369071, + 1.9811679958365858, + 2.138387004379183, + 1.8263089878018945, + 1.8581179901957512, + 2.3095360083971173, + 2.10654700640589, + 1.7179200076498091, + 1.9006190123036504, + 2.0475680066738278, + 2.0213680109009147, + 1.7843889945652336, + 2.149075997294858, + 2.155236987164244, + 2.01953700161539, + 1.9028779934160411, + 1.8879180133808404, + 1.970798010006547, + 2.2220159880816936, + 1.5914209943730384, + 1.6037710011005402, + 1.631959981750697, + 1.8315679917577654, + 1.8817789969034493, + 2.026587986620143, + 2.0460779778659344, + 1.9605479901656508, + 1.9577079801820219, + 2.058376994682476, + 1.9615280034486204, + 1.9145080004818738, + 1.8471589719410986, + 1.7685790080577135, + 2.16781601193361, + 1.8860279815271497, + 1.8708990246523172, + 2.098688011756167, + 1.929877995280549, + 1.9650280009955168, + 2.0574170048348606, + 1.8481089791748673, + 1.9191989849787205, + 1.831499015679583, + 1.753218995872885, + 1.6467589884996414, + 1.5903809980954975, + 1.5701600059401244, + 1.9856180006172508, + 1.9951179856434464, + 1.832369016483426, + 1.9308089977130294, + 1.8998879822902381, + 2.0625469915103167, + 1.984327973332256, + 2.084898005705327, + 2.183036005590111, + 2.0430870063137263, + 2.0143570145592093, + 1.9985079998150468, + 2.0237269927747548, + 1.9805380143225193, + 1.9029579998459667, + 1.6732299991417676, + 1.9408880034461617, + 2.1526670025195926, + 2.163745986763388, + 2.0175480167381465, + 2.0372879807837307, + 1.8604790093377233, + 2.0696570281870663, + 2.0104080031160265, + 1.6877480084076524, + 2.0323079952504486, + 1.9118889758829027, + 2.0591579959727824, + 1.749640010530129, + 2.112627000315115, + 2.0913269836455584, + 1.971846999367699, + 2.095567004289478, + 1.6920389898587018, + 1.5801700064912438, + 1.846299011958763, + 2.017997991060838, + 2.0012379973195493, + 2.0467470167204738, + 1.8531589885242283, + 2.0853279856964946, + 1.963408023584634, + 2.1926159970462322, + 1.8074490071740001, + 1.7993990040849894, + 1.784679014235735, + 2.096396987326443, + 1.9896980084013194, + 1.9062380015384406, + 1.914007996674627, + 2.1483769814949483, + 2.0290070096962154, + 1.9711280183400959, + 2.0110979967284948, + 1.9817779830191284, + 2.087118016788736, + 1.9138389907311648, + 1.9953780283685774, + 1.9173180044163018, + 2.0837269839830697, + 1.9501180213410407, + 2.000398002564907, + 1.853699010098353, + 2.056288009043783, + 1.8315190100111067, + 1.9617380166891962, + 2.0311669795773923, + 2.1686870022676885, + 2.044977998593822, + 1.9254790095146745, + 1.8511389789637178, + 1.9768780039157718, + 1.930938014993444, + 1.9712570065166801, + 2.154707006411627, + 1.8938790017273277, + 2.1455759997479618, + 1.821938989451155, + 2.017316990531981, + 1.9009879906661808, + 1.9436879956629127, + 1.9114680180791765, + 1.8553590052761137, + 1.8951189995277673, + 1.7725999932736158, + 1.9310979987494648, + 1.916237990371883, + 1.9817279826384038, + 1.929697988089174, + 1.9941779901273549, + 2.1693780145142227, + 2.1405770094133914, + 1.9278690160717815, + 1.9639380043372512, + 2.0091180049348623, + 1.963507995242253, + 1.9894680008292198, + 1.9849580130539834, + 2.0028980216011405, + 1.9936379976570606, + 2.1584670175798237, + 1.9931869755964726, + 1.9972480076830834, + 1.9529089913703501, + 1.7124699952546507, + 2.1745160047430545, + 2.0921069954056293, + 1.909888000227511, + 1.9112879817839712, + 1.9302580039948225, + 1.94571798783727, + 1.9578779756557196, + 2.070966991595924, + 1.9472379935905337, + 1.8651889986358583, + 1.8911590159405023, + 1.9875169964507222, + 1.9906779925804585, + 1.9280279811937362, + 2.1796459914185107, + 1.9590879965107888, + 1.927187986439094, + 1.9309190101921558, + 1.980667992029339 + ], + "deterministic": true, + "fiducial_log_likelihood": 7.743201200876812, + "stream_log_likelihood": [ + 7.743201200876812, + -4.1609527513907665, + 7.657972665309639, + 9.36455094905725, + 7.051561357429164, + 9.219327498422563, + 0.8907045816755463, + -34.37790701671691, + -24.578291065194456, + -0.4990240338966814, + 0.702590691739907, + 7.669569297550711, + -0.4639011650528264, + -5.412376751794213, + 5.343244353416, + -20.481275097418568 + ], + "admissible": true, + "completeness_prior": { + "n_draws": 200, + "multiplicity_agreement": 1.0, + "raw_count_agreement": 1.0, + "n_multiplicity_mismatch": 0, + "mismatch_examples": [], + "max_position_error": 0.0008513474499103632, + "p99_position_error": 0.0007893460711577849, + "median_position_error": 0.00040657539052049436, + "ref_distinct_histogram": { + "2": 21, + "4": 179 + }, + "abs_delta_logl_vs_reference": { + "max": 0.8682473458375171, + "p99": 0.5684387609120645, + "median": 0.030920850414809298, + "n_nonfinite_mismatch": 0 + }, + "abs_delta_logl_vs_control": { + "max": 0.0, + "p99": 0.0, + "median": 0.0, + "n_nonfinite_mismatch": 0 + } + }, + "completeness_stress": { + "n_draws": 200, + "multiplicity_agreement": 1.0, + "raw_count_agreement": 1.0, + "n_multiplicity_mismatch": 0, + "mismatch_examples": [], + "max_position_error": 0.0007893460711579142, + "p99_position_error": 0.0007893460711576755, + "median_position_error": 0.0004065753905207063, + "ref_distinct_histogram": { + "2": 163, + "4": 37 + } + } + } + }, + "vmap": { + "best": "step0_structured", + "routes": [ + "control", + "step0_gather", + "step0_components", + "step0_structured" + ], + "batches": [ + 1, + 4, + 16 + ], + "rows": { + "control_vmap1": { + "config": "control", + "batch": 1, + "stats_per_batch": { + "n": 400, + "median_ms": 1.9984929967904463, + "p10_ms": 1.7651509813731536, + "p90_ms": 2.1875509206438437, + "min_ms": 1.5265310066752136, + "max_ms": 2.4264450185000896, + "mean_ms": 1.9886153368861414 + }, + "median_ms_per_likelihood": 1.9984929967904463, + "compile": { + "lower_s": 3.500198764988454, + "compile_s": 4.78498803198454, + "first_call_s": 0.002684803999727592, + "traced_rows_per_step": [ + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720, + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720 + ], + "output_shapes": [ + [ + 1 + ] + ], + "flops": 2813353.0, + "memory_analysis": { + "argument_size_in_bytes": 40, + "output_size_in_bytes": 8, + "temp_size_in_bytes": 901720, + "alias_size_in_bytes": 0, + "generated_code_size_in_bytes": 0, + "host_temp_size_in_bytes": 0 + }, + "rss_delta_bytes": 2797568, + "max_containing_size_proof": null + }, + "values_first_batch": [ + 7.743201200876812 + ], + "max_abs_delta_vs_scalar": 0.0 + }, + "control_vmap4": { + "config": "control", + "batch": 4, + "stats_per_batch": { + "n": 400, + "median_ms": 5.766439498984255, + "p10_ms": 5.439168107113801, + "p90_ms": 6.289221093175001, + "min_ms": 4.939839011058211, + "max_ms": 6.794127984903753, + "mean_ms": 5.814191821991699 + }, + "median_ms_per_likelihood": 1.4416098747460637, + "compile": { + "lower_s": 3.5011383689998183, + "compile_s": 5.0760049860109575, + "first_call_s": 0.005983823008136824, + "traced_rows_per_step": [ + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720, + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720 + ], + "output_shapes": [ + [ + 4 + ] + ], + "flops": 10339222.0, + "memory_analysis": { + "argument_size_in_bytes": 160, + "output_size_in_bytes": 32, + "temp_size_in_bytes": 3200344, + "alias_size_in_bytes": 0, + "generated_code_size_in_bytes": 0, + "host_temp_size_in_bytes": 0 + }, + "rss_delta_bytes": 3555328, + "max_containing_size_proof": null + }, + "values_first_batch": [ + 7.743201200876812, + -4.1609527513907665, + 7.657972665309639, + 9.36455094905725 + ], + "max_abs_delta_vs_scalar": 0.0 + }, + "control_vmap16": { + "config": "control", + "batch": 16, + "stats_per_batch": { + "n": 400, + "median_ms": 18.223058490548283, + "p10_ms": 17.130755091784522, + "p90_ms": 19.657381091383286, + "min_ms": 15.433975990163162, + "max_ms": 20.677802996942773, + "mean_ms": 18.310249242422287 + }, + "median_ms_per_likelihood": 1.1389411556592677, + "compile": { + "lower_s": 3.6066151020058896, + "compile_s": 5.279567246994702, + "first_call_s": 0.019836409017443657, + "traced_rows_per_step": [ + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720, + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720 + ], + "output_shapes": [ + [ + 16 + ] + ], + "flops": 40452632.0, + "memory_analysis": { + "argument_size_in_bytes": 640, + "output_size_in_bytes": 128, + "temp_size_in_bytes": 12396824, + "alias_size_in_bytes": 0, + "generated_code_size_in_bytes": 0, + "host_temp_size_in_bytes": 0 + }, + "rss_delta_bytes": 2732032, + "max_containing_size_proof": null + }, + "values_first_batch": [ + 7.743201200876812, + -4.1609527513907665, + 7.657972665309639, + 9.36455094905725, + 7.051561357429164, + 9.219327498422563, + 0.8907045816755463, + -34.37790701671691, + -24.578291065194456, + -0.4990240338966814, + 0.702590691739907, + 7.669569297550711, + -0.4639011650528264, + -5.412376751794213, + 5.343244353416, + -20.481275097418568 + ], + "max_abs_delta_vs_scalar": 0.0 + }, + "step0_gather_vmap1": { + "config": "step0_gather", + "batch": 1, + "stats_per_batch": { + "n": 400, + "median_ms": 3.25468550727237, + "p10_ms": 2.9407041176455095, + "p90_ms": 3.636032086797059, + "min_ms": 2.603852975880727, + "max_ms": 3.866697021294385, + "mean_ms": 3.2794187697436428 + }, + "median_ms_per_likelihood": 3.25468550727237, + "compile": { + "lower_s": 3.455726857006084, + "compile_s": 4.668210218980676, + "first_call_s": 0.0037917569861747324, + "traced_rows_per_step": [ + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720, + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720 + ], + "output_shapes": [ + [ + 1 + ] + ], + "flops": 3395426.0, + "memory_analysis": { + "argument_size_in_bytes": 40, + "output_size_in_bytes": 8, + "temp_size_in_bytes": 1692184, + "alias_size_in_bytes": 0, + "generated_code_size_in_bytes": 0, + "host_temp_size_in_bytes": 0 + }, + "rss_delta_bytes": 33775616, + "max_containing_size_proof": null + }, + "values_first_batch": [ + 7.743201200876812 + ], + "speedup_vs_control_same_batch": { + "ratio": 0.614035670212975, + "ci90_low": 0.609728881710782, + "ci90_high": 0.6193532410477945, + "bootstrap_samples": 2000 + }, + "max_abs_delta_vs_scalar": 0.0 + }, + "step0_gather_vmap4": { + "config": "step0_gather", + "batch": 4, + "stats_per_batch": { + "n": 400, + "median_ms": 9.977103996789083, + "p10_ms": 9.260137000819668, + "p90_ms": 10.797901902697049, + "min_ms": 7.650811981875449, + "max_ms": 11.29520998802036, + "mean_ms": 9.988809456626768 + }, + "median_ms_per_likelihood": 2.4942759991972707, + "compile": { + "lower_s": 3.43247774001793, + "compile_s": 5.0330795290065, + "first_call_s": 0.009677260008174926, + "traced_rows_per_step": [ + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720, + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720 + ], + "output_shapes": [ + [ + 4 + ] + ], + "flops": 11829332.0, + "memory_analysis": { + "argument_size_in_bytes": 160, + "output_size_in_bytes": 32, + "temp_size_in_bytes": 6763032, + "alias_size_in_bytes": 0, + "generated_code_size_in_bytes": 0, + "host_temp_size_in_bytes": 0 + }, + "rss_delta_bytes": 36581376, + "max_containing_size_proof": null + }, + "values_first_batch": [ + 7.743201200876812, + -4.1609527513907665, + 7.657972665309639, + 9.36455094905725 + ], + "speedup_vs_control_same_batch": { + "ratio": 0.5779672639315035, + "ci90_low": 0.5724595139205815, + "ci90_high": 0.585194820846235, + "bootstrap_samples": 2000 + }, + "max_abs_delta_vs_scalar": 0.0 + }, + "step0_gather_vmap16": { + "config": "step0_gather", + "batch": 16, + "stats_per_batch": { + "n": 400, + "median_ms": 33.940601511858404, + "p10_ms": 31.497134003438987, + "p90_ms": 36.48083198640961, + "min_ms": 29.458958975737914, + "max_ms": 40.15874399919994, + "mean_ms": 33.98989403009182 + }, + "median_ms_per_likelihood": 2.1212875944911502, + "compile": { + "lower_s": 3.4642902350169607, + "compile_s": 5.212569477997022, + "first_call_s": 0.03190379400621168, + "traced_rows_per_step": [ + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720, + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720 + ], + "output_shapes": [ + [ + 16 + ] + ], + "flops": 45574880.0, + "memory_analysis": { + "argument_size_in_bytes": 640, + "output_size_in_bytes": 128, + "temp_size_in_bytes": 27047448, + "alias_size_in_bytes": 0, + "generated_code_size_in_bytes": 0, + "host_temp_size_in_bytes": 0 + }, + "rss_delta_bytes": 37105664, + "max_containing_size_proof": null + }, + "values_first_batch": [ + 7.743201200876812, + -4.1609527513907665, + 7.657972665309639, + 9.36455094905725, + 7.051561357429164, + 9.219327498422563, + 0.8907045816755463, + -34.37790701671691, + -24.578291065194456, + -0.4990240338966814, + 0.702590691739907, + 7.669569297550711, + -0.4639011650528264, + -5.412376751794213, + 5.343244353416, + -20.481275097418568 + ], + "speedup_vs_control_same_batch": { + "ratio": 0.5369102985455748, + "ci90_low": 0.5326699938994689, + "ci90_high": 0.541553470948365, + "bootstrap_samples": 2000 + }, + "max_abs_delta_vs_scalar": 0.0 + }, + "step0_components_vmap1": { + "config": "step0_components", + "batch": 1, + "stats_per_batch": { + "n": 400, + "median_ms": 2.020172993070446, + "p10_ms": 1.827995985513553, + "p90_ms": 2.254783996613696, + "min_ms": 1.5502409951295704, + "max_ms": 2.3998150136321783, + "mean_ms": 2.027096302335849 + }, + "median_ms_per_likelihood": 2.020172993070446, + "compile": { + "lower_s": 3.5136122120020445, + "compile_s": 4.75471134801046, + "first_call_s": 0.002719533018535003, + "traced_rows_per_step": [ + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720, + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720 + ], + "output_shapes": [ + [ + 1 + ] + ], + "flops": 3590390.0, + "memory_analysis": { + "argument_size_in_bytes": 40, + "output_size_in_bytes": 8, + "temp_size_in_bytes": 1506328, + "alias_size_in_bytes": 0, + "generated_code_size_in_bytes": 0, + "host_temp_size_in_bytes": 0 + }, + "rss_delta_bytes": 37740544, + "max_containing_size_proof": null + }, + "values_first_batch": [ + 7.743201200876812 + ], + "speedup_vs_control_same_batch": { + "ratio": 0.9892682476429663, + "ci90_low": 0.9813191258091946, + "ci90_high": 0.9950968342229074, + "bootstrap_samples": 2000 + }, + "max_abs_delta_vs_scalar": 0.0 + }, + "step0_components_vmap4": { + "config": "step0_components", + "batch": 4, + "stats_per_batch": { + "n": 400, + "median_ms": 5.52099100605119, + "p10_ms": 5.072492893668823, + "p90_ms": 6.009905008249916, + "min_ms": 4.6627910051029176, + "max_ms": 6.7510590015444905, + "mean_ms": 5.531720380386105 + }, + "median_ms_per_likelihood": 1.3802477515127975, + "compile": { + "lower_s": 3.4219344439916313, + "compile_s": 5.224851414008299, + "first_call_s": 0.005522985011339188, + "traced_rows_per_step": [ + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720, + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720 + ], + "output_shapes": [ + [ + 4 + ] + ], + "flops": 13447376.0, + "memory_analysis": { + "argument_size_in_bytes": 160, + "output_size_in_bytes": 32, + "temp_size_in_bytes": 6777112, + "alias_size_in_bytes": 0, + "generated_code_size_in_bytes": 0, + "host_temp_size_in_bytes": 0 + }, + "rss_delta_bytes": 37732352, + "max_containing_size_proof": null + }, + "values_first_batch": [ + 7.743201200876812, + -4.1609527513907665, + 7.657972665309639, + 9.36455094905725 + ], + "speedup_vs_control_same_batch": { + "ratio": 1.0444573252635343, + "ci90_low": 1.0364172226763542, + "ci90_high": 1.0533299252449464, + "bootstrap_samples": 2000 + }, + "max_abs_delta_vs_scalar": 0.0 + }, + "step0_components_vmap16": { + "config": "step0_components", + "batch": 16, + "stats_per_batch": { + "n": 400, + "median_ms": 18.650505517143756, + "p10_ms": 16.7515390960034, + "p90_ms": 20.378170916228555, + "min_ms": 14.906648022588342, + "max_ms": 21.41292701708153, + "mean_ms": 18.537156373713515 + }, + "median_ms_per_likelihood": 1.1656565948214848, + "compile": { + "lower_s": 3.4063576199987438, + "compile_s": 5.4203955530247185, + "first_call_s": 0.016001051990315318, + "traced_rows_per_step": [ + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720, + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720 + ], + "output_shapes": [ + [ + 16 + ] + ], + "flops": 52885240.0, + "memory_analysis": { + "argument_size_in_bytes": 640, + "output_size_in_bytes": 128, + "temp_size_in_bytes": 27103128, + "alias_size_in_bytes": 0, + "generated_code_size_in_bytes": 0, + "host_temp_size_in_bytes": 0 + }, + "rss_delta_bytes": 36315136, + "max_containing_size_proof": null + }, + "values_first_batch": [ + 7.743201200876812, + -4.1609527513907665, + 7.657972665309639, + 9.36455094905725, + 7.051561357429164, + 9.219327498422563, + 0.8907045816755463, + -34.37790701671691, + -24.578291065194456, + -0.4990240338966814, + 0.702590691739907, + 7.669569297550711, + -0.4639011650528264, + -5.412376751794213, + 5.343244353416, + -20.481275097418568 + ], + "speedup_vs_control_same_batch": { + "ratio": 0.9770812096110446, + "ci90_low": 0.9656676750964245, + "ci90_high": 0.989334587062284, + "bootstrap_samples": 2000 + }, + "max_abs_delta_vs_scalar": 0.0 + }, + "step0_structured_vmap1": { + "config": "step0_structured", + "batch": 1, + "stats_per_batch": { + "n": 400, + "median_ms": 2.0230829977663234, + "p10_ms": 1.8497210083296522, + "p90_ms": 2.222856890875846, + "min_ms": 1.519160985480994, + "max_ms": 2.4242650251835585, + "mean_ms": 2.025425262399949 + }, + "median_ms_per_likelihood": 2.0230829977663234, + "compile": { + "lower_s": 3.5719881340046413, + "compile_s": 4.724451454007067, + "first_call_s": 0.0027972520038019866, + "traced_rows_per_step": [ + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720, + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720 + ], + "output_shapes": [ + [ + 1 + ] + ], + "flops": 2813353.0, + "memory_analysis": { + "argument_size_in_bytes": 40, + "output_size_in_bytes": 8, + "temp_size_in_bytes": 901720, + "alias_size_in_bytes": 0, + "generated_code_size_in_bytes": 0, + "host_temp_size_in_bytes": 0 + }, + "rss_delta_bytes": 37494784, + "max_containing_size_proof": null + }, + "values_first_batch": [ + 7.743201200876812 + ], + "speedup_vs_control_same_batch": { + "ratio": 0.9878452831628625, + "ci90_low": 0.9796911183617224, + "ci90_high": 0.9940848584813425, + "bootstrap_samples": 2000 + }, + "max_abs_delta_vs_scalar": 0.0 + }, + "step0_structured_vmap4": { + "config": "step0_structured", + "batch": 4, + "stats_per_batch": { + "n": 400, + "median_ms": 5.785139495856129, + "p10_ms": 5.458534005447291, + "p90_ms": 6.357561994809657, + "min_ms": 4.979529010597616, + "max_ms": 7.397664012387395, + "mean_ms": 5.847070690797409 + }, + "median_ms_per_likelihood": 1.4462848739640322, + "compile": { + "lower_s": 3.488613986002747, + "compile_s": 5.019535144005204, + "first_call_s": 0.0060336129972711205, + "traced_rows_per_step": [ + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720, + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720 + ], + "output_shapes": [ + [ + 4 + ] + ], + "flops": 10339222.0, + "memory_analysis": { + "argument_size_in_bytes": 160, + "output_size_in_bytes": 32, + "temp_size_in_bytes": 3200344, + "alias_size_in_bytes": 0, + "generated_code_size_in_bytes": 0, + "host_temp_size_in_bytes": 0 + }, + "rss_delta_bytes": 40935424, + "max_containing_size_proof": null + }, + "values_first_batch": [ + 7.743201200876812, + -4.1609527513907665, + 7.657972665309639, + 9.36455094905725 + ], + "speedup_vs_control_same_batch": { + "ratio": 0.996767580646021, + "ci90_low": 0.989338430378054, + "ci90_high": 1.0060034695670645, + "bootstrap_samples": 2000 + }, + "max_abs_delta_vs_scalar": 0.0 + }, + "step0_structured_vmap16": { + "config": "step0_structured", + "batch": 16, + "stats_per_batch": { + "n": 400, + "median_ms": 18.12048400461208, + "p10_ms": 17.071463802130893, + "p90_ms": 19.67904201883357, + "min_ms": 15.248346026055515, + "max_ms": 20.618373004253954, + "mean_ms": 18.246133728825953 + }, + "median_ms_per_likelihood": 1.132530250288255, + "compile": { + "lower_s": 3.605344840005273, + "compile_s": 5.215043354022782, + "first_call_s": 0.018388786993455142, + "traced_rows_per_step": [ + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720, + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720 + ], + "output_shapes": [ + [ + 16 + ] + ], + "flops": 40452632.0, + "memory_analysis": { + "argument_size_in_bytes": 640, + "output_size_in_bytes": 128, + "temp_size_in_bytes": 12396824, + "alias_size_in_bytes": 0, + "generated_code_size_in_bytes": 0, + "host_temp_size_in_bytes": 0 + }, + "rss_delta_bytes": 37535744, + "max_containing_size_proof": null + }, + "values_first_batch": [ + 7.743201200876812, + -4.1609527513907665, + 7.657972665309639, + 9.36455094905725, + 7.051561357429164, + 9.219327498422563, + 0.8907045816755463, + -34.37790701671691, + -24.578291065194456, + -0.4990240338966814, + 0.702590691739907, + 7.669569297550711, + -0.4639011650528264, + -5.412376751794213, + 5.343244353416, + -20.481275097418568 + ], + "speedup_vs_control_same_batch": { + "ratio": 1.005660692391555, + "ci90_low": 0.9977592019384882, + "ci90_high": 1.0135673948221453, + "bootstrap_samples": 2000 + }, + "max_abs_delta_vs_scalar": 0.0 + } + } + }, + "step0_split": { + "control": { + "extent": null, + "scale": 0.2, + "step0_rows": 11859, + "step0_triangles": 23283, + "prefix_median_ms": { + "source_centre": 0.19911400158889592, + "ray_trace": 0.694440008373931, + "general_gather": 1.6715744859538972, + "route_inputs": 1.0698029946070164, + "containment": 1.3353674876270816 + }, + "ray_trace_ms": 0.49532600678503513, + "containment_ms": 0.6409274792531505, + "route_input_materialisation_ms": 0.3753629862330854, + "general_gather_reference_ms": 0.9771344775799662, + "step0_route": "library default (structured)", + "method": "prefix medians; ray_trace = jnp.sum(plane.vertices) minus source_centre; containment = containing_indices minus ray_trace (includes the vertices[indices] gather + Point.mask + jnp.where) and is the headline before/after number; route_input_materialisation = the route's six barycentric input components returned as outputs (captured at trace time) minus ray_trace; general_gather_reference = plane.triangles minus ray_trace, route-independent", + "step0_ms": 1.1362534860381857, + "containment_share_of_step0": 0.5640708584207689, + "step0_share_of_likelihood": 0.5734866915626643, + "containment_share_of_likelihood": 0.3234871304026388 + }, + "step0_gather": { + "extent": null, + "scale": 0.2, + "step0_rows": 11859, + "step0_triangles": 23283, + "prefix_median_ms": { + "source_centre": 0.19389849330764264, + "ray_trace": 0.6829854828538373, + "general_gather": 1.6568650025874376, + "route_inputs": 2.476145513355732, + "containment": 2.588949486380443 + }, + "ray_trace_ms": 0.4890869895461947, + "containment_ms": 1.9059640035266057, + "route_input_materialisation_ms": 1.7931600305018947, + "general_gather_reference_ms": 0.9738795197336003, + "step0_route": "gather", + "method": "prefix medians; ray_trace = jnp.sum(plane.vertices) minus source_centre; containment = containing_indices minus ray_trace (includes the vertices[indices] gather + Point.mask + jnp.where) and is the headline before/after number; route_input_materialisation = the route's six barycentric input components returned as outputs (captured at trace time) minus ray_trace; general_gather_reference = plane.triangles minus ray_trace, route-independent", + "step0_ms": 2.3950509930728003, + "containment_share_of_step0": 0.795792661216492, + "step0_share_of_likelihood": 0.7523006291233452, + "containment_share_of_likelihood": 0.5986753196849081 + }, + "step0_components": { + "extent": null, + "scale": 0.2, + "step0_rows": 11859, + "step0_triangles": 23283, + "prefix_median_ms": { + "source_centre": 0.194973501493223, + "ray_trace": 0.6865415052743629, + "general_gather": 1.6950749995885417, + "route_inputs": 0.7423055067192763, + "containment": 1.2807320163119584 + }, + "ray_trace_ms": 0.49156800378113985, + "containment_ms": 0.5941905110375956, + "route_input_materialisation_ms": 0.05576400144491345, + "general_gather_reference_ms": 1.0085334943141788, + "step0_route": "components", + "method": "prefix medians; ray_trace = jnp.sum(plane.vertices) minus source_centre; containment = containing_indices minus ray_trace (includes the vertices[indices] gather + Point.mask + jnp.where) and is the headline before/after number; route_input_materialisation = the route's six barycentric input components returned as outputs (captured at trace time) minus ray_trace; general_gather_reference = plane.triangles minus ray_trace, route-independent", + "step0_ms": 1.0857585148187354, + "containment_share_of_step0": 0.5472584400010845, + "step0_share_of_likelihood": 0.5485670738490159, + "containment_share_of_likelihood": 0.3002079610705722 + }, + "step0_structured": { + "extent": null, + "scale": 0.2, + "step0_rows": 11859, + "step0_triangles": 23283, + "prefix_median_ms": { + "source_centre": 0.19408400112297386, + "ray_trace": 0.6752350018359721, + "general_gather": 1.6681999986758456, + "route_inputs": 1.081733003957197, + "containment": 1.322141513810493 + }, + "ray_trace_ms": 0.4811510007129982, + "containment_ms": 0.646906511974521, + "route_input_materialisation_ms": 0.406498002121225, + "general_gather_reference_ms": 0.9929649968398735, + "step0_route": "structured", + "method": "prefix medians; ray_trace = jnp.sum(plane.vertices) minus source_centre; containment = containing_indices minus ray_trace (includes the vertices[indices] gather + Point.mask + jnp.where) and is the headline before/after number; route_input_materialisation = the route's six barycentric input components returned as outputs (captured at trace time) minus ray_trace; general_gather_reference = plane.triangles minus ray_trace, route-independent", + "step0_ms": 1.1280575126875192, + "containment_share_of_step0": 0.5734694416717379, + "step0_share_of_likelihood": 0.5722716099899454, + "containment_share_of_likelihood": 0.3281802806655206 + } + }, + "uncapped_containing_counts": { + "control": { + "n_draws": 200, + "max_per_step": [ + 17, + 13, + 11, + 9, + 7, + 5, + 5, + 5 + ], + "p99_per_step": [ + 15.0, + 11.019999999999982, + 9.019999999999982, + 7.019999999999982, + 5.019999999999982, + 5.0, + 5.0, + 5.0 + ], + "median_per_step": [ + 9.0, + 5.0, + 5.0, + 5.0, + 5.0, + 5.0, + 5.0, + 5.0 + ], + "max_over_steps": 17, + "draws_exceeding_cap": [ + 12 + ], + "n_draws_exceeding": { + "6": 185, + "8": 117, + "10": 51, + "12": 23, + "15": 1 + }, + "histogram_max_over_steps": { + "3": 3, + "5": 12, + "7": 68, + "9": 66, + "11": 28, + "13": 16, + "15": 6, + "17": 1 + } + }, + "step0_structured": { + "n_draws": 200, + "max_per_step": [ + 17, + 13, + 11, + 9, + 7, + 5, + 5, + 5 + ], + "p99_per_step": [ + 15.0, + 11.019999999999982, + 9.019999999999982, + 7.019999999999982, + 5.019999999999982, + 5.0, + 5.0, + 5.0 + ], + "median_per_step": [ + 9.0, + 5.0, + 5.0, + 5.0, + 5.0, + 5.0, + 5.0, + 5.0 + ], + "max_over_steps": 17, + "draws_exceeding_cap": [ + 12 + ], + "n_draws_exceeding": { + "6": 185, + "8": 117, + "10": 51, + "12": 23, + "15": 1 + }, + "histogram_max_over_steps": { + "3": 3, + "5": 12, + "7": 68, + "9": 66, + "11": 28, + "13": 16, + "15": 6, + "17": 1 + } + } + }, + "gates": { + "fiducial_bit_exact": { + "value": 7.743201200876812, + "expected": 7.743201200876812, + "repr": "7.743201200876812", + "pass": true + }, + "max_containing_size_patch": { + "control": { + "positions_shape": [ + 15, + 2 + ], + "expected_rows": 15, + "pass": true + }, + "step0_gather": { + "positions_shape": [ + 15, + 2 + ], + "expected_rows": 15, + "pass": true + }, + "step0_components": { + "positions_shape": [ + 15, + 2 + ], + "expected_rows": 15, + "pass": true + }, + "step0_structured": { + "positions_shape": [ + 15, + 2 + ], + "expected_rows": 15, + "pass": true + } + }, + "patch_restored": { + "module_constant": 15, + "init_default": [ + 15, + null + ], + "step0_containment": "structured", + "pass": true + }, + "grad": { + "control": { + "compile_s": 6.495404627989046, + "all_finite": true, + "non_zero_per_instance": [ + true, + true, + true + ], + "gradients": [ + [ + -41.62226304412241, + 53.13429595959836, + 31.786492377833373, + 2.8041319222503027, + 1781.7386158499905 + ], + [ + 249.25847095708434, + 214.72130119062592, + 374.391945981619, + 813.0025446226265, + 3314.449436325265 + ], + [ + -30.04618316624765, + 41.85589438434542, + 53.12915308132679, + -17.18919451496125, + 1304.418583766583 + ] + ], + "pass": true, + "max_rel_delta_vs_control": 0.0 + }, + "step0_gather": { + "compile_s": 6.57684411801165, + "all_finite": true, + "non_zero_per_instance": [ + true, + true, + true + ], + "gradients": [ + [ + -41.62226304412241, + 53.13429595959836, + 31.786492377833373, + 2.8041319222503027, + 1781.7386158499905 + ], + [ + 249.25847095708434, + 214.72130119062592, + 374.391945981619, + 813.0025446226265, + 3314.449436325265 + ], + [ + -30.04618316624765, + 41.85589438434542, + 53.12915308132679, + -17.18919451496125, + 1304.418583766583 + ] + ], + "pass": true, + "max_rel_delta_vs_control": 0.0 + }, + "step0_components": { + "compile_s": 6.85879500900046, + "all_finite": true, + "non_zero_per_instance": [ + true, + true, + true + ], + "gradients": [ + [ + -41.62226304412241, + 53.13429595959836, + 31.786492377833373, + 2.8041319222503027, + 1781.7386158499905 + ], + [ + 249.25847095708434, + 214.72130119062592, + 374.391945981619, + 813.0025446226265, + 3314.449436325265 + ], + [ + -30.04618316624765, + 41.85589438434542, + 53.12915308132679, + -17.18919451496125, + 1304.418583766583 + ] + ], + "pass": true, + "max_rel_delta_vs_control": 0.0 + }, + "step0_structured": { + "compile_s": 6.860316837992286, + "all_finite": true, + "non_zero_per_instance": [ + true, + true, + true + ], + "gradients": [ + [ + -41.62226304412241, + 53.13429595959836, + 31.786492377833373, + 2.8041319222503027, + 1781.7386158499905 + ], + [ + 249.25847095708434, + 214.72130119062592, + 374.391945981619, + 813.0025446226265, + 3314.449436325265 + ], + [ + -30.04618316624765, + 41.85589438434542, + 53.12915308132679, + -17.18919451496125, + 1304.418583766583 + ] + ], + "pass": true, + "max_rel_delta_vs_control": 0.0 + } + }, + "step0_route_bit_identity": { + "step0_gather": { + "checks": { + "stream_log_likelihood": true, + "fiducial_log_likelihood": true, + "prior_log_likelihood": true, + "prior_positions": true, + "stress_positions": true, + "image_counts": true, + "grad": true, + "vmap": true + }, + "pass": true, + "image_count_histogram": { + "prior": { + "2": 21, + "4": 179 + }, + "stress": { + "2": 163, + "4": 37 + } + } + }, + "step0_components": { + "checks": { + "stream_log_likelihood": true, + "fiducial_log_likelihood": true, + "prior_log_likelihood": true, + "prior_positions": true, + "stress_positions": true, + "image_counts": true, + "grad": true, + "vmap": true + }, + "pass": true, + "image_count_histogram": { + "prior": { + "2": 21, + "4": 179 + }, + "stress": { + "2": 163, + "4": 37 + } + } + }, + "step0_structured": { + "checks": { + "stream_log_likelihood": true, + "fiducial_log_likelihood": true, + "prior_log_likelihood": true, + "prior_positions": true, + "stress_positions": true, + "image_counts": true, + "grad": true, + "vmap": true + }, + "pass": true, + "image_count_histogram": { + "prior": { + "2": 21, + "4": 179 + }, + "stress": { + "2": 163, + "4": 37 + } + } + } + } + }, + "all_gates_pass": true, + "completeness_compile": { + "control_prior": { + "lower_s": 3.6646697859978303, + "compile_s": 5.636730425991118, + "first_call_s": 0.003247840009862557, + "traced_rows_per_step": [ + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720, + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720, + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720 + ], + "output_shapes": [ + [], + [ + 15, + 2 + ] + ], + "flops": 2801341.0, + "memory_analysis": { + "argument_size_in_bytes": 40, + "output_size_in_bytes": 264, + "temp_size_in_bytes": 901592, + "alias_size_in_bytes": 0, + "generated_code_size_in_bytes": 0, + "host_temp_size_in_bytes": 0 + }, + "rss_delta_bytes": 10899456, + "max_containing_size_proof": { + "positions_shape": [ + 15, + 2 + ], + "expected_rows": 15, + "pass": true + } + }, + "control_stress": { + "lower_s": 1.1472945710120257, + "compile_s": 1.7533260129857808, + "first_call_s": 0.0026635540125425905, + "traced_rows_per_step": [ + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720 + ], + "output_shapes": [ + [ + 15, + 2 + ] + ], + "flops": 2746879.0, + "memory_analysis": { + "argument_size_in_bytes": 64, + "output_size_in_bytes": 240, + "temp_size_in_bytes": 901144, + "alias_size_in_bytes": 0, + "generated_code_size_in_bytes": 0, + "host_temp_size_in_bytes": 0 + }, + "rss_delta_bytes": -356352, + "max_containing_size_proof": { + "positions_shape": [ + 15, + 2 + ], + "expected_rows": 15, + "pass": true + } + }, + "step0_gather_prior": { + "lower_s": 3.5573216050106566, + "compile_s": 5.378276742005255, + "first_call_s": 0.003813096001977101, + "traced_rows_per_step": [ + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720, + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720, + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720 + ], + "output_shapes": [ + [], + [ + 15, + 2 + ] + ], + "flops": 3383414.0, + "memory_analysis": { + "argument_size_in_bytes": 40, + "output_size_in_bytes": 264, + "temp_size_in_bytes": 1692120, + "alias_size_in_bytes": 0, + "generated_code_size_in_bytes": 0, + "host_temp_size_in_bytes": 0 + }, + "rss_delta_bytes": 3375104, + "max_containing_size_proof": { + "positions_shape": [ + 15, + 2 + ], + "expected_rows": 15, + "pass": true + } + }, + "step0_gather_stress": { + "lower_s": 1.0385473190108314, + "compile_s": 1.6881609720003325, + "first_call_s": 0.00352899800054729, + "traced_rows_per_step": [ + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720 + ], + "output_shapes": [ + [ + 15, + 2 + ] + ], + "flops": 3328952.0, + "memory_analysis": { + "argument_size_in_bytes": 64, + "output_size_in_bytes": 240, + "temp_size_in_bytes": 1692184, + "alias_size_in_bytes": 0, + "generated_code_size_in_bytes": 0, + "host_temp_size_in_bytes": 0 + }, + "rss_delta_bytes": 1003520, + "max_containing_size_proof": { + "positions_shape": [ + 15, + 2 + ], + "expected_rows": 15, + "pass": true + } + }, + "step0_components_prior": { + "lower_s": 3.7053968050167896, + "compile_s": 5.37164963199757, + "first_call_s": 0.002701863006222993, + "traced_rows_per_step": [ + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720, + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720, + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720 + ], + "output_shapes": [ + [], + [ + 15, + 2 + ] + ], + "flops": 3578378.0, + "memory_analysis": { + "argument_size_in_bytes": 40, + "output_size_in_bytes": 264, + "temp_size_in_bytes": 1506200, + "alias_size_in_bytes": 0, + "generated_code_size_in_bytes": 0, + "host_temp_size_in_bytes": 0 + }, + "rss_delta_bytes": 7471104, + "max_containing_size_proof": { + "positions_shape": [ + 15, + 2 + ], + "expected_rows": 15, + "pass": true + } + }, + "step0_components_stress": { + "lower_s": 1.0494220610125922, + "compile_s": 1.699748401006218, + "first_call_s": 0.002424865000648424, + "traced_rows_per_step": [ + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720 + ], + "output_shapes": [ + [ + 15, + 2 + ] + ], + "flops": 3523916.0, + "memory_analysis": { + "argument_size_in_bytes": 64, + "output_size_in_bytes": 240, + "temp_size_in_bytes": 1506072, + "alias_size_in_bytes": 0, + "generated_code_size_in_bytes": 0, + "host_temp_size_in_bytes": 0 + }, + "rss_delta_bytes": 1650688, + "max_containing_size_proof": { + "positions_shape": [ + 15, + 2 + ], + "expected_rows": 15, + "pass": true + } + }, + "step0_structured_prior": { + "lower_s": 3.6218338290054817, + "compile_s": 5.501567266008351, + "first_call_s": 0.002743103977991268, + "traced_rows_per_step": [ + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720, + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720, + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720 + ], + "output_shapes": [ + [], + [ + 15, + 2 + ] + ], + "flops": 2801341.0, + "memory_analysis": { + "argument_size_in_bytes": 40, + "output_size_in_bytes": 264, + "temp_size_in_bytes": 901592, + "alias_size_in_bytes": 0, + "generated_code_size_in_bytes": 0, + "host_temp_size_in_bytes": 0 + }, + "rss_delta_bytes": 3964928, + "max_containing_size_proof": { + "positions_shape": [ + 15, + 2 + ], + "expected_rows": 15, + "pass": true + } + }, + "step0_structured_stress": { + "lower_s": 1.0632718060223851, + "compile_s": 1.7362065069901291, + "first_call_s": 0.0025230039900634438, + "traced_rows_per_step": [ + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720 + ], + "output_shapes": [ + [ + 15, + 2 + ] + ], + "flops": 2746879.0, + "memory_analysis": { + "argument_size_in_bytes": 64, + "output_size_in_bytes": 240, + "temp_size_in_bytes": 901144, + "alias_size_in_bytes": 0, + "generated_code_size_in_bytes": 0, + "host_temp_size_in_bytes": 0 + }, + "rss_delta_bytes": 1048576, + "max_containing_size_proof": { + "positions_shape": [ + 15, + 2 + ], + "expected_rows": 15, + "pass": true + } + } + }, + "progress": [ + "[ 5.4 s] configs: control(n=8,rows=11859), step0_gather(n=8,rows=11859), step0_components(n=8,rows=11859), step0_structured(n=8,rows=11859), reference(n=9,rows=268677), reference_b(n=10,rows=115473)", + "[ 38.5 s] reference reference solved on 200 prior + 200 stress draws (compile 2.1 s)", + "[ 63.8 s] reference reference_b solved on 200 prior + 200 stress draws (compile 2.3 s)", + "[ 63.8 s] reference floor: {\"prior\": {\"n_draws\": 200, \"multiplicity_agreement\": 1.0, \"raw_count_agreement\": 1.0, \"n_multiplicity_mismatch\": 0, \"max_position_error\": 0.00015786921423151782, \"p99_position_error\": 0.0001280749711777913, \"median_position_error\": 5.9668954361473236e-05, \"ref_distinct_histogram\": {\"2\": 21, \"4\": 179}, \"abs_delta_logl_vs_reference\": {\"max\": 0.09204751533968647, \"p99\": 0.06845503627316121, \"median\": 0.004628222675307825, \"n_nonfinite_mismatch\": 0}}, \"stress\": {\"n_draws\": 200, \"multiplicity_agreement\": 1.0, \"raw_count_agreement\": 1.0, \"n_multiplicity_mismatch\": 0, \"max_position_error\": 0.00015786921423129578, \"p99_position_error\": 0.00014084184669768283, \"median_position_error\": 5.966895436132821e-05, \"ref_distinct_histogram\": {\"2\": 163, \"4\": 37}}}", + "[ 116.4 s] completeness control prior mult 1.000 raw 1.000 maxerr 0.0008513474499103632 |dlogL|ref 0.8682473458375171 stress mult 1.0 maxerr 0.0007893460711579142", + "[ 116.4 s] completeness step0_gather prior mult 1.000 raw 1.000 maxerr 0.0008513474499103632 |dlogL|ref 0.8682473458375171 stress mult 1.0 maxerr 0.0007893460711579142", + "[ 116.4 s] completeness step0_components prior mult 1.000 raw 1.000 maxerr 0.0008513474499103632 |dlogL|ref 0.8682473458375171 stress mult 1.0 maxerr 0.0007893460711579142", + "[ 116.5 s] completeness step0_structured prior mult 1.000 raw 1.000 maxerr 0.0008513474499103632 |dlogL|ref 0.8682473458375171 stress mult 1.0 maxerr 0.0007893460711579142", + "[ 116.5 s] reference image extent: {'prior': {'max_abs_y': 1.77939453125, 'max_abs_x': 1.7773254429359933, 'max_abs_coord': 1.77939453125, 'p99_abs_coord': 1.7590830914129167, 'max_radius': 1.8116226317743076}, 'stress': {'max_abs_y': 2.2498046875, 'max_abs_x': 2.300267215077964, 'max_abs_coord': 2.300267215077964, 'p99_abs_coord': 2.2027852305644777, 'max_radius': 2.5191249773380773}}", + "[ 116.5 s] timing: compiling every route (fresh closure + clear_caches)", + "[ 147.4 s] timing: 20 rounds x 20 calls x 4 routes done", + "[ 148.1 s] fiducial gate: 7.743201200876812 == 7.743201200876812: True", + "[ 193.3 s] grad gate: control=True, step0_gather=True, step0_components=True, step0_structured=True", + "[ 193.3 s] best admissible (precision-equivalent): step0_structured; any precision: step0_structured", + "[ 349.9 s] vmap: control_vmap1 1.998 ms/L, control_vmap4 1.442 ms/L, control_vmap16 1.139 ms/L, step0_gather_vmap1 3.255 ms/L, step0_gather_vmap4 2.494 ms/L, step0_gather_vmap16 2.121 ms/L, step0_components_vmap1 2.020 ms/L, step0_components_vmap4 1.380 ms/L, step0_components_vmap16 1.166 ms/L, step0_structured_vmap1 2.023 ms/L, step0_structured_vmap4 1.446 ms/L, step0_structured_vmap16 1.133 ms/L", + "[ 350.0 s] step-0 route bit-identity vs control: step0_gather=True, step0_components=True, step0_structured=True", + "[ 350.0 s] step-0 split: ray trace vs ray trace + containment per geometry", + "[ 370.6 s] step-0 split: control trace 0.495 contain 0.641, step0_gather trace 0.489 contain 1.906, step0_components trace 0.492 contain 0.594, step0_structured trace 0.481 contain 0.647", + "[ 370.6 s] uncapped containing counts (NumPy path) on the prior draws", + "[ 394.2 s] uncapped control: max per step [17, 13, 11, 9, 7, 5, 5, 5]; draws exceeding cap 15: [12]", + "[ 416.8 s] uncapped step0_structured: max per step [17, 13, 11, 9, 7, 5, 5, 5]; draws exceeding cap 15: [12]" + ], + "wall_s": 416.85579955001594 +} \ No newline at end of file diff --git a/results/breakdown/point_source_image/solver_config_sweep_step0_hpc_ral_cpu_epyc7702_fp64.png b/results/breakdown/point_source_image/solver_config_sweep_step0_hpc_ral_cpu_epyc7702_fp64.png new file mode 100644 index 0000000000000000000000000000000000000000..2b6fc48491c0fe033ac7563f9518814e1942c5b1 GIT binary patch literal 104301 zcmb@ucT`l__AQK^Y!h~i0T88aK|};3OSTONl9U_-RFVWivLvxvTMQrql2a>5vXV0@ zN)Ac^Wf4_k5hZ8%=H}kt?SA*YKfdwCV+<1(Rp;!p_F8kzIoG~_Ughkz&8(Xl7#OxG z$e&hYVAyntf#EyWAAi7iDi5C8gg?X`&*(U++nPDLT(&o5P`>PV-P+dC+TzMD&ZhPb z7PdA*eByk6dq-xU`X#tAN2~RZFlnK=Y5bzKoB0TQ zgOC3Et2b2NaO2rd_RzxDm!|Bt`%{kmbx|MHECr@z_F z!0_UuwWznOn3&l28#kt0h?QIXTE5-Xryyye^4+^?vn-3YY>NV>>$}r07Cg)Aa#Nfc zYEdusSm^ERi~se^gXd=T;jH5JaX05bdq)^nWLr>7vS>T^>~Wdea4I0%rc)xvnx^*p z_3PG``Ce-`-&I!Dnq?&!mECmR_iNMqNLC|W-4vzz^UptL(yU!~wseQoo2j2ZecI6b z_Xv}+7}J@#;fyjp%Eye$x+~Ii9S$lX;@8@QTha~mH*DBY6C+#JmU}HlGet|Bx5&7X zv1GD_$FeEz{^s3B538!G{`u#hNe%-IdZiw&>DIS76@#B&F2B2Z>(=ZmjoX&y#;K1F zoYF|v;C6L)Pr3B^k7VtPXhZkW9Bbw7Vpj*A=u_T|@q5?apW0qcrD|{5w5ebRKU;ws ze_Me=Vwc-6@4JeMWTh}c#<`o?*Sbp$O5EqP{C_>uJ35+n@7|BT%mOF5RHN&zhvW0< z_qn3aYiK-KUS96)>4}}}s~!IA&E7iEQ%MObyD{-hW^LKQmrY#FX{gyhFK^B(U8PEz z*C8*3&rx#tB1=o9fons1nOB*$XvDMFSO<}cwdC=#HACOMVp`|VKmOy7KX&fh7sb<9 zH1A$BY@Rkacr|fusQA&AHNM%Nqg-BM>R#V5FjQ^Z@463c25~J19^m2}ee2r1dvD6$kbd4?d-fl&2il3aCQb%B=eZGA8GK-4CXq$*~ zjEq4*^YaU_jy>#dg9nr&k6$P)Ew!X&#`77Krs82(Y2x#@YR@929z@azsMR%|!*# z2;TCziOT)%N_Y;X(QZTBp0hObf*o_+ninrdR`~8sRFzriwT&v4a-B56bqi4Y=cXEE zQxH&vj`V_^h_J9mntq;&*tYRU3=Ag>50YFG z=g`9+5^_}cS?;y=p<4bjjq$FMmQqjmkbcQ4Z-1N_p{bvFu(SHl!$Na)LXB5f7H5+6 za+3QSV=}J1dm!#(lx60NTXd}LInl5@QOUlDz3$j3Jr}oh%&^G$8rfD0*e$Vx*JG;# zxrRTzzFn~RnQfly-u?RuA=4&vAC3Ji5Icnk!+kOgr{(0#J_=U7`E!ei=b~fK;S0ZZ zp8YFcF~suA+xth(|8+|%!!S*9EFW3PZN~D<*|RBLYpWzouU~&ro@wYt=X4rwRhE&F zY5h9a?PYZ8?$!^X0>;gmriz-WIv?U^j0zo-_za7mW3Nb*?=G^ptbDX@sG}h3n{U6( zF{$3sl3~=%8WJ9!jK^m#v2ve@OW1AtDoK8lE@REVf4eat>nh4%GM6h9IE$>%)Z3HcCzT$gE7OTZO-R zbz&Ra@$)&BEo28ymv5IH#M|20@i3$>(Gz2yL`Hh(2cPj=9ycFoh+-8o^C>PVnZXl% zjx8S$C%d++PT~?jmWrrIv8H9ZvT-x?)_r_wOxYG8dMzBOB#fT5i$un=EhiZm9>?R! z4o16=`E%4qNmBb3b{^F^@9*!Q*Z1cNw&Otsx6vGG6Q_{^Rd)YZ|B>;^E&~lbON#Fl zGJ%On?=^)_r)HI+rF0jj23*9sndb8ZDs*_yw2ep5F59joBPi*G*IcLS#W)pIrDvW5 zd2lLV<5G~)9cM>$J*PjMWuzQ6DAYjB@H;gb#IbF^ln$?cZgY+mb$W(sWbXCO<}od& zO*2-`w+Ra-f~w-(%cEfL;GkX~E+Q1Q`qX=W6INf?qABiZNK2wBJBzWfY0Z;}2P_4~ zpI-g$w$K;S60f+&dw0UciP607A*{p^qtfDN&sklo{CYFWL;lj|s06%*#X49Y`_P6i zgTWp@*|F*s&{^~=J-LXv%7jT=2a#1R|Haq8Z~hk^BGigP?UC>Jzq(b4WQBNQsl&O)cY z@$n2~PaaXx*2VW$=2^7V-9Ls4Tl^YPZ?-}!x^>*{%N>rS^G{ET8&bdDvitd&hr2g# z+T`!&=T{TLpYhVTa%hB>MGG%Qe50W2I#CT4Cu{km8YF-H_02hs zc_16j0(;Yi#l<5>k1E~XxZU|`y5M^@ngtC&q>j_PRVA)pk=W!bccd-yF!KE8Z# z@7`l_f5E&dvESfl4k~I~--@Nm2OiawLzy8{c)aUIqO3jF|7S%80 z6GiQ@dROW`XX9-*Ub>Wy3U27N;^h5#HqJLeIYO_};LpvwfRz%l$;EwzI62P*a;a*S zxXtX`xs$`l$Vf9yPm}48(s@*+!pYguOFkdo-e=N$dF9N){QPsBmsi|A{k}2N)1w`6 ztyJVZsusd$khwe<*|M6a=*}A|<5_6g{QQ8dtn4nni#jL(EuYK1g)UY+JM*ylrSaK6 z@7}FxZ`bEM_vHN2>}Z-vUF13U5=E1|e*x57i=t%_BM~F4H=H>&0p$v0zdp2pQsRi7`s}$4_wG?G5 z_Su!WZgVT$0FC%_yAcg`$;R42Yqdg`Sg1FTW)lP0>6+T}bz)1>I;!F@AGq<3inpJCR^#wL@>6`Xy-sjvK z7m$`(vMtoV|KW!thY!n-w&hSzRoQCJo<6OUCL7vb+*c7zuD@uLn2jGH%a63DzdSGE=(5hEaH|Gp!SBZ|E(KEYWhs0ALK|I}xde zj-StIP+yujs<4rf?fUWlEK13f628_fb5*jPS65d7%QbMzWKYE>BuGT@adRsGM#Y^A zI>O1$&W>f2Ym`|^%_*~aGTY^`Ja0#;8NlM?+?;m#-EF9AM^Z+faI2>-ssndoQw<0| z@);`B&$Ye~Bjc%2=x9Oi28oLxko^FZ`^4?vJ{>{9-O0oh`}ON}l8O)!NVBa-=kX;t+2hC6!}ZyP^-Cr`Q_CR>+x$=ZWc(NXHK8)9gJKAsORW2 zl>RJ-TYUfi=_$?hi{ePV++M584<0;dLWWOk-Q4r#3+Xu&s4+h`*#u@+o@<+NA1fHx z$-=^IYipaL`5|>EEKHh8u+O&}88uFyzJq6~nScGV$kq2JGRjs9)zs8dCB}f&I27W~ z1=-)D@Qvoo%dxZsW=(bc(zhJiK%Y5N7%k7n!jc4>D^@NjCSl)u&(L#5lfXShL10Ko z$eTBBnhP8T9IGqy$^orJ90$+u;?>hYS}mMvketEOs%AFccgn(`)I*oubJ}0RX($fi zU5ic#y&OwvN>#%WM-h^Ll0lI(W1}0Y=()N5XKPm7??hhjb5#il<~K_J`Jmi$JbO|f zGBPp%dxg@Z+sg$v>Jx$Ru1C23M0RHu!%*{>DAj5o` zv9f_SVH&b$j)Q^W>vmJLFsrf(hhm3b&rkIDa!{V0+GzC=JJgng1wn%SqEE@O(pG9>Q`$PA4ai*J0myq^S)zX>oollNz2Gtq#$gMLz1IyyU*9UZgL3#D*hcy`C%WGugj z(ShE?nc~r1>Zu$iXzIg3N!H|{;k(8WcHq?A(B|f5YunpaVnSp?)29}ab- zKC2j9R|~Uo9e>&K6^^h{&n1bY1K8XNHl2lX0oAC*0B;X1x=TwYrly1h1O&9$Xf1dY z2dlsP;fHYKv2fJ#a5-PrFpq`FF!V_JeKM=_J&sFV%*Lds4`0lzw4oL_m>;Yroj~gg zEJYYH6n_4@??Qo69OgP*^eerPBKAGtEmANa3|YA1W7M=infOM1Jh$%a;j29fyt||EQ6q#@Rmn zBzVQGrOeB#hfcS6_UxHbW3+U=flH^U=(RQz9{~~;73JmS8X1P2Z{NNR4Gm@HX+@VfB%@8QU!BhXz0~3B=v*U^Giz+T4{P=`=#ANvGbU5D^s6tZ`U&&9Z>RS z+^2*}qKr~X?`0(t{2|P--<+1j>MtS?=tx?xP_Ga{mPhbzTfYa&e?>8H2PBKP$ zH9Ml6Zf#(MhtcmCh9@g%XlR&#Ml1nMegbNeT)@QSq@e8Te5~f`P)o|8qetryni0Sx z3HqyOkd=_n5sCKss%Sur4jnmCBQJR1z<~txwd;|KcBP`ezP@;-RbMx~{nmzWeK@87 zxXj(%JcuyuhJ>rP|Q7_8&YKrv-pD%+LwJAs#O84Zi6^6=LiD=3O#uCkxn0;-l(JO%xF8+y1TTKIk3d-v`zCv`((tiTmTKZ;Zfo~ z;j54RP4;_EUr6j3of~Y3l9b%)_wb=mfKsALloAkyh!i(>bq62~t#GVlx=B$iXKdE} z)2Z#!CQ?#TN@&yTJ6*c3?b|cg<({zsszCYmAKxpRn8eXP#Cj)bBn4>h$+t85I8N#6 z>PkS;Jp^!$zT_?0)^yJ*Lzn7m=Ma-~!AC8C-E4udl(CY^=;M^Z(;Iwx01bjKB ztTKEIIaZ9Mk^m)?NhKvEACmu&#d9a7r?YeCu%*+c-gb9)e-8CRyO4P?Brc9)_#%L$ zKe-qSKmlxU2fa1niclWy^ib?*-2qSXQ2?MmNb^qPB`+B*%fwtpK7M$@XV7-X+gpFm zPNAZ)u@Ru~oz&M?-&Rnm)a+~Rtson^kR4bR`azJ%@A1wm977}P3#_eKIZR?3*(3>t zqHwq!mCU@Oqr(SV6fBtl`UPQd5xLQMP5YS$Lsl?rt~F3)VQ@gKclM?8$VUO5{ueKf zt=EGD<-Nnp%mPA@hpey$1iFY0p)T5Us%CkgInbZmr+SBKVd$&`DY-cAzk$bg{;b zFYWx(Kh_tjvoL2y%BjDOW!ROnIzl0x;_=ZD>J@Y98=ptC5h=0W=}_ms#Vd7dEqm=KgztSabvB#D%qef7dH?cHi* z&xo!i9=6uPA?5H;k}r^2N$N{%|5b84&_|&EW##^?bR&|sP^ojS@Tey!6)xF0cOUG% z!_(+c!K|LBvahG7$JmmZehr+%6+8j+2Rpfu1{3u^<7uxQLMq zdEeJp1Znrhkau2qNxEx~XiiKF60aywx(E`&p+ko%9LG9nZ{NLRFCu6q6`=0ld7 zVMibX!z(laqLU;XBrZ<;($h*Y3o zT4Yw}N0H9HJBnONlJKot3|ZiIyeGHp;S-LIj!pm?ZmsOguFWlbRW|Xhwi$||>E>NW zOgO@*hVHxunGJYqb?Aaq*Zi0T-pC6ohYJf}$K~BcTI*cAM4Ac7y7JXY5#(01mgTHB zzr5YVQ$1Xulg^~G-V?x7gY zR_yUYk`o0XAppuM0dz>~SF)TyK1@4z_P)p9c1gJ*3L)`yQ|yzy23;l>3N) zx9QfsqIL4?U;?Y0b2moTtBXXmydaXPb7)1WEV`yT1VY;9J$x6BA?8H_*aBQKudJO9 zon3axEsh-VTFQBak_Mh}d+S$p6yaSZ?)vPNl*Q$##x$!7ZE?RDr^h@*1Klty5pP;% zs34e8Jo$hk2p-9yaL+h;D-)Snq9zgzJ>=OlxFOAi0i_ zy&vh`7*EM3A|gUJ&n8M_S&QpZnqf&>eo;{b;St%qE10JMzF8Frcv1?s;_+f{POOaa%~una_JHXm^v-2z2k+w{c^sVcP7;x z87aim?!1P~4Y3BVcKU9Lli z^b~$W>yv=nA-_nW{%+&O2&$2nbgk)t);EL&KlNx7ekZZ<=_wYmm{ zhg)(oB}fOOAo%3v0sb_F{>fNT=Y4!fCNp<}ZCAM!D%9EQWni z76kDao%A*;yW5UY68*|2M+U6XhA0F3*N=4;rP=A{*@ys&phWO@id5*nDKDApvf>bz zcFwcywjmtD@Y?KKz+m%4o+7h)R_`T6txY=ONckEA*W=SK#b~RnHPwt7*WZ+qo&R*Z zA0@2yYwTG+y~<{A!IXL-u7PH-Ej~|Ne{}|33QNXPk5I(GEEP6hF_8;>;kd&0vU&-#}_;EFiQ^!<9CgrTRdk*VPFXC)i1OSBj#P_%=Oe=31; zk`nFNX2`*sp%WaBEGJP=>eqDnj;wN9=EuT@waHBh)lw^uFCFv(4yz@!IMV zy+6x>a>zJ~MzCMGVpi&o7bDdM7BpG4uK57jls#NzC;Q1PKA%ac%=Wr);ey#@Z#CU8 zwOv+23hiN$q9XdLe`m-m!ZG=qKrG7CEXAT%w70iQG^iqfW4Tx) z9G_csFWz0^VJek@v1C~JR zWS1|mF^j{>sWddzNf!$;%dao3UT?L31Li9#IxFlYI}=OJv4NV^Jfkgu$3ZsXNU^Nw z?XaY54X;r;n5zYz3W$Bo&<;AHS#yEM%^6!m2#lh zYpW{+plhV+2$WA+gj|-LLtTqZJAKF;=-;%{I1~EIs^HkzSVd=N=Yb8BF>u(&nr3$U z2wo}sLBh(8H?6nVgr|Tjw)e?MjmkG#Dzj9O8orLw3xeo{>Ouv|BV|0>Mmh>8=kyvv z_>Btva)w*egz$#+u`M)(S41nE`F-51Z+hM?p3yWzJ5G5dM;}U00{fk;bFXTi@Ar?G zc@~);_FXDc1`FM7hkBdVQGgiiN3Dk^`f7p{#YVw2rS|ZS8U-FwX4~;zFhGBk4g>&= zLc8s<%P;&*(4j~1{ZU5sj#q7i7OV zf4R`LP2ad^Vxdy^%_&g(J{(!-29Hu34MPeij7x-cIWP6~w#8hCDi13Bqr@pTay33E zqB6YX`&uw@@$UUV&X7_hOE&gRN9q;W$NQTgSc5M|&hEae4G|@6=A6~w`=@dNVUjL3 z!KMz#LP*P!`^L|G6D%#~&ZDPW5VT2$MOrN1Ua835vtZYV>>mXJzmIEiTr$YN{u<%} zvx|#MV*6S(S4`c6NY|>&C&&}d%+W1N9PT{N#10vZ?n)1yIyyawU9~#B8NhdwBjDg`(S-mo77%|9>VCsp? zSYY2L4EY4Sr6r)(5%mP0fWW{R>`#RNx4E$>n?-a~DIkK*DJeAro@SMFfO1IK3&luW zp$SFGKARB?zgu6Bb~Y>mMCdgrbi9Bjms0_yp#=}0w25E^^(aS;N-qXXIUTu}{{rW321)`+}+FT^M z=)gdTsgeaR6rup(8(%*itxbovi9!sCyAUlT#kUN7BZmTd9LJB*&IJWVwvL}(ZP+K{ zp@Yh6`SHc&!U?c3RUek|VxpNKFn-G@nGHw1%228m1J#Cy`Le+q)u5U=76b+q$6?$` zTZwxf2e*ujVE|f{B8xfgKTqShZD(^%Gzmc52K7J|Qg04b}4V+5Nw1nd@USM&@DL0EcEl6vAaBIoM#;0IPD7h(qh)aJ%j zpqFi;QxY9`gXiaOpqWs{Wog~GaU(Y|1(YgUml&HH*4C+UYelo2mME2r(71XB1`^Tr zi}ME3a?%lB2p1$anj5;p6v(Z}v4rR_-3G@+*3GpQmzGprb=2sryX_hGL9>7qcDy_q zhfh^pEVH`eTo);>PSm7_yLpj^`337T|zb!i+r zmKItPFdvb`WmR?MdA9vjIfE2i&VxNEN2 zXXxhwUH(D?5^f+xcmxD4Tx-kz0Il{(Xy|hy+yft&S9TY<1|*tX|1(Pa1x3bW&eoqi;ZT2Is18gL5H|J(BIV$r~)z)RBg=3Z2H z9>PEE@#CLHX<3yI>VqT*{^L*}QC7MSmR{IX5^hIq$`ff9dH- zGnUQDB$_Fz_x8k@g^`--oNgBF;mxRm&7cqMmqWB{_FK)G7lFrer0!Kn)=CQpIFD>~ zi5rPg&kOgAkeYbQ6fWyk3Y&%pWh$FyJ@o!*xpHGAA6H{eUU=5P5899D5hbPhUyv5U z#cZRAO411dr&WkRN=|XZHJc#B1|2vK-Bd7SwI<)jA=*t8Mz_y@?hyu8J-kR5D8(Ax z>Qcmfp^CC+}i1_ zAfTrp;`7iKE0Z9tV&{?kk}I<#5`GbgBAUQu$Oq$&`{8LK51o-+CUUfIH@~4&=dmU4 zIwX`{M?6IoxR!6XOZ~NR|BVv?*`7l%=9;I{!k35q9Pw+R1xT3+YA>(66O0-MlTX=}#TDH57OW+w0-D3> zOlz%n&f~{*Ap24X;SWM$*WvT8E-$Bj%y6Fd+Yb5fx`fQJW9N|wB;04MbNlz~+!==? zFoexRC3?|Wc25mdUUk%4;>~!D#bxY^jg6f_i^GFF_Tj?^Mg=WId@C#pJ0Yz>nvhU_ zl{r2KkB&)Ll_O9twAik2LPLg2I9Vo8fD$A+1%fVoQGvW6YSRV-|eGBD1XGdVwV zP3Yl;#WLfjn`{tVBx*+olIt2W!i3Dp6=?&%-8F^J=u*_07!TLLH9cBqbY2^7JndRv zUtf?ZZEv5W^xds2&k(Oy@qx)kWu+Xt19gA>cAKrHu<+U_I>dOaeKl~9MdmrV%yVs< zfBf+=2PzJCxhv#?3u^rXJ?MEv;N5{lIt095mt!m_Bu+D$o!R>1kLST4G$~WS_O5`Z zMpg(Dv3_%BQ`?Knw`CRw5AHgubF6aW`|rP3P|F?P9#&mF;gIF@T;EQ$eo!I=;HLc@ zR7#XaP4q?C&ZBxQN$QoXdstbMp(RSsG^^8h7!ivINdBu0k>U^T-+y_x8`2xD@jO;T z*sP9u1xBjXK0%?4f% zyBwCiNqlzdV5}8Hp#{OT+h!UA+kgD=Jz~W^J0r@q*Z*wxm3Nz=ou?=S9wHYEA-g%< zK$2`VgkM%oDRHVG(U-2Rx_d&fg)nph(p?M0=ovcYEO-oEzQ!@LVKy;+?R=I3*HoI{ z46!*tLovDA7s)By*Be=r=5|t!6eVcH!|0OKz=so49iUYb_AcwOOScrOdk~Gmd3i36 z5^JmKTR+(n9PkP>JVpBghNl$;SM>7s&N+=?bB@^i7n zjxtZlk+vKj{l-DH1~6qBDj8|Er3(opH~04TTGz{R&HWCpRuwu2*|IZ;1Y%<#mOR8U z(LD-^ii&ar3f>0I8M9Q^y2Cv>Kd|n;jC05;J094pCU_^yXyZUGIskB3GEInYVeeZ-nuyWg)!!qO~EJvu{P0ghBIZqFWJ+IwU4* z6KA@1H6&^eZ7qAnE7qqW1ES?~*gFH#x&FwuqN*TiXX#DjJEgE+@fz2SZl1}_57QDD zp|l0E2r}*3)i-HB0vM38gY(=Vo@WzuHf-d0lzg6Fe))x}&loCV6%0Jt5~skFxJj@9 zB)kD6g!6>rcym^7cKeTr0DFm5AU%@564mA9*QbZqd}7sN#=8lgI%+}@_0^C;2%{P{B}*8se+SPyj23g~`^I*anqyXq@EqJ|QO0n#JhN=4t4 z-kcN&I$#>vWDs>Nued9SCeu*8YTK5b6i?Tz0XG;ah|2-sS*_b^tprgp1LDyNn46e{vON~;JMAj>;UP+< z8Wd@PwaX%=Jz!Z~_RmImZ_sZNo!gJv>;f`?&$Ss&Is4+`y)o_%!#Y_RXR)hoEv`H+ ziN20{V*m}-;z~vdqkmwl`Y2RaRMn%t`y{mxp%m=6R9t}p+@VxZucYtORT!f=2~poi zBzgDWO${Em?zC}P5li$D08lNO9q-P7{Cc(O@qr@%Q9vHBm`=ZCQXPyBFi$xJYk<`&{z!>R`X(>7iI$%Zy~Y2Z1^HRs{3mh#)xF zvD=cSWQ4#jG) zw>r?0lHgljn#W~HjF?NDv7X^~x9uGQr&B#qxbOJ&S9F=YaigWx20|r4qjG{x4?SJK z+ezTAjT&eoj~ZvMNw~p5Dp=9cYH|w|d=T}AcoFw|e0}ZMV|&I$b#|r`o{>ihwSyf_ zxs9XzwL+FHJh2YElEm^2rmmo%fS7=)Csu2!-Q=mVtc-CGS9G6W(7tnM3O z%@S#!=uC|q;dgg=Y~B!QC*fPdqw226?p(pVf*Q+GacO+0G5Tm&u%|9uUNzSj0i`FV zRFhBjIm5t1`euS8a-N%w2MAxYdNSMlotKwaVwxye?b_~cBfRAYP@cA~E>8=%VFyBt zsbv_Ja2UvP5vLT&k=&NuN6*9LZ0p8CUW}R-dFb~;92|JQQ!8de$3TAN>Fp};Sjg=1 zoHLM~tU9Qb_eIPKAs3LIXXDy)R>OSG(S4tAtW_t{k3*Uht2VqWBGw<@4<#%iL9Rn( zhkhk#h%@LfGEy@E5QzV}W#%)U7(vl1p!-SRK8^o2vkDV0(eAElDLje(6Q)y&b&ztc z?uw+?Bax+-`(d)d{u(%(5E-csta(H?Gj7L@9oaDCI~ruNOWin+G@^0iMt;j=EDvBm zu|sh4@u@&O(T1s-81AK~-=8XI8`UzKc@J}d?xt1?czjO+M>WA(U>_eHsJk`2`L=<0 zg6+VJDZBt}FO9un5VUa0LnkoyMl>xodQ^y222~ctc^HldMVH8;9c3%aIW93FOf*lw z$Lit*xozX-J(Yf{bKjOhYDpaMf0DIy3yLIgXDYkDb!Q>WYcov<%NYm`ga!z(pKFWU zYwvcm``=B%qWKydtoFT|(A>48>1#L5_!Wt@Wtu*O8zAo1ty}uDFR80vAT_+B&!^t} zoDX-P!Xx%=dqpfc6jX}#6YJE?<%zR2>s)Iwc9iRFXXNB8QAW?n%U8Wv`c1(Sihtai zyRLHz%KOED>DL?CO>}cX8BEU1v>-H4b<-VtM(=Ng=9fR3w(n20+7MACU`Ls`Ad&`# zZ!sa{GK_PDPF4`@RGMZ&9$FA<5crA@JQ>Bm8vDTSdByi39N|w-c~9d$_108V(590X zAN$>mli4I55Dy523gcx~XZ#603)x)S=*O3*_KMlmeGu1&VT8~%18O$*yL(W|b8bvr z@pgD|^~1Ad=%WqM(h)pM5?mwIdmHp57tzT%L7TW}WCk}5%EJs?vi*bKz6Vtl6xc+x{JL+J%E!P|M=eE2dX zU*GO5w-9)t%_&^h| zv3*^kn<9<<^&V0L&-U%x;iVo(D3Ym8iX6!R`b;_T`!{4koyR)DY*?4<%vGDQr;cCs zv0F5^_5B2_CRlM?`Bht~XAwu=IcZL=%Er;uQ>L2QHRo)o4=3BO6GQ-3(21QO&Ews6 zret(=X<%UDBW!^B2>Y|VvSKhaHaQ*#hfS-9IWSy-sFC^HC;`6HbPB0{GZ$9OhL1S| zIFlp^)%F>T!pE~84bbWICV?25XD4luJbtK_5;vFgDekdZQ<513>)F}a1!Q)u0mQhC zysXUB6y?<(Yq2QM)4q4_Ue(v=$223Yi_)z&voyYPVo_kP)ZH+wXhtm+GH=Mw zZb(nQ5PR3d!-F(GJhWrH<^z8^N;jaBPE@$dq8v!GJ70Xmj)Xiin~LAuXojowJvSBKfBT7|0ubEp&_u$~m(2=EmNN@2e$48aW{f_MH5BRB

bNivvr7?Ao13A|}pHvP#cA!%+o%mQ6Uws05h+2DCL_`w>#^qxI)-%!Y z#^>)9nm`ad=6TuI3|BjcLHFHRzWBJ|vX36{3)%~3Kph{%6}Etb+IJVOGCiVjaKyK- z&Bi5@5d%P503c@xm4Nc&bhkMPBGZrw9b!*e`Ev{&skC7GxM79c-~O=mJ*0(Qd-o0t ze=wgL>s$nqj7;y5950T=hv=-8!E7b>h>hFW2LzL?)6uVf)q&QFg-mfpGO|nue8tul}HB6z?qqB10fbgsu>DZN{c8sn0ruF=-3W! z7^O-53>eNT?UqgHy%Tw3vYM-}zdwOEbq!n+;OBe}k1m>81$qUsyF-3 z`^++UfrQ~j!kmG}{Pie^@~nA|bT!b6%6OD$CmM3*M|hn(ZWsiodmRP$uHtvW+}>@u zBV9s6%PBs!i9#luj8g?SR(2VVFn<_I+%$p zUFaAPpBs99j_So+ zQRxxtl1nQNV3-;2PeXjJx7#P22fyVzy0kksNC4a18lZ1q_L-gLrdeNVN*3kB)c-{Y zfGs%-X!{<_A*GW#LMkdEN8Fc_WGQKgzoaI?1kCoO8xt`Ve(e0n-HB;AW|a_f$Al-Y zz;=nu%(j=*lf=YCKqx=W?tRQ z(}dE$YwBd1P2B?Ez0KQdkn}I0PkL`eaZn#wXlL*PFk-YKD}Xmk4Ngn~NAc0l&&>_t zq{U28^{n3=`%^%`P)5?8JlRPunsMnGmYXFvQU{6%3`&POSG|VQ@>1Qqd^05&qi-%+ zpqM6uJx9Z7TsQ$9KJ#YBfr8on2e|AfrOeA>)~8(*9wK9A?MSwH(z)~sBH8q8yKQ38 z7^%b5tm5Z;%tBU{qv0|t&zeSMoxwcT@u))?V+v4o*y|wZEPDkgsU&X%M^NT(LOf(Z zR!V@VN>5Mz3BwU4;vC?s_n!RU&9pFsHt`x`;ULmNL@ob{oXLt5xH{nbdh!b_ zov%PeZ*54UydW{HfT>=$9uf9jT2vzpw!32vq!aUm|*+1n7Fiv?VWy zja@aHnT3InvQW%J9jtx=&DC+dtJ87t{p%-SI65;MVq|TR$?=_+}z>Vt+ zjEs!5StN#7IK?aF*KM1iG1u1)hE`(4!~`#K>3Um`EC~YdG6xH~3Cdr;eap0WuNBdR zN6YXd;!4Kd>?kr~#LI+MI03tlxJMqWkg1(El?rAi^syXaaCl89l!;lR^ZdK9q;gB29RFBdn1Koby_1`n!3hX52;35<5GP&954zQj$n!Sx5HLvpcaWUb#m5I;OhHd{>R3PyGeoo;cp@(EnSar z5W3g}mMP6)8fMM<7aho{O5m7$IRa(9ZX)NMB^GRT%(f8AEooR1DPU~rl9SNjJfHfK!Z+;Vi5MNE8S!3 z8n$cCQBmrZQFeSeh@%-r(u7s`>ZN@=D3p!P9<#%ZKsZs4U=|Spt$z$p;SdU9=Zz&# zFBB!3p_z(bOl0fRk%2BWvtJw+8q#?&GAoL$NR(jAYPW4=KK5!W+wu3rn)WZJEA?R{ z@m!(AJ(@Ak(AP-QYhiWnnXoi!@SQnjoNk)}xh{{`4A7eKt#_*@k+1GrCj#d;R)!66LVJ+ZPKPg7~#5YMz@$CY)j7pMuHX(oD6yY6jbet;3IKCgc8z z!5X=n1a#{$Bogmoed5Z6nGJsEaN^;nx28on*{<8hz(r*FbO%{^$u+uG^cJT--fO?4 zBk4R6N?z-40{pN(ve1$eVu5|+R3fi$D^!u=P{VB8L|#C;A=J;~+R(&Q2r(73bJxM0=X((@sBujguzlp`;0>bBelh%g*>O(p(r zz!Z{0VS42)pE3r^sMVSKKh|+<*H&j0_f!u|W6A}PSp{M>?K=1o6lQf{490_-FfjHG zwX`z7puqG7Z`Dx2>(EGcO8P}3AAwefzAgO4kLk`TwTApTR0WbdPo6rpZh?k69+|E$ zHzGufkPzVoCA)KdPy!6SIv5;ctU*AT2RZe@1d%@}MJ!pvEZwWoiLm@tP$)v> zQ-_P@en;z~L!Cx*tvAj)GN1?5s$8^q7aq2mv+7Gln6n;rl5#<&D1hLqZn(PY4&-H7 zY5bSv)gp)~#&b3d#~+k#`tiqO*mxv&`>@M)U4;B(K zzhvDyX#w7a8_o)nI=kQkCozv*KwMxf=@hi#WcMkNz=9EpTR%6|6%(-aSQ<)DeS>!e zP_pg>WMr;#`wHePP!2-YACEaeG-XCa5*I9S9+O&Ix;Vt+0DR8IE6Ic6AOgrD03nm4 z;oioWZb12RDagb9>l2qSW7R|SQ$lv}{kNBpSaz{pu1k!!2i-FD5g-Oq(s+P)#R7ZqX>UL07u&fu zm;~L*!F2o-%n_j=s0b!d|LepC2WX-up-PwQW=5$P79zEvr?1cS!5)4aV#X&IoNCE-AV1Y~)hM!VE=+-0{^y7Y%Nc>#7^cM+CG5`&oy3SD-?GknYWqxtdY~ji> z9(sSlK(r8X9%EFDnD@Z-hNHU<#g32XS%b)=&;K>b^Cu^gr^(vM3nGGRT7@evmdUgt zc!18rFe6IAUfN3SyxCYi!XN9mM)QyQ?x^-Gsc-e5pst|3hjG@Aq!J_-5eNjHkG|9% z*)R;N1`ND7UxMN*={gxltgYlBadL8=t*ysQN1((L_>^D=28R^>!!}l(>N6Gt{+$@v zpgy!QDbq5Yb?I3aRD4AahOlT!4g!?O8cW1c4>i}@X`@{w?OR!etH{^_24D8VK}6Dt z5X`*}7+g-IeDurlS+%z>X{`S)6(d*?VBgD$aT?Z5ow+6$E5dO;3Xj1b-JpmtoCdpu zb!CKe0i1B6s!|hoG-I}I-!4Xm8Y#xK(8!j{@atTX^V@$7T&F1sWD*siKq!p`HwE0d=n5 zI-s!QCf9#E+FB|n$tYxb+VNJ{i|W8VT!T1lYj8>t03E~A*5vdQ$2o58MsDNu@hOs# zVW1~*%qn8}q-SZsm#~L-x3k;8G-63`GU*Vo4G6HThxFi|zKqtf4(GfWL!U`C`4i)j z&gl=)bqQded>z!lCk&oOu>a3JhQ|PI!lKzph9rYQNJ3fZD`e0C9j;uVL>qcYQ)!BX z`$l_!YXXB|+awbzNf--W07EY%WtOEc+dvnHq6|M2sL)8iNQ0ZnWTEQ-Y0Rc7_S%NR zSVZ`JyBaGNsjH-Xww*TqGHW>QBcNOtn-HQ#V^3n$}7=xQU#ULrDE-$n4zyR>5l823wE zMfNr&hE}p%&=Ts-;Omk8D>%sz|2FAXgw|zT$XklW;V`QO))gJ^yJ2l%_{u+l$C`vQA1pDzvYYQ>DD`u1 z62=R`Z2V&25-4U2gVee(;66KI?Zh1z1ZNxWMG5%^$M(Ff-#E{{2ObdEjh>@9f=aDt z=-rbEa|6-hVmv1AV{3%;&>>im4_WESE0=v&KbFycnP{65PRXLSU8xv6@wNkiOasPx zh7y*7=?2%G2d=x9Ec8bZen%@+=P5RKuha2YUcopo2zy4+;P-C;64lVG3KNE9Y+{v{ zn51w@k0rE1jMrc+*+G9kkN}&uwL?MP@7nvbf>isrxR~+! zgBkdffx$)#y$AY}M8MM|fM#(2@9_hUC=Z07f&@`B{L@+x;$a#J3}MWO;R^L8hI(K_ zKpZx;3L3)}WTb4TVXb#>-#!O@@49dI>JKBET=|Q?{y~`-FP>@`-MVpJe;$64DT(hG zUMUY@f)g1dfO@$j8_Rnb)6lz)Xq<;uOvFj(;@qGp56b!cqRWhH^s-t%fa(*wZEux7 z(TApCt5?M+UNAB@Hh41TX^2blbz+To0MeTtCrPs>CW(ZtyzypMidGXtuw za#pNHfo#TL9+!d}=1y}iz5XT*f;U(LO>i`X7DBJ*xi&xcw9&-0+yz-U(xND5L%}aa)xN|! zQ0BFkw(SSL`#9(V2r5%^mWYqMlaYzA4j#F$2O(Kw2g` znH5zIHcXulf>xm&sWq3xMR*+|e*S-ay*gvFe&*9ZzO}6W|MN(&fBa1Tz3-0xtp`^y~lj$^S3TChPU5ZeTcJgAz?aWz)J@E`=bnNtb6zkHDG=>^j<$BZ9atXL}2>@5!<^lLRttxiX1Wa zwg}D~eA%m-jVoT=u;o?R-4$viAZC4!{Q7^a$su0`tnO`$nss_7yZ668X#F++{w=Q_ zZj)?Kp2ds@sqe|bYJY#-YA2$T>%Noe&v1GF{QAFIO{srnufN}CZ69dLy5XPfcm3D1 zv55dm9&q}x-~r!{|I2Z4ug?6}Gs?dPmsb*KkbWoTg1i6q>JCw4>}vAd(2Xp~Z@IU?^ zt}_1`saT#kSjcssT>63k<5_+Gc(Z?Q%*RPEcOHRNHlv)p;#L{w-&@kl9W4-XRXaFE zBlKAXuG|3~I{D9mUw8fd^HYpYDwE^3;Qrn9(@%c^GjhVk5I`0KM`-8*)u2BKCO+|c zG3dR1Qj_d}#^CG_fQA&yHvBO2LT!yLaz&*No6>0>dPu@kv3;MPw-A zABFBP*iqon>I@Hc!Iv*zaDqtBu`;wZFh42=;2Y!|Ao5Y@#;7Q7ram8tl!!xUu&g{F zpf0zwNjS;_H=(*d2F890W07fr0eN)46u~u<09!;KwqeCTB5qmCK%q1t$w6#5QFg}@ z`+E6+9gS?Q84lf41J5pv>rZziJ9(FdYn4Uc5yla4*E;e)gx>@^K$Kwu{>fQF-sP8|- zLVr{Jok4+zZi)+sg zS`l)TL{)8Y6~drka3)O^&gQ|tYU~T^I$Q^$$j?9sB!d&gVG4F3lAKEdufrfl9nO>E zi7+Rz4~7|HnX}3$IRqA&TqU5ESdIs|dwDBpxR^6>G4%Gg`a7X^II9oXv<6EjHf@{R z&i5=ijs5+q@0RS|m79yB5#~AeGjKDno-fQKCu4#!dy04-wgv4kfybwLNJ^?>F%KLH z*v57T|E>V} zX$_HOsWGeaRo6W}Om5T6_BdsrSo$m~#mutj&89+~B^v`p5yn2~Mo$6J&Dta=@GGTy zaRI=CIyj=08j1v{0iOYO$pyIN{W-{Az?oNN!(c<6e(6I0UMOdlV;u#=b%^HnsF>J5 znQN)t4d6m_za~EZ^=5$_`*4WR5TgJdSo!v!8-jmELLpOBYvfo@NJ%ktN4)F%JDZr` zwi$MuB1f2!(<_Oxt)R1M6U#U}f+&9(vHw8@ude0X@HNi6ZNV8WlghMFbVzSCGw_KcjG zdIXb{I2MyffgH*OSu_JXW(eTPZQ|V?C-`JcS(iY)5Jx|8h{O7jrI$+_YUrkVp`pW8 zXd>Z<&a#?9Q3t#C9s-{*oMGslUbA*X#3Bg*2Mc@vF$AWU6E?bw0Xt!8$9Ul&{KhLGQ^Ta?w>3A#+!2^HC3Rqh!A-d?Q1|B7!|9oV%Ng!pZ_3F4jsr<=n%NoCUinG z=u*rjWY<@VfBoo5@>hoI`r^ZG@A+o*GM&>SpK^}RQTzhOKUCkTPi|Y>uWQBVbxl#YEsYsSg!6MNWbP!$8ge%(0-zp>l=e z7%&R`_8)%;I}K?N(<@#=o%KBbeRb z(Mmm!5-xJ%>m{5rX#{#e6S**RM9vNjILQ|ncS|L+D4-w?bivFt2m=z?M<|c+aF&?- ztFnA5t1Xv$OLcv(!YO=mduX@@-lzSA)} zRIjYEshez5vl(r!pOhXYi0996t>l=xXEGEb%qa5O~5DS|`4ZYOX}q3Olt^2y@?Bef&q5xf7>zT^dE?9OheK=rQrG!(bf`{t|`xs6X%AL917A_ivnX&B;9Mo3KaS zMK;mFDkZ90y6H(VGHh|uUUeV(ZZIE-$_k6$ayZ72_uf1Lj6Xlh= zAKG`xvSp6EQqddD!jP;7&Pi_tRLn+%?f^;P@a+ zh;TFeekug|7_-J&Cskk47DFl&n)^w9i+Yf`+bQGx&n2JFyBy~9%bJ7dca*%Gee3ne z9`B_&9z2`t*nZ>Mtvg$7jf(0c9S%l4x(Slkp&QreD1dk@5N?n5Cm6(F6n_9?bOTX$ z7Cc@A6LDMl2j=WfQK8V~YYm>s9;ldCX2M6b$L!PYhXr zu6P%>g-#SwqafH7G7MSp*>U7U$@VoJOOtLVej^Gc#kt#ZfsaWjfQYJAM~;~Mzbj5Z zh1FMVJ(!3$*^q)$=#Y$OA@v9?UU&fs$shz^8)&P`{ukZd0;y*a|sJ z!tV@W1TcJ|%ri0BFlg`R)*s{=w;jD;>-xdscO6^zO}jYj+Lw1> zaZY2NwvqjiapJ^q)Nsx;PTuI~Iw?rLS^T&ik{gV-uY-FZGk6^9zLjki6AK(NzfO~E z&0$+E1aut@KTORb)J^ti^s4gS|Xa1GI`&jrIYy|3t7bvyJO1maj;6u-|9CO z{eX6O?Ht;zTe%p$Iz>ASMCyD4r);&7ex8dp(ivb4!-39_fHCymYU<0+HG+X<=J4l$ z*4^+DNV#G(ak+H!ebEwzuFZwGzFZwdsld+AZFvDfyhG+?(BIu z*qJ%QZZj|T>POnOK)WFh7{bfL^(}(Wfq-1TNfLw6;#i*93K2l_`Ape9fUdg^#^b`~ z`c0JOx29{r4_-hF=+Iz>fi{8(Z=lUD@x(+ zJbgJ-WWcTvCtP>;qkbS9#6FmZq6<*cW8CR|$r086dY_7f1v(45`8%E-zI=b3e!_HO zK-ICQbp*>Bm~@>!;Am>eR%0I>i)L|rMg-##t3b;~%CekJP_Eo!hvVW-r)1vux9L)? zHrMuS9QPOQ>_D?VbI;&=q8YW2tB>2crW6J`#M{hzq4@sKw|eh=(sN+<-IDztU*}7=uw9hG%ukcI-ip`aCAl%9wQgA#yWzu~fJmB<0|jvtKNyQ$w<;yJ z#Wj%bQv@vgPx@>q<-Ig_FEu2(o5Y(RZU?x_0T>1sClRId+wVQOe|;0|#;6xxd&`lb z1|n7jBt;C%nVYR?I=sCdDamB3B(Gr$#&R_O4b#vMPrJQ{pS0k3#)DbICvyCG`0>yk zC(bWoD`erQX*Tw!baiInCMQ=`lLLQZZTJG)anVhe4O@zmZeW1r(^Pw)Au~x11Pe9Q z;&G^-H4F9F2ePaETf>)Qe})e^O@fjNSuXLRp8QK211;3bxL5msJL8;>#lhJjnQw=< zpI*{@^8Ks%3w*6VN!+??(SX$QMmn1T&{&I>QDRtxp4bB5jb;-QtLHPciGh%XLBokm z017Wp1%oPe!4Sl4-mvfX-l4<-sr-eP!SL63YGdZMezRrE7$U`1qK}+jX@-%v-!YNy zg2GfEIs?LP#E2ZkytAe)c=gTq2gm^6)mPd5Q4`C>b}%>pSX=>)_>(s*PqKOAh<0IuXtL z`t27gy%PSn@b$Xk{0V#+n#bH!4W7Qo_2mMcVyi3f1YF;ej7Mq#8hhUshQ_BWT29#G z+x_6|#dgjs-Ouc~bD`wbj_$9H-21uR;Wu$uxMcUmxTI-8f+U)Cu#pWP!@DyFto8h-^KSa|r z2eAjOdXKTUoqb!I;QQzDZ3rSOsKDR(lrgj#GHlptbG&nH%owHbY#>AZIDGi3AUcDQ z2Olx_hU>8Vg8sW#9sATjJLk1&PfAYitXSG*Z*bV=z=}gon+{H%c79>3aqdEaANf(! zK@_A*Ogc{X-^zCv3E(h#bl2$~HthdbPnDxL5 z>3KaDK3Y1}Z~l`Q@6sO}N`Gj4@Z~o$BVX!#Vs7u{iSbWHtnXVMPzq{D@hfe0m}68T zLcc|qL+5%UA|Ce^S8pXifTT1wG4kIvd}ePyd}Ae*e7cPZz(F04U7X99uo{++2WWpt`(8}h@zfQ=w1J0pxrzHiDx8ro&UhnLRs zr5v&v?h-xhpW|1ES!wWHGxa-x)h4$8Y2ozw2W)F|gHToP%l%V8OxL%-%r9jCH?jMP zv{5FIzq{bG7O%|<9ebvO-_mzY_VWkkJSE%%UnU}VLTe=wK#~8=d2}r`?yaB!YaI78 zn^P6g>eZ_^!}Ybk)R%T!Cxcuf6rmRXp*(6#Tv(gY-D8{_TK~2G?)LBMf*Xt<{IsRw z{tIcIM&4%CQ{ViIWM>rp(s+h6;7vO)S=HhZL)AA30HT;sR@{9563IT+dg@xJE^L6k=|M}e_(G{9pTrK^U(R1K<)eSM2GIN;_D zHa>;zF#{*lp9UmyV1zXbb{b9SlDlP(()K=h=<9NE!~C_q=Or$B{N4v0a)<4;e(QD* z-JC~99E~B73*P!zhaEK-kW*DT@?P!res>sN<34hn$d>Epp5^Ze-M5h)gjeOQPq6Mz z;Ua$n`KQRZff47KEqH7TDJwMrEAf>|CiJ-K3nLkigpSyoGPAnd<@L8)oQm5zfA@+r z#=O7m^gC&2Gr_QO+wN~Hf;vRKG3VM`Q_G`jIm35ra$DzHgm!6Ld2$Id^Y#`Nc1K3K zWo?LzESl3^ml_!GL-ffkMA3R+Srk~JZ1A?rz@tGnp{u>Rl|G$Ct|K$dj=^6ezz0jI-jOy1yVD$=9 zvxE+3J%MEU=ilgXsu-Z$E&9z4CvKI&=0UU@zkTnRS$!_5`KbTm=&btdXz*-1&h+EY zR}TKwpUqr! zU498VIeV7vDnQ+|K?Iv)Fjw|78hLb;&d z>7H9S6~hGP^rnolV!m1)W=RE8^7%e3FhLaY9vIjlJ8INNGz<3^WK{N9gXV;k9tVq~ zlVUFK?=xWyvZyHZ>=vUoe!S($-EZDrWY67GHFcjmThR@E((%eGxbRjbOX_%j9l#ZaPMaGc2_BH z+zi`yVCou#ewy^=gs5+!-x(NftjSJ<0jN6r$4p0PsdLRDOJ$-gY7{o&$MY|$Uk4() z4_Bw^%%~2xo}sL!;4G%m)1 zxn$~VnaV(89{l7n0zna{u(wXkNHoQ7ja#e}dyJc>p577-4mO(8HvMMiFRD^#eos?h z1#K$oHl1YDrfpmGHdVkQhnB4efZXax@k46DC>CksgEZXL%#)c3wd5+8Mx9>*8Y}#w zYOd_!D3;;OV?Ti)1yNfc&i`!U!!o(3uw0IE2973pxz9qANE?Px6=_Hr`tj4@kFXYr z0^#LU@1Aji0mv=%Q(O;9C6E4ST&I3IWJ@24o)$st1`1LgnqxJy;jt5)ibwbEPFFSVX;YD1*I18}V>sPe+xPepYFz39F@?G=zFwiF-raY_FscJmrK>B3# zu{+ezq3oA6l%!x3#Om-FvKTyw;f%VEE z#`IBK6WW5UEW>q-xkk+RE>w3B6yU`Tp>q}{;}nrR zq8l1Fp4*;wi>s^!Fmw`uNV7L~Had8GbcXc|fNjC&;NT~&+-eO0UNk;1J*s!!JN)K^ z{l?XCwv(4pSI(iOFuk(i{@_n)_Dz}R#+QHWyPD(S)GtD=tgz?)>h9fd&f%!TX#I`TlY0vTr*~|vXC{fk~u$hjO ziERvcNvMCODCd>jb8cG5=^5XRlTw9 zE>!!(xS3Jz8x%ZzYKW>YljSJwfggM)^mgXTs8L;DDd5c4O!d!P(ZL|8;O{(i_ zU10T={Fsmjhojy&XBBYcd-n2oaS6yia`v^Td9)P^Rt5%rgA+uwn(9bM=Jc+DN0B`Q zQ0bTVQ&1DOuy+4DtGzA8tOf^glG(&-qA7`qC!AZckawXT7JgEROlzR~aSUMScV2$j51EcjY>T+>P0z@sMRXV zT2h_@0B%sNv~`&{7>(V)8P4rt9rXIwNH%wT*j0VYoOg4mKJ)i0JK=Pe!~ z$#Sh;L9Ye26JBsL-P9Ot$+g@e$Jo{HEF>q>9MRE9Z6fY8+F_C?A=&j<^OP9UEw4&u zP{~wSzP`Og_H&piF6lLEM-jERaWgHZKCiq+Go93{q8uvLV3*q|4Ejad=D1!n!>Yyh zy#Bf|J|gy~pMGl9W)d^8jwzaPs*#_r^PF%gUdGA^)*7@DA+qSn!bK%2A*>aM}4RM4KYCJ z3&`on1VxW8eM$-5#H4bIzjA zt)M54?f>P%Fxd%bKU>?h(3f5{E$l098Dl2*uXdj~rrAH^KAm;1-HhLj9Q*KJ(ysJ* z#g>sovX9gDN&g)GkN0M5T)8k=eNDs~dkdzl?pV02(%psz!_e7C-lvrBmPch4CS)B9 z*Y~!Jb%9r}}>|Y#B9CAPRsdycQcpB{|Z+PE<@t1knZ4&nM z&ZRWezB89+1a$Vf^_f=fF5Nk|uhT_FU!^?vsvuYrxYu9x$dk9}YIOAierj8yKRU$+ z7k@WI+YpF!gH4w-_7@z9e!!yxDAC#L>~d62XK4C}#$f___t!;E&AyTziB#R{>o~Wx ziAL*7>osU$9?d>)eDD(I5zK7sQX{swPImKczY3O~Rx7OFjV)K7J%T#G?P1toRe8@g zPyX@`v3;czB8#4~%e>B^sOmovnXj{crJj(*tDFvM9UsL#bsE3No@{^oR06`n&W8C= zaytA@4QUzyBQgdJ92gCf--`*oPEk=ud3n#v_UvlFP0%fmU=D{!a>fLhosEtfq^#uiYEjtV`N*RG8h?iU*;?v}_{*yFF^g21{I-2T5;CZJ{ z(Fi%PTDWjfo7&D&+A%?6YIDjs2%*5#AW@nRNSvm#30ViUijzJ&^)4}k75R>V{gllo z#aTTT&5wFOKFy%Z)xP~&Tg~`1msYR5hlzkX!P2;ycXCtmMGzz1A;PkcH7AKkW9F?4 z*}1^Ux-g@sR=C=T5@D)cjHuMBN-9BUe}dXZAf$93xoXmDkmfAMS!|PEM!#oaeA(dE zFIavnXU>Te5l2LXXpTjV6P9b@*jTm6rPGoEky-HsDN8hnLx0$2>sN6r1zYIw+KV47xDWT`1l ziY6{7+U^7DudzFJr87Hh;MzcBnfI(GE-LrX@C-FrE&<<{@%%|UIQ=x z8DCR65Ul;$82J2CvSMVmZge<9yR?tAK6S37bA}h9!BdR)b)&9i^XXFrRb|!j&G#e1 zdP#Oj;ux)BNY@_OJeK0q`>ab%aH;v<>Ob_DyzE%t)x6wzz-){>7I~ik!geS+&Zo?2`LwYxWo1 zsQz(pRp^elYvP;>4Rz!FlQ;hMeqzz|-51PWsTwCS6L6@QVOeI8%ngLz3&WG%Up($A zZhfOjC9^EbO`@>c%YCQwPYqkoOh#Mu86d^a>}zwWuKmn@7uKGJXZC~|g1+XL57@r+ zlIxxV33zz^bQj86wxn-0@tbGA`pi`U4!K{R``}mX$#1Y-oV1cdm-x527J4K@jUqmd ztjup*-><6qr2mKbu0I15#H*-BQxSG8`X)T8#Hj*{Gb2fKnqW( zIh*Q=Qk^_1@7~bq2?p{>IJLu7uWj8IRg|?t6rl1^`V@YtFrca^Ac6LrM`qfUzrF0> z?7ZvZHuly6CpS?#QG>cKH7(Kx_Uq^U{!QI>LZ3#va{)m|)-s zc5!o_+}d6A{p1zU1w*AN7w5$yPDc!;X;^nup<_7vFvRZ;SuqT}({avzU}DVuMSSAj z;ky&6FILX@q2}wwjFCmI-&?7R^pH3m^G^yp6$=P zz%dfd_r&gY22EkzFV5|ZChk~s&#;v(XYToA%_C6xJ!Z7rq9;llk=h+NI>z@aqxTPvl3GTD0NG+; z7Gb_=|7N-cw-_DLEpVvm8Rxu-E_tkRGryS8s=DMcZE2T1685Be-%hJ~ux(qbv|GC_ zSS$=c<{tr1kz5cw&cbZDzN~+uP0hrN>*S6=Y=Z;2-D5>A&MF3Ll(}5og_-->7;yMD z;`z5T>nv2D`~y1r#IX?a(=E3hC+;Ra8+B6I zSQEMGRJ%d!8$zJCL%{{3&*=1GtIr2WWqLf^)>dbmGQ2f9v9Q^Te?l}=?so94IcG-M zur?C2oySGcO`b|IyrS1HfA7nn-?>R&zUnPaHS2j`ipI}x2YaT$NVAMbg026iHm8{b>Kx+d&wKYVuXg&C{N zK^zygVp31^xDb1PEkv#XvyLq2Uc20Ird-VpSVuX}j{^j@F(5tPm-UEuJFr`)5-wd~ z@35kVrp|d2Anzj$Gd!w0LpVd1zt*xxM?)58iaE{CL=Ra46&pz{b&lBxzBC%6R~WxF zC@wh7@2|VNuqN^ab{~YW)jP}3j(ztqG2BDS*U2a@=g@XHQhjeBMl{Xc#va2W(+YZE z{IvaaTs@&`g5ouyah)8So{`~$bji8J0x(9&lf3Hw$kMm@E~L)0;amemJty5aE$@-u z`kPh>>35VQ^Bff&fQL&~jIyr#TJ7;tnaP2Wr}}~|&tZ&`$W5O@)uS_~B$B%5dwO_K zVH!qDYnYM7yyZkhPVa)%qf4@ecJ{b1WA|`&O9>245r=4u7&B(f%soGUeUmw!phB&j zcI$i{GMOr^xbmXyQN>aeM(ubc;}tb1rru%m4#m~Lx!98{Y%maY-^5dYwo7kpivI^% zL_qyDCo2;_Q`j!;0N-wMW~0h1K-e{uX0^-wxJ@g1Ta25Lgf82t)C5O+M#~1F?$Nr=*{`OQ(f!^)sNwASW=&38*Cl&Z~eoxHyG)y{p0F`wkh)3 zAKOIKr(VZU%9*BSKWuJQKi}vW3d1!8f?(j0_RZ_R*oO13nDy?4Os7-tLC4zHU+uGq z;JL5yU;o3X6C3NR0k0Ks+D*8GoAsCVEL0efw5I>U`Phz3^j&70U6bVWjqGQr5;KRy zAO25+-NBl*W%{bWg)M&LAL^ii{wdZ5hQ+l$h3IEnhf}6K6D;(zXP@+j^B69){!80o z?VrCP*;6nnSkr6vr~j+R7d7RS2{`N10=o}pE9esHk<)-AgwCGYO@FTM)js=;9YaC? zQy7ZZ<9i0VWlNwSG}q^U{Oqzjn%oL>Ne#9aUSrGh`F1b7TsES7;-=ooz6UY~9^s#^ z^trYzZQE#HaXf){zC!le?D>`T{9|oy?LLG=>hSBw3T^JflSuge(-G$X-Lk@5P0Ol& z(*$A>K0H*Lu?BwV>pZuSqI$^YlIfMD#M1g({+nRc^x|jl`?FuJfs$(30Kc^j zT!P1oPiMjdEow28u4(HD0!CN51@(wcKL+1(>E;Gnkc~z-wD>RM;4|;^?6&z&0TRmL z*8!3*^EV`_2U5!8AhQ46<9j|H&~u*f>v%wETC*7s%uB!EW1DXC z<&malzi+VN{P^CJiZ;Hdo73Pxi?~70?%*TOpx!zRGY0iRCZ`%;-qQoZB(rVkbR&Sj z2;g6K-ivlje~#suBsDN)awNohd3besc*pU3?pog22UyJ_K*!?sBWv4-FmKB8P79?M zEX$!cI>iKsml;RZ!r}H*46`}Ycl}bUz3mx$Ig04&dv;k7Fe?+CSaniW!@E#r>nF@T z*9KW}fR2?xq}CHc#bCvO(Ko3d%IOt{_~mto3^U>y)q}a^PalHfG=s@R^bk*>O%Dq`_LR_~f=Nr*Hp2$Uq<3+{W8|{TILdBQ_~# ztPKY+l+qRqDT^bH24)Ye$&;>={n6(qLu?w&F$%epNFC<1Y~9@RQ_oEaogtJbTx2=E zIC$L5V_Zqt{)gvd9H!Em9jg}!Dho5o?Z)ELJUWT(44Gii=}c-i&E1DVad_4JNIy6^ zpR3Dz#%C=Mlx6nE7ySN^X zSLj8ZHR;d;l(+@dJ~8)WxAuQq&v!~xExHK2p)rqk24r zM@V0x=2(4IHOf6dWA`Paxxgy@(6LjelO+AHCk`I#HSlEh-sZ;5Jm-uG2AK}qT~h5H z+oC2~23quDCK|ueL|vlImB8PZFyJ?Z$%f|Lr#a$_#9&2QufPq1UafASj8Sy~Fl_C9 z^t<|~MV&dnI4;Co=QRi0q^iCg6TPXLvu*Y-d$Y^CaGwFHe)?A2J=k=z#<)Sf>!IfQ zs`9yB6maPkgK(k8MEH=(nybs6f$XC`q)%E7bFtK1{;I(?RRs^|B*dSYPpvqEj1vsz zw-h|q>ej3=*&z95LWa@N>chBe<)Wdvgm7r_cwf_sX&+n{DgFo5jz#>89f#f+9%ji7P9*8g z+ZZ$vK#9JjICsLl3F>~*3$aSNOckF9Uul;MFy}wMJZs*?*)b0{>Z>HxV!-W#Y#1#r<&hT3)QDKNe!{#<-C6A{+*r@n?#ia| zj!!OJJAL=1x#yU4FJV;_t{nW9!OzccCi|Y9=4m-GUHGGbZD0d}PrvM5GlMuJW(r!(;_NN9Bnl()6 z_h?f^SxQW%QkTlGNPF_dn+C*{cVwZL;Q z;rZnL?`D05&VHTs;jkT_&-(T=WUfTEd*jy(BQ!qc$j<*E!^pGxHTC#>*8h)J-n9R3 zuxIuZ*b0>++~>pf_70_@K?*P}i(>yo2-5F9)8{?Jg%PU&aQ zmV-dDPk#K0a^#2SZ-`?ky>yi$|EtHhv5wEt$K|w=?ukoywosJ^wATGIWyZ5rA0^s~ zR%<9n^!T2uFkyz?_^(U8{|0dX3Rfdxs1L%XyK){xlKecber~mHl^Nah=|QjK4$iuq zq7`YjUH@(R^S>*y8Ta~ikqtMfQskLi@NBif@}b!OkJsKBPbpLj+VuJV=Eiz<$NlP& zf!#a&`jIi<`Kw2ktzv%-$Nl~qPE+ikfT8^Wz*3=i;s?$}&Z7NlC_d zo;5P4?8hkuV{-OouI+B=;o%`)*qDAN8LG`UyGhvV!MMrF_W-FEvI`X47tr%N4mVTl4L&nXf z1Ak2T7_KMHR@8v~tw$4t5_g-NIy2Pm`bcU_u$;U-;hKTaTWzR)!!vUmCvw<9=1e(zTCOS3VI zAi5O$EP8SwZwglBHfVpWKmFI=TS4Bd!{LL?(zcwUMXQ#zvav?|=^z|mkg1R?S|e`v z<=$|pu7zP7EB(GyvM_5Q;1wp&O2bPzH)1m>XAQhsL^A&}PkCXW6%xX`*acBY~VUDX8GJLmI zM4QV*KaZ+A)m7WB_{QV{aS|jA@VUu|b0#J&E180feb@^6&r>vRVrFkkLl#p#DbSh8 zkc(YEzjDB7?30+w_d@fRSjHc9a+wfho>95Kn1Qy&fM0XBo0F0{qFBrTI9bb*5BO^^ z-r)%JbD(XkPtUgc{J;xMeGp@XnSlY;6#LVdOy=!$BtcIkJ0(8`!MDLbMtJ+!r}*&R~?q6C7zWcfn$X zA+)=fvoT-bfqx7EPPo%k8IHA0SD@gMIca_O-l1V)qUM3dJEvt^fD^_Y3Zp083%k{i z8#DF3#EV|Y5ZHV5J%Sc}De_`It%$kYz5G+pO(H}&m|4WG@!rL;tKh*q_PqG{M-lhv z2NbXs(m_pGJg_ryH%y#kyrI_x1G;xHu>M_3AsHfG8ym@8vUQZUA%+7SlpX`yGE|+m>|3e zVnMny@~-VxLKWD~pdGNh$NBci#$tN4ok4Y$scMKu#(P?K-E+sULO9mWD=x`d^(;m9 z_N>R8-#Cpgu#T-IJL8jGjQ?Szf_q0sw9@CY8{@}w&xS6q+^w=U zkJM?~^9{qFwrMV~8weQ^q1qViMUE?TYS#f=>aH|leKYGeUlZlrO^BURU{ z%(taJo(8cH0z+ApS6wyF*m-X7R%9g-a>le%d+*Q}MtS|9TAQLu!kG3N z?VSlg^Zu3Yr@Yhfj@@&-bHQ9w9*=q}@9}$oq$zgkI9W&x$1ci$^JBCN#&nTIHbqm8 z;)Z3=Un%2l3m9%y$)FTPh`PP=`j*hbZv!eOkFY6Ny(F2VKqklU`DKauG5Q@ko1l;* zJx(Iz5ri-|fY~hyOlPy@v!h1R2T3h4Q^C-2?9TSD^}Rdb&_Z>24ei!BPQAQs(Sw*J zwt6xQqz}Ul0biQUzBkTHO}_Iu0@JTTYTfuRa*3s#Rhj6z{jmi}<}6zuY(|Pg(keU- z6_xS43pXycQZ%y68MEi}PjqDAlGqG~i4)fcR9t<#{Mg7v3CHj8P+j^)lGe*FKS~V& zm=#h!jVKxT(lr{ZZa){X8`I2>o#d&cAbjF*fCY!jY>L7XFBWY(`t73on<`FLSByOL z$d$-besY-FwsYy@WzD-f zZ2S3eMyuaLhCIG``dgpusS7&ItJr!vc%j;DZpo87nHEnI4^o@KCH@M0_b>rW70I^FblY(#C! zv6d4onywX4iD=}C8-#x*QC$67;jlwYEJV88+%_Nw5$ADzBzvjQL-;oEhaC zmX|Pn@AWNB15&l)fiH!K>qqd6wD{D_JLkS?cnOi_re*G!V5-r`UruVtQoD!rPPq5e zN3WgWA%_#Qb^eiBqsr9g#{d^=#33R!O2>c2=j;_L0|E52A!qbeG_BcK?K=6O#pKXNXM?VLM-P?S11IDcu{B+K5`9&t%Ic1Gb~0*{FS%@^b` z-rRLzW;vXt@KxC7KfV+_rnIc?bM0}drdC|S42_Jszi!*k-D`b4@_9`!!bxxx_QG12YR2$SJNg8@_hi(hs<)+}NLS*%Fr#5@-t za!e!?+|XO@5Aq~<)7>T7j-95No}knK7^~pNRT(A2p&dt~?WrgYuRh+m&rSO-Md8&I zp0uG;9jYUbJW74EAHq2@E2;C#quiL?@+S*b=dbZxZ_r4)IgRG=KcBZO&RDkcz>rGfBX^L-3AaF z-`=f_;nLnYET_=p6itgCRX_6F&7&>UzCzeiN|5we+G*EO{yU6InHgPj6*4jHqSHLv+LA?f1-IGv5ShWmN2i-n znEw3T&WD}uc+biWsIm{Xcg&r=)^mY#v9O|kz*!5k*Ib=cFY>^wv30k&R6S=!o);Rg z9QZs|TlEm4yv5;gU>cgReH%NvI0>yufTYhA;cpo)*@hGm+e zeQBx(k+~>wi*(EAyLYx<+U|j7ADku23tmD~FB;fuS3(rFVZpbXKR zr>TyX*yy4}jerkqNo#=j>8mEMuxYDMp2cGiqc5RPyS(Vhtz{VGF!zu-YOtBp>}m$2 zd}xHYLnj|+`L9upMxb{$<>^&4EiC!TTty-X&Q2QUqP^yP!%WJZipRNWBe<8|1Oepo zHoBfw{<9q?lnne}tB&Uq@?o@XHoJ7XjW98>gE(%tOja8 zn@#gZV!q7z3qwe+7Avy#U`lqURdzbotWWYn-n?mAq%G)smHFUSvp=??$Wvu$b8F{m zqq$T%606Z$+WT%brsm3A5rjq4LO30G;s@VkJQHsVoVi7bqOA&a94U+ZQBYOS()lJZgx`L?F z0wR#&nba}dN>0OiANQDWhNaAddIa9%pZ} z{_Lj>(~-3`@AB!#IO^_mxU-!wUNkG<$+$(t^(~0rrUKyOSua9pD)x*fT@f|*%C4Ec z-ebJX4ylysbQ$(&{LY+&%X2(l&L~hwEiT#NC zZa9>+8N(jky7O@Q-d~njDkoRuRad%6uR;klL%{Uh#S2j1M1G z$hXXRySnU%jQLz9%yH5MJFnf1M2wzJ>vJ9<6H-ggr&nBFG=UN-e&o+gC*vw`nG!{b19zx?lx{WogX|(tL{hcAF+aPwmK-tgTQ=}R%S3*shvR~!jxx= zV-rh&^%2Y#NN6D*%5HEoD*$@Pgt=pM#E2q^wzZEI1_ILR)2i;JjuJo#%2SI(f6C^% z=DhT2-V~1lw_R4Q=^=gE%G|e&P4J!KH~ag4(U_`sSa|<_5>qDi-{(k_Ts^$UIdfVC z^O6DjA*AkMR9v2`hW9u|FVF<5 zslM{gmpB;}o68S%UbK=xce~}N1M)T#)U|Y5c<>?*DjF~aDjx0I#Pm&}Pqz(!A*Kac z?2F{dqCD9880H(be8FY`YMRu6;J)owI8|4fYu&rdj7)XHI#2>rqS7K@vT2aoE4=;;0{cFU_dO!Q$)pW@Q zBoTJ2oJ^{i4FjGh(K&c0BY5Coy-%Yvbgtl^9hX0&jq)FNuI97L2ANd7L|4g={a`VS z=5!lQ2qu%SrPXZMPP!YrPf-3CQv3Azq?V^&40SeM;!w5NAzFhDOUoAqsF(hRJQMl1 z*LArOifHv68T%+95T4FRb#sZ_g>XuCnpAdn4yKJE)>NSHu$DuiM^K@^(k>&_bm zHmd#JKPbqG(@CqmHA}0fbN8yHZWZsQJ-KwpJH10BG@I2iQD2p<#j^%)s?|*dcE133 z@JM~~jE-&#uQy988>nR87vz-vz2@8}9jet_ez+gJ#Zh#Z8Wn*ctQ0A`o9o-S`qf>8 zHuf;2DvL`eLexrhV}5e{f2+UHE>%4uout;LYCF+22tWPTlww{L45L*b_j>Odm3itZ z@f#%2rnEWg6gIAjw}=Q*?Zjj9RROCop)gFcMGOrb^gNsvU6#&(Le3M~`5aD%CY}X| zk_?{c3UZQcob@s>I*EbB)!H&FJ;vyV$~;tkOEEw~s9`>tHexM<{bsS)C2i<5XFu)0 zI!Ssi9kgd3En&T<*aYcR3t#|G{&{e#l`Nq)2B|Qi(DFf(!yqn7Y^zIcV=7Xf5ph^^ z2ba8l2H?1k0;(Samm>3>_XsksB8&B*Q#w}{M_bhhhR+ z>=z?>NLMZlty$ge&!Dn)3F<|9%Z%U1Lc6kFk*10(khd}_EB0zL1!P-^acFmliu4D zh?)$meYTF^`VvOMTrv_(!jO!9ncE=|4MteUZD;0x)5?3uTO8@sYVO%jRGA)nApVGs zhf3&>y`GTj8IV)qJm?Mr_!E(*OARdKBn?$8yUT{k#pUrj8bN8ti_zBWf$Ykv(btdO zR3pSYu=du5FB_*LZb;3Fh@54V{)mdgQ^F-q^lBqof*Y;wMHsRolJiHwdy9zNbJV7% zUhmC)o2lao*lZ@nvN8W}FIydjV&7UmoG%=>wN|lcAEmYu+29xfAT+P?_Plc}V3!Mt z(wmqcWAc9I@q5e;wl%gJ#Y0zP z56*igvY)cZ?M&EoVMcEl)x|D{I~aT;P;tAQDUG%L&gaCBfghSNp&@CAh&R|p)15Rq zY$U;S?2e7?$ZpDusfY!Hm>XF7iINoUo_@}Iu@_yg83rTEe9uPz2N5W&EcM7Z%Qg&a z!%tza461)TCFf!6-({Kv5&kXlAKy~n1#L2ox}j-+Rp-tp(_pE!p(YkyB#b)E&mob7 zn)}hsF$rg8z~(LXS~w<$by#JZ31PzoWj-pn$k(iy2^g@WF8Ws%yH#)9<#~%$_l%;& zlg%E}tzOl#CudO08LQ2;?X8b6OLxxPKpu0pxS)uILZz)qL*-C2AaDxx=PGkG7J3<` z(yK55oWSfz^0ZsAmy_nDrG7W&d)hu31Ig^#Wv=izqkGrUd@um*I=hluXDAi2HROz) zmznQR9~g}ELHcoYRaCc!tf=nd-3g;BbyI(NOkfWZzYD__-7SFlZv)q#h?YhL3X>V< zEcUn4GhJ9KkZy8AtCHKcPru-1a|b!!QDqjb+nD<)itfq`+O5*3DQI<7mBjP_{GLJO znq8^baPnd&5$F-ciWP#)7y0RRnsZ8M!kTcpX%=%2?NwtCw$1UPNoJ4l<_X-TXh-bqA?mNc#>~yjVYnbDqH~9 zW|1bb=F>asZ`l!iFSC!d4sZ^0N?BLE)2PK69la^dSCD5++nK|yOo_8clilXFwLv*49!7T%&st+uK(??QQ zPnv^S;K+K}N7P)Q+C$+P>FGLOkV>J_@{Y8M-iMmH#1;x^9k{`fmYbeQ?6=g+F;|5O zuX!3g8Ai7xBTNP}%3fj=<_uDBc3uS{Xj^`}N!?bOmJ5DbV*9qw@h(~}mJ@`%Q}^ME zveq1@zyT=iKdQ^sjOdK7(Rf>ouF06GT~s|YGt?Qy=rQjiokG>(F9LP`-D^aA8$Q>H zteb_?CiE@}q6TC5r3TVniK)Y@4F7)IxPRFdJrZR`+M;W*OlfMSX}3ucwZhWHd+F(y zl2(eS@n?+aeSNdUp92S*z~9t5@V8~eIUdf^Dh%i@QJ;)7fRjToTI@51_dI_|lOUc27jG&}5TfB6I?po{=@^3m1 zMguu@>Y~_l;!{-Rt0k?ndNZ}N#;$0HK2CeP6AcU?fXe_o-XYMV_P#cn^UsFOHWQt} z?P}kn>rK9xZ2EEsdM>Za=g1`xyzsgPPFn&^4bmnz7+>trTlZo>&~thns@i(J%$1f` zX&Yq1*y*%MbHmymGuBE%2fx#ymkzSAx2TmJ)jgX9^a{Kw*%j>#Mu(bP^gO^+!JpN9N}+56V(SC8k5%f%RH znn-_j2sDbQ1D73J;LTuS<7m>iR)^|?4s6swhuWzUraE}52JJ6GHwLNKtG1^)dA|a| z@OmP}8b<0Xx~{ERi+7j*giKely=F5xC(>dh%-sCyxsjt<@mHNB)in`ra3DTX_5cpQWaKA+$XkpUBN3hrA`2sGhHk#%P#3h zKe0BMf#hh7WmyboVczRITX`4Ak^26 z@C=Y=M!4E_lt2N*oIPjC*b1i^LR7y-L&7h-WGazQ)=W9^0(3}pMg$Pgee#W20=Hud zJ;I?z@w2KPG)PG6z6ci7s+Ss>+qY_HHGgS9ySo!M)b7oh%#|b~7t*%zWcqOp$CMs& zrK94Fc}^i!We2Nwc&WWLtyIf;9oga-=pU)ym0o~Vp9+(k8{~TcoB|@nT=|NZHOQ!a zYW|Z|MyqhuEiiFLfk6(nxLm*3AkVqxshR%6DgW7#82HKm6FD7X;k)ZJ*ynvcaNW`s zx{LY~+xjV(LTZ&RDU+l&Sr3>4l{~w=>QP!aSg0qX3!U4y<`oA@>Vn|o6SEerB5d_j z&+kx@1X^mZ3A(3nGc}CBdj2*A$FhcP6}9TNhkX?NZFic`c96!F@s}uR)d0!bJu6R0 z%)~-N0#cc5J+N6+zlg4n{ikD zs%3ao`U8tpw*+^CG-AG-0)RzG{GQ8nQqaC{{QKYeoB=PX;ruLISD;o`b;%uNbdfm3 z=a_D@$k&<_?;feWW*7Iome3S%H0=r|EIFL{TAYo?ve)P&N)h(5O*yLgf-{cs9N0OU3KUa-9VVuo-v8uiSe z+u~`^+S-2OeNJ@ugX7SOR39d&P`%%C)G~rxP5+|7=t(xUk@-g)>|68vi@lGGgp60b z%>G^(by7jEnsM;e(HMrauGlh zG+5}Ha_+@}gH7S8bsgN$#0&i@Q912&Iy1|@lx9aS)x0KT4li5|fLO9Z)%@zCoEK$1 z=|G@{9BMyqPp4gH-xWD5Wj_Rph3Yd&Xh1UUC~Gr`o!|duM6cH1^e;}0(pIpjRhy=c zQb$hx+HzR(b>u+PCg9^rP*`@+b)S;AbD$GGY{H`Z(HW1f8*$4>$QkS9K|!I@z}0uX z$ZZCNcJ8gTw0+65bDFg%vh460a55sT6-s3w)e&$#QhoCh6cc1wZhJmVea8bvX6ao)^EsAt|rJAG{SaGnO@vUH`G+|J^ZCV?JTxIR6*MPAD{q zvJiLlI40&8!by;mt#^r9}u3J$ZHzVp-|(Hcu$70kZtR)>`)cpqyc zRgY9flGOzrmQIsMVkyH`>1Nb`GG&dsoqE!LG0$7KZhPIUhp+Ez14~%!P!LnS3qh;9 zSR}yrI8*8m%>D$50~{RPqSmk=XFBDN#_$q;^wWlWn%^5Zudmz81WaTP>yM!uPQ7R& zIgG|k2)%JFR%tKAJ|)=XW&jU2QQuEneduzX)z-ww5@tQ*001%VLnZ9ISBwpRnfT`&`ebA6PHDKW#sVc+6IY91 zRMvZBJ^_{|oT;h8${vbLsxL9ypJ7?llyVzd%&C#h*8;WYDv0d%&yN4TSwFVBqkcq} zNsXGZUDW8Qqc5+2GAgrq-}q~9a(VtQ?q>*P<9q&|NvK{Tih`;8;Jjigj!Sr=b|1u7 z>3Oeh5qwWm&u#CujdcI+d&NBf>$#&Y*R1Dds9TYJFuapT^u715R@~Z{%9`n>y627p zHD+x1Be{ei%4&|XqX*70@{AE%pb|{;UgUJQ>keljQ-yQ3a4)HN1Yb&})I?BmLI_iV zIApx{v1toTHV-NFYXv8{a_ck=bEy$hjXXMms-;LxO)ZY}llxHTbw$l2fueLCQpJmX zF>w$O<(mVlt1OeAW6V{#LnnJ^(iav~oS;&nDjZdPW7kWn?ccR7CJvz!0J?|aGt`)~?F!@ISFeV;4J2i4$Fw|OGg?^}-oj)e6N99hQY$uT)Vs8fW zv_~Xpq^yHloSoFSX5g@v6;HjVl&o=2`gXT0;<{40XmOvLo_HdG;)3SR!MCg4HdK9^x$i@VM0FI-_!g|Y~wiC#lDDc_(+I=04PSbTKj1e-9*8U#LnsRnO(JZZEPf!S*3Zd4>g~#FgEKnm z1VT%NKn(x@au)`LCjpGw7=Gm&(==WV*cBxqX~QUpy+K+E^#-E`7v%oI&|3*|xk9Ra zoj*Uiq$pr2`8^{gHD%onJ~uF{c5J2592A<47ZSxrn^PGwG@6!j8Pn9J@pGW&+Ze+rj@;=&HMT&-fm;BDTLwL=uc*@h>`I;fq9tPRVbn>alC}!ODM5Elt2_2nq zhw)eu;I|NEP)vb>#(|z+))lQ9+1?JYIOl)+F+eEvC`DPgmMue1}66GE`tF{?dZ=2Dt zDvlj`pp7aaxzrGGb3ig}3^Qqb3Yuq~Rq~TEN$qysh8o8i|6Hw7(`e72V`plu83xSh z{Xd?Dbl$s&4=j+JQ!ES`x(JF{4PKOP3#g3w)FpPPRkAru$sr5V+-Is+?Sx)!qhtFZ ziL@2DSoodkKOCcClJ+~29+DXSEVfb5*hm7bCPdU#l4?xzb5i9KJOvt02r3Y4J!^(b zQ{$c)`AY}1Wh`y{f_)?L${M-<_T-bHr$+Jo${IhuIuKvl%YLP9Sh7?;ooM`|xk>AU z>L3#XuSOYnXFM8SX2V)PknqY|eR~;%n*X*cHf7u6qUp7hdU?GxP0k7&Wg`0mo7S$) z)Y7JQzkOQmCZ6_S)7zDwMgJ~`La3CuDXNbkJ45mYa}%phm&N=XiSIOg;W>%jE z`7e2D2{IsQuiUE^YM9xBurfr7Rvd(;u&ZLbRUzf>syePKax|SJn{BF`CLOBhUQ9$2 z{HQmx>z$oa?TmQy6i~`$s5uQ}+83x=en1C|N9*{{vvmj?YlG7OCqRW~vJWmxp~6TI zqVXoy=D>~jf5RuD(F2B;@?o{wpXf#C#YY>k8p1g{}o_?SO?=zzYOQ5AHSo0>*scYJX zOykW+S2MG}@VfSYMKY&D)K!_*t+7A$xw-u#nw;NkoUE&f8B^;n^PGRi(_a>Tq$il> zj?;ze*hH{)K3(l$M*8yI)#GG%fg0*YlQ7l7u1$Z7EWM5JI#bP4veah2oInHKLx;); z@M=EwqUQBdd-HdzOu1m1Xx-F44LjD(b1pXNe*X36!4k3xyjU}3x;iApWvwn}Gvz}v zr2orysz|p_ul*v8=1`??AsL_n7%ZPGk4$O7^tTjnQFfRN`L4t~Z49aX1xMd;H{C@I z>Zl>rJwn&xYE#GMDfx6miM<$*7V7fqRQ|C+>RWYJiEs2&nEuB>KC1C#4sd#S&$um) z{L+CNia~0T)Qoioe)!<#xvpxyfH_0@6d`FGE%r)td^IGjtC_@;Xk#_A`jjLh-e;-= zRgx^HBsSeWg9hFuP}M=wrDH6U7jYmr%iyr&UJ`IHB2 z8p}uY9nxnOF*t)5u(gYN2-|ztP6O9k+-$HH&BBmfSrDFwQ_&bp`R({CD*uKi1GrPp zz3#x^j5x8j$AcFY{P$_N3=N`ob@eViq6Y2Hs67Shud*!C2$ZxRXavR$kLDi(vps4} zB5Jqw;@-GdSaX8T_=OL$GuD}w3|*gjpqg(SCtK?!P3s~~6xC%{R^@`sURRf?cu-e( zl{rd$XC+U`;-%ct$FCaEJNn8_T~1xIXR*eQq${srM)0_jy9vkCPGf60M#gGHhgAF? zxBcq1Ua*sD@1qfUN7X)*zVsU=-$knaEId(7y*3lw;<}^`McMPas!S-Rb z!QkgbwEc@-v@QEUqgo#9eO0@KC&R7W~&vSCrz!3jt^*6d9pLyw)#KF9vhGD^tdp){<}@NUtM>v!TsI`=T2@A9JDEC9!d!=6xtwYotK)4n`JZ0BkRO0g^%GfZARtj?m%YnKXPkoW}k?IkKcM-x5^ zfNp+_`Gc;0CHd0L3Z(FhMUEzJ0y1>6iJJ&y;4^B}vy_7bfA@+w!AHZdXyLLPN+p(x zh&OR?2X>zX3$5~>x5TyX;=z{_YQ&Q*Ud4c}7Qe0j`Was44KqER4e52LhW|iZ_LPfK zyAUq)UG1F+>4S#wJxh>J+e(nY={aupAM%R8g1S5VK;zRY3BlZ7F7e`&z)w^hN*o~y z+FEj7ic+b=Umm8m^7d|ZG_GVn&f{hT;Z5s2US3TltceJQR^+oN+gCj&$(sLa&@~4; z*OI8nljPWKmXbEc~2F0(nzTB)ilo*_0$;ZRpO}g)XPL~6};0%Xw$7e|BM4z z-3=#MyQ6o}-0wtMePPhc>WgYf-k?QgSJ3INrsfVH- zp+v2wK?3x-dIokrJUq!#?cA8C+}f=ONN`e41l&&#jjgk;G+t-tBOa<1i6Q1;3HLyM z4(uKT5b8p}Snpaw}3go2}hw=kGfr2eWUI0n`e1ui+HxM>n8SuN+%Sd zy><1YfNGb|dpqYp=WyV8i8M`%Y^0_%%?;F8rG)V!!D|Y4m#Md4GIgIj4LqKGLjbSV z=-|mI(yNl9A@%G(r;U-am7z&@nzW+L82dx#oXBwT6hz%}wz4SX_~%|UEv{PUY8p!= zMG<7i2^@~r<}VGGGpY|73>kzPOs5GzF3BTFL!65$n`zJLPpXr;-{u^J;Dd7Ks^z=` z^QmyezRALij=0GUTFntd7VX;O>-+VA>NFg>H<_?wXG|e3YJ%RRfQDxiM+m?kyW=)k zKmu@nW=ThB1l_sQyk7mDrarQhhL`<|4T7xd>h0a9ZDz~_{F-ly%+gzhohD6KL4ft1ml7BbeTBa*>b~ z=)Nbwla9WA4zMYcHVp@vj0?onsI&_z)Lb1_yTd^IqqS>kf67cG!iH^anttRxP;)s(43Oo|q-hGm@^822#`|S`wZiEM_jJ zC=0U=J&`TS0ziffiWdk-_intov#$`HFg%scXVE8pcdLK4T6A|#`QcLfafU@_8yz3_<#>m1bGPDBtO=$_rptDY z`DHA3DFKG6P=iAe$PpBI>B)93f*F7a)2b0!3A(2IpEK zPZOzc?3~_`TQq|EYH{f_q=SZ3W$xx&=Kc1<`=i8NN@rTGPQ764kybv#Odpy`tkrE4`9tC2r% zu%64ZZy8pS{RN12mEgTPBkY9rDv*M5PnRBaWzap|3$P%h8d^BtLYA{GS_4U zYj2)>8KmsGv*^)2)5tSBC&VJKGOY?(L+5$(HtVqn->8z1i$3pt5;g4TE~&r=_Dq>& zTGhVT(>yEDkHWYD7+4t>v2!zE;md-WheQTcS6xTJDRr`9oQBQt2zWa}F^QC@l%he# zrnX;p&MW15FdEpww(t|PRR#QNhp9<4ZxBgDz#Zg{i&OtE9ke3kyC4c14zFqzo6^>% zvU>8J%&SRZrPY5;8?nG*#)po^uZ~%*w*I>z*!|`5wJ%M6zso`Q*vZFw9DH+mo8=Q0 z4Lfu;*E}m^*y#_yobvIgF$tUBoO;T8QNS0zshO*Tuin0Rt=zwF=G9Zl{lklW_HTQV zI<2t(#G=yvSC^?tDg9f|NA!V)v;H-@)CzsNN9*JHF==kcTz-hz7Q+scA#soO>R24b zN}z;sgnd^`6H750ckb-wX7&B%TND%}9QJRGqyCTJcErLo%lqL$;DFP7{q$ny)1f+?Av^(dkCMMr^ zGQNB6xnum}-oqH@JCU;YyWjVD*0a`JbI!#e#&9U+rM0~NNu88O8k0uWGyFpN6;V0# zBFqov!eU3VTh0gyF-K3zKk4P^l`gPZ5kI{p%|mgbaQ|bXn>U0bDx-cn_<*>uN$VS3 zu_qbLOx4*(ixlkIVTanDf^BrBr|Q$;VwR`0&yn4hnSg5M2Y5NMtmc(ryY@m?B04Xq zpc&QHQ$N5TQ(yf$%G3EtFIx@G1q+0O9Pq8t+eRQ|CjEQmW5r)VJTXHnj@=xC_cJN= z@yJ2sQ=<`uj9Ac`0VGiPkaq^icHx#*Z$Y+7uD@yF88jyZn@V_dj84(5rgbHf4PSwp zOdTv6apW=Z7P7U=Y7v)8)0g63M;%PYjf@1M&W4IyYqR!|oU=R z=fg;0Ih+Y-QL6s&;UOJ^wa8R`w>cxl56p=ukBQxeWt*)dndo;WxVdFrN#CQ7VJQ@V zT=)1P%{mIGrHTaIuBrSXKEu}yi{PbB|XnDTe7S{KeFv1;-M zNHSzUxZw0lt$Op$3inwV3&BFa@l7HMA4P1gv63dE1+D^sKQo+`B^~uldcPNJq7r(X zZTWCHAbyC#6Vwl;3Dw}O^YN2!M@Rs||A@%i0IU9xg}t>c11P?-B=5czwBM#y&1^F8 zh@j_9>dN|n28A0LSt1>xah-#yX_Zcawp_RWF~if?9y95NupH5VfxN_^LLn3Pj#D0x zg#R2@WYT*u!ueL(Bv3o*JtQ7EU20Ul;pu>??~aD&Nwi@dX`%%c2{8=^Gq73^OzMHd z>A#$oR^RZ!71S!Wx!I()wPX7qAngPy+SnPR01u0Ni6^bh*u}@~@Fh?|F*7Rw&hZfI zR8{A^N$BFC40Shky>Jjq#`jN3$AODxhogBNzH2%n8DYcc)D`R~TEPgMC>~?9lHn)> z(q5>pVJsJ{1^5z_n~9qoeg*8k2$@D5Q2zccu6*+R%J#SZW|el}^3h9XG-$D}9htP0 zdZk3Sb`*o9g9k9Jn79A?BcLNGO?+P%FQWo9_jt8$m+?NoOs5Fc*3KvT=jQ5Dmwo8= zFfRY5nGKe(|0z=kNfs+_w(T@QJ8MoY^pe8M>B zs^nn!Ygf;3hmnT4I<5TFo+PA`n#Q9Z-GD@~CrvstV1{c4l&aMK=wi(%^TNhUN;x@& zM^UR!ftiHC+h#B4h95YYi%W|TGL%2-k)@FbUJu~6m;_rsO_aTXmiMn}H#J913!gpW z8A?{N18L^!)jF>lzgEPulBxh!Atk3{F#SV#KA?>mIaJaJg&7O7L+|t^B-f|FzftNt z1&39s=9$|8mG9FtOR7tZ&i%T#moa6JAXi#gZJ|oY z+XlFaaP%p&_%xSia7{|Gb{R%>e|uZ2;CVsKBm$f5>vOvmKQt^@9$o(=E2-d39xibO zuv;lt1*@1T2vT%>B6=04!lHvvRoeBg!N2+Y`&VWzIx$I%(C5=UbM&}v;RNGweys;| zN`Wos%MfxVfrEJxOFTe)-aJx+EfkvfY!51xw_JFFLho|3uH0!Wm&14HdvV zj3FvO)}i>JP3un9kjrh&F2+Ir{?e#F*HT|U9oNcMmaXHr!PsfE@Boyned*wn4T)rB za$JZLD&e#!XJ^1~%kd_WOHDMiLk(1j6A?bNRojmw$c5dlzc_%fq$ky%Uh1g6iD3&Q z9Q0i;S(?R!H(y9Jxoa+1fbg>d$9E!QQo0G=+Vx=hm!jTmyH`(J22)hSY-acl%*Wa5 zDUC-#i*my-m(_LJzitG5Dy?-J!9aesM1+{XFKd1^SVE8MM?hVW?eU0aFUtrkoyB>s zA32){!s)bR$1PZgrMd_iCl1h-(Nv(&R*|j%ENf_YP7?^)v7}}ULsrh$MHMoWsT0Zb zJRMAnkov52g~LWM$fUGkwu6 zlXMpL#Q2Dn;cG*^I2|KyK7WlGRh`5?w#iWIsG{<)hIgr7aqy69^hYDd1ap^D=ody{ zfO_X#KW%#;6s3guk#mumevuEA@r}?OC|<0#bvK*>X>&Xq0PI=tfnj4YO{CtDSvVKj z71Sv7ykoeaWvI1LFzz6MS)GcRK6z+X={Rk~hY_qym=kkW80Di#IfM@;cu9d8c;Gqp zL6o^skVn?QlOW<+3z3hoOXd#_8NHdw4_S}NFQye^OsaOMz+@5)=tRBJrznK<94xil zT|*CI!I~mHF)cg<(e`H-lGHpmBtVmi%HtqeYX}Z@ZsA4nm!^x^87QM@1%Rd3OqY+) zAj2A(e7KA1tsC@P@jN#QiVqwd+>&(RNA$m5P*{u8bz(q3fM5@UyFo+2`Ovqg-k2$_ z!z*4yAkBq@OSj@Q0bhRYt->h zQRKiW0AK8c~3i0m(TvmI%czkWNa4$2l)+5*rs3H*}&^s_ta9JSyPIhE9vvtmc#>?6@@%J3Y# z(3|VO$Zh5^OI!}g$7v+OLMxTFII6DD#Q9@g(;3!_LJC}v{ZO1oI3ZMn?N3pW=!6=J zmL1+vmsv%TJODePZQeP7C_0#RwY+sq6pRxA#7{vgP;F|pC<%E<_G)}ncWdNeS5i&ehMD91`z=iJdlt>>@(K%EJo43 z4dQ}HFN3R(5r)^sz}1+EKk!50E9t}C$ zd{r`6V6$skcxD~4?Xe_OJQP@IdLy=K#j)zSaw^gvnnGmT<~2hESv{xynfqw zih_P4o12~QD(XY*4@WKmOLeTCRiqmw%nj`qCS97})uI=Mi7N zzjOn9AdD-&>+!k2Bz#{=`p?&1I=iFZmtPkB^#@P(8vpT=i1)7{`nkMd?AXr@aEntU zKr_T5V(}a&{d+2K<9d`$p>=}@)r!R_nu%?N?agi_8EO#H=uTJ z$023?jc#j+l3NPF3lwdxYmZgn6c(IDALipl-K#@EFb6IXFg9+nm8)21M06{a~M*)4oCjhuPUVjK|VF$UZPjc@xV2|#T2Aol5T82bQB zlE-eptz5*Gl4mh3G;367BS!8Gd4xPwdI-EyXZ4>y4gCsHX#>(GBc=wV zH4a+fm`J`t77WC!{XT%6Ch$`bAlR|E0FaNK9CFTl+-IkB5?s^Wqwb+`byOPB((r9# zRuN$L;2IU3sMZ%K<8G#1TGNUAeW?;x?`RUNPAcPVL$cImbtslAv-mBmRubBeX z$zJ0*v%7zqq-AkHSP%&B@ddRQj5AW0toUT*HW0L#nR$j>Z+%hs#gc=p3mgd(>075; zejV7kYtdF*RgE#K!t-lvm6sDs1^j@rCact&QA2lJJlk9mNMz#C3+eR^Zm~ z4l%eayshZcLck@iEadQx6KFB-fK5-`9br#)x@a>~Qksb&93%;$;7Qn&9#GYl&`(%R z9+#Nlm%}L~I7s*xG|6Q@g1uZWL#D!*L7&iiKzQ$4pStr&1_A7d03Bz2hQ&S22}LV= zMr;rLC!B9WEqZ$B>}4r7Og@bhD}5^k*V||hminFe!)pOI?E7Km=tLj38AZL>Z-9{jiH z(j>G<6dk&E4*2s(nAQ37V&^Y-um3C-M!E9a?wXupA}vOU-e)9U{h6f2pPb$C zDL(MOMY8k%e5=3y;L?|e#b3)F3iZD{u443`=Z@A167%AB?a2Bh%j55T{SvqWYy&*H z3r|h^?H5sgCVVa3z`I5Z+&`Bye{gB|pNFA)kMBOM^MCz8kWQr#XZaKNsGo3deYN}f zO>d@9JZi5Frv^><`ueqT&>}@bm7?(XgBIm&DEIu=EYSbfMPW(){i4=`XE5#`ALHja zlmGGVtO`LH%|gc6PV5-o;N@ zUd@noUk%>t@ihTu1Ji?l$iK8saB?g*;a$b^tG-%uvgtUiJ*5$l6>Ud*tp57t|I5Yw z^$*UP-&Opydhx${+o)=MI=Y|N*Bc3Czdo)^^Hbu&U;fL+k);JACprAf?W3v*l9&JZ z_I({O{uUSry8S&cpbPxZf#LJSAO?p1q_hiPvjT`gaE*TEr1HC8N0k3OT0zAj_xFpU z7cy_)pKth=Y+38X=jlrS@)*%x*!MqiQEX-Y{i0y{IN%>cD7ws?4Efg(`j-Ph>+q)~ z5s}RiB#MBYa0CL5NP-_(L;YO8$JORNT~io-c_`>Cbq{sh$FFqGz-?{6pxU0 zG3wxyk?61|N;;jy&7U>;(wAr}`v}xtmFz0d6M2#+ctda^p&P3wmo;t$4bIV!h zNfsM329FPVYKqILk$CqoBu>2itzB95Hb;4#sm_vQZ&CCD_oH>diUX6BN8(FuyP{Rpy>(L#4YPif91peR`|*k^D2BC_KI zAv>1%big7z2K(zcF#R!NIygpl8>Fx2FMx z^Ff0eS)YJl)d_TqK?I6uvBabfy{J3NYxyWyY15p_qWB~4p>Yl}TUsyvxuhbp8!`6b zxO6U_rLS7TyGFX4zO;~k*80X>qSt&7UwyZ=QcQ*#+hkM@${qLWYd~*Jk=k;%{A0cG z*fl~qjPOLE{g>g`#`A7!$vLphK-f1$t}6DVL@}-iSc_P2SeG(z120QJ{&BS>(cc^O z&9TmpuChIZ(Tbzlw3QXgCawLSCq(sFSN>L){Wnrvi_P)E?y0Ljh1^x4%YY$DrvT#h zRck|+M_TZDgRML;0?KZjUlpP0w2WIR@!j(6U`zhe|=w(Yd@9 z`0u)?oS`t=CU(s33WY`iCe&w+?e(7|_;NSeJ~trxzvB~`wds$?iz4*`m{}yQgEJQK zpb@LaSGqhqG~YZ_4ShuNN5ncmB;^4!jhBri8rWleUw05a?pz;w>k&J;-2h^>Wfb|q3xMIvq`ZMDEV*W4J70~v(I5bh(B z^Pg(}X~a}V`x?PbHEvyiT{94U^mkp0wxIat%#A14Tu~{afISoGz;iF@gYQ=(&i*$U zAAx%!d@bGZzsdMtOCppl|6fVQzs@HAB}@OZ0#;Q$gt+A&Dxb4iJTlqJ{CgcoSn%&L zfiL?dQ{sRB+Z5{45469WP55V0-g&5XSeE>G(e9eG^W&8n^!cL{{ra_0;leTi{z6{? zHhgJWYT(JR{A)h`mo)SrYOBAZxj!S25Y7FwXg-@oo8Ny-aX*{%@X+4dKj~WO2@BdV zhCQ?ZZD|G}L^h2pLC_#Vax?ohI56x=qDRrsGTmFyd4foI9cCon5VmO~mJb$%lBjS1P8k!;KCr8voKHW~`@y)lrHd>3$E? zhHR>mFncsl*Ru(W^o=4H!Qx8Iabs>H5akuimq$L(MH@6NbRyv!aP64=v6V(&9Xg$- z-W#B3MB04`dNAW2?Bg@wm-9ssoDB>2v@AH+vPwb^o+Ls8mEs?g>;UBXvejjMy>{O0 z>@&Cr^h(t1y~-H5Rbg;f8?dp+@vH}zVC#XEX3!Gjh&B{v=)#kdz|$ZwCQt;e$8TD^ z%PSmBqDYWdpeNc@E=7Js>d^ju+oL&<)3pdbl6GA}w+jlOPHwz5E)jfLpX1xWV=rN6 zBsYf*8`Wr>A>#e^2hRg%u6uJe@Qm;0+gB=Ol^9Kb=w z17+0GDV$J16B=r?*dfylUiV^xd7`a=d}ud&Ox{I#m;$c&qKR= zUm1Z#jK1|zX?k5y6it}1P*(Kb*tK_iK8{-w2InY!XoBND;BI)g zwzBvBr4JuRu2%Xp^eMA&ZkB}Ek^cJ`-$LSbR9Xyh*p?&ENZSY7+f$m&Nobw?$TVX| zT5faor_U`C-Ho{CkhB%Y_oILXzF)}pgz@2t1zsgus#K|=Ppf2MsEXWEIt6J4Mat7j zM!{!iy#q4mWy@y)R+-d9(iqva>S4lA!PTV=`h>}l)iov#4qZMPiTqRZhC|m;!w^G! z9HKw*OP%ESRu~?E9tfI*4%O_)gTZsMIM`tunMi0nWdRJNpDk$}xwYYgF_R!}+Y(PQ zLD}DDX+{eY8rpF>Hg(5XB^x}8g)Y9Prl0{6Q#(R}qlHqq#wxH^*c+qkfiQa$bav?! zyuc}z4D5;{X%cMduv-;ko&&6iL`q41M=qXf+LP-e!7WQg=7dTvE9VvZyczUlMBmI5 z^7KpqdpaA^OZ4;1ttqxp(?R6mXGS|bI4XPcjom2iQm~zj-dn!Khb1(d>qNgGHa#M% zNz7#IKr|Sq_MXO8^bBck1J5Iaf21&%W>4tz_q#P%4;iKt?UEr`LK4~_gS^0Q02z^(w(1bfdUf3`f zFGTB7?AiyISauj9B6SwKX58KwSZ00wJLobQP2GC2dL+7U75nnQj9pEb8kJU<584 z?Lt{(=lTVl3z7=dsS5sS3y>d52xu38mR-{VGJhyiK_*`^XIZehQ}s)384m3vOM<*x z4mam89^B*Of~BOI!vi|eN2-7U#S(zNcVitbH}tWFcv~3S1$_SkkY6@fSerxtqxBl( zF}CJmVCKZ3N*IPC&7K2Z@eJXDv~pHgiDaFZ8bJj{#iQQEaX~zBL$; z9o)Jb1+{=7LLNr@W0ge&fm?H>Cao!L#%XCV&~+UuNj(ox$w7q2!tZxs78hf}itPC! z3($9u!-9=Y{RCsgo>*8HEuGm|Bi8|jM!u3|)Xh1;)tkQ2BoBxq(au^Ab$vRPlP7o@ zH!L@z;IMn5tvg!$4>WXzo^xEV(&c)t;zSmLQUj)NgbKKv=*o>2J77DTb{tPi6{oYZ z2kU`(GH3@sz|1*rlt??@=tm0@wm$Qeig7kPjZDgl_Y zf7|r{HP_JOtYOYR2pT-4ImRz~q8`oz8h-dAk_W%bYjJcjaqDe@Q<1|3=-I0C{s;Ob zpX${T5Syn&Xy`m3Z4%X;gLczO83Q@?2hDb0_Ls=hAY+I^0QPu}IyYRWjXV7VmxG2Z zokFLq>#ZLIC-bvJ-VaNa<59+=OY{ao(duC!crBV99a~9OQ>sj@*nGWB`br#>A?ME5l+a@z zkAuZZ-v0g=2Vi84cAfSmOZ3F3ABu#OZaru3LOrY7lt7Cw;%D^kp|AqP_sL{<0D=&@ zh`^x@N}@bX3vUB)W4tQqxEyDC3iOdCI%OQ{h1z{GnK=}9A~`RHs4EjkFMTwyBF4b( zXdy(bcs~27&tRLGUXQp@2?Z8W*FXcF!A>#symnw?nquy0DkBf=b_k5<*IdRLr1UK{ zgST2}dm}L_&yTStlN-&lQtl7%)Q(}%3q}zb5V8V5t*OBXN)06kC_cdHomw@PgaUrG zM0}x*AW8&-OeVOV;N1f_oC}Ey6BPQOiGgN2DBsKAEiGK+}$tat-iP^xhT(WTs}Bt3qcx1j!uH^pJJ$b8v@Wr{u zD;1}_!*ad|Mo;iNiEvr%pkg}U4K(vR0_eRIw=M-h*C|MEWRdk5zKl!D9~X=>jcX`v zh+&@Wra<(A%8&^fZ?KZmZ$4?xcLtF_bo+4ziMnE5WX{-i^3V{yAudZb}ByAi~bVnEeSacdEkjcIg`j~6y+Y-2-CI48d% zs`GdZL15szAQzHD-b*s{KZX$V9zU6=vy>Jx#6c<+N*}g(+OEy(!6H5+0qvhLVs_L( z1zLNcbA(S2Aa15hFrl7^P2!MSi{f$}ydO(S9dM)!FtV8qZPtw};~*Z~$o7IOn~}Cn z0`tMnlfug;;GHb?!YvnX*sy^oA8I%IsOocIp$TalxU7N;C@3pB(Q6+ez4XanQ=JIe znLP8OI1vXKr=?TIDzJemKtqC@@L-ThVyRnrE6zbq))^gga%8wLF-8?{3>Hs7F{ha?qPfeFTMl%bM@q= znTaveiJNW^dq6;Yz{8q+6Iu;%W(d?r|I83yPhBy1Kz6vvly_l2ET%iFF#a5O)D^L? zjNBgdbRr9UcBBz}Eh?$WN#d# z8zbO>6Lf_@0#_*e@#p6V6Nj_^1fd(K{8_@c?z^Ntl2L;U4J473_WQ_<6`HITxYy@Z4T02q9!&dRbIQ z1DYbepPdzY#nB<1y<370+ShjTpvBA4JcKl|{SW|hE<&oopts;zajc6i%s$ouyIF*E zQ8)HEp%i8gw|Dmz@;jO-qW4--$~Fxq>?E@YEo^%qL-z{d8meAv0TU`fPl?8=Bz;8= z@!@y|4v%$0y-#I1TSoxQ(qx~RF?HdnNYHtcX}f@uU^0P3LX9g6f*l&|v1=GrH^T0$o(dorJLci>J_%l(gL;f7MSf^kL3IPzBB z)Ez;=27Ml=v=w_&%7;Lf49b0KsW7A$8g6v!PDyiI9Dfg)T%u(LpFam;5k??4oh8du zblvLP+X~y|PEsno4!td+h8$8S3?Jrtp**X^94jeC5L?1O0=e@j^(c6Ztw4>Z?U1aiFlKCP{@(%h2}hrSb1_B zrmVv_XThz5{Cijnw8cQa1Cl4Z_O6?5KI_Gst)n;Xr~7sZtk6FHbDK`+r14y7a$#!?Z&%`qj?VD-QVB% zm=+%$3t4b|FcJepk8t6G;D7d>18Hrn5AY$EB0bcT34P;LTKi}P>j2-{YC+NS8edPq z8;lL;8npOQ1%|!x0IojEE0=$M8F$U!QM(b}FN_!IAU?17HEa)B-|hDTxdr1anyak>x_yCdq)}`ft65T`z;eYlY{(%Pb58aeaaIKL7)#NLRku2x2lW()( z6Ze=GqIKfmH1;!~h_;1-4sk-2JAmPkc@-zz$zFXgo)tP8g!0%RoX@V~ zbOTZeWm2lC)WlCG;Ec_rd;;f(3gwRs!zHJ4a7<8ucf5$hygjOW;*Bpke`1j(83EKiz!o&90l`hk~Ey(rx0I5EiD20lPj7~Tfkle zuC6jBj>hya)Mow1B=X>^E74V_po{u^qefXVs~uF%Qej(!mlA&=>GF6(eWQ;e_6mbg z+J2;OFU6ijQv)nGc9V4>LFY>B!Or2ll1A6xKi^jiPF`Q=$*xY?5Rhto8(a7!CP!AZjXDD5br5e_2yL&eJBZO$J1FUcQ<v4M^W`0{19265vX&39NTBl5zUZCPp(}QXzCW|-2_K5el4BwnR+M{0kxZS3Z@L&VyOq1Wu6A$ zx|$XttP+{_v%DrbrdDjlw`x`ENym!*8XtYt}V#fC5msQ;rZ zH4Y#Z{cI#TyeYczKeqSzOb7mVwM{u|RWXH+$a+4ELhD^mq;Iz^bfab}N zHlAT@L8dVHDM*Aq>u42cteOMqITA!Y-q!=6j zGyoS}Be6Lx;J&mtj%h^e?Qc@qzWHks;eJd1;U7lQ{Gi_K6Jp6O{8N3wZ=cPg!v-XE za{n!2v(}df%h$3vgnRQZ2P>4mF=?_5K8pwV z24DZ-KTrk!c2PV>{&w1@L*KppAL+uFw>c4tTGA7~qBeN1e_xsVKXOqhRQmnxq83r0 z@Q-&25+cqC{BLoU|6j?6_)s8jfcq@w<@os zI{>wHg0SdAHhq?Vd^XJ$CDbDv>DAa|!IaC6mRvZb+1{lMjwz7y&NuGWalBD)RPKWk zd3<@#{gg+zM`fX5?!&n;JeQe$3odRTxSCW(CPX0@?jO&iSLy^@{lTj<`tz2%|8}Ca zsik0|^K!-5^1ChXueGNy+1fI#A~bOs8+BBz2L*?v0*~@z62@c-IO9ZwQ|Xk$Bj$1> z8k?rMP?ypZ+9x!g6$C7_AJ91)6&v$Kjyp0|h43e)48e5?o3}^<1tl;Jf#|HQ1K@=Q zxN9mPhg51(*_s$Vdh~I$&OFKfr3oFOc0^W+#z=?uWGP2viwb$bY^4Z@iiVCjL5a+d4d;&&QveyEX)uy2PfTDv73xAjsd&>GSZ zNB0{4LC{^=PqM$_;`YQv$+f<{(w;3zINjaa*{`3R5EnWgIc(I2k>Qt>G(2 z{EswvTumI3qO^>7@?202t_S$$1c<2~r{Yur1Ede2fE7V4T0$fR&)JqZ!>ML^9ijco z+m0I?)+2EY?pMgn&rBuRXFELhJ^J92SQhy3QRL5?HsscNddiA7)HOXQ*B|fZ+6K-- z!G}Xikv6rSrr9`C2h;DGW!gfNbo3aZpZ)`!L(5dDGy|wIghe7jeZrcggX4}$i$TI! zs_IyN25i)NsqC3B31&Ny$0HXB+=MR`G%_y*Z({@w|3xS+Y&l{H7>HrHg)K^cQ!)?$ zq1uxE3EijI69Uue9E8du9cZvWN=+&imGR<{cJ%F|?G%wr0tVhIC9$1uk$!_4fc9K- zLEZ1cPFAU7Fp1>R*$vUvA1fA~s`;^PYURgCKj+Dusd_F~9TIOj)*OwAsp!_Hc0P-- z#>ems!YiABU%(~>M=*B=HM#+44jyD!fe3@cVR~=(!TI-o*D@<=> zgPud;b90!(;@)4hjw=8himrj{^ zM8MmY2L5tjT%kivMd^dBO2d|%JbYJjfWPJw^FW>RI+{URi=y&+l4n9jwW-|_&Se^)-mxvRdZAAg_zo(^QwVmRvkOwe^W*VMC67 zc#~@G*}FQVaxuX1&!*n&5s064|-&5rKFk=5G`((sJCvWQk#g1 zSeR#nuuWG9fjNYFgo{?kpdI1h42uGKn9-Zl44~x_Pj<$|tega6a5{Q3m~#YNTs<8R z*~sM0Kvz_E>kS0!_3)_#0%t~Y6R~vGyS%U7r?Ic_;jtjzL7amVc%isF=fjLHjYH{| z?&+1kbqKaw4^yj;1#zm+DthNSHo3G^*|(n*KUyFD-pSB1YrNaXhC{keZ9IO+I|K~; z(cHwsz6GaYCclZ^nc}|E7Wfgj8f`2#RDg$@!K3y`RI;H(jPeimM91KgzON1 zbTzH;S=2irTcy=0U(b26t1&&op?{p`Ypj}bc=b`l(Q?@{D?-i1u8|h|o?OcSpEKr! zw+n|UgUgfAqYNV9b8{@Pi)(JL{j5ck)xK?SVOo7kS7~9?hYW?Rh?Su#TJ$y7^82hZ z^L{&^tM!%C&~7of^2O7)oK!Iqe*Q(y=^eJdA*j50U$5MlR+&JZsC996LD~u_300F* z?k2uIJm^WVj;#k?Fv6SyJmD*Qu}ZLRdf<%c%=XRCl$W%x-MaFW^2GZ7@|smAo#$7@tthlgnTyyW4HFJvxmhH}%n9=)`*$=LI zLAv3m0d(|>|0W@TG-o8Za1|-hLqKI^4)Z$yrvVWsTHK%%AG;r}=8PeQ!I>IzAD#9L ziEtmb9}tv`7yyo5vF57un*H^2%l>$Mzo_kHKaBN4Q%E3xk7Hm~S+m zb5Z71-^V3?64B$I zLKEEpUzH<;fAN134*lP)T9XVaaOTp+ogf8CIJ6-HHXNB+rfaw}>Px2#jBUbvK zC{3a)>YJs^=}Gg$nYyyPNq`P45~!dTzTB&K111aria{P&bXFWn+CokiOrsgQs#P9a z^z^Kc zPYmu*0t9Fg2B&89t8IEd?+~IlqFtf=8o2{N`4@wXOIz8F+LFQHzh{!a{$C;HJ&dM? zoR~ASh-YoDDKFfCc}X+rL;NR=nF9tb&f4n5f#oE4E^&lAa(P+{p%#)_nOU}2q;o&U z$_l5D)O@C6NZ8>~WJM$*v?$`p#iPb;59OkQ5vzMVU_u(4K&oVeqkdCFZnniGXms za;Kw2nr!hzR}LSb2@oU$oM}W_BuTEqCBpfa=4&MMs5t+$^f?)5>>3;|l4_c8JoA(& zBn-3~8PJr+<>VEE(34DlpJwPHSiqQ)nTyI=pyZPUi4PtCP8o$}v@)f@6Gyj#rWLtu z>ZwcQJ2xKWTp!&N{#TJ+1<(gCw-&kdwMpV~bQ&(FTC`@iw=CJZ8^p>-SCz#htm@5U)@x2_}@lSvCaM;nNg6^|M zzzhEJJGAzd955-UWfq#h3ISrxqh1?f5F0@D2iB^~f(m@P6aJe~{mHlDm-j6?V4^K_0P6*r+Fy#PuB;bIsffVaftHW6saz+-wWZC`T-=p7ehNk`4!G>ULk)4E&SqTT$ zfPs}b?`>C~i-$9t_L9EDgq7rLkRzM(eR>94E}Buq5|y5|B-U_!qJ6BSwrW{F57&F( z{IpL;p-)A}71)`C2l6i04Rm9V9vyjdIshELRxYBe5+_bkQ$f}1>}m;}pRjqk;hsG2 zkcJr0BLIXb?nx{XE%r7WJH(<>MEIo?{M<}Bi8?srV+r=iG^;~Eqgz}+jsxuh0aXj5 zu~2|b#SCntfHP_GRo^`R)GiCL?8-?vB_x@#$KWgGjcz$x3sH! zU%EmICeG+Z`2k@lL!xY0?xL+<{*AjPnOV*VkMt1rY3e;g%&7un#GIMr9i{@71>If= zna2&=F-D9-nSOE1m+9uWdhc#+t>iLi4O)syr(hqohh}eo5_REpEh9Oj2!{0aSUyHe zYs8sawtN_kaBPfrzUw#--vYBQEK6lDn6X!JHA^CP{_uVa5WW#&bhe^8 z{I`uz)6iu-SXc`t>3k@R-lPESfb=;j4}&LG3epyja8ELoIVHkVnhkz>B;zyU1`wi` z^Q*^wD#Ih<;4a;3&&fxjbqq^1T4H52rRXM3$^(5!It7fGrC}~>&_g7=wx09JsIjQ! zU@XkFH+Y$o36C7xoIo6N4B7waHyxEjB_~9NR4mQLneV5>YgX-^{M4Y52dFR=aAdeW}RJ@JHZCS+Y1VC#3 zI6LXALpiVQTFhx{Kgmf5;E@O>K-T&y{dNn_fU*I0W_aQS|8V+*x|=J9Ns%Uln9aE# zkMK0;KOk&c*XMOsEK_bDssTm8Bh&cVWC z>rw2S6b8OjSQKn%>oTPse zX+Z7GZtY5Bd>8bbHM%aY?~C|QmgbbQZLo?Q`Pn9+^?=o)gXmycKg*UD$dUVps6~fF zrI1>~OkueNCMGtj`gGaL3>LibP@9ctd=u*C_+&cAlf_6k0n;MxEIOqUQ07ng!Ya${ zF1vPr3!>CQ@FsLOgo%)M&;eW8q;=^UVW@m@u);TTb_!$tQ@5ysLVAzD3ab8OQtV&a zpB>qwbw5tLChEn(hJC62d;O`U$!5;wy>xj{5j9})g|e>+OjtWK;Y)$xWpJ1;VNQTn zioXv@+AH<3u$G&b6JW{s<=~^rMjF1O2eBo(X=Od{k(IsM9y3#`MS_=ov z8%i)pwPdWue)DA?nyMHO=&sE(58H3DBcHrZLW{&RVXq-fPD0Wh2M;mba%Xr=yy!}& z@l4vcqXS7(EGDdbjla`+3M{}D)TRmHV=7AX~03}Tn<9HE9ucg_VL67K;h(k&qqm9 z2W!5-2#s4Y5i)JzMp{6Qpx09rjknpxV zAXPW9Ycz!z;PTO5tPV@y4T^P3X(%CsPiU>+_zz~iDo8zlec?L@h2SJ8j zaNXd$OS^frpeyf(%nxeYb;oN1+B=kj3mh~*aOnsS=X=%I6VfTzKFj+j7z823We0mA zBoQsu?QP+r{)G!>I(BS{(3)p>v^YOTwF3qzHV}Kp1|-LumdFV9p>rx2AUGqSIp8JO zc6Q!*-@6(X?l##0Tf~GFJ{K%azH+@a*QLfV6c}O}TP(bAlr?EMNOWI@jY7vKg$F0;kH{#j zz!!BZAvXm)$}32q2E@LpOX!{0N!PSwg-CYE{ewe@RxgAt3BYT;^(|a7o@gUk1z6Z4 zK2Y(B?tkKgux};%%O~^gkwdNrUZ^y`Dk7*yliwJV)~<~ClYu1&5Hj_Q9`XZp49}ge zMP+~C>ebD0CZJP-@b3__;LvQ-am9&6)F+Tff_!T@0BD2t&Kr_!HY}Btor{x&WLhzk z*OG%AWFx+s|8g61LfKa|rbn$u61Ow5Oq5{$HJ}Sw+=1I;BsIu@B6Z37WeT2FbuU60 z{rD!NHK!SMf$$DgG1qEC`%uUa@mWt|A3F8aYIoy30sX@HBGp}gSPG8ImmM#-b26}y zt_va3#mJ)8<`2SHNurbm29(Ky15i)fP4w+BLvdN|Q}$0_1u}(18ZtyxoOPG39C4#Z^wx*6WJM&)U>Kpc3M%C^43Mcu&&?F# zz$I9VvK7&1{pQRlOT+{sfj!IS76=}sg*wOO44z{1;>0y6y)aaNy$UrD12VyvBcB)y zl_jX2*vxnU=S98^(oj3Ny_+F{2n;dYDebZC9#-57^iM}IRI(~zAww-PjZGtsFSFjZ ztZmPauaEW1YIl1P9)H7ML$`5ay^ZtZGN$I}zqJdqGfqF*9$`PK zlW6gonFr9RvT+;Gub)U%SydGm0nq+Dsvgm6$1x*zwdl6=y`VB;SD!iEM*KMF?%lgJ zb#-%o{ISyyLxyaE80FHXOUc^VP&8f!jRak(E@hc#cKi7BA5d0RbzsMij@bX-0oj=N z+i$=9j{ZZcLC=FV=O043f!NqR*5+l$$r`c#hvvCWdgHFqEzsfd2hD~cn2$KY3Wrc6Q;PfOqnxx?&_a^{uSPFqlOO`O`A5Y z&|0J0xSvd;>K{Bx&&h4&os3hQ}yW8;>~HCe0CbU7L%|M8i)+lcm|?YlNC>L%Q|BllpY(Pz-09xp1c z>;vRff59-yTndhs3YYzU`)%a(t?#<^@83UmOYO*NyMq{%b^h#GQCnLZa#nkfArb3Z z$1k3r&70I=?SAbIJwLtXr$>V4k}y$4Ma8+PuCwRLef|3NOG-)-<>uzbI@Qa_D=28Z zQjnLo0mdRNBcoI9+aNs0U0UmK`?_`Oc4_=GudEwva;KE?{==OtsSqd{N2gyVw7P&Kfd&^w{h=Je>A`0qSh0s;eUCd zZh@9~7IU4Quj_3ok3cxwb0;t`aD=k5Ctjejw&;>}aDQhPm*BfsWj_7g;WvBc{q17@ z_)t^FY1w!F<6ocN^z%Q9&)}ne`mwzl{X~02`|$Ge@;==<*=*W$WNI~n*V*5G+kxJfj_cioi7QsD=+>#@kqGPD{_XRY zEn9})t7&Km&DvU7m^iFguU?n*ugFYNQCV$au@B_QofBjxELpj7D2DI316!TFXi-m~ zeRq)o)I!t${2kt?rl!XImtVTPYiO8&9fc=df8oHseLE32qBlPKxTwM&rjdx+-4O+L zL`SP?X=|^xwA_zH`3iXHkF#fQpTBkW$wf<+4A5UPYSbv?3sooIEcdzIe7ZVzWL?v; z{JNjsP83&}W3}T_pI$LL^w_j@KxWS7Ge7TtLLFmc!7|1=gyCMhK9Fua|eP{e+$*-%d)cjC&#F(58JqLBRUh^ZEbCT z2aXLt`C*U+{o?H{b$YtfNY8}W*zb`(-^QJMfo*`%2x~!n!F-G$y<8lqupaIRM#WA5 z!YNUU_fG(cdst~{DcZ;qknwcV)z!uR=?cok9UR;*ii&n3qtVgxxpr+DZmb7t?~x-% z&I$Y2XU=^4_eOnmB(p+UcAX4?2GR8+_h`hDnQb|=j4RHd85^1?b@~e0Rgk; z&OIL#yj zedi|tPk+TdnG-fd(I{55Xwf3jHdQRfyL{Y?veal@r{lwywRg`=cWX;<7$qIK1wFN=FXj4nHROd@?8+(d5A$& z4>{d1ub}H-W2`~5rxCeMpJBt4bWbI_>2BFFrH7=XTXJO3N58*p$o5H-Itm*xIk5m_ z_YNZ5`QTS4w1#5HCT!_CqHezQCP+(i(4avmeLUuO^&cjFdJmk(oAzizV_kuC+(p!< zUq5NjiwMkvRV_s#%YxV=70#U*rN>X6{L|*mlTca4))W`76S*Hc)LS%b_UsM`2?=9m zWpCj=#cqZs<$ic#TMrWxlc)LlX;F*2ckixuc}?fXPo8``aA1m>{n@ZEMLg7Bl9T5L zrfTWx{seK*k;8}GPfoT@)mEx2d=k59EiU%eZu#J#%yD003|Dd8lDR`7@E=-g&YT`BrT%78J$A{gH6SJGWy*-a>U<4QMm?E?5fP_Qx z!Gj05j$T$)R%I%?qn~RZ$_ieb#X0K?^r@+%CFs;ljw(Aa3A0Ngzbqw70o{V>Dpv)~#r5 zbot?jA8bk=3=H&DcdA>5*b;WW^Dqkw3;Y)j+~z=CEKCuM$w-Zg1YaL0+=`=+VAF zQ0^G&lv~*})tTZEoeK5tb{yhacFjO)-Hf(f>t_7q{oIH5 z9E|Lx7Z(pfMJ0jKx=)~i} zprD{jD=zk`tgIYwmhnSzadAzyi6`attAE0+?Wq8&GG%s`C0yz$wz=ZnV;o9XP1Z(t#G#j2e$ zZQ4i`6{(psXI@uw9y)!CXu*O7@+JvCI5|1JE{L0GX=%x&hGDy_P;jkrdiCnns@1Ev zVY0v6o;HHdOzmO zt5<7K*!98IzE_gwyBgPmJo-Fx{3$LUC+*m|QzNT7Kc@G=g9oQL)k&j2bPxyOENyKm z1jKn*m^OIH=Oz9ZFW%11?vG&l`sw9SAt51$y}UXtS+WG(l9Zg>4gD{V?b|!NfBQ_5pXkn= z`B5&ZeTNJ=;OF*jUm*Z4*MS2)QT+axg#zp>(7HynFArm< zK+Aj{b&_73?Px60F|`5X&%ArLnGs^oo;~ALR5TzkFJ3Y^B!K@ye$|eBJNhmiI4iN+>SeGW6Sf zqh(~)00GjwzGcEU-+WVSaK_W~J3lqYUP3m(U5(+rEGQH-Rxl=$O7N zF5cy6Le?JX$1e^9BwoM`pcQa z=c62ZV}8VZe%4RRo=`G1yid0XbQpueQhRHElo-B!miytuhl9eFN9lZY{$OIMw9DCX zKkAIYc_=vVi6Vem?70i<=`sS*$!0Z_KOI(yjv;KNrKG%kg*xllg$pt(mM*2unbDSI z%f7XEc1=YhX~&KodYd*)81SLy<=pIu)pIYP%3r=>MO;l~rRDl{>+bZElF9|V@#CA# zs8BBi2d5$F&xJ%Wt|m5iicFtw$B?VXZz}3C0AohRAdkKG1aH0kja5-m(Ta^jMGufg zOIzYlDv0D|BBI5`MnsI~yG)ui=_%60fS|cRZjQ|wz6yv|-+j#}#0QF^ottbG7y7j7 zp9UH*UW8<2{|u+PAEg!Ll9l(_Qg;Z0s@UalJdN!kr&! z>h*jvs@(w_2H+W*ijJK>e}4YZ)y?&_wJ$^K@q;+!{3wh2SVJ1G>}+k1ojW%|B1zTq z>G1Dj)~65Z;*K?NsHCK1k9T=xrTivCZt|DYs}=K2#viFe#65;$f1;}DdhFnln=of`l}Ha&uEs4atPIh3z!E-3 zj@vq&I!-0 zB0ok+A_*g{Gviwuj~zQUUK9fDN+sk@Yid0_Jme=$(ptAo`QB4Jq~i!U5=p;#b|>Xz%KGGoR}6op`ak6hhxyF1Ff1E7GmuLV@HMn*>F!PBS5aPKZ- zUuQ>K8Lr>BF=OxEy~Qif?Cw2GS+r1FTRY5lm(^KI!@iNx(d$KbGR$tZ>b*BwIn*i4 zBcLK#*T=tpP@(<&(-r1UnrGBZo5mEjBdiPVZ(5` z#0P~93jC$f^{DP-sTt}mF&&eTdfmi9bqobWyld-LZQVcvG}M2<3SA9&s6FNVoa7HW zH^TcNS!lC^r%I|Q0%=K)M?FmH#$rVPv)gl5QtdPj?H!VmJ$ssp^iV`NrA>FJ{9Ymn zQj`ZC-PK-zt9)wmp_tgWe<}G8wtT+^BqHqh?bb>Cs)P?BLUYZ_oqDG+*GpMM zk?!&*vl~Y#jvv2NJ`4rw!r^@)fb!X`j;vfFPH=9zwR!XA??qT`Q9T|h=|#AAShaHH z$~BvsnwkpI>QJtMEm#GH_1yO*X#AnKNTW{ip|h>-Zf;B zX5u$KWh2hp4D+g5I$YXP_xbbZYc@gJv{rP?$HzynIVCl9O~>uCLekMr-PZy6%j)ZC z6}eZ&NDQyLbq&z^H==#N{@Q0jqEr3)y7!bHiIEE`cZz#nl-;Y zNc(o?Vf{GUfX7a|6jxqP7L9jvb30<=q_(PiOchFoyLEokoe(IIr5%YoZHn^n*AAuqvkdd{sZ`(n8TKE3qnjC9lL(d2%+ z{kVL)>`wopC8zDYYz%!I+d3sd06#)!Jy0#D@DIY0wnTA0P~_w7t-U%ADAe&|$9~=X zrawl@DM%z?eWiJbrT>tsUJ_SEIu3)3@)a2?r)UPjHcRcQcR8LfR|cU&c>46Tc;&h*J-(KM&}D>{g?W z>DIgVZUmvpJ(uaZhn6oM?q@n zdHG%WIwmG(9G~I2o;`nlCnQ@h5x%7so9Uf~cyqY4bSI1#9RNL#J9_*8&L!|0cj1xpc(Q|HdBVY*OgwA&gPhl0rD;*Y`dkw%hoN2li`*TKi6dG|LiidD5ALd!1IWt;&R zqV%CaF5T%T#O0_c6{Nr8H@{v=&?`GT+jiJdq~ImS2eDRO6%~Ekx32`=cTZDE+)C$Q z&>~TP>&aigR#4XZtAq8LHMh2%ei5JDda1b|L7x^!M3(cQ>#NHT8)16Gx#_#4_SP<= z{HLSP340@p2;J1R@%?0i#q&p>m})0uWMtH5@L)+GY_H$E`3;GeUd+ZJDA%3paf;Ub za`ME9jsSU@trg{G%oviC<102T>oTBQC%|W2MacMnE!kva^CEq%g@v5YPq7d7zR}48 zEe{g3?fWM$;;D<=l}r-mYwym&Q%f4$rqJN!VWTFQGyA&)-z=2f-xcku?cBL@ zK_QZaM!^>-b!t+}L4+56J(4+1I zkhgPNielxuW&I1=+J`nL0N_GVK->~6-UA42o9uCZ=*8K4X=vo@4FA76JM*|4_iz0_ z86!i5L`2D)CVMMMW|4%1Ql!XCg%C|BB|}1yNGU_3YHK2uN>NmXwxL9kkTe*|eBPh! zd%ov)&g;C+AHV(I7CrZK-|Ms1wXW-0>y~wNdiJC^HZCr4XUoQmQBk%vg@Iby+Pg9{ z4f7B6m(kVL-M)RhM7Caf*m@i4XokJ}&+mOax0m;lZl|c{IFQHZMSSN%E|7J9y1uNb z5x+s=iD$1r;~GlezkhcGx}69Prm2|~Z7K)nBk_d$>)E?^QNrNJh;!%KO9;p4%Q_?L z3^Yf&#K$a{`S*(ktCD#&rzZ@)A@d?~Y{Sh>r+?5ziPI0PglGw;I=!Y&kV1Fy37wBG zc#@i;>k{Alnen}`UyPpCF6fw4QTzRO3`Jfso-@a1;y};+`(+G0es-Za2sRgzW%d2@ zU2}4B(k>ev>Ng4CMltNF*tf48bn4Bbq8=khj~&~Gg`c|#>EDEuALbuhCf+hy=1@Pp zV8Eaf^QuL64okXv?ONkcQghyX`qJ7oh`n#S>GP&QlH(K1gHMGf%?W9Nc~u;}vWtm{ zNf-o|=-+5i$S}3DJ-&V3uzlyw2(Ch~Vmtx#9&P8h<^kQFovTxOSzX-*%0@DA;zZAz zZovt;`n=!FXkH4y5X&4K{J|Q2-@DzqbLR$& zO-nJJUyO;FVr8X7cdEDLwQPe9w*w6V)yL6Mi`*X;9xgR&R?()1ab!HGd%c~X)g4@E zNxF3H8jc`AhTdES3F&>|!qA6%1^YN|+&H+Ej$_A;tmMmEk z@5Wn7X1sj7C!yet^hIMeWsznF={f#IGwkuY&>(#3l_Vex-TJlJ3H{Pc4x{~-f zkYYA;1~JGrsFtX{9EH}_i?xDYu(hByDOy15YdaQHkJ<0X zx?QzcY+1fxT6D9X`qRvZaaJ8ij~>mjxekYj1N)Vm!u%`Ugk%aI35=qAF%>!!SM9#&6*nLBqbB&h7pOHRZSyzBcu;iW>Q zc>lgQS-f5JEDkuN!ozE=X1rkch`0!X(}&9ESn!m=IkkZ5%Z_t^3obPs1-<=m-;f;^av?st4ur zxI?bo5N2}LbxA-_mgPHq?J9@S5YTfS@;;**?=93*X@rwN_b~GMzeI2an|CaAGZOm(J{dE3+fT#5&8pf5&e9CKCMg zA&#w$wilzL&%#NnuE}codCVtrK%r!W{g%)q^yrs`ip({Lbq?a{}UImS>W&({4|49RofI77jv^F!lhAy+tP@_L`k6lbXa~s*TKHQW9Bz^ zOow{g8wavRz~&HJ2V*9VprdtR#TKvn8z=&IOV*}(JU z$-b%VCL&)2b?6R_6 z`T6-4w087@i#EDI{p?1cH+28*3;C2?QIV0Oe{=F9?dd_q-epqHlBbI%OGigXYk7W` z;JP98uP06T+8XmZqdBg&zh(Si7=(<#R{ZD4M8Z@fqe1HGUBKbeojXsqw(j@vOXJQM zzdG;8&CUK-N@8X_?mhkXqjDMTae3 z2O+>zIAS7;!XD#PJphOvq^G9{W~en>*kf^~>)1oe<2!HOyctKcRQ5wtOWL=5_@Dsb zFX6iBP3ro`yQ!jf^a!tcftjxAI$K*6==&xi~bjC0G(p)1`QBl#@+O%A-!%sFGY{pa_w046yFg}vnQFppn9t-mrUBCdco zN2F00vBPjvL+6ApL*{Gz_)&e^iY7>+u!|R^6B82?5)x$J$UeX`)cK(U0}ibBQX;mV zlb*VE?F#C%rE8Uzk;#ROBloEUX>wa>eD-jj_)>e(l?0iG2A<~jE#<+W=~-^y6rkSH zoa+=s_9G8z0<%;U?;hnyI{fZo$O*Z13?K*Knkt}4(m&y1fwv23TsO-w8uoS`U<)Cqf zVDPHXJ85ffRAUzKo)expC||B8`Dxa<5;P;`|fucZ*kEPNjve{C5TI?@+#`}a+>k}p=fga;aY&zDa9V=kL=;Iw4HGy5 zRdC>tA$waM+ql%e0+HmR&|!$%MQH?7gI4^+X`n}4%_|9XpInZu8w=|hYmwN7ek&n4 z**hRWj^UPst@VrPx8*q{swL0;_V2H%sqv-`PnYimy=&g*5DoFrfHojuez*b^G4oOR3vRF%^uBJBiZOyiK zj{>BYLA{yPYXAACz2p(Rm&=Q|*jPmgB-?Q3U`EjFB+%U_EUb6z&~LD=MaEbuv0yY{ zdy#=tb-T9NqTO>I&-g+v3~2DaeVy1eVoMU^Z_$^ZE7V-$VJxqtR3y=ok&%fi+~(}e z$6#-Fc|j8kTZ6Aj!zAsrpxr_W9zPD2T1IlI$?>W$DJbyKErEpWBYE}i-EE}?Tm_N@ z0;M^h36_Q~5~a~A4?M7MenUcoyE}V!`wKT$SGANIet+N1%kv7%JPl}Cv3BiRlUcL& z2Oc{%W5ER5@;|k-o*yhJF6QbUmoJ=Io|B#JIef&3BuL!EB=+v#zG_&rp>4imL*jza zr1Ep>K&TF$Pcz-D)Ze4hXVfJlId<@@ue=tLYLe;p>D}Ye9X#LE)y<0C&m(S|y)?^x z$$Ndb{S_6~3#s=D|5`aaC?urF+i2=k*hd04;|rkB`n{9o$%u$S;GX4hKL-+jtN#`Ox^+beHj&XSo>FZUC1apdqwXCavcB!Pl0N6U_R;Z@T1EqPH2q!D%XEdH_~mPI zK5Y1h&f4VUBsXs1%k=mlqwVX9zRp<;``;WIv0}VO(2zIVFTJi%RV#8HGk*MO5bM7F znn&Jh#)f2NO>l7ehe&#aXCqxJ^EbP<;Id|Pkz1%i{nC45&&T?`AJF>bltIhzUK`d? zrCy$i{OA@H5~B1ESMF6J%OdNXEzZu5Im78`z%y;ocn8n%?%ypUZ~OX63(_kVH>rknM?$yClaJ_2&j#-ROdeKOm#hO%&9uDrQTs4lPzd~{X%=(SarFUphP=4}_ zq!M}WtWkK{?tCksaYO_K0dYPm>J~kexd~tI6*gzBNBt44jy6ZoUHaVwcs6&h5G+0WQbSOQs=4DxufNh2}eg zd7?e`^)P(VPk+nB8QU>oz`(_F*WU5k097Z#&920xW=-l5bDtM;A7v(AzC1PM1IIP( zSr#tgs<SR0uFRRiEU)kso7L3blTp-B)V^5-eKK%u)oPoKE8~W;q3f_CTk+SDEc6`1X8cPMip1P;UFT&!Z@}H>wABJ+3)(<;o#+ z2-~ylUW`+Ynaux5eny3OO~9L+2-iz32~=9!Tt75(=MGlNqKh8sw~g)m|$mTC)=-Im%)SYO1T%AI<$WI zuqw*Pv#F&8ZXlahJpd+j3KG1`qc)oP*W6b^m=8YjPAiv;N3E%a{{V9c154X-pReq4Pli?2>K=(r|PFiqwSqTW7jjMyk^=B+gq- z5GE|U-bPVL=>^VQyCUk)4QPX==9*bdZ767KYh$q(i|=at1-YZsAJ6*(9B=?qvaJNY zE8E*>+BAW|;k~mtN7JV7dV{!RFn)Z%(W84rNLF!Q+e*H(UCOR#1LleJ2phK;l44s4 zg>9J52%-M*CI)H5N&1pz(_OD>Y6k1X9fMuXQinn7#v9uc$k`T%{Zj|@D*`vC;KCNV*@JPvwep2gTv2+gV z#o*LYaccdBqSwO-^<$B(hZA?>ce@G8q?7uyYJk&ll?ez)hkL$x`WAl z{rsw@$7t?vs5pfW2OpNAqM|6)b`hnfVJT zhfGeZHJ=?%lY;pUwjvuhW?CZ(bk6PDT_95nV3it$yp*K4-1p$YUSH<@vGO(-r8scd zFy9uR9SGaSXC`PiS8qad`As%5W@X(F0IjD~ItSBFh!=4YXR!n}t+HKf4r0Pq z)x2SJKv4=JoeCvQB6^iG%h*_J+k5Mb9iKXr9UbvC+07o@!&GLVL&15ewjHt|b{553 zS1GTQjhv584fnQ@?C%Bwd75blYIYNn)bus}NrYjLEo ze7ve=xO)#0!u7|GE#HN&SOa#>;X!H>*)-ZtRRq|@MVFLKLk(`tMx}c-8}I4NACBqV zOzgG_90FS6{L`t%Ma9MWXdLNL6C(r8obiVSgM+ns7e2$>yl1;MyR1)-Sdp$^%mU6S zBGF^*R_*?`$m%duFIXmE=K?-lIN0S-R-u8>f-w*meD@nL1(C*90eq*#lopn|g>b__L(zIxZTC<&4WHYTLELU0KDrLQc-)43A$+U%Jm<{pQ{|9CmqBQ8)&vd_@}RQTNUB zCNoM>tsi!r+}QqkUBTd-Z{f7u5}O8@*7G;|3Ou7Psc1-LW$?feBi{Nr-_}r9f2l9k z=r(Zm#*N*eKZGG|Yfx>uf6kBM)B#@v&m^JszV)rjAC8v3+GT=9Pw95O++EGDZ1$Op zmyEkxdVaQ2Heed0c`_dy}Ezo<_|D364z^6jqmR>fAYx{1VYa$%$|vBrg?ut z{Fw+VjWQ^4byE%r3~W#1hea+W=L&-v6VCY^6@1r(Lyp}x(*TLA%e_k5)}YKU2?I)& z-@OUHOfFhok*1BqP8h#vC3-3-RP)xLUSEFcL;;Ez5Bv}0|uLbs_MZWi`71V$=c`^Mz^^WSJjdcAyn#+7{_`#FT7 zI18((u*of3=Gj|w>2t!%aoe_9_m6*aoJk}@FrwNJ|E6iQi?R&jM(cN!WmdZ%v62GW22 znd}gK0VfE@V`Tj_=V=Jk*>~18ynQR~RX7_cU|y!v{EIs)>Pg2<^yCHLZ8;^S{Zygs zJ9oNLMpFig#0VFuRm@cFQ9;$fIu+)30y6z=q#|sgE z9C=@f&?$t11VPb=!HRFPsrF!!a8QB}c$f;XY11j`2qIdWUzxCu#kx94{2n6X)cBnW zh;rVvrHad8%nK+gg5-k$-TzX~u*;}%C(Wk;cJ2zhIN=5po=xxz2ORWLmFVj=JG%e) zw8;9(mQM7r(@-X>UcdH5W>Mkc0vc3p%szCImd+;X(lxIchm2m;4frBW#<8%pRDt3~ zcOX{>J*excs3?uh-L6B2vpi^_0+M(zvS5OcU7B=x^OtBvg!CB}}l4S4wJvQ#l zJg(F$pk}c}D2_lo)@Hs2TyFabTjdEYjcs=D=Nl0Q56hy}N}3i0*Iq0fLNkw3kGVZh zZ}0YO-07UJ$mwZB;$VZ341a!jM>^C^PIFC>m`FPj5+ZbpH1{9+G-`>fN|d9NRk1-x zGVArK<}Z2wAzBHyPUfddUyf$fA+>`u)cV!$)?BK%=<^FND0n;46IyCOS_a%qIANh` z3tz?P@&utL;v2HV$tpk2(R}J7r&#sh`s%=uBW0lNP+xKpGP_FTC&j7{&D)-B>`}m+$#xDqR=NUcD);K-kkb&WL}H4Nvqkl zckaj3{!yO0cZG}|s@?zD#c`O*GfK*g*Oi9tvap!;ZHAFiM+NzxiVJwZtQToWe!&}FD7ra2*I;Vg9*8JYMri^}1NZ_$izs^yS!wC&+g;fzl zg^FW0sflTiZ*47MQi0dG922LX-(AEY0CkBeoe|Xa8~1cKJn2a`$-}hhNTgX`-P)B5 zAWY&AS*4^PTJ(u({&=!6OC}0l)6ngtlG80r#ppt>pI%LUG?(om@l$E$=mZ#s8@77g zx(H!9fFCD0j{J~cHg;^X8Knn_F)3{}SuDRC^!;6@F5pHcU99LPX z469VrKRsF%PkrqO$BK{2o^dzyM26o9^KS{keMci z3vgDVWA^$zW0wQE)}m-^^4W6y21iMoB!pdNAn=>x4t@)LpxFoaqA&jD<&Tr>eSLki zY4qkYnTa0#g2ENJRSDXy6?8rpbe-JwW2e)I5kOGZM6L^RvBr*w#D4{2NDBA^-2YaqDWm z)ZTp0e5yLcOvz5{m3m<7{9UtH2DnHM-asBS&-1tN+M zQkJMI*$?Mk`u^ib6%y_Jh#9IpK{f)*X(cV6rGR=*GA8K;(-EQTRafx9sZ5+C6Ll9cP+ zd#IDzoqG`mSej_L)9x)bDcavqlRzavVZ@iSAO8k%BFYXZVJdnptjvn9p67G|TXd|R z{IF22@@d0R$Kfy2(*8Jo_~nm@moh#DT`=KT@)jX!0s0}D!~+DqJmFO%wq+%)2QqtQwGPDS@0JcxDNVw1V5OHJ9l zN}Z7r2b;eHZ5`>~;MUJQ#^Hx-N^GIw&&afQ}3~n7faYL9pFNlt#IOFrfvWm~o%$s9_l!8fYq4R>96S9%LPGG>_i3GD? zQH{+|UESkvUcc5tE~soJyb@p^6RC?opP!U#E^++$dLE)ddFrL;7@#kolnzAEk=#b^ z(5)1j$MYXg^IFtb{$sZd0fsubz#hsM?ccZ07J?&|ZG-Q4ITfM>#ue+jhzl1Al+K(! zeMh228@Oi>YD-r3Cg>fq^&dRk%s>;DymvMf#)ZhYYvYTr}?-MEYr z-bEsa{5z}Gtl`VSv1;5#bdg%dSoKB##jDBMZ-jh880q7jCez4@~V( zyedjwRaL2c($^Z29@k4jK?js~p4T&wnjUA?3K=A(#KI@W@~Cfyt=YI$BqE6=lx)R6@Ps_D0XL_$47_v6e@# zW*)1B9ll*raY||#-!E2c{PLRA0B$=X173-YCi1@jH;5j>3XIk{vrYfrv zjw*izC!pE!9{;I^1=r2J`^8&U^-OewsR?mGdo+>>CAJk0Ag*)prN>;+k36~mzyYr_ zXKcK4gL*vP@HnZxrKKgA6v|jbLyQTrAF#_tU$@D=B76nDrNR)hBG6=mSFBvw=J^@B zI)Gs7vtK_8LKUw~GP1#QK~k|<2zDr3i{-+MdI;8)Y^r;Bj+Ag208#>Cb%#g&sruw%DRFC5j-_eQF^ zimerOT#*V|_4e%ug;d+z4&=!&P=VROidGgfiq={(qW1gT$}5Oe(zIcR(@mIJzI>n^+D94j$Z|v8+vH-m+%t{~Cn9=^-39jC+t9 z&6zbXv&Lz`p!edkvet*Uii)Ppohys2eZ-i-Z5uzStUM1DcEA$H0czf-tk}mJ_!@Fb$@7BsE!$J*8`sEF%^=53rc*(2(q6#;Dy?l@1^aS>d zfLa!;33kQc*%dMx?*w}h%+%s9Ui2;hJh3LVJle3^ESYZI^7(}HEE+$-k!t0$2clrM z)VERW6Z=0H&0eMlhmV4p6c>fJE^W&j`QA${EPNqGZ#mDF{A}o(48dkO2-^zt!(N96Oo@sfIq`Rn%7U1nISY%9nRL@b%-ajqyR7VA z%O=csiB$wFi<*ol3W2E&bOnff5FkT1-Wm5}pnb%VT9$b}y1Gr1iKVHA=ig#P#aH4@ zja<&gWCGOZ!6&}C5vC~dJMhr*om34B`f&$n&!$77rdm_WiHN|!4?Je*73ygAT<+CDaci!yRTVPf^be`wV4Q8F( zeoO^SY|CH<%04!HzIgQ?(amXRxMME|?JO`=%w7J=UG)9CE8+<&bU$9aT+^wmvVkJ5 z%Ub>QGy47*@qah_7ms}v{E0B}P}c4y+0TNO5OdN@zzB*+%sE2=EN5oHEKp2Jzn{-!>gH;3t}80S;^Gd1f?se}T2Xh!yUmO(r_+}v@HS%HSi%+s%P-cc zV2S8jk>xRftW+^$OQ5)D0o2JBzM$}2jBvbZT}U*CgM;^R?i~l+yCn{`fP$hQB#(zd zQEhK+RFUt|LzF@mBKYar(7?^ZV1WHep5d7P0+huQ&W&3oWn&~AqGR8g%qK-=#%p;N zt^vDF0Z(Pw+O>W(ctsf+_KzPu%ErJWP_{76>;QHDlcS1kdH@zScImagppzh%@l=Kbh;`3d*188DG?rvRMQP;=ubl`GI#e+be|#1B zPYezp8ZhAy&*VA|CuoiBP1Wt0z>wOuZCheDN3X*TK88wzS#jWBgPS>Dk;*u~Y(Z2C z-S~CI7khUM1xEaHPT^RC{QNotwzPP|0iiBBOUx0uU{}Yc>S@CmH;VN5^tKmCxh-B_ z8cUnl(fQ~YcX`C`D$?hlkIF@f6wWs?@C$w*=6D582gWoR+6Y627!4teRfZ1j$oWb0 z_+^MFD)KtIjc=q4u!8r3vO_>9V#2YisVV%#Q#Wl&GLOg>*MtTO$!SE-Dy;YL&&GfD zzmLFN9y;efxId9~5&kG{6hqHhZxd!V5CR$%9ILLU#%6pKu4` z)e!9;6!RX^1sxzGSEK%5gO=G_QlBRZ5$ETWCx|B0(9MthP)&P{zm`FJZF2u^F zPDoa-VKJ<#XP}mjL%gaB-Z2NId>(^NbUr4}WzJ<_};)V(pWXO>7W+{oK%vZ@V5rVvcbfm&e3j^JX49P*k14H&3 zTPZX;N9I7CU=&n^(Inycz#ED*1b=&T!FkwU2sx2usn_l3x_1*eSV~9e=%@~`El`H1 zXLH8>yiViBt>JhaJbWQ4Y9I8uILIOmqFwFd(J(EdN~U6N7S`|RI=4c7!P?vj>4;V< z?j}D_{A0B&pWC5-|NiNPe~cNEPkK$<-ef1(Va{0|mf-+AqwrC=xw%u`f3jv<5>F6c zu~?+hLD2pyR;U49wTWpga%O7Rcs^XJ9}e_vSRd3uJ>VP4Z71%B$!Yxs@y=>qH;uB5 z{gr0@>scMT$LmaCX_ki+z /mnt/ral/jnightin/autolens_profiling_wt/pointsolver-step0-gather/results/breakdown/point_source_image +Sun 27 Sep 11:59:48 BST 2026 +loadavg: 0.22 0.05 0.02 1/1242 155902 +[ 5.7 s] configs: control(n=8,rows=11859), step0_gather(n=8,rows=11859), step0_components(n=8,rows=11859), step0_structured(n=8,rows=11859), reference(n=9,rows=268677), reference_b(n=10,rows=115473) +[ 32.1 s] reference reference solved on 200 prior + 200 stress draws (compile 4.2 s) +[ 56.7 s] reference reference_b solved on 200 prior + 200 stress draws (compile 4.9 s) +[ 56.7 s] reference floor: {"prior": {"n_draws": 200, "multiplicity_agreement": 1.0, "raw_count_agreement": 1.0, "n_multiplicity_mismatch": 0, "max_position_error": 0.0001578692142314068, "p99_position_error": 0.0001280749711778143, "median_position_error": 5.966895436149997e-05, "ref_distinct_histogram": {"2": 21, "4": 179}, "abs_delta_logl_vs_reference": {"max": 0.09204751533957278, "p99": 0.06845503627316349, "median": 0.004628222675297167, "n_nonfinite_mismatch": 0}}, "stress": {"n_draws": 200, "multiplicity_agreement": 1.0, "raw_count_agreement": 1.0, "n_multiplicity_mismatch": 0, "max_position_error": 0.00015786921423129578, "p99_position_error": 0.00014084184669768283, "median_position_error": 5.966895436134919e-05, "ref_distinct_histogram": {"2": 163, "4": 37}}} +[ 119.8 s] completeness control prior mult 1.000 raw 1.000 maxerr 0.00085134744991033 |dlogL|ref 0.8682473458375171 stress mult 1.0 maxerr 0.0007893460711581035 +[ 119.9 s] completeness step0_gather prior mult 1.000 raw 1.000 maxerr 0.00085134744991033 |dlogL|ref 0.8682473458375171 stress mult 1.0 maxerr 0.0007893460711581035 +[ 119.9 s] completeness step0_components prior mult 1.000 raw 1.000 maxerr 0.00085134744991033 |dlogL|ref 0.8682473458375171 stress mult 1.0 maxerr 0.0007893460711581035 +[ 119.9 s] completeness step0_structured prior mult 1.000 raw 1.000 maxerr 0.00085134744991033 |dlogL|ref 0.8682473458375171 stress mult 1.0 maxerr 0.0007893460711581035 +[ 119.9 s] reference image extent: {'prior': {'max_abs_y': 1.77939453125, 'max_abs_x': 1.7773254429359935, 'max_abs_coord': 1.77939453125, 'p99_abs_coord': 1.759083091412917, 'max_radius': 1.8116226317743076}, 'stress': {'max_abs_y': 2.2498046875, 'max_abs_x': 2.300267215077964, 'max_abs_coord': 2.300267215077964, 'p99_abs_coord': 2.2027852305644777, 'max_radius': 2.5191249773380773}} +[ 119.9 s] timing: compiling every route (fresh closure + clear_caches) +[ 155.0 s] timing: 20 rounds x 20 calls x 4 routes done +[ 155.7 s] fiducial gate: 7.743201200876806 == 7.743201200876812: False +[ 240.1 s] grad gate: control=True, step0_gather=True, step0_components=True, step0_structured=True +[ 240.1 s] best admissible (precision-equivalent): step0_gather; any precision: step0_gather +[ 366.8 s] vmap: control_vmap1 0.834 ms/L, control_vmap4 0.231 ms/L, control_vmap16 0.070 ms/L, step0_gather_vmap1 0.830 ms/L, step0_gather_vmap4 0.228 ms/L, step0_gather_vmap16 0.069 ms/L, step0_components_vmap1 0.831 ms/L, step0_components_vmap4 0.229 ms/L, step0_components_vmap16 0.068 ms/L, step0_structured_vmap1 0.838 ms/L, step0_structured_vmap4 0.231 ms/L, step0_structured_vmap16 0.071 ms/L +[ 366.8 s] step-0 route bit-identity vs control: step0_gather=True, step0_components=True, step0_structured=True +[ 366.8 s] step-0 split: ray trace vs ray trace + containment per geometry +[ 387.0 s] step-0 split: control trace -0.017 contain 0.087, step0_gather trace -0.016 contain 0.085, step0_components trace -0.017 contain 0.083, step0_structured trace -0.015 contain 0.090 +[ 387.0 s] uncapped containing counts (NumPy path) on the prior draws +[ 410.2 s] uncapped control: max per step [17, 13, 11, 9, 7, 5, 5, 5]; draws exceeding cap 15: [12] +[ 432.4 s] uncapped step0_gather: max per step [17, 13, 11, 9, 7, 5, 5, 5]; draws exceeding cap 15: [12] + +====================================================================================================================================================== +POINTSOLVER CONFIG SWEEP (hpc_ral_a100_fp64, rounds=20, calls=20, prior draws=200, stress draws=200) +====================================================================================================================================================== + config block ext scale prec mcs nd n rows med_ms speedup [90% CI] admp mult raw maxerr p99err dlogL_ref s_mult s_maxerr + control control 9.90 0.20 0.0010 15 1 8 11859 0.838 1.000 [0.996, 1.004] TT 1.000 1.000 8.51e-04 7.89e-04 8.68e-01 1.000 7.89e-04 + step0_gather step0_route 9.90 0.20 0.0010 15 1 8 11859 0.837 1.000 [0.996, 1.004] TT 1.000 1.000 8.51e-04 7.89e-04 8.68e-01 1.000 7.89e-04 + step0_components step0_route 9.90 0.20 0.0010 15 1 8 11859 0.839 0.999 [0.996, 1.003] TT 1.000 1.000 8.51e-04 7.89e-04 8.68e-01 1.000 7.89e-04 + step0_structured step0_route 9.90 0.20 0.0010 15 1 8 11859 0.838 0.999 [0.995, 1.003] TT 1.000 1.000 8.51e-04 7.89e-04 8.68e-01 1.000 7.89e-04 +------------------------------------------------------------------------------------------------------------------------------------------------------ + default agrees with reference on every prior draw: True + default agrees with reference on every stress draw: True + reference floor: {"prior": {"n_draws": 200, "multiplicity_agreement": 1.0, "raw_count_agreement": 1.0, "n_multiplicity_mismatch": 0, "max_position_error": 0.0001578692142314068, "p99_position_error": 0.0001280749711778143, "median_position_error": 5.966895436149997e-05, "ref_distinct_histogram": {"2": 21, "4": 179}, "abs_delta_logl_vs_reference": {"max": 0.09204751533957278, "p99": 0.06845503627316349, "median": 0.004628222675297167, "n_nonfinite_mismatch": 0}}, "stress": {"n_draws": 200, "multiplicity_agreement": 1.0, "raw_count_agreement": 1.0, "n_multiplicity_mismatch": 0, "max_position_error": 0.00015786921423129578, "p99_position_error": 0.00014084184669768283, "median_position_error": 5.966895436134919e-05, "ref_distinct_histogram": {"2": 163, "4": 37}}} + best admissible (precision-equivalent): step0_gather; any precision: step0_gather + reference image extent: {'prior': {'max_abs_y': 1.77939453125, 'max_abs_x': 1.7773254429359935, 'max_abs_coord': 1.77939453125, 'p99_abs_coord': 1.759083091412917, 'max_radius': 1.8116226317743076}, 'stress': {'max_abs_y': 2.2498046875, 'max_abs_x': 2.300267215077964, 'max_abs_coord': 2.300267215077964, 'p99_abs_coord': 2.2027852305644777, 'max_radius': 2.5191249773380773}} + fiducial gate: {'value': 7.743201200876806, 'expected': 7.743201200876812, 'repr': '7.743201200876806', 'pass': False} + all_gates_pass: False + wall: 432 s + Results JSON: /mnt/ral/jnightin/autolens_profiling_wt/pointsolver-step0-gather/results/breakdown/point_source_image/solver_config_sweep_step0_hpc_ral_a100_fp64.json + Results PNG: /mnt/ral/jnightin/autolens_profiling_wt/pointsolver-step0-gather/results/breakdown/point_source_image/solver_config_sweep_step0_hpc_ral_a100_fp64.png +=== source_revisions check (JSON vs imported HEADs) === +autoarray_imported_from /mnt/ral/jnightin/autolens_profiling_wt/PyAutoArray_pointsolver-step0-gather +OK /mnt/ral/jnightin/autolens_profiling_wt/pointsolver-step0-gather/results/breakdown/point_source_image/solver_config_sweep_step0_hpc_ral_a100_fp64.json all_gates_pass False +========================================== +loadavg: 0.98 0.90 0.47 1/1240 159370 +name, memory.used [MiB] +NVIDIA A100 80GB PCIe, 0 MiB +Finished. +Sun 27 Sep 12:07:03 BST 2026 diff --git a/results/notes/point_source_cpu_2026_09_27_ral_job_357335_step0_route_ab_epyc7702_cpu.out b/results/notes/point_source_cpu_2026_09_27_ral_job_357335_step0_route_ab_epyc7702_cpu.out new file mode 100644 index 000000000..1858dbc68 --- /dev/null +++ b/results/notes/point_source_cpu_2026_09_27_ral_job_357335_step0_route_ab_epyc7702_cpu.out @@ -0,0 +1,80 @@ +AP_ROOT=/mnt/ral/jnightin/autolens_profiling_wt/pointsolver-step0-gather +========================================== +Sun 27 Sep 12:04:16 BST 2026 +euclid-ral-gpu-2 +Model name: AMD EPYC 7702 64-Core Processor +partition: gpu +cpus-per-task: 8 +sched_affinity: 8 +loadavg: 0.00 0.00 0.00 1/1243 139471 +Cell: point_source_image/likelihood_breakdown/solver_config_sweep --step0-route +Thread env: OMP=1 MKL=1 OPENBLAS=1 NPROC=8 +XLA_FLAGS: --xla_disable_hlo_passes=constant_folding --xla_gpu_autotune_level=0 --xla_gpu_enable_triton_gemm=false +PYTHONPATH: /mnt/ral/jnightin/autolens_profiling_wt/PyAutoArray_pointsolver-step0-gather:/mnt/ral/jnightin/PyAuto:/mnt/ral/jnightin/PyAuto/PyAutoNerves:/mnt/ral/jnightin/PyAuto/PyAutoFit:/mnt/ral/jnightin/PyAuto/PyAutoArray:/mnt/ral/jnightin/PyAuto/PyAutoGalaxy:/mnt/ral/jnightin/PyAuto/PyAutoLens +=== source revisions === +PyAutoNerves (mirror) eb27da2464e2f07e0ad67e7fb18ee84be76c479a +PyAutoFit (mirror) 5468c6cefa0ae8bb08a449497cbd3c620f3720e2 +PyAutoArray (mirror) 14d63360f341912b209f2045d7e388e264692f1d +PyAutoGalaxy (mirror) 879a9308b709b3705eb95904de6b349a5c034d61 +PyAutoLens (mirror) def4decf68a245a9c3dd1eb276ee0578897b220c +PyAutoArray (branch clone, IMPORTED): c13b2d733538bec86cff3a15eccd9a0940a68463 +AP_ROOT rev: 311e690fd6c843fe38e5a228628b4417890694f2 +=== import provenance === +autoarray 2026.8.17.1 /mnt/ral/jnightin/autolens_profiling_wt/PyAutoArray_pointsolver-step0-gather/autoarray/__init__.py +autofit 2026.8.17.1 /mnt/ral/jnightin/PyAuto/PyAutoFit/autofit/__init__.py +autogalaxy 2026.8.17.1 /mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/__init__.py +autolens 2026.8.17.1 /mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/__init__.py +_STEP0_CONTAINMENT structured +jax 0.10.2 jaxlib 0.10.2 numpy 2.2.6 [CpuDevice(id=0)] +========================================== +RUN hpc_ral_cpu_epyc7702_fp64 -> /mnt/ral/jnightin/autolens_profiling_wt/pointsolver-step0-gather/results/breakdown/point_source_image +Sun 27 Sep 12:04:30 BST 2026 +loadavg: 0.29 0.07 0.02 1/1244 139515 +[ 5.4 s] configs: control(n=8,rows=11859), step0_gather(n=8,rows=11859), step0_components(n=8,rows=11859), step0_structured(n=8,rows=11859), reference(n=9,rows=268677), reference_b(n=10,rows=115473) +[ 38.5 s] reference reference solved on 200 prior + 200 stress draws (compile 2.1 s) +[ 63.8 s] reference reference_b solved on 200 prior + 200 stress draws (compile 2.3 s) +[ 63.8 s] reference floor: {"prior": {"n_draws": 200, "multiplicity_agreement": 1.0, "raw_count_agreement": 1.0, "n_multiplicity_mismatch": 0, "max_position_error": 0.00015786921423151782, "p99_position_error": 0.0001280749711777913, "median_position_error": 5.9668954361473236e-05, "ref_distinct_histogram": {"2": 21, "4": 179}, "abs_delta_logl_vs_reference": {"max": 0.09204751533968647, "p99": 0.06845503627316121, "median": 0.004628222675307825, "n_nonfinite_mismatch": 0}}, "stress": {"n_draws": 200, "multiplicity_agreement": 1.0, "raw_count_agreement": 1.0, "n_multiplicity_mismatch": 0, "max_position_error": 0.00015786921423129578, "p99_position_error": 0.00014084184669768283, "median_position_error": 5.966895436132821e-05, "ref_distinct_histogram": {"2": 163, "4": 37}}} +[ 116.4 s] completeness control prior mult 1.000 raw 1.000 maxerr 0.0008513474499103632 |dlogL|ref 0.8682473458375171 stress mult 1.0 maxerr 0.0007893460711579142 +[ 116.4 s] completeness step0_gather prior mult 1.000 raw 1.000 maxerr 0.0008513474499103632 |dlogL|ref 0.8682473458375171 stress mult 1.0 maxerr 0.0007893460711579142 +[ 116.4 s] completeness step0_components prior mult 1.000 raw 1.000 maxerr 0.0008513474499103632 |dlogL|ref 0.8682473458375171 stress mult 1.0 maxerr 0.0007893460711579142 +[ 116.5 s] completeness step0_structured prior mult 1.000 raw 1.000 maxerr 0.0008513474499103632 |dlogL|ref 0.8682473458375171 stress mult 1.0 maxerr 0.0007893460711579142 +[ 116.5 s] reference image extent: {'prior': {'max_abs_y': 1.77939453125, 'max_abs_x': 1.7773254429359933, 'max_abs_coord': 1.77939453125, 'p99_abs_coord': 1.7590830914129167, 'max_radius': 1.8116226317743076}, 'stress': {'max_abs_y': 2.2498046875, 'max_abs_x': 2.300267215077964, 'max_abs_coord': 2.300267215077964, 'p99_abs_coord': 2.2027852305644777, 'max_radius': 2.5191249773380773}} +[ 116.5 s] timing: compiling every route (fresh closure + clear_caches) +[ 147.4 s] timing: 20 rounds x 20 calls x 4 routes done +[ 148.1 s] fiducial gate: 7.743201200876812 == 7.743201200876812: True +[ 193.3 s] grad gate: control=True, step0_gather=True, step0_components=True, step0_structured=True +[ 193.3 s] best admissible (precision-equivalent): step0_structured; any precision: step0_structured +[ 349.9 s] vmap: control_vmap1 1.998 ms/L, control_vmap4 1.442 ms/L, control_vmap16 1.139 ms/L, step0_gather_vmap1 3.255 ms/L, step0_gather_vmap4 2.494 ms/L, step0_gather_vmap16 2.121 ms/L, step0_components_vmap1 2.020 ms/L, step0_components_vmap4 1.380 ms/L, step0_components_vmap16 1.166 ms/L, step0_structured_vmap1 2.023 ms/L, step0_structured_vmap4 1.446 ms/L, step0_structured_vmap16 1.133 ms/L +[ 350.0 s] step-0 route bit-identity vs control: step0_gather=True, step0_components=True, step0_structured=True +[ 350.0 s] step-0 split: ray trace vs ray trace + containment per geometry +[ 370.6 s] step-0 split: control trace 0.495 contain 0.641, step0_gather trace 0.489 contain 1.906, step0_components trace 0.492 contain 0.594, step0_structured trace 0.481 contain 0.647 +[ 370.6 s] uncapped containing counts (NumPy path) on the prior draws +[ 394.2 s] uncapped control: max per step [17, 13, 11, 9, 7, 5, 5, 5]; draws exceeding cap 15: [12] +[ 416.8 s] uncapped step0_structured: max per step [17, 13, 11, 9, 7, 5, 5, 5]; draws exceeding cap 15: [12] + +====================================================================================================================================================== +POINTSOLVER CONFIG SWEEP (hpc_ral_cpu_epyc7702_fp64, rounds=20, calls=20, prior draws=200, stress draws=200) +====================================================================================================================================================== + config block ext scale prec mcs nd n rows med_ms speedup [90% CI] admp mult raw maxerr p99err dlogL_ref s_mult s_maxerr + control control 9.90 0.20 0.0010 15 1 8 11859 1.981 1.000 [0.989, 1.011] TT 1.000 1.000 8.51e-04 7.89e-04 8.68e-01 1.000 7.89e-04 + step0_gather step0_route 9.90 0.20 0.0010 15 1 8 11859 3.184 0.622 [0.616, 0.628] TT 1.000 1.000 8.51e-04 7.89e-04 8.68e-01 1.000 7.89e-04 + step0_components step0_route 9.90 0.20 0.0010 15 1 8 11859 1.979 1.001 [0.992, 1.010] TT 1.000 1.000 8.51e-04 7.89e-04 8.68e-01 1.000 7.89e-04 + step0_structured step0_route 9.90 0.20 0.0010 15 1 8 11859 1.971 1.005 [0.995, 1.014] TT 1.000 1.000 8.51e-04 7.89e-04 8.68e-01 1.000 7.89e-04 +------------------------------------------------------------------------------------------------------------------------------------------------------ + default agrees with reference on every prior draw: True + default agrees with reference on every stress draw: True + reference floor: {"prior": {"n_draws": 200, "multiplicity_agreement": 1.0, "raw_count_agreement": 1.0, "n_multiplicity_mismatch": 0, "max_position_error": 0.00015786921423151782, "p99_position_error": 0.0001280749711777913, "median_position_error": 5.9668954361473236e-05, "ref_distinct_histogram": {"2": 21, "4": 179}, "abs_delta_logl_vs_reference": {"max": 0.09204751533968647, "p99": 0.06845503627316121, "median": 0.004628222675307825, "n_nonfinite_mismatch": 0}}, "stress": {"n_draws": 200, "multiplicity_agreement": 1.0, "raw_count_agreement": 1.0, "n_multiplicity_mismatch": 0, "max_position_error": 0.00015786921423129578, "p99_position_error": 0.00014084184669768283, "median_position_error": 5.966895436132821e-05, "ref_distinct_histogram": {"2": 163, "4": 37}}} + best admissible (precision-equivalent): step0_structured; any precision: step0_structured + reference image extent: {'prior': {'max_abs_y': 1.77939453125, 'max_abs_x': 1.7773254429359933, 'max_abs_coord': 1.77939453125, 'p99_abs_coord': 1.7590830914129167, 'max_radius': 1.8116226317743076}, 'stress': {'max_abs_y': 2.2498046875, 'max_abs_x': 2.300267215077964, 'max_abs_coord': 2.300267215077964, 'p99_abs_coord': 2.2027852305644777, 'max_radius': 2.5191249773380773}} + fiducial gate: {'value': 7.743201200876812, 'expected': 7.743201200876812, 'repr': '7.743201200876812', 'pass': True} + all_gates_pass: True + wall: 417 s + Results JSON: /mnt/ral/jnightin/autolens_profiling_wt/pointsolver-step0-gather/results/breakdown/point_source_image/solver_config_sweep_step0_hpc_ral_cpu_epyc7702_fp64.json + Results PNG: /mnt/ral/jnightin/autolens_profiling_wt/pointsolver-step0-gather/results/breakdown/point_source_image/solver_config_sweep_step0_hpc_ral_cpu_epyc7702_fp64.png +=== source_revisions check (JSON vs imported HEADs) === +autoarray_imported_from /mnt/ral/jnightin/autolens_profiling_wt/PyAutoArray_pointsolver-step0-gather +OK /mnt/ral/jnightin/autolens_profiling_wt/pointsolver-step0-gather/results/breakdown/point_source_image/solver_config_sweep_step0_hpc_ral_cpu_epyc7702_fp64.json all_gates_pass True +========================================== +loadavg: 1.48 1.33 0.66 1/1239 139598 +Finished. +Sun 27 Sep 12:11:29 BST 2026 From e78d11c990edad59d1baac660c1de439af9aa5c8 Mon Sep 17 00:00:00 2001 From: Jammy2211 Date: Sun, 27 Sep 2026 14:00:43 +0100 Subject: [PATCH 07/10] =?UTF-8?q?docs(notes):=20point-source=20CPU=20campa?= =?UTF-8?q?ign=20phase=204b=20=E2=80=94=20step-0=20containment=20route=20A?= =?UTF-8?q?/B=20(PyAutoArray#579)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit EPYC 7702 CPU (357335, supplementary): structured 1.62x / components 1.61x over gather, containment -66 %, vmap-16 1.87x; A100 (357322) ~1.00x, no regression; every route bit-identical. The quotable 8490H row (357321) is still queued on the saturated ral partition. Recommendation: keep structured as the default. Co-Authored-By: Claude Opus 5.5 --- results/notes/point_source_cpu_campaign.md | 154 +++++++++++++++++++++ 1 file changed, 154 insertions(+) diff --git a/results/notes/point_source_cpu_campaign.md b/results/notes/point_source_cpu_campaign.md index 92e883b4a..681a65acc 100644 --- a/results/notes/point_source_cpu_campaign.md +++ b/results/notes/point_source_cpu_campaign.md @@ -1292,3 +1292,157 @@ submit [`submit_breakdown_point_source_image_image_plane_p4_ral_cpu_fp64`](../.. - The completeness draws are the workspace prior plus one stress set. The per-package extents (task 4) must be checked on each package's own lenses, which the sanity-check warning (task 3) makes visible. + +## Phase 4b — step-0 containment without the triangle gather (2026-09-27) + +Issue: [PyAutoArray #579](https://github.com/PyAutoLabs/PyAutoArray/issues/579). Library branch +`feature/pointsolver-step0-gather` (PyAutoArray `c13b2d73`, unpushed at measurement time); profiling +branch `feature/point-source-cpu-p4b`. **The solver geometry does not change** (±9.9″ / 0.2 / 1e-3, +MCS 15); only the arithmetic path of the step-0 `Point` containment test does, and the result must be +bit-identical. + +### What changed in the library + +`ArrayTriangles.containing_indices` has four step-0 routes behind the trace-time switch +`autoarray.structures.triangles.array._STEP0_CONTAINMENT`. They apply only to the static initial +lattice (a `Step0Layout` carried as pytree aux data) and only to exactly `Point` (`type(shape) is +Point`; `Circle` etc. override `mask` and keep the general path): + +- `gather` — the pre-#579 general path: pad, `(N, 3, 2)` gather, no-op NaN `where`. **The "before".** +- `nopad` — the same gather without pad / `where` (laptop only; no faster, dropped on RAL). +- `components` — six `(N,)` 1-D gathers, one per vertex component; no `(N, 3, 2)` array. +- `structured` — **the branch default**: strided slices of the traced vertex table reshaped to its + lattice rows, one sign test per parity class, interleaved back to triangle order. No gather at all. + +Every route feeds `_barycentric_contains` the same six values in the same operation order, so the +mask and the kept indices are bit-identical. `control` in the tables is the branch's library default, +i.e. `structured`. + +### Instrument fixes (commit `7725a6b`) + +- `solver_config_sweep.py` step-0 split: phase 4a's `triangle_materialisation_ms` came from a prefix + returning `plane.triangles`, which is the general gather **whatever the route**, so it read + ≈ 0.8–1.0 ms on every route. It is now two numbers: + - `route_input_materialisation_ms` — route-aware: the six barycentric input components the + *active* route feeds the sign test, captured at trace time by swapping `_barycentric_contains`, + returned as jit outputs, minus ray trace. An upper bound: returning them forces XLA to write + arrays the fused containment may never write. On the EPYC run it reads 1.79 ms for `gather`, + 0.06 ms for `components` and 0.41 ms for `structured`, whose 24 strided slices are fused into the + sign test in the real call (its containment is no slower than `components`'). + - `general_gather_reference_ms` — the old prefix, kept as a route-independent reference. + - **Containment (`containing_indices` minus ray trace) stays the headline before/after number.** +- `image_plane.py`: each step's ray-trace prefix is now `jnp.sum(plane.vertices)`, so the gather is + counted in containment. The job-356365 per-step trace / containment split is marked not quotable in + the docstring; the JSON records the prefix method. + +### Environment and provenance + +- Protocol as phase 4a: fresh closure + `jax.clear_caches()` per route, 20 rounds × 20 calls, + round-robin with rotated start, 3 warm calls, 16-instance stream, bootstrap 90 % CI (2000 + samples), 200 prior + 200 stress completeness draws against the fine reference, vmap 1 / 4 / 16, + no persistent compile cache (cold `compile_s`). Routes: `control,gather,components,structured`. +- **Library code on RAL:** a `git clone --shared` of the mirror's PyAutoArray with the branch fetched + from a bundle, detached at `c13b2d73` (`/mnt/ral/jnightin/autolens_profiling_wt/PyAutoArray_pointsolver-step0-gather`), + first on `PYTHONPATH`; everything else from the shared mirror. Each job refuses to run unless + `autoarray` imports from the clone and the rest from the mirror, and asserts the JSON + `source_revisions` against the imported HEADs (and that PyAutoArray descends from `c13b2d73`). +- The mirror was pulled to the 2026.9.27.1 release commits during the session: PyAutoLens `def4decf`, + PyAutoGalaxy `879a9308`, PyAutoFit `5468c6ce`, PyAutoNerves `eb27da24`. Their diffs from the + laptop run's `4487eb47` / `0e4b89cf` / `cf83504e` / `2b3bc533` are README / docs / Colab-tag / Nerves + board-script only; **the point-source code path is identical**. +- RAL venv versus the dependency floors: jax / jaxlib 0.10.2 (= laptop), jax-cuda12 0.10.2, + nufftax 0.6.1 (floor 0.6.1), numpy 2.2.6, scipy 1.17.1 (cap 1.17.1). No floor violations. +- autolens_profiling on RAL: a worktree of the RAL checkout at `311e690` (`f7edb9f` + the fallback + submit). + +### Quotable row: RAL CPU, Xeon Platinum 8490H — job 357321, NOT RUN (queued) + +Job **357321** (`submit_breakdown_point_source_image_solver_config_sweep_step0_ral_cpu_fp64`, pinned to +`euclid-ral-compute-10-4`, the phase-4a host) was submitted at 11:59 and was still `PENDING (Priority)` +at 14:00: the `ral` partition is saturated by euclid_dr1 arrays (10-4 had 974 848 / 976 000 MB +allocated and load ≈ 150, with thousands of older equal-priority array tasks ahead). It is left +queued; when it runs it writes `solver_config_sweep_step0_hpc_ral_cpu_fp64.json`, which is the +quotable before/after row for this phase. **Until then there is no quotable 8490H number.** + +### Supplementary: RAL CPU, AMD EPYC 7702 — job 357335 + +The known fallback: CPU-only on an idle `gpu`-partition node, no `--gres`, `euclid-ral-gpu-2` +(8 CPUs, `sched_affinity` 8, fp64, NPROC 8, BLAS 1, phase-1 XLA_FLAGS; loadavg 0.29 → 1.48; wall +417 s). **A different CPU from phase 4a's 8490H: the within-node ×gather ratios are valid, the +absolute ms are not comparable to phase 4a.** JSON +[`solver_config_sweep_step0_hpc_ral_cpu_epyc7702_fp64.json`](../breakdown/point_source_image/solver_config_sweep_step0_hpc_ral_cpu_epyc7702_fp64.json) +(`quotable: "supplementary"`, `host_note` added post-run); +log [`point_source_cpu_2026_09_27_ral_job_357335_step0_route_ab_epyc7702_cpu.out`](point_source_cpu_2026_09_27_ral_job_357335_step0_route_ab_epyc7702_cpu.out). + +| route | median ms | × gather [90 % CI] | containment ms | route inputs ms | ray trace ms | vmap-1 / 4 / 16 ms/L | compile s | XLA temp KB | FLOPs M | +|---|---:|---:|---:|---:|---:|---|---:|---:|---:| +| gather (before) | 3.184 | 1.000 [0.993, 1.008] | 1.906 | 1.793 | 0.489 | 3.255 / 2.494 / 2.121 | 4.00 | 1692 | 3.38 | +| components | 1.979 | **1.608** [1.598, 1.621] | 0.594 | 0.056 | 0.492 | 2.020 / 1.380 / 1.166 | 4.12 | 1506 | 3.58 | +| **structured** (default) | 1.971 | **1.615** [1.603, 1.628] | 0.647 | 0.406 | 0.481 | 2.023 / 1.446 / 1.133 | 4.19 | **902** | **2.80** | +| control (= structured) | 1.981 | 1.607 [1.593, 1.624] | 0.641 | 0.375 | 0.495 | 1.998 / 1.442 / 1.139 | 4.06 | 902 | 2.80 | + +- Containment falls **1.906 → 0.65 ms (−66 %)**; the whole likelihood 3.18 → 1.97 ms. `structured` + and `components` are statistically tied on the scalar call (paired-round ratio vs control: + components 1.006, structured 1.007, both p10–p90 0.96–1.05). +- vmap ×gather: structured 1.61 / 1.72 / **1.87**, components 1.61 / 1.81 / 1.82. +- Compile: +2.9 % (components) / +4.8 % (structured) over gather, one cold compile each — inside the + +20 % gate. Memory: `structured` is the only route that cuts XLA temp memory (1692 → 902 KB, −47 %) + and FLOPs (3.38 → 2.80 M); `components` keeps 1506 KB and adds FLOPs. +- The general-gather reference prefix reads 0.97–1.01 ms on every route, as it must. + +### A100 no-regression row — job 357322 + +`euclid-ral-gpu-1`, NVIDIA A100 80 GB PCIe (driver 610.57.04), host CPU EPYC 7702, `JAX_PLATFORMS=cuda` +and `JAX_PLATFORM_NAME=cuda`, the job asserted the `gpu` backend; wall 432 s. JSON +[`solver_config_sweep_step0_hpc_ral_a100_fp64.json`](../breakdown/point_source_image/solver_config_sweep_step0_hpc_ral_a100_fp64.json); +log [`point_source_cpu_2026_09_27_ral_job_357322_step0_route_ab_a100.out`](point_source_cpu_2026_09_27_ral_job_357322_step0_route_ab_a100.out). + +| route | median ms | × gather [90 % CI] | containment ms | vmap-1 / 4 / 16 ms/L | compile s | XLA temp KB | +|---|---:|---:|---:|---|---:|---:| +| gather | 0.837 | 1.000 [0.996, 1.004] | 0.085 | 0.830 / 0.228 / 0.069 | 5.55 | 390 | +| components | 0.839 | 0.999 [0.995, 1.002] | 0.083 | 0.831 / 0.229 / 0.068 | 5.65 | 390 | +| structured | 0.838 | 0.999 [0.995, 1.003] | 0.090 | 0.838 / 0.231 / 0.071 | 5.73 | 390 | + +**No regression, and no gain: ~1.00×**, as expected for the launch-bound A100 (phase 3). vmap-16 +structured is 0.97× gather (0.071 vs 0.069 ms/L, a 2 µs difference). Compile +3.2 % (structured). +`all_gates_pass` is false **only** because `gates.fiducial_bit_exact` expects the CPU value `…812`: +the A100 fiducial `7.743201200876806` equals the phase-2/3 A100 rows bit for bit, and every route is +bit-identical to the control. + +### Laptop witness (not quotable) + +`solver_config_sweep_step0_laptop_cpu_fp64.json` (WSL2, commit `9f3fc61`; old instrument, so no +route-inputs column): gather 2.221 ms, components 1.555 (1.43×), structured 1.613 (1.38×), nopad 2.249 +(0.99×). vmap-16 ms/L 1.50 / 1.00 / 0.78 (structured 1.91×, components 1.50×). Containment +1.239 → 0.481 (components) / 0.600 (structured). + +### Gates (every run) + +- `gates.step0_route_bit_identity` passes for every route on laptop, EPYC and A100: stream, fiducial + and prior log L, prior and stress positions, image counts, `jax.grad` and the vmap values are + bit-identical to the control. +- Fiducial `7.743201200876812` bit-exact on both CPUs (A100: `…806`, its established value). +- Completeness: every route 200/200 prior + 200/200 stress, max position error 8.51e-4″ (unchanged + from phase 4a). +- `jax.grad` finite and non-zero on every route; the MCS patch is restored. +- Compile ≤ +5 % (gate +20 %); XLA temp memory ≤ gather's on every route (structured −47 % on CPU). + +### Verdict + +Removing the gather cuts the step-0 containment by about two thirds on CPU, with bit-identical +output. On the EPYC CPU the likelihood is 1.61× faster (1.87× under vmap-16); on the laptop it is +1.38–1.43×. It does not regress the A100. **Keep `structured` as the default:** it ties `components` +on the scalar CPU call (the laptop's 4 % edge for `components` is within WSL2 noise and does not +reproduce on RAL), wins under vmap-16 on both CPUs (1.87× / 1.91× vs 1.82× / 1.50×), and is the only +route that also cuts XLA temp memory and FLOPs. `components` stays the fallback for a lattice whose +vertex table does not follow the closed-form layout (`Step0Layout.grid is None`). The quotable 8490H +row (job 357321) is still owed before this ships. + +### Reproduce (RAL) + +```bash +# RAL worktree of feature/point-source-cpu-p4b + the PyAutoArray branch clone (see the submits' LIBRARY block) +hpc/sync submit --cpu submit_breakdown_point_source_image_solver_config_sweep_step0_ral_cpu_fp64 # quotable, 8490H +hpc/sync submit --cpu submit_breakdown_point_source_image_solver_config_sweep_step0_gpu_node_cpu_fp64 # EPYC fallback +hpc/sync submit --gpu submit_breakdown_point_source_image_solver_config_sweep_step0_a100_fp64 # A100 +``` From dbc43d5ac0222f4c678474307f155b833007edd9 Mon Sep 17 00:00:00 2001 From: Jammy2211 Date: Sun, 27 Sep 2026 15:00:16 +0100 Subject: [PATCH 08/10] =?UTF-8?q?solver=5Fconfig=5Fsweep:=20backend-aware?= =?UTF-8?q?=20fiducial=20gate=20(CPU=20=E2=80=A6812,=20A100=20=E2=80=A6806?= =?UTF-8?q?)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 --- results/notes/point_source_cpu_campaign.md | 2 +- .../likelihood_breakdown/solver_config_sweep.py | 9 +++++++-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/results/notes/point_source_cpu_campaign.md b/results/notes/point_source_cpu_campaign.md index 681a65acc..ca2dff504 100644 --- a/results/notes/point_source_cpu_campaign.md +++ b/results/notes/point_source_cpu_campaign.md @@ -1407,7 +1407,7 @@ log [`point_source_cpu_2026_09_27_ral_job_357322_step0_route_ab_a100.out`](point structured is 0.97× gather (0.071 vs 0.069 ms/L, a 2 µs difference). Compile +3.2 % (structured). `all_gates_pass` is false **only** because `gates.fiducial_bit_exact` expects the CPU value `…812`: the A100 fiducial `7.743201200876806` equals the phase-2/3 A100 rows bit for bit, and every route is -bit-identical to the control. +bit-identical to the control. The harness now expects the backend's own fiducial (`FIDUCIAL_SOLVED_LOG_L_BY_BACKEND`: CPU `…812`, GPU `…806`), so a re-run of this row reports `all_gates_pass: true`; the committed JSON predates that fix. ### Laptop witness (not quotable) diff --git a/scripts/point_source_image/likelihood_breakdown/solver_config_sweep.py b/scripts/point_source_image/likelihood_breakdown/solver_config_sweep.py index f0331869c..3e1efe95c 100644 --- a/scripts/point_source_image/likelihood_breakdown/solver_config_sweep.py +++ b/scripts/point_source_image/likelihood_breakdown/solver_config_sweep.py @@ -92,7 +92,7 @@ ----- - The control's solved log L on the prior-median vector equals the fiducial - ``7.743201200876812`` bit-exactly. + ``7.743201200876812`` bit-exactly on CPU (``7.743201200876806`` on the A100). - ``jax.grad`` of the likelihood is finite and non-zero for every admissible configuration. ``autofit.jax.register_model(model)`` is load-bearing: without it the gradient is silently all-zero. @@ -228,7 +228,12 @@ def _profiling_root() -> Path: from autofit.jax import register_model as register_model_pytrees # noqa: E402 from autolens.point.solver import shape_solver as _shape_solver # noqa: E402 -FIDUCIAL_SOLVED_LOG_L = 7.743201200876812 +# The fiducial is bit-exact per backend: the CPU value, and the value every RAL A100 fp64 row +# has reproduced (static_lattice_ab / vertex_dedup_ab / this sweep's step-0 A100 row). +FIDUCIAL_SOLVED_LOG_L_BY_BACKEND = {"cpu": 7.743201200876812, "gpu": 7.743201200876806} +FIDUCIAL_SOLVED_LOG_L = FIDUCIAL_SOLVED_LOG_L_BY_BACKEND.get( + jax.default_backend(), FIDUCIAL_SOLVED_LOG_L_BY_BACKEND["cpu"] +) PRODUCTION_PRECISION = 0.001 PRODUCTION_MCS = int(_triangles_array.MAX_CONTAINING_SIZE) ADMISSIBLE_POSITION_TOL = 0.002 From 6deb83c85671657143a0a54168b016e4a2bd8ce2 Mon Sep 17 00:00:00 2001 From: Jammy2211 Date: Sun, 27 Sep 2026 16:15:27 +0100 Subject: [PATCH 09/10] results: quotable RAL 8490H step-0 route A/B (job 357321) + ledger Phase 4b Co-Authored-By: Claude Opus 5.5 --- ...r_config_sweep_step0_hpc_ral_cpu_fp64.json | 4704 +++++++++++++++++ ...er_config_sweep_step0_hpc_ral_cpu_fp64.png | Bin 0 -> 101379 bytes ...al_job_357321_step0_route_ab_8490h_cpu.out | 80 + results/notes/point_source_cpu_campaign.md | 56 +- 4 files changed, 4826 insertions(+), 14 deletions(-) create mode 100644 results/breakdown/point_source_image/solver_config_sweep_step0_hpc_ral_cpu_fp64.json create mode 100644 results/breakdown/point_source_image/solver_config_sweep_step0_hpc_ral_cpu_fp64.png create mode 100644 results/notes/point_source_cpu_2026_09_27_ral_job_357321_step0_route_ab_8490h_cpu.out diff --git a/results/breakdown/point_source_image/solver_config_sweep_step0_hpc_ral_cpu_fp64.json b/results/breakdown/point_source_image/solver_config_sweep_step0_hpc_ral_cpu_fp64.json new file mode 100644 index 000000000..2d7764e68 --- /dev/null +++ b/results/breakdown/point_source_image/solver_config_sweep_step0_hpc_ral_cpu_fp64.json @@ -0,0 +1,4704 @@ +{ + "cell": "solver_config_sweep_step0", + "issue": "PyAutoLabs/PyAutoArray#579", + "phase": "4b", + "step0_routes": [ + "control", + "gather", + "components", + "structured" + ], + "library_step0_default": "structured", + "config_name": "hpc_ral_cpu_fp64", + "quotable": true, + "host_note": null, + "quick": false, + "library_versions": { + "autolens": "2026.8.17.1", + "autoarray": "2026.8.17.1", + "autofit": "2026.8.17.1" + }, + "package_versions": { + "jax": "0.10.2", + "jaxlib": "0.10.2" + }, + "source_revisions": { + "autolens_profiling": "311e690fd6c843fe38e5a228628b4417890694f2", + "PyAutoNerves": "eb27da2464e2f07e0ad67e7fb18ee84be76c479a", + "PyAutoFit": "5468c6cefa0ae8bb08a449497cbd3c620f3720e2", + "PyAutoArray": "c13b2d733538bec86cff3a15eccd9a0940a68463", + "PyAutoGalaxy": "879a9308b709b3705eb95904de6b349a5c034d61", + "PyAutoLens": "def4decf68a245a9c3dd1eb276ee0578897b220c" + }, + "autoarray_imported_from": "/mnt/ral/jnightin/autolens_profiling_wt/PyAutoArray_pointsolver-step0-gather", + "autolens_imported_from": "/mnt/ral/jnightin/PyAuto/PyAutoLens", + "device": { + "backend": "cpu", + "device": "cpu:0", + "hostname": "euclid-ral-compute-10-4", + "xla_flags": "--xla_disable_hlo_passes=constant_folding --xla_gpu_autotune_level=0 --xla_gpu_enable_triton_gemm=false", + "omp_num_threads": "1", + "cpu_count": 236, + "jax_compilation_cache_dir": null, + "autotune_cache_entries_at_start": 0, + "cache_fresh": false + }, + "jax_devices": [ + "cpu:0" + ], + "machine": { + "cpu_model": "Intel(R) Xeon(R) Platinum 8490H", + "cpu_count_os": 236, + "nproc": 1, + "nproc_all": 236, + "nproc_note": "GNU nproc honours OMP_NUM_THREADS, so `nproc` can print 1 on a multi-core host; `nproc_all` is the core count.", + "ram_total": "1010827848 kB", + "kernel": "5.14.0-687.50.1.el9_8.x86_64", + "platform": "Linux-5.14.0-687.50.1.el9_8.x86_64-x86_64-with-glibc2.34", + "python": "3.12.4", + "jax_thread_env": { + "NPROC": "8" + }, + "blas_thread_env": { + "OMP_NUM_THREADS": "1", + "OPENBLAS_NUM_THREADS": "1", + "MKL_NUM_THREADS": "1", + "VECLIB_MAXIMUM_THREADS": null, + "NUMEXPR_NUM_THREADS": null + }, + "thread_env_note": "NPROC sizes XLA's CPU intra-op pool (the JAX rows); the BLAS knobs pin OpenBLAS/MKL/OpenMP (the numpy/scipy rows) and do not touch JAX. Two disjoint families; both are recorded on every CPU timing.", + "gpu": null + }, + "thread_environment": { + "NPROC": "8", + "OMP_NUM_THREADS": "1", + "OPENBLAS_NUM_THREADS": "1", + "MKL_NUM_THREADS": "1" + }, + "sched_affinity": 8, + "os_cpu_count": 236, + "xla_flags": "--xla_disable_hlo_passes=constant_folding --xla_gpu_autotune_level=0 --xla_gpu_enable_triton_gemm=false", + "jax_platforms": "cpu", + "jax_enable_x64": true, + "loadavg_start": [ + 199.87, + 197.55, + 198.5 + ], + "loadavg_end": [ + 189.92, + 196.83, + 198.49 + ], + "protocol": { + "n_rounds": 20, + "n_calls_per_round": 20, + "n_warm": 3, + "n_stream": 16, + "seed": 314, + "n_prior_draws": 200, + "n_stress_draws": 200, + "step0_rounds": 10, + "vmap_batches": [ + 1, + 4, + 16 + ], + "route_order": "round-robin over every config, start rotated each round", + "cache_trap_guard": "fresh closure + fresh solver/analysis per route; jax.clear_caches()", + "bootstrap": { + "samples": 2000, + "seed": 12345, + "interval": "90%" + }, + "admissible": "100% distinct-multiplicity agreement with the reference on the prior draws AND max position error <= 0.002\"", + "admissible_position_tol": 0.002, + "position_noise_sigma": 0.05, + "distinct_tol": 0.005, + "prior_draws": "full prior: vector_from_unit_vector(U(1e-4, 1-1e-4)); source = solved beta*", + "stress_draws": "OUTSIDE the prior: Isothermal centre U(-0.05,0.05), theta_E U(1,2), ell_comps U(-0.2,0.2), source centre U(-0.4,0.4); plain FitPositionsImagePairAll positions", + "reference": { + "name": "reference", + "block": "reference", + "extent": 12.0, + "scale": 0.05, + "precision": 0.0001, + "max_containing_size": 60, + "neighbor_degree": 1, + "step0_route": null + }, + "reference_b": { + "name": "reference_b", + "block": "reference", + "extent": 11.0, + "scale": 0.07, + "precision": 0.0001, + "max_containing_size": 60, + "neighbor_degree": 1, + "step0_route": null + }, + "max_containing_size_patch": "ArrayTriangles.__init__ / for_limits_and_scale __defaults__ + module constant, tracing only, restored by value", + "pytrees": "autofit.jax.register_model(model) for both models before any trace" + }, + "configs": [ + { + "name": "control", + "block": "control", + "extent": null, + "scale": 0.2, + "precision": 0.001, + "max_containing_size": 15, + "neighbor_degree": 1, + "step0_route": null + }, + { + "name": "step0_gather", + "block": "step0_route", + "extent": null, + "scale": 0.2, + "precision": 0.001, + "max_containing_size": 15, + "neighbor_degree": 1, + "step0_route": "gather" + }, + { + "name": "step0_components", + "block": "step0_route", + "extent": null, + "scale": 0.2, + "precision": 0.001, + "max_containing_size": 15, + "neighbor_degree": 1, + "step0_route": "components" + }, + { + "name": "step0_structured", + "block": "step0_route", + "extent": null, + "scale": 0.2, + "precision": 0.001, + "max_containing_size": 15, + "neighbor_degree": 1, + "step0_route": "structured" + } + ], + "static": { + "control": { + "extent_half_width": [ + 9.9, + 9.9 + ], + "limits": [ + -9.9, + 9.9, + -9.9, + 9.9 + ], + "scale": 0.2, + "pixel_scale_precision": 0.001, + "n_steps": 8, + "n_steps_formula": "ceil(log2(0.2 / 0.001))", + "last_step_triangle_side": 0.0015625, + "step0_triangles": 23283, + "step0_rows": 11859, + "max_containing_size": 15, + "neighbor_degree": 1, + "step0_route": "library default (structured)" + }, + "step0_gather": { + "extent_half_width": [ + 9.9, + 9.9 + ], + "limits": [ + -9.9, + 9.9, + -9.9, + 9.9 + ], + "scale": 0.2, + "pixel_scale_precision": 0.001, + "n_steps": 8, + "n_steps_formula": "ceil(log2(0.2 / 0.001))", + "last_step_triangle_side": 0.0015625, + "step0_triangles": 23283, + "step0_rows": 11859, + "max_containing_size": 15, + "neighbor_degree": 1, + "step0_route": "gather" + }, + "step0_components": { + "extent_half_width": [ + 9.9, + 9.9 + ], + "limits": [ + -9.9, + 9.9, + -9.9, + 9.9 + ], + "scale": 0.2, + "pixel_scale_precision": 0.001, + "n_steps": 8, + "n_steps_formula": "ceil(log2(0.2 / 0.001))", + "last_step_triangle_side": 0.0015625, + "step0_triangles": 23283, + "step0_rows": 11859, + "max_containing_size": 15, + "neighbor_degree": 1, + "step0_route": "components" + }, + "step0_structured": { + "extent_half_width": [ + 9.9, + 9.9 + ], + "limits": [ + -9.9, + 9.9, + -9.9, + 9.9 + ], + "scale": 0.2, + "pixel_scale_precision": 0.001, + "n_steps": 8, + "n_steps_formula": "ceil(log2(0.2 / 0.001))", + "last_step_triangle_side": 0.0015625, + "step0_triangles": 23283, + "step0_rows": 11859, + "max_containing_size": 15, + "neighbor_degree": 1, + "step0_route": "structured" + }, + "reference": { + "extent_half_width": [ + 12.0, + 12.0 + ], + "limits": [ + -12.0, + 12.0, + -12.0, + 12.0 + ], + "scale": 0.05, + "pixel_scale_precision": 0.0001, + "n_steps": 9, + "n_steps_formula": "ceil(log2(0.05 / 0.0001))", + "last_step_triangle_side": 0.0001953125, + "step0_triangles": 535277, + "step0_rows": 268677, + "max_containing_size": 60, + "neighbor_degree": 1, + "step0_route": "library default (structured)" + }, + "reference_b": { + "extent_half_width": [ + 11.0, + 11.0 + ], + "limits": [ + -11.0, + 11.0, + -11.0, + 11.0 + ], + "scale": 0.07, + "pixel_scale_precision": 0.0001, + "n_steps": 10, + "n_steps_formula": "ceil(log2(0.07 / 0.0001))", + "last_step_triangle_side": 0.00013671875, + "step0_triangles": 229585, + "step0_rows": 115473, + "max_containing_size": 60, + "neighbor_degree": 1, + "step0_route": "library default (structured)" + } + }, + "reference_floor": { + "prior": { + "n_draws": 200, + "multiplicity_agreement": 1.0, + "raw_count_agreement": 1.0, + "n_multiplicity_mismatch": 0, + "mismatch_examples": [], + "max_position_error": 0.00015786921423151782, + "p99_position_error": 0.0001280749711777913, + "median_position_error": 5.9668954361473236e-05, + "ref_distinct_histogram": { + "2": 21, + "4": 179 + }, + "abs_delta_logl_vs_reference": { + "max": 0.09204751533968647, + "p99": 0.06845503627316121, + "median": 0.004628222675307825, + "n_nonfinite_mismatch": 0 + } + }, + "stress": { + "n_draws": 200, + "multiplicity_agreement": 1.0, + "raw_count_agreement": 1.0, + "n_multiplicity_mismatch": 0, + "mismatch_examples": [], + "max_position_error": 0.00015786921423129578, + "p99_position_error": 0.00014084184669768283, + "median_position_error": 5.966895436132821e-05, + "ref_distinct_histogram": { + "2": 163, + "4": 37 + } + } + }, + "reference_max_finite_positions": { + "prior": 4, + "stress": 4 + }, + "reference_compile": { + "reference_prior": { + "lower_s": 10.060315753013128, + "compile_s": 11.6538036299753, + "first_call_s": 0.03160825901431963, + "traced_rows_per_step": [ + 268677, + 2880, + 2880, + 2880, + 2880, + 2880, + 2880, + 2880, + 2880, + 268677, + 2880, + 2880, + 2880, + 2880, + 2880, + 2880, + 2880, + 2880, + 268677, + 2880, + 2880, + 2880, + 2880, + 2880, + 2880, + 2880, + 2880 + ], + "output_shapes": [ + [], + [ + 60, + 2 + ] + ], + "flops": 48502648.0, + "memory_analysis": { + "argument_size_in_bytes": 40, + "output_size_in_bytes": 984, + "temp_size_in_bytes": 17361496, + "alias_size_in_bytes": 0, + "generated_code_size_in_bytes": 0, + "host_temp_size_in_bytes": 0 + }, + "rss_delta_bytes": 449953792, + "max_containing_size_proof": { + "positions_shape": [ + 60, + 2 + ], + "expected_rows": 60, + "pass": true + } + }, + "reference_stress": { + "lower_s": 2.255625616002362, + "compile_s": 2.9262410230003297, + "first_call_s": 0.0260827970050741, + "traced_rows_per_step": [ + 268677, + 2880, + 2880, + 2880, + 2880, + 2880, + 2880, + 2880, + 2880 + ], + "output_shapes": [ + [ + 60, + 2 + ] + ], + "flops": 47671892.0, + "memory_analysis": { + "argument_size_in_bytes": 64, + "output_size_in_bytes": 960, + "temp_size_in_bytes": 17361048, + "alias_size_in_bytes": 0, + "generated_code_size_in_bytes": 0, + "host_temp_size_in_bytes": 0 + }, + "rss_delta_bytes": 7585792, + "max_containing_size_proof": { + "positions_shape": [ + 60, + 2 + ], + "expected_rows": 60, + "pass": true + } + }, + "reference_b_prior": { + "lower_s": 7.306371496990323, + "compile_s": 13.036068585002795, + "first_call_s": 0.01250081299804151, + "traced_rows_per_step": [ + 115473, + 2880, + 2880, + 2880, + 2880, + 2880, + 2880, + 2880, + 2880, + 2880, + 115473, + 2880, + 2880, + 2880, + 2880, + 2880, + 2880, + 2880, + 2880, + 2880, + 115473, + 2880, + 2880, + 2880, + 2880, + 2880, + 2880, + 2880, + 2880, + 2880 + ], + "output_shapes": [ + [], + [ + 60, + 2 + ] + ], + "flops": 23082492.0, + "memory_analysis": { + "argument_size_in_bytes": 40, + "output_size_in_bytes": 984, + "temp_size_in_bytes": 7566936, + "alias_size_in_bytes": 0, + "generated_code_size_in_bytes": 0, + "host_temp_size_in_bytes": 0 + }, + "rss_delta_bytes": 52080640, + "max_containing_size_proof": { + "positions_shape": [ + 60, + 2 + ], + "expected_rows": 60, + "pass": true + } + }, + "reference_b_stress": { + "lower_s": 1.8269656740012579, + "compile_s": 3.246219435997773, + "first_call_s": 0.010487619001651183, + "traced_rows_per_step": [ + 115473, + 2880, + 2880, + 2880, + 2880, + 2880, + 2880, + 2880, + 2880, + 2880 + ], + "output_shapes": [ + [ + 60, + 2 + ] + ], + "flops": 22251710.0, + "memory_analysis": { + "argument_size_in_bytes": 64, + "output_size_in_bytes": 960, + "temp_size_in_bytes": 7566488, + "alias_size_in_bytes": 0, + "generated_code_size_in_bytes": 0, + "host_temp_size_in_bytes": 0 + }, + "rss_delta_bytes": 2326528, + "max_containing_size_proof": { + "positions_shape": [ + 60, + 2 + ], + "expected_rows": 60, + "pass": true + } + } + }, + "default_vs_reference": { + "prior": { + "n_draws": 200, + "multiplicity_agreement": 1.0, + "raw_count_agreement": 1.0, + "n_multiplicity_mismatch": 0, + "mismatch_examples": [], + "max_position_error": 0.0008513474499103632, + "p99_position_error": 0.0007893460711577849, + "median_position_error": 0.00040657539052049436, + "ref_distinct_histogram": { + "2": 21, + "4": 179 + }, + "abs_delta_logl_vs_reference": { + "max": 0.8682473458375171, + "p99": 0.5684387609120645, + "median": 0.030920850414809298, + "n_nonfinite_mismatch": 0 + }, + "abs_delta_logl_vs_control": { + "max": 0.0, + "p99": 0.0, + "median": 0.0, + "n_nonfinite_mismatch": 0 + } + }, + "stress": { + "n_draws": 200, + "multiplicity_agreement": 1.0, + "raw_count_agreement": 1.0, + "n_multiplicity_mismatch": 0, + "mismatch_examples": [], + "max_position_error": 0.0007893460711579142, + "p99_position_error": 0.0007893460711576755, + "median_position_error": 0.0004065753905207063, + "ref_distinct_histogram": { + "2": 163, + "4": 37 + } + }, + "agrees_on_every_prior_draw": true, + "agrees_on_every_stress_draw": true, + "stress_mismatch_examples": [] + }, + "admissibility": { + "control": true, + "step0_gather": true, + "step0_components": true, + "step0_structured": true + }, + "precision_equivalent": { + "control": true, + "step0_gather": true, + "step0_components": true, + "step0_structured": true + }, + "reference_image_extent": { + "prior": { + "max_abs_y": 1.77939453125, + "max_abs_x": 1.7773254429359933, + "max_abs_coord": 1.77939453125, + "p99_abs_coord": 1.7590830914129167, + "max_radius": 1.8116226317743076 + }, + "stress": { + "max_abs_y": 2.2498046875, + "max_abs_x": 2.300267215077964, + "max_abs_coord": 2.300267215077964, + "p99_abs_coord": 2.2027852305644777, + "max_radius": 2.5191249773380773 + } + }, + "extent_working": "prior: theta_E <= 1.6 + 4*0.05 = 1.8; |e| <= 0.0526 + 4*0.01 ~ 0.09 -> q ~ 0.83; SIE images lie within ~theta_E/sqrt(q) + |beta| ~ 1.98 + 0.1 ~ 2.1 arcsec of the centre, so boxes of +-6 / +-4 / +-3 / +-2.5 bracket it; reference_image_extent is the measured value", + "best_admissible": "step0_components", + "best_admissible_any_precision": "step0_components", + "table": [ + { + "config": "control", + "block": "control", + "extent": 9.9, + "scale": 0.2, + "precision": 0.001, + "mcs": 15, + "neighbor_degree": 1, + "n_steps": 8, + "step0_rows": 11859, + "step0_triangles": 23283, + "median_ms": 1.5761569811729714, + "speedup": 1.0, + "speedup_ci90": [ + 0.988855997982134, + 1.010726696775158 + ], + "admissible": true, + "precision_equivalent": true, + "last_step_triangle_side": 0.0015625, + "prior_multiplicity_agreement": 1.0, + "prior_raw_count_agreement": 1.0, + "prior_max_err": 0.0008513474499103632, + "prior_p99_err": 0.0007893460711577849, + "prior_abs_dlogl_ref_max": 0.8682473458375171, + "prior_abs_dlogl_control_max": 0.0, + "stress_multiplicity_agreement": 1.0, + "stress_max_err": 0.0007893460711579142, + "compile_s": 5.808565878978698, + "flops": 2801341.0, + "temp_bytes": 901656 + }, + { + "config": "step0_gather", + "block": "step0_route", + "extent": 9.9, + "scale": 0.2, + "precision": 0.001, + "mcs": 15, + "neighbor_degree": 1, + "n_steps": 8, + "step0_rows": 11859, + "step0_triangles": 23283, + "median_ms": 2.260284003568813, + "speedup": 0.6973269636401186, + "speedup_ci90": [ + 0.682987842519193, + 0.7129293895293143 + ], + "admissible": true, + "precision_equivalent": true, + "last_step_triangle_side": 0.0015625, + "prior_multiplicity_agreement": 1.0, + "prior_raw_count_agreement": 1.0, + "prior_max_err": 0.0008513474499103632, + "prior_p99_err": 0.0007893460711577849, + "prior_abs_dlogl_ref_max": 0.8682473458375171, + "prior_abs_dlogl_control_max": 0.0, + "stress_multiplicity_agreement": 1.0, + "stress_max_err": 0.0007893460711579142, + "compile_s": 5.373007704998599, + "flops": 3383414.0, + "temp_bytes": 1692120 + }, + { + "config": "step0_components", + "block": "step0_route", + "extent": 9.9, + "scale": 0.2, + "precision": 0.001, + "mcs": 15, + "neighbor_degree": 1, + "n_steps": 8, + "step0_rows": 11859, + "step0_triangles": 23283, + "median_ms": 1.5498150169150904, + "speedup": 1.0169968441203485, + "speedup_ci90": [ + 0.9967895359080113, + 1.0302721082861257 + ], + "admissible": true, + "precision_equivalent": true, + "last_step_triangle_side": 0.0015625, + "prior_multiplicity_agreement": 1.0, + "prior_raw_count_agreement": 1.0, + "prior_max_err": 0.0008513474499103632, + "prior_p99_err": 0.0007893460711577849, + "prior_abs_dlogl_ref_max": 0.8682473458375171, + "prior_abs_dlogl_control_max": 0.0, + "stress_multiplicity_agreement": 1.0, + "stress_max_err": 0.0007893460711579142, + "compile_s": 5.675205477018608, + "flops": 3578378.0, + "temp_bytes": 1506264 + }, + { + "config": "step0_structured", + "block": "step0_route", + "extent": 9.9, + "scale": 0.2, + "precision": 0.001, + "mcs": 15, + "neighbor_degree": 1, + "n_steps": 8, + "step0_rows": 11859, + "step0_triangles": 23283, + "median_ms": 1.5700014919275418, + "speedup": 1.0039206900611746, + "speedup_ci90": [ + 0.9895092789636317, + 1.0199336598834796 + ], + "admissible": true, + "precision_equivalent": true, + "last_step_triangle_side": 0.0015625, + "prior_multiplicity_agreement": 1.0, + "prior_raw_count_agreement": 1.0, + "prior_max_err": 0.0008513474499103632, + "prior_p99_err": 0.0007893460711577849, + "prior_abs_dlogl_ref_max": 0.8682473458375171, + "prior_abs_dlogl_control_max": 0.0, + "stress_multiplicity_agreement": 1.0, + "stress_max_err": 0.0007893460711579142, + "compile_s": 5.827341369993519, + "flops": 2801341.0, + "temp_bytes": 901656 + } + ], + "rows": { + "control": { + "config": { + "name": "control", + "block": "control", + "extent": null, + "scale": 0.2, + "precision": 0.001, + "max_containing_size": 15, + "neighbor_degree": 1, + "step0_route": null + }, + "static": { + "extent_half_width": [ + 9.9, + 9.9 + ], + "limits": [ + -9.9, + 9.9, + -9.9, + 9.9 + ], + "scale": 0.2, + "pixel_scale_precision": 0.001, + "n_steps": 8, + "n_steps_formula": "ceil(log2(0.2 / 0.001))", + "last_step_triangle_side": 0.0015625, + "step0_triangles": 23283, + "step0_rows": 11859, + "max_containing_size": 15, + "neighbor_degree": 1, + "step0_route": "library default (structured)" + }, + "stats": { + "n": 400, + "median_ms": 1.5761569811729714, + "p10_ms": 1.318818487925455, + "p90_ms": 1.8483875959645957, + "min_ms": 1.1586030013859272, + "max_ms": 2.1496879926417023, + "mean_ms": 1.5815421168372268 + }, + "speedup_vs_control": { + "ratio": 1.0, + "ci90_low": 0.988855997982134, + "ci90_high": 1.010726696775158, + "bootstrap_samples": 2000 + }, + "paired_round_speedup": { + "median": 1.0, + "p10": 1.0, + "p90": 1.0 + }, + "compile": { + "lower_s": 2.846633198991185, + "compile_s": 5.808565878978698, + "first_call_s": 0.0027086699847131968, + "traced_rows_per_step": [ + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720, + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720 + ], + "output_shapes": [ + [] + ], + "flops": 2801341.0, + "memory_analysis": { + "argument_size_in_bytes": 40, + "output_size_in_bytes": 8, + "temp_size_in_bytes": 901656, + "alias_size_in_bytes": 0, + "generated_code_size_in_bytes": 0, + "host_temp_size_in_bytes": 0 + }, + "rss_delta_bytes": 3354624, + "max_containing_size_proof": null + }, + "warm_ms": [ + 4.48337200214155, + 1.6438009915873408, + 1.9156589987687767 + ], + "per_call_ms": [ + 1.7269959789700806, + 1.8580800096970052, + 1.4896439970470965, + 1.739761995850131, + 1.5584570064675063, + 1.5553130069747567, + 1.7558280087541789, + 1.6220499819610268, + 1.5751020109746605, + 1.5461989969480783, + 1.6397350118495524, + 1.5925189945846796, + 1.8817649979609996, + 1.5485580079257488, + 1.647039025556296, + 1.698712003417313, + 1.7156850080937147, + 1.508246990852058, + 2.013856981648132, + 1.9271970086265355, + 1.4850409934297204, + 1.6064200026448816, + 1.5391369815915823, + 1.851570006692782, + 1.8571929831523448, + 1.3193489867262542, + 1.4744730142410845, + 1.4783119841013104, + 1.6465680091641843, + 1.6482750070281327, + 1.7289730021730065, + 1.2572609994094819, + 1.5561740146949887, + 1.1701160110533237, + 1.6231040062848479, + 1.2879019777756184, + 1.5128759841900319, + 1.3644770078826696, + 1.6908689867705107, + 1.8829669861588627, + 1.5700079966336489, + 1.4584540040232241, + 1.7264420166611671, + 1.562166988151148, + 1.405526971211657, + 1.6376590065192431, + 1.394883991451934, + 1.6770020010881126, + 1.621617004275322, + 1.8174280121456832, + 1.5760889800731093, + 1.5239930071402341, + 1.6736160032451153, + 1.4038019871804863, + 1.520056976005435, + 1.3714020024053752, + 1.3950790162198246, + 1.3863710046280175, + 1.4409930154215544, + 1.4505079889204353, + 1.5039549907669425, + 1.5637009928468615, + 1.3706079917028546, + 1.7954509821720421, + 1.7043270054273307, + 1.40560299041681, + 1.5534090052824467, + 2.04867499996908, + 1.484825013903901, + 1.4791559951845556, + 1.829749991884455, + 1.519170997198671, + 1.4800179924350232, + 1.4502019912470132, + 1.653571001952514, + 1.3140439987182617, + 1.436958002159372, + 1.42605701694265, + 1.3878729951102287, + 1.3736750115640461, + 1.6091910074464977, + 1.8469939823262393, + 1.8612410058267415, + 1.6540480137337, + 1.8871540087275207, + 1.5609099937137216, + 1.8256859912071377, + 1.4756529999431223, + 1.56770899775438, + 1.4955160149838775, + 1.4397829945664853, + 1.5805680013727397, + 1.9755649846047163, + 1.656592998187989, + 1.5177119930740446, + 1.5146299847401679, + 1.9027089874725789, + 1.580582989845425, + 1.636487984796986, + 1.8657789914868772, + 1.6663620190229267, + 1.7194859974551946, + 1.7066019936464727, + 1.700052001979202, + 1.6432319825980812, + 1.5661079960409552, + 1.5653799928259104, + 1.6937669715844095, + 1.6302480071317405, + 1.5189599944278598, + 1.5952560061123222, + 1.5782889968249947, + 1.6558330098632723, + 1.7030310118570924, + 1.9521500216796994, + 1.737191982101649, + 1.635149004869163, + 1.777361991116777, + 2.1274870086926967, + 1.5862699947319925, + 1.5086130006238818, + 1.5796410152688622, + 1.379120978526771, + 1.590797008248046, + 1.4967420138418674, + 1.3748319761361927, + 1.5855919918976724, + 1.5008389891590923, + 1.7610560171306133, + 1.5067450003698468, + 1.381279987981543, + 1.7803650116547942, + 1.4867670251987875, + 1.3514700112864375, + 1.4297360030468553, + 1.35127198882401, + 1.355385989882052, + 1.352326013147831, + 1.5000819985289127, + 1.5243660018313676, + 1.8899739952757955, + 1.939343987032771, + 1.6647529846522957, + 1.6255970112979412, + 1.56198997865431, + 1.695075014140457, + 1.5740229864604771, + 1.578758005052805, + 1.6234239737968892, + 1.5685080143157393, + 1.5182280039880425, + 1.5067800122778863, + 1.873153989436105, + 1.407211006153375, + 1.5895100077614188, + 1.4992840006016195, + 1.5143180207815021, + 1.6340079891961068, + 1.8577779992483556, + 1.474244985729456, + 2.014173980569467, + 1.995942002395168, + 1.9636430079117417, + 1.8839480180758983, + 1.7822190129663795, + 1.8482659943401814, + 1.7309329996351153, + 1.996474020415917, + 1.871702988864854, + 1.6032120038289577, + 1.9092060101684183, + 1.7007850110530853, + 1.7848589923232794, + 1.7223950126208365, + 1.6769889916758984, + 1.7510559991933405, + 1.655847008805722, + 1.9456050067674369, + 1.8129160162061453, + 1.5993790002539754, + 1.5450749779120088, + 1.5643830120097846, + 1.4521100092679262, + 1.7643889877945185, + 1.3221650151535869, + 1.6067590040620416, + 1.4432909956667572, + 1.7407409904990345, + 1.7623110034037381, + 1.4041359827388078, + 1.4978050021454692, + 1.7671899986453354, + 1.4374059974215925, + 1.3370699889492244, + 1.3544389803428203, + 1.6351359954569489, + 1.2881580041721463, + 1.5784169954713434, + 1.4225529739633203, + 1.476202014600858, + 1.4891479804646224, + 1.583095989190042, + 1.3015590084251016, + 1.3567800051532686, + 1.2745080166496336, + 1.2745870044454932, + 1.6513910086359829, + 1.2585630174726248, + 1.4367680123541504, + 1.3675229856744409, + 1.2118399899918586, + 1.2589319958351552, + 1.2264719989616424, + 1.50664898683317, + 1.569015992572531, + 1.603715994860977, + 1.2940969900228083, + 1.2438289995770901, + 1.2587789969984442, + 1.2588370009325445, + 1.5415710222441703, + 1.5972419932950288, + 1.298175979172811, + 1.5786160074640065, + 1.2510159867815673, + 1.262689009308815, + 1.243176986463368, + 1.2922530004289001, + 1.2903919850941747, + 1.2655349855776876, + 1.402621011948213, + 1.1844410037156194, + 1.1586030013859272, + 1.2143710046075284, + 1.5921810118015856, + 1.622001000214368, + 1.393578015267849, + 1.5952200046740472, + 1.2557430018205196, + 1.1839260114356875, + 2.13073001941666, + 2.0505870052147657, + 1.5409990155603737, + 1.6247059975285083, + 1.471486990340054, + 1.493530988227576, + 1.493265008321032, + 1.6052430146373808, + 1.5656930045224726, + 1.8387830059509724, + 1.6778600111138076, + 1.5380209952127188, + 1.751236995914951, + 1.5587899833917618, + 1.627786026801914, + 1.4889889862388372, + 1.5579640166833997, + 1.7424150137230754, + 1.4359769993461668, + 1.5647090040147305, + 1.5651920111849904, + 1.7584640008863062, + 1.5088460058905184, + 1.6864319914020598, + 1.682823000010103, + 1.7272839904762805, + 1.5455489919986576, + 1.7000219959300011, + 1.754046999849379, + 1.6774579999037087, + 1.5345090068876743, + 1.803584978915751, + 1.534442009869963, + 1.9887480011675507, + 1.6921059868764132, + 1.6527699772268534, + 1.9023589848075062, + 1.6822050092741847, + 1.7229710065294057, + 1.8551709945313632, + 1.655241008847952, + 1.6856000002007931, + 1.8930980004370213, + 1.8413069774396718, + 1.5739210066385567, + 1.8494820105843246, + 1.520060992334038, + 1.6949900018516928, + 1.532764988951385, + 1.5611129929311574, + 1.6927790129557252, + 1.5879340062383562, + 1.6217100201174617, + 1.780268008587882, + 1.5475719992537051, + 1.766188011970371, + 1.492933020927012, + 1.603393000550568, + 1.8599310133140534, + 1.6241429839283228, + 1.7841430089902133, + 1.7600120045244694, + 1.595918001839891, + 1.6031470149755478, + 1.4903050032444298, + 1.5753330080769956, + 1.6653529892209917, + 1.308133010752499, + 1.5944170008879155, + 1.3489930133800954, + 1.5575489960610867, + 1.3354459952097386, + 1.3390860112849623, + 1.2327599979471415, + 1.6285660094581544, + 1.8743689870461822, + 1.6573689936194569, + 1.802991988370195, + 2.1496879926417023, + 1.5826859744265676, + 1.7679890152066946, + 1.5615489974152297, + 1.6181039973162115, + 1.687904994469136, + 1.3116239861119539, + 1.2692899908870459, + 1.3948619889561087, + 1.4976260135881603, + 1.417188992490992, + 1.482366002164781, + 1.2374539801385254, + 1.2620330089703202, + 1.1909629974979907, + 1.2477790005505085, + 1.1875409982167184, + 1.2216210016049445, + 1.4936169900465757, + 1.2447659973986447, + 1.2421200226526707, + 1.7495819774921983, + 1.5356040094047785, + 1.9059029873460531, + 1.5630550042260438, + 1.8131629913114011, + 1.5457300178240985, + 1.6434139979537576, + 1.7257340077776462, + 1.6509140259586275, + 1.7167409823741764, + 1.8293559842277318, + 1.584259996889159, + 1.5998579910956323, + 1.584929006639868, + 1.9558679778128862, + 1.6388060175813735, + 1.7049500020220876, + 1.6164819826371968, + 1.6966510156635195, + 1.5918090066406876, + 1.5537099970970303, + 1.6399419982917607, + 1.5183019859250635, + 1.5762249822728336, + 1.5373209898825735, + 1.538040000014007, + 1.5321160026360303, + 1.5223880182020366, + 1.7867340066004544, + 1.483252999605611, + 1.5905449981801212, + 1.4581580180674791, + 1.453210978070274, + 1.4362839865498245, + 1.4645210176240653, + 1.476489007472992, + 1.4165369793772697, + 1.6394520062021911, + 1.488629000959918, + 1.5083719918038696, + 1.4733719872310758, + 1.5903520106803626, + 1.4492009941022843, + 1.6266820020973682, + 1.4747510140296072, + 1.576881972141564, + 1.439648011000827, + 1.8275130132678896, + 1.6064639785327017, + 1.4264790224842727, + 1.4257629809435457, + 1.4987869944889098, + 1.7376159958075732, + 1.7305870132986456, + 1.890379993710667, + 1.645719981752336, + 1.6902359784580767, + 1.4637009880971164, + 1.722769986372441, + 1.3660799886565655, + 1.45960200461559 + ], + "deterministic": true, + "fiducial_log_likelihood": 7.743201200876812, + "stream_log_likelihood": [ + 7.743201200876812, + -4.1609527513907665, + 7.657972665309639, + 9.36455094905725, + 7.051561357429164, + 9.219327498422563, + 0.8907045816755463, + -34.37790701671691, + -24.578291065194456, + -0.4990240338966814, + 0.702590691739907, + 7.669569297550711, + -0.4639011650528264, + -5.412376751794213, + 5.343244353416, + -20.481275097418568 + ], + "admissible": true, + "completeness_prior": { + "n_draws": 200, + "multiplicity_agreement": 1.0, + "raw_count_agreement": 1.0, + "n_multiplicity_mismatch": 0, + "mismatch_examples": [], + "max_position_error": 0.0008513474499103632, + "p99_position_error": 0.0007893460711577849, + "median_position_error": 0.00040657539052049436, + "ref_distinct_histogram": { + "2": 21, + "4": 179 + }, + "abs_delta_logl_vs_reference": { + "max": 0.8682473458375171, + "p99": 0.5684387609120645, + "median": 0.030920850414809298, + "n_nonfinite_mismatch": 0 + }, + "abs_delta_logl_vs_control": { + "max": 0.0, + "p99": 0.0, + "median": 0.0, + "n_nonfinite_mismatch": 0 + } + }, + "completeness_stress": { + "n_draws": 200, + "multiplicity_agreement": 1.0, + "raw_count_agreement": 1.0, + "n_multiplicity_mismatch": 0, + "mismatch_examples": [], + "max_position_error": 0.0007893460711579142, + "p99_position_error": 0.0007893460711576755, + "median_position_error": 0.0004065753905207063, + "ref_distinct_histogram": { + "2": 163, + "4": 37 + } + } + }, + "step0_gather": { + "config": { + "name": "step0_gather", + "block": "step0_route", + "extent": null, + "scale": 0.2, + "precision": 0.001, + "max_containing_size": 15, + "neighbor_degree": 1, + "step0_route": "gather" + }, + "static": { + "extent_half_width": [ + 9.9, + 9.9 + ], + "limits": [ + -9.9, + 9.9, + -9.9, + 9.9 + ], + "scale": 0.2, + "pixel_scale_precision": 0.001, + "n_steps": 8, + "n_steps_formula": "ceil(log2(0.2 / 0.001))", + "last_step_triangle_side": 0.0015625, + "step0_triangles": 23283, + "step0_rows": 11859, + "max_containing_size": 15, + "neighbor_degree": 1, + "step0_route": "gather" + }, + "stats": { + "n": 400, + "median_ms": 2.260284003568813, + "p10_ms": 1.8454876000760123, + "p90_ms": 2.6572969130938873, + "min_ms": 1.5768750163260847, + "max_ms": 3.1036170257721096, + "mean_ms": 2.2473222220287425 + }, + "speedup_vs_control": { + "ratio": 0.6973269636401186, + "ci90_low": 0.682987842519193, + "ci90_high": 0.7129293895293143, + "bootstrap_samples": 2000 + }, + "paired_round_speedup": { + "median": 0.6718295154411158, + "p10": 0.6121171365402884, + "p90": 0.7958508634304995 + }, + "compile": { + "lower_s": 2.8550514060189016, + "compile_s": 5.373007704998599, + "first_call_s": 0.0035000000207219273, + "traced_rows_per_step": [ + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720, + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720 + ], + "output_shapes": [ + [] + ], + "flops": 3383414.0, + "memory_analysis": { + "argument_size_in_bytes": 40, + "output_size_in_bytes": 8, + "temp_size_in_bytes": 1692120, + "alias_size_in_bytes": 0, + "generated_code_size_in_bytes": 0, + "host_temp_size_in_bytes": 0 + }, + "rss_delta_bytes": 5861376, + "max_containing_size_proof": null + }, + "warm_ms": [ + 2.3952960036695004, + 2.2454440186265856, + 2.1826969750691205 + ], + "per_call_ms": [ + 2.8801340085919946, + 2.6572910137474537, + 2.6857930060941726, + 2.693807997275144, + 2.1018469997216016, + 2.614164986880496, + 2.6739020249806345, + 2.5881359761115164, + 2.213706000475213, + 2.5710290065035224, + 1.9449109968263656, + 2.1431230125017464, + 2.652789989951998, + 2.227482997113839, + 2.382658014539629, + 2.021288004470989, + 1.768387999618426, + 2.0552310161292553, + 2.1510990045499057, + 2.5736309762578458, + 2.3003729875199497, + 2.7001039998140186, + 2.15329002821818, + 2.490598999429494, + 2.6675270055420697, + 2.695811999728903, + 2.612687007058412, + 2.8770030185114592, + 2.6417569897603244, + 2.280326996697113, + 2.3158359981607646, + 2.3785230005159974, + 2.2926089877728373, + 2.310949988896027, + 1.7618770070839673, + 2.4267510161735117, + 1.8820049881469458, + 2.1273370075505227, + 2.404950006166473, + 1.863552985014394, + 1.9447119848337024, + 1.895168999908492, + 2.4697009939700365, + 2.5992199953179806, + 1.8483050225768238, + 2.337565994821489, + 2.353788004256785, + 1.8754230113700032, + 1.8668319971766323, + 1.9086470128968358, + 1.906124991364777, + 1.9406320061534643, + 2.3958630044944584, + 2.536534011596814, + 2.428334002615884, + 1.7771070124581456, + 1.712867000605911, + 1.9077640026807785, + 2.288220974151045, + 2.252797974506393, + 1.9883629865944386, + 1.9242289999965578, + 1.8089820223394781, + 1.830833003623411, + 1.849444000981748, + 2.261510002426803, + 1.8606280209496617, + 1.7599849961698055, + 1.7569990013726056, + 1.7503249982837588, + 1.8460999999660999, + 1.7431339947506785, + 1.8751269963104278, + 1.6935050080064684, + 1.7725990037433803, + 2.2609230072703212, + 2.2457889863289893, + 1.7799559864215553, + 2.284563990542665, + 2.3135209921747446, + 2.80094999470748, + 2.0773560099769384, + 2.126336010405794, + 1.9799399888142943, + 2.1834869985468686, + 2.5788449856918305, + 2.2083089861553162, + 2.5900060136336833, + 2.662066981429234, + 2.581537002697587, + 2.6831540162675083, + 2.2263640130404383, + 2.5952889991458505, + 3.1036170257721096, + 2.203562995418906, + 2.538405009545386, + 2.3549830075353384, + 2.5739039992913604, + 2.1992399997543544, + 2.186848985729739, + 2.672442002221942, + 2.048787981038913, + 2.4731169978622347, + 2.4926790210884064, + 2.7518300048541278, + 2.3276169958990067, + 2.7564159827306867, + 2.712924004299566, + 2.902590000303462, + 2.7775719936471432, + 2.2991290024947375, + 2.228258003015071, + 2.801961003569886, + 2.8475770086515695, + 2.881330990931019, + 2.2562449739780277, + 2.1629520051646978, + 2.220936003141105, + 2.9995439981576055, + 2.147207997040823, + 2.0044810080435127, + 2.4983049952425063, + 2.4977169814519584, + 2.439598989440128, + 2.3635170073248446, + 2.4932859814725816, + 1.8919559952337295, + 2.3124430153984576, + 1.9754120148718357, + 2.7036870014853776, + 2.4697339977137744, + 2.7967180067207664, + 1.9283420115243644, + 1.8908740021288395, + 1.9840650202240795, + 1.9361749873496592, + 2.238597982795909, + 2.466887002810836, + 2.334960998268798, + 2.3801520001143217, + 2.116938994731754, + 2.0275719871278852, + 2.0623730088118464, + 2.5773249799385667, + 2.021252003032714, + 2.489076985511929, + 2.6165320014115423, + 2.6268349902238697, + 2.0270839740987867, + 2.0720759930554777, + 2.025566005613655, + 2.6132740022148937, + 2.1253910090308636, + 2.6363689976278692, + 2.036562014836818, + 2.6103589916601777, + 2.6646720070857555, + 2.7735519979614764, + 2.827324002282694, + 2.169055020203814, + 2.957902994239703, + 2.853912999853492, + 2.0084450079593807, + 2.0117299864068627, + 2.101685997331515, + 2.1123740007169545, + 2.657959994394332, + 2.411713998299092, + 2.501198003301397, + 2.008576993830502, + 2.514027990400791, + 2.427771978545934, + 1.903062016936019, + 2.0177210099063814, + 2.347456000279635, + 2.0250939996913075, + 2.3681489983573556, + 2.0018669893033803, + 2.5255419895984232, + 1.9412510155234486, + 1.8399760010652244, + 2.4247749825008214, + 1.8651849823072553, + 1.804113999241963, + 2.27591599104926, + 2.3815430176910013, + 2.3429169959854335, + 1.7624309984967113, + 2.256114996271208, + 2.1210040140431374, + 1.5871729992795736, + 1.612168998690322, + 1.5768750163260847, + 1.6175579803530127, + 2.1187500096857548, + 2.247942000394687, + 2.266249997774139, + 2.5098499900195748, + 2.4302520032506436, + 1.8962949980050325, + 2.645050990395248, + 2.665170992258936, + 1.9941259815823287, + 1.9228910095989704, + 1.8748700094874948, + 1.858134986832738, + 2.631497016409412, + 1.9341319857630879, + 2.3756599985063076, + 2.470151986926794, + 2.426326012937352, + 2.416872011963278, + 2.2855050046928227, + 1.981329987756908, + 2.2704699949827045, + 1.91890200949274, + 1.9775400287471712, + 2.210884995292872, + 1.7303579952567816, + 1.686978997895494, + 2.553555998019874, + 2.36196699552238, + 1.8150309915654361, + 1.717203005682677, + 2.3838589841034263, + 1.6460869810543954, + 1.7022830143105239, + 1.6638219822198153, + 1.6522039950359613, + 2.4985189957078546, + 2.5524430093355477, + 2.452598011586815, + 2.5445949868299067, + 2.444451005430892, + 2.281755005242303, + 2.3842650116421282, + 1.9791210070252419, + 1.855525013525039, + 2.397398988250643, + 1.8818009993992746, + 2.573280013166368, + 2.167158992961049, + 2.0555660012178123, + 2.834230981534347, + 2.1869849879294634, + 2.0275419810786843, + 1.9004530040547252, + 1.7546100134495646, + 1.7717999871820211, + 2.188881015172228, + 1.7864959954749793, + 2.247561002150178, + 2.479538001352921, + 2.650069975061342, + 1.9844349881168455, + 1.911981002194807, + 1.9331600051373243, + 2.2768389899283648, + 1.8029840139206499, + 2.2137269843369722, + 2.743724995525554, + 2.2746750037185848, + 2.5889420066960156, + 2.1561839967034757, + 2.436832000967115, + 1.908363978145644, + 2.0659779838752, + 1.8531259847804904, + 2.3132010246627033, + 2.371546986978501, + 2.042058011284098, + 2.6289359957445413, + 2.065943001070991, + 2.1367709850892425, + 2.5970489950850606, + 2.1644289954565465, + 2.3138239921536297, + 2.003522007726133, + 1.956524996785447, + 1.8583550117909908, + 2.656257973285392, + 2.088449022267014, + 2.205615979619324, + 2.5519330229144543, + 2.845618990249932, + 2.1383990242611617, + 2.624423010274768, + 2.6150650228373706, + 2.762725984212011, + 2.6153850194532424, + 2.259644999867305, + 2.022799017140642, + 2.0029190054629, + 2.444935991661623, + 2.063455991446972, + 2.4888940097298473, + 2.506728982552886, + 2.6644949975889176, + 2.487632998963818, + 2.006797003559768, + 3.009256994118914, + 2.692109002964571, + 2.6573500072117895, + 2.566559996921569, + 2.623015985591337, + 2.4426800082437694, + 2.373933995841071, + 2.014405996305868, + 1.802838989533484, + 2.36157001927495, + 1.8228080007247627, + 1.8648520053829998, + 1.8969119992107153, + 2.3079000238794833, + 2.3198850103653967, + 1.9488840189296752, + 2.1873179939575493, + 1.7746419762261212, + 2.1939720027148724, + 2.1813669882249087, + 2.01867101714015, + 2.4236299796029925, + 2.3588589974679053, + 1.8158259917981923, + 2.7093690005131066, + 2.534412022214383, + 2.262206020532176, + 2.4554840056225657, + 2.613098011352122, + 2.3989859910216182, + 2.5520939962007105, + 2.5922280037775636, + 1.8967590003740042, + 2.324234985280782, + 1.9248189928475767, + 2.3855000035837293, + 2.381242986302823, + 2.1227480028755963, + 2.5450559915043414, + 2.5364180037286133, + 2.6449209835845977, + 2.1661199862137437, + 2.0620289724320173, + 2.3836550244595855, + 2.614021999761462, + 2.5952540163416415, + 1.9768369966186583, + 2.0138440013397485, + 1.9598710059653968, + 1.8469330098014325, + 1.8070849764626473, + 2.3684310144744813, + 1.855088019510731, + 1.8567980150692165, + 2.0658380235545337, + 1.821045996621251, + 2.2571489971596748, + 2.427654020721093, + 1.8988269730471075, + 2.18984397361055, + 2.025300986133516, + 2.0338470058050007, + 2.041494008153677, + 2.575047983555123, + 1.9096739997621626, + 2.526544005377218, + 1.9791579979937524, + 1.9872169941663742, + 2.0138949912507087, + 1.857579976785928, + 2.334947988856584, + 2.319338993402198, + 2.379959012614563, + 2.3591030039824545, + 2.4474469828419387, + 2.3917339858599007, + 2.5055309815797955, + 2.3628739872947335, + 1.8319240189157426, + 2.4341120151802897, + 2.523441013181582, + 2.549733006162569, + 2.582347020506859, + 1.9960349891334772, + 1.9222849805373698, + 2.3850229918025434, + 1.8830040062312037, + 1.8315209890715778, + 1.991867000469938, + 2.538856992032379, + 2.5978710036724806, + 2.3750569962430745, + 1.926552999066189, + 2.4697489861864597, + 2.390098001342267, + 1.9314850214868784, + 2.23449501208961, + 2.47197799035348, + 1.9075910095125437, + 1.8608719983603805 + ], + "deterministic": true, + "fiducial_log_likelihood": 7.743201200876812, + "stream_log_likelihood": [ + 7.743201200876812, + -4.1609527513907665, + 7.657972665309639, + 9.36455094905725, + 7.051561357429164, + 9.219327498422563, + 0.8907045816755463, + -34.37790701671691, + -24.578291065194456, + -0.4990240338966814, + 0.702590691739907, + 7.669569297550711, + -0.4639011650528264, + -5.412376751794213, + 5.343244353416, + -20.481275097418568 + ], + "admissible": true, + "completeness_prior": { + "n_draws": 200, + "multiplicity_agreement": 1.0, + "raw_count_agreement": 1.0, + "n_multiplicity_mismatch": 0, + "mismatch_examples": [], + "max_position_error": 0.0008513474499103632, + "p99_position_error": 0.0007893460711577849, + "median_position_error": 0.00040657539052049436, + "ref_distinct_histogram": { + "2": 21, + "4": 179 + }, + "abs_delta_logl_vs_reference": { + "max": 0.8682473458375171, + "p99": 0.5684387609120645, + "median": 0.030920850414809298, + "n_nonfinite_mismatch": 0 + }, + "abs_delta_logl_vs_control": { + "max": 0.0, + "p99": 0.0, + "median": 0.0, + "n_nonfinite_mismatch": 0 + } + }, + "completeness_stress": { + "n_draws": 200, + "multiplicity_agreement": 1.0, + "raw_count_agreement": 1.0, + "n_multiplicity_mismatch": 0, + "mismatch_examples": [], + "max_position_error": 0.0007893460711579142, + "p99_position_error": 0.0007893460711576755, + "median_position_error": 0.0004065753905207063, + "ref_distinct_histogram": { + "2": 163, + "4": 37 + } + } + }, + "step0_components": { + "config": { + "name": "step0_components", + "block": "step0_route", + "extent": null, + "scale": 0.2, + "precision": 0.001, + "max_containing_size": 15, + "neighbor_degree": 1, + "step0_route": "components" + }, + "static": { + "extent_half_width": [ + 9.9, + 9.9 + ], + "limits": [ + -9.9, + 9.9, + -9.9, + 9.9 + ], + "scale": 0.2, + "pixel_scale_precision": 0.001, + "n_steps": 8, + "n_steps_formula": "ceil(log2(0.2 / 0.001))", + "last_step_triangle_side": 0.0015625, + "step0_triangles": 23283, + "step0_rows": 11859, + "max_containing_size": 15, + "neighbor_degree": 1, + "step0_route": "components" + }, + "stats": { + "n": 400, + "median_ms": 1.5498150169150904, + "p10_ms": 1.3564564083935693, + "p90_ms": 1.802744407905266, + "min_ms": 1.1811970034614205, + "max_ms": 2.1287230192683637, + "mean_ms": 1.571446847738116 + }, + "speedup_vs_control": { + "ratio": 1.0169968441203485, + "ci90_low": 0.9967895359080113, + "ci90_high": 1.0302721082861257, + "bootstrap_samples": 2000 + }, + "paired_round_speedup": { + "median": 0.9924777587781537, + "p10": 0.8744916194630085, + "p90": 1.1252756334893796 + }, + "compile": { + "lower_s": 3.0910703249974176, + "compile_s": 5.675205477018608, + "first_call_s": 0.0028512069839052856, + "traced_rows_per_step": [ + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720, + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720 + ], + "output_shapes": [ + [] + ], + "flops": 3578378.0, + "memory_analysis": { + "argument_size_in_bytes": 40, + "output_size_in_bytes": 8, + "temp_size_in_bytes": 1506264, + "alias_size_in_bytes": 0, + "generated_code_size_in_bytes": 0, + "host_temp_size_in_bytes": 0 + }, + "rss_delta_bytes": 5419008, + "max_containing_size_proof": null + }, + "warm_ms": [ + 1.8836469971574843, + 1.6176989884115756, + 1.710023992927745 + ], + "per_call_ms": [ + 1.843616017140448, + 1.758143975166604, + 1.6554800095036626, + 1.841580990003422, + 1.8912569794338197, + 2.1287230192683637, + 1.611382991541177, + 1.4941359986551106, + 1.481170009355992, + 1.7930660105776042, + 1.7619889986235648, + 1.4412949967663735, + 1.5892140218056738, + 1.8111109966412187, + 1.7645609914325178, + 1.5586410008836538, + 1.5169359976425767, + 1.707301998976618, + 1.5229179989546537, + 1.4853150059934705, + 1.6779130091890693, + 1.9350300135556608, + 1.5194659936241806, + 1.5547259827144444, + 1.770558999851346, + 1.4771940186619759, + 1.3874459837097675, + 1.525181985925883, + 1.625839009648189, + 1.356521010166034, + 1.4989299816079438, + 1.585816004080698, + 1.6799559816718102, + 1.400873006787151, + 1.6163770051207393, + 1.4763789949938655, + 1.4274020213633776, + 1.7996859969571233, + 1.3991300074849278, + 1.5532879915554076, + 1.6640019894111902, + 1.449705014238134, + 1.420216984115541, + 1.6242809942923486, + 1.7222379974555224, + 1.3808989897370338, + 1.3898059842176735, + 1.496636978117749, + 1.9220620160922408, + 1.343437994364649, + 1.5514159749727696, + 1.2233160086907446, + 1.355874992441386, + 1.311596017330885, + 1.265864004381001, + 1.3367990031838417, + 1.3934540038462728, + 1.4399620122276247, + 1.3308920024428517, + 1.26496099983342, + 1.7117480165325105, + 1.6242080018855631, + 1.6752420051489025, + 1.4701850013807416, + 1.3330090150702745, + 1.4631570084020495, + 1.3426160148810595, + 1.55570000060834, + 1.3662859855685383, + 1.421046006726101, + 1.3132689928170294, + 1.4016900095157325, + 1.3703610165975988, + 1.3895889860577881, + 1.4544159930665046, + 1.5372560010291636, + 1.559441996505484, + 1.4468829904217273, + 1.6609369777143002, + 1.6490239941049367, + 1.8417379760649055, + 1.8434820231050253, + 1.755865989252925, + 1.8529010121710598, + 1.7966160085052252, + 1.4943970018066466, + 1.8074639956466854, + 1.5431060164701194, + 1.5913200040813535, + 1.5180070186033845, + 1.5793409838806838, + 1.6948010015767068, + 1.4790089917369187, + 1.5125189966056496, + 1.856388000305742, + 1.615561021026224, + 1.7141069984063506, + 1.7098640091717243, + 1.6753930249251425, + 1.722358982078731, + 1.7886270070448518, + 1.7714529822114855, + 1.831013010814786, + 1.7904740234371275, + 2.0084140123799443, + 1.627338002435863, + 1.6028360114432871, + 1.6642689879518002, + 1.7631149967201054, + 1.7586550093255937, + 1.603798009455204, + 1.5248200215864927, + 1.6501459758728743, + 1.5680920041631907, + 1.5416269889101386, + 1.6168300062417984, + 1.7308169917669147, + 1.4995929959695786, + 1.6390630044043064, + 1.4186979969963431, + 1.6227449814323336, + 1.8171969859395176, + 1.688315998762846, + 1.6542639932595193, + 1.6250639746431261, + 1.742411986924708, + 1.4740929764229804, + 1.6112829907797277, + 1.750605006236583, + 1.5820409753359854, + 1.5496750129386783, + 1.4541689888574183, + 1.37572200037539, + 1.5870399947743863, + 1.555066992295906, + 1.904208998894319, + 1.4229840016923845, + 1.3726369943469763, + 1.3802949979435652, + 1.3596790086012334, + 1.990909018786624, + 1.848532003350556, + 2.0247929787728935, + 1.763412990840152, + 1.8965830095112324, + 1.643853000132367, + 1.8314179906155914, + 1.8169789982493967, + 1.7028760048560798, + 1.6221550176851451, + 1.813893992220983, + 1.7953909991774708, + 2.1073929965496063, + 1.7993010114878416, + 1.6559469804633409, + 1.7172899970319122, + 1.9478409958537668, + 1.7202349845319986, + 1.7475890053901821, + 1.860302989371121, + 1.8401090055704117, + 1.7361100181005895, + 1.7653020040597767, + 1.7477040237281471, + 1.7184989992529154, + 1.5641689824406058, + 1.4765579835511744, + 1.4695419813506305, + 1.5267159906215966, + 1.7806280229706317, + 1.8590980034787208, + 1.4725660148542374, + 1.3657810050062835, + 1.3249510084278882, + 1.3258219987619668, + 1.4835690089967102, + 1.3714469969272614, + 1.4531239867210388, + 1.5326800057664514, + 1.3193080085329711, + 1.477866986533627, + 1.6496730095241219, + 1.4460360107477754, + 1.5249010175466537, + 1.6921079950407147, + 1.364399999147281, + 1.4776670141145587, + 1.450223004212603, + 1.3340000004973263, + 1.672134007094428, + 1.6488809778820723, + 1.4923959970474243, + 1.9800180161837488, + 1.3660900003742427, + 1.3373910041991621, + 1.6168739821296185, + 1.4553719956893474, + 1.7574029916431755, + 1.588183018611744, + 1.5256320184562355, + 1.6371379897464067, + 1.5828689793124795, + 1.5589020040351897, + 1.743692992022261, + 1.6029870021156967, + 1.522929989732802, + 1.3735289976466447, + 1.3889640104025602, + 1.6314410022459924, + 1.4835699985269457, + 1.3571569870691746, + 1.519430981716141, + 1.1811970034614205, + 1.4654470141977072, + 1.5482510207220912, + 1.424150017555803, + 1.3157360081095248, + 1.3271930220071226, + 1.6405470087192953, + 1.5835700032766908, + 1.7849199939519167, + 1.8375399813521653, + 1.4196439879015088, + 1.4373480225913227, + 1.4948459865991026, + 1.5808720199856907, + 1.4554719964507967, + 1.4339729968924075, + 1.414534985087812, + 1.6418960003647953, + 1.675164996413514, + 1.363234012387693, + 1.4693379926029593, + 1.5311499882955104, + 1.731590018607676, + 1.3128650025464594, + 1.5460480062756687, + 1.6461749910376966, + 1.5364830032922328, + 1.6105030081234872, + 1.7376400064677, + 1.4947559975553304, + 1.3721949944738299, + 1.3016049924772233, + 1.4874229964334518, + 1.515721989562735, + 1.209021982504055, + 1.4646199997514486, + 1.3472189893946052, + 1.534526003524661, + 1.4165549946483225, + 1.577296992763877, + 1.686632982455194, + 1.4680330059491098, + 1.6197730146814138, + 1.4958870015107095, + 1.67740901815705, + 1.4618979766964912, + 1.448350987629965, + 1.3769819925073534, + 1.523685990832746, + 1.6405920032411814, + 1.5845579910092056, + 1.4721239858772606, + 1.59841199638322, + 1.4334300067275763, + 1.6724109882488847, + 1.6463090141769499, + 1.5034700045362115, + 1.8419599800836295, + 1.6025989898480475, + 1.5941380115691572, + 1.7133340006694198, + 1.5151449770200998, + 1.7015459889080375, + 1.7193790117744356, + 1.3734489912167192, + 1.3518560153897852, + 1.320679992204532, + 1.327406003838405, + 1.5499550208915025, + 1.9080629863310605, + 1.7474659834988415, + 1.7281350155826658, + 1.4500670076813549, + 1.4862859970889986, + 1.7852179880719632, + 1.9466930243652314, + 1.6416349972132593, + 1.4550299965776503, + 1.6400369931943715, + 1.6890099796000868, + 1.532124006189406, + 1.5389219915959984, + 1.6364610055461526, + 1.67576500098221, + 1.7352360009681433, + 1.6966050025075674, + 1.4561599818989635, + 1.5409720072057098, + 1.5569029783364385, + 1.5027070185169578, + 1.4160050195641816, + 1.4916920044925064, + 1.6779290162958205, + 1.344188000075519, + 1.5325220010709018, + 1.601071999175474, + 1.3187199947424233, + 1.5107560029719025, + 1.4163920131977648, + 1.3676059897989035, + 1.4231399982236326, + 1.400531007675454, + 1.5342340047936887, + 1.3290120114106685, + 1.4999110135249794, + 1.3341539888642728, + 1.4104089932516217, + 1.4022380055394024, + 1.4512579946313053, + 1.621998002519831, + 1.4532210188917816, + 1.53510898235254, + 1.5393570065498352, + 1.6164530243258923, + 1.4259640011005104, + 1.4765940140932798, + 1.6674780054017901, + 1.7098580137826502, + 1.3046000094618648, + 1.3706229801755399, + 1.2453359959181398, + 1.2423880107235163, + 1.193217991385609, + 1.3780820008832961, + 1.400966983055696, + 1.4189850189723074, + 1.3879349862691015, + 1.3258709805086255, + 1.758519996656105, + 1.7916950164362788, + 1.3958060008008033, + 1.4520699915010482, + 1.4018609945196658, + 1.7548729956615716, + 1.5550499956589192, + 1.3411330000963062, + 1.4248660008888692, + 1.4860800001770258, + 1.5430319763254374, + 1.4106629823800176, + 1.2764620187226683, + 1.3725629833061248, + 1.3366079947445542, + 1.5390070038847625, + 1.3873300049453974, + 1.3948930136393756, + 1.4607580087613314, + 1.6210780013352633, + 2.0986739837098867, + 1.7872690223157406, + 1.7443499818909913, + 1.8243500089738518, + 1.9861460023093969, + 1.7719820025376976, + 1.8283840036019683, + 1.7202140006702393, + 1.6568230057600886, + 1.7126200255006552, + 1.6125199908856302, + 1.5568119997624308, + 1.643548021093011, + 1.5257409831974655, + 1.650207006605342, + 1.507125998614356, + 1.5217940090224147, + 1.5208710101433098, + 1.4810150023549795, + 1.548825006466359, + 1.8022200092673302, + 1.7009979928843677, + 1.740509003866464, + 1.6915750165935606, + 1.6925150121096522, + 1.8144940258935094, + 1.534078997792676, + 1.6639030072838068, + 1.7108229803852737, + 1.498240017099306, + 1.6070459969341755, + 1.6512300062458962, + 1.465291017666459, + 1.4188249770086259, + 1.2301070091780275, + 1.8361850234214216, + 1.6136640042532235, + 1.3219240063335747, + 1.870103005785495, + 1.603727985639125 + ], + "deterministic": true, + "fiducial_log_likelihood": 7.743201200876812, + "stream_log_likelihood": [ + 7.743201200876812, + -4.1609527513907665, + 7.657972665309639, + 9.36455094905725, + 7.051561357429164, + 9.219327498422563, + 0.8907045816755463, + -34.37790701671691, + -24.578291065194456, + -0.4990240338966814, + 0.702590691739907, + 7.669569297550711, + -0.4639011650528264, + -5.412376751794213, + 5.343244353416, + -20.481275097418568 + ], + "admissible": true, + "completeness_prior": { + "n_draws": 200, + "multiplicity_agreement": 1.0, + "raw_count_agreement": 1.0, + "n_multiplicity_mismatch": 0, + "mismatch_examples": [], + "max_position_error": 0.0008513474499103632, + "p99_position_error": 0.0007893460711577849, + "median_position_error": 0.00040657539052049436, + "ref_distinct_histogram": { + "2": 21, + "4": 179 + }, + "abs_delta_logl_vs_reference": { + "max": 0.8682473458375171, + "p99": 0.5684387609120645, + "median": 0.030920850414809298, + "n_nonfinite_mismatch": 0 + }, + "abs_delta_logl_vs_control": { + "max": 0.0, + "p99": 0.0, + "median": 0.0, + "n_nonfinite_mismatch": 0 + } + }, + "completeness_stress": { + "n_draws": 200, + "multiplicity_agreement": 1.0, + "raw_count_agreement": 1.0, + "n_multiplicity_mismatch": 0, + "mismatch_examples": [], + "max_position_error": 0.0007893460711579142, + "p99_position_error": 0.0007893460711576755, + "median_position_error": 0.0004065753905207063, + "ref_distinct_histogram": { + "2": 163, + "4": 37 + } + } + }, + "step0_structured": { + "config": { + "name": "step0_structured", + "block": "step0_route", + "extent": null, + "scale": 0.2, + "precision": 0.001, + "max_containing_size": 15, + "neighbor_degree": 1, + "step0_route": "structured" + }, + "static": { + "extent_half_width": [ + 9.9, + 9.9 + ], + "limits": [ + -9.9, + 9.9, + -9.9, + 9.9 + ], + "scale": 0.2, + "pixel_scale_precision": 0.001, + "n_steps": 8, + "n_steps_formula": "ceil(log2(0.2 / 0.001))", + "last_step_triangle_side": 0.0015625, + "step0_triangles": 23283, + "step0_rows": 11859, + "max_containing_size": 15, + "neighbor_degree": 1, + "step0_route": "structured" + }, + "stats": { + "n": 400, + "median_ms": 1.5700014919275418, + "p10_ms": 1.340503100072965, + "p90_ms": 1.8187419918831438, + "min_ms": 1.1776300088968128, + "max_ms": 2.1593729907181114, + "mean_ms": 1.5806376255932264 + }, + "speedup_vs_control": { + "ratio": 1.0039206900611746, + "ci90_low": 0.9895092789636317, + "ci90_high": 1.0199336598834796, + "bootstrap_samples": 2000 + }, + "paired_round_speedup": { + "median": 0.9917862251963093, + "p10": 0.9143112492512608, + "p90": 1.0973705953839423 + }, + "compile": { + "lower_s": 2.866035326005658, + "compile_s": 5.827341369993519, + "first_call_s": 0.0032545400026720017, + "traced_rows_per_step": [ + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720, + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720 + ], + "output_shapes": [ + [] + ], + "flops": 2801341.0, + "memory_analysis": { + "argument_size_in_bytes": 40, + "output_size_in_bytes": 8, + "temp_size_in_bytes": 901656, + "alias_size_in_bytes": 0, + "generated_code_size_in_bytes": 0, + "host_temp_size_in_bytes": 0 + }, + "rss_delta_bytes": 2691072, + "max_containing_size_proof": null + }, + "warm_ms": [ + 1.6213580092880875, + 1.715774997137487, + 1.5008310147095472 + ], + "per_call_ms": [ + 1.7119469994213432, + 1.805645995773375, + 2.1593729907181114, + 1.5416360110975802, + 1.7167229962069541, + 1.6977979976218194, + 1.5407989849336445, + 1.8465460161678493, + 1.7216569976881146, + 1.581332995556295, + 1.6179320227820426, + 1.4914710191078484, + 1.69321900466457, + 1.8185669905506074, + 1.882139011286199, + 1.7233469989150763, + 1.8909659993369132, + 1.686752977548167, + 1.546098996186629, + 1.6876389854587615, + 1.5005769964773208, + 1.418576022842899, + 1.9596370111685246, + 1.8445540044922382, + 1.4866989804431796, + 1.7815399914979935, + 1.3847330119460821, + 1.6753560048528016, + 1.3771899975836277, + 1.5009880007710308, + 1.6039940237533301, + 1.3486779935192317, + 1.3408550003077835, + 1.368097000522539, + 1.4725999790243804, + 1.5758509980514646, + 1.5121489996090531, + 1.5235449827741832, + 1.2799439718946815, + 1.4582810108549893, + 1.5446619945578277, + 1.5244889946188778, + 1.4454600168392062, + 1.741788990329951, + 1.7157690017484128, + 1.3805370253976434, + 1.5637380129192024, + 1.7044779960997403, + 1.7535559891257435, + 1.677071995800361, + 1.4690120005980134, + 1.6579829971306026, + 1.5154510037973523, + 1.7854110046755522, + 1.6698469989933074, + 1.4439560181926936, + 1.3806789938826114, + 1.5179140027612448, + 1.4724320208188146, + 1.3992539898026735, + 1.4476820069830865, + 1.4737729798071086, + 1.478924008551985, + 1.3656489900313318, + 1.3835710124112666, + 1.3521630025934428, + 1.207007997436449, + 1.3624920102301985, + 1.45851299748756, + 1.2934710248373449, + 1.5201960050035268, + 1.5799310058355331, + 1.5291160088963807, + 1.5827410097699612, + 1.4430549927055836, + 1.3916660100221634, + 1.7637040000408888, + 1.4038429944775999, + 1.692356978310272, + 1.4904479903634638, + 1.7835789767559618, + 1.87686100252904, + 1.8444080196786672, + 1.7705849895719439, + 1.5823709836695343, + 2.0793849835172296, + 1.6570209991186857, + 1.9749809871427715, + 1.872220978839323, + 1.7017190111801028, + 1.765102002536878, + 1.495511009125039, + 1.6548490093555301, + 1.8242020159959793, + 2.0444980182219297, + 1.7978770192712545, + 1.4928329910617322, + 1.667793985689059, + 1.7311509873252362, + 1.6152850002981722, + 1.893373002531007, + 1.5592709823977202, + 1.7946430016309023, + 1.4868549769744277, + 1.5641009958926588, + 1.9345280015841126, + 1.547224004752934, + 1.5326489810831845, + 1.4650610100943595, + 1.6247929888777435, + 1.5048639907035977, + 1.5624779916834086, + 1.4836860063951463, + 1.4591779909096658, + 1.9194099877495319, + 1.6216929943766445, + 1.5982970071490854, + 1.5381359844468534, + 1.6117240011226386, + 1.9260139961261302, + 1.562286022817716, + 1.5725299890618771, + 1.4685420028399676, + 1.535639021312818, + 1.4731750125065446, + 1.4695540012326092, + 1.4853379980195314, + 1.4246109931264073, + 1.6025640070438385, + 1.7844469984993339, + 1.536021998617798, + 1.5331890026573092, + 1.4388489944394678, + 1.6118819767143577, + 1.6337739943992347, + 1.5485610056202859, + 1.4640139997936785, + 1.7062080150935799, + 1.4419440121855587, + 1.630988990655169, + 1.580662006745115, + 1.5455180255230516, + 1.5987819933798164, + 1.6660890250932425, + 1.5323099796660244, + 1.5225440147332847, + 1.5043460007291287, + 1.6545680118724704, + 1.486174005549401, + 1.664034993154928, + 1.486391993239522, + 1.594276021933183, + 1.4040540263522416, + 1.629320002393797, + 1.6517250041943043, + 1.4857710048090667, + 1.7759540060069412, + 1.5342090046033263, + 1.4467319997493178, + 1.8264480167999864, + 1.5972460096236318, + 1.6450810071546584, + 1.3561210071202368, + 1.769478985806927, + 1.6240209806710482, + 1.3974090106785297, + 1.4901259855832905, + 1.496033015428111, + 1.4188789937179536, + 1.61727998056449, + 1.3809390075039119, + 1.419503998477012, + 1.7641960002947599, + 1.5117150032892823, + 1.298702001804486, + 1.7278190061915666, + 1.337335997959599, + 1.559336989885196, + 1.6912620048969984, + 1.5397719980683178, + 1.7697760195005685, + 1.6018270107451826, + 1.589752995641902, + 1.5584449865855277, + 1.4264649944379926, + 1.643322000745684, + 1.2785659928340465, + 1.5426260069943964, + 1.289372012251988, + 1.850587985245511, + 1.345709984889254, + 1.4218930155038834, + 1.576290000230074, + 1.5760560054332018, + 1.5293420001398772, + 1.8293419852852821, + 1.5760530077386647, + 1.886682992335409, + 1.7386749968864024, + 1.6427960072178394, + 1.544647995615378, + 1.9223630079068244, + 1.3492389989551157, + 1.8378109962213784, + 1.442947017494589, + 1.5817389939911664, + 1.5877479745540768, + 1.7545009905006737, + 1.4973120123613626, + 1.3951789878774434, + 1.3535100151784718, + 1.680815010331571, + 1.5378209936898202, + 1.3415830035228282, + 1.2265710101928562, + 1.2495990085881203, + 1.2994330027140677, + 1.2212719884701073, + 1.1776300088968128, + 1.266311010112986, + 1.7951620102394372, + 1.6488470137119293, + 1.3372120156418532, + 1.4582489966414869, + 1.261412020539865, + 1.4244829944800586, + 1.2668179988395423, + 1.8340660026296973, + 1.2874500243924558, + 1.1987769976258278, + 1.2590120022650808, + 1.322324009379372, + 1.2436230026651174, + 1.2436260003596544, + 1.2900250148959458, + 1.2373010104056448, + 1.3330339861568063, + 1.2134870048612356, + 1.2390479969326407, + 1.21748200035654, + 2.0329590188339353, + 2.063699997961521, + 1.7785450036171824, + 2.0293479901738465, + 1.665413990849629, + 1.548305997857824, + 1.6416490252595395, + 1.5035539981909096, + 1.9149430154357105, + 1.536239986307919, + 2.0732000120915473, + 1.657311018789187, + 2.054154989309609, + 1.7046399880200624, + 1.6317720001097769, + 2.01532497885637, + 1.437475992133841, + 1.727777998894453, + 1.424777990905568, + 1.8034590175375342, + 1.4933710044715554, + 1.6870200051926076, + 1.5397630049847066, + 1.3805650232825428, + 1.6430789837613702, + 1.9820339803118259, + 1.55508000170812, + 1.486250985180959, + 1.405802002409473, + 1.3840189785696566, + 1.612803025636822, + 1.4277470181696117, + 1.4536959934048355, + 1.3696220121346414, + 1.9449969986453652, + 1.6735109966248274, + 1.6173039912246168, + 1.5402160061057657, + 1.6537840128876269, + 1.6609769954811782, + 1.4975380036048591, + 1.7196550033986568, + 1.4092790079303086, + 1.4435280172619969, + 1.442009990569204, + 1.3247629976831377, + 1.316643989412114, + 1.319411996519193, + 1.2854450033046305, + 1.3085469836369157, + 1.648222008952871, + 1.3208859891165048, + 1.325425022514537, + 1.5355309878941625, + 1.786658016499132, + 1.512516988441348, + 1.3151029997970909, + 1.2814170040655881, + 1.4765450032427907, + 1.4958340034354478, + 1.6959999920800328, + 1.5671340224798769, + 1.9205179996788502, + 1.6588960133958608, + 1.6603220137767494, + 1.6792420065030456, + 1.5938800061121583, + 1.6189040034078062, + 1.507278997451067, + 1.53545499779284, + 1.7797259788494557, + 1.5774569765198976, + 1.6552739834878594, + 1.7087929882109165, + 1.526520005427301, + 1.954292005393654, + 1.5902510203886777, + 1.74219100154005, + 1.8203170038759708, + 1.8183270003646612, + 1.834191003581509, + 1.608272985322401, + 1.472308998927474, + 1.7444289987906814, + 1.7177170084323734, + 1.540383993415162, + 1.5876069955993444, + 1.408217998687178, + 1.7549270123708993, + 1.6686140152160078, + 1.5809280157554895, + 1.6701759886927903, + 1.484000007621944, + 1.6378219879698008, + 1.4481249963864684, + 1.479258993640542, + 1.6225040017161518, + 1.6470019763801247, + 1.9974470196757466, + 1.5674729947932065, + 1.7823489906731993, + 1.7236539861187339, + 1.694713020697236, + 1.386322983307764, + 1.634479995118454, + 1.7182549927383661, + 1.5435529930982739, + 1.7366899992339313, + 1.4217970019672066, + 1.5035090036690235, + 1.8045030010398477, + 1.811430003726855, + 1.4491659821942449, + 1.6378129948861897, + 1.4735099975951016, + 1.4807650004513562, + 1.6088629781734198, + 1.714211015496403, + 1.4600570139009506, + 1.7349929839838296, + 1.7162050062324852, + 1.6754420066718012, + 1.6971489822026342, + 1.6779050056356937, + 1.5865799796301872, + 1.5534789999946952, + 1.8323310068808496, + 1.586989004863426, + 1.6526830149814487, + 1.548271015053615, + 1.648265984840691, + 1.6510449931956828, + 1.8146660004276782, + 1.3638609962072223, + 1.518297998700291, + 1.5286380075849593, + 1.8043600139208138, + 1.5551639953628182, + 1.6744219756219536, + 1.4856799971312284, + 1.7004800029098988, + 1.4532360073644668, + 1.6524649981874973, + 1.6014980210456997, + 1.9189330050721765, + 1.500334998127073, + 1.6080439963843673, + 1.2919850123580545, + 1.5920799924060702, + 1.63929199334234, + 1.587612001458183, + 1.2922220048494637, + 1.6156830242834985, + 1.5182769857347012, + 1.3008920068386942, + 1.5489020152017474, + 1.7063449777197093, + 1.3566479901783168, + 1.7735410074237734, + 1.6724060114938766 + ], + "deterministic": true, + "fiducial_log_likelihood": 7.743201200876812, + "stream_log_likelihood": [ + 7.743201200876812, + -4.1609527513907665, + 7.657972665309639, + 9.36455094905725, + 7.051561357429164, + 9.219327498422563, + 0.8907045816755463, + -34.37790701671691, + -24.578291065194456, + -0.4990240338966814, + 0.702590691739907, + 7.669569297550711, + -0.4639011650528264, + -5.412376751794213, + 5.343244353416, + -20.481275097418568 + ], + "admissible": true, + "completeness_prior": { + "n_draws": 200, + "multiplicity_agreement": 1.0, + "raw_count_agreement": 1.0, + "n_multiplicity_mismatch": 0, + "mismatch_examples": [], + "max_position_error": 0.0008513474499103632, + "p99_position_error": 0.0007893460711577849, + "median_position_error": 0.00040657539052049436, + "ref_distinct_histogram": { + "2": 21, + "4": 179 + }, + "abs_delta_logl_vs_reference": { + "max": 0.8682473458375171, + "p99": 0.5684387609120645, + "median": 0.030920850414809298, + "n_nonfinite_mismatch": 0 + }, + "abs_delta_logl_vs_control": { + "max": 0.0, + "p99": 0.0, + "median": 0.0, + "n_nonfinite_mismatch": 0 + } + }, + "completeness_stress": { + "n_draws": 200, + "multiplicity_agreement": 1.0, + "raw_count_agreement": 1.0, + "n_multiplicity_mismatch": 0, + "mismatch_examples": [], + "max_position_error": 0.0007893460711579142, + "p99_position_error": 0.0007893460711576755, + "median_position_error": 0.0004065753905207063, + "ref_distinct_histogram": { + "2": 163, + "4": 37 + } + } + } + }, + "vmap": { + "best": "step0_components", + "routes": [ + "control", + "step0_gather", + "step0_components", + "step0_structured" + ], + "batches": [ + 1, + 4, + 16 + ], + "rows": { + "control_vmap1": { + "config": "control", + "batch": 1, + "stats_per_batch": { + "n": 400, + "median_ms": 1.6537249903194606, + "p10_ms": 1.415033804369159, + "p90_ms": 1.9635460164863616, + "min_ms": 1.200252998387441, + "max_ms": 2.6344780053477734, + "mean_ms": 1.67508249032835 + }, + "median_ms_per_likelihood": 1.6537249903194606, + "compile": { + "lower_s": 3.9983445100078825, + "compile_s": 6.780635496979812, + "first_call_s": 0.0027850240003317595, + "traced_rows_per_step": [ + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720, + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720 + ], + "output_shapes": [ + [ + 1 + ] + ], + "flops": 2813353.0, + "memory_analysis": { + "argument_size_in_bytes": 40, + "output_size_in_bytes": 8, + "temp_size_in_bytes": 901720, + "alias_size_in_bytes": 0, + "generated_code_size_in_bytes": 0, + "host_temp_size_in_bytes": 0 + }, + "rss_delta_bytes": 2007040, + "max_containing_size_proof": null + }, + "values_first_batch": [ + 7.743201200876812 + ], + "max_abs_delta_vs_scalar": 0.0 + }, + "control_vmap4": { + "config": "control", + "batch": 4, + "stats_per_batch": { + "n": 400, + "median_ms": 4.493503496632911, + "p10_ms": 3.9209980895975605, + "p90_ms": 5.10110039904248, + "min_ms": 3.5157930105924606, + "max_ms": 5.977388005703688, + "mean_ms": 4.499601094430545 + }, + "median_ms_per_likelihood": 1.1233758741582278, + "compile": { + "lower_s": 3.8306348720216192, + "compile_s": 7.261267861002125, + "first_call_s": 0.005608594976365566, + "traced_rows_per_step": [ + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720, + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720 + ], + "output_shapes": [ + [ + 4 + ] + ], + "flops": 10339222.0, + "memory_analysis": { + "argument_size_in_bytes": 160, + "output_size_in_bytes": 32, + "temp_size_in_bytes": 3200344, + "alias_size_in_bytes": 0, + "generated_code_size_in_bytes": 0, + "host_temp_size_in_bytes": 0 + }, + "rss_delta_bytes": 2215936, + "max_containing_size_proof": null + }, + "values_first_batch": [ + 7.743201200876812, + -4.1609527513907665, + 7.657972665309639, + 9.36455094905725 + ], + "max_abs_delta_vs_scalar": 0.0 + }, + "control_vmap16": { + "config": "control", + "batch": 16, + "stats_per_batch": { + "n": 400, + "median_ms": 13.668058993062004, + "p10_ms": 11.55362460121978, + "p90_ms": 15.671745783765802, + "min_ms": 10.465741012012586, + "max_ms": 17.893028998514637, + "mean_ms": 13.744311650298187 + }, + "median_ms_per_likelihood": 0.8542536870663753, + "compile": { + "lower_s": 4.087186181015568, + "compile_s": 7.24898572001257, + "first_call_s": 0.016030022001359612, + "traced_rows_per_step": [ + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720, + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720 + ], + "output_shapes": [ + [ + 16 + ] + ], + "flops": 40452632.0, + "memory_analysis": { + "argument_size_in_bytes": 640, + "output_size_in_bytes": 128, + "temp_size_in_bytes": 12396824, + "alias_size_in_bytes": 0, + "generated_code_size_in_bytes": 0, + "host_temp_size_in_bytes": 0 + }, + "rss_delta_bytes": 2453504, + "max_containing_size_proof": null + }, + "values_first_batch": [ + 7.743201200876812, + -4.1609527513907665, + 7.657972665309639, + 9.36455094905725, + 7.051561357429164, + 9.219327498422563, + 0.8907045816755463, + -34.37790701671691, + -24.578291065194456, + -0.4990240338966814, + 0.702590691739907, + 7.669569297550711, + -0.4639011650528264, + -5.412376751794213, + 5.343244353416, + -20.481275097418568 + ], + "max_abs_delta_vs_scalar": 0.0 + }, + "step0_gather_vmap1": { + "config": "step0_gather", + "batch": 1, + "stats_per_batch": { + "n": 400, + "median_ms": 2.270635508466512, + "p10_ms": 1.8900502152973786, + "p90_ms": 2.6790661009727046, + "min_ms": 1.661599992075935, + "max_ms": 3.794482006924227, + "mean_ms": 2.281748120149132 + }, + "median_ms_per_likelihood": 2.270635508466512, + "compile": { + "lower_s": 3.8397945670003537, + "compile_s": 6.668063738005003, + "first_call_s": 0.0030037440010346472, + "traced_rows_per_step": [ + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720, + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720 + ], + "output_shapes": [ + [ + 1 + ] + ], + "flops": 3395426.0, + "memory_analysis": { + "argument_size_in_bytes": 40, + "output_size_in_bytes": 8, + "temp_size_in_bytes": 1692184, + "alias_size_in_bytes": 0, + "generated_code_size_in_bytes": 0, + "host_temp_size_in_bytes": 0 + }, + "rss_delta_bytes": 33333248, + "max_containing_size_proof": null + }, + "values_first_batch": [ + 7.743201200876812 + ], + "speedup_vs_control_same_batch": { + "ratio": 0.7283093143541626, + "ci90_low": 0.7133537946636633, + "ci90_high": 0.7492599286280193, + "bootstrap_samples": 2000 + }, + "max_abs_delta_vs_scalar": 0.0 + }, + "step0_gather_vmap4": { + "config": "step0_gather", + "batch": 4, + "stats_per_batch": { + "n": 400, + "median_ms": 6.508833990665153, + "p10_ms": 5.556090403115377, + "p90_ms": 7.587823897483759, + "min_ms": 5.03095900057815, + "max_ms": 15.422864991705865, + "mean_ms": 6.5497905479423935 + }, + "median_ms_per_likelihood": 1.6272084976662882, + "compile": { + "lower_s": 3.782511497003725, + "compile_s": 6.969669679005165, + "first_call_s": 0.006984573003137484, + "traced_rows_per_step": [ + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720, + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720 + ], + "output_shapes": [ + [ + 4 + ] + ], + "flops": 11829332.0, + "memory_analysis": { + "argument_size_in_bytes": 160, + "output_size_in_bytes": 32, + "temp_size_in_bytes": 6763032, + "alias_size_in_bytes": 0, + "generated_code_size_in_bytes": 0, + "host_temp_size_in_bytes": 0 + }, + "rss_delta_bytes": 37019648, + "max_containing_size_proof": null + }, + "values_first_batch": [ + 7.743201200876812, + -4.1609527513907665, + 7.657972665309639, + 9.36455094905725 + ], + "speedup_vs_control_same_batch": { + "ratio": 0.6903699653543798, + "ci90_low": 0.6737947384606193, + "ci90_high": 0.7137446108981536, + "bootstrap_samples": 2000 + }, + "max_abs_delta_vs_scalar": 0.0 + }, + "step0_gather_vmap16": { + "config": "step0_gather", + "batch": 16, + "stats_per_batch": { + "n": 400, + "median_ms": 30.89928401459474, + "p10_ms": 23.24220711016096, + "p90_ms": 35.344364677439444, + "min_ms": 21.295246988302097, + "max_ms": 47.504654998192564, + "mean_ms": 29.823028020909987 + }, + "median_ms_per_likelihood": 1.9312052509121713, + "compile": { + "lower_s": 3.67760805299622, + "compile_s": 7.026152010977967, + "first_call_s": 0.026701580005465075, + "traced_rows_per_step": [ + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720, + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720 + ], + "output_shapes": [ + [ + 16 + ] + ], + "flops": 45574880.0, + "memory_analysis": { + "argument_size_in_bytes": 640, + "output_size_in_bytes": 128, + "temp_size_in_bytes": 27047448, + "alias_size_in_bytes": 0, + "generated_code_size_in_bytes": 0, + "host_temp_size_in_bytes": 0 + }, + "rss_delta_bytes": 36425728, + "max_containing_size_proof": null + }, + "values_first_batch": [ + 7.743201200876812, + -4.1609527513907665, + 7.657972665309639, + 9.36455094905725, + 7.051561357429164, + 9.219327498422563, + 0.8907045816755463, + -34.37790701671691, + -24.578291065194456, + -0.4990240338966814, + 0.702590691739907, + 7.669569297550711, + -0.4639011650528264, + -5.412376751794213, + 5.343244353416, + -20.481275097418568 + ], + "speedup_vs_control_same_batch": { + "ratio": 0.4423422557819182, + "ci90_low": 0.4357350918705732, + "ci90_high": 0.45520569147751505, + "bootstrap_samples": 2000 + }, + "max_abs_delta_vs_scalar": 0.0 + }, + "step0_components_vmap1": { + "config": "step0_components", + "batch": 1, + "stats_per_batch": { + "n": 400, + "median_ms": 1.564456513733603, + "p10_ms": 1.3553271972341463, + "p90_ms": 1.8344659154536205, + "min_ms": 1.1685409990604967, + "max_ms": 2.4185270012822, + "mean_ms": 1.5851387329166755 + }, + "median_ms_per_likelihood": 1.564456513733603, + "compile": { + "lower_s": 3.8044222019962035, + "compile_s": 6.367151962011121, + "first_call_s": 0.002775866014417261, + "traced_rows_per_step": [ + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720, + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720 + ], + "output_shapes": [ + [ + 1 + ] + ], + "flops": 3590390.0, + "memory_analysis": { + "argument_size_in_bytes": 40, + "output_size_in_bytes": 8, + "temp_size_in_bytes": 1506328, + "alias_size_in_bytes": 0, + "generated_code_size_in_bytes": 0, + "host_temp_size_in_bytes": 0 + }, + "rss_delta_bytes": 37892096, + "max_containing_size_proof": null + }, + "values_first_batch": [ + 7.743201200876812 + ], + "speedup_vs_control_same_batch": { + "ratio": 1.057060375793263, + "ci90_low": 1.0437516095334909, + "ci90_high": 1.0739641894067193, + "bootstrap_samples": 2000 + }, + "max_abs_delta_vs_scalar": 0.0 + }, + "step0_components_vmap4": { + "config": "step0_components", + "batch": 4, + "stats_per_batch": { + "n": 400, + "median_ms": 4.594657002598979, + "p10_ms": 3.925082797650248, + "p90_ms": 5.2125435933703566, + "min_ms": 3.498586011119187, + "max_ms": 6.025904993293807, + "mean_ms": 4.602050095563754 + }, + "median_ms_per_likelihood": 1.1486642506497446, + "compile": { + "lower_s": 3.617750153003726, + "compile_s": 6.569572445994709, + "first_call_s": 0.0054467139998450875, + "traced_rows_per_step": [ + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720, + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720 + ], + "output_shapes": [ + [ + 4 + ] + ], + "flops": 13447376.0, + "memory_analysis": { + "argument_size_in_bytes": 160, + "output_size_in_bytes": 32, + "temp_size_in_bytes": 6777112, + "alias_size_in_bytes": 0, + "generated_code_size_in_bytes": 0, + "host_temp_size_in_bytes": 0 + }, + "rss_delta_bytes": 38121472, + "max_containing_size_proof": null + }, + "values_first_batch": [ + 7.743201200876812, + -4.1609527513907665, + 7.657972665309639, + 9.36455094905725 + ], + "speedup_vs_control_same_batch": { + "ratio": 0.977984535971053, + "ci90_low": 0.9597936314742698, + "ci90_high": 0.9892890014966471, + "bootstrap_samples": 2000 + }, + "max_abs_delta_vs_scalar": 0.0 + }, + "step0_components_vmap16": { + "config": "step0_components", + "batch": 16, + "stats_per_batch": { + "n": 400, + "median_ms": 17.73406600113958, + "p10_ms": 15.614464387181215, + "p90_ms": 20.470675395336002, + "min_ms": 12.86517400876619, + "max_ms": 24.822161009069532, + "mean_ms": 17.908429182643886 + }, + "median_ms_per_likelihood": 1.1083791250712238, + "compile": { + "lower_s": 3.763811152020935, + "compile_s": 7.040395768999588, + "first_call_s": 0.0216017349739559, + "traced_rows_per_step": [ + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720, + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720 + ], + "output_shapes": [ + [ + 16 + ] + ], + "flops": 52885240.0, + "memory_analysis": { + "argument_size_in_bytes": 640, + "output_size_in_bytes": 128, + "temp_size_in_bytes": 27103128, + "alias_size_in_bytes": 0, + "generated_code_size_in_bytes": 0, + "host_temp_size_in_bytes": 0 + }, + "rss_delta_bytes": 40603648, + "max_containing_size_proof": null + }, + "values_first_batch": [ + 7.743201200876812, + -4.1609527513907665, + 7.657972665309639, + 9.36455094905725, + 7.051561357429164, + 9.219327498422563, + 0.8907045816755463, + -34.37790701671691, + -24.578291065194456, + -0.4990240338966814, + 0.702590691739907, + 7.669569297550711, + -0.4639011650528264, + -5.412376751794213, + 5.343244353416, + -20.481275097418568 + ], + "speedup_vs_control_same_batch": { + "ratio": 0.7707233632819288, + "ci90_low": 0.756907930733596, + "ci90_high": 0.7843492633804212, + "bootstrap_samples": 2000 + }, + "max_abs_delta_vs_scalar": 0.0 + }, + "step0_structured_vmap1": { + "config": "step0_structured", + "batch": 1, + "stats_per_batch": { + "n": 400, + "median_ms": 1.600794494152069, + "p10_ms": 1.3379019888816401, + "p90_ms": 1.9014636083738878, + "min_ms": 1.1945820006076247, + "max_ms": 2.22615001257509, + "mean_ms": 1.6108055478252936 + }, + "median_ms_per_likelihood": 1.600794494152069, + "compile": { + "lower_s": 3.63483317400096, + "compile_s": 6.364023358997656, + "first_call_s": 0.002662269020220265, + "traced_rows_per_step": [ + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720, + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720 + ], + "output_shapes": [ + [ + 1 + ] + ], + "flops": 2813353.0, + "memory_analysis": { + "argument_size_in_bytes": 40, + "output_size_in_bytes": 8, + "temp_size_in_bytes": 901720, + "alias_size_in_bytes": 0, + "generated_code_size_in_bytes": 0, + "host_temp_size_in_bytes": 0 + }, + "rss_delta_bytes": 37593088, + "max_containing_size_proof": null + }, + "values_first_batch": [ + 7.743201200876812 + ], + "speedup_vs_control_same_batch": { + "ratio": 1.0330651413162366, + "ci90_low": 1.0196497889105582, + "ci90_high": 1.0497348302178948, + "bootstrap_samples": 2000 + }, + "max_abs_delta_vs_scalar": 0.0 + }, + "step0_structured_vmap4": { + "config": "step0_structured", + "batch": 4, + "stats_per_batch": { + "n": 400, + "median_ms": 4.398944496642798, + "p10_ms": 3.892400988843292, + "p90_ms": 5.03425631322898, + "min_ms": 3.5663660091813654, + "max_ms": 5.859011987922713, + "mean_ms": 4.433061371892109 + }, + "median_ms_per_likelihood": 1.0997361241606995, + "compile": { + "lower_s": 3.89799074199982, + "compile_s": 7.073419349995675, + "first_call_s": 0.005404736002674326, + "traced_rows_per_step": [ + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720, + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720 + ], + "output_shapes": [ + [ + 4 + ] + ], + "flops": 10339222.0, + "memory_analysis": { + "argument_size_in_bytes": 160, + "output_size_in_bytes": 32, + "temp_size_in_bytes": 3200344, + "alias_size_in_bytes": 0, + "generated_code_size_in_bytes": 0, + "host_temp_size_in_bytes": 0 + }, + "rss_delta_bytes": 37724160, + "max_containing_size_proof": null + }, + "values_first_batch": [ + 7.743201200876812, + -4.1609527513907665, + 7.657972665309639, + 9.36455094905725 + ], + "speedup_vs_control_same_batch": { + "ratio": 1.021495838390841, + "ci90_low": 1.0052325736994414, + "ci90_high": 1.0359935133866323, + "bootstrap_samples": 2000 + }, + "max_abs_delta_vs_scalar": 0.0 + }, + "step0_structured_vmap16": { + "config": "step0_structured", + "batch": 16, + "stats_per_batch": { + "n": 400, + "median_ms": 13.621237507322803, + "p10_ms": 11.54224389756564, + "p90_ms": 15.619327791500837, + "min_ms": 10.329501004889607, + "max_ms": 17.409772000974044, + "mean_ms": 13.743358677020296 + }, + "median_ms_per_likelihood": 0.8513273442076752, + "compile": { + "lower_s": 4.067840900999727, + "compile_s": 7.24678405400482, + "first_call_s": 0.015487525990465656, + "traced_rows_per_step": [ + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720, + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720 + ], + "output_shapes": [ + [ + 16 + ] + ], + "flops": 40452632.0, + "memory_analysis": { + "argument_size_in_bytes": 640, + "output_size_in_bytes": 128, + "temp_size_in_bytes": 12396824, + "alias_size_in_bytes": 0, + "generated_code_size_in_bytes": 0, + "host_temp_size_in_bytes": 0 + }, + "rss_delta_bytes": 36663296, + "max_containing_size_proof": null + }, + "values_first_batch": [ + 7.743201200876812, + -4.1609527513907665, + 7.657972665309639, + 9.36455094905725, + 7.051561357429164, + 9.219327498422563, + 0.8907045816755463, + -34.37790701671691, + -24.578291065194456, + -0.4990240338966814, + 0.702590691739907, + 7.669569297550711, + -0.4639011650528264, + -5.412376751794213, + 5.343244353416, + -20.481275097418568 + ], + "speedup_vs_control_same_batch": { + "ratio": 1.0034373885422694, + "ci90_low": 0.9879353042678807, + "ci90_high": 1.019079937348025, + "bootstrap_samples": 2000 + }, + "max_abs_delta_vs_scalar": 0.0 + } + } + }, + "step0_split": { + "control": { + "extent": null, + "scale": 0.2, + "step0_rows": 11859, + "step0_triangles": 23283, + "prefix_median_ms": { + "source_centre": 0.13741350267082453, + "ray_trace": 0.456267996923998, + "general_gather": 1.2526979990070686, + "route_inputs": 0.6447470077546313, + "containment": 0.9475529950577766 + }, + "ray_trace_ms": 0.31885449425317347, + "containment_ms": 0.49128499813377857, + "route_input_materialisation_ms": 0.18847901083063334, + "general_gather_reference_ms": 0.7964300020830706, + "step0_route": "library default (structured)", + "method": "prefix medians; ray_trace = jnp.sum(plane.vertices) minus source_centre; containment = containing_indices minus ray_trace (includes the vertices[indices] gather + Point.mask + jnp.where) and is the headline before/after number; route_input_materialisation = the route's six barycentric input components returned as outputs (captured at trace time) minus ray_trace; general_gather_reference = plane.triangles minus ray_trace, route-independent", + "step0_ms": 0.810139492386952, + "containment_share_of_step0": 0.6064202557096464, + "step0_share_of_likelihood": 0.513996703414687, + "containment_share_of_likelihood": 0.3116980123186497 + }, + "step0_gather": { + "extent": null, + "scale": 0.2, + "step0_rows": 11859, + "step0_triangles": 23283, + "prefix_median_ms": { + "source_centre": 0.13552099699154496, + "ray_trace": 0.44245950994081795, + "general_gather": 1.0684614826459438, + "route_inputs": 1.5490484947804362, + "containment": 1.6654270002618432 + }, + "ray_trace_ms": 0.306938512949273, + "containment_ms": 1.2229674903210253, + "route_input_materialisation_ms": 1.1065889848396182, + "general_gather_reference_ms": 0.6260019727051258, + "step0_route": "gather", + "method": "prefix medians; ray_trace = jnp.sum(plane.vertices) minus source_centre; containment = containing_indices minus ray_trace (includes the vertices[indices] gather + Point.mask + jnp.where) and is the headline before/after number; route_input_materialisation = the route's six barycentric input components returned as outputs (captured at trace time) minus ray_trace; general_gather_reference = plane.triangles minus ray_trace, route-independent", + "step0_ms": 1.5299060032702982, + "containment_share_of_step0": 0.7993742672470289, + "step0_share_of_likelihood": 0.6768645005913838, + "containment_share_of_likelihood": 0.5410680641857636 + }, + "step0_components": { + "extent": null, + "scale": 0.2, + "step0_rows": 11859, + "step0_triangles": 23283, + "prefix_median_ms": { + "source_centre": 0.12707301357295364, + "ray_trace": 0.4473624867387116, + "general_gather": 1.0750704968813807, + "route_inputs": 0.518572996952571, + "containment": 0.8799744973657653 + }, + "ray_trace_ms": 0.32028947316575795, + "containment_ms": 0.4326120106270537, + "route_input_materialisation_ms": 0.07121051021385938, + "general_gather_reference_ms": 0.6277080101426691, + "step0_route": "components", + "method": "prefix medians; ray_trace = jnp.sum(plane.vertices) minus source_centre; containment = containing_indices minus ray_trace (includes the vertices[indices] gather + Point.mask + jnp.where) and is the headline before/after number; route_input_materialisation = the route's six barycentric input components returned as outputs (captured at trace time) minus ray_trace; general_gather_reference = plane.triangles minus ray_trace, route-independent", + "step0_ms": 0.7529014837928116, + "containment_share_of_step0": 0.5745931173461503, + "step0_share_of_likelihood": 0.48580087015253176, + "containment_share_of_likelihood": 0.2791378363904156 + }, + "step0_structured": { + "extent": null, + "scale": 0.2, + "step0_rows": 11859, + "step0_triangles": 23283, + "prefix_median_ms": { + "source_centre": 0.12097350554540753, + "ray_trace": 0.4419999895617366, + "general_gather": 1.3353590038605034, + "route_inputs": 0.6385124870575964, + "containment": 0.9358694951515645 + }, + "ray_trace_ms": 0.32102648401632905, + "containment_ms": 0.4938695055898279, + "route_input_materialisation_ms": 0.19651249749585986, + "general_gather_reference_ms": 0.8933590142987669, + "step0_route": "structured", + "method": "prefix medians; ray_trace = jnp.sum(plane.vertices) minus source_centre; containment = containing_indices minus ray_trace (includes the vertices[indices] gather + Point.mask + jnp.where) and is the headline before/after number; route_input_materialisation = the route's six barycentric input components returned as outputs (captured at trace time) minus ray_trace; general_gather_reference = plane.triangles minus ray_trace, route-independent", + "step0_ms": 0.814895989606157, + "containment_share_of_step0": 0.6060521979357357, + "step0_share_of_likelihood": 0.5190415383654716, + "containment_share_of_likelihood": 0.3145662651463396 + } + }, + "uncapped_containing_counts": { + "control": { + "n_draws": 200, + "max_per_step": [ + 17, + 13, + 11, + 9, + 7, + 5, + 5, + 5 + ], + "p99_per_step": [ + 15.0, + 11.019999999999982, + 9.019999999999982, + 7.019999999999982, + 5.019999999999982, + 5.0, + 5.0, + 5.0 + ], + "median_per_step": [ + 9.0, + 5.0, + 5.0, + 5.0, + 5.0, + 5.0, + 5.0, + 5.0 + ], + "max_over_steps": 17, + "draws_exceeding_cap": [ + 12 + ], + "n_draws_exceeding": { + "6": 185, + "8": 117, + "10": 51, + "12": 23, + "15": 1 + }, + "histogram_max_over_steps": { + "3": 3, + "5": 12, + "7": 68, + "9": 66, + "11": 28, + "13": 16, + "15": 6, + "17": 1 + } + }, + "step0_components": { + "n_draws": 200, + "max_per_step": [ + 17, + 13, + 11, + 9, + 7, + 5, + 5, + 5 + ], + "p99_per_step": [ + 15.0, + 11.019999999999982, + 9.019999999999982, + 7.019999999999982, + 5.019999999999982, + 5.0, + 5.0, + 5.0 + ], + "median_per_step": [ + 9.0, + 5.0, + 5.0, + 5.0, + 5.0, + 5.0, + 5.0, + 5.0 + ], + "max_over_steps": 17, + "draws_exceeding_cap": [ + 12 + ], + "n_draws_exceeding": { + "6": 185, + "8": 117, + "10": 51, + "12": 23, + "15": 1 + }, + "histogram_max_over_steps": { + "3": 3, + "5": 12, + "7": 68, + "9": 66, + "11": 28, + "13": 16, + "15": 6, + "17": 1 + } + } + }, + "gates": { + "fiducial_bit_exact": { + "value": 7.743201200876812, + "expected": 7.743201200876812, + "repr": "7.743201200876812", + "pass": true + }, + "max_containing_size_patch": { + "control": { + "positions_shape": [ + 15, + 2 + ], + "expected_rows": 15, + "pass": true + }, + "step0_gather": { + "positions_shape": [ + 15, + 2 + ], + "expected_rows": 15, + "pass": true + }, + "step0_components": { + "positions_shape": [ + 15, + 2 + ], + "expected_rows": 15, + "pass": true + }, + "step0_structured": { + "positions_shape": [ + 15, + 2 + ], + "expected_rows": 15, + "pass": true + } + }, + "patch_restored": { + "module_constant": 15, + "init_default": [ + 15, + null + ], + "step0_containment": "structured", + "pass": true + }, + "grad": { + "control": { + "compile_s": 9.042991999012884, + "all_finite": true, + "non_zero_per_instance": [ + true, + true, + true + ], + "gradients": [ + [ + -41.62226304412241, + 53.13429595959836, + 31.786492377833373, + 2.8041319222503596, + 1781.7386158499905 + ], + [ + 249.2584709570848, + 214.72130119062615, + 374.39194598162, + 813.0025446226292, + 3314.4494363252807 + ], + [ + -30.046183166223308, + 41.855894384352354, + 53.12915308135319, + -17.189194514945925, + 1304.41858376655 + ] + ], + "pass": true, + "max_rel_delta_vs_control": 0.0 + }, + "step0_gather": { + "compile_s": 9.287426452006912, + "all_finite": true, + "non_zero_per_instance": [ + true, + true, + true + ], + "gradients": [ + [ + -41.62226304412241, + 53.13429595959836, + 31.786492377833373, + 2.8041319222503596, + 1781.7386158499905 + ], + [ + 249.2584709570848, + 214.72130119062615, + 374.39194598162, + 813.0025446226292, + 3314.4494363252807 + ], + [ + -30.046183166223308, + 41.855894384352354, + 53.12915308135319, + -17.189194514945925, + 1304.41858376655 + ] + ], + "pass": true, + "max_rel_delta_vs_control": 0.0 + }, + "step0_components": { + "compile_s": 9.575112228019862, + "all_finite": true, + "non_zero_per_instance": [ + true, + true, + true + ], + "gradients": [ + [ + -41.62226304412241, + 53.13429595959836, + 31.786492377833373, + 2.8041319222503596, + 1781.7386158499905 + ], + [ + 249.2584709570848, + 214.72130119062615, + 374.39194598162, + 813.0025446226292, + 3314.4494363252807 + ], + [ + -30.046183166223308, + 41.855894384352354, + 53.12915308135319, + -17.189194514945925, + 1304.41858376655 + ] + ], + "pass": true, + "max_rel_delta_vs_control": 0.0 + }, + "step0_structured": { + "compile_s": 9.627317381993635, + "all_finite": true, + "non_zero_per_instance": [ + true, + true, + true + ], + "gradients": [ + [ + -41.62226304412241, + 53.13429595959836, + 31.786492377833373, + 2.8041319222503596, + 1781.7386158499905 + ], + [ + 249.2584709570848, + 214.72130119062615, + 374.39194598162, + 813.0025446226292, + 3314.4494363252807 + ], + [ + -30.046183166223308, + 41.855894384352354, + 53.12915308135319, + -17.189194514945925, + 1304.41858376655 + ] + ], + "pass": true, + "max_rel_delta_vs_control": 0.0 + } + }, + "step0_route_bit_identity": { + "step0_gather": { + "checks": { + "stream_log_likelihood": true, + "fiducial_log_likelihood": true, + "prior_log_likelihood": true, + "prior_positions": true, + "stress_positions": true, + "image_counts": true, + "grad": true, + "vmap": true + }, + "pass": true, + "image_count_histogram": { + "prior": { + "2": 21, + "4": 179 + }, + "stress": { + "2": 163, + "4": 37 + } + } + }, + "step0_components": { + "checks": { + "stream_log_likelihood": true, + "fiducial_log_likelihood": true, + "prior_log_likelihood": true, + "prior_positions": true, + "stress_positions": true, + "image_counts": true, + "grad": true, + "vmap": true + }, + "pass": true, + "image_count_histogram": { + "prior": { + "2": 21, + "4": 179 + }, + "stress": { + "2": 163, + "4": 37 + } + } + }, + "step0_structured": { + "checks": { + "stream_log_likelihood": true, + "fiducial_log_likelihood": true, + "prior_log_likelihood": true, + "prior_positions": true, + "stress_positions": true, + "image_counts": true, + "grad": true, + "vmap": true + }, + "pass": true, + "image_count_histogram": { + "prior": { + "2": 21, + "4": 179 + }, + "stress": { + "2": 163, + "4": 37 + } + } + } + } + }, + "all_gates_pass": true, + "completeness_compile": { + "control_prior": { + "lower_s": 4.019101924001006, + "compile_s": 8.133705484011443, + "first_call_s": 0.0028201180102769285, + "traced_rows_per_step": [ + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720, + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720, + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720 + ], + "output_shapes": [ + [], + [ + 15, + 2 + ] + ], + "flops": 2801341.0, + "memory_analysis": { + "argument_size_in_bytes": 40, + "output_size_in_bytes": 264, + "temp_size_in_bytes": 901592, + "alias_size_in_bytes": 0, + "generated_code_size_in_bytes": 0, + "host_temp_size_in_bytes": 0 + }, + "rss_delta_bytes": 7528448, + "max_containing_size_proof": { + "positions_shape": [ + 15, + 2 + ], + "expected_rows": 15, + "pass": true + } + }, + "control_stress": { + "lower_s": 1.2973291230155155, + "compile_s": 2.501587796024978, + "first_call_s": 0.0029185110179241747, + "traced_rows_per_step": [ + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720 + ], + "output_shapes": [ + [ + 15, + 2 + ] + ], + "flops": 2746879.0, + "memory_analysis": { + "argument_size_in_bytes": 64, + "output_size_in_bytes": 240, + "temp_size_in_bytes": 901144, + "alias_size_in_bytes": 0, + "generated_code_size_in_bytes": 0, + "host_temp_size_in_bytes": 0 + }, + "rss_delta_bytes": 1392640, + "max_containing_size_proof": { + "positions_shape": [ + 15, + 2 + ], + "expected_rows": 15, + "pass": true + } + }, + "step0_gather_prior": { + "lower_s": 3.9016066390031483, + "compile_s": 7.588742417021422, + "first_call_s": 0.0029384490044321865, + "traced_rows_per_step": [ + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720, + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720, + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720 + ], + "output_shapes": [ + [], + [ + 15, + 2 + ] + ], + "flops": 3383414.0, + "memory_analysis": { + "argument_size_in_bytes": 40, + "output_size_in_bytes": 264, + "temp_size_in_bytes": 1692120, + "alias_size_in_bytes": 0, + "generated_code_size_in_bytes": 0, + "host_temp_size_in_bytes": 0 + }, + "rss_delta_bytes": 4435968, + "max_containing_size_proof": { + "positions_shape": [ + 15, + 2 + ], + "expected_rows": 15, + "pass": true + } + }, + "step0_gather_stress": { + "lower_s": 1.102344839979196, + "compile_s": 2.327826251013903, + "first_call_s": 0.003066250996198505, + "traced_rows_per_step": [ + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720 + ], + "output_shapes": [ + [ + 15, + 2 + ] + ], + "flops": 3328952.0, + "memory_analysis": { + "argument_size_in_bytes": 64, + "output_size_in_bytes": 240, + "temp_size_in_bytes": 1692184, + "alias_size_in_bytes": 0, + "generated_code_size_in_bytes": 0, + "host_temp_size_in_bytes": 0 + }, + "rss_delta_bytes": 987136, + "max_containing_size_proof": { + "positions_shape": [ + 15, + 2 + ], + "expected_rows": 15, + "pass": true + } + }, + "step0_components_prior": { + "lower_s": 4.154760889010504, + "compile_s": 7.1169156140240375, + "first_call_s": 0.0032169159967452288, + "traced_rows_per_step": [ + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720, + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720, + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720 + ], + "output_shapes": [ + [], + [ + 15, + 2 + ] + ], + "flops": 3578378.0, + "memory_analysis": { + "argument_size_in_bytes": 40, + "output_size_in_bytes": 264, + "temp_size_in_bytes": 1506200, + "alias_size_in_bytes": 0, + "generated_code_size_in_bytes": 0, + "host_temp_size_in_bytes": 0 + }, + "rss_delta_bytes": 4993024, + "max_containing_size_proof": { + "positions_shape": [ + 15, + 2 + ], + "expected_rows": 15, + "pass": true + } + }, + "step0_components_stress": { + "lower_s": 1.1733312660071533, + "compile_s": 2.1011300020036288, + "first_call_s": 0.0031684170244261622, + "traced_rows_per_step": [ + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720 + ], + "output_shapes": [ + [ + 15, + 2 + ] + ], + "flops": 3523916.0, + "memory_analysis": { + "argument_size_in_bytes": 64, + "output_size_in_bytes": 240, + "temp_size_in_bytes": 1506072, + "alias_size_in_bytes": 0, + "generated_code_size_in_bytes": 0, + "host_temp_size_in_bytes": 0 + }, + "rss_delta_bytes": 3977216, + "max_containing_size_proof": { + "positions_shape": [ + 15, + 2 + ], + "expected_rows": 15, + "pass": true + } + }, + "step0_structured_prior": { + "lower_s": 3.9929071810038295, + "compile_s": 7.853175390016986, + "first_call_s": 0.002990125009091571, + "traced_rows_per_step": [ + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720, + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720, + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720 + ], + "output_shapes": [ + [], + [ + 15, + 2 + ] + ], + "flops": 2801341.0, + "memory_analysis": { + "argument_size_in_bytes": 40, + "output_size_in_bytes": 264, + "temp_size_in_bytes": 901592, + "alias_size_in_bytes": 0, + "generated_code_size_in_bytes": 0, + "host_temp_size_in_bytes": 0 + }, + "rss_delta_bytes": 5156864, + "max_containing_size_proof": { + "positions_shape": [ + 15, + 2 + ], + "expected_rows": 15, + "pass": true + } + }, + "step0_structured_stress": { + "lower_s": 1.2951303760055453, + "compile_s": 2.410444754001219, + "first_call_s": 0.0027003739960491657, + "traced_rows_per_step": [ + 11859, + 720, + 720, + 720, + 720, + 720, + 720, + 720 + ], + "output_shapes": [ + [ + 15, + 2 + ] + ], + "flops": 2746879.0, + "memory_analysis": { + "argument_size_in_bytes": 64, + "output_size_in_bytes": 240, + "temp_size_in_bytes": 901144, + "alias_size_in_bytes": 0, + "generated_code_size_in_bytes": 0, + "host_temp_size_in_bytes": 0 + }, + "rss_delta_bytes": 1523712, + "max_containing_size_proof": { + "positions_shape": [ + 15, + 2 + ], + "expected_rows": 15, + "pass": true + } + } + }, + "progress": [ + "[ 5.8 s] configs: control(n=8,rows=11859), step0_gather(n=8,rows=11859), step0_components(n=8,rows=11859), step0_structured(n=8,rows=11859), reference(n=9,rows=268677), reference_b(n=10,rows=115473)", + "[ 42.0 s] reference reference solved on 200 prior + 200 stress draws (compile 2.9 s)", + "[ 72.3 s] reference reference_b solved on 200 prior + 200 stress draws (compile 3.2 s)", + "[ 72.3 s] reference floor: {\"prior\": {\"n_draws\": 200, \"multiplicity_agreement\": 1.0, \"raw_count_agreement\": 1.0, \"n_multiplicity_mismatch\": 0, \"max_position_error\": 0.00015786921423151782, \"p99_position_error\": 0.0001280749711777913, \"median_position_error\": 5.9668954361473236e-05, \"ref_distinct_histogram\": {\"2\": 21, \"4\": 179}, \"abs_delta_logl_vs_reference\": {\"max\": 0.09204751533968647, \"p99\": 0.06845503627316121, \"median\": 0.004628222675307825, \"n_nonfinite_mismatch\": 0}}, \"stress\": {\"n_draws\": 200, \"multiplicity_agreement\": 1.0, \"raw_count_agreement\": 1.0, \"n_multiplicity_mismatch\": 0, \"max_position_error\": 0.00015786921423129578, \"p99_position_error\": 0.00014084184669768283, \"median_position_error\": 5.966895436132821e-05, \"ref_distinct_histogram\": {\"2\": 163, \"4\": 37}}}", + "[ 138.2 s] completeness control prior mult 1.000 raw 1.000 maxerr 0.0008513474499103632 |dlogL|ref 0.8682473458375171 stress mult 1.0 maxerr 0.0007893460711579142", + "[ 138.2 s] completeness step0_gather prior mult 1.000 raw 1.000 maxerr 0.0008513474499103632 |dlogL|ref 0.8682473458375171 stress mult 1.0 maxerr 0.0007893460711579142", + "[ 138.2 s] completeness step0_components prior mult 1.000 raw 1.000 maxerr 0.0008513474499103632 |dlogL|ref 0.8682473458375171 stress mult 1.0 maxerr 0.0007893460711579142", + "[ 138.2 s] completeness step0_structured prior mult 1.000 raw 1.000 maxerr 0.0008513474499103632 |dlogL|ref 0.8682473458375171 stress mult 1.0 maxerr 0.0007893460711579142", + "[ 138.3 s] reference image extent: {'prior': {'max_abs_y': 1.77939453125, 'max_abs_x': 1.7773254429359933, 'max_abs_coord': 1.77939453125, 'p99_abs_coord': 1.7590830914129167, 'max_radius': 1.8116226317743076}, 'stress': {'max_abs_y': 2.2498046875, 'max_abs_x': 2.300267215077964, 'max_abs_coord': 2.300267215077964, 'p99_abs_coord': 2.2027852305644777, 'max_radius': 2.5191249773380773}}", + "[ 138.3 s] timing: compiling every route (fresh closure + clear_caches)", + "[ 176.2 s] timing: 20 rounds x 20 calls x 4 routes done", + "[ 176.6 s] fiducial gate: 7.743201200876812 == 7.743201200876812: True", + "[ 235.2 s] grad gate: control=True, step0_gather=True, step0_components=True, step0_structured=True", + "[ 235.2 s] best admissible (precision-equivalent): step0_components; any precision: step0_components", + "[ 409.7 s] vmap: control_vmap1 1.654 ms/L, control_vmap4 1.123 ms/L, control_vmap16 0.854 ms/L, step0_gather_vmap1 2.271 ms/L, step0_gather_vmap4 1.627 ms/L, step0_gather_vmap16 1.931 ms/L, step0_components_vmap1 1.564 ms/L, step0_components_vmap4 1.149 ms/L, step0_components_vmap16 1.108 ms/L, step0_structured_vmap1 1.601 ms/L, step0_structured_vmap4 1.100 ms/L, step0_structured_vmap16 0.851 ms/L", + "[ 409.7 s] step-0 route bit-identity vs control: step0_gather=True, step0_components=True, step0_structured=True", + "[ 409.7 s] step-0 split: ray trace vs ray trace + containment per geometry", + "[ 431.9 s] step-0 split: control trace 0.319 contain 0.491, step0_gather trace 0.307 contain 1.223, step0_components trace 0.320 contain 0.433, step0_structured trace 0.321 contain 0.494", + "[ 431.9 s] uncapped containing counts (NumPy path) on the prior draws", + "[ 456.3 s] uncapped control: max per step [17, 13, 11, 9, 7, 5, 5, 5]; draws exceeding cap 15: [12]", + "[ 479.8 s] uncapped step0_components: max per step [17, 13, 11, 9, 7, 5, 5, 5]; draws exceeding cap 15: [12]" + ], + "wall_s": 479.8491079300002 +} \ No newline at end of file diff --git a/results/breakdown/point_source_image/solver_config_sweep_step0_hpc_ral_cpu_fp64.png b/results/breakdown/point_source_image/solver_config_sweep_step0_hpc_ral_cpu_fp64.png new file mode 100644 index 0000000000000000000000000000000000000000..20450d442de96b97908104ebafb7a002cb420eef GIT binary patch literal 101379 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%0AQiK*|sGr4qe}h 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%0A{M+ zI}lX`>uFAL!!&mKpG)l7JENgvKlHYkp&OR#|F)*I1meH5phn92&Is$#FWrY;Gt^J3 z>toOpCn`_^Z*+cr&zu=VcRT108ug;~!a#vtd8Bb<8HT(H-16$hv+qsqw4>6ALxTz! z?-AUlJ?m(*g5uB%?GWnyPyliG2;HJ!M;Ag)A9jl9%^IWzGJG9)Hs@bBq6g&5)-y;6 zj*xng!XOiyQoS4aQc=V3ZQ=-n)`TKX{BL{Y-O{z744s8KV3H`BWAOp1)G`i*MuUn`B{0 z>}2J}krK2`FF;O1d4_3Fs^7)@mglHjAz>SB`&ftFWhx&xuUH2!4}(c$6$4q5mF7HV z*+~Z&1GnsfBoCv{XSgwlc@drY5NPRkQ9yYKDaODCW!-h;Dp!g|v}%|Y_O1kVgF2{;1MJi@oH34qI zG7iBa4Y<=0w6&~273UEKz{W?Why$tFu>5gCA@>7)Pqq6umReBD(ta;XJ+qzmbAeXQ zpn)l~WwA@c$t3o7vPwZdvM0Qx($AWe7~C>hCvn_Ss*5|v+NR+cC7QwT7Skd~@@eYx zZc2469u^r8P}6xpcSHO!2qR?*Y>C=4jXkJ)VOyIs3|To+U#(a|+CJLahiTgI{?G@a zC_oQMR*%Sb1M7GZ+$cZ!y0V7iCdQL9ds>P+o{db?b5bF7l9-zMO1q9UXUGZ@RBeqa zT08_o_$zR-xqJq@XS8S{vu$2=McO)4oIXV#3$(Bh+JGwEXGdk~A8^sxezysLb3jdO zlNGBVZcW1m+e5^<5F3c1Ny8eSKg~y#or=xm$)+YsE|JaRL&QU281Z-$R7MF!A%A

ps#=fM?#b~fDjuX;v# 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 literal 0 HcmV?d00001 diff --git a/results/notes/point_source_cpu_2026_09_27_ral_job_357321_step0_route_ab_8490h_cpu.out b/results/notes/point_source_cpu_2026_09_27_ral_job_357321_step0_route_ab_8490h_cpu.out new file mode 100644 index 000000000..45739d7a0 --- /dev/null +++ b/results/notes/point_source_cpu_2026_09_27_ral_job_357321_step0_route_ab_8490h_cpu.out @@ -0,0 +1,80 @@ +AP_ROOT=/mnt/ral/jnightin/autolens_profiling_wt/pointsolver-step0-gather +========================================== +Sun 27 Sep 15:39:57 BST 2026 +euclid-ral-compute-10-4 +Model name: Intel(R) Xeon(R) Platinum 8490H +partition: ral +cpus-per-task: 8 +sched_affinity: 8 +loadavg: 198.81 197.31 198.43 209/3235 148556 +Cell: point_source_image/likelihood_breakdown/solver_config_sweep --step0-route +Thread env: OMP=1 MKL=1 OPENBLAS=1 NPROC=8 +XLA_FLAGS: --xla_disable_hlo_passes=constant_folding --xla_gpu_autotune_level=0 --xla_gpu_enable_triton_gemm=false +PYTHONPATH: /mnt/ral/jnightin/autolens_profiling_wt/PyAutoArray_pointsolver-step0-gather:/mnt/ral/jnightin/PyAuto:/mnt/ral/jnightin/PyAuto/PyAutoNerves:/mnt/ral/jnightin/PyAuto/PyAutoFit:/mnt/ral/jnightin/PyAuto/PyAutoArray:/mnt/ral/jnightin/PyAuto/PyAutoGalaxy:/mnt/ral/jnightin/PyAuto/PyAutoLens +=== source revisions === +PyAutoNerves (mirror) eb27da2464e2f07e0ad67e7fb18ee84be76c479a +PyAutoFit (mirror) 5468c6cefa0ae8bb08a449497cbd3c620f3720e2 +PyAutoArray (mirror) 14d63360f341912b209f2045d7e388e264692f1d +PyAutoGalaxy (mirror) 879a9308b709b3705eb95904de6b349a5c034d61 +PyAutoLens (mirror) def4decf68a245a9c3dd1eb276ee0578897b220c +PyAutoArray (branch clone, IMPORTED): c13b2d733538bec86cff3a15eccd9a0940a68463 +AP_ROOT rev: 311e690fd6c843fe38e5a228628b4417890694f2 +=== import provenance === +autoarray 2026.8.17.1 /mnt/ral/jnightin/autolens_profiling_wt/PyAutoArray_pointsolver-step0-gather/autoarray/__init__.py +autofit 2026.8.17.1 /mnt/ral/jnightin/PyAuto/PyAutoFit/autofit/__init__.py +autogalaxy 2026.8.17.1 /mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/__init__.py +autolens 2026.8.17.1 /mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/__init__.py +_STEP0_CONTAINMENT structured +jax 0.10.2 jaxlib 0.10.2 numpy 2.2.6 [CpuDevice(id=0)] +========================================== +RUN hpc_ral_cpu_fp64 -> /mnt/ral/jnightin/autolens_profiling_wt/pointsolver-step0-gather/results/breakdown/point_source_image +Sun 27 Sep 15:40:00 BST 2026 +loadavg: 199.87 197.55 198.50 212/3235 148598 +[ 5.8 s] configs: control(n=8,rows=11859), step0_gather(n=8,rows=11859), step0_components(n=8,rows=11859), step0_structured(n=8,rows=11859), reference(n=9,rows=268677), reference_b(n=10,rows=115473) +[ 42.0 s] reference reference solved on 200 prior + 200 stress draws (compile 2.9 s) +[ 72.3 s] reference reference_b solved on 200 prior + 200 stress draws (compile 3.2 s) +[ 72.3 s] reference floor: {"prior": {"n_draws": 200, "multiplicity_agreement": 1.0, "raw_count_agreement": 1.0, "n_multiplicity_mismatch": 0, "max_position_error": 0.00015786921423151782, "p99_position_error": 0.0001280749711777913, "median_position_error": 5.9668954361473236e-05, "ref_distinct_histogram": {"2": 21, "4": 179}, "abs_delta_logl_vs_reference": {"max": 0.09204751533968647, "p99": 0.06845503627316121, "median": 0.004628222675307825, "n_nonfinite_mismatch": 0}}, "stress": {"n_draws": 200, "multiplicity_agreement": 1.0, "raw_count_agreement": 1.0, "n_multiplicity_mismatch": 0, "max_position_error": 0.00015786921423129578, "p99_position_error": 0.00014084184669768283, "median_position_error": 5.966895436132821e-05, "ref_distinct_histogram": {"2": 163, "4": 37}}} +[ 138.2 s] completeness control prior mult 1.000 raw 1.000 maxerr 0.0008513474499103632 |dlogL|ref 0.8682473458375171 stress mult 1.0 maxerr 0.0007893460711579142 +[ 138.2 s] completeness step0_gather prior mult 1.000 raw 1.000 maxerr 0.0008513474499103632 |dlogL|ref 0.8682473458375171 stress mult 1.0 maxerr 0.0007893460711579142 +[ 138.2 s] completeness step0_components prior mult 1.000 raw 1.000 maxerr 0.0008513474499103632 |dlogL|ref 0.8682473458375171 stress mult 1.0 maxerr 0.0007893460711579142 +[ 138.2 s] completeness step0_structured prior mult 1.000 raw 1.000 maxerr 0.0008513474499103632 |dlogL|ref 0.8682473458375171 stress mult 1.0 maxerr 0.0007893460711579142 +[ 138.3 s] reference image extent: {'prior': {'max_abs_y': 1.77939453125, 'max_abs_x': 1.7773254429359933, 'max_abs_coord': 1.77939453125, 'p99_abs_coord': 1.7590830914129167, 'max_radius': 1.8116226317743076}, 'stress': {'max_abs_y': 2.2498046875, 'max_abs_x': 2.300267215077964, 'max_abs_coord': 2.300267215077964, 'p99_abs_coord': 2.2027852305644777, 'max_radius': 2.5191249773380773}} +[ 138.3 s] timing: compiling every route (fresh closure + clear_caches) +[ 176.2 s] timing: 20 rounds x 20 calls x 4 routes done +[ 176.6 s] fiducial gate: 7.743201200876812 == 7.743201200876812: True +[ 235.2 s] grad gate: control=True, step0_gather=True, step0_components=True, step0_structured=True +[ 235.2 s] best admissible (precision-equivalent): step0_components; any precision: step0_components +[ 409.7 s] vmap: control_vmap1 1.654 ms/L, control_vmap4 1.123 ms/L, control_vmap16 0.854 ms/L, step0_gather_vmap1 2.271 ms/L, step0_gather_vmap4 1.627 ms/L, step0_gather_vmap16 1.931 ms/L, step0_components_vmap1 1.564 ms/L, step0_components_vmap4 1.149 ms/L, step0_components_vmap16 1.108 ms/L, step0_structured_vmap1 1.601 ms/L, step0_structured_vmap4 1.100 ms/L, step0_structured_vmap16 0.851 ms/L +[ 409.7 s] step-0 route bit-identity vs control: step0_gather=True, step0_components=True, step0_structured=True +[ 409.7 s] step-0 split: ray trace vs ray trace + containment per geometry +[ 431.9 s] step-0 split: control trace 0.319 contain 0.491, step0_gather trace 0.307 contain 1.223, step0_components trace 0.320 contain 0.433, step0_structured trace 0.321 contain 0.494 +[ 431.9 s] uncapped containing counts (NumPy path) on the prior draws +[ 456.3 s] uncapped control: max per step [17, 13, 11, 9, 7, 5, 5, 5]; draws exceeding cap 15: [12] +[ 479.8 s] uncapped step0_components: max per step [17, 13, 11, 9, 7, 5, 5, 5]; draws exceeding cap 15: [12] + +====================================================================================================================================================== +POINTSOLVER CONFIG SWEEP (hpc_ral_cpu_fp64, rounds=20, calls=20, prior draws=200, stress draws=200) +====================================================================================================================================================== + config block ext scale prec mcs nd n rows med_ms speedup [90% CI] admp mult raw maxerr p99err dlogL_ref s_mult s_maxerr + control control 9.90 0.20 0.0010 15 1 8 11859 1.576 1.000 [0.989, 1.011] TT 1.000 1.000 8.51e-04 7.89e-04 8.68e-01 1.000 7.89e-04 + step0_gather step0_route 9.90 0.20 0.0010 15 1 8 11859 2.260 0.697 [0.683, 0.713] TT 1.000 1.000 8.51e-04 7.89e-04 8.68e-01 1.000 7.89e-04 + step0_components step0_route 9.90 0.20 0.0010 15 1 8 11859 1.550 1.017 [0.997, 1.030] TT 1.000 1.000 8.51e-04 7.89e-04 8.68e-01 1.000 7.89e-04 + step0_structured step0_route 9.90 0.20 0.0010 15 1 8 11859 1.570 1.004 [0.990, 1.020] TT 1.000 1.000 8.51e-04 7.89e-04 8.68e-01 1.000 7.89e-04 +------------------------------------------------------------------------------------------------------------------------------------------------------ + default agrees with reference on every prior draw: True + default agrees with reference on every stress draw: True + reference floor: {"prior": {"n_draws": 200, "multiplicity_agreement": 1.0, "raw_count_agreement": 1.0, "n_multiplicity_mismatch": 0, "max_position_error": 0.00015786921423151782, "p99_position_error": 0.0001280749711777913, "median_position_error": 5.9668954361473236e-05, "ref_distinct_histogram": {"2": 21, "4": 179}, "abs_delta_logl_vs_reference": {"max": 0.09204751533968647, "p99": 0.06845503627316121, "median": 0.004628222675307825, "n_nonfinite_mismatch": 0}}, "stress": {"n_draws": 200, "multiplicity_agreement": 1.0, "raw_count_agreement": 1.0, "n_multiplicity_mismatch": 0, "max_position_error": 0.00015786921423129578, "p99_position_error": 0.00014084184669768283, "median_position_error": 5.966895436132821e-05, "ref_distinct_histogram": {"2": 163, "4": 37}}} + best admissible (precision-equivalent): step0_components; any precision: step0_components + reference image extent: {'prior': {'max_abs_y': 1.77939453125, 'max_abs_x': 1.7773254429359933, 'max_abs_coord': 1.77939453125, 'p99_abs_coord': 1.7590830914129167, 'max_radius': 1.8116226317743076}, 'stress': {'max_abs_y': 2.2498046875, 'max_abs_x': 2.300267215077964, 'max_abs_coord': 2.300267215077964, 'p99_abs_coord': 2.2027852305644777, 'max_radius': 2.5191249773380773}} + fiducial gate: {'value': 7.743201200876812, 'expected': 7.743201200876812, 'repr': '7.743201200876812', 'pass': True} + all_gates_pass: True + wall: 480 s + Results JSON: /mnt/ral/jnightin/autolens_profiling_wt/pointsolver-step0-gather/results/breakdown/point_source_image/solver_config_sweep_step0_hpc_ral_cpu_fp64.json + Results PNG: /mnt/ral/jnightin/autolens_profiling_wt/pointsolver-step0-gather/results/breakdown/point_source_image/solver_config_sweep_step0_hpc_ral_cpu_fp64.png +=== source_revisions check (JSON vs imported HEADs) === +autoarray_imported_from /mnt/ral/jnightin/autolens_profiling_wt/PyAutoArray_pointsolver-step0-gather +OK /mnt/ral/jnightin/autolens_profiling_wt/pointsolver-step0-gather/results/breakdown/point_source_image/solver_config_sweep_step0_hpc_ral_cpu_fp64.json all_gates_pass True +========================================== +loadavg: 189.92 196.72 198.44 189/3233 149081 +Finished. +Sun 27 Sep 15:48:04 BST 2026 diff --git a/results/notes/point_source_cpu_campaign.md b/results/notes/point_source_cpu_campaign.md index ca2dff504..40d49bb6e 100644 --- a/results/notes/point_source_cpu_campaign.md +++ b/results/notes/point_source_cpu_campaign.md @@ -1355,14 +1355,39 @@ i.e. `structured`. - autolens_profiling on RAL: a worktree of the RAL checkout at `311e690` (`f7edb9f` + the fallback submit). -### Quotable row: RAL CPU, Xeon Platinum 8490H — job 357321, NOT RUN (queued) - -Job **357321** (`submit_breakdown_point_source_image_solver_config_sweep_step0_ral_cpu_fp64`, pinned to -`euclid-ral-compute-10-4`, the phase-4a host) was submitted at 11:59 and was still `PENDING (Priority)` -at 14:00: the `ral` partition is saturated by euclid_dr1 arrays (10-4 had 974 848 / 976 000 MB -allocated and load ≈ 150, with thousands of older equal-priority array tasks ahead). It is left -queued; when it runs it writes `solver_config_sweep_step0_hpc_ral_cpu_fp64.json`, which is the -quotable before/after row for this phase. **Until then there is no quotable 8490H number.** +### Quotable row: RAL CPU, Xeon Platinum 8490H — job 357321 + +This ran on `euclid-ral-compute-10-4`, the phase-4a host, from the `ral` partition. It was submitted +at 11:59, pending until the queue cleared, and finished at 15:48 with a wall time of 480 s. The job +had 8 CPUs (`sched_affinity` 8), fp64, NPROC 8 and BLAS 1, and it passes `all_gates_pass: true`, with +provenance asserted: PyAutoArray `c13b2d73` from the branch clone, profiling `311e690`. JSON +[`solver_config_sweep_step0_hpc_ral_cpu_fp64.json`](../breakdown/point_source_image/solver_config_sweep_step0_hpc_ral_cpu_fp64.json) +(`quotable: true`); log [`point_source_cpu_2026_09_27_ral_job_357321_step0_route_ab_8490h_cpu.out`](point_source_cpu_2026_09_27_ral_job_357321_step0_route_ab_8490h_cpu.out). + +**The node was heavily loaded.** Its loadavg was 199.9 at the start and 189.9 at the end (236 +cores). Phase 4a's job 356367 ran on the same node at 0.00 → 1.23. The routes are interleaved round +by round, so the ratios between routes stand. The absolute ms, and the gather spread (p10–p90 +1.85–2.66 ms), are inflated by contention and are **not comparable to phase 4a's 1.824 ms control**. + +| route | median ms | × gather | vs control [90 % CI] | containment ms | route inputs ms | ray trace ms | vmap-1 / 4 / 16 ms/L | compile s | XLA temp KB | FLOPs M | +|---|---:|---:|---:|---:|---:|---:|---|---:|---:|---:| +| gather (before) | 2.260 | 1.000 | 0.697 [0.683, 0.713] | 1.223 | 1.107 | 0.307 | 2.271 / 1.627 / 1.931 | 5.37 | 1692 | 3.38 | +| components | 1.550 | **1.458** | 1.017 [0.997, 1.030] | 0.433 | 0.071 | 0.320 | 1.564 / 1.149 / 1.108 | 5.68 | 1506 | 3.58 | +| **structured** (default) | 1.570 | **1.440** | 1.005 [0.990, 1.020] | 0.494 | 0.197 | 0.321 | 1.601 / 1.100 / 0.851 | 5.83 | **902** | **2.80** | +| control (= structured) | 1.576 | 1.434 | 1.000 [0.989, 1.011] | 0.491 | 0.188 | 0.319 | 1.654 / 1.123 / 0.854 | 5.81 | 902 | 2.80 | + +- The "× gather" column is a ratio of the medians. The bootstrap CI is against the control, which is + `structured`. Paired-round ratio against the control: gather 0.672 (p10–p90 0.61–0.80), components + 0.992 (0.87–1.13), structured 0.992 (0.91–1.10). +- Containment falls **1.223 → 0.494 ms (−60 %)**, and the whole likelihood goes from 2.26 to 1.57 ms + (**1.44×**). On the scalar call `structured` and `components` are statistically tied: components' + CI against the control, [0.997, 1.030], overlaps structured's. +- vmap × gather: structured 1.42 / 1.48 / **2.27**, components 1.45 / 1.41 / 1.74. The gather row's + vmap-16 (1.931 ms/L, slower than its vmap-4) is the contention-inflated cell. Even so, structured + is best at vmap-16 (0.851 against components' 1.108 ms/L). +- Compile is +5.7 % for components and +8.6 % for structured over gather, one cold compile each on a + loaded node. That is inside the +20 % gate. `structured` is again the only route that cuts XLA temp + memory (−47 %) and FLOPs. ### Supplementary: RAL CPU, AMD EPYC 7702 — job 357335 @@ -1418,25 +1443,28 @@ route-inputs column): gather 2.221 ms, components 1.555 (1.43×), structured 1.6 ### Gates (every run) -- `gates.step0_route_bit_identity` passes for every route on laptop, EPYC and A100: stream, fiducial +- `gates.step0_route_bit_identity` passes for every route on the 8490H, EPYC, laptop and A100: stream, fiducial and prior log L, prior and stress positions, image counts, `jax.grad` and the vmap values are bit-identical to the control. -- Fiducial `7.743201200876812` bit-exact on both CPUs (A100: `…806`, its established value). +- Fiducial `7.743201200876812` bit-exact on all three CPUs: 8490H, EPYC and laptop (A100: `…806`, its established value). - Completeness: every route 200/200 prior + 200/200 stress, max position error 8.51e-4″ (unchanged from phase 4a). - `jax.grad` finite and non-zero on every route; the MCS patch is restored. -- Compile ≤ +5 % (gate +20 %); XLA temp memory ≤ gather's on every route (structured −47 % on CPU). +- Compile ≤ +9 % (8490H, loaded node; ≤ +5 % on EPYC; gate +20 %). XLA temp memory ≤ gather's on every route (structured −47 % on CPU). ### Verdict -Removing the gather cuts the step-0 containment by about two thirds on CPU, with bit-identical -output. On the EPYC CPU the likelihood is 1.61× faster (1.87× under vmap-16); on the laptop it is +Removing the gather cuts the step-0 containment by 60–66 % on CPU, with bit-identical output. On +the quotable 8490H row the likelihood is 1.44× faster (2.27× under vmap-16, on a loaded node); on the +EPYC CPU it is 1.61× (1.87× under vmap-16); on the laptop it is 1.38–1.43×. It does not regress the A100. **Keep `structured` as the default:** it ties `components` on the scalar CPU call (the laptop's 4 % edge for `components` is within WSL2 noise and does not reproduce on RAL), wins under vmap-16 on both CPUs (1.87× / 1.91× vs 1.82× / 1.50×), and is the only route that also cuts XLA temp memory and FLOPs. `components` stays the fallback for a lattice whose vertex table does not follow the closed-form layout (`Step0Layout.grid is None`). The quotable 8490H -row (job 357321) is still owed before this ships. +row (job 357321, on a loaded node) confirms it: **1.44×** on the scalar call, −60 % containment, and +structured the best route at vmap-16 (2.27× gather). PyAutoArray PR #580 merged on 2026-09-27 as +`4383ea81`. ### Reproduce (RAL) From cc46e659bf5a73ef02be9893f344d0e5332be375 Mon Sep 17 00:00:00 2001 From: Jammy2211 Date: Sun, 27 Sep 2026 16:34:02 +0100 Subject: [PATCH 10/10] hpc(point_source_image): step-0 submits' WALL-BASIS rows use the run cell + measured walls (357321/357322/357335) Co-Authored-By: Claude Opus 5.5 --- ...e_image_solver_config_sweep_step0_gpu_node_cpu_fp64 | 8 ++++---- ...source_image_solver_config_sweep_step0_ral_cpu_fp64 | 9 +++++---- ...nt_source_image_solver_config_sweep_step0_a100_fp64 | 10 +++++----- 3 files changed, 14 insertions(+), 13 deletions(-) diff --git a/hpc/batch_cpu/submit_breakdown_point_source_image_solver_config_sweep_step0_gpu_node_cpu_fp64 b/hpc/batch_cpu/submit_breakdown_point_source_image_solver_config_sweep_step0_gpu_node_cpu_fp64 index 52fb83441..c0a0b1c3a 100644 --- a/hpc/batch_cpu/submit_breakdown_point_source_image_solver_config_sweep_step0_gpu_node_cpu_fp64 +++ b/hpc/batch_cpu/submit_breakdown_point_source_image_solver_config_sweep_step0_gpu_node_cpu_fp64 @@ -35,10 +35,10 @@ # leg on gpu-1. Only in-job ratios compare with the 8490H rows of phase 4a. # WALL-BASIS: -# Laptop run of this cell (same 4 routes + nopad, 200 + 200 draws, 20 x 20): -# 433 s. RAL job 356367 (26 configs) ran 787 s. 1500 s declared, headroom ~3. -# cell: point_source_image/solver_config_sweep_step0/simple device: cpu precision: fp64 -# source: measured-wall wall: 1500 ref: laptop-solver_config_sweep_step0 headroom: 3.0 +# RAL job 357335 (this cell, same 4 routes, EPYC 7702 euclid-ral-gpu-2 CPU-only, +# 8 CPUs, 200 + 200 draws, 20 x 20) ran 417 s (7:14 job wall). +# cell: point_source_image/solver_config_sweep/simple device: cpu precision: fp64 +# source: measured-wall wall: 417 ref: ral-job-357335-point_source_image-solver_config_sweep headroom: 3.0 #SBATCH -J point_source_step0_p4b_epyc #SBATCH --partition=gpu diff --git a/hpc/batch_cpu/submit_breakdown_point_source_image_solver_config_sweep_step0_ral_cpu_fp64 b/hpc/batch_cpu/submit_breakdown_point_source_image_solver_config_sweep_step0_ral_cpu_fp64 index 208e2bda5..607062247 100644 --- a/hpc/batch_cpu/submit_breakdown_point_source_image_solver_config_sweep_step0_ral_cpu_fp64 +++ b/hpc/batch_cpu/submit_breakdown_point_source_image_solver_config_sweep_step0_ral_cpu_fp64 @@ -32,10 +32,11 @@ # nodes are unreachable. # WALL-BASIS: -# Laptop run of this cell (same 4 routes + nopad, 200 + 200 draws, 20 x 20): -# 433 s. RAL job 356367 (26 configs) ran 787 s. 1500 s declared, headroom ~3. -# cell: point_source_image/solver_config_sweep_step0/simple device: cpu precision: fp64 -# source: measured-wall wall: 1500 ref: laptop-solver_config_sweep_step0 headroom: 3.0 +# RAL job 357321 (this cell, --step0-route control,gather,components,structured, +# 8490H euclid-ral-compute-10-4 under load ~200, 8 CPUs, 200 + 200 draws, 20 x 20) +# ran 480 s (8:08 job wall). Headroom 3 covers a quieter or busier node. +# cell: point_source_image/solver_config_sweep/simple device: cpu precision: fp64 +# source: measured-wall wall: 480 ref: ral-job-357321-point_source_image-solver_config_sweep headroom: 3.0 #SBATCH -J point_source_step0_p4b #SBATCH --partition=ral diff --git a/hpc/batch_gpu/submit_breakdown_point_source_image_solver_config_sweep_step0_a100_fp64 b/hpc/batch_gpu/submit_breakdown_point_source_image_solver_config_sweep_step0_a100_fp64 index 0e0c5aa08..0ba796fe7 100644 --- a/hpc/batch_gpu/submit_breakdown_point_source_image_solver_config_sweep_step0_a100_fp64 +++ b/hpc/batch_gpu/submit_breakdown_point_source_image_solver_config_sweep_step0_a100_fp64 @@ -29,11 +29,11 @@ # XLA_FLAGS are byte-identical to the CPU submit's. # WALL-BASIS: -# No A100 run of this cell yet; the laptop CPU run took 433 s. The A100 is -# launch-bound (per-call ~1-2 ms, the completeness draws dominate), so 3600 s -# is declared as an estimate. -# cell: point_source_image/solver_config_sweep_step0/simple device: gpu precision: fp64 -# source: estimate wall: 3600 ref: laptop-solver_config_sweep_step0 headroom: 2.0 +# RAL job 357322 (this cell, same 4 routes, A100 80 GB euclid-ral-gpu-1, 200 + 200 +# draws, 20 x 20) ran 432 s (7:32 job wall); the A100 is launch-bound, so the +# completeness draws dominate. +# cell: point_source_image/solver_config_sweep/simple device: gpu precision: fp64 +# source: measured-wall wall: 432 ref: ral-job-357322-point_source_image-solver_config_sweep headroom: 3.0 #SBATCH -J point_source_step0_p4b_gpu #SBATCH --partition=gpu