From 1c0cb70ced15bd03385547a39b19ce382331317f Mon Sep 17 00:00:00 2001 From: Jammy2211 Date: Wed, 23 Sep 2026 17:06:39 +0200 Subject: [PATCH 1/9] feat(profiling): interleaved vertex-dedup A/B cell for the PointSolver (#568) control (pre-fix jnp.unique body from PyAutoArray 11b93476, injected), nodedup (post-fix flat table + arange) and library (installed, self-labelled by HLO sort count) routes; fresh closures + jax.clear_caches() per route; log L / positions / grad / vmap gates recorded, never asserted. Co-Authored-By: Claude Fable 5.1 --- .../likelihood_breakdown/vertex_dedup_ab.py | 1179 +++++++++++++++++ 1 file changed, 1179 insertions(+) create mode 100644 scripts/point_source/likelihood_breakdown/vertex_dedup_ab.py diff --git a/scripts/point_source/likelihood_breakdown/vertex_dedup_ab.py b/scripts/point_source/likelihood_breakdown/vertex_dedup_ab.py new file mode 100644 index 000000000..94d4820c6 --- /dev/null +++ b/scripts/point_source/likelihood_breakdown/vertex_dedup_ab.py @@ -0,0 +1,1179 @@ +""" +JAX Profiling: PointSolver Vertex-Dedup A/B (point-source CPU campaign, phase 2) +================================================================================ + +An interleaved, in-process A/B of one library method — +``autoarray.structures.triangles.coordinate_array.CoordinateArrayTriangles +._vertices_and_indices`` — inside the production point-source likelihoods +(PyAutoArray #568). + +The mechanism +------------- + +``PointSolver._plane_triangles`` ray-traces ``triangles.vertices`` and rebuilds +the triangles with ``with_vertices``. On the JAX path ``vertices`` / +``indices`` come from ``_vertices_and_indices``, which (PyAutoArray main +``11b93476``) calls:: + + jnp.unique(flat_triangles, axis=0, return_inverse=True, + size=3 * N, equal_nan=True, fill_value=jnp.nan) + +``jnp.unique`` needs a static output shape under ``jit``, so it is handed +``size=3N`` — exactly the row count of the input it deduplicates. The +"deduplicated" table therefore has 3N rows (the real unique vertices plus NaN +fill), the ray trace evaluates all 3N of them, and the dedup saves **zero** +deflection evaluations while costing a lexicographic sort of 3N fp64 rows. The +property is read twice per refinement step (``vertices`` and ``indices`` each +evaluate it), so the sort is traced twice per step; XLA may CSE the pair, and +the HLO ``sort`` count recorded below says what survived. (Each row also records +the StableHLO count, which counts sort *definitions* inside private functions the +lowering reuses, not call sites — the optimised-HLO count is the one to read.) The NumPy sibling +(``coordinate_array_np.py``) calls ``np.unique`` with no ``size=`` and genuinely +shrinks the table; it is not touched here. See +``results/notes/point_source_cpu_2026_09_17_reported/pointsolver_cpu_research_note.md`` +§3 and §6 for the reported scratch evidence this cell re-measures properly. + +The fix drops the unique: the vertex table is the flat ``(3N, 2)`` triangle +array and the index map is ``arange(3N).reshape(-1, 3)``. NaN padding rows stay +NaN through the ray trace and every ``Shape.mask`` rejects them, so the kept +triangle set — and hence the likelihood — should be unchanged. Whether it is +*bit*-identical is measured, not assumed. + +The three routes +---------------- + +Each route swaps the class attribute for the duration of **tracing** only, via +:func:`route_injected` (pattern: ``scripts/misc/likelihood_breakdown/ +library_solver_injection.py`` — signature check, call counters, restore by +identity): + +- ``control`` — the PRE-fix body, carried verbatim in this file + (:func:`_control_vertices_and_indices`, copied from PyAutoArray main + ``11b93476``). Reproducible whatever library is installed. +- ``nodedup`` — the POST-fix body (:func:`_nodedup_vertices_and_indices`). +- ``library`` — no substitution: whatever the installed PyAutoArray does. The + route is wrapped only to count calls. It **self-labels**: the ``sort`` op count + of its lowered / compiled program is compared with the other two routes and + recorded as ``library_matches = control | nodedup | neither``. + +A route whose substitute is never called while tracing is a FAIL, not a number. +If ``control`` and ``nodedup`` lower to the same number of sorts the injection +did not take and the cell stops before timing anything. + +The measurement trap +-------------------- + +``jax`` caches traced jaxprs on function *identity*. The 2026-09-17 scratch run +first reported a speed-up with byte-identical HLO because ``jax.jit(same_fn)`` +re-served the pre-patch trace. Here every route lowers a **fresh** closure built +by a factory (fresh ``PointSolver`` and ``AnalysisPoint`` too) and calls +``jax.clear_caches()`` before lowering. Once lowered and compiled, an executable +no longer depends on the patch, so all three routes' executables coexist and the +timed calls run with nothing patched. + +The A/B protocol +---------------- + +Rows (``--models``): ``simple`` = the phase-1 harness model, dataset and solver +(``scripts/point_source/likelihood_breakdown/image_plane.py``: SIE lens, +``PointSolver.for_grid`` 100x100 @ 0.2", precision 0.001") with the fused +``FitPositionsImagePairAllSolved`` (``solved``) and ``FitPositionsImagePairAll`` +(``plain``) likelihoods, plus a ``vmap`` batch row of the solved likelihood +(``--vmap-batch``); ``cluster`` = the cluster cell's two-source 13-component +model (``scripts/cluster/likelihood_breakdown/image_plane.py`` step 5; solver +200x200 @ 0.7", precision 0.01") with fused ``FitPositionsImagePairRepeat`` +(``plain``) and ``FitPositionsImagePairRepeatSolved`` (``solved``) summed over +both systems. + +Each compiled likelihood takes the model's **physical parameter vector** and +builds the instance inside the trace (``instance_from_vector(xp=jnp)``, as +``autofit``'s JAX ``Fitness`` does), so every parameter is a runtime argument. +The vectors are a fixed-seed stream drawn from the priors around the fiducial +(unit cube ``U(0.25, 0.75)``; entry 0 is the prior-median fiducial itself), and +the same stream feeds every route. Every timed call is ``block_until_ready``'d. + +Per row: compile each route once, warm each ≥ 3 calls, then ``--rounds`` +round-robin rounds, the route order rotating each round, ``--calls`` calls per +route per round, walking the same instance stream. Per route: median, p10, p90, +min, max of the per-call ms; the median ratio ``control / nodedup`` with a +bootstrap 90 % interval; the minimum detectable improvement is the control +row's ``(p90 - p10) / median``. + +Correctness gates (recorded, never asserted — the architect decides): log +likelihood ``==`` across routes on every streamed instance (else max |Δ| and +relative Δ); solved image positions ``np.array_equal`` (NaN-aware) from a +separately compiled positions function per route; for the simple solved +likelihood, ``jax.grad`` w.r.t. the parameter vector ``allclose(rtol=1e-10, +atol=1e-12)`` and finite, and ``vmap`` results equal to the per-instance +results. The cluster rows carry the likelihood and position gates only: a +cluster gradient compile is minutes per route and phase 2 does not need it. + +Output +------ + +``results/breakdown/point_source/vertex_dedup_ab_.{json,png}``. The +JSON deliberately carries no top-level ``autolens_version`` (versions live under +``library_versions``): this is a note-backed A/B, and +``scripts/misc/tooling/build_readme.py`` only auto-tables config-tagged +breakdown JSONs whose ``autolens_version`` parses — which would render a +step-sum row this cell has no meaning for. +""" + +import os +import sys +import time +from pathlib import Path + + +def _profiling_root() -> Path: + for parent in Path(__file__).resolve().parents: + if (parent / "ruff.toml").exists(): + return parent + raise RuntimeError("autolens_profiling root (ruff.toml) not found") + + +_ROOT = _profiling_root() +_MISC = str(_ROOT / "scripts" / "misc") +if _MISC not in sys.path: + sys.path.insert(0, _MISC) +if str(_ROOT) not in sys.path: + sys.path.insert(0, str(_ROOT)) + +import argparse +import contextlib +import hashlib +import inspect +import json +import re + +import jax +import jax.numpy as jnp +import jaxlib +import matplotlib +import numpy as np + +if os.environ.get("AUTOLENS_PROFILING_SMOKE") == "1": + print(f"[smoke] {__file__}: imports + module setup OK; exiting.") + sys.exit(0) + +from likelihood_breakdown.provenance import source_revisions, thread_environment # noqa: E402 +from likelihood_breakdown.timing import block # noqa: E402 + +from _profile_cli import ( # noqa: E402 + auto_simulate_if_missing, + device_info_dict, + machine_info_dict, + parse_profile_cli, + resolve_output_paths, +) + +_WALL_START = time.perf_counter() +_LOADAVG_START = os.getloadavg() + +_cli = parse_profile_cli() +_cell_parser = argparse.ArgumentParser(add_help=False, allow_abbrev=False) +_cell_parser.add_argument("--rounds", type=int, default=None) +_cell_parser.add_argument("--calls", type=int, default=None) +_cell_parser.add_argument("--vmap-batch", type=int, default=4) +_cell_parser.add_argument("--n-stream", type=int, default=16) +_cell_parser.add_argument("--warm", type=int, default=3) +_cell_parser.add_argument("--gate-instances", type=int, default=3) +_cell_parser.add_argument("--seed", type=int, default=568) +_cell_parser.add_argument("--models", default=None, help="comma list of simple,cluster") +_cell_parser.add_argument( + "--quick", action="store_true", help="rounds=5, calls=3, simple model only" +) +_args = _cli.parse_cell_args(_cell_parser) + +QUICK = bool(_args.quick) +N_ROUNDS = _args.rounds if _args.rounds is not None else (5 if QUICK else 20) +N_CALLS = _args.calls if _args.calls is not None else (3 if QUICK else 5) +N_STREAM = _args.n_stream +N_WARM = max(3, _args.warm) +N_GATE = max(3, _args.gate_instances) +VMAP_BATCH = _args.vmap_batch +SEED = _args.seed +MODELS = tuple( + m.strip() + for m in (_args.models or ("simple" if QUICK else "simple,cluster")).split(",") + if m.strip() +) +for _m in MODELS: + if _m not in ("simple", "cluster"): + raise SystemExit(f"--models: unknown model {_m!r} (expected simple / cluster)") +if N_ROUNDS < 1 or N_CALLS < 1 or VMAP_BATCH < 1: + raise SystemExit("--rounds, --calls and --vmap-batch must be positive") + +matplotlib.use("Agg") +import autoarray as aa # noqa: E402 +import autofit as af # noqa: E402 +import autolens as al # noqa: E402 +import matplotlib.pyplot as plt # noqa: E402 +from autoarray.structures.triangles import coordinate_array as _coordinate_array # noqa: E402 +from autofit.jax import register_model as register_model_pytrees # noqa: E402 + +ROUTES = ("control", "nodedup", "library") +TARGET_DOTTED = ( + "autoarray.structures.triangles.coordinate_array.CoordinateArrayTriangles._vertices_and_indices" +) +#: PyAutoArray main commit the ``control`` body below was copied from, verbatim. +CONTROL_SOURCE_SHA = "11b93476" +BOOTSTRAP_SAMPLES = 2000 +BOOTSTRAP_SEED = 12345 +GRAD_RTOL = 1.0e-10 +GRAD_ATOL = 1.0e-12 + + +# --------------------------------------------------------------------------- +# The two substituted bodies +# --------------------------------------------------------------------------- + + +def _control_vertices_and_indices(self): + """PRE-fix ``_vertices_and_indices`` — verbatim from PyAutoArray ``11b93476``.""" + import jax.numpy as jnp + + flat_triangles = self.triangles.reshape(-1, 2) + vertices, inverse_indices = jnp.unique( + flat_triangles, + axis=0, + return_inverse=True, + size=3 * self.coordinates.shape[0], + equal_nan=True, + fill_value=jnp.nan, + ) + + nan_mask = jnp.isnan(vertices).any(axis=1) + inverse_indices = jnp.where(nan_mask[inverse_indices], -1, inverse_indices) + + indices = inverse_indices.reshape(-1, 3) + return vertices, indices + + +def _nodedup_vertices_and_indices(self): + """POST-fix ``_vertices_and_indices``: the flat 3N table and an ``arange`` index map.""" + import jax.numpy as jnp + + flat = self.triangles.reshape(-1, 2) + indices = jnp.arange(flat.shape[0]).reshape(-1, 3) + return flat, indices + + +_ROUTE_BODIES = { + "control": _control_vertices_and_indices, + "nodedup": _nodedup_vertices_and_indices, + "library": None, +} + + +@contextlib.contextmanager +def route_injected(route: str): + """Swap ``CoordinateArrayTriangles._vertices_and_indices`` for *route*. + + Scoped and restored by identity (checked on exit). Yields ``{"calls": n}``, + the number of times the route's property body ran — i.e. while tracing — so + the caller can refuse a route whose substitute never fired. ``library`` wraps + the installed property only to count; it computes exactly what it did. + """ + cls = _coordinate_array.CoordinateArrayTriangles + original = cls.__dict__["_vertices_and_indices"] + if not isinstance(original, property): + raise TypeError(f"{TARGET_DOTTED} is no longer a property: {type(original).__name__}") + params = list(inspect.signature(original.fget).parameters) + if params != ["self"]: + raise TypeError( + f"{TARGET_DOTTED} now takes {params}; the substituted bodies take (self) only. " + "The library changed under the injection — update this harness, not the library." + ) + body = _ROUTE_BODIES[route] or original.fget + counts = {"calls": 0} + + def counted(self): + counts["calls"] += 1 + return body(self) + + cls._vertices_and_indices = property(counted) + try: + yield counts + finally: + cls._vertices_and_indices = original + if cls.__dict__["_vertices_and_indices"] is not original: + raise RuntimeError(f"{TARGET_DOTTED} was not restored by identity") + + +# --------------------------------------------------------------------------- +# Structural readouts +# --------------------------------------------------------------------------- + +_STABLEHLO_SORT = re.compile(r"stablehlo\.sort\b") +_HLO_SORT_LINE = re.compile(r"^\s*(?:ROOT\s+)?%?[\w.\-]+\s*=\s*(.+?)\s+sort\(", re.M) + + +def _sort_readout(lowered, compiled) -> dict: + stablehlo = lowered.as_text() + hlo = compiled.as_text() + shapes = [m.group(1) for m in _HLO_SORT_LINE.finditer(hlo)] + return { + "hlo_sort_count": len(shapes), + "stablehlo_sort_count": len(_STABLEHLO_SORT.findall(stablehlo)), + "hlo_sort_shapes": shapes, + "hlo_sha256": hashlib.sha256(hlo.encode()).hexdigest()[:16], + "hlo_lines": hlo.count("\n"), + } + + +def _flops(compiled): + try: + cost = compiled.cost_analysis() + if isinstance(cost, list | tuple): + cost = cost[0] if cost else {} + value = (cost or {}).get("flops") + return float(value) if value is not None else None + except Exception as exc: # noqa: BLE001 — cost analysis is optional on some backends + return f"unavailable: {type(exc).__name__}" + + +def _compile_route(route: str, factory, example, *, label: str) -> dict: + """Lower a FRESH closure under *route* after ``jax.clear_caches()``; compile it.""" + jax.clear_caches() + fn = factory() + with route_injected(route) as counts: + t0 = time.perf_counter() + lowered = jax.jit(fn).lower(example) + lower_s = time.perf_counter() - t0 + if route != "library" and counts["calls"] == 0: + raise RuntimeError( + f"FAIL [{label}/{route}]: the substituted {TARGET_DOTTED} never ran while tracing, " + "so this route would time the library's own code under the wrong name." + ) + t0 = time.perf_counter() + compiled = lowered.compile() + compile_s = time.perf_counter() - t0 + t0 = time.perf_counter() + first = block(compiled(example)) + first_call_s = time.perf_counter() - t0 + readout = _sort_readout(lowered, compiled) + print( + f" [{label}/{route}] lower {lower_s:6.1f} s compile {compile_s:6.1f} s " + f"first {first_call_s * 1e3:8.2f} ms trace_calls {counts['calls']:3d} " + f"sorts {readout['hlo_sort_count']} (stablehlo {readout['stablehlo_sort_count']})" + ) + return { + "executable": compiled, + "first": first, + "record": { + "lower_s": float(lower_s), + "compile_s": float(compile_s), + "first_call_s": float(first_call_s), + "trace_calls": int(counts["calls"]), + "flops": _flops(compiled), + **readout, + }, + } + + +# --------------------------------------------------------------------------- +# Statistics +# --------------------------------------------------------------------------- + + +def _stats_ms(seconds) -> dict: + ms = np.asarray(seconds, dtype=float) * 1.0e3 + return { + "n": int(ms.size), + "median_ms": float(np.median(ms)), + "p10_ms": float(np.percentile(ms, 10)), + "p90_ms": float(np.percentile(ms, 90)), + "min_ms": float(ms.min()), + "max_ms": float(ms.max()), + "mean_ms": float(ms.mean()), + } + + +def _median_ratio(numerator, denominator, seed: int) -> dict: + num = np.asarray(numerator, dtype=float) + den = np.asarray(denominator, dtype=float) + rng = np.random.default_rng(seed) + boots = np.empty(BOOTSTRAP_SAMPLES) + for i in range(BOOTSTRAP_SAMPLES): + boots[i] = np.median(rng.choice(num, num.size)) / np.median(rng.choice(den, den.size)) + return { + "ratio": float(np.median(num) / np.median(den)), + "ci90_low": float(np.percentile(boots, 5)), + "ci90_high": float(np.percentile(boots, 95)), + "bootstrap_samples": BOOTSTRAP_SAMPLES, + } + + +def _array_delta(a, b) -> dict: + a = np.asarray(a, dtype=float) + b = np.asarray(b, dtype=float) + # Equal entries (including matching NaN / inf padding) contribute zero; an + # inf-vs-finite mismatch reports inf, never a NaN that nanmax would hide. + same = (a == b) | (np.isnan(a) & np.isnan(b)) + with np.errstate(invalid="ignore", over="ignore"): + diff = np.where(same, 0.0, np.abs(a - b)) + diff = np.where(np.isnan(diff), np.inf, diff) + scale = np.where(same, 1.0, np.maximum(np.abs(a), np.abs(b))) + rel = np.where(scale > 0, diff / np.where(scale > 0, scale, 1.0), diff) + return { + "bit_identical": bool(np.array_equal(a, b, equal_nan=True)), + "max_abs_delta": float(np.nanmax(diff)) if diff.size else 0.0, + "max_rel_delta": float(np.nanmax(rel)) if rel.size else 0.0, + "nan_pattern_equal": bool(np.array_equal(np.isnan(a), np.isnan(b))), + } + + +def _pairs(values_by_route: dict) -> dict: + return { + f"{a}_vs_{b}": _array_delta(values_by_route[a], values_by_route[b]) + for a, b in (("control", "nodedup"), ("control", "library"), ("nodedup", "library")) + } + + +# --------------------------------------------------------------------------- +# Instance streams +# --------------------------------------------------------------------------- + + +def _vector_stream(model, n: int, seed: int) -> np.ndarray: + """Fixed-seed physical vectors: entry 0 the prior medians, the rest U(0.25,0.75) draws.""" + rng = np.random.default_rng(seed) + vectors = [np.asarray(model.physical_values_from_prior_medians, dtype=float)] + for _ in range(n - 1): + unit = rng.uniform(0.25, 0.75, size=model.prior_count) + vectors.append(np.asarray(model.vector_from_unit_vector(unit), dtype=float)) + return np.stack(vectors) + + +# --------------------------------------------------------------------------- +# The two models +# --------------------------------------------------------------------------- + + +def _simple_setup() -> dict: + """Phase-1 harness model, dataset and solver (image_plane.py).""" + instrument = "simple" + dataset_path = _ROOT / "dataset" / "point_source" / instrument + auto_simulate_if_missing( + dataset_path, dataset_type="point_source", instrument=instrument, workspace_root=_ROOT + ) + dataset = al.from_json(file_path=dataset_path / "point_dataset_positions_only.json") + + def mass_model(): + mass = af.Model(al.mp.Isothermal) + mass.centre.centre_0 = af.GaussianPrior(mean=0.0, sigma=0.005) + mass.centre.centre_1 = af.GaussianPrior(mean=0.0, sigma=0.005) + mass.einstein_radius = af.GaussianPrior(mean=1.6, sigma=0.05) + mass.ell_comps.ell_comps_0 = af.GaussianPrior(mean=0.05263158, sigma=0.01) + mass.ell_comps.ell_comps_1 = af.GaussianPrior(mean=0.0, sigma=0.01) + return mass + + def model(solved: bool): + lens = af.Model(al.Galaxy, redshift=0.5, mass=mass_model()) + if solved: + point = af.Model(al.ps.PointSolved) + else: + point = af.Model(al.ps.PointFlux) + point.centre.centre_0 = af.GaussianPrior(mean=0.07, sigma=0.005) + point.centre.centre_1 = af.GaussianPrior(mean=0.07, sigma=0.005) + source = af.Model(al.Galaxy, redshift=1.0, point_0=point) + return af.Collection(galaxies=af.Collection(lens=lens, source=source)) + + def solver(): + return al.PointSolver.for_grid( + grid=al.Grid2D.uniform(shape_native=(100, 100), pixel_scales=0.2), + pixel_scale_precision=0.001, + magnification_threshold=0.1, + ) + + fit_cls = { + "solved": al.FitPositionsImagePairAllSolved, + "plain": al.FitPositionsImagePairAll, + } + return { + "datasets": [dataset], + "models": {"solved": model(True), "plain": model(False)}, + "fit_cls": fit_cls, + "solver": solver, + "configuration": { + "dataset": "dataset/point_source/simple/point_dataset_positions_only.json", + "solver_grid_shape": [100, 100], + "solver_grid_pixel_scale": 0.2, + "solver_pixel_scale_precision": 0.001, + "magnification_threshold": 0.1, + "likelihoods": { + "solved": "FitPositionsImagePairAllSolved", + "plain": "FitPositionsImagePairAll", + }, + }, + } + + +def _cluster_setup() -> dict: + """The cluster cell's two-source 13-component model (image_plane.py step 5).""" + dataset_path = _ROOT / "dataset" / "cluster" / "simple" + auto_simulate_if_missing( + dataset_path, dataset_type="cluster", instrument="simple", workspace_root=_ROOT + ) + dataset_list = al.list_from_csv(file_path=dataset_path / "point_datasets.csv") + redshift_lens = 0.5 + main_lens_params = [((0.0, 0.0), 8.0, 20.0, 3.0), ((10.0, 8.0), 5.0, 12.0, 1.2)] + scaling_table = al.galaxy_table_from_csv(file_path=dataset_path / "scaling_galaxies.csv") + b0_ref, rs_ref, ra_scaling, exponent = 0.12, 10.0, 0.1, 0.5 + lum_ref = max(scaling_table.luminosities) + z_source_max = max(float(d.redshift) for d in dataset_list) + + # Step 1 of the cluster cell: back-trace the observed images through the + # fiducial tracer and take each system's centroid as its model source centre. + tracer = al.Tracer( + galaxies=[ + al.Galaxy( + redshift=redshift_lens, + mass=al.mp.dPIEMassB0Sph(centre=centre, ra=ra, rs=rs, b0=b0), + ) + for centre, ra, rs, b0 in main_lens_params + ] + + [ + al.Galaxy( + redshift=redshift_lens, + mass=al.mp.dPIEMassB0Sph( + centre=tuple(centre), + ra=ra_scaling, + rs=rs_ref * (lum / lum_ref) ** exponent, + b0=b0_ref * (lum / lum_ref) ** exponent, + ), + ) + for centre, lum in zip(scaling_table.centres, scaling_table.luminosities) + ] + + [ + al.Galaxy( + redshift=redshift_lens, + dark=al.mp.NFWMCRLudlowSph( + centre=(0.0, 0.0), + mass_at_200=10**15.3, + redshift_object=redshift_lens, + redshift_source=z_source_max, + ), + ) + ] + + [ + al.Galaxy(redshift=float(d.redshift), **{d.name: al.ps.Point(centre=(0.0, 0.0))}) + for d in dataset_list + ] + ) + source_centres = [] + for d in dataset_list: + plane_index = tracer.plane_index_via_redshift_from(redshift=float(d.redshift)) + traced = np.asarray( + tracer.traced_grid_2d_list_from( + grid=al.Grid2DIrregular(np.atleast_2d(np.asarray(d.positions))) + )[plane_index] + ) + source_centres.append(tuple(traced.mean(axis=0))) + + def gaussian(mean, fraction=0.01, floor=0.01): + return af.GaussianPrior(mean=float(mean), sigma=max(abs(float(mean)) * fraction, floor)) + + def model(solved: bool): + galaxies = {} + for i, (centre, ra, rs, b0) in enumerate(main_lens_params): + mass = af.Model(al.mp.dPIEMassB0Sph) + mass.centre.centre_0 = gaussian(centre[0]) + mass.centre.centre_1 = gaussian(centre[1]) + mass.ra = gaussian(ra) + mass.rs = gaussian(rs) + mass.b0 = gaussian(b0) + galaxies[f"main_{i}"] = af.Model(al.Galaxy, redshift=redshift_lens, mass=mass) + scaling_b0 = gaussian(b0_ref, floor=0.001) + for i, (centre, lum) in enumerate(zip(scaling_table.centres, scaling_table.luminosities)): + ratio = (lum / lum_ref) ** exponent + mass = af.Model(al.mp.dPIEMassB0Sph) + mass.centre = tuple(centre) + mass.ra = ra_scaling + mass.rs = rs_ref * ratio + mass.b0 = scaling_b0 * ratio + galaxies[f"scaling_{i}"] = af.Model(al.Galaxy, redshift=redshift_lens, mass=mass) + dark = af.Model( + al.mp.NFWMCRLudlowSph, + mass_at_200=10**15.3, + redshift_object=redshift_lens, + redshift_source=z_source_max, + ) + dark.centre.centre_0 = gaussian(0.0) + dark.centre.centre_1 = gaussian(0.0) + galaxies["host_halo"] = af.Model(al.Galaxy, redshift=redshift_lens, dark=dark) + for i, (d, centre) in enumerate(zip(dataset_list, source_centres)): + if solved: + point = af.Model(al.ps.PointSolved) + else: + point = af.Model(al.ps.Point) + point.centre.centre_0 = gaussian(centre[0]) + point.centre.centre_1 = gaussian(centre[1]) + galaxies[f"source_{i}"] = af.Model( + al.Galaxy, redshift=float(d.redshift), **{d.name: point} + ) + return af.Collection(galaxies=af.Collection(**galaxies)) + + def solver(): + return al.PointSolver.for_grid( + grid=al.Grid2D.uniform(shape_native=(200, 200), pixel_scales=0.7), + pixel_scale_precision=0.01, + use_jax=True, + ) + + fit_cls = { + "solved": al.FitPositionsImagePairRepeatSolved, + "plain": al.FitPositionsImagePairRepeat, + } + return { + "datasets": list(dataset_list), + "models": {"solved": model(True), "plain": model(False)}, + "fit_cls": fit_cls, + "solver": solver, + "configuration": { + "dataset": "dataset/cluster/simple/point_datasets.csv", + "n_systems": len(dataset_list), + "n_mass_profiles": len(main_lens_params) + len(scaling_table.luminosities) + 1, + "solver_grid_shape": [200, 200], + "solver_grid_pixel_scale": 0.7, + "solver_pixel_scale_precision": 0.01, + "source_centres_from": "back-traced observed-image centroids (cluster cell step 1)", + "likelihoods": { + "solved": "FitPositionsImagePairRepeatSolved (summed over systems)", + "plain": "FitPositionsImagePairRepeat (summed over systems)", + }, + }, + } + + +def _likelihood_factory(setup: dict, variant: str): + """A factory of FRESH ``vector -> log L`` closures (fresh solver + analyses per call).""" + model = setup["models"][variant] + + def factory(): + solver = setup["solver"]() + analyses = [ + al.AnalysisPoint( + dataset=d, solver=solver, fit_positions_cls=setup["fit_cls"][variant], use_jax=True + ) + for d in setup["datasets"] + ] + + def log_likelihood(vector): + instance = model.instance_from_vector(vector=vector, xp=jnp) + total = 0.0 + for analysis in analyses: + total = total + analysis.log_likelihood_function(instance=instance) + return total + + return log_likelihood + + return factory + + +def _positions_factory(setup: dict, variant: str): + """A factory of FRESH ``vector -> tuple(model positions per system)`` closures.""" + model = setup["models"][variant] + + def factory(): + solver = setup["solver"]() + analyses = [ + al.AnalysisPoint( + dataset=d, solver=solver, fit_positions_cls=setup["fit_cls"][variant], use_jax=True + ) + for d in setup["datasets"] + ] + + def positions(vector): + instance = model.instance_from_vector(vector=vector, xp=jnp) + out = [] + for analysis in analyses: + model_data = analysis.fit_from(instance=instance).positions.model_data + out.append(jnp.asarray(getattr(model_data, "array", model_data))) + return tuple(out) + + return positions + + return factory + + +# --------------------------------------------------------------------------- +# One interleaved timing row +# --------------------------------------------------------------------------- + + +def _timed_call(executable, argument): + t0 = time.perf_counter() + out = block(executable(argument)) + return time.perf_counter() - t0, out + + +def _run_row(label: str, factory, stream: np.ndarray, *, batch: int | None = None) -> dict: + """Compile three routes, warm, interleave; return timings, values and structure.""" + print(f"\n--- row {label} ---") + if batch is None: + arguments = [jnp.asarray(v) for v in stream] + instance_ids = [[i] for i in range(len(stream))] + else: + n_batches = max(1, len(stream) // batch) + instance_ids = [ + [(b * batch + k) % len(stream) for k in range(batch)] for b in range(n_batches) + ] + arguments = [jnp.asarray(stream[ids]) for ids in instance_ids] + compiled = { + route: _compile_route(route, factory, arguments[0], label=label) for route in ROUTES + } + executables = {route: compiled[route]["executable"] for route in ROUTES} + + warm_s = {route: [] for route in ROUTES} + for route in ROUTES: + for w in range(N_WARM): + dt, _ = _timed_call(executables[route], arguments[w % len(arguments)]) + warm_s[route].append(dt) + + times = {route: [] for route in ROUTES} + per_round = {route: [] for route in ROUTES} + values = {route: {} for route in ROUTES} + deterministic = {route: True for route in ROUTES} + call_index = 0 + for r in range(N_ROUNDS): + order = ROUTES[r % len(ROUTES) :] + ROUTES[: r % len(ROUTES)] + start = call_index + for route in order: + round_times = [] + for c in range(N_CALLS): + k = (start + c) % len(arguments) + dt, out = _timed_call(executables[route], arguments[k]) + round_times.append(dt) + value = np.asarray(out, dtype=float) + if k in values[route]: + if not np.array_equal(values[route][k], value, equal_nan=True): + deterministic[route] = False + else: + values[route][k] = value + times[route].extend(round_times) + per_round[route].append(float(np.median(round_times))) + call_index = start + N_CALLS + + seen = sorted(set.intersection(*(set(values[r]) for r in ROUTES))) + value_arrays = {route: np.stack([values[route][k] for k in seen]) for route in ROUTES} + stats = {route: _stats_ms(times[route]) for route in ROUTES} + control = stats["control"] + paired = np.asarray(per_round["control"]) / np.asarray(per_round["nodedup"]) + row = { + "label": label, + "batch": batch, + "n_rounds": N_ROUNDS, + "n_calls_per_round": N_CALLS, + "n_warm": N_WARM, + "route_order": "round-robin, start rotated each round", + "per_call_ms": {route: [t * 1e3 for t in times[route]] for route in ROUTES}, + "warm_ms": {route: [t * 1e3 for t in warm_s[route]] for route in ROUTES}, + "stats": stats, + "ratio_control_over_nodedup": _median_ratio( + times["control"], times["nodedup"], BOOTSTRAP_SEED + ), + "ratio_library_over_nodedup": _median_ratio( + times["library"], times["nodedup"], BOOTSTRAP_SEED + 1 + ), + "ratio_control_over_library": _median_ratio( + times["control"], times["library"], BOOTSTRAP_SEED + 2 + ), + "paired_round_ratio_control_over_nodedup": { + "median": float(np.median(paired)), + "p10": float(np.percentile(paired, 10)), + "p90": float(np.percentile(paired, 90)), + }, + "minimum_detectable_improvement": float( + (control["p90_ms"] - control["p10_ms"]) / control["median_ms"] + ), + "compile": {route: compiled[route]["record"] for route in ROUTES}, + "instances_compared": [instance_ids[k] for k in seen], + "values": {route: value_arrays[route].tolist() for route in ROUTES}, + "deterministic_within_route": deterministic, + "likelihood_gate": _pairs(value_arrays), + } + if batch is None: + row["fiducial_log_likelihood"] = { + route: float(values[route][0]) for route in ROUTES if 0 in values[route] + } + print( + " median ms " + + " ".join(f"{route} {stats[route]['median_ms']:9.3f}" for route in ROUTES) + + f" control/nodedup {row['ratio_control_over_nodedup']['ratio']:.3f} " + f"[{row['ratio_control_over_nodedup']['ci90_low']:.3f}, " + f"{row['ratio_control_over_nodedup']['ci90_high']:.3f}]" + ) + return row + + +def _positions_gate(label: str, factory, stream: np.ndarray) -> dict: + print(f"\n--- positions gate {label} ---") + arguments = [jnp.asarray(v) for v in stream[:N_GATE]] + per_route = {} + compile_records = {} + for route in ROUTES: + compiled = _compile_route(route, factory, arguments[0], label=f"{label}_positions") + compile_records[route] = compiled["record"] + per_route[route] = [ + [np.asarray(p, dtype=float) for p in block(compiled["executable"](a))] + for a in arguments + ] + + def flat(route): + return np.concatenate([np.ravel(p) for inst in per_route[route] for p in inst]) + + pairs = {} + for a, b in (("control", "nodedup"), ("control", "library")): + delta = _array_delta(flat(a), flat(b)) + delta["array_equal_nan_aware"] = delta.pop("bit_identical") + pairs[f"{a}_vs_{b}"] = delta + return { + "n_instances": len(arguments), + "compile": compile_records, + "positions": { + route: [[p.tolist() for p in inst] for inst in per_route[route]] for route in ROUTES + }, + "finite_positions": { + route: [[int(np.isfinite(p).all(axis=-1).sum()) for p in inst] for inst in rows] + for route, rows in per_route.items() + }, + "pairs": pairs, + } + + +def _grad_gate(label: str, factory, stream: np.ndarray) -> dict: + print(f"\n--- gradient gate {label} ---") + arguments = [jnp.asarray(v) for v in stream[:N_GATE]] + + def grad_factory(): + return jax.grad(factory()) + + grads = {} + records = {} + for route in ROUTES: + compiled = _compile_route(route, grad_factory, arguments[0], label=f"{label}_grad") + records[route] = compiled["record"] + grads[route] = np.stack( + [np.asarray(block(compiled["executable"](a)), dtype=float) for a in arguments] + ) + pairs = {} + for a, b in (("control", "nodedup"), ("control", "library")): + delta = _array_delta(grads[a], grads[b]) + delta["allclose"] = bool(np.allclose(grads[a], grads[b], rtol=GRAD_RTOL, atol=GRAD_ATOL)) + pairs[f"{a}_vs_{b}"] = delta + return { + "n_instances": len(arguments), + "rtol": GRAD_RTOL, + "atol": GRAD_ATOL, + "compile": records, + "all_finite": {route: bool(np.isfinite(g).all()) for route, g in grads.items()}, + "gradients": {route: g.tolist() for route, g in grads.items()}, + "pairs": pairs, + } + + +def _vmap_gate(vmap_row: dict, scalar_row: dict) -> dict: + """``vmap`` batch values vs the scalar row's per-instance values, per route and across.""" + scalar_values = { + route: dict( + zip( + [ids[0] for ids in scalar_row["instances_compared"]], + np.asarray(scalar_row["values"][route]).ravel(), + ) + ) + for route in ROUTES + } + within = {} + for route in ROUTES: + batched, reference = [], [] + for ids, vals in zip(vmap_row["instances_compared"], vmap_row["values"][route]): + for i, v in zip(ids, np.ravel(vals)): + if i in scalar_values[route]: + batched.append(v) + reference.append(scalar_values[route][i]) + delta = _array_delta(batched, reference) + delta["allclose_rtol_1e-12"] = bool( + np.allclose(batched, reference, rtol=1e-12, atol=0.0, equal_nan=True) + ) + delta["n_compared"] = len(batched) + within[route] = delta + return {"vmap_vs_scalar_within_route": within, "across_routes": vmap_row["likelihood_gate"]} + + +def _library_label(rows: dict) -> dict: + per_row = {} + for label, row in rows.items(): + counts = {route: row["compile"][route]["hlo_sort_count"] for route in ROUTES} + if counts["control"] == counts["nodedup"]: + match = "injection_ineffective" + elif counts["library"] == counts["control"]: + match = "control" + elif counts["library"] == counts["nodedup"]: + match = "nodedup" + else: + match = "neither" + hashes = {route: row["compile"][route]["hlo_sha256"] for route in ROUTES} + per_row[label] = { + "hlo_sort_count": counts, + "stablehlo_sort_count": { + route: row["compile"][route]["stablehlo_sort_count"] for route in ROUTES + }, + "library_matches": match, + "library_hlo_identical_to": [ + route for route in ("control", "nodedup") if hashes[route] == hashes["library"] + ], + } + labels = {entry["library_matches"] for entry in per_row.values()} + overall = labels.pop() if len(labels) == 1 else "inconsistent" + return {"per_row": per_row, "library_matches": overall} + + +# =========================================================================== +# Run +# =========================================================================== + +rows: dict[str, dict] = {} +gates: dict[str, dict] = {} +model_configurations: dict[str, dict] = {} +free_parameters: dict[str, int] = {} + +for model_name in MODELS: + setup = _simple_setup() if model_name == "simple" else _cluster_setup() + model_configurations[model_name] = setup["configuration"] + # Pytree registration, as the phase-1 cells and autofit's JAX Fitness do. It is + # load-bearing for the gradient gate: without it, jax.grad of this likelihood + # w.r.t. the physical vector comes back identically ZERO (forward values are + # unaffected) — measured 2026-09-23 on PyAutoFit/PyAutoLens main. + for _model in setup["models"].values(): + register_model_pytrees(_model) + for variant in ("solved", "plain"): + model = setup["models"][variant] + free_parameters[f"{model_name}_{variant}"] = int(model.prior_count) + stream = _vector_stream(model, N_STREAM, SEED + (0 if variant == "solved" else 1)) + factory = _likelihood_factory(setup, variant) + label = f"{model_name}_{variant}" + rows[label] = _run_row(label, factory, stream) + if label == "simple_solved": + # Fail fast: if the two substituted bodies lower to the same program + # the injection did not take, and nothing below would mean anything. + counts = {r: rows[label]["compile"][r]["hlo_sort_count"] for r in ROUTES} + if counts["control"] == counts["nodedup"]: + raise RuntimeError( + f"FAIL: control and nodedup lower with the same sort count ({counts}); " + "the injection did not change the traced program." + ) + if variant == "solved": + gates[f"{label}_positions"] = _positions_gate( + label, _positions_factory(setup, variant), stream + ) + if label == "simple_solved": + gates[f"{label}_grad"] = _grad_gate(label, factory, stream) + vlabel = f"{label}_vmap{VMAP_BATCH}" + rows[vlabel] = _run_row( + vlabel, lambda f=factory: jax.vmap(f()), stream, batch=VMAP_BATCH + ) + gates[f"{vlabel}"] = _vmap_gate(rows[vlabel], rows[label]) + +library_label = _library_label(rows) + + +def _gate_summary() -> dict: + """One flat verdict table: every gate, control vs nodedup and control vs library.""" + summary = {} + for label, row in rows.items(): + for pair in ("control_vs_nodedup", "control_vs_library"): + g = row["likelihood_gate"][pair] + summary[f"{label}.log_likelihood.{pair}"] = { + "pass": g["bit_identical"], + "max_abs_delta": g["max_abs_delta"], + "max_rel_delta": g["max_rel_delta"], + } + for label, gate in gates.items(): + if label.endswith("_positions"): + for pair, g in gate["pairs"].items(): + summary[f"{label}.{pair}"] = { + "pass": g["array_equal_nan_aware"], + "max_abs_delta": g["max_abs_delta"], + } + elif label.endswith("_grad"): + for pair, g in gate["pairs"].items(): + summary[f"{label}.{pair}"] = { + "pass": g["allclose"] and all(gate["all_finite"].values()), + "bit_identical": g["bit_identical"], + "max_abs_delta": g["max_abs_delta"], + "max_rel_delta": g["max_rel_delta"], + } + else: + for route, g in gate["vmap_vs_scalar_within_route"].items(): + summary[f"{label}.vmap_vs_scalar.{route}"] = { + "pass": g["allclose_rtol_1e-12"], + "bit_identical": g["bit_identical"], + "max_abs_delta": g["max_abs_delta"], + } + return summary + + +gate_summary = _gate_summary() +bit_identical = all( + rows[label]["likelihood_gate"][pair]["bit_identical"] + for label in rows + for pair in ("control_vs_nodedup", "control_vs_library") +) + +config_name = _cli.config_name or ( + "local_cpu_fp64" if jax.default_backend() == "cpu" else "unlabelled_device_fp64" +) +_home = str(Path.home()) + + +def _scrub(obj): + """Replace the home directory in every string (no /home/ in a committed JSON).""" + if isinstance(obj, dict): + return {k: _scrub(v) for k, v in obj.items()} + if isinstance(obj, list | tuple): + return [_scrub(v) for v in obj] + if isinstance(obj, str) and _home and _home != "/": + return obj.replace(_home, "~") + return obj + + +device = device_info_dict() +if device.get("jax_compilation_cache_dir"): + device["jax_compilation_cache_dir"] = ( + "/" + Path(device["jax_compilation_cache_dir"]).name + ) + +summary = { + "cell": "vertex_dedup_ab", + "issue": "PyAutoLabs/PyAutoArray#568", + "config_name": config_name, + "quick": QUICK, + "models": list(MODELS), + "library_versions": { + "autolens": al.__version__, + "autoarray": aa.__version__, + "autofit": af.__version__, + }, + "package_versions": {"jax": jax.__version__, "jaxlib": jaxlib.__version__}, + "source_revisions": source_revisions(_ROOT), + "autoarray_imported_from": str(Path(aa.__file__).resolve().parent.parent), + "target": TARGET_DOTTED, + "control_source": { + "repo": "PyAutoArray", + "sha": CONTROL_SOURCE_SHA, + "path": "autoarray/structures/triangles/coordinate_array.py", + "body": inspect.getsource(_control_vertices_and_indices), + }, + "nodedup_body": inspect.getsource(_nodedup_vertices_and_indices), + "device": device, + "jax_devices": [str(d) for d in jax.devices()], + "machine": machine_info_dict(), + "thread_environment": thread_environment(), + "sched_affinity": len(os.sched_getaffinity(0)), + "os_cpu_count": os.cpu_count(), + "xla_flags": os.environ.get("XLA_FLAGS"), + "jax_platforms": os.environ.get("JAX_PLATFORMS"), + "jax_enable_x64": bool(jax.config.jax_enable_x64), + "loadavg_start": list(_LOADAVG_START), + "loadavg_end": list(os.getloadavg()), + "protocol": { + "routes": list(ROUTES), + "n_rounds": N_ROUNDS, + "n_calls_per_round": N_CALLS, + "n_warm": N_WARM, + "n_stream": N_STREAM, + "n_gate_instances": N_GATE, + "vmap_batch": VMAP_BATCH, + "instance_seed": SEED, + "instance_stream": "entry 0 = prior medians; rest = vector_from_unit_vector(U(0.25,0.75))", + "argument": "physical parameter vector; instance_from_vector(xp=jnp) inside the trace", + "cache_trap_guard": "fresh closure + fresh solver/analyses per route; jax.clear_caches()", + "bootstrap": {"samples": BOOTSTRAP_SAMPLES, "seed": BOOTSTRAP_SEED, "interval": "90%"}, + "cluster_gates": "log-likelihood and positions only (no cluster grad/vmap)", + "pytrees": "autofit.jax.register_model(model) for every model before any trace", + }, + "free_parameters": free_parameters, + "model_configuration": model_configurations, + "library_label": library_label, + "library_matches": library_label["library_matches"], + "bit_identical": bit_identical, + "gate_summary": gate_summary, + "rows": rows, + "gates": gates, + "wall_s": float(time.perf_counter() - _WALL_START), +} + +dict_path, chart_path = resolve_output_paths( + _cli, + default_dir=_ROOT / "results" / "breakdown" / "point_source", + default_basename="vertex_dedup_ab_local", + cell="vertex_dedup_ab", +) +dict_path.write_text(json.dumps(_scrub(summary), indent=2)) + +# --------------------------------------------------------------------------- +# PNG: per-row boxplots, control vs nodedup vs library +# --------------------------------------------------------------------------- +colours = {"control": "#C44E52", "nodedup": "#4C72B0", "library": "#8C8C8C"} +fig, axes = plt.subplots( + nrows=1, ncols=len(rows), figsize=(4.2 * len(rows), 5.0), constrained_layout=True +) +axes = np.atleast_1d(axes) +for ax, (label, row) in zip(axes, rows.items()): + data = [row["per_call_ms"][route] for route in ROUTES] + box = ax.boxplot(data, whis=(10, 90), showfliers=True, patch_artist=True) + for patch, route in zip(box["boxes"], ROUTES): + patch.set_facecolor(colours[route]) + patch.set_alpha(0.6) + ax.set_xticks(range(1, len(ROUTES) + 1)) + ax.set_xticklabels(ROUTES) + ax.set_ylabel("ms per call" + (f" (batch of {row['batch']})" if row["batch"] else "")) + ratio = row["ratio_control_over_nodedup"] + ax.set_title( + f"{label}\ncontrol/nodedup {ratio['ratio']:.2f}x " + f"[{ratio['ci90_low']:.2f}, {ratio['ci90_high']:.2f}]", + fontsize=9, + ) + ax.set_ylim(bottom=0) +fig.suptitle( + f"PointSolver vertex-dedup A/B ({config_name}); library_matches=" + f"{library_label['library_matches']}; bit_identical={bit_identical}; " + f"whiskers p10/p90", + fontsize=10, +) +fig.savefig(chart_path, dpi=150) +plt.close(fig) + +print("\n" + "=" * 100) +print(f"VERTEX-DEDUP A/B ({config_name}, rounds={N_ROUNDS}, calls/round={N_CALLS})") +print("=" * 100) +print( + f" {'row':<22} {'route':<8} {'median':>9} {'p10':>9} {'p90':>9} {'min':>9} {'max':>9}" + f" {'sorts':>6} {'compile_s':>9}" +) +for label, row in rows.items(): + for route in ROUTES: + s = row["stats"][route] + c = row["compile"][route] + print( + f" {label:<22} {route:<8} {s['median_ms']:9.3f} {s['p10_ms']:9.3f} {s['p90_ms']:9.3f}" + f" {s['min_ms']:9.3f} {s['max_ms']:9.3f} {c['hlo_sort_count']:6d}" + f" {c['compile_s']:9.1f}" + ) + ratio = row["ratio_control_over_nodedup"] + print( + f" {'':<22} control/nodedup {ratio['ratio']:.3f} " + f"[90% {ratio['ci90_low']:.3f}, {ratio['ci90_high']:.3f}] " + f"MDI {row['minimum_detectable_improvement']:.3f}" + ) +print("-" * 100) +print(f" library_matches: {library_label['library_matches']}") +print(f" bit_identical (log L, all rows, control vs nodedup/library): {bit_identical}") +for name, verdict in gate_summary.items(): + if not verdict["pass"]: + print(f" GATE NOT PASSED: {name}: {verdict}") +print(f" wall: {summary['wall_s']:.0f} s") +print(f" Results JSON: {dict_path}") +print(f" Results PNG: {chart_path}") From ce273aa2e396f7339345307aafca996d8d71b3f4 Mon Sep 17 00:00:00 2001 From: Jammy2211 Date: Wed, 23 Sep 2026 17:06:39 +0200 Subject: [PATCH 2/9] feat(hpc): RAL ral-partition submit for the vertex-dedup A/B (#568) Clone of the phase-1 point-source submit: 8 CPUs, BLAS pinned to 1, identical XLA_FLAGS, fresh per-job JAX cache, one full-protocol leg, --time=3:00:00 from a measured 939 s laptop wall (headroom 2.0). Co-Authored-By: Claude Fable 5.1 --- ..._point_source_vertex_dedup_ab_ral_cpu_fp64 | 156 ++++++++++++++++++ 1 file changed, 156 insertions(+) create mode 100755 hpc/batch_cpu/submit_breakdown_point_source_vertex_dedup_ab_ral_cpu_fp64 diff --git a/hpc/batch_cpu/submit_breakdown_point_source_vertex_dedup_ab_ral_cpu_fp64 b/hpc/batch_cpu/submit_breakdown_point_source_vertex_dedup_ab_ral_cpu_fp64 new file mode 100755 index 000000000..709fbc678 --- /dev/null +++ b/hpc/batch_cpu/submit_breakdown_point_source_vertex_dedup_ab_ral_cpu_fp64 @@ -0,0 +1,156 @@ +#!/bin/bash -l +# +# 2026-09 point-source CPU speed-up campaign, phase 2: the vertex-dedup A/B +# (PyAutoArray#568). +# +# WHAT THIS MEASURES. One interleaved, in-process A/B of +# CoordinateArrayTriangles._vertices_and_indices inside the production +# point-source likelihoods, on a quiet RAL CPU node: +# +# scripts/point_source/likelihood_breakdown/vertex_dedup_ab.py +# control = the PRE-fix jnp.unique(size=3N) body, carried verbatim in the +# cell (copied from PyAutoArray main 11b93476); +# nodedup = the POST-fix body (flat 3N vertex table + arange index map); +# library = no substitution -- whatever the shared install runs. The cell +# self-labels it (library_matches = control | nodedup | neither) +# from the HLO sort count of each route's compiled program. +# Rows: simple (phase-1 galaxy-scale model, 100x100 @ 0.2", precision 0.001") +# solved + plain + vmap-4 of solved; cluster (2 dPIE + 10 scaling dPIE + NFW, +# two sources, 200x200 @ 0.7", precision 0.01") solved + plain. Each route is +# compiled once from a fresh closure after jax.clear_caches(), warmed, then +# the three routes are timed round-robin (20 rounds x 5 calls, the route order +# rotating each round) on the same fixed-seed parameter-vector stream. +# Correctness gates (log L ==, solved positions array_equal, simple-solved +# grad allclose 1e-10 and vmap parity) are RECORDED, never asserted. +# +# The shared PyAutoArray on RAL stays on main: the cell injects both variants +# itself, so the control/nodedup comparison does not depend on which library is +# installed. Only the `library` route (and its library_matches label) does -- +# before the #568 fix is merged and synced it should read `control`. +# +# Writes results/breakdown/point_source/vertex_dedup_ab_hpc_ral_cpu_fp64.{json,png}. +# The laptop witness is vertex_dedup_ab_local_cpu_fp64 beside it; compare +# ratios within a host, never a bare millisecond across hosts. +# +# THREADS. OMP/MKL/OPENBLAS are pinned to 1 -- that pins the BLAS family only. +# The JAX CPU backend sizes its own intra-op (Eigen) thread pool from the CPUs +# the process can see, i.e. the 8 CPUs of --cpus-per-task=8, so these are +# 8-CPU JAX numbers, the same shape as the laptop's 8-core rows. The JSON +# records thread_environment, sched_affinity (len(os.sched_getaffinity(0))), +# os_cpu_count and loadavg at start and end. +# +# XLA_FLAGS are set IDENTICAL to the phase-1 submit and the laptop witness +# (device.xla_flags). activate.sh sets no XLA_FLAGS / JAX_* of its own. The two +# --xla_gpu_* flags are inert on CPU and are kept only so the recorded string +# matches byte for byte; constant_folding is disabled so a constant-foldable +# prefix cannot be pre-evaluated at compile time. + +# THE PARTITION THIS DECLARES, AND THE FALLBACK. +# +# `ral` (the CPU partition) is the partition meant for CPU work, so it is what +# the #SBATCH block below asks for. It was saturated for days in 2026-09-15's +# fixed-light work, so check before you submit: +# +# sinfo -p ral,gpu -N -o "%N %t %C %O" +# +# If `ral` would queue, the fallback is the gpu partition used CPUs-only, with +# NO --gres so both A100s stay free for the GPU cells: +# +# sbatch --partition=gpu --cpus-per-task=8 +# +# `imp` is NOT an option: euclid-imp-compute-* do not mount /mnt/ral, so the +# repo, the venv and activate.sh are absent and the job dies in 0 s. +# +# DECLARE THE PARTITION THAT ACTUALLY RAN. Whichever partition the job landed +# on (the provenance block prints the hostname; `sacct -j -o Partition` +# confirms it) is what the campaign note must report, and if it was the gpu +# fallback this header should be edited to say so -- a script that declares a +# partition its numbers never used is a trap, not a record. + +# WALL-BASIS: +# Laptop (WSL2, 8 cores, loaded, 2026-09-23): the committed +# vertex_dedup_ab_local_cpu_fp64 witness run of this exact cell and protocol +# (20 rounds x 5 calls, simple + cluster) took 939 s wall end to end +# (the JSON's wall_s), almost all of it the 18 route compiles. The phase-1 +# RAL rows compiled ~2x faster than the laptop; the 2.0 headroom and the +# 3-hour request cover a slower or busier node regardless. +# cell: point_source/vertex_dedup_ab/simple device: cpu precision: fp64 +# source: measured-wall wall: 939 ref: laptop-point_source-vertex_dedup_ab_local_cpu_fp64 headroom: 2.0 + +#SBATCH -J vertex_dedup_ab +#SBATCH --partition=ral +#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 + +# Derive the repo root from where this was submitted (hpc/batch_cpu/../..) +# rather than hardcoding /mnt/ral/jnightin/autolens_profiling, so it runs from +# a worktree of the feature branch. The -o/-e paths above are relative, so +# sbatch from inside hpc/batch_cpu/. +export AP_ROOT="$(cd "${SLURM_SUBMIT_DIR:-$(dirname "$0")}/../.." && pwd)" +echo "AP_ROOT=$AP_ROOT" +source $AP_ROOT/activate.sh + +# BLAS family only (see THREADS above); JAX's CPU pool sizes from the 8 CPUs. +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" +# Per-job caches: output/ is gitignored and ${SLURM_JOB_ID} keeps concurrent +# jobs on the same node from fighting over one cache directory. +export NUMBA_CACHE_DIR=$AP_ROOT/output/numba_cache_${SLURM_JOB_ID:-local} +export MPLCONFIGDIR=/tmp/matplotlib_${SLURM_JOB_ID:-local} +mkdir -p "$NUMBA_CACHE_DIR" "$MPLCONFIGDIR" +# Fresh JAX compile cache per job, as the phase-1 submit does: a seeded +# persistent cache changes compile times and kernels (results/notes/xla_autotune_triton_gemm.md), +# and RAL $HOME is node-local, so an inherited cache would not be reproducible. +# (Within the job, routes lower to different HLO, so the persistent cache cannot +# serve one route's executable to another.) +export JAX_COMPILATION_CACHE_DIR="$AP_ROOT/output/jax_cache/vertex_dedup_ab_${SLURM_JOB_ID:-local}" +rm -rf "$JAX_COMPILATION_CACHE_DIR" && mkdir -p "$JAX_COMPILATION_CACHE_DIR" +echo "JAX_COMPILATION_CACHE_DIR=$JAX_COMPILATION_CACHE_DIR (fresh)" + +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/likelihood_breakdown/vertex_dedup_ab" +echo "Precision: fp64 (JAX_ENABLE_X64=$JAX_ENABLE_X64)" +echo "Backend: JAX_PLATFORMS=$JAX_PLATFORMS" +echo "Thread env: OMP=$OMP_NUM_THREADS MKL=$MKL_NUM_THREADS OPENBLAS=$OPENBLAS_NUM_THREADS NPROC=$NPROC" +echo "XLA_FLAGS: $XLA_FLAGS" + +echo "=== source revisions (shared install, untouched) ===" +for r in PyAutoNerves PyAutoFit PyAutoArray PyAutoGalaxy PyAutoLens; do + printf '%-14s %s\n' "$r" "$(git -C /mnt/ral/jnightin/PyAuto/$r rev-parse HEAD 2>&1)" +done +echo "AP_ROOT rev: $(git -C $AP_ROOT rev-parse HEAD 2>&1)" +echo "AP_ROOT branch: $(git -C $AP_ROOT rev-parse --abbrev-ref HEAD 2>&1)" + +cd $AP_ROOT + +echo "=== import provenance ===" +python3 -c "import autoarray, autolens, autofit, autogalaxy, jax; print('autoarray.__file__ =', autoarray.__file__); print('autoarray.__version__ =', autoarray.__version__); print('autolens.__file__ =', autolens.__file__); print('autolens.__version__ =', autolens.__version__); print('autogalaxy.__file__ =', autogalaxy.__file__); print('autofit.__file__ =', autofit.__file__); print('jax.__version__ =', jax.__version__); print('jax devices =', jax.devices())" + +echo "==========================================" +echo "vertex-dedup A/B: control vs nodedup vs library (simple + cluster, full protocol)" +date +echo "loadavg: $(cat /proc/loadavg)" +python3 -u scripts/point_source/likelihood_breakdown/vertex_dedup_ab.py --config-name hpc_ral_cpu_fp64 + +echo "==========================================" +echo "loadavg: $(cat /proc/loadavg)" +echo "Finished." +date From d97556f8cdf62e63972964285615ca401aad37d0 Mon Sep 17 00:00:00 2001 From: Jammy2211 Date: Wed, 23 Sep 2026 17:06:39 +0200 Subject: [PATCH 3/9] results(profiling): laptop witness of the vertex-dedup A/B (#568) control/nodedup median ratio: simple solved 6.00x [5.91, 6.21], plain 6.04x, vmap-4 3.39x; cluster solved 2.29x [2.22, 2.33], plain 2.30x. All gates bit-identical; library_matches=control (canonical PyAutoArray 11b93476). Co-Authored-By: Claude Fable 5.1 --- .../vertex_dedup_ab_local_cpu_fp64.json | 5659 +++++++++++++++++ .../vertex_dedup_ab_local_cpu_fp64.png | Bin 0 -> 148480 bytes 2 files changed, 5659 insertions(+) create mode 100644 results/breakdown/point_source/vertex_dedup_ab_local_cpu_fp64.json create mode 100644 results/breakdown/point_source/vertex_dedup_ab_local_cpu_fp64.png diff --git a/results/breakdown/point_source/vertex_dedup_ab_local_cpu_fp64.json b/results/breakdown/point_source/vertex_dedup_ab_local_cpu_fp64.json new file mode 100644 index 000000000..31828ec65 --- /dev/null +++ b/results/breakdown/point_source/vertex_dedup_ab_local_cpu_fp64.json @@ -0,0 +1,5659 @@ +{ + "cell": "vertex_dedup_ab", + "issue": "PyAutoLabs/PyAutoArray#568", + "config_name": "local_cpu_fp64", + "quick": false, + "models": [ + "simple", + "cluster" + ], + "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": "043518479e686c84aef3a7a526c6a12739b99412", + "PyAutoNerves": "1fa613aa8d89a79613009fb66f5b4e2d21deb57a", + "PyAutoFit": "a736840127be7a3c21e15a5c945e94d8f1082983", + "PyAutoArray": "11b93476b2c7d9d32e5467deedfe9594c637d736", + "PyAutoGalaxy": "70a61e26cd715cefe7012a38285698091246a8a4", + "PyAutoLens": "2aaa1c1a8bb4a5923edf30a18451fcea330a6bd4" + }, + "autoarray_imported_from": "~/Code/PyAutoLabs/array/PyAutoArray", + "target": "autoarray.structures.triangles.coordinate_array.CoordinateArrayTriangles._vertices_and_indices", + "control_source": { + "repo": "PyAutoArray", + "sha": "11b93476", + "path": "autoarray/structures/triangles/coordinate_array.py", + "body": "def _profiling_root() -> Path:\n for parent in Path(__file__).resolve().parents:\n if (parent / \"ruff.toml\").exists():\n return parent\n raise RuntimeError(\"autolens_profiling root (ruff.toml) not found\")\n" + }, + "nodedup_body": "def _control_vertices_and_indices(self):\n \"\"\"PRE-fix ``_vertices_and_indices`` \u2014 verbatim from PyAutoArray ``11b93476``.\"\"\"\n import jax.numpy as jnp\n\n flat_triangles = self.triangles.reshape(-1, 2)\n vertices, inverse_indices = jnp.unique(\n flat_triangles,\n axis=0,\n return_inverse=True,\n size=3 * self.coordinates.shape[0],\n equal_nan=True,\n fill_value=jnp.nan,\n )\n\n nan_mask = jnp.isnan(vertices).any(axis=1)\n inverse_indices = jnp.where(nan_mask[inverse_indices], -1, inverse_indices)\n\n indices = inverse_indices.reshape(-1, 3)\n return vertices, indices\n", + "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": "1", + "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": 1, + "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": "1", + "OPENBLAS_NUM_THREADS": "1", + "MKL_NUM_THREADS": "1", + "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": "1", + "OPENBLAS_NUM_THREADS": "1", + "MKL_NUM_THREADS": "1" + }, + "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": [ + 3.82421875, + 3.14990234375, + 2.8603515625 + ], + "loadavg_end": [ + 1.5302734375, + 1.88623046875, + 2.61181640625 + ], + "protocol": { + "routes": [ + "control", + "nodedup", + "library" + ], + "n_rounds": 20, + "n_calls_per_round": 5, + "n_warm": 3, + "n_stream": 16, + "n_gate_instances": 3, + "vmap_batch": 4, + "instance_seed": 568, + "instance_stream": "entry 0 = prior medians; rest = vector_from_unit_vector(U(0.25,0.75))", + "argument": "physical parameter vector; instance_from_vector(xp=jnp) inside the trace", + "cache_trap_guard": "fresh closure + fresh solver/analyses per route; jax.clear_caches()", + "bootstrap": { + "samples": 2000, + "seed": 12345, + "interval": "90%" + }, + "cluster_gates": "log-likelihood and positions only (no cluster grad/vmap)", + "pytrees": "autofit.jax.register_model(model) for every model before any trace" + }, + "free_parameters": { + "simple_solved": 5, + "simple_plain": 8, + "cluster_solved": 13, + "cluster_plain": 17 + }, + "model_configuration": { + "simple": { + "dataset": "dataset/point_source/simple/point_dataset_positions_only.json", + "solver_grid_shape": [ + 100, + 100 + ], + "solver_grid_pixel_scale": 0.2, + "solver_pixel_scale_precision": 0.001, + "magnification_threshold": 0.1, + "likelihoods": { + "solved": "FitPositionsImagePairAllSolved", + "plain": "FitPositionsImagePairAll" + } + }, + "cluster": { + "dataset": "dataset/cluster/simple/point_datasets.csv", + "n_systems": 2, + "n_mass_profiles": 13, + "solver_grid_shape": [ + 200, + 200 + ], + "solver_grid_pixel_scale": 0.7, + "solver_pixel_scale_precision": 0.01, + "source_centres_from": "back-traced observed-image centroids (cluster cell step 1)", + "likelihoods": { + "solved": "FitPositionsImagePairRepeatSolved (summed over systems)", + "plain": "FitPositionsImagePairRepeat (summed over systems)" + } + } + }, + "library_label": { + "per_row": { + "simple_solved": { + "hlo_sort_count": { + "control": 15, + "nodedup": 7, + "library": 15 + }, + "stablehlo_sort_count": { + "control": 3, + "nodedup": 1, + "library": 3 + }, + "library_matches": "control", + "library_hlo_identical_to": [] + }, + "simple_solved_vmap4": { + "hlo_sort_count": { + "control": 15, + "nodedup": 7, + "library": 15 + }, + "stablehlo_sort_count": { + "control": 3, + "nodedup": 1, + "library": 3 + }, + "library_matches": "control", + "library_hlo_identical_to": [] + }, + "simple_plain": { + "hlo_sort_count": { + "control": 15, + "nodedup": 7, + "library": 15 + }, + "stablehlo_sort_count": { + "control": 3, + "nodedup": 1, + "library": 3 + }, + "library_matches": "control", + "library_hlo_identical_to": [] + }, + "cluster_solved": { + "hlo_sort_count": { + "control": 25, + "nodedup": 12, + "library": 25 + }, + "stablehlo_sort_count": { + "control": 3, + "nodedup": 1, + "library": 3 + }, + "library_matches": "control", + "library_hlo_identical_to": [] + }, + "cluster_plain": { + "hlo_sort_count": { + "control": 25, + "nodedup": 12, + "library": 25 + }, + "stablehlo_sort_count": { + "control": 3, + "nodedup": 1, + "library": 3 + }, + "library_matches": "control", + "library_hlo_identical_to": [] + } + }, + "library_matches": "control" + }, + "library_matches": "control", + "bit_identical": true, + "gate_summary": { + "simple_solved.log_likelihood.control_vs_nodedup": { + "pass": true, + "max_abs_delta": 0.0, + "max_rel_delta": 0.0 + }, + "simple_solved.log_likelihood.control_vs_library": { + "pass": true, + "max_abs_delta": 0.0, + "max_rel_delta": 0.0 + }, + "simple_solved_vmap4.log_likelihood.control_vs_nodedup": { + "pass": true, + "max_abs_delta": 0.0, + "max_rel_delta": 0.0 + }, + "simple_solved_vmap4.log_likelihood.control_vs_library": { + "pass": true, + "max_abs_delta": 0.0, + "max_rel_delta": 0.0 + }, + "simple_plain.log_likelihood.control_vs_nodedup": { + "pass": true, + "max_abs_delta": 0.0, + "max_rel_delta": 0.0 + }, + "simple_plain.log_likelihood.control_vs_library": { + "pass": true, + "max_abs_delta": 0.0, + "max_rel_delta": 0.0 + }, + "cluster_solved.log_likelihood.control_vs_nodedup": { + "pass": true, + "max_abs_delta": 0.0, + "max_rel_delta": 0.0 + }, + "cluster_solved.log_likelihood.control_vs_library": { + "pass": true, + "max_abs_delta": 0.0, + "max_rel_delta": 0.0 + }, + "cluster_plain.log_likelihood.control_vs_nodedup": { + "pass": true, + "max_abs_delta": 0.0, + "max_rel_delta": 0.0 + }, + "cluster_plain.log_likelihood.control_vs_library": { + "pass": true, + "max_abs_delta": 0.0, + "max_rel_delta": 0.0 + }, + "simple_solved_positions.control_vs_nodedup": { + "pass": true, + "max_abs_delta": 0.0 + }, + "simple_solved_positions.control_vs_library": { + "pass": true, + "max_abs_delta": 0.0 + }, + "simple_solved_grad.control_vs_nodedup": { + "pass": true, + "bit_identical": true, + "max_abs_delta": 0.0, + "max_rel_delta": 0.0 + }, + "simple_solved_grad.control_vs_library": { + "pass": true, + "bit_identical": true, + "max_abs_delta": 0.0, + "max_rel_delta": 0.0 + }, + "simple_solved_vmap4.vmap_vs_scalar.control": { + "pass": true, + "bit_identical": true, + "max_abs_delta": 0.0 + }, + "simple_solved_vmap4.vmap_vs_scalar.nodedup": { + "pass": true, + "bit_identical": true, + "max_abs_delta": 0.0 + }, + "simple_solved_vmap4.vmap_vs_scalar.library": { + "pass": true, + "bit_identical": true, + "max_abs_delta": 0.0 + }, + "cluster_solved_positions.control_vs_nodedup": { + "pass": true, + "max_abs_delta": 0.0 + }, + "cluster_solved_positions.control_vs_library": { + "pass": true, + "max_abs_delta": 0.0 + } + }, + "rows": { + "simple_solved": { + "label": "simple_solved", + "batch": null, + "n_rounds": 20, + "n_calls_per_round": 5, + "n_warm": 3, + "route_order": "round-robin, start rotated each round", + "per_call_ms": { + "control": [ + 29.961800002638483, + 29.83459999813931, + 31.12390000023879, + 31.108099999983096, + 31.30809999856865, + 30.980799998360453, + 30.88980000029551, + 30.832899999950314, + 34.10229999644798, + 31.23319999940577, + 33.5123000004387, + 33.486899999843445, + 34.41060000113794, + 33.68570000020554, + 34.86750000229222, + 36.72060000099009, + 35.529000000678934, + 33.9471000006597, + 34.27630000078352, + 35.444000001007225, + 31.527499999356223, + 31.2551999995776, + 30.69550000145682, + 31.374700000014855, + 35.05369999766117, + 30.82889999859617, + 31.381899996631546, + 31.391799999255454, + 31.941000001097564, + 31.56230000240612, + 31.328500001109205, + 31.696799997007474, + 33.63269999681506, + 33.32050000244635, + 31.828700000914978, + 38.2251000010001, + 30.83619999961229, + 35.15770000012708, + 31.499799999437528, + 31.154699998296564, + 29.700300001422875, + 29.695600002014544, + 29.874200001358986, + 30.189799999789102, + 30.844799999613315, + 32.12310000162688, + 31.889600002614316, + 33.66679999817279, + 33.1268000009004, + 33.35080000033486, + 31.408599999849685, + 30.558799997379538, + 30.844000000797678, + 31.67579999717418, + 31.935200000589248, + 30.120600000373088, + 30.015000000275904, + 30.50240000084159, + 30.907700001989724, + 30.915299998014234, + 30.864299998938804, + 31.83540000100038, + 31.069700002262834, + 31.446899996808497, + 31.184299998130882, + 30.799599997408222, + 33.632199996645795, + 34.98630000103731, + 44.086500001867535, + 33.897900000738446, + 31.29790000093635, + 32.15039999849978, + 32.70920000068145, + 31.061600002431078, + 30.71310000086669, + 32.840300002135336, + 32.09699999933946, + 32.45419999802834, + 32.36930000275606, + 31.95840000262251, + 33.03560000131256, + 34.096700001100544, + 38.71710000021267, + 34.42419999919366, + 34.297300000616815, + 33.84309999819379, + 33.830500000476604, + 34.02099999948405, + 35.64380000170786, + 33.397300001524854, + 34.19460000077379, + 34.24219999942579, + 34.74889999779407, + 34.156800000346266, + 33.859300001495285, + 50.217399999382906, + 46.82680000041728, + 53.3447999987402, + 46.06629999761935, + 48.816599999554455 + ], + "nodedup": [ + 5.272399997920729, + 6.436800002120435, + 5.891799999517389, + 5.082599996967474, + 4.995199997210875, + 5.5008999988785945, + 6.82559999768273, + 5.352899999707006, + 5.344900000636699, + 5.485599998792168, + 6.769199997506803, + 5.798099999083206, + 7.927700000436744, + 5.8209999988321215, + 6.385700002283556, + 5.768899998656707, + 5.643899999995483, + 5.803100000775885, + 5.969300000288058, + 5.632800002786098, + 5.593199999566423, + 5.392600000050152, + 5.352200001652818, + 5.2341000009619165, + 5.467400002089562, + 5.045300000347197, + 4.961900001944741, + 5.170000000362052, + 4.970900001353584, + 4.910900002869312, + 5.328499999450287, + 5.319500000041444, + 5.0025000018649735, + 5.170299999008421, + 5.283300000883173, + 5.28180000037537, + 5.1937999996880535, + 5.346499998267973, + 5.198200000450015, + 5.383600000641309, + 5.299399999785237, + 5.232799998339033, + 5.306099999870639, + 5.313699999533128, + 5.369400001654867, + 5.337599999620579, + 5.450499997095903, + 5.620899999485118, + 5.676800003129756, + 5.480899999383837, + 5.161000000953209, + 5.970300000626594, + 5.084000000351807, + 5.224100001214538, + 5.243699997663498, + 4.99850000051083, + 5.131199999595992, + 4.94520000211196, + 4.981599999155151, + 5.132999998750165, + 5.092799998237751, + 5.266100000881124, + 5.770600000687409, + 5.016399998567067, + 4.946100001689047, + 5.189399998926092, + 5.0315999978920445, + 5.165300000953721, + 5.056599999079481, + 5.063100001279963, + 5.108899997139815, + 5.188099999941187, + 4.998399999749381, + 5.858700002136175, + 5.210399998759385, + 5.246200002147816, + 5.4286000013235025, + 5.727799998567207, + 5.237299999862444, + 5.397199998697033, + 4.946900000504684, + 5.203299999266164, + 5.256700002064463, + 5.37639999674866, + 5.220700000791112, + 5.432399997516768, + 5.338499999197666, + 6.519500002468703, + 5.904699999518925, + 5.498900001839502, + 5.362799998692935, + 8.649199997307733, + 5.5623000007472, + 5.424999999377178, + 5.47050000022864, + 5.478699997183867, + 7.303400001546834, + 5.698199998732889, + 10.291200000210665, + 6.1300000015762635 + ], + "library": [ + 31.268599999748403, + 33.752600000298116, + 32.71699999822886, + 32.13749999849824, + 34.55570000005537, + 32.47209999972256, + 32.36000000106287, + 31.69479999996838, + 31.928299998980947, + 31.911499998386716, + 30.842899999697693, + 31.17480000219075, + 32.078700001875404, + 32.76489999916521, + 32.70460000203457, + 32.75390000271727, + 33.95989999989979, + 33.341700000164565, + 32.739300000685034, + 33.208799999556504, + 32.640199999150354, + 31.773899998370325, + 31.785899998794775, + 31.621699999959674, + 31.39319999900181, + 32.09250000145403, + 31.73129999777302, + 31.168600002274616, + 31.161900002189213, + 30.34710000065388, + 31.71220000149333, + 32.0653000017046, + 31.664199999795528, + 32.141899999260204, + 31.812500001251465, + 31.33430000161752, + 30.844000000797678, + 32.21040000062203, + 30.707499998243293, + 31.135999997786712, + 30.493399997794768, + 31.302100000175415, + 29.986499997903593, + 29.879900001105852, + 29.52989999903366, + 35.26650000276277, + 32.85849999883794, + 33.085200000641635, + 32.204600000113714, + 31.659599997510668, + 31.82800000286079, + 31.88889999728417, + 31.931600002280902, + 31.94880000228295, + 31.73140000217245, + 30.62349999891012, + 30.93040000021574, + 30.77599999960512, + 30.677499999001157, + 30.576599998312304, + 30.844600001728395, + 31.00090000225464, + 30.778899999859277, + 30.43959999922663, + 30.857399997330504, + 31.236200000421377, + 30.82919999724254, + 31.040300000313437, + 31.012199997348944, + 30.56270000161021, + 32.89320000112639, + 32.93929999927059, + 32.381299999542534, + 31.93209999881219, + 31.7125000001397, + 31.906799998978386, + 32.39830000165966, + 30.983199998445343, + 30.612999998993473, + 31.372299999929965, + 31.590799997502472, + 31.718800000817282, + 32.005900000513066, + 32.07810000094469, + 32.15289999934612, + 35.57100000034552, + 34.70589999778895, + 36.99680000136141, + 36.3495999990846, + 34.28709999934654, + 33.21779999896535, + 32.940299999609124, + 33.9748000005784, + 36.22440000253846, + 33.09910000098171, + 70.71159999759402, + 93.56440000192379, + 72.40079999974114, + 87.1898000004876, + 63.61499999911757 + ] + }, + "warm_ms": { + "control": [ + 31.718700000055833, + 32.483199996931944, + 30.934499998693354 + ], + "nodedup": [ + 5.117700002301717, + 5.006400002457667, + 4.883300000074087 + ], + "library": [ + 29.798999999911757, + 29.808499999489868, + 29.927400002634386 + ] + }, + "stats": { + "control": { + "n": 100, + "median_ms": 32.027700000980985, + "p10_ms": 30.681830001049093, + "p90_ms": 35.54048000078183, + "min_ms": 29.695600002014544, + "max_ms": 53.3447999987402, + "mean_ms": 33.41528700002527 + }, + "nodedup": { + "n": 100, + "median_ms": 5.338049999409122, + "p10_ms": 5.002100001729559, + "p90_ms": 5.986270000721563, + "min_ms": 4.910900002869312, + "max_ms": 10.291200000210665, + "mean_ms": 5.533444999928179 + }, + "library": { + "n": 100, + "median_ms": 31.90914999868255, + "p10_ms": 30.672099998992053, + "p90_ms": 34.761959998286336, + "min_ms": 29.52989999903366, + "max_ms": 93.56440000192379, + "mean_ms": 34.33019999996759 + } + }, + "ratio_control_over_nodedup": { + "ratio": 5.999887600252187, + "ci90_low": 5.907554157498403, + "ci90_high": 6.207073054647426, + "bootstrap_samples": 2000 + }, + "ratio_library_over_nodedup": { + "ratio": 5.977679115447518, + "ci90_low": 5.918376196403529, + "ci90_high": 6.048629984591445, + "bootstrap_samples": 2000 + }, + "ratio_control_over_library": { + "ratio": 1.0037152353573608, + "ci90_low": 0.9909035161619201, + "ci90_high": 1.0385422489119152, + "bootstrap_samples": 2000 + }, + "paired_round_ratio_control_over_nodedup": { + "median": 6.0383381163670595, + "p10": 5.645909545724053, + "p90": 6.582043515579487 + }, + "minimum_detectable_improvement": 0.15170149587962659, + "compile": { + "control": { + "lower_s": 4.691511199998786, + "compile_s": 9.526533799999015, + "first_call_s": 0.044606800001929514, + "trace_calls": 32, + "flops": 15582802.0, + "hlo_sort_count": 15, + "stablehlo_sort_count": 3, + "hlo_sort_shapes": [ + "(f64[69849]{0}, f64[69849]{0}, s64[69849]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})" + ], + "hlo_sha256": "e53d1ecfe40cfe9c", + "hlo_lines": 28583 + }, + "nodedup": { + "lower_s": 5.53715259999808, + "compile_s": 6.606064499999775, + "first_call_s": 0.006674500000372063, + "trace_calls": 32, + "flops": 7053434.0, + "hlo_sort_count": 7, + "stablehlo_sort_count": 1, + "hlo_sort_shapes": [ + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})" + ], + "hlo_sha256": "e13e90248735ae47", + "hlo_lines": 24404 + }, + "library": { + "lower_s": 3.955831600000238, + "compile_s": 7.196297700000287, + "first_call_s": 0.031233900001097936, + "trace_calls": 32, + "flops": 15582802.0, + "hlo_sort_count": 15, + "stablehlo_sort_count": 3, + "hlo_sort_shapes": [ + "(f64[69849]{0}, f64[69849]{0}, s64[69849]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})" + ], + "hlo_sha256": "5c1d720142a1331d", + "hlo_lines": 28583 + } + }, + "instances_compared": [ + [ + 0 + ], + [ + 1 + ], + [ + 2 + ], + [ + 3 + ], + [ + 4 + ], + [ + 5 + ], + [ + 6 + ], + [ + 7 + ], + [ + 8 + ], + [ + 9 + ], + [ + 10 + ], + [ + 11 + ], + [ + 12 + ], + [ + 13 + ], + [ + 14 + ], + [ + 15 + ] + ], + "values": { + "control": [ + 7.743201200876812, + 4.901199826003542, + 8.551453428732437, + 7.640170398958149, + 7.2580956747803445, + 9.29357838657636, + 3.0338796505151917, + 8.714615086385912, + 4.735173159474494, + 3.2233889243165805, + 9.296501815740573, + 6.7486158154711955, + -1.4028143150641306, + 0.5885274382499945, + 6.162997261446639, + -10.49915087893337 + ], + "nodedup": [ + 7.743201200876812, + 4.901199826003542, + 8.551453428732437, + 7.640170398958149, + 7.2580956747803445, + 9.29357838657636, + 3.0338796505151917, + 8.714615086385912, + 4.735173159474494, + 3.2233889243165805, + 9.296501815740573, + 6.7486158154711955, + -1.4028143150641306, + 0.5885274382499945, + 6.162997261446639, + -10.49915087893337 + ], + "library": [ + 7.743201200876812, + 4.901199826003542, + 8.551453428732437, + 7.640170398958149, + 7.2580956747803445, + 9.29357838657636, + 3.0338796505151917, + 8.714615086385912, + 4.735173159474494, + 3.2233889243165805, + 9.296501815740573, + 6.7486158154711955, + -1.4028143150641306, + 0.5885274382499945, + 6.162997261446639, + -10.49915087893337 + ] + }, + "deterministic_within_route": { + "control": true, + "nodedup": true, + "library": true + }, + "likelihood_gate": { + "control_vs_nodedup": { + "bit_identical": true, + "max_abs_delta": 0.0, + "max_rel_delta": 0.0, + "nan_pattern_equal": true + }, + "control_vs_library": { + "bit_identical": true, + "max_abs_delta": 0.0, + "max_rel_delta": 0.0, + "nan_pattern_equal": true + }, + "nodedup_vs_library": { + "bit_identical": true, + "max_abs_delta": 0.0, + "max_rel_delta": 0.0, + "nan_pattern_equal": true + } + }, + "fiducial_log_likelihood": { + "control": 7.743201200876812, + "nodedup": 7.743201200876812, + "library": 7.743201200876812 + } + }, + "simple_solved_vmap4": { + "label": "simple_solved_vmap4", + "batch": 4, + "n_rounds": 20, + "n_calls_per_round": 5, + "n_warm": 3, + "route_order": "round-robin, start rotated each round", + "per_call_ms": { + "control": [ + 50.51800000001094, + 52.09060000197496, + 49.66499999864027, + 49.47539999920991, + 49.828899998829, + 48.90729999897303, + 49.1489999985788, + 49.784599999838974, + 48.7743000012415, + 47.19209999893792, + 47.54969999703462, + 48.46689999976661, + 49.31610000130604, + 49.30719999902067, + 49.61130000083358, + 51.34879999968689, + 48.272399999405025, + 64.2980999982683, + 47.42970000006608, + 48.2449999981327, + 49.03879999983474, + 63.069800002267584, + 52.57629999687197, + 51.92639999950188, + 51.947500000096625, + 55.86850000327104, + 50.85479999979725, + 49.09179999958724, + 56.83379999754834, + 62.03610000011395, + 80.98679999966407, + 67.1053000005486, + 75.98890000008396, + 82.64380000036908, + 141.6973000013968, + 136.02219999665977, + 57.4720000004163, + 58.830699999816716, + 58.42570000095293, + 55.56530000103521, + 62.31539999862434, + 56.69269999998505, + 60.362500000337604, + 70.28429999991204, + 61.44439999843598, + 111.09620000206633, + 67.94140000056359, + 55.961699999897974, + 59.636599999066675, + 51.913899998908164, + 61.306399999011774, + 48.84429999947315, + 54.44799999895622, + 51.76969999956782, + 52.45149999973364, + 55.44430000009015, + 50.9185000009893, + 52.42770000040764, + 48.03410000022268, + 48.441400002047885, + 47.26459999801591, + 49.43450000064331, + 48.97479999999632, + 48.1644999999844, + 47.80899999968824, + 66.9677000005322, + 58.56990000029327, + 52.90379999860306, + 51.94670000128099, + 48.59209999995073, + 43.44979999950738, + 43.982499999401625, + 43.96479999923031, + 45.37300000083633, + 54.06179999772576, + 57.91260000114562, + 45.843100000638515, + 45.511200001783436, + 50.645300001633586, + 47.20670000097016, + 49.7523000012734, + 60.86929999946733, + 61.7086999991443, + 73.26000000102795, + 89.71949999977369, + 55.19579999963753, + 53.67800000021816, + 62.789299998257775, + 53.5846999991918, + 51.39950000011595, + 50.08979999911389, + 53.157499998633284, + 47.30769999878248, + 59.24750000122003, + 45.3111999995599, + 45.65849999926286, + 46.24540000077104, + 59.34049999996205, + 44.53799999828334, + 43.62870000113617 + ], + "nodedup": [ + 14.970300002460135, + 21.041100000729784, + 15.194900002825307, + 14.776500000152737, + 14.935700000933139, + 14.48040000104811, + 14.624399998865556, + 16.81280000047991, + 14.961699998821132, + 15.35870000225259, + 19.46479999969597, + 15.009499998996034, + 17.857300001196563, + 14.682599998195656, + 14.827599999989616, + 18.558599997049896, + 14.9230000024545, + 14.667399998870678, + 21.539900000789203, + 16.80100000157836, + 15.116200000193203, + 14.79029999973136, + 17.169300001114607, + 15.171200000622775, + 15.05419999739388, + 24.926399997639237, + 33.513000002130866, + 24.060199997620657, + 31.754999999975553, + 20.54100000168546, + 32.954500002233544, + 35.069199999270495, + 25.54940000118222, + 51.76959999880637, + 19.710399999894435, + 21.83349999904749, + 40.56209999907878, + 37.54109999863431, + 35.284699999465374, + 29.279200000019046, + 41.17780000160565, + 24.293499998748302, + 56.019799998466624, + 35.545999999158084, + 32.24899999986519, + 22.224699998332653, + 21.270599998388207, + 15.907600001810351, + 15.72650000161957, + 15.30579999962356, + 23.07220000147936, + 20.746499998494983, + 24.04969999770401, + 16.385400002036477, + 17.21719999841298, + 14.890700000250945, + 13.963199999125209, + 15.551600001344923, + 16.562400000111666, + 14.092800000071293, + 14.826800001173979, + 14.31349999984377, + 13.995199999044416, + 15.46030000099563, + 15.320599999540718, + 13.53690000178176, + 16.226999996433733, + 14.445299999351846, + 16.29559999855701, + 14.725400000315858, + 13.212000001658453, + 16.006099998776335, + 13.756500000454253, + 14.188699999067467, + 14.646399999037385, + 14.062500002182787, + 18.78690000012284, + 14.133000000583706, + 14.09829999829526, + 13.838999999279622, + 14.05960000192863, + 13.72800000171992, + 17.059399997378932, + 15.856699999858392, + 14.553500001056818, + 15.19429999825661, + 15.690000000176951, + 17.03320000160602, + 14.448499998252373, + 15.191599999525351, + 14.185099997121142, + 13.866799999959767, + 13.61709999764571, + 13.623200000438374, + 13.288800000736956, + 13.819400002830662, + 13.753699997323565, + 13.800299999275012, + 13.528800001950003, + 14.973599998484133 + ], + "library": [ + 49.92800000036368, + 49.470099998870865, + 47.95569999987492, + 47.82150000028196, + 49.563900000066496, + 53.99269999907119, + 51.76559999745223, + 51.98989999917103, + 49.71049999949173, + 57.09070000011707, + 54.89269999816315, + 47.87470000155736, + 52.595999997720355, + 47.69500000111293, + 47.512599998299265, + 54.689099997631274, + 55.03160000080243, + 54.712600001948886, + 50.37630000151694, + 51.373700000112876, + 49.3943000001309, + 49.820500000350876, + 55.112499998358544, + 49.30909999893629, + 49.046799998905044, + 50.81810000046971, + 53.58150000029127, + 49.21250000188593, + 49.09340000085649, + 54.56259999846225, + 70.5571999969834, + 64.44109999938519, + 150.22749999843654, + 95.64010000030976, + 89.64849999756552, + 109.47139999916544, + 141.81319999988773, + 93.45430000030319, + 77.17960000081803, + 135.06799999959185, + 56.234499999845866, + 61.75419999999576, + 56.59139999988838, + 57.23790000047302, + 53.292399999918416, + 51.39410000265343, + 49.93259999901056, + 51.7044000007445, + 69.70010000077309, + 52.25410000275588, + 55.04460000156541, + 54.41430000064429, + 53.44200000035926, + 53.95340000177384, + 54.959999997663544, + 50.01360000096611, + 48.71350000030361, + 47.81409999850439, + 47.304300001997035, + 48.799899999721674, + 47.97319999852334, + 48.99450000084471, + 45.03189999741153, + 47.840899998846, + 46.93589999806136, + 47.98749999827123, + 48.226200000499375, + 49.08350000187056, + 49.23899999994319, + 54.811800000607036, + 46.91929999899003, + 46.28709999815328, + 45.0767000002088, + 47.645999999076594, + 46.20060000161175, + 47.362100001919316, + 56.4345000020694, + 49.12820000026841, + 46.60349999903701, + 47.11630000019795, + 47.580000002199085, + 47.14330000206246, + 47.26959999970859, + 51.744199998211116, + 46.94430000017746, + 85.11500000167871, + 109.400999997888, + 94.49620000305003, + 67.10759999987204, + 58.702999998786254, + 46.23870000068564, + 48.43029999756254, + 53.127999999560416, + 47.500299999228446, + 51.42629999681958, + 49.571700001251884, + 46.69780000040191, + 47.42210000040359, + 57.45730000126059, + 45.91380000056233 + ] + }, + "warm_ms": { + "control": [ + 68.60389999928884, + 50.01310000079684, + 59.162000001379056 + ], + "nodedup": [ + 15.192599999863887, + 20.61669999966398, + 15.211099998850841 + ], + "library": [ + 50.35459999999148, + 51.96029999933671, + 50.486399999499554 + ] + }, + "stats": { + "control": { + "n": 100, + "median_ms": 51.92014999920502, + "p10_ms": 46.20517000075779, + "p90_ms": 67.18891000055011, + "min_ms": 43.44979999950738, + "max_ms": 141.6973000013968, + "mean_ms": 56.44007499984582 + }, + "nodedup": { + "n": 100, + "median_ms": 15.313199999582139, + "p10_ms": 13.817490002475097, + "p90_ms": 32.31955000010203, + "min_ms": 13.212000001658453, + "max_ms": 56.019799998466624, + "mean_ms": 19.105392999917967 + }, + "library": { + "n": 100, + "median_ms": 50.19495000124152, + "p10_ms": 46.94345999996585, + "p90_ms": 77.97314000090417, + "min_ms": 45.03189999741153, + "max_ms": 150.22749999843654, + "mean_ms": 57.5223969999206 + } + }, + "ratio_control_over_nodedup": { + "ratio": 3.3905486769990465, + "ci90_low": 3.2012564396917647, + "ci90_high": 3.4846240811845246, + "bootstrap_samples": 2000 + }, + "ratio_library_over_nodedup": { + "ratio": 3.277887704895856, + "ci90_low": 3.131820156929286, + "ci90_high": 3.425001184509755, + "bootstrap_samples": 2000 + }, + "ratio_control_over_library": { + "ratio": 1.0343699913620958, + "ci90_low": 0.982691790127568, + "ci90_high": 1.0606153678617296, + "bootstrap_samples": 2000 + }, + "paired_round_ratio_control_over_nodedup": { + "median": 3.2967905786722116, + "p10": 2.190063481610674, + "p90": 3.68401496626218 + }, + "minimum_detectable_improvement": 0.4041540712057576, + "compile": { + "control": { + "lower_s": 8.299443600000814, + "compile_s": 11.056213799998659, + "first_call_s": 0.07492379999894183, + "trace_calls": 32, + "flops": 33662500.0, + "hlo_sort_count": 15, + "stablehlo_sort_count": 3, + "hlo_sort_shapes": [ + "(f64[69849]{0}, f64[69849]{0}, s64[69849]{0})", + "(f64[4,60]{1,0}, f64[4,60]{1,0}, s64[4,60]{1,0})", + "(f64[4,720]{1,0}, f64[4,720]{1,0}, s64[4,720]{1,0})", + "(f64[4,60]{1,0}, f64[4,60]{1,0}, s64[4,60]{1,0})", + "(f64[4,720]{1,0}, f64[4,720]{1,0}, s64[4,720]{1,0})", + "(f64[4,60]{1,0}, f64[4,60]{1,0}, s64[4,60]{1,0})", + "(f64[4,720]{1,0}, f64[4,720]{1,0}, s64[4,720]{1,0})", + "(f64[4,60]{1,0}, f64[4,60]{1,0}, s64[4,60]{1,0})", + "(f64[4,720]{1,0}, f64[4,720]{1,0}, s64[4,720]{1,0})", + "(f64[4,60]{1,0}, f64[4,60]{1,0}, s64[4,60]{1,0})", + "(f64[4,720]{1,0}, f64[4,720]{1,0}, s64[4,720]{1,0})", + "(f64[4,60]{1,0}, f64[4,60]{1,0}, s64[4,60]{1,0})", + "(f64[4,720]{1,0}, f64[4,720]{1,0}, s64[4,720]{1,0})", + "(f64[4,60]{1,0}, f64[4,60]{1,0}, s64[4,60]{1,0})", + "(f64[4,720]{1,0}, f64[4,720]{1,0}, s64[4,720]{1,0})" + ], + "hlo_sha256": "255713dfed037efd", + "hlo_lines": 30652 + }, + "nodedup": { + "lower_s": 8.255358200000046, + "compile_s": 9.602517499999522, + "first_call_s": 0.01838819999829866, + "trace_calls": 32, + "flops": 23296236.0, + "hlo_sort_count": 7, + "stablehlo_sort_count": 1, + "hlo_sort_shapes": [ + "(f64[4,60]{1,0}, f64[4,60]{1,0}, s64[4,60]{1,0})", + "(f64[4,60]{1,0}, f64[4,60]{1,0}, s64[4,60]{1,0})", + "(f64[4,60]{1,0}, f64[4,60]{1,0}, s64[4,60]{1,0})", + "(f64[4,60]{1,0}, f64[4,60]{1,0}, s64[4,60]{1,0})", + "(f64[4,60]{1,0}, f64[4,60]{1,0}, s64[4,60]{1,0})", + "(f64[4,60]{1,0}, f64[4,60]{1,0}, s64[4,60]{1,0})", + "(f64[4,60]{1,0}, f64[4,60]{1,0}, s64[4,60]{1,0})" + ], + "hlo_sha256": "26e00b3bbb6e0062", + "hlo_lines": 26375 + }, + "library": { + "lower_s": 6.989750299999287, + "compile_s": 12.217282599998725, + "first_call_s": 0.06275349999850732, + "trace_calls": 32, + "flops": 33662500.0, + "hlo_sort_count": 15, + "stablehlo_sort_count": 3, + "hlo_sort_shapes": [ + "(f64[69849]{0}, f64[69849]{0}, s64[69849]{0})", + "(f64[4,60]{1,0}, f64[4,60]{1,0}, s64[4,60]{1,0})", + "(f64[4,720]{1,0}, f64[4,720]{1,0}, s64[4,720]{1,0})", + "(f64[4,60]{1,0}, f64[4,60]{1,0}, s64[4,60]{1,0})", + "(f64[4,720]{1,0}, f64[4,720]{1,0}, s64[4,720]{1,0})", + "(f64[4,60]{1,0}, f64[4,60]{1,0}, s64[4,60]{1,0})", + "(f64[4,720]{1,0}, f64[4,720]{1,0}, s64[4,720]{1,0})", + "(f64[4,60]{1,0}, f64[4,60]{1,0}, s64[4,60]{1,0})", + "(f64[4,720]{1,0}, f64[4,720]{1,0}, s64[4,720]{1,0})", + "(f64[4,60]{1,0}, f64[4,60]{1,0}, s64[4,60]{1,0})", + "(f64[4,720]{1,0}, f64[4,720]{1,0}, s64[4,720]{1,0})", + "(f64[4,60]{1,0}, f64[4,60]{1,0}, s64[4,60]{1,0})", + "(f64[4,720]{1,0}, f64[4,720]{1,0}, s64[4,720]{1,0})", + "(f64[4,60]{1,0}, f64[4,60]{1,0}, s64[4,60]{1,0})", + "(f64[4,720]{1,0}, f64[4,720]{1,0}, s64[4,720]{1,0})" + ], + "hlo_sha256": "3b1311e848b7636b", + "hlo_lines": 30652 + } + }, + "instances_compared": [ + [ + 0, + 1, + 2, + 3 + ], + [ + 4, + 5, + 6, + 7 + ], + [ + 8, + 9, + 10, + 11 + ], + [ + 12, + 13, + 14, + 15 + ] + ], + "values": { + "control": [ + [ + 7.743201200876812, + 4.901199826003542, + 8.551453428732437, + 7.640170398958149 + ], + [ + 7.2580956747803445, + 9.29357838657636, + 3.0338796505151917, + 8.714615086385912 + ], + [ + 4.735173159474494, + 3.2233889243165805, + 9.296501815740573, + 6.7486158154711955 + ], + [ + -1.4028143150641306, + 0.5885274382499945, + 6.162997261446639, + -10.49915087893337 + ] + ], + "nodedup": [ + [ + 7.743201200876812, + 4.901199826003542, + 8.551453428732437, + 7.640170398958149 + ], + [ + 7.2580956747803445, + 9.29357838657636, + 3.0338796505151917, + 8.714615086385912 + ], + [ + 4.735173159474494, + 3.2233889243165805, + 9.296501815740573, + 6.7486158154711955 + ], + [ + -1.4028143150641306, + 0.5885274382499945, + 6.162997261446639, + -10.49915087893337 + ] + ], + "library": [ + [ + 7.743201200876812, + 4.901199826003542, + 8.551453428732437, + 7.640170398958149 + ], + [ + 7.2580956747803445, + 9.29357838657636, + 3.0338796505151917, + 8.714615086385912 + ], + [ + 4.735173159474494, + 3.2233889243165805, + 9.296501815740573, + 6.7486158154711955 + ], + [ + -1.4028143150641306, + 0.5885274382499945, + 6.162997261446639, + -10.49915087893337 + ] + ] + }, + "deterministic_within_route": { + "control": true, + "nodedup": true, + "library": true + }, + "likelihood_gate": { + "control_vs_nodedup": { + "bit_identical": true, + "max_abs_delta": 0.0, + "max_rel_delta": 0.0, + "nan_pattern_equal": true + }, + "control_vs_library": { + "bit_identical": true, + "max_abs_delta": 0.0, + "max_rel_delta": 0.0, + "nan_pattern_equal": true + }, + "nodedup_vs_library": { + "bit_identical": true, + "max_abs_delta": 0.0, + "max_rel_delta": 0.0, + "nan_pattern_equal": true + } + } + }, + "simple_plain": { + "label": "simple_plain", + "batch": null, + "n_rounds": 20, + "n_calls_per_round": 5, + "n_warm": 3, + "route_order": "round-robin, start rotated each round", + "per_call_ms": { + "control": [ + 34.498499997425824, + 34.37080000003334, + 34.15270000186865, + 36.52280000096653, + 42.903699999442324, + 40.350899998884415, + 37.17310000138241, + 36.32859999925131, + 36.74669999963953, + 38.47619999942253, + 36.66250000242144, + 35.67190000103437, + 35.879699997167336, + 38.63249999994878, + 34.97189999688999, + 52.79979999977513, + 37.04890000153682, + 42.00730000229669, + 34.36650000003283, + 37.329000002500834, + 35.80160000274191, + 34.943200000270735, + 34.66169999956037, + 35.865499998180894, + 38.61170000163838, + 42.00409999975818, + 43.629200001305435, + 41.29240000111167, + 40.31530000065686, + 40.42259999914677, + 42.37270000157878, + 45.11060000004363, + 36.726000002090586, + 37.39520000090124, + 36.933899998985, + 34.62539999964065, + 34.39799999978277, + 34.72150000015972, + 38.50369999781833, + 42.80270000163, + 34.57739999794285, + 34.40179999961401, + 34.54369999963092, + 36.20129999762867, + 42.10850000163191, + 37.95410000020638, + 38.37360000034096, + 39.058599999407306, + 39.4839000000502, + 38.219499998376705, + 40.28230000039912, + 40.1021000034234, + 39.722000001347624, + 39.80849999788916, + 37.05909999916912, + 35.291799998958595, + 35.43079999872134, + 35.4064000021026, + 35.6357000018761, + 37.66430000177934, + 34.45320000173524, + 34.08639999906882, + 34.094000002369285, + 34.34139999808394, + 35.08080000028713, + 51.09779999838793, + 79.29720000174711, + 70.40589999814983, + 48.35749999983818, + 43.2306000002427, + 55.75549999775831, + 39.988000000448665, + 37.8497999990941, + 38.63469999851077, + 37.35429999869666, + 36.82900000057998, + 37.13429999697837, + 35.727200000110315, + 35.632400002214126, + 36.503799998172326, + 41.28140000102576, + 36.636700002418365, + 36.29749999890919, + 35.60560000187252, + 39.499099999375176, + 54.42670000047656, + 53.05640000005951, + 34.546200000477256, + 34.23040000052424, + 34.04360000058659, + 34.48290000233101, + 35.02519999892684, + 34.89869999975781, + 36.16829999737092, + 34.10060000169324, + 35.89070000089123, + 35.521400001016445, + 37.147899998672074, + 35.52700000000186, + 34.807899999577785 + ], + "nodedup": [ + 7.638499999302439, + 5.589500000496628, + 5.5412000001524575, + 7.2709999985818285, + 6.981700000324054, + 5.840099998749793, + 5.875099999684608, + 5.90839999858872, + 5.991400001221336, + 6.0558000004675705, + 5.832699996972224, + 6.011999998008832, + 5.671099999744911, + 8.473699999740347, + 8.690200000273762, + 9.072100001503713, + 5.705699997633928, + 5.660800001351163, + 5.803900003229501, + 5.614600002445513, + 5.552399998123292, + 5.637199999910081, + 5.874399997992441, + 5.436899999040179, + 8.485900001687696, + 6.52289999925415, + 6.328099996608216, + 6.770300002244767, + 6.603700003324775, + 6.670399998256471, + 7.25619999866467, + 6.118099998275284, + 6.282300000748364, + 6.120900001405971, + 6.281499998294748, + 5.8922999996866565, + 5.942799998592818, + 5.886099999770522, + 5.798499998491025, + 6.052799999451963, + 7.552500002930174, + 6.79409999793279, + 6.296600000496255, + 9.893900001770817, + 6.244299998797942, + 7.682100000238279, + 6.243100000574486, + 6.423099999665283, + 11.840399998618523, + 7.678999998461222, + 6.19850000293809, + 6.31499999872176, + 6.236099998204736, + 6.199300001753727, + 6.258499997784384, + 5.6757999991532415, + 5.748499999754131, + 5.444599999464117, + 5.5281999993894715, + 5.7120999990729615, + 6.776599999284372, + 5.821999999170657, + 5.707099997380283, + 6.271800000831718, + 5.897500002902234, + 5.832400001963833, + 5.873300000530435, + 6.3033000005816575, + 7.365000001300359, + 6.174499998451211, + 5.905499998334562, + 6.659999999101274, + 6.048299997928552, + 6.437399999413174, + 6.15269999980228, + 5.84089999756543, + 5.905499998334562, + 5.849699999089353, + 5.8017000010295305, + 5.96159999986412, + 6.199200000992278, + 6.263199997192714, + 6.6842999985965434, + 6.261300000915071, + 6.142499998532003, + 5.656000001181383, + 8.552200000849552, + 5.49469999896246, + 5.505900000571273, + 6.603099998756079, + 5.734499998652609, + 5.642000000079861, + 5.5412000001524575, + 5.511700001079589, + 5.610200001683552, + 5.7324999979755376, + 6.282700000156183, + 6.170399999973597, + 6.6752999991877005, + 5.9302000008756295 + ], + "library": [ + 35.91319999759435, + 38.074000000051456, + 37.10800000044401, + 43.73020000275574, + 36.94040000118548, + 36.000600000988925, + 38.76930000114953, + 36.49520000180928, + 38.54630000205361, + 35.855199999787146, + 36.14689999812981, + 36.874199999147095, + 37.83589999875403, + 37.33469999860972, + 37.25029999986873, + 34.43669999978738, + 34.88180000204011, + 34.62980000040261, + 34.152299998822855, + 34.85699999873759, + 34.57949999938137, + 35.76009999960661, + 47.855999997409526, + 34.84480000042822, + 36.607800000638235, + 36.714000001666136, + 42.032499997731065, + 38.33389999999781, + 38.89619999972638, + 44.763999998394866, + 39.22759999841219, + 36.28740000203834, + 36.934700001438614, + 36.28670000034617, + 42.63350000110222, + 36.04560000167112, + 36.11500000261003, + 35.91679999954067, + 35.35420000116574, + 36.03359999760869, + 35.05389999918407, + 34.2041000003519, + 34.30540000044857, + 36.79109999939101, + 34.33210000002873, + 40.36370000176248, + 40.81399999995483, + 40.73989999960759, + 40.210700000898214, + 52.610000002459856, + 38.32920000058948, + 38.09980000005453, + 39.670699999987846, + 52.32640000031097, + 41.033100002096035, + 37.478800000826595, + 36.888400001771515, + 35.555399997974746, + 37.467099999048514, + 36.55520000029355, + 36.873700002615806, + 35.70229999968433, + 39.6413999987999, + 42.194999998173444, + 37.18089999892982, + 48.30749999746331, + 41.12400000303751, + 45.182800000475254, + 56.720799999311566, + 45.102599997335346, + 42.46340000099735, + 42.23529999944731, + 40.21600000123726, + 39.2372999995132, + 39.96910000205389, + 35.207199998694705, + 35.13110000130837, + 36.106800002016826, + 38.6447999990196, + 35.72340000027907, + 37.50510000099894, + 36.8653000004997, + 36.143500001344364, + 36.32289999950444, + 35.74569999909727, + 41.274999999586726, + 34.06219999669702, + 34.428099999786355, + 39.30870000112918, + 37.10549999959767, + 34.01309999753721, + 34.70989999914309, + 38.42860000077053, + 34.391699999105185, + 34.90760000204318, + 36.43310000188649, + 35.95070000301348, + 36.898399997880915, + 36.95089999746415, + 35.4525000002468 + ] + }, + "warm_ms": { + "control": [ + 49.126000001706416, + 32.30429999894113, + 32.06779999891296 + ], + "nodedup": [ + 5.724700000428129, + 5.184299996471964, + 5.1994000023114495 + ], + "library": [ + 32.532799999899, + 33.68600000248989, + 34.691599998041056 + ] + }, + "stats": { + "control": { + "n": 100, + "median_ms": 36.787850000109756, + "p10_ms": 34.40141999963089, + "p90_ms": 43.270460000348976, + "min_ms": 34.04360000058659, + "max_ms": 79.29720000174711, + "mean_ms": 38.884044000078575 + }, + "nodedup": { + "n": 100, + "median_ms": 6.086949999371427, + "p10_ms": 5.608130001564859, + "p90_ms": 7.561100002567401, + "min_ms": 5.436899999040179, + "max_ms": 11.840399998618523, + "mean_ms": 6.354887999732455 + }, + "library": { + "n": 100, + "median_ms": 36.893399999826215, + "p10_ms": 34.62477000030049, + "p90_ms": 42.48041000100784, + "min_ms": 34.01309999753721, + "max_ms": 56.720799999311566, + "mean_ms": 38.19748800007801 + } + }, + "ratio_control_over_nodedup": { + "ratio": 6.043724690347165, + "ci90_low": 5.897963899871554, + "ci90_high": 6.230510722445364, + "bootstrap_samples": 2000 + }, + "ratio_library_over_nodedup": { + "ratio": 6.061065066024205, + "ci90_low": 5.93393151882492, + "ci90_high": 6.244944103540219, + "bootstrap_samples": 2000 + }, + "ratio_control_over_library": { + "ratio": 0.9971390546895391, + "ci90_low": 0.9778342596645191, + "ci90_high": 1.0168629020118551, + "bootstrap_samples": 2000 + }, + "paired_round_ratio_control_over_nodedup": { + "median": 6.164232899882632, + "p10": 5.080116073377749, + "p90": 6.399441825763121 + }, + "minimum_detectable_improvement": 0.24108611948487413, + "compile": { + "control": { + "lower_s": 3.917546000000584, + "compile_s": 9.076826300002722, + "first_call_s": 0.040960700000141514, + "trace_calls": 32, + "flops": 15581930.0, + "hlo_sort_count": 15, + "stablehlo_sort_count": 3, + "hlo_sort_shapes": [ + "(f64[69849]{0}, f64[69849]{0}, s64[69849]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})" + ], + "hlo_sha256": "3adc2dbb57209d92", + "hlo_lines": 25706 + }, + "nodedup": { + "lower_s": 4.000730600000679, + "compile_s": 6.373363800001243, + "first_call_s": 0.012295399999857182, + "trace_calls": 32, + "flops": 7052562.0, + "hlo_sort_count": 7, + "stablehlo_sort_count": 1, + "hlo_sort_shapes": [ + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})" + ], + "hlo_sha256": "58f5a82c02a38490", + "hlo_lines": 21527 + }, + "library": { + "lower_s": 4.09295910000219, + "compile_s": 9.452654999997321, + "first_call_s": 0.04655540000021574, + "trace_calls": 32, + "flops": 15581930.0, + "hlo_sort_count": 15, + "stablehlo_sort_count": 3, + "hlo_sort_shapes": [ + "(f64[69849]{0}, f64[69849]{0}, s64[69849]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})" + ], + "hlo_sha256": "f8b5403168045133", + "hlo_lines": 25706 + } + }, + "instances_compared": [ + [ + 0 + ], + [ + 1 + ], + [ + 2 + ], + [ + 3 + ], + [ + 4 + ], + [ + 5 + ], + [ + 6 + ], + [ + 7 + ], + [ + 8 + ], + [ + 9 + ], + [ + 10 + ], + [ + 11 + ], + [ + 12 + ], + [ + 13 + ], + [ + 14 + ], + [ + 15 + ] + ], + "values": { + "control": [ + 7.196577317761015, + -45.87302127443001, + 2.904871458739854, + -801.1656151465147, + -856.2176369539866, + -701.3832757596593, + -791.8603301084569, + -641.0597186366746, + -856.874766532385, + -965.6893581059344, + -601.8962692526686, + 1.491228024977211, + -664.1239657398182, + -4.055811166945713, + -6.531970036750838, + -970.3067931813664 + ], + "nodedup": [ + 7.196577317761015, + -45.87302127443001, + 2.904871458739854, + -801.1656151465147, + -856.2176369539866, + -701.3832757596593, + -791.8603301084569, + -641.0597186366746, + -856.874766532385, + -965.6893581059344, + -601.8962692526686, + 1.491228024977211, + -664.1239657398182, + -4.055811166945713, + -6.531970036750838, + -970.3067931813664 + ], + "library": [ + 7.196577317761015, + -45.87302127443001, + 2.904871458739854, + -801.1656151465147, + -856.2176369539866, + -701.3832757596593, + -791.8603301084569, + -641.0597186366746, + -856.874766532385, + -965.6893581059344, + -601.8962692526686, + 1.491228024977211, + -664.1239657398182, + -4.055811166945713, + -6.531970036750838, + -970.3067931813664 + ] + }, + "deterministic_within_route": { + "control": true, + "nodedup": true, + "library": true + }, + "likelihood_gate": { + "control_vs_nodedup": { + "bit_identical": true, + "max_abs_delta": 0.0, + "max_rel_delta": 0.0, + "nan_pattern_equal": true + }, + "control_vs_library": { + "bit_identical": true, + "max_abs_delta": 0.0, + "max_rel_delta": 0.0, + "nan_pattern_equal": true + }, + "nodedup_vs_library": { + "bit_identical": true, + "max_abs_delta": 0.0, + "max_rel_delta": 0.0, + "nan_pattern_equal": true + } + }, + "fiducial_log_likelihood": { + "control": 7.196577317761015, + "nodedup": 7.196577317761015, + "library": 7.196577317761015 + } + }, + "cluster_solved": { + "label": "cluster_solved", + "batch": null, + "n_rounds": 20, + "n_calls_per_round": 5, + "n_warm": 3, + "route_order": "round-robin, start rotated each round", + "per_call_ms": { + "control": [ + 142.00440000058734, + 148.69820000239997, + 140.9137999980885, + 155.12560000206577, + 150.45129999998608, + 151.74499999920954, + 146.92090000244207, + 144.15659999940544, + 142.16599999781465, + 144.92569999856642, + 155.6614000000991, + 146.0196999978507, + 142.88930000111577, + 164.6316999976989, + 156.69079999861424, + 169.8395999992499, + 153.01159999944502, + 149.18549999856623, + 147.9773999999452, + 146.81439999912982, + 153.54730000035488, + 159.77710000152, + 202.83200000267243, + 227.23760000008042, + 174.18439999892144, + 136.7790000003879, + 134.61649999953806, + 132.44420000046375, + 138.4835999997449, + 145.62440000008792, + 160.7825999999477, + 160.56039999966742, + 156.87800000159768, + 143.87039999928675, + 144.86219999889727, + 127.55590000233497, + 129.25470000118366, + 136.44969999950263, + 128.95189999835566, + 130.84840000010445, + 135.56129999778932, + 133.26170000073034, + 131.30919999821344, + 132.4886999973387, + 138.40820000041276, + 140.8538999967277, + 133.66619999942486, + 135.39099999979953, + 133.06390000070678, + 139.8220000010042, + 131.53170000077807, + 133.64680000086082, + 135.46080000014626, + 132.06699999864213, + 135.80979999824194, + 163.4965999983251, + 148.28990000023623, + 141.31340000312775, + 152.58729999914067, + 141.80259999920963, + 146.50389999951585, + 154.18090000093798, + 137.45980000021518, + 138.8595999997051, + 135.08039999942412, + 136.83579999997164, + 144.35000000230502, + 136.80879999810713, + 136.33429999754298, + 138.0037999988417, + 209.20920000207843, + 227.11919999710517, + 169.4320999995398, + 158.39260000211652, + 157.2548000003735, + 178.6934999981895, + 164.61809999964316, + 150.90169999893988, + 161.107500000071, + 144.5170999977563, + 146.75050000005285, + 157.66339999754564, + 140.22339999792166, + 174.9361999973189, + 164.08960000262596, + 150.34670000022743, + 142.9945999989286, + 135.66770000034012, + 141.52570000078413, + 137.77100000152132, + 141.8983000003209, + 148.70610000070883, + 136.51720000052592, + 140.1590000023134, + 133.8316000001214, + 133.65169999815407, + 133.57060000271304, + 134.4091999999364, + 142.1769000007771, + 145.09349999934784 + ], + "nodedup": [ + 64.13249999968684, + 65.29519999821787, + 67.44320000143489, + 68.54410000232747, + 71.95839999985765, + 60.483000001113396, + 62.7158999996027, + 64.65600000228733, + 65.93729999804054, + 64.0873999982432, + 65.13210000048275, + 62.13449999995646, + 64.44230000124662, + 65.0924000001396, + 65.83189999946626, + 72.83739999911631, + 64.96969999716384, + 74.31039999937639, + 68.72720000319532, + 71.3848000013968, + 68.30930000069202, + 62.68579999959911, + 64.53209999745013, + 67.5312000021222, + 68.68490000124439, + 62.23419999878388, + 63.214800000423566, + 63.09230000260868, + 67.83850000283564, + 69.40070000200649, + 59.569900000497, + 60.41980000009062, + 62.81379999927594, + 58.649099999456666, + 59.00919999839971, + 54.417600000306265, + 55.45899999924586, + 56.16080000254442, + 61.402999999700114, + 65.28229999821633, + 54.87150000044494, + 56.69590000252356, + 58.01199999768869, + 59.00880000262987, + 60.82130000140751, + 59.225299999525305, + 56.568399999378016, + 62.44220000007772, + 57.461399999738205, + 58.84670000159531, + 60.55750000086846, + 59.953399999358226, + 58.18809999982477, + 67.12139999945066, + 56.8604999971285, + 62.077900001895614, + 62.47140000050422, + 62.784400000964524, + 61.55370000124094, + 64.91270000333316, + 58.3796999999322, + 58.10390000260668, + 68.49280000096769, + 70.88289999956032, + 71.98360000256798, + 71.13249999747495, + 63.125500000751344, + 62.63530000069295, + 59.4000999990385, + 65.06050000098185, + 60.24569999863161, + 67.65260000247508, + 79.22320000216132, + 66.6200999985449, + 79.39170000099693, + 56.38630000248668, + 57.01020000196877, + 71.00399999762885, + 86.3086999997904, + 84.5350999989023, + 63.955000001442386, + 65.19200000184355, + 64.50279999990016, + 65.50810000044294, + 58.02939999921364, + 60.30749999990803, + 62.430800000583986, + 59.491200001502875, + 59.78079999840702, + 58.91759999940405, + 59.03340000077151, + 58.2687000023725, + 59.97139999817591, + 60.3850000006787, + 64.24440000046161, + 60.79739999768208, + 57.21379999886267, + 59.007300002122065, + 65.6170000002021, + 64.91280000045663 + ], + "library": [ + 164.61849999905098, + 159.77859999838984, + 150.16969999851426, + 145.8426999997755, + 145.10540000264882, + 155.07630000138306, + 161.93159999966156, + 148.74580000105198, + 156.62610000072164, + 150.53919999991194, + 147.61450000150944, + 143.58390000052168, + 144.8668999983056, + 142.32760000231792, + 142.46889999776613, + 159.7265000018524, + 152.67539999695146, + 150.4970999994839, + 145.15340000070864, + 142.03470000211382, + 154.23530000043684, + 149.44109999851207, + 152.8464000002714, + 141.89909999913652, + 142.7053999977943, + 164.91270000187797, + 157.77869999874383, + 143.2215000022552, + 134.22890000219923, + 140.35190000140574, + 138.93719999759924, + 135.74799999696552, + 134.4850999994378, + 133.5481999994954, + 131.177100000059, + 138.70479999968666, + 134.35759999993024, + 133.6050999998406, + 130.43390000166255, + 127.23410000035074, + 128.93869999970775, + 134.54490000003716, + 130.4736000020057, + 139.45299999977578, + 139.2269000025408, + 139.0739999988, + 136.1034000001382, + 132.59019999895827, + 128.2457000015711, + 135.7596999987436, + 139.50659999682102, + 132.61409999904572, + 133.22330000301008, + 133.8331000006292, + 134.09360000150627, + 139.47149999876274, + 159.97969999807538, + 169.6272000008321, + 163.58349999791244, + 179.78660000153468, + 189.24360000164597, + 184.64350000067498, + 170.31199999837554, + 142.07239999814192, + 136.81020000149147, + 179.31189999944763, + 152.98129999791854, + 145.85129999977653, + 138.24100000056205, + 159.01059999669087, + 136.87039999786066, + 163.37779999958002, + 240.02399999881163, + 201.2931999997818, + 171.3452000003599, + 161.12680000151158, + 141.08000000123866, + 155.16159999970114, + 185.1243000019167, + 184.7129000016139, + 143.1577000003017, + 136.80579999709153, + 137.36960000096587, + 136.8899999979476, + 134.96780000059516, + 152.1221000002697, + 135.22710000324878, + 136.24610000260873, + 144.10489999863785, + 161.42670000044745, + 141.21479999812436, + 136.88819999879343, + 138.59729999967385, + 132.81519999873126, + 134.48170000265236, + 146.37609999772394, + 134.90590000219527, + 135.40029999785475, + 134.83020000057877, + 138.5573999978078 + ] + }, + "warm_ms": { + "control": [ + 121.27970000074129, + 128.03250000069966, + 131.69200000265846 + ], + "nodedup": [ + 59.49270000201068, + 59.32409999877564, + 63.197999999829335 + ], + "library": [ + 156.7058000000543, + 142.14600000195787, + 154.95949999967706 + ] + }, + "stats": { + "control": { + "n": 100, + "median_ms": 143.43249999910768, + "p10_ms": 133.241920000728, + "p90_ms": 164.61945999944874, + "min_ms": 127.55590000233497, + "max_ms": 227.23760000008042, + "mean_ms": 148.02847199982352 + }, + "nodedup": { + "n": 100, + "median_ms": 62.75015000028361, + "p10_ms": 57.43663999965065, + "p90_ms": 71.01684999761346, + "min_ms": 54.417600000306265, + "max_ms": 86.3086999997904, + "mean_ms": 63.66399300030025 + }, + "library": { + "n": 100, + "median_ms": 142.20000000022992, + "p10_ms": 133.51570999984688, + "p90_ms": 169.69568000058644, + "min_ms": 127.23410000035074, + "max_ms": 240.02399999881163, + "mean_ms": 147.9034309999406 + } + }, + "ratio_control_over_nodedup": { + "ratio": 2.285771428410281, + "ci90_low": 2.219426963270871, + "ci90_high": 2.3335555883499683, + "bootstrap_samples": 2000 + }, + "ratio_library_over_nodedup": { + "ratio": 2.2661300411168295, + "ci90_low": 2.2039062330638313, + "ci90_high": 2.3173872153437913, + "bootstrap_samples": 2000 + }, + "ratio_control_over_library": { + "ratio": 1.008667369893641, + "ci90_low": 0.9848121737584689, + "ci90_high": 1.0355775194309371, + "bootstrap_samples": 2000 + }, + "paired_round_ratio_control_over_nodedup": { + "median": 2.2989404925535135, + "p10": 2.1563339587722608, + "p90": 2.511930700471672 + }, + "minimum_detectable_improvement": 0.2187617171764834, + "compile": { + "control": { + "lower_s": 54.211287599999196, + "compile_s": 41.30231940000158, + "first_call_s": 0.12729100000069593, + "trace_calls": 168, + "flops": 184158336.0, + "hlo_sort_count": 25, + "stablehlo_sort_count": 3, + "hlo_sort_shapes": [ + "(f64[276507]{0}, f64[276507]{0}, s64[276507]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})" + ], + "hlo_sha256": "f59a8270996c6242", + "hlo_lines": 70897 + }, + "nodedup": { + "lower_s": 45.46868949999771, + "compile_s": 36.385934600002656, + "first_call_s": 0.07705910000004224, + "trace_calls": 168, + "flops": 139442208.0, + "hlo_sort_count": 12, + "stablehlo_sort_count": 1, + "hlo_sort_shapes": [ + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})" + ], + "hlo_sha256": "97c5816a6041af5f", + "hlo_lines": 62911 + }, + "library": { + "lower_s": 51.991277699999046, + "compile_s": 45.008616499999334, + "first_call_s": 0.11665110000103596, + "trace_calls": 168, + "flops": 184158336.0, + "hlo_sort_count": 25, + "stablehlo_sort_count": 3, + "hlo_sort_shapes": [ + "(f64[276507]{0}, f64[276507]{0}, s64[276507]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})" + ], + "hlo_sha256": "ffa2418bd4629ece", + "hlo_lines": 70897 + } + }, + "instances_compared": [ + [ + 0 + ], + [ + 1 + ], + [ + 2 + ], + [ + 3 + ], + [ + 4 + ], + [ + 5 + ], + [ + 6 + ], + [ + 7 + ], + [ + 8 + ], + [ + 9 + ], + [ + 10 + ], + [ + 11 + ], + [ + 12 + ], + [ + 13 + ], + [ + 14 + ], + [ + 15 + ] + ], + "values": { + "control": [ + 25.56012716672745, + 21.572496958393117, + 21.458564666727817, + 13.597236541730302, + 15.306220916729094, + 10.29320008339773, + 19.977444875061735, + 21.80036154172802, + 10.748929250057948, + 9.60960633339704, + 5.166246958396467, + 14.05296570839195, + 4.710517791725226, + 6.64736675005817, + 17.926663625058694, + 16.331611541724385 + ], + "nodedup": [ + 25.56012716672745, + 21.572496958393117, + 21.458564666727817, + 13.597236541730302, + 15.306220916729094, + 10.29320008339773, + 19.977444875061735, + 21.80036154172802, + 10.748929250057948, + 9.60960633339704, + 5.166246958396467, + 14.05296570839195, + 4.710517791725226, + 6.64736675005817, + 17.926663625058694, + 16.331611541724385 + ], + "library": [ + 25.56012716672745, + 21.572496958393117, + 21.458564666727817, + 13.597236541730302, + 15.306220916729094, + 10.29320008339773, + 19.977444875061735, + 21.80036154172802, + 10.748929250057948, + 9.60960633339704, + 5.166246958396467, + 14.05296570839195, + 4.710517791725226, + 6.64736675005817, + 17.926663625058694, + 16.331611541724385 + ] + }, + "deterministic_within_route": { + "control": true, + "nodedup": true, + "library": true + }, + "likelihood_gate": { + "control_vs_nodedup": { + "bit_identical": true, + "max_abs_delta": 0.0, + "max_rel_delta": 0.0, + "nan_pattern_equal": true + }, + "control_vs_library": { + "bit_identical": true, + "max_abs_delta": 0.0, + "max_rel_delta": 0.0, + "nan_pattern_equal": true + }, + "nodedup_vs_library": { + "bit_identical": true, + "max_abs_delta": 0.0, + "max_rel_delta": 0.0, + "nan_pattern_equal": true + } + }, + "fiducial_log_likelihood": { + "control": 25.56012716672745, + "nodedup": 25.56012716672745, + "library": 25.56012716672745 + } + }, + "cluster_plain": { + "label": "cluster_plain", + "batch": null, + "n_rounds": 20, + "n_calls_per_round": 5, + "n_warm": 3, + "route_order": "round-robin, start rotated each round", + "per_call_ms": { + "control": [ + 154.1536000004271, + 147.22310000070138, + 143.49859999856562, + 143.9606999992975, + 139.81959999728133, + 143.00500000172178, + 147.53420000124606, + 159.95230000044103, + 160.93460000047344, + 155.96559999903548, + 141.21739999973215, + 141.86919999701786, + 138.36439999795402, + 142.23969999875408, + 148.54230000128155, + 158.5032000002684, + 154.81499999805237, + 149.5826999998826, + 147.6820999996562, + 148.5885000001872, + 139.94180000008782, + 139.5029000013892, + 143.3738000014273, + 144.17790000152308, + 144.29380000001402, + 138.60390000263578, + 142.74330000262125, + 144.60479999979725, + 144.66999999785912, + 150.34920000107377, + 151.94049999990966, + 150.3907000005711, + 143.55190000060247, + 144.11670000117738, + 142.10689999890747, + 134.85249999939697, + 155.46220000032918, + 156.16989999762154, + 149.945299999672, + 153.32629999829805, + 140.77030000044033, + 138.8342999998713, + 136.422900002799, + 149.2550000002666, + 147.55439999862574, + 154.79839999898104, + 144.25580000170157, + 157.63739999965765, + 163.07439999945927, + 151.16669999770238, + 138.3745999992243, + 139.98949999950128, + 138.04479999816976, + 140.18099999884726, + 139.38219999909052, + 150.8990999973321, + 148.14509999996517, + 151.44520000103512, + 157.8881999994337, + 142.10929999899236, + 152.06190000026254, + 145.78590000019176, + 145.6794000005175, + 143.2064000000537, + 138.73279999825172, + 145.33619999929215, + 141.70219999869005, + 139.74550000057206, + 140.80420000027516, + 142.66309999948135, + 149.155699997209, + 142.7086000003328, + 141.50859999790555, + 140.3451000005589, + 141.39200000136043, + 158.64430000146967, + 147.511699997267, + 144.43870000104653, + 151.52780000062194, + 152.29639999961364, + 138.92520000081277, + 141.6239999998652, + 139.1747999987274, + 139.4338999998581, + 140.46940000116592, + 147.30259999851114, + 143.51000000169734, + 141.09419999658712, + 141.27390000066953, + 141.24230000015814, + 147.84839999992982, + 145.44979999845964, + 135.63730000169016, + 143.95729999887408, + 130.2642000009655, + 126.97149999803514, + 136.00840000071912, + 130.85380000120495, + 126.67990000045393, + 130.3939999997965 + ], + "nodedup": [ + 60.756899998523295, + 63.055300000996795, + 60.60799999977462, + 62.024800001381664, + 61.842700000852346, + 66.53039999946486, + 60.0918999989517, + 61.594099999638274, + 63.34659999993164, + 63.89660000058939, + 61.076100002537714, + 62.34939999922062, + 69.82590000188793, + 68.4000000001106, + 65.04940000013448, + 61.01869999838527, + 59.781899999507004, + 64.03950000094483, + 62.64939999891794, + 64.54419999863603, + 57.93379999886383, + 60.618800001975615, + 61.28499999977066, + 61.7495999977109, + 62.353999997867504, + 61.046900002111215, + 62.2224999970058, + 66.62619999769959, + 63.246699999581324, + 68.83060000109253, + 57.2325000030105, + 61.281800000870135, + 60.60820000129752, + 65.84289999955217, + 61.008499997114995, + 57.855600000038976, + 58.60200000097393, + 52.24200000156998, + 63.06659999972908, + 63.444899999012705, + 49.83599999832222, + 61.74549999923329, + 61.213799999677576, + 64.11979999757023, + 64.85800000154995, + 69.37209999887273, + 72.62869999976829, + 75.05500000115717, + 77.82480000241776, + 88.04980000059004, + 68.20349999907194, + 66.71690000075614, + 69.0509000014572, + 79.79380000324454, + 76.43770000140648, + 57.69199999849661, + 62.542799998482224, + 61.56620000183466, + 62.60370000018156, + 67.13090000266675, + 67.96919999760576, + 63.02239999786252, + 65.44560000111233, + 61.168100000941195, + 64.9784000015643, + 59.834799998498056, + 61.27089999790769, + 63.32560000009835, + 65.15349999972386, + 63.391200001206016, + 59.31599999894388, + 59.40629999895464, + 63.875300002109725, + 64.66340000042692, + 64.34079999962705, + 60.118199999124045, + 61.647200000152225, + 63.16589999914868, + 84.55569999932777, + 69.57129999864264, + 58.61250000089058, + 65.32109999898239, + 60.31339999753982, + 62.42049999855226, + 64.66889999865089, + 56.096699998306576, + 61.01910000143107, + 61.18330000026617, + 61.2516000001051, + 83.70099999956437, + 53.977599996869685, + 56.65709999811952, + 62.06959999690298, + 56.851400000596186, + 63.093799999478506, + 55.0982999993721, + 56.15190000025905, + 75.2399000011792, + 59.71470000076806, + 58.637300000555115 + ], + "library": [ + 178.2428999977128, + 146.7360999995435, + 145.27579999776208, + 150.8192000001145, + 143.12109999809763, + 152.73529999831226, + 146.14409999921918, + 144.85749999948894, + 145.2802999992855, + 144.4584999990184, + 148.6838999990141, + 154.67449999778182, + 146.40529999815044, + 142.38450000266312, + 141.28859999982524, + 152.82590000060736, + 151.40990000145393, + 150.39579999938724, + 144.5084000006318, + 142.17229999849224, + 153.5585000019637, + 146.9457000021066, + 147.51760000217473, + 143.352800001594, + 142.84099999713362, + 141.53230000010808, + 146.463599998242, + 141.2092999999004, + 140.31169999725535, + 144.3381999997655, + 151.92540000134613, + 150.99850000115111, + 149.1316999999981, + 147.072499999922, + 140.14509999833535, + 155.3686999977799, + 147.64579999973648, + 145.4940000003262, + 145.6964999997581, + 150.55430000211345, + 145.39999999760767, + 143.08299999902374, + 140.47799999752897, + 138.5889999983192, + 140.45869999972638, + 196.12079999933485, + 192.3724999978731, + 197.79450000351062, + 185.52590000035707, + 182.27800000022398, + 162.34329999861075, + 147.73849999983213, + 143.85350000156905, + 143.55350000187173, + 141.55650000247988, + 142.7220000005036, + 141.79370000056224, + 139.04990000082762, + 140.5040999998164, + 144.86000000033528, + 153.09759999945527, + 145.58380000016768, + 145.48479999939445, + 150.04929999849992, + 150.76269999917713, + 153.40219999779947, + 148.96320000116248, + 145.79030000095372, + 142.2091000022192, + 139.34109999900102, + 142.90599999731057, + 140.96969999809517, + 141.5024000016274, + 140.47470000150497, + 144.47260000088136, + 166.32519999984652, + 151.76470000005793, + 148.6877999996068, + 143.1280000033439, + 149.20060000076774, + 151.91559999948367, + 146.17530000032275, + 142.99530000062077, + 141.7684999978519, + 139.89649999712128, + 139.59450000038487, + 141.0020999974222, + 142.7122999994026, + 150.7571000001917, + 149.86639999915496, + 137.09210000160965, + 136.84529999954975, + 131.12370000089868, + 126.67140000121435, + 128.54180000067572, + 138.05130000037025, + 133.95799999852898, + 131.56489999892074, + 128.64080000144895, + 127.49350000012782 + ] + }, + "warm_ms": { + "control": [ + 142.14949999950477, + 142.81309999933, + 140.50900000074762 + ], + "nodedup": [ + 58.56589999893913, + 61.702499999228166, + 61.04570000024978 + ], + "library": [ + 156.24060000118334, + 150.78689999791095, + 152.19010000146227 + ] + }, + "stats": { + "control": { + "n": 100, + "median_ms": 143.75459999973828, + "p10_ms": 138.3324399979756, + "p90_ms": 154.87971999828005, + "min_ms": 126.67990000045393, + "max_ms": 163.07439999945927, + "mean_ms": 144.85166099981143 + }, + "nodedup": { + "n": 100, + "median_ms": 62.38724999820988, + "p10_ms": 57.83923999988474, + "p90_ms": 69.59675999896717, + "min_ms": 49.83599999832222, + "max_ms": 88.04980000059004, + "mean_ms": 63.643222999853606 + }, + "library": { + "n": 100, + "median_ms": 145.06789999904868, + "p10_ms": 138.5352299985243, + "p90_ms": 153.6701000015455, + "min_ms": 126.67140000121435, + "max_ms": 197.79450000351062, + "mean_ms": 147.2538069998336 + } + }, + "ratio_control_over_nodedup": { + "ratio": 2.3042304317607063, + "ci90_low": 2.2697667872477343, + "ci90_high": 2.337045262260593, + "bootstrap_samples": 2000 + }, + "ratio_library_over_nodedup": { + "ratio": 2.3252812073494376, + "ci90_low": 2.287788598119731, + "ci90_high": 2.3562053777550123, + "bootstrap_samples": 2000 + }, + "ratio_control_over_library": { + "ratio": 0.9909469979277358, + "ci90_low": 0.9810986055864395, + "ci90_high": 1.004791210553061, + "bootstrap_samples": 2000 + }, + "paired_round_ratio_control_over_nodedup": { + "median": 2.297694161072787, + "p10": 2.169097621564997, + "p90": 2.469105900015661 + }, + "minimum_detectable_improvement": 0.11510782959525873, + "compile": { + "control": { + "lower_s": 37.223917999999685, + "compile_s": 28.08511930000168, + "first_call_s": 0.12141689999771188, + "trace_calls": 168, + "flops": 184147008.0, + "hlo_sort_count": 25, + "stablehlo_sort_count": 3, + "hlo_sort_shapes": [ + "(f64[276507]{0}, f64[276507]{0}, s64[276507]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})" + ], + "hlo_sha256": "5da24b3817f28f13", + "hlo_lines": 56232 + }, + "nodedup": { + "lower_s": 33.45930039999803, + "compile_s": 26.18469940000068, + "first_call_s": 0.058876999999483814, + "trace_calls": 168, + "flops": 139430656.0, + "hlo_sort_count": 12, + "stablehlo_sort_count": 1, + "hlo_sort_shapes": [ + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})" + ], + "hlo_sha256": "fc1ba1aafb780b00", + "hlo_lines": 48246 + }, + "library": { + "lower_s": 33.350611999998364, + "compile_s": 31.118756900003063, + "first_call_s": 0.12974780000149622, + "trace_calls": 168, + "flops": 184147008.0, + "hlo_sort_count": 25, + "stablehlo_sort_count": 3, + "hlo_sort_shapes": [ + "(f64[276507]{0}, f64[276507]{0}, s64[276507]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})" + ], + "hlo_sha256": "8e7827d43a701981", + "hlo_lines": 56232 + } + }, + "instances_compared": [ + [ + 0 + ], + [ + 1 + ], + [ + 2 + ], + [ + 3 + ], + [ + 4 + ], + [ + 5 + ], + [ + 6 + ], + [ + 7 + ], + [ + 8 + ], + [ + 9 + ], + [ + 10 + ], + [ + 11 + ], + [ + 12 + ], + [ + 13 + ], + [ + 14 + ], + [ + 15 + ] + ], + "values": { + "control": [ + 23.965075083393216, + -743.7107061666, + 3.3433302917272147, + -489.75562804160495, + -527.9229457499364, + -468.67815408327806, + -247.07984679160097, + -1110.0030238749466, + -779.0297165832758, + -20.354586374939657, + -110.36109679160916, + -691.0739874166073, + -1296.2823207499168, + -205.49456033327564, + -223.83765929159887, + -334.8077113749422 + ], + "nodedup": [ + 23.965075083393216, + -743.7107061666, + 3.3433302917272147, + -489.75562804160495, + -527.9229457499364, + -468.67815408327806, + -247.07984679160097, + -1110.0030238749466, + -779.0297165832758, + -20.354586374939657, + -110.36109679160916, + -691.0739874166073, + -1296.2823207499168, + -205.49456033327564, + -223.83765929159887, + -334.8077113749422 + ], + "library": [ + 23.965075083393216, + -743.7107061666, + 3.3433302917272147, + -489.75562804160495, + -527.9229457499364, + -468.67815408327806, + -247.07984679160097, + -1110.0030238749466, + -779.0297165832758, + -20.354586374939657, + -110.36109679160916, + -691.0739874166073, + -1296.2823207499168, + -205.49456033327564, + -223.83765929159887, + -334.8077113749422 + ] + }, + "deterministic_within_route": { + "control": true, + "nodedup": true, + "library": true + }, + "likelihood_gate": { + "control_vs_nodedup": { + "bit_identical": true, + "max_abs_delta": 0.0, + "max_rel_delta": 0.0, + "nan_pattern_equal": true + }, + "control_vs_library": { + "bit_identical": true, + "max_abs_delta": 0.0, + "max_rel_delta": 0.0, + "nan_pattern_equal": true + }, + "nodedup_vs_library": { + "bit_identical": true, + "max_abs_delta": 0.0, + "max_rel_delta": 0.0, + "nan_pattern_equal": true + } + }, + "fiducial_log_likelihood": { + "control": 23.965075083393216, + "nodedup": 23.965075083393216, + "library": 23.965075083393216 + } + } + }, + "gates": { + "simple_solved_positions": { + "n_instances": 3, + "compile": { + "control": { + "lower_s": 2.5165535000014643, + "compile_s": 4.146437000003061, + "first_call_s": 0.03993070000069565, + "trace_calls": 16, + "flops": 15529212.0, + "hlo_sort_count": 15, + "stablehlo_sort_count": 3, + "hlo_sort_shapes": [ + "(f64[69849]{0}, f64[69849]{0}, s64[69849]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})" + ], + "hlo_sha256": "ae163262e91a9a6b", + "hlo_lines": 17480 + }, + "nodedup": { + "lower_s": 2.668455200000608, + "compile_s": 3.0546549999999115, + "first_call_s": 0.006822600000305101, + "trace_calls": 16, + "flops": 6999844.0, + "hlo_sort_count": 7, + "stablehlo_sort_count": 1, + "hlo_sort_shapes": [ + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})" + ], + "hlo_sha256": "2fb71d1b0a608adc", + "hlo_lines": 13337 + }, + "library": { + "lower_s": 2.7132539999984147, + "compile_s": 5.1084988999973575, + "first_call_s": 0.046907500000088476, + "trace_calls": 16, + "flops": 15529212.0, + "hlo_sort_count": 15, + "stablehlo_sort_count": 3, + "hlo_sort_shapes": [ + "(f64[69849]{0}, f64[69849]{0}, s64[69849]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})" + ], + "hlo_sha256": "793d3438b44fd7b4", + "hlo_lines": 17480 + } + }, + "positions": { + "control": [ + [ + [ + [ + -1.03515625, + -1.0450941982127835 + ], + [ + Infinity, + Infinity + ], + [ + 0.35546875, + 1.6296613457672795 + ], + [ + 1.24375, + 1.1086929388032032 + ], + [ + 1.6062500000000002, + 0.44293590964391594 + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ] + ] + ], + [ + [ + [ + -1.0289062500000001, + -1.0225414533225639 + ], + [ + Infinity, + Infinity + ], + [ + 0.35, + 1.6138744243441256 + ], + [ + 1.2578125, + 1.0644895588183723 + ], + [ + 1.5890625, + 0.4375232508702632 + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ] + ] + ], + [ + [ + [ + -1.0203125, + -1.0861401939129833 + ], + [ + Infinity, + Infinity + ], + [ + 0.3484375, + 1.6328187300519101 + ], + [ + 1.1398437499999998, + 1.2182992789696712 + ], + [ + 1.609375, + 0.4447401292351336 + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ] + ] + ] + ], + "nodedup": [ + [ + [ + [ + -1.03515625, + -1.0450941982127835 + ], + [ + Infinity, + Infinity + ], + [ + 0.35546875, + 1.6296613457672795 + ], + [ + 1.24375, + 1.1086929388032032 + ], + [ + 1.6062500000000002, + 0.44293590964391594 + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ] + ] + ], + [ + [ + [ + -1.0289062500000001, + -1.0225414533225639 + ], + [ + Infinity, + Infinity + ], + [ + 0.35, + 1.6138744243441256 + ], + [ + 1.2578125, + 1.0644895588183723 + ], + [ + 1.5890625, + 0.4375232508702632 + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ] + ] + ], + [ + [ + [ + -1.0203125, + -1.0861401939129833 + ], + [ + Infinity, + Infinity + ], + [ + 0.3484375, + 1.6328187300519101 + ], + [ + 1.1398437499999998, + 1.2182992789696712 + ], + [ + 1.609375, + 0.4447401292351336 + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ] + ] + ] + ], + "library": [ + [ + [ + [ + -1.03515625, + -1.0450941982127835 + ], + [ + Infinity, + Infinity + ], + [ + 0.35546875, + 1.6296613457672795 + ], + [ + 1.24375, + 1.1086929388032032 + ], + [ + 1.6062500000000002, + 0.44293590964391594 + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ] + ] + ], + [ + [ + [ + -1.0289062500000001, + -1.0225414533225639 + ], + [ + Infinity, + Infinity + ], + [ + 0.35, + 1.6138744243441256 + ], + [ + 1.2578125, + 1.0644895588183723 + ], + [ + 1.5890625, + 0.4375232508702632 + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ] + ] + ], + [ + [ + [ + -1.0203125, + -1.0861401939129833 + ], + [ + Infinity, + Infinity + ], + [ + 0.3484375, + 1.6328187300519101 + ], + [ + 1.1398437499999998, + 1.2182992789696712 + ], + [ + 1.609375, + 0.4447401292351336 + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ] + ] + ] + ] + }, + "finite_positions": { + "control": [ + [ + 4 + ], + [ + 4 + ], + [ + 4 + ] + ], + "nodedup": [ + [ + 4 + ], + [ + 4 + ], + [ + 4 + ] + ], + "library": [ + [ + 4 + ], + [ + 4 + ], + [ + 4 + ] + ] + }, + "pairs": { + "control_vs_nodedup": { + "max_abs_delta": 0.0, + "max_rel_delta": 0.0, + "nan_pattern_equal": true, + "array_equal_nan_aware": true + }, + "control_vs_library": { + "max_abs_delta": 0.0, + "max_rel_delta": 0.0, + "nan_pattern_equal": true, + "array_equal_nan_aware": true + } + } + }, + "simple_solved_grad": { + "n_instances": 3, + "rtol": 1e-10, + "atol": 1e-12, + "compile": { + "control": { + "lower_s": 8.423856299999898, + "compile_s": 13.20408049999969, + "first_call_s": 0.03714219999892521, + "trace_calls": 32, + "flops": 18753240.0, + "hlo_sort_count": 30, + "stablehlo_sort_count": 4, + "hlo_sort_shapes": [ + "(f64[69849]{0}, f64[69849]{0}, s64[69849]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(s32[15,2]{1,0}, s32[15,2]{1,0})" + ], + "hlo_sha256": "015e2fa45d06c070", + "hlo_lines": 53768 + }, + "nodedup": { + "lower_s": 8.012028400000418, + "compile_s": 11.226727799999935, + "first_call_s": 0.007982600000104867, + "trace_calls": 32, + "flops": 9665219.0, + "hlo_sort_count": 15, + "stablehlo_sort_count": 2, + "hlo_sort_shapes": [ + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(s32[15,2]{1,0}, s32[15,2]{1,0})" + ], + "hlo_sha256": "e5cf41be39df2897", + "hlo_lines": 46130 + }, + "library": { + "lower_s": 7.800086900002498, + "compile_s": 10.83586429999923, + "first_call_s": 0.03251330000057351, + "trace_calls": 32, + "flops": 18753240.0, + "hlo_sort_count": 30, + "stablehlo_sort_count": 4, + "hlo_sort_shapes": [ + "(f64[69849]{0}, f64[69849]{0}, s64[69849]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(s32[15,2]{1,0}, s32[15,2]{1,0})" + ], + "hlo_sha256": "dfab9670f408aa2e", + "hlo_lines": 53768 + } + }, + "all_finite": { + "control": true, + "nodedup": true, + "library": true + }, + "gradients": { + "control": [ + [ + -41.62226304412241, + 53.13429595959836, + 31.78649237783334, + 2.804131922250644, + 1781.7386158499905 + ], + [ + -46.408073055275, + 75.13738885142423, + 78.91835319805021, + 74.32499719544035, + 2531.5778928834748 + ], + [ + 62.951469401248765, + -41.40185295994061, + 18.162643132964934, + 109.0003235058508, + -1560.549091923857 + ] + ], + "nodedup": [ + [ + -41.62226304412241, + 53.13429595959836, + 31.78649237783334, + 2.804131922250644, + 1781.7386158499905 + ], + [ + -46.408073055275, + 75.13738885142423, + 78.91835319805021, + 74.32499719544035, + 2531.5778928834748 + ], + [ + 62.951469401248765, + -41.40185295994061, + 18.162643132964934, + 109.0003235058508, + -1560.549091923857 + ] + ], + "library": [ + [ + -41.62226304412241, + 53.13429595959836, + 31.78649237783334, + 2.804131922250644, + 1781.7386158499905 + ], + [ + -46.408073055275, + 75.13738885142423, + 78.91835319805021, + 74.32499719544035, + 2531.5778928834748 + ], + [ + 62.951469401248765, + -41.40185295994061, + 18.162643132964934, + 109.0003235058508, + -1560.549091923857 + ] + ] + }, + "pairs": { + "control_vs_nodedup": { + "bit_identical": true, + "max_abs_delta": 0.0, + "max_rel_delta": 0.0, + "nan_pattern_equal": true, + "allclose": true + }, + "control_vs_library": { + "bit_identical": true, + "max_abs_delta": 0.0, + "max_rel_delta": 0.0, + "nan_pattern_equal": true, + "allclose": true + } + } + }, + "simple_solved_vmap4": { + "vmap_vs_scalar_within_route": { + "control": { + "bit_identical": true, + "max_abs_delta": 0.0, + "max_rel_delta": 0.0, + "nan_pattern_equal": true, + "allclose_rtol_1e-12": true, + "n_compared": 16 + }, + "nodedup": { + "bit_identical": true, + "max_abs_delta": 0.0, + "max_rel_delta": 0.0, + "nan_pattern_equal": true, + "allclose_rtol_1e-12": true, + "n_compared": 16 + }, + "library": { + "bit_identical": true, + "max_abs_delta": 0.0, + "max_rel_delta": 0.0, + "nan_pattern_equal": true, + "allclose_rtol_1e-12": true, + "n_compared": 16 + } + }, + "across_routes": { + "control_vs_nodedup": { + "bit_identical": true, + "max_abs_delta": 0.0, + "max_rel_delta": 0.0, + "nan_pattern_equal": true + }, + "control_vs_library": { + "bit_identical": true, + "max_abs_delta": 0.0, + "max_rel_delta": 0.0, + "nan_pattern_equal": true + }, + "nodedup_vs_library": { + "bit_identical": true, + "max_abs_delta": 0.0, + "max_rel_delta": 0.0, + "nan_pattern_equal": true + } + } + }, + "cluster_solved_positions": { + "n_instances": 3, + "compile": { + "control": { + "lower_s": 8.133093100001133, + "compile_s": 11.532819600000948, + "first_call_s": 0.1377494000007573, + "trace_calls": 28, + "flops": 184111088.0, + "hlo_sort_count": 25, + "stablehlo_sort_count": 3, + "hlo_sort_shapes": [ + "(f64[276507]{0}, f64[276507]{0}, s64[276507]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})" + ], + "hlo_sha256": "b33293cbc6e7bdae", + "hlo_lines": 55191 + }, + "nodedup": { + "lower_s": 8.068783800001256, + "compile_s": 9.885376999998698, + "first_call_s": 0.06715180000173859, + "trace_calls": 28, + "flops": 139395248.0, + "hlo_sort_count": 12, + "stablehlo_sort_count": 1, + "hlo_sort_shapes": [ + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})" + ], + "hlo_sha256": "55550ae050d4ebe7", + "hlo_lines": 47313 + }, + "library": { + "lower_s": 9.26448370000071, + "compile_s": 12.73936970000068, + "first_call_s": 0.14164830000299844, + "trace_calls": 28, + "flops": 184111088.0, + "hlo_sort_count": 25, + "stablehlo_sort_count": 3, + "hlo_sort_shapes": [ + "(f64[276507]{0}, f64[276507]{0}, s64[276507]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})" + ], + "hlo_sha256": "777a6619fe8b0c25", + "hlo_lines": 55191 + } + }, + "positions": { + "control": [ + [ + [ + [ + -3.0789062499999997, + -7.858729484445975 + ], + [ + -0.9296874999999998, + 10.716162262036818 + ], + [ + -0.021874999999999995, + -0.23996120563193818 + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ] + ], + [ + [ + -15.96875, + 19.007453393477206 + ], + [ + 0.68359375, + -0.5146536383948147 + ], + [ + 13.693749999999998, + -14.309265577946627 + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ] + ] + ], + [ + [ + [ + -3.0789062499999997, + -7.858729484445975 + ], + [ + -0.9296875, + 10.709847493467556 + ], + [ + -0.016406249999999997, + -0.24311858991656893 + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ] + ], + [ + [ + -15.963281249999998, + 18.997981240623318 + ], + [ + 0.6890624999999999, + -0.5178110226794455 + ], + [ + 13.68828125, + -14.306108193661998 + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ] + ] + ], + [ + [ + [ + -3.0843749999999996, + -7.855572100161344 + ], + [ + -0.9351562499999999, + 10.72563441489071 + ], + [ + -0.021874999999999995, + -0.23364643706267665 + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ] + ], + [ + [ + -15.96875, + 19.007453393477206 + ], + [ + 0.68359375, + -0.5083388698255532 + ], + [ + 13.693749999999998, + -14.309265577946627 + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ] + ] + ] + ], + "nodedup": [ + [ + [ + [ + -3.0789062499999997, + -7.858729484445975 + ], + [ + -0.9296874999999998, + 10.716162262036818 + ], + [ + -0.021874999999999995, + -0.23996120563193818 + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ] + ], + [ + [ + -15.96875, + 19.007453393477206 + ], + [ + 0.68359375, + -0.5146536383948147 + ], + [ + 13.693749999999998, + -14.309265577946627 + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ] + ] + ], + [ + [ + [ + -3.0789062499999997, + -7.858729484445975 + ], + [ + -0.9296875, + 10.709847493467556 + ], + [ + -0.016406249999999997, + -0.24311858991656893 + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ] + ], + [ + [ + -15.963281249999998, + 18.997981240623318 + ], + [ + 0.6890624999999999, + -0.5178110226794455 + ], + [ + 13.68828125, + -14.306108193661998 + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ] + ] + ], + [ + [ + [ + -3.0843749999999996, + -7.855572100161344 + ], + [ + -0.9351562499999999, + 10.72563441489071 + ], + [ + -0.021874999999999995, + -0.23364643706267665 + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ] + ], + [ + [ + -15.96875, + 19.007453393477206 + ], + [ + 0.68359375, + -0.5083388698255532 + ], + [ + 13.693749999999998, + -14.309265577946627 + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ] + ] + ] + ], + "library": [ + [ + [ + [ + -3.0789062499999997, + -7.858729484445975 + ], + [ + -0.9296874999999998, + 10.716162262036818 + ], + [ + -0.021874999999999995, + -0.23996120563193818 + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ] + ], + [ + [ + -15.96875, + 19.007453393477206 + ], + [ + 0.68359375, + -0.5146536383948147 + ], + [ + 13.693749999999998, + -14.309265577946627 + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ] + ] + ], + [ + [ + [ + -3.0789062499999997, + -7.858729484445975 + ], + [ + -0.9296875, + 10.709847493467556 + ], + [ + -0.016406249999999997, + -0.24311858991656893 + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ] + ], + [ + [ + -15.963281249999998, + 18.997981240623318 + ], + [ + 0.6890624999999999, + -0.5178110226794455 + ], + [ + 13.68828125, + -14.306108193661998 + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ] + ] + ], + [ + [ + [ + -3.0843749999999996, + -7.855572100161344 + ], + [ + -0.9351562499999999, + 10.72563441489071 + ], + [ + -0.021874999999999995, + -0.23364643706267665 + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ] + ], + [ + [ + -15.96875, + 19.007453393477206 + ], + [ + 0.68359375, + -0.5083388698255532 + ], + [ + 13.693749999999998, + -14.309265577946627 + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ] + ] + ] + ] + }, + "finite_positions": { + "control": [ + [ + 3, + 3 + ], + [ + 3, + 3 + ], + [ + 3, + 3 + ] + ], + "nodedup": [ + [ + 3, + 3 + ], + [ + 3, + 3 + ], + [ + 3, + 3 + ] + ], + "library": [ + [ + 3, + 3 + ], + [ + 3, + 3 + ], + [ + 3, + 3 + ] + ] + }, + "pairs": { + "control_vs_nodedup": { + "max_abs_delta": 0.0, + "max_rel_delta": 0.0, + "nan_pattern_equal": true, + "array_equal_nan_aware": true + }, + "control_vs_library": { + "max_abs_delta": 0.0, + "max_rel_delta": 0.0, + "nan_pattern_equal": true, + "array_equal_nan_aware": true + } + } + } + }, + "wall_s": 938.6465837999967 +} \ No newline at end of file diff --git a/results/breakdown/point_source/vertex_dedup_ab_local_cpu_fp64.png b/results/breakdown/point_source/vertex_dedup_ab_local_cpu_fp64.png new file mode 100644 index 0000000000000000000000000000000000000000..c8fa04faadb6dba79ac17bcc313158d96970a232 GIT binary patch literal 148480 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%0D0f=l9WC0GNNC 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 z Date: Wed, 23 Sep 2026 17:32:13 +0200 Subject: [PATCH 4/9] results(profiling): RAL CPU fp64 vertex-dedup A/B rows, job 350582 (#568) Co-Authored-By: Claude Fable 5.1 --- .../vertex_dedup_ab_hpc_ral_cpu_fp64.json | 5659 +++++++++++++++++ .../vertex_dedup_ab_hpc_ral_cpu_fp64.png | Bin 0 -> 124767 bytes ...6_09_23_ral_job_350582_vertex_dedup_ab.out | 192 + 3 files changed, 5851 insertions(+) create mode 100644 results/breakdown/point_source/vertex_dedup_ab_hpc_ral_cpu_fp64.json create mode 100644 results/breakdown/point_source/vertex_dedup_ab_hpc_ral_cpu_fp64.png create mode 100644 results/notes/point_source_cpu_2026_09_23_ral_job_350582_vertex_dedup_ab.out diff --git a/results/breakdown/point_source/vertex_dedup_ab_hpc_ral_cpu_fp64.json b/results/breakdown/point_source/vertex_dedup_ab_hpc_ral_cpu_fp64.json new file mode 100644 index 000000000..80f79fcf6 --- /dev/null +++ b/results/breakdown/point_source/vertex_dedup_ab_hpc_ral_cpu_fp64.json @@ -0,0 +1,5659 @@ +{ + "cell": "vertex_dedup_ab", + "issue": "PyAutoLabs/PyAutoArray#568", + "config_name": "hpc_ral_cpu_fp64", + "quick": false, + "models": [ + "simple", + "cluster" + ], + "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": "d97556f8cdf62e63972964285615ca401aad37d0", + "PyAutoNerves": "1fa613aa8d89a79613009fb66f5b4e2d21deb57a", + "PyAutoFit": "a736840127be7a3c21e15a5c945e94d8f1082983", + "PyAutoArray": "22e6d6082e3365b10fb08d96e19ab02a5420e935", + "PyAutoGalaxy": "70a61e26cd715cefe7012a38285698091246a8a4", + "PyAutoLens": "2aaa1c1a8bb4a5923edf30a18451fcea330a6bd4" + }, + "autoarray_imported_from": "/mnt/ral/jnightin/PyAuto/PyAutoArray", + "target": "autoarray.structures.triangles.coordinate_array.CoordinateArrayTriangles._vertices_and_indices", + "control_source": { + "repo": "PyAutoArray", + "sha": "11b93476", + "path": "autoarray/structures/triangles/coordinate_array.py", + "body": "def _control_vertices_and_indices(self):\n \"\"\"PRE-fix ``_vertices_and_indices`` \u2014 verbatim from PyAutoArray ``11b93476``.\"\"\"\n import jax.numpy as jnp\n\n flat_triangles = self.triangles.reshape(-1, 2)\n vertices, inverse_indices = jnp.unique(\n flat_triangles,\n axis=0,\n return_inverse=True,\n size=3 * self.coordinates.shape[0],\n equal_nan=True,\n fill_value=jnp.nan,\n )\n\n nan_mask = jnp.isnan(vertices).any(axis=1)\n inverse_indices = jnp.where(nan_mask[inverse_indices], -1, inverse_indices)\n\n indices = inverse_indices.reshape(-1, 3)\n return vertices, indices\n" + }, + "nodedup_body": "def _nodedup_vertices_and_indices(self):\n \"\"\"POST-fix ``_vertices_and_indices``: the flat 3N table and an ``arange`` index map.\"\"\"\n import jax.numpy as jnp\n\n flat = self.triangles.reshape(-1, 2)\n indices = jnp.arange(flat.shape[0]).reshape(-1, 3)\n return flat, indices\n", + "device": { + "backend": "cpu", + "device": "cpu:0", + "hostname": "euclid-ral-compute-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": 252, + "jax_compilation_cache_dir": "/vertex_dedup_ab_350582", + "autotune_cache_entries_at_start": 0, + "cache_fresh": true + }, + "jax_devices": [ + "cpu:0" + ], + "machine": { + "cpu_model": "AMD EPYC 7763 64-Core Processor", + "cpu_count_os": 252, + "nproc": 1, + "nproc_all": 252, + "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": "950545144 kB", + "kernel": "5.14.0-687.39.1.el9_8.x86_64", + "platform": "Linux-5.14.0-687.39.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": 252, + "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.49, + 0.13, + 0.04 + ], + "loadavg_end": [ + 1.54, + 1.43, + 0.84 + ], + "protocol": { + "routes": [ + "control", + "nodedup", + "library" + ], + "n_rounds": 20, + "n_calls_per_round": 5, + "n_warm": 3, + "n_stream": 16, + "n_gate_instances": 3, + "vmap_batch": 4, + "instance_seed": 568, + "instance_stream": "entry 0 = prior medians; rest = vector_from_unit_vector(U(0.25,0.75))", + "argument": "physical parameter vector; instance_from_vector(xp=jnp) inside the trace", + "cache_trap_guard": "fresh closure + fresh solver/analyses per route; jax.clear_caches()", + "bootstrap": { + "samples": 2000, + "seed": 12345, + "interval": "90%" + }, + "cluster_gates": "log-likelihood and positions only (no cluster grad/vmap)", + "pytrees": "autofit.jax.register_model(model) for every model before any trace" + }, + "free_parameters": { + "simple_solved": 5, + "simple_plain": 8, + "cluster_solved": 13, + "cluster_plain": 17 + }, + "model_configuration": { + "simple": { + "dataset": "dataset/point_source/simple/point_dataset_positions_only.json", + "solver_grid_shape": [ + 100, + 100 + ], + "solver_grid_pixel_scale": 0.2, + "solver_pixel_scale_precision": 0.001, + "magnification_threshold": 0.1, + "likelihoods": { + "solved": "FitPositionsImagePairAllSolved", + "plain": "FitPositionsImagePairAll" + } + }, + "cluster": { + "dataset": "dataset/cluster/simple/point_datasets.csv", + "n_systems": 2, + "n_mass_profiles": 13, + "solver_grid_shape": [ + 200, + 200 + ], + "solver_grid_pixel_scale": 0.7, + "solver_pixel_scale_precision": 0.01, + "source_centres_from": "back-traced observed-image centroids (cluster cell step 1)", + "likelihoods": { + "solved": "FitPositionsImagePairRepeatSolved (summed over systems)", + "plain": "FitPositionsImagePairRepeat (summed over systems)" + } + } + }, + "library_label": { + "per_row": { + "simple_solved": { + "hlo_sort_count": { + "control": 15, + "nodedup": 7, + "library": 15 + }, + "stablehlo_sort_count": { + "control": 3, + "nodedup": 1, + "library": 3 + }, + "library_matches": "control", + "library_hlo_identical_to": [] + }, + "simple_solved_vmap4": { + "hlo_sort_count": { + "control": 15, + "nodedup": 7, + "library": 15 + }, + "stablehlo_sort_count": { + "control": 3, + "nodedup": 1, + "library": 3 + }, + "library_matches": "control", + "library_hlo_identical_to": [] + }, + "simple_plain": { + "hlo_sort_count": { + "control": 15, + "nodedup": 7, + "library": 15 + }, + "stablehlo_sort_count": { + "control": 3, + "nodedup": 1, + "library": 3 + }, + "library_matches": "control", + "library_hlo_identical_to": [] + }, + "cluster_solved": { + "hlo_sort_count": { + "control": 25, + "nodedup": 12, + "library": 25 + }, + "stablehlo_sort_count": { + "control": 3, + "nodedup": 1, + "library": 3 + }, + "library_matches": "control", + "library_hlo_identical_to": [] + }, + "cluster_plain": { + "hlo_sort_count": { + "control": 25, + "nodedup": 12, + "library": 25 + }, + "stablehlo_sort_count": { + "control": 3, + "nodedup": 1, + "library": 3 + }, + "library_matches": "control", + "library_hlo_identical_to": [] + } + }, + "library_matches": "control" + }, + "library_matches": "control", + "bit_identical": true, + "gate_summary": { + "simple_solved.log_likelihood.control_vs_nodedup": { + "pass": true, + "max_abs_delta": 0.0, + "max_rel_delta": 0.0 + }, + "simple_solved.log_likelihood.control_vs_library": { + "pass": true, + "max_abs_delta": 0.0, + "max_rel_delta": 0.0 + }, + "simple_solved_vmap4.log_likelihood.control_vs_nodedup": { + "pass": true, + "max_abs_delta": 0.0, + "max_rel_delta": 0.0 + }, + "simple_solved_vmap4.log_likelihood.control_vs_library": { + "pass": true, + "max_abs_delta": 0.0, + "max_rel_delta": 0.0 + }, + "simple_plain.log_likelihood.control_vs_nodedup": { + "pass": true, + "max_abs_delta": 0.0, + "max_rel_delta": 0.0 + }, + "simple_plain.log_likelihood.control_vs_library": { + "pass": true, + "max_abs_delta": 0.0, + "max_rel_delta": 0.0 + }, + "cluster_solved.log_likelihood.control_vs_nodedup": { + "pass": true, + "max_abs_delta": 0.0, + "max_rel_delta": 0.0 + }, + "cluster_solved.log_likelihood.control_vs_library": { + "pass": true, + "max_abs_delta": 0.0, + "max_rel_delta": 0.0 + }, + "cluster_plain.log_likelihood.control_vs_nodedup": { + "pass": true, + "max_abs_delta": 0.0, + "max_rel_delta": 0.0 + }, + "cluster_plain.log_likelihood.control_vs_library": { + "pass": true, + "max_abs_delta": 0.0, + "max_rel_delta": 0.0 + }, + "simple_solved_positions.control_vs_nodedup": { + "pass": true, + "max_abs_delta": 0.0 + }, + "simple_solved_positions.control_vs_library": { + "pass": true, + "max_abs_delta": 0.0 + }, + "simple_solved_grad.control_vs_nodedup": { + "pass": true, + "bit_identical": true, + "max_abs_delta": 0.0, + "max_rel_delta": 0.0 + }, + "simple_solved_grad.control_vs_library": { + "pass": true, + "bit_identical": true, + "max_abs_delta": 0.0, + "max_rel_delta": 0.0 + }, + "simple_solved_vmap4.vmap_vs_scalar.control": { + "pass": true, + "bit_identical": true, + "max_abs_delta": 0.0 + }, + "simple_solved_vmap4.vmap_vs_scalar.nodedup": { + "pass": true, + "bit_identical": true, + "max_abs_delta": 0.0 + }, + "simple_solved_vmap4.vmap_vs_scalar.library": { + "pass": true, + "bit_identical": true, + "max_abs_delta": 0.0 + }, + "cluster_solved_positions.control_vs_nodedup": { + "pass": true, + "max_abs_delta": 0.0 + }, + "cluster_solved_positions.control_vs_library": { + "pass": true, + "max_abs_delta": 0.0 + } + }, + "rows": { + "simple_solved": { + "label": "simple_solved", + "batch": null, + "n_rounds": 20, + "n_calls_per_round": 5, + "n_warm": 3, + "route_order": "round-robin, start rotated each round", + "per_call_ms": { + "control": [ + 24.426332907751203, + 23.07515195570886, + 24.17942904867232, + 24.371761013753712, + 24.47534305974841, + 23.679131059907377, + 24.127539014443755, + 23.46588601358235, + 24.678796995431185, + 23.588400101289153, + 24.01921700220555, + 23.73446198180318, + 23.993626004084945, + 24.21410905662924, + 24.580345954746008, + 23.823584080673754, + 24.295761017128825, + 23.476348025724292, + 24.431062978692353, + 23.92005396541208, + 23.69134104810655, + 23.97604496218264, + 23.648391012102365, + 23.97781505715102, + 24.15565005503595, + 24.219439015723765, + 23.670440074056387, + 23.93539494369179, + 24.46072397287935, + 24.50736507307738, + 23.274403996765614, + 23.90364499296993, + 24.63856595568359, + 23.550629033707082, + 24.012056994251907, + 23.78830302041024, + 24.394353036768734, + 24.48074403218925, + 24.392772000283003, + 23.759832954965532, + 23.112311027944088, + 24.723769049160182, + 23.98593700490892, + 23.159501957707107, + 24.009966058656573, + 23.959615034982562, + 23.976644035428762, + 24.15577892679721, + 24.5324739953503, + 23.047500057145953, + 24.248561006970704, + 23.60259904526174, + 23.9003230817616, + 24.15101893711835, + 24.103007977828383, + 23.964324966073036, + 23.513759020715952, + 24.424153030849993, + 23.81219295784831, + 23.721841047517955, + 24.145978968590498, + 24.201638996601105, + 23.445837083272636, + 24.791679927147925, + 24.05950694810599, + 25.167115032672882, + 24.43735394626856, + 23.606159957125783, + 24.424212984740734, + 23.68955104611814, + 23.23711395729333, + 23.948165006004274, + 23.551249061711133, + 23.358205915428698, + 24.288410088047385, + 24.663207004778087, + 23.50158803164959, + 24.884470971301198, + 24.47771397419274, + 24.75960797164589, + 23.499566945247352, + 23.82617408875376, + 23.47471797838807, + 24.118127999827266, + 24.05229804571718, + 23.739131982438266, + 23.426607018336654, + 24.086808087304235, + 23.4180559637025, + 24.28584999870509, + 23.204982979223132, + 24.094138061627746, + 23.483567987568676, + 24.08368804026395, + 23.831174010410905, + 23.230862920172513, + 24.69070698134601, + 24.66580702457577, + 24.39681300893426, + 24.483993067406118 + ], + "nodedup": [ + 4.839170025661588, + 5.7851949241012335, + 6.16786302998662, + 5.2411569049581885, + 4.783218028023839, + 6.207501981407404, + 5.657834000885487, + 6.3074539648368955, + 6.6796200117096305, + 6.339745013974607, + 4.481564974412322, + 4.656017059460282, + 4.783498006872833, + 5.353718996047974, + 5.407849093899131, + 5.597641924396157, + 5.254546995274723, + 5.471538985148072, + 6.206651101820171, + 5.488610011525452, + 5.43470005504787, + 4.623886081390083, + 5.202186061069369, + 4.679237958043814, + 5.5594120640307665, + 6.522826966829598, + 6.055180914700031, + 4.445293918251991, + 5.053933011367917, + 5.354880006052554, + 4.595736041665077, + 6.170681095682085, + 5.533150979317725, + 6.514999084174633, + 5.723134963773191, + 4.597124992869794, + 5.116552929393947, + 4.4619940454140306, + 6.1612119898200035, + 5.330946994945407, + 5.3642080165445805, + 5.534872063435614, + 6.664810003712773, + 6.244092946872115, + 5.483770044520497, + 5.6276420364156365, + 5.8015360264107585, + 5.535131087526679, + 4.903570981696248, + 5.256676930002868, + 5.254317075014114, + 5.20620692986995, + 6.414616014808416, + 5.2445960463956, + 6.167832063511014, + 5.070933955721557, + 4.350861068814993, + 5.18201501108706, + 4.841229994781315, + 5.720845074392855, + 6.138732074759901, + 5.623184028081596, + 4.7037090407684445, + 5.331358057446778, + 5.361499032005668, + 5.450880038551986, + 5.839325021952391, + 5.738295032642782, + 5.110993981361389, + 5.157295032404363, + 4.9607009859755635, + 4.25263901706785, + 5.386278964579105, + 5.169145995751023, + 5.442659952677786, + 5.769043928012252, + 4.362351959571242, + 6.423756945878267, + 5.929218023084104, + 6.679770071059465, + 5.15591399744153, + 5.786495981737971, + 5.08833397179842, + 5.577392061240971, + 5.5805620504543185, + 6.25842297449708, + 6.036380073055625, + 5.6532720336690545, + 5.090285092592239, + 5.079024005681276, + 4.616405931301415, + 5.161734996363521, + 5.20434498321265, + 5.28343697078526, + 5.492580006830394, + 5.092365085147321, + 4.811769002117217, + 5.714154918678105, + 5.098313908092678, + 5.090751918032765 + ], + "library": [ + 23.194654029794037, + 23.793481988832355, + 24.805968976579607, + 25.500271003693342, + 23.900275002233684, + 24.11430806387216, + 24.883831036277115, + 23.545098956674337, + 24.63614591397345, + 23.531508981250226, + 23.763053002767265, + 23.95600499585271, + 23.630719049833715, + 24.21453094575554, + 23.84235302451998, + 24.288601940497756, + 23.428336950019002, + 24.45145498495549, + 24.536636075936258, + 23.821681970730424, + 23.770982050336897, + 23.93398410640657, + 23.493877961300313, + 23.59923906624317, + 24.168909061700106, + 23.639009916223586, + 24.319060961715877, + 24.948930949904025, + 24.048047023825347, + 23.79292296245694, + 23.24054401833564, + 24.394153035245836, + 23.91226403415203, + 23.82305299397558, + 23.874243954196572, + 23.902855115011334, + 24.34885292313993, + 24.13607807829976, + 24.242831044830382, + 23.791132029145956, + 23.20174197666347, + 24.340650998055935, + 23.628099937923253, + 23.37317494675517, + 24.271732079796493, + 24.17972800321877, + 24.841598933562636, + 24.5909959776327, + 23.685531923547387, + 23.648501024581492, + 23.466119077056646, + 24.726287927478552, + 23.618398932740092, + 25.365549023263156, + 24.579846067354083, + 24.093477055430412, + 24.398552952334285, + 24.908681050874293, + 23.912322940304875, + 23.73747294768691, + 23.85911298915744, + 23.459558025933802, + 23.892013006843626, + 23.19887198973447, + 24.15981807280332, + 23.690511006861925, + 23.566688993014395, + 24.400221998803318, + 23.28372502233833, + 23.704982013441622, + 24.698148015886545, + 23.979666060768068, + 24.77185893803835, + 23.905094945803285, + 24.318020907230675, + 23.907704977318645, + 24.675866938196123, + 24.113008053973317, + 23.928934009745717, + 24.461585097014904, + 23.55298795737326, + 23.471678025089204, + 23.34909501951188, + 23.46112800296396, + 23.708652006462216, + 23.176812916062772, + 23.41135498136282, + 23.824693053029478, + 24.516383069567382, + 23.59354996588081, + 24.207168957218528, + 24.060077033936977, + 24.60857597179711, + 24.649736005812883, + 24.027007049880922, + 24.524475098587573, + 24.1700200131163, + 24.396522087045014, + 23.77738105133176, + 24.21550895087421 + ] + }, + "warm_ms": { + "control": [ + 26.41581604257226, + 24.69790691975504, + 24.078318965621293 + ], + "nodedup": [ + 4.784210002981126, + 5.753724020905793, + 4.595027072355151 + ], + "library": [ + 23.24127301108092, + 24.686857010237873, + 24.475284037180245 + ] + }, + "stats": { + "control": { + "n": 100, + "median_ms": 24.00179603137076, + "p10_ms": 23.42575191287324, + "p90_ms": 24.586167954839766, + "min_ms": 23.047500057145953, + "max_ms": 25.167115032672882, + "mean_ms": 23.998313697520643 + }, + "nodedup": { + "n": 100, + "median_ms": 5.375243490561843, + "p10_ms": 4.652803961653262, + "p90_ms": 6.245525949634612, + "min_ms": 4.25263901706785, + "max_ms": 6.679770071059465, + "mean_ms": 5.434200057061389 + }, + "library": { + "n": 100, + "median_ms": 23.920628475025296, + "p10_ms": 23.456435918342322, + "p90_ms": 24.678095045965165, + "min_ms": 23.176812916062772, + "max_ms": 25.500271003693342, + "mean_ms": 24.02466550236568 + } + }, + "ratio_control_over_nodedup": { + "ratio": 4.465248146156443, + "ci90_low": 4.3699448792030715, + "ci90_high": 4.565633827804641, + "bootstrap_samples": 2000 + }, + "ratio_library_over_nodedup": { + "ratio": 4.450147889491237, + "ci90_low": 4.355080303359179, + "ci90_high": 4.550552588476369, + "bootstrap_samples": 2000 + }, + "ratio_control_over_library": { + "ratio": 1.0033932033362003, + "ci90_low": 0.9953866067273155, + "ci90_high": 1.0079632480500529, + "bootstrap_samples": 2000 + }, + "paired_round_ratio_control_over_nodedup": { + "median": 4.5132298546780465, + "p10": 4.174963359384248, + "p90": 4.771478749996658 + }, + "minimum_detectable_improvement": 0.048347050381139976, + "compile": { + "control": { + "lower_s": 2.8864294780651107, + "compile_s": 4.081425369950011, + "first_call_s": 0.028074682923033834, + "trace_calls": 32, + "flops": 15582802.0, + "hlo_sort_count": 15, + "stablehlo_sort_count": 3, + "hlo_sort_shapes": [ + "(f64[69849]{0}, f64[69849]{0}, s64[69849]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})" + ], + "hlo_sha256": "345c49245e378356", + "hlo_lines": 28583 + }, + "nodedup": { + "lower_s": 2.5637055030092597, + "compile_s": 3.244780293898657, + "first_call_s": 0.005398558918386698, + "trace_calls": 32, + "flops": 7053434.0, + "hlo_sort_count": 7, + "stablehlo_sort_count": 1, + "hlo_sort_shapes": [ + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})" + ], + "hlo_sha256": "bb9f3f880f1900ff", + "hlo_lines": 24404 + }, + "library": { + "lower_s": 2.710495363920927, + "compile_s": 0.529712472925894, + "first_call_s": 0.025791975087486207, + "trace_calls": 32, + "flops": 15582802.0, + "hlo_sort_count": 15, + "stablehlo_sort_count": 3, + "hlo_sort_shapes": [ + "(f64[69849]{0}, f64[69849]{0}, s64[69849]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})" + ], + "hlo_sha256": "3fa7362aeb50d861", + "hlo_lines": 24937 + } + }, + "instances_compared": [ + [ + 0 + ], + [ + 1 + ], + [ + 2 + ], + [ + 3 + ], + [ + 4 + ], + [ + 5 + ], + [ + 6 + ], + [ + 7 + ], + [ + 8 + ], + [ + 9 + ], + [ + 10 + ], + [ + 11 + ], + [ + 12 + ], + [ + 13 + ], + [ + 14 + ], + [ + 15 + ] + ], + "values": { + "control": [ + 7.743201200876812, + 4.901199826003542, + 8.551453428732437, + 7.640170398958149, + 7.2580956747803445, + 9.29357838657636, + 3.0338796505151917, + 8.714615086385912, + 4.735173159474494, + 3.2233889243165805, + 9.296501815740573, + 6.7486158154711955, + -1.4028143150641306, + 0.5885274382499945, + 6.162997261446639, + -10.49915087893337 + ], + "nodedup": [ + 7.743201200876812, + 4.901199826003542, + 8.551453428732437, + 7.640170398958149, + 7.2580956747803445, + 9.29357838657636, + 3.0338796505151917, + 8.714615086385912, + 4.735173159474494, + 3.2233889243165805, + 9.296501815740573, + 6.7486158154711955, + -1.4028143150641306, + 0.5885274382499945, + 6.162997261446639, + -10.49915087893337 + ], + "library": [ + 7.743201200876812, + 4.901199826003542, + 8.551453428732437, + 7.640170398958149, + 7.2580956747803445, + 9.29357838657636, + 3.0338796505151917, + 8.714615086385912, + 4.735173159474494, + 3.2233889243165805, + 9.296501815740573, + 6.7486158154711955, + -1.4028143150641306, + 0.5885274382499945, + 6.162997261446639, + -10.49915087893337 + ] + }, + "deterministic_within_route": { + "control": true, + "nodedup": true, + "library": true + }, + "likelihood_gate": { + "control_vs_nodedup": { + "bit_identical": true, + "max_abs_delta": 0.0, + "max_rel_delta": 0.0, + "nan_pattern_equal": true + }, + "control_vs_library": { + "bit_identical": true, + "max_abs_delta": 0.0, + "max_rel_delta": 0.0, + "nan_pattern_equal": true + }, + "nodedup_vs_library": { + "bit_identical": true, + "max_abs_delta": 0.0, + "max_rel_delta": 0.0, + "nan_pattern_equal": true + } + }, + "fiducial_log_likelihood": { + "control": 7.743201200876812, + "nodedup": 7.743201200876812, + "library": 7.743201200876812 + } + }, + "simple_solved_vmap4": { + "label": "simple_solved_vmap4", + "batch": 4, + "n_rounds": 20, + "n_calls_per_round": 5, + "n_warm": 3, + "route_order": "round-robin, start rotated each round", + "per_call_ms": { + "control": [ + 30.420181923545897, + 30.345121980644763, + 33.08422595728189, + 30.120588024146855, + 32.390914973802865, + 29.65981897432357, + 31.652701902203262, + 31.701472005806863, + 30.306509928777814, + 30.25801805779338, + 29.929412994533777, + 31.932558049447834, + 30.418431968428195, + 30.956101953051984, + 31.50444000493735, + 29.841594048775733, + 31.98470699135214, + 29.282714007422328, + 31.437387922778726, + 30.530713964253664, + 32.350733992643654, + 29.8155719647184, + 31.22037590947002, + 31.489429995417595, + 30.898820026777685, + 31.37740702368319, + 30.787718947976828, + 31.382948043756187, + 29.20638199429959, + 29.892943101003766, + 30.642565106973052, + 31.392427976243198, + 31.258904957212508, + 31.308336067013443, + 30.353610985912383, + 29.883084003813565, + 32.06242900341749, + 30.38908203598112, + 32.59683703072369, + 31.951177050359547, + 29.777270974591374, + 32.19839197117835, + 29.869233025237918, + 31.01377305574715, + 32.82417205628008, + 31.30887693259865, + 31.870953971520066, + 30.964161036536098, + 31.278535025194287, + 29.689130024053156, + 31.74577304162085, + 30.798148014582694, + 32.03847899567336, + 29.942704015411437, + 32.69575897138566, + 32.338154036551714, + 31.687602982856333, + 31.097172992303967, + 32.158970017917454, + 29.430645052343607, + 32.37704501952976, + 31.74895397387445, + 29.61297007277608, + 31.18925599846989, + 31.01564198732376, + 31.570642022415996, + 31.761383987031877, + 31.50073892902583, + 31.027391087263823, + 31.132803997024894, + 29.55558802932501, + 32.087339903227985, + 33.23167806956917, + 30.907950014807284, + 32.10305096581578, + 31.47152008023113, + 32.61124808341265, + 32.72746002767235, + 33.09306700248271, + 31.78983391262591, + 30.078566051088274, + 31.661171931773424, + 32.55029709544033, + 32.60527900420129, + 31.67839301750064, + 30.40143195539713, + 30.578534002415836, + 32.14370005298406, + 32.1111410157755, + 29.840981005690992, + 30.14964796602726, + 32.24365191999823, + 29.556426918134093, + 31.487479922361672, + 29.684270033612847, + 28.651764034293592, + 29.424904962070286, + 32.184042036533356, + 31.851896084845066, + 32.61229896452278 + ], + "nodedup": [ + 11.061502969823778, + 12.901604059152305, + 11.110443039797246, + 10.770266992039979, + 12.791190994903445, + 12.125579989515245, + 12.969793984666467, + 10.780417942442, + 12.933443067595363, + 12.210152111947536, + 10.963522014208138, + 11.28940808121115, + 11.063220910727978, + 11.624750914052129, + 11.904865968972445, + 13.992360909469426, + 12.779011041857302, + 12.049829005263746, + 11.046183062717319, + 10.784397018142045, + 11.201323941349983, + 11.81925495620817, + 12.840549927204847, + 12.77553103864193, + 11.042661964893341, + 12.967123067937791, + 10.668346076272428, + 9.853541036136448, + 12.848042999394238, + 12.531626969575882, + 11.302786995656788, + 13.384571997448802, + 11.066311970353127, + 11.970647959969938, + 11.793834972195327, + 13.452182058244944, + 10.752568021416664, + 12.12509092874825, + 10.909160017035902, + 10.954909957945347, + 13.16278800368309, + 12.243311037309468, + 11.031962931156158, + 12.612667982466519, + 13.249459094367921, + 13.097796007059515, + 11.103343917056918, + 11.773732956498861, + 11.53266103938222, + 11.413228930905461, + 11.55361090786755, + 12.840431998483837, + 12.722751009278, + 10.846769087947905, + 12.648599105887115, + 12.890512007288635, + 11.788513977080584, + 10.050265002064407, + 12.88593199569732, + 12.582927010953426, + 11.242175940424204, + 10.881560039706528, + 10.312170023098588, + 12.90851307567209, + 10.55705500766635, + 11.066552018746734, + 10.98772103432566, + 12.572458013892174, + 13.003144995309412, + 10.81417000386864, + 10.882401023991406, + 12.499915901571512, + 11.031272006221116, + 10.215429007075727, + 13.068554922938347, + 13.089196989312768, + 12.036178959533572, + 11.026702006347477, + 11.434608954004943, + 14.00213094893843, + 11.278356076218188, + 11.135943001136184, + 12.54462799988687, + 10.105716064572334, + 13.811458018608391, + 12.716179015114903, + 12.351555051282048, + 10.75205800589174, + 13.018196099437773, + 11.911896988749504, + 11.268456000834703, + 12.549747014418244, + 13.932130998000503, + 12.66502810176462, + 12.903902097605169, + 12.77926005423069, + 10.746977059170604, + 12.537945993244648, + 11.807136004790664, + 13.172846985980868 + ], + "library": [ + 30.546903959475458, + 31.839704955928028, + 31.692493008449674, + 29.99578497838229, + 31.731734052300453, + 29.508396983146667, + 30.47091292683035, + 30.726497992873192, + 29.382825014181435, + 32.09427907131612, + 31.626351992599666, + 30.040665064007044, + 31.3934579025954, + 32.53749699797481, + 31.56070993281901, + 30.939409974962473, + 30.292790033854544, + 30.821998952887952, + 29.469477012753487, + 29.536777990870178, + 31.86348604504019, + 31.21084498707205, + 32.51288703177124, + 32.42709499318153, + 30.658015981316566, + 32.453835010528564, + 30.37142101675272, + 30.12595698237419, + 32.49477595090866, + 33.05536601692438, + 31.171623966656625, + 32.53444703295827, + 33.17048796452582, + 30.162767972797155, + 30.628995969891548, + 31.14364400971681, + 31.53554000891745, + 30.234958976507187, + 30.482943053357303, + 30.52208200097084, + 30.510273994877934, + 29.478526092134416, + 30.179979046806693, + 31.230964930728078, + 29.892303980886936, + 30.315430951304734, + 29.284714022651315, + 31.56135999597609, + 29.99518602155149, + 30.804167967289686, + 29.433645075187087, + 29.894003993831575, + 29.796991031616926, + 29.993275995366275, + 32.34676399733871, + 31.38344909530133, + 32.361114979721606, + 32.266911934129894, + 31.70221298933029, + 30.354890041053295, + 32.32001303695142, + 30.355561058968306, + 32.43642603047192, + 32.379265059717, + 30.836038989946246, + 28.816125937737525, + 30.842328909784555, + 31.23572503682226, + 32.42040297482163, + 30.901500023901463, + 31.910456949844956, + 31.665752991102636, + 32.22597192507237, + 30.738036963157356, + 30.35647002980113, + 29.858313035219908, + 30.617185053415596, + 32.40936389192939, + 29.18622305151075, + 31.350128003396094, + 31.204903963953257, + 32.12721098680049, + 31.29375702701509, + 32.36319404095411, + 31.924335984513164, + 30.75139701832086, + 30.015234951861203, + 32.85098192282021, + 30.241479980759323, + 30.234059086069465, + 29.97127501294017, + 31.122804037295282, + 32.4753460008651, + 30.984731041826308, + 30.46483197249472, + 29.717131052166224, + 31.467628898099065, + 30.69042693823576, + 31.144893961027265, + 29.509607004001737 + ] + }, + "warm_ms": { + "control": [ + 32.529416028410196, + 30.59517394285649, + 30.275750905275345 + ], + "nodedup": [ + 14.65124194510281, + 12.032579048536718, + 12.773599941283464 + ], + "library": [ + 31.866665929555893, + 31.980196945369244, + 32.375863986089826 + ] + }, + "stats": { + "control": { + "n": 100, + "median_ms": 31.308606499806046, + "p10_ms": 29.688644025009125, + "p90_ms": 32.554951088968664, + "min_ms": 28.651764034293592, + "max_ms": 33.23167806956917, + "mean_ms": 31.16757748182863 + }, + "nodedup": { + "n": 100, + "median_ms": 11.908381478860974, + "p10_ms": 10.768497094977647, + "p90_ms": 13.090056891087443, + "min_ms": 9.853541036136448, + "max_ms": 14.00213094893843, + "mean_ms": 11.930646024411544 + }, + "library": { + "n": 100, + "median_ms": 30.87191446684301, + "p10_ms": 29.69909574603662, + "p90_ms": 32.428028096910566, + "min_ms": 28.816125937737525, + "max_ms": 33.17048796452582, + "mean_ms": 31.01172529743053 + } + }, + "ratio_control_over_nodedup": { + "ratio": 2.6291235761453526, + "ci90_low": 2.5337240399099024, + "ci90_high": 2.71755542528802, + "bootstrap_samples": 2000 + }, + "ratio_library_over_nodedup": { + "ratio": 2.592452594976482, + "ci90_low": 2.504027637872919, + "ci90_high": 2.6846120253360146, + "bootstrap_samples": 2000 + }, + "ratio_control_over_library": { + "ratio": 1.0141452851403838, + "ci90_low": 1.0000711654118855, + "ci90_high": 1.0236923996259364, + "bootstrap_samples": 2000 + }, + "paired_round_ratio_control_over_nodedup": { + "median": 2.6459643757188154, + "p10": 2.4587246612409133, + "p90": 2.870499876279801 + }, + "minimum_detectable_improvement": 0.09155013219695024, + "compile": { + "control": { + "lower_s": 3.707144483109005, + "compile_s": 4.712811150937341, + "first_call_s": 0.03430059505626559, + "trace_calls": 32, + "flops": 33662500.0, + "hlo_sort_count": 15, + "stablehlo_sort_count": 3, + "hlo_sort_shapes": [ + "(f64[69849]{0}, f64[69849]{0}, s64[69849]{0})", + "(f64[4,60]{1,0}, f64[4,60]{1,0}, s64[4,60]{1,0})", + "(f64[4,720]{1,0}, f64[4,720]{1,0}, s64[4,720]{1,0})", + "(f64[4,60]{1,0}, f64[4,60]{1,0}, s64[4,60]{1,0})", + "(f64[4,720]{1,0}, f64[4,720]{1,0}, s64[4,720]{1,0})", + "(f64[4,60]{1,0}, f64[4,60]{1,0}, s64[4,60]{1,0})", + "(f64[4,720]{1,0}, f64[4,720]{1,0}, s64[4,720]{1,0})", + "(f64[4,60]{1,0}, f64[4,60]{1,0}, s64[4,60]{1,0})", + "(f64[4,720]{1,0}, f64[4,720]{1,0}, s64[4,720]{1,0})", + "(f64[4,60]{1,0}, f64[4,60]{1,0}, s64[4,60]{1,0})", + "(f64[4,720]{1,0}, f64[4,720]{1,0}, s64[4,720]{1,0})", + "(f64[4,60]{1,0}, f64[4,60]{1,0}, s64[4,60]{1,0})", + "(f64[4,720]{1,0}, f64[4,720]{1,0}, s64[4,720]{1,0})", + "(f64[4,60]{1,0}, f64[4,60]{1,0}, s64[4,60]{1,0})", + "(f64[4,720]{1,0}, f64[4,720]{1,0}, s64[4,720]{1,0})" + ], + "hlo_sha256": "de9ffe59e4f55057", + "hlo_lines": 30652 + }, + "nodedup": { + "lower_s": 3.3510314059676602, + "compile_s": 3.8235950260423124, + "first_call_s": 0.012071997974999249, + "trace_calls": 32, + "flops": 23296236.0, + "hlo_sort_count": 7, + "stablehlo_sort_count": 1, + "hlo_sort_shapes": [ + "(f64[4,60]{1,0}, f64[4,60]{1,0}, s64[4,60]{1,0})", + "(f64[4,60]{1,0}, f64[4,60]{1,0}, s64[4,60]{1,0})", + "(f64[4,60]{1,0}, f64[4,60]{1,0}, s64[4,60]{1,0})", + "(f64[4,60]{1,0}, f64[4,60]{1,0}, s64[4,60]{1,0})", + "(f64[4,60]{1,0}, f64[4,60]{1,0}, s64[4,60]{1,0})", + "(f64[4,60]{1,0}, f64[4,60]{1,0}, s64[4,60]{1,0})", + "(f64[4,60]{1,0}, f64[4,60]{1,0}, s64[4,60]{1,0})" + ], + "hlo_sha256": "b12f04a4a322a9fc", + "hlo_lines": 26375 + }, + "library": { + "lower_s": 3.7669854409759864, + "compile_s": 0.5013687639730051, + "first_call_s": 0.03329487901646644, + "trace_calls": 32, + "flops": 33662500.0, + "hlo_sort_count": 15, + "stablehlo_sort_count": 3, + "hlo_sort_shapes": [ + "(f64[69849]{0}, f64[69849]{0}, s64[69849]{0})", + "(f64[4,60]{1,0}, f64[4,60]{1,0}, s64[4,60]{1,0})", + "(f64[4,720]{1,0}, f64[4,720]{1,0}, s64[4,720]{1,0})", + "(f64[4,60]{1,0}, f64[4,60]{1,0}, s64[4,60]{1,0})", + "(f64[4,720]{1,0}, f64[4,720]{1,0}, s64[4,720]{1,0})", + "(f64[4,60]{1,0}, f64[4,60]{1,0}, s64[4,60]{1,0})", + "(f64[4,720]{1,0}, f64[4,720]{1,0}, s64[4,720]{1,0})", + "(f64[4,60]{1,0}, f64[4,60]{1,0}, s64[4,60]{1,0})", + "(f64[4,720]{1,0}, f64[4,720]{1,0}, s64[4,720]{1,0})", + "(f64[4,60]{1,0}, f64[4,60]{1,0}, s64[4,60]{1,0})", + "(f64[4,720]{1,0}, f64[4,720]{1,0}, s64[4,720]{1,0})", + "(f64[4,60]{1,0}, f64[4,60]{1,0}, s64[4,60]{1,0})", + "(f64[4,720]{1,0}, f64[4,720]{1,0}, s64[4,720]{1,0})", + "(f64[4,60]{1,0}, f64[4,60]{1,0}, s64[4,60]{1,0})", + "(f64[4,720]{1,0}, f64[4,720]{1,0}, s64[4,720]{1,0})" + ], + "hlo_sha256": "b7fb2eb6e27f35f3", + "hlo_lines": 26996 + } + }, + "instances_compared": [ + [ + 0, + 1, + 2, + 3 + ], + [ + 4, + 5, + 6, + 7 + ], + [ + 8, + 9, + 10, + 11 + ], + [ + 12, + 13, + 14, + 15 + ] + ], + "values": { + "control": [ + [ + 7.743201200876812, + 4.901199826003542, + 8.551453428732437, + 7.640170398958149 + ], + [ + 7.2580956747803445, + 9.29357838657636, + 3.0338796505151917, + 8.714615086385912 + ], + [ + 4.735173159474494, + 3.2233889243165805, + 9.296501815740573, + 6.7486158154711955 + ], + [ + -1.4028143150641306, + 0.5885274382499945, + 6.162997261446639, + -10.49915087893337 + ] + ], + "nodedup": [ + [ + 7.743201200876812, + 4.901199826003542, + 8.551453428732437, + 7.640170398958149 + ], + [ + 7.2580956747803445, + 9.29357838657636, + 3.0338796505151917, + 8.714615086385912 + ], + [ + 4.735173159474494, + 3.2233889243165805, + 9.296501815740573, + 6.7486158154711955 + ], + [ + -1.4028143150641306, + 0.5885274382499945, + 6.162997261446639, + -10.49915087893337 + ] + ], + "library": [ + [ + 7.743201200876812, + 4.901199826003542, + 8.551453428732437, + 7.640170398958149 + ], + [ + 7.2580956747803445, + 9.29357838657636, + 3.0338796505151917, + 8.714615086385912 + ], + [ + 4.735173159474494, + 3.2233889243165805, + 9.296501815740573, + 6.7486158154711955 + ], + [ + -1.4028143150641306, + 0.5885274382499945, + 6.162997261446639, + -10.49915087893337 + ] + ] + }, + "deterministic_within_route": { + "control": true, + "nodedup": true, + "library": true + }, + "likelihood_gate": { + "control_vs_nodedup": { + "bit_identical": true, + "max_abs_delta": 0.0, + "max_rel_delta": 0.0, + "nan_pattern_equal": true + }, + "control_vs_library": { + "bit_identical": true, + "max_abs_delta": 0.0, + "max_rel_delta": 0.0, + "nan_pattern_equal": true + }, + "nodedup_vs_library": { + "bit_identical": true, + "max_abs_delta": 0.0, + "max_rel_delta": 0.0, + "nan_pattern_equal": true + } + } + }, + "simple_plain": { + "label": "simple_plain", + "batch": null, + "n_rounds": 20, + "n_calls_per_round": 5, + "n_warm": 3, + "route_order": "round-robin, start rotated each round", + "per_call_ms": { + "control": [ + 23.713991045951843, + 23.581678979098797, + 22.933808038942516, + 23.557719076052308, + 23.634618963114917, + 23.8114430103451, + 23.31034408416599, + 23.679282050579786, + 23.804851924069226, + 24.030817905440927, + 23.97769596427679, + 23.66933098528534, + 23.845942923799157, + 23.963685031048954, + 24.20513890683651, + 23.22091395035386, + 23.579969070851803, + 24.24373896792531, + 23.754733032546937, + 23.831344093196094, + 22.690413985401392, + 23.657490964978933, + 23.747162078507245, + 24.030975997447968, + 23.410515976138413, + 23.8391530001536, + 24.095937958918512, + 23.72860093601048, + 22.994207916781306, + 23.301393957808614, + 23.078070022165775, + 23.025640984997153, + 23.484047036617994, + 23.82246300112456, + 23.97007599938661, + 23.65525101777166, + 24.18142999522388, + 23.64838996436447, + 23.481406969949603, + 23.452396038919687, + 23.639800027012825, + 23.467647028155625, + 23.644311004318297, + 23.78142299130559, + 24.534575059078634, + 23.890924989245832, + 24.35762109234929, + 23.954625008627772, + 23.696210933849216, + 23.50953803397715, + 24.140468914993107, + 23.649870068766177, + 24.325092090293765, + 24.328252067789435, + 24.107348057441413, + 23.400535923428833, + 23.706272011622787, + 24.173887912184, + 23.496618028730154, + 24.016145966015756, + 23.347895010374486, + 23.881754954345524, + 23.980385973118246, + 23.29836494755, + 23.882264038547873, + 23.14744098111987, + 24.41836299840361, + 24.044367019087076, + 24.23192106653005, + 23.43546599149704, + 23.495448986068368, + 22.582702920772135, + 23.711142013780773, + 24.211689014919102, + 23.91249395441264, + 23.501247982494533, + 23.787882993929088, + 23.855342995375395, + 23.257813998498023, + 23.979595978744328, + 23.18600204307586, + 23.552249069325626, + 23.849664023146033, + 23.476017988286912, + 23.83336308412254, + 24.061657954007387, + 23.960154969245195, + 23.924755048938096, + 23.89629394747317, + 24.101499002426863, + 23.459638003259897, + 23.330235038883984, + 24.190608994103968, + 23.27716490253806, + 23.7618419341743, + 23.494198103435338, + 24.482654058374465, + 24.20134993735701, + 23.837854037992656, + 24.421924026682973 + ], + "nodedup": [ + 5.650362931191921, + 5.2637269254773855, + 4.99749300070107, + 6.4044559840112925, + 6.02319894824177, + 5.381238996051252, + 4.727527964860201, + 5.67751401104033, + 5.637482041493058, + 6.25743402633816, + 5.830507026985288, + 4.861669964157045, + 6.372345029376447, + 6.265482981689274, + 6.156002054922283, + 4.4940439984202385, + 5.136614898219705, + 5.968227982521057, + 5.53574098739773, + 5.426018964499235, + 4.72811795771122, + 5.130605073645711, + 5.243247025646269, + 6.249033031053841, + 5.636923015117645, + 4.910731106065214, + 6.250154925510287, + 4.7844190848991275, + 5.085314041934907, + 5.346879013814032, + 5.154485930688679, + 5.791735020466149, + 5.459080100990832, + 5.147734074853361, + 6.138821016065776, + 4.952771007083356, + 6.196312955580652, + 5.685903946869075, + 5.782076972536743, + 5.386439035646617, + 5.062244017608464, + 5.717133986763656, + 5.175506114028394, + 5.6068929843604565, + 5.600781994871795, + 5.13497507199645, + 4.632557043805718, + 5.336707923561335, + 5.170325981453061, + 5.404717987403274, + 4.953001975081861, + 5.196787067689002, + 5.302416044287384, + 5.186705035157502, + 6.031509023159742, + 5.094713997095823, + 5.511531024239957, + 5.148626049049199, + 4.849541001021862, + 4.922681022435427, + 6.319543928839266, + 4.799540038220584, + 5.257767043076456, + 6.234423024579883, + 6.194212008267641, + 5.3327190689742565, + 6.084720022045076, + 6.293594022281468, + 5.396860069595277, + 5.0876319874078035, + 5.002493038773537, + 5.557432072237134, + 5.356129026040435, + 6.251732935197651, + 5.347378901205957, + 5.145073984749615, + 5.213687079958618, + 6.584619055502117, + 5.429081036709249, + 5.5953520350158215, + 6.016519037075341, + 5.644863937050104, + 5.28257607948035, + 5.392039893195033, + 5.402939976193011, + 5.592423025518656, + 6.25609396956861, + 5.163704976439476, + 4.763048957102001, + 5.113633931614459, + 5.381298018619418, + 6.277184002101421, + 5.135983927175403, + 4.721957957372069, + 6.2122829258441925, + 5.371779086999595, + 6.054428988136351, + 5.8081470197066665, + 5.476210964843631, + 5.733844009228051 + ], + "library": [ + 22.912129061296582, + 24.50334292370826, + 23.859442910179496, + 23.740751086734235, + 23.922145017422736, + 23.67204998154193, + 23.670141003094614, + 23.86528509669006, + 24.238960002548993, + 23.005789960734546, + 24.006425985135138, + 23.00955995451659, + 23.162893019616604, + 24.085868033580482, + 23.938714992254972, + 23.817913024686277, + 23.86268402915448, + 24.652058025822043, + 24.084628093987703, + 22.930499049834907, + 22.963729104958475, + 23.756552021950483, + 23.930795025080442, + 23.543018964119256, + 23.59433996025473, + 23.73980195261538, + 23.69920106139034, + 24.243319989182055, + 23.646259913221, + 24.29260197095573, + 23.94114399794489, + 23.37789593730122, + 23.62740004900843, + 23.455927963368595, + 23.615519981831312, + 23.664460983127356, + 24.163828929886222, + 24.12971807643771, + 23.520868038758636, + 23.54366797953844, + 23.46309705171734, + 24.178429041057825, + 23.413397022522986, + 23.91467394772917, + 23.58355897013098, + 23.42917793430388, + 23.403216036967933, + 24.151407997123897, + 24.187209899537265, + 23.34375400096178, + 22.933009080588818, + 24.07039701938629, + 24.050015956163406, + 23.502938100136817, + 22.931838990189135, + 24.0365460049361, + 24.149429984390736, + 23.51347799412906, + 23.4083270188421, + 24.172818986698985, + 22.87755801808089, + 24.286129977554083, + 24.36174196191132, + 23.30357499886304, + 24.53182393219322, + 23.80180300679058, + 24.077258072793484, + 23.683240986429155, + 23.565949057228863, + 23.654200020246208, + 23.88217393308878, + 22.86984701640904, + 23.275665007531643, + 23.571768077090383, + 23.21524196304381, + 23.120532045140862, + 23.935195058584213, + 23.86642398778349, + 24.026905070059, + 23.821312002837658, + 22.8308659279719, + 23.532667895779014, + 23.936265031807125, + 24.05299700330943, + 24.201270076446235, + 23.62477104179561, + 23.971283924765885, + 24.439204018563032, + 23.46762700472027, + 23.557508015073836, + 23.380386061035097, + 23.417956079356372, + 24.179868982173502, + 24.338162038475275, + 23.887863964773715, + 23.477746988646686, + 23.96491600666195, + 24.063748074695468, + 23.66005105432123, + 23.805904085747898 + ] + }, + "warm_ms": { + "control": [ + 25.066172936931252, + 23.55203893966973, + 24.104858050122857 + ], + "nodedup": [ + 5.151672987267375, + 4.923720960505307, + 5.482819979079068 + ], + "library": [ + 23.289433913305402, + 24.070507963187993, + 23.10471097007394 + ] + }, + "stats": { + "control": { + "n": 100, + "median_ms": 23.75828748336062, + "p10_ms": 23.275229812134057, + "p90_ms": 24.20579391764477, + "min_ms": 22.582702920772135, + "max_ms": 24.534575059078634, + "mean_ms": 23.73729949002154 + }, + "nodedup": { + "n": 100, + "median_ms": 5.394449981395155, + "p10_ms": 4.905824991874397, + "p90_ms": 6.250312726479024, + "min_ms": 4.4940439984202385, + "max_ms": 6.584619055502117, + "mean_ms": 5.494521794607863 + }, + "library": { + "n": 100, + "median_ms": 23.740276519674808, + "p10_ms": 23.109434836078435, + "p90_ms": 24.20503906905651, + "min_ms": 22.8308659279719, + "max_ms": 24.652058025822043, + "mean_ms": 23.72747461660765 + } + }, + "ratio_control_over_nodedup": { + "ratio": 4.404209431044917, + "ci90_low": 4.300452633903725, + "ci90_high": 4.451552413159513, + "bootstrap_samples": 2000 + }, + "ratio_library_over_nodedup": { + "ratio": 4.400870635848386, + "ci90_low": 4.303613896516856, + "ci90_high": 4.451532238753158, + "bootstrap_samples": 2000 + }, + "ratio_control_over_library": { + "ratio": 1.000758666971334, + "ci90_low": 0.9944628975043939, + "ci90_high": 1.0063231550005387, + "bootstrap_samples": 2000 + }, + "paired_round_ratio_control_over_nodedup": { + "median": 4.368703023644603, + "p10": 4.13248675177974, + "p90": 4.646052387268373 + }, + "minimum_detectable_improvement": 0.03916797901205811, + "compile": { + "control": { + "lower_s": 2.2088697450235486, + "compile_s": 3.6078590539982542, + "first_call_s": 0.023993946029804647, + "trace_calls": 32, + "flops": 15581930.0, + "hlo_sort_count": 15, + "stablehlo_sort_count": 3, + "hlo_sort_shapes": [ + "(f64[69849]{0}, f64[69849]{0}, s64[69849]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})" + ], + "hlo_sha256": "4d9d5d3e4e0d6aae", + "hlo_lines": 25706 + }, + "nodedup": { + "lower_s": 1.9852205039933324, + "compile_s": 2.836882979958318, + "first_call_s": 0.0056221820414066315, + "trace_calls": 32, + "flops": 7052562.0, + "hlo_sort_count": 7, + "stablehlo_sort_count": 1, + "hlo_sort_shapes": [ + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})" + ], + "hlo_sha256": "cfe8b12c42597040", + "hlo_lines": 21527 + }, + "library": { + "lower_s": 2.1434380459832028, + "compile_s": 0.41885570297017694, + "first_call_s": 0.02418478997424245, + "trace_calls": 32, + "flops": 15581930.0, + "hlo_sort_count": 15, + "stablehlo_sort_count": 3, + "hlo_sort_shapes": [ + "(f64[69849]{0}, f64[69849]{0}, s64[69849]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})" + ], + "hlo_sha256": "d8260713c96ca09c", + "hlo_lines": 23982 + } + }, + "instances_compared": [ + [ + 0 + ], + [ + 1 + ], + [ + 2 + ], + [ + 3 + ], + [ + 4 + ], + [ + 5 + ], + [ + 6 + ], + [ + 7 + ], + [ + 8 + ], + [ + 9 + ], + [ + 10 + ], + [ + 11 + ], + [ + 12 + ], + [ + 13 + ], + [ + 14 + ], + [ + 15 + ] + ], + "values": { + "control": [ + 7.196577317761015, + -45.87302127443001, + 2.904871458739854, + -801.1656151465147, + -856.2176369539866, + -701.3832757596593, + -791.8603301084569, + -641.0597186366746, + -856.874766532385, + -965.6893581059344, + -601.8962692526686, + 1.491228024977211, + -664.1239657398182, + -4.055811166945713, + -6.531970036750838, + -970.3067931813664 + ], + "nodedup": [ + 7.196577317761015, + -45.87302127443001, + 2.904871458739854, + -801.1656151465147, + -856.2176369539866, + -701.3832757596593, + -791.8603301084569, + -641.0597186366746, + -856.874766532385, + -965.6893581059344, + -601.8962692526686, + 1.491228024977211, + -664.1239657398182, + -4.055811166945713, + -6.531970036750838, + -970.3067931813664 + ], + "library": [ + 7.196577317761015, + -45.87302127443001, + 2.904871458739854, + -801.1656151465147, + -856.2176369539866, + -701.3832757596593, + -791.8603301084569, + -641.0597186366746, + -856.874766532385, + -965.6893581059344, + -601.8962692526686, + 1.491228024977211, + -664.1239657398182, + -4.055811166945713, + -6.531970036750838, + -970.3067931813664 + ] + }, + "deterministic_within_route": { + "control": true, + "nodedup": true, + "library": true + }, + "likelihood_gate": { + "control_vs_nodedup": { + "bit_identical": true, + "max_abs_delta": 0.0, + "max_rel_delta": 0.0, + "nan_pattern_equal": true + }, + "control_vs_library": { + "bit_identical": true, + "max_abs_delta": 0.0, + "max_rel_delta": 0.0, + "nan_pattern_equal": true + }, + "nodedup_vs_library": { + "bit_identical": true, + "max_abs_delta": 0.0, + "max_rel_delta": 0.0, + "nan_pattern_equal": true + } + }, + "fiducial_log_likelihood": { + "control": 7.196577317761015, + "nodedup": 7.196577317761015, + "library": 7.196577317761015 + } + }, + "cluster_solved": { + "label": "cluster_solved", + "batch": null, + "n_rounds": 20, + "n_calls_per_round": 5, + "n_warm": 3, + "route_order": "round-robin, start rotated each round", + "per_call_ms": { + "control": [ + 152.63693896122277, + 152.97853399533778, + 152.52143796533346, + 135.6514790095389, + 155.10210895445198, + 162.6331739826128, + 142.19054696150124, + 153.04724697489291, + 153.33789098076522, + 162.67960495315492, + 143.08760198764503, + 159.36305897776037, + 161.8538120528683, + 155.29831300955266, + 149.9844460049644, + 155.90160305146128, + 151.81348600890487, + 159.74708704743534, + 166.67501104529947, + 158.7866609916091, + 156.04361495934427, + 156.26180998515338, + 161.00630606524646, + 162.31267899274826, + 155.14581103343517, + 142.10122602526098, + 144.1339870216325, + 159.8942489363253, + 149.52625799924135, + 145.73522505816072, + 141.04326791130006, + 153.11066701542586, + 157.88080694619566, + 153.84627901948988, + 144.1292780218646, + 156.58084501046687, + 156.0365150216967, + 164.30956101976335, + 151.81862493045628, + 160.42832704260945, + 155.1077989861369, + 141.30888297222555, + 157.64387208037078, + 154.59722105879337, + 159.71770696341991, + 162.64410503208637, + 155.3240839857608, + 144.6844070451334, + 156.07994608581066, + 151.58025093842298, + 156.61977499257773, + 156.22469899244606, + 151.75980399362743, + 168.45922102220356, + 152.1288399817422, + 159.23411899711937, + 143.3676560409367, + 157.2235650382936, + 151.43941005226225, + 152.54726796410978, + 140.86539507843554, + 161.1897200345993, + 158.94839307293296, + 150.85646009538323, + 142.67717394977808, + 159.1877369210124, + 131.39749795664102, + 142.3690700903535, + 153.6242550937459, + 157.63303101994097, + 159.35130999423563, + 159.3434310052544, + 160.69624305237085, + 155.5484370328486, + 163.27739402186126, + 158.16587093286216, + 148.6874440452084, + 142.92310096789151, + 160.4551769560203, + 159.36505002900958, + 156.96502092760056, + 153.2985189696774, + 139.48320201598108, + 166.94290493614972, + 161.30356292705983, + 161.05960810091347, + 144.39474407117814, + 140.23252401966602, + 151.73061401583254, + 143.45434692222625, + 132.16753106098622, + 159.3274399638176, + 163.1195719819516, + 158.53872697334737, + 138.75539996661246, + 151.67039295192808, + 162.8238969715312, + 148.5360509250313, + 156.9061999907717, + 145.2865870669484 + ], + "nodedup": [ + 86.42536692786962, + 82.37085898872465, + 82.52874203026295, + 79.1106759570539, + 74.88966605160385, + 63.81135305855423, + 61.863420996814966, + 86.40845597255975, + 79.49813106097281, + 90.05862602498382, + 68.11371399089694, + 74.95000690687448, + 78.22849100921303, + 77.77397299651057, + 82.56516291294247, + 90.71755805052817, + 76.4263819437474, + 86.07037900947034, + 82.35757797956467, + 67.26283894386142, + 71.94916694425046, + 84.09677899908274, + 67.87143007386476, + 76.81702799163759, + 94.85033596865833, + 82.90812803898007, + 78.29956302884966, + 86.4002660382539, + 78.33956298418343, + 91.7971960734576, + 82.97158894129097, + 81.05250797234476, + 92.21225196961313, + 74.45150893181562, + 69.26585303153843, + 88.24467600788921, + 76.4506219420582, + 82.53535197582096, + 82.341299043037, + 81.06406801380217, + 83.34904594812542, + 66.36334606446326, + 64.62278601247817, + 74.8613360337913, + 69.47906699497253, + 82.78822689317167, + 81.13417797721922, + 83.01770896650851, + 86.40336501412094, + 79.42036096937954, + 79.52230202499777, + 76.59390394110233, + 70.42528293095529, + 81.66630705818534, + 78.65423802286386, + 68.97081807255745, + 81.73927897587419, + 67.50176392961293, + 67.5908459816128, + 76.68992702383548, + 65.79990591853857, + 79.15093493647873, + 86.84021304361522, + 65.73383591603488, + 71.82882493361831, + 92.1198190189898, + 69.03514894656837, + 60.20038400311023, + 76.7405170481652, + 80.78470302280039, + 76.6303640557453, + 82.84460799768567, + 76.66126592084765, + 84.2112599639222, + 80.76119306497276, + 87.77809794992208, + 71.7825359897688, + 76.45250204950571, + 65.99024904426187, + 68.67383397184312, + 82.08305493462831, + 88.25629705097526, + 62.08001496270299, + 91.44321002531797, + 79.69344593584538, + 66.55489897821099, + 77.50013889744878, + 80.6658819783479, + 58.104768046177924, + 91.57992189284414, + 64.58984490018338, + 60.35927589982748, + 82.964519970119, + 66.33958499878645, + 77.17106398195028, + 84.22435901593417, + 69.60862805135548, + 64.18442993890494, + 70.32559090293944, + 69.46080701891333 + ], + "library": [ + 159.8457780200988, + 153.99269096087664, + 148.31811701878905, + 160.1679129526019, + 141.9486430240795, + 139.63528396561742, + 142.44394202250987, + 161.40587499830872, + 134.40725801046938, + 154.78771505877376, + 162.37152996473014, + 154.409208917059, + 143.5851800488308, + 148.58856203500181, + 154.7372629866004, + 149.60081805475056, + 160.68272199481726, + 136.7454460123554, + 154.82229506596923, + 154.2462259531021, + 143.1022509932518, + 152.08763105329126, + 154.5231599593535, + 162.08426596131176, + 149.12917197216302, + 151.04234300088137, + 139.5560329547152, + 142.80194707680494, + 154.988627997227, + 160.14220390934497, + 160.69801209960133, + 153.93827005755156, + 140.52890904713422, + 166.8712650425732, + 155.0575690343976, + 151.6351120080799, + 141.99135405942798, + 159.1382269980386, + 143.97174504119903, + 154.90583598148078, + 159.97883898671716, + 152.59477798826993, + 154.55927001312375, + 158.89555297326297, + 159.32454902213067, + 156.6120849456638, + 162.52617200370878, + 141.36860403232276, + 154.87875591497868, + 150.28275991789997, + 157.51107991673052, + 163.71327207889408, + 153.99265196174383, + 161.20751097332686, + 156.06863610446453, + 152.94022404123098, + 143.17928301170468, + 160.41666804812849, + 159.37120094895363, + 146.29364490974694, + 137.6961530186236, + 158.89534202869982, + 155.034358962439, + 164.80707901064306, + 151.74097393173724, + 164.03541702311486, + 161.1705799587071, + 161.96466295514256, + 160.58404091745615, + 142.32427801471204, + 139.82489693444222, + 143.05749093182385, + 160.13477393426, + 158.94770296290517, + 143.65712995640934, + 161.66494810022414, + 153.16832705866545, + 162.277337978594, + 154.8998369835317, + 159.58125400356948, + 151.64755296427757, + 154.48045008815825, + 142.8331780480221, + 159.4756820704788, + 138.4429739555344, + 153.59587501734495, + 142.9382589412853, + 142.67272502183914, + 144.0259061055258, + 169.22689299099147, + 156.34959004819393, + 152.79998094774783, + 160.7944630086422, + 158.20583107415587, + 152.763950987719, + 159.63755501434207, + 130.5520039750263, + 150.38377197925, + 154.2847149539739, + 162.84995793830603 + ] + }, + "warm_ms": { + "control": [ + 145.39671002421528, + 152.15986198745668, + 157.50575996935368 + ], + "nodedup": [ + 86.42376598436385, + 84.39529302995652, + 64.70870808698237 + ], + "library": [ + 152.31426409445703, + 158.69234898127615, + 156.0823949985206 + ] + }, + "stats": { + "control": { + "n": 100, + "median_ms": 155.2220620214939, + "p10_ms": 142.18161486787722, + "p90_ms": 162.3447284917347, + "min_ms": 131.39749795664102, + "max_ms": 168.45922102220356, + "mean_ms": 153.46887049265206 + }, + "nodedup": { + "n": 100, + "median_ms": 78.31956300651655, + "p10_ms": 65.7932989182882, + "p90_ms": 87.8247557557188, + "min_ms": 58.104768046177924, + "max_ms": 94.85033596865833, + "mean_ms": 77.23354587797076 + }, + "library": { + "n": 100, + "median_ms": 154.50180502375588, + "p10_ms": 141.89063912490383, + "p90_ms": 161.97662325575948, + "min_ms": 130.5520039750263, + "max_ms": 169.22689299099147, + "mean_ms": 152.9407983890269 + } + }, + "ratio_control_over_nodedup": { + "ratio": 1.9819066407275374, + "ci90_low": 1.928025198745462, + "ci90_high": 2.0291234546320416, + "bootstrap_samples": 2000 + }, + "ratio_library_over_nodedup": { + "ratio": 1.9727102538978751, + "ci90_low": 1.925502467564942, + "ci90_high": 2.016305233312894, + "bootstrap_samples": 2000 + }, + "ratio_control_over_library": { + "ratio": 1.0046618031266838, + "ci90_low": 0.9909057354950679, + "ci90_high": 1.0147285672455728, + "bootstrap_samples": 2000 + }, + "paired_round_ratio_control_over_nodedup": { + "median": 1.9796691653123935, + "p10": 1.8621437210486749, + "p90": 2.2138327751794513 + }, + "minimum_detectable_improvement": 0.12989850386773932, + "compile": { + "control": { + "lower_s": 43.08372342400253, + "compile_s": 31.446726183989085, + "first_call_s": 0.1433088940102607, + "trace_calls": 168, + "flops": 184158336.0, + "hlo_sort_count": 25, + "stablehlo_sort_count": 3, + "hlo_sort_shapes": [ + "(f64[276507]{0}, f64[276507]{0}, s64[276507]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})" + ], + "hlo_sha256": "713848ef79ffa9a5", + "hlo_lines": 70897 + }, + "nodedup": { + "lower_s": 41.99813494598493, + "compile_s": 27.893285555997863, + "first_call_s": 0.07715024310164154, + "trace_calls": 168, + "flops": 139442208.0, + "hlo_sort_count": 12, + "stablehlo_sort_count": 1, + "hlo_sort_shapes": [ + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})" + ], + "hlo_sha256": "487480f9cc0f6af1", + "hlo_lines": 62911 + }, + "library": { + "lower_s": 43.47017756092828, + "compile_s": 1.8934005189221352, + "first_call_s": 0.15951365302316844, + "trace_calls": 168, + "flops": 184158336.0, + "hlo_sort_count": 25, + "stablehlo_sort_count": 3, + "hlo_sort_shapes": [ + "(f64[276507]{0}, f64[276507]{0}, s64[276507]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})" + ], + "hlo_sha256": "7cb500385e28dd14", + "hlo_lines": 61894 + } + }, + "instances_compared": [ + [ + 0 + ], + [ + 1 + ], + [ + 2 + ], + [ + 3 + ], + [ + 4 + ], + [ + 5 + ], + [ + 6 + ], + [ + 7 + ], + [ + 8 + ], + [ + 9 + ], + [ + 10 + ], + [ + 11 + ], + [ + 12 + ], + [ + 13 + ], + [ + 14 + ], + [ + 15 + ] + ], + "values": { + "control": [ + 25.56012716672745, + 21.572496958393117, + 21.458564666727817, + 13.597236541730304, + 15.306220916729094, + 10.29320008339773, + 19.977444875061735, + 21.80036154172802, + 10.748929250057948, + 9.60960633339704, + 5.166246958396465, + 14.05296570839195, + 4.710517791725226, + 6.647366750058172, + 17.926663625058694, + 16.331611541724385 + ], + "nodedup": [ + 25.56012716672745, + 21.572496958393117, + 21.458564666727817, + 13.597236541730304, + 15.306220916729094, + 10.29320008339773, + 19.977444875061735, + 21.80036154172802, + 10.748929250057948, + 9.60960633339704, + 5.166246958396465, + 14.05296570839195, + 4.710517791725226, + 6.647366750058172, + 17.926663625058694, + 16.331611541724385 + ], + "library": [ + 25.56012716672745, + 21.572496958393117, + 21.458564666727817, + 13.597236541730304, + 15.306220916729094, + 10.29320008339773, + 19.977444875061735, + 21.80036154172802, + 10.748929250057948, + 9.60960633339704, + 5.166246958396465, + 14.05296570839195, + 4.710517791725226, + 6.647366750058172, + 17.926663625058694, + 16.331611541724385 + ] + }, + "deterministic_within_route": { + "control": true, + "nodedup": true, + "library": true + }, + "likelihood_gate": { + "control_vs_nodedup": { + "bit_identical": true, + "max_abs_delta": 0.0, + "max_rel_delta": 0.0, + "nan_pattern_equal": true + }, + "control_vs_library": { + "bit_identical": true, + "max_abs_delta": 0.0, + "max_rel_delta": 0.0, + "nan_pattern_equal": true + }, + "nodedup_vs_library": { + "bit_identical": true, + "max_abs_delta": 0.0, + "max_rel_delta": 0.0, + "nan_pattern_equal": true + } + }, + "fiducial_log_likelihood": { + "control": 25.56012716672745, + "nodedup": 25.56012716672745, + "library": 25.56012716672745 + } + }, + "cluster_plain": { + "label": "cluster_plain", + "batch": null, + "n_rounds": 20, + "n_calls_per_round": 5, + "n_warm": 3, + "route_order": "round-robin, start rotated each round", + "per_call_ms": { + "control": [ + 148.70946400333196, + 149.79611104354262, + 141.5129149099812, + 152.88197295740247, + 144.83792998362333, + 142.0958659145981, + 156.3809310318902, + 159.12808699067682, + 156.89756895881146, + 161.83472098782659, + 154.6212729299441, + 169.7419520933181, + 143.20531289558858, + 138.6393179418519, + 154.33577704243362, + 160.84934398531914, + 163.92052604351193, + 160.64434102736413, + 150.73228802066296, + 160.10179300792515, + 158.67871802765876, + 150.99675301462412, + 154.2905269889161, + 157.96382806729525, + 152.1002899389714, + 156.55530407093465, + 149.30747298058122, + 162.53523190971464, + 137.80889404006302, + 150.1813989598304, + 157.22449298482388, + 144.6756870718673, + 153.9811909897253, + 144.65718704741448, + 143.22653401177377, + 137.63807201758027, + 159.39384198281914, + 159.93083000648767, + 162.98902896232903, + 149.8392130015418, + 150.85828898008913, + 156.3127599656582, + 150.71177703794092, + 160.0851130206138, + 163.67324197199196, + 161.55653703026474, + 141.88247197307646, + 159.04681396204978, + 154.12198496051133, + 148.07936397846788, + 138.16658093128353, + 158.3609830122441, + 147.46994501911104, + 160.2334959898144, + 147.11030793841928, + 159.53924297355115, + 143.92870501615107, + 168.45664905849844, + 152.29411190375686, + 162.54777205176651, + 161.7180600296706, + 160.4632589733228, + 160.05699196830392, + 161.39509296044707, + 153.72257702983916, + 145.12270595878363, + 145.3224279684946, + 164.45471404585987, + 143.2730039814487, + 158.50103506818414, + 159.56779289990664, + 169.93465507403016, + 140.88620501570404, + 158.61763805150986, + 141.20595098938793, + 158.24292006436735, + 161.68733895756304, + 157.30204596184194, + 160.94919492024928, + 141.3517720066011, + 154.00896198116243, + 153.2982389908284, + 145.17070597503334, + 150.82260000053793, + 139.58842400461435, + 153.2341680722311, + 140.59607102535665, + 154.08184402622283, + 161.34941298514605, + 147.98715198412538, + 141.5523060131818, + 150.16552805900574, + 148.8306859973818, + 143.0973409442231, + 148.788935970515, + 151.45906002726406, + 161.41071391757578, + 146.88628492876887, + 153.1434979988262, + 161.88890195917338 + ], + "nodedup": [ + 86.14640298765153, + 80.75145201291889, + 88.90352700836957, + 71.62418204825372, + 80.91542508918792, + 79.94684891309589, + 81.0347570804879, + 87.40223303902894, + 71.70944300014526, + 76.15748792886734, + 73.63698608241975, + 65.21643698215485, + 78.16097990144044, + 86.68682107236236, + 79.28013894706964, + 75.29556297231466, + 70.98165201023221, + 74.0304400678724, + 77.9628159943968, + 66.62139890249819, + 69.96247405186296, + 61.96297297719866, + 86.67601097840816, + 80.36079606972635, + 77.84207502845675, + 93.58979493845254, + 87.05643599387258, + 62.19729606527835, + 65.87238796055317, + 69.44262597244233, + 84.01894604321569, + 75.57429699227214, + 67.00957508292049, + 60.44910801574588, + 77.16935395728797, + 81.10120799392462, + 89.40530603285879, + 69.86566295381635, + 70.61589497607201, + 75.79440099652857, + 70.3877710038796, + 64.29927097633481, + 77.640839968808, + 81.86020189896226, + 77.19898305367678, + 77.77390303090215, + 79.33711900841445, + 86.72863990068436, + 79.48165200650692, + 76.73948595765978, + 75.25887305382639, + 89.21541296876967, + 77.57277996279299, + 78.16653896588832, + 79.7180050285533, + 90.74938693083823, + 92.87463291548193, + 62.45861994102597, + 87.12033706251532, + 75.77635999768972, + 70.48076298087835, + 85.3712490061298, + 68.5524910222739, + 81.20245102327317, + 69.18838294222951, + 78.08934897184372, + 95.79135105013847, + 71.08879403676838, + 77.51271000597626, + 81.89701195806265, + 81.96704392321408, + 88.75439502298832, + 90.05283599253744, + 83.23816407937557, + 82.8987379791215, + 82.813706016168, + 75.86014096159488, + 84.7984200809151, + 68.12438392080367, + 63.81927395705134, + 66.14623207133263, + 71.1548050167039, + 77.20561500173062, + 77.96111702919006, + 84.69120808877051, + 68.14437499269843, + 76.7525970004499, + 88.10387400444597, + 62.74222594220191, + 93.39069097768515, + 82.07161503378302, + 85.20103606861085, + 73.22211901191622, + 79.16212605778128, + 79.9800610402599, + 76.01238403003663, + 75.7603500969708, + 67.22805893514305, + 66.95787608623505, + 62.09359492640942 + ], + "library": [ + 154.38408905174583, + 161.01150610484183, + 148.06567400228232, + 150.75317898299545, + 144.26708000246435, + 140.7278230180964, + 163.7792430119589, + 155.09738097898662, + 141.49863505735993, + 152.23749296274036, + 160.32643499784172, + 152.1399199264124, + 143.4420879231766, + 141.56307594384998, + 143.69320205878466, + 149.61581001989543, + 163.77579292748123, + 145.4774709418416, + 155.27295297943056, + 161.2109310226515, + 157.88573597092181, + 141.89512189477682, + 150.33917198888958, + 141.51844708248973, + 156.0851950198412, + 152.335764025338, + 141.23888197354972, + 148.44414009712636, + 151.77449502516538, + 137.50028901267797, + 157.7893029898405, + 159.81279697734863, + 142.82050810288638, + 155.46970604918897, + 144.6388369658962, + 160.1318729808554, + 156.5657650353387, + 158.79846003372222, + 151.65004204027355, + 155.41701496113092, + 161.96767194196582, + 136.21137791778892, + 150.66886704880744, + 152.06307009793818, + 157.9792370321229, + 149.91673303302377, + 152.94564398936927, + 158.67798798717558, + 149.60089907981455, + 150.8275599917397, + 154.35390698257834, + 162.0927850017324, + 156.45806200336665, + 153.80208904389292, + 152.73467102088034, + 158.59802800696343, + 171.7751360265538, + 158.65204797592014, + 144.39984399359673, + 142.3665899783373, + 155.96667304635048, + 144.68957798089832, + 153.93856004811823, + 139.77476803120226, + 164.24362000543624, + 158.7188889971003, + 144.0740879625082, + 160.35320598166436, + 143.9191160025075, + 142.03652495052665, + 149.94523499626666, + 155.2464630221948, + 163.40310603845865, + 159.64744507800788, + 155.26329295244068, + 159.39480205997825, + 149.72816000226885, + 142.45488995220512, + 140.99184598308057, + 155.6305979611352, + 153.0203060247004, + 157.8261140966788, + 144.36115301214159, + 147.0849079778418, + 148.7222439609468, + 140.6269109575078, + 145.9777490235865, + 158.2882219227031, + 159.78662704583257, + 150.98407305777073, + 152.45471603702754, + 146.8710529152304, + 143.01336091011763, + 159.9486309569329, + 157.03653101809323, + 151.03817195631564, + 155.23118199780583, + 156.5020140260458, + 159.35912006534636, + 142.0472749741748 + ] + }, + "warm_ms": { + "control": [ + 139.59900510963053, + 159.4405520008877, + 161.47257399279624 + ], + "nodedup": [ + 68.64852306898683, + 78.1301490496844, + 74.09175403881818 + ], + "library": [ + 158.94460398703814, + 169.37986493576318, + 141.46384503692389 + ] + }, + "stats": { + "control": { + "n": 100, + "median_ms": 153.85188400978222, + "p10_ms": 141.54836690286174, + "p90_ms": 161.84013908496127, + "min_ms": 137.63807201758027, + "max_ms": 169.93465507403016, + "mean_ms": 153.10414351406507 + }, + "nodedup": { + "n": 100, + "median_ms": 77.70737149985507, + "p10_ms": 66.11884766025469, + "p90_ms": 88.1689261063002, + "min_ms": 60.44910801574588, + "max_ms": 95.79135105013847, + "mean_ms": 77.34274045098573 + }, + "library": { + "n": 100, + "median_ms": 152.39524003118277, + "p10_ms": 141.86191729968414, + "p90_ms": 160.32911209622398, + "min_ms": 136.21137791778892, + "max_ms": 171.7751360265538, + "mean_ms": 151.96144761284813 + } + }, + "ratio_control_over_nodedup": { + "ratio": 1.9798878927473331, + "ci90_low": 1.9372324583874687, + "ci90_high": 2.0243719107770755, + "bootstrap_samples": 2000 + }, + "ratio_library_over_nodedup": { + "ratio": 1.9611426443817752, + "ci90_low": 1.924271789113546, + "ci90_high": 2.0035352847284127, + "bootstrap_samples": 2000 + }, + "ratio_control_over_library": { + "ratio": 1.0095583298946962, + "ci90_low": 0.9884910995136756, + "ci90_high": 1.02633235748283, + "bootstrap_samples": 2000 + }, + "paired_round_ratio_control_over_nodedup": { + "median": 1.9685560269555515, + "p10": 1.8580766513223013, + "p90": 2.1806487463146937 + }, + "minimum_detectable_improvement": 0.13189160674047598, + "compile": { + "control": { + "lower_s": 30.668339118012227, + "compile_s": 23.536340896971524, + "first_call_s": 0.15716142393648624, + "trace_calls": 168, + "flops": 184147008.0, + "hlo_sort_count": 25, + "stablehlo_sort_count": 3, + "hlo_sort_shapes": [ + "(f64[276507]{0}, f64[276507]{0}, s64[276507]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})" + ], + "hlo_sha256": "eaa27d986c7aceb6", + "hlo_lines": 56232 + }, + "nodedup": { + "lower_s": 29.461517288000323, + "compile_s": 20.40689183003269, + "first_call_s": 0.07693507999647409, + "trace_calls": 168, + "flops": 139430656.0, + "hlo_sort_count": 12, + "stablehlo_sort_count": 1, + "hlo_sort_shapes": [ + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})" + ], + "hlo_sha256": "d0e5e2eb90451640", + "hlo_lines": 48246 + }, + "library": { + "lower_s": 30.128890754072927, + "compile_s": 1.442384855938144, + "first_call_s": 0.14289904898032546, + "trace_calls": 168, + "flops": 184147008.0, + "hlo_sort_count": 25, + "stablehlo_sort_count": 3, + "hlo_sort_shapes": [ + "(f64[276507]{0}, f64[276507]{0}, s64[276507]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})" + ], + "hlo_sha256": "93e29f000d9c5c12", + "hlo_lines": 51751 + } + }, + "instances_compared": [ + [ + 0 + ], + [ + 1 + ], + [ + 2 + ], + [ + 3 + ], + [ + 4 + ], + [ + 5 + ], + [ + 6 + ], + [ + 7 + ], + [ + 8 + ], + [ + 9 + ], + [ + 10 + ], + [ + 11 + ], + [ + 12 + ], + [ + 13 + ], + [ + 14 + ], + [ + 15 + ] + ], + "values": { + "control": [ + 23.965075083393216, + -743.7107061665998, + 3.3433302917272147, + -489.755628041605, + -527.9229457499364, + -468.67815408327806, + -247.07984679160097, + -1110.0030238749466, + -779.0297165832758, + -20.354586374939657, + -110.36109679160913, + -691.0739874166073, + -1296.2823207499168, + -205.49456033327564, + -223.83765929159887, + -334.8077113749422 + ], + "nodedup": [ + 23.965075083393216, + -743.7107061665998, + 3.3433302917272147, + -489.755628041605, + -527.9229457499364, + -468.67815408327806, + -247.07984679160097, + -1110.0030238749466, + -779.0297165832758, + -20.354586374939657, + -110.36109679160913, + -691.0739874166073, + -1296.2823207499168, + -205.49456033327564, + -223.83765929159887, + -334.8077113749422 + ], + "library": [ + 23.965075083393216, + -743.7107061665998, + 3.3433302917272147, + -489.755628041605, + -527.9229457499364, + -468.67815408327806, + -247.07984679160097, + -1110.0030238749466, + -779.0297165832758, + -20.354586374939657, + -110.36109679160913, + -691.0739874166073, + -1296.2823207499168, + -205.49456033327564, + -223.83765929159887, + -334.8077113749422 + ] + }, + "deterministic_within_route": { + "control": true, + "nodedup": true, + "library": true + }, + "likelihood_gate": { + "control_vs_nodedup": { + "bit_identical": true, + "max_abs_delta": 0.0, + "max_rel_delta": 0.0, + "nan_pattern_equal": true + }, + "control_vs_library": { + "bit_identical": true, + "max_abs_delta": 0.0, + "max_rel_delta": 0.0, + "nan_pattern_equal": true + }, + "nodedup_vs_library": { + "bit_identical": true, + "max_abs_delta": 0.0, + "max_rel_delta": 0.0, + "nan_pattern_equal": true + } + }, + "fiducial_log_likelihood": { + "control": 23.965075083393216, + "nodedup": 23.965075083393216, + "library": 23.965075083393216 + } + } + }, + "gates": { + "simple_solved_positions": { + "n_instances": 3, + "compile": { + "control": { + "lower_s": 1.5916791890049353, + "compile_s": 2.149253551964648, + "first_call_s": 0.025027383002452552, + "trace_calls": 16, + "flops": 15529212.0, + "hlo_sort_count": 15, + "stablehlo_sort_count": 3, + "hlo_sort_shapes": [ + "(f64[69849]{0}, f64[69849]{0}, s64[69849]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})" + ], + "hlo_sha256": "ab121c90e30d1095", + "hlo_lines": 17480 + }, + "nodedup": { + "lower_s": 1.3651595619739965, + "compile_s": 1.6500326730310917, + "first_call_s": 0.0051490250043570995, + "trace_calls": 16, + "flops": 6999844.0, + "hlo_sort_count": 7, + "stablehlo_sort_count": 1, + "hlo_sort_shapes": [ + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})" + ], + "hlo_sha256": "69e01a146364458e", + "hlo_lines": 13337 + }, + "library": { + "lower_s": 1.5219897700008005, + "compile_s": 0.2506943369517103, + "first_call_s": 0.023677150020375848, + "trace_calls": 16, + "flops": 15529212.0, + "hlo_sort_count": 15, + "stablehlo_sort_count": 3, + "hlo_sort_shapes": [ + "(f64[69849]{0}, f64[69849]{0}, s64[69849]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})" + ], + "hlo_sha256": "8797ee203a35de11", + "hlo_lines": 16053 + } + }, + "positions": { + "control": [ + [ + [ + [ + -1.03515625, + -1.0450941982127835 + ], + [ + Infinity, + Infinity + ], + [ + 0.35546875, + 1.6296613457672795 + ], + [ + 1.24375, + 1.1086929388032032 + ], + [ + 1.6062500000000002, + 0.44293590964391594 + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ] + ] + ], + [ + [ + [ + -1.0289062500000001, + -1.0225414533225639 + ], + [ + Infinity, + Infinity + ], + [ + 0.35, + 1.6138744243441256 + ], + [ + 1.2578125, + 1.0644895588183723 + ], + [ + 1.5890625, + 0.4375232508702632 + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ] + ] + ], + [ + [ + [ + -1.0203125, + -1.0861401939129833 + ], + [ + Infinity, + Infinity + ], + [ + 0.3484375, + 1.6328187300519101 + ], + [ + 1.1398437499999998, + 1.2182992789696712 + ], + [ + 1.609375, + 0.4447401292351336 + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ] + ] + ] + ], + "nodedup": [ + [ + [ + [ + -1.03515625, + -1.0450941982127835 + ], + [ + Infinity, + Infinity + ], + [ + 0.35546875, + 1.6296613457672795 + ], + [ + 1.24375, + 1.1086929388032032 + ], + [ + 1.6062500000000002, + 0.44293590964391594 + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ] + ] + ], + [ + [ + [ + -1.0289062500000001, + -1.0225414533225639 + ], + [ + Infinity, + Infinity + ], + [ + 0.35, + 1.6138744243441256 + ], + [ + 1.2578125, + 1.0644895588183723 + ], + [ + 1.5890625, + 0.4375232508702632 + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ] + ] + ], + [ + [ + [ + -1.0203125, + -1.0861401939129833 + ], + [ + Infinity, + Infinity + ], + [ + 0.3484375, + 1.6328187300519101 + ], + [ + 1.1398437499999998, + 1.2182992789696712 + ], + [ + 1.609375, + 0.4447401292351336 + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ] + ] + ] + ], + "library": [ + [ + [ + [ + -1.03515625, + -1.0450941982127835 + ], + [ + Infinity, + Infinity + ], + [ + 0.35546875, + 1.6296613457672795 + ], + [ + 1.24375, + 1.1086929388032032 + ], + [ + 1.6062500000000002, + 0.44293590964391594 + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ] + ] + ], + [ + [ + [ + -1.0289062500000001, + -1.0225414533225639 + ], + [ + Infinity, + Infinity + ], + [ + 0.35, + 1.6138744243441256 + ], + [ + 1.2578125, + 1.0644895588183723 + ], + [ + 1.5890625, + 0.4375232508702632 + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ] + ] + ], + [ + [ + [ + -1.0203125, + -1.0861401939129833 + ], + [ + Infinity, + Infinity + ], + [ + 0.3484375, + 1.6328187300519101 + ], + [ + 1.1398437499999998, + 1.2182992789696712 + ], + [ + 1.609375, + 0.4447401292351336 + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ] + ] + ] + ] + }, + "finite_positions": { + "control": [ + [ + 4 + ], + [ + 4 + ], + [ + 4 + ] + ], + "nodedup": [ + [ + 4 + ], + [ + 4 + ], + [ + 4 + ] + ], + "library": [ + [ + 4 + ], + [ + 4 + ], + [ + 4 + ] + ] + }, + "pairs": { + "control_vs_nodedup": { + "max_abs_delta": 0.0, + "max_rel_delta": 0.0, + "nan_pattern_equal": true, + "array_equal_nan_aware": true + }, + "control_vs_library": { + "max_abs_delta": 0.0, + "max_rel_delta": 0.0, + "nan_pattern_equal": true, + "array_equal_nan_aware": true + } + } + }, + "simple_solved_grad": { + "n_instances": 3, + "rtol": 1e-10, + "atol": 1e-12, + "compile": { + "control": { + "lower_s": 4.647567723994143, + "compile_s": 6.267317686928436, + "first_call_s": 0.027351350989192724, + "trace_calls": 32, + "flops": 18753240.0, + "hlo_sort_count": 30, + "stablehlo_sort_count": 4, + "hlo_sort_shapes": [ + "(f64[69849]{0}, f64[69849]{0}, s64[69849]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(s32[15,2]{1,0}, s32[15,2]{1,0})" + ], + "hlo_sha256": "e74a546ad6023347", + "hlo_lines": 53768 + }, + "nodedup": { + "lower_s": 4.20944652298931, + "compile_s": 5.331032715039328, + "first_call_s": 0.006281703012064099, + "trace_calls": 32, + "flops": 9665219.0, + "hlo_sort_count": 15, + "stablehlo_sort_count": 2, + "hlo_sort_shapes": [ + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(s32[15,2]{1,0}, s32[15,2]{1,0})" + ], + "hlo_sha256": "14c8ecf10ee2ba21", + "hlo_lines": 46130 + }, + "library": { + "lower_s": 4.7248282299842685, + "compile_s": 1.0609165189089254, + "first_call_s": 0.027359851985238492, + "trace_calls": 32, + "flops": 18753240.0, + "hlo_sort_count": 30, + "stablehlo_sort_count": 4, + "hlo_sort_shapes": [ + "(f64[69849]{0}, f64[69849]{0}, s64[69849]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(s32[15,2]{1,0}, s32[15,2]{1,0})" + ], + "hlo_sha256": "1b7a3c492b6da9fe", + "hlo_lines": 49480 + } + }, + "all_finite": { + "control": true, + "nodedup": true, + "library": true + }, + "gradients": { + "control": [ + [ + -41.62226304412241, + 53.13429595959836, + 31.786492377833373, + 2.8041319222503027, + 1781.7386158499905 + ], + [ + -46.408073055275, + 75.13738885142469, + 78.91835319805018, + 74.32499719544126, + 2531.5778928834748 + ], + [ + 62.951469401248765, + -41.40185295994061, + 18.162643132964934, + 109.0003235058508, + -1560.549091923857 + ] + ], + "nodedup": [ + [ + -41.62226304412241, + 53.13429595959836, + 31.786492377833373, + 2.8041319222503027, + 1781.7386158499905 + ], + [ + -46.408073055275, + 75.13738885142469, + 78.91835319805018, + 74.32499719544126, + 2531.5778928834748 + ], + [ + 62.951469401248765, + -41.40185295994061, + 18.162643132964934, + 109.0003235058508, + -1560.549091923857 + ] + ], + "library": [ + [ + -41.62226304412241, + 53.13429595959836, + 31.786492377833373, + 2.8041319222503027, + 1781.7386158499905 + ], + [ + -46.408073055275, + 75.13738885142469, + 78.91835319805018, + 74.32499719544126, + 2531.5778928834748 + ], + [ + 62.951469401248765, + -41.40185295994061, + 18.162643132964934, + 109.0003235058508, + -1560.549091923857 + ] + ] + }, + "pairs": { + "control_vs_nodedup": { + "bit_identical": true, + "max_abs_delta": 0.0, + "max_rel_delta": 0.0, + "nan_pattern_equal": true, + "allclose": true + }, + "control_vs_library": { + "bit_identical": true, + "max_abs_delta": 0.0, + "max_rel_delta": 0.0, + "nan_pattern_equal": true, + "allclose": true + } + } + }, + "simple_solved_vmap4": { + "vmap_vs_scalar_within_route": { + "control": { + "bit_identical": true, + "max_abs_delta": 0.0, + "max_rel_delta": 0.0, + "nan_pattern_equal": true, + "allclose_rtol_1e-12": true, + "n_compared": 16 + }, + "nodedup": { + "bit_identical": true, + "max_abs_delta": 0.0, + "max_rel_delta": 0.0, + "nan_pattern_equal": true, + "allclose_rtol_1e-12": true, + "n_compared": 16 + }, + "library": { + "bit_identical": true, + "max_abs_delta": 0.0, + "max_rel_delta": 0.0, + "nan_pattern_equal": true, + "allclose_rtol_1e-12": true, + "n_compared": 16 + } + }, + "across_routes": { + "control_vs_nodedup": { + "bit_identical": true, + "max_abs_delta": 0.0, + "max_rel_delta": 0.0, + "nan_pattern_equal": true + }, + "control_vs_library": { + "bit_identical": true, + "max_abs_delta": 0.0, + "max_rel_delta": 0.0, + "nan_pattern_equal": true + }, + "nodedup_vs_library": { + "bit_identical": true, + "max_abs_delta": 0.0, + "max_rel_delta": 0.0, + "nan_pattern_equal": true + } + } + }, + "cluster_solved_positions": { + "n_instances": 3, + "compile": { + "control": { + "lower_s": 7.347597416024655, + "compile_s": 8.80831039394252, + "first_call_s": 0.14376434206496924, + "trace_calls": 28, + "flops": 184111088.0, + "hlo_sort_count": 25, + "stablehlo_sort_count": 3, + "hlo_sort_shapes": [ + "(f64[276507]{0}, f64[276507]{0}, s64[276507]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})" + ], + "hlo_sha256": "f815d47a1fcccd0c", + "hlo_lines": 55191 + }, + "nodedup": { + "lower_s": 7.250732008018531, + "compile_s": 7.771443829988129, + "first_call_s": 0.06437232298776507, + "trace_calls": 28, + "flops": 139395248.0, + "hlo_sort_count": 12, + "stablehlo_sort_count": 1, + "hlo_sort_shapes": [ + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})" + ], + "hlo_sha256": "ffa35cad4525b1ef", + "hlo_lines": 47313 + }, + "library": { + "lower_s": 7.362595141981728, + "compile_s": 1.0940108558861539, + "first_call_s": 0.16459617496002465, + "trace_calls": 28, + "flops": 184111088.0, + "hlo_sort_count": 25, + "stablehlo_sort_count": 3, + "hlo_sort_shapes": [ + "(f64[276507]{0}, f64[276507]{0}, s64[276507]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0})" + ], + "hlo_sha256": "464a020f3b9036fb", + "hlo_lines": 54118 + } + }, + "positions": { + "control": [ + [ + [ + [ + -3.0789062499999997, + -7.858729484445975 + ], + [ + -0.9296874999999998, + 10.716162262036818 + ], + [ + -0.021874999999999995, + -0.23996120563193818 + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ] + ], + [ + [ + -15.96875, + 19.007453393477206 + ], + [ + 0.68359375, + -0.5146536383948147 + ], + [ + 13.693749999999998, + -14.309265577946627 + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ] + ] + ], + [ + [ + [ + -3.0789062499999997, + -7.858729484445975 + ], + [ + -0.9296875, + 10.709847493467556 + ], + [ + -0.016406249999999997, + -0.24311858991656893 + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ] + ], + [ + [ + -15.963281249999998, + 18.997981240623318 + ], + [ + 0.6890624999999999, + -0.5178110226794455 + ], + [ + 13.68828125, + -14.306108193661998 + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ] + ] + ], + [ + [ + [ + -3.0843749999999996, + -7.855572100161344 + ], + [ + -0.9351562499999999, + 10.72563441489071 + ], + [ + -0.021874999999999995, + -0.23364643706267665 + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ] + ], + [ + [ + -15.96875, + 19.007453393477206 + ], + [ + 0.68359375, + -0.5083388698255532 + ], + [ + 13.693749999999998, + -14.309265577946627 + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ] + ] + ] + ], + "nodedup": [ + [ + [ + [ + -3.0789062499999997, + -7.858729484445975 + ], + [ + -0.9296874999999998, + 10.716162262036818 + ], + [ + -0.021874999999999995, + -0.23996120563193818 + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ] + ], + [ + [ + -15.96875, + 19.007453393477206 + ], + [ + 0.68359375, + -0.5146536383948147 + ], + [ + 13.693749999999998, + -14.309265577946627 + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ] + ] + ], + [ + [ + [ + -3.0789062499999997, + -7.858729484445975 + ], + [ + -0.9296875, + 10.709847493467556 + ], + [ + -0.016406249999999997, + -0.24311858991656893 + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ] + ], + [ + [ + -15.963281249999998, + 18.997981240623318 + ], + [ + 0.6890624999999999, + -0.5178110226794455 + ], + [ + 13.68828125, + -14.306108193661998 + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ] + ] + ], + [ + [ + [ + -3.0843749999999996, + -7.855572100161344 + ], + [ + -0.9351562499999999, + 10.72563441489071 + ], + [ + -0.021874999999999995, + -0.23364643706267665 + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ] + ], + [ + [ + -15.96875, + 19.007453393477206 + ], + [ + 0.68359375, + -0.5083388698255532 + ], + [ + 13.693749999999998, + -14.309265577946627 + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ] + ] + ] + ], + "library": [ + [ + [ + [ + -3.0789062499999997, + -7.858729484445975 + ], + [ + -0.9296874999999998, + 10.716162262036818 + ], + [ + -0.021874999999999995, + -0.23996120563193818 + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ] + ], + [ + [ + -15.96875, + 19.007453393477206 + ], + [ + 0.68359375, + -0.5146536383948147 + ], + [ + 13.693749999999998, + -14.309265577946627 + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ] + ] + ], + [ + [ + [ + -3.0789062499999997, + -7.858729484445975 + ], + [ + -0.9296875, + 10.709847493467556 + ], + [ + -0.016406249999999997, + -0.24311858991656893 + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ] + ], + [ + [ + -15.963281249999998, + 18.997981240623318 + ], + [ + 0.6890624999999999, + -0.5178110226794455 + ], + [ + 13.68828125, + -14.306108193661998 + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ] + ] + ], + [ + [ + [ + -3.0843749999999996, + -7.855572100161344 + ], + [ + -0.9351562499999999, + 10.72563441489071 + ], + [ + -0.021874999999999995, + -0.23364643706267665 + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ] + ], + [ + [ + -15.96875, + 19.007453393477206 + ], + [ + 0.68359375, + -0.5083388698255532 + ], + [ + 13.693749999999998, + -14.309265577946627 + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ] + ] + ] + ] + }, + "finite_positions": { + "control": [ + [ + 3, + 3 + ], + [ + 3, + 3 + ], + [ + 3, + 3 + ] + ], + "nodedup": [ + [ + 3, + 3 + ], + [ + 3, + 3 + ], + [ + 3, + 3 + ] + ], + "library": [ + [ + 3, + 3 + ], + [ + 3, + 3 + ], + [ + 3, + 3 + ] + ] + }, + "pairs": { + "control_vs_nodedup": { + "max_abs_delta": 0.0, + "max_rel_delta": 0.0, + "nan_pattern_equal": true, + "array_equal_nan_aware": true + }, + "control_vs_library": { + "max_abs_delta": 0.0, + "max_rel_delta": 0.0, + "nan_pattern_equal": true, + "array_equal_nan_aware": true + } + } + } + }, + "wall_s": 627.8825693880208 +} \ No newline at end of file diff --git a/results/breakdown/point_source/vertex_dedup_ab_hpc_ral_cpu_fp64.png b/results/breakdown/point_source/vertex_dedup_ab_hpc_ral_cpu_fp64.png new file mode 100644 index 0000000000000000000000000000000000000000..db32d732c55a8530629d409ed33b62a0a8a54d15 GIT binary patch literal 124767 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

mBd?Is0dDQr6&P9W5|2 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

jNCj24D+oK5@Hn{Ro{kVar<_Sr40LDg; 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 per-call avg: 1.925917 s + src0: 3 image positions found + [jitted_solve_src1_lower] 8.5025 s + [jitted_solve_src1_compile] 4.6456 s + [jitted_solve_src1_first_call] 1.9659 s + [jitted_solve_src1_steady_x3] 5.6618 s + -> per-call avg: 1.887259 s + src1: 3 image positions found + +--- PART 5: simulator.via_tracer_from (1000×1000 over-sampled) --- + [setup_psf_simulator] 0.0005 s + [via_tracer_from] 9.8419 s + +--- PART 6: outputs --- + [output_fits] 0.2713 s + [output_scaling_galaxies_csv] 0.0011 s + [output_point_datasets] 0.0037 s + [output_json] 0.0125 s + +====================================================================== +CLUSTER DIAGNOSTIC: compile vs via_tracer_from +====================================================================== + solver_lower_total (both sources): 17.1157 s + solver_compile_total (both sources): 8.9762 s + solver_steady_total (both sources): 11.4395 s + via_tracer_from: 9.8419 s + compile / via_tracer ratio: 0.91x +====================================================================== + + Results saved to: /mnt/ral/jnightin/autolens_profiling_wt/point-source-cpu-p2/results/simulators/cluster_summary_v2026.8.17.1.json + Bar chart saved to: /mnt/ral/jnightin/autolens_profiling_wt/point-source-cpu-p2/results/simulators/cluster_summary_v2026.8.17.1.png + +====================================================================== +PROFILING SUMMARY +====================================================================== + setup_imaging_grid 0.1386 s + setup_galaxies 0.0142 s + setup_tracer 0.0001 s + register_pytrees 0.3971 s + solver_build 0.0263 s + jitted_solve_src0_lower 8.6131 s + jitted_solve_src0_compile 4.3306 s + jitted_solve_src0_first_call 2.0135 s + jitted_solve_src0_steady_x3 5.7778 s + jitted_solve_src1_lower 8.5025 s + jitted_solve_src1_compile 4.6456 s + jitted_solve_src1_first_call 1.9659 s + jitted_solve_src1_steady_x3 5.6618 s + setup_psf_simulator 0.0005 s + via_tracer_from 9.8419 s + output_fits 0.2713 s + output_scaling_galaxies_csv 0.0011 s + output_point_datasets 0.0037 s + output_json 0.0125 s +---------------------------------------------------------------------- + TOTAL 52.2183 s +====================================================================== + +--- row cluster_solved --- + [cluster_solved/control] lower 43.1 s compile 31.4 s first 143.31 ms trace_calls 168 sorts 25 (stablehlo 3) + [cluster_solved/nodedup] lower 42.0 s compile 27.9 s first 77.15 ms trace_calls 168 sorts 12 (stablehlo 1) + [cluster_solved/library] lower 43.5 s compile 1.9 s first 159.51 ms trace_calls 168 sorts 25 (stablehlo 3) + median ms control 155.222 nodedup 78.320 library 154.502 control/nodedup 1.982 [1.928, 2.029] + +--- positions gate cluster_solved --- + [cluster_solved_positions/control] lower 7.3 s compile 8.8 s first 143.76 ms trace_calls 28 sorts 25 (stablehlo 3) + [cluster_solved_positions/nodedup] lower 7.3 s compile 7.8 s first 64.37 ms trace_calls 28 sorts 12 (stablehlo 1) + [cluster_solved_positions/library] lower 7.4 s compile 1.1 s first 164.60 ms trace_calls 28 sorts 25 (stablehlo 3) + +--- row cluster_plain --- + [cluster_plain/control] lower 30.7 s compile 23.5 s first 157.16 ms trace_calls 168 sorts 25 (stablehlo 3) + [cluster_plain/nodedup] lower 29.5 s compile 20.4 s first 76.94 ms trace_calls 168 sorts 12 (stablehlo 1) + [cluster_plain/library] lower 30.1 s compile 1.4 s first 142.90 ms trace_calls 168 sorts 25 (stablehlo 3) + median ms control 153.852 nodedup 77.707 library 152.395 control/nodedup 1.980 [1.937, 2.024] + +==================================================================================================== +VERTEX-DEDUP A/B (hpc_ral_cpu_fp64, rounds=20, calls/round=5) +==================================================================================================== + row route median p10 p90 min max sorts compile_s + simple_solved control 24.002 23.426 24.586 23.048 25.167 15 4.1 + simple_solved nodedup 5.375 4.653 6.246 4.253 6.680 7 3.2 + simple_solved library 23.921 23.456 24.678 23.177 25.500 15 0.5 + control/nodedup 4.465 [90% 4.370, 4.566] MDI 0.048 + simple_solved_vmap4 control 31.309 29.689 32.555 28.652 33.232 15 4.7 + simple_solved_vmap4 nodedup 11.908 10.768 13.090 9.854 14.002 7 3.8 + simple_solved_vmap4 library 30.872 29.699 32.428 28.816 33.170 15 0.5 + control/nodedup 2.629 [90% 2.534, 2.718] MDI 0.092 + simple_plain control 23.758 23.275 24.206 22.583 24.535 15 3.6 + simple_plain nodedup 5.394 4.906 6.250 4.494 6.585 7 2.8 + simple_plain library 23.740 23.109 24.205 22.831 24.652 15 0.4 + control/nodedup 4.404 [90% 4.300, 4.452] MDI 0.039 + cluster_solved control 155.222 142.182 162.345 131.397 168.459 25 31.4 + cluster_solved nodedup 78.320 65.793 87.825 58.105 94.850 12 27.9 + cluster_solved library 154.502 141.891 161.977 130.552 169.227 25 1.9 + control/nodedup 1.982 [90% 1.928, 2.029] MDI 0.130 + cluster_plain control 153.852 141.548 161.840 137.638 169.935 25 23.5 + cluster_plain nodedup 77.707 66.119 88.169 60.449 95.791 12 20.4 + cluster_plain library 152.395 141.862 160.329 136.211 171.775 25 1.4 + control/nodedup 1.980 [90% 1.937, 2.024] MDI 0.132 +---------------------------------------------------------------------------------------------------- + library_matches: control + bit_identical (log L, all rows, control vs nodedup/library): True + wall: 628 s + Results JSON: /mnt/ral/jnightin/autolens_profiling_wt/point-source-cpu-p2/results/breakdown/point_source/vertex_dedup_ab_hpc_ral_cpu_fp64.json + Results PNG: /mnt/ral/jnightin/autolens_profiling_wt/point-source-cpu-p2/results/breakdown/point_source/vertex_dedup_ab_hpc_ral_cpu_fp64.png +========================================== +loadavg: 1.54 1.43 0.84 1/2220 527162 +Finished. +Wed 23 Sep 16:31:12 BST 2026 From 4c5141e3c14a66e63fdfa8458aa7b5d7c7f3fb45 Mon Sep 17 00:00:00 2001 From: Jammy2211 Date: Wed, 23 Sep 2026 17:40:41 +0200 Subject: [PATCH 5/9] =?UTF-8?q?docs(profiling):=20point-source=20CPU=20cam?= =?UTF-8?q?paign=20note=20=E2=80=94=20phase=202=20vertex-dedup=20A/B,=20RA?= =?UTF-8?q?L=20job=20350582=20(#568)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 (1M context) Claude-Session: https://claude.ai/code/session_01MMSQRTc7Zthxj1pxRjDVaF --- README.md | 8 + results/notes/point_source_cpu_campaign.md | 415 ++++++++++++++++++++- 2 files changed, 415 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 4c1efafad..0f268f14e 100644 --- a/README.md +++ b/README.md @@ -254,6 +254,14 @@ separately per likelihood × transform. Standing conclusions: not baselines. The reported September 4.9× / 2.4× gain from dropping the throwaway `jnp.unique` is still a hypothesis for phase 2. Findings: [`results/notes/point_source_cpu_campaign.md`](./results/notes/point_source_cpu_campaign.md). +- **Point-source CPU speed-up, phase 2 (2026-09)** — removing the throwaway JAX-path `jnp.unique` + vertex dedup (static `size=3N` made it save zero deflections while sorting 3N fp64 rows every + refinement step; PyAutoArray #568). Interleaved in-process A/B, RAL job 350582 (`ral`, EPYC 7763, + 8 CPUs): simple solved 24.00 → 5.38 ms (**4.47×**, 90 % CI 4.37–4.57), vmap-4 2.63×, two-source + cluster 155 → 78 ms (**1.98×**); HLO sorts 15 → 7 / 25 → 12, compile 11–21 % faster. Log-likelihoods, + positions and gradients bit-identical on every instance. Accepted; the post-fix call is + deflection-dominated (70 % of FLOPs), so phase 3 is the static initial-lattice precompute. + Findings: [`results/notes/point_source_cpu_campaign.md`](./results/notes/point_source_cpu_campaign.md). ## How to read this repo diff --git a/results/notes/point_source_cpu_campaign.md b/results/notes/point_source_cpu_campaign.md index b8e85bdc8..a9b9b61cf 100644 --- a/results/notes/point_source_cpu_campaign.md +++ b/results/notes/point_source_cpu_campaign.md @@ -1,7 +1,8 @@ # Point-source CPU speed-up campaign — ledger -Issue: [autolens_profiling #297](https://github.com/PyAutoLabs/autolens_profiling/issues/297) -Branch (phase 1): `feature/point-source-cpu-p1` +Issue: [autolens_profiling #297](https://github.com/PyAutoLabs/autolens_profiling/issues/297) (phase 1); [PyAutoArray #568](https://github.com/PyAutoLabs/PyAutoArray/issues/568) (phase 2) +Branch: `feature/point-source-cpu-p1` (phase 1); `feature/point-source-cpu-p2` (phase 2, PyAutoArray + autolens_profiling) +Status: phase 1 **DONE** (RAL baseline, job 350580); phase 2 **DONE, ACCEPTED** (vertex-dedup A/B, RAL job 350582: 4.47× simple, 1.98× cluster, bit-identical; library change awaiting merge and release); phases 3–4 not started Instrument: [`scripts/point_source/likelihood_breakdown/image_plane.py`](../../scripts/point_source/likelihood_breakdown/image_plane.py) (shipped in #293, see [point_source_shared_likelihood_breakdown.md](point_source_shared_likelihood_breakdown.md)) and [`scripts/cluster/likelihood_breakdown/image_plane.py`](../../scripts/cluster/likelihood_breakdown/image_plane.py) @@ -9,7 +10,7 @@ and [`scripts/cluster/likelihood_breakdown/image_plane.py`](../../scripts/cluste This campaign aims to make the JAX-CPU PointSolver image-plane likelihood cheaper for both the galaxy-scale `simple` case and the 13-component, two-source cluster case that cluster modelling depends on. It runs as one bounded phase at a time. -Phase 1 (this note, first section) produces a quotable CPU baseline on a quiet +Phase 1 (first section) produces a quotable CPU baseline on a quiet RAL node and records the unoptimized library revisions. Phase 2 tests the single reported lever, the JAX-only throwaway `jnp.unique` vertex deduplication. Phases 3–4 are chosen only by what the measurements show. A September 17 study reported @@ -300,15 +301,413 @@ on RAL; it was not harvested. The laptop counterparts are --- -## Phase 2 — remove the throwaway vertex dedup — NOT STARTED +## Phase 2 — remove the throwaway vertex dedup (2026-09-23) — DONE, ACCEPTED + +Library issue: [PyAutoArray #568](https://github.com/PyAutoLabs/PyAutoArray/issues/568). +Library branch: PyAutoArray `feature/point-source-cpu-p2` (on main `11b93476`), with +commits `273e152e` (the fix) and `25894d10` (the tests). Profiling branch: +`feature/point-source-cpu-p2`. Instrument: +[`scripts/point_source/likelihood_breakdown/vertex_dedup_ab.py`](../../scripts/point_source/likelihood_breakdown/vertex_dedup_ab.py). + +### Mechanism (research note §3, now confirmed on current code) + +On the JAX path, `PointSolver._plane_triangles` ray-traces `triangles.vertices` +and rebuilds the triangles with `with_vertices`. Both `vertices` and `indices` +came from `CoordinateArrayTriangles._vertices_and_indices`, which on main called +`jnp.unique(flat_triangles, axis=0, return_inverse=True, size=3N, equal_nan=True, fill_value=nan)`. + +- Under `jit`, `jnp.unique` needs a static output shape, so it was given `size=3N`. + That is exactly the input's own row count. The "deduplicated" table therefore + had 3N rows: the real unique vertices plus NaN fill. On the `simple` step-0 + lattice that is 69 849 rows, of which 28 665 are unique (research note §3). + The ray trace evaluated all 3N rows, so the dedup saved **zero** deflection + evaluations. +- What it did cost was a lexicographic sort of 3N fp64 rows at every refinement + step. The Python code reads the property twice per step (`vertices` and + `indices`), but XLA CSEs the pair. The optimised HLO holds **one sort per step**: + one `f64[69849]` sort at step 0 and seven `f64[720]` sorts for steps 1–7 + (240 kept triangles × 3). Read the optimised-HLO count, not the StableHLO + count (3 → 1), which counts sort definitions inside reused private functions. +- **The fix** (`273e152e`) returns `(triangles.reshape(-1, 2), arange(3N).reshape(-1, 3))`: + the flat vertex table and an identity index map, with no `jnp.unique`. It is + **API-neutral**. `vertices`, `indices` and `with_vertices` keep their signatures + and shapes, since the old table already had 3N rows. `with_vertices(vertices)` + rebuilds the same triangles, and `_plane_triangles` in PyAutoLens is the only + solve-path consumer and needs no change. +- **NaN padding.** Padding triangles are NaN in the flat table exactly as before. + They trace to NaN, and every `Shape.mask` comparison against NaN is false, so + they are never kept. The kept-triangle set, and hence the likelihood, cannot + change. +- **The NumPy sibling is unchanged.** `coordinate_array_np.py` calls `np.unique` + with no `size=`, so it genuinely shrinks the table (69 849 → 28 665 rows) and + saves deflections. `ShapeSolver`, plotting and every `remove_duplicates` / + `neighborhood` sort are untouched. -Test the JAX-only throwaway conversion at `_plane_triangles` against the phase-1 -RAL baseline, with the red control and protocol in the handoff above. Ship the -bounded library change, then refresh the workspace rows. +### Environment + +| | Laptop witness (`local_cpu_fp64`) | RAL (`hpc_ral_cpu_fp64`) | +|---|---|---| +| Host | `DESKTOP-H143S82`, WSL2 | `euclid-ral-compute-1`, partition **`ral`**, SLURM job **350582**, `COMPLETED`, elapsed 00:11:12 (cell `wall_s` 628 s) | +| CPU | Intel i9-10885H | **AMD EPYC 7763 64-Core** (`lscpu` in the job log). Phase 1 ran on `euclid-ral-compute-10-2`, a Xeon Platinum 8490H: **a different CPU** | +| CPUs | 8 logical; `sched_getaffinity` = 8 | `--cpus-per-task=8`; `sched_getaffinity` = **8**; `os.cpu_count()` = 252 is the node | +| Load (1/5/15-min) | start 3.82 / 3.15 / 2.86 → end 1.53 / 1.89 / 2.61; **not quiet** | job entry 0.00; cell start 0.49 / 0.13 / 0.04 → end 1.54 / 1.43 / 0.84 | +| Threads | `NPROC=8`, `OMP/MKL/OPENBLAS_NUM_THREADS=1` | same | +| `XLA_FLAGS` | `--xla_disable_hlo_passes=constant_folding --xla_gpu_autotune_level=0 --xla_gpu_enable_triton_gemm=false` | byte-identical | +| Precision / backend | fp64, `JAX_PLATFORMS=cpu`, jax / jaxlib 0.10.2 | same | +| JAX compile cache | none (`jax_compilation_cache_dir: null`): every route compiles cold | per-job directory `vertex_dedup_ab_350582`, wiped by the submit. `control` compiles cold; `library` lowers to the control program and **hits the cache** (compile 0.4–1.9 s), so its compile seconds are not comparable | +| PyAutoArray | canonical main `11b93476` (pre-fix; see the PYTHONPATH note) | shared install `22e6d608` (the frozen phase-1 revision, pre-fix) | +| PyAutoLens / Galaxy / Fit / Nerves | `2aaa1c1a` / `70a61e26` / `a7368401` / `1fa613aa` | same | +| autolens_profiling | `04351847` (main; the cell was uncommitted, see the provenance defect) | `d97556f8` | +| Protocol | 3 routes (`control`, `nodedup`, `library`), **20 rounds × 5 calls** round-robin with the start rotated each round (100 per-call samples per route), 3 warm calls, 16-instance stream (seed 568; entry 0 = prior medians, the rest `U(0.25, 0.75)` unit vectors), bootstrap 2000 resamples (seed 12345, 90 %) | same | +| Peak RSS | 2.37 GB for the whole process (`/usr/bin/time -v`, all routes and both models), not per route | not recorded | + +- **Cache-trap guard.** Each route gets a fresh closure and fresh solver and + analysis objects, plus `jax.clear_caches()`. The argument is the physical + parameter vector, with `instance_from_vector(xp=jnp)` inside the trace, so + constant folding cannot fake work. +- **`library` self-labels.** It is the installed method, not an injected one. + On both hosts it lowers to the control's sort count, so it reads + `library_matches: control`. +- **XLA intra-op thread count.** The phase-1 handoff asked for it; it is still + not recorded. `NPROC=8` and the 8-CPU affinity mask bound it, but the pool size + itself was not read out. +- **Protocol deviation.** The #568 plan asked for ≥ 20 warmed calls per round; + the cell ran 5. The 100 samples per route still give bootstrap CIs of ±2 % on + the ratio, so this does not change the decision. +- **Provenance defect in the laptop JSON (not edited).** In the committed + [`vertex_dedup_ab_local_cpu_fp64.json`](../breakdown/point_source/vertex_dedup_ab_local_cpu_fp64.json), + the provenance strings `control_source.body` and `nodedup_body` hold the + **wrong function texts**: `_profiling_root` and the control body respectively. + The script was edited during the run, and `inspect.getsource` then read stale + line offsets. The RAL JSON's bodies are correct and are the authoritative record + of what each route ran. The laptop timings, HLO counts and gates are unaffected: + the routes execute the function objects, not the recorded text. + +### A/B — steady per-call cost + +All numbers below come from the two JSONs via a script. The ratio is +control / nodedup of the per-route medians, with the JSON's bootstrap 90 % CI. +**MDI** (minimum detectable improvement) is the control's (p90 − p10) / median. +FLOPs are XLA `cost_analysis()` values. + +**RAL `hpc_ral_cpu_fp64` (quotable)** + +| Row | control median [p10, p90] ms | nodedup median [p10, p90] ms | library median ms | control / nodedup [90 % CI] | MDI | HLO sorts ctrl → nodedup | FLOPs ctrl → nodedup | +|---|---:|---:|---:|---:|---:|---:|---:| +| `simple_solved` | 24.00 [23.43, 24.59] | 5.38 [4.65, 6.25] | 23.92 | **4.47×** [4.37, 4.57] | 4.8 % | 15 → 7 | 15.58M → 7.05M | +| `simple_plain` | 23.76 [23.28, 24.21] | 5.39 [4.91, 6.25] | 23.74 | **4.40×** [4.30, 4.45] | 3.9 % | 15 → 7 | 15.58M → 7.05M | +| `simple_solved_vmap4` (per batch of 4) | 31.31 [29.69, 32.55] | 11.91 [10.77, 13.09] | 30.87 | **2.63×** [2.53, 2.72] | 9.2 % | 15 → 7 | 33.66M → 23.30M | +| `cluster_solved` | 155.22 [142.18, 162.34] | 78.32 [65.79, 87.82] | 154.50 | **1.98×** [1.93, 2.03] | 13.0 % | 25 → 12 | 184.16M → 139.44M | +| `cluster_plain` | 153.85 [141.55, 161.84] | 77.71 [66.12, 88.17] | 152.40 | **1.98×** [1.94, 2.02] | 13.2 % | 25 → 12 | 184.15M → 139.43M | + +**Laptop `local_cpu_fp64` (witness, loaded host)** + +| Row | control median [p10, p90] ms | nodedup median [p10, p90] ms | library median ms | control / nodedup [90 % CI] | MDI | HLO sorts ctrl → nodedup | FLOPs ctrl → nodedup | +|---|---:|---:|---:|---:|---:|---:|---:| +| `simple_solved` | 32.03 [30.68, 35.54] | 5.34 [5.00, 5.99] | 31.91 | **6.00×** [5.91, 6.21] | 15.2 % | 15 → 7 | 15.58M → 7.05M | +| `simple_plain` | 36.79 [34.40, 43.27] | 6.09 [5.61, 7.56] | 36.89 | **6.04×** [5.90, 6.23] | 24.1 % | 15 → 7 | 15.58M → 7.05M | +| `simple_solved_vmap4` (per batch of 4) | 51.92 [46.21, 67.19] | 15.31 [13.82, 32.32] | 50.19 | **3.39×** [3.20, 3.48] | 40.4 % | 15 → 7 | 33.66M → 23.30M | +| `cluster_solved` | 143.43 [133.24, 164.62] | 62.75 [57.44, 71.02] | 142.20 | **2.29×** [2.22, 2.33] | 21.9 % | 25 → 12 | 184.16M → 139.44M | +| `cluster_plain` | 143.75 [138.33, 154.88] | 62.39 [57.84, 69.60] | 145.07 | **2.30×** [2.27, 2.34] | 11.5 % | 25 → 12 | 184.15M → 139.43M | + +**Side by side** + +| Row | laptop ratio | RAL ratio | RAL paired per-round ratio median [p10, p90] | +|---|---:|---:|---:| +| `simple_solved` | 6.00× | 4.47× | 4.51 [4.17, 4.77] | +| `simple_plain` | 6.04× | 4.40× | 4.37 [4.13, 4.65] | +| `simple_solved_vmap4` | 3.39× | 2.63× | 2.65 [2.46, 2.87] | +| `cluster_solved` | 2.29× | 1.98× | 1.98 [1.86, 2.21] | +| `cluster_plain` | 2.30× | 1.98× | 1.97 [1.86, 2.18] | + +The `control / library` ratio is 0.99–1.04 on every row of both hosts, with CIs +straddling 1 except RAL vmap4 at 1.014 [1.000, 1.024]. That confirms the +injected control reproduces the installed pre-fix method. + +**Reading the rows.** + +- **Sort shapes (RAL, identical on the laptop).** + - `simple` control: 1 × `f64[69849]`, 7 × `f64[720]` and 7 × `f64[60]`. + Nodedup keeps only the 7 × `f64[60]` (`neighborhood`). + - `cluster` control: 1 × `f64[276507]`, 12 × `f64[720]` and 12 × `f64[60]`; + nodedup keeps the 12 × `f64[60]`. The step-0 image-plane lattice is shared by + both source systems, so XLA traces its sort once, not once per system. + - The fix therefore removes the step-0 sort **and** the seven (twelve) `f64[720]` + per-step sorts, all of them `_vertices_and_indices`. The research note §4 + credited the `f64[720]` sorts to `remove_duplicates`; that attribution does + not survive this A/B, because only `_vertices_and_indices` differs between routes. +- **The gradient program halves its sorts too:** 30 → 15, and FLOPs 18.75M → 9.67M. +- **Throughput under `vmap`.** At batch 4 the control costs 7.83 ms per + likelihood on RAL and nodedup 2.98 ms. Against the scalar calls (24.00 / 5.38 ms), + the control already amortises most of its step-0 sort across the batch. This + is consistent with the static step-0 lattice being batch-invariant, so the + sort runs once per batch; that is an interpretation, not traced. The fix + therefore gains less under `vmap` (2.63×) than per scalar call (4.47×), while + still leaving the best throughput. +- **Ratios are comparable only within one host.** The RAL simple rows are + faster than the laptop's, but the RAL cluster rows are **slower** (155 / 78 ms + against 143 / 62 ms). The cluster program's larger deflection share evidently + runs worse on 8 EPYC 7763 cores than on the i9; that is a host property, not a + code one. The loaded laptop inflates the simple control more than nodedup, so + its 6.0× overstates the gain, and **RAL's 4.47× / 1.98× are the quotable figures.** +- **Against the September hypotheses.** + - Simple: reported 4.9× (40.0 → 8.1 ms); RAL measures **4.47×** (24.00 → 5.38 ms). + - Cluster: reported 2.4× per standalone solve (117 → 48 ms); RAL measures + **1.98×** on the fused two-source likelihood (155 → 78 ms). These are + different quantities: fused likelihood here, standalone per-source solve then. + - Direction and order of magnitude reproduce. The exact reported ratios were + loaded-laptop, monkeypatched numbers and are superseded. + +### Cross-check against the phase-1 RAL baseline + +| Row | phase-1 fused (mean of `n_repeats`, one instance) | phase-2 control median | gap | +|---|---:|---:|---:| +| simple solved | 24.69 ms | 24.00 ms | **−2.8 %** | +| simple plain | 24.72 ms | 23.76 ms | **−3.9 %** | +| cluster solved | 134.52 ms | 155.22 ms | **+15.4 %** | +| cluster plain | 128.05 ms | 153.85 ms | **+20.1 %** | + +- **Simple.** The simple control agrees with phase 1 within 4 %, on the same + code (`22e6d608`) and the same fused likelihood. That holds even though phase 2 + medians over a 16-instance parameter stream and phase 1 averaged 5 calls at one + instance. The simple call is dominated by the parameter-independent step-0 sort. +- **Cluster.** The cluster control is 15–20 % above phase 1. Comparing means + gives +14 % / +20 %, so this is not a median-versus-mean artefact. The code is + the same (the RAL control and library routes are the `22e6d608` install and + agree within 1 %). The host is not: phase 1 ran on a Xeon Platinum 8490H node + and phase 2 on an EPYC 7763 node. The cluster program is dominated by 13-component + deflections, so the gap is read as a **host difference, not drift**. That fits + the laptop running the cluster rows faster than this EPYC node. A second + contributor is that the instance stream varies the lens parameters, while phase 1 + used one instance (the p10–p90 spread is 142–162 ms). +- **Consequence.** Phase-1 and phase-2 rows are one baseline only for the simple + cell. The cluster before/after claim rests on the in-process A/B (1.98×), not + on phase-1 128 ms → phase-2 78 ms. The phase-3 refresh must record its node's + CPU model and compare against a control taken on the same node. + +### Correctness gates + +All 19 gates in `gate_summary` pass on both hosts. + +- **Log-likelihood.** For every row and route pair (control / nodedup / library), + the value is **bit-identical** (Δ = 0.0 absolute and relative, NaN pattern equal) + on all 16 stream instances, and deterministic within each route. The fiducial + simple solved value is `7.743201200876812` on all three routes. The stream + values agree across hosts. +- **Positions.** Simple solved and cluster solved model positions are `array_equal` + (max |Δ| = 0.0) on 3 gate instances. +- **Gradient (simple solved).** `jax.grad` is finite and **bit-identical** between + routes on 3 instances (rtol 1e-10, atol 1e-12, achieved Δ = 0). +- **`vmap`.** vmap-4 equals the scalar calls bit for bit within every route, and + all routes agree with each other. +- **Library tests and pins** (worker A, against the worktree PyAutoArray): + - The new `test_autoarray/structures/triangles/test_coordinate_jax.py` has + 10 tests. Its HLO guard **fails on main** ("traced containment carries 39 sort + op(s)") and passes on the branch. The full PyAutoArray suite passes (1626). + - The autolens_workspace_test point-source `jax_likelihood` scripts ×4 print + likelihoods **identical to main**, for example `-83.38049777774609` (JIT), + `-82.33883111107943` and `-89.71129441664627`. `jax_grad/gradient.py` passes + all checks. + - The profiling `image_plane_solved` pin reads eager `7.743201200876817` / JIT + `7.743201200876812`, identical to main; laptop JIT 41.2 → 7.0 ms. +- **The ulp-coincident-vertex caveat did not materialise** on any control. The + plan flagged the risk that removing the dedup could change containment for + vertices shared between triangles. It cannot here, for three reasons: + 1. `jnp.unique` merged only bit-equal rows, and the flat table's duplicates of a + vertex are bit-equal. The deflection is a deterministic elementwise function, + so each copy traces to the same bits the merged row did. + 2. Rows that were only ulp-close were never merged in the first place. + 3. `Point.mask` is inclusive (`0 <= α, β, γ <= 1`), so a source exactly on a + shared edge or vertex is kept by every triangle touching it, with or without + dedup. + + The bit-identical positions and likelihoods on every instance are the direct + evidence. + +### Decision — ACCEPT + +The change is **repeatable and material, with no correctness or compile/memory +regression**. + +- **Repeatable and material.** On the quiet RAL node, the simple likelihood + falls 24.00 → 5.38 ms (**4.47×**, 90 % CI 4.37–4.57) and the two-source cluster + likelihood falls 155 → 78 ms (**1.98×**, CI 1.93–2.03). The laptop witness + reproduces the direction on a different CPU (6.0× / 2.3×). The observed + reductions are 78 % (simple) and 50 % (cluster) of the call, against a minimum + detectable improvement of 4.8 % and 13 % respectively. That is 16× and 4× the + noise floor, and every paired per-round ratio's p10 is ≥ 1.86. +- **Compile.** Compile time falls on every row because the programs are smaller + (HLO 28 583 → 24 404 lines on simple, 70 897 → 62 911 on cluster). On RAL, + simple solved goes 4.08 → 3.24 s (−20 %) and cluster solved 31.45 → 27.89 s + (−11 %). Lowering is 2.89 → 2.56 s and 43.1 → 42.0 s; first call is + 28.1 → 5.4 ms and 143 → 77 ms. +- **Memory.** Per-route peak memory is not recorded by this cell. The September + note measured XLA temp memory 5.20 → 4.58 MB (−12 %). Removing a 3N-row sort + and its gather cannot add live buffers, so no regression is expected; this is + not measured here. +- **GPU.** The GPU regression check for the shared library change is **still + owed** (completion evidence). It was not run in phase 2. + +### Post-fix budget and phase-3 handoff + +With the sort gone, the simple likelihood is **deflection-dominated**. + +- **FLOP shares (hardware-independent, same code as the research note §4).** + The bare deflections of one solve cost 2 916 501 (69 849 points) + 7 × 289 599 + (720 points) = 4.94M FLOP. That is **70 %** of nodedup's 7.05M. The remaining + ~2.1M FLOP is containment and tiling, the seven `f64[60]` `neighborhood` sorts, + β\*, the magnification filter and χ². +- **Time.** The research note's wall-clock deflection bound (≈ 6 ms, laptop, + loaded) exceeds the laptop nodedup call itself (5.34 ms). It is an inflated + upper value and is **not re-measured on RAL**. So the only budget claim made + here is the FLOP share. +- **Cluster.** The nodedup program still carries 139.4M FLOP. Its direct + deflections on the 276 507-point step-0 input remain an unmeasured control. +- **Duplicate `model_data` solve: XLA CSE confirmed on current code.** The + positions-only program (one `model_data` solve) is 15 529 212 FLOP, and the + full likelihood is 15 582 802. They differ by 53 590 FLOP (0.34 %), and the + gap is the same 53 590 on nodedup (6 999 844 vs 7 053 434). No second solve is + compiled, so Python caching would buy nothing at runtime. + +**Ranked phase-3/4 levers (proposed, none measured):** + +1. **Phase 3 — precompute the static initial lattice.** Build the step-0 unique + vertices and index map in NumPy at construction and pass them as immutable JAX + inputs. The step-0 trace would drop from 69 849 to 28 665 points on `simple`, + a deflection saving of about 1.56M FLOP (≈ 22 % of the nodedup call). It + scales with the cluster's 276 507-point input, where deflections dominate even + more. This is the natural successor now that the dynamic sort is gone. + - Report setup cost, memory and cache invalidation on geometry change. + - Never cache model-dependent deflections. + - The `constant_folding` flag A/B belongs here, because the step-0 lattice is + a compile-time constant. +2. **Phase 4(a) — grid-extent guidance.** The reported 100×100 → 30×30 extent cut + was 6.2× on the pre-fix code. After the fix it can act only on the 70 % + deflection share plus containment. It needs image-completeness evidence + across a prior. +3. **Phase 4(b) — initial scale versus steps.** Step 0 dominates the deflection + FLOPs (2.92M of 4.94M), and each extra step costs about 0.29M. +4. **Phase 4(c) — `MAX_CONTAINING_SIZE` / neighbourhood fan-out.** This acts only + on the 720-point steps and the `f64[60]` sorts, the smallest remaining share. + It is a correctness knob. +5. **Phase 4(d) — cluster dPIE/NFW deflections.** This is the likely residue at + cluster scale. It is a separately scoped PyAutoGalaxy phase. + +**The first phase-3 step:** once PyAutoArray `feature/point-source-cpu-p2` is +merged **and released**, and RAL's shared install is synced (`HPCPullPyAuto`): + +1. Re-run the phase-1 breakdown cells (`point_source` and `cluster` + `likelihood_breakdown/image_plane.py`) on RAL under a new label, so the README + dashboard rows move. Record the node's CPU model; see the cross-check. +2. Re-run this A/B cell. Its `library` route must then read + `library_matches: nodedup` (sort count 7 / 12). + +Only then measure the lattice precompute against that refreshed control. + +### Disposition changes (phase 2) + +The phase-1 checklist above is kept as written. These items change: + +- [x] **Remove the throwaway `jnp.unique` vertex dedup.** **Shipped (PyAutoArray + #568 branch) and measured.** RAL 4.47× simple / 1.98× cluster, bit-identical. + Awaiting merge and release, then the dashboard refresh (phase-3 first step). +- [x] **Duplicate `model_data` solve (XLA CSE).** **Verified in the fused program.** + Full-likelihood minus positions-only FLOPs is 53 590 (0.34 %) on both routes, + so no second solve is compiled. Python caching is not a performance fix; closed. +- [ ] **Fit / chi-squared, β\*, magnification filter share.** Re-ranked by FLOPs: + together with containment and the `neighborhood` sorts, they are the ≈ 30 % + non-deflection share of the post-fix call. They are not separated further, and + no lever is proposed. +- [ ] **Precompute static initial geometry.** Now **phase 3's lever**, because + deflections dominate (70 % of FLOPs). Proposed, not measured. +- [ ] **Step count, solver grid extent, `MAX_CONTAINING_SIZE`, cluster + deflections.** Unchanged: phase 4(b), 4(a), 4(c) and 4(d). +- [ ] **Unmeasured controls.** The fixed controls are now measured: vmap batch 4 + (2.63×) and scalar. Still open: vmap batches 1/16, the post-fix + grid/`n_steps`/capacity sweeps, the `constant_folding` flag A/B (moved to phase 3) + and direct deflections on the 276 507-point cluster input. +- [ ] **Numba / sparse rewrite.** Unchanged: not pursued. No substantial + unexplained bottleneck remains; the residue is deflections. +- [x] **Warm starts.** Unchanged: rejected. + +### Reproduce + +**Laptop witness.** Run from the profiling worktree. The bundle's `activate.sh` +puts the worktree PyAutoArray (the fix) on `PYTHONPATH`, so for a `library = control` +run, swap that entry for the canonical-main checkout: + +```bash +source ../activate.sh +export PYTHONPATH=${PYTHONPATH/\/PyAutoArray/\/array\/PyAutoArray} # pre-fix library +export OMP_NUM_THREADS=1 MKL_NUM_THREADS=1 OPENBLAS_NUM_THREADS=1 NPROC=8 +export JAX_PLATFORMS=cpu 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=/tmp/numba_cache MPLCONFIGDIR=/tmp/matplotlib +python3 -u scripts/point_source/likelihood_breakdown/vertex_dedup_ab.py --config-name local_cpu_fp64 +``` + +The cell injects both `control` and `nodedup`. Which library is installed only +changes what the `library` route labels itself as. + +**RAL.** The shared install stays on main; the cell injects both variants. + +```bash +ssh euclid_jump +cd /mnt/ral/jnightin/autolens_profiling && git fetch origin +git worktree add /mnt/ral/jnightin/autolens_profiling_wt/point-source-cpu-p2 feature/point-source-cpu-p2 +cd /mnt/ral/jnightin/autolens_profiling_wt/point-source-cpu-p2/hpc/batch_cpu +sinfo -p ral -N -o "%N %t %C %O" # ral must be idle; fallback: --partition=gpu, no --gres +sbatch submit_breakdown_point_source_vertex_dedup_ab_ral_cpu_fp64 +``` + +The submit is +[`hpc/batch_cpu/submit_breakdown_point_source_vertex_dedup_ab_ral_cpu_fp64`](../../hpc/batch_cpu/submit_breakdown_point_source_vertex_dedup_ab_ral_cpu_fp64). +It uses `ral`, 8 CPUs, a fresh per-job JAX cache, and prints provenance and +affinity. The absent `dataset/cluster/simple` is auto-simulated, as in phase 1. +Job 350582 produced: + +- [`results/breakdown/point_source/vertex_dedup_ab_hpc_ral_cpu_fp64.json`](../breakdown/point_source/vertex_dedup_ab_hpc_ral_cpu_fp64.json) and [`.png`](../breakdown/point_source/vertex_dedup_ab_hpc_ral_cpu_fp64.png) +- the job log [`point_source_cpu_2026_09_23_ral_job_350582_vertex_dedup_ab.out`](point_source_cpu_2026_09_23_ral_job_350582_vertex_dedup_ab.out) + (stderr held only the benign `No blurring_image provided` warning) + +The laptop witness is +[`vertex_dedup_ab_local_cpu_fp64.json`](../breakdown/point_source/vertex_dedup_ab_local_cpu_fp64.json) +and [`.png`](../breakdown/point_source/vertex_dedup_ab_local_cpu_fp64.png). +Library: PyAutoArray `feature/point-source-cpu-p2`, commits `273e152e` (fix) +and `25894d10` (tests), on `11b93476`. + +### Follow-ups found in phase 2 (not fixed) + +- **`jax.grad` of `AnalysisPoint` silently returns all zeros without + `autofit.jax.register_model(model)`.** The forward values are correct, and + this reproduces on PyAutoFit / PyAutoLens main. The A/B cell registers every + model before tracing, so its gradient gate is valid. A user calling `jax.grad` + directly gets zeros with no error. **This is a library issue candidate** + (PyAutoFit / PyAutoLens): raise or warn on an unregistered model. +- **The `library` route self-labels, so the cell is safe to re-run after + release.** Once the fix is installed it must read `library_matches: nodedup`. + A `control` reading on a released install means the install is stale. +- **The laptop JSON's provenance bodies are wrong** (see Environment). The cell + should capture `inspect.getsource` at import time, or hash the function's + bytecode, so that a mid-run edit cannot misrecord them. The JSON is left as + committed. +- **The cell does not record the XLA intra-op thread count or per-route + memory**; add both before the phase-3 run. It ran 5 calls per round, not the + planned ≥ 20. +- **Host pinning.** `ral` jobs land on different CPU models (Xeon 8490H in + phase 1, EPYC 7763 here). Future cross-phase comparisons need the same node or + an in-job control; consider `--nodelist` or a `--constraint` on the submits. +- **Still open from phase 1:** the `check_submits.py` `python3 -u` regex gap, + which also applies to this submit; the `activate.sh` worktree-leak guard + (this run swapped `PYTHONPATH` by hand again); and CI smoke coverage for the + breakdown cells, which now includes `vertex_dedup_ab.py`. +- **The GPU regression check** for the PyAutoArray change is still owed. + +--- ## Phase 3 — precompute static initial geometry — NOT STARTED -This phase runs only if deflections dominate after phase 2. It would build the +This phase runs only if deflections dominate after phase 2; they do (70 % of the post-fix FLOPs, see the phase-2 handoff). It would build the initial lattice's unique vertices and index map in NumPy at construction and reuse them as immutable JAX inputs, never caching model-dependent deflections. From c5f8ad3276aa65210a78aa8e36cb6588e73cfdb7 Mon Sep 17 00:00:00 2001 From: Jammy2211 Date: Thu, 24 Sep 2026 09:45:07 +0200 Subject: [PATCH 6/9] fix(profiling): capture vertex-dedup A/B body provenance at import time (#568) inspect.getsource at the end of a long run reads the file as it is then; the laptop witness, edited mid-run, recorded the wrong function texts. Capture text + a co_code/co_consts hash at import and refuse a text that is not the named function. Co-Authored-By: Claude Opus 5.5 --- .../likelihood_breakdown/vertex_dedup_ab.py | 37 ++++++++++++++++++- 1 file changed, 35 insertions(+), 2 deletions(-) diff --git a/scripts/point_source/likelihood_breakdown/vertex_dedup_ab.py b/scripts/point_source/likelihood_breakdown/vertex_dedup_ab.py index 94d4820c6..9ee00c408 100644 --- a/scripts/point_source/likelihood_breakdown/vertex_dedup_ab.py +++ b/scripts/point_source/likelihood_breakdown/vertex_dedup_ab.py @@ -266,6 +266,36 @@ def _nodedup_vertices_and_indices(self): } +def _body_provenance(fn) -> dict: + """Source text + bytecode hash of *fn*, captured NOW (at import). + + ``inspect.getsource`` reads the file through ``linecache`` using the code + object's line offsets. Called at the end of a long run, it reads whatever the + file holds *then*: the 2026-09-23 laptop witness, edited mid-run, recorded + ``_profiling_root`` and the control body under the wrong names. Capturing at + import pins the text to the file the interpreter compiled, and the + ``co_code`` / ``co_consts`` hash identifies the executed body independently + of any text. + """ + code = fn.__code__ + digest = hashlib.sha256(code.co_code + repr(code.co_consts).encode()).hexdigest()[:16] + source = inspect.getsource(fn) + if f"def {fn.__name__}(" not in source: + raise RuntimeError(f"getsource({fn.__name__}) returned another function's text") + return { + "name": fn.__name__, + "body": source, + "bytecode_sha256": digest, + "firstlineno": code.co_firstlineno, + } + + +_BODY_PROVENANCE = { + "control": _body_provenance(_control_vertices_and_indices), + "nodedup": _body_provenance(_nodedup_vertices_and_indices), +} + + @contextlib.contextmanager def route_injected(route: str): """Swap ``CoordinateArrayTriangles._vertices_and_indices`` for *route*. @@ -1064,9 +1094,12 @@ def _scrub(obj): "repo": "PyAutoArray", "sha": CONTROL_SOURCE_SHA, "path": "autoarray/structures/triangles/coordinate_array.py", - "body": inspect.getsource(_control_vertices_and_indices), + "body": _BODY_PROVENANCE["control"]["body"], + "bytecode_sha256": _BODY_PROVENANCE["control"]["bytecode_sha256"], }, - "nodedup_body": inspect.getsource(_nodedup_vertices_and_indices), + "nodedup_body": _BODY_PROVENANCE["nodedup"]["body"], + "nodedup_bytecode_sha256": _BODY_PROVENANCE["nodedup"]["bytecode_sha256"], + "body_provenance_captured": "import time (see _body_provenance)", "device": device, "jax_devices": [str(d) for d in jax.devices()], "machine": machine_info_dict(), From f8836b345bd66889e3113758eefe56b4baabe8ec Mon Sep 17 00:00:00 2001 From: Jammy2211 Date: Thu, 24 Sep 2026 09:45:07 +0200 Subject: [PATCH 7/9] feat(hpc): RAL A100 submit for the vertex-dedup GPU regression check (#568) Same interleaved control/nodedup/library A/B as the CPU submit, fp64, 20 rounds x 20 calls, JAX_PLATFORMS=cuda with a GPU-backend assertion, and the PyAutoArray feature-branch clone prepended to PYTHONPATH so the library route is the shipped fix. Co-Authored-By: Claude Opus 5.5 --- ...own_point_source_vertex_dedup_ab_a100_fp64 | 145 ++++++++++++++++++ 1 file changed, 145 insertions(+) create mode 100755 hpc/batch_gpu/submit_breakdown_point_source_vertex_dedup_ab_a100_fp64 diff --git a/hpc/batch_gpu/submit_breakdown_point_source_vertex_dedup_ab_a100_fp64 b/hpc/batch_gpu/submit_breakdown_point_source_vertex_dedup_ab_a100_fp64 new file mode 100755 index 000000000..39b504f55 --- /dev/null +++ b/hpc/batch_gpu/submit_breakdown_point_source_vertex_dedup_ab_a100_fp64 @@ -0,0 +1,145 @@ +#!/bin/bash -l +# +# 2026-09 point-source CPU speed-up campaign, phase 2: the GPU regression check +# for the vertex-dedup change (PyAutoArray#568). +# +# WHAT THIS MEASURES. The same interleaved, in-process A/B as the RAL CPU +# submit (hpc/batch_cpu/submit_breakdown_point_source_vertex_dedup_ab_ral_cpu_fp64), +# on ONE RAL A100: +# +# scripts/point_source/likelihood_breakdown/vertex_dedup_ab.py +# control = the PRE-fix jnp.unique(size=3N) body, carried verbatim in the +# cell (PyAutoArray main 11b93476); +# nodedup = the POST-fix body (flat 3N vertex table + arange index map); +# library = no substitution -- the PyAutoArray that is imported. HERE that +# is the FEATURE BRANCH clone (see LIBRARY below), so `library` +# is the shipped fix itself and must self-label +# library_matches = nodedup. +# Rows: simple solved + plain + vmap-4 of solved; cluster solved + plain. +# Protocol: 20 rounds x 20 calls (the #568 plan's >= 20 calls per round; the +# CPU run used 5), route order rotated each round, fixed-seed stream. +# Correctness gates (log L bit-identical, solved positions array_equal, +# simple-solved grad allclose 1e-10 + finite, vmap-vs-scalar parity) are +# recorded in the JSON's gate_summary. +# +# PRECISION. fp64 only. The PointSolver has no Settings mixed-precision switch +# (image_plane.py records the same), so there is no "mp" leg to run. +# +# LIBRARY. The shared /mnt/ral/jnightin/PyAuto mirror is PyAutoArray main +# (pre-fix). control/nodedup do not depend on it (the cell injects both), but +# to exercise the real branch code on GPU this submit PREPENDS a git clone of +# PyAutoArray feature/point-source-cpu-p2 to PYTHONPATH. Prepare it once: +# +# git clone --shared /mnt/ral/jnightin/PyAuto/PyAutoArray $AA_BRANCH_SRC +# git -C $AA_BRANCH_SRC fetch https://github.com/PyAutoLabs/PyAutoArray.git \ +# feature/point-source-cpu-p2 && git -C $AA_BRANCH_SRC checkout --detach FETCH_HEAD +# +# The job refuses to run if autoarray is not imported from that clone, and the +# JSON's source_revisions.PyAutoArray records its HEAD. +# +# 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" +# before running the cell. XLA_FLAGS are byte-identical to the CPU submit, so on +# this backend --xla_gpu_autotune_level=0 and triton_gemm=false are LIVE (they +# were inert on CPU); they apply identically to every route. + +# WALL-BASIS: +# RAL CPU job 350582 (EPYC 7763, 8 CPUs, 2026-09-23) ran this cell and +# protocol at 20 rounds x 5 calls in 628 s wall (the JSON's wall_s), almost all +# of it the 18 route compiles. 20 calls per round adds 4x the timed calls +# (sub-ms to tens of ms each on GPU) and GPU compiles of the ~70k-line cluster +# HLO may be slower than CPU; 3 h covers both with wide margin. +# cell: point_source/vertex_dedup_ab/simple device: gpu precision: fp64 +# source: measured-wall wall: 628 ref: ral-cpu-job-350582-vertex_dedup_ab_hpc_ral_cpu_fp64 headroom: 4.0 + +#SBATCH -J vertex_dedup_ab_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 + +# Repo root from where this was submitted (hpc/batch_gpu/../..), so it runs +# from a worktree of the feature branch. sbatch from inside hpc/batch_gpu/. +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_point-source-cpu-p2}" +if [ ! -f "$AA_BRANCH_SRC/autoarray/__init__.py" ]; then + echo "FATAL: AA_BRANCH_SRC=$AA_BRANCH_SRC is not a PyAutoArray checkout (see LIBRARY in the header)" >&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} +export MPLCONFIGDIR=/tmp/matplotlib_${SLURM_JOB_ID:-local} +mkdir -p "$NUMBA_CACHE_DIR" "$MPLCONFIGDIR" +# Fresh per-job JAX compile cache (see the CPU submit). Note `library` lowers to +# the nodedup program here, so it may hit nodedup's cache entry: its compile_s +# is not comparable, as control's was on CPU. +export JAX_COMPILATION_CACHE_DIR="$AP_ROOT/output/jax_cache/vertex_dedup_ab_gpu_${SLURM_JOB_ID:-local}" +rm -rf "$JAX_COMPILATION_CACHE_DIR" && mkdir -p "$JAX_COMPILATION_CACHE_DIR" +echo "JAX_COMPILATION_CACHE_DIR=$JAX_COMPILATION_CACHE_DIR (fresh)" + +echo "==========================================" +date +hostname +lscpu | grep 'Model name' || true +nvidia-smi --query-gpu=name,driver_version,memory.total,utilization.gpu --format=csv || true +echo "partition: ${SLURM_JOB_PARTITION:-unset}" +echo "gpus: ${CUDA_VISIBLE_DEVICES:-unset}" +echo "cpus-per-task: ${SLURM_CPUS_PER_TASK:-unset}" +echo "loadavg: $(cat /proc/loadavg)" +echo "Cell: point_source/likelihood_breakdown/vertex_dedup_ab" +echo "Precision: fp64 (JAX_ENABLE_X64=$JAX_ENABLE_X64)" +echo "Backend: JAX_PLATFORMS=$JAX_PLATFORMS JAX_PLATFORM_NAME=$JAX_PLATFORM_NAME" +echo "XLA_FLAGS: $XLA_FLAGS" + +echo "=== source revisions ===" +for r in PyAutoNerves PyAutoFit PyAutoArray PyAutoGalaxy PyAutoLens; do + printf '%-14s %s\n' "$r (shared)" "$(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)" +echo "AP_ROOT branch: $(git -C $AP_ROOT rev-parse --abbrev-ref HEAD 2>&1)" + +cd $AP_ROOT + +echo "=== import provenance + backend assertion ===" +python3 -c " +import os, autoarray, autolens, autofit, autogalaxy, jax +print('autoarray.__file__ =', autoarray.__file__) +print('autolens.__file__ =', autolens.__file__) +print('autofit.__file__ =', autofit.__file__) +print('jax.__version__ =', jax.__version__) +print('jax devices =', jax.devices()) +print('jax default backend =', jax.default_backend()) +assert jax.default_backend() == 'gpu', 'JAX is not on the GPU' +assert os.path.realpath(autoarray.__file__).startswith(os.path.realpath(os.environ['AA_BRANCH_SRC'])), 'autoarray not imported from the branch clone' +print('ASSERT OK: GPU backend, autoarray from the branch clone') +" + +echo "==========================================" +echo "vertex-dedup A/B on A100: control vs nodedup vs library (simple + cluster, 20 x 20)" +date +python3 -u scripts/point_source/likelihood_breakdown/vertex_dedup_ab.py --config-name hpc_ral_a100_fp64 --rounds 20 --calls 20 + +echo "==========================================" +nvidia-smi --query-gpu=name,memory.used --format=csv || true +echo "Finished." +date From 47510db69c923fbfe93d8f3e2dd87e4147409738 Mon Sep 17 00:00:00 2001 From: Jammy2211 Date: Thu, 24 Sep 2026 10:04:55 +0200 Subject: [PATCH 8/9] results(profiling): RAL A100 fp64 vertex-dedup A/B rows, job 350587 (#568) GPU regression check: nodedup 1.71-2.05x faster than control on every row, library (branch PyAutoArray 25894d10) matches nodedup, all gates bit-identical, gradients non-zero. Co-Authored-By: Claude Opus 5.5 --- .../vertex_dedup_ab_hpc_ral_a100_fp64.json | 10087 ++++++++++++++++ .../vertex_dedup_ab_hpc_ral_a100_fp64.png | Bin 0 -> 119260 bytes ...24_ral_job_350587_vertex_dedup_ab_a100.out | 119 + 3 files changed, 10206 insertions(+) create mode 100644 results/breakdown/point_source/vertex_dedup_ab_hpc_ral_a100_fp64.json create mode 100644 results/breakdown/point_source/vertex_dedup_ab_hpc_ral_a100_fp64.png create mode 100644 results/notes/point_source_cpu_2026_09_24_ral_job_350587_vertex_dedup_ab_a100.out diff --git a/results/breakdown/point_source/vertex_dedup_ab_hpc_ral_a100_fp64.json b/results/breakdown/point_source/vertex_dedup_ab_hpc_ral_a100_fp64.json new file mode 100644 index 000000000..25509164c --- /dev/null +++ b/results/breakdown/point_source/vertex_dedup_ab_hpc_ral_a100_fp64.json @@ -0,0 +1,10087 @@ +{ + "cell": "vertex_dedup_ab", + "issue": "PyAutoLabs/PyAutoArray#568", + "config_name": "hpc_ral_a100_fp64", + "quick": false, + "models": [ + "simple", + "cluster" + ], + "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": "f8836b345bd66889e3113758eefe56b4baabe8ec", + "PyAutoNerves": "1fa613aa8d89a79613009fb66f5b4e2d21deb57a", + "PyAutoFit": "a736840127be7a3c21e15a5c945e94d8f1082983", + "PyAutoArray": "25894d10a7497d1efa6bc140032dba2f49d1795f", + "PyAutoGalaxy": "70a61e26cd715cefe7012a38285698091246a8a4", + "PyAutoLens": "2aaa1c1a8bb4a5923edf30a18451fcea330a6bd4" + }, + "autoarray_imported_from": "/mnt/ral/jnightin/autolens_profiling_wt/PyAutoArray_point-source-cpu-p2", + "target": "autoarray.structures.triangles.coordinate_array.CoordinateArrayTriangles._vertices_and_indices", + "control_source": { + "repo": "PyAutoArray", + "sha": "11b93476", + "path": "autoarray/structures/triangles/coordinate_array.py", + "body": "def _control_vertices_and_indices(self):\n \"\"\"PRE-fix ``_vertices_and_indices`` \u2014 verbatim from PyAutoArray ``11b93476``.\"\"\"\n import jax.numpy as jnp\n\n flat_triangles = self.triangles.reshape(-1, 2)\n vertices, inverse_indices = jnp.unique(\n flat_triangles,\n axis=0,\n return_inverse=True,\n size=3 * self.coordinates.shape[0],\n equal_nan=True,\n fill_value=jnp.nan,\n )\n\n nan_mask = jnp.isnan(vertices).any(axis=1)\n inverse_indices = jnp.where(nan_mask[inverse_indices], -1, inverse_indices)\n\n indices = inverse_indices.reshape(-1, 3)\n return vertices, indices\n", + "bytecode_sha256": "8abe1a83fb00257c" + }, + "nodedup_body": "def _nodedup_vertices_and_indices(self):\n \"\"\"POST-fix ``_vertices_and_indices``: the flat 3N table and an ``arange`` index map.\"\"\"\n import jax.numpy as jnp\n\n flat = self.triangles.reshape(-1, 2)\n indices = jnp.arange(flat.shape[0]).reshape(-1, 3)\n return flat, indices\n", + "nodedup_bytecode_sha256": "b71cfb285a8d13c2", + "body_provenance_captured": "import time (see _body_provenance)", + "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": "/vertex_dedup_ab_gpu_350587", + "autotune_cache_entries_at_start": 0, + "cache_fresh": true, + "nvidia_smi": "NVIDIA A100 80GB PCIe, 559 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": "928298232 kB", + "kernel": "5.14.0-687.39.1.el9_8.x86_64", + "platform": "Linux-5.14.0-687.39.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.44, + 0.11, + 0.04 + ], + "loadavg_end": [ + 1.55, + 1.57, + 0.95 + ], + "protocol": { + "routes": [ + "control", + "nodedup", + "library" + ], + "n_rounds": 20, + "n_calls_per_round": 20, + "n_warm": 3, + "n_stream": 16, + "n_gate_instances": 3, + "vmap_batch": 4, + "instance_seed": 568, + "instance_stream": "entry 0 = prior medians; rest = vector_from_unit_vector(U(0.25,0.75))", + "argument": "physical parameter vector; instance_from_vector(xp=jnp) inside the trace", + "cache_trap_guard": "fresh closure + fresh solver/analyses per route; jax.clear_caches()", + "bootstrap": { + "samples": 2000, + "seed": 12345, + "interval": "90%" + }, + "cluster_gates": "log-likelihood and positions only (no cluster grad/vmap)", + "pytrees": "autofit.jax.register_model(model) for every model before any trace" + }, + "free_parameters": { + "simple_solved": 5, + "simple_plain": 8, + "cluster_solved": 13, + "cluster_plain": 17 + }, + "model_configuration": { + "simple": { + "dataset": "dataset/point_source/simple/point_dataset_positions_only.json", + "solver_grid_shape": [ + 100, + 100 + ], + "solver_grid_pixel_scale": 0.2, + "solver_pixel_scale_precision": 0.001, + "magnification_threshold": 0.1, + "likelihoods": { + "solved": "FitPositionsImagePairAllSolved", + "plain": "FitPositionsImagePairAll" + } + }, + "cluster": { + "dataset": "dataset/cluster/simple/point_datasets.csv", + "n_systems": 2, + "n_mass_profiles": 13, + "solver_grid_shape": [ + 200, + 200 + ], + "solver_grid_pixel_scale": 0.7, + "solver_pixel_scale_precision": 0.01, + "source_centres_from": "back-traced observed-image centroids (cluster cell step 1)", + "likelihoods": { + "solved": "FitPositionsImagePairRepeatSolved (summed over systems)", + "plain": "FitPositionsImagePairRepeat (summed over systems)" + } + } + }, + "library_label": { + "per_row": { + "simple_solved": { + "hlo_sort_count": { + "control": 15, + "nodedup": 7, + "library": 7 + }, + "stablehlo_sort_count": { + "control": 3, + "nodedup": 1, + "library": 1 + }, + "library_matches": "nodedup", + "library_hlo_identical_to": [ + "nodedup" + ] + }, + "simple_solved_vmap4": { + "hlo_sort_count": { + "control": 15, + "nodedup": 7, + "library": 7 + }, + "stablehlo_sort_count": { + "control": 3, + "nodedup": 1, + "library": 1 + }, + "library_matches": "nodedup", + "library_hlo_identical_to": [ + "nodedup" + ] + }, + "simple_plain": { + "hlo_sort_count": { + "control": 15, + "nodedup": 7, + "library": 7 + }, + "stablehlo_sort_count": { + "control": 3, + "nodedup": 1, + "library": 1 + }, + "library_matches": "nodedup", + "library_hlo_identical_to": [ + "nodedup" + ] + }, + "cluster_solved": { + "hlo_sort_count": { + "control": 25, + "nodedup": 12, + "library": 12 + }, + "stablehlo_sort_count": { + "control": 3, + "nodedup": 1, + "library": 1 + }, + "library_matches": "nodedup", + "library_hlo_identical_to": [ + "nodedup" + ] + }, + "cluster_plain": { + "hlo_sort_count": { + "control": 25, + "nodedup": 12, + "library": 12 + }, + "stablehlo_sort_count": { + "control": 3, + "nodedup": 1, + "library": 1 + }, + "library_matches": "nodedup", + "library_hlo_identical_to": [ + "nodedup" + ] + } + }, + "library_matches": "nodedup" + }, + "library_matches": "nodedup", + "bit_identical": true, + "gate_summary": { + "simple_solved.log_likelihood.control_vs_nodedup": { + "pass": true, + "max_abs_delta": 0.0, + "max_rel_delta": 0.0 + }, + "simple_solved.log_likelihood.control_vs_library": { + "pass": true, + "max_abs_delta": 0.0, + "max_rel_delta": 0.0 + }, + "simple_solved_vmap4.log_likelihood.control_vs_nodedup": { + "pass": true, + "max_abs_delta": 0.0, + "max_rel_delta": 0.0 + }, + "simple_solved_vmap4.log_likelihood.control_vs_library": { + "pass": true, + "max_abs_delta": 0.0, + "max_rel_delta": 0.0 + }, + "simple_plain.log_likelihood.control_vs_nodedup": { + "pass": true, + "max_abs_delta": 0.0, + "max_rel_delta": 0.0 + }, + "simple_plain.log_likelihood.control_vs_library": { + "pass": true, + "max_abs_delta": 0.0, + "max_rel_delta": 0.0 + }, + "cluster_solved.log_likelihood.control_vs_nodedup": { + "pass": true, + "max_abs_delta": 0.0, + "max_rel_delta": 0.0 + }, + "cluster_solved.log_likelihood.control_vs_library": { + "pass": true, + "max_abs_delta": 0.0, + "max_rel_delta": 0.0 + }, + "cluster_plain.log_likelihood.control_vs_nodedup": { + "pass": true, + "max_abs_delta": 0.0, + "max_rel_delta": 0.0 + }, + "cluster_plain.log_likelihood.control_vs_library": { + "pass": true, + "max_abs_delta": 0.0, + "max_rel_delta": 0.0 + }, + "simple_solved_positions.control_vs_nodedup": { + "pass": true, + "max_abs_delta": 0.0 + }, + "simple_solved_positions.control_vs_library": { + "pass": true, + "max_abs_delta": 0.0 + }, + "simple_solved_grad.control_vs_nodedup": { + "pass": true, + "bit_identical": true, + "max_abs_delta": 0.0, + "max_rel_delta": 0.0 + }, + "simple_solved_grad.control_vs_library": { + "pass": true, + "bit_identical": true, + "max_abs_delta": 0.0, + "max_rel_delta": 0.0 + }, + "simple_solved_vmap4.vmap_vs_scalar.control": { + "pass": true, + "bit_identical": true, + "max_abs_delta": 0.0 + }, + "simple_solved_vmap4.vmap_vs_scalar.nodedup": { + "pass": true, + "bit_identical": true, + "max_abs_delta": 0.0 + }, + "simple_solved_vmap4.vmap_vs_scalar.library": { + "pass": true, + "bit_identical": true, + "max_abs_delta": 0.0 + }, + "cluster_solved_positions.control_vs_nodedup": { + "pass": true, + "max_abs_delta": 0.0 + }, + "cluster_solved_positions.control_vs_library": { + "pass": true, + "max_abs_delta": 0.0 + } + }, + "rows": { + "simple_solved": { + "label": "simple_solved", + "batch": null, + "n_rounds": 20, + "n_calls_per_round": 20, + "n_warm": 3, + "route_order": "round-robin, start rotated each round", + "per_call_ms": { + "control": [ + 1.8514469265937805, + 1.7804191447794437, + 1.7864187248051167, + 1.8219579942524433, + 1.8367478623986244, + 1.8132580444216728, + 1.7756680026650429, + 1.7799781635403633, + 1.8476280383765697, + 1.8010679632425308, + 1.7800088971853256, + 1.791507937014103, + 1.7932192422449589, + 1.8110782839357853, + 1.7936388030648232, + 1.753218937665224, + 1.747368834912777, + 1.7843982204794884, + 1.7971880733966827, + 1.7704982310533524, + 2.2279727272689342, + 1.7200680449604988, + 1.7144293524324894, + 1.7090789042413235, + 1.7118589021265507, + 1.7083389684557915, + 1.6985698603093624, + 1.694168895483017, + 1.692960038781166, + 1.709240023046732, + 1.709850039333105, + 1.6958587802946568, + 1.6996399499475956, + 1.702168956398964, + 1.7004599794745445, + 1.7031398601830006, + 1.7037601210176945, + 1.7066285945475101, + 1.6977502964437008, + 1.699178945273161, + 1.7546368762850761, + 1.764007844030857, + 1.714108046144247, + 1.7097690142691135, + 1.7243986949324608, + 1.7008399590849876, + 1.6999198123812675, + 1.7066900618374348, + 1.6985898837447166, + 1.7007100395858288, + 1.7011100426316261, + 1.7033587209880352, + 1.6974098980426788, + 1.7131590284407139, + 1.6993400640785694, + 1.7033587209880352, + 1.7003901302814484, + 1.6989889554679394, + 1.7573894001543522, + 1.756239216774702, + 1.6725598834455013, + 1.6851592808961868, + 1.6776197589933872, + 1.6775098629295826, + 1.6748299822211266, + 1.6729198396205902, + 1.7000301741063595, + 1.7114686779677868, + 1.7137699760496616, + 1.7000390216708183, + 1.7372691072523594, + 1.7394288443028927, + 1.7367289401590824, + 1.7051491886377335, + 1.7048600129783154, + 1.704028807580471, + 1.6970690339803696, + 1.7049298621714115, + 1.699408981949091, + 1.697469037026167, + 1.7168992199003696, + 1.6989288851618767, + 1.6957703046500683, + 1.6950489953160286, + 1.6938187181949615, + 1.6956501640379429, + 1.6955803148448467, + 1.6958690248429775, + 1.6984697431325912, + 1.6968999989330769, + 1.6943099908530712, + 1.696030143648386, + 1.69305969029665, + 1.69431883841753, + 1.694429200142622, + 1.7203688621520996, + 1.7448891885578632, + 1.750569324940443, + 1.7284988425672054, + 1.7489590682089329, + 1.6878796741366386, + 1.6919500194489956, + 1.6926289536058903, + 1.6907299868762493, + 1.6864798963069916, + 1.7074891366064548, + 1.7065401189029217, + 1.7047696746885777, + 1.7239791341125965, + 1.6983202658593655, + 1.707639079540968, + 1.6961400397121906, + 1.6955891624093056, + 1.6992287710309029, + 1.6989102587103844, + 1.6986289992928505, + 1.6909101977944374, + 1.7038392834365368, + 1.7001498490571976, + 1.69774005189538, + 1.7396691255271435, + 1.7026402056217194, + 1.694700215011835, + 1.7037796787917614, + 1.7007696442306042, + 1.7062891274690628, + 1.7012995667755604, + 1.7047300934791565, + 1.703748945146799, + 1.7056399956345558, + 1.7024790868163109, + 1.7026602290570736, + 1.6934988088905811, + 1.6972492448985577, + 1.6973400488495827, + 1.7022788524627686, + 1.7017200589179993, + 1.6949102282524109, + 1.6984189860522747, + 1.6969600692391396, + 1.6974089667201042, + 1.6890494152903557, + 1.6779289580881596, + 1.6818386502563953, + 1.6825180500745773, + 1.6749287024140358, + 1.684639137238264, + 1.670838799327612, + 1.6919979825615883, + 1.689189113676548, + 1.6791382804512978, + 1.6935388557612896, + 1.6798288561403751, + 1.6750483773648739, + 1.6723787412047386, + 1.6952292062342167, + 1.697239000350237, + 1.6968087293207645, + 1.7046085558831692, + 1.7012199386954308, + 1.6632797196507454, + 1.6755498945713043, + 1.6695302911102772, + 1.6737999394536018, + 1.6675898805260658, + 1.6748798079788685, + 1.6777901910245419, + 1.6762800514698029, + 1.6988092102110386, + 1.6999002546072006, + 1.700070220977068, + 1.6964790411293507, + 1.702548936009407, + 1.6964389942586422, + 1.693699974566698, + 1.6971388831734657, + 1.7009503208100796, + 1.701320055872202, + 1.7050993628799915, + 1.7104102298617363, + 1.7075389623641968, + 1.7029102891683578, + 1.6972189769148827, + 1.7000092193484306, + 1.706660259515047, + 1.7049992457032204, + 1.705380156636238, + 1.7087487503886223, + 1.7147487960755825, + 1.697929110378027, + 1.701799686998129, + 1.6978890635073185, + 1.69669883325696, + 1.6952697187662125, + 1.6942089423537254, + 1.7041303217411041, + 1.7021102830767632, + 1.6925092786550522, + 1.6965800896286964, + 1.6984599642455578, + 1.6969582065939903, + 1.6679586842656136, + 1.6709091141819954, + 1.6672187484800816, + 1.6673789359629154, + 1.6690492630004883, + 1.6721086576581001, + 1.6824188642203808, + 1.6781389713287354, + 1.6629588790237904, + 1.661451067775488, + 1.6700699925422668, + 1.6649500466883183, + 1.6631600446999073, + 1.6716700047254562, + 1.6630501486361027, + 1.6729999333620071, + 1.6806889325380325, + 1.6845199279487133, + 1.686879899352789, + 1.6815299168229103, + 1.681949943304062, + 1.6803201287984848, + 1.679929904639721, + 1.686709001660347, + 1.6729803755879402, + 1.6887797974050045, + 1.6953288577497005, + 1.695989165455103, + 1.7076400108635426, + 1.6974699683487415, + 1.7790687270462513, + 1.6856100410223007, + 1.6868598759174347, + 1.6803997568786144, + 1.6789697110652924, + 1.6777501441538334, + 1.6768700443208218, + 1.681529451161623, + 1.7083198763430119, + 1.686010044068098, + 1.6950489953160286, + 1.6951300203800201, + 1.6933702863752842, + 1.6858801245689392, + 1.686139963567257, + 1.6898796893656254, + 1.680249348282814, + 1.6880887560546398, + 1.6874992288649082, + 1.6834591515362263, + 1.6846777871251106, + 1.691548153758049, + 1.6850992105901241, + 1.6891080886125565, + 1.6902079805731773, + 1.69310811907053, + 1.6920682974159718, + 1.7013680189847946, + 1.6925190575420856, + 1.7174500972032547, + 1.7016599886119366, + 1.6931099817156792, + 1.688309945166111, + 1.6900203190743923, + 1.6836789436638355, + 1.69373769313097, + 1.6870582476258278, + 1.6627190634608269, + 1.6690688207745552, + 1.6685491427779198, + 1.6783089376986027, + 1.7086579464375973, + 3.4937672317028046, + 1.797687727957964, + 1.7435187473893166, + 1.7367778345942497, + 1.7341980710625648, + 1.7563281580805779, + 1.7327680252492428, + 1.676460262387991, + 1.6840100288391113, + 1.691920217126608, + 1.685979776084423, + 1.683490350842476, + 1.6769389621913433, + 1.6956301406025887, + 1.698970329016447, + 1.695448998361826, + 1.6877385787665844, + 1.6930191777646542, + 1.7149890772998333, + 1.7015491612255573, + 1.700409222394228, + 1.6740676946938038, + 1.6715992242097855, + 1.6853781417012215, + 1.6981177031993866, + 1.6758390702307224, + 1.6998592764139175, + 1.6833697445690632, + 1.6860999166965485, + 1.691840123385191, + 1.6820398159325123, + 1.6810698434710503, + 1.6808593645691872, + 1.7592390067875385, + 1.679839100688696, + 1.6791797243058681, + 1.699579879641533, + 1.6827299259603024, + 1.6910098493099213, + 1.7003295943140984, + 1.680589746683836, + 1.6845399513840675, + 1.672539860010147, + 1.6796202398836613, + 1.6787699423730373, + 1.681789755821228, + 1.7023500986397266, + 1.7122882418334484, + 1.697308849543333, + 1.6901488415896893, + 1.6904580406844616, + 1.6859378665685654, + 1.6873679123818874, + 1.6637789085507393, + 1.663960050791502, + 1.6672201454639435, + 1.6695098020136356, + 1.6676010563969612, + 1.6628596931695938, + 1.6616899520158768, + 1.6712597571313381, + 1.672541256994009, + 1.6802400350570679, + 1.6691600903868675, + 1.6745002940297127, + 1.674829050898552, + 1.6883299686014652, + 1.6792500391602516, + 1.6727400943636894, + 1.669599674642086, + 1.6723498702049255, + 1.669350080192089, + 1.670120283961296, + 1.6713901422917843, + 1.684579998254776, + 1.6792803071439266, + 1.6695503145456314, + 1.6708900220692158, + 1.669580116868019, + 1.6734199598431587, + 1.6737901605665684, + 1.6712788492441177, + 1.674158964306116, + 1.667299773544073, + 1.682950183749199, + 1.6883197240531445, + 1.677749678492546, + 1.6860389150679111, + 1.6852892003953457, + 1.6807089559733868, + 1.6802391037344933, + 1.6757287085056305, + 1.7069089226424694, + 1.7020287923514843, + 1.7043990083038807, + 1.69327761977911, + 1.6940180212259293, + 1.7029889859259129, + 1.7003589309751987, + 1.6808491200208664, + 1.6882792115211487, + 1.6930392012000084, + 1.684409100562334, + 1.6919788904488087, + 1.719208899885416, + 1.7117899842560291, + 1.7143189907073975, + 1.6920804046094418, + 1.674520317465067, + 1.6693202778697014, + 1.6727698966860771, + 1.6759103164076805, + 1.67797040194273, + 1.6838503070175648, + 1.674099825322628, + 1.6794693656265736, + 1.6911192797124386, + 1.6908389516174793, + 1.6911099664866924, + 1.6990001313388348, + 1.7047193832695484, + 1.700528897345066, + 1.698439009487629, + 1.6950499266386032, + 1.6911798156797886, + 1.6865902580320835, + 1.6861287876963615 + ], + "nodedup": [ + 0.9183892980217934, + 0.9192894212901592, + 0.8992389775812626, + 0.8764700032770634, + 0.892919022589922, + 0.8670799434185028, + 0.8885799907147884, + 0.8767391555011272, + 0.8754800073802471, + 0.8695889264345169, + 0.8718702010810375, + 0.8868789300322533, + 0.8747493848204613, + 0.8748997934162617, + 0.8970280177891254, + 0.8713393472135067, + 0.886780209839344, + 0.8638291619718075, + 0.8688997477293015, + 0.8719190955162048, + 0.8896593935787678, + 1.3450440019369125, + 0.9422888979315758, + 0.9228982962667942, + 0.9601479396224022, + 0.9080097079277039, + 0.9166980162262917, + 0.9020897559821606, + 0.9244089014828205, + 0.9169387631118298, + 0.9134188294410706, + 0.9039188735187054, + 0.9245681576430798, + 0.9079198352992535, + 0.901529099792242, + 0.9217597544193268, + 0.8988990448415279, + 0.9182780049741268, + 0.8937199600040913, + 0.8967788890004158, + 0.8969497866928577, + 0.8566388860344887, + 0.8571399375796318, + 0.854788813740015, + 0.8783498778939247, + 0.8685998618602753, + 0.8628792129456997, + 0.8606403134763241, + 0.8589900098741055, + 0.8525000885128975, + 0.8564391173422337, + 0.8454201743006706, + 0.8359807543456554, + 0.8393600583076477, + 0.8395202457904816, + 0.8320203050971031, + 0.8563189767301083, + 0.8414210751652718, + 0.8267685770988464, + 0.8373898454010487, + 0.8623301982879639, + 0.8573690429329872, + 0.8520199917256832, + 0.8545191958546638, + 0.8774190209805965, + 0.8628908544778824, + 0.8234302513301373, + 0.841749832034111, + 0.8296500891447067, + 0.830451026558876, + 0.8548786863684654, + 0.837668776512146, + 0.8403700776398182, + 0.833430327475071, + 0.8293809369206429, + 0.8307588286697865, + 0.831100158393383, + 0.8511198684573174, + 0.8421586826443672, + 0.8345711976289749, + 0.8178488351404667, + 0.8422001264989376, + 0.8495696820318699, + 0.8289488032460213, + 0.8183210156857967, + 0.8297301828861237, + 0.8224812336266041, + 0.8177203126251698, + 0.8269012905657291, + 0.8587101474404335, + 0.8459193632006645, + 0.8342904038727283, + 0.8235401473939419, + 0.8178809657692909, + 0.819929875433445, + 0.8256006985902786, + 0.8158995769917965, + 0.821160152554512, + 0.8401493541896343, + 0.8453191258013248, + 0.8789696730673313, + 0.8610589429736137, + 0.8761798962950706, + 0.8602989837527275, + 0.8571688085794449, + 0.8539510890841484, + 0.8592088706791401, + 0.8734599687159061, + 0.8635190315544605, + 0.859919935464859, + 0.8684899657964706, + 0.8559189736843109, + 0.8625499904155731, + 0.8806088007986546, + 0.8761491626501083, + 0.856960192322731, + 0.8555189706385136, + 0.8593997918069363, + 0.8759386837482452, + 0.8671688847243786, + 0.8613001555204391, + 0.8866190910339355, + 0.8662291802465916, + 0.8557001128792763, + 0.8510989136993885, + 0.8508102037012577, + 0.875519122928381, + 0.87008997797966, + 0.8586402982473373, + 0.8809692226350307, + 0.8530500344932079, + 0.8555697277188301, + 0.880110077559948, + 0.8561103604733944, + 0.83498889580369, + 0.8343011140823364, + 0.83590904250741, + 0.8319509215652943, + 0.8527790196239948, + 0.8357707411050797, + 0.829590018838644, + 0.8314400911331177, + 0.8324398659169674, + 0.8325707167387009, + 0.8650892414152622, + 0.837820116430521, + 0.8708792738616467, + 0.8475598879158497, + 0.8333399891853333, + 0.8348096162080765, + 0.8581099100410938, + 0.83933025598526, + 0.8330699056386948, + 0.8408897556364536, + 0.8312701247632504, + 0.8310801349580288, + 0.8600191213190556, + 0.8410611189901829, + 0.8528889156877995, + 0.8394899778068066, + 0.8919499814510345, + 0.9023980237543583, + 0.8803396485745907, + 0.8687288500368595, + 0.8553089573979378, + 0.8816900663077831, + 0.8552493527531624, + 0.877810176461935, + 0.8732788264751434, + 0.8556093089282513, + 0.8633998222649097, + 0.8594891987740993, + 0.8601201698184013, + 0.8859089575707912, + 0.8856100030243397, + 0.8746189996600151, + 0.8545597083866596, + 0.8604503236711025, + 0.8820588700473309, + 0.8708597160875797, + 0.8560302667319775, + 0.8920389227569103, + 0.8658901788294315, + 0.8540088310837746, + 0.8580498397350311, + 0.8621299639344215, + 0.8773691952228546, + 0.8588498458266258, + 0.8502686396241188, + 0.8868989534676075, + 0.8537699468433857, + 0.8734087459743023, + 0.8627111092209816, + 0.8470290340483189, + 0.8481689728796482, + 0.8497606031596661, + 0.8565094321966171, + 0.8488600142300129, + 0.8418592624366283, + 0.8355309255421162, + 0.8219410665333271, + 0.8449689485132694, + 0.8310298435389996, + 0.8216002024710178, + 0.8209198713302612, + 0.8286787196993828, + 0.8310289122164249, + 0.8271900005638599, + 0.8434997871518135, + 0.8443109691143036, + 0.8354890160262585, + 0.8241110481321812, + 0.8289390243589878, + 0.8233389817178249, + 0.8260402828454971, + 0.8218889124691486, + 0.8451309986412525, + 0.8500791154801846, + 0.8277911692857742, + 0.8188299834728241, + 0.8677798323333263, + 0.8759992197155952, + 0.8519492112100124, + 0.8543799631297588, + 0.8452390320599079, + 0.8538011461496353, + 0.8328389376401901, + 0.832471065223217, + 0.8202590979635715, + 0.8245492354035378, + 0.8212090469896793, + 0.8223690092563629, + 0.8232099935412407, + 0.8422289974987507, + 0.8330107666552067, + 0.8188290521502495, + 0.8200099691748619, + 0.8216598071157932, + 0.8279299363493919, + 0.8273608982563019, + 0.8746488019824028, + 0.8488497696816921, + 0.8562589064240456, + 0.8376403711736202, + 0.825089868158102, + 0.825521070510149, + 0.8276090957224369, + 0.8287890814244747, + 0.8370899595320225, + 0.8486500009894371, + 0.8491501212120056, + 0.8364901877939701, + 0.8378010243177414, + 0.8260593749582767, + 0.8276887238025665, + 0.8249087259173393, + 0.8289790712296963, + 0.8423700928688049, + 0.8481401018798351, + 0.8300100453197956, + 0.8254796266555786, + 0.8541601710021496, + 0.8402210660278797, + 0.8284291252493858, + 0.8307211101055145, + 0.8218097500503063, + 0.8259601891040802, + 0.8235806599259377, + 0.8404399268329144, + 0.8505298756062984, + 0.8370098657906055, + 0.8429298177361488, + 0.8290600962936878, + 0.8210898377001286, + 0.833089929074049, + 0.8313101716339588, + 0.8451100438833237, + 0.839918851852417, + 0.8411011658608913, + 0.8237389847636223, + 1.1784550733864307, + 0.8430401794612408, + 0.8414192125201225, + 0.835150945931673, + 0.8380087092518806, + 0.8346396498382092, + 0.8346713148057461, + 0.8586687035858631, + 0.8493200875818729, + 0.8366703987121582, + 0.8348100818693638, + 0.8381488732993603, + 0.8288896642625332, + 0.837419182062149, + 0.8282889612019062, + 0.8544502779841423, + 0.8604489266872406, + 0.8502509444952011, + 0.8315886370837688, + 0.8327499963343143, + 0.8502188138663769, + 0.8557802066206932, + 0.8569890633225441, + 0.8568302728235722, + 0.8521797135472298, + 0.8502588607370853, + 0.8434299379587173, + 0.8535790257155895, + 0.8345008827745914, + 0.8362201042473316, + 0.8270107209682465, + 0.823410227894783, + 0.8362689986824989, + 0.8471696637570858, + 0.8434387855231762, + 0.8344310335814953, + 0.8312901481986046, + 0.8309506811201572, + 0.825089868158102, + 0.8281311020255089, + 0.8658901788294315, + 0.8652391843497753, + 0.9541492909193039, + 0.832738820463419, + 0.8268388919532299, + 0.849009957164526, + 0.8539799600839615, + 0.8381796069443226, + 0.836959108710289, + 0.8341209031641483, + 0.8240300230681896, + 0.8215708658099174, + 0.8276300504803658, + 0.8482690900564194, + 0.8544200100004673, + 0.8331499993801117, + 0.8384501561522484, + 0.8293800055980682, + 0.8285008370876312, + 0.8236500434577465, + 0.8528400212526321, + 0.8285087533295155, + 0.8308109827339649, + 0.855869147926569, + 1.0908371768891811, + 0.8497699163854122, + 0.8248290978372097, + 0.8311313576996326, + 0.8266298100352287, + 0.8276998996734619, + 0.8330587297677994, + 0.8498090319335461, + 0.8397810161113739, + 0.8360599167644978, + 0.8304798975586891, + 0.8343998342752457, + 0.8304310031235218, + 0.8288901299238205, + 0.8269599638879299, + 0.8488991297781467, + 0.8470499888062477, + 0.8473293855786324, + 0.8329791016876698, + 0.8355798199772835, + 0.8255401626229286, + 0.8293907158076763, + 0.8267001248896122, + 0.8286098018288612, + 0.8398192003369331, + 0.8460390381515026, + 0.8396212942898273, + 0.828069169074297, + 0.8262703195214272, + 0.8275089785456657, + 0.8247899822890759, + 0.8299793116748333, + 0.8256402797996998, + 0.8481889963150024, + 0.8415002375841141, + 0.8459300734102726, + 0.827339943498373, + 0.8252211846411228, + 0.8251797407865524, + 0.821530818939209, + 0.8466802537441254, + 0.8348789997398853, + 0.8231210522353649, + 0.8306298404932022, + 0.8274703286588192, + 0.8276286534965038, + 0.8204011246562004, + 0.8321097120642662, + 0.8562086150050163, + 0.8404012769460678, + 0.8247401565313339, + 0.8258200250566006, + 0.8294600993394852, + 0.8257310837507248, + 0.8257497102022171, + 0.8247806690633297 + ], + "library": [ + 0.8716280572116375, + 0.8287010714411736, + 0.8254796266555786, + 0.8133011870086193, + 0.8110101334750652, + 0.8195908740162849, + 0.8171601220965385, + 0.8263899944722652, + 0.8230991661548615, + 0.8203098550438881, + 0.8366690017282963, + 0.8245292119681835, + 0.834289938211441, + 0.8135698735713959, + 0.8163200691342354, + 0.8215988054871559, + 0.8192309178411961, + 0.826789066195488, + 0.8272286504507065, + 0.8478099480271339, + 1.1267159134149551, + 0.882249791175127, + 0.8309599943459034, + 0.8297697640955448, + 0.8326401002705097, + 0.8303592912852764, + 0.8491501212120056, + 0.8352589793503284, + 0.8272300474345684, + 0.8385102264583111, + 0.8342298679053783, + 0.8553401567041874, + 0.8390191942453384, + 0.8347202092409134, + 0.8352100849151611, + 0.8334401063621044, + 0.831299927085638, + 0.8602687157690525, + 0.8417600765824318, + 0.8354587480425835, + 0.8306996896862984, + 0.8550886996090412, + 0.841009896248579, + 0.8449889719486237, + 0.8376613259315491, + 0.8301790803670883, + 0.8432311005890369, + 0.8528688922524452, + 0.8620591834187508, + 0.844860915094614, + 0.8347802795469761, + 0.8308207616209984, + 0.8287690579891205, + 0.8310410194098949, + 0.8485191501677036, + 0.8388301357626915, + 0.838941428810358, + 0.8339490741491318, + 0.8297511376440525, + 0.8325693197548389, + 0.8069803006947041, + 0.8060312829911709, + 0.8081700652837753, + 0.8039707317948341, + 0.8253799751400948, + 0.8113402873277664, + 0.8084410801529884, + 0.8013797923922539, + 0.8092001080513, + 0.8017690852284431, + 0.8010808378458023, + 0.8018896915018559, + 0.8234311826527119, + 0.8251890540122986, + 0.8107898756861687, + 0.7918612100183964, + 0.7901899516582489, + 0.8017811924219131, + 0.7991492748260498, + 0.7970212027430534, + 0.8010091260075569, + 0.8056885562837124, + 0.7901107892394066, + 0.7984200492501259, + 0.7953708991408348, + 0.80451974645257, + 0.799090601503849, + 0.7935501635074615, + 0.8222609758377075, + 0.8084503933787346, + 0.8125901222229004, + 0.7951110601425171, + 0.805519986897707, + 0.7996708154678345, + 0.8383891545236111, + 0.8375602774322033, + 0.8147689513862133, + 0.8059502579271793, + 0.8081509731709957, + 0.8073695935308933, + 0.8300188928842545, + 0.8374610915780067, + 0.8346289396286011, + 0.8285911753773689, + 0.8507990278303623, + 0.9246687404811382, + 0.8128499612212181, + 0.807689968496561, + 0.8139698766171932, + 0.8107097819447517, + 0.8157510310411453, + 0.8081798441708088, + 0.8322210051119328, + 0.8171200752258301, + 0.8246088400483131, + 0.8075009100139141, + 0.8124299347400665, + 0.8068396709859371, + 0.8089090697467327, + 0.8361199870705605, + 0.8368603885173798, + 0.8434890769422054, + 0.8297702297568321, + 0.8379798382520676, + 0.8198292925953865, + 0.8003809489309788, + 0.8096899837255478, + 0.80909114331007, + 0.8100001141428947, + 0.8153896778821945, + 0.8262894116342068, + 0.8197510614991188, + 0.8025285787880421, + 0.8026789873838425, + 0.8124806918203831, + 0.8066799491643906, + 0.8076312951743603, + 0.8061802946031094, + 0.8274312131106853, + 0.8223392069339752, + 0.801911111921072, + 0.8050901815295219, + 0.8071414195001125, + 0.8296696469187737, + 0.818250235170126, + 0.8249189704656601, + 0.8115898817777634, + 0.812311191111803, + 0.8068801835179329, + 0.8075907826423645, + 0.8334103040397167, + 0.812930054962635, + 0.811220146715641, + 0.8050492033362389, + 0.8166697807610035, + 0.8088499307632446, + 0.8063511922955513, + 0.8269501850008965, + 0.8352296426892281, + 0.817629974335432, + 0.8480390533804893, + 0.8295299485325813, + 0.8519389666616917, + 0.8416608907282352, + 0.8417489007115364, + 0.826369971036911, + 0.8219107985496521, + 0.8200500160455704, + 0.8215811103582382, + 0.8562891744077206, + 0.8336813189089298, + 0.8156690746545792, + 0.7970607839524746, + 0.8024307899177074, + 0.8030100725591183, + 0.8069709874689579, + 0.8005700074136257, + 0.805180985480547, + 0.8182991296052933, + 0.8075311779975891, + 0.8103400468826294, + 0.8004400879144669, + 0.8149901404976845, + 0.8595488034188747, + 0.8129212073981762, + 0.8090892806649208, + 0.7978999055922031, + 0.7979888468980789, + 0.8072401396930218, + 0.8053509518504143, + 0.8098399266600609, + 0.8048410527408123, + 0.8276300504803658, + 0.8102511055767536, + 0.8095200173556805, + 0.8104699663817883, + 0.8006300777196884, + 0.7981401868164539, + 0.7991609163582325, + 0.7955897599458694, + 0.8004400879144669, + 0.799200963228941, + 0.7976200431585312, + 0.7943008095026016, + 0.804469920694828, + 0.8238912560045719, + 0.8123391307890415, + 0.8086804300546646, + 0.8198888972401619, + 0.7957196794450283, + 0.8116788230836391, + 0.8012601174414158, + 0.7940712384879589, + 0.7973611354827881, + 0.7933410815894604, + 0.8173799142241478, + 0.808600801974535, + 0.8061700500547886, + 0.8108611218631268, + 0.7983902469277382, + 0.8077011443674564, + 0.8164402097463608, + 0.8053206838667393, + 0.8040387183427811, + 0.797799788415432, + 0.7952507585287094, + 0.7950798608362675, + 0.7938207127153873, + 0.8188202045857906, + 0.8232411928474903, + 0.8086999878287315, + 0.7964507676661015, + 0.7945899851620197, + 0.8011898025870323, + 0.793329905718565, + 0.7994696497917175, + 0.7987609133124352, + 0.7968703284859657, + 0.7973811589181423, + 0.8189487271010876, + 0.8151400834321976, + 0.960969366133213, + 0.7957196794450283, + 0.798520166426897, + 0.7955809123814106, + 0.819170381873846, + 0.8032112382352352, + 0.8037597872316837, + 0.8215908892452717, + 0.796319916844368, + 0.8015809580683708, + 0.8022100664675236, + 0.8066492155194283, + 0.808939803391695, + 0.837390311062336, + 0.8152700029313564, + 0.8045700378715992, + 0.8043008856475353, + 0.8097989484667778, + 0.8087297901511192, + 0.7973499596118927, + 0.8045597933232784, + 1.005128026008606, + 0.8235005661845207, + 0.9069675579667091, + 0.8027506992220879, + 0.9942869655787945, + 0.7964791730046272, + 0.794221181422472, + 0.8206190541386604, + 0.8187601342797279, + 0.8096098899841309, + 0.8034510537981987, + 0.8088098838925362, + 0.7963608950376511, + 0.804780051112175, + 0.798800028860569, + 0.7971697486937046, + 0.7895100861787796, + 0.7886011153459549, + 1.1391863226890564, + 0.8611399680376053, + 0.8531692437827587, + 0.8436697535216808, + 0.8428492583334446, + 0.8417791686952114, + 0.8372399024665356, + 0.866978894919157, + 0.850409734994173, + 0.8675591088831425, + 0.8415300399065018, + 0.8348990231752396, + 0.8051409386098385, + 0.802020076662302, + 0.8010398596525192, + 0.8014789782464504, + 0.8034599013626575, + 0.8241613395512104, + 0.8185990154743195, + 0.8074408397078514, + 0.8172900415956974, + 0.821670051664114, + 0.8261213079094887, + 0.8089202456176281, + 0.8192509412765503, + 0.7995599880814552, + 0.8027702569961548, + 0.8009700104594231, + 0.7944200187921524, + 0.8206511847674847, + 0.8083893917500973, + 0.8063795976340771, + 0.800310168415308, + 0.7980912923812866, + 0.7966798730194569, + 0.7958598434925079, + 0.7979301735758781, + 0.7993900217115879, + 0.7984600961208344, + 0.820960383862257, + 0.8211098611354828, + 0.8219610899686813, + 0.8119796402752399, + 0.798461027443409, + 0.7994300685822964, + 0.8044010028243065, + 0.7973699830472469, + 0.7955110631883144, + 0.7995287887752056, + 0.7986398413777351, + 0.8151009678840637, + 0.814520288258791, + 0.8044708520174026, + 0.8020191453397274, + 0.8204197511076927, + 0.8047297596931458, + 0.801481306552887, + 0.7956898771226406, + 0.796580221503973, + 0.7999502122402191, + 0.8075013756752014, + 0.8115200325846672, + 0.8080010302364826, + 0.8039888925850391, + 0.8050799369812012, + 0.8204099722206593, + 0.8267099037766457, + 0.8124513551592827, + 0.8084997534751892, + 0.8009499870240688, + 0.8075390942394733, + 0.802340917289257, + 0.7970202714204788, + 0.806150957942009, + 0.8022901602089405, + 0.8231401443481445, + 0.8370811119675636, + 0.8136788383126259, + 0.801451038569212, + 0.7993304170668125, + 0.8092899806797504, + 0.7991809397935867, + 0.7963697426021099, + 0.7959408685564995, + 0.8036796934902668, + 0.8188989013433456, + 0.8190288208425045, + 0.8139489218592644, + 0.7960908114910126, + 0.8165002800524235, + 0.7996009662747383, + 0.8014901541173458, + 0.7975511252880096, + 0.7987497374415398, + 0.7996312342584133, + 0.8108098991215229, + 0.8188900537788868, + 0.8096206001937389, + 0.806259922683239, + 0.8207010105252266, + 0.813039019703865, + 0.8184188045561314, + 0.797721091657877, + 0.8033798076212406, + 0.7969909347593784, + 0.8037900552153587, + 0.805131159722805, + 0.8074701763689518, + 0.8248300291597843, + 0.8157608099281788, + 0.8001001551747322, + 0.795271247625351, + 0.8056699298322201, + 0.8005909621715546, + 0.8008102886378765, + 0.796751119196415, + 0.7972796447575092, + 0.7989308796823025, + 0.8249301463365555, + 0.8124900050461292 + ] + }, + "warm_ms": { + "control": [ + 7.886864710599184, + 1.9658571109175682, + 1.772778108716011 + ], + "nodedup": [ + 2.6782569475471973, + 0.9587490931153297, + 0.9164176881313324 + ], + "library": [ + 1.0667280294001102, + 0.8983379229903221, + 0.8914102800190449 + ] + }, + "stats": { + "control": { + "n": 400, + "median_ms": 1.6949796117842197, + "p10_ms": 1.672325748950243, + "p90_ms": 1.732911029830575, + "min_ms": 1.661451067775488, + "max_ms": 3.4937672317028046, + "mean_ms": 1.7045107658486813 + }, + "nodedup": { + "n": 400, + "median_ms": 0.8432350587099791, + "p10_ms": 0.8249007631093264, + "p90_ms": 0.8817269466817379, + "min_ms": 0.8158995769917965, + "max_ms": 1.3450440019369125, + "mean_ms": 0.8517269906587899 + }, + "library": { + "n": 400, + "median_ms": 0.8096552919596434, + "p10_ms": 0.7970568258315325, + "p90_ms": 0.8389492053538561, + "min_ms": 0.7886011153459549, + "max_ms": 1.1391863226890564, + "mean_ms": 0.817810045555234 + } + }, + "ratio_control_over_nodedup": { + "ratio": 2.0100914854954914, + "ci90_low": 2.0002065729677834, + "ci90_high": 2.0166774669356378, + "bootstrap_samples": 2000 + }, + "ratio_library_over_nodedup": { + "ratio": 0.9601774541944359, + "ci90_low": 0.9556268305457554, + "ci90_high": 0.9643371268976172, + "bootstrap_samples": 2000 + }, + "ratio_control_over_library": { + "ratio": 2.093458325557026, + "ci90_low": 2.0876485991928675, + "ci90_high": 2.096584971875778, + "bootstrap_samples": 2000 + }, + "paired_round_ratio_control_over_nodedup": { + "median": 2.014243564280994, + "p10": 1.9682843354019028, + "p90": 2.04332628980802 + }, + "minimum_detectable_improvement": 0.035743958487239214, + "compile": { + "control": { + "lower_s": 3.097098669037223, + "compile_s": 9.6949109332636, + "first_call_s": 0.023168369196355343, + "trace_calls": 32, + "flops": 17394672.0, + "hlo_sort_count": 15, + "stablehlo_sort_count": 3, + "hlo_sort_shapes": [ + "(f64[69849]{0}, f64[69849]{0}, s64[69849]{0}, s32[69849]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0}, s32[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0}, s32[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0}, s32[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0}, s32[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0}, s32[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0}, s32[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0}, s32[720]{0})" + ], + "hlo_sha256": "099aa053e52b3ea4", + "hlo_lines": 14562 + }, + "nodedup": { + "lower_s": 2.8049009991809726, + "compile_s": 5.648509600199759, + "first_call_s": 0.011043314822018147, + "trace_calls": 32, + "flops": 6598454.0, + "hlo_sort_count": 7, + "stablehlo_sort_count": 1, + "hlo_sort_shapes": [ + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})" + ], + "hlo_sha256": "a55e34d05ecb663f", + "hlo_lines": 10468 + }, + "library": { + "lower_s": 2.7420755699276924, + "compile_s": 0.4922253992408514, + "first_call_s": 0.013589904177933931, + "trace_calls": 32, + "flops": 6598454.0, + "hlo_sort_count": 7, + "stablehlo_sort_count": 1, + "hlo_sort_shapes": [ + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})" + ], + "hlo_sha256": "a55e34d05ecb663f", + "hlo_lines": 10468 + } + }, + "instances_compared": [ + [ + 0 + ], + [ + 1 + ], + [ + 2 + ], + [ + 3 + ], + [ + 4 + ], + [ + 5 + ], + [ + 6 + ], + [ + 7 + ], + [ + 8 + ], + [ + 9 + ], + [ + 10 + ], + [ + 11 + ], + [ + 12 + ], + [ + 13 + ], + [ + 14 + ], + [ + 15 + ] + ], + "values": { + "control": [ + 7.743201200876806, + 4.90119982600354, + 8.551453428732433, + 7.64017039895814, + 7.25809567478034, + 9.29357838657636, + 3.033879650515197, + 8.714615086385908, + 4.73517315947449, + 3.2233889243165876, + 9.296501815740568, + 6.74861581547119, + -1.402814315064127, + 0.5885274382499839, + 6.162997261446637, + -10.499150878933385 + ], + "nodedup": [ + 7.743201200876806, + 4.90119982600354, + 8.551453428732433, + 7.64017039895814, + 7.25809567478034, + 9.29357838657636, + 3.033879650515197, + 8.714615086385908, + 4.73517315947449, + 3.2233889243165876, + 9.296501815740568, + 6.74861581547119, + -1.402814315064127, + 0.5885274382499839, + 6.162997261446637, + -10.499150878933385 + ], + "library": [ + 7.743201200876806, + 4.90119982600354, + 8.551453428732433, + 7.64017039895814, + 7.25809567478034, + 9.29357838657636, + 3.033879650515197, + 8.714615086385908, + 4.73517315947449, + 3.2233889243165876, + 9.296501815740568, + 6.74861581547119, + -1.402814315064127, + 0.5885274382499839, + 6.162997261446637, + -10.499150878933385 + ] + }, + "deterministic_within_route": { + "control": true, + "nodedup": true, + "library": true + }, + "likelihood_gate": { + "control_vs_nodedup": { + "bit_identical": true, + "max_abs_delta": 0.0, + "max_rel_delta": 0.0, + "nan_pattern_equal": true + }, + "control_vs_library": { + "bit_identical": true, + "max_abs_delta": 0.0, + "max_rel_delta": 0.0, + "nan_pattern_equal": true + }, + "nodedup_vs_library": { + "bit_identical": true, + "max_abs_delta": 0.0, + "max_rel_delta": 0.0, + "nan_pattern_equal": true + } + }, + "fiducial_log_likelihood": { + "control": 7.743201200876806, + "nodedup": 7.743201200876806, + "library": 7.743201200876806 + } + }, + "simple_solved_vmap4": { + "label": "simple_solved_vmap4", + "batch": 4, + "n_rounds": 20, + "n_calls_per_round": 20, + "n_warm": 3, + "route_order": "round-robin, start rotated each round", + "per_call_ms": { + "control": [ + 2.1434039808809757, + 2.0308452658355236, + 2.024745102971792, + 2.060844097286463, + 2.0537846721708775, + 2.019195817410946, + 2.002206165343523, + 1.9992860034108162, + 1.9400459714233875, + 1.9684359431266785, + 2.0112660713493824, + 1.9970359280705452, + 2.015745732933283, + 2.0114160142838955, + 1.9693057984113693, + 1.9977260380983353, + 1.985906157642603, + 2.0405049435794353, + 2.0452546887099743, + 2.0140563137829304, + 2.0630336366593838, + 1.8719257786870003, + 1.9113658927381039, + 1.9074971787631512, + 1.8516378477215767, + 1.8583768978714943, + 1.8854769878089428, + 1.9437861628830433, + 1.8774773925542831, + 1.8919273279607296, + 1.863937359303236, + 1.9570360891520977, + 1.873767003417015, + 1.9554868340492249, + 1.9497857429087162, + 1.8781968392431736, + 1.8785260617733002, + 1.9209268502891064, + 1.8864572048187256, + 1.8591983243823051, + 1.9592568278312683, + 1.9559357315301895, + 1.869297120720148, + 1.9507049582898617, + 1.9435673020780087, + 1.9053258001804352, + 1.894438173621893, + 1.8918472342193127, + 1.9217259250581264, + 1.8632481805980206, + 1.8686670809984207, + 1.9277166575193405, + 1.9450257532298565, + 1.8805069848895073, + 1.8821670673787594, + 1.9409763626754284, + 2.2731521166861057, + 1.9214767962694168, + 1.8788683228194714, + 1.8861168064177036, + 1.970025710761547, + 1.9025569781661034, + 1.8963571637868881, + 1.854647882282734, + 1.8727369606494904, + 1.895667053759098, + 1.9088666886091232, + 1.88160827383399, + 1.8718382343649864, + 1.933487132191658, + 1.8678284250199795, + 1.8723579123616219, + 1.9119172357022762, + 1.9129659049212933, + 1.8700668588280678, + 2.2818930447101593, + 1.863407902419567, + 1.8662572838366032, + 1.8631769344210625, + 1.8455879762768745, + 1.9307257607579231, + 1.8314076587557793, + 1.8324381671845913, + 1.8724570982158184, + 1.873666886240244, + 1.8356279470026493, + 1.8334281630814075, + 1.8374379724264145, + 1.8274583853781223, + 1.8524457700550556, + 1.905656885355711, + 1.8707872368395329, + 1.8664677627384663, + 1.8611080013215542, + 1.8642870709300041, + 1.8676570616662502, + 1.9626556895673275, + 1.8704673275351524, + 1.8564779311418533, + 1.8999166786670685, + 1.91531702876091, + 1.8303380347788334, + 1.867127139121294, + 1.8890667706727982, + 1.8518678843975067, + 1.8405979499220848, + 1.8286081030964851, + 1.8305177800357342, + 1.8300581723451614, + 1.866925973445177, + 1.9082366488873959, + 1.8605873920023441, + 1.8505980260670185, + 1.8849470652639866, + 1.8776068463921547, + 1.8920483998954296, + 1.9156471826136112, + 1.856077928096056, + 1.859727781265974, + 2.29151314124465, + 1.936216838657856, + 1.8265782855451107, + 1.871705986559391, + 1.8949871882796288, + 1.8399981781840324, + 1.8201577477157116, + 1.8213489092886448, + 1.8612570129334927, + 1.8804967403411865, + 1.902436837553978, + 1.9093570299446583, + 1.9008568488061428, + 1.8570167012512684, + 1.8794070929288864, + 1.880707684904337, + 1.9137971103191376, + 1.872386783361435, + 1.8497277051210403, + 1.887287013232708, + 1.8823170103132725, + 1.9994559697806835, + 1.828996930271387, + 1.8214080482721329, + 1.8182480707764626, + 1.8166480585932732, + 1.8133078701794147, + 1.8602879717946053, + 1.8825558945536613, + 1.8277880735695362, + 1.8376978114247322, + 1.8175877630710602, + 1.8262178637087345, + 1.8182778730988503, + 1.8201791681349277, + 1.8836166709661484, + 1.8569580279290676, + 1.8289079889655113, + 1.8339683301746845, + 1.8190480768680573, + 1.8495870754122734, + 1.9189170561730862, + 1.8220278434455395, + 1.8371879123151302, + 1.8284479156136513, + 2.0275949500501156, + 1.8479381687939167, + 1.8414775840938091, + 1.8732771277427673, + 1.8316279165446758, + 1.8350379541516304, + 1.8709679134190083, + 1.8774657510221004, + 1.8396577797830105, + 1.832667738199234, + 1.8226378597319126, + 1.8713166937232018, + 1.861346885561943, + 1.9069057889282703, + 1.8675769679248333, + 1.8733972683548927, + 1.905576791614294, + 1.8478482961654663, + 1.8400168046355247, + 1.847837120294571, + 1.8757772631943226, + 1.8762480467557907, + 1.8332581967115402, + 1.8270076252520084, + 1.83187797665596, + 1.8359380774199963, + 1.8276176415383816, + 1.8722382374107838, + 1.8919161520898342, + 1.8371581099927425, + 1.8338179215788841, + 1.8339268863201141, + 1.8340079113841057, + 1.8306877464056015, + 1.8558073788881302, + 1.8887268379330635, + 1.946337055414915, + 1.837738323956728, + 1.8342779949307442, + 2.0902948454022408, + 1.8602684140205383, + 1.8302868120372295, + 1.8277978524565697, + 1.8390477634966373, + 1.8433267250657082, + 1.839368138462305, + 1.8755276687443256, + 1.878388226032257, + 1.8495372496545315, + 1.8279682844877243, + 1.8630772829055786, + 1.8334477208554745, + 1.8323077820241451, + 1.862207893282175, + 1.8757078796625137, + 1.866387203335762, + 1.9147670827805996, + 1.8310579471290112, + 1.8937373533844948, + 1.8812171183526516, + 1.8432256765663624, + 1.8358873203396797, + 1.8369383178651333, + 1.9854260608553886, + 1.8661366775631905, + 1.8855072557926178, + 1.843737903982401, + 1.84326758608222, + 1.8348381854593754, + 1.8360377289354801, + 1.8337680958211422, + 1.8496271222829819, + 1.93109642714262, + 1.9069472327828407, + 1.8477770499885082, + 1.8639182671904564, + 1.969396136701107, + 1.8213270232081413, + 1.8255878239870071, + 1.8311580643057823, + 1.8345876596868038, + 1.8327082507312298, + 1.8608169630169868, + 1.9064671359956264, + 1.876607071608305, + 1.8427381291985512, + 1.8401979468762875, + 1.828768290579319, + 1.8352866172790527, + 1.8347082659602165, + 1.894467044621706, + 1.8942872993648052, + 1.8913159146904945, + 1.8583880737423897, + 1.8870769999921322, + 1.8833870999515057, + 1.9952962175011635, + 1.8260679207742214, + 1.8412880599498749, + 1.8380680121481419, + 1.8370579928159714, + 1.8451767973601818, + 1.8692873418331146, + 1.8847770988941193, + 1.8451670184731483, + 1.819597091525793, + 1.8233070150017738, + 1.8407069146633148, + 1.8410580232739449, + 1.84986786916852, + 1.8737982027232647, + 1.8700878135859966, + 1.8437677063047886, + 1.8472671508789062, + 1.8419483676552773, + 1.836508046835661, + 1.9736462272703648, + 1.8432671204209328, + 1.8218876793980598, + 1.8303473480045795, + 1.8399679102003574, + 1.8276679329574108, + 1.8489579670131207, + 1.881228294223547, + 1.976595725864172, + 1.8210280686616898, + 1.8271375447511673, + 1.8348279409110546, + 1.8248679116368294, + 1.8839077092707157, + 1.903897151350975, + 1.8695569597184658, + 1.8418272957205772, + 1.8566669896245003, + 1.8907766789197922, + 1.8818271346390247, + 1.9665057770907879, + 1.8650470301508904, + 1.8429472111165524, + 1.839956734329462, + 1.8352679908275604, + 1.838407013565302, + 1.8766168504953384, + 1.864538062363863, + 1.83956790715456, + 1.8537179566919804, + 1.882587093859911, + 1.8738065846264362, + 1.8989169038832188, + 1.8783370032906532, + 1.8466766923666, + 1.8566567450761795, + 1.8877070397138596, + 1.8527978099882603, + 1.8825680017471313, + 1.9030170515179634, + 1.949795987457037, + 1.833748072385788, + 1.8663471564650536, + 1.8840581178665161, + 1.849947962909937, + 1.8605571240186691, + 1.833388116210699, + 1.840247306972742, + 1.8399269320070744, + 1.834438182413578, + 1.8651075661182404, + 1.877657137811184, + 1.848028041422367, + 1.8347571603953838, + 2.39767087623477, + 1.8472177907824516, + 1.8527968786656857, + 1.8368680030107498, + 1.836137380450964, + 1.8353667110204697, + 1.9203368574380875, + 1.9495370797812939, + 1.8785269930958748, + 1.876886934041977, + 1.8516466952860355, + 1.8329978920519352, + 1.8306979909539223, + 1.8340670503675938, + 1.8374673090875149, + 1.832467969506979, + 1.8798368982970715, + 1.8827267922461033, + 1.8529477529227734, + 1.8308069556951523, + 1.833667978644371, + 1.83164793998003, + 1.82441808283329, + 1.9124671816825867, + 1.9100368954241276, + 1.8679969944059849, + 1.9290558993816376, + 1.8365280702710152, + 1.8432480283081532, + 1.8871380016207695, + 1.8995469436049461, + 1.8401076085865498, + 1.8584178760647774, + 1.8432182259857655, + 1.8400470726191998, + 1.8708971329033375, + 1.9083158113062382, + 1.8737968057394028, + 1.8667271360754967, + 1.865386962890625, + 1.8835272639989853, + 1.8879882991313934, + 1.9078170880675316, + 1.8679178319871426, + 1.8678782507777214, + 1.869706902652979, + 1.9818460568785667, + 1.8624970689415932, + 1.8404382281005383, + 1.832387875765562, + 1.8369057215750217, + 1.8701269291341305, + 1.8878374248743057, + 1.8491470254957676, + 1.8575480207800865, + 1.8691378645598888, + 1.8325382843613625, + 1.8276083283126354, + 1.8699574284255505, + 1.8881969153881073, + 1.8544578924775124, + 1.8212879076600075, + 1.8239677883684635, + 1.8409676849842072, + 1.8317978829145432, + 1.8399767577648163 + ], + "nodedup": [ + 1.0442258790135384, + 1.0558883659541607, + 1.0227668099105358, + 1.01371668279171, + 1.0278979316353798, + 0.9803692810237408, + 0.9873369708657265, + 1.0127779096364975, + 0.9704087860882282, + 0.9665871039032936, + 0.9915190748870373, + 0.9657293558120728, + 0.9639281779527664, + 1.0380977764725685, + 0.9662490338087082, + 0.9574079886078835, + 0.9986278600990772, + 0.9756973013281822, + 0.9643579833209515, + 1.0134479962289333, + 0.9862082079052925, + 0.9934566915035248, + 1.0003182105720043, + 0.9650588035583496, + 0.9997370652854443, + 0.9723990224301815, + 0.9707189165055752, + 0.9543579071760178, + 0.9918189607560635, + 0.9668981656432152, + 0.9853579103946686, + 1.0398677550256252, + 1.0128277353942394, + 0.9650969877839088, + 1.0204380378127098, + 0.9592878632247448, + 0.966907013207674, + 1.0278979316353798, + 0.9649479761719704, + 0.965707004070282, + 1.0213181376457214, + 0.9725377894937992, + 0.953218899667263, + 0.9631887078285217, + 0.9627277031540871, + 0.9643686935305595, + 0.9661689400672913, + 1.0316669940948486, + 0.9664790704846382, + 0.9536189027130604, + 1.021797303110361, + 0.9847888723015785, + 0.9596291929483414, + 1.0190969333052635, + 0.9678485803306103, + 0.9523490443825722, + 1.0041282512247562, + 1.001948956400156, + 0.9557688608765602, + 1.0402770712971687, + 1.1283368803560734, + 0.9671077132225037, + 0.947178341448307, + 0.9797182865440845, + 0.963196624070406, + 0.9477292187511921, + 1.0003577917814255, + 0.9601376950740814, + 0.9554391726851463, + 0.9924080222845078, + 0.9573078714311123, + 0.9469790384173393, + 0.9516589343547821, + 0.9812768548727036, + 0.9561493061482906, + 0.9497879073023796, + 0.987728126347065, + 0.980868935585022, + 0.9490479715168476, + 0.9823781438171864, + 0.9805881418287754, + 0.9656781330704689, + 0.9639277122914791, + 0.9553977288305759, + 0.9840480051934719, + 0.9729089215397835, + 0.9632380679249763, + 0.9497487917542458, + 0.979109201580286, + 0.9785881265997887, + 0.9652287699282169, + 0.949447974562645, + 0.9853183291852474, + 0.9795189835131168, + 0.959817785769701, + 0.9466591291129589, + 0.9797289967536926, + 0.9785881265997887, + 0.9639589115977287, + 0.949198380112648, + 1.0103569366037846, + 0.9566592052578926, + 0.961607787758112, + 1.0131881572306156, + 0.9657293558120728, + 0.952898059040308, + 0.9901882149279118, + 0.9721489623188972, + 0.9567178785800934, + 0.9374492801725864, + 0.9862477891147137, + 0.9568678215146065, + 0.9352392517030239, + 0.9327777661383152, + 0.9662779048085213, + 0.951508991420269, + 0.9476877748966217, + 0.9307488799095154, + 0.9613488800823689, + 0.9676981717348099, + 1.0161781683564186, + 0.9671980515122414, + 0.9550494141876698, + 0.9578880853950977, + 1.0186471045017242, + 0.9719477966427803, + 0.9565879590809345, + 0.9408579207956791, + 0.98815793171525, + 0.9442176669836044, + 0.9348597377538681, + 0.9313682094216347, + 0.9862869046628475, + 1.734619028866291, + 0.9506889618933201, + 0.9352779015898705, + 0.9609181433916092, + 0.9437492117285728, + 0.9465194307267666, + 0.9390292689204216, + 0.9460090659558773, + 0.936517957597971, + 0.9380290284752846, + 0.9867679327726364, + 0.9463676251471043, + 1.2475051917135715, + 0.9277490898966789, + 0.9268689900636673, + 0.9343787096440792, + 0.9370278567075729, + 1.0045873932540417, + 0.9499490261077881, + 0.9495280683040619, + 0.9497976861894131, + 0.9720791131258011, + 0.9288187138736248, + 0.929409172385931, + 0.9256480261683464, + 0.9849676862359047, + 0.9405589662492275, + 0.9875982068479061, + 0.9329691529273987, + 0.9639188647270203, + 0.9530880488455296, + 0.9354278445243835, + 0.9307400323450565, + 0.9675482288002968, + 0.9499480947852135, + 0.9369999170303345, + 0.9348276071250439, + 0.930379144847393, + 0.9776689112186432, + 0.9741079993546009, + 0.935109332203865, + 0.931848306208849, + 0.9798076935112476, + 0.9469892829656601, + 0.9296578355133533, + 0.9331698529422283, + 0.9893570095300674, + 0.9601889178156853, + 0.9344080463051796, + 0.9405189193785191, + 0.9812680073082447, + 0.9480379521846771, + 0.9311200119554996, + 0.9334683418273926, + 0.973318237811327, + 0.9378399699926376, + 0.9433683007955551, + 0.9333998896181583, + 0.928007997572422, + 0.9843367151916027, + 0.9422991424798965, + 0.9349780157208443, + 0.9417901746928692, + 0.9787688031792641, + 0.9409282356500626, + 0.936869066208601, + 0.9322981350123882, + 0.970717053860426, + 0.9597777388989925, + 0.929409172385931, + 0.930659007281065, + 0.9631379507482052, + 0.9614392183721066, + 0.9429575875401497, + 0.932828988879919, + 0.9658080525696278, + 0.9689079597592354, + 0.9441589936614037, + 0.9314892813563347, + 0.9347088634967804, + 0.9784270077943802, + 0.9470977820456028, + 0.9340988472104073, + 0.9342082776129246, + 0.9782291017472744, + 0.9511788375675678, + 0.9354078210890293, + 0.9903581812977791, + 1.0049478150904179, + 0.9707678109407425, + 0.9500379674136639, + 0.936589203774929, + 0.9801071137189865, + 0.95802778378129, + 1.4081131666898727, + 0.966247171163559, + 0.9412593208253384, + 0.9354287758469582, + 0.9385775774717331, + 0.9796279482543468, + 0.9531192481517792, + 0.9366078302264214, + 0.9391396306455135, + 0.9862077422440052, + 0.9388476610183716, + 0.9355591610074043, + 0.9331880137324333, + 1.0168268345296383, + 0.9705079719424248, + 0.960448756814003, + 0.9389086626470089, + 0.9831488132476807, + 0.9440891444683075, + 0.9362176060676575, + 0.9325286373496056, + 0.9765671566128731, + 0.9439191780984402, + 0.9525585919618607, + 0.9361281991004944, + 0.940859317779541, + 0.9799678809940815, + 0.9559076279401779, + 0.9397901594638824, + 0.9382679127156734, + 0.983069185167551, + 0.9386488236486912, + 0.9380979463458061, + 1.0003987699747086, + 0.937179196625948, + 0.9264489635825157, + 0.9280601516366005, + 0.9896671399474144, + 0.9373477660119534, + 0.9347996674478054, + 0.9367079474031925, + 0.9715692140161991, + 0.9458581916987896, + 0.9457478299736977, + 0.9401887655258179, + 0.9336280636489391, + 0.9738290682435036, + 0.9446390904486179, + 0.9362879209220409, + 1.0358281433582306, + 0.987187959253788, + 0.9487280622124672, + 0.9326888248324394, + 1.038846094161272, + 0.9737578220665455, + 0.9595691226422787, + 0.9576883167028427, + 1.0093688033521175, + 1.0066069662570953, + 0.9585279040038586, + 0.961249228566885, + 0.9966082870960236, + 0.9730779565870762, + 0.9378287941217422, + 0.9635081514716148, + 0.9737890213727951, + 0.9495289996266365, + 0.9354790672659874, + 0.939629040658474, + 0.9738882072269917, + 0.9372089989483356, + 0.9389389306306839, + 0.9370977059006691, + 0.9819869883358479, + 0.9609581902623177, + 0.9578391909599304, + 0.9879181161522865, + 0.9788391180336475, + 0.9374590590596199, + 0.9361580014228821, + 0.9874082170426846, + 0.9573581628501415, + 0.9348979219794273, + 0.9354390203952789, + 0.9703678078949451, + 0.9543891064822674, + 0.9553679265081882, + 0.937438104301691, + 0.9682793170213699, + 0.969327986240387, + 0.9484980255365372, + 0.9347689338028431, + 0.9354688227176666, + 0.9366492740809917, + 0.9392187930643559, + 0.9809969924390316, + 0.9653689339756966, + 0.9448486380279064, + 0.9352182969450951, + 0.9629190899431705, + 0.9762579575181007, + 0.9416183456778526, + 0.9376485832035542, + 0.9314478375017643, + 0.9761392138898373, + 0.9500184096395969, + 0.938737764954567, + 0.943819060921669, + 0.9822072461247444, + 0.9320797398686409, + 0.9385189041495323, + 0.9330781176686287, + 0.9710476733744144, + 0.9884778410196304, + 0.967878382652998, + 0.9788870811462402, + 0.9607193060219288, + 0.9595081210136414, + 0.9562177583575249, + 1.0037482716143131, + 0.952618196606636, + 0.9617991745471954, + 0.9403289295732975, + 0.9772470220923424, + 0.954959075897932, + 0.939937774091959, + 0.9349980391561985, + 0.9661279618740082, + 0.9471778757870197, + 0.9445492178201675, + 0.9469492360949516, + 0.9359382092952728, + 0.980778131633997, + 0.9792782366275787, + 1.0062777437269688, + 0.9683878161013126, + 0.955579336732626, + 0.96144899725914, + 0.9978171437978745, + 1.0000579059123993, + 0.9627779945731163, + 0.950138084590435, + 1.0145683772861958, + 0.9667580015957355, + 0.9586489759385586, + 0.9447387419641018, + 0.9880079887807369, + 0.9502987377345562, + 0.9363982826471329, + 0.9355279617011547, + 0.9840382263064384, + 0.9500379674136639, + 0.9320387616753578, + 0.9422488510608673, + 0.9363186545670033, + 0.9787478484213352, + 0.9519890882074833, + 1.2343861162662506, + 0.9837672114372253, + 0.9345198050141335, + 0.9373282082378864, + 0.9348876774311066, + 0.9716292843222618, + 0.9536780416965485, + 0.935819000005722, + 0.9363777935504913, + 0.9667281992733479, + 0.9683091193437576, + 0.943697988986969, + 0.9457087144255638, + 0.9423689916729927, + 0.9836982935667038, + 0.9515788406133652 + ], + "library": [ + 1.031758263707161, + 0.9409883059561253, + 0.9962893091142178, + 0.969897024333477, + 0.9390292689204216, + 0.9722490794956684, + 0.9685480035841465, + 0.9556678123772144, + 0.9441389702260494, + 1.001656986773014, + 0.9422381408512592, + 0.9439988061785698, + 1.0160766541957855, + 0.9505287744104862, + 0.9324289858341217, + 0.9808768518269062, + 0.9641880169510841, + 0.9478889405727386, + 0.9426679462194443, + 0.9792488999664783, + 0.9635994210839272, + 0.9634280577301979, + 0.9354776702821255, + 0.9802691638469696, + 0.9455378167331219, + 0.940428115427494, + 0.9386190213263035, + 0.9562182240188122, + 0.9445291943848133, + 0.9360187686979771, + 0.9744679555296898, + 0.9499290026724339, + 0.9399289265275002, + 0.9815781377255917, + 1.0067191906273365, + 0.942448154091835, + 0.9426879696547985, + 0.9890682995319366, + 0.9404183365404606, + 0.9391875937581062, + 0.9590387344360352, + 0.9788968600332737, + 0.9458092972636223, + 0.9439480490982533, + 0.941447913646698, + 0.9671887382864952, + 0.949678011238575, + 0.9457580745220184, + 1.0004793293774128, + 0.9882878512144089, + 0.9432579390704632, + 0.9915982373058796, + 0.9526577778160572, + 0.9406679309904575, + 0.9468887001276016, + 0.9742570109665394, + 0.9769387543201447, + 0.9480491280555725, + 0.9784367866814137, + 0.9361389093101025, + 0.9660390205681324, + 0.9266887791454792, + 0.9293579496443272, + 0.9914091788232327, + 0.9556380100548267, + 1.018797978758812, + 0.9680083021521568, + 0.9334883652627468, + 0.9469087235629559, + 0.9273989126086235, + 0.9791483171284199, + 0.9588990360498428, + 0.9665568359196186, + 0.9622778743505478, + 0.953218899667263, + 0.9387880563735962, + 0.9274883195757866, + 0.9616990573704243, + 0.951928086578846, + 0.930118840187788, + 0.9659682400524616, + 0.9360290132462978, + 0.9190286509692669, + 0.9199702180922031, + 0.9216293692588806, + 0.9695780463516712, + 0.91154919937253, + 0.9077591821551323, + 0.9105498902499676, + 0.9375098161399364, + 0.9276680648326874, + 0.9314389899373055, + 0.9049088694155216, + 0.9006289765238762, + 0.9545190259814262, + 0.9291982278227806, + 0.9140092879533768, + 0.9094481356441975, + 0.9089778177440166, + 0.9596990421414375, + 0.9542480111122131, + 0.9730476886034012, + 0.9491280652582645, + 0.9418190456926823, + 0.9348392486572266, + 0.9554782882332802, + 0.9191688150167465, + 0.91182766482234, + 0.916418619453907, + 0.9501590393483639, + 0.9269877336919308, + 0.9218193590641022, + 0.9126490913331509, + 0.9124288335442543, + 0.9503690525889397, + 0.9217993356287479, + 0.910698901861906, + 0.9155678562819958, + 0.9258291684091091, + 0.9381091222167015, + 0.9834379889070988, + 0.9144581854343414, + 0.9152200073003769, + 0.9156190790235996, + 0.8988301269710064, + 0.9612292051315308, + 0.933297909796238, + 0.9170598350465298, + 0.9114481508731842, + 0.9128078818321228, + 0.9533190168440342, + 0.9202277287840843, + 0.9156190790235996, + 0.9078281000256538, + 0.9612380526959896, + 0.9100101888179779, + 0.9088488295674324, + 0.910869799554348, + 0.9135990403592587, + 0.9631779976189137, + 0.899359118193388, + 0.9009200148284435, + 0.9519485756754875, + 0.9002489969134331, + 0.8980296552181244, + 0.9098192676901817, + 0.9004301391541958, + 0.9554191492497921, + 0.9094881825149059, + 0.897690188139677, + 0.8988892659544945, + 0.9345179423689842, + 0.909038819372654, + 0.9059491567313671, + 0.9123291820287704, + 0.9021381847560406, + 0.9532379917800426, + 0.9186589159071445, + 0.9111878462135792, + 0.9047896601259708, + 0.9403089061379433, + 0.9527178481221199, + 0.9124679490923882, + 0.9062397293746471, + 0.9125089272856712, + 0.912609975785017, + 0.9506288915872574, + 0.9171878919005394, + 0.9154099971055984, + 0.9102988988161087, + 0.9468193165957928, + 0.9222789667546749, + 0.9197681210935116, + 0.9110793471336365, + 0.9121587499976158, + 0.9558782912790775, + 0.9098798036575317, + 0.9092381224036217, + 0.9205387905240059, + 0.9320788085460663, + 0.9738965891301632, + 1.3334942050278187, + 0.960618257522583, + 0.9316992945969105, + 0.9105689823627472, + 0.9064478799700737, + 0.9402590803802013, + 0.9213900193572044, + 0.9112679399549961, + 0.9095701389014721, + 0.910269096493721, + 0.9542889893054962, + 0.9175697341561317, + 0.9187683463096619, + 0.9087692014873028, + 0.9170179255306721, + 0.96086785197258, + 0.9034490212798119, + 0.9126588702201843, + 0.907710287719965, + 0.9114290587604046, + 0.9340783581137657, + 0.9187683463096619, + 0.9165802039206028, + 1.1382861994206905, + 0.9562983177602291, + 0.9330702014267445, + 0.9119389578700066, + 0.9146700613200665, + 0.9526880457997322, + 0.917558092623949, + 0.9485888294875622, + 0.9189490228891373, + 0.9184502996504307, + 0.9689675644040108, + 0.9146188385784626, + 0.9122700430452824, + 0.9102178737521172, + 0.9083892218768597, + 0.9306683205068111, + 0.9451890364289284, + 0.9187590330839157, + 0.9144800715148449, + 0.9578578174114227, + 0.9558182209730148, + 0.9205392561852932, + 0.9038182906806469, + 0.9132889099419117, + 0.9626778773963451, + 0.9386977180838585, + 0.9222393855452538, + 0.9117289446294308, + 0.9142402559518814, + 0.97231799736619, + 0.9178081527352333, + 0.9151189588010311, + 0.9108176454901695, + 0.912258867174387, + 0.9699082002043724, + 0.91524887830019, + 0.9361989796161652, + 0.9533781558275223, + 0.9337477385997772, + 0.9386087767779827, + 0.9174677543342113, + 0.9143790230154991, + 0.9669782593846321, + 0.9199883788824081, + 0.9123589843511581, + 0.912827905267477, + 0.9441189467906952, + 0.9291879832744598, + 0.9216289035975933, + 0.9204200468957424, + 0.9211292490363121, + 0.9524193592369556, + 0.9044990874826908, + 0.918238889425993, + 0.9082797914743423, + 0.9026490151882172, + 0.919827725738287, + 0.9574191644787788, + 0.9169881232082844, + 0.9123790077865124, + 0.9161499328911304, + 0.9967782534658909, + 0.9274990297853947, + 0.9250701405107975, + 0.9164991788566113, + 0.9137596935033798, + 0.9526880457997322, + 0.9086201898753643, + 0.9181504137814045, + 0.9137792512774467, + 0.9154598228633404, + 0.9517977014183998, + 0.9155902080237865, + 0.9259390644729137, + 0.9112688712775707, + 0.9124488569796085, + 0.9302189573645592, + 0.9549381211400032, + 0.9154286235570908, + 0.9240391664206982, + 0.9134276770055294, + 0.9134090505540371, + 0.955378171056509, + 0.9185001254081726, + 0.9191199205815792, + 0.9135282598435879, + 0.9169592522084713, + 0.950878020375967, + 0.9315498173236847, + 0.9219101630151272, + 0.9125480428338051, + 0.9139892645180225, + 0.9582978673279285, + 0.9201192297041416, + 0.914539210498333, + 0.9210477583110332, + 0.9670890867710114, + 0.9260489605367184, + 0.912718940526247, + 0.9107198566198349, + 0.9547178633511066, + 0.9217900224030018, + 0.9259479120373726, + 0.9194677695631981, + 0.9106188081204891, + 0.965626910328865, + 0.9213890880346298, + 0.9123701602220535, + 0.9094793349504471, + 0.9108190424740314, + 0.9511681273579597, + 0.9242389351129532, + 0.9126500226557255, + 0.9184088557958603, + 0.9605591185390949, + 0.9436681866645813, + 0.9169778786599636, + 0.9253579191863537, + 0.911469105631113, + 0.9135380387306213, + 0.9673479944467545, + 0.9172381833195686, + 0.9188479743897915, + 0.9142193011939526, + 0.9142393246293068, + 0.9513692930340767, + 0.9165476076304913, + 0.9212889708578587, + 0.920380000025034, + 0.9499778971076012, + 0.9271991439163685, + 0.919627957046032, + 0.9104879572987556, + 0.9148586541414261, + 0.9407582692801952, + 0.9223492816090584, + 0.9302888065576553, + 0.9645689278841019, + 0.9170086123049259, + 0.9215180762112141, + 0.9295688942074776, + 0.9493078105151653, + 0.9525688365101814, + 0.9282892569899559, + 0.9166891686618328, + 0.9166891686618328, + 0.9542377665638924, + 0.9203590452671051, + 0.9298180229961872, + 0.9164777584373951, + 0.9835781529545784, + 0.9162579663097858, + 0.9338590316474438, + 0.9161797352135181, + 0.9432979859411716, + 0.9378399699926376, + 0.9360890835523605, + 0.9498782455921173, + 0.9323894046247005, + 0.9298492223024368, + 0.9139887988567352, + 0.9212000295519829, + 0.9687980636954308, + 0.9119091555476189, + 1.2714751064777374, + 0.9619481861591339, + 0.926559790968895, + 0.915199052542448, + 0.9224982932209969, + 0.9501487948000431, + 0.9328792802989483, + 0.9185187518596649, + 0.9193378500640392, + 0.9123189374804497, + 0.9492491371929646, + 0.9165280498564243, + 0.9175078012049198, + 0.9184679947793484, + 0.9701489470899105, + 0.914938747882843, + 0.9145801886916161, + 0.9125489741563797, + 0.9086690843105316, + 1.0142591781914234, + 0.9234589524567127, + 0.9141997434198856, + 0.913089606910944, + 0.9656879119575024, + 0.9122099727392197, + 0.9320080280303955, + 0.9201387874782085, + 0.9486991912126541, + 0.9440178982913494, + 0.9297989308834076, + 0.9130081161856651, + 0.9168577380478382 + ] + }, + "warm_ms": { + "control": [ + 9.490805212408304, + 2.225864212960005, + 2.0169448107481003 + ], + "nodedup": [ + 2.9914630576968193, + 1.1084573343396187, + 1.0617366060614586 + ], + "library": [ + 1.3225139118731022, + 1.1047064326703548, + 1.0427082888782024 + ] + }, + "stats": { + "control": { + "n": 400, + "median_ms": 1.8652472645044327, + "p10_ms": 1.8302639480680227, + "p90_ms": 1.951183145865798, + "min_ms": 1.8133078701794147, + "max_ms": 2.39767087623477, + "mean_ms": 1.880019810050726 + }, + "nodedup": { + "n": 400, + "median_ms": 0.9582778438925743, + "p10_ms": 0.9347965940833092, + "p90_ms": 1.0003221686929464, + "min_ms": 0.9256480261683464, + "max_ms": 1.734619028866291, + "mean_ms": 0.966738541610539 + }, + "library": { + "n": 400, + "median_ms": 0.9258841164410114, + "p10_ms": 0.9102959185838699, + "p90_ms": 0.9674140252172947, + "min_ms": 0.897690188139677, + "max_ms": 1.3334942050278187, + "mean_ms": 0.9358059172518551 + } + }, + "ratio_control_over_nodedup": { + "ratio": 1.9464576754980596, + "ci90_low": 1.9383629048961062, + "ci90_high": 1.9535108813273627, + "bootstrap_samples": 2000 + }, + "ratio_library_over_nodedup": { + "ratio": 0.966195892289466, + "ci90_low": 0.9600522323675742, + "ci90_high": 0.970872152854688, + "bootstrap_samples": 2000 + }, + "ratio_control_over_library": { + "ratio": 2.014558011508202, + "ci90_low": 2.0053092547052613, + "ci90_high": 2.0254384124108196, + "bootstrap_samples": 2000 + }, + "paired_round_ratio_control_over_nodedup": { + "median": 1.9509387994682013, + "p10": 1.9315792350633012, + "p90": 1.9697979345236176 + }, + "minimum_detectable_improvement": 0.06482743607180769, + "compile": { + "control": { + "lower_s": 4.173467952758074, + "compile_s": 10.786670500412583, + "first_call_s": 0.023160339798778296, + "trace_calls": 32, + "flops": 34354852.0, + "hlo_sort_count": 15, + "stablehlo_sort_count": 3, + "hlo_sort_shapes": [ + "(f64[69849]{0}, f64[69849]{0}, s64[69849]{0}, s32[69849]{0})", + "(f64[4,60]{1,0}, f64[4,60]{1,0}, s64[4,60]{1,0}, s32[4,60]{1,0})", + "(f64[4,720]{1,0}, f64[4,720]{1,0}, s64[4,720]{1,0}, s32[4,720]{1,0})", + "(f64[4,60]{1,0}, f64[4,60]{1,0}, s64[4,60]{1,0}, s32[4,60]{1,0})", + "(f64[4,720]{1,0}, f64[4,720]{1,0}, s64[4,720]{1,0}, s32[4,720]{1,0})", + "(f64[4,60]{1,0}, f64[4,60]{1,0}, s64[4,60]{1,0}, s32[4,60]{1,0})", + "(f64[4,720]{1,0}, f64[4,720]{1,0}, s64[4,720]{1,0}, s32[4,720]{1,0})", + "(f64[4,60]{1,0}, f64[4,60]{1,0}, s64[4,60]{1,0}, s32[4,60]{1,0})", + "(f64[4,720]{1,0}, f64[4,720]{1,0}, s64[4,720]{1,0}, s32[4,720]{1,0})", + "(f64[4,60]{1,0}, f64[4,60]{1,0}, s64[4,60]{1,0}, s32[4,60]{1,0})", + "(f64[4,720]{1,0}, f64[4,720]{1,0}, s64[4,720]{1,0}, s32[4,720]{1,0})", + "(f64[4,60]{1,0}, f64[4,60]{1,0}, s64[4,60]{1,0}, s32[4,60]{1,0})", + "(f64[4,720]{1,0}, f64[4,720]{1,0}, s64[4,720]{1,0}, s32[4,720]{1,0})", + "(f64[4,60]{1,0}, f64[4,60]{1,0}, s64[4,60]{1,0}, s32[4,60]{1,0})", + "(f64[4,720]{1,0}, f64[4,720]{1,0}, s64[4,720]{1,0}, s32[4,720]{1,0})" + ], + "hlo_sha256": "2f3645466f88e98f", + "hlo_lines": 13620 + }, + "nodedup": { + "lower_s": 3.6988732116296887, + "compile_s": 6.390985717996955, + "first_call_s": 0.0121862618252635, + "trace_calls": 32, + "flops": 21982160.0, + "hlo_sort_count": 7, + "stablehlo_sort_count": 1, + "hlo_sort_shapes": [ + "(f64[4,60]{1,0}, f64[4,60]{1,0}, s64[4,60]{1,0}, s32[4,60]{1,0})", + "(f64[4,60]{1,0}, f64[4,60]{1,0}, s64[4,60]{1,0}, s32[4,60]{1,0})", + "(f64[4,60]{1,0}, f64[4,60]{1,0}, s64[4,60]{1,0}, s32[4,60]{1,0})", + "(f64[4,60]{1,0}, f64[4,60]{1,0}, s64[4,60]{1,0}, s32[4,60]{1,0})", + "(f64[4,60]{1,0}, f64[4,60]{1,0}, s64[4,60]{1,0}, s32[4,60]{1,0})", + "(f64[4,60]{1,0}, f64[4,60]{1,0}, s64[4,60]{1,0}, s32[4,60]{1,0})", + "(f64[4,60]{1,0}, f64[4,60]{1,0}, s64[4,60]{1,0}, s32[4,60]{1,0})" + ], + "hlo_sha256": "ebcb9c92b2c67add", + "hlo_lines": 9722 + }, + "library": { + "lower_s": 3.6674820818006992, + "compile_s": 0.5060227210633457, + "first_call_s": 0.011738617904484272, + "trace_calls": 32, + "flops": 21982160.0, + "hlo_sort_count": 7, + "stablehlo_sort_count": 1, + "hlo_sort_shapes": [ + "(f64[4,60]{1,0}, f64[4,60]{1,0}, s64[4,60]{1,0}, s32[4,60]{1,0})", + "(f64[4,60]{1,0}, f64[4,60]{1,0}, s64[4,60]{1,0}, s32[4,60]{1,0})", + "(f64[4,60]{1,0}, f64[4,60]{1,0}, s64[4,60]{1,0}, s32[4,60]{1,0})", + "(f64[4,60]{1,0}, f64[4,60]{1,0}, s64[4,60]{1,0}, s32[4,60]{1,0})", + "(f64[4,60]{1,0}, f64[4,60]{1,0}, s64[4,60]{1,0}, s32[4,60]{1,0})", + "(f64[4,60]{1,0}, f64[4,60]{1,0}, s64[4,60]{1,0}, s32[4,60]{1,0})", + "(f64[4,60]{1,0}, f64[4,60]{1,0}, s64[4,60]{1,0}, s32[4,60]{1,0})" + ], + "hlo_sha256": "ebcb9c92b2c67add", + "hlo_lines": 9722 + } + }, + "instances_compared": [ + [ + 0, + 1, + 2, + 3 + ], + [ + 4, + 5, + 6, + 7 + ], + [ + 8, + 9, + 10, + 11 + ], + [ + 12, + 13, + 14, + 15 + ] + ], + "values": { + "control": [ + [ + 7.743201200876806, + 4.90119982600354, + 8.551453428732433, + 7.64017039895814 + ], + [ + 7.25809567478034, + 9.29357838657636, + 3.033879650515197, + 8.714615086385908 + ], + [ + 4.73517315947449, + 3.2233889243165876, + 9.296501815740568, + 6.74861581547119 + ], + [ + -1.402814315064127, + 0.5885274382499839, + 6.162997261446637, + -10.499150878933385 + ] + ], + "nodedup": [ + [ + 7.743201200876806, + 4.90119982600354, + 8.551453428732433, + 7.64017039895814 + ], + [ + 7.25809567478034, + 9.29357838657636, + 3.033879650515197, + 8.714615086385908 + ], + [ + 4.73517315947449, + 3.2233889243165876, + 9.296501815740568, + 6.74861581547119 + ], + [ + -1.402814315064127, + 0.5885274382499839, + 6.162997261446637, + -10.499150878933385 + ] + ], + "library": [ + [ + 7.743201200876806, + 4.90119982600354, + 8.551453428732433, + 7.64017039895814 + ], + [ + 7.25809567478034, + 9.29357838657636, + 3.033879650515197, + 8.714615086385908 + ], + [ + 4.73517315947449, + 3.2233889243165876, + 9.296501815740568, + 6.74861581547119 + ], + [ + -1.402814315064127, + 0.5885274382499839, + 6.162997261446637, + -10.499150878933385 + ] + ] + }, + "deterministic_within_route": { + "control": true, + "nodedup": true, + "library": true + }, + "likelihood_gate": { + "control_vs_nodedup": { + "bit_identical": true, + "max_abs_delta": 0.0, + "max_rel_delta": 0.0, + "nan_pattern_equal": true + }, + "control_vs_library": { + "bit_identical": true, + "max_abs_delta": 0.0, + "max_rel_delta": 0.0, + "nan_pattern_equal": true + }, + "nodedup_vs_library": { + "bit_identical": true, + "max_abs_delta": 0.0, + "max_rel_delta": 0.0, + "nan_pattern_equal": true + } + } + }, + "simple_plain": { + "label": "simple_plain", + "batch": null, + "n_rounds": 20, + "n_calls_per_round": 20, + "n_warm": 3, + "route_order": "round-robin, start rotated each round", + "per_call_ms": { + "control": [ + 1.8049878999590874, + 1.8001892603933811, + 1.7642690800130367, + 1.8190681003034115, + 1.7899279482662678, + 1.7727171070873737, + 1.7690188251435757, + 1.7940490506589413, + 1.7888383008539677, + 1.8193679861724377, + 1.7619188874959946, + 1.7613694071769714, + 1.766697969287634, + 1.8181283958256245, + 1.7819288186728954, + 1.8011480569839478, + 1.7818775959312916, + 1.7524589784443378, + 1.8203477375209332, + 1.7921580001711845, + 1.8002581782639027, + 1.7016399651765823, + 1.7327587120234966, + 1.6966704279184341, + 1.6946690157055855, + 1.7061899416148663, + 1.7037400975823402, + 1.7526978626847267, + 1.7130686901509762, + 1.6984599642455578, + 1.6912189312279224, + 1.6823001205921173, + 1.6938801854848862, + 1.693708822131157, + 1.683490350842476, + 1.6863401979207993, + 1.6833189874887466, + 1.6828887164592743, + 1.6771787777543068, + 1.6737389378249645, + 1.758689060807228, + 1.7126686871051788, + 1.7053899355232716, + 1.7486689612269402, + 1.683149952441454, + 1.6934601590037346, + 1.6812998801469803, + 1.677239779382944, + 1.6878200694918633, + 1.6923090443015099, + 1.6816197894513607, + 1.6821697354316711, + 1.6736299730837345, + 1.691579818725586, + 1.6667097806930542, + 1.6775899566709995, + 1.6717403195798397, + 1.675490289926529, + 1.687290146946907, + 1.7295987345278263, + 1.7182487063109875, + 1.7347298562526703, + 1.7043789848685265, + 1.7061303369700909, + 1.709728967398405, + 1.751558855175972, + 1.7209788784384727, + 1.706229057163, + 1.6899500042200089, + 1.6901800408959389, + 1.6849888488650322, + 1.6896901652216911, + 1.6788500361144543, + 1.691669225692749, + 1.6851900145411491, + 1.685400027781725, + 1.6838600859045982, + 1.687859185039997, + 1.6791201196610928, + 1.670530065894127, + 1.7503490671515465, + 1.6871602274477482, + 1.6833101399242878, + 1.6816388815641403, + 1.6722287982702255, + 1.6825702041387558, + 1.6563399694859982, + 1.658150926232338, + 1.6572489403188229, + 1.6655391082167625, + 1.694748643785715, + 1.6608787700533867, + 1.6613188199698925, + 1.6469089314341545, + 1.6821990720927715, + 1.6499687917530537, + 1.6846791841089725, + 1.6831792891025543, + 1.6944683156907558, + 1.7034588381648064, + 2.3582428693771362, + 1.8407679162919521, + 1.7608879134058952, + 1.7542988061904907, + 1.7801490612328053, + 1.7394092865288258, + 1.7403289675712585, + 1.7039687372744083, + 1.677710097283125, + 1.6911490820348263, + 1.6809799708425999, + 1.6807098872959614, + 1.7035803757607937, + 1.710160169750452, + 1.7096190713346004, + 1.7016492784023285, + 1.7028790898621082, + 1.6874196007847786, + 1.698219683021307, + 1.7367489635944366, + 1.6737398691475391, + 1.6726702451705933, + 1.6770688816905022, + 1.6744802705943584, + 1.661989837884903, + 1.6803699545562267, + 1.6858200542628765, + 1.6626911237835884, + 1.6761990264058113, + 1.6602999530732632, + 1.669399905949831, + 1.6516698524355888, + 1.6626901924610138, + 1.6597500070929527, + 1.6638096421957016, + 1.6835988499224186, + 1.7037000507116318, + 1.6884398646652699, + 1.6858987510204315, + 1.697629690170288, + 1.7166598699986935, + 1.696219202131033, + 1.689970027655363, + 1.7130686901509762, + 1.700730063021183, + 1.6830600798130035, + 1.6745198518037796, + 1.6720099374651909, + 1.6697999089956284, + 1.695679035037756, + 1.6677300445735455, + 1.6732900403439999, + 1.6648601740598679, + 1.6989498399198055, + 1.6757198609411716, + 1.678899396210909, + 1.6630003228783607, + 1.6737300902605057, + 1.6716700047254562, + 1.6566803678870201, + 1.7131892964243889, + 1.7099389806389809, + 1.7137890681624413, + 1.701780129224062, + 1.6993600875139236, + 1.6899886541068554, + 1.6865390352904797, + 1.6966690309345722, + 1.6970792785286903, + 1.6940287314355373, + 1.6737389378249645, + 1.6804789192974567, + 1.6790879890322685, + 1.6842177137732506, + 1.6701188869774342, + 1.6704690642654896, + 1.70919019728899, + 1.676690299063921, + 1.6722697764635086, + 2.22176406532526, + 1.6839299350976944, + 1.7014001496136189, + 1.6842000186443329, + 1.696889754384756, + 1.684039831161499, + 1.6822000034153461, + 1.679569948464632, + 1.6810200177133083, + 1.6696802340447903, + 1.7054001800715923, + 1.6812598332762718, + 1.6688602045178413, + 1.6920901834964752, + 1.6947700642049313, + 1.6775201074779034, + 1.6939397901296616, + 1.6659698449075222, + 1.690410077571869, + 1.674459781497717, + 1.6648899763822556, + 1.7172601073980331, + 1.6801701858639717, + 1.6713100485503674, + 1.6920799389481544, + 1.6678599640727043, + 1.6774199903011322, + 1.691180281341076, + 1.7443890683352947, + 1.6740686260163784, + 1.7358991317451, + 1.6880501061677933, + 1.6675200313329697, + 1.6617700457572937, + 1.6685603186488152, + 1.6659898683428764, + 1.688309945166111, + 1.7490489408373833, + 1.669399905949831, + 1.683408860117197, + 1.6835886053740978, + 1.6879001632332802, + 1.6862698830664158, + 1.6842298209667206, + 1.6898592002689838, + 1.7111282795667648, + 1.703939400613308, + 1.7005889676511288, + 1.7023389227688313, + 1.701198983937502, + 1.7233788967132568, + 1.7025391571223736, + 1.6900491900742054, + 1.7010890878736973, + 1.702908892184496, + 1.695958897471428, + 1.7053387127816677, + 1.7050690948963165, + 1.6981191001832485, + 2.009076066315174, + 1.6737398691475391, + 1.6784998588263988, + 1.6740700230002403, + 1.67091004550457, + 1.6647600568830967, + 1.6715098172426224, + 2.119074109941721, + 1.6756197437644005, + 1.6764001920819283, + 1.675439067184925, + 1.6683298163115978, + 1.6849301755428314, + 1.6722800210118294, + 1.6760998405516148, + 1.6702399589121342, + 1.6695298254489899, + 1.6621500253677368, + 1.6616196371614933, + 1.6693901270627975, + 1.6854899004101753, + 1.6783098690211773, + 1.686489675194025, + 1.6695898957550526, + 1.6624201089143753, + 1.657949760556221, + 1.6589900478720665, + 1.6548600979149342, + 1.658760942518711, + 1.6635991632938385, + 1.671168953180313, + 1.6726390458643436, + 1.685689203441143, + 1.6705486923456192, + 1.6695689409971237, + 1.6814786940813065, + 1.69738894328475, + 1.689339056611061, + 1.6885986551642418, + 1.6921977512538433, + 1.6942382790148258, + 1.6898782923817635, + 1.6805077902972698, + 1.6861888580024242, + 1.683569047600031, + 1.6921288333833218, + 1.6817986033856869, + 1.6908789984881878, + 1.6868487000465393, + 1.686398871243, + 1.6848291270434856, + 1.6620098613202572, + 1.672340091317892, + 1.6554798930883408, + 1.663239672780037, + 1.6645798459649086, + 1.667739823460579, + 1.6760602593421936, + 1.6474402509629726, + 1.6489499248564243, + 1.6506700776517391, + 1.6559399664402008, + 1.6760588623583317, + 1.6596904024481773, + 1.6534999012947083, + 1.6628806479275227, + 1.6755801625549793, + 1.669150311499834, + 1.6680597327649593, + 1.6574100591242313, + 1.659640111029148, + 1.6503902152180672, + 1.6750390641391277, + 1.670589204877615, + 1.6720602288842201, + 1.6997293569147587, + 1.6746297478675842, + 1.69351976364851, + 1.6881688497960567, + 1.6977186314761639, + 1.6936189495027065, + 1.6753701493144035, + 1.7193490639328957, + 1.6774889081716537, + 1.6743200831115246, + 1.6777398996055126, + 1.7074402421712875, + 1.677350141108036, + 1.6583800315856934, + 1.666800118982792, + 1.664420124143362, + 1.6843597404658794, + 1.664699986577034, + 1.6830600798130035, + 1.661510206758976, + 1.672650221735239, + 1.6652503982186317, + 1.6639898531138897, + 1.6677803359925747, + 1.6759298741817474, + 1.683180220425129, + 1.7069103196263313, + 1.6896789893507957, + 1.691558863967657, + 1.669829711318016, + 1.6728001646697521, + 1.6697002574801445, + 1.6827099025249481, + 1.6861003823578358, + 1.6825399361550808, + 1.6639302484691143, + 1.6782600432634354, + 1.6835997812449932, + 1.706159207969904, + 1.6939099878072739, + 1.683759968727827, + 1.6899481415748596, + 1.6802488826215267, + 1.6605891287326813, + 1.6615488566458225, + 1.6629290767014027, + 1.6626291908323765, + 1.6871597617864609, + 1.6666790470480919, + 1.6768090426921844, + 1.6875378787517548, + 1.6622887924313545, + 1.6705193556845188, + 1.6683288849890232, + 1.6651791520416737, + 1.6704490408301353, + 1.667108852416277, + 1.6823182813823223, + 1.8387269228696823, + 1.7222678288817406, + 1.7116502858698368, + 1.7021289095282555, + 1.6935593448579311, + 1.7068199813365936, + 1.7099399119615555, + 1.7096190713346004, + 1.7158500850200653, + 1.7355992458760738, + 1.6967994160950184, + 1.692608930170536, + 1.7011300660669804, + 1.694090198725462, + 1.6989600844681263, + 1.6965600661933422, + 1.6915900632739067, + 1.691949088126421, + 1.6860701143741608, + 1.6809199005365372, + 1.6859597526490688, + 1.6778698191046715, + 1.694769598543644, + 1.6978699713945389, + 1.7092390917241573, + 1.6902689822018147, + 1.689390279352665, + 1.6650799661874771, + 1.6635498031973839 + ], + "nodedup": [ + 0.8998890407383442, + 0.9082579053938389, + 0.8689002133905888, + 0.8482998237013817, + 0.8574496023356915, + 0.8583799935877323, + 0.8352687582373619, + 0.8577709086239338, + 0.8417293429374695, + 0.8439812809228897, + 0.8738590404391289, + 0.8925087749958038, + 0.8461601100862026, + 0.8458690717816353, + 0.8412706665694714, + 0.8392189629375935, + 0.8675600402057171, + 1.1970559135079384, + 0.8483803831040859, + 0.8630501106381416, + 0.8414587937295437, + 0.8501303382217884, + 0.8375290781259537, + 0.864159781485796, + 0.9131990373134613, + 0.8744192309677601, + 0.8369912393391132, + 0.8483501151204109, + 0.8603502064943314, + 0.8549201302230358, + 0.8404902182519436, + 0.8372906595468521, + 0.8440790697932243, + 0.8437801152467728, + 0.8725388906896114, + 0.8546588942408562, + 0.8392413146793842, + 0.8519599214196205, + 0.8446001447737217, + 0.8610389195382595, + 0.893929973244667, + 0.8516702800989151, + 0.8535911329090595, + 0.8274600841104984, + 0.818869099020958, + 0.8212309330701828, + 0.8220300078392029, + 0.8370210416615009, + 0.849609263241291, + 0.8335411548614502, + 0.818879809230566, + 0.815690029412508, + 0.8106911554932594, + 0.81596989184618, + 0.8347802795469761, + 0.8379798382520676, + 0.8225999772548676, + 0.8072499185800552, + 0.8183298632502556, + 0.8186111226677895, + 0.8565890602767467, + 0.8313199505209923, + 0.8185696788132191, + 0.8188402280211449, + 0.8446699939668179, + 0.8549001067876816, + 0.8608601056039333, + 0.8129999041557312, + 0.8099591359496117, + 0.8173510432243347, + 0.8185398764908314, + 0.8408296853303909, + 0.831719022244215, + 0.820050947368145, + 0.830099917948246, + 0.8231988176703453, + 0.8237911388278008, + 0.8232900872826576, + 0.8430099114775658, + 0.8209487423300743, + 0.8440888486802578, + 0.8522607386112213, + 0.8254391141235828, + 0.8126008324325085, + 0.8187801577150822, + 0.8145300671458244, + 0.8169109933078289, + 0.8184798061847687, + 0.8375602774322033, + 0.8396790362894535, + 0.8203010074794292, + 0.7982999086380005, + 0.8013900369405746, + 0.8026799187064171, + 0.7945499382913113, + 0.7960312068462372, + 0.801360234618187, + 0.817800872027874, + 0.8181799203157425, + 0.7963408716022968, + 1.1676149442791939, + 0.8132588118314743, + 0.810990110039711, + 0.810449942946434, + 0.8142311125993729, + 0.8362801745533943, + 0.822099857032299, + 0.825229100883007, + 0.8101197890937328, + 0.8219089359045029, + 0.8235792629420757, + 0.8483999408781528, + 0.8173789829015732, + 0.8132397197186947, + 0.8447887375950813, + 0.8230707608163357, + 0.8161901496350765, + 0.8102105930447578, + 0.8202898316085339, + 0.8150292560458183, + 0.8871280588209629, + 0.8525089360773563, + 0.834690872579813, + 0.8289101533591747, + 0.858270563185215, + 0.8687390945851803, + 0.8724601939320564, + 0.8378601633012295, + 0.8487589657306671, + 0.8393200114369392, + 0.8218986913561821, + 0.8313199505209923, + 0.8298889733850956, + 0.8246502839028835, + 0.8178688585758209, + 0.8218800649046898, + 0.834478996694088, + 0.8116597309708595, + 0.8122902363538742, + 0.8134800009429455, + 0.8078711107373238, + 0.8178791031241417, + 0.8396599441766739, + 0.832688994705677, + 0.8274111896753311, + 0.8275499567389488, + 0.8316501043736935, + 0.8255890570580959, + 0.8123498409986496, + 0.809790100902319, + 0.810328871011734, + 0.8094911463558674, + 0.8326303213834763, + 0.8318210020661354, + 0.8257003501057625, + 0.8235909044742584, + 0.8337004110217094, + 0.8207010105252266, + 0.8208099752664566, + 0.8319402113556862, + 0.8414690382778645, + 0.8139507845044136, + 0.8317199535667896, + 0.8233101107180119, + 0.8089803159236908, + 0.8169896900653839, + 1.0170582681894302, + 0.8292598649859428, + 0.8321208879351616, + 0.8168802596628666, + 0.8198008872568607, + 0.8254898712038994, + 0.809940043836832, + 0.8217091672122478, + 0.8445587009191513, + 0.8358298800885677, + 0.8298098109662533, + 0.8569499477744102, + 0.8429489098489285, + 0.8214209228754044, + 0.8216598071157932, + 0.8140113204717636, + 0.814720056951046, + 0.8205086924135685, + 0.8177002891898155, + 0.8431188762187958, + 0.8550798520445824, + 0.8301590569317341, + 0.8152909576892853, + 0.8181100711226463, + 0.8189007639884949, + 0.8151889778673649, + 0.8161603473126888, + 0.8314209990203381, + 0.8382289670407772, + 0.8194800466299057, + 0.8161598816514015, + 0.8497298695147038, + 0.8292589336633682, + 0.8143112063407898, + 0.8154790848493576, + 0.8111400529742241, + 0.8131098002195358, + 0.8120588026940823, + 0.835079699754715, + 0.8381996303796768, + 0.8257408626377583, + 0.8080401457846165, + 0.8238712325692177, + 0.8178399875760078, + 0.8168406784534454, + 0.8140997961163521, + 0.8148197084665298, + 0.8361111395061016, + 0.8312403224408627, + 0.8336897008121014, + 0.8247899822890759, + 0.808370765298605, + 0.8218903094530106, + 0.8168700151145458, + 0.8778190240263939, + 0.8270596154034138, + 0.8195987902581692, + 0.8159708231687546, + 0.8190702646970749, + 0.8162707090377808, + 0.8140788413584232, + 0.8345297537744045, + 0.8358098566532135, + 0.8197701536118984, + 0.8062608540058136, + 0.8107000030577183, + 0.8182907477021217, + 0.8008899167180061, + 0.8088210597634315, + 0.8160499855875969, + 0.8140993304550648, + 0.8383691310882568, + 0.8333488367497921, + 0.8217100985348225, + 0.8347700349986553, + 0.8345399983227253, + 0.8241687901318073, + 0.8107409812510014, + 0.8123898878693581, + 0.8163810707628727, + 0.8097700774669647, + 0.8340287022292614, + 0.8290698751807213, + 0.8215899579226971, + 0.8152010850608349, + 0.8123889565467834, + 0.8080806583166122, + 0.8148103952407837, + 0.8122310973703861, + 0.8132890798151493, + 0.8159507997334003, + 0.8414001204073429, + 0.845820177346468, + 0.8227797225117683, + 0.8066999725997448, + 0.8034608326852322, + 0.7950998842716217, + 0.8100210689008236, + 0.7959799841046333, + 0.798580702394247, + 0.8080797269940376, + 0.8108499459922314, + 0.8218688890337944, + 0.8513601496815681, + 0.8225799538195133, + 0.8022300899028778, + 0.8388906717300415, + 0.8167196065187454, + 0.8198712021112442, + 0.818219967186451, + 0.8311099372804165, + 0.8217012509703636, + 0.8160797879099846, + 0.8063800632953644, + 0.8203303441405296, + 0.8011097088456154, + 0.7960409857332706, + 0.7996698841452599, + 0.7982309907674789, + 0.8569988422095776, + 0.8121086284518242, + 0.7962808012962341, + 0.8336789906024933, + 0.8029397577047348, + 0.8048187009990215, + 0.8011911995708942, + 0.8181598968803883, + 0.8233287371695042, + 0.8065700531005859, + 0.8127298206090927, + 0.8007609285414219, + 0.8043888956308365, + 0.7997606880962849, + 0.8008298464119434, + 0.8445698767900467, + 0.8231098763644695, + 0.8107009343802929, + 0.7972000166773796, + 0.8272510021924973, + 0.8244100026786327, + 0.8109202608466148, + 0.8177305571734905, + 0.8095698431134224, + 0.8197999559342861, + 0.7972097955644131, + 0.7968107238411903, + 0.7986798882484436, + 0.8183801546692848, + 0.8156890980899334, + 0.812190119177103, + 0.8026706054806709, + 0.7980801165103912, + 0.8026310242712498, + 0.8086496964097023, + 0.819000881165266, + 0.8161100558936596, + 0.8200709708034992, + 0.8092001080513, + 0.8090212941169739, + 0.8279299363493919, + 0.8395509794354439, + 0.8251001127064228, + 0.8219890296459198, + 0.8072010241448879, + 0.8117500692605972, + 0.8085314184427261, + 0.8091502822935581, + 0.8163000456988811, + 0.8193189278244972, + 0.8313003927469254, + 0.8398890495300293, + 0.8209403604269028, + 0.8388310670852661, + 0.81642996519804, + 0.861569307744503, + 0.8124210871756077, + 0.8077300153672695, + 0.8125607855618, + 0.8186502382159233, + 0.8218912407755852, + 0.8306996896862984, + 0.8399607613682747, + 0.8301902562379837, + 0.808429904282093, + 0.8072010241448879, + 0.8132602088153362, + 0.8184299804270267, + 0.8130287751555443, + 0.8134907111525536, + 0.8105002343654633, + 0.8287611417472363, + 0.8484800346195698, + 0.8179191499948502, + 0.8087209425866604, + 0.9103287011384964, + 0.8397698402404785, + 0.8594491519033909, + 0.8535296656191349, + 0.850349199026823, + 0.8517089299857616, + 0.8384496904909611, + 0.8375402539968491, + 0.8643004111945629, + 0.8473386988043785, + 0.851338729262352, + 0.8435510098934174, + 0.833198893815279, + 0.842090230435133, + 0.8687088266015053, + 0.8567310869693756, + 0.8626198396086693, + 0.8536092936992645, + 0.8170297369360924, + 0.8043898269534111, + 0.8020801469683647, + 0.8290293626487255, + 0.8290200494229794, + 0.8084001019597054, + 0.8024401031434536, + 0.8149412460625172, + 0.8105500601232052, + 0.8043809793889523, + 0.8056499063968658, + 0.8019912056624889, + 0.824859831482172, + 0.8499701507389545, + 0.8018100634217262, + 0.8076396770775318, + 0.802190974354744, + 0.8007199503481388, + 0.7968908175826073, + 0.8050799369812012, + 0.8053509518504143, + 0.8141100406646729 + ], + "library": [ + 0.8725691586732864, + 0.8236691355705261, + 0.8268407545983791, + 0.826708972454071, + 0.8363798260688782, + 0.8595702238380909, + 0.8285199292004108, + 0.8211308158934116, + 0.8224588818848133, + 0.8242009207606316, + 0.8242097683250904, + 0.8311099372804165, + 0.8425288833677769, + 0.8330191485583782, + 0.8249087259173393, + 0.8278689347207546, + 0.8339909836649895, + 0.8238190785050392, + 0.8364510722458363, + 0.8428399451076984, + 0.8257501758635044, + 0.8152411319315434, + 0.8254703134298325, + 0.8230507373809814, + 0.8297986350953579, + 0.8632899262011051, + 0.8361786603927612, + 0.8332999423146248, + 0.8244509808719158, + 0.82765007391572, + 0.8461899124085903, + 0.8307192474603653, + 0.8319192565977573, + 0.8287997916340828, + 0.8075898513197899, + 0.8200402371585369, + 0.8354899473488331, + 0.8302503265440464, + 0.7932297885417938, + 0.7974002510309219, + 0.8368892595171928, + 0.7965210825204849, + 0.7927198894321918, + 0.8038408122956753, + 0.7964600808918476, + 0.8558998815715313, + 0.8308403193950653, + 0.8211997337639332, + 0.8046100847423077, + 0.8133500814437866, + 0.8091707713901997, + 0.7959199137985706, + 0.7981909438967705, + 0.8136192336678505, + 0.806350726634264, + 0.7957299239933491, + 0.7974901236593723, + 0.8005611598491669, + 0.7948800921440125, + 0.8079409599304199, + 0.8323690854012966, + 0.8085109293460846, + 0.7970598526299, + 0.8001308888196945, + 0.8089998736977577, + 0.8331700228154659, + 0.8162199519574642, + 0.7952810265123844, + 0.7978002540767193, + 0.8064000867307186, + 0.784990843385458, + 0.8017402142286301, + 0.7969108410179615, + 0.8157296106219292, + 0.806101132184267, + 0.8348198607563972, + 0.7930099964141846, + 0.8090599440038204, + 0.8011199533939362, + 0.8064997382462025, + 0.775699969381094, + 0.7783398032188416, + 0.7852800190448761, + 0.7814997807145119, + 0.7678610272705555, + 0.7769898511469364, + 0.7812408730387688, + 0.7802299223840237, + 0.777841079980135, + 0.7992102764546871, + 0.7989108562469482, + 0.7909098640084267, + 0.785761047154665, + 0.7809102535247803, + 0.774990301579237, + 0.7844609208405018, + 0.7882099598646164, + 0.7871109992265701, + 0.7799901068210602, + 0.7762107998132706, + 1.2746029533445835, + 0.8990592323243618, + 0.8611301891505718, + 0.8287699893116951, + 0.8519897237420082, + 0.8792090229690075, + 0.8679698221385479, + 0.8377390913665295, + 0.8330787532031536, + 0.8361400105059147, + 0.8354089222848415, + 0.8548498153686523, + 0.8643693290650845, + 0.846360344439745, + 0.8383900858461857, + 0.8376291953027248, + 0.8320203050971031, + 0.8345190435647964, + 0.832810066640377, + 0.8576191030442715, + 0.8338503539562225, + 0.8131591603159904, + 0.8060606196522713, + 0.8023097179830074, + 0.7964111864566803, + 0.8042487315833569, + 0.8031702600419521, + 0.7926700636744499, + 0.7986999116837978, + 0.8004810661077499, + 0.8012698963284492, + 0.7909610867500305, + 0.8134390227496624, + 0.8251909166574478, + 0.8078902028501034, + 0.8100611157715321, + 0.8122799918055534, + 0.8035800419747829, + 0.7992396131157875, + 0.7954803295433521, + 0.7938812486827374, + 0.7988903671503067, + 0.8179601281881332, + 0.8198698051273823, + 0.8180998265743256, + 0.8092899806797504, + 0.8031008765101433, + 0.8019297383725643, + 0.7910099811851978, + 0.7930700667202473, + 0.7942300289869308, + 0.7906812243163586, + 0.7916600443422794, + 0.7964707911014557, + 0.8137202821671963, + 0.818260945379734, + 0.8101989515125751, + 0.8185300976037979, + 0.8234800770878792, + 0.8011311292648315, + 0.7984600961208344, + 0.8026612922549248, + 0.8093188516795635, + 0.8014906197786331, + 0.7911501452326775, + 0.7935501635074615, + 0.7964908145368099, + 0.7896600291132927, + 0.8139605633914471, + 0.8130902424454689, + 0.8219210430979729, + 0.8094301447272301, + 0.8086711168289185, + 0.7930900901556015, + 0.7993811741471291, + 0.7832399569451809, + 0.797830056399107, + 0.8033802732825279, + 0.8004899136722088, + 0.8052713237702847, + 0.8014398626983166, + 0.795980915427208, + 0.9022899903357029, + 0.8343192748725414, + 0.8050901815295219, + 0.802729744464159, + 0.7980810478329659, + 0.8003199473023415, + 0.7968214340507984, + 0.8002500981092453, + 0.7946197874844074, + 0.7880297489464283, + 0.7990398444235325, + 0.818189699202776, + 0.8168700151145458, + 0.806350726634264, + 0.8298400789499283, + 0.8069206960499287, + 0.7901699282228947, + 0.8005811832845211, + 0.7968898862600327, + 0.7918900810182095, + 0.792820006608963, + 0.8171889930963516, + 0.8096112869679928, + 0.8403891697525978, + 0.8125812746584415, + 0.7908702827990055, + 0.8030110038816929, + 0.8068699389696121, + 0.7984498515725136, + 0.7906202226877213, + 0.7929098792374134, + 0.8043297566473484, + 0.7919198833405972, + 0.8268607780337334, + 0.8205301128327847, + 0.8066007867455482, + 0.8126702159643173, + 0.7969210855662823, + 0.7867999374866486, + 0.7957108318805695, + 0.7978100329637527, + 0.7899808697402477, + 0.8020796813070774, + 0.7949499413371086, + 0.7978598587214947, + 0.8139298297464848, + 0.8143801242113113, + 0.8098790422081947, + 0.8014501072466373, + 0.801479909569025, + 0.7928209379315376, + 0.8598989807069302, + 0.7898909971117973, + 0.79329963773489, + 0.7879398763179779, + 0.7963399402797222, + 0.8132299408316612, + 0.8120010606944561, + 0.8219899609684944, + 0.7963208481669426, + 0.799049623310566, + 0.9693489409983158, + 0.7937699556350708, + 0.7922602817416191, + 0.8094902150332928, + 0.7963399402797222, + 0.7992107421159744, + 0.8027302101254463, + 0.783280935138464, + 0.794840045273304, + 0.7946607656776905, + 0.7885396480560303, + 0.7839608006179333, + 0.7805698551237583, + 0.7852013222873211, + 0.7836297154426575, + 0.8212500251829624, + 0.817169900983572, + 0.7950002327561378, + 0.7906206883490086, + 0.7933899760246277, + 0.7927711121737957, + 0.7819202728569508, + 0.8269487880170345, + 0.8001001551747322, + 0.8034599013626575, + 0.7857312448322773, + 0.7913699373602867, + 0.7895613089203835, + 0.7885796949267387, + 0.7924707606434822, + 0.7857098244130611, + 0.7854420691728592, + 0.7865400984883308, + 0.7899296469986439, + 0.8129198104143143, + 0.8086101152002811, + 0.7927310653030872, + 0.8050701580941677, + 0.7952610030770302, + 0.7805600762367249, + 0.7808012887835503, + 0.8077602833509445, + 0.7906509563326836, + 0.7867002859711647, + 0.7843109779059887, + 0.7890299893915653, + 0.7911613211035728, + 0.8061202242970467, + 0.7889601401984692, + 0.7923007942736149, + 0.7820501923561096, + 0.7838909514248371, + 0.7885610684752464, + 0.784990843385458, + 0.791570171713829, + 0.7799109444022179, + 0.790569931268692, + 0.8043111301958561, + 0.7901201024651527, + 0.7924013771116734, + 0.7901503704488277, + 0.8152807131409645, + 0.8246595971286297, + 0.8033798076212406, + 0.793171115219593, + 0.7865512743592262, + 0.7955310866236687, + 0.7944703102111816, + 0.7911212742328644, + 0.7882099598646164, + 0.7845009677112103, + 0.7912302389740944, + 0.8004913106560707, + 0.8044401183724403, + 0.8195699192583561, + 0.8081798441708088, + 0.7998398505151272, + 0.796671025454998, + 0.7963399402797222, + 0.7968209683895111, + 0.7910202257335186, + 0.8076210506260395, + 0.8041500113904476, + 0.7981602102518082, + 0.8028098382055759, + 0.7917801849544048, + 0.7901908829808235, + 0.7992787286639214, + 0.7963310927152634, + 0.7917787879705429, + 0.789241399616003, + 0.7953299209475517, + 0.7905308157205582, + 1.2900149449706078, + 0.8098296821117401, + 0.7940013892948627, + 0.7899496704339981, + 0.8039698004722595, + 0.8089500479400158, + 0.7967408746480942, + 0.7879501208662987, + 0.7929210551083088, + 0.7907701656222343, + 0.7899012416601181, + 0.7955702021718025, + 0.7907510735094547, + 0.8188700303435326, + 0.8065612055361271, + 0.7989201694726944, + 0.7996289059519768, + 0.7941997610032558, + 0.7967296987771988, + 0.8040708489716053, + 0.7938495837152004, + 0.7893810980021954, + 0.7879096083343029, + 0.7867221720516682, + 0.8760201744735241, + 0.805750023573637, + 0.7989709265530109, + 0.7855398580431938, + 0.7815300486981869, + 0.8091907948255539, + 0.792820006608963, + 0.7851109839975834, + 0.7948498241603374, + 0.7903510704636574, + 0.8135703392326832, + 0.8172211237251759, + 0.7901000790297985, + 0.7911999709904194, + 0.775619875639677, + 0.775899738073349, + 0.7843612693250179, + 0.7795598357915878, + 0.7772920653223991, + 0.7842099294066429, + 0.7949909195303917, + 0.7859999313950539, + 0.7919799536466599, + 0.7881508208811283, + 0.7878104224801064, + 0.788490753620863, + 0.7892097346484661, + 0.7801512256264687, + 0.7885899394750595, + 0.8022910915315151, + 0.7932302542030811, + 0.7824697531759739, + 0.7874602451920509, + 0.7846797816455364, + 0.7851407863199711, + 0.7819300517439842, + 0.7850010879337788, + 0.783849973231554, + 0.7843710482120514, + 0.7804711349308491 + ] + }, + "warm_ms": { + "control": [ + 7.389538921415806, + 1.9615069031715393, + 1.830067951232195 + ], + "nodedup": [ + 2.2931620478630066, + 0.9373086504638195, + 1.0683969594538212 + ], + "library": [ + 1.0639172978699207, + 0.9133587591350079, + 0.874329824000597 + ] + }, + "stats": { + "control": { + "n": 400, + "median_ms": 1.6842237673699856, + "p10_ms": 1.6629242338240147, + "p90_ms": 1.7359841149300337, + "min_ms": 1.6469089314341545, + "max_ms": 2.3582428693771362, + "mean_ms": 1.6966876341030002 + }, + "nodedup": { + "n": 400, + "median_ms": 0.8215054403990507, + "p10_ms": 0.8047758135944605, + "p90_ms": 0.8537142537534237, + "min_ms": 0.7945499382913113, + "max_ms": 1.1970559135079384, + "mean_ms": 0.8285584242548794 + }, + "library": { + "n": 400, + "median_ms": 0.7990447338670492, + "p10_ms": 0.7849597372114658, + "p90_ms": 0.8330878801643848, + "min_ms": 0.7678610272705555, + "max_ms": 1.2900149449706078, + "mean_ms": 0.8073775272350758 + } + }, + "ratio_control_over_nodedup": { + "ratio": 2.050167515082876, + "ci90_low": 2.0471320866578218, + "ci90_high": 2.0558867898345463, + "bootstrap_samples": 2000 + }, + "ratio_library_over_nodedup": { + "ratio": 0.9726590897303236, + "ci90_low": 0.9702302074337824, + "ci90_high": 0.9759283371791734, + "bootstrap_samples": 2000 + }, + "ratio_control_over_library": { + "ratio": 2.1077965925875417, + "ci90_low": 2.1030719736619146, + "ci90_high": 2.1131581744035173, + "bootstrap_samples": 2000 + }, + "paired_round_ratio_control_over_nodedup": { + "median": 2.054917009011539, + "p10": 2.008485439214766, + "p90": 2.08462458825218 + }, + "minimum_detectable_improvement": 0.04337896336667088, + "compile": { + "control": { + "lower_s": 2.588778235949576, + "compile_s": 9.397396435961127, + "first_call_s": 0.021797175984829664, + "trace_calls": 32, + "flops": 17394000.0, + "hlo_sort_count": 15, + "stablehlo_sort_count": 3, + "hlo_sort_shapes": [ + "(f64[69849]{0}, f64[69849]{0}, s64[69849]{0}, s32[69849]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0}, s32[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0}, s32[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0}, s32[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0}, s32[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0}, s32[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0}, s32[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0}, s32[720]{0})" + ], + "hlo_sha256": "aeb97efdbe87f224", + "hlo_lines": 13875 + }, + "nodedup": { + "lower_s": 2.238904752768576, + "compile_s": 5.326162123121321, + "first_call_s": 0.010901087895035744, + "trace_calls": 32, + "flops": 6597781.0, + "hlo_sort_count": 7, + "stablehlo_sort_count": 1, + "hlo_sort_shapes": [ + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})" + ], + "hlo_sha256": "ce6a9dde7d3a3ea6", + "hlo_lines": 9781 + }, + "library": { + "lower_s": 2.2467586789280176, + "compile_s": 0.47257327614352107, + "first_call_s": 0.01037547504529357, + "trace_calls": 32, + "flops": 6597781.0, + "hlo_sort_count": 7, + "stablehlo_sort_count": 1, + "hlo_sort_shapes": [ + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})" + ], + "hlo_sha256": "ce6a9dde7d3a3ea6", + "hlo_lines": 9781 + } + }, + "instances_compared": [ + [ + 0 + ], + [ + 1 + ], + [ + 2 + ], + [ + 3 + ], + [ + 4 + ], + [ + 5 + ], + [ + 6 + ], + [ + 7 + ], + [ + 8 + ], + [ + 9 + ], + [ + 10 + ], + [ + 11 + ], + [ + 12 + ], + [ + 13 + ], + [ + 14 + ], + [ + 15 + ] + ], + "values": { + "control": [ + 7.196577317761012, + -45.873021274429995, + 2.9048714587398505, + -801.1656151465145, + -856.2176369539866, + -701.3832757596591, + -791.860330108457, + -641.0597186366746, + -856.8747665323849, + -965.6893581059343, + -601.8962692526685, + 1.491228024977203, + -664.123965739818, + -4.055811166945723, + -6.531970036750838, + -970.3067931813666 + ], + "nodedup": [ + 7.196577317761012, + -45.873021274429995, + 2.9048714587398505, + -801.1656151465145, + -856.2176369539866, + -701.3832757596591, + -791.860330108457, + -641.0597186366746, + -856.8747665323849, + -965.6893581059343, + -601.8962692526685, + 1.491228024977203, + -664.123965739818, + -4.055811166945723, + -6.531970036750838, + -970.3067931813666 + ], + "library": [ + 7.196577317761012, + -45.873021274429995, + 2.9048714587398505, + -801.1656151465145, + -856.2176369539866, + -701.3832757596591, + -791.860330108457, + -641.0597186366746, + -856.8747665323849, + -965.6893581059343, + -601.8962692526685, + 1.491228024977203, + -664.123965739818, + -4.055811166945723, + -6.531970036750838, + -970.3067931813666 + ] + }, + "deterministic_within_route": { + "control": true, + "nodedup": true, + "library": true + }, + "likelihood_gate": { + "control_vs_nodedup": { + "bit_identical": true, + "max_abs_delta": 0.0, + "max_rel_delta": 0.0, + "nan_pattern_equal": true + }, + "control_vs_library": { + "bit_identical": true, + "max_abs_delta": 0.0, + "max_rel_delta": 0.0, + "nan_pattern_equal": true + }, + "nodedup_vs_library": { + "bit_identical": true, + "max_abs_delta": 0.0, + "max_rel_delta": 0.0, + "nan_pattern_equal": true + } + }, + "fiducial_log_likelihood": { + "control": 7.196577317761012, + "nodedup": 7.196577317761012, + "library": 7.196577317761012 + } + }, + "cluster_solved": { + "label": "cluster_solved", + "batch": null, + "n_rounds": 20, + "n_calls_per_round": 20, + "n_warm": 3, + "route_order": "round-robin, start rotated each round", + "per_call_ms": { + "control": [ + 5.621121730655432, + 4.7854711301624775, + 4.665333312004805, + 4.675192758440971, + 4.57564415410161, + 4.507716279476881, + 4.371786955744028, + 4.36334777623415, + 4.370216745883226, + 4.36038663610816, + 4.372977185994387, + 4.348997958004475, + 4.347977228462696, + 4.593824967741966, + 4.420786630362272, + 4.402026999741793, + 4.3609971180558205, + 4.353058058768511, + 4.363267216831446, + 4.2929681949317455, + 5.141936708241701, + 4.426566418260336, + 4.349696915596724, + 4.3500675819814205, + 4.337016958743334, + 4.288148134946823, + 4.205428995192051, + 4.302267916500568, + 4.404846113175154, + 4.230148158967495, + 4.2183781042695045, + 4.190909210592508, + 4.2201378382742405, + 4.217649344354868, + 4.202838987112045, + 4.2207189835608006, + 4.199848975986242, + 4.195189103484154, + 4.185620229691267, + 4.160499665886164, + 4.839201923459768, + 4.374457057565451, + 4.286007955670357, + 4.285458009690046, + 4.330697935074568, + 4.265317693352699, + 4.195208661258221, + 4.184858873486519, + 4.169628955423832, + 4.149020183831453, + 4.245748743414879, + 4.279788117855787, + 4.200729075819254, + 4.206418991088867, + 4.194359295070171, + 4.197629168629646, + 4.20354912057519, + 4.200188908725977, + 4.216058645397425, + 4.275178071111441, + 4.85767237842083, + 4.339796956628561, + 4.372396040707827, + 4.308218136429787, + 4.304558038711548, + 4.238699097186327, + 4.204298835247755, + 4.2013488709926605, + 4.213988780975342, + 4.206608980894089, + 4.1996389627456665, + 4.198548849672079, + 4.171849228441715, + 4.225329030305147, + 4.191059153527021, + 4.196559078991413, + 4.269808065146208, + 4.18055010959506, + 4.168899264186621, + 4.181159194558859, + 5.0711678341031075, + 4.385007079690695, + 4.27054800093174, + 4.29109763354063, + 4.3283067643642426, + 4.387585911899805, + 4.554733633995056, + 4.218969028443098, + 4.23692911863327, + 4.199459217488766, + 4.188439343124628, + 4.1646393947303295, + 4.163888748735189, + 4.148499108850956, + 4.168839659541845, + 4.182358738034964, + 4.220948088914156, + 4.203279037028551, + 4.212860018014908, + 4.179148934781551, + 5.261235870420933, + 4.322628024965525, + 4.226937890052795, + 4.271380137652159, + 4.295617807656527, + 4.368997178971767, + 4.179839044809341, + 4.32658800855279, + 4.153389949351549, + 4.183720331639051, + 4.175771027803421, + 4.184090066701174, + 4.180340096354485, + 4.168929066509008, + 4.20544994994998, + 4.196439404040575, + 4.17501013725996, + 4.21907939016819, + 4.173899069428444, + 4.17364900931716, + 4.800531081855297, + 4.256250336766243, + 4.196318797767162, + 4.206269048154354, + 4.26609767600894, + 4.19680867344141, + 4.181679338216782, + 4.1976189240813255, + 4.206499084830284, + 4.201918840408325, + 4.193319007754326, + 4.177698865532875, + 4.198320209980011, + 4.202079027891159, + 4.188710357993841, + 4.1898200288414955, + 4.210738930851221, + 4.301687702536583, + 4.178580362349749, + 4.1677202098071575, + 5.1077790558338165, + 4.265208262950182, + 4.233289044350386, + 4.230778198689222, + 4.247297998517752, + 4.266458097845316, + 4.179719835519791, + 4.194758832454681, + 4.18435875326395, + 4.17841924354434, + 4.202479962259531, + 4.194758832454681, + 4.175649024546146, + 4.19095903635025, + 4.173619672656059, + 4.1961888782680035, + 4.19740891084075, + 4.1889287531375885, + 4.20024897903204, + 4.166769329458475, + 4.676554352045059, + 4.214298911392689, + 4.243997856974602, + 4.369896836578846, + 4.170178901404142, + 4.181738942861557, + 4.146010149270296, + 4.154459107667208, + 4.2266990058124065, + 4.200188908725977, + 4.166060127317905, + 4.1492898017168045, + 4.149118904024363, + 4.141480196267366, + 4.169550258666277, + 4.171208944171667, + 4.272477701306343, + 4.109039902687073, + 4.120820201933384, + 4.131239373236895, + 4.657234065234661, + 4.238589201122522, + 4.163769073784351, + 4.191368818283081, + 4.173779860138893, + 4.185678903013468, + 4.177279770374298, + 4.1693588718771935, + 4.177678842097521, + 4.19370923191309, + 4.186979029327631, + 4.211569670587778, + 4.20919805765152, + 4.340586718171835, + 4.164520185440779, + 4.178259987384081, + 4.160250071436167, + 4.130559973418713, + 4.126850049942732, + 4.141090903431177, + 5.163866560906172, + 4.2995489202439785, + 4.349897149950266, + 4.2294692248106, + 4.2524198070168495, + 4.205988720059395, + 4.157999996095896, + 4.235447850078344, + 4.278137814253569, + 4.224609117954969, + 4.186389967799187, + 4.194909706711769, + 4.1789100505411625, + 4.208098631352186, + 4.204119089990854, + 4.190720152109861, + 4.192778840661049, + 4.185169003903866, + 4.193048924207687, + 4.208297934383154, + 4.636944737285376, + 4.248848184943199, + 4.194688983261585, + 4.369277041405439, + 4.227038938552141, + 4.274957813322544, + 4.195088986307383, + 4.195620305836201, + 4.179469309747219, + 4.159308969974518, + 4.1592298075556755, + 4.153511021286249, + 4.520695190876722, + 4.1839792393147945, + 4.188269842416048, + 4.164939280599356, + 4.1758292354643345, + 4.254597704857588, + 4.234518855810165, + 4.258438944816589, + 4.848361015319824, + 4.302976652979851, + 4.248528275638819, + 4.287447314709425, + 4.2885378934443, + 4.2227390222251415, + 4.1858600452542305, + 4.174559842795134, + 4.189838655292988, + 4.200069233775139, + 4.227018915116787, + 4.180978983640671, + 4.182909149676561, + 4.149619955569506, + 4.145760089159012, + 4.15097875520587, + 4.134719725698233, + 4.2968979105353355, + 4.174419678747654, + 4.176309797912836, + 5.2638272754848, + 4.344666842371225, + 4.242878407239914, + 4.245478194206953, + 4.263248294591904, + 4.215689841657877, + 4.196719266474247, + 4.188018850982189, + 4.166550002992153, + 4.16966900229454, + 4.193258937448263, + 4.190378822386265, + 4.198509268462658, + 4.1709099896252155, + 4.170340020209551, + 4.159328993409872, + 4.178138915449381, + 4.182679113000631, + 4.161809105426073, + 4.227608907967806, + 4.8239510506391525, + 4.292557947337627, + 4.251939244568348, + 4.262248054146767, + 4.276197869330645, + 4.370246548205614, + 4.189669154584408, + 4.177649039775133, + 4.171309061348438, + 4.205270204693079, + 4.2158691212534904, + 4.146370105445385, + 4.169038962572813, + 4.130270332098007, + 4.162830300629139, + 4.127579741179943, + 4.12011006847024, + 4.104979801923037, + 4.078499972820282, + 4.084540996700525, + 4.797633271664381, + 4.312606994062662, + 4.259288311004639, + 4.252027720212936, + 4.264487884938717, + 4.2319088242948055, + 4.206968937069178, + 4.1906991973519325, + 4.201419185847044, + 4.180948715656996, + 4.194349050521851, + 4.1755796410143375, + 4.192200023680925, + 4.206389654427767, + 4.192639142274857, + 4.206678830087185, + 4.20446926727891, + 4.204029683023691, + 4.213599022477865, + 4.2036790400743484, + 5.202176049351692, + 4.356608260422945, + 4.254189319908619, + 4.298557061702013, + 4.302619025111198, + 4.24265768378973, + 4.214238841086626, + 4.1879890486598015, + 4.205529112368822, + 4.208927974104881, + 4.20395890250802, + 4.194218665361404, + 4.194889217615128, + 4.181439056992531, + 4.209469072520733, + 4.194591194391251, + 4.179499112069607, + 4.213838838040829, + 4.177319351583719, + 4.216500092297792, + 4.758173134177923, + 4.288308322429657, + 4.250478930771351, + 4.258507862687111, + 4.426425788551569, + 4.22188825905323, + 4.195569083094597, + 4.22727782279253, + 4.202919080853462, + 4.2093489319086075, + 4.202140029519796, + 4.210948012769222, + 4.221798852086067, + 4.223909229040146, + 4.184568766504526, + 4.204309079796076, + 4.2015789076685905, + 4.1985888965427876, + 4.219598602503538, + 4.2016590014100075, + 4.8133209347724915, + 4.302407149225473, + 4.22656862065196, + 4.2473976500332355, + 4.273638129234314, + 4.238437861204147, + 4.176518879830837, + 4.1855392046272755, + 4.211708903312683, + 4.200598690658808, + 4.239488858729601, + 4.18495899066329, + 4.2310599237680435, + 4.231478087604046, + 4.151680041104555, + 4.16920892894268, + 4.229768645018339, + 6.258043926209211, + 5.190936382859945, + 5.007370375096798, + 5.3870538249611855, + 4.357476718723774, + 4.268887918442488, + 4.3439967557787895, + 4.3267980217933655, + 4.286398179829121, + 4.238857887685299, + 4.23872796818614, + 4.197278991341591, + 4.221979063004255, + 4.586915951222181, + 4.214908927679062, + 4.216598346829414, + 4.221608862280846, + 4.20816894620657, + 4.210468381643295, + 4.187998827546835, + 4.239307716488838, + 4.193929024040699, + 4.2031994089484215 + ], + "nodedup": [ + 3.2149120233953, + 2.7465270832180977, + 2.659908030182123, + 2.616018056869507, + 2.59265024214983, + 2.576019149273634, + 2.5778692215681076, + 2.4746302515268326, + 2.4629607796669006, + 2.421170938760042, + 2.465389668941498, + 2.45363125577569, + 2.4439003318548203, + 2.434161026030779, + 2.375380601733923, + 2.3944308049976826, + 2.4263812229037285, + 2.445280086249113, + 2.4561807513237, + 2.4362001568078995, + 2.7647162787616253, + 2.6767076924443245, + 2.477169968187809, + 2.538659144192934, + 2.548349089920521, + 2.5031999684870243, + 2.470829989761114, + 2.458381000906229, + 2.458060160279274, + 2.456250134855509, + 2.4298098869621754, + 2.455510199069977, + 2.4529299698770046, + 2.4443999864161015, + 2.4509713985025883, + 2.4480498395860195, + 2.4324310943484306, + 2.3980410769581795, + 2.444460056722164, + 2.4548107758164406, + 3.199382219463587, + 2.6891566812992096, + 2.5941291823983192, + 2.5906478986144066, + 2.577028702944517, + 2.4778787046670914, + 2.4682600051164627, + 2.4746698327362537, + 2.451741136610508, + 2.4473508819937706, + 2.4181902408599854, + 2.4225208908319473, + 2.4370700120925903, + 2.465431112796068, + 2.4465899914503098, + 2.43888096883893, + 2.4377298541367054, + 2.418000716716051, + 2.4569910019636154, + 2.4396697990596294, + 2.9100547544658184, + 2.6030177250504494, + 2.575039863586426, + 2.5543589144945145, + 2.57631903514266, + 2.533499151468277, + 2.468099817633629, + 2.457519993185997, + 2.4419398978352547, + 2.4211122654378414, + 2.4671396240592003, + 2.452810760587454, + 2.4497201666235924, + 2.452460117638111, + 2.387651242315769, + 2.388171385973692, + 2.447651233524084, + 2.4226908572018147, + 2.4286299012601376, + 2.425180282443762, + 2.7284971438348293, + 2.4158312007784843, + 2.4877707473933697, + 2.503498923033476, + 2.4950001388788223, + 2.482319250702858, + 2.498059067875147, + 2.459330018609762, + 2.4592201225459576, + 2.434640657156706, + 2.4421196430921555, + 2.460121177136898, + 2.4177399463951588, + 2.427081111818552, + 2.4307500571012497, + 2.3803510703146458, + 2.4330122396349907, + 2.421270590275526, + 2.4187201634049416, + 2.435090020298958, + 3.2817008905112743, + 2.622507978230715, + 2.5546997785568237, + 2.5920490734279156, + 2.5455988943576813, + 2.5242390111088753, + 2.486960031092167, + 2.4675698950886726, + 2.469128929078579, + 2.4194419384002686, + 2.4572000838816166, + 2.465318888425827, + 2.4726497940719128, + 2.4519101716578007, + 2.572139259427786, + 2.3943400010466576, + 2.432451117783785, + 2.606709022074938, + 2.4055996909737587, + 2.4072621017694473, + 2.920063678175211, + 2.5685103610157967, + 2.5284490548074245, + 2.5104586966335773, + 2.549549099057913, + 2.51519912853837, + 2.447760198265314, + 2.421109937131405, + 2.4297903291881084, + 2.452850341796875, + 2.436170354485512, + 2.424791920930147, + 2.415910828858614, + 2.4416898377239704, + 2.465010154992342, + 2.461089752614498, + 2.445600926876068, + 2.429420128464699, + 2.446369733661413, + 2.4617197923362255, + 2.6989681646227837, + 2.4755289778113365, + 2.470341045409441, + 2.4387710727751255, + 2.4854191578924656, + 2.4373303167521954, + 2.4450598284602165, + 2.4428218603134155, + 2.412849571555853, + 2.4677403271198273, + 2.4959202855825424, + 2.429880201816559, + 2.3988508619368076, + 2.446940168738365, + 2.41165142506361, + 2.4107610806822777, + 2.362100873142481, + 2.4128411896526814, + 2.4119820445775986, + 2.381781116127968, + 3.095742780715227, + 2.5318986736238003, + 2.4807299487292767, + 2.4689901620149612, + 2.54100002348423, + 2.469959668815136, + 2.371501177549362, + 2.424160949885845, + 2.4203909561038017, + 2.4181408807635307, + 2.383541315793991, + 2.415730617940426, + 2.4223621003329754, + 2.3847511038184166, + 2.383770886808634, + 2.4337610229849815, + 2.4337107315659523, + 2.3930510506033897, + 2.387551125138998, + 2.4070399813354015, + 2.8574750758707523, + 2.6693781837821007, + 2.5021187029778957, + 2.5139199569821358, + 2.4990197271108627, + 2.4931300431489944, + 2.4062907323241234, + 2.45981989428401, + 2.454850822687149, + 2.433929592370987, + 2.4272799491882324, + 2.4365996941924095, + 2.427580300718546, + 2.413230948150158, + 2.407220657914877, + 2.376941032707691, + 2.4117217399179935, + 2.406409941613674, + 2.397360745817423, + 2.3904419504106045, + 2.6111979968845844, + 2.4354010820388794, + 2.434039954096079, + 2.391230780631304, + 2.4327910505235195, + 2.4423100985586643, + 2.434779889881611, + 2.5767283514142036, + 2.4055908434093, + 2.440440934151411, + 2.448759973049164, + 2.4482901208102703, + 2.4115699343383312, + 2.414329908788204, + 2.435920760035515, + 2.449030987918377, + 2.4309400469064713, + 2.411460969597101, + 2.4243509396910667, + 2.4301200173795223, + 3.150682896375656, + 2.6078480295836926, + 2.5856192223727703, + 2.593898680061102, + 2.5469791144132614, + 2.4822489358484745, + 2.4226009845733643, + 2.4581397883594036, + 2.562479116022587, + 2.4460898712277412, + 2.4085212498903275, + 2.4294108152389526, + 2.5643878616392612, + 2.4262708611786366, + 2.3970818147063255, + 2.4132695980370045, + 2.410629764199257, + 2.3846509866416454, + 2.382041420787573, + 2.4211802519857883, + 2.955433912575245, + 2.6183780282735825, + 2.562067937105894, + 2.5544287636876106, + 2.54030991345644, + 2.4951486848294735, + 2.4352609179913998, + 2.442929893732071, + 2.436591312289238, + 2.4190316908061504, + 2.4453396908938885, + 2.4251509457826614, + 2.455450128763914, + 2.4435902014374733, + 2.4494309909641743, + 2.415949944406748, + 2.4692402221262455, + 2.466329839080572, + 2.4405010044574738, + 2.43357103317976, + 11.197404004633427, + 3.0636130832135677, + 3.0786432325839996, + 2.80973594635725, + 2.7833771891891956, + 2.7228761464357376, + 2.7241981588304043, + 2.647886984050274, + 2.612947952002287, + 2.6028878055512905, + 2.6028999127447605, + 2.566718962043524, + 2.9600937850773335, + 2.627718262374401, + 2.5824690237641335, + 2.560459077358246, + 2.5780880823731422, + 2.767987083643675, + 2.5592087768018246, + 2.549809869378805, + 3.1548719853162766, + 2.5905389338731766, + 2.5156987830996513, + 2.540889196097851, + 2.5544888339936733, + 2.5138300843536854, + 2.4740900844335556, + 2.449159976094961, + 2.4514002725481987, + 2.4650301784276962, + 2.4730199947953224, + 2.6380782946944237, + 2.44757067412138, + 2.3987609893083572, + 2.419070340692997, + 2.438171301037073, + 2.4370402097702026, + 2.446472179144621, + 2.4110707454383373, + 2.4380898103117943, + 2.952274866402149, + 2.6089977473020554, + 2.743266988545656, + 2.5954577140510082, + 2.5653797201812267, + 2.512028906494379, + 2.450329717248678, + 2.440510783344507, + 2.4611903354525566, + 2.4613109417259693, + 2.459439914673567, + 2.414889633655548, + 2.420600038021803, + 2.4586101062595844, + 2.4697408080101013, + 2.457419876009226, + 2.430019900202751, + 2.460230141878128, + 2.447269856929779, + 2.460270654410124, + 2.74858670309186, + 2.487539779394865, + 2.4236110039055347, + 2.4733999744057655, + 2.485500182956457, + 2.452841028571129, + 2.413129899650812, + 2.4066311307251453, + 2.443131059408188, + 2.4308613501489162, + 2.3893509060144424, + 2.4186009541153908, + 2.4378811940550804, + 2.422790043056011, + 2.4033309891819954, + 2.448469866067171, + 2.4454211816191673, + 2.4242899380624294, + 2.4056206457316875, + 2.4226722307503223, + 3.233421128243208, + 2.6346370577812195, + 2.5947997346520424, + 2.5708191096782684, + 2.5821789167821407, + 2.52104876562953, + 2.4676299653947353, + 2.447680104523897, + 2.4639000184834003, + 2.604409120976925, + 2.463070210069418, + 2.452841028571129, + 2.516628708690405, + 2.448219805955887, + 2.418551128357649, + 2.431019674986601, + 2.433840185403824, + 2.4065696634352207, + 2.3589320480823517, + 2.4396111257374287, + 3.7171649746596813, + 3.0435537919402122, + 2.948054112493992, + 2.8619347140192986, + 2.8001461178064346, + 2.711595967411995, + 2.6252088136970997, + 2.630678005516529, + 2.583638299256563, + 2.5400491431355476, + 2.513608895242214, + 2.478000707924366, + 2.750616054981947, + 2.4433606304228306, + 2.4875099770724773, + 2.45981989428401, + 2.470879815518856, + 2.4599097669124603, + 2.491279970854521, + 2.4736300110816956, + 2.754055894911289, + 2.5064791552722454, + 2.4951091036200523, + 2.5125090032815933, + 2.513039391487837, + 2.515119034796953, + 2.4537909775972366, + 2.4957600980997086, + 2.8896359726786613, + 2.4668597616255283, + 2.490091137588024, + 2.892695367336273, + 2.564889844506979, + 2.428739797323942, + 2.4873800575733185, + 2.4878699332475662, + 2.47789965942502, + 2.4810307659208775, + 2.4546701461076736, + 2.3905611597001553 + ], + "library": [ + 2.829646226018667, + 2.475820016115904, + 2.4489001370966434, + 2.4172402918338776, + 2.4577099829912186, + 2.4175820872187614, + 2.374241128563881, + 2.33417097479105, + 2.3699114099144936, + 2.379270736128092, + 2.376351971179247, + 2.2929422557353973, + 2.383200917392969, + 2.3668217472732067, + 2.3453119210898876, + 2.310402225703001, + 2.3539126850664616, + 2.337261103093624, + 2.3149517364799976, + 2.3537809029221535, + 2.6750178076326847, + 2.4892198853194714, + 2.448909915983677, + 2.459361217916012, + 2.452739980071783, + 2.3973206989467144, + 2.394320908933878, + 2.377190627157688, + 2.3885220289230347, + 2.325851935893297, + 2.3539410904049873, + 2.375712152570486, + 2.3686913773417473, + 2.3240619339048862, + 2.3373919539153576, + 2.374510746449232, + 2.394170965999365, + 2.362252213060856, + 2.334391698241234, + 2.3817820474505424, + 2.8030360117554665, + 2.5382591411471367, + 2.4727596901357174, + 2.470680046826601, + 2.481719944626093, + 2.455570735037327, + 2.4060308933258057, + 2.3848707787692547, + 2.3529408499598503, + 2.368181012570858, + 2.3839217610657215, + 2.3860218934714794, + 2.352790907025337, + 2.328210975974798, + 2.3838309571146965, + 2.42178188636899, + 2.3758108727633953, + 2.3373113945126534, + 2.3910021409392357, + 2.37291119992733, + 2.8840559534728527, + 2.47292872518301, + 2.4218610487878323, + 2.556238789111376, + 2.4582799524068832, + 2.5755800306797028, + 2.3568510077893734, + 2.3879921063780785, + 2.3906813003122807, + 2.3681805469095707, + 2.3156022652983665, + 2.5331489741802216, + 2.351311966776848, + 2.353610936552286, + 2.3491811007261276, + 2.282812260091305, + 2.3659910075366497, + 2.3635621182620525, + 2.3647318594157696, + 2.295232843607664, + 2.58469907566905, + 2.4121208116412163, + 2.3356620222330093, + 2.414681948721409, + 2.408680971711874, + 2.4029510095715523, + 2.3544211871922016, + 2.327981870621443, + 2.3705209605395794, + 2.366060856729746, + 2.5400989688932896, + 2.312303055077791, + 2.358210738748312, + 2.3526917211711407, + 2.453859895467758, + 2.3199720308184624, + 2.3599318228662014, + 2.367180772125721, + 2.3619718849658966, + 2.2733337245881557, + 2.8177257627248764, + 2.5574080646038055, + 2.547069452702999, + 2.6520867832005024, + 3.9101033471524715, + 2.9948437586426735, + 2.9069650918245316, + 2.938173245638609, + 2.968074753880501, + 2.645778004080057, + 2.4033719673752785, + 2.350702416151762, + 2.3937509395182133, + 2.3810709826648235, + 2.3328308016061783, + 2.364601008594036, + 2.3639011196792126, + 2.280562184751034, + 2.3527718149125576, + 2.346911933273077, + 3.0069430358707905, + 2.4621100164949894, + 2.4323700927197933, + 2.4327109567821026, + 2.3793019354343414, + 2.422659657895565, + 2.379980869591236, + 2.3485911078751087, + 2.370710950344801, + 2.3228111676871777, + 2.3450320586562157, + 2.3232619278132915, + 2.341811079531908, + 2.347382251173258, + 2.335492055863142, + 2.3575210943818092, + 2.370220609009266, + 2.3393621668219566, + 2.3361211642622948, + 2.3229122161865234, + 2.6210490614175797, + 2.343961037695408, + 2.3561418056488037, + 2.377572003751993, + 2.3256810382008553, + 2.3402119986712933, + 2.347551751881838, + 2.2948822006583214, + 2.3358319886028767, + 2.3441030643880367, + 2.3114709183573723, + 2.33736215159297, + 2.345453016459942, + 2.3347707465291023, + 2.816285938024521, + 2.317790873348713, + 2.313982229679823, + 2.2539920173585415, + 2.3061917163431644, + 2.3029623553156853, + 2.922195941209793, + 2.497950103133917, + 2.443131059408188, + 2.4417201057076454, + 2.4474402889609337, + 2.385071013122797, + 2.3418418131768703, + 2.379070967435837, + 2.361161634325981, + 2.3163319565355778, + 2.346741035580635, + 2.343282103538513, + 2.311471849679947, + 2.326302230358124, + 2.4852100759744644, + 2.28393217548728, + 2.353641204535961, + 2.347772940993309, + 2.3133321665227413, + 2.3323409259319305, + 2.924974076449871, + 2.3559918627142906, + 2.3698010481894016, + 2.3642610758543015, + 2.333661075681448, + 2.3566018790006638, + 2.3338920436799526, + 2.2620828822255135, + 2.3113619536161423, + 2.34909076243639, + 2.29825172573328, + 2.3122518323361874, + 2.3140222765505314, + 2.330322749912739, + 2.317652106285095, + 2.2873119451105595, + 2.323612105101347, + 2.3361817002296448, + 2.3177117109298706, + 2.316052094101906, + 2.63177789747715, + 2.400890924036503, + 2.357961144298315, + 2.3641311563551426, + 2.364891115576029, + 2.349081914871931, + 2.344000618904829, + 2.3496909998357296, + 2.310222014784813, + 2.349880989640951, + 2.340491861104965, + 2.301562111824751, + 2.3610410280525684, + 2.3332019336521626, + 2.3211920633912086, + 2.3398911580443382, + 2.3457719944417477, + 2.3555210791528225, + 2.3912708275020123, + 2.3555411025881767, + 2.9124938882887363, + 2.474880777299404, + 2.473310101777315, + 2.4756398051977158, + 2.4781888350844383, + 2.4128900840878487, + 2.3403731174767017, + 2.3570219054818153, + 2.3455522023141384, + 2.3177131079137325, + 2.3535010404884815, + 2.336472272872925, + 2.3045428097248077, + 2.3377910256385803, + 2.3248419165611267, + 2.3168018087744713, + 2.3525008000433445, + 2.478220034390688, + 2.300091553479433, + 2.335191238671541, + 2.9930430464446545, + 2.441649790853262, + 2.3894812911748886, + 2.356241922825575, + 2.375131007283926, + 2.370630856603384, + 2.330732997506857, + 2.345981076359749, + 2.345382235944271, + 2.3045032285153866, + 2.3382012732326984, + 2.3202518932521343, + 2.2860420867800713, + 2.5101187638938427, + 2.2935420274734497, + 2.2655329667031765, + 2.3231906816363335, + 4.352706950157881, + 2.608909271657467, + 4.89818025380373, + 3.2179211266338825, + 2.5227488949894905, + 2.516218926757574, + 2.456940244883299, + 2.4514198303222656, + 2.347281202673912, + 2.358651254326105, + 2.3532616905868053, + 2.2993418388068676, + 2.345642074942589, + 2.373061142861843, + 2.3022331297397614, + 2.328262198716402, + 2.3392909206449986, + 2.3087612353265285, + 2.3607807233929634, + 2.381180878728628, + 2.3598121479153633, + 2.331680618226528, + 2.341780811548233, + 2.9028556309640408, + 2.477348782122135, + 2.4694609455764294, + 2.4832100607454777, + 2.3962510749697685, + 2.3736110888421535, + 2.3182821460068226, + 2.291511744260788, + 2.3419219069182873, + 2.361500635743141, + 2.3062522523105145, + 2.3575108498334885, + 2.3696809075772762, + 2.328661736100912, + 2.3603509180247784, + 2.360621001571417, + 2.3234509862959385, + 2.3495620116591454, + 2.36192112788558, + 2.33122194185853, + 2.9944228008389473, + 2.484310884028673, + 2.426651306450367, + 2.422990743070841, + 2.4127098731696606, + 2.3830211721360683, + 2.3652310483157635, + 2.344252075999975, + 2.366481814533472, + 2.3681730963289738, + 2.3367516696453094, + 2.3678806610405445, + 2.3720022290945053, + 2.369350753724575, + 2.340931911021471, + 2.3832223378121853, + 2.3461920209228992, + 2.3279208689928055, + 2.457571215927601, + 2.358290832489729, + 2.68299737945199, + 2.442890778183937, + 2.4215811863541603, + 2.4028108455240726, + 2.3957816883921623, + 2.364190760999918, + 2.323511987924576, + 2.339143306016922, + 2.345970831811428, + 2.330611925572157, + 2.359562087804079, + 2.304601948708296, + 2.345332410186529, + 2.351492177695036, + 2.2826320491731167, + 2.352822106331587, + 2.358310855925083, + 2.327952068299055, + 2.356370911002159, + 2.3671817034482956, + 2.901594154536724, + 2.5093010626733303, + 2.478419803082943, + 2.4751899763941765, + 2.4244608357548714, + 2.395449671894312, + 2.3787617683410645, + 2.376710996031761, + 2.3403321392834187, + 2.370252273976803, + 2.376020886003971, + 2.321592066437006, + 2.3923106491565704, + 2.3929509334266186, + 2.345011103898287, + 2.3509529419243336, + 2.3933001793920994, + 2.34706187620759, + 2.3226221092045307, + 2.3418408818542957, + 3.0241040512919426, + 2.6082880795001984, + 2.4479608982801437, + 2.632556948810816, + 2.4525607004761696, + 2.6270379312336445, + 2.3419419303536415, + 2.4232198484241962, + 2.42615956813097, + 2.4122698232531548, + 2.335520926862955, + 2.404020167887211, + 2.419350203126669, + 2.412040252238512, + 2.315012738108635, + 2.3879408836364746, + 2.4204207584261894, + 2.3827413097023964, + 2.327761147171259, + 2.4149813689291477, + 2.660878002643585, + 2.450439613312483, + 2.3851008154451847, + 2.463419921696186, + 2.4027712643146515, + 2.445430029183626, + 2.4554599076509476, + 2.375541254878044, + 2.4199909530580044, + 2.317063044756651, + 2.408299595117569, + 2.408099826425314, + 2.3983316496014595, + 2.3182821460068226, + 2.422481309622526, + 2.4385801516473293, + 2.4123797193169594, + 2.337052021175623, + 2.4257698096334934, + 2.4286704137921333 + ] + }, + "warm_ms": { + "control": [ + 44.2147059366107, + 5.742589011788368, + 4.9163708463311195 + ], + "nodedup": [ + 7.881003897637129, + 3.4463386982679367, + 3.0485419556498528 + ], + "library": [ + 3.1702518463134766, + 3.0483026057481766, + 2.9014763422310352 + ] + }, + "stats": { + "control": { + "n": 400, + "median_ms": 4.2063293512910604, + "p10_ms": 4.1659480426460505, + "p90_ms": 4.373125173151493, + "min_ms": 4.078499972820282, + "max_ms": 6.258043926209211, + "mean_ms": 4.277803796576336 + }, + "nodedup": { + "n": 400, + "median_ms": 2.457309979945421, + "p10_ms": 2.4107479490339756, + "p90_ms": 2.660855045542121, + "min_ms": 2.3589320480823517, + "max_ms": 11.197404004633427, + "mean_ms": 2.534071335103363 + }, + "library": { + "n": 400, + "median_ms": 2.3644310422241688, + "p10_ms": 2.316007111221552, + "p90_ms": 2.533659990876913, + "min_ms": 2.2539920173585415, + "max_ms": 4.89818025380373, + "mean_ms": 2.4221775331534445 + } + }, + "ratio_control_over_nodedup": { + "ratio": 1.7117617987228808, + "ci90_low": 1.7085859566929815, + "ci90_high": 1.7157860021056888, + "bootstrap_samples": 2000 + }, + "ratio_library_over_nodedup": { + "ratio": 0.9622030030890465, + "ci90_low": 0.9595262607021897, + "ci90_high": 0.9652497378603349, + "bootstrap_samples": 2000 + }, + "ratio_control_over_library": { + "ratio": 1.779002760568673, + "ci90_low": 1.7749388144895955, + "ci90_high": 1.783542719213802, + "bootstrap_samples": 2000 + }, + "paired_round_ratio_control_over_nodedup": { + "median": 1.7152413176519277, + "p10": 1.6914325470071137, + "p90": 1.7293311448708317 + }, + "minimum_detectable_improvement": 0.04925366351587594, + "compile": { + "control": { + "lower_s": 45.05459647113457, + "compile_s": 52.66892455238849, + "first_call_s": 0.04210003977641463, + "trace_calls": 168, + "flops": 160392304.0, + "hlo_sort_count": 25, + "stablehlo_sort_count": 3, + "hlo_sort_shapes": [ + "(f64[276507]{0}, f64[276507]{0}, s64[276507]{0}, s32[276507]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0}, s32[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0}, s32[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0}, s32[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0}, s32[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0}, s32[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0}, s32[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0}, s32[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0}, s32[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0}, s32[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0}, s32[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0}, s32[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0}, s32[720]{0})" + ], + "hlo_sha256": "16a5c136e2d300ca", + "hlo_lines": 39039 + }, + "nodedup": { + "lower_s": 45.49785578297451, + "compile_s": 46.475710848812014, + "first_call_s": 0.027439048048108816, + "trace_calls": 168, + "flops": 120379264.0, + "hlo_sort_count": 12, + "stablehlo_sort_count": 1, + "hlo_sort_shapes": [ + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})" + ], + "hlo_sha256": "eafc1ce79859bce8", + "hlo_lines": 33668 + }, + "library": { + "lower_s": 44.357860029209405, + "compile_s": 3.6368276430293918, + "first_call_s": 0.02637743018567562, + "trace_calls": 168, + "flops": 120379264.0, + "hlo_sort_count": 12, + "stablehlo_sort_count": 1, + "hlo_sort_shapes": [ + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})" + ], + "hlo_sha256": "eafc1ce79859bce8", + "hlo_lines": 33668 + } + }, + "instances_compared": [ + [ + 0 + ], + [ + 1 + ], + [ + 2 + ], + [ + 3 + ], + [ + 4 + ], + [ + 5 + ], + [ + 6 + ], + [ + 7 + ], + [ + 8 + ], + [ + 9 + ], + [ + 10 + ], + [ + 11 + ], + [ + 12 + ], + [ + 13 + ], + [ + 14 + ], + [ + 15 + ] + ], + "values": { + "control": [ + 25.56012716672745, + 21.572496958393117, + 21.458564666727824, + 13.597236541730304, + 15.306220916729094, + 10.29320008339773, + 19.977444875061742, + 21.800361541728023, + 10.748929250057948, + 9.609606333397046, + 5.166246958397972, + 14.052965708392575, + 4.710517791725226, + 6.647366750058172, + 17.926663625058694, + 16.331611541724392 + ], + "nodedup": [ + 25.56012716672745, + 21.572496958393117, + 21.458564666727824, + 13.597236541730304, + 15.306220916729094, + 10.29320008339773, + 19.977444875061742, + 21.800361541728023, + 10.748929250057948, + 9.609606333397046, + 5.166246958397972, + 14.052965708392575, + 4.710517791725226, + 6.647366750058172, + 17.926663625058694, + 16.331611541724392 + ], + "library": [ + 25.56012716672745, + 21.572496958393117, + 21.458564666727824, + 13.597236541730304, + 15.306220916729094, + 10.29320008339773, + 19.977444875061742, + 21.800361541728023, + 10.748929250057948, + 9.609606333397046, + 5.166246958397972, + 14.052965708392575, + 4.710517791725226, + 6.647366750058172, + 17.926663625058694, + 16.331611541724392 + ] + }, + "deterministic_within_route": { + "control": true, + "nodedup": true, + "library": true + }, + "likelihood_gate": { + "control_vs_nodedup": { + "bit_identical": true, + "max_abs_delta": 0.0, + "max_rel_delta": 0.0, + "nan_pattern_equal": true + }, + "control_vs_library": { + "bit_identical": true, + "max_abs_delta": 0.0, + "max_rel_delta": 0.0, + "nan_pattern_equal": true + }, + "nodedup_vs_library": { + "bit_identical": true, + "max_abs_delta": 0.0, + "max_rel_delta": 0.0, + "nan_pattern_equal": true + } + }, + "fiducial_log_likelihood": { + "control": 25.56012716672745, + "nodedup": 25.56012716672745, + "library": 25.56012716672745 + } + }, + "cluster_plain": { + "label": "cluster_plain", + "batch": null, + "n_rounds": 20, + "n_calls_per_round": 20, + "n_warm": 3, + "route_order": "round-robin, start rotated each round", + "per_call_ms": { + "control": [ + 4.793230909854174, + 4.2228479869663715, + 4.133820068091154, + 4.006002098321915, + 4.019690677523613, + 3.9464328438043594, + 3.9324117824435234, + 3.928262274712324, + 3.91303189098835, + 3.9219926111400127, + 3.87094309553504, + 3.929173108190298, + 3.892274107784033, + 3.9146929048001766, + 3.89585318043828, + 3.9054430089890957, + 3.918363247066736, + 3.8853315636515617, + 3.894082736223936, + 3.759424202144146, + 4.451615735888481, + 3.957112319767475, + 3.89278307557106, + 3.8852631114423275, + 3.8872621953487396, + 3.8167941384017467, + 3.8827727548778057, + 3.8809929974377155, + 3.85499419644475, + 3.8582528941333294, + 3.8365130312740803, + 3.848444204777479, + 3.8787731900811195, + 3.8416129536926746, + 3.7969639524817467, + 3.827874083071947, + 3.8890428841114044, + 3.84624395519495, + 3.781723789870739, + 3.833963070064783, + 4.300818312913179, + 3.9664520882070065, + 3.912723157554865, + 3.9632520638406277, + 3.92598332837224, + 3.8785929791629314, + 3.8992329500615597, + 3.8776728324592113, + 3.833673894405365, + 4.090889822691679, + 3.8528931327164173, + 3.86423384770751, + 3.855274058878422, + 3.8390038534998894, + 3.801763989031315, + 3.8649728521704674, + 3.8300128653645515, + 3.8009141571819782, + 3.8227741606533527, + 4.2524877935647964, + 4.159269854426384, + 3.8468842394649982, + 3.8637141697108746, + 3.927613142877817, + 3.8976119831204414, + 3.9012827910482883, + 3.806403838098049, + 3.850333858281374, + 3.8396241143345833, + 3.817584365606308, + 3.835884388536215, + 3.82670434191823, + 3.825632855296135, + 3.7830639630556107, + 3.8507836870849133, + 3.866693004965782, + 3.9590620435774326, + 3.8148644380271435, + 3.8256533443927765, + 3.7863138131797314, + 4.593234974890947, + 3.9664916694164276, + 3.8576829247176647, + 4.20024897903204, + 3.8875830359756947, + 3.864703234285116, + 3.860842902213335, + 3.851091954857111, + 3.818912897258997, + 3.858002834022045, + 3.8446132093667984, + 3.8155647926032543, + 4.320708103477955, + 4.389126785099506, + 3.7663839757442474, + 3.840194083750248, + 3.841593861579895, + 3.796712961047888, + 3.7720343098044395, + 3.850674256682396, + 4.060940816998482, + 3.855194430798292, + 3.86607414111495, + 3.850323148071766, + 3.8612037897109985, + 3.8691330701112747, + 3.8468241691589355, + 3.9416118524968624, + 3.836043644696474, + 3.819273319095373, + 3.896513022482395, + 4.221219103783369, + 3.870912827551365, + 3.8405638188123703, + 3.7995129823684692, + 4.3517169542610645, + 3.791684750467539, + 3.8732830435037613, + 3.8604228757321835, + 3.816933836787939, + 4.218138754367828, + 4.177199210971594, + 4.197369795292616, + 3.876532893627882, + 3.928971942514181, + 3.912851680070162, + 3.8494127802550793, + 3.806073684245348, + 3.857262898236513, + 3.8475231267511845, + 3.8603530265390873, + 3.810734022408724, + 3.853864036500454, + 3.8503939285874367, + 3.8492842577397823, + 3.7988130934536457, + 3.903243225067854, + 3.859052900224924, + 3.795083612203598, + 3.853132948279381, + 4.4070761650800705, + 3.9747320115566254, + 3.93303157761693, + 3.9411322213709354, + 3.9855316281318665, + 3.8673230446875095, + 3.879631869494915, + 3.879933152347803, + 3.8707531057298183, + 3.9871009066700935, + 4.21109888702631, + 3.865414299070835, + 3.8604331202805042, + 3.8207732141017914, + 3.8612429052591324, + 3.8356143049895763, + 3.8911122828722, + 3.8926228880882263, + 3.9492719806730747, + 3.7847538478672504, + 4.185670055449009, + 3.8749631494283676, + 3.873503301292658, + 3.913253080099821, + 3.8583637215197086, + 3.99005226790905, + 3.894062712788582, + 3.8616927340626717, + 3.8482127711176872, + 3.8596931844949722, + 3.8012536242604256, + 3.8553630001842976, + 3.8683931343257427, + 3.836692776530981, + 3.866033162921667, + 3.8480740040540695, + 3.851973917335272, + 3.8458933122456074, + 3.862383309751749, + 3.904541954398155, + 4.153700079768896, + 3.8758241571485996, + 3.814613912254572, + 3.8437130860984325, + 3.859393298625946, + 3.8366629742085934, + 3.7794839590787888, + 3.8490728475153446, + 3.828054293990135, + 3.8550528697669506, + 3.843284212052822, + 3.8217040710151196, + 3.8305330090224743, + 3.7652147002518177, + 3.845103085041046, + 3.8334238342940807, + 3.815833944827318, + 3.8272240199148655, + 3.8324729539453983, + 3.8214540109038353, + 4.52494528144598, + 3.964572213590145, + 3.8925427943468094, + 4.430525936186314, + 3.8973428308963776, + 3.828993998467922, + 3.906702157109976, + 3.876723349094391, + 3.8701831363141537, + 3.787983674556017, + 4.044850822538137, + 3.8349716924130917, + 3.772465046495199, + 3.770724404603243, + 3.87510284781456, + 4.113500006496906, + 3.816374111920595, + 3.806223627179861, + 3.8492530584335327, + 3.8526728749275208, + 4.110231995582581, + 3.9519518613815308, + 3.9265332743525505, + 3.905413206666708, + 3.91246285289526, + 3.903821110725403, + 3.856783267110586, + 3.844813909381628, + 3.848693799227476, + 3.8117137737572193, + 3.8555930368602276, + 3.8360939361155033, + 3.850341774523258, + 3.799453843384981, + 3.8052727468311787, + 3.958952147513628, + 3.857722971588373, + 3.8597136735916138, + 3.876992966979742, + 3.8528828881680965, + 4.113699775189161, + 3.865692764520645, + 3.8628829643130302, + 3.8325339555740356, + 3.848303109407425, + 3.851742949336767, + 3.893231973052025, + 3.8379039615392685, + 3.857433795928955, + 3.8484539836645126, + 3.869202919304371, + 3.8505126722157, + 3.8443920202553272, + 3.7861037999391556, + 3.8367239758372307, + 3.815124277025461, + 3.8135740906000137, + 3.783104009926319, + 3.8358629681169987, + 3.8212831132113934, + 4.434055648744106, + 3.9785318076610565, + 3.9323819801211357, + 3.9911018684506416, + 3.9644017815589905, + 3.8339728489518166, + 3.8871830329298973, + 3.87955317273736, + 3.8207536563277245, + 3.908822312951088, + 4.002180881798267, + 3.8626529276371, + 3.85146401822567, + 3.841032739728689, + 3.7884432822465897, + 3.87817295268178, + 3.9001619443297386, + 3.7834239192306995, + 3.837503958493471, + 3.8298838771879673, + 4.061480984091759, + 3.9003128185868263, + 3.8774129934608936, + 3.8121240213513374, + 3.8800733163952827, + 3.8599632680416107, + 3.864162601530552, + 3.870042972266674, + 3.8507641293108463, + 3.843922633677721, + 3.8121938705444336, + 3.8709230720996857, + 3.8500428199768066, + 3.810754045844078, + 4.394166171550751, + 3.9194030687212944, + 4.066181369125843, + 3.844903316348791, + 3.849813248962164, + 3.7823738530278206, + 4.19924920424819, + 3.909702878445387, + 4.425746854394674, + 3.8740625604987144, + 3.8903430104255676, + 3.899963106960058, + 3.906582947820425, + 3.856752999126911, + 3.8463929668068886, + 3.81241412833333, + 3.846233244985342, + 3.8426630198955536, + 3.805314190685749, + 3.85168194770813, + 3.9310622960329056, + 3.9966413751244545, + 4.030000884085894, + 3.8850228302180767, + 3.834413830190897, + 3.804624080657959, + 4.44910628721118, + 3.9535118266940117, + 3.9591221138834953, + 3.9214822463691235, + 3.9481623098254204, + 3.801044076681137, + 3.884261939674616, + 3.968121949583292, + 3.9474419318139553, + 4.199079237878323, + 3.828472923487425, + 3.809734247624874, + 4.297048319131136, + 3.8125733844935894, + 3.8460842333734035, + 3.8205827586352825, + 3.807944245636463, + 3.7708147428929806, + 3.8461326621472836, + 3.8046040572226048, + 4.108699969947338, + 3.864603117108345, + 3.860803321003914, + 3.9056832902133465, + 3.8767633959650993, + 3.8439338095486164, + 3.801683895289898, + 3.842004109174013, + 3.85677395388484, + 3.926263190805912, + 3.894592635333538, + 3.836974035948515, + 3.77843389287591, + 3.839443903416395, + 3.8687926717102528, + 3.7819738499820232, + 3.8294331170618534, + 3.821633756160736, + 3.8303928449749947, + 3.771834075450897, + 4.127210006117821, + 3.941821865737438, + 3.8703233003616333, + 3.8604228757321835, + 3.9108828641474247, + 3.9188219234347343, + 4.279987886548042, + 4.044240806251764, + 3.8360939361155033, + 3.890282940119505, + 3.8961321115493774, + 3.884783014655113, + 3.859512973576784, + 3.9097419939935207, + 3.8662729784846306, + 3.8254735991358757, + 3.8899430073797703, + 3.77459404990077, + 3.7393849343061447, + 3.7226248532533646, + 4.481385927647352, + 4.104339983314276, + 3.798403777182102, + 3.8859639316797256, + 3.876322880387306, + 3.798743709921837, + 3.807373810559511, + 4.145629703998566, + 3.9972015656530857, + 3.7723039276897907, + 3.7981937639415264, + 3.7653339095413685, + 3.8335826247930527, + 3.74366482719779, + 3.732144832611084, + 3.8246437907218933, + 3.900952637195587, + 3.7409942597150803, + 3.7234053015708923, + 3.738545347005129 + ], + "nodedup": [ + 2.4863588623702526, + 2.1423851139843464, + 2.197453286498785, + 2.160583157092333, + 2.147204242646694, + 2.1064840257167816, + 2.098855096846819, + 2.0880051888525486, + 2.0967749878764153, + 2.092184964567423, + 2.0607346668839455, + 2.072715200483799, + 2.0733759738504887, + 2.1019536070525646, + 2.110433764755726, + 2.0907646976411343, + 2.0804149098694324, + 2.128013875335455, + 2.0872452296316624, + 2.0818947814404964, + 2.233013045042753, + 2.076835371553898, + 2.1263044327497482, + 2.1043550223112106, + 2.1299640648066998, + 2.116214018315077, + 2.0784949883818626, + 2.105644904077053, + 2.103164792060852, + 2.091905102133751, + 2.2061439231038094, + 2.078925259411335, + 2.078594174236059, + 2.0780949853360653, + 2.071965020149946, + 2.0823748782277107, + 2.0542358979582787, + 2.0902338437736034, + 2.093534916639328, + 2.0980453118681908, + 2.6894467882812023, + 2.168983221054077, + 2.1675429306924343, + 2.1710041910409927, + 2.14557396247983, + 2.156462986022234, + 2.113654278218746, + 2.125105354934931, + 2.143443562090397, + 2.1086554042994976, + 2.1341838873922825, + 2.0936443470418453, + 2.101954072713852, + 2.1049738861620426, + 2.085345331579447, + 2.123383805155754, + 2.0753047429025173, + 2.1138438023626804, + 2.112775109708309, + 2.1407739259302616, + 2.3528621532022953, + 2.1149138920009136, + 2.1126940846443176, + 2.1094949916005135, + 2.122343983501196, + 2.098844852298498, + 2.183763775974512, + 2.087535336613655, + 2.151274122297764, + 2.1199737675487995, + 2.0698849111795425, + 2.13266396895051, + 2.0971051417291164, + 2.0968448370695114, + 2.1013347432017326, + 2.079205121845007, + 2.0757848396897316, + 2.0738858729600906, + 2.093814779073, + 2.1110237576067448, + 2.3810919374227524, + 2.085144631564617, + 2.1175239235162735, + 2.106903586536646, + 2.152073197066784, + 2.1316739730536938, + 2.119594719260931, + 2.087665256112814, + 2.099074888974428, + 2.122934442013502, + 2.1027051843702793, + 2.0945537835359573, + 2.0880447700619698, + 2.1090637892484665, + 2.1073748357594013, + 2.1094749681651592, + 2.0868838764727116, + 2.094455063343048, + 2.093235030770302, + 2.16394430026412, + 2.594267949461937, + 2.169752959161997, + 2.1337750367820263, + 2.178753726184368, + 2.1564238704741, + 2.113805152475834, + 2.111553680151701, + 2.114183735102415, + 2.108034212142229, + 2.0944043062627316, + 2.097484190016985, + 2.0982250571250916, + 2.109333872795105, + 2.092184964567423, + 2.117765136063099, + 2.1132342517375946, + 2.121885307133198, + 2.1010348573327065, + 2.1059750579297543, + 2.0901840180158615, + 2.435159869492054, + 2.1585440263152122, + 2.141733653843403, + 2.1481839939951897, + 2.174444030970335, + 2.1540638990700245, + 2.133993897587061, + 2.1124249324202538, + 2.0876540802419186, + 2.0844750106334686, + 2.1108747459948063, + 2.0992159843444824, + 2.0964741706848145, + 2.0602750591933727, + 2.0813345909118652, + 2.1094740368425846, + 2.103094942867756, + 2.0821946673095226, + 2.0976238884031773, + 2.0767636597156525, + 2.2727120667696, + 2.1014539524912834, + 2.188763115555048, + 2.1495241671800613, + 2.1134139969944954, + 2.1269340068101883, + 2.101894933730364, + 2.101615071296692, + 2.0899148657917976, + 2.0958147943019867, + 2.116813790053129, + 2.1349037997424603, + 2.1069436334073544, + 2.088175155222416, + 2.110424917191267, + 2.10052402690053, + 2.0896843634545803, + 2.113614697009325, + 2.0952443592250347, + 2.099495381116867, + 2.6932167820632458, + 2.19673290848732, + 2.1688430570065975, + 2.192163374274969, + 2.155883703380823, + 2.109353896230459, + 2.10867403075099, + 2.0928452722728252, + 2.116155344992876, + 2.0946539007127285, + 2.1375343203544617, + 2.105054911226034, + 2.107545267790556, + 2.096754964441061, + 2.0701750181615353, + 2.0641349256038666, + 2.087474800646305, + 2.0988546311855316, + 2.1114950068295, + 2.0917151123285294, + 2.3316307924687862, + 2.242542803287506, + 2.1581342443823814, + 2.136955037713051, + 2.1136850118637085, + 2.090014982968569, + 2.08426546305418, + 2.077304758131504, + 2.1229940466582775, + 2.110494766384363, + 2.106364816427231, + 2.125153783708811, + 2.1026148460805416, + 2.0814849995076656, + 2.0832354202866554, + 2.0749648101627827, + 2.080203965306282, + 2.0977440290153027, + 2.112484071403742, + 2.0755846053361893, + 2.2494420409202576, + 2.08727503195405, + 2.0874650217592716, + 2.085055224597454, + 2.0891749300062656, + 2.08738399669528, + 2.084975130856037, + 2.0965938456356525, + 2.085775136947632, + 2.0831148140132427, + 2.1014236845076084, + 2.0630252547562122, + 2.080765087157488, + 2.095253672450781, + 2.077484969049692, + 2.0762640051543713, + 2.0920848473906517, + 2.122053876519203, + 2.0781648345291615, + 2.0839241333305836, + 2.6382477954030037, + 2.1575242280960083, + 2.199993934482336, + 2.1579740568995476, + 2.1659736521542072, + 2.1292553283274174, + 2.128954976797104, + 2.11602495983243, + 2.132053952664137, + 2.1157641895115376, + 2.1195239387452602, + 2.1042642183601856, + 2.109045162796974, + 2.0914440974593163, + 2.119764219969511, + 2.0977850072085857, + 2.098985016345978, + 2.066994085907936, + 2.099345438182354, + 2.099574077874422, + 2.319422084838152, + 2.1210238337516785, + 2.0807250402867794, + 2.1233251318335533, + 2.1626739762723446, + 2.1490640938282013, + 2.1032337099313736, + 2.089603804051876, + 2.1003750152885914, + 2.085343934595585, + 2.0993640646338463, + 2.0753550343215466, + 2.058505080640316, + 2.0879250951111317, + 2.092285081744194, + 2.0857849158346653, + 2.092244103550911, + 2.0812549628317356, + 2.1279738284647465, + 2.081194892525673, + 2.2354628890752792, + 2.120634075254202, + 2.1231453865766525, + 2.109964843839407, + 2.2453628480434418, + 2.232532948255539, + 2.071675378829241, + 2.120625227689743, + 2.1069752983748913, + 2.112165093421936, + 2.1110540255904198, + 2.0589050836861134, + 2.122105099260807, + 2.059275284409523, + 2.1056653931736946, + 2.0429957658052444, + 2.0896648056805134, + 2.130845095962286, + 2.108014654368162, + 2.108645159751177, + 2.651296555995941, + 2.2156434133648872, + 2.132503781467676, + 2.147663850337267, + 2.117563970386982, + 2.1107839420437813, + 2.09630373865366, + 2.11682403460145, + 2.1027536131441593, + 2.1177339367568493, + 2.1356442011892796, + 2.1140840835869312, + 2.1148240193724632, + 2.289752010256052, + 2.1171951666474342, + 2.1428437903523445, + 2.1286937408149242, + 2.1115941926836967, + 2.1108053624629974, + 2.11636396124959, + 2.397230826318264, + 2.140225376933813, + 2.135113812983036, + 2.1203537471592426, + 2.1321242675185204, + 2.1395240910351276, + 2.1455329842865467, + 2.1066549234092236, + 2.1294038742780685, + 2.1143644116818905, + 2.100624144077301, + 2.1015838719904423, + 2.0910250023007393, + 2.1308441646397114, + 2.1493639796972275, + 2.1169441752135754, + 2.122185193002224, + 2.1286141127347946, + 2.0993039943277836, + 2.1048239432275295, + 2.267412841320038, + 2.118475269526243, + 2.085465006530285, + 2.1183639764785767, + 2.0944448187947273, + 2.093304879963398, + 2.0886356942355633, + 2.0881840027868748, + 2.095254138112068, + 2.0930850878357887, + 2.1015736274421215, + 2.155634108930826, + 2.10457481443882, + 2.098524011671543, + 2.078304998576641, + 2.0886543206870556, + 2.092254813760519, + 2.075803931802511, + 2.0920950919389725, + 2.1533039398491383, + 2.5787297636270523, + 2.2001140750944614, + 2.132943831384182, + 2.1548341028392315, + 2.1376539953052998, + 2.1518240682780743, + 2.129285130649805, + 2.115075010806322, + 2.1153646521270275, + 2.0909151062369347, + 2.1142452023923397, + 2.1878830157220364, + 2.1394039504230022, + 2.1161548793315887, + 2.109325025230646, + 2.0823152735829353, + 2.0886240527033806, + 2.096854615956545, + 2.0910347811877728, + 2.0972047932446003, + 2.3377519100904465, + 2.0741550251841545, + 2.105464693158865, + 2.0667347125709057, + 2.1008760668337345, + 2.078404650092125, + 2.0805737003684044, + 2.0477650687098503, + 2.0805448293685913, + 2.1070940420031548, + 2.0294059067964554, + 2.0844638347625732, + 2.0454651676118374, + 2.0916052162647247, + 2.0144148729741573, + 1.9930656999349594, + 2.0806249231100082, + 2.233153209090233, + 2.0961547270417213, + 2.0209546200931072, + 2.175773959606886, + 2.088394947350025, + 2.028255257755518, + 2.0735450088977814, + 2.051275223493576, + 2.0521250553429127, + 2.0859139040112495, + 2.0305649377405643, + 2.076535951346159, + 2.051765099167824, + 2.0810049027204514, + 2.04420555382967, + 2.053955104202032, + 2.0913551561534405, + 2.039124723523855, + 2.0630452781915665, + 2.0597251132130623, + 2.088475041091442, + 2.082115039229393, + 2.042145933955908 + ], + "library": [ + 2.3886319249868393, + 2.017335966229439, + 2.074555028229952, + 2.0621148869395256, + 2.0319451577961445, + 2.035296056419611, + 1.997204963117838, + 2.032076008617878, + 2.0195646211504936, + 2.0376350730657578, + 2.0270361565053463, + 2.004886046051979, + 2.0338851027190685, + 2.0127356983721256, + 2.0178849808871746, + 1.9686263985931873, + 1.997196115553379, + 2.0554354414343834, + 2.038915641605854, + 2.0745950751006603, + 2.1187439560890198, + 2.035146113485098, + 2.045365981757641, + 1.987234689295292, + 2.04684492200613, + 2.0170346833765507, + 2.020906191319227, + 2.0514861680567265, + 2.006326336413622, + 2.0354348234832287, + 2.0111161284148693, + 2.0274356938898563, + 2.0335959270596504, + 2.015485893934965, + 1.9964859820902348, + 1.9853860139846802, + 2.070224843919277, + 2.0369947887957096, + 1.9803359173238277, + 1.9984859973192215, + 2.2845319472253323, + 2.0911837927997112, + 2.034864854067564, + 2.108125016093254, + 2.1178750321269035, + 2.1002450957894325, + 2.0762747153639793, + 2.055375836789608, + 2.0937947556376457, + 2.0857746712863445, + 2.0571951754391193, + 2.0873858593404293, + 2.083985134959221, + 2.074094023555517, + 2.007346134632826, + 2.0531159825623035, + 2.0534349605441093, + 2.020115964114666, + 2.040944993495941, + 2.0213047973811626, + 2.4794810451567173, + 2.0660250447690487, + 2.066474873572588, + 2.060965169221163, + 2.0991042256355286, + 2.0401859655976295, + 2.036125399172306, + 2.0110555924475193, + 2.0398972555994987, + 2.0331554114818573, + 2.034174744039774, + 2.0283949561417103, + 2.0435950718820095, + 2.0247753709554672, + 2.0680748857557774, + 2.0819250494241714, + 2.043195068836212, + 2.042745240032673, + 1.9966461695730686, + 2.0578247494995594, + 2.2022631019353867, + 2.0258459262549877, + 2.04629497602582, + 2.0366949029266834, + 2.066114917397499, + 2.028854563832283, + 2.0477748475968838, + 2.0852950401604176, + 2.0715449936687946, + 2.076753880828619, + 2.0599649287760258, + 2.055615186691284, + 2.0619849674403667, + 2.0866948179900646, + 2.0651747472584248, + 2.0978241227567196, + 2.052625175565481, + 2.0408350974321365, + 2.0651454105973244, + 2.049714792519808, + 2.328692004084587, + 2.076844684779644, + 2.0694248378276825, + 2.075045369565487, + 2.0700450986623764, + 2.0331251434981823, + 2.0350851118564606, + 2.0598447881639004, + 2.0274948328733444, + 2.06951517611742, + 2.0288852974772453, + 2.0451750606298447, + 2.113373950123787, + 2.0705549977719784, + 2.0201546140015125, + 2.0151562057435513, + 2.043086104094982, + 2.0473748445510864, + 2.038045320659876, + 2.0120451226830482, + 2.4370108731091022, + 2.0804349333047867, + 2.051524817943573, + 2.1899640560150146, + 2.0461250096559525, + 2.0357859320938587, + 2.0246761851012707, + 2.036625985056162, + 2.058064565062523, + 2.071684692054987, + 2.0682751201093197, + 2.0301351323723793, + 2.052045427262783, + 2.0229858346283436, + 2.0418749190866947, + 2.0135859958827496, + 2.0463247783482075, + 2.0271860994398594, + 2.017025835812092, + 2.056844998151064, + 2.133054193109274, + 2.023695968091488, + 2.0502563565969467, + 1.9957260228693485, + 2.0530447363853455, + 2.0530051551759243, + 2.0448551513254642, + 2.005784772336483, + 2.0256349816918373, + 2.0077060908079147, + 2.0853537134826183, + 2.0651151426136494, + 2.24124314263463, + 2.2042840719223022, + 2.0327349193394184, + 2.04968499019742, + 2.0243050530552864, + 1.9899755716323853, + 2.0509050227701664, + 2.042326144874096, + 2.714978065341711, + 2.157934010028839, + 2.1276138722896576, + 2.1229349076747894, + 2.1178852766752243, + 2.041054889559746, + 2.0492649637162685, + 2.0292350091040134, + 2.061625011265278, + 2.0642150193452835, + 2.0395847968757153, + 2.0450050942599773, + 2.0652050152420998, + 2.1089338697493076, + 2.066494897007942, + 2.056554891169071, + 2.0588450133800507, + 2.0392751321196556, + 2.0503345876932144, + 2.0445152185857296, + 2.453531138598919, + 2.030956093221903, + 2.089674584567547, + 2.0365752279758453, + 2.050654962658882, + 2.0062653347849846, + 2.0462647080421448, + 2.059144899249077, + 2.003306057304144, + 2.0304452627897263, + 2.004185225814581, + 2.0316848531365395, + 1.9922764040529728, + 2.034675795584917, + 2.023765817284584, + 2.036845777183771, + 2.006296068429947, + 2.0538056269288063, + 1.9936449825763702, + 1.989276148378849, + 2.1870527416467667, + 2.0431848242878914, + 2.0311763510107994, + 2.0433459430933, + 2.0210850052535534, + 1.9899159669876099, + 2.0272349938750267, + 2.024646382778883, + 2.0198249258100986, + 2.0292559638619423, + 1.9978247582912445, + 2.0014862529933453, + 2.024976070970297, + 2.0163259468972683, + 1.9929362460970879, + 1.990096177905798, + 2.038086298853159, + 2.0268759690225124, + 2.182513941079378, + 2.0421859808266163, + 2.2413828410208225, + 2.078775316476822, + 2.028524875640869, + 2.016075886785984, + 2.0371852442622185, + 2.0232549868524075, + 2.0236149430274963, + 1.9991258159279823, + 2.0023458637297153, + 2.0208661444485188, + 2.014396246522665, + 2.0194360986351967, + 2.0108059979975224, + 2.016895916312933, + 2.01212614774704, + 2.034324686974287, + 1.9817161373794079, + 1.9483058713376522, + 2.0533250644803047, + 1.9959150813519955, + 2.4527302011847496, + 2.069314941763878, + 2.0494158379733562, + 2.0602946169674397, + 2.071075141429901, + 2.048974856734276, + 2.040125895291567, + 2.0403661765158176, + 2.043535001575947, + 2.0214146934449673, + 2.016655169427395, + 2.0182658918201923, + 2.0460058003664017, + 1.9816961139440536, + 2.07705469802022, + 2.0330646075308323, + 2.0488351583480835, + 2.0414162427186966, + 2.062315121293068, + 2.029754687100649, + 2.0912140607833862, + 2.017275895923376, + 2.018625847995281, + 2.0115659572184086, + 2.025466412305832, + 2.0734742283821106, + 2.0189061760902405, + 2.031744923442602, + 2.0329048857092857, + 2.037805039435625, + 2.024564892053604, + 2.0244959741830826, + 2.0006257109344006, + 2.023134846240282, + 2.0585651509463787, + 2.017875202000141, + 2.029605209827423, + 2.027625683695078, + 2.043725922703743, + 2.022405620664358, + 2.336392179131508, + 2.075043972581625, + 2.0575751550495625, + 2.056964673101902, + 2.050994895398617, + 2.0421850495040417, + 2.040205989032984, + 2.05344520509243, + 2.045075409114361, + 2.047924790531397, + 2.0450949668884277, + 2.0387559197843075, + 2.042934764176607, + 2.0409547723829746, + 2.0142560824751854, + 2.0340359769761562, + 2.0637447014451027, + 2.02523497864604, + 2.040495164692402, + 2.0370460115373135, + 2.4696304462850094, + 2.0738239400088787, + 2.069115173071623, + 2.069875132292509, + 2.080974169075489, + 2.052195370197296, + 2.025165129452944, + 2.040104940533638, + 2.0277947187423706, + 2.0493450574576855, + 2.1023047156631947, + 2.075345255434513, + 2.0465352572500706, + 2.050044946372509, + 2.050784882158041, + 2.054725307971239, + 2.0597148686647415, + 2.022585365921259, + 2.0370851270854473, + 2.03651562333107, + 2.1038250997662544, + 2.057044766843319, + 2.026475965976715, + 2.0270850509405136, + 2.039514947682619, + 2.013036049902439, + 2.0342152565717697, + 2.0019751973450184, + 2.0248759537935257, + 2.0555350929498672, + 2.0642252638936043, + 2.0479848608374596, + 2.0183860324323177, + 2.057535108178854, + 2.0336159504950047, + 2.0523550920188427, + 2.0345058292150497, + 2.052835188806057, + 2.0197262056171894, + 2.0841252990067005, + 2.2592730820178986, + 2.074125222861767, + 2.0472751930356026, + 2.060494851320982, + 2.0112558268010616, + 2.084155101329088, + 2.035456243902445, + 2.044804859906435, + 2.0249360240995884, + 2.0713252015411854, + 2.0378450863063335, + 2.0744851790368557, + 2.05045472830534, + 2.075184602290392, + 2.0529748871922493, + 2.034285105764866, + 2.018625847995281, + 2.0216749981045723, + 2.0757848396897316, + 2.0231357775628567, + 2.4397699162364006, + 2.055845223367214, + 2.0112148486077785, + 1.9906163215637207, + 2.0340457558631897, + 1.9572661258280277, + 1.9731363281607628, + 2.0058657974004745, + 1.9580060616135597, + 1.9737360998988152, + 2.036075107753277, + 1.9646561704576015, + 1.9703959114849567, + 2.0024357363581657, + 1.9574263133108616, + 1.9774059765040874, + 2.0241751335561275, + 1.967546995729208, + 1.9683758728206158, + 2.0144558511674404, + 2.1572140976786613, + 1.9960659556090832, + 2.0396760664880276, + 1.983035821467638, + 2.0167548209428787, + 2.0335549488663673, + 1.9796360284090042, + 2.0217951387166977, + 1.9756057299673557, + 1.9774362444877625, + 2.0319861359894276, + 1.974946353584528, + 1.9927863031625748, + 2.0358446054160595, + 1.99037604033947, + 2.035365905612707, + 2.168303821235895, + 2.0282859914004803, + 2.0053358748555183, + 1.9843559712171555 + ] + }, + "warm_ms": { + "control": [ + 34.228034783154726, + 4.988519940525293, + 4.437236115336418 + ], + "nodedup": [ + 6.428401917219162, + 2.7499073185026646, + 2.4969889782369137 + ], + "library": [ + 2.5402591563761234, + 2.48180003836751, + 2.270502969622612 + ] + }, + "stats": { + "control": { + "n": 400, + "median_ms": 3.860158147290349, + "p10_ms": 3.7995070684701204, + "p90_ms": 4.061951022595167, + "min_ms": 3.7226248532533646, + "max_ms": 4.793230909854174, + "mean_ms": 3.9028289914131165 + }, + "nodedup": { + "n": 400, + "median_ms": 2.104898914694786, + "p10_ms": 2.075561648234725, + "p90_ms": 2.1688570734113455, + "min_ms": 1.9930656999349594, + "max_ms": 2.6932167820632458, + "mean_ms": 2.123043133178726 + }, + "library": { + "n": 400, + "median_ms": 2.039095386862755, + "p10_ms": 1.9977627787739038, + "p90_ms": 2.087614731863141, + "min_ms": 1.9483058713376522, + "max_ms": 2.714978065341711, + "mean_ms": 2.052909145131707 + } + }, + "ratio_control_over_nodedup": { + "ratio": 1.8338924118121267, + "ci90_low": 1.8304936390602609, + "ci90_high": 1.837584787415146, + "bootstrap_samples": 2000 + }, + "ratio_library_over_nodedup": { + "ratio": 0.9687379154539719, + "ci90_low": 0.966686924974742, + "ci90_high": 0.9707693156200883, + "bootstrap_samples": 2000 + }, + "ratio_control_over_library": { + "ratio": 1.8930738464517767, + "ci90_low": 1.8897547298728516, + "ci90_high": 1.896670004399576, + "bootstrap_samples": 2000 + }, + "paired_round_ratio_control_over_nodedup": { + "median": 1.8312478325474242, + "p10": 1.8213659162459324, + "p90": 1.8572648322239318 + }, + "minimum_detectable_improvement": 0.06798787617270814, + "compile": { + "control": { + "lower_s": 34.03408801369369, + "compile_s": 43.73495469382033, + "first_call_s": 0.037162268999964, + "trace_calls": 168, + "flops": 160386096.0, + "hlo_sort_count": 25, + "stablehlo_sort_count": 3, + "hlo_sort_shapes": [ + "(f64[276507]{0}, f64[276507]{0}, s64[276507]{0}, s32[276507]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0}, s32[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0}, s32[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0}, s32[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0}, s32[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0}, s32[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0}, s32[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0}, s32[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0}, s32[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0}, s32[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0}, s32[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0}, s32[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0}, s32[720]{0})" + ], + "hlo_sha256": "84ece87bab9e2b35", + "hlo_lines": 33474 + }, + "nodedup": { + "lower_s": 33.50928048091009, + "compile_s": 37.647898075170815, + "first_call_s": 0.021917653735727072, + "trace_calls": 168, + "flops": 120366792.0, + "hlo_sort_count": 12, + "stablehlo_sort_count": 1, + "hlo_sort_shapes": [ + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})" + ], + "hlo_sha256": "58e085dcb65a3962", + "hlo_lines": 27923 + }, + "library": { + "lower_s": 33.510765661951154, + "compile_s": 2.9416015627793968, + "first_call_s": 0.020802798215299845, + "trace_calls": 168, + "flops": 120366792.0, + "hlo_sort_count": 12, + "stablehlo_sort_count": 1, + "hlo_sort_shapes": [ + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})" + ], + "hlo_sha256": "58e085dcb65a3962", + "hlo_lines": 27923 + } + }, + "instances_compared": [ + [ + 0 + ], + [ + 1 + ], + [ + 2 + ], + [ + 3 + ], + [ + 4 + ], + [ + 5 + ], + [ + 6 + ], + [ + 7 + ], + [ + 8 + ], + [ + 9 + ], + [ + 10 + ], + [ + 11 + ], + [ + 12 + ], + [ + 13 + ], + [ + 14 + ], + [ + 15 + ] + ], + "values": { + "control": [ + 23.965075083393216, + -743.7107061665998, + 3.34333029172722, + -489.755628041605, + -527.9229457499364, + -468.67815408327806, + -247.07984679160097, + -1110.0030238749466, + -779.0297165832758, + -20.35458637494291, + -110.36109679160913, + -691.0739874166075, + -1296.2823207499168, + -205.49456033327567, + -223.8376592915989, + -334.80771137493866 + ], + "nodedup": [ + 23.965075083393216, + -743.7107061665998, + 3.34333029172722, + -489.755628041605, + -527.9229457499364, + -468.67815408327806, + -247.07984679160097, + -1110.0030238749466, + -779.0297165832758, + -20.35458637494291, + -110.36109679160913, + -691.0739874166075, + -1296.2823207499168, + -205.49456033327567, + -223.8376592915989, + -334.80771137493866 + ], + "library": [ + 23.965075083393216, + -743.7107061665998, + 3.34333029172722, + -489.755628041605, + -527.9229457499364, + -468.67815408327806, + -247.07984679160097, + -1110.0030238749466, + -779.0297165832758, + -20.35458637494291, + -110.36109679160913, + -691.0739874166075, + -1296.2823207499168, + -205.49456033327567, + -223.8376592915989, + -334.80771137493866 + ] + }, + "deterministic_within_route": { + "control": true, + "nodedup": true, + "library": true + }, + "likelihood_gate": { + "control_vs_nodedup": { + "bit_identical": true, + "max_abs_delta": 0.0, + "max_rel_delta": 0.0, + "nan_pattern_equal": true + }, + "control_vs_library": { + "bit_identical": true, + "max_abs_delta": 0.0, + "max_rel_delta": 0.0, + "nan_pattern_equal": true + }, + "nodedup_vs_library": { + "bit_identical": true, + "max_abs_delta": 0.0, + "max_rel_delta": 0.0, + "nan_pattern_equal": true + } + }, + "fiducial_log_likelihood": { + "control": 23.965075083393216, + "nodedup": 23.965075083393216, + "library": 23.965075083393216 + } + } + }, + "gates": { + "simple_solved_positions": { + "n_instances": 3, + "compile": { + "control": { + "lower_s": 1.6672200681641698, + "compile_s": 7.995221917051822, + "first_call_s": 0.020574151072651148, + "trace_calls": 16, + "flops": 17393476.0, + "hlo_sort_count": 15, + "stablehlo_sort_count": 3, + "hlo_sort_shapes": [ + "(f64[69849]{0}, f64[69849]{0}, s64[69849]{0}, s32[69849]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0}, s32[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0}, s32[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0}, s32[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0}, s32[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0}, s32[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0}, s32[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0}, s32[720]{0})" + ], + "hlo_sha256": "3922f61537c1204b", + "hlo_lines": 12881 + }, + "nodedup": { + "lower_s": 1.4932629256509244, + "compile_s": 4.035344575997442, + "first_call_s": 0.010693980846554041, + "trace_calls": 16, + "flops": 6597258.0, + "hlo_sort_count": 7, + "stablehlo_sort_count": 1, + "hlo_sort_shapes": [ + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})" + ], + "hlo_sha256": "743452e49310a399", + "hlo_lines": 8787 + }, + "library": { + "lower_s": 1.5956968227401376, + "compile_s": 0.3734502266161144, + "first_call_s": 0.010169986635446548, + "trace_calls": 16, + "flops": 6597258.0, + "hlo_sort_count": 7, + "stablehlo_sort_count": 1, + "hlo_sort_shapes": [ + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})" + ], + "hlo_sha256": "743452e49310a399", + "hlo_lines": 8787 + } + }, + "positions": { + "control": [ + [ + [ + [ + -1.03515625, + -1.0450941982127835 + ], + [ + Infinity, + Infinity + ], + [ + 0.35546875, + 1.6296613457672795 + ], + [ + 1.24375, + 1.1086929388032032 + ], + [ + 1.6062500000000002, + 0.44293590964391594 + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ] + ] + ], + [ + [ + [ + -1.0289062500000001, + -1.0225414533225639 + ], + [ + Infinity, + Infinity + ], + [ + 0.35, + 1.6138744243441256 + ], + [ + 1.2578125, + 1.0644895588183723 + ], + [ + 1.5890625, + 0.4375232508702632 + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ] + ] + ], + [ + [ + [ + -1.0203125, + -1.0861401939129833 + ], + [ + Infinity, + Infinity + ], + [ + 0.3484375, + 1.6328187300519101 + ], + [ + 1.1398437499999998, + 1.2182992789696712 + ], + [ + 1.609375, + 0.4447401292351335 + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ] + ] + ] + ], + "nodedup": [ + [ + [ + [ + -1.03515625, + -1.0450941982127835 + ], + [ + Infinity, + Infinity + ], + [ + 0.35546875, + 1.6296613457672795 + ], + [ + 1.24375, + 1.1086929388032032 + ], + [ + 1.6062500000000002, + 0.44293590964391594 + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ] + ] + ], + [ + [ + [ + -1.0289062500000001, + -1.0225414533225639 + ], + [ + Infinity, + Infinity + ], + [ + 0.35, + 1.6138744243441256 + ], + [ + 1.2578125, + 1.0644895588183723 + ], + [ + 1.5890625, + 0.4375232508702632 + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ] + ] + ], + [ + [ + [ + -1.0203125, + -1.0861401939129833 + ], + [ + Infinity, + Infinity + ], + [ + 0.3484375, + 1.6328187300519101 + ], + [ + 1.1398437499999998, + 1.2182992789696712 + ], + [ + 1.609375, + 0.4447401292351335 + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ] + ] + ] + ], + "library": [ + [ + [ + [ + -1.03515625, + -1.0450941982127835 + ], + [ + Infinity, + Infinity + ], + [ + 0.35546875, + 1.6296613457672795 + ], + [ + 1.24375, + 1.1086929388032032 + ], + [ + 1.6062500000000002, + 0.44293590964391594 + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ] + ] + ], + [ + [ + [ + -1.0289062500000001, + -1.0225414533225639 + ], + [ + Infinity, + Infinity + ], + [ + 0.35, + 1.6138744243441256 + ], + [ + 1.2578125, + 1.0644895588183723 + ], + [ + 1.5890625, + 0.4375232508702632 + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ] + ] + ], + [ + [ + [ + -1.0203125, + -1.0861401939129833 + ], + [ + Infinity, + Infinity + ], + [ + 0.3484375, + 1.6328187300519101 + ], + [ + 1.1398437499999998, + 1.2182992789696712 + ], + [ + 1.609375, + 0.4447401292351335 + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ] + ] + ] + ] + }, + "finite_positions": { + "control": [ + [ + 4 + ], + [ + 4 + ], + [ + 4 + ] + ], + "nodedup": [ + [ + 4 + ], + [ + 4 + ], + [ + 4 + ] + ], + "library": [ + [ + 4 + ], + [ + 4 + ], + [ + 4 + ] + ] + }, + "pairs": { + "control_vs_nodedup": { + "max_abs_delta": 0.0, + "max_rel_delta": 0.0, + "nan_pattern_equal": true, + "array_equal_nan_aware": true + }, + "control_vs_library": { + "max_abs_delta": 0.0, + "max_rel_delta": 0.0, + "nan_pattern_equal": true, + "array_equal_nan_aware": true + } + } + }, + "simple_solved_grad": { + "n_instances": 3, + "rtol": 1e-10, + "atol": 1e-12, + "compile": { + "control": { + "lower_s": 4.827607200946659, + "compile_s": 21.608729199972004, + "first_call_s": 0.193777022883296, + "trace_calls": 32, + "flops": 20038160.0, + "hlo_sort_count": 30, + "stablehlo_sort_count": 4, + "hlo_sort_shapes": [ + "(f64[69849]{0}, f64[69849]{0}, s64[69849]{0}, s32[69849]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0}, s32[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0}, s32[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0}, s32[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0}, s32[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0}, s32[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0}, s32[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0}, s32[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0}, s32[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0}, s32[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0}, s32[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0}, s32[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0}, s32[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0}, s32[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0}, s32[720]{0})", + "(s32[15,2]{1,0}, s32[15,2]{1,0}, s32[15,2]{1,0})" + ], + "hlo_sha256": "91fe7ee738c1d7dd", + "hlo_lines": 30838 + }, + "nodedup": { + "lower_s": 4.517724533565342, + "compile_s": 17.27444326505065, + "first_call_s": 0.022676875349134207, + "trace_calls": 32, + "flops": 8513047.0, + "hlo_sort_count": 15, + "stablehlo_sort_count": 2, + "hlo_sort_shapes": [ + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(s32[15,2]{1,0}, s32[15,2]{1,0}, s32[15,2]{1,0})" + ], + "hlo_sha256": "7da5b782d4aaeca7", + "hlo_lines": 23422 + }, + "library": { + "lower_s": 4.724604859016836, + "compile_s": 1.3830061303451657, + "first_call_s": 0.0198817802593112, + "trace_calls": 32, + "flops": 8513047.0, + "hlo_sort_count": 15, + "stablehlo_sort_count": 2, + "hlo_sort_shapes": [ + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(s32[15,2]{1,0}, s32[15,2]{1,0}, s32[15,2]{1,0})" + ], + "hlo_sha256": "7da5b782d4aaeca7", + "hlo_lines": 23422 + } + }, + "all_finite": { + "control": true, + "nodedup": true, + "library": true + }, + "gradients": { + "control": [ + [ + -41.62226304409438, + 53.13429595961162, + 31.78649237786796, + 2.8041319222743963, + 1781.7386158499723 + ], + [ + -46.40807305536087, + 75.13738885139988, + 78.91835319795189, + 74.3249971953795, + 2531.5778928836007 + ], + [ + 62.95146940120323, + -41.40185295995114, + 18.162643132915864, + 109.0003235058206, + -1560.5490919238116 + ] + ], + "nodedup": [ + [ + -41.62226304409438, + 53.13429595961162, + 31.78649237786796, + 2.8041319222743963, + 1781.7386158499723 + ], + [ + -46.40807305536087, + 75.13738885139988, + 78.91835319795189, + 74.3249971953795, + 2531.5778928836007 + ], + [ + 62.95146940120323, + -41.40185295995114, + 18.162643132915864, + 109.0003235058206, + -1560.5490919238116 + ] + ], + "library": [ + [ + -41.62226304409438, + 53.13429595961162, + 31.78649237786796, + 2.8041319222743963, + 1781.7386158499723 + ], + [ + -46.40807305536087, + 75.13738885139988, + 78.91835319795189, + 74.3249971953795, + 2531.5778928836007 + ], + [ + 62.95146940120323, + -41.40185295995114, + 18.162643132915864, + 109.0003235058206, + -1560.5490919238116 + ] + ] + }, + "pairs": { + "control_vs_nodedup": { + "bit_identical": true, + "max_abs_delta": 0.0, + "max_rel_delta": 0.0, + "nan_pattern_equal": true, + "allclose": true + }, + "control_vs_library": { + "bit_identical": true, + "max_abs_delta": 0.0, + "max_rel_delta": 0.0, + "nan_pattern_equal": true, + "allclose": true + } + } + }, + "simple_solved_vmap4": { + "vmap_vs_scalar_within_route": { + "control": { + "bit_identical": true, + "max_abs_delta": 0.0, + "max_rel_delta": 0.0, + "nan_pattern_equal": true, + "allclose_rtol_1e-12": true, + "n_compared": 16 + }, + "nodedup": { + "bit_identical": true, + "max_abs_delta": 0.0, + "max_rel_delta": 0.0, + "nan_pattern_equal": true, + "allclose_rtol_1e-12": true, + "n_compared": 16 + }, + "library": { + "bit_identical": true, + "max_abs_delta": 0.0, + "max_rel_delta": 0.0, + "nan_pattern_equal": true, + "allclose_rtol_1e-12": true, + "n_compared": 16 + } + }, + "across_routes": { + "control_vs_nodedup": { + "bit_identical": true, + "max_abs_delta": 0.0, + "max_rel_delta": 0.0, + "nan_pattern_equal": true + }, + "control_vs_library": { + "bit_identical": true, + "max_abs_delta": 0.0, + "max_rel_delta": 0.0, + "nan_pattern_equal": true + }, + "nodedup_vs_library": { + "bit_identical": true, + "max_abs_delta": 0.0, + "max_rel_delta": 0.0, + "nan_pattern_equal": true + } + } + }, + "cluster_solved_positions": { + "n_instances": 3, + "compile": { + "control": { + "lower_s": 8.142000899184495, + "compile_s": 28.437952139880508, + "first_call_s": 0.04016241431236267, + "trace_calls": 28, + "flops": 160358592.0, + "hlo_sort_count": 25, + "stablehlo_sort_count": 3, + "hlo_sort_shapes": [ + "(f64[276507]{0}, f64[276507]{0}, s64[276507]{0}, s32[276507]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0}, s32[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0}, s32[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0}, s32[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0}, s32[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0}, s32[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0}, s32[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0}, s32[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0}, s32[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0}, s32[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0}, s32[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0}, s32[720]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[720]{0}, f64[720]{0}, s64[720]{0}, s32[720]{0})" + ], + "hlo_sha256": "78ecb5e59b4f224b", + "hlo_lines": 36174 + }, + "nodedup": { + "lower_s": 8.075029420666397, + "compile_s": 23.098694154061377, + "first_call_s": 0.023185089696198702, + "trace_calls": 28, + "flops": 120345624.0, + "hlo_sort_count": 12, + "stablehlo_sort_count": 1, + "hlo_sort_shapes": [ + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})" + ], + "hlo_sha256": "cac1bfda7fcd891b", + "hlo_lines": 30002 + }, + "library": { + "lower_s": 8.021001605782658, + "compile_s": 2.1920570018701255, + "first_call_s": 0.021151062566787004, + "trace_calls": 28, + "flops": 120345624.0, + "hlo_sort_count": 12, + "stablehlo_sort_count": 1, + "hlo_sort_shapes": [ + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})", + "(f64[60]{0}, f64[60]{0}, s64[60]{0}, s32[60]{0})" + ], + "hlo_sha256": "cac1bfda7fcd891b", + "hlo_lines": 30002 + } + }, + "positions": { + "control": [ + [ + [ + [ + -3.0789062499999997, + -7.858729484445975 + ], + [ + -0.9296874999999998, + 10.716162262036818 + ], + [ + -0.021874999999999995, + -0.23996120563193818 + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ] + ], + [ + [ + -15.96875, + 19.007453393477206 + ], + [ + 0.68359375, + -0.5146536383948147 + ], + [ + 13.693749999999998, + -14.309265577946627 + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ] + ] + ], + [ + [ + [ + -3.0789062499999997, + -7.858729484445975 + ], + [ + -0.9296875, + 10.709847493467556 + ], + [ + -0.016406249999999997, + -0.24311858991656893 + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ] + ], + [ + [ + -15.963281249999998, + 18.997981240623318 + ], + [ + 0.6890624999999999, + -0.5178110226794455 + ], + [ + 13.68828125, + -14.306108193661998 + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ] + ] + ], + [ + [ + [ + -3.0843749999999996, + -7.855572100161344 + ], + [ + -0.9351562499999999, + 10.72563441489071 + ], + [ + -0.021874999999999995, + -0.23364643706267668 + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ] + ], + [ + [ + -15.96875, + 19.007453393477206 + ], + [ + 0.68359375, + -0.5083388698255532 + ], + [ + 13.693749999999998, + -14.309265577946627 + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ] + ] + ] + ], + "nodedup": [ + [ + [ + [ + -3.0789062499999997, + -7.858729484445975 + ], + [ + -0.9296874999999998, + 10.716162262036818 + ], + [ + -0.021874999999999995, + -0.23996120563193818 + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ] + ], + [ + [ + -15.96875, + 19.007453393477206 + ], + [ + 0.68359375, + -0.5146536383948147 + ], + [ + 13.693749999999998, + -14.309265577946627 + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ] + ] + ], + [ + [ + [ + -3.0789062499999997, + -7.858729484445975 + ], + [ + -0.9296875, + 10.709847493467556 + ], + [ + -0.016406249999999997, + -0.24311858991656893 + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ] + ], + [ + [ + -15.963281249999998, + 18.997981240623318 + ], + [ + 0.6890624999999999, + -0.5178110226794455 + ], + [ + 13.68828125, + -14.306108193661998 + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ] + ] + ], + [ + [ + [ + -3.0843749999999996, + -7.855572100161344 + ], + [ + -0.9351562499999999, + 10.72563441489071 + ], + [ + -0.021874999999999995, + -0.23364643706267668 + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ] + ], + [ + [ + -15.96875, + 19.007453393477206 + ], + [ + 0.68359375, + -0.5083388698255532 + ], + [ + 13.693749999999998, + -14.309265577946627 + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ] + ] + ] + ], + "library": [ + [ + [ + [ + -3.0789062499999997, + -7.858729484445975 + ], + [ + -0.9296874999999998, + 10.716162262036818 + ], + [ + -0.021874999999999995, + -0.23996120563193818 + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ] + ], + [ + [ + -15.96875, + 19.007453393477206 + ], + [ + 0.68359375, + -0.5146536383948147 + ], + [ + 13.693749999999998, + -14.309265577946627 + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ] + ] + ], + [ + [ + [ + -3.0789062499999997, + -7.858729484445975 + ], + [ + -0.9296875, + 10.709847493467556 + ], + [ + -0.016406249999999997, + -0.24311858991656893 + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ] + ], + [ + [ + -15.963281249999998, + 18.997981240623318 + ], + [ + 0.6890624999999999, + -0.5178110226794455 + ], + [ + 13.68828125, + -14.306108193661998 + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ] + ] + ], + [ + [ + [ + -3.0843749999999996, + -7.855572100161344 + ], + [ + -0.9351562499999999, + 10.72563441489071 + ], + [ + -0.021874999999999995, + -0.23364643706267668 + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ] + ], + [ + [ + -15.96875, + 19.007453393477206 + ], + [ + 0.68359375, + -0.5083388698255532 + ], + [ + 13.693749999999998, + -14.309265577946627 + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ], + [ + Infinity, + Infinity + ] + ] + ] + ] + }, + "finite_positions": { + "control": [ + [ + 3, + 3 + ], + [ + 3, + 3 + ], + [ + 3, + 3 + ] + ], + "nodedup": [ + [ + 3, + 3 + ], + [ + 3, + 3 + ], + [ + 3, + 3 + ] + ], + "library": [ + [ + 3, + 3 + ], + [ + 3, + 3 + ], + [ + 3, + 3 + ] + ] + }, + "pairs": { + "control_vs_nodedup": { + "max_abs_delta": 0.0, + "max_rel_delta": 0.0, + "nan_pattern_equal": true, + "array_equal_nan_aware": true + }, + "control_vs_library": { + "max_abs_delta": 0.0, + "max_rel_delta": 0.0, + "nan_pattern_equal": true, + "array_equal_nan_aware": true + } + } + } + }, + "wall_s": 696.4826351790689 +} \ No newline at end of file diff --git a/results/breakdown/point_source/vertex_dedup_ab_hpc_ral_a100_fp64.png b/results/breakdown/point_source/vertex_dedup_ab_hpc_ral_a100_fp64.png new file mode 100644 index 0000000000000000000000000000000000000000..62ded0bc87df3518fcd525686e3fa667bd844c6b GIT binary patch literal 119260 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