From ae12a71a76e59ee46c2ddd4601f0582667ddde3a Mon Sep 17 00:00:00 2001 From: Jammy2211 Date: Thu, 24 Sep 2026 16:56:09 +0200 Subject: [PATCH 1/7] feat(profiling): certified-solver phase C1 capture + captured-lane replay (#304) New scripts/imaging/likelihood_breakdown/nautilus_batch_capture.py fits the phase-B S3 fixed-light system with af.Nautilus at the production source_pix[1] settings (n_live=150, n_batch=20, use_jax_vmap=True, library PDIP) and records every batch reaching Fitness.call_wrap (script-scoped patch of call_wrap and nautilus.Sampler.evaluate_likelihood for the phase tag) to nautilus_batches_.npz + provenance JSON. Caps: --n-like-max and --capture-seconds; the post-fit perform_update is skipped. fixed_light_trace.py gains --lanes captured --batches [--captured-pass time|rate] [--batch-sample K] (library mode only; S3 fingerprint check refuses a mismatched capture). time = phase-B harness and unchanged 1e-9 gate on a window of real batches; rate = untimed per-lane certified/passes over the capture in jit(vmap) chunks, overall / by Nautilus phase / by call half, with recorded comparisons against the capture's PDIP values and a scalar-PDIP recheck of uncertified lanes. New 28-task A100 submit (2 captures, 2 rate passes, mesh x B{16,20,50,100} x 3 phase-B rows) with a documented two-step dependency, static tests, and nautilus_batches unit tests. No library edits, no results committed. Co-Authored-By: Claude Opus 5.5 (1M context) --- ...ed_light_certified_lane_rate_a100_hst_fp64 | 273 ++++++++ .../likelihood_breakdown/fixed_light_trace.py | 611 +++++++++++++++++- .../nautilus_batch_capture.py | 602 +++++++++++++++++ .../likelihood_breakdown/nautilus_batches.py | 330 ++++++++++ scripts/misc/test/test_fixed_light_cell.py | 1 + ..._fixed_light_certified_lane_rate_submit.py | 211 ++++++ scripts/misc/test/test_nautilus_batches.py | 122 ++++ 7 files changed, 2146 insertions(+), 4 deletions(-) create mode 100755 hpc/batch_gpu/submit_breakdown_imaging_fixed_light_certified_lane_rate_a100_hst_fp64 create mode 100644 scripts/imaging/likelihood_breakdown/nautilus_batch_capture.py create mode 100644 scripts/misc/likelihood_breakdown/nautilus_batches.py create mode 100644 scripts/misc/test/test_fixed_light_certified_lane_rate_submit.py create mode 100644 scripts/misc/test/test_nautilus_batches.py diff --git a/hpc/batch_gpu/submit_breakdown_imaging_fixed_light_certified_lane_rate_a100_hst_fp64 b/hpc/batch_gpu/submit_breakdown_imaging_fixed_light_certified_lane_rate_a100_hst_fp64 new file mode 100755 index 000000000..1d89c8192 --- /dev/null +++ b/hpc/batch_gpu/submit_breakdown_imaging_fixed_light_certified_lane_rate_a100_hst_fp64 @@ -0,0 +1,273 @@ +#!/bin/bash -l +# +# 2026-09 certified-positive-solver PHASE C1 — the uncertified-lane RATE on real Nautilus +# batches, and the matched timing table at the production batch size, on the A100 +# (autolens_profiling#304). Measurement only: no library edits, library mains incl. the +# unreleased PyAutoArray#567 (release block overridden by the human on 2026-09-24). +# +# Phase B (#300, array 350588) found library certified + certified_fallback=none the +# fastest jit(vmap) row with ZERO uncertified lanes, but its lanes were one seeded draw +# family near the fiducial. Whether the phase-C2 guard (re-run uncertified lanes through +# scalar certified+PDIP) is worth four repos of library work depends on how often a lane +# fails its certificate on what a REAL search proposes. So: +# +# 1. CAPTURE (tasks 0-1): nautilus_batch_capture.py fits the phase-B S3 system with +# af.Nautilus at the production source_pix[1] settings (n_live=150, n_batch=20, +# use_jax_vmap=True, library PDIP) and records every batch reaching +# Fitness.call_wrap to results/breakdown/imaging/nautilus_batches_.npz. +# Capped at --n-like-max 40000 and --capture-seconds 3600 (about an hour). +# 2. RATE (tasks 2-3): fixed_light_trace.py --lanes captured --captured-pass rate +# replays EVERY captured lane under library certified + certified_fallback=none in +# jax.jit(jax.vmap(fn)) chunks of 20 (one chunk = one real Nautilus batch), untimed, +# and reports the uncertified-lane rate overall, by Nautilus phase and by call half, +# plus max passes against the packaged budget 16. +# 3. TIME (tasks 4-27): the phase-B matched pair (--arms both) on B captured lanes +# (nautilus_batches.timed_window: consecutive calls from the first post-prior +# batch; at B=20 exactly one real batch) for B in 16/20/50/100 and the three +# phase-B rows. Together the rows give the table the verdict needs: PDIP vmap and +# scalar PDIP (pdip/on), certified+PDIP vmap and SCALAR certified+PDIP +# (certified/on), certified+none vmap (certified/off). +# +# TWO-STEP SUBMISSION — the replay tasks read the capture's npz, so they must start +# after it. Submit from hpc/batch_gpu/ (the -o/-e paths are relative): +# +# CAP=$(sbatch --parsable --array=0-1 submit_breakdown_imaging_fixed_light_certified_lane_rate_a100_hst_fp64) +# sbatch --array=2-27 --dependency=afterok:${CAP} submit_breakdown_imaging_fixed_light_certified_lane_rate_a100_hst_fp64 +# +# A plain `sbatch` (or `hpc/sync submit`) of this file runs all 28 tasks at once; every +# replay task then refuses to start (FATAL, no npz) — nothing is measured on a stale or +# missing capture. +# +# Array tasks (index = 4 + 12*mesh + 3*batch + row for tasks 4-27) +# ---------------------------------------------------------------- +# task mesh pass B solver fallback row +# 0 delaunay capture 20 - - Nautilus capture (library PDIP) +# 1 rectangular capture 20 - - Nautilus capture (library PDIP) +# 2 delaunay rate 20 certified off uncertified-lane rate, all lanes +# 3 rectangular rate 20 certified off uncertified-lane rate, all lanes +# 4 delaunay time 16 pdip on library PDIP vmap + scalar PDIP +# 5 delaunay time 16 certified on certified+PDIP vmap + SCALAR +# 6 delaunay time 16 certified off certified, fallback none +# 7-9 delaunay time 20 (the three rows again) +# 10-12 delaunay time 50 +# 13-15 delaunay time 100 +# 16-27 rectangular time 16/20/50/100 x the same three rows +# +# The pass budget is NOT passed: every certified row runs the library's resolved +# certified_pass_budget (16 as packaged), and the JSON records it and its basis. +# +# The numerical gate — PRE-REGISTERED before submission (unchanged from phase B) +# ------------------------------------------------------------------------------ +# Phase 3 (results/notes/hst_gpu_residue_phase3_psf_2026_09.md) placed the ~2.5e-9 +# residual BETWEEN the jit(vmap) and scalar-jit compositions, so per lane of a TIME task: +# GATED at 1e-9 relative: the jit(vmap) arm vs the jit(vmap) library PDIP +# GATED at 1e-9 relative: the scalar jit arm vs the scalar jit library PDIP +# RECORDED, NOT gated: jit(vmap) vs scalar across compositions (relative + nats) +# RECORDED: uncertified_lanes; the window vs the capture's own PDIP values +# No pin is drawn tighter than 1e-9 (Delaunay's ~2e-10 run-to-run floor). A RATE task has +# no gate: it records, per lane, certified / passes, the certified value against the +# capture's library-PDIP figure of merit, and every uncertified lane re-run through scalar +# library PDIP. Timing is never gated. A failing task writes its JSON, then exits non-zero. +# +# MEMORY. The PSF-convolved mapping-matrix cube is (180, 180, 1500) fp64 = 389 MB per +# lane, so B=50 needs about 19 GB and B=100 about 39 GB for the cube alone. B=100 may +# exceed the card; an OOM task is itself the memory-limit row, read from its .err. +# +# Every task starts from an EMPTY JAX compilation cache (a seeded XLA autotune cache +# silently changes kernels, results/notes/xla_autotune_triton_gemm.md); the +# AUTOTUNE_ENTRIES census at the end is the check. +# +# WALL-BASIS: +# Neither cell's wall has been measured on the A100 in these modes. The capture is +# capped by the cell itself at 3600 s of sampling plus setup and compiles; a rate task +# replays up to 40000 lanes at roughly one second per 20-lane chunk; the B=100 timing +# tasks run 100 sequential scalar calls per invocation. The laptop CPU witness in the +# phase-C1 note is the probe. Both cells therefore declare unmeasured with the 3x +# floor, which the twelve-hour allocation covers. +# NOTE for anyone editing this block - check_submits reads any line here shaped like +# a keyword, a colon and a value as row data, so the prose must never contain that +# shape. +# cell: imaging/nautilus_batch_capture/hst device: a100 precision: fp64 +# source: unmeasured probe-first: yes wall: 4800 headroom: 3.0 +# cell: imaging/fixed_light_trace/hst device: a100 precision: fp64 +# source: unmeasured probe-first: yes wall: 5400 headroom: 3.0 + +#SBATCH -J flt_lanerate_hst +#SBATCH --partition=gpu +#SBATCH --gres=gpu:1 +#SBATCH --ntasks=1 +#SBATCH --cpus-per-task=4 +#SBATCH --mem=64gb +#SBATCH --time=12:00:00 +#SBATCH --array=0-27 +#SBATCH --export=ALL,PYAUTO_HPC_BASE=/mnt/ral/jnightin/PyAuto +#SBATCH -o output/output.%A_%a.out +#SBATCH -e error/error.%A_%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_gpu/../..): it runs from +# a worktree of the feature branch, not the canonical RAL checkout. +export AP_ROOT="$(cd "${SLURM_SUBMIT_DIR:-$(dirname "$0")}/../.." && pwd)" +export PROJECT_PATH="$AP_ROOT" +export PYAUTO_HPC_BASE="${PYAUTO_HPC_BASE:-/mnt/ral/jnightin/PyAuto}" +echo "AP_ROOT=$AP_ROOT" +echo "PYAUTO_HPC_BASE=$PYAUTO_HPC_BASE" +source $AP_ROOT/activate.sh + +export JAX_PLATFORM_NAME=cuda +export JAX_PLATFORMS=cuda,cpu +export XLA_PYTHON_CLIENT_PREALLOCATE=false +export JAX_ENABLE_X64=True +export XLA_FLAGS="--xla_disable_hlo_passes=constant_folding" +export NUMBA_CACHE_DIR=/tmp/numba_cache +export MPLCONFIGDIR=/tmp/matplotlib + +CELL="$AP_ROOT/scripts/imaging/likelihood_breakdown/fixed_light_trace.py" +CAPTURE="$AP_ROOT/scripts/imaging/likelihood_breakdown/nautilus_batch_capture.py" + +# A stale checkout fails before allocating a GPU. +if [ ! -f "$CAPTURE" ] || ! grep -q -- "--captured-pass" "$CELL"; then + echo "FATAL: this checkout has no nautilus_batch_capture.py or no --captured-pass in" >&2 + echo " fixed_light_trace.py. It predates #304; refusing to run." >&2 + exit 1 +fi + +MESHES=(delaunay rectangular delaunay rectangular delaunay delaunay delaunay delaunay delaunay delaunay delaunay delaunay delaunay delaunay delaunay delaunay rectangular rectangular rectangular rectangular rectangular rectangular rectangular rectangular rectangular rectangular rectangular rectangular) +PASSES=(capture capture rate rate time time time time time time time time time time time time time time time time time time time time time time time time) +BATCHES=(20 20 20 20 16 16 16 20 20 20 50 50 50 100 100 100 16 16 16 20 20 20 50 50 50 100 100 100) +SOLVERS=(- - certified certified pdip certified certified pdip certified certified pdip certified certified pdip certified certified pdip certified certified pdip certified certified pdip certified certified pdip certified certified) +FALLBACKS=(- - off off on on off on on off on on off on on off on on off on on off on on off on on off) +MESH=${MESHES[$SLURM_ARRAY_TASK_ID]} +PASS=${PASSES[$SLURM_ARRAY_TASK_ID]} +BATCH=${BATCHES[$SLURM_ARRAY_TASK_ID]} +SOLVER=${SOLVERS[$SLURM_ARRAY_TASK_ID]} +FALLBACK=${FALLBACKS[$SLURM_ARRAY_TASK_ID]} +if [ -z "$MESH" ] || [ -z "$PASS" ] || [ -z "$BATCH" ] || [ -z "$SOLVER" ] || [ -z "$FALLBACK" ]; then + echo "FATAL: no (mesh, pass, batch, solver, fallback) arm for array task ${SLURM_ARRAY_TASK_ID} (expected 0-27)." >&2 + exit 1 +fi + +BORDER=cell +CONFIG_NAME=hpc_a100_fp64_fixed_light_trace +NPZ="$AP_ROOT/results/breakdown/imaging/nautilus_batches_${MESH}.npz" + +# The dataset is tracked but its adapt image cache is not; concurrent tasks must not +# auto-simulate the same dataset/imaging/hst/, so it is prepared once before submitting. +if [ ! -f "$AP_ROOT/dataset/imaging/hst/data.fits" ]; then + echo "FATAL: dataset/imaging/hst/data.fits missing. Simulate it once before" >&2 + echo " submitting (concurrent tasks must not auto-simulate the same dir)." >&2 + exit 1 +fi + +# A replay task measures the capture it reads, so the npz must exist. The cell refuses +# an npz captured on a different S3 system (fingerprint check); that it is THIS run's +# capture is what the two-step --dependency above guarantees. +if [ "$PASS" != "capture" ] && [ ! -f "$NPZ" ]; then + echo "FATAL: $NPZ missing. The replay tasks (2-27) must be submitted with" >&2 + echo " --dependency=afterok: after tasks 0-1 (see the header)." >&2 + exit 1 +fi + +LEG="${MESH}_${PASS}_${BATCH}_${SOLVER}_${FALLBACK}" + +# Fresh per-task compilation cache and trace dir, under output/ (gitignored). +export JAX_COMPILATION_CACHE_DIR="$AP_ROOT/output/jax_cache/fixed_light_lanerate_${LEG}_${SLURM_ARRAY_JOB_ID:-local}_${SLURM_ARRAY_TASK_ID:-0}" +rm -rf "$JAX_COMPILATION_CACHE_DIR" && mkdir -p "$JAX_COMPILATION_CACHE_DIR" +echo "JAX_COMPILATION_CACHE_DIR=$JAX_COMPILATION_CACHE_DIR (fresh)" +TRACE_DIR="$AP_ROOT/output/trace/fixed_light_lanerate_${LEG}_${SLURM_ARRAY_JOB_ID:-local}_${SLURM_ARRAY_TASK_ID:-0}" +rm -rf "$TRACE_DIR" && mkdir -p "$TRACE_DIR" +echo "TRACE_DIR=$TRACE_DIR (fresh)" + +nvidia-smi + +echo "==========================================" +date +hostname +echo "Task: $SLURM_ARRAY_TASK_ID / 27" +echo "Pass: $PASS" +echo "Dataset: hst (0.05\"/px)" +echo "Precision: fp64" +echo "Source mesh: $MESH (cell fiducial; --source-pixels NOT passed)" +echo "Batches file: $NPZ" +echo "LANE_RATE_LEG mesh=$MESH pass=$PASS batch=$BATCH solver=$SOLVER fallback=$FALLBACK dataset=hst hardware=hpc_a100_fp64" + +echo "=== source revisions (shared install, untouched) ===" +for r in PyAutoNerves PyAutoFit PyAutoArray PyAutoGalaxy PyAutoLens; do + printf '%-14s %s\n' "$r" "$(git -C $PYAUTO_HPC_BASE/$r rev-parse HEAD 2>&1)" +done +echo "AP_ROOT rev: $(git -C $AP_ROOT rev-parse HEAD 2>&1)" +# PyAutoArray#567 (the library certified solver) merged at 11b93476. +if git -C $PYAUTO_HPC_BASE/PyAutoArray merge-base --is-ancestor 11b93476 HEAD 2>/dev/null; then + echo "PyAutoArray contains 11b93476 (#567): yes" +else + echo "FATAL: $PYAUTO_HPC_BASE/PyAutoArray does not contain 11b93476 (#567)." >&2 + exit 1 +fi + +cd $AP_ROOT + +echo "=== import provenance ===" +python3 -c "import autoarray, autolens, nautilus; print('autoarray.__file__ =', autoarray.__file__); print('autolens.__file__ =', autolens.__file__); print('nautilus.__version__ =', nautilus.__version__); print('Settings().certified_pass_budget =', autolens.Settings().certified_pass_budget)" + +# The exit code is CAPTURED, not inherited: a failing leg still writes its JSON and has +# its provenance recorded. activate.sh installs an ERR trap that exits even with errexit +# off, so preserve and remove it around the python call and restore it after. +SAVED_ERR_TRAP=$(trap -p ERR) +trap - ERR +set +e +if [ "$PASS" = "capture" ]; then + python3 -u scripts/imaging/likelihood_breakdown/nautilus_batch_capture.py \ + --mesh $MESH \ + --n-like-max 40000 \ + --capture-seconds 3600 \ + --n-live 150 \ + --n-batch 20 \ + --seed 1 +elif [ "$PASS" = "rate" ]; then + python3 -u scripts/imaging/likelihood_breakdown/fixed_light_trace.py \ + --mesh $MESH \ + --border-relocator $BORDER \ + --vmap-batch $BATCH \ + --lanes captured \ + --batches "$NPZ" \ + --captured-pass rate \ + --fallback $FALLBACK \ + --solver-source library \ + --solver $SOLVER \ + --routes b,d \ + --trace-dir "$TRACE_DIR" \ + --config-name $CONFIG_NAME +else + python3 -u scripts/imaging/likelihood_breakdown/fixed_light_trace.py \ + --mesh $MESH \ + --border-relocator $BORDER \ + --vmap-batch $BATCH \ + --lanes captured \ + --batches "$NPZ" \ + --captured-pass time \ + --arms both \ + --fallback $FALLBACK \ + --solver-source library \ + --solver $SOLVER \ + --trace-calls 10 \ + --routes b,d \ + --trace-dir "$TRACE_DIR" \ + --config-name $CONFIG_NAME +fi +CELL_RC=$? +set -e +eval "$SAVED_ERR_TRAP" + +# Autotune-cache census (non-fatal: the directory exists only if XLA wrote entries). +echo -n "AUTOTUNE_ENTRIES count=" +ls "$JAX_COMPILATION_CACHE_DIR/xla_gpu_per_fusion_autotune_cache_dir" 2>/dev/null | wc -l +if [ "$PASS" = "capture" ] && [ -f "$NPZ" ]; then + echo "NPZ_SHA256 $(sha256sum "$NPZ" | cut -d' ' -f1)" +fi + +echo "CELL_EXIT=$CELL_RC" +echo "Finished." +date + +exit $CELL_RC diff --git a/scripts/imaging/likelihood_breakdown/fixed_light_trace.py b/scripts/imaging/likelihood_breakdown/fixed_light_trace.py index b3f0fbc5e..ddfdb3bcf 100644 --- a/scripts/imaging/likelihood_breakdown/fixed_light_trace.py +++ b/scripts/imaging/likelihood_breakdown/fixed_light_trace.py @@ -187,6 +187,45 @@ cell then raises if any gated lane failed. Harness mode keeps phase 2's three-way gate unchanged. +The captured-lane mode (certified-solver phase C1, autolens_profiling#304) +------------------------------------------------------------------------- + +``--lanes captured --batches `` (library mode only) replaces phase B's +seeded draw family with the lanes of a REAL Nautilus run, recorded by +``nautilus_batch_capture.py`` at the production ``source_pix[1]`` settings +(``n_live=150``, ``n_batch=20``). A captured lane is the mass AND shear of one +proposal (``_captured_lane_tree``), lens light fixed at S3 as in every lane of +this cell. The file is refused unless its recorded S3 fingerprint — dataset +sha256s, mesh, source pixels, regularization, border relocator, precision and +the eager S3 figure of merit (``EQUIVALENCE_RTOL``) — matches the system built +here. Without ``--lanes captured`` nothing below happens, and ``--batches``, +``--batch-sample`` and ``--captured-pass`` are rejected. + +``--captured-pass time`` (default) is the phase-B harness exactly — PART V, both +arms, both per-composition references and the same PRE-REGISTERED gate at +``LANE_RTOL`` (1e-9, no tighter: Delaunay has a ~2e-10 run-to-run floor and a +~2.5e-9 cross-composition residual) — on ``B`` captured lanes chosen by +``nautilus_batches.timed_window``: consecutive captured calls from the first +post-prior batch, so at ``B == n_batch`` the batch IS one real Nautilus batch. +The JSON gains ``vmap.captured`` (the file, its fingerprint check, and the +window's library-PDIP values against the capture's own figures of merit — +RECORDED, it proves the rebuilt trees are the models the sampler evaluated). + +``--captured-pass rate`` (needs ``--solver certified``) is PART R: UNTIMED, it +runs every captured lane — or every lane of ``--batch-sample K`` calls evenly +spaced over the run — through the library's certified solve under +``jax.jit(jax.vmap(fn))`` in chunks of ``--vmap-batch`` (the last chunk padded +by repeating its final lane, padded rows dropped), observed with +``library_solver_observed``. It reports the uncertified-lane rate and the pass +distribution against the budget, overall, by Nautilus phase and by call-index +half (the split rules are stated in ``nautilus_batches``: phase = the sampler's +bound count and ``explored`` flag when the batch was requested; early = call +index below the median replayed call). RECORDED beside it: every lane's certified +value against the capture's library-PDIP figure of merit, and every uncertified +lane (up to ``RATE_PDIP_RECHECK_MAX``) re-run through scalar library PDIP — what +a guard's second pass would return. It writes its own JSON after PART B and +exits; PART C and PART V do not run. + The PSF-cube mode (phase 3, autolens_profiling#295) --------------------------------------------------- @@ -272,7 +311,10 @@ ``results/breakdown/imaging/fixed_light_trace_[_border_off][_n][_jitvmap__fb][_psf_]_.{json,png}``. Library mode replaces the batched token with -``_jitvmap__lib_fb_b``. +``_jitvmap__lib_fb_b`` (```` is +``captured`` for a phase-C1 timed pass). The phase-C1 rate pass writes +``fixed_light_trace__captured_rate_lib_fb_b[_sample]_.json`` +and no PNG. The ``--config-name`` used for the phase-1 legs (``local_rtx2060_fp64_fixed_light_trace``, ``hpc_a100_fp64_fixed_light_trace``) @@ -339,6 +381,7 @@ def _profiling_root() -> _Path: active_set_steps, host_callback_probe, library_solver_injection, + nautilus_batches, psf_cube_injection, timing, xla_attribution, @@ -403,7 +446,9 @@ def _profiling_root() -> _Path: # NONE of them appears there when it is off, so a phase-1 JSON written by this # checkout is key-for-key the JSON phase 1 wrote. _cell_parser.add_argument("--vmap-batch", type=int, default=None) -_cell_parser.add_argument("--lanes", choices=("distinct", "identical"), default="distinct") +_cell_parser.add_argument( + "--lanes", choices=("distinct", "identical", "captured"), default="distinct" +) _cell_parser.add_argument("--arms", choices=("vmap", "scalar", "both"), default="both") _cell_parser.add_argument("--draw-seed", type=int, default=0) _cell_parser.add_argument("--fallback", choices=("on", "off"), default="on") @@ -413,6 +458,11 @@ def _profiling_root() -> _Path: _cell_parser.add_argument("--solver-source", choices=("harness", "library"), default="harness") _cell_parser.add_argument("--solver", choices=("pdip", "certified"), default=None) _cell_parser.add_argument("--certified-budget", type=int, default=None) +# --- certified-solver phase C1 (#304): lanes replayed from a Nautilus capture -- +# Only meaningful with --lanes captured (library mode); rejected otherwise. +_cell_parser.add_argument("--batches", default=None) +_cell_parser.add_argument("--batch-sample", type=int, default=None) +_cell_parser.add_argument("--captured-pass", choices=("time", "rate"), default=None) # --- phase 3 (#295): the PSF mapping-matrix cube candidates ----------------- # The choices are a LITERAL (the contracts test execs these statements alone); # test_psf_cube_injection pins them to psf_cube_injection.CANDIDATES. @@ -495,6 +545,44 @@ def _profiling_root() -> _Path: if _cell_args.certified_budget is not None and _cell_args.certified_budget < 1: raise ValueError(f"--certified-budget must be >= 1 (got {_cell_args.certified_budget})") +#: Phase C1 (#304): ``--lanes captured`` replays a nautilus_batch_capture.py file. +CAPTURED_LANES = LANES_MODE == "captured" +#: ``time`` is the phase-B harness on captured lanes; ``rate`` is the untimed +#: per-lane certification pass over the whole capture (or --batch-sample calls). +CAPTURED_PASS = (_cell_args.captured_pass or "time") if CAPTURED_LANES else None +BATCH_SAMPLE = _cell_args.batch_sample +if CAPTURED_LANES: + if not LIBRARY_SOLVER_MODE: + raise ValueError( + "--lanes captured runs in the library-solver mode only (--solver-source library): " + "the replay measures the library's own certified solve" + ) + if _cell_args.batches is None: + raise ValueError("--lanes captured needs --batches from nautilus_batch_capture.py") + if CAPTURED_PASS == "rate" and LIBRARY_SOLVER != "certified": + raise ValueError( + "--captured-pass rate measures the certified solver's uncertified-lane rate; it " + "needs --solver certified" + ) + if CAPTURED_PASS == "time" and BATCH_SAMPLE is not None: + raise ValueError( + "--batch-sample only means anything with --captured-pass rate; the timed pass " + "replays one fixed window of B lanes (nautilus_batches.timed_window)" + ) + if BATCH_SAMPLE is not None and BATCH_SAMPLE < 1: + raise ValueError(f"--batch-sample must be >= 1 (got {BATCH_SAMPLE})") +else: + for _flag, _value in ( + ("--batches", _cell_args.batches), + ("--batch-sample", _cell_args.batch_sample), + ("--captured-pass", _cell_args.captured_pass), + ): + if _value is not None: + raise ValueError( + f"{_flag} only means anything with --lanes captured; this leg would silently " + f"ignore it" + ) + #: ``None`` is phase 1. A name turns on the PSF-cube experiment (#295). PSF_CANDIDATE = _cell_args.psf_candidate #: Seeded distinct draws pinned beside the fiducial in PSF mode. @@ -885,6 +973,97 @@ def _sha256(path: Path) -> str: log_evidence_s3_library = float(system_s3.fit.figure_of_merit) print(f" S3 figure_of_merit (library) = {log_evidence_s3_library}") +# --------------------------------------------------------------------------- +# Phase C1 (#304): the captured batches, and the proof they fit THIS S3 system +# --------------------------------------------------------------------------- +# nautilus_batch_capture.py copies PART A and records the fingerprint of the S3 +# system it fitted. A lane is a parameter vector, which means nothing on a +# different dataset, mesh, regularization or relocator — so every one of those is +# re-derived here and a mismatch refuses the file. +captured = None +captured_record: dict | None = None +if CAPTURED_LANES: + _batches_path = Path(_cell_args.batches) + captured = nautilus_batches.load(_batches_path) + _fp = captured["meta"]["s3_fingerprint"] + _mismatch = { + _key: (_want, _got) + for _key, _want, _got in ( + ("mesh", _fp["mesh"], MESH), + ("source_pixels", int(_fp["source_pixels"]), int(n_source_pixels)), + ("dataset_sha256", _fp["dataset_sha256"], dataset_sha256), + ("regularization", _fp["regularization"], reg_provenance), + ("border_relocator", bool(_fp["border_relocator"]), BORDER_RELOCATOR_RESOLVED), + ( + "use_mixed_precision", + bool(_fp["use_mixed_precision"]), + bool(_cli.use_mixed_precision), + ), + ) + if _want != _got + } + _s3_rel = abs(float(_fp["log_evidence_s3_library"]) - log_evidence_s3_library) / max( + abs(log_evidence_s3_library), 1e-300 + ) + if _s3_rel > EQUIVALENCE_RTOL: + _mismatch["log_evidence_s3_library"] = ( + float(_fp["log_evidence_s3_library"]), + log_evidence_s3_library, + ) + if _mismatch: + raise AssertionError( + f"{_batches_path} was captured on a different S3 system: {_mismatch}. Its lanes " + f"are parameter vectors of that system and are not this cell's lanes." + ) + _expected_paths = [ + "galaxies.lens.mass.centre.centre_0", + "galaxies.lens.mass.centre.centre_1", + "galaxies.lens.mass.ell_comps.ell_comps_0", + "galaxies.lens.mass.ell_comps.ell_comps_1", + "galaxies.lens.mass.einstein_radius", + "galaxies.lens.shear.gamma_1", + "galaxies.lens.shear.gamma_2", + ] + if sorted(captured["meta"]["parameter_paths"]) != sorted(_expected_paths): + raise AssertionError( + f"{_batches_path} parameter paths {captured['meta']['parameter_paths']} are not " + f"the fixed-light mass + shear family {_expected_paths}" + ) + captured_record = { + "batches_path": str(_batches_path), + "batches_sha256": _sha256(_batches_path), + "schema_version": int(captured["schema_version"]), + "n_calls": int(captured["call_size"].shape[0]), + "n_lanes": int(captured["parameters"].shape[0]), + "call_sizes_seen": sorted({int(_c) for _c in captured["call_size"]}), + "calls_by_phase": { + _p: int((captured["call_phase"] == _p).sum()) + for _p in dict.fromkeys(captured["call_phase"].tolist()) + }, + "parameter_paths": list(captured["meta"]["parameter_paths"]), + "nautilus": captured["meta"]["nautilus"], + "capture_fit_status": captured["meta"].get("fit_status"), + "capture_library_revisions": captured["meta"].get("library_revisions"), + "fingerprint_check": { + "fields": [ + "mesh", + "source_pixels", + "dataset_sha256", + "regularization", + "border_relocator", + "use_mixed_precision", + "log_evidence_s3_library", + ], + "log_evidence_s3_library_rel_diff": _s3_rel, + "passed": True, + }, + } + print( + f" captured batches: {captured_record['n_calls']} calls, " + f"{captured_record['n_lanes']} lanes ({captured_record['calls_by_phase']}); " + f"S3 fingerprint matches (rel {_s3_rel:.2e})" + ) + peak_after_setup = peak_bytes() # =================================================================== @@ -943,6 +1122,31 @@ def _lane_tree(draw): return jax.tree_util.tree_map(jnp.asarray, _inst) +def _captured_lane_tree(values) -> object: + """The params pytree of one CAPTURED lane: S3 with the lane's mass AND shear. + + *values* is one row of the capture's ``parameters`` in its + ``parameter_paths`` order. The same shallow-copy rule as ``_lane_tree``: the + Pixelization and Regularization stay shared (static aux data compares by + identity), exactly as Nautilus batches one pixelization over B vectors. + """ + _v = dict(zip(captured["meta"]["parameter_paths"], (float(_x) for _x in values))) + _p = "galaxies.lens." + _inst = copy.copy(instance_s3) + _inst.galaxies = copy.copy(instance_s3.galaxies) + _attrs = dict(_LENS_ATTRS) + _attrs["mass"] = al.mp.Isothermal( + centre=(_v[_p + "mass.centre.centre_0"], _v[_p + "mass.centre.centre_1"]), + ell_comps=(_v[_p + "mass.ell_comps.ell_comps_0"], _v[_p + "mass.ell_comps.ell_comps_1"]), + einstein_radius=_v[_p + "mass.einstein_radius"], + ) + _attrs["shear"] = al.mp.ExternalShear( + gamma_1=_v[_p + "shear.gamma_1"], gamma_2=_v[_p + "shear.gamma_2"] + ) + _inst.galaxies.lens = al.Galaxy(redshift=float(_lens_s3.redshift), **_attrs) + return jax.tree_util.tree_map(jnp.asarray, _inst) + + def _psf_context(): """The phase-3 PSF injection, or a no-op yielding zero counts in every other mode. @@ -1175,6 +1379,304 @@ def _likelihood(tree): ) ) +# =================================================================== +# PART R — the captured-lane RATE pass (phase C1, #304), untimed +# =================================================================== +# ``--lanes captured --captured-pass rate``: every captured lane (or every lane of +# ``--batch-sample K`` evenly spaced calls) through the library's certified solve +# under the production composition ``jax.jit(jax.vmap(fn))``, in chunks of +# ``--vmap-batch`` lanes (at B = n_batch a chunk IS one real Nautilus batch), with +# the solve OBSERVED (``library_solver_observed``: the library's own stats= +# out-dict through an ordered debug callback, nothing computed changed). Nothing +# here is timed; the cell writes its own JSON and exits before PART C / PART V. + + +def _c1_library_revisions() -> dict: + """``git rev-parse HEAD`` of every PyAuto library this process imported.""" + import subprocess as _subprocess + + import autoarray as _autoarray + import autogalaxy as _autogalaxy + import autonerves as _autonerves + + def _rev(module) -> dict: + _repo = Path(module.__file__).resolve().parents[1] + try: + _sha = _subprocess.run( + ["git", "-C", str(_repo), "rev-parse", "HEAD"], + capture_output=True, + text=True, + check=True, + ).stdout.strip() + except (OSError, _subprocess.CalledProcessError): + _sha = None + return {"head": _sha, "path": str(_repo), "module_file": module.__file__} + + return { + "PyAutoNerves": _rev(_autonerves), + "PyAutoFit": _rev(af), + "PyAutoArray": _rev(_autoarray), + "PyAutoGalaxy": _rev(_autogalaxy), + "PyAutoLens": _rev(al), + } + + +#: At most this many uncertified lanes get a scalar library-PDIP re-evaluation in +#: the rate pass (RECORDED): the rare-event check must not become the pass. +RATE_PDIP_RECHECK_MAX = 256 + +if CAPTURED_LANES and "shear" not in _LENS_ATTRS: + raise AssertionError( + "the S3 source-only lens has no `shear` attribute — a captured lane's shear would " + "have nowhere to go" + ) + +if CAPTURED_PASS == "rate": + print("\n" + "=" * 70) + print( + f"CAPTURED-LANE RATE PASS — library {LIBRARY_SOLVER}, certified_fallback " + f"{LIBRARY_FALLBACK}, budget {CERTIFIED_BUDGET}, chunks of {VMAP_BATCH}" + ) + print("=" * 70) + + _call_index = captured["call_index"] + _calls = nautilus_batches.sample_calls(int(captured["call_size"].shape[0]), BATCH_SAMPLE) + _lanes = nautilus_batches.lanes_of_calls(_call_index, _calls) + _chunks = nautilus_batches.chunked(_lanes, VMAP_BATCH) + print( + f" replaying {_lanes.shape[0]} lanes from {_calls.shape[0]} of " + f"{captured_record['n_calls']} calls in {len(_chunks)} chunks" + ) + + _rate_rows: list[tuple[int, bool]] = [] + + def _collect_rate(passes, certified): + _rate_rows.append((int(passes), bool(certified))) + + _ll_rate = np.empty(_lanes.shape[0], dtype=float) + _certified = np.empty(_lanes.shape[0], dtype=bool) + _passes = np.empty(_lanes.shape[0], dtype=int) + _pos = 0 + _t_rate = time.perf_counter() + with library_solver_injection.library_solver_observed(report=_collect_rate) as _observed: + _fn_rate = jax.jit(jax.vmap(_likelihood_fn(system_s3.dataset, _settings_library))) + with timer.section("captured_rate_pass"): + for _ci, (_chunk, _n_real) in enumerate(_chunks): + _trees = [_captured_lane_tree(captured["parameters"][_k]) for _k in _chunk] + _batched = jax.tree_util.tree_map(lambda *xs: jnp.stack(xs), *_trees) + _before = len(_rate_rows) + _ll = np.asarray(block(_fn_rate(_batched)), dtype=float) + jax.effects_barrier() + _rows = _rate_rows[_before:] + if len(_rows) != VMAP_BATCH or _ll.shape != (VMAP_BATCH,): + raise AssertionError( + f"chunk {_ci}: {len(_rows)} certification rows and log likelihoods of " + f"shape {_ll.shape} for a batch of {VMAP_BATCH} — the report is not " + f"one row per lane" + ) + _ll_rate[_pos : _pos + _n_real] = _ll[:_n_real] + _passes[_pos : _pos + _n_real] = [_r[0] for _r in _rows[:_n_real]] + _certified[_pos : _pos + _n_real] = [_r[1] for _r in _rows[:_n_real]] + _pos += _n_real + if _ci % 50 == 0 or _ci == len(_chunks) - 1: + print( + f" chunk {_ci + 1}/{len(_chunks)}: {_pos} lanes, " + f"{int((~_certified[:_pos]).sum())} uncertified, " + f"max passes {int(_passes[:_pos].max())} " + f"[{time.perf_counter() - _t_rate:.1f} s]" + ) + _jax_solvers = sorted(set(_observed["solvers_jax"])) + if _jax_solvers != [LIBRARY_SOLVER]: + raise AssertionError( + f"the rate pass traced the positive-only solve with solver={_jax_solvers}, not " + f"[{LIBRARY_SOLVER!r}] — the rate would be some other solver's" + ) + + # Per-lane labels: the Nautilus phase of the lane's call, and early / late. + _lane_calls = _call_index[_lanes] + _lane_phase = captured["call_phase"][_lane_calls] + _lane_half = nautilus_batches.early_late(_lane_calls, _calls) + + # RECORDED, not gated: this pass's certified log likelihood against the value + # the capture's own library-PDIP Fitness returned for the same lane (the + # Fitness jit(vmap) composition over parameter vectors, not this cell's tree + # composition). Resampled lanes (-1e99 sentinel, non-finite) are excluded. + _fom = captured["figure_of_merit"][_lanes] + _valid = np.isfinite(_fom) & (_fom > -1.0e98) & np.isfinite(_ll_rate) + _rel_vs_capture = np.abs(_ll_rate - _fom) / np.maximum(np.abs(_fom), 1e-300) + _vs_capture = { + "reference": ( + "the capture's own figure of merit for the lane: library PDIP through " + "Fitness.call_wrap's jax.jit(jax.vmap(call)) over parameter vectors" + ), + "n_compared": int(_valid.sum()), + "n_excluded_resampled_or_nonfinite": int((~_valid).sum()), + "max_rel_diff": float(_rel_vs_capture[_valid].max()) if _valid.any() else None, + "median_rel_diff": float(np.median(_rel_vs_capture[_valid])) if _valid.any() else None, + "max_abs_diff_nats": ( + float(np.abs(_ll_rate - _fom)[_valid].max()) if _valid.any() else None + ), + "n_above_lane_rtol": int((_rel_vs_capture[_valid] > LANE_RTOL).sum()), + "n_above_lane_rtol_uncertified": int( + (_rel_vs_capture[_valid & ~_certified] > LANE_RTOL).sum() + ), + "lane_rtol": LANE_RTOL, + "gated": False, + "note": ( + "RECORDED, NOT GATED: a cross-composition comparison (Fitness over vectors vs this " + "cell over trees) and, for certified lanes, certified vs PDIP. The gated 1e-9 pin is " + "the timed pass's (same composition, same lanes). It still shows whether a " + "certified_fallback=none lane that FAILED its certificate returned a wrong answer." + ), + } + + # RECORDED: every uncertified lane (up to RATE_PDIP_RECHECK_MAX) re-run through + # scalar library PDIP — what a guard's host-side second pass would return. + _uncert_idx = np.flatnonzero(~_certified) + _recheck_rows: list[dict] = [] + if _uncert_idx.size: + _pdip_scalar = jax.jit(_likelihood_fn(system_s3.dataset, _settings_pdip_reference)) + with timer.section("captured_rate_uncertified_pdip_recheck"): + for _j in _uncert_idx[:RATE_PDIP_RECHECK_MAX]: + _k = int(_lanes[_j]) + _ref = float(block(_pdip_scalar(_captured_lane_tree(captured["parameters"][_k])))) + _recheck_rows.append( + { + "lane_row": _k, + "call_index": int(_call_index[_k]), + "lane_in_call": int(captured["lane_in_call"][_k]), + "phase": str(_lane_phase[_j]), + "passes": int(_passes[_j]), + "log_likelihood_certified_none": float(_ll_rate[_j]), + "log_likelihood_scalar_library_pdip": _ref, + "rel_diff": abs(float(_ll_rate[_j]) - _ref) / max(abs(_ref), 1e-300), + "abs_diff_nats": abs(float(_ll_rate[_j]) - _ref), + } + ) + + rate_block = { + "pass": "rate", + "solver": LIBRARY_SOLVER, + "certified_fallback": LIBRARY_FALLBACK, + "certified_pass_budget": CERTIFIED_BUDGET, + "certified_pass_budget_basis": CERTIFIED_BUDGET_BASIS, + "composition": "jax.jit(jax.vmap(fn)) — the current Fitness._vmap composition", + "chunk_size": int(VMAP_BATCH), + "chunk_rule": ( + "the replayed lanes in capture order, split into chunks of --vmap-batch; the last " + "chunk is padded by repeating its final lane and the padded rows are dropped. At " + "--vmap-batch == n_batch every chunk is exactly one captured Nautilus batch." + ), + "batch_sample": BATCH_SAMPLE, + "calls_replayed": int(_calls.shape[0]), + "calls_rule": ( + "all captured calls" + if BATCH_SAMPLE is None or BATCH_SAMPLE >= captured_record["n_calls"] + else f"{int(_calls.shape[0])} calls evenly spaced over the run " + f"(nautilus_batches.sample_calls: first and last call included)" + ), + "report_source": ( + "library solve observed through its stats= out-dict (PyAutoArray #566) and " + "jax.debug.callback(..., ordered=True); untimed; one row per lane checked per chunk" + ), + "traced_solver_kwargs_jax": _jax_solvers, + "overall": nautilus_batches.rate_summary(_certified, _passes, CERTIFIED_BUDGET), + "by_nautilus_phase": nautilus_batches.grouped_rate_summaries( + _certified, _passes, CERTIFIED_BUDGET, _lane_phase + ), + "by_call_half": nautilus_batches.grouped_rate_summaries( + _certified, _passes, CERTIFIED_BUDGET, _lane_half + ), + "phase_rule": ( + "by_nautilus_phase: the sampler state when the batch was requested " + "(nautilus_batches.phase_of) — prior = only the unit-cube bound (prior draws), " + "exploration = more bounds and Sampler.explored False, sampling = explored True. " + "by_call_half: early = call index below the median replayed call index, late = the " + "rest." + ), + "vs_capture_pdip": _vs_capture, + "uncertified_pdip_recheck": { + "n_uncertified": int(_uncert_idx.size), + "n_rechecked": len(_recheck_rows), + "cap": RATE_PDIP_RECHECK_MAX, + "max_rel_diff": max((_r["rel_diff"] for _r in _recheck_rows), default=None), + "rows": _recheck_rows, + "gated": False, + }, + "lane_certified": _certified.astype(int).tolist(), + "lane_passes": _passes.tolist(), + "lane_rows": _lanes.tolist(), + "rate_pass_wall_s": time.perf_counter() - _t_rate, + } + _ov = rate_block["overall"] + print( + f"\n RATE: {_ov['n_uncertified']}/{_ov['n_lanes']} uncertified " + f"(rate {_ov['uncertified_rate']:.3e}); max passes {_ov['max_passes']} vs budget " + f"{CERTIFIED_BUDGET}; {_ov['n_at_budget']} lanes at the budget" + ) + for _label, _row in {**rate_block["by_nautilus_phase"], **rate_block["by_call_half"]}.items(): + print( + f" {_label:<12} {_row['n_uncertified']:>6}/{_row['n_lanes']:<7} " + f"max passes {_row['max_passes']}" + ) + print( + f" vs capture PDIP (recorded): max rel {_vs_capture['max_rel_diff']}, " + f"{_vs_capture['n_above_lane_rtol']} lanes above {LANE_RTOL:.0e}" + ) + + rate_summary_json = { + "device": device_info_dict(), + "machine": machine_info_dict(), + "precision": "mixed" if _cli.use_mixed_precision else "fp64", + "configuration": { + "mesh": MESH, + "source_pixels": int(n_source_pixels), + "dataset": DATASET, + "dataset_sha256": dataset_sha256, + "cell_source_sha256": cell_source_sha256, + "border_relocator_mode": BORDER_RELOCATOR_MODE, + "border_relocator": BORDER_RELOCATOR_RESOLVED, + "regularization": reg_provenance, + "vmap_batch": int(VMAP_BATCH), + "lanes": LANES_MODE, + "captured_pass": CAPTURED_PASS, + "batch_sample": BATCH_SAMPLE, + "solver_source": SOLVER_SOURCE, + "solver": LIBRARY_SOLVER, + "certified_fallback": LIBRARY_FALLBACK, + "certified_pass_budget": CERTIFIED_BUDGET, + "certified_tau_rel": float(_settings_library.certified_tau_rel), + "use_mixed_precision": bool(_cli.use_mixed_precision), + "thread_env": _observe_thread_env(), + }, + "captured": captured_record, + "rate": rate_block, + "routes": routes, + "equivalence_pins": equivalence_pins, + "reference": {"log_evidence_s3_library": log_evidence_s3_library}, + "library_revisions": _c1_library_revisions(), + "timer": {_label: _secs for _label, _secs in timer.records}, + "note": ( + "Phase C1 (#304) rate pass: untimed. No millisecond here is a result. The rate is " + "the fraction of captured lanes whose certificate failed under the named " + "certified_fallback; the phase-C2 verdict takes it together with the timed pass." + ), + } + _rate_name = ( + f"fixed_light_trace_{MESH}_captured_rate_lib{LIBRARY_SOLVER}" + f"_fb{'on' if FALLBACK_ON else 'off'}_b{CERTIFIED_BUDGET}" + + (f"_sample{int(BATCH_SAMPLE)}" if BATCH_SAMPLE is not None else "") + ) + _rate_json, _ = resolve_output_paths( + _cli, + default_dir=_workspace_root / "results" / "breakdown" / "imaging", + default_basename=f"{_rate_name}_trace_{DATASET}_v{al.__version__}", + cell=_rate_name, + ) + _rate_json.write_text(json.dumps(rate_summary_json, indent=2, default=str)) + print(f"\n Rate JSON saved to: {_rate_json}") + sys.exit(0) + # =================================================================== # PART C — one lowering, two executables, one timeline # =================================================================== @@ -1425,8 +1927,44 @@ def _sum_host_ms(predicate) -> float: # ``fixed_light_draws.py`` uses (``flds.mass_from(BASE_MASS, offsets)``). # The S3 dataset is the FIDUCIAL light-subtracted one and is shared by every # lane, exactly as production shares one dataset across a batch. + captured_window = None if LANES_MODE == "distinct": lane_draws = flds.random_draws(DRAW_SEED, VMAP_BATCH) + elif LANES_MODE == "captured": + # Phase C1 (#304): B lanes of REAL Nautilus proposal batches — the window + # rule is nautilus_batches.timed_window (consecutive calls from the first + # post-prior batch; at B == n_batch exactly one captured batch). The Draw + # records the mass offsets from the fiducial for the lane table; the lane + # TREE (mass and shear) is built from the captured vector itself. + captured_window = nautilus_batches.timed_window( + captured["call_index"], captured["call_phase"], VMAP_BATCH + ) + _paths = captured["meta"]["parameter_paths"] + _mass_keys = { + "galaxies.lens.mass.centre.centre_0": "centre_0", + "galaxies.lens.mass.centre.centre_1": "centre_1", + "galaxies.lens.mass.ell_comps.ell_comps_0": "ell_comps_0", + "galaxies.lens.mass.ell_comps.ell_comps_1": "ell_comps_1", + "galaxies.lens.mass.einstein_radius": "einstein_radius", + } + lane_draws = [] + for _k in captured_window: + _vals = dict(zip(_paths, (float(_x) for _x in captured["parameters"][_k]))) + lane_draws.append( + flds.Draw( + name=( + f"call{int(captured['call_index'][_k]):05d}" + f"_lane{int(captured['lane_in_call'][_k]):02d}" + ), + kind="captured", + offsets={ + _short: _vals[_long] - BASE_MASS[_short] + for _long, _short in _mass_keys.items() + }, + index=int(_k), + mass_cls="Isothermal", + ) + ) else: lane_draws = [ flds.Draw(name="fiducial", kind="fiducial", offsets={}, mass_cls="Isothermal") @@ -1447,12 +1985,20 @@ def _sum_host_ms(predicate) -> float: separators=(",", ":"), ).encode() ).hexdigest() + if captured_window is not None: + # The captured lanes carry the shear too, which the Draw offsets do not. + lane_draws_sha256 = hashlib.sha256( + np.ascontiguousarray(captured["parameters"][captured_window]).tobytes() + ).hexdigest() # The lane trees come from ``_lane_tree`` (hoisted above PART B so the # phase-3 draw pins build the SAME trees). with timer.section("vmap_lane_build"): - lane_trees = [_lane_tree(_d) for _d in lane_draws] + if captured_window is None: + lane_trees = [_lane_tree(_d) for _d in lane_draws] + else: + lane_trees = [_captured_lane_tree(captured["parameters"][_k]) for _k in captured_window] _fiducial_structure = jax.tree_util.tree_structure(params_tree_s3) for _i, _t in enumerate(lane_trees): if jax.tree_util.tree_structure(_t) != _fiducial_structure: @@ -1464,7 +2010,10 @@ def _sum_host_ms(predicate) -> float: ) batched_tree = jax.tree_util.tree_map(lambda *xs: jnp.stack(xs), *lane_trees) - print(f" lanes built: {len(lane_trees)} ({LANES_MODE}, seed {DRAW_SEED})") + print( + f" lanes built: {len(lane_trees)} ({LANES_MODE}, " + + (f"seed {DRAW_SEED})" if captured_window is None else "captured window)") + ) for _d in lane_draws[: min(4, len(lane_draws))]: _shown = {_p: round(float(_o), 5) for _p, _o in _d.offsets.items()} print(f" {_d.name:<14} {_shown}") @@ -2187,6 +2736,56 @@ def _collect_report(pass_at, certified): ), }, } + if captured_window is not None: + # Phase C1 (#304). Only in captured mode, so a phase-B JSON written by this + # checkout keeps its key set. + _win_calls = captured["call_index"][captured_window] + _fom = captured["figure_of_merit"][captured_window] + _valid = np.isfinite(_fom) & (_fom > -1.0e98) + _rel_capture = np.abs(_ll_library_pdip - _fom) / np.maximum(np.abs(_fom), 1e-300) + vmap_block["lane_construction"] = { + "draws_sha256": lane_draws_sha256, + "lane_rows": captured_window.tolist(), + "calls": sorted({int(_c) for _c in _win_calls}), + "phases": sorted({str(captured["call_phase"][_c]) for _c in _win_calls}), + "window_rule": ( + "nautilus_batches.timed_window: consecutive captured calls, in call order, from " + "the FIRST call that is not a prior batch, concatenated and truncated to B; at B " + "== n_batch exactly one real Nautilus batch. Falls back to the latest B lanes if " + "the post-prior lanes run out; never repeats a lane." + ), + "note": ( + "Lane k is captured lane lane_rows[k]: the mass AND shear of a real Nautilus " + "proposal (nautilus_batch_capture.py), lens light fixed at S3, the S3 " + "light-subtracted dataset shared by every lane. `offsets` in the lane table are " + "the mass offsets from the fiducial; the shear is in the capture file." + ), + } + vmap_block["captured"] = { + **captured_record, + "timed_window_vs_capture_pdip": { + "reference": ( + "the capture's own figure of merit (library PDIP, Fitness.call_wrap " + "jax.jit(jax.vmap(call)) over parameter vectors) for the same lanes" + ), + "compared_against": "this cell's jit(vmap) library-PDIP reference", + "n_compared": int(_valid.sum()), + "max_rel_diff": float(_rel_capture[_valid].max()) if _valid.any() else None, + "max_abs_diff_nats": ( + float(np.abs(_ll_library_pdip - _fom)[_valid].max()) if _valid.any() else None + ), + "gated": False, + "note": ( + "RECORDED, NOT GATED: proves the lane trees rebuilt here are the models the " + "sampler evaluated (a wrong parameter mapping shows up as nats, not 1e-10)." + ), + }, + } + print( + f" captured window vs capture PDIP (recorded): max rel " + f"{vmap_block['captured']['timed_window_vs_capture_pdip']['max_rel_diff']}" + ) + if "vmap" in arm_blocks and "scalar" in arm_blocks: _v_ms = arm_blocks["vmap"]["wall_per_lane_ms"] _s_ms = arm_blocks["scalar"]["wall_per_lane_ms"] @@ -2723,6 +3322,10 @@ def _section_s(label: str): "certified_pass_budget": CERTIFIED_BUDGET, } ) + if CAPTURED_LANES: + trace_summary["configuration"].update( + {"captured_pass": CAPTURED_PASS, "batches": str(_cell_args.batches)} + ) trace_summary["solver_injection"] = { "patched": None, "part_v": "none — library mode selects the solver through al.Settings", diff --git a/scripts/imaging/likelihood_breakdown/nautilus_batch_capture.py b/scripts/imaging/likelihood_breakdown/nautilus_batch_capture.py new file mode 100644 index 000000000..2b72a9731 --- /dev/null +++ b/scripts/imaging/likelihood_breakdown/nautilus_batch_capture.py @@ -0,0 +1,602 @@ +""" +JAX Profiling: Fixed Lens Light — CAPTURE real Nautilus proposal batches +======================================================================= + +Certified-solver phase C1 (autolens_profiling#304), step 1 of 2. + +Phase B (autolens_profiling#300, ``results/notes/certified_solver_policy_phase_b_2026_09.md``) +measured the library's certified solver under the production composition +``jax.jit(jax.vmap(fn))`` with ``certified_fallback="none"`` as the fastest +batched row, with **zero** uncertified lanes. Its lanes, though, were one seeded +draw family near the fiducial (``fixed_light_draws_steps.random_draws``). Whether +an uncertified-lane guard (phase C2) is worth building depends on how often a lane +fails its certificate on the batches a real search actually proposes. This cell +records those batches; ``fixed_light_trace.py --lanes captured`` replays them. + +What it does +------------ + +1. Builds the phase-B cell's S3 system — the HST dataset, the fixed-light + subtraction, the Delaunay (Hilbert, N=1500, AdaptSplit) or rectangular + (39x39, Constant) source — with PART A of ``fixed_light_trace.py`` copied + line for line (the house rule of this family: "if a sibling cell's model + changes, this cell must change with it"). The replay does not trust the copy: + it re-derives the S3 fingerprint recorded here (dataset sha256s, mesh, source + pixels, regularization, border relocator, the eager S3 figure of merit) and + refuses a file that does not match. +2. Fits that S3 system with ``af.Nautilus`` at the settings of the production + ``source_pix[1]`` stage of + ``euclid_strong_lens_modeling_pipeline/scripts/full_model.py``: + ``n_live=150``, ``n_batch=20``, ``use_jax_vmap=True`` (the ``SettingsSearch`` + default), one core, every other Nautilus argument at its default. The + likelihood is the library's own — ``AnalysisImaging(use_jax=True)`` with the + packaged positive-only solver (library PDIP): the batches must be the ones + production proposes, so nothing about the solver is changed here. +3. Records every batched parameter array that reaches ``Fitness.call_wrap`` with + its call index, the figure of merit it returned, its wall time and the + Nautilus phase it was proposed in (``likelihood_breakdown.nautilus_batches``: + a script-scoped patch of ``Fitness.call_wrap`` and + ``nautilus.Sampler.evaluate_likelihood``, restored on exit — no library is + edited). + +The model, and where it departs from ``source_pix[1]`` +------------------------------------------------------ + +Free: the lens ``Isothermal`` (centre, ell_comps, einstein_radius) and the +``ExternalShear`` — 7 parameters, with the phase-B cell's Gaussian priors (the +same priors ``fixed_light_draws_steps.PRIOR_SIGMA`` scales the phase-B lanes +from). Fixed: the lens light (subtracted, S3) and the source pixelization. + +``source_pix[1]`` also frees the regularization (``AdaptSplit``) and chains its +priors from ``source_lp``; this cell keeps the regularization FIXED at the cell's +coefficients, because the replay's lane trees carry the pixelization in their +static aux data (``fixed_light_trace._lane_tree``) and every lane must share it. +The captured batches therefore vary the mass and shear only — the same axes as +the phase-B lanes, now proposed by the sampler instead of drawn by a seed. +Nautilus is seeded (``--seed``, default 1) so a capture is reproducible; +production passes no seed. Quick updates are disabled (they only render the +current best fit and never change what Nautilus proposes), and the search's +post-fit ``perform_update`` is replaced by a stop: the samples and the per-sample +latent-variable pass it would build cost more than the sampling on the laptop and +record nothing. + +Flags (beyond the shared ``_profile_cli`` set) +---------------------------------------------- + +``--mesh {delaunay,rectangular}`` (required) — the phase-B meshes. +``--n-like-max N`` (default 40000) — Nautilus's own likelihood cap. On the A100 +this is roughly an hour of sampling (phase B: ~39 ms per Delaunay lane under +library PDIP ``jit(vmap)``, plus Nautilus's CPU-side bound training); a laptop +witness passes a few batches' worth. +``--capture-seconds S`` (default: no limit) — a hard wall-clock cap. The batch +that crosses it is recorded, then Nautilus is unwound and the file written. +``--n-live`` (default 150), ``--n-batch`` (default 20), ``--seed`` (default 1). + +Output +------ + +``/nautilus_batches_[_n].npz`` and ``.json`` beside it +(default output dir ``results/breakdown/imaging``). The npz keys are +``nautilus_batches.SCHEMA_VERSION``'s: ``parameters`` ``(n_lanes, 7)`` physical +values in ``meta.parameter_paths`` order, ``figure_of_merit``, ``call_index``, +``lane_in_call``, and per call ``call_size``, ``call_phase``, ``call_n_bounds``, +``call_explored``, ``call_n_like_before``, ``call_wall_s``; ``meta_json`` repeats +the provenance JSON's ``meta``. The JSON adds library source revisions, device, +the Nautilus settings and the batch-shape census. + +What may not be quoted from this file +------------------------------------- + +- ``call_wall_s`` as a likelihood cost. It is the wall of ``call_wrap`` under a + running sampler, including the first call's compile; the timed pass of + ``fixed_light_trace.py`` is where milliseconds come from. +- Any rate at all. This cell only records batches; the certified rate is the + replay's (``fixed_light_trace.py --lanes captured --captured-pass rate``). +""" + +import sys as _sys +from pathlib import Path as _Path + + +def _profiling_root() -> _Path: + for _p in _Path(__file__).resolve().parents: + if (_p / "ruff.toml").exists(): + return _p + raise RuntimeError("autolens_profiling root (ruff.toml) not found") + + +_misc_dir = str(_profiling_root() / "scripts" / "misc") +if _misc_dir not in _sys.path: + _sys.path.insert(0, str(_misc_dir)) + + +import argparse +import hashlib +import json +import math +import subprocess +import sys +import time +from pathlib import Path + +import autofit as af +import autolens as al +import jax +import jax.numpy as jnp +import numpy as np +from autofit.jax import register_model as _register_model_pytrees + +sys.path.insert(0, str(_profiling_root())) + +import os as _smoke_os +import sys as _smoke_sys + +from likelihood_breakdown import ( # noqa: E402 + active_set_steps, + nautilus_batches, + timing, +) + +from _adapt_image_util import adapt_image_for_dataset # noqa: E402 + +# AUTOLENS_PROFILING_SMOKE=1 short-circuit (CI lint smoke): imports + module +# setup, before any argparse, so a smoke run needs no flags. +if _smoke_os.environ.get("AUTOLENS_PROFILING_SMOKE") == "1": + print(f"[smoke] {__file__}: imports + module setup OK; exiting.") + _smoke_sys.exit(0) + +from simulators.imaging import INSTRUMENTS # noqa: E402 + +from _production_config import observe_thread_env as _observe_thread_env # noqa: E402 +from _profile_cli import ( # noqa: E402 + auto_simulate_if_missing, + delaunay_regularization, + device_info_dict, + machine_info_dict, + parse_profile_cli, + rect_mesh_classes, +) + +_cli = parse_profile_cli() + +#: ``source_pix[1]`` of euclid_strong_lens_modeling_pipeline/scripts/full_model.py. +PRODUCTION_N_LIVE = 150 +PRODUCTION_N_BATCH = 20 + +_cell_parser = argparse.ArgumentParser(add_help=False, allow_abbrev=False) +_cell_parser.add_argument("--mesh", choices=("rectangular", "delaunay"), required=True) +_cell_parser.add_argument("--source-pixels", type=int, default=None) +_cell_parser.add_argument("--n-like-max", type=int, default=40000) +_cell_parser.add_argument("--capture-seconds", type=float, default=None) +_cell_parser.add_argument("--n-live", type=int, default=PRODUCTION_N_LIVE) +_cell_parser.add_argument("--n-batch", type=int, default=PRODUCTION_N_BATCH) +_cell_parser.add_argument("--seed", type=int, default=1) +_cell_args = _cli.parse_cell_args(_cell_parser) + +MESH = _cell_args.mesh +N_LIKE_MAX = int(_cell_args.n_like_max) +CAPTURE_SECONDS = _cell_args.capture_seconds +N_LIVE = int(_cell_args.n_live) +N_BATCH = int(_cell_args.n_batch) +SEED = int(_cell_args.seed) +for _flag, _value in (("--n-like-max", N_LIKE_MAX), ("--n-live", N_LIVE), ("--n-batch", N_BATCH)): + if _value < 1: + raise ValueError(f"{_flag} must be >= 1 (got {_value})") +if CAPTURE_SECONDS is not None and CAPTURE_SECONDS <= 0: + raise ValueError(f"--capture-seconds must be > 0 (got {CAPTURE_SECONDS})") + +SOURCE_PIXELS_REQUESTED = ( + _cell_args.source_pixels if _cell_args.source_pixels is not None else _cli.source_pixels +) + +DATASET = "hst" +if _cli.instrument is not None and _cli.instrument != DATASET: + raise ValueError(f"--instrument {_cli.instrument!r} is not this cell's dataset (HST only).") + +timer = timing.Timer() + +# =================================================================== +# PART A — Setup: fixed_light_trace.py PART A, copied line for line +# =================================================================== + +print("=" * 70) +print(f"NAUTILUS BATCH CAPTURE — {MESH} — n_live {N_LIVE}, n_batch {N_BATCH}") +print("=" * 70) + +_workspace_root = _profiling_root() +pixel_scale = INSTRUMENTS[DATASET]["pixel_scale"] +dataset_path = Path("dataset") / "imaging" / DATASET + + +def _sha256(path: Path) -> str: + digest = hashlib.sha256() + with path.open("rb") as file_obj: + for chunk in iter(lambda: file_obj.read(1024 * 1024), b""): + digest.update(chunk) + return digest.hexdigest() + + +auto_simulate_if_missing( + dataset_path, + dataset_type="imaging", + instrument=DATASET, + workspace_root=_workspace_root, +) + +dataset_sha256 = { + name: _sha256(dataset_path / name) for name in ("data.fits", "noise_map.fits", "psf.fits") +} +cell_source_sha256 = _sha256(Path(__file__).resolve()) + +with timer.section("dataset_load"): + dataset = al.Imaging.from_fits( + data_path=dataset_path / "data.fits", + psf_path=dataset_path / "psf.fits", + noise_map_path=dataset_path / "noise_map.fits", + pixel_scales=pixel_scale, + ) + +with timer.section("mask_and_oversample"): + mask_radius = 3.5 + + mask = al.Mask2D.circular( + shape_native=dataset.shape_native, + pixel_scales=dataset.pixel_scales, + radius=mask_radius, + ) + + dataset = dataset.apply_mask(mask=mask) + dataset = dataset.apply_over_sampling( + over_sample_size_lp=4, + over_sample_size_pixelization=1, + ) + + over_sample_size = al.util.over_sample.over_sample_size_via_radial_bins_from( + grid=dataset.grid, + sub_size_list=[4, 2, 2], + radial_list=[0.3, 0.6], + centre_list=[(0.0, 0.0)], + ) + + dataset = dataset.apply_over_sampling( + over_sample_size_lp=over_sample_size, + over_sample_size_pixelization=1, + ) + +if MESH == "rectangular": + mesh_pixels_yx = ( + 39 if SOURCE_PIXELS_REQUESTED is None else int(round(math.sqrt(SOURCE_PIXELS_REQUESTED))) + ) + mesh_shape = (mesh_pixels_yx, mesh_pixels_yx) + n_source_pixels = mesh_pixels_yx * mesh_pixels_yx + n_mesh_vertices = None +else: + mesh_pixels_yx = None + mesh_shape = None + n_mesh_vertices = 1500 if SOURCE_PIXELS_REQUESTED is None else int(SOURCE_PIXELS_REQUESTED) + n_source_pixels = n_mesh_vertices + +print(f" Source pixels: {n_source_pixels}") + +with timer.section("adapt_image_build"): + adapt_image = adapt_image_for_dataset(dataset_path=dataset_path, dataset=dataset) + +image_plane_mesh_grid = None +if MESH != "rectangular": + with timer.section("image_mesh_hilbert"): + image_mesh = al.image_mesh.Hilbert( + pixels=n_mesh_vertices, weight_power=1.0, weight_floor=0.0 + ) + image_plane_mesh_grid = image_mesh.image_plane_mesh_grid_from( + mask=dataset.mask, adapt_data=adapt_image + ) + print(f" Mesh vertices placed: {image_plane_mesh_grid.shape[0]}") + +with timer.section("model_build"): + lens_bulge = al.model_util.mge_model_from( + mask_radius=mask_radius, + total_gaussians=60, + centre_prior_is_uniform=True, + ) + + 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) + _lens_mass_ell = al.convert.ell_comps_from(axis_ratio=0.9, angle=45.0) + mass.ell_comps.ell_comps_0 = af.GaussianPrior(mean=_lens_mass_ell[0], sigma=0.01) + mass.ell_comps.ell_comps_1 = af.GaussianPrior(mean=_lens_mass_ell[1], sigma=0.01) + + shear = af.Model(al.mp.ExternalShear) + shear.gamma_1 = af.GaussianPrior(mean=0.05, sigma=0.005) + shear.gamma_2 = af.GaussianPrior(mean=0.05, sigma=0.005) + + lens = af.Model(al.Galaxy, redshift=0.5, bulge=lens_bulge, mass=mass, shear=shear) + + if MESH == "rectangular": + reg_scheme = "constant" + mesh_obj = rect_mesh_classes(_cli)[1](shape=mesh_shape, weight_power=1.0, weight_floor=0.0) + regularization = al.reg.Constant(coefficient=1.0) + reg_provenance = {"scheme": reg_scheme, "coefficient": 1.0} + else: + mesh_obj = al.mesh.Delaunay(pixels=n_mesh_vertices, zeroed_pixels=0) + reg_scheme, regularization, reg_provenance = delaunay_regularization(_cli) + + pixelization = al.Pixelization(mesh=mesh_obj, regularization=regularization) + source = af.Model(al.Galaxy, redshift=1.0, pixelization=pixelization) + model = af.Collection(galaxies=af.Collection(lens=lens, source=source)) + +param_vector = model.physical_values_from_prior_medians +instance = model.instance_from_vector(vector=param_vector) +tracer = al.Tracer(galaxies=list(instance.galaxies)) + +_adapt_kwargs = { + "galaxy_image_dict": {instance.galaxies.source: adapt_image}, + "galaxy_name_image_dict": {"('galaxies', 'source')": adapt_image}, +} +if image_plane_mesh_grid is not None: + _adapt_kwargs["galaxy_image_plane_mesh_grid_dict"] = { + instance.galaxies.source: image_plane_mesh_grid + } + _adapt_kwargs["galaxy_name_image_plane_mesh_grid_dict"] = { + "('galaxies', 'source')": image_plane_mesh_grid + } +adapt_images = al.AdaptImages(**_adapt_kwargs) + +# The cell's border relocator mode ``cell`` (True), as phase B ran it. +_settings = al.Settings( + use_border_relocator=True, + use_mixed_precision=_cli.use_mixed_precision, +) +BORDER_RELOCATOR_RESOLVED = bool(_settings.use_border_relocator) + +print("\n--- S0 -> S3: lens light converted to regular profiles + subtracted (eager) ---") +with timer.section("fit_imaging_eager"): + fit = al.FitImaging( + dataset=dataset, + tracer=tracer, + adapt_images=adapt_images, + settings=_settings, + xp=np, + ) +with timer.section("s3_system_build"): + system_s3 = active_set_steps.fixed_light_system_from( + fit, + dataset, + adapt_images=adapt_images, + settings=_settings, + name="S3_mge_converted_to_regular", + ) +log_evidence_s3_library = float(system_s3.fit.figure_of_merit) +print(f" S3 figure_of_merit (library) = {log_evidence_s3_library}") + +# =================================================================== +# PART N — the Nautilus fit of the S3 system, recorded +# =================================================================== +# The fixed-light model: the S3 lens has no light (it was subtracted from the +# dataset), so the lens is mass + shear with the cell's priors, and the source is +# the SAME pixelization object the S3 instance carries. + +_s3_lens, _s3_source = list(system_s3.source_only_tracer.galaxies) +_s3_lens_attrs = sorted( + _k for _k in vars(_s3_lens) if not _k.startswith("_") and _k not in {"id", "redshift"} +) +if _s3_lens_attrs != ["mass", "shear"]: + raise AssertionError( + f"the S3 source-only lens carries {_s3_lens_attrs}, not ['mass', 'shear'] — the " + f"captured lanes would not be the phase-B lane family" + ) + +capture_model = af.Collection( + galaxies=af.Collection( + lens=af.Model(al.Galaxy, redshift=0.5, mass=mass, shear=shear), + source=af.Model(al.Galaxy, redshift=1.0, pixelization=pixelization), + ) +) +parameter_paths = [".".join(_p) for _p in capture_model.paths] +print(f"\n Capture model: {capture_model.total_free_parameters} free parameters") +for _p in parameter_paths: + print(f" {_p}") +_register_model_pytrees(capture_model) + +analysis = al.AnalysisImaging( + dataset=system_s3.dataset, + adapt_images=adapt_images, + settings=_settings, + use_jax=True, +) + +# The fiducial through the SAME analysis: the prior medians are the S3 fiducial, +# so this is the S3 system's own likelihood (recorded, and a sanity print). +_fiducial_instance = capture_model.instance_from_vector( + vector=capture_model.physical_values_from_prior_medians +) +with timer.section("fiducial_jit"): + _fiducial_ll = float( + jax.jit(lambda _t: analysis.log_likelihood_function(instance=_t))( + jax.tree_util.tree_map(jnp.asarray, _fiducial_instance) + ) + ) +print(f" fiducial log likelihood (jit, library PDIP): {_fiducial_ll:.6f}") + +search = af.Nautilus( + n_live=N_LIVE, + n_batch=N_BATCH, + n_like_max=N_LIKE_MAX, + seed=SEED, + number_of_cores=1, + use_jax_vmap=True, + iterations_per_quick_update=1e12, + silence=False, +) + + +class _SamplingComplete(Exception): + """Raised in place of the search's post-fit ``perform_update``. + + With ``NullPaths`` Nautilus runs ONE ``Sampler.run`` to ``n_like_max`` and + autofit then calls ``perform_update`` once, which builds the samples and + evaluates a per-sample latent-variable jit over every accepted sample — on the + laptop witness that cost more than the sampling itself, and none of it changes + a recorded batch. The capture ends at the last batch instead. + """ + + +def _skip_post_fit(*_args, **_kwargs): + raise _SamplingComplete() + + +search.perform_update = _skip_post_fit + +recorder = nautilus_batches.BatchRecorder( + deadline=(time.monotonic() + CAPTURE_SECONDS) if CAPTURE_SECONDS is not None else None +) +fit_status = "search.fit returned (post-fit hook not reached)" +fit_error = None +_t_start = time.perf_counter() +try: + with nautilus_batches.recording(recorder): + _result = search.fit(model=capture_model, analysis=analysis) +except _SamplingComplete: + fit_status = "sampling complete (n_like_max or convergence); post-fit result skipped" +except nautilus_batches.CaptureBudgetReached as _exc: + fit_status = "capture-seconds reached" + fit_error = str(_exc) +except Exception as _exc: # noqa: BLE001 — record what was captured before re-raising below + fit_status = "error" + fit_error = f"{type(_exc).__name__}: {_exc}" +capture_wall_s = time.perf_counter() - _t_start +print( + f"\n capture: {recorder.n_calls} calls, {recorder.n_lanes} lanes, " + f"{capture_wall_s:.1f} s — {fit_status}" +) + +# =================================================================== +# Output +# =================================================================== + + +def _library_revision(module) -> dict: + _repo = Path(module.__file__).resolve().parents[1] + try: + _sha = subprocess.run( + ["git", "-C", str(_repo), "rev-parse", "HEAD"], + capture_output=True, + text=True, + check=True, + ).stdout.strip() + except (OSError, subprocess.CalledProcessError): + _sha = None + return {"head": _sha, "path": str(_repo)} + + +import autoarray as _autoarray # noqa: E402 +import autogalaxy as _autogalaxy # noqa: E402 +import autonerves as _autonerves # noqa: E402 +import nautilus as _nautilus # noqa: E402 + +meta = { + "schema_version": nautilus_batches.SCHEMA_VERSION, + "mesh": MESH, + "dataset": DATASET, + "parameter_paths": parameter_paths, + "s3_fingerprint": { + "dataset_sha256": dataset_sha256, + "mesh": MESH, + "source_pixels": int(n_source_pixels), + "regularization": reg_provenance, + "border_relocator": BORDER_RELOCATOR_RESOLVED, + "use_mixed_precision": bool(_cli.use_mixed_precision), + "log_evidence_s3_library": log_evidence_s3_library, + }, + "fiducial_log_likelihood_jit": _fiducial_ll, + "nautilus": { + "n_live": N_LIVE, + "n_batch": N_BATCH, + "n_like_max": N_LIKE_MAX, + "seed": SEED, + "use_jax_vmap": True, + "number_of_cores": 1, + "version": getattr(_nautilus, "__version__", None), + "production_reference": ( + "euclid_strong_lens_modeling_pipeline/scripts/full_model.py source_pix_1: " + "af.Nautilus(n_live=150, n_batch=20, **SettingsSearch.search_dict) with " + "use_jax_vmap=True and number_of_cores=1 (SettingsSearch defaults)" + ), + "departures_from_production": [ + "regularization fixed at the cell's coefficients (source_pix_1 frees AdaptSplit)", + "priors are the phase-B cell's Gaussians, not chained from source_lp", + "seeded (production passes no seed)", + "quick updates disabled (iterations_per_quick_update=1e12; render-only)", + "NullPaths: no output directory, so no checkpoint and one Sampler.run call", + "post-fit perform_update skipped (samples / latent variables never built)", + ], + }, + "solver": "library default positive-only solver (Settings() as packaged; PDIP)", + "capture_seconds": CAPTURE_SECONDS, + "fit_status": fit_status, + "fit_error": fit_error, + "capture_wall_s": capture_wall_s, + "cell_source_sha256": cell_source_sha256, + "library_revisions": { + "PyAutoNerves": _library_revision(_autonerves), + "PyAutoFit": _library_revision(af), + "PyAutoArray": _library_revision(_autoarray), + "PyAutoGalaxy": _library_revision(_autogalaxy), + "PyAutoLens": _library_revision(al), + }, +} + +_output_dir = ( + _cli.output_dir + if _cli.output_dir is not None + else _workspace_root / "results" / "breakdown" / "imaging" +) +_stem = f"nautilus_batches_{MESH}" +if SOURCE_PIXELS_REQUESTED is not None: + _stem = f"{_stem}_n{int(n_source_pixels)}" +npz_path = Path(_output_dir) / f"{_stem}.npz" +json_path = Path(_output_dir) / f"{_stem}.json" + +file_summary = nautilus_batches.save(npz_path, recorder, meta) if recorder.n_calls else None +_call_sizes = [int(_p.shape[0]) for _p in recorder.parameters] +provenance = { + "meta": meta, + "file": { + "npz": str(npz_path), + "npz_sha256": _sha256(npz_path) if file_summary else None, + **(file_summary or {"n_calls": 0, "n_lanes": 0}), + }, + "batch_shape_census": { + "n_batch": N_BATCH, + "all_calls_are_n_batch": bool(_call_sizes) and all(_s == N_BATCH for _s in _call_sizes), + "sizes_seen": sorted(set(_call_sizes)), + "note": ( + "Nautilus.fit_x1_cpu hands call_wrap to nautilus.Sampler with vectorized=" + "use_jax_vmap; Sampler.evaluate_likelihood passes every proposal batch whole. A " + "size other than n_batch is a Nautilus batch of another shape, recorded as it came." + ), + }, + "first_call_wall_s": recorder.call_wall_s[0] if recorder.call_wall_s else None, + "median_call_wall_s": ( + float(np.median(recorder.call_wall_s[1:])) if len(recorder.call_wall_s) > 1 else None + ), + "device": device_info_dict(), + "machine": machine_info_dict(), + "thread_env": _observe_thread_env(), + "timer": {_label: _secs for _label, _secs in timer.records}, + "note": ( + "Captured proposal batches only. No rate and no millisecond in this file is a result: " + "the certified rate and the timed table come from fixed_light_trace.py --lanes captured." + ), +} +json_path.parent.mkdir(parents=True, exist_ok=True) +json_path.write_text(json.dumps(provenance, indent=2, default=str)) +print(f" batches: {npz_path}") +print(f" provenance: {json_path}") +print(f" batch sizes seen: {sorted(set(_call_sizes))} (n_batch {N_BATCH})") + +if fit_status == "error": + raise RuntimeError(f"the Nautilus fit raised after {recorder.n_calls} calls: {fit_error}") +if recorder.n_calls == 0: + raise RuntimeError("no batch reached Fitness.call_wrap — nothing was captured") diff --git a/scripts/misc/likelihood_breakdown/nautilus_batches.py b/scripts/misc/likelihood_breakdown/nautilus_batches.py new file mode 100644 index 000000000..6f7066319 --- /dev/null +++ b/scripts/misc/likelihood_breakdown/nautilus_batches.py @@ -0,0 +1,330 @@ +"""Captured Nautilus proposal batches — the recorder, the file format and the lane rules. + +Certified-solver phase C1 (autolens_profiling#304). Two cells share this module: + +- ``scripts/imaging/likelihood_breakdown/nautilus_batch_capture.py`` runs a real + ``af.Nautilus`` fit and records every batched parameter array that reaches + ``Fitness.call_wrap`` (:class:`BatchRecorder`, :func:`recording`, :func:`save`); +- ``scripts/imaging/likelihood_breakdown/fixed_light_trace.py --lanes captured`` + replays those lanes (:func:`load`, :func:`sample_calls`, :func:`timed_window`, + :func:`chunked`, :func:`rate_summary`). + +Everything here except :func:`recording` is pure numpy, so the selection and +summary rules are unit-tested without JAX (``scripts/misc/test/test_nautilus_batches.py``). + +The recorder +------------ + +:func:`recording` patches two methods for the duration of a ``with`` block and +restores both on exit — nothing in any library is edited: + +1. ``nautilus.Sampler.evaluate_likelihood`` — to read the sampler's state at the + moment it asks for a batch: how many bounds it holds, whether it has finished + exploring, and ``n_like`` so far. That is the Nautilus *phase* of the batch + (:func:`phase_of`). The wrapper forwards the call unchanged. +2. ``autofit.non_linear.fitness.Fitness.call_wrap`` — the host-side batched entry + Nautilus is handed as its ``likelihood`` (``Nautilus.fit_x1_cpu``, + ``likelihood=fitness.call_wrap, vectorized=fitness.use_jax_vmap``). The + wrapper copies the ``(n, n_dim)`` physical parameter array it receives, calls + the original, and copies the figure of merit it returns. Call index = the + order ``call_wrap`` was entered. + +The phase rule (stated once, used by both cells) +------------------------------------------------ + +``phase_of(n_bounds, explored)``: + +- ``prior`` — the sampler holds only its first bound, the unit cube, so the + batch is a set of prior draws (Nautilus fills its first ``n_live`` points this + way); +- ``exploration`` — more than one bound, exploration not finished; +- ``sampling`` — ``Sampler.explored`` is True (the shells are being refined). + +``early`` / ``late`` is the call-index split: a call is ``early`` if its call +index is below the median call index of the calls replayed (``n // 2``), else +``late``. Both splits are reported; neither is a Nautilus internal quantity that +a later Nautilus version could redefine silently, except ``explored``, which the +recorder reads straight off the sampler. +""" + +from __future__ import annotations + +import contextlib +import json +import time +from dataclasses import dataclass, field +from pathlib import Path + +import numpy as np + +#: Bump when the npz key set changes; ``load`` refuses a file it does not know. +SCHEMA_VERSION = 1 + +#: Phase labels, in run order. +PHASES = ("prior", "exploration", "sampling") + + +def phase_of(n_bounds: int, explored: bool) -> str: + """The Nautilus phase of a batch, from the sampler state when it was requested.""" + if explored: + return "sampling" + if int(n_bounds) <= 1: + return "prior" + return "exploration" + + +class CaptureBudgetReached(Exception): + """Raised from inside ``call_wrap`` once the capture's wall-clock budget is spent. + + The batch that crosses the budget IS recorded first; the exception then + unwinds Nautilus, and the capture cell catches it and writes the file. + """ + + +@dataclass +class BatchRecorder: + """Everything the two patched methods saw, in call order.""" + + deadline: float | None = None + parameters: list = field(default_factory=list) + figure_of_merit: list = field(default_factory=list) + call_wall_s: list = field(default_factory=list) + call_phase: list = field(default_factory=list) + call_n_bounds: list = field(default_factory=list) + call_explored: list = field(default_factory=list) + call_n_like_before: list = field(default_factory=list) + #: The sampler state set by the evaluate_likelihood wrapper, consumed by the + #: next call_wrap. ``None`` if call_wrap was reached some other way. + _pending_state: dict | None = None + + @property + def n_calls(self) -> int: + return len(self.parameters) + + @property + def n_lanes(self) -> int: + return int(sum(p.shape[0] for p in self.parameters)) + + def note_sampler_state(self, sampler) -> None: + n_bounds = len(getattr(sampler, "bounds", []) or []) + explored = bool(getattr(sampler, "explored", False)) + self._pending_state = { + "n_bounds": n_bounds, + "explored": explored, + "n_like_before": int(getattr(sampler, "n_like", -1)), + "phase": phase_of(n_bounds, explored), + } + + def record(self, parameters, figure_of_merit, wall_s: float) -> None: + params = np.array(parameters, dtype=float, copy=True) + if params.ndim == 1: + params = params[None, :] + fom = np.array(figure_of_merit, dtype=float, copy=True).reshape(-1) + if fom.shape[0] != params.shape[0]: + raise AssertionError( + f"call_wrap returned {fom.shape[0]} figures of merit for {params.shape[0]} " + f"parameter vectors — the batch axis is not the lane axis" + ) + state = self._pending_state or { + "n_bounds": -1, + "explored": False, + "n_like_before": -1, + "phase": "unknown", + } + self._pending_state = None + self.parameters.append(params) + self.figure_of_merit.append(fom) + self.call_wall_s.append(float(wall_s)) + self.call_phase.append(state["phase"]) + self.call_n_bounds.append(int(state["n_bounds"])) + self.call_explored.append(bool(state["explored"])) + self.call_n_like_before.append(int(state["n_like_before"])) + + +@contextlib.contextmanager +def recording(recorder: BatchRecorder): + """Patch ``Sampler.evaluate_likelihood`` and ``Fitness.call_wrap``; restore both on exit.""" + import nautilus + from autofit.non_linear.fitness import Fitness + + original_call_wrap = Fitness.call_wrap + original_evaluate = nautilus.Sampler.evaluate_likelihood + + def evaluate_likelihood(self, points): + recorder.note_sampler_state(self) + return original_evaluate(self, points) + + def call_wrap(self, parameters): + start = time.perf_counter() + figure_of_merit = original_call_wrap(self, parameters) + recorder.record(parameters, figure_of_merit, time.perf_counter() - start) + if recorder.deadline is not None and time.monotonic() >= recorder.deadline: + raise CaptureBudgetReached( + f"capture wall-clock budget reached after {recorder.n_calls} calls" + ) + return figure_of_merit + + call_wrap.__doc__ = original_call_wrap.__doc__ + Fitness.call_wrap = call_wrap + nautilus.Sampler.evaluate_likelihood = evaluate_likelihood + try: + yield recorder + finally: + Fitness.call_wrap = original_call_wrap + nautilus.Sampler.evaluate_likelihood = original_evaluate + + +# --------------------------------------------------------------------------- +# The file +# --------------------------------------------------------------------------- + + +def save(path: Path, recorder: BatchRecorder, meta: dict) -> dict: + """Write the npz; returns the per-file summary the provenance JSON records.""" + if recorder.n_calls == 0: + raise ValueError("no batches were recorded — nothing reached Fitness.call_wrap") + sizes = np.array([p.shape[0] for p in recorder.parameters], dtype=int) + call_index = np.repeat(np.arange(recorder.n_calls, dtype=int), sizes) + lane_in_call = np.concatenate([np.arange(s, dtype=int) for s in sizes]) + arrays = { + "schema_version": np.array(SCHEMA_VERSION, dtype=int), + "parameters": np.concatenate(recorder.parameters, axis=0), + "figure_of_merit": np.concatenate(recorder.figure_of_merit, axis=0), + "call_index": call_index, + "lane_in_call": lane_in_call, + "call_size": sizes, + "call_wall_s": np.array(recorder.call_wall_s, dtype=float), + "call_phase": np.array(recorder.call_phase, dtype="U16"), + "call_n_bounds": np.array(recorder.call_n_bounds, dtype=int), + "call_explored": np.array(recorder.call_explored, dtype=bool), + "call_n_like_before": np.array(recorder.call_n_like_before, dtype=int), + "meta_json": np.array(json.dumps(meta, sort_keys=True, default=str)), + } + path.parent.mkdir(parents=True, exist_ok=True) + np.savez_compressed(path, **arrays) + return { + "n_calls": int(recorder.n_calls), + "n_lanes": int(sizes.sum()), + "call_sizes": {str(int(s)): int((sizes == s).sum()) for s in np.unique(sizes)}, + "calls_by_phase": { + p: int(sum(1 for q in recorder.call_phase if q == p)) + for p in (*PHASES, "unknown") + if any(q == p for q in recorder.call_phase) + }, + } + + +def load(path: Path) -> dict: + """Read a captured-batches npz back, refusing an unknown schema.""" + with np.load(path, allow_pickle=False) as data: + out = {key: data[key] for key in data.files} + version = int(out.get("schema_version", -1)) + if version != SCHEMA_VERSION: + raise ValueError(f"{path}: schema_version {version}, this checkout reads {SCHEMA_VERSION}") + out["meta"] = json.loads(str(out.pop("meta_json"))) + return out + + +# --------------------------------------------------------------------------- +# The lane rules +# --------------------------------------------------------------------------- + + +def sample_calls(n_calls: int, k: int | None) -> np.ndarray: + """``k`` call indices evenly spaced over the run (all calls when ``k`` is None). + + Deterministic, first and last call always included, so a sampled rate still + spans every phase of the run. + """ + if n_calls < 1: + raise ValueError("no calls to sample") + if k is None or k >= n_calls: + return np.arange(n_calls, dtype=int) + if k < 1: + raise ValueError(f"--batch-sample must be >= 1 (got {k})") + return np.unique(np.round(np.linspace(0, n_calls - 1, int(k))).astype(int)) + + +def lanes_of_calls(call_index: np.ndarray, calls: np.ndarray) -> np.ndarray: + """Lane (row) indices of every lane belonging to *calls*, in call order.""" + mask = np.isin(call_index, calls) + return np.flatnonzero(mask) + + +def timed_window(call_index: np.ndarray, call_phase: np.ndarray, batch: int) -> np.ndarray: + """The ``batch`` lanes the timed pass replays. + + RULE: consecutive captured calls, in call order, starting at the FIRST call + that is not a ``prior`` batch (the first batch proposed from a learned + bound — what the bulk of a run evaluates); lanes are concatenated across + calls and truncated to ``batch``. At ``batch == n_batch`` this is exactly one + real Nautilus batch. If the post-prior lanes run out, the window starts + earlier (the latest ``batch`` lanes of the capture), and if the capture holds + fewer than ``batch`` lanes in total it is an error, never a silent repeat. + """ + n_lanes = int(call_index.shape[0]) + if batch > n_lanes: + raise ValueError( + f"the capture holds {n_lanes} lanes; a timed batch of {batch} would have to " + f"repeat lanes, which is not a real batch" + ) + not_prior = np.flatnonzero(call_phase != "prior") + start_call = int(not_prior[0]) if not_prior.size else 0 + start = int(np.flatnonzero(call_index >= start_call)[0]) + start = min(start, n_lanes - batch) + return np.arange(start, start + batch, dtype=int) + + +def chunked(indices: np.ndarray, size: int) -> list[tuple[np.ndarray, int]]: + """Split *indices* into chunks of exactly ``size`` (one compiled batch shape). + + The final chunk is padded by repeating its last index; returns + ``[(chunk, n_real), ...]`` so the caller drops the padded tail. + """ + if size < 1: + raise ValueError("chunk size must be >= 1") + out = [] + for start in range(0, len(indices), size): + chunk = np.asarray(indices[start : start + size], dtype=int) + n_real = int(chunk.shape[0]) + if n_real < size: + chunk = np.concatenate([chunk, np.full(size - n_real, chunk[-1], dtype=int)]) + out.append((chunk, n_real)) + return out + + +def rate_summary(certified, passes, budget: int) -> dict: + """Uncertified-lane rate and the pass distribution against the budget.""" + certified = np.asarray(certified, dtype=bool) + passes = np.asarray(passes, dtype=int) + n = int(certified.shape[0]) + n_uncertified = int((~certified).sum()) + values, counts = np.unique(passes, return_counts=True) if n else ([], []) + return { + "n_lanes": n, + "n_uncertified": n_uncertified, + "uncertified_rate": (n_uncertified / n) if n else None, + "max_passes": int(passes.max()) if n else None, + "mean_passes": float(passes.mean()) if n else None, + "n_at_budget": int((passes >= int(budget)).sum()) if n else 0, + "budget": int(budget), + "passes_histogram": {str(int(v)): int(c) for v, c in zip(values, counts)}, + } + + +def grouped_rate_summaries(certified, passes, budget: int, labels) -> dict: + """:func:`rate_summary` per distinct label (phase, or early / late).""" + labels = np.asarray(labels) + certified = np.asarray(certified, dtype=bool) + passes = np.asarray(passes, dtype=int) + return { + str(label): rate_summary(certified[labels == label], passes[labels == label], budget) + for label in dict.fromkeys(labels.tolist()) + } + + +def early_late(call_index_of_lane: np.ndarray, calls_replayed: np.ndarray) -> np.ndarray: + """``early`` / ``late`` per lane: below / at-or-above the median replayed call.""" + ordered = np.sort(np.asarray(calls_replayed, dtype=int)) + split = int(ordered[len(ordered) // 2]) if ordered.size else 0 + return np.where(np.asarray(call_index_of_lane) < split, "early", "late") diff --git a/scripts/misc/test/test_fixed_light_cell.py b/scripts/misc/test/test_fixed_light_cell.py index fe30d4cc8..8164fd7e1 100644 --- a/scripts/misc/test/test_fixed_light_cell.py +++ b/scripts/misc/test/test_fixed_light_cell.py @@ -85,6 +85,7 @@ def _submits() -> list[_Path]: and "_fixed_light_vmap_" not in p.name and "_fixed_light_psf_cube_" not in p.name and "_fixed_light_certified_policy_" not in p.name + and "_fixed_light_certified_lane_rate_" not in p.name ) diff --git a/scripts/misc/test/test_fixed_light_certified_lane_rate_submit.py b/scripts/misc/test/test_fixed_light_certified_lane_rate_submit.py new file mode 100644 index 000000000..037afb434 --- /dev/null +++ b/scripts/misc/test/test_fixed_light_certified_lane_rate_submit.py @@ -0,0 +1,211 @@ +"""Static checks for the phase-C1 ``fixed_light_certified_lane_rate`` A100 submit (#304). + +**No imaging, no JAX, no GPU** — these read the submit script and the two cells as text. + +The submit runs two cells: ``nautilus_batch_capture.py`` (tasks 0-1, the capture) and +``fixed_light_trace.py --lanes captured`` (tasks 2-27, the rate and timing replays). +It is a sixth ``fixed_light`` submit family with its own file-name prefix, excluded +from ``test_fixed_light_cell.py``'s glob for the reason that file states; this file +is the family's half of that bargain, mirroring +``test_fixed_light_certified_policy_submit.py``. + +What a wrong submit would look like, and what catches it: + +- the arm tables and ``--array`` disagree — ``test__array_range_matches_the_arms``; +- a row of the verdict table is missing — ``test__the_array_is_the_pre_registered_task_table``; +- the replay starts before (or without) the capture — + ``test__replay_refuses_a_missing_capture_and_documents_the_two_step``; +- the capture drifts from the production Nautilus settings — + ``test__capture_runs_the_production_nautilus_settings``; +- the gate is not written down before submission, or is drawn tighter than 1e-9 — + ``test__the_gate_is_pre_registered_and_no_tighter_than_1e_9``. +""" + +from __future__ import annotations + +import itertools +import re +import subprocess +import sys as _sys +from pathlib import Path as _Path + + +def _profiling_root() -> _Path: + for _p in _Path(__file__).resolve().parents: + if (_p / "ruff.toml").exists(): + return _p + raise RuntimeError("autolens_profiling root (ruff.toml) not found") + + +ROOT = _profiling_root() +SUBMIT = ( + ROOT + / "hpc" + / "batch_gpu" + / "submit_breakdown_imaging_fixed_light_certified_lane_rate_a100_hst_fp64" +) +CELL = ROOT / "scripts" / "imaging" / "likelihood_breakdown" / "fixed_light_trace.py" +CAPTURE = ROOT / "scripts" / "imaging" / "likelihood_breakdown" / "nautilus_batch_capture.py" +PIPELINE_FULL_MODEL = ( + ROOT.parent / "euclid_strong_lens_modeling_pipeline" / "scripts" / "full_model.py" +) + +_misc = ROOT / "scripts" / "misc" +if str(_misc) not in _sys.path: + _sys.path.insert(0, str(_misc)) + +CONFIG_NAME = "hpc_a100_fp64_fixed_light_trace" +TABLES = ("MESHES", "PASSES", "BATCHES", "SOLVERS", "FALLBACKS") + + +def _arm_table(text: str, name: str) -> list[str]: + match = re.search(rf"^{name}=\((.*?)\)", text, re.M) + return match.group(1).split() if match else [] + + +def _executable(text: str) -> str: + return "\n".join("" if ln.lstrip().startswith("#") else ln for ln in text.splitlines()) + + +def _arms() -> list[tuple[str, ...]]: + text = SUBMIT.read_text() + return list(zip(*(_arm_table(text, name) for name in TABLES))) + + +def test__submit_is_valid_executable_bash(): + result = subprocess.run(["bash", "-n", str(SUBMIT)], capture_output=True, text=True) + assert result.returncode == 0, result.stderr + assert SUBMIT.stat().st_mode & 0o111, "the submit is not executable" + + +def test__the_family_is_excluded_from_the_phase_0_glob(): + other = (ROOT / "scripts" / "misc" / "test" / "test_fixed_light_cell.py").read_text() + assert '"_fixed_light_certified_lane_rate_" not in p.name' in other + + +def test__array_range_matches_the_arms(): + text = SUBMIT.read_text() + lengths = {name: len(_arm_table(text, name)) for name in TABLES} + assert len(set(lengths.values())) == 1, lengths + array = re.search(r"^#SBATCH --array=(\d+)-(\d+)", text, re.M) + assert array and int(array.group(1)) == 0 + assert int(array.group(2)) == lengths["MESHES"] - 1 + assert "FATAL: no (mesh, pass, batch, solver, fallback) arm" in text + + +def test__the_array_is_the_pre_registered_task_table(): + """2 captures, 2 rate passes, then mesh x B x the three phase-B rows.""" + expected = [ + ("delaunay", "capture", "20", "-", "-"), + ("rectangular", "capture", "20", "-", "-"), + ("delaunay", "rate", "20", "certified", "off"), + ("rectangular", "rate", "20", "certified", "off"), + ] + rows = [("pdip", "on"), ("certified", "on"), ("certified", "off")] + expected += [ + (mesh, "time", str(batch), solver, fallback) + for mesh, batch, (solver, fallback) in itertools.product( + ("delaunay", "rectangular"), (16, 20, 50, 100), rows + ) + ] + assert _arms() == expected + + +def test__replay_refuses_a_missing_capture_and_documents_the_two_step(): + text = SUBMIT.read_text() + executable = _executable(text) + assert 'if [ "$PASS" != "capture" ] && [ ! -f "$NPZ" ]; then' in executable + assert "sbatch --parsable --array=0-1" in text + assert "--array=2-27 --dependency=afterok:${CAP}" in text + assert 'NPZ="$AP_ROOT/results/breakdown/imaging/nautilus_batches_${MESH}.npz"' in executable + + +def test__capture_runs_the_production_nautilus_settings(): + executable = _executable(SUBMIT.read_text()) + for flag in ("--n-live 150", "--n-batch 20", "--n-like-max 40000", "--capture-seconds"): + assert flag in executable, f"the capture does not pass {flag}" + capture = CAPTURE.read_text() + assert "PRODUCTION_N_LIVE = 150" in capture + assert "PRODUCTION_N_BATCH = 20" in capture + assert "use_jax_vmap=True" in capture + if PIPELINE_FULL_MODEL.exists(): + # The production stage the capture mirrors still uses these settings. + pipeline = PIPELINE_FULL_MODEL.read_text() + source_pix_1 = pipeline.split("def source_pix_1(", 1)[1].split("\ndef ", 1)[0] + assert "n_batch: int = 20" in source_pix_1 + assert "n_live=150" in source_pix_1 + + +def test__replay_runs_the_library_mode_on_captured_lanes(): + executable = _executable(SUBMIT.read_text()) + for flag in ( + "--lanes captured", + '--batches "$NPZ"', + "--captured-pass rate", + "--captured-pass time", + "--solver-source library", + "--solver $SOLVER", + "--arms both", + ): + assert flag in executable, f"the submit does not pass {flag}" + assert f"CONFIG_NAME={CONFIG_NAME}" in executable + assert "--certified-budget" not in executable, ( + "the rows must run the library's resolved budget, the value production takes" + ) + + +def test__submit_guards_against_a_stale_checkout_and_mirror(): + executable = _executable(SUBMIT.read_text()) + assert 'grep -q -- "--captured-pass"' in executable + assert "predates #304" in executable + assert "11b93476" in executable, "no guard that the mirror carries PyAutoArray#567" + assert "PYAUTO_HPC_BASE=/mnt/ral/jnightin/PyAuto" in SUBMIT.read_text() + + +def test__submit_preserves_footer_when_the_numerical_gate_fails(): + executable = _executable(SUBMIT.read_text()) + python_pos = executable.index("python3 -u") + census_pos = executable.index("AUTOTUNE_ENTRIES count=") + assert "SAVED_ERR_TRAP=$(trap -p ERR)" in executable[:python_pos] + assert "trap - ERR" in executable[:python_pos] + assert 'eval "$SAVED_ERR_TRAP"' in executable[python_pos:census_pos] + assert "CELL_EXIT=$CELL_RC" in executable[census_pos:] + + +def test__submit_starts_from_a_fresh_compilation_cache(): + text = SUBMIT.read_text() + assert 'rm -rf "$JAX_COMPILATION_CACHE_DIR"' in text + assert 'rm -rf "$TRACE_DIR"' in text + assert "SLURM_ARRAY_TASK_ID" in text.split("JAX_COMPILATION_CACHE_DIR=", 1)[1].splitlines()[0] + + +def test__the_gate_is_pre_registered_and_no_tighter_than_1e_9(): + submit = SUBMIT.read_text() + cell = CELL.read_text() + assert "PRE-REGISTERED" in submit + assert "hst_gpu_residue_phase3_psf_2026_09.md" in submit + assert "GATED at 1e-9 relative: the jit(vmap) arm vs the jit(vmap) library PDIP" in submit + assert "GATED at 1e-9 relative: the scalar jit arm vs the scalar jit library PDIP" in submit + assert "LANE_RTOL = 1.0e-9" in cell + + +def test__the_cell_declares_the_phase_c1_flags(): + cell = CELL.read_text() + for flag in ("--batches", "--batch-sample", "--captured-pass"): + assert f'"{flag}"' in cell + assert '"identical", "captured"' in cell + for key in ("captured_pass", "by_nautilus_phase", "by_call_half", "vs_capture_pdip"): + assert f'"{key}"' in cell + assert "_captured_rate_lib{LIBRARY_SOLVER}" in cell + + +def test__submit_carries_a_wall_basis_block_that_the_gate_accepts(): + from wall.check_submits import check_text, parse_basis_rows + + text = SUBMIT.read_text() + rows = parse_basis_rows(text) + assert {row["cell"] for row in rows} == { + "imaging/nautilus_batch_capture/hst", + "imaging/fixed_light_trace/hst", + } + assert not check_text(text), check_text(text) diff --git a/scripts/misc/test/test_nautilus_batches.py b/scripts/misc/test/test_nautilus_batches.py new file mode 100644 index 000000000..1c898b10e --- /dev/null +++ b/scripts/misc/test/test_nautilus_batches.py @@ -0,0 +1,122 @@ +"""The captured-batch file format and lane rules (``likelihood_breakdown.nautilus_batches``). + +Pure numpy: no JAX, no Nautilus run. The recorder's patching is exercised by the +capture cell itself; these pin the rules the replay's numbers depend on. +""" + +from __future__ import annotations + +import sys as _sys +from pathlib import Path as _Path + +import numpy as np +import pytest + + +def _profiling_root() -> _Path: + for _p in _Path(__file__).resolve().parents: + if (_p / "ruff.toml").exists(): + return _p + raise RuntimeError("autolens_profiling root (ruff.toml) not found") + + +_misc = _profiling_root() / "scripts" / "misc" +if str(_misc) not in _sys.path: + _sys.path.insert(0, str(_misc)) + +from likelihood_breakdown import nautilus_batches as nb # noqa: E402 + + +class _Sampler: + def __init__(self, n_bounds, explored, n_like): + self.bounds = [object()] * n_bounds + self.explored = explored + self.n_like = n_like + + +def _recorder(sizes, states): + rec = nb.BatchRecorder() + rng = np.random.default_rng(0) + for size, (n_bounds, explored) in zip(sizes, states): + rec.note_sampler_state(_Sampler(n_bounds, explored, rec.n_lanes)) + params = rng.normal(size=(size, 7)) + rec.record(params, params.sum(axis=1), wall_s=0.1) + return rec + + +def test__phase_of(): + assert nb.phase_of(1, False) == "prior" + assert nb.phase_of(0, False) == "prior" + assert nb.phase_of(3, False) == "exploration" + assert nb.phase_of(3, True) == "sampling" + + +def test__save_load_round_trip(tmp_path): + rec = _recorder([4, 4, 3], [(1, False), (2, False), (2, True)]) + summary = nb.save(tmp_path / "b.npz", rec, {"parameter_paths": list("abcdefg")}) + assert summary["n_calls"] == 3 and summary["n_lanes"] == 11 + assert summary["call_sizes"] == {"3": 1, "4": 2} + data = nb.load(tmp_path / "b.npz") + assert data["parameters"].shape == (11, 7) + assert data["call_index"].tolist() == [0] * 4 + [1] * 4 + [2] * 3 + assert data["lane_in_call"].tolist() == [0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2] + assert data["call_phase"].tolist() == ["prior", "exploration", "sampling"] + assert data["call_n_like_before"].tolist() == [0, 4, 8] + assert data["meta"]["parameter_paths"] == list("abcdefg") + np.testing.assert_allclose(data["figure_of_merit"], data["parameters"].sum(axis=1)) + + +def test__record_refuses_a_batch_axis_mismatch(): + rec = nb.BatchRecorder() + with pytest.raises(AssertionError): + rec.record(np.zeros((4, 7)), np.zeros(3), wall_s=0.0) + + +def test__save_refuses_an_empty_capture(tmp_path): + with pytest.raises(ValueError): + nb.save(tmp_path / "b.npz", nb.BatchRecorder(), {}) + + +def test__sample_calls_spans_the_run(): + assert nb.sample_calls(10, None).tolist() == list(range(10)) + assert nb.sample_calls(10, 50).tolist() == list(range(10)) + sampled = nb.sample_calls(101, 5).tolist() + assert sampled == [0, 25, 50, 75, 100] + + +def test__timed_window_starts_at_the_first_post_prior_call(): + call_index = np.repeat(np.arange(5), 4) + call_phase = np.array(["prior", "prior", "exploration", "exploration", "sampling"]) + window = nb.timed_window(call_index, call_phase, 4) + assert window.tolist() == [8, 9, 10, 11] # exactly call 2 + window = nb.timed_window(call_index, call_phase, 6) + assert call_index[window].tolist() == [2, 2, 2, 2, 3, 3] + # Not enough post-prior lanes: the window slides back, never repeats a lane. + window = nb.timed_window(call_index, call_phase, 16) + assert window.tolist() == list(range(4, 20)) + with pytest.raises(ValueError): + nb.timed_window(call_index, call_phase, 21) + + +def test__chunked_pads_the_last_chunk_and_reports_real_rows(): + chunks = nb.chunked(np.arange(7), 3) + assert [c.tolist() for c, _ in chunks] == [[0, 1, 2], [3, 4, 5], [6, 6, 6]] + assert [n for _, n in chunks] == [3, 3, 1] + + +def test__rate_summary_and_groups(): + certified = [True, True, False, True] + passes = [0, 3, 16, 2] + summary = nb.rate_summary(certified, passes, budget=16) + assert summary["n_uncertified"] == 1 + assert summary["uncertified_rate"] == 0.25 + assert summary["max_passes"] == 16 + assert summary["n_at_budget"] == 1 + assert summary["passes_histogram"] == {"0": 1, "2": 1, "3": 1, "16": 1} + groups = nb.grouped_rate_summaries(certified, passes, 16, ["a", "a", "b", "b"]) + assert groups["a"]["n_uncertified"] == 0 and groups["b"]["n_uncertified"] == 1 + + +def test__early_late_split_is_the_median_replayed_call(): + labels = nb.early_late(np.array([0, 1, 2, 3]), np.array([0, 1, 2, 3])) + assert labels.tolist() == ["early", "early", "late", "late"] From f59f84d1ea4083c45238685650a8582c05f9c522 Mon Sep 17 00:00:00 2001 From: Jammy2211 Date: Thu, 24 Sep 2026 17:39:04 +0200 Subject: [PATCH 2/7] feat(profiling): phase C1 captures free the regularization, pix1|pix2 stages (#304) nautilus_batch_capture.py gains --stage pix1|pix2 (production source_pix_1: mass+shear+regularization free, n_live=150; source_pix_2: mass+shear fixed at the S3 fiducial, regularization free, n_live=75). The regularization is free at production priors (AdaptSplit inner/outer LogUniform 1e-6..1e6, signal_scale Uniform 0..1 = packaged adapt_split.yaml = pipeline config). Rectangular cannot build AdaptSplit (no split cross-points) and frees its Constant coefficient (LogUniform 1e-6..1e6), recorded as a deviation. One builder, nautilus_batches.capture_model_from, serves capture and replay. Replay evaluates captured lanes as parameter vectors through the Fitness path (instance_from_vector under the trace), so every lane's regularization reaches the likelihood in the rate and timed passes. The S3 fingerprint now checks the regularization class and S0 fiducial, not per-lane coefficients, and the rebuilt model's parameter order must equal the capture's. Submit grows to 38 tasks: 4 captures + 4 rate passes (mesh x stage), pix1 time grid B=16/20/50/100, pix2 at B=20. Schema v2; tests updated. Co-Authored-By: Claude Opus 5.5 (1M context) --- ...ed_light_certified_lane_rate_a100_hst_fp64 | 115 +++++++------ .../likelihood_breakdown/fixed_light_trace.py | 160 ++++++++++++------ .../nautilus_batch_capture.py | 146 ++++++++++------ .../likelihood_breakdown/nautilus_batches.py | 88 +++++++++- ..._fixed_light_certified_lane_rate_submit.py | 47 +++-- scripts/misc/test/test_nautilus_batches.py | 36 ++++ 6 files changed, 419 insertions(+), 173 deletions(-) diff --git a/hpc/batch_gpu/submit_breakdown_imaging_fixed_light_certified_lane_rate_a100_hst_fp64 b/hpc/batch_gpu/submit_breakdown_imaging_fixed_light_certified_lane_rate_a100_hst_fp64 index 1d89c8192..82c7d1e04 100755 --- a/hpc/batch_gpu/submit_breakdown_imaging_fixed_light_certified_lane_rate_a100_hst_fp64 +++ b/hpc/batch_gpu/submit_breakdown_imaging_fixed_light_certified_lane_rate_a100_hst_fp64 @@ -11,47 +11,58 @@ # scalar certified+PDIP) is worth four repos of library work depends on how often a lane # fails its certificate on what a REAL search proposes. So: # -# 1. CAPTURE (tasks 0-1): nautilus_batch_capture.py fits the phase-B S3 system with -# af.Nautilus at the production source_pix[1] settings (n_live=150, n_batch=20, -# use_jax_vmap=True, library PDIP) and records every batch reaching -# Fitness.call_wrap to results/breakdown/imaging/nautilus_batches_.npz. -# Capped at --n-like-max 40000 and --capture-seconds 3600 (about an hour). -# 2. RATE (tasks 2-3): fixed_light_trace.py --lanes captured --captured-pass rate -# replays EVERY captured lane under library certified + certified_fallback=none in -# jax.jit(jax.vmap(fn)) chunks of 20 (one chunk = one real Nautilus batch), untimed, -# and reports the uncertified-lane rate overall, by Nautilus phase and by call half, -# plus max passes against the packaged budget 16. -# 3. TIME (tasks 4-27): the phase-B matched pair (--arms both) on B captured lanes +# 1. CAPTURE (tasks 0-3): nautilus_batch_capture.py fits the phase-B S3 system with +# af.Nautilus at the production settings of BOTH pixelized stages, on both meshes, +# and records every batch reaching Fitness.call_wrap to +# results/breakdown/imaging/nautilus_batches__.npz: +# --stage pix1 source_pix_1: mass + shear + regularization free, n_live=150 +# --stage pix2 source_pix_2: mass + shear fixed, regularization free, n_live=75 +# n_batch=20, use_jax_vmap=True, library PDIP. The regularization is FREE with the +# production priors (AdaptSplit inner/outer LogUniform 1e-6..1e6, signal_scale +# Uniform 0..1 on Delaunay; the rectangular cell cannot build AdaptSplit and frees +# its Constant coefficient, LogUniform 1e-6..1e6). The rate plausibly depends on +# the regularization through how many pixels sit at the positivity bound, so a +# fixed-regularization capture would not answer the question. Capped at +# --n-like-max 40000 and --capture-seconds 3600 (about an hour). +# 2. RATE (tasks 4-7): fixed_light_trace.py --lanes captured --captured-pass rate +# replays EVERY captured lane (its own mass, shear and regularization, through the +# Fitness instance_from_vector path) under library certified + certified_fallback= +# none in jax.jit(jax.vmap(fn)) chunks of 20 (one chunk = one real Nautilus batch), +# untimed, and reports the uncertified-lane rate overall, by Nautilus phase and by +# call half, plus max passes against the packaged budget 16, per mesh and stage. +# 3. TIME (tasks 8-37): the phase-B matched pair (--arms both) on B captured lanes # (nautilus_batches.timed_window: consecutive calls from the first post-prior -# batch; at B=20 exactly one real batch) for B in 16/20/50/100 and the three -# phase-B rows. Together the rows give the table the verdict needs: PDIP vmap and +# batch; at B=20 exactly one real batch) and the three phase-B rows: PDIP vmap and # scalar PDIP (pdip/on), certified+PDIP vmap and SCALAR certified+PDIP -# (certified/on), certified+none vmap (certified/off). +# (certified/on), certified+none vmap (certified/off). pix1 gets the full +# B=16/20/50/100 grid; pix2 gets B=20 only. Why: the batch-size scaling is a +# property of the program's shapes, which pix2 shares with pix1; what pix2 can +# change is the per-lane pass count under vmap (the certified while_loop runs to +# the batch's max passes), and B=20 is the one production batch size where that +# enters the C2 verdict. Six tasks, cheap. # -# TWO-STEP SUBMISSION — the replay tasks read the capture's npz, so they must start -# after it. Submit from hpc/batch_gpu/ (the -o/-e paths are relative): +# TWO-STEP SUBMISSION — the replay tasks read the captures' npz files, so they must start +# after them. Submit from hpc/batch_gpu/ on RAL (the -o/-e paths are relative): # -# CAP=$(sbatch --parsable --array=0-1 submit_breakdown_imaging_fixed_light_certified_lane_rate_a100_hst_fp64) -# sbatch --array=2-27 --dependency=afterok:${CAP} submit_breakdown_imaging_fixed_light_certified_lane_rate_a100_hst_fp64 +# CAP=$(sbatch --parsable --array=0-3 submit_breakdown_imaging_fixed_light_certified_lane_rate_a100_hst_fp64) +# sbatch --array=4-37 --dependency=afterok:${CAP} submit_breakdown_imaging_fixed_light_certified_lane_rate_a100_hst_fp64 # -# A plain `sbatch` (or `hpc/sync submit`) of this file runs all 28 tasks at once; every +# A plain `sbatch` (or `hpc/sync submit`) of this file runs all 38 tasks at once; every # replay task then refuses to start (FATAL, no npz) — nothing is measured on a stale or # missing capture. # -# Array tasks (index = 4 + 12*mesh + 3*batch + row for tasks 4-27) -# ---------------------------------------------------------------- -# task mesh pass B solver fallback row -# 0 delaunay capture 20 - - Nautilus capture (library PDIP) -# 1 rectangular capture 20 - - Nautilus capture (library PDIP) -# 2 delaunay rate 20 certified off uncertified-lane rate, all lanes -# 3 rectangular rate 20 certified off uncertified-lane rate, all lanes -# 4 delaunay time 16 pdip on library PDIP vmap + scalar PDIP -# 5 delaunay time 16 certified on certified+PDIP vmap + SCALAR -# 6 delaunay time 16 certified off certified, fallback none -# 7-9 delaunay time 20 (the three rows again) -# 10-12 delaunay time 50 -# 13-15 delaunay time 100 -# 16-27 rectangular time 16/20/50/100 x the same three rows +# Array tasks +# ----------- +# task mesh stage pass B solver fallback +# 0 delaunay pix1 capture 20 - - +# 1 rectangular pix1 capture 20 - - +# 2 delaunay pix2 capture 20 - - +# 3 rectangular pix2 capture 20 - - +# 4-7 (same mesh/stage order) rate 20 certified off +# 8-19 delaunay pix1 time 16/20/50/100 x (pdip on, certified on, certified off) +# 20-31 rectangular pix1 time 16/20/50/100 x the same three rows +# 32-34 delaunay pix2 time 20 x the three rows +# 35-37 rectangular pix2 time 20 x the three rows # # The pass budget is NOT passed: every certified row runs the library's resolved # certified_pass_budget (16 as packaged), and the JSON records it and its basis. @@ -78,8 +89,9 @@ # AUTOTUNE_ENTRIES census at the end is the check. # # WALL-BASIS: -# Neither cell's wall has been measured on the A100 in these modes. The capture is -# capped by the cell itself at 3600 s of sampling plus setup and compiles; a rate task +# Neither cell's wall has been measured on the A100 in these modes. A capture is +# capped by the cell itself at 3600 s of sampling plus setup and compiles (pix2, with +# half the live points, is expected to converge sooner); a rate task # replays up to 40000 lanes at roughly one second per 20-lane chunk; the B=100 timing # tasks run 100 sequential scalar calls per invocation. The laptop CPU witness in the # phase-C1 note is the probe. Both cells therefore declare unmeasured with the 3x @@ -99,7 +111,7 @@ #SBATCH --cpus-per-task=4 #SBATCH --mem=64gb #SBATCH --time=12:00:00 -#SBATCH --array=0-27 +#SBATCH --array=0-37 #SBATCH --export=ALL,PYAUTO_HPC_BASE=/mnt/ral/jnightin/PyAuto #SBATCH -o output/output.%A_%a.out #SBATCH -e error/error.%A_%a.err @@ -133,24 +145,26 @@ if [ ! -f "$CAPTURE" ] || ! grep -q -- "--captured-pass" "$CELL"; then exit 1 fi -MESHES=(delaunay rectangular delaunay rectangular delaunay delaunay delaunay delaunay delaunay delaunay delaunay delaunay delaunay delaunay delaunay delaunay rectangular rectangular rectangular rectangular rectangular rectangular rectangular rectangular rectangular rectangular rectangular rectangular) -PASSES=(capture capture rate rate time time time time time time time time time time time time time time time time time time time time time time time time) -BATCHES=(20 20 20 20 16 16 16 20 20 20 50 50 50 100 100 100 16 16 16 20 20 20 50 50 50 100 100 100) -SOLVERS=(- - certified certified pdip certified certified pdip certified certified pdip certified certified pdip certified certified pdip certified certified pdip certified certified pdip certified certified pdip certified certified) -FALLBACKS=(- - off off on on off on on off on on off on on off on on off on on off on on off on on off) +MESHES=(delaunay rectangular delaunay rectangular delaunay rectangular delaunay rectangular delaunay delaunay delaunay delaunay delaunay delaunay delaunay delaunay delaunay delaunay delaunay delaunay rectangular rectangular rectangular rectangular rectangular rectangular rectangular rectangular rectangular rectangular rectangular rectangular delaunay delaunay delaunay rectangular rectangular rectangular) +STAGES=(pix1 pix1 pix2 pix2 pix1 pix1 pix2 pix2 pix1 pix1 pix1 pix1 pix1 pix1 pix1 pix1 pix1 pix1 pix1 pix1 pix1 pix1 pix1 pix1 pix1 pix1 pix1 pix1 pix1 pix1 pix1 pix1 pix2 pix2 pix2 pix2 pix2 pix2) +PASSES=(capture capture capture capture rate rate rate rate time time time time time time time time time time time time time time time time time time time time time time time time time time time time time time) +BATCHES=(20 20 20 20 20 20 20 20 16 16 16 20 20 20 50 50 50 100 100 100 16 16 16 20 20 20 50 50 50 100 100 100 20 20 20 20 20 20) +SOLVERS=(- - - - certified certified certified certified pdip certified certified pdip certified certified pdip certified certified pdip certified certified pdip certified certified pdip certified certified pdip certified certified pdip certified certified pdip certified certified pdip certified certified) +FALLBACKS=(- - - - off off off off on on off on on off on on off on on off on on off on on off on on off on on off on on off on on off) MESH=${MESHES[$SLURM_ARRAY_TASK_ID]} +STAGE=${STAGES[$SLURM_ARRAY_TASK_ID]} PASS=${PASSES[$SLURM_ARRAY_TASK_ID]} BATCH=${BATCHES[$SLURM_ARRAY_TASK_ID]} SOLVER=${SOLVERS[$SLURM_ARRAY_TASK_ID]} FALLBACK=${FALLBACKS[$SLURM_ARRAY_TASK_ID]} -if [ -z "$MESH" ] || [ -z "$PASS" ] || [ -z "$BATCH" ] || [ -z "$SOLVER" ] || [ -z "$FALLBACK" ]; then - echo "FATAL: no (mesh, pass, batch, solver, fallback) arm for array task ${SLURM_ARRAY_TASK_ID} (expected 0-27)." >&2 +if [ -z "$MESH" ] || [ -z "$STAGE" ] || [ -z "$PASS" ] || [ -z "$BATCH" ] || [ -z "$SOLVER" ] || [ -z "$FALLBACK" ]; then + echo "FATAL: no (mesh, stage, pass, batch, solver, fallback) arm for array task ${SLURM_ARRAY_TASK_ID} (expected 0-37)." >&2 exit 1 fi BORDER=cell CONFIG_NAME=hpc_a100_fp64_fixed_light_trace -NPZ="$AP_ROOT/results/breakdown/imaging/nautilus_batches_${MESH}.npz" +NPZ="$AP_ROOT/results/breakdown/imaging/nautilus_batches_${MESH}_${STAGE}.npz" # The dataset is tracked but its adapt image cache is not; concurrent tasks must not # auto-simulate the same dataset/imaging/hst/, so it is prepared once before submitting. @@ -164,12 +178,12 @@ fi # an npz captured on a different S3 system (fingerprint check); that it is THIS run's # capture is what the two-step --dependency above guarantees. if [ "$PASS" != "capture" ] && [ ! -f "$NPZ" ]; then - echo "FATAL: $NPZ missing. The replay tasks (2-27) must be submitted with" >&2 - echo " --dependency=afterok: after tasks 0-1 (see the header)." >&2 + echo "FATAL: $NPZ missing. The replay tasks (4-37) must be submitted with" >&2 + echo " --dependency=afterok: after tasks 0-3 (see the header)." >&2 exit 1 fi -LEG="${MESH}_${PASS}_${BATCH}_${SOLVER}_${FALLBACK}" +LEG="${MESH}_${STAGE}_${PASS}_${BATCH}_${SOLVER}_${FALLBACK}" # Fresh per-task compilation cache and trace dir, under output/ (gitignored). export JAX_COMPILATION_CACHE_DIR="$AP_ROOT/output/jax_cache/fixed_light_lanerate_${LEG}_${SLURM_ARRAY_JOB_ID:-local}_${SLURM_ARRAY_TASK_ID:-0}" @@ -184,13 +198,14 @@ nvidia-smi echo "==========================================" date hostname -echo "Task: $SLURM_ARRAY_TASK_ID / 27" +echo "Task: $SLURM_ARRAY_TASK_ID / 37" +echo "Stage: $STAGE" echo "Pass: $PASS" echo "Dataset: hst (0.05\"/px)" echo "Precision: fp64" echo "Source mesh: $MESH (cell fiducial; --source-pixels NOT passed)" echo "Batches file: $NPZ" -echo "LANE_RATE_LEG mesh=$MESH pass=$PASS batch=$BATCH solver=$SOLVER fallback=$FALLBACK dataset=hst hardware=hpc_a100_fp64" +echo "LANE_RATE_LEG mesh=$MESH stage=$STAGE pass=$PASS batch=$BATCH solver=$SOLVER fallback=$FALLBACK dataset=hst hardware=hpc_a100_fp64" echo "=== source revisions (shared install, untouched) ===" for r in PyAutoNerves PyAutoFit PyAutoArray PyAutoGalaxy PyAutoLens; do @@ -221,7 +236,7 @@ if [ "$PASS" = "capture" ]; then --mesh $MESH \ --n-like-max 40000 \ --capture-seconds 3600 \ - --n-live 150 \ + --stage $STAGE \ --n-batch 20 \ --seed 1 elif [ "$PASS" = "rate" ]; then diff --git a/scripts/imaging/likelihood_breakdown/fixed_light_trace.py b/scripts/imaging/likelihood_breakdown/fixed_light_trace.py index ddfdb3bcf..4a65786f8 100644 --- a/scripts/imaging/likelihood_breakdown/fixed_light_trace.py +++ b/scripts/imaging/likelihood_breakdown/fixed_light_trace.py @@ -194,11 +194,18 @@ seeded draw family with the lanes of a REAL Nautilus run, recorded by ``nautilus_batch_capture.py`` at the production ``source_pix[1]`` settings (``n_live=150``, ``n_batch=20``). A captured lane is the mass AND shear of one -proposal (``_captured_lane_tree``), lens light fixed at S3 as in every lane of -this cell. The file is refused unless its recorded S3 fingerprint — dataset -sha256s, mesh, source pixels, regularization, border relocator, precision and -the eager S3 figure of merit (``EQUIVALENCE_RTOL``) — matches the system built -here. Without ``--lanes captured`` nothing below happens, and ``--batches``, +proposal's physical parameter vector — mass, shear AND regularization for a +``pix1`` capture, the regularization alone for ``pix2`` — evaluated the way +``Fitness.call`` evaluates it (``_captured_likelihood_fn``: the capture's model, +rebuilt by the same ``nautilus_batches.capture_model_from``, instantiated from the +vector inside the trace), so every lane's own regularization reaches the +likelihood in both passes; lens light fixed at S3 as in every lane of this cell. +The file is refused unless its recorded S3 fingerprint — dataset sha256s, mesh, +source pixels, the regularization CLASS and the S0 fiducial coefficients that +built S3, border relocator, precision and the eager S3 figure of merit +(``EQUIVALENCE_RTOL``) — matches the system built here, and unless the rebuilt +model's parameter paths equal the capture's, in order. The per-lane +regularization coefficients are NOT identity: they are what the lanes vary. Without ``--lanes captured`` nothing below happens, and ``--batches``, ``--batch-sample`` and ``--captured-pass`` are rejected. ``--captured-pass time`` (default) is the phase-B harness exactly — PART V, both @@ -312,8 +319,8 @@ ``results/breakdown/imaging/fixed_light_trace_[_border_off][_n][_jitvmap__fb][_psf_]_.{json,png}``. Library mode replaces the batched token with ``_jitvmap__lib_fb_b`` (```` is -``captured`` for a phase-C1 timed pass). The phase-C1 rate pass writes -``fixed_light_trace__captured_rate_lib_fb_b[_sample]_.json`` +``captured_`` for a phase-C1 timed pass). The phase-C1 rate pass writes +``fixed_light_trace__captured_rate_lib_fb_b_[_sample]_.json`` and no PNG. The ``--config-name`` used for the phase-1 legs @@ -992,7 +999,16 @@ def _sha256(path: Path) -> str: ("mesh", _fp["mesh"], MESH), ("source_pixels", int(_fp["source_pixels"]), int(n_source_pixels)), ("dataset_sha256", _fp["dataset_sha256"], dataset_sha256), - ("regularization", _fp["regularization"], reg_provenance), + # The regularization COEFFICIENTS are free parameters of the capture (and + # of every replayed lane), so they are not the system's identity; its + # CLASS is, and so is the S0 fiducial the S3 subtraction was built with + # (that lives in log_evidence_s3_library below). + ( + "regularization_class", + _fp["regularization_class"], + type(regularization).__name__, + ), + ("regularization_s0_fiducial", _fp["regularization_s0_fiducial"], reg_provenance), ("border_relocator", bool(_fp["border_relocator"]), BORDER_RELOCATOR_RESOLVED), ( "use_mixed_precision", @@ -1015,20 +1031,24 @@ def _sha256(path: Path) -> str: f"{_batches_path} was captured on a different S3 system: {_mismatch}. Its lanes " f"are parameter vectors of that system and are not this cell's lanes." ) - _expected_paths = [ - "galaxies.lens.mass.centre.centre_0", - "galaxies.lens.mass.centre.centre_1", - "galaxies.lens.mass.ell_comps.ell_comps_0", - "galaxies.lens.mass.ell_comps.ell_comps_1", - "galaxies.lens.mass.einstein_radius", - "galaxies.lens.shear.gamma_1", - "galaxies.lens.shear.gamma_2", - ] - if sorted(captured["meta"]["parameter_paths"]) != sorted(_expected_paths): + # The replay model: the SAME builder the capture used, so a lane vector means + # the same parameters here as it did to the sampler. Its order is asserted. + CAPTURED_STAGE = captured["meta"]["stage"] + _replay_model = nautilus_batches.capture_model_from( + CAPTURED_STAGE, + mesh=MESH, + mesh_obj=mesh_obj, + lens_fixed=list(system_s3.source_only_tracer.galaxies)[0], + ) + _replay_paths = [".".join(_p) for _p in _replay_model.paths] + if _replay_paths != list(captured["meta"]["parameter_paths"]): raise AssertionError( f"{_batches_path} parameter paths {captured['meta']['parameter_paths']} are not " - f"the fixed-light mass + shear family {_expected_paths}" + f"this checkout's {CAPTURED_STAGE} model {_replay_paths} (order included)" ) + _reg_cols = [ + _replay_paths.index(_p) for _p in nautilus_batches.regularization_paths(_replay_paths) + ] captured_record = { "batches_path": str(_batches_path), "batches_sha256": _sha256(_batches_path), @@ -1041,6 +1061,8 @@ def _sha256(path: Path) -> str: for _p in dict.fromkeys(captured["call_phase"].tolist()) }, "parameter_paths": list(captured["meta"]["parameter_paths"]), + "stage": CAPTURED_STAGE, + "regularization": captured["meta"]["regularization"], "nautilus": captured["meta"]["nautilus"], "capture_fit_status": captured["meta"].get("fit_status"), "capture_library_revisions": captured["meta"].get("library_revisions"), @@ -1049,11 +1071,15 @@ def _sha256(path: Path) -> str: "mesh", "source_pixels", "dataset_sha256", - "regularization", + "regularization_class", + "regularization_s0_fiducial", "border_relocator", "use_mixed_precision", "log_evidence_s3_library", ], + "not_identity": ( + "the regularization coefficients: free per lane since the capture frees them" + ), "log_evidence_s3_library_rel_diff": _s3_rel, "passed": True, }, @@ -1122,29 +1148,14 @@ def _lane_tree(draw): return jax.tree_util.tree_map(jnp.asarray, _inst) -def _captured_lane_tree(values) -> object: - """The params pytree of one CAPTURED lane: S3 with the lane's mass AND shear. - - *values* is one row of the capture's ``parameters`` in its - ``parameter_paths`` order. The same shallow-copy rule as ``_lane_tree``: the - Pixelization and Regularization stay shared (static aux data compares by - identity), exactly as Nautilus batches one pixelization over B vectors. - """ - _v = dict(zip(captured["meta"]["parameter_paths"], (float(_x) for _x in values))) - _p = "galaxies.lens." - _inst = copy.copy(instance_s3) - _inst.galaxies = copy.copy(instance_s3.galaxies) - _attrs = dict(_LENS_ATTRS) - _attrs["mass"] = al.mp.Isothermal( - centre=(_v[_p + "mass.centre.centre_0"], _v[_p + "mass.centre.centre_1"]), - ell_comps=(_v[_p + "mass.ell_comps.ell_comps_0"], _v[_p + "mass.ell_comps.ell_comps_1"]), - einstein_radius=_v[_p + "mass.einstein_radius"], - ) - _attrs["shear"] = al.mp.ExternalShear( - gamma_1=_v[_p + "shear.gamma_1"], gamma_2=_v[_p + "shear.gamma_2"] - ) - _inst.galaxies.lens = al.Galaxy(redshift=float(_lens_s3.redshift), **_attrs) - return jax.tree_util.tree_map(jnp.asarray, _inst) +def _regularization_range(rows) -> dict: + """Min / max of every free regularization parameter over the capture *rows*.""" + _paths = captured["meta"]["parameter_paths"] + _vals = captured["parameters"][np.asarray(rows, dtype=int)] + return { + _paths[_c]: {"min": float(_vals[:, _c].min()), "max": float(_vals[:, _c].max())} + for _c in _reg_cols + } def _psf_context(): @@ -1159,6 +1170,30 @@ def _psf_context(): return psf_cube_injection.psf_convolution_injected(PSF_CANDIDATE) +def _captured_likelihood_fn(dataset_for_route, settings_for_route): + """``parameter vector -> log likelihood``, exactly as ``Fitness.call`` does it. + + Phase C1 (#304): a captured lane is a physical parameter vector of the + capture's model (mass, shear AND regularization in pix1; regularization only + in pix2). ``_replay_model.instance_from_vector(..., xp=jnp)`` inside the trace + is the Fitness JAX path (``ignore_assertions=True``), so every lane's own + regularization coefficients reach the likelihood as traced values — which a + pytree of the S3 instance cannot do: its Pixelization sits in static aux data. + """ + analysis = al.AnalysisImaging( + dataset=dataset_for_route, + adapt_images=adapt_images, + settings=settings_for_route, + use_jax=True, + ) + + def _likelihood(vector): + instance = _replay_model.instance_from_vector(vector=vector, ignore_assertions=True, xp=jnp) + return analysis.log_likelihood_function(instance=instance) + + return _likelihood + + def _likelihood_fn(dataset_for_route, settings_for_route): """``params tree -> log likelihood`` through the library's analysis path.""" analysis = al.AnalysisImaging( @@ -1174,6 +1209,11 @@ def _likelihood(tree): return _likelihood +#: The likelihood builder PART V and PART R use for their LANES: the S3 tree +#: function in every phase-B/phase-2 mode, the Fitness-style vector function for +#: captured lanes. PART B (the fiducial routes) always uses ``_likelihood_fn``. +_lane_likelihood_fn = _captured_likelihood_fn if CAPTURED_LANES else _likelihood_fn + print("\n" + "=" * 70) print("LIBRARY PATH — one full likelihood call per route") print("=" * 70) @@ -1459,11 +1499,10 @@ def _collect_rate(passes, certified): _pos = 0 _t_rate = time.perf_counter() with library_solver_injection.library_solver_observed(report=_collect_rate) as _observed: - _fn_rate = jax.jit(jax.vmap(_likelihood_fn(system_s3.dataset, _settings_library))) + _fn_rate = jax.jit(jax.vmap(_lane_likelihood_fn(system_s3.dataset, _settings_library))) with timer.section("captured_rate_pass"): for _ci, (_chunk, _n_real) in enumerate(_chunks): - _trees = [_captured_lane_tree(captured["parameters"][_k]) for _k in _chunk] - _batched = jax.tree_util.tree_map(lambda *xs: jnp.stack(xs), *_trees) + _batched = jnp.asarray(captured["parameters"][_chunk]) _before = len(_rate_rows) _ll = np.asarray(block(_fn_rate(_batched)), dtype=float) jax.effects_barrier() @@ -1535,11 +1574,11 @@ def _collect_rate(passes, certified): _uncert_idx = np.flatnonzero(~_certified) _recheck_rows: list[dict] = [] if _uncert_idx.size: - _pdip_scalar = jax.jit(_likelihood_fn(system_s3.dataset, _settings_pdip_reference)) + _pdip_scalar = jax.jit(_lane_likelihood_fn(system_s3.dataset, _settings_pdip_reference)) with timer.section("captured_rate_uncertified_pdip_recheck"): for _j in _uncert_idx[:RATE_PDIP_RECHECK_MAX]: _k = int(_lanes[_j]) - _ref = float(block(_pdip_scalar(_captured_lane_tree(captured["parameters"][_k])))) + _ref = float(block(_pdip_scalar(jnp.asarray(captured["parameters"][_k])))) _recheck_rows.append( { "lane_row": _k, @@ -1568,6 +1607,8 @@ def _collect_rate(passes, certified): "--vmap-batch == n_batch every chunk is exactly one captured Nautilus batch." ), "batch_sample": BATCH_SAMPLE, + "stage": CAPTURED_STAGE, + "regularization_range": _regularization_range(_lanes), "calls_replayed": int(_calls.shape[0]), "calls_rule": ( "all captured calls" @@ -1664,7 +1705,7 @@ def _collect_rate(passes, certified): } _rate_name = ( f"fixed_light_trace_{MESH}_captured_rate_lib{LIBRARY_SOLVER}" - f"_fb{'on' if FALLBACK_ON else 'off'}_b{CERTIFIED_BUDGET}" + f"_fb{'on' if FALLBACK_ON else 'off'}_b{CERTIFIED_BUDGET}_{CAPTURED_STAGE}" + (f"_sample{int(BATCH_SAMPLE)}" if BATCH_SAMPLE is not None else "") ) _rate_json, _ = resolve_output_paths( @@ -1960,6 +2001,7 @@ def _sum_host_ms(predicate) -> float: offsets={ _short: _vals[_long] - BASE_MASS[_short] for _long, _short in _mass_keys.items() + if _long in _vals }, index=int(_k), mass_cls="Isothermal", @@ -1998,8 +2040,13 @@ def _sum_host_ms(predicate) -> float: if captured_window is None: lane_trees = [_lane_tree(_d) for _d in lane_draws] else: - lane_trees = [_captured_lane_tree(captured["parameters"][_k]) for _k in captured_window] - _fiducial_structure = jax.tree_util.tree_structure(params_tree_s3) + # Captured lanes are parameter VECTORS (see _captured_likelihood_fn). + lane_trees = [jnp.asarray(captured["parameters"][_k]) for _k in captured_window] + _fiducial_structure = ( + jax.tree_util.tree_structure(params_tree_s3) + if captured_window is None + else jax.tree_util.tree_structure(lane_trees[0]) + ) for _i, _t in enumerate(lane_trees): if jax.tree_util.tree_structure(_t) != _fiducial_structure: raise AssertionError( @@ -2284,7 +2331,7 @@ def _invoke_ex(ex): # same lane trees; agreement between the two harness arms is insufficient. # (Library mode builds it from ``_settings_pdip_reference``, which names PDIP # explicitly; harness mode passes ``_settings`` exactly as phase 2 did.) - _fn_library_pdip = _likelihood_fn(system_s3.dataset, _settings_pdip_reference) + _fn_library_pdip = _lane_likelihood_fn(system_s3.dataset, _settings_pdip_reference) _library_pdip_fn = jax.jit(jax.vmap(_fn_library_pdip)) with timer.section("vmap_lane_library_pdip_reference"): _ll_library_pdip = np.asarray(block(_library_pdip_fn(batched_tree)), dtype=float) @@ -2365,7 +2412,7 @@ def _fiducial_solver_used(settings_for_check) -> str: ): # The wrappers reproduce current Fitness._vmap and the scalar-jit # control. Both close over the same likelihood function. - _fn_v = _likelihood_fn(system_s3.dataset, _arm_settings) + _fn_v = _lane_likelihood_fn(system_s3.dataset, _arm_settings) _scalar_pin_fn = jax.jit(_fn_v) _vmap_pin_fn = jax.jit(jax.vmap(_fn_v)) @@ -2623,7 +2670,7 @@ def _collect_report(pass_at, certified): # It changes nothing that is computed, and it runs on a separately # compiled program that is never timed. with library_solver_injection.library_solver_observed(report=_collect_report) as _observed: - _fn_report = _likelihood_fn(system_s3.dataset, _settings_library) + _fn_report = _lane_likelihood_fn(system_s3.dataset, _settings_library) with timer.section("vmap_certification_report"): if _report_arm == "vmap": _ll_report = np.asarray( @@ -2747,6 +2794,8 @@ def _collect_report(pass_at, certified): "draws_sha256": lane_draws_sha256, "lane_rows": captured_window.tolist(), "calls": sorted({int(_c) for _c in _win_calls}), + "stage": CAPTURED_STAGE, + "regularization_range": _regularization_range(captured_window), "phases": sorted({str(captured["call_phase"][_c]) for _c in _win_calls}), "window_rule": ( "nautilus_batches.timed_window: consecutive captured calls, in call order, from " @@ -3391,7 +3440,8 @@ def _section_s(label: str): # token keeps these files disjoint from every harness-mode file. _cell_name = ( f"{_cell_name}_jitvmap{int(VMAP_BATCH)}_{LANES_MODE}" - f"_lib{LIBRARY_SOLVER}_fb{'on' if FALLBACK_ON else 'off'}_b{CERTIFIED_BUDGET}" + + (f"_{CAPTURED_STAGE}" if CAPTURED_LANES else "") + + f"_lib{LIBRARY_SOLVER}_fb{'on' if FALLBACK_ON else 'off'}_b{CERTIFIED_BUDGET}" ) if PSF_CANDIDATE is not None: diff --git a/scripts/imaging/likelihood_breakdown/nautilus_batch_capture.py b/scripts/imaging/likelihood_breakdown/nautilus_batch_capture.py index 2b72a9731..405a869d3 100644 --- a/scripts/imaging/likelihood_breakdown/nautilus_batch_capture.py +++ b/scripts/imaging/likelihood_breakdown/nautilus_batch_capture.py @@ -22,12 +22,14 @@ line for line (the house rule of this family: "if a sibling cell's model changes, this cell must change with it"). The replay does not trust the copy: it re-derives the S3 fingerprint recorded here (dataset sha256s, mesh, source - pixels, regularization, border relocator, the eager S3 figure of merit) and - refuses a file that does not match. + pixels, the regularization CLASS, border relocator, the eager S3 figure of + merit) and refuses a file that does not match. The regularization + coefficients are free parameters of the capture and are no longer part of the + system's identity. 2. Fits that S3 system with ``af.Nautilus`` at the settings of the production ``source_pix[1]`` stage of ``euclid_strong_lens_modeling_pipeline/scripts/full_model.py``: - ``n_live=150``, ``n_batch=20``, ``use_jax_vmap=True`` (the ``SettingsSearch`` + ``n_live=150`` (``source_pix[2]``: 75), ``n_batch=20``, ``use_jax_vmap=True`` (the ``SettingsSearch`` default), one core, every other Nautilus argument at its default. The likelihood is the library's own — ``AnalysisImaging(use_jax=True)`` with the packaged positive-only solver (library PDIP): the batches must be the ones @@ -39,20 +41,34 @@ ``nautilus.Sampler.evaluate_likelihood``, restored on exit — no library is edited). -The model, and where it departs from ``source_pix[1]`` ------------------------------------------------------- - -Free: the lens ``Isothermal`` (centre, ell_comps, einstein_radius) and the -``ExternalShear`` — 7 parameters, with the phase-B cell's Gaussian priors (the -same priors ``fixed_light_draws_steps.PRIOR_SIGMA`` scales the phase-B lanes -from). Fixed: the lens light (subtracted, S3) and the source pixelization. - -``source_pix[1]`` also frees the regularization (``AdaptSplit``) and chains its -priors from ``source_lp``; this cell keeps the regularization FIXED at the cell's -coefficients, because the replay's lane trees carry the pixelization in their -static aux data (``fixed_light_trace._lane_tree``) and every lane must share it. -The captured batches therefore vary the mass and shear only — the same axes as -the phase-B lanes, now proposed by the sampler instead of drawn by a seed. +The model: ``--stage pix1|pix2``, and where it departs from production +--------------------------------------------------------------------- + +The model is built by ``nautilus_batches.capture_model_from`` — ONE builder the +replay re-instantiates, so the parameter order cannot drift between the two cells. + +- ``pix1`` (default; production ``source_pix_1``): the lens ``Isothermal`` + (centre, ell_comps, einstein_radius) and ``ExternalShear`` free with the + phase-B cell's Gaussian priors, AND the regularization free — 10 parameters + on Delaunay, 8 on rectangular. +- ``pix2`` (production ``source_pix_2``): the mass and shear FIXED at the S3 + lens (the cell's fiducial values) and only the regularization free. + +The regularization priors are production's: ``AdaptSplit`` inner and outer +coefficient ``LogUniform(1e-6, 1e6)``, ``signal_scale`` ``Uniform(0, 1)`` — the +packaged PyAutoGalaxy ``adapt_split.yaml``, identical to the pipeline's own +config (``nautilus_batches.REGULARIZATION_PRIORS``, set explicitly). The +Delaunay cell already uses ``AdaptSplit`` (its fixed coefficients 0.1 / 10 / 0.1 +are the S0 fit that defines S3, and nothing else). The RECTANGULAR cell uses +``Constant`` and cannot build ``AdaptSplit`` (the rectangular interpolator has no +split cross-points), and production has no rectangular stage, so rectangular +frees the ``Constant`` coefficient with the packaged ``LogUniform(1e-6, 1e6)`` +prior — a recorded deviation. + +Remaining departures from production: mass and shear priors are the cell's, not +chained from ``source_lp``; no positions likelihood; the mesh is the cell's +(Hilbert 1500 vertices, ``weight_power=1``) in both stages, where ``source_pix_2`` +redraws a 500-vertex Hilbert grid at ``weight_power=3.5`` from the pix1 result. Nautilus is seeded (``--seed``, default 1) so a capture is reproducible; production passes no seed. Quick updates are disabled (they only render the current best fit and never change what Nautilus proposes), and the search's @@ -64,20 +80,23 @@ ---------------------------------------------- ``--mesh {delaunay,rectangular}`` (required) — the phase-B meshes. +``--stage {pix1,pix2}`` (default ``pix1``) — which production stage's free +parameters (above). ``--n-like-max N`` (default 40000) — Nautilus's own likelihood cap. On the A100 this is roughly an hour of sampling (phase B: ~39 ms per Delaunay lane under library PDIP ``jit(vmap)``, plus Nautilus's CPU-side bound training); a laptop witness passes a few batches' worth. ``--capture-seconds S`` (default: no limit) — a hard wall-clock cap. The batch that crosses it is recorded, then Nautilus is unwound and the file written. -``--n-live`` (default 150), ``--n-batch`` (default 20), ``--seed`` (default 1). +``--n-live`` (default: the stage's production value, 150 for pix1 and 75 for +pix2), ``--n-batch`` (default 20), ``--seed`` (default 1). Output ------ -``/nautilus_batches_[_n].npz`` and ``.json`` beside it -(default output dir ``results/breakdown/imaging``). The npz keys are -``nautilus_batches.SCHEMA_VERSION``'s: ``parameters`` ``(n_lanes, 7)`` physical +``/nautilus_batches__[_n].npz`` and ``.json`` beside +it (default output dir ``results/breakdown/imaging``). The npz keys are +``nautilus_batches.SCHEMA_VERSION``'s: ``parameters`` ``(n_lanes, n_dim)`` physical values in ``meta.parameter_paths`` order, ``figure_of_merit``, ``call_index``, ``lane_in_call``, and per call ``call_size``, ``call_phase``, ``call_n_bounds``, ``call_explored``, ``call_n_like_before``, ``call_wall_s``; ``meta_json`` repeats @@ -159,8 +178,9 @@ def _profiling_root() -> _Path: _cli = parse_profile_cli() -#: ``source_pix[1]`` of euclid_strong_lens_modeling_pipeline/scripts/full_model.py. -PRODUCTION_N_LIVE = 150 +#: euclid_strong_lens_modeling_pipeline/scripts/full_model.py: source_pix_1 runs +#: n_live=150, source_pix_2 n_live=75; both default n_batch=20. +PRODUCTION_N_LIVE = {"pix1": 150, "pix2": 75} PRODUCTION_N_BATCH = 20 _cell_parser = argparse.ArgumentParser(add_help=False, allow_abbrev=False) @@ -168,17 +188,19 @@ def _profiling_root() -> _Path: _cell_parser.add_argument("--source-pixels", type=int, default=None) _cell_parser.add_argument("--n-like-max", type=int, default=40000) _cell_parser.add_argument("--capture-seconds", type=float, default=None) -_cell_parser.add_argument("--n-live", type=int, default=PRODUCTION_N_LIVE) +_cell_parser.add_argument("--n-live", type=int, default=None) _cell_parser.add_argument("--n-batch", type=int, default=PRODUCTION_N_BATCH) _cell_parser.add_argument("--seed", type=int, default=1) +_cell_parser.add_argument("--stage", choices=nautilus_batches.STAGES, default="pix1") _cell_args = _cli.parse_cell_args(_cell_parser) MESH = _cell_args.mesh N_LIKE_MAX = int(_cell_args.n_like_max) CAPTURE_SECONDS = _cell_args.capture_seconds -N_LIVE = int(_cell_args.n_live) N_BATCH = int(_cell_args.n_batch) SEED = int(_cell_args.seed) +STAGE = _cell_args.stage +N_LIVE = int(_cell_args.n_live if _cell_args.n_live is not None else PRODUCTION_N_LIVE[STAGE]) for _flag, _value in (("--n-like-max", N_LIKE_MAX), ("--n-live", N_LIVE), ("--n-batch", N_BATCH)): if _value < 1: raise ValueError(f"{_flag} must be >= 1 (got {_value})") @@ -200,7 +222,7 @@ def _profiling_root() -> _Path: # =================================================================== print("=" * 70) -print(f"NAUTILUS BATCH CAPTURE — {MESH} — n_live {N_LIVE}, n_batch {N_BATCH}") +print(f"NAUTILUS BATCH CAPTURE — {MESH} {STAGE} — n_live {N_LIVE}, n_batch {N_BATCH}") print("=" * 70) _workspace_root = _profiling_root() @@ -374,8 +396,8 @@ def _sha256(path: Path) -> str: # PART N — the Nautilus fit of the S3 system, recorded # =================================================================== # The fixed-light model: the S3 lens has no light (it was subtracted from the -# dataset), so the lens is mass + shear with the cell's priors, and the source is -# the SAME pixelization object the S3 instance carries. +# dataset), so the lens is mass + shear (free in pix1, the S3 lens itself in pix2); +# the source is the cell's mesh with the regularization FREE at production priors. _s3_lens, _s3_source = list(system_s3.source_only_tracer.galaxies) _s3_lens_attrs = sorted( @@ -387,14 +409,15 @@ def _sha256(path: Path) -> str: f"captured lanes would not be the phase-B lane family" ) -capture_model = af.Collection( - galaxies=af.Collection( - lens=af.Model(al.Galaxy, redshift=0.5, mass=mass, shear=shear), - source=af.Model(al.Galaxy, redshift=1.0, pixelization=pixelization), - ) +capture_model = nautilus_batches.capture_model_from( + STAGE, mesh=MESH, mesh_obj=mesh_obj, lens_fixed=_s3_lens ) +REGULARIZATION_CLASS = nautilus_batches.regularization_class_for(MESH) parameter_paths = [".".join(_p) for _p in capture_model.paths] -print(f"\n Capture model: {capture_model.total_free_parameters} free parameters") +print( + f"\n Capture model ({STAGE}): {capture_model.total_free_parameters} free parameters, " + f"regularization {REGULARIZATION_CLASS} free" +) for _p in parameter_paths: print(f" {_p}") _register_model_pytrees(capture_model) @@ -406,18 +429,21 @@ def _sha256(path: Path) -> str: use_jax=True, ) -# The fiducial through the SAME analysis: the prior medians are the S3 fiducial, -# so this is the S3 system's own likelihood (recorded, and a sanity print). -_fiducial_instance = capture_model.instance_from_vector( - vector=capture_model.physical_values_from_prior_medians -) +# The prior-median vector through the SAME analysis and the Fitness path +# (instance_from_vector under jit): the mass/shear medians are the S3 fiducial, +# the regularization medians are the prior's (recorded, and a sanity print). +_median_vector = jnp.asarray(capture_model.physical_values_from_prior_medians) with timer.section("fiducial_jit"): _fiducial_ll = float( - jax.jit(lambda _t: analysis.log_likelihood_function(instance=_t))( - jax.tree_util.tree_map(jnp.asarray, _fiducial_instance) - ) + jax.jit( + lambda _v: analysis.log_likelihood_function( + instance=capture_model.instance_from_vector( + vector=_v, ignore_assertions=True, xp=jnp + ) + ) + )(_median_vector) ) -print(f" fiducial log likelihood (jit, library PDIP): {_fiducial_ll:.6f}") +print(f" prior-median log likelihood (jit, library PDIP): {_fiducial_ll:.6f}") search = af.Nautilus( n_live=N_LIVE, @@ -498,13 +524,26 @@ def _library_revision(module) -> dict: meta = { "schema_version": nautilus_batches.SCHEMA_VERSION, "mesh": MESH, + "stage": STAGE, "dataset": DATASET, "parameter_paths": parameter_paths, + "prior_median_vector": [float(_x) for _x in _median_vector], + "regularization": { + "class": REGULARIZATION_CLASS, + "free": True, + "priors": nautilus_batches.REGULARIZATION_PRIORS[REGULARIZATION_CLASS], + "priors_source": ( + "PyAutoGalaxy packaged config/priors/regularization (adapt_split.yaml / " + "constant.yaml); adapt_split.yaml is identical to " + "euclid_strong_lens_modeling_pipeline/config/priors/regularization/adapt_split.yaml" + ), + }, "s3_fingerprint": { "dataset_sha256": dataset_sha256, "mesh": MESH, "source_pixels": int(n_source_pixels), - "regularization": reg_provenance, + "regularization_class": REGULARIZATION_CLASS, + "regularization_s0_fiducial": reg_provenance, "border_relocator": BORDER_RELOCATOR_RESOLVED, "use_mixed_precision": bool(_cli.use_mixed_precision), "log_evidence_s3_library": log_evidence_s3_library, @@ -519,13 +558,20 @@ def _library_revision(module) -> dict: "number_of_cores": 1, "version": getattr(_nautilus, "__version__", None), "production_reference": ( - "euclid_strong_lens_modeling_pipeline/scripts/full_model.py source_pix_1: " - "af.Nautilus(n_live=150, n_batch=20, **SettingsSearch.search_dict) with " - "use_jax_vmap=True and number_of_cores=1 (SettingsSearch defaults)" + "euclid_strong_lens_modeling_pipeline/scripts/full_model.py source_pix_1 " + "(n_live=150) / source_pix_2 (n_live=75): af.Nautilus(n_batch=20, " + "**SettingsSearch.search_dict) with use_jax_vmap=True and number_of_cores=1 " + "(SettingsSearch defaults)" ), + "stage": STAGE, + "production_stage": "source_pix_1" if STAGE == "pix1" else "source_pix_2", "departures_from_production": [ - "regularization fixed at the cell's coefficients (source_pix_1 frees AdaptSplit)", - "priors are the phase-B cell's Gaussians, not chained from source_lp", + "mass/shear priors are the phase-B cell's Gaussians, not chained from source_lp" + if STAGE == "pix1" + else "mass/shear fixed at the S3 fiducial, not at a source_pix_1 result", + "no positions likelihood", + "the cell's mesh (Hilbert 1500, weight_power 1) in both stages; source_pix_2 " + "redraws a 500-vertex Hilbert grid at weight_power 3.5", "seeded (production passes no seed)", "quick updates disabled (iterations_per_quick_update=1e12; render-only)", "NullPaths: no output directory, so no checkpoint and one Sampler.run call", @@ -552,7 +598,7 @@ def _library_revision(module) -> dict: if _cli.output_dir is not None else _workspace_root / "results" / "breakdown" / "imaging" ) -_stem = f"nautilus_batches_{MESH}" +_stem = f"nautilus_batches_{MESH}_{STAGE}" if SOURCE_PIXELS_REQUESTED is not None: _stem = f"{_stem}_n{int(n_source_pixels)}" npz_path = Path(_output_dir) / f"{_stem}.npz" diff --git a/scripts/misc/likelihood_breakdown/nautilus_batches.py b/scripts/misc/likelihood_breakdown/nautilus_batches.py index 6f7066319..9e8cd3c0b 100644 --- a/scripts/misc/likelihood_breakdown/nautilus_batches.py +++ b/scripts/misc/likelihood_breakdown/nautilus_batches.py @@ -9,7 +9,7 @@ replays those lanes (:func:`load`, :func:`sample_calls`, :func:`timed_window`, :func:`chunked`, :func:`rate_summary`). -Everything here except :func:`recording` is pure numpy, so the selection and +Everything here except :func:`recording` and :func:`capture_model_from` is pure numpy, so the selection and summary rules are unit-tested without JAX (``scripts/misc/test/test_nautilus_batches.py``). The recorder @@ -58,7 +58,7 @@ import numpy as np #: Bump when the npz key set changes; ``load`` refuses a file it does not know. -SCHEMA_VERSION = 1 +SCHEMA_VERSION = 2 #: Phase labels, in run order. PHASES = ("prior", "exploration", "sampling") @@ -174,6 +174,90 @@ def call_wrap(self, parameters): nautilus.Sampler.evaluate_likelihood = original_evaluate +# --------------------------------------------------------------------------- +# The captured model — ONE builder, used by the capture and by the replay +# --------------------------------------------------------------------------- + +#: The capture stages (``--stage``), after the production pipeline's pixelized +#: stages (euclid_strong_lens_modeling_pipeline/scripts/full_model.py). +STAGES = ("pix1", "pix2") + +#: The production regularization priors. ``AdaptSplit``'s are the packaged +#: PyAutoGalaxy ``config/priors/regularization/adapt_split.yaml``, byte-identical +#: to the pipeline's own ``config/priors/regularization/adapt_split.yaml``; +#: ``Constant``'s are the packaged ``constant.yaml``. Set EXPLICITLY on the model +#: so the capture does not depend on which config directory is active. +REGULARIZATION_PRIORS = { + "AdaptSplit": { + "inner_coefficient": ("LogUniform", 1.0e-6, 1.0e6), + "outer_coefficient": ("LogUniform", 1.0e-6, 1.0e6), + "signal_scale": ("Uniform", 0.0, 1.0), + }, + "Constant": {"coefficient": ("LogUniform", 1.0e-6, 1.0e6)}, +} + + +def regularization_class_for(mesh: str) -> str: + """The regularization class a stage frees on *mesh*. + + Delaunay: ``AdaptSplit``, as production (and as the phase-B cell already + uses). Rectangular: ``Constant`` — the cell's class. ``AdaptSplit`` needs the + interpolator's split cross-points (``_mappings_sizes_weights_split``), which + only the Delaunay / KNN / Sibson interpolators define, and production has no + rectangular stage to copy. + """ + return "Constant" if mesh == "rectangular" else "AdaptSplit" + + +def capture_model_from(stage: str, *, mesh: str, mesh_obj, lens_fixed): + """The fixed-light model a capture fits and a replay re-instantiates. + + ``pix1`` (production ``source_pix_1``): lens Isothermal + ExternalShear free + with the phase-B cell's Gaussian priors, AND the regularization free with the + production priors. ``pix2`` (production ``source_pix_2``): the lens is + *lens_fixed* (the S3 source-only lens — the cell's fiducial mass and shear) and + only the regularization is free. The mesh is the cell's (*mesh_obj*) in both. + + Returns the ``af.Collection``; its ``paths`` order is the capture's + ``parameter_paths`` and the replay asserts it is unchanged. + """ + import autofit as af + import autolens as al + + if stage not in STAGES: + raise ValueError(f"unknown stage {stage!r} (want one of {STAGES})") + + reg_name = regularization_class_for(mesh) + regularization = af.Model(getattr(al.reg, reg_name)) + for attr, (kind, lower, upper) in REGULARIZATION_PRIORS[reg_name].items(): + prior_cls = af.LogUniformPrior if kind == "LogUniform" else af.UniformPrior + setattr(regularization, attr, prior_cls(lower_limit=lower, upper_limit=upper)) + pixelization = af.Model(al.Pixelization, mesh=mesh_obj, regularization=regularization) + source = af.Model(al.Galaxy, redshift=1.0, pixelization=pixelization) + + if stage == "pix1": + 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) + ell = al.convert.ell_comps_from(axis_ratio=0.9, angle=45.0) + mass.ell_comps.ell_comps_0 = af.GaussianPrior(mean=ell[0], sigma=0.01) + mass.ell_comps.ell_comps_1 = af.GaussianPrior(mean=ell[1], sigma=0.01) + shear = af.Model(al.mp.ExternalShear) + shear.gamma_1 = af.GaussianPrior(mean=0.05, sigma=0.005) + shear.gamma_2 = af.GaussianPrior(mean=0.05, sigma=0.005) + lens = af.Model(al.Galaxy, redshift=0.5, mass=mass, shear=shear) + else: + lens = lens_fixed + + return af.Collection(galaxies=af.Collection(lens=lens, source=source)) + + +def regularization_paths(parameter_paths) -> list[str]: + """The regularization entries of a capture's ``parameter_paths``.""" + return [p for p in parameter_paths if ".regularization." in p] + + # --------------------------------------------------------------------------- # The file # --------------------------------------------------------------------------- diff --git a/scripts/misc/test/test_fixed_light_certified_lane_rate_submit.py b/scripts/misc/test/test_fixed_light_certified_lane_rate_submit.py index 037afb434..88f6c6bf3 100644 --- a/scripts/misc/test/test_fixed_light_certified_lane_rate_submit.py +++ b/scripts/misc/test/test_fixed_light_certified_lane_rate_submit.py @@ -2,8 +2,9 @@ **No imaging, no JAX, no GPU** — these read the submit script and the two cells as text. -The submit runs two cells: ``nautilus_batch_capture.py`` (tasks 0-1, the capture) and -``fixed_light_trace.py --lanes captured`` (tasks 2-27, the rate and timing replays). +The submit runs two cells: ``nautilus_batch_capture.py`` (tasks 0-3, the pix1 / pix2 +captures on both meshes) and ``fixed_light_trace.py --lanes captured`` (tasks 4-37, +the rate and timing replays). It is a sixth ``fixed_light`` submit family with its own file-name prefix, excluded from ``test_fixed_light_cell.py``'s glob for the reason that file states; this file is the family's half of that bargain, mirroring @@ -55,7 +56,7 @@ def _profiling_root() -> _Path: _sys.path.insert(0, str(_misc)) CONFIG_NAME = "hpc_a100_fp64_fixed_light_trace" -TABLES = ("MESHES", "PASSES", "BATCHES", "SOLVERS", "FALLBACKS") +TABLES = ("MESHES", "STAGES", "PASSES", "BATCHES", "SOLVERS", "FALLBACKS") def _arm_table(text: str, name: str) -> list[str]: @@ -90,24 +91,28 @@ def test__array_range_matches_the_arms(): array = re.search(r"^#SBATCH --array=(\d+)-(\d+)", text, re.M) assert array and int(array.group(1)) == 0 assert int(array.group(2)) == lengths["MESHES"] - 1 - assert "FATAL: no (mesh, pass, batch, solver, fallback) arm" in text + assert "FATAL: no (mesh, stage, pass, batch, solver, fallback) arm" in text def test__the_array_is_the_pre_registered_task_table(): - """2 captures, 2 rate passes, then mesh x B x the three phase-B rows.""" - expected = [ - ("delaunay", "capture", "20", "-", "-"), - ("rectangular", "capture", "20", "-", "-"), - ("delaunay", "rate", "20", "certified", "off"), - ("rectangular", "rate", "20", "certified", "off"), + """4 captures, 4 rate passes, the pix1 B grid, then pix2 at B=20.""" + both = [ + (mesh, stage) + for stage, mesh in itertools.product(("pix1", "pix2"), ("delaunay", "rectangular")) ] + expected = [(mesh, stage, "capture", "20", "-", "-") for mesh, stage in both] + expected += [(mesh, stage, "rate", "20", "certified", "off") for mesh, stage in both] rows = [("pdip", "on"), ("certified", "on"), ("certified", "off")] expected += [ - (mesh, "time", str(batch), solver, fallback) + (mesh, "pix1", "time", str(batch), solver, fallback) for mesh, batch, (solver, fallback) in itertools.product( ("delaunay", "rectangular"), (16, 20, 50, 100), rows ) ] + expected += [ + (mesh, "pix2", "time", "20", solver, fallback) + for mesh, (solver, fallback) in itertools.product(("delaunay", "rectangular"), rows) + ] assert _arms() == expected @@ -115,17 +120,21 @@ def test__replay_refuses_a_missing_capture_and_documents_the_two_step(): text = SUBMIT.read_text() executable = _executable(text) assert 'if [ "$PASS" != "capture" ] && [ ! -f "$NPZ" ]; then' in executable - assert "sbatch --parsable --array=0-1" in text - assert "--array=2-27 --dependency=afterok:${CAP}" in text - assert 'NPZ="$AP_ROOT/results/breakdown/imaging/nautilus_batches_${MESH}.npz"' in executable + assert "sbatch --parsable --array=0-3" in text + assert "--array=4-37 --dependency=afterok:${CAP}" in text + assert ( + 'NPZ="$AP_ROOT/results/breakdown/imaging/nautilus_batches_${MESH}_${STAGE}.npz"' + in executable + ) def test__capture_runs_the_production_nautilus_settings(): executable = _executable(SUBMIT.read_text()) - for flag in ("--n-live 150", "--n-batch 20", "--n-like-max 40000", "--capture-seconds"): + for flag in ("--stage $STAGE", "--n-batch 20", "--n-like-max 40000", "--capture-seconds"): assert flag in executable, f"the capture does not pass {flag}" + assert "--n-live" not in executable, "n_live must come from the stage's production value" capture = CAPTURE.read_text() - assert "PRODUCTION_N_LIVE = 150" in capture + assert 'PRODUCTION_N_LIVE = {"pix1": 150, "pix2": 75}' in capture assert "PRODUCTION_N_BATCH = 20" in capture assert "use_jax_vmap=True" in capture if PIPELINE_FULL_MODEL.exists(): @@ -134,6 +143,12 @@ def test__capture_runs_the_production_nautilus_settings(): source_pix_1 = pipeline.split("def source_pix_1(", 1)[1].split("\ndef ", 1)[0] assert "n_batch: int = 20" in source_pix_1 assert "n_live=150" in source_pix_1 + source_pix_2 = pipeline.split("def source_pix_2(", 1)[1].split("\ndef ", 1)[0] + assert "n_batch: int = 20" in source_pix_2 + assert "n_live=75" in source_pix_2 + # Both stages free the AdaptSplit regularization the capture frees. + assert "regularization_init=al.reg.AdaptSplit" in pipeline + assert "regularization=al.reg.AdaptSplit" in pipeline def test__replay_runs_the_library_mode_on_captured_lanes(): diff --git a/scripts/misc/test/test_nautilus_batches.py b/scripts/misc/test/test_nautilus_batches.py index 1c898b10e..510a67348 100644 --- a/scripts/misc/test/test_nautilus_batches.py +++ b/scripts/misc/test/test_nautilus_batches.py @@ -120,3 +120,39 @@ def test__rate_summary_and_groups(): def test__early_late_split_is_the_median_replayed_call(): labels = nb.early_late(np.array([0, 1, 2, 3]), np.array([0, 1, 2, 3])) assert labels.tolist() == ["early", "early", "late", "late"] + + +@pytest.mark.parametrize( + "stage, mesh, n_free, n_reg", + [ + ("pix1", "delaunay", 10, 3), + ("pix1", "rectangular", 8, 1), + ("pix2", "delaunay", 3, 3), + ("pix2", "rectangular", 1, 1), + ], +) +def test__capture_model_frees_the_regularization_at_production_priors(stage, mesh, n_free, n_reg): + al = pytest.importorskip("autolens") + mesh_obj = ( + al.mesh.RectangularBilinearAdaptImage(shape=(10, 10)) + if mesh == "rectangular" + else al.mesh.Delaunay(pixels=100, zeroed_pixels=0) + ) + lens = al.Galaxy(redshift=0.5, mass=al.mp.Isothermal(), shear=al.mp.ExternalShear()) + model = nb.capture_model_from(stage, mesh=mesh, mesh_obj=mesh_obj, lens_fixed=lens) + paths = [".".join(p) for p in model.paths] + assert model.total_free_parameters == n_free + reg = nb.regularization_paths(paths) + assert len(reg) == n_reg + expected_cls = "Constant" if mesh == "rectangular" else "AdaptSplit" + assert nb.regularization_class_for(mesh) == expected_cls + for path in reg: + attr = path.rsplit(".", 1)[1] + kind, lower, upper = nb.REGULARIZATION_PRIORS[expected_cls][attr] + prior = model.galaxies.source.pixelization.regularization + prior = getattr(prior, attr) + assert type(prior).__name__ == f"{kind}Prior" + assert (prior.lower_limit, prior.upper_limit) == (lower, upper) + # The same builder twice gives the same order: the replay's assertion holds. + again = nb.capture_model_from(stage, mesh=mesh, mesh_obj=mesh_obj, lens_fixed=lens) + assert [".".join(p) for p in again.paths] == paths From 707fae2cda061f55eff0ebfb90460d64d82da992 Mon Sep 17 00:00:00 2001 From: Jammy2211 Date: Fri, 25 Sep 2026 16:41:27 +0100 Subject: [PATCH 3/7] fix(#304): rectangular pix2 capture frees Adapt, as production source_pix_2 RAL task 350659_3 (rectangular pix2) died with "Cannot run Nautilus with less than 2 parameters": the rectangular cell froze mass+shear and freed only the Constant coefficient. Every SLaM source_pix_2 on a rectangular mesh uses RectangularBilinearAdaptImage + al.reg.Adapt, so the "production has no rectangular stage" prose was wrong. - nautilus_batches.regularization_class_for(mesh, stage): AdaptSplit on Delaunay (both stages), Adapt on rectangular pix2, Constant on rectangular pix1 (recorded departure). Adapt priors = packaged adapt.yaml (identical to the pipeline's config copy). - capture: stage-threaded class; docstring, priors_source and departures_from_production corrected (rectangular mesh weight_power / weight_floor fixed where source_pix_2 frees them). - replay: fingerprint regularization_class compared against the stage-dependent class the capture freed; S0 identity still checked through regularization_s0_fiducial and the S3 figure of merit. - submit header prose corrected; wall/cell rows untouched. Rectangular pix2 now has 3 free parameters; delaunay pix1 10, pix2 3, rectangular pix1 8 unchanged. Co-Authored-By: Claude Opus 5.5 (1M context) --- ...ed_light_certified_lane_rate_a100_hst_fp64 | 8 ++- .../likelihood_breakdown/fixed_light_trace.py | 18 +++--- .../nautilus_batch_capture.py | 57 ++++++++++++------- .../likelihood_breakdown/nautilus_batches.py | 40 +++++++++---- scripts/misc/test/test_nautilus_batches.py | 11 +++- 5 files changed, 90 insertions(+), 44 deletions(-) diff --git a/hpc/batch_gpu/submit_breakdown_imaging_fixed_light_certified_lane_rate_a100_hst_fp64 b/hpc/batch_gpu/submit_breakdown_imaging_fixed_light_certified_lane_rate_a100_hst_fp64 index 82c7d1e04..570cbf16e 100755 --- a/hpc/batch_gpu/submit_breakdown_imaging_fixed_light_certified_lane_rate_a100_hst_fp64 +++ b/hpc/batch_gpu/submit_breakdown_imaging_fixed_light_certified_lane_rate_a100_hst_fp64 @@ -18,9 +18,11 @@ # --stage pix1 source_pix_1: mass + shear + regularization free, n_live=150 # --stage pix2 source_pix_2: mass + shear fixed, regularization free, n_live=75 # n_batch=20, use_jax_vmap=True, library PDIP. The regularization is FREE with the -# production priors (AdaptSplit inner/outer LogUniform 1e-6..1e6, signal_scale -# Uniform 0..1 on Delaunay; the rectangular cell cannot build AdaptSplit and frees -# its Constant coefficient, LogUniform 1e-6..1e6). The rate plausibly depends on +# production priors (inner/outer LogUniform 1e-6..1e6, signal_scale Uniform 0..1) +# and the production class - AdaptSplit on Delaunay in both stages, Adapt on the +# rectangular pix2 stage as every SLaM source_pix_2 does; rectangular pix1 keeps +# the cell's Constant coefficient, LogUniform 1e-6..1e6, a recorded departure since +# production source_pix_1 frees Adapt there too. The rate plausibly depends on # the regularization through how many pixels sit at the positivity bound, so a # fixed-regularization capture would not answer the question. Capped at # --n-like-max 40000 and --capture-seconds 3600 (about an hour). diff --git a/scripts/imaging/likelihood_breakdown/fixed_light_trace.py b/scripts/imaging/likelihood_breakdown/fixed_light_trace.py index 4a65786f8..7feec6f07 100644 --- a/scripts/imaging/likelihood_breakdown/fixed_light_trace.py +++ b/scripts/imaging/likelihood_breakdown/fixed_light_trace.py @@ -201,8 +201,10 @@ vector inside the trace), so every lane's own regularization reaches the likelihood in both passes; lens light fixed at S3 as in every lane of this cell. The file is refused unless its recorded S3 fingerprint — dataset sha256s, mesh, -source pixels, the regularization CLASS and the S0 fiducial coefficients that -built S3, border relocator, precision and the eager S3 figure of merit +source pixels, the regularization CLASS the capture freed +(``nautilus_batches.regularization_class_for(mesh, stage)``: AdaptSplit on Delaunay, +Constant / Adapt on rectangular pix1 / pix2) and the S0 fiducial scheme and +coefficients that built S3, border relocator, precision and the eager S3 figure of merit (``EQUIVALENCE_RTOL``) — matches the system built here, and unless the rebuilt model's parameter paths equal the capture's, in order. The per-lane regularization coefficients are NOT identity: they are what the lanes vary. Without ``--lanes captured`` nothing below happens, and ``--batches``, @@ -993,6 +995,7 @@ def _sha256(path: Path) -> str: _batches_path = Path(_cell_args.batches) captured = nautilus_batches.load(_batches_path) _fp = captured["meta"]["s3_fingerprint"] + CAPTURED_STAGE = captured["meta"]["stage"] _mismatch = { _key: (_want, _got) for _key, _want, _got in ( @@ -1000,13 +1003,15 @@ def _sha256(path: Path) -> str: ("source_pixels", int(_fp["source_pixels"]), int(n_source_pixels)), ("dataset_sha256", _fp["dataset_sha256"], dataset_sha256), # The regularization COEFFICIENTS are free parameters of the capture (and - # of every replayed lane), so they are not the system's identity; its - # CLASS is, and so is the S0 fiducial the S3 subtraction was built with - # (that lives in log_evidence_s3_library below). + # of every replayed lane), so they are not the system's identity. The + # CLASS the capture freed is — stage-dependent on rectangular (Constant in + # pix1, Adapt in pix2; nautilus_batches.regularization_class_for) — and so + # is the S0 fiducial the S3 subtraction was built with (its scheme and + # coefficients here, its figure of merit in log_evidence_s3_library below). ( "regularization_class", _fp["regularization_class"], - type(regularization).__name__, + nautilus_batches.regularization_class_for(MESH, CAPTURED_STAGE), ), ("regularization_s0_fiducial", _fp["regularization_s0_fiducial"], reg_provenance), ("border_relocator", bool(_fp["border_relocator"]), BORDER_RELOCATOR_RESOLVED), @@ -1033,7 +1038,6 @@ def _sha256(path: Path) -> str: ) # The replay model: the SAME builder the capture used, so a lane vector means # the same parameters here as it did to the sampler. Its order is asserted. - CAPTURED_STAGE = captured["meta"]["stage"] _replay_model = nautilus_batches.capture_model_from( CAPTURED_STAGE, mesh=MESH, diff --git a/scripts/imaging/likelihood_breakdown/nautilus_batch_capture.py b/scripts/imaging/likelihood_breakdown/nautilus_batch_capture.py index 405a869d3..3f7cc3a91 100644 --- a/scripts/imaging/likelihood_breakdown/nautilus_batch_capture.py +++ b/scripts/imaging/likelihood_breakdown/nautilus_batch_capture.py @@ -18,7 +18,7 @@ 1. Builds the phase-B cell's S3 system — the HST dataset, the fixed-light subtraction, the Delaunay (Hilbert, N=1500, AdaptSplit) or rectangular - (39x39, Constant) source — with PART A of ``fixed_light_trace.py`` copied + (39x39 ``RectangularBilinearAdaptImage``, Constant) source — with PART A of ``fixed_light_trace.py`` copied line for line (the house rule of this family: "if a sibling cell's model changes, this cell must change with it"). The replay does not trust the copy: it re-derives the S3 fingerprint recorded here (dataset sha256s, mesh, source @@ -50,25 +50,35 @@ - ``pix1`` (default; production ``source_pix_1``): the lens ``Isothermal`` (centre, ell_comps, einstein_radius) and ``ExternalShear`` free with the phase-B cell's Gaussian priors, AND the regularization free — 10 parameters - on Delaunay, 8 on rectangular. + on Delaunay (``AdaptSplit``), 8 on rectangular (``Constant``). - ``pix2`` (production ``source_pix_2``): the mass and shear FIXED at the S3 - lens (the cell's fiducial values) and only the regularization free. - -The regularization priors are production's: ``AdaptSplit`` inner and outer -coefficient ``LogUniform(1e-6, 1e6)``, ``signal_scale`` ``Uniform(0, 1)`` — the -packaged PyAutoGalaxy ``adapt_split.yaml``, identical to the pipeline's own -config (``nautilus_batches.REGULARIZATION_PRIORS``, set explicitly). The -Delaunay cell already uses ``AdaptSplit`` (its fixed coefficients 0.1 / 10 / 0.1 -are the S0 fit that defines S3, and nothing else). The RECTANGULAR cell uses -``Constant`` and cannot build ``AdaptSplit`` (the rectangular interpolator has no -split cross-points), and production has no rectangular stage, so rectangular -frees the ``Constant`` coefficient with the packaged ``LogUniform(1e-6, 1e6)`` -prior — a recorded deviation. + lens (the cell's fiducial values) and only the regularization free — 3 + parameters on both meshes (``AdaptSplit`` on Delaunay, ``Adapt`` on + rectangular). + +The regularization class is ``nautilus_batches.regularization_class_for(mesh, +stage)``, and its priors are production's (``nautilus_batches.REGULARIZATION_PRIORS``, +set explicitly): inner and outer coefficient ``LogUniform(1e-6, 1e6)``, +``signal_scale`` ``Uniform(0, 1)`` — the packaged PyAutoGalaxy ``adapt_split.yaml`` +/ ``adapt.yaml``, each identical to the pipeline's own config. Delaunay frees +``AdaptSplit`` in both stages, as production (its fixed coefficients 0.1 / 10 / +0.1 are the S0 fit that defines S3, and nothing else). Rectangular ``pix2`` frees +``Adapt``, as every SLaM ``source_pix_2`` on a rectangular mesh does +(``autolens_workspace/scripts/guides/modeling/slam_start_here.py``: +``RectangularBilinearAdaptImage`` + ``al.reg.Adapt``; ``AdaptSplit`` needs split +cross-points the rectangular interpolator does not have). Rectangular ``pix1`` +frees the cell's ``Constant`` coefficient at the packaged ``LogUniform(1e-6, 1e6)`` +— a recorded departure: production ``source_pix_1`` frees ``Adapt`` there too. +The S3 system itself is built with the S0 ``Constant`` either way; ``Adapt`` +reads the same adapt image the cell already hands ``AdaptImages``. Remaining departures from production: mass and shear priors are the cell's, not chained from ``source_lp``; no positions likelihood; the mesh is the cell's (Hilbert 1500 vertices, ``weight_power=1``) in both stages, where ``source_pix_2`` -redraws a 500-vertex Hilbert grid at ``weight_power=3.5`` from the pix1 result. +redraws a 500-vertex Hilbert grid at ``weight_power=3.5`` from the pix1 result; on +rectangular the mesh is the cell's 39x39 ``RectangularBilinearAdaptImage`` at +``weight_power=1``, ``weight_floor=0`` (the production class), fixed, where +``source_pix_2`` also frees its ``weight_power`` / ``weight_floor``. Nautilus is seeded (``--seed``, default 1) so a capture is reproducible; production passes no seed. Quick updates are disabled (they only render the current best fit and never change what Nautilus proposes), and the search's @@ -412,7 +422,7 @@ def _sha256(path: Path) -> str: capture_model = nautilus_batches.capture_model_from( STAGE, mesh=MESH, mesh_obj=mesh_obj, lens_fixed=_s3_lens ) -REGULARIZATION_CLASS = nautilus_batches.regularization_class_for(MESH) +REGULARIZATION_CLASS = nautilus_batches.regularization_class_for(MESH, STAGE) parameter_paths = [".".join(_p) for _p in capture_model.paths] print( f"\n Capture model ({STAGE}): {capture_model.total_free_parameters} free parameters, " @@ -534,8 +544,8 @@ def _library_revision(module) -> dict: "priors": nautilus_batches.REGULARIZATION_PRIORS[REGULARIZATION_CLASS], "priors_source": ( "PyAutoGalaxy packaged config/priors/regularization (adapt_split.yaml / " - "constant.yaml); adapt_split.yaml is identical to " - "euclid_strong_lens_modeling_pipeline/config/priors/regularization/adapt_split.yaml" + "adapt.yaml / constant.yaml); adapt_split.yaml and adapt.yaml are identical to " + "euclid_strong_lens_modeling_pipeline/config/priors/regularization/'s copies" ), }, "s3_fingerprint": { @@ -571,7 +581,16 @@ def _library_revision(module) -> dict: else "mass/shear fixed at the S3 fiducial, not at a source_pix_1 result", "no positions likelihood", "the cell's mesh (Hilbert 1500, weight_power 1) in both stages; source_pix_2 " - "redraws a 500-vertex Hilbert grid at weight_power 3.5", + "redraws a 500-vertex Hilbert grid at weight_power 3.5" + if MESH != "rectangular" + else "the cell's mesh (39x39 RectangularBilinearAdaptImage, weight_power 1, " + "weight_floor 0) fixed in both stages; source_pix_2 frees weight_power / " + "weight_floor", + *( + ["rectangular pix1 frees Constant; production source_pix_1 frees Adapt"] + if (MESH, STAGE) == ("rectangular", "pix1") + else [] + ), "seeded (production passes no seed)", "quick updates disabled (iterations_per_quick_update=1e12; render-only)", "NullPaths: no output directory, so no checkpoint and one Sampler.run call", diff --git a/scripts/misc/likelihood_breakdown/nautilus_batches.py b/scripts/misc/likelihood_breakdown/nautilus_batches.py index 9e8cd3c0b..e580bc852 100644 --- a/scripts/misc/likelihood_breakdown/nautilus_batches.py +++ b/scripts/misc/likelihood_breakdown/nautilus_batches.py @@ -183,8 +183,9 @@ def call_wrap(self, parameters): STAGES = ("pix1", "pix2") #: The production regularization priors. ``AdaptSplit``'s are the packaged -#: PyAutoGalaxy ``config/priors/regularization/adapt_split.yaml``, byte-identical -#: to the pipeline's own ``config/priors/regularization/adapt_split.yaml``; +#: PyAutoGalaxy ``config/priors/regularization/adapt_split.yaml`` and ``Adapt``'s +#: the packaged ``adapt.yaml``, each identical to the pipeline's own +#: ``euclid_strong_lens_modeling_pipeline/config/priors/regularization/`` copy; #: ``Constant``'s are the packaged ``constant.yaml``. Set EXPLICITLY on the model #: so the capture does not depend on which config directory is active. REGULARIZATION_PRIORS = { @@ -193,20 +194,33 @@ def call_wrap(self, parameters): "outer_coefficient": ("LogUniform", 1.0e-6, 1.0e6), "signal_scale": ("Uniform", 0.0, 1.0), }, + "Adapt": { + "inner_coefficient": ("LogUniform", 1.0e-6, 1.0e6), + "outer_coefficient": ("LogUniform", 1.0e-6, 1.0e6), + "signal_scale": ("Uniform", 0.0, 1.0), + }, "Constant": {"coefficient": ("LogUniform", 1.0e-6, 1.0e6)}, } -def regularization_class_for(mesh: str) -> str: - """The regularization class a stage frees on *mesh*. +def regularization_class_for(mesh: str, stage: str) -> str: + """The regularization class *stage* frees on *mesh*. - Delaunay: ``AdaptSplit``, as production (and as the phase-B cell already - uses). Rectangular: ``Constant`` — the cell's class. ``AdaptSplit`` needs the - interpolator's split cross-points (``_mappings_sizes_weights_split``), which - only the Delaunay / KNN / Sibson interpolators define, and production has no - rectangular stage to copy. + Delaunay, both stages: ``AdaptSplit``, as production ``source_pix_1`` / + ``source_pix_2`` (and as the phase-B cell already uses). Rectangular ``pix2``: + ``Adapt``, as every SLaM ``source_pix_2`` on a rectangular mesh + (``autolens_workspace/scripts/guides/modeling/slam_start_here.py``: + ``RectangularBilinearAdaptImage`` + ``al.reg.Adapt``); ``AdaptSplit`` is not an + option there, as it needs the interpolator's split cross-points + (``_mappings_sizes_weights_split``), which only the Delaunay / KNN / Sibson + interpolators define. Rectangular ``pix1``: ``Constant`` — the cell's class, + a recorded departure (production ``source_pix_1`` frees ``Adapt`` there too). """ - return "Constant" if mesh == "rectangular" else "AdaptSplit" + if stage not in STAGES: + raise ValueError(f"unknown stage {stage!r} (want one of {STAGES})") + if mesh != "rectangular": + return "AdaptSplit" + return "Adapt" if stage == "pix2" else "Constant" def capture_model_from(stage: str, *, mesh: str, mesh_obj, lens_fixed): @@ -216,7 +230,9 @@ def capture_model_from(stage: str, *, mesh: str, mesh_obj, lens_fixed): with the phase-B cell's Gaussian priors, AND the regularization free with the production priors. ``pix2`` (production ``source_pix_2``): the lens is *lens_fixed* (the S3 source-only lens — the cell's fiducial mass and shear) and - only the regularization is free. The mesh is the cell's (*mesh_obj*) in both. + only the regularization is free. The regularization class is + :func:`regularization_class_for` (stage-dependent on the rectangular mesh). The + mesh is the cell's (*mesh_obj*) in both. Returns the ``af.Collection``; its ``paths`` order is the capture's ``parameter_paths`` and the replay asserts it is unchanged. @@ -227,7 +243,7 @@ def capture_model_from(stage: str, *, mesh: str, mesh_obj, lens_fixed): if stage not in STAGES: raise ValueError(f"unknown stage {stage!r} (want one of {STAGES})") - reg_name = regularization_class_for(mesh) + reg_name = regularization_class_for(mesh, stage) regularization = af.Model(getattr(al.reg, reg_name)) for attr, (kind, lower, upper) in REGULARIZATION_PRIORS[reg_name].items(): prior_cls = af.LogUniformPrior if kind == "LogUniform" else af.UniformPrior diff --git a/scripts/misc/test/test_nautilus_batches.py b/scripts/misc/test/test_nautilus_batches.py index 510a67348..6bd2d9ba4 100644 --- a/scripts/misc/test/test_nautilus_batches.py +++ b/scripts/misc/test/test_nautilus_batches.py @@ -128,7 +128,7 @@ def test__early_late_split_is_the_median_replayed_call(): ("pix1", "delaunay", 10, 3), ("pix1", "rectangular", 8, 1), ("pix2", "delaunay", 3, 3), - ("pix2", "rectangular", 1, 1), + ("pix2", "rectangular", 3, 3), ], ) def test__capture_model_frees_the_regularization_at_production_priors(stage, mesh, n_free, n_reg): @@ -144,8 +144,13 @@ def test__capture_model_frees_the_regularization_at_production_priors(stage, mes assert model.total_free_parameters == n_free reg = nb.regularization_paths(paths) assert len(reg) == n_reg - expected_cls = "Constant" if mesh == "rectangular" else "AdaptSplit" - assert nb.regularization_class_for(mesh) == expected_cls + expected_cls = { + ("pix1", "rectangular"): "Constant", + ("pix2", "rectangular"): "Adapt", + }.get((stage, mesh), "AdaptSplit") + assert nb.regularization_class_for(mesh, stage) == expected_cls + assert type(model.galaxies.source.pixelization.regularization).__name__ == "Model" + assert model.galaxies.source.pixelization.regularization.cls.__name__ == expected_cls for path in reg: attr = path.rsplit(".", 1)[1] kind, lower, upper = nb.REGULARIZATION_PRIORS[expected_cls][attr] From be01a52b3915f331f883daa8982a0c4b175a08a7 Mon Sep 17 00:00:00 2001 From: Jammy2211 Date: Fri, 25 Sep 2026 17:04:29 +0100 Subject: [PATCH 4/7] fix(#304): forward PyAutoArray #572 `preconditioning`; rectangular pix1 frees Adapt 1. PyAutoArray #572 (07145ea9) added `preconditioning=` to inversion_util.reconstruction_positive_only_from, which the inversion always passes by name. Every harness wrapper that mirrors that signature now accepts it and forwards it only to a library that declares it: library_solver_injection (certified_solver_injected + its PDIP fallback, library_solver_observed), fixed_light_numpy_solvers.numpy_solver_injected, and fixed_light_numba_memo_policy_steps.policy_outer (which also gains the #566 solver/stats keywords it was missing). The certified active-set solve stays on the Jacobi-scaled system, as the library's own does. 2. Rectangular pix1 now frees al.reg.Adapt, as production SLaM source_pix_1 (regularization_init=al.reg.Adapt): regularization_class_for returns Adapt on rectangular in both stages, the unused Constant priors are dropped, and rect pix1 has 10 free parameters (3 Adapt + 7 mass/shear). Existing rectangular captures recorded Constant and are refused by the replay fingerprint; the submit header's two-step prose says to re-capture tasks 1 and 3 first. Co-Authored-By: Claude Opus 5.5 (1M context) --- ...ed_light_certified_lane_rate_a100_hst_fp64 | 11 +++-- .../likelihood_breakdown/fixed_light_trace.py | 7 ++-- .../nautilus_batch_capture.py | 42 +++++++++---------- .../fixed_light_numba_memo_policy_steps.py | 18 ++++++++ .../fixed_light_numpy_solvers.py | 12 +++++- .../library_solver_injection.py | 28 +++++++++++-- .../likelihood_breakdown/nautilus_batches.py | 29 ++++++------- scripts/misc/test/test_nautilus_batches.py | 7 +--- 8 files changed, 96 insertions(+), 58 deletions(-) diff --git a/hpc/batch_gpu/submit_breakdown_imaging_fixed_light_certified_lane_rate_a100_hst_fp64 b/hpc/batch_gpu/submit_breakdown_imaging_fixed_light_certified_lane_rate_a100_hst_fp64 index 570cbf16e..f4bd4b9a8 100755 --- a/hpc/batch_gpu/submit_breakdown_imaging_fixed_light_certified_lane_rate_a100_hst_fp64 +++ b/hpc/batch_gpu/submit_breakdown_imaging_fixed_light_certified_lane_rate_a100_hst_fp64 @@ -19,10 +19,8 @@ # --stage pix2 source_pix_2: mass + shear fixed, regularization free, n_live=75 # n_batch=20, use_jax_vmap=True, library PDIP. The regularization is FREE with the # production priors (inner/outer LogUniform 1e-6..1e6, signal_scale Uniform 0..1) -# and the production class - AdaptSplit on Delaunay in both stages, Adapt on the -# rectangular pix2 stage as every SLaM source_pix_2 does; rectangular pix1 keeps -# the cell's Constant coefficient, LogUniform 1e-6..1e6, a recorded departure since -# production source_pix_1 frees Adapt there too. The rate plausibly depends on +# and the production class - AdaptSplit on Delaunay, Adapt on rectangular, in both +# stages, as every SLaM source_pix_1 / source_pix_2 does. The rate plausibly depends on # the regularization through how many pixels sit at the positivity bound, so a # fixed-regularization capture would not answer the question. Capped at # --n-like-max 40000 and --capture-seconds 3600 (about an hour). @@ -53,6 +51,11 @@ # replay task then refuses to start (FATAL, no npz) — nothing is measured on a stale or # missing capture. # +# Rectangular captures written before the rectangular stages moved to Adapt (both pix1 +# and pix2 now free Adapt, as production does) recorded the Constant class, so the replay +# fingerprint refuses them. Re-capture tasks 1 and 3 before any rectangular replay task +# (5, 7, 20-31, 35-37); the Delaunay captures (tasks 0 and 2) are unaffected. +# # Array tasks # ----------- # task mesh stage pass B solver fallback diff --git a/scripts/imaging/likelihood_breakdown/fixed_light_trace.py b/scripts/imaging/likelihood_breakdown/fixed_light_trace.py index 7feec6f07..3fbb9551c 100644 --- a/scripts/imaging/likelihood_breakdown/fixed_light_trace.py +++ b/scripts/imaging/likelihood_breakdown/fixed_light_trace.py @@ -203,7 +203,7 @@ The file is refused unless its recorded S3 fingerprint — dataset sha256s, mesh, source pixels, the regularization CLASS the capture freed (``nautilus_batches.regularization_class_for(mesh, stage)``: AdaptSplit on Delaunay, -Constant / Adapt on rectangular pix1 / pix2) and the S0 fiducial scheme and +Adapt on rectangular, not the S0 class) and the S0 fiducial scheme and coefficients that built S3, border relocator, precision and the eager S3 figure of merit (``EQUIVALENCE_RTOL``) — matches the system built here, and unless the rebuilt model's parameter paths equal the capture's, in order. The per-lane @@ -1004,9 +1004,8 @@ def _sha256(path: Path) -> str: ("dataset_sha256", _fp["dataset_sha256"], dataset_sha256), # The regularization COEFFICIENTS are free parameters of the capture (and # of every replayed lane), so they are not the system's identity. The - # CLASS the capture freed is — stage-dependent on rectangular (Constant in - # pix1, Adapt in pix2; nautilus_batches.regularization_class_for) — and so - # is the S0 fiducial the S3 subtraction was built with (its scheme and + # CLASS the capture freed is (nautilus_batches.regularization_class_for; + # Adapt on rectangular, not the S0 Constant) — and so is the S0 fiducial the S3 subtraction was built with (its scheme and # coefficients here, its figure of merit in log_evidence_s3_library below). ( "regularization_class", diff --git a/scripts/imaging/likelihood_breakdown/nautilus_batch_capture.py b/scripts/imaging/likelihood_breakdown/nautilus_batch_capture.py index 3f7cc3a91..7f566a503 100644 --- a/scripts/imaging/likelihood_breakdown/nautilus_batch_capture.py +++ b/scripts/imaging/likelihood_breakdown/nautilus_batch_capture.py @@ -18,8 +18,8 @@ 1. Builds the phase-B cell's S3 system — the HST dataset, the fixed-light subtraction, the Delaunay (Hilbert, N=1500, AdaptSplit) or rectangular - (39x39 ``RectangularBilinearAdaptImage``, Constant) source — with PART A of ``fixed_light_trace.py`` copied - line for line (the house rule of this family: "if a sibling cell's model + (39x39 ``RectangularBilinearAdaptImage``, S0 Constant) source — with PART A of + ``fixed_light_trace.py`` copied line for line (the house rule of this family: "if a sibling cell's model changes, this cell must change with it"). The replay does not trust the copy: it re-derives the S3 fingerprint recorded here (dataset sha256s, mesh, source pixels, the regularization CLASS, border relocator, the eager S3 figure of @@ -50,11 +50,10 @@ - ``pix1`` (default; production ``source_pix_1``): the lens ``Isothermal`` (centre, ell_comps, einstein_radius) and ``ExternalShear`` free with the phase-B cell's Gaussian priors, AND the regularization free — 10 parameters - on Delaunay (``AdaptSplit``), 8 on rectangular (``Constant``). + on both meshes (``AdaptSplit`` on Delaunay, ``Adapt`` on rectangular). - ``pix2`` (production ``source_pix_2``): the mass and shear FIXED at the S3 lens (the cell's fiducial values) and only the regularization free — 3 - parameters on both meshes (``AdaptSplit`` on Delaunay, ``Adapt`` on - rectangular). + parameters on both meshes. The regularization class is ``nautilus_batches.regularization_class_for(mesh, stage)``, and its priors are production's (``nautilus_batches.REGULARIZATION_PRIORS``, @@ -62,23 +61,25 @@ ``signal_scale`` ``Uniform(0, 1)`` — the packaged PyAutoGalaxy ``adapt_split.yaml`` / ``adapt.yaml``, each identical to the pipeline's own config. Delaunay frees ``AdaptSplit`` in both stages, as production (its fixed coefficients 0.1 / 10 / -0.1 are the S0 fit that defines S3, and nothing else). Rectangular ``pix2`` frees -``Adapt``, as every SLaM ``source_pix_2`` on a rectangular mesh does -(``autolens_workspace/scripts/guides/modeling/slam_start_here.py``: -``RectangularBilinearAdaptImage`` + ``al.reg.Adapt``; ``AdaptSplit`` needs split -cross-points the rectangular interpolator does not have). Rectangular ``pix1`` -frees the cell's ``Constant`` coefficient at the packaged ``LogUniform(1e-6, 1e6)`` -— a recorded departure: production ``source_pix_1`` frees ``Adapt`` there too. -The S3 system itself is built with the S0 ``Constant`` either way; ``Adapt`` -reads the same adapt image the cell already hands ``AdaptImages``. +0.1 are the S0 fit that defines S3, and nothing else). Rectangular frees +``Adapt`` in both stages, as every SLaM pixelized source stage on a rectangular +mesh does (``autolens_workspace/scripts/guides/modeling/slam_start_here.py``: +``regularization_init=al.reg.Adapt`` for ``source_pix_1``, +``RectangularBilinearAdaptImage`` + ``al.reg.Adapt`` for ``source_pix_2``; +``AdaptSplit`` needs split cross-points the rectangular interpolator does not +have). The S3 system itself is built with the S0 ``Constant`` (coefficient 1.0) +either way; ``Adapt`` reads the same adapt image the cell already hands +``AdaptImages``. Remaining departures from production: mass and shear priors are the cell's, not chained from ``source_lp``; no positions likelihood; the mesh is the cell's (Hilbert 1500 vertices, ``weight_power=1``) in both stages, where ``source_pix_2`` redraws a 500-vertex Hilbert grid at ``weight_power=3.5`` from the pix1 result; on rectangular the mesh is the cell's 39x39 ``RectangularBilinearAdaptImage`` at -``weight_power=1``, ``weight_floor=0`` (the production class), fixed, where -``source_pix_2`` also frees its ``weight_power`` / ``weight_floor``. +``weight_power=1``, ``weight_floor=0`` (the production ``source_pix_2`` class), +fixed, in both stages, where ``source_pix_1`` uses +``RectangularBilinearAdaptDensity`` and ``source_pix_2`` frees ``weight_power`` / +``weight_floor``. Nautilus is seeded (``--seed``, default 1) so a capture is reproducible; production passes no seed. Quick updates are disabled (they only render the current best fit and never change what Nautilus proposes), and the search's @@ -584,13 +585,8 @@ def _library_revision(module) -> dict: "redraws a 500-vertex Hilbert grid at weight_power 3.5" if MESH != "rectangular" else "the cell's mesh (39x39 RectangularBilinearAdaptImage, weight_power 1, " - "weight_floor 0) fixed in both stages; source_pix_2 frees weight_power / " - "weight_floor", - *( - ["rectangular pix1 frees Constant; production source_pix_1 frees Adapt"] - if (MESH, STAGE) == ("rectangular", "pix1") - else [] - ), + "weight_floor 0) fixed in both stages; source_pix_1 uses " + "RectangularBilinearAdaptDensity, source_pix_2 frees weight_power / weight_floor", "seeded (production passes no seed)", "quick updates disabled (iterations_per_quick_update=1e12; render-only)", "NullPaths: no output directory, so no checkpoint and one Sampler.run call", diff --git a/scripts/misc/likelihood_breakdown/fixed_light_numba_memo_policy_steps.py b/scripts/misc/likelihood_breakdown/fixed_light_numba_memo_policy_steps.py index 33b0c701c..effdd4bc3 100644 --- a/scripts/misc/likelihood_breakdown/fixed_light_numba_memo_policy_steps.py +++ b/scripts/misc/likelihood_breakdown/fixed_light_numba_memo_policy_steps.py @@ -7,6 +7,7 @@ from __future__ import annotations import contextlib +import inspect import math import os import time @@ -260,6 +261,11 @@ def policy_get(key: str, n: int): record(score=score, reason=reason, accepted=accepted, elapsed_ns=elapsed_ns) return result + # The library's #566 `solver` / `stats` and #572 `preconditioning` keywords are + # accepted (the inversion passes them by name) and forwarded only to a library + # that declares them. + _outer_params = inspect.signature(original_outer).parameters + def policy_outer( data_vector, curvature_reg_matrix, @@ -267,6 +273,9 @@ def policy_outer( xp=np, fingerprint=None, factor=None, + solver="pdip", + stats=None, + preconditioning="jacobi", ): nonlocal last_memo_snapshot use_policy = ( @@ -301,6 +310,15 @@ def policy_outer( xp=xp, fingerprint=fingerprint, factor=factor, + **{ + name: value + for name, value in ( + ("solver", solver), + ("stats", stats), + ("preconditioning", preconditioning), + ) + if name in _outer_params + }, ) finally: current.pop() diff --git a/scripts/misc/likelihood_breakdown/fixed_light_numpy_solvers.py b/scripts/misc/likelihood_breakdown/fixed_light_numpy_solvers.py index 1e5dd4394..80bb271f6 100644 --- a/scripts/misc/likelihood_breakdown/fixed_light_numpy_solvers.py +++ b/scripts/misc/likelihood_breakdown/fixed_light_numpy_solvers.py @@ -619,8 +619,11 @@ def numpy_solver_injected(solver, *, label: str): # injected kernel *is* the solve, so the library's `solver` choice does not reach # it. The wrapper's keyword must be spelled `solver` (the library passes it by # name), so the injected kernel is held as `injected`. + # PyAutoArray #572's `preconditioning` (the JAX PDIP scaling) is handled the same way. original_forwarded = frozenset( - name for name in ("solver", "stats") if name in inspect.signature(original).parameters + name + for name in ("solver", "stats", "preconditioning") + if name in inspect.signature(original).parameters ) injected = solver @@ -633,13 +636,18 @@ def patched( factor=None, solver="pdip", stats=None, + preconditioning="jacobi", ): if xp.__name__.startswith("jax"): counts["jax"] += 1 kwargs = {} if original_takes_factor: kwargs["factor"] = factor - for name, value in (("solver", solver), ("stats", stats)): + for name, value in ( + ("solver", solver), + ("stats", stats), + ("preconditioning", preconditioning), + ): if name in original_forwarded: kwargs[name] = value return original( diff --git a/scripts/misc/likelihood_breakdown/library_solver_injection.py b/scripts/misc/likelihood_breakdown/library_solver_injection.py index 29262df5d..ca4de16c0 100644 --- a/scripts/misc/likelihood_breakdown/library_solver_injection.py +++ b/scripts/misc/likelihood_breakdown/library_solver_injection.py @@ -207,6 +207,7 @@ def certified_reconstruction_from( fingerprint=None, factor=None, report=None, + preconditioning="jacobi", ): """The certified active-set solve of ``(curvature_reg_matrix, data_vector)``. @@ -218,6 +219,11 @@ def certified_reconstruction_from( iterate is returned unconditionally, which is the shape a batched row must use (see the module docstring). + ``preconditioning`` is the library's PyAutoArray #571/#572 keyword, as the + library passed it. The active-set solve always runs on the Jacobi-scaled + system (as the library's own certified solver does); the keyword is only + forwarded to the PDIP fallback, so a fallback is the library's own call. + ``report`` is an optional ``fn(pass_at_certification, certified)`` host callback (see the module docstring). It changes nothing that is computed; it is an ordered ``jax.debug.callback``, so it serialises the batch and is @@ -253,7 +259,9 @@ def certified_reconstruction_from( # Route (d)'s fallback is the library's PDIP by definition: pin it, so a # library config selecting another positive-only solver cannot change it. - fallback_kwargs = _library_kwargs(original, solver="pdip", stats=None) + fallback_kwargs = _library_kwargs( + original, solver="pdip", stats=None, preconditioning=preconditioning + ) def _library_pdip(): return original( @@ -305,8 +313,8 @@ def certified_solver_injected( original = inversion_util.reconstruction_positive_only_from counts = {"jax": 0, "numpy": 0} - # Read once: which of the #566 keywords the installed library accepts. - forwarded = frozenset(_library_kwargs(original, solver=None, stats=None)) + # Read once: which of the #566 / #572 keywords the installed library accepts. + forwarded = frozenset(_library_kwargs(original, solver=None, stats=None, preconditioning=None)) def patched( data_vector, @@ -317,6 +325,7 @@ def patched( factor=None, solver="pdip", stats=None, + preconditioning="jacobi", ): if not xp.__name__.startswith("jax"): counts["numpy"] += 1 @@ -327,7 +336,15 @@ def patched( xp=xp, fingerprint=fingerprint, factor=factor, - **{k: v for k, v in (("solver", solver), ("stats", stats)) if k in forwarded}, + **{ + k: v + for k, v in ( + ("solver", solver), + ("stats", stats), + ("preconditioning", preconditioning), + ) + if k in forwarded + }, ) counts["jax"] += 1 return certified_reconstruction_from( @@ -342,6 +359,7 @@ def patched( fingerprint=fingerprint, factor=factor, report=report, + preconditioning=preconditioning, ) _assert_signature_covers(original, patched) @@ -397,6 +415,7 @@ def observed( factor=None, solver="pdip", stats=None, + preconditioning="jacobi", ): is_jax = xp.__name__.startswith("jax") local_stats = {} if stats is None else stats @@ -409,6 +428,7 @@ def observed( factor=factor, solver=solver, stats=local_stats, + **_library_kwargs(original, preconditioning=preconditioning), ) if not is_jax: seen["numpy"] += 1 diff --git a/scripts/misc/likelihood_breakdown/nautilus_batches.py b/scripts/misc/likelihood_breakdown/nautilus_batches.py index e580bc852..0ee2dbbc4 100644 --- a/scripts/misc/likelihood_breakdown/nautilus_batches.py +++ b/scripts/misc/likelihood_breakdown/nautilus_batches.py @@ -185,9 +185,9 @@ def call_wrap(self, parameters): #: The production regularization priors. ``AdaptSplit``'s are the packaged #: PyAutoGalaxy ``config/priors/regularization/adapt_split.yaml`` and ``Adapt``'s #: the packaged ``adapt.yaml``, each identical to the pipeline's own -#: ``euclid_strong_lens_modeling_pipeline/config/priors/regularization/`` copy; -#: ``Constant``'s are the packaged ``constant.yaml``. Set EXPLICITLY on the model -#: so the capture does not depend on which config directory is active. +#: ``euclid_strong_lens_modeling_pipeline/config/priors/regularization/`` copy. +#: Set EXPLICITLY on the model so the capture does not depend on which config +#: directory is active. REGULARIZATION_PRIORS = { "AdaptSplit": { "inner_coefficient": ("LogUniform", 1.0e-6, 1.0e6), @@ -199,7 +199,6 @@ def call_wrap(self, parameters): "outer_coefficient": ("LogUniform", 1.0e-6, 1.0e6), "signal_scale": ("Uniform", 0.0, 1.0), }, - "Constant": {"coefficient": ("LogUniform", 1.0e-6, 1.0e6)}, } @@ -207,20 +206,19 @@ def regularization_class_for(mesh: str, stage: str) -> str: """The regularization class *stage* frees on *mesh*. Delaunay, both stages: ``AdaptSplit``, as production ``source_pix_1`` / - ``source_pix_2`` (and as the phase-B cell already uses). Rectangular ``pix2``: - ``Adapt``, as every SLaM ``source_pix_2`` on a rectangular mesh + ``source_pix_2`` (and as the phase-B cell already uses). Rectangular, both + stages: ``Adapt``, as every SLaM pixelized source stage on a rectangular mesh (``autolens_workspace/scripts/guides/modeling/slam_start_here.py``: - ``RectangularBilinearAdaptImage`` + ``al.reg.Adapt``); ``AdaptSplit`` is not an - option there, as it needs the interpolator's split cross-points - (``_mappings_sizes_weights_split``), which only the Delaunay / KNN / Sibson - interpolators define. Rectangular ``pix1``: ``Constant`` — the cell's class, - a recorded departure (production ``source_pix_1`` frees ``Adapt`` there too). + ``regularization_init=al.reg.Adapt`` for ``source_pix_1``, + ``RectangularBilinearAdaptImage`` + ``al.reg.Adapt`` for ``source_pix_2``); + ``AdaptSplit`` is not an option there, as it needs the interpolator's split + cross-points (``_mappings_sizes_weights_split``), which only the Delaunay / + KNN / Sibson interpolators define. Both stages free the same class today; + *stage* is kept so a stage-dependent choice has one place to live. """ if stage not in STAGES: raise ValueError(f"unknown stage {stage!r} (want one of {STAGES})") - if mesh != "rectangular": - return "AdaptSplit" - return "Adapt" if stage == "pix2" else "Constant" + return "Adapt" if mesh == "rectangular" else "AdaptSplit" def capture_model_from(stage: str, *, mesh: str, mesh_obj, lens_fixed): @@ -231,8 +229,7 @@ def capture_model_from(stage: str, *, mesh: str, mesh_obj, lens_fixed): production priors. ``pix2`` (production ``source_pix_2``): the lens is *lens_fixed* (the S3 source-only lens — the cell's fiducial mass and shear) and only the regularization is free. The regularization class is - :func:`regularization_class_for` (stage-dependent on the rectangular mesh). The - mesh is the cell's (*mesh_obj*) in both. + :func:`regularization_class_for`. The mesh is the cell's (*mesh_obj*) in both. Returns the ``af.Collection``; its ``paths`` order is the capture's ``parameter_paths`` and the replay asserts it is unchanged. diff --git a/scripts/misc/test/test_nautilus_batches.py b/scripts/misc/test/test_nautilus_batches.py index 6bd2d9ba4..15268e285 100644 --- a/scripts/misc/test/test_nautilus_batches.py +++ b/scripts/misc/test/test_nautilus_batches.py @@ -126,7 +126,7 @@ def test__early_late_split_is_the_median_replayed_call(): "stage, mesh, n_free, n_reg", [ ("pix1", "delaunay", 10, 3), - ("pix1", "rectangular", 8, 1), + ("pix1", "rectangular", 10, 3), ("pix2", "delaunay", 3, 3), ("pix2", "rectangular", 3, 3), ], @@ -144,10 +144,7 @@ def test__capture_model_frees_the_regularization_at_production_priors(stage, mes assert model.total_free_parameters == n_free reg = nb.regularization_paths(paths) assert len(reg) == n_reg - expected_cls = { - ("pix1", "rectangular"): "Constant", - ("pix2", "rectangular"): "Adapt", - }.get((stage, mesh), "AdaptSplit") + expected_cls = "Adapt" if mesh == "rectangular" else "AdaptSplit" assert nb.regularization_class_for(mesh, stage) == expected_cls assert type(model.galaxies.source.pixelization.regularization).__name__ == "Model" assert model.galaxies.source.pixelization.regularization.cls.__name__ == expected_cls From e38f645811b3690da4fe861f79ef93b29ee4a45b Mon Sep 17 00:00:00 2001 From: Jammy2211 Date: Fri, 25 Sep 2026 19:23:47 +0100 Subject: [PATCH 5/7] =?UTF-8?q?results(#304):=20phase=20C1=20lane-rate=20r?= =?UTF-8?q?eplay=20on=20A100=20(array=20350768)=20=E2=80=94=20gate=20FAILE?= =?UTF-8?q?D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Pull the 28 captured-lane JSONs (4 rate, 24 time) and 24 PNGs of RAL arrays 350766/350768 into results/breakdown/imaging/, add the provenance sidecar results/notes/certified_solver_phase_c1_job350768.json (sacct rows, footers, B=100 OOM and B=50 allocator excerpts, artifact sha256s) and the phase-C1 note. The pre-registered per-lane 1e-9 own-composition gate failed on all 24 timed tasks; B=100 (6 tasks) is the memory-limit row (73-74 GiB allocation in the vmap PDIP reference). Per-lane diagnosis: PDIP/cert+PDIP failures at B<=20 are all on catastrophic lanes (captured logL <= 0) where library PDIP is not reproducible at 1e-9 across separately compiled programs (<= 0.86 nats); certified+none adds the uncertified lanes (passes=16, up to 57 nats). At B=50 jit(vmap) returns wrong values on nearly every lane in all six tasks (the only tasks logging the bfc_allocator 18.3 GiB "not a failure" warning); the gate cannot see it. Rate: 1.9-4.9% uncertified, all in the early half. Policy questions left open. Co-Authored-By: Claude Opus 5.5 --- ..._pix1_hpc_a100_fp64_fixed_light_trace.json | 59202 +++++++++++++++ ..._pix2_hpc_a100_fp64_fixed_light_trace.json | 6406 ++ ...f_b16_hpc_a100_fp64_fixed_light_trace.json | 5795 ++ ...ff_b16_hpc_a100_fp64_fixed_light_trace.png | Bin 0 -> 150446 bytes ...n_b16_hpc_a100_fp64_fixed_light_trace.json | 5799 ++ ...on_b16_hpc_a100_fp64_fixed_light_trace.png | Bin 0 -> 149475 bytes ...n_b16_hpc_a100_fp64_fixed_light_trace.json | 6403 ++ ...on_b16_hpc_a100_fp64_fixed_light_trace.png | Bin 0 -> 167926 bytes ...f_b16_hpc_a100_fp64_fixed_light_trace.json | 6130 ++ ...ff_b16_hpc_a100_fp64_fixed_light_trace.png | Bin 0 -> 154132 bytes ...n_b16_hpc_a100_fp64_fixed_light_trace.json | 6135 ++ ...on_b16_hpc_a100_fp64_fixed_light_trace.png | Bin 0 -> 152910 bytes ...n_b16_hpc_a100_fp64_fixed_light_trace.json | 6726 ++ ...on_b16_hpc_a100_fp64_fixed_light_trace.png | Bin 0 -> 169083 bytes ...f_b16_hpc_a100_fp64_fixed_light_trace.json | 6009 ++ ...ff_b16_hpc_a100_fp64_fixed_light_trace.png | Bin 0 -> 156826 bytes ...n_b16_hpc_a100_fp64_fixed_light_trace.json | 6008 ++ ...on_b16_hpc_a100_fp64_fixed_light_trace.png | Bin 0 -> 157323 bytes ...n_b16_hpc_a100_fp64_fixed_light_trace.json | 6601 ++ ...on_b16_hpc_a100_fp64_fixed_light_trace.png | Bin 0 -> 172886 bytes ...f_b16_hpc_a100_fp64_fixed_light_trace.json | 8478 +++ ...ff_b16_hpc_a100_fp64_fixed_light_trace.png | Bin 0 -> 151285 bytes ...n_b16_hpc_a100_fp64_fixed_light_trace.json | 8483 +++ ...on_b16_hpc_a100_fp64_fixed_light_trace.png | Bin 0 -> 150852 bytes ...n_b16_hpc_a100_fp64_fixed_light_trace.json | 9081 +++ ...on_b16_hpc_a100_fp64_fixed_light_trace.png | Bin 0 -> 169077 bytes ..._pix1_hpc_a100_fp64_fixed_light_trace.json | 61599 ++++++++++++++++ ..._pix2_hpc_a100_fp64_fixed_light_trace.json | 9736 +++ ...f_b16_hpc_a100_fp64_fixed_light_trace.json | 5042 ++ ...ff_b16_hpc_a100_fp64_fixed_light_trace.png | Bin 0 -> 127665 bytes ...n_b16_hpc_a100_fp64_fixed_light_trace.json | 5046 ++ ...on_b16_hpc_a100_fp64_fixed_light_trace.png | Bin 0 -> 126023 bytes ...n_b16_hpc_a100_fp64_fixed_light_trace.json | 5663 ++ ...on_b16_hpc_a100_fp64_fixed_light_trace.png | Bin 0 -> 145475 bytes ...f_b16_hpc_a100_fp64_fixed_light_trace.json | 5391 ++ ...ff_b16_hpc_a100_fp64_fixed_light_trace.png | Bin 0 -> 128188 bytes ...n_b16_hpc_a100_fp64_fixed_light_trace.json | 5395 ++ ...on_b16_hpc_a100_fp64_fixed_light_trace.png | Bin 0 -> 128481 bytes ...n_b16_hpc_a100_fp64_fixed_light_trace.json | 6002 ++ ...on_b16_hpc_a100_fp64_fixed_light_trace.png | Bin 0 -> 146462 bytes ...f_b16_hpc_a100_fp64_fixed_light_trace.json | 5164 ++ ...ff_b16_hpc_a100_fp64_fixed_light_trace.png | Bin 0 -> 131306 bytes ...n_b16_hpc_a100_fp64_fixed_light_trace.json | 5170 ++ ...on_b16_hpc_a100_fp64_fixed_light_trace.png | Bin 0 -> 132138 bytes ...n_b16_hpc_a100_fp64_fixed_light_trace.json | 5787 ++ ...on_b16_hpc_a100_fp64_fixed_light_trace.png | Bin 0 -> 148865 bytes ...f_b16_hpc_a100_fp64_fixed_light_trace.json | 7711 ++ ...ff_b16_hpc_a100_fp64_fixed_light_trace.png | Bin 0 -> 127998 bytes ...n_b16_hpc_a100_fp64_fixed_light_trace.json | 7715 ++ ...on_b16_hpc_a100_fp64_fixed_light_trace.png | Bin 0 -> 130186 bytes ...n_b16_hpc_a100_fp64_fixed_light_trace.json | 8330 +++ ...on_b16_hpc_a100_fp64_fixed_light_trace.png | Bin 0 -> 145649 bytes .../certified_solver_phase_c1_job350768.json | 2721 + ...ified_solver_phase_c1_lane_rate_2026_09.md | 296 + 54 files changed, 294024 insertions(+) create mode 100644 results/breakdown/imaging/fixed_light_trace_delaunay_captured_rate_libcertified_fboff_b16_pix1_hpc_a100_fp64_fixed_light_trace.json create mode 100644 results/breakdown/imaging/fixed_light_trace_delaunay_captured_rate_libcertified_fboff_b16_pix2_hpc_a100_fp64_fixed_light_trace.json create mode 100644 results/breakdown/imaging/fixed_light_trace_delaunay_jitvmap16_captured_pix1_libcertified_fboff_b16_hpc_a100_fp64_fixed_light_trace.json create mode 100644 results/breakdown/imaging/fixed_light_trace_delaunay_jitvmap16_captured_pix1_libcertified_fboff_b16_hpc_a100_fp64_fixed_light_trace.png create mode 100644 results/breakdown/imaging/fixed_light_trace_delaunay_jitvmap16_captured_pix1_libcertified_fbon_b16_hpc_a100_fp64_fixed_light_trace.json create mode 100644 results/breakdown/imaging/fixed_light_trace_delaunay_jitvmap16_captured_pix1_libcertified_fbon_b16_hpc_a100_fp64_fixed_light_trace.png create mode 100644 results/breakdown/imaging/fixed_light_trace_delaunay_jitvmap16_captured_pix1_libpdip_fbon_b16_hpc_a100_fp64_fixed_light_trace.json create mode 100644 results/breakdown/imaging/fixed_light_trace_delaunay_jitvmap16_captured_pix1_libpdip_fbon_b16_hpc_a100_fp64_fixed_light_trace.png create mode 100644 results/breakdown/imaging/fixed_light_trace_delaunay_jitvmap20_captured_pix1_libcertified_fboff_b16_hpc_a100_fp64_fixed_light_trace.json create mode 100644 results/breakdown/imaging/fixed_light_trace_delaunay_jitvmap20_captured_pix1_libcertified_fboff_b16_hpc_a100_fp64_fixed_light_trace.png create mode 100644 results/breakdown/imaging/fixed_light_trace_delaunay_jitvmap20_captured_pix1_libcertified_fbon_b16_hpc_a100_fp64_fixed_light_trace.json create mode 100644 results/breakdown/imaging/fixed_light_trace_delaunay_jitvmap20_captured_pix1_libcertified_fbon_b16_hpc_a100_fp64_fixed_light_trace.png create mode 100644 results/breakdown/imaging/fixed_light_trace_delaunay_jitvmap20_captured_pix1_libpdip_fbon_b16_hpc_a100_fp64_fixed_light_trace.json create mode 100644 results/breakdown/imaging/fixed_light_trace_delaunay_jitvmap20_captured_pix1_libpdip_fbon_b16_hpc_a100_fp64_fixed_light_trace.png create mode 100644 results/breakdown/imaging/fixed_light_trace_delaunay_jitvmap20_captured_pix2_libcertified_fboff_b16_hpc_a100_fp64_fixed_light_trace.json create mode 100644 results/breakdown/imaging/fixed_light_trace_delaunay_jitvmap20_captured_pix2_libcertified_fboff_b16_hpc_a100_fp64_fixed_light_trace.png create mode 100644 results/breakdown/imaging/fixed_light_trace_delaunay_jitvmap20_captured_pix2_libcertified_fbon_b16_hpc_a100_fp64_fixed_light_trace.json create mode 100644 results/breakdown/imaging/fixed_light_trace_delaunay_jitvmap20_captured_pix2_libcertified_fbon_b16_hpc_a100_fp64_fixed_light_trace.png create mode 100644 results/breakdown/imaging/fixed_light_trace_delaunay_jitvmap20_captured_pix2_libpdip_fbon_b16_hpc_a100_fp64_fixed_light_trace.json create mode 100644 results/breakdown/imaging/fixed_light_trace_delaunay_jitvmap20_captured_pix2_libpdip_fbon_b16_hpc_a100_fp64_fixed_light_trace.png create mode 100644 results/breakdown/imaging/fixed_light_trace_delaunay_jitvmap50_captured_pix1_libcertified_fboff_b16_hpc_a100_fp64_fixed_light_trace.json create mode 100644 results/breakdown/imaging/fixed_light_trace_delaunay_jitvmap50_captured_pix1_libcertified_fboff_b16_hpc_a100_fp64_fixed_light_trace.png create mode 100644 results/breakdown/imaging/fixed_light_trace_delaunay_jitvmap50_captured_pix1_libcertified_fbon_b16_hpc_a100_fp64_fixed_light_trace.json create mode 100644 results/breakdown/imaging/fixed_light_trace_delaunay_jitvmap50_captured_pix1_libcertified_fbon_b16_hpc_a100_fp64_fixed_light_trace.png create mode 100644 results/breakdown/imaging/fixed_light_trace_delaunay_jitvmap50_captured_pix1_libpdip_fbon_b16_hpc_a100_fp64_fixed_light_trace.json create mode 100644 results/breakdown/imaging/fixed_light_trace_delaunay_jitvmap50_captured_pix1_libpdip_fbon_b16_hpc_a100_fp64_fixed_light_trace.png create mode 100644 results/breakdown/imaging/fixed_light_trace_rectangular_captured_rate_libcertified_fboff_b16_pix1_hpc_a100_fp64_fixed_light_trace.json create mode 100644 results/breakdown/imaging/fixed_light_trace_rectangular_captured_rate_libcertified_fboff_b16_pix2_hpc_a100_fp64_fixed_light_trace.json create mode 100644 results/breakdown/imaging/fixed_light_trace_rectangular_jitvmap16_captured_pix1_libcertified_fboff_b16_hpc_a100_fp64_fixed_light_trace.json create mode 100644 results/breakdown/imaging/fixed_light_trace_rectangular_jitvmap16_captured_pix1_libcertified_fboff_b16_hpc_a100_fp64_fixed_light_trace.png create mode 100644 results/breakdown/imaging/fixed_light_trace_rectangular_jitvmap16_captured_pix1_libcertified_fbon_b16_hpc_a100_fp64_fixed_light_trace.json create mode 100644 results/breakdown/imaging/fixed_light_trace_rectangular_jitvmap16_captured_pix1_libcertified_fbon_b16_hpc_a100_fp64_fixed_light_trace.png create mode 100644 results/breakdown/imaging/fixed_light_trace_rectangular_jitvmap16_captured_pix1_libpdip_fbon_b16_hpc_a100_fp64_fixed_light_trace.json create mode 100644 results/breakdown/imaging/fixed_light_trace_rectangular_jitvmap16_captured_pix1_libpdip_fbon_b16_hpc_a100_fp64_fixed_light_trace.png create mode 100644 results/breakdown/imaging/fixed_light_trace_rectangular_jitvmap20_captured_pix1_libcertified_fboff_b16_hpc_a100_fp64_fixed_light_trace.json create mode 100644 results/breakdown/imaging/fixed_light_trace_rectangular_jitvmap20_captured_pix1_libcertified_fboff_b16_hpc_a100_fp64_fixed_light_trace.png create mode 100644 results/breakdown/imaging/fixed_light_trace_rectangular_jitvmap20_captured_pix1_libcertified_fbon_b16_hpc_a100_fp64_fixed_light_trace.json create mode 100644 results/breakdown/imaging/fixed_light_trace_rectangular_jitvmap20_captured_pix1_libcertified_fbon_b16_hpc_a100_fp64_fixed_light_trace.png create mode 100644 results/breakdown/imaging/fixed_light_trace_rectangular_jitvmap20_captured_pix1_libpdip_fbon_b16_hpc_a100_fp64_fixed_light_trace.json create mode 100644 results/breakdown/imaging/fixed_light_trace_rectangular_jitvmap20_captured_pix1_libpdip_fbon_b16_hpc_a100_fp64_fixed_light_trace.png create mode 100644 results/breakdown/imaging/fixed_light_trace_rectangular_jitvmap20_captured_pix2_libcertified_fboff_b16_hpc_a100_fp64_fixed_light_trace.json create mode 100644 results/breakdown/imaging/fixed_light_trace_rectangular_jitvmap20_captured_pix2_libcertified_fboff_b16_hpc_a100_fp64_fixed_light_trace.png create mode 100644 results/breakdown/imaging/fixed_light_trace_rectangular_jitvmap20_captured_pix2_libcertified_fbon_b16_hpc_a100_fp64_fixed_light_trace.json create mode 100644 results/breakdown/imaging/fixed_light_trace_rectangular_jitvmap20_captured_pix2_libcertified_fbon_b16_hpc_a100_fp64_fixed_light_trace.png create mode 100644 results/breakdown/imaging/fixed_light_trace_rectangular_jitvmap20_captured_pix2_libpdip_fbon_b16_hpc_a100_fp64_fixed_light_trace.json create mode 100644 results/breakdown/imaging/fixed_light_trace_rectangular_jitvmap20_captured_pix2_libpdip_fbon_b16_hpc_a100_fp64_fixed_light_trace.png create mode 100644 results/breakdown/imaging/fixed_light_trace_rectangular_jitvmap50_captured_pix1_libcertified_fboff_b16_hpc_a100_fp64_fixed_light_trace.json create mode 100644 results/breakdown/imaging/fixed_light_trace_rectangular_jitvmap50_captured_pix1_libcertified_fboff_b16_hpc_a100_fp64_fixed_light_trace.png create mode 100644 results/breakdown/imaging/fixed_light_trace_rectangular_jitvmap50_captured_pix1_libcertified_fbon_b16_hpc_a100_fp64_fixed_light_trace.json create mode 100644 results/breakdown/imaging/fixed_light_trace_rectangular_jitvmap50_captured_pix1_libcertified_fbon_b16_hpc_a100_fp64_fixed_light_trace.png create mode 100644 results/breakdown/imaging/fixed_light_trace_rectangular_jitvmap50_captured_pix1_libpdip_fbon_b16_hpc_a100_fp64_fixed_light_trace.json create mode 100644 results/breakdown/imaging/fixed_light_trace_rectangular_jitvmap50_captured_pix1_libpdip_fbon_b16_hpc_a100_fp64_fixed_light_trace.png create mode 100644 results/notes/certified_solver_phase_c1_job350768.json create mode 100644 results/notes/certified_solver_phase_c1_lane_rate_2026_09.md diff --git a/results/breakdown/imaging/fixed_light_trace_delaunay_captured_rate_libcertified_fboff_b16_pix1_hpc_a100_fp64_fixed_light_trace.json b/results/breakdown/imaging/fixed_light_trace_delaunay_captured_rate_libcertified_fboff_b16_pix1_hpc_a100_fp64_fixed_light_trace.json new file mode 100644 index 000000000..62e1444cf --- /dev/null +++ b/results/breakdown/imaging/fixed_light_trace_delaunay_captured_rate_libcertified_fboff_b16_pix1_hpc_a100_fp64_fixed_light_trace.json @@ -0,0 +1,59202 @@ +{ + "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": null, + "cpu_count": 124, + "jax_compilation_cache_dir": "/mnt/ral/jnightin/autolens_profiling_wt/certified-solver-phase-c1-lane-rate/output/jax_cache/fixed_light_lanerate_delaunay_pix1_rate_20_certified_off_350768_4", + "autotune_cache_entries_at_start": 0, + "cache_fresh": true, + "nvidia_smi": "NVIDIA A100 80GB PCIe, 35443 MiB, 81920 MiB" + }, + "machine": { + "cpu_model": "AMD EPYC 7702 64-Core Processor", + "cpu_count_os": 124, + "nproc": 4, + "nproc_all": 124, + "nproc_note": "GNU nproc honours OMP_NUM_THREADS, so `nproc` can print 1 on a multi-core host; `nproc_all` is the core count.", + "ram_total": "928298200 kB", + "kernel": "5.14.0-687.50.1.el9_8.x86_64", + "platform": "Linux-5.14.0-687.50.1.el9_8.x86_64-x86_64-with-glibc2.34", + "python": "3.12.4", + "jax_thread_env": { + "NPROC": null + }, + "blas_thread_env": { + "OMP_NUM_THREADS": null, + "OPENBLAS_NUM_THREADS": null, + "MKL_NUM_THREADS": null, + "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" + }, + "precision": "fp64", + "configuration": { + "mesh": "delaunay", + "source_pixels": 1500, + "dataset": "hst", + "dataset_sha256": { + "data.fits": "e4e833a28e9c6f6fb023cd85c0d3dde74068720256bc77a240633500e5b04fac", + "noise_map.fits": "315c6266a0acd3ac9c8da82fcd2b45a08697362481fd7a35072bab1658530ba3", + "psf.fits": "8389ba0e8bf4a09b4a561cfc246181a2fb944ed396754cd0ff76fdd22910d303" + }, + "cell_source_sha256": "06a162fcdae6b329384ec33322f443df07215d86e56f0505ac15b3d3473eb432", + "border_relocator_mode": "cell", + "border_relocator": true, + "regularization": { + "scheme": "adapt_split", + "inner_coefficient": 0.1, + "outer_coefficient": 10.0, + "signal_scale": 0.1 + }, + "vmap_batch": 20, + "lanes": "captured", + "captured_pass": "rate", + "batch_sample": null, + "solver_source": "library", + "solver": "certified", + "certified_fallback": "none", + "certified_pass_budget": 16, + "certified_tau_rel": 1e-09, + "use_mixed_precision": false, + "thread_env": { + "n_threads": null, + "vars": [ + "OPENBLAS_NUM_THREADS", + "MKL_NUM_THREADS", + "OMP_NUM_THREADS", + "VECLIB_MAXIMUM_THREADS", + "NUMEXPR_NUM_THREADS" + ], + "set_to": null, + "preexisting": {}, + "overridden": {}, + "note": "Not pinned (legacy variant): recorded as found." + } + }, + "captured": { + "batches_path": "/mnt/ral/jnightin/autolens_profiling_wt/certified-solver-phase-c1-lane-rate/results/breakdown/imaging/nautilus_batches_delaunay_pix1.npz", + "batches_sha256": "e71a5e23026b342d1ff4359b8fb914a87980d8aea0060659d2334dcfa3215c00", + "schema_version": 2, + "n_calls": 932, + "n_lanes": 18640, + "call_sizes_seen": [ + 20 + ], + "calls_by_phase": { + "prior": 15, + "exploration": 917 + }, + "parameter_paths": [ + "galaxies.source.pixelization.regularization.inner_coefficient", + "galaxies.source.pixelization.regularization.outer_coefficient", + "galaxies.source.pixelization.regularization.signal_scale", + "galaxies.lens.mass.centre.centre_0", + "galaxies.lens.mass.centre.centre_1", + "galaxies.lens.mass.einstein_radius", + "galaxies.lens.mass.ell_comps.ell_comps_0", + "galaxies.lens.mass.ell_comps.ell_comps_1", + "galaxies.lens.shear.gamma_1", + "galaxies.lens.shear.gamma_2" + ], + "stage": "pix1", + "regularization": { + "class": "AdaptSplit", + "free": true, + "priors": { + "inner_coefficient": [ + "LogUniform", + 1e-06, + 1000000.0 + ], + "outer_coefficient": [ + "LogUniform", + 1e-06, + 1000000.0 + ], + "signal_scale": [ + "Uniform", + 0.0, + 1.0 + ] + }, + "priors_source": "PyAutoGalaxy packaged config/priors/regularization (adapt_split.yaml / constant.yaml); adapt_split.yaml is identical to euclid_strong_lens_modeling_pipeline/config/priors/regularization/adapt_split.yaml" + }, + "nautilus": { + "departures_from_production": [ + "mass/shear priors are the phase-B cell's Gaussians, not chained from source_lp", + "no positions likelihood", + "the cell's mesh (Hilbert 1500, weight_power 1) in both stages; source_pix_2 redraws a 500-vertex Hilbert grid at weight_power 3.5", + "seeded (production passes no seed)", + "quick updates disabled (iterations_per_quick_update=1e12; render-only)", + "NullPaths: no output directory, so no checkpoint and one Sampler.run call", + "post-fit perform_update skipped (samples / latent variables never built)" + ], + "n_batch": 20, + "n_like_max": 40000, + "n_live": 150, + "number_of_cores": 1, + "production_reference": "euclid_strong_lens_modeling_pipeline/scripts/full_model.py source_pix_1 (n_live=150) / source_pix_2 (n_live=75): af.Nautilus(n_batch=20, **SettingsSearch.search_dict) with use_jax_vmap=True and number_of_cores=1 (SettingsSearch defaults)", + "production_stage": "source_pix_1", + "seed": 1, + "stage": "pix1", + "use_jax_vmap": true, + "version": "1.0.5" + }, + "capture_fit_status": "sampling complete (n_like_max or convergence); post-fit result skipped", + "capture_library_revisions": { + "PyAutoArray": { + "head": "7fa8d2714f7da43fec2b23c31bff580764831670", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoArray" + }, + "PyAutoFit": { + "head": "a736840127be7a3c21e15a5c945e94d8f1082983", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoFit" + }, + "PyAutoGalaxy": { + "head": "70a61e26cd715cefe7012a38285698091246a8a4", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy" + }, + "PyAutoLens": { + "head": "86054bbc19baa2f710a12e04a94fa27ab37cc354", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoLens" + }, + "PyAutoNerves": { + "head": "1fa613aa8d89a79613009fb66f5b4e2d21deb57a", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoNerves" + } + }, + "fingerprint_check": { + "fields": [ + "mesh", + "source_pixels", + "dataset_sha256", + "regularization_class", + "regularization_s0_fiducial", + "border_relocator", + "use_mixed_precision", + "log_evidence_s3_library" + ], + "not_identity": "the regularization coefficients: free per lane since the capture frees them", + "log_evidence_s3_library_rel_diff": 0.0, + "passed": true + } + }, + "rate": { + "pass": "rate", + "solver": "certified", + "certified_fallback": "none", + "certified_pass_budget": 16, + "certified_pass_budget_basis": "config default (Settings().certified_pass_budget)", + "composition": "jax.jit(jax.vmap(fn)) \u2014 the current Fitness._vmap composition", + "chunk_size": 20, + "chunk_rule": "the replayed lanes in capture order, split into chunks of --vmap-batch; the last chunk is padded by repeating its final lane and the padded rows are dropped. At --vmap-batch == n_batch every chunk is exactly one captured Nautilus batch.", + "batch_sample": null, + "stage": "pix1", + "regularization_range": { + "galaxies.source.pixelization.regularization.inner_coefficient": { + "min": 1.0007180966404194e-06, + "max": 797698.1658704937 + }, + "galaxies.source.pixelization.regularization.outer_coefficient": { + "min": 1.0197809368525751e-06, + "max": 994245.7042339334 + }, + "galaxies.source.pixelization.regularization.signal_scale": { + "min": 0.0005176482272193361, + "max": 0.9996966003384972 + } + }, + "calls_replayed": 932, + "calls_rule": "all captured calls", + "report_source": "library solve observed through its stats= out-dict (PyAutoArray #566) and jax.debug.callback(..., ordered=True); untimed; one row per lane checked per chunk", + "traced_solver_kwargs_jax": [ + "certified" + ], + "overall": { + "n_lanes": 18640, + "n_uncertified": 368, + "uncertified_rate": 0.019742489270386267, + "max_passes": 16, + "mean_passes": 2.4495171673819742, + "n_at_budget": 387, + "budget": 16, + "passes_histogram": { + "0": 319, + "1": 1146, + "2": 15166, + "3": 734, + "4": 287, + "5": 174, + "6": 100, + "7": 83, + "8": 54, + "9": 48, + "10": 36, + "11": 25, + "12": 22, + "13": 17, + "14": 26, + "15": 16, + "16": 387 + } + }, + "by_nautilus_phase": { + "prior": { + "n_lanes": 300, + "n_uncertified": 35, + "uncertified_rate": 0.11666666666666667, + "max_passes": 16, + "mean_passes": 3.6766666666666667, + "n_at_budget": 42, + "budget": 16, + "passes_histogram": { + "0": 177, + "1": 12, + "2": 14, + "3": 13, + "4": 5, + "5": 4, + "6": 5, + "7": 8, + "8": 2, + "9": 3, + "10": 3, + "11": 3, + "12": 3, + "13": 1, + "14": 4, + "15": 1, + "16": 42 + } + }, + "exploration": { + "n_lanes": 18340, + "n_uncertified": 333, + "uncertified_rate": 0.01815703380588877, + "max_passes": 16, + "mean_passes": 2.429443838604144, + "n_at_budget": 345, + "budget": 16, + "passes_histogram": { + "0": 142, + "1": 1134, + "2": 15152, + "3": 721, + "4": 282, + "5": 170, + "6": 95, + "7": 75, + "8": 52, + "9": 45, + "10": 33, + "11": 22, + "12": 19, + "13": 16, + "14": 22, + "15": 15, + "16": 345 + } + } + }, + "by_call_half": { + "early": { + "n_lanes": 9320, + "n_uncertified": 368, + "uncertified_rate": 0.039484978540772535, + "max_passes": 16, + "mean_passes": 2.8988197424892705, + "n_at_budget": 387, + "budget": 16, + "passes_histogram": { + "0": 319, + "1": 1136, + "2": 5868, + "3": 722, + "4": 287, + "5": 174, + "6": 100, + "7": 83, + "8": 54, + "9": 48, + "10": 36, + "11": 25, + "12": 22, + "13": 17, + "14": 26, + "15": 16, + "16": 387 + } + }, + "late": { + "n_lanes": 9320, + "n_uncertified": 0, + "uncertified_rate": 0.0, + "max_passes": 3, + "mean_passes": 2.000214592274678, + "n_at_budget": 0, + "budget": 16, + "passes_histogram": { + "1": 10, + "2": 9298, + "3": 12 + } + } + }, + "phase_rule": "by_nautilus_phase: the sampler state when the batch was requested (nautilus_batches.phase_of) \u2014 prior = only the unit-cube bound (prior draws), exploration = more bounds and Sampler.explored False, sampling = explored True. by_call_half: early = call index below the median replayed call index, late = the rest.", + "vs_capture_pdip": { + "reference": "the capture's own figure of merit for the lane: library PDIP through Fitness.call_wrap's jax.jit(jax.vmap(call)) over parameter vectors", + "n_compared": 18552, + "n_excluded_resampled_or_nonfinite": 88, + "max_rel_diff": 0.28143148056401085, + "median_rel_diff": 3.8503027697988626e-13, + "max_abs_diff_nats": 81078.13093022996, + "n_above_lane_rtol": 648, + "n_above_lane_rtol_uncertified": 333, + "lane_rtol": 1e-09, + "gated": false, + "note": "RECORDED, NOT GATED: a cross-composition comparison (Fitness over vectors vs this cell over trees) and, for certified lanes, certified vs PDIP. The gated 1e-9 pin is the timed pass's (same composition, same lanes). It still shows whether a certified_fallback=none lane that FAILED its certificate returned a wrong answer." + }, + "uncertified_pdip_recheck": { + "n_uncertified": 368, + "n_rechecked": 256, + "cap": 256, + "max_rel_diff": 0.0020431399602221546, + "rows": [ + { + "lane_row": 6, + "call_index": 0, + "lane_in_call": 6, + "phase": "prior", + "passes": 16, + "log_likelihood_certified_none": 18838.952634021352, + "log_likelihood_scalar_library_pdip": 18838.95330681149, + "rel_diff": 3.5712713293533995e-08, + "abs_diff_nats": 0.000672790138196433 + }, + { + "lane_row": 11, + "call_index": 0, + "lane_in_call": 11, + "phase": "prior", + "passes": 16, + "log_likelihood_certified_none": 16523.206921884914, + "log_likelihood_scalar_library_pdip": 16521.318352187824, + "rel_diff": 0.00011431107716897429, + "abs_diff_nats": 1.8885696970901336 + }, + { + "lane_row": 24, + "call_index": 1, + "lane_in_call": 4, + "phase": "prior", + "passes": 16, + "log_likelihood_certified_none": 19260.085681203545, + "log_likelihood_scalar_library_pdip": 19259.781506382937, + "rel_diff": 1.579326434767409e-05, + "abs_diff_nats": 0.30417482060875045 + }, + { + "lane_row": 27, + "call_index": 1, + "lane_in_call": 7, + "phase": "prior", + "passes": 16, + "log_likelihood_certified_none": 16820.74128728444, + "log_likelihood_scalar_library_pdip": 16820.741287290806, + "rel_diff": 3.784888432485901e-13, + "abs_diff_nats": 6.366462912410498e-09 + }, + { + "lane_row": 32, + "call_index": 1, + "lane_in_call": 12, + "phase": "prior", + "passes": 16, + "log_likelihood_certified_none": 13277.703343316593, + "log_likelihood_scalar_library_pdip": 13277.68872822231, + "rel_diff": 1.1007257799953265e-06, + "abs_diff_nats": 0.014615094281907659 + }, + { + "lane_row": 51, + "call_index": 2, + "lane_in_call": 11, + "phase": "prior", + "passes": 16, + "log_likelihood_certified_none": 20657.953635196154, + "log_likelihood_scalar_library_pdip": 20656.211309600094, + "rel_diff": 8.434874963011724e-05, + "abs_diff_nats": 1.7423255960602546 + }, + { + "lane_row": 60, + "call_index": 3, + "lane_in_call": 0, + "phase": "prior", + "passes": 16, + "log_likelihood_certified_none": 18040.117061681733, + "log_likelihood_scalar_library_pdip": 18040.13666815689, + "rel_diff": 1.0868252008688257e-06, + "abs_diff_nats": 0.01960647515807068 + }, + { + "lane_row": 84, + "call_index": 4, + "lane_in_call": 4, + "phase": "prior", + "passes": 16, + "log_likelihood_certified_none": 18597.116997657053, + "log_likelihood_scalar_library_pdip": 18597.116992201765, + "rel_diff": 2.933404928686651e-10, + "abs_diff_nats": 5.455287464428693e-06 + }, + { + "lane_row": 86, + "call_index": 4, + "lane_in_call": 6, + "phase": "prior", + "passes": 16, + "log_likelihood_certified_none": 19119.459453652642, + "log_likelihood_scalar_library_pdip": 19122.068286931215, + "rel_diff": 0.00013643049692255217, + "abs_diff_nats": 2.6088332785730017 + }, + { + "lane_row": 91, + "call_index": 4, + "lane_in_call": 11, + "phase": "prior", + "passes": 16, + "log_likelihood_certified_none": 19513.61029910301, + "log_likelihood_scalar_library_pdip": 19513.471687664805, + "rel_diff": 7.1033714770280345e-06, + "abs_diff_nats": 0.13861143820395228 + }, + { + "lane_row": 98, + "call_index": 4, + "lane_in_call": 18, + "phase": "prior", + "passes": 16, + "log_likelihood_certified_none": 21859.545804096797, + "log_likelihood_scalar_library_pdip": 21860.144147246312, + "rel_diff": 2.7371418298287073e-05, + "abs_diff_nats": 0.5983431495151308 + }, + { + "lane_row": 112, + "call_index": 5, + "lane_in_call": 12, + "phase": "prior", + "passes": 16, + "log_likelihood_certified_none": 17672.593850168632, + "log_likelihood_scalar_library_pdip": 17676.733790433493, + "rel_diff": 0.00023420278394987459, + "abs_diff_nats": 4.139940264860343 + }, + { + "lane_row": 115, + "call_index": 5, + "lane_in_call": 15, + "phase": "prior", + "passes": 16, + "log_likelihood_certified_none": 19426.84290931878, + "log_likelihood_scalar_library_pdip": 19426.84290710452, + "rel_diff": 1.1397937634557231e-10, + "abs_diff_nats": 2.214259438915178e-06 + }, + { + "lane_row": 127, + "call_index": 6, + "lane_in_call": 7, + "phase": "prior", + "passes": 16, + "log_likelihood_certified_none": 19544.639833862217, + "log_likelihood_scalar_library_pdip": 19544.639833495832, + "rel_diff": 1.874603404116455e-11, + "abs_diff_nats": 3.663844836410135e-07 + }, + { + "lane_row": 131, + "call_index": 6, + "lane_in_call": 11, + "phase": "prior", + "passes": 16, + "log_likelihood_certified_none": 20688.518723506466, + "log_likelihood_scalar_library_pdip": 20688.756882472582, + "rel_diff": 1.1511516495129938e-05, + "abs_diff_nats": 0.23815896611631615 + }, + { + "lane_row": 133, + "call_index": 6, + "lane_in_call": 13, + "phase": "prior", + "passes": 16, + "log_likelihood_certified_none": 18789.90029990989, + "log_likelihood_scalar_library_pdip": 18789.73948691099, + "rel_diff": 8.558553939076754e-06, + "abs_diff_nats": 0.16081299889992806 + }, + { + "lane_row": 138, + "call_index": 6, + "lane_in_call": 18, + "phase": "prior", + "passes": 16, + "log_likelihood_certified_none": 20503.024814690412, + "log_likelihood_scalar_library_pdip": 20503.419129876398, + "rel_diff": 1.9231679530522176e-05, + "abs_diff_nats": 0.39431518598576076 + }, + { + "lane_row": 145, + "call_index": 7, + "lane_in_call": 5, + "phase": "prior", + "passes": 16, + "log_likelihood_certified_none": 19198.270837349286, + "log_likelihood_scalar_library_pdip": 19198.276709074962, + "rel_diff": 3.058464968024998e-07, + "abs_diff_nats": 0.005871725676115602 + }, + { + "lane_row": 159, + "call_index": 7, + "lane_in_call": 19, + "phase": "prior", + "passes": 16, + "log_likelihood_certified_none": 19538.815749503345, + "log_likelihood_scalar_library_pdip": 19538.80422262944, + "rel_diff": 5.899477662535129e-07, + "abs_diff_nats": 0.011526873906404944 + }, + { + "lane_row": 161, + "call_index": 8, + "lane_in_call": 1, + "phase": "prior", + "passes": 16, + "log_likelihood_certified_none": 18777.519369692578, + "log_likelihood_scalar_library_pdip": 18777.79984700292, + "rel_diff": 1.493664394268388e-05, + "abs_diff_nats": 0.28047731034166645 + }, + { + "lane_row": 162, + "call_index": 8, + "lane_in_call": 2, + "phase": "prior", + "passes": 16, + "log_likelihood_certified_none": 17586.998198308913, + "log_likelihood_scalar_library_pdip": 17577.990889450393, + "rel_diff": 0.0005124197022951788, + "abs_diff_nats": 9.007308858519536 + }, + { + "lane_row": 169, + "call_index": 8, + "lane_in_call": 9, + "phase": "prior", + "passes": 16, + "log_likelihood_certified_none": 2997.581196816718, + "log_likelihood_scalar_library_pdip": 2997.581196918967, + "rel_diff": 3.4110512988677433e-11, + "abs_diff_nats": 1.0224903235211968e-07 + }, + { + "lane_row": 184, + "call_index": 9, + "lane_in_call": 4, + "phase": "prior", + "passes": 16, + "log_likelihood_certified_none": 19178.8375492294, + "log_likelihood_scalar_library_pdip": 19178.158361524027, + "rel_diff": 3.541464683780637e-05, + "abs_diff_nats": 0.6791877053728967 + }, + { + "lane_row": 185, + "call_index": 9, + "lane_in_call": 5, + "phase": "prior", + "passes": 16, + "log_likelihood_certified_none": 19584.820216815635, + "log_likelihood_scalar_library_pdip": 19584.82021377877, + "rel_diff": 1.550621666020177e-10, + "abs_diff_nats": 3.036864654859528e-06 + }, + { + "lane_row": 194, + "call_index": 9, + "lane_in_call": 14, + "phase": "prior", + "passes": 16, + "log_likelihood_certified_none": 12101.442716011574, + "log_likelihood_scalar_library_pdip": 12101.524908058418, + "rel_diff": 6.791875194964254e-06, + "abs_diff_nats": 0.08219204684428405 + }, + { + "lane_row": 210, + "call_index": 10, + "lane_in_call": 10, + "phase": "prior", + "passes": 16, + "log_likelihood_certified_none": 15197.470612442736, + "log_likelihood_scalar_library_pdip": 15196.795342311627, + "rel_diff": 4.44350348805927e-05, + "abs_diff_nats": 0.6752701311088458 + }, + { + "lane_row": 215, + "call_index": 10, + "lane_in_call": 15, + "phase": "prior", + "passes": 16, + "log_likelihood_certified_none": 14818.970964949294, + "log_likelihood_scalar_library_pdip": 14818.970964617569, + "rel_diff": 2.2385188576041694e-11, + "abs_diff_nats": 3.3172545954585075e-07 + }, + { + "lane_row": 216, + "call_index": 10, + "lane_in_call": 16, + "phase": "prior", + "passes": 16, + "log_likelihood_certified_none": 17980.755954764845, + "log_likelihood_scalar_library_pdip": 17979.73890336924, + "rel_diff": 5.6566527526884385e-05, + "abs_diff_nats": 1.0170513956036302 + }, + { + "lane_row": 222, + "call_index": 11, + "lane_in_call": 2, + "phase": "prior", + "passes": 16, + "log_likelihood_certified_none": 22073.09316163139, + "log_likelihood_scalar_library_pdip": 22072.697677031945, + "rel_diff": 1.7917365844068342e-05, + "abs_diff_nats": 0.3954845994448988 + }, + { + "lane_row": 238, + "call_index": 11, + "lane_in_call": 18, + "phase": "prior", + "passes": 16, + "log_likelihood_certified_none": 16048.782933223934, + "log_likelihood_scalar_library_pdip": 16050.234911212749, + "rel_diff": 9.046459424714224e-05, + "abs_diff_nats": 1.4519779888141784 + }, + { + "lane_row": 241, + "call_index": 12, + "lane_in_call": 1, + "phase": "prior", + "passes": 16, + "log_likelihood_certified_none": 18820.11688643777, + "log_likelihood_scalar_library_pdip": 18827.258395130197, + "rel_diff": 0.00037931750563721135, + "abs_diff_nats": 7.141508692428033 + }, + { + "lane_row": 253, + "call_index": 12, + "lane_in_call": 13, + "phase": "prior", + "passes": 16, + "log_likelihood_certified_none": 18841.998074266252, + "log_likelihood_scalar_library_pdip": 18841.8820286601, + "rel_diff": 6.158917987868002e-06, + "abs_diff_nats": 0.11604560615160153 + }, + { + "lane_row": 256, + "call_index": 12, + "lane_in_call": 16, + "phase": "prior", + "passes": 16, + "log_likelihood_certified_none": 17925.220470759377, + "log_likelihood_scalar_library_pdip": 17926.99550400996, + "rel_diff": 9.901454207343394e-05, + "abs_diff_nats": 1.7750332505820552 + }, + { + "lane_row": 276, + "call_index": 13, + "lane_in_call": 16, + "phase": "prior", + "passes": 16, + "log_likelihood_certified_none": 18604.202809554543, + "log_likelihood_scalar_library_pdip": 18601.915683132407, + "rel_diff": 0.00012295112294319558, + "abs_diff_nats": 2.2871264221357706 + }, + { + "lane_row": 283, + "call_index": 14, + "lane_in_call": 3, + "phase": "prior", + "passes": 16, + "log_likelihood_certified_none": 19548.90300039443, + "log_likelihood_scalar_library_pdip": 19548.487167306175, + "rel_diff": 2.127188076998286e-05, + "abs_diff_nats": 0.4158330882564769 + }, + { + "lane_row": 301, + "call_index": 15, + "lane_in_call": 1, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 20552.706459416004, + "log_likelihood_scalar_library_pdip": 20551.004887772564, + "rel_diff": 8.279749105856236e-05, + "abs_diff_nats": 1.70157164343982 + }, + { + "lane_row": 311, + "call_index": 15, + "lane_in_call": 11, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 18959.672781158308, + "log_likelihood_scalar_library_pdip": 18957.52834975746, + "rel_diff": 0.00011311766815187777, + "abs_diff_nats": 2.1444314008476795 + }, + { + "lane_row": 314, + "call_index": 15, + "lane_in_call": 14, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 11129.438563023068, + "log_likelihood_scalar_library_pdip": 11126.921475785763, + "rel_diff": 0.00022621596124167666, + "abs_diff_nats": 2.5170872373055317 + }, + { + "lane_row": 315, + "call_index": 15, + "lane_in_call": 15, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 20407.7806549969, + "log_likelihood_scalar_library_pdip": 20410.34397371976, + "rel_diff": 0.00012558919762254195, + "abs_diff_nats": 2.563318722859549 + }, + { + "lane_row": 317, + "call_index": 15, + "lane_in_call": 17, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 19481.580998496996, + "log_likelihood_scalar_library_pdip": 19481.557217641563, + "rel_diff": 1.220685552402098e-06, + "abs_diff_nats": 0.023780855433869874 + }, + { + "lane_row": 318, + "call_index": 15, + "lane_in_call": 18, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 18817.121700992862, + "log_likelihood_scalar_library_pdip": 18812.946857997056, + "rel_diff": 0.00022191329339940431, + "abs_diff_nats": 4.174842995806102 + }, + { + "lane_row": 319, + "call_index": 15, + "lane_in_call": 19, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 16927.857229255307, + "log_likelihood_scalar_library_pdip": 16927.63254956882, + "rel_diff": 1.32729539011253e-05, + "abs_diff_nats": 0.2246796864856151 + }, + { + "lane_row": 322, + "call_index": 16, + "lane_in_call": 2, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 17853.264769854122, + "log_likelihood_scalar_library_pdip": 17852.91967933103, + "rel_diff": 1.9329640713752443e-05, + "abs_diff_nats": 0.3450905230929493 + }, + { + "lane_row": 329, + "call_index": 16, + "lane_in_call": 9, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 15883.222766173763, + "log_likelihood_scalar_library_pdip": 15888.261826774295, + "rel_diff": 0.0003171561908703944, + "abs_diff_nats": 5.039060600531229 + }, + { + "lane_row": 331, + "call_index": 16, + "lane_in_call": 11, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 19181.833418679766, + "log_likelihood_scalar_library_pdip": 19182.855515516767, + "rel_diff": 5.3281787801328045e-05, + "abs_diff_nats": 1.0220968370012997 + }, + { + "lane_row": 333, + "call_index": 16, + "lane_in_call": 13, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 15902.15093470096, + "log_likelihood_scalar_library_pdip": 15902.910586796046, + "rel_diff": 4.776811709657868e-05, + "abs_diff_nats": 0.7596520950864942 + }, + { + "lane_row": 335, + "call_index": 16, + "lane_in_call": 15, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 18756.824767787177, + "log_likelihood_scalar_library_pdip": 18757.07135339752, + "rel_diff": 1.3146274580856535e-05, + "abs_diff_nats": 0.24658561034448212 + }, + { + "lane_row": 336, + "call_index": 16, + "lane_in_call": 16, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 11735.125602989006, + "log_likelihood_scalar_library_pdip": 11735.12560234069, + "rel_diff": 5.5245844758993176e-11, + "abs_diff_nats": 6.483169272542e-07 + }, + { + "lane_row": 338, + "call_index": 16, + "lane_in_call": 18, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 18932.585368953885, + "log_likelihood_scalar_library_pdip": 18932.692618873218, + "rel_diff": 5.664800115408637e-06, + "abs_diff_nats": 0.10724991933238925 + }, + { + "lane_row": 340, + "call_index": 17, + "lane_in_call": 0, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 13403.270057699687, + "log_likelihood_scalar_library_pdip": 13398.840222654067, + "rel_diff": 0.0003306133196610196, + "abs_diff_nats": 4.429835045619257 + }, + { + "lane_row": 341, + "call_index": 17, + "lane_in_call": 1, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 19660.94108185915, + "log_likelihood_scalar_library_pdip": 19660.903121954405, + "rel_diff": 1.9307304709848767e-06, + "abs_diff_nats": 0.03795990474463906 + }, + { + "lane_row": 345, + "call_index": 17, + "lane_in_call": 5, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 19903.28817967307, + "log_likelihood_scalar_library_pdip": 19903.394044771638, + "rel_diff": 5.318947026352309e-06, + "abs_diff_nats": 0.10586509856875637 + }, + { + "lane_row": 346, + "call_index": 17, + "lane_in_call": 6, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 19139.791232693067, + "log_likelihood_scalar_library_pdip": 19139.565581617124, + "rel_diff": 1.1789769991445906e-05, + "abs_diff_nats": 0.22565107594346046 + }, + { + "lane_row": 354, + "call_index": 17, + "lane_in_call": 14, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 23371.740940218002, + "log_likelihood_scalar_library_pdip": 23371.67368934279, + "rel_diff": 2.8774522571360952e-06, + "abs_diff_nats": 0.0672508752104477 + }, + { + "lane_row": 355, + "call_index": 17, + "lane_in_call": 15, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 22070.848474229504, + "log_likelihood_scalar_library_pdip": 22074.325684181036, + "rel_diff": 0.00015752281638319667, + "abs_diff_nats": 3.4772099515321315 + }, + { + "lane_row": 357, + "call_index": 17, + "lane_in_call": 17, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 15663.503863185775, + "log_likelihood_scalar_library_pdip": 15643.416441637419, + "rel_diff": 0.001284081493534272, + "abs_diff_nats": 20.08742154835636 + }, + { + "lane_row": 363, + "call_index": 18, + "lane_in_call": 3, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 18903.428002036104, + "log_likelihood_scalar_library_pdip": 18902.66367518641, + "rel_diff": 4.043487536084018e-05, + "abs_diff_nats": 0.7643268496940436 + }, + { + "lane_row": 364, + "call_index": 18, + "lane_in_call": 4, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 19422.13372551884, + "log_likelihood_scalar_library_pdip": 19425.0578927202, + "rel_diff": 0.00015053582941729066, + "abs_diff_nats": 2.9241672013595235 + }, + { + "lane_row": 370, + "call_index": 18, + "lane_in_call": 10, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 19494.608664681902, + "log_likelihood_scalar_library_pdip": 19495.201507307527, + "rel_diff": 3.0409669035882172e-05, + "abs_diff_nats": 0.5928426256250532 + }, + { + "lane_row": 373, + "call_index": 18, + "lane_in_call": 13, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 11787.035422616056, + "log_likelihood_scalar_library_pdip": 11787.035422591041, + "rel_diff": 2.1222250872021087e-12, + "abs_diff_nats": 2.5014742277562618e-08 + }, + { + "lane_row": 376, + "call_index": 18, + "lane_in_call": 16, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 19825.997636586693, + "log_likelihood_scalar_library_pdip": 19825.989973034266, + "rel_diff": 3.8654071942060997e-07, + "abs_diff_nats": 0.007663552427402465 + }, + { + "lane_row": 379, + "call_index": 18, + "lane_in_call": 19, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 18432.13466791899, + "log_likelihood_scalar_library_pdip": 18432.36616258826, + "rel_diff": 1.2559140114154269e-05, + "abs_diff_nats": 0.231494669271342 + }, + { + "lane_row": 380, + "call_index": 19, + "lane_in_call": 0, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 18755.41398961148, + "log_likelihood_scalar_library_pdip": 18755.107459157654, + "rel_diff": 1.6343838844564488e-05, + "abs_diff_nats": 0.306530453824962 + }, + { + "lane_row": 384, + "call_index": 19, + "lane_in_call": 4, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 18151.412563408263, + "log_likelihood_scalar_library_pdip": 18153.656896982942, + "rel_diff": 0.0001236298332294872, + "abs_diff_nats": 2.244333574679331 + }, + { + "lane_row": 386, + "call_index": 19, + "lane_in_call": 6, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 20730.45379651614, + "log_likelihood_scalar_library_pdip": 20729.996889304697, + "rel_diff": 2.2040872166192836e-05, + "abs_diff_nats": 0.45690721144273994 + }, + { + "lane_row": 387, + "call_index": 19, + "lane_in_call": 7, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 19553.684501017524, + "log_likelihood_scalar_library_pdip": 19554.334856701782, + "rel_diff": 3.325890085364924e-05, + "abs_diff_nats": 0.650355684258102 + }, + { + "lane_row": 388, + "call_index": 19, + "lane_in_call": 8, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 20090.179845092665, + "log_likelihood_scalar_library_pdip": 20090.015000771946, + "rel_diff": 8.205286094272845e-06, + "abs_diff_nats": 0.1648443207195669 + }, + { + "lane_row": 391, + "call_index": 19, + "lane_in_call": 11, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 17150.51098148531, + "log_likelihood_scalar_library_pdip": 17146.762735295648, + "rel_diff": 0.00021859789206425721, + "abs_diff_nats": 3.748246189661586 + }, + { + "lane_row": 395, + "call_index": 19, + "lane_in_call": 15, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 18886.99601434199, + "log_likelihood_scalar_library_pdip": 18886.988195662016, + "rel_diff": 4.1397177209220707e-07, + "abs_diff_nats": 0.007818679972842801 + }, + { + "lane_row": 405, + "call_index": 20, + "lane_in_call": 5, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 15239.353996783815, + "log_likelihood_scalar_library_pdip": 15239.35399455257, + "rel_diff": 1.464133691469511e-10, + "abs_diff_nats": 2.2312451619654894e-06 + }, + { + "lane_row": 406, + "call_index": 20, + "lane_in_call": 6, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 19243.315566557958, + "log_likelihood_scalar_library_pdip": 19242.74940825397, + "rel_diff": 2.942190286718979e-05, + "abs_diff_nats": 0.5661583039873221 + }, + { + "lane_row": 407, + "call_index": 20, + "lane_in_call": 7, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 17606.274560462167, + "log_likelihood_scalar_library_pdip": 17606.18507862347, + "rel_diff": 5.08240929511237e-06, + "abs_diff_nats": 0.08948183869506465 + }, + { + "lane_row": 409, + "call_index": 20, + "lane_in_call": 9, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 17311.20223080038, + "log_likelihood_scalar_library_pdip": 17305.940399254658, + "rel_diff": 0.0003040477098805164, + "abs_diff_nats": 5.261831545722089 + }, + { + "lane_row": 410, + "call_index": 20, + "lane_in_call": 10, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 14047.929631998715, + "log_likelihood_scalar_library_pdip": 14047.929557770647, + "rel_diff": 5.28391517126666e-09, + "abs_diff_nats": 7.422806811518967e-05 + }, + { + "lane_row": 411, + "call_index": 20, + "lane_in_call": 11, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 19569.122195179043, + "log_likelihood_scalar_library_pdip": 19569.107535428113, + "rel_diff": 7.491272099971793e-07, + "abs_diff_nats": 0.01465975093015004 + }, + { + "lane_row": 413, + "call_index": 20, + "lane_in_call": 13, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 19749.133191812172, + "log_likelihood_scalar_library_pdip": 19749.27623898889, + "rel_diff": 7.243160457384567e-06, + "abs_diff_nats": 0.14304717671620892 + }, + { + "lane_row": 415, + "call_index": 20, + "lane_in_call": 15, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 19279.164335583388, + "log_likelihood_scalar_library_pdip": 19278.984184532776, + "rel_diff": 9.344426495072896e-06, + "abs_diff_nats": 0.1801510506120394 + }, + { + "lane_row": 418, + "call_index": 20, + "lane_in_call": 18, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 8752.542946706657, + "log_likelihood_scalar_library_pdip": 8752.023752705085, + "rel_diff": 5.932273680262339e-05, + "abs_diff_nats": 0.519194001572032 + }, + { + "lane_row": 421, + "call_index": 21, + "lane_in_call": 1, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 20219.993915791147, + "log_likelihood_scalar_library_pdip": 20220.409243226597, + "rel_diff": 2.054001135458888e-05, + "abs_diff_nats": 0.41532743545030826 + }, + { + "lane_row": 426, + "call_index": 21, + "lane_in_call": 6, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 16309.599609431902, + "log_likelihood_scalar_library_pdip": 16309.590599877069, + "rel_diff": 5.524083990861267e-07, + "abs_diff_nats": 0.009009554833028233 + }, + { + "lane_row": 427, + "call_index": 21, + "lane_in_call": 7, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 19597.767639653342, + "log_likelihood_scalar_library_pdip": 19597.5719439425, + "rel_diff": 9.985712077045347e-06, + "abs_diff_nats": 0.1956957108413917 + }, + { + "lane_row": 429, + "call_index": 21, + "lane_in_call": 9, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 20369.001851457073, + "log_likelihood_scalar_library_pdip": 20365.64296239446, + "rel_diff": 0.00016492919319142956, + "abs_diff_nats": 3.358889062612434 + }, + { + "lane_row": 431, + "call_index": 21, + "lane_in_call": 11, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 18468.11071199973, + "log_likelihood_scalar_library_pdip": 18467.882680559003, + "rel_diff": 1.234745989400096e-05, + "abs_diff_nats": 0.22803144072531722 + }, + { + "lane_row": 437, + "call_index": 21, + "lane_in_call": 17, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 15923.310599247081, + "log_likelihood_scalar_library_pdip": 15921.026476740488, + "rel_diff": 0.0001434657815518406, + "abs_diff_nats": 2.284122506593121 + }, + { + "lane_row": 438, + "call_index": 21, + "lane_in_call": 18, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 18639.75314353759, + "log_likelihood_scalar_library_pdip": 18639.51857088619, + "rel_diff": 1.2584694744524766e-05, + "abs_diff_nats": 0.23457265139950323 + }, + { + "lane_row": 445, + "call_index": 22, + "lane_in_call": 5, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 19131.929346868485, + "log_likelihood_scalar_library_pdip": 19131.12395098933, + "rel_diff": 4.209872254325739e-05, + "abs_diff_nats": 0.805395879153366 + }, + { + "lane_row": 446, + "call_index": 22, + "lane_in_call": 6, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 17347.80235890946, + "log_likelihood_scalar_library_pdip": 17347.802835782, + "rel_diff": 2.748893019474454e-08, + "abs_diff_nats": 0.0004768725411850028 + }, + { + "lane_row": 451, + "call_index": 22, + "lane_in_call": 11, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 4423.308943365133, + "log_likelihood_scalar_library_pdip": 4423.194929103338, + "rel_diff": 2.5776449743354224e-05, + "abs_diff_nats": 0.11401426179509144 + }, + { + "lane_row": 455, + "call_index": 22, + "lane_in_call": 15, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 17004.13415215286, + "log_likelihood_scalar_library_pdip": 17003.376674467134, + "rel_diff": 4.454866231734529e-05, + "abs_diff_nats": 0.7574776857254619 + }, + { + "lane_row": 459, + "call_index": 22, + "lane_in_call": 19, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 19149.45020229627, + "log_likelihood_scalar_library_pdip": 19149.45495517933, + "rel_diff": 2.4819939121021995e-07, + "abs_diff_nats": 0.00475288306188304 + }, + { + "lane_row": 460, + "call_index": 23, + "lane_in_call": 0, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 21303.194927261684, + "log_likelihood_scalar_library_pdip": 21303.86468430847, + "rel_diff": 3.143828862567942e-05, + "abs_diff_nats": 0.6697570467877085 + }, + { + "lane_row": 462, + "call_index": 23, + "lane_in_call": 2, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 21917.7878935114, + "log_likelihood_scalar_library_pdip": 21917.787632350315, + "rel_diff": 1.1915485625314282e-08, + "abs_diff_nats": 0.0002611610834719613 + }, + { + "lane_row": 465, + "call_index": 23, + "lane_in_call": 5, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 19183.119744290747, + "log_likelihood_scalar_library_pdip": 19183.116509326974, + "rel_diff": 1.686359863146181e-07, + "abs_diff_nats": 0.0032349637731385883 + }, + { + "lane_row": 467, + "call_index": 23, + "lane_in_call": 7, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 20996.497964086397, + "log_likelihood_scalar_library_pdip": 20995.64933214846, + "rel_diff": 4.041941854295255e-05, + "abs_diff_nats": 0.8486319379371707 + }, + { + "lane_row": 468, + "call_index": 23, + "lane_in_call": 8, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 18276.585694376223, + "log_likelihood_scalar_library_pdip": 18276.585692869452, + "rel_diff": 8.244268440967576e-11, + "abs_diff_nats": 1.5067707863636315e-06 + }, + { + "lane_row": 474, + "call_index": 23, + "lane_in_call": 14, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 22905.60784652603, + "log_likelihood_scalar_library_pdip": 22905.607672801176, + "rel_diff": 7.584380888995531e-09, + "abs_diff_nats": 0.00017372485308442265 + }, + { + "lane_row": 475, + "call_index": 23, + "lane_in_call": 15, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 16841.03837229394, + "log_likelihood_scalar_library_pdip": 16837.93023644892, + "rel_diff": 0.00018459132454966883, + "abs_diff_nats": 3.1081358450210246 + }, + { + "lane_row": 476, + "call_index": 23, + "lane_in_call": 16, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 19502.15467043128, + "log_likelihood_scalar_library_pdip": 19500.221611839497, + "rel_diff": 9.91300832503255e-05, + "abs_diff_nats": 1.933058591781446 + }, + { + "lane_row": 479, + "call_index": 23, + "lane_in_call": 19, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 18424.562308945948, + "log_likelihood_scalar_library_pdip": 18423.86590187024, + "rel_diff": 3.779918283267232e-05, + "abs_diff_nats": 0.6964070757094305 + }, + { + "lane_row": 482, + "call_index": 24, + "lane_in_call": 2, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 18233.16122868311, + "log_likelihood_scalar_library_pdip": 18233.16122725294, + "rel_diff": 7.843802425454609e-11, + "abs_diff_nats": 1.4301731425803155e-06 + }, + { + "lane_row": 485, + "call_index": 24, + "lane_in_call": 5, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 12362.936804278703, + "log_likelihood_scalar_library_pdip": 12359.91836325603, + "rel_diff": 0.00024421205172724846, + "abs_diff_nats": 3.01844102267205 + }, + { + "lane_row": 486, + "call_index": 24, + "lane_in_call": 6, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 12848.351030690515, + "log_likelihood_scalar_library_pdip": 12844.532871217212, + "rel_diff": 0.0002972595042252721, + "abs_diff_nats": 3.81815947330324 + }, + { + "lane_row": 487, + "call_index": 24, + "lane_in_call": 7, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 19273.843550296144, + "log_likelihood_scalar_library_pdip": 19273.837877258098, + "rel_diff": 2.9433878617069415e-07, + "abs_diff_nats": 0.0056730380456428975 + }, + { + "lane_row": 488, + "call_index": 24, + "lane_in_call": 8, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 22440.555101526254, + "log_likelihood_scalar_library_pdip": 22440.55510152754, + "rel_diff": 5.738915512044539e-14, + "abs_diff_nats": 1.2878444977104664e-09 + }, + { + "lane_row": 493, + "call_index": 24, + "lane_in_call": 13, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 18999.453484991922, + "log_likelihood_scalar_library_pdip": 18999.2472749116, + "rel_diff": 1.085359211022619e-05, + "abs_diff_nats": 0.20621008032321697 + }, + { + "lane_row": 495, + "call_index": 24, + "lane_in_call": 15, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 22212.448006471663, + "log_likelihood_scalar_library_pdip": 22212.44805691014, + "rel_diff": 2.270730219259369e-09, + "abs_diff_nats": 5.043847704655491e-05 + }, + { + "lane_row": 497, + "call_index": 24, + "lane_in_call": 17, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 17372.83241718437, + "log_likelihood_scalar_library_pdip": 17375.909264047375, + "rel_diff": 0.00017707544487304786, + "abs_diff_nats": 3.076846863004903 + }, + { + "lane_row": 498, + "call_index": 24, + "lane_in_call": 18, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 19245.368418545728, + "log_likelihood_scalar_library_pdip": 19245.36984751212, + "rel_diff": 7.424987950818303e-08, + "abs_diff_nats": 0.0014289663922681939 + }, + { + "lane_row": 499, + "call_index": 24, + "lane_in_call": 19, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 19550.808828035846, + "log_likelihood_scalar_library_pdip": 19552.13682428083, + "rel_diff": 6.792077290170877e-05, + "abs_diff_nats": 1.3279962449851155 + }, + { + "lane_row": 500, + "call_index": 25, + "lane_in_call": 0, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 20689.618820849428, + "log_likelihood_scalar_library_pdip": 20689.6340610091, + "rel_diff": 7.366084690807482e-07, + "abs_diff_nats": 0.015240159671520814 + }, + { + "lane_row": 501, + "call_index": 25, + "lane_in_call": 1, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 20057.506861632486, + "log_likelihood_scalar_library_pdip": 20058.409152444572, + "rel_diff": 4.4983169165039655e-05, + "abs_diff_nats": 0.9022908120859938 + }, + { + "lane_row": 503, + "call_index": 25, + "lane_in_call": 3, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 17817.864983755615, + "log_likelihood_scalar_library_pdip": 17814.50391893646, + "rel_diff": 0.00018867013274395216, + "abs_diff_nats": 3.3610648191533983 + }, + { + "lane_row": 504, + "call_index": 25, + "lane_in_call": 4, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 19835.30079737337, + "log_likelihood_scalar_library_pdip": 19835.300594190325, + "rel_diff": 1.0243507202726808e-08, + "abs_diff_nats": 0.00020318304450483993 + }, + { + "lane_row": 505, + "call_index": 25, + "lane_in_call": 5, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 17858.455952731332, + "log_likelihood_scalar_library_pdip": 17861.161604809495, + "rel_diff": 0.000151482425277087, + "abs_diff_nats": 2.7056520781625295 + }, + { + "lane_row": 506, + "call_index": 25, + "lane_in_call": 6, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 22054.690384221267, + "log_likelihood_scalar_library_pdip": 22053.711382242836, + "rel_diff": 4.4391710830982e-05, + "abs_diff_nats": 0.9790019784304604 + }, + { + "lane_row": 507, + "call_index": 25, + "lane_in_call": 7, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 19515.839830029123, + "log_likelihood_scalar_library_pdip": 19518.56754351547, + "rel_diff": 0.00013974967580309281, + "abs_diff_nats": 2.7277134863470565 + }, + { + "lane_row": 508, + "call_index": 25, + "lane_in_call": 8, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 15736.389542964673, + "log_likelihood_scalar_library_pdip": 15735.671678263912, + "rel_diff": 4.5620213451199946e-05, + "abs_diff_nats": 0.7178647007604013 + }, + { + "lane_row": 510, + "call_index": 25, + "lane_in_call": 10, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 19195.003296143135, + "log_likelihood_scalar_library_pdip": 19194.477621970538, + "rel_diff": 2.738674023591883e-05, + "abs_diff_nats": 0.5256741725970642 + }, + { + "lane_row": 511, + "call_index": 25, + "lane_in_call": 11, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 18628.28666933233, + "log_likelihood_scalar_library_pdip": 18628.359924083124, + "rel_diff": 3.932431577051707e-06, + "abs_diff_nats": 0.073254750794149 + }, + { + "lane_row": 512, + "call_index": 25, + "lane_in_call": 12, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 13415.098868967878, + "log_likelihood_scalar_library_pdip": 13405.29224007321, + "rel_diff": 0.0007315490568234592, + "abs_diff_nats": 9.806628894668393 + }, + { + "lane_row": 516, + "call_index": 25, + "lane_in_call": 16, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 22110.86560385036, + "log_likelihood_scalar_library_pdip": 22110.763218513803, + "rel_diff": 4.630565464738245e-06, + "abs_diff_nats": 0.10238533655865467 + }, + { + "lane_row": 517, + "call_index": 25, + "lane_in_call": 17, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 18841.2559732092, + "log_likelihood_scalar_library_pdip": 18842.4514425756, + "rel_diff": 6.344553255401869e-05, + "abs_diff_nats": 1.1954693663974467 + }, + { + "lane_row": 518, + "call_index": 25, + "lane_in_call": 18, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 20778.006318485684, + "log_likelihood_scalar_library_pdip": 20778.115993490595, + "rel_diff": 5.278390251807618e-06, + "abs_diff_nats": 0.10967500491096871 + }, + { + "lane_row": 519, + "call_index": 25, + "lane_in_call": 19, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 19208.43607996047, + "log_likelihood_scalar_library_pdip": 19208.09183978307, + "rel_diff": 1.7921622838555826e-05, + "abs_diff_nats": 0.34424017740093404 + }, + { + "lane_row": 521, + "call_index": 26, + "lane_in_call": 1, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 20823.46833399652, + "log_likelihood_scalar_library_pdip": 20823.044655620663, + "rel_diff": 2.0346610347522765e-05, + "abs_diff_nats": 0.42367837585698 + }, + { + "lane_row": 523, + "call_index": 26, + "lane_in_call": 3, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 19992.431234965337, + "log_likelihood_scalar_library_pdip": 19991.227250600088, + "rel_diff": 6.022563548283697e-05, + "abs_diff_nats": 1.2039843652491982 + }, + { + "lane_row": 526, + "call_index": 26, + "lane_in_call": 6, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 18177.852758806293, + "log_likelihood_scalar_library_pdip": 18172.806350726438, + "rel_diff": 0.00027769008167821506, + "abs_diff_nats": 5.04640807985561 + }, + { + "lane_row": 527, + "call_index": 26, + "lane_in_call": 7, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 19402.3833227188, + "log_likelihood_scalar_library_pdip": 19401.592856348587, + "rel_diff": 4.0742343995492035e-05, + "abs_diff_nats": 0.790466370213835 + }, + { + "lane_row": 528, + "call_index": 26, + "lane_in_call": 8, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 19026.487360603584, + "log_likelihood_scalar_library_pdip": 19026.484089398673, + "rel_diff": 1.7192902772740264e-07, + "abs_diff_nats": 0.0032712049105612095 + }, + { + "lane_row": 530, + "call_index": 26, + "lane_in_call": 10, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 21036.056036948456, + "log_likelihood_scalar_library_pdip": 21036.33013572616, + "rel_diff": 1.3029781142188183e-05, + "abs_diff_nats": 0.2740987777033297 + }, + { + "lane_row": 532, + "call_index": 26, + "lane_in_call": 12, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 19592.213071317514, + "log_likelihood_scalar_library_pdip": 19594.527131412553, + "rel_diff": 0.00011809726662550742, + "abs_diff_nats": 2.314060095039167 + }, + { + "lane_row": 533, + "call_index": 26, + "lane_in_call": 13, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 17318.425270181266, + "log_likelihood_scalar_library_pdip": 17318.424408698087, + "rel_diff": 4.9743738706597917e-08, + "abs_diff_nats": 0.0008614831785962451 + }, + { + "lane_row": 535, + "call_index": 26, + "lane_in_call": 15, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 20544.69336492713, + "log_likelihood_scalar_library_pdip": 20544.81524939329, + "rel_diff": 5.932614369137548e-06, + "abs_diff_nats": 0.12188446615982684 + }, + { + "lane_row": 536, + "call_index": 26, + "lane_in_call": 16, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 19583.795297000623, + "log_likelihood_scalar_library_pdip": 19583.8019302802, + "rel_diff": 3.387125543611533e-07, + "abs_diff_nats": 0.006633279575908091 + }, + { + "lane_row": 537, + "call_index": 26, + "lane_in_call": 17, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 19633.420439832073, + "log_likelihood_scalar_library_pdip": 19633.31049750804, + "rel_diff": 5.599785326466655e-06, + "abs_diff_nats": 0.10994232403390924 + }, + { + "lane_row": 539, + "call_index": 26, + "lane_in_call": 19, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 20215.27003728713, + "log_likelihood_scalar_library_pdip": 20215.247001815558, + "rel_diff": 1.139509775432306e-06, + "abs_diff_nats": 0.023035471571347443 + }, + { + "lane_row": 542, + "call_index": 27, + "lane_in_call": 2, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 19157.809535638735, + "log_likelihood_scalar_library_pdip": 19154.660287094688, + "rel_diff": 0.0001644116103781019, + "abs_diff_nats": 3.1492485440467135 + }, + { + "lane_row": 543, + "call_index": 27, + "lane_in_call": 3, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 19818.335161015606, + "log_likelihood_scalar_library_pdip": 19818.439691097068, + "rel_diff": 5.274385021798747e-06, + "abs_diff_nats": 0.10453008146214415 + }, + { + "lane_row": 544, + "call_index": 27, + "lane_in_call": 4, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 17457.72911081127, + "log_likelihood_scalar_library_pdip": 17457.948103301736, + "rel_diff": 1.2543999396211973e-05, + "abs_diff_nats": 0.21899249046691693 + }, + { + "lane_row": 547, + "call_index": 27, + "lane_in_call": 7, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 23165.743450713213, + "log_likelihood_scalar_library_pdip": 23165.66182733109, + "rel_diff": 3.5234642866078106e-06, + "abs_diff_nats": 0.08162338212423492 + }, + { + "lane_row": 549, + "call_index": 27, + "lane_in_call": 9, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 19461.196719800333, + "log_likelihood_scalar_library_pdip": 19461.337712104105, + "rel_diff": 7.244738561013237e-06, + "abs_diff_nats": 0.14099230377178174 + }, + { + "lane_row": 551, + "call_index": 27, + "lane_in_call": 11, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 19260.658463183066, + "log_likelihood_scalar_library_pdip": 19264.52874461008, + "rel_diff": 0.00020090195188903368, + "abs_diff_nats": 3.870281427014561 + }, + { + "lane_row": 552, + "call_index": 27, + "lane_in_call": 12, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 21683.025706579483, + "log_likelihood_scalar_library_pdip": 21683.025706554017, + "rel_diff": 1.174460243431089e-12, + "abs_diff_nats": 2.546585164964199e-08 + }, + { + "lane_row": 553, + "call_index": 27, + "lane_in_call": 13, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 19463.609047992813, + "log_likelihood_scalar_library_pdip": 19464.466191293155, + "rel_diff": 4.4036311703483625e-05, + "abs_diff_nats": 0.8571433003417042 + }, + { + "lane_row": 555, + "call_index": 27, + "lane_in_call": 15, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 17775.847960836567, + "log_likelihood_scalar_library_pdip": 17774.97633648145, + "rel_diff": 4.903659721493782e-05, + "abs_diff_nats": 0.8716243551170919 + }, + { + "lane_row": 556, + "call_index": 27, + "lane_in_call": 16, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 14708.502391352125, + "log_likelihood_scalar_library_pdip": 14708.502438631564, + "rel_diff": 3.214429092742875e-09, + "abs_diff_nats": 4.727943814941682e-05 + }, + { + "lane_row": 557, + "call_index": 27, + "lane_in_call": 17, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 19541.37795591248, + "log_likelihood_scalar_library_pdip": 19541.24531905603, + "rel_diff": 6.787533459911248e-06, + "abs_diff_nats": 0.13263685645142687 + }, + { + "lane_row": 559, + "call_index": 27, + "lane_in_call": 19, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 19613.450677077773, + "log_likelihood_scalar_library_pdip": 19613.376193977347, + "rel_diff": 3.7975665020693374e-06, + "abs_diff_nats": 0.07448310042673256 + }, + { + "lane_row": 561, + "call_index": 28, + "lane_in_call": 1, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 18923.561677893125, + "log_likelihood_scalar_library_pdip": 18923.0601855797, + "rel_diff": 2.6501649760011026e-05, + "abs_diff_nats": 0.5014923134258424 + }, + { + "lane_row": 562, + "call_index": 28, + "lane_in_call": 2, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 20818.188119264196, + "log_likelihood_scalar_library_pdip": 20818.401164212642, + "rel_diff": 1.0233492320863344e-05, + "abs_diff_nats": 0.21304494844662258 + }, + { + "lane_row": 563, + "call_index": 28, + "lane_in_call": 3, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 19335.168318171596, + "log_likelihood_scalar_library_pdip": 19334.462151271873, + "rel_diff": 3.652374160698214e-05, + "abs_diff_nats": 0.7061668997230299 + }, + { + "lane_row": 565, + "call_index": 28, + "lane_in_call": 5, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 18910.35557962783, + "log_likelihood_scalar_library_pdip": 18910.343954744258, + "rel_diff": 6.147367599854185e-07, + "abs_diff_nats": 0.01162488357294933 + }, + { + "lane_row": 569, + "call_index": 28, + "lane_in_call": 9, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 19239.018216839533, + "log_likelihood_scalar_library_pdip": 19238.82424428422, + "rel_diff": 1.008234977615993e-05, + "abs_diff_nats": 0.19397255531293922 + }, + { + "lane_row": 571, + "call_index": 28, + "lane_in_call": 11, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 18044.460051352038, + "log_likelihood_scalar_library_pdip": 18038.708428979942, + "rel_diff": 0.0003188489017792237, + "abs_diff_nats": 5.751622372095881 + }, + { + "lane_row": 574, + "call_index": 28, + "lane_in_call": 14, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 19488.681466913895, + "log_likelihood_scalar_library_pdip": 19488.6814667917, + "rel_diff": 6.2701045404032625e-12, + "abs_diff_nats": 1.2219607015140355e-07 + }, + { + "lane_row": 575, + "call_index": 28, + "lane_in_call": 15, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 19362.72274955584, + "log_likelihood_scalar_library_pdip": 19362.261028482942, + "rel_diff": 2.3846443977708634e-05, + "abs_diff_nats": 0.46172107289748965 + }, + { + "lane_row": 576, + "call_index": 28, + "lane_in_call": 16, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 19436.836230285942, + "log_likelihood_scalar_library_pdip": 19435.85795849566, + "rel_diff": 5.0333347381462463e-05, + "abs_diff_nats": 0.978271790281724 + }, + { + "lane_row": 577, + "call_index": 28, + "lane_in_call": 17, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 21722.81023082808, + "log_likelihood_scalar_library_pdip": 21722.837428821258, + "rel_diff": 1.252046067539746e-06, + "abs_diff_nats": 0.027197993178560864 + }, + { + "lane_row": 578, + "call_index": 28, + "lane_in_call": 18, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 20455.75257589689, + "log_likelihood_scalar_library_pdip": 20455.72237791656, + "rel_diff": 1.4762607632195776e-06, + "abs_diff_nats": 0.030197980329830898 + }, + { + "lane_row": 580, + "call_index": 29, + "lane_in_call": 0, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 19530.671958297877, + "log_likelihood_scalar_library_pdip": 19530.953157773783, + "rel_diff": 1.4397631986272832e-05, + "abs_diff_nats": 0.2811994759067602 + }, + { + "lane_row": 581, + "call_index": 29, + "lane_in_call": 1, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 17863.072703859645, + "log_likelihood_scalar_library_pdip": 17865.262327768105, + "rel_diff": 0.00012256321056403183, + "abs_diff_nats": 2.1896239084599074 + }, + { + "lane_row": 584, + "call_index": 29, + "lane_in_call": 4, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 19289.025882549842, + "log_likelihood_scalar_library_pdip": 19292.445145462167, + "rel_diff": 0.00017723325822848013, + "abs_diff_nats": 3.419262912324484 + }, + { + "lane_row": 585, + "call_index": 29, + "lane_in_call": 5, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 18177.79603430265, + "log_likelihood_scalar_library_pdip": 18177.70402748402, + "rel_diff": 5.061520337902871e-06, + "abs_diff_nats": 0.0920068186314893 + }, + { + "lane_row": 587, + "call_index": 29, + "lane_in_call": 7, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 18067.378943574848, + "log_likelihood_scalar_library_pdip": 18067.30517030492, + "rel_diff": 4.083247016186991e-06, + "abs_diff_nats": 0.07377326992718736 + }, + { + "lane_row": 588, + "call_index": 29, + "lane_in_call": 8, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 19397.592590532626, + "log_likelihood_scalar_library_pdip": 19397.537635377306, + "rel_diff": 2.8330995589485853e-06, + "abs_diff_nats": 0.054955155319476034 + }, + { + "lane_row": 589, + "call_index": 29, + "lane_in_call": 9, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 18442.19541897381, + "log_likelihood_scalar_library_pdip": 18442.195418659165, + "rel_diff": 1.706115470006398e-11, + "abs_diff_nats": 3.1464514904655516e-07 + }, + { + "lane_row": 591, + "call_index": 29, + "lane_in_call": 11, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 19212.60967850248, + "log_likelihood_scalar_library_pdip": 19210.409735601745, + "rel_diff": 0.00011451827061536751, + "abs_diff_nats": 2.199942900733731 + }, + { + "lane_row": 597, + "call_index": 29, + "lane_in_call": 17, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 21659.948701883804, + "log_likelihood_scalar_library_pdip": 21659.587205260163, + "rel_diff": 1.668991288781708e-05, + "abs_diff_nats": 0.3614966236418695 + }, + { + "lane_row": 598, + "call_index": 29, + "lane_in_call": 18, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 19527.46454878728, + "log_likelihood_scalar_library_pdip": 19527.422812025798, + "rel_diff": 2.137341004213285e-06, + "abs_diff_nats": 0.04173676148275263 + }, + { + "lane_row": 600, + "call_index": 30, + "lane_in_call": 0, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 19808.789373513286, + "log_likelihood_scalar_library_pdip": 19809.166050703163, + "rel_diff": 1.901529771183158e-05, + "abs_diff_nats": 0.37667718987722765 + }, + { + "lane_row": 603, + "call_index": 30, + "lane_in_call": 3, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 11283.924225485083, + "log_likelihood_scalar_library_pdip": 11280.049121394404, + "rel_diff": 0.00034353610068322643, + "abs_diff_nats": 3.8751040906790877 + }, + { + "lane_row": 605, + "call_index": 30, + "lane_in_call": 5, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 18584.288542085997, + "log_likelihood_scalar_library_pdip": 18584.41615741409, + "rel_diff": 6.866792424977519e-06, + "abs_diff_nats": 0.12761532809236087 + }, + { + "lane_row": 606, + "call_index": 30, + "lane_in_call": 6, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 19378.18721953455, + "log_likelihood_scalar_library_pdip": 19378.575615348505, + "rel_diff": 2.0042536751165767e-05, + "abs_diff_nats": 0.3883958139558672 + }, + { + "lane_row": 607, + "call_index": 30, + "lane_in_call": 7, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 18642.62231636487, + "log_likelihood_scalar_library_pdip": 18644.192639941102, + "rel_diff": 8.422588237314483e-05, + "abs_diff_nats": 1.5703235762339318 + }, + { + "lane_row": 609, + "call_index": 30, + "lane_in_call": 9, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 23084.74157385393, + "log_likelihood_scalar_library_pdip": 23084.37982894503, + "rel_diff": 1.5670549158358785e-05, + "abs_diff_nats": 0.3617449088997091 + }, + { + "lane_row": 611, + "call_index": 30, + "lane_in_call": 11, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 13342.699765061134, + "log_likelihood_scalar_library_pdip": 13342.699763707693, + "rel_diff": 1.0143680945759665e-10, + "abs_diff_nats": 1.353440893581137e-06 + }, + { + "lane_row": 613, + "call_index": 30, + "lane_in_call": 13, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 19173.23417344294, + "log_likelihood_scalar_library_pdip": 19172.889628817644, + "rel_diff": 1.7970406754833634e-05, + "abs_diff_nats": 0.3445446252953843 + }, + { + "lane_row": 614, + "call_index": 30, + "lane_in_call": 14, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 19622.98269424989, + "log_likelihood_scalar_library_pdip": 19624.435782933393, + "rel_diff": 7.404486424855796e-05, + "abs_diff_nats": 1.4530886835018464 + }, + { + "lane_row": 617, + "call_index": 30, + "lane_in_call": 17, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 19583.75192701495, + "log_likelihood_scalar_library_pdip": 19583.56922871476, + "rel_diff": 9.329162526740243e-06, + "abs_diff_nats": 0.1826983001883491 + }, + { + "lane_row": 619, + "call_index": 30, + "lane_in_call": 19, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 17413.951638953087, + "log_likelihood_scalar_library_pdip": 17414.009318673787, + "rel_diff": 3.3122596665704534e-06, + "abs_diff_nats": 0.057679720699525205 + }, + { + "lane_row": 621, + "call_index": 31, + "lane_in_call": 1, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 19331.237597309628, + "log_likelihood_scalar_library_pdip": 19336.09252388913, + "rel_diff": 0.0002510810585697596, + "abs_diff_nats": 4.854926579500898 + }, + { + "lane_row": 622, + "call_index": 31, + "lane_in_call": 2, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 18356.17675622036, + "log_likelihood_scalar_library_pdip": 18356.177416558552, + "rel_diff": 3.597362221336489e-08, + "abs_diff_nats": 0.0006603381916647777 + }, + { + "lane_row": 625, + "call_index": 31, + "lane_in_call": 5, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 20410.124665616764, + "log_likelihood_scalar_library_pdip": 20407.475579395097, + "rel_diff": 0.0001298095990050657, + "abs_diff_nats": 2.6490862216669484 + }, + { + "lane_row": 631, + "call_index": 31, + "lane_in_call": 11, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 19289.34285317442, + "log_likelihood_scalar_library_pdip": 19286.70581734762, + "rel_diff": 0.00013672816144826757, + "abs_diff_nats": 2.637035826799547 + }, + { + "lane_row": 632, + "call_index": 31, + "lane_in_call": 12, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 18077.127499311475, + "log_likelihood_scalar_library_pdip": 18083.96258764094, + "rel_diff": 0.0003779640826141373, + "abs_diff_nats": 6.835088329466089 + }, + { + "lane_row": 634, + "call_index": 31, + "lane_in_call": 14, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 18583.01664798819, + "log_likelihood_scalar_library_pdip": 18583.02788794668, + "rel_diff": 6.048507572745093e-07, + "abs_diff_nats": 0.011239958490477875 + }, + { + "lane_row": 636, + "call_index": 31, + "lane_in_call": 16, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 19690.40555553937, + "log_likelihood_scalar_library_pdip": 19690.74766516834, + "rel_diff": 1.7374130976893346e-05, + "abs_diff_nats": 0.34210962896759156 + }, + { + "lane_row": 638, + "call_index": 31, + "lane_in_call": 18, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 18993.586328322788, + "log_likelihood_scalar_library_pdip": 18996.21846477853, + "rel_diff": 0.00013856107522773636, + "abs_diff_nats": 2.6321364557406923 + }, + { + "lane_row": 639, + "call_index": 31, + "lane_in_call": 19, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 20561.496402127734, + "log_likelihood_scalar_library_pdip": 20560.278004476124, + "rel_diff": 5.925978487959132e-05, + "abs_diff_nats": 1.2183976516098483 + }, + { + "lane_row": 641, + "call_index": 32, + "lane_in_call": 1, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 22134.052576327966, + "log_likelihood_scalar_library_pdip": 22138.246728707316, + "rel_diff": 0.00018945277965086506, + "abs_diff_nats": 4.194152379350271 + }, + { + "lane_row": 643, + "call_index": 32, + "lane_in_call": 3, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 19223.54904309679, + "log_likelihood_scalar_library_pdip": 19219.00614245618, + "rel_diff": 0.00023637541956846893, + "abs_diff_nats": 4.542900640612061 + }, + { + "lane_row": 649, + "call_index": 32, + "lane_in_call": 9, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 13369.922132524534, + "log_likelihood_scalar_library_pdip": 13385.061237037553, + "rel_diff": 0.001131044845064093, + "abs_diff_nats": 15.139104513018538 + }, + { + "lane_row": 650, + "call_index": 32, + "lane_in_call": 10, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 18198.66237697639, + "log_likelihood_scalar_library_pdip": 18198.92965467207, + "rel_diff": 1.4686451387550123e-05, + "abs_diff_nats": 0.2672776956787857 + }, + { + "lane_row": 651, + "call_index": 32, + "lane_in_call": 11, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 18471.398934117147, + "log_likelihood_scalar_library_pdip": 18471.409333834443, + "rel_diff": 5.630169906128326e-07, + "abs_diff_nats": 0.010399717295513256 + }, + { + "lane_row": 652, + "call_index": 32, + "lane_in_call": 12, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 20037.834990545816, + "log_likelihood_scalar_library_pdip": 20037.230505445285, + "rel_diff": 3.0168096352810486e-05, + "abs_diff_nats": 0.6044851005317469 + }, + { + "lane_row": 653, + "call_index": 32, + "lane_in_call": 13, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 16023.928752640342, + "log_likelihood_scalar_library_pdip": 16023.929205628581, + "rel_diff": 2.8269485789851535e-08, + "abs_diff_nats": 0.0004529882389761042 + }, + { + "lane_row": 655, + "call_index": 32, + "lane_in_call": 15, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 20391.014313772477, + "log_likelihood_scalar_library_pdip": 20390.401630238946, + "rel_diff": 3.0047644212274348e-05, + "abs_diff_nats": 0.6126835335307987 + }, + { + "lane_row": 656, + "call_index": 32, + "lane_in_call": 16, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 15313.347430368121, + "log_likelihood_scalar_library_pdip": 15344.698797659192, + "rel_diff": 0.0020431399602221546, + "abs_diff_nats": 31.351367291070346 + }, + { + "lane_row": 658, + "call_index": 32, + "lane_in_call": 18, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 21545.211784070638, + "log_likelihood_scalar_library_pdip": 21545.17346372279, + "rel_diff": 1.778604749372855e-06, + "abs_diff_nats": 0.03832034784863936 + }, + { + "lane_row": 659, + "call_index": 32, + "lane_in_call": 19, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 18603.683909327872, + "log_likelihood_scalar_library_pdip": 18603.77049833459, + "rel_diff": 4.65437942946768e-06, + "abs_diff_nats": 0.0865890067179862 + }, + { + "lane_row": 660, + "call_index": 33, + "lane_in_call": 0, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 19096.62161771348, + "log_likelihood_scalar_library_pdip": 19097.05932864862, + "rel_diff": 2.2920331743459134e-05, + "abs_diff_nats": 0.4377109351371473 + }, + { + "lane_row": 661, + "call_index": 33, + "lane_in_call": 1, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 19496.90170871284, + "log_likelihood_scalar_library_pdip": 19496.956980067604, + "rel_diff": 2.8348708374712978e-06, + "abs_diff_nats": 0.05527135476222611 + }, + { + "lane_row": 664, + "call_index": 33, + "lane_in_call": 4, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 19363.18023431392, + "log_likelihood_scalar_library_pdip": 19362.67497527152, + "rel_diff": 2.609448555260613e-05, + "abs_diff_nats": 0.5052590424020309 + }, + { + "lane_row": 666, + "call_index": 33, + "lane_in_call": 6, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 18338.396608437222, + "log_likelihood_scalar_library_pdip": 18338.577431066158, + "rel_diff": 9.860232049926494e-06, + "abs_diff_nats": 0.1808226289358572 + }, + { + "lane_row": 668, + "call_index": 33, + "lane_in_call": 8, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 15342.732244899384, + "log_likelihood_scalar_library_pdip": 15342.732244166153, + "rel_diff": 4.779011840406248e-11, + "abs_diff_nats": 7.332309905905277e-07 + }, + { + "lane_row": 671, + "call_index": 33, + "lane_in_call": 11, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 19617.671341162193, + "log_likelihood_scalar_library_pdip": 19617.599897901135, + "rel_diff": 3.6417941761617715e-06, + "abs_diff_nats": 0.07144326105844812 + }, + { + "lane_row": 675, + "call_index": 33, + "lane_in_call": 15, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 17757.689146190725, + "log_likelihood_scalar_library_pdip": 17755.86093616872, + "rel_diff": 0.00010296374974877948, + "abs_diff_nats": 1.8282100220058055 + }, + { + "lane_row": 676, + "call_index": 33, + "lane_in_call": 16, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": -14608.861382360694, + "log_likelihood_scalar_library_pdip": -14612.113461829897, + "rel_diff": 0.00022256051307689915, + "abs_diff_nats": 3.2520794692027266 + }, + { + "lane_row": 677, + "call_index": 33, + "lane_in_call": 17, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 19271.664412154372, + "log_likelihood_scalar_library_pdip": 19257.02046923912, + "rel_diff": 0.0007604469725025441, + "abs_diff_nats": 14.64394291525241 + }, + { + "lane_row": 678, + "call_index": 33, + "lane_in_call": 18, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 18957.08259393646, + "log_likelihood_scalar_library_pdip": 18956.234099786932, + "rel_diff": 4.476069165740937e-05, + "abs_diff_nats": 0.8484941495262319 + }, + { + "lane_row": 682, + "call_index": 34, + "lane_in_call": 2, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 19368.572008545536, + "log_likelihood_scalar_library_pdip": 19364.966601544405, + "rel_diff": 0.00018618193748100632, + "abs_diff_nats": 3.6054070011305157 + }, + { + "lane_row": 686, + "call_index": 34, + "lane_in_call": 6, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 18589.023764843223, + "log_likelihood_scalar_library_pdip": 18589.02376354496, + "rel_diff": 6.984033618591684e-11, + "abs_diff_nats": 1.298263669013977e-06 + }, + { + "lane_row": 687, + "call_index": 34, + "lane_in_call": 7, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 17399.773605901893, + "log_likelihood_scalar_library_pdip": 17411.667430164543, + "rel_diff": 0.0006830950746305183, + "abs_diff_nats": 11.893824262650014 + }, + { + "lane_row": 689, + "call_index": 34, + "lane_in_call": 9, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 22381.98847184513, + "log_likelihood_scalar_library_pdip": 22381.732289626714, + "rel_diff": 1.1446040686183032e-05, + "abs_diff_nats": 0.25618221841432387 + }, + { + "lane_row": 691, + "call_index": 34, + "lane_in_call": 11, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 22338.462089300658, + "log_likelihood_scalar_library_pdip": 22338.310114502092, + "rel_diff": 6.8033256672860945e-06, + "abs_diff_nats": 0.15197479856578866 + }, + { + "lane_row": 693, + "call_index": 34, + "lane_in_call": 13, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 21459.259829308947, + "log_likelihood_scalar_library_pdip": 21459.119780170295, + "rel_diff": 6.5263226118676875e-06, + "abs_diff_nats": 0.14004913865210256 + }, + { + "lane_row": 694, + "call_index": 34, + "lane_in_call": 14, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 17579.166783951863, + "log_likelihood_scalar_library_pdip": 17579.049488148037, + "rel_diff": 6.6724770247142255e-06, + "abs_diff_nats": 0.11729580382598215 + }, + { + "lane_row": 697, + "call_index": 34, + "lane_in_call": 17, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 20143.139511364156, + "log_likelihood_scalar_library_pdip": 20142.210631044487, + "rel_diff": 4.611610595696123e-05, + "abs_diff_nats": 0.9288803196686786 + }, + { + "lane_row": 698, + "call_index": 34, + "lane_in_call": 18, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 16738.475696902315, + "log_likelihood_scalar_library_pdip": 16738.475695517205, + "rel_diff": 8.275003795404272e-11, + "abs_diff_nats": 1.3851094990968704e-06 + }, + { + "lane_row": 699, + "call_index": 34, + "lane_in_call": 19, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 18690.146874445654, + "log_likelihood_scalar_library_pdip": 18689.78237224133, + "rel_diff": 1.9502752737515505e-05, + "abs_diff_nats": 0.36450220432379865 + }, + { + "lane_row": 701, + "call_index": 35, + "lane_in_call": 1, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 22057.149243958484, + "log_likelihood_scalar_library_pdip": 22056.17518692988, + "rel_diff": 4.4162554039835747e-05, + "abs_diff_nats": 0.9740570286048751 + }, + { + "lane_row": 703, + "call_index": 35, + "lane_in_call": 3, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 20048.83337972723, + "log_likelihood_scalar_library_pdip": 20050.887601049897, + "rel_diff": 0.00010245039339594304, + "abs_diff_nats": 2.0542213226653985 + }, + { + "lane_row": 704, + "call_index": 35, + "lane_in_call": 4, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 18598.67327861386, + "log_likelihood_scalar_library_pdip": 18600.13025700386, + "rel_diff": 7.833162294398246e-05, + "abs_diff_nats": 1.456978390000586 + }, + { + "lane_row": 705, + "call_index": 35, + "lane_in_call": 5, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 18127.862782971217, + "log_likelihood_scalar_library_pdip": 18127.936990333605, + "rel_diff": 4.093535984121847e-06, + "abs_diff_nats": 0.0742073623878241 + }, + { + "lane_row": 711, + "call_index": 35, + "lane_in_call": 11, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 19550.05781912669, + "log_likelihood_scalar_library_pdip": 19550.057794053188, + "rel_diff": 1.2825283267899965e-09, + "abs_diff_nats": 2.5073502911254764e-05 + }, + { + "lane_row": 714, + "call_index": 35, + "lane_in_call": 14, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 18878.817755169628, + "log_likelihood_scalar_library_pdip": 18880.347317477237, + "rel_diff": 8.101346240559467e-05, + "abs_diff_nats": 1.5295623076090124 + }, + { + "lane_row": 717, + "call_index": 35, + "lane_in_call": 17, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 17560.42987570153, + "log_likelihood_scalar_library_pdip": 17560.4260978409, + "rel_diff": 2.1513490675228676e-07, + "abs_diff_nats": 0.0037778606310894247 + }, + { + "lane_row": 719, + "call_index": 35, + "lane_in_call": 19, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 19495.695091334743, + "log_likelihood_scalar_library_pdip": 19495.69510445355, + "rel_diff": 6.729078479429228e-10, + "abs_diff_nats": 1.3118806236889213e-05 + }, + { + "lane_row": 755, + "call_index": 37, + "lane_in_call": 15, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 20079.685980900555, + "log_likelihood_scalar_library_pdip": 20084.129783256503, + "rel_diff": 0.0002212593925604571, + "abs_diff_nats": 4.443802355948719 + }, + { + "lane_row": 759, + "call_index": 37, + "lane_in_call": 19, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 21095.8563965809, + "log_likelihood_scalar_library_pdip": 21095.659261127443, + "rel_diff": 9.344834926362743e-06, + "abs_diff_nats": 0.1971354534580314 + }, + { + "lane_row": 763, + "call_index": 38, + "lane_in_call": 3, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 23102.027312104205, + "log_likelihood_scalar_library_pdip": 23102.02662982643, + "rel_diff": 2.9533243418639564e-08, + "abs_diff_nats": 0.0006822777759225573 + }, + { + "lane_row": 764, + "call_index": 38, + "lane_in_call": 4, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 23744.620092277488, + "log_likelihood_scalar_library_pdip": 23750.127860152883, + "rel_diff": 0.00023190476732699243, + "abs_diff_nats": 5.507767875395075 + }, + { + "lane_row": 765, + "call_index": 38, + "lane_in_call": 5, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 20901.38609819571, + "log_likelihood_scalar_library_pdip": 20903.275146459273, + "rel_diff": 9.037092275377437e-05, + "abs_diff_nats": 1.8890482635615626 + }, + { + "lane_row": 770, + "call_index": 38, + "lane_in_call": 10, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 19361.92022608064, + "log_likelihood_scalar_library_pdip": 19361.810249529422, + "rel_diff": 5.6800758710915984e-06, + "abs_diff_nats": 0.10997655121900607 + }, + { + "lane_row": 772, + "call_index": 38, + "lane_in_call": 12, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 19138.606946788783, + "log_likelihood_scalar_library_pdip": 19138.63835983257, + "rel_diff": 1.6413416250788793e-06, + "abs_diff_nats": 0.03141304378732457 + }, + { + "lane_row": 775, + "call_index": 38, + "lane_in_call": 15, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 23716.78755435303, + "log_likelihood_scalar_library_pdip": 23716.810142235558, + "rel_diff": 9.52399685723984e-07, + "abs_diff_nats": 0.02258788252584054 + }, + { + "lane_row": 776, + "call_index": 38, + "lane_in_call": 16, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 21704.941810780576, + "log_likelihood_scalar_library_pdip": 21704.942343132985, + "rel_diff": 2.4526782923132275e-08, + "abs_diff_nats": 0.0005323524092091247 + }, + { + "lane_row": 777, + "call_index": 38, + "lane_in_call": 17, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 18367.151929418076, + "log_likelihood_scalar_library_pdip": 18362.426881709904, + "rel_diff": 0.00025732152610387967, + "abs_diff_nats": 4.725047708172497 + }, + { + "lane_row": 779, + "call_index": 38, + "lane_in_call": 19, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 23320.19083436332, + "log_likelihood_scalar_library_pdip": 23320.190834363468, + "rel_diff": 6.396051050790276e-15, + "abs_diff_nats": 1.4915713109076023e-10 + }, + { + "lane_row": 782, + "call_index": 39, + "lane_in_call": 2, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 21711.401437813234, + "log_likelihood_scalar_library_pdip": 21711.371975720816, + "rel_diff": 1.3569889756742573e-06, + "abs_diff_nats": 0.029462092417816166 + }, + { + "lane_row": 786, + "call_index": 39, + "lane_in_call": 6, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 20558.20746696892, + "log_likelihood_scalar_library_pdip": 20556.79230839147, + "rel_diff": 6.884141047992442e-05, + "abs_diff_nats": 1.4151585774525302 + }, + { + "lane_row": 787, + "call_index": 39, + "lane_in_call": 7, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 17234.92132301579, + "log_likelihood_scalar_library_pdip": 17239.970617075443, + "rel_diff": 0.0002928829852326549, + "abs_diff_nats": 5.049294059652311 + }, + { + "lane_row": 790, + "call_index": 39, + "lane_in_call": 10, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 20545.784169264756, + "log_likelihood_scalar_library_pdip": 20545.78416898095, + "rel_diff": 1.3813344886943549e-11, + "abs_diff_nats": 2.838060026988387e-07 + }, + { + "lane_row": 792, + "call_index": 39, + "lane_in_call": 12, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 20440.00062012439, + "log_likelihood_scalar_library_pdip": 20440.067209817447, + "rel_diff": 3.257802059801843e-06, + "abs_diff_nats": 0.06658969305863138 + }, + { + "lane_row": 793, + "call_index": 39, + "lane_in_call": 13, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 19315.2725536376, + "log_likelihood_scalar_library_pdip": 19315.294307407716, + "rel_diff": 1.1262458532156043e-06, + "abs_diff_nats": 0.021753770117356908 + }, + { + "lane_row": 798, + "call_index": 39, + "lane_in_call": 18, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 19603.27347368605, + "log_likelihood_scalar_library_pdip": 19605.464817131997, + "rel_diff": 0.0001117720730615271, + "abs_diff_nats": 2.1913434459456766 + }, + { + "lane_row": 799, + "call_index": 39, + "lane_in_call": 19, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 19149.15600035359, + "log_likelihood_scalar_library_pdip": 19149.157833499692, + "rel_diff": 9.572985502796449e-08, + "abs_diff_nats": 0.0018331461033085361 + }, + { + "lane_row": 804, + "call_index": 40, + "lane_in_call": 4, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 20013.143424188944, + "log_likelihood_scalar_library_pdip": 20013.108625188444, + "rel_diff": 1.738810354306255e-06, + "abs_diff_nats": 0.03479900049933349 + }, + { + "lane_row": 818, + "call_index": 40, + "lane_in_call": 18, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 19229.35595738731, + "log_likelihood_scalar_library_pdip": 19229.98950422863, + "rel_diff": 3.294577156064474e-05, + "abs_diff_nats": 0.6335468413199123 + }, + { + "lane_row": 830, + "call_index": 41, + "lane_in_call": 10, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 20461.547724445496, + "log_likelihood_scalar_library_pdip": 20461.423696428013, + "rel_diff": 6.061553649570302e-06, + "abs_diff_nats": 0.12402801748248748 + }, + { + "lane_row": 832, + "call_index": 41, + "lane_in_call": 12, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 21073.4250847821, + "log_likelihood_scalar_library_pdip": 21074.477632773243, + "rel_diff": 4.994420310129e-05, + "abs_diff_nats": 1.0525479911448201 + }, + { + "lane_row": 837, + "call_index": 41, + "lane_in_call": 17, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 21613.08513223394, + "log_likelihood_scalar_library_pdip": 21613.085132232274, + "rel_diff": 7.709192294639863e-14, + "abs_diff_nats": 1.6661942936480045e-09 + }, + { + "lane_row": 841, + "call_index": 42, + "lane_in_call": 1, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 22206.4632419306, + "log_likelihood_scalar_library_pdip": 22206.49781526716, + "rel_diff": 1.5569018063434918e-06, + "abs_diff_nats": 0.034573336561152246 + }, + { + "lane_row": 851, + "call_index": 42, + "lane_in_call": 11, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 19676.866423680676, + "log_likelihood_scalar_library_pdip": 19674.62122646191, + "rel_diff": 0.00011411641387772531, + "abs_diff_nats": 2.245197218766407 + }, + { + "lane_row": 852, + "call_index": 42, + "lane_in_call": 12, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 19526.752222807772, + "log_likelihood_scalar_library_pdip": 19526.234790638537, + "rel_diff": 2.6499331529279894e-05, + "abs_diff_nats": 0.5174321692356898 + }, + { + "lane_row": 854, + "call_index": 42, + "lane_in_call": 14, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 19843.92799214407, + "log_likelihood_scalar_library_pdip": 19843.927992100995, + "rel_diff": 2.17062212144247e-12, + "abs_diff_nats": 4.307366907596588e-08 + } + ], + "gated": false + }, + "lane_certified": [ + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ], + "lane_passes": [ + 0, + 0, + 0, + 7, + 0, + 0, + 16, + 7, + 2, + 0, + 3, + 16, + 0, + 2, + 7, + 0, + 0, + 0, + 0, + 0, + 5, + 0, + 0, + 3, + 16, + 2, + 0, + 16, + 11, + 14, + 2, + 3, + 16, + 2, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 12, + 2, + 0, + 0, + 1, + 0, + 0, + 12, + 16, + 0, + 0, + 0, + 0, + 13, + 0, + 8, + 0, + 16, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 3, + 0, + 1, + 0, + 14, + 0, + 9, + 0, + 0, + 0, + 16, + 0, + 16, + 0, + 0, + 0, + 0, + 16, + 0, + 0, + 0, + 0, + 0, + 0, + 16, + 1, + 0, + 0, + 0, + 0, + 5, + 0, + 1, + 3, + 0, + 1, + 0, + 0, + 16, + 0, + 3, + 16, + 3, + 0, + 0, + 0, + 7, + 0, + 15, + 1, + 0, + 0, + 7, + 16, + 0, + 0, + 0, + 16, + 6, + 16, + 0, + 0, + 0, + 16, + 16, + 2, + 0, + 0, + 0, + 0, + 0, + 16, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 2, + 0, + 0, + 2, + 2, + 2, + 16, + 16, + 16, + 16, + 0, + 0, + 3, + 0, + 0, + 0, + 16, + 16, + 0, + 8, + 5, + 0, + 7, + 1, + 5, + 0, + 0, + 0, + 0, + 0, + 6, + 16, + 16, + 0, + 0, + 0, + 4, + 0, + 0, + 6, + 6, + 16, + 0, + 0, + 0, + 0, + 11, + 16, + 3, + 0, + 9, + 0, + 0, + 2, + 4, + 4, + 0, + 16, + 16, + 10, + 2, + 0, + 16, + 16, + 0, + 0, + 0, + 0, + 0, + 16, + 2, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 3, + 0, + 0, + 4, + 9, + 16, + 0, + 16, + 16, + 0, + 16, + 0, + 0, + 0, + 12, + 11, + 7, + 14, + 0, + 3, + 0, + 0, + 16, + 0, + 3, + 16, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 4, + 0, + 0, + 7, + 1, + 0, + 0, + 6, + 0, + 16, + 0, + 0, + 0, + 3, + 10, + 1, + 16, + 0, + 0, + 0, + 0, + 10, + 0, + 0, + 14, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 10, + 16, + 0, + 0, + 10, + 4, + 0, + 1, + 4, + 0, + 2, + 16, + 9, + 2, + 16, + 16, + 16, + 16, + 16, + 16, + 5, + 4, + 16, + 5, + 4, + 0, + 0, + 4, + 3, + 16, + 5, + 16, + 8, + 16, + 0, + 16, + 16, + 14, + 16, + 2, + 16, + 16, + 1, + 0, + 2, + 16, + 16, + 4, + 5, + 0, + 2, + 2, + 9, + 5, + 16, + 16, + 5, + 16, + 13, + 8, + 1, + 7, + 0, + 16, + 16, + 8, + 0, + 2, + 4, + 7, + 16, + 4, + 3, + 16, + 0, + 3, + 16, + 0, + 2, + 16, + 16, + 7, + 13, + 2, + 16, + 3, + 16, + 16, + 16, + 16, + 3, + 16, + 0, + 0, + 0, + 16, + 8, + 1, + 15, + 1, + 12, + 5, + 0, + 0, + 16, + 16, + 16, + 16, + 1, + 16, + 16, + 16, + 0, + 16, + 4, + 16, + 2, + 3, + 16, + 1, + 7, + 16, + 15, + 5, + 3, + 0, + 16, + 16, + 11, + 16, + 0, + 16, + 7, + 0, + 0, + 8, + 7, + 16, + 16, + 0, + 5, + 1, + 9, + 1, + 0, + 16, + 16, + 4, + 2, + 0, + 3, + 16, + 0, + 3, + 3, + 16, + 6, + 4, + 9, + 16, + 16, + 5, + 16, + 6, + 1, + 16, + 0, + 16, + 16, + 2, + 6, + 12, + 0, + 2, + 16, + 16, + 16, + 10, + 0, + 16, + 1, + 0, + 16, + 3, + 0, + 16, + 16, + 16, + 16, + 0, + 1, + 9, + 2, + 16, + 0, + 16, + 5, + 16, + 16, + 16, + 16, + 16, + 15, + 16, + 16, + 16, + 16, + 16, + 16, + 4, + 16, + 16, + 16, + 14, + 5, + 2, + 16, + 16, + 16, + 16, + 4, + 16, + 11, + 16, + 6, + 9, + 16, + 16, + 16, + 3, + 16, + 3, + 16, + 16, + 1, + 16, + 16, + 16, + 6, + 16, + 8, + 1, + 16, + 16, + 16, + 3, + 3, + 16, + 9, + 16, + 7, + 16, + 16, + 16, + 13, + 16, + 16, + 16, + 12, + 16, + 13, + 16, + 16, + 16, + 7, + 16, + 6, + 9, + 6, + 16, + 14, + 16, + 7, + 5, + 16, + 16, + 16, + 16, + 16, + 11, + 16, + 16, + 7, + 10, + 16, + 16, + 10, + 16, + 16, + 16, + 9, + 16, + 1, + 14, + 6, + 3, + 1, + 16, + 16, + 14, + 16, + 1, + 12, + 16, + 5, + 16, + 16, + 16, + 9, + 16, + 3, + 16, + 14, + 16, + 16, + 4, + 5, + 16, + 3, + 16, + 15, + 16, + 16, + 0, + 2, + 16, + 7, + 0, + 3, + 9, + 6, + 16, + 16, + 3, + 16, + 7, + 16, + 8, + 16, + 16, + 4, + 16, + 13, + 16, + 6, + 4, + 4, + 0, + 0, + 16, + 16, + 16, + 16, + 16, + 7, + 16, + 16, + 3, + 16, + 16, + 16, + 16, + 5, + 9, + 16, + 3, + 16, + 10, + 16, + 1, + 10, + 16, + 3, + 3, + 3, + 16, + 16, + 16, + 16, + 15, + 3, + 2, + 16, + 14, + 3, + 5, + 16, + 16, + 14, + 16, + 2, + 16, + 15, + 16, + 16, + 12, + 2, + 16, + 16, + 16, + 4, + 16, + 7, + 16, + 16, + 16, + 16, + 3, + 3, + 7, + 5, + 16, + 1, + 4, + 16, + 1, + 6, + 16, + 13, + 16, + 2, + 3, + 0, + 4, + 0, + 12, + 0, + 7, + 5, + 3, + 5, + 1, + 4, + 1, + 0, + 3, + 4, + 0, + 0, + 3, + 0, + 1, + 5, + 0, + 1, + 3, + 1, + 3, + 5, + 3, + 1, + 0, + 0, + 2, + 1, + 16, + 7, + 0, + 8, + 16, + 1, + 4, + 6, + 16, + 16, + 16, + 3, + 8, + 4, + 5, + 16, + 16, + 16, + 5, + 7, + 16, + 16, + 16, + 8, + 16, + 9, + 10, + 16, + 12, + 12, + 2, + 16, + 16, + 1, + 4, + 16, + 8, + 16, + 16, + 11, + 7, + 1, + 1, + 16, + 16, + 9, + 16, + 0, + 10, + 16, + 13, + 9, + 2, + 0, + 2, + 16, + 11, + 0, + 6, + 5, + 5, + 3, + 10, + 16, + 4, + 5, + 9, + 3, + 2, + 3, + 3, + 9, + 5, + 7, + 3, + 16, + 3, + 16, + 0, + 14, + 7, + 0, + 16, + 6, + 3, + 13, + 16, + 7, + 6, + 12, + 12, + 8, + 8, + 2, + 1, + 1, + 16, + 16, + 7, + 16, + 16, + 15, + 0, + 16, + 4, + 10, + 16, + 0, + 2, + 0, + 11, + 4, + 4, + 2, + 16, + 1, + 8, + 0, + 13, + 4, + 16, + 0, + 2, + 4, + 2, + 1, + 4, + 0, + 1, + 16, + 6, + 16, + 8, + 11, + 16, + 8, + 4, + 6, + 16, + 16, + 7, + 8, + 13, + 10, + 9, + 1, + 3, + 0, + 0, + 0, + 16, + 16, + 2, + 16, + 16, + 11, + 6, + 3, + 9, + 6, + 2, + 8, + 16, + 9, + 16, + 13, + 0, + 5, + 1, + 2, + 1, + 5, + 3, + 5, + 14, + 0, + 3, + 10, + 3, + 1, + 16, + 11, + 0, + 6, + 4, + 5, + 1, + 2, + 16, + 3, + 2, + 9, + 6, + 5, + 2, + 2, + 1, + 12, + 2, + 10, + 5, + 3, + 11, + 5, + 0, + 16, + 4, + 5, + 0, + 1, + 1, + 2, + 7, + 8, + 16, + 1, + 1, + 16, + 2, + 16, + 7, + 6, + 3, + 2, + 16, + 0, + 13, + 14, + 0, + 4, + 5, + 5, + 1, + 16, + 0, + 8, + 7, + 10, + 3, + 16, + 1, + 0, + 0, + 4, + 16, + 7, + 16, + 16, + 14, + 1, + 5, + 3, + 16, + 12, + 16, + 1, + 16, + 5, + 14, + 14, + 10, + 2, + 4, + 16, + 6, + 3, + 11, + 3, + 16, + 1, + 2, + 2, + 16, + 3, + 5, + 5, + 2, + 4, + 16, + 2, + 16, + 5, + 6, + 0, + 1, + 15, + 4, + 2, + 5, + 3, + 8, + 9, + 2, + 1, + 3, + 4, + 1, + 12, + 3, + 5, + 10, + 16, + 3, + 9, + 6, + 5, + 5, + 3, + 4, + 5, + 3, + 16, + 16, + 9, + 4, + 2, + 5, + 1, + 1, + 3, + 10, + 9, + 2, + 3, + 1, + 2, + 3, + 2, + 0, + 1, + 6, + 14, + 1, + 7, + 1, + 1, + 4, + 4, + 5, + 5, + 9, + 1, + 3, + 12, + 9, + 1, + 3, + 5, + 3, + 9, + 8, + 3, + 3, + 3, + 8, + 2, + 5, + 8, + 0, + 6, + 11, + 3, + 3, + 7, + 16, + 7, + 1, + 7, + 3, + 6, + 2, + 5, + 7, + 11, + 4, + 8, + 2, + 16, + 1, + 1, + 3, + 6, + 16, + 1, + 5, + 1, + 4, + 4, + 6, + 1, + 3, + 5, + 6, + 9, + 5, + 3, + 16, + 4, + 8, + 4, + 4, + 3, + 8, + 1, + 6, + 7, + 1, + 4, + 16, + 11, + 4, + 7, + 2, + 3, + 2, + 8, + 1, + 3, + 3, + 4, + 4, + 16, + 1, + 2, + 10, + 14, + 2, + 5, + 4, + 8, + 4, + 14, + 4, + 4, + 2, + 0, + 5, + 4, + 7, + 3, + 3, + 1, + 3, + 16, + 2, + 1, + 2, + 4, + 9, + 1, + 5, + 4, + 3, + 16, + 8, + 3, + 2, + 10, + 2, + 3, + 3, + 16, + 4, + 3, + 10, + 9, + 2, + 1, + 5, + 3, + 16, + 2, + 1, + 3, + 5, + 5, + 9, + 11, + 3, + 7, + 3, + 5, + 8, + 2, + 16, + 4, + 1, + 3, + 5, + 7, + 2, + 8, + 6, + 6, + 6, + 16, + 3, + 5, + 4, + 7, + 4, + 6, + 4, + 5, + 7, + 9, + 1, + 15, + 3, + 15, + 5, + 3, + 10, + 10, + 9, + 1, + 4, + 7, + 16, + 6, + 1, + 4, + 8, + 11, + 9, + 6, + 2, + 3, + 5, + 5, + 5, + 3, + 3, + 0, + 2, + 10, + 16, + 10, + 6, + 5, + 1, + 9, + 16, + 10, + 2, + 1, + 4, + 1, + 13, + 8, + 7, + 6, + 6, + 6, + 5, + 2, + 4, + 2, + 3, + 4, + 12, + 4, + 2, + 8, + 1, + 1, + 7, + 1, + 0, + 5, + 1, + 2, + 4, + 1, + 2, + 1, + 2, + 1, + 0, + 0, + 2, + 6, + 8, + 4, + 0, + 3, + 4, + 5, + 2, + 3, + 2, + 6, + 1, + 2, + 6, + 3, + 2, + 5, + 4, + 3, + 5, + 2, + 6, + 2, + 16, + 1, + 3, + 1, + 4, + 1, + 1, + 3, + 6, + 2, + 2, + 5, + 2, + 5, + 2, + 3, + 2, + 3, + 3, + 2, + 6, + 2, + 2, + 3, + 2, + 1, + 2, + 3, + 4, + 2, + 4, + 10, + 1, + 3, + 6, + 1, + 9, + 6, + 1, + 4, + 4, + 6, + 4, + 3, + 7, + 6, + 7, + 8, + 1, + 2, + 1, + 2, + 2, + 3, + 3, + 1, + 2, + 1, + 2, + 4, + 4, + 3, + 8, + 1, + 2, + 6, + 4, + 2, + 1, + 6, + 1, + 14, + 5, + 9, + 1, + 6, + 5, + 8, + 2, + 9, + 5, + 3, + 3, + 5, + 5, + 2, + 3, + 0, + 7, + 0, + 3, + 5, + 7, + 4, + 1, + 3, + 1, + 2, + 2, + 2, + 2, + 5, + 4, + 5, + 2, + 4, + 7, + 4, + 4, + 3, + 8, + 0, + 0, + 5, + 3, + 8, + 3, + 1, + 3, + 1, + 10, + 8, + 5, + 3, + 3, + 10, + 8, + 4, + 8, + 2, + 5, + 3, + 1, + 3, + 5, + 4, + 1, + 4, + 3, + 4, + 7, + 1, + 4, + 2, + 4, + 4, + 3, + 3, + 2, + 2, + 2, + 3, + 4, + 1, + 3, + 3, + 6, + 7, + 5, + 2, + 6, + 4, + 1, + 4, + 3, + 3, + 2, + 5, + 5, + 5, + 1, + 6, + 1, + 7, + 2, + 3, + 6, + 3, + 4, + 3, + 4, + 0, + 2, + 16, + 5, + 3, + 3, + 5, + 2, + 4, + 1, + 2, + 3, + 4, + 6, + 4, + 2, + 5, + 2, + 1, + 1, + 3, + 1, + 3, + 1, + 3, + 4, + 2, + 6, + 4, + 5, + 4, + 4, + 6, + 5, + 2, + 0, + 4, + 1, + 1, + 3, + 1, + 3, + 3, + 4, + 9, + 0, + 5, + 3, + 3, + 2, + 5, + 4, + 4, + 1, + 4, + 1, + 4, + 2, + 3, + 4, + 8, + 3, + 5, + 4, + 4, + 5, + 2, + 5, + 3, + 1, + 7, + 3, + 5, + 4, + 5, + 6, + 7, + 3, + 2, + 3, + 1, + 4, + 2, + 1, + 1, + 0, + 7, + 9, + 1, + 1, + 5, + 4, + 15, + 0, + 3, + 0, + 4, + 0, + 1, + 1, + 1, + 1, + 3, + 3, + 4, + 4, + 2, + 2, + 2, + 1, + 2, + 4, + 2, + 1, + 2, + 2, + 2, + 2, + 3, + 5, + 5, + 1, + 1, + 1, + 0, + 1, + 3, + 3, + 2, + 4, + 3, + 3, + 5, + 1, + 3, + 2, + 1, + 2, + 1, + 3, + 5, + 2, + 6, + 2, + 4, + 4, + 1, + 4, + 1, + 5, + 1, + 1, + 3, + 2, + 3, + 3, + 4, + 3, + 3, + 1, + 1, + 2, + 1, + 1, + 5, + 4, + 2, + 10, + 3, + 2, + 3, + 2, + 3, + 1, + 5, + 1, + 3, + 1, + 3, + 2, + 1, + 2, + 2, + 2, + 2, + 1, + 1, + 3, + 3, + 3, + 5, + 2, + 3, + 3, + 3, + 2, + 4, + 3, + 0, + 2, + 2, + 2, + 2, + 1, + 4, + 4, + 12, + 1, + 4, + 2, + 1, + 3, + 1, + 4, + 8, + 1, + 3, + 2, + 3, + 4, + 4, + 2, + 3, + 4, + 3, + 4, + 2, + 2, + 4, + 2, + 2, + 2, + 4, + 1, + 4, + 4, + 4, + 3, + 1, + 2, + 1, + 6, + 1, + 1, + 3, + 2, + 1, + 3, + 4, + 2, + 1, + 2, + 2, + 4, + 2, + 1, + 3, + 1, + 2, + 9, + 1, + 3, + 2, + 2, + 3, + 2, + 2, + 4, + 2, + 4, + 10, + 2, + 1, + 1, + 4, + 1, + 7, + 4, + 2, + 5, + 2, + 1, + 3, + 3, + 3, + 2, + 3, + 5, + 2, + 6, + 3, + 1, + 3, + 2, + 3, + 2, + 3, + 4, + 2, + 1, + 1, + 10, + 0, + 4, + 2, + 4, + 7, + 2, + 1, + 1, + 2, + 1, + 4, + 1, + 3, + 3, + 1, + 4, + 6, + 5, + 5, + 5, + 7, + 2, + 2, + 4, + 1, + 1, + 3, + 4, + 3, + 5, + 3, + 2, + 3, + 2, + 4, + 5, + 3, + 2, + 4, + 4, + 5, + 1, + 2, + 2, + 3, + 3, + 4, + 2, + 3, + 3, + 3, + 4, + 6, + 3, + 4, + 3, + 4, + 7, + 3, + 3, + 2, + 2, + 2, + 2, + 3, + 3, + 2, + 2, + 2, + 2, + 3, + 3, + 1, + 3, + 2, + 2, + 3, + 0, + 2, + 2, + 3, + 0, + 2, + 2, + 1, + 4, + 3, + 1, + 3, + 12, + 1, + 5, + 3, + 3, + 3, + 4, + 2, + 1, + 15, + 2, + 2, + 1, + 4, + 4, + 16, + 16, + 3, + 3, + 2, + 2, + 2, + 4, + 2, + 16, + 1, + 16, + 1, + 3, + 3, + 2, + 12, + 3, + 16, + 6, + 1, + 4, + 4, + 2, + 16, + 4, + 1, + 0, + 16, + 16, + 4, + 16, + 1, + 2, + 3, + 0, + 1, + 5, + 1, + 2, + 4, + 4, + 16, + 0, + 4, + 0, + 2, + 2, + 0, + 0, + 1, + 6, + 16, + 1, + 2, + 2, + 4, + 0, + 5, + 16, + 3, + 5, + 1, + 15, + 16, + 1, + 4, + 1, + 1, + 16, + 2, + 16, + 3, + 14, + 4, + 5, + 3, + 1, + 1, + 16, + 6, + 16, + 1, + 1, + 16, + 2, + 4, + 1, + 0, + 2, + 1, + 2, + 4, + 11, + 0, + 11, + 16, + 2, + 1, + 1, + 2, + 1, + 3, + 16, + 16, + 3, + 1, + 3, + 5, + 16, + 4, + 3, + 2, + 4, + 2, + 2, + 1, + 4, + 16, + 2, + 4, + 4, + 7, + 0, + 2, + 4, + 4, + 2, + 6, + 5, + 15, + 16, + 1, + 1, + 16, + 6, + 4, + 1, + 4, + 0, + 1, + 0, + 1, + 1, + 0, + 4, + 1, + 0, + 3, + 5, + 2, + 2, + 14, + 2, + 1, + 16, + 1, + 1, + 16, + 3, + 2, + 5, + 4, + 1, + 2, + 4, + 4, + 0, + 6, + 0, + 4, + 4, + 1, + 2, + 7, + 0, + 2, + 2, + 4, + 1, + 2, + 1, + 2, + 2, + 1, + 11, + 3, + 16, + 2, + 2, + 1, + 3, + 3, + 8, + 2, + 1, + 3, + 3, + 3, + 2, + 16, + 2, + 2, + 4, + 2, + 2, + 7, + 4, + 1, + 3, + 2, + 4, + 2, + 4, + 1, + 2, + 2, + 3, + 1, + 2, + 3, + 2, + 16, + 0, + 1, + 1, + 2, + 3, + 3, + 2, + 3, + 0, + 2, + 4, + 1, + 2, + 16, + 2, + 2, + 1, + 3, + 3, + 14, + 1, + 2, + 4, + 0, + 4, + 3, + 1, + 16, + 2, + 3, + 2, + 16, + 2, + 16, + 2, + 5, + 2, + 3, + 16, + 6, + 4, + 4, + 3, + 16, + 2, + 3, + 3, + 3, + 2, + 0, + 3, + 12, + 3, + 5, + 2, + 2, + 1, + 5, + 4, + 0, + 2, + 16, + 0, + 3, + 2, + 2, + 1, + 2, + 3, + 11, + 3, + 4, + 1, + 7, + 3, + 6, + 16, + 2, + 2, + 4, + 3, + 3, + 3, + 1, + 3, + 13, + 0, + 5, + 0, + 4, + 1, + 8, + 4, + 3, + 2, + 3, + 1, + 1, + 2, + 5, + 0, + 3, + 3, + 3, + 16, + 3, + 5, + 16, + 2, + 4, + 3, + 3, + 0, + 3, + 3, + 4, + 2, + 16, + 0, + 0, + 1, + 2, + 7, + 3, + 0, + 3, + 2, + 3, + 2, + 2, + 16, + 2, + 7, + 5, + 2, + 3, + 1, + 2, + 4, + 3, + 6, + 3, + 3, + 4, + 3, + 3, + 4, + 4, + 3, + 16, + 3, + 0, + 7, + 2, + 2, + 3, + 4, + 3, + 3, + 3, + 2, + 1, + 2, + 4, + 1, + 3, + 0, + 3, + 9, + 2, + 1, + 7, + 4, + 1, + 5, + 2, + 1, + 0, + 2, + 16, + 3, + 1, + 0, + 5, + 3, + 16, + 3, + 2, + 3, + 3, + 9, + 2, + 13, + 2, + 2, + 1, + 2, + 2, + 3, + 2, + 3, + 5, + 4, + 1, + 14, + 4, + 1, + 2, + 1, + 1, + 2, + 1, + 3, + 16, + 1, + 2, + 3, + 0, + 3, + 0, + 4, + 2, + 4, + 1, + 4, + 3, + 3, + 2, + 2, + 3, + 3, + 1, + 2, + 2, + 3, + 4, + 2, + 16, + 3, + 1, + 3, + 3, + 2, + 1, + 1, + 6, + 0, + 2, + 2, + 5, + 1, + 2, + 7, + 2, + 2, + 2, + 0, + 2, + 16, + 3, + 1, + 3, + 2, + 4, + 1, + 1, + 1, + 2, + 1, + 9, + 2, + 2, + 3, + 16, + 1, + 16, + 2, + 3, + 2, + 1, + 3, + 2, + 4, + 4, + 2, + 3, + 11, + 3, + 2, + 3, + 1, + 3, + 1, + 2, + 4, + 16, + 0, + 1, + 3, + 4, + 2, + 3, + 16, + 8, + 2, + 1, + 3, + 16, + 13, + 1, + 4, + 5, + 7, + 4, + 2, + 2, + 2, + 1, + 5, + 2, + 3, + 16, + 2, + 1, + 7, + 2, + 4, + 2, + 3, + 3, + 0, + 16, + 3, + 3, + 2, + 1, + 3, + 3, + 2, + 3, + 1, + 16, + 6, + 2, + 3, + 3, + 3, + 5, + 1, + 15, + 5, + 3, + 11, + 2, + 16, + 1, + 6, + 2, + 1, + 3, + 16, + 1, + 3, + 3, + 2, + 1, + 1, + 2, + 1, + 4, + 3, + 2, + 2, + 1, + 2, + 0, + 2, + 16, + 16, + 1, + 4, + 3, + 3, + 3, + 2, + 3, + 7, + 16, + 1, + 5, + 3, + 2, + 6, + 5, + 5, + 1, + 4, + 8, + 2, + 1, + 1, + 1, + 2, + 1, + 5, + 2, + 2, + 1, + 2, + 6, + 2, + 2, + 2, + 4, + 2, + 2, + 3, + 2, + 2, + 3, + 5, + 1, + 2, + 3, + 4, + 3, + 1, + 3, + 1, + 5, + 1, + 2, + 5, + 2, + 1, + 3, + 2, + 4, + 3, + 1, + 3, + 1, + 1, + 1, + 1, + 6, + 1, + 1, + 0, + 2, + 2, + 1, + 1, + 1, + 5, + 1, + 1, + 1, + 3, + 2, + 1, + 5, + 1, + 4, + 1, + 3, + 3, + 1, + 3, + 2, + 2, + 4, + 3, + 4, + 1, + 4, + 3, + 3, + 1, + 5, + 2, + 1, + 3, + 1, + 1, + 2, + 2, + 1, + 2, + 2, + 6, + 1, + 3, + 2, + 2, + 2, + 4, + 2, + 2, + 3, + 2, + 2, + 2, + 1, + 3, + 2, + 4, + 3, + 3, + 2, + 1, + 2, + 5, + 2, + 1, + 4, + 1, + 4, + 5, + 2, + 4, + 2, + 3, + 2, + 3, + 1, + 6, + 3, + 2, + 0, + 4, + 1, + 3, + 6, + 1, + 1, + 1, + 2, + 2, + 3, + 6, + 4, + 2, + 4, + 6, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 4, + 4, + 2, + 2, + 3, + 1, + 2, + 1, + 3, + 3, + 2, + 2, + 2, + 3, + 2, + 7, + 3, + 1, + 6, + 2, + 2, + 0, + 1, + 2, + 3, + 7, + 2, + 2, + 2, + 3, + 2, + 2, + 4, + 2, + 1, + 2, + 1, + 2, + 3, + 2, + 2, + 2, + 2, + 2, + 4, + 1, + 3, + 5, + 1, + 2, + 1, + 2, + 5, + 2, + 3, + 3, + 2, + 2, + 3, + 2, + 2, + 1, + 2, + 1, + 2, + 1, + 3, + 2, + 2, + 3, + 1, + 1, + 2, + 1, + 2, + 8, + 3, + 2, + 2, + 2, + 3, + 3, + 3, + 6, + 1, + 1, + 4, + 4, + 1, + 1, + 2, + 2, + 2, + 4, + 4, + 2, + 2, + 4, + 1, + 3, + 1, + 3, + 1, + 2, + 3, + 1, + 1, + 2, + 4, + 2, + 2, + 3, + 5, + 2, + 3, + 3, + 2, + 2, + 1, + 1, + 3, + 2, + 2, + 1, + 6, + 3, + 1, + 1, + 1, + 2, + 3, + 2, + 3, + 4, + 4, + 4, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 1, + 1, + 2, + 2, + 2, + 2, + 2, + 3, + 3, + 2, + 10, + 4, + 3, + 2, + 2, + 3, + 2, + 6, + 3, + 3, + 4, + 3, + 3, + 2, + 1, + 3, + 2, + 3, + 1, + 2, + 2, + 3, + 2, + 6, + 1, + 3, + 1, + 2, + 2, + 1, + 3, + 1, + 4, + 3, + 2, + 2, + 3, + 4, + 3, + 3, + 3, + 1, + 2, + 1, + 2, + 1, + 1, + 2, + 1, + 2, + 3, + 2, + 2, + 2, + 2, + 3, + 2, + 4, + 5, + 1, + 4, + 1, + 4, + 3, + 1, + 5, + 3, + 1, + 3, + 3, + 8, + 1, + 5, + 1, + 3, + 3, + 3, + 1, + 1, + 2, + 2, + 3, + 3, + 3, + 1, + 6, + 2, + 1, + 3, + 1, + 2, + 1, + 2, + 2, + 1, + 3, + 1, + 1, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 5, + 2, + 1, + 2, + 3, + 2, + 2, + 1, + 3, + 2, + 3, + 1, + 2, + 2, + 1, + 2, + 1, + 3, + 2, + 1, + 3, + 5, + 2, + 4, + 3, + 3, + 2, + 3, + 3, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 7, + 3, + 1, + 2, + 2, + 2, + 1, + 3, + 2, + 2, + 3, + 3, + 2, + 7, + 2, + 1, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 1, + 1, + 2, + 2, + 1, + 1, + 3, + 2, + 2, + 1, + 2, + 1, + 2, + 2, + 2, + 2, + 1, + 1, + 2, + 2, + 2, + 2, + 2, + 3, + 2, + 2, + 2, + 5, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 4, + 1, + 1, + 2, + 2, + 3, + 2, + 2, + 1, + 2, + 2, + 2, + 3, + 2, + 2, + 2, + 3, + 2, + 2, + 1, + 2, + 2, + 3, + 1, + 2, + 1, + 2, + 2, + 3, + 2, + 3, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 3, + 2, + 2, + 1, + 1, + 3, + 2, + 1, + 2, + 2, + 2, + 2, + 1, + 2, + 1, + 3, + 2, + 2, + 3, + 2, + 3, + 2, + 2, + 2, + 3, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 1, + 2, + 3, + 3, + 2, + 3, + 2, + 2, + 3, + 2, + 2, + 2, + 3, + 2, + 1, + 2, + 4, + 2, + 2, + 3, + 3, + 2, + 1, + 3, + 1, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 3, + 2, + 1, + 2, + 3, + 1, + 2, + 2, + 1, + 2, + 2, + 3, + 2, + 2, + 2, + 3, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 3, + 2, + 2, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 3, + 2, + 1, + 2, + 2, + 1, + 1, + 1, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 3, + 2, + 1, + 2, + 2, + 1, + 2, + 2, + 2, + 1, + 2, + 3, + 1, + 2, + 1, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 2, + 2, + 1, + 3, + 2, + 2, + 2, + 2, + 3, + 2, + 2, + 2, + 1, + 2, + 3, + 1, + 1, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 1, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 3, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 3, + 2, + 1, + 2, + 3, + 1, + 1, + 2, + 1, + 2, + 4, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 3, + 2, + 1, + 1, + 2, + 1, + 2, + 2, + 1, + 2, + 2, + 1, + 2, + 1, + 2, + 2, + 3, + 2, + 2, + 3, + 2, + 1, + 2, + 2, + 2, + 2, + 3, + 2, + 2, + 1, + 1, + 2, + 2, + 2, + 2, + 2, + 1, + 1, + 1, + 1, + 2, + 1, + 2, + 2, + 2, + 3, + 1, + 2, + 2, + 3, + 2, + 2, + 2, + 3, + 1, + 2, + 2, + 2, + 1, + 2, + 3, + 2, + 2, + 2, + 1, + 2, + 2, + 1, + 2, + 3, + 2, + 2, + 3, + 3, + 1, + 1, + 1, + 2, + 3, + 1, + 3, + 2, + 1, + 3, + 1, + 2, + 1, + 2, + 1, + 1, + 3, + 2, + 2, + 2, + 1, + 2, + 2, + 1, + 2, + 2, + 3, + 3, + 2, + 2, + 2, + 2, + 1, + 1, + 1, + 2, + 2, + 2, + 1, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 1, + 1, + 1, + 2, + 1, + 3, + 3, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 6, + 2, + 2, + 2, + 3, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 1, + 1, + 2, + 1, + 1, + 2, + 2, + 1, + 2, + 2, + 3, + 3, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 3, + 2, + 2, + 1, + 2, + 2, + 3, + 2, + 1, + 1, + 2, + 2, + 2, + 1, + 2, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 1, + 1, + 1, + 2, + 2, + 2, + 1, + 1, + 1, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 3, + 2, + 2, + 1, + 2, + 1, + 1, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 1, + 3, + 1, + 2, + 3, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 1, + 2, + 3, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 1, + 1, + 1, + 2, + 3, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 1, + 1, + 2, + 2, + 1, + 2, + 1, + 2, + 3, + 1, + 1, + 2, + 2, + 1, + 2, + 3, + 2, + 2, + 2, + 3, + 1, + 2, + 2, + 2, + 2, + 2, + 3, + 2, + 1, + 2, + 2, + 2, + 1, + 1, + 2, + 1, + 1, + 2, + 1, + 1, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 3, + 2, + 1, + 1, + 2, + 2, + 2, + 1, + 2, + 1, + 2, + 2, + 1, + 1, + 2, + 2, + 3, + 2, + 3, + 2, + 1, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 1, + 1, + 1, + 2, + 2, + 2, + 2, + 2, + 1, + 1, + 2, + 2, + 1, + 2, + 3, + 1, + 3, + 2, + 3, + 1, + 2, + 2, + 2, + 3, + 2, + 2, + 2, + 1, + 2, + 2, + 3, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 3, + 2, + 2, + 3, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 5, + 1, + 2, + 1, + 2, + 2, + 1, + 2, + 2, + 1, + 2, + 2, + 1, + 2, + 2, + 1, + 2, + 2, + 1, + 1, + 2, + 2, + 1, + 1, + 1, + 2, + 2, + 1, + 2, + 2, + 3, + 2, + 1, + 3, + 2, + 1, + 1, + 2, + 2, + 2, + 1, + 1, + 2, + 1, + 1, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 1, + 3, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 3, + 1, + 2, + 2, + 2, + 3, + 2, + 2, + 2, + 2, + 1, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 1, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 1, + 3, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 1, + 2, + 2, + 1, + 1, + 1, + 1, + 3, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 3, + 1, + 3, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 1, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 1, + 2, + 3, + 1, + 2, + 2, + 1, + 3, + 2, + 2, + 1, + 1, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 3, + 2, + 2, + 3, + 2, + 2, + 2, + 1, + 2, + 2, + 1, + 2, + 2, + 3, + 1, + 3, + 1, + 3, + 2, + 2, + 1, + 1, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 1, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 3, + 2, + 2, + 1, + 1, + 1, + 2, + 2, + 2, + 2, + 2, + 3, + 2, + 2, + 2, + 2, + 2, + 1, + 1, + 2, + 2, + 2, + 1, + 1, + 2, + 2, + 2, + 2, + 3, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 1, + 2, + 2, + 2, + 2, + 1, + 3, + 2, + 1, + 2, + 1, + 3, + 2, + 1, + 1, + 2, + 2, + 2, + 1, + 2, + 2, + 3, + 1, + 1, + 2, + 2, + 2, + 2, + 1, + 1, + 2, + 2, + 3, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 4, + 2, + 2, + 4, + 1, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 1, + 3, + 1, + 2, + 3, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 1, + 1, + 2, + 2, + 2, + 2, + 2, + 3, + 1, + 1, + 2, + 1, + 1, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 1, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 1, + 1, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 3, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 1, + 2, + 1, + 1, + 1, + 3, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 3, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 3, + 3, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 3, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 1, + 2, + 2, + 1, + 1, + 2, + 2, + 2, + 1, + 2, + 2, + 1, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 3, + 1, + 1, + 2, + 1, + 1, + 2, + 1, + 2, + 2, + 3, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 2, + 3, + 2, + 2, + 2, + 3, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 1, + 3, + 2, + 1, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 3, + 1, + 2, + 1, + 1, + 3, + 2, + 2, + 1, + 1, + 2, + 2, + 2, + 2, + 2, + 1, + 1, + 2, + 2, + 1, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 3, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 1, + 1, + 2, + 1, + 2, + 1, + 2, + 2, + 2, + 1, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 3, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 3, + 3, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 3, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 3, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 3, + 2, + 3, + 1, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 3, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 3, + 2, + 2, + 2, + 2, + 2, + 3, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 3, + 1, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 3, + 2, + 2, + 2, + 1, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 1, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 3, + 2, + 2, + 2, + 1, + 2, + 2, + 1, + 2, + 3, + 3, + 2, + 1, + 1, + 2, + 2, + 1, + 2, + 3, + 2, + 2, + 3, + 2, + 3, + 2, + 1, + 2, + 2, + 1, + 2, + 1, + 2, + 2, + 2, + 2, + 3, + 2, + 1, + 2, + 2, + 2, + 3, + 2, + 2, + 2, + 1, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 3, + 1, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 1, + 1, + 1, + 2, + 2, + 2, + 1, + 2, + 2, + 1, + 2, + 2, + 3, + 2, + 2, + 3, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 3, + 2, + 1, + 2, + 2, + 1, + 2, + 2, + 3, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 1, + 1, + 2, + 2, + 2, + 1, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 1, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 1, + 1, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 3, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 1, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 3, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 3, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 3, + 1, + 2, + 1, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 1, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 3, + 2, + 1, + 2, + 2, + 1, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 3, + 1, + 2, + 2, + 2, + 3, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 3, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 3, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 3, + 2, + 2, + 2, + 2, + 3, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 3, + 2, + 2, + 2, + 1, + 1, + 3, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 3, + 2, + 2, + 2, + 1, + 2, + 2, + 1, + 2, + 1, + 2, + 3, + 1, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 3, + 2, + 3, + 4, + 2, + 2, + 2, + 2, + 2, + 1, + 1, + 2, + 2, + 1, + 1, + 2, + 3, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 1, + 2, + 2, + 1, + 2, + 7, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 3, + 2, + 2, + 3, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 3, + 2, + 2, + 2, + 2, + 2, + 3, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 3, + 2, + 2, + 3, + 2, + 1, + 3, + 3, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 3, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 1, + 2, + 2, + 1, + 2, + 2, + 2, + 1, + 4, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 2, + 1, + 2, + 2, + 2, + 3, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 3, + 2, + 2, + 2, + 2, + 1, + 1, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 3, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 1, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 3, + 2, + 2, + 2, + 3, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 3, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 3, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 1, + 2, + 2, + 2, + 1, + 2, + 2, + 3, + 2, + 2, + 2, + 1, + 2, + 3, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 1, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 3, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 3, + 1, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 1, + 2, + 2, + 1, + 1, + 2, + 1, + 2, + 2, + 1, + 2, + 1, + 1, + 2, + 2, + 2, + 2, + 1, + 2, + 3, + 1, + 3, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 3, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 3, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 3, + 1, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 3, + 3, + 2, + 3, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 1, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 3, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 3, + 1, + 1, + 2, + 2, + 2, + 1, + 1, + 2, + 2, + 1, + 2, + 2, + 2, + 1, + 2, + 1, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 3, + 2, + 2, + 2, + 1, + 2, + 1, + 2, + 2, + 3, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 3, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 3, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 1, + 2, + 3, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 3, + 1, + 2, + 2, + 1, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 3, + 2, + 1, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 3, + 2, + 2, + 2, + 2, + 2, + 3, + 1, + 2, + 2, + 2, + 3, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 3, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 3, + 2, + 2, + 2, + 2, + 2, + 3, + 2, + 2, + 1, + 2, + 2, + 3, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 3, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 3, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 3, + 2, + 2, + 1, + 2, + 3, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 3, + 2, + 2, + 1, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 3, + 2, + 2, + 2, + 3, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 1, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 1, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 1, + 2, + 2, + 1, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 1, + 2, + 2, + 2, + 2, + 1, + 2, + 1, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 3, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 3, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 3, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 1, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 1, + 2, + 1, + 2, + 2, + 2, + 1, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 1, + 3, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 3, + 2, + 1, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 3, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 3, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 3, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 3, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 3, + 3, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 3, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 3, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 3, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 3, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 3, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 3, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 3, + 1, + 2, + 3, + 2, + 2, + 1, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 3, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 3, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 3, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 3, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 3, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 3, + 2, + 1, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 3, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 1, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 3, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 3, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 3, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 3, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 3, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 3, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 3, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 3, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 3, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 3, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 3, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 3, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 3, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 3, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 3, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 3, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 3, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2 + ], + "lane_rows": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 57, + 58, + 59, + 60, + 61, + 62, + 63, + 64, + 65, + 66, + 67, + 68, + 69, + 70, + 71, + 72, + 73, + 74, + 75, + 76, + 77, + 78, + 79, + 80, + 81, + 82, + 83, + 84, + 85, + 86, + 87, + 88, + 89, + 90, + 91, + 92, + 93, + 94, + 95, + 96, + 97, + 98, + 99, + 100, + 101, + 102, + 103, + 104, + 105, + 106, + 107, + 108, + 109, + 110, + 111, + 112, + 113, + 114, + 115, + 116, + 117, + 118, + 119, + 120, + 121, + 122, + 123, + 124, + 125, + 126, + 127, + 128, + 129, + 130, + 131, + 132, + 133, + 134, + 135, + 136, + 137, + 138, + 139, + 140, + 141, + 142, + 143, + 144, + 145, + 146, + 147, + 148, + 149, + 150, + 151, + 152, + 153, + 154, + 155, + 156, + 157, + 158, + 159, + 160, + 161, + 162, + 163, + 164, + 165, + 166, + 167, + 168, + 169, + 170, + 171, + 172, + 173, + 174, + 175, + 176, + 177, + 178, + 179, + 180, + 181, + 182, + 183, + 184, + 185, + 186, + 187, + 188, + 189, + 190, + 191, + 192, + 193, + 194, + 195, + 196, + 197, + 198, + 199, + 200, + 201, + 202, + 203, + 204, + 205, + 206, + 207, + 208, + 209, + 210, + 211, + 212, + 213, + 214, + 215, + 216, + 217, + 218, + 219, + 220, + 221, + 222, + 223, + 224, + 225, + 226, + 227, + 228, + 229, + 230, + 231, + 232, + 233, + 234, + 235, + 236, + 237, + 238, + 239, + 240, + 241, + 242, + 243, + 244, + 245, + 246, + 247, + 248, + 249, + 250, + 251, + 252, + 253, + 254, + 255, + 256, + 257, + 258, + 259, + 260, + 261, + 262, + 263, + 264, + 265, + 266, + 267, + 268, + 269, + 270, + 271, + 272, + 273, + 274, + 275, + 276, + 277, + 278, + 279, + 280, + 281, + 282, + 283, + 284, + 285, + 286, + 287, + 288, + 289, + 290, + 291, + 292, + 293, + 294, + 295, + 296, + 297, + 298, + 299, + 300, + 301, + 302, + 303, + 304, + 305, + 306, + 307, + 308, + 309, + 310, + 311, + 312, + 313, + 314, + 315, + 316, + 317, + 318, + 319, + 320, + 321, + 322, + 323, + 324, + 325, + 326, + 327, + 328, + 329, + 330, + 331, + 332, + 333, + 334, + 335, + 336, + 337, + 338, + 339, + 340, + 341, + 342, + 343, + 344, + 345, + 346, + 347, + 348, + 349, + 350, + 351, + 352, + 353, + 354, + 355, + 356, + 357, + 358, + 359, + 360, + 361, + 362, + 363, + 364, + 365, + 366, + 367, + 368, + 369, + 370, + 371, + 372, + 373, + 374, + 375, + 376, + 377, + 378, + 379, + 380, + 381, + 382, + 383, + 384, + 385, + 386, + 387, + 388, + 389, + 390, + 391, + 392, + 393, + 394, + 395, + 396, + 397, + 398, + 399, + 400, + 401, + 402, + 403, + 404, + 405, + 406, + 407, + 408, + 409, + 410, + 411, + 412, + 413, + 414, + 415, + 416, + 417, + 418, + 419, + 420, + 421, + 422, + 423, + 424, + 425, + 426, + 427, + 428, + 429, + 430, + 431, + 432, + 433, + 434, + 435, + 436, + 437, + 438, + 439, + 440, + 441, + 442, + 443, + 444, + 445, + 446, + 447, + 448, + 449, + 450, + 451, + 452, + 453, + 454, + 455, + 456, + 457, + 458, + 459, + 460, + 461, + 462, + 463, + 464, + 465, + 466, + 467, + 468, + 469, + 470, + 471, + 472, + 473, + 474, + 475, + 476, + 477, + 478, + 479, + 480, + 481, + 482, + 483, + 484, + 485, + 486, + 487, + 488, + 489, + 490, + 491, + 492, + 493, + 494, + 495, + 496, + 497, + 498, + 499, + 500, + 501, + 502, + 503, + 504, + 505, + 506, + 507, + 508, + 509, + 510, + 511, + 512, + 513, + 514, + 515, + 516, + 517, + 518, + 519, + 520, + 521, + 522, + 523, + 524, + 525, + 526, + 527, + 528, + 529, + 530, + 531, + 532, + 533, + 534, + 535, + 536, + 537, + 538, + 539, + 540, + 541, + 542, + 543, + 544, + 545, + 546, + 547, + 548, + 549, + 550, + 551, + 552, + 553, + 554, + 555, + 556, + 557, + 558, + 559, + 560, + 561, + 562, + 563, + 564, + 565, + 566, + 567, + 568, + 569, + 570, + 571, + 572, + 573, + 574, + 575, + 576, + 577, + 578, + 579, + 580, + 581, + 582, + 583, + 584, + 585, + 586, + 587, + 588, + 589, + 590, + 591, + 592, + 593, + 594, + 595, + 596, + 597, + 598, + 599, + 600, + 601, + 602, + 603, + 604, + 605, + 606, + 607, + 608, + 609, + 610, + 611, + 612, + 613, + 614, + 615, + 616, + 617, + 618, + 619, + 620, + 621, + 622, + 623, + 624, + 625, + 626, + 627, + 628, + 629, + 630, + 631, + 632, + 633, + 634, + 635, + 636, + 637, + 638, + 639, + 640, + 641, + 642, + 643, + 644, + 645, + 646, + 647, + 648, + 649, + 650, + 651, + 652, + 653, + 654, + 655, + 656, + 657, + 658, + 659, + 660, + 661, + 662, + 663, + 664, + 665, + 666, + 667, + 668, + 669, + 670, + 671, + 672, + 673, + 674, + 675, + 676, + 677, + 678, + 679, + 680, + 681, + 682, + 683, + 684, + 685, + 686, + 687, + 688, + 689, + 690, + 691, + 692, + 693, + 694, + 695, + 696, + 697, + 698, + 699, + 700, + 701, + 702, + 703, + 704, + 705, + 706, + 707, + 708, + 709, + 710, + 711, + 712, + 713, + 714, + 715, + 716, + 717, + 718, + 719, + 720, + 721, + 722, + 723, + 724, + 725, + 726, + 727, + 728, + 729, + 730, + 731, + 732, + 733, + 734, + 735, + 736, + 737, + 738, + 739, + 740, + 741, + 742, + 743, + 744, + 745, + 746, + 747, + 748, + 749, + 750, + 751, + 752, + 753, + 754, + 755, + 756, + 757, + 758, + 759, + 760, + 761, + 762, + 763, + 764, + 765, + 766, + 767, + 768, + 769, + 770, + 771, + 772, + 773, + 774, + 775, + 776, + 777, + 778, + 779, + 780, + 781, + 782, + 783, + 784, + 785, + 786, + 787, + 788, + 789, + 790, + 791, + 792, + 793, + 794, + 795, + 796, + 797, + 798, + 799, + 800, + 801, + 802, + 803, + 804, + 805, + 806, + 807, + 808, + 809, + 810, + 811, + 812, + 813, + 814, + 815, + 816, + 817, + 818, + 819, + 820, + 821, + 822, + 823, + 824, + 825, + 826, + 827, + 828, + 829, + 830, + 831, + 832, + 833, + 834, + 835, + 836, + 837, + 838, + 839, + 840, + 841, + 842, + 843, + 844, + 845, + 846, + 847, + 848, + 849, + 850, + 851, + 852, + 853, + 854, + 855, + 856, + 857, + 858, + 859, + 860, + 861, + 862, + 863, + 864, + 865, + 866, + 867, + 868, + 869, + 870, + 871, + 872, + 873, + 874, + 875, + 876, + 877, + 878, + 879, + 880, + 881, + 882, + 883, + 884, + 885, + 886, + 887, + 888, + 889, + 890, + 891, + 892, + 893, + 894, + 895, + 896, + 897, + 898, + 899, + 900, + 901, + 902, + 903, + 904, + 905, + 906, + 907, + 908, + 909, + 910, + 911, + 912, + 913, + 914, + 915, + 916, + 917, + 918, + 919, + 920, + 921, + 922, + 923, + 924, + 925, + 926, + 927, + 928, + 929, + 930, + 931, + 932, + 933, + 934, + 935, + 936, + 937, + 938, + 939, + 940, + 941, + 942, + 943, + 944, + 945, + 946, + 947, + 948, + 949, + 950, + 951, + 952, + 953, + 954, + 955, + 956, + 957, + 958, + 959, + 960, + 961, + 962, + 963, + 964, + 965, + 966, + 967, + 968, + 969, + 970, + 971, + 972, + 973, + 974, + 975, + 976, + 977, + 978, + 979, + 980, + 981, + 982, + 983, + 984, + 985, + 986, + 987, + 988, + 989, + 990, + 991, + 992, + 993, + 994, + 995, + 996, + 997, + 998, + 999, + 1000, + 1001, + 1002, + 1003, + 1004, + 1005, + 1006, + 1007, + 1008, + 1009, + 1010, + 1011, + 1012, + 1013, + 1014, + 1015, + 1016, + 1017, + 1018, + 1019, + 1020, + 1021, + 1022, + 1023, + 1024, + 1025, + 1026, + 1027, + 1028, + 1029, + 1030, + 1031, + 1032, + 1033, + 1034, + 1035, + 1036, + 1037, + 1038, + 1039, + 1040, + 1041, + 1042, + 1043, + 1044, + 1045, + 1046, + 1047, + 1048, + 1049, + 1050, + 1051, + 1052, + 1053, + 1054, + 1055, + 1056, + 1057, + 1058, + 1059, + 1060, + 1061, + 1062, + 1063, + 1064, + 1065, + 1066, + 1067, + 1068, + 1069, + 1070, + 1071, + 1072, + 1073, + 1074, + 1075, + 1076, + 1077, + 1078, + 1079, + 1080, + 1081, + 1082, + 1083, + 1084, + 1085, + 1086, + 1087, + 1088, + 1089, + 1090, + 1091, + 1092, + 1093, + 1094, + 1095, + 1096, + 1097, + 1098, + 1099, + 1100, + 1101, + 1102, + 1103, + 1104, + 1105, + 1106, + 1107, + 1108, + 1109, + 1110, + 1111, + 1112, + 1113, + 1114, + 1115, + 1116, + 1117, + 1118, + 1119, + 1120, + 1121, + 1122, + 1123, + 1124, + 1125, + 1126, + 1127, + 1128, + 1129, + 1130, + 1131, + 1132, + 1133, + 1134, + 1135, + 1136, + 1137, + 1138, + 1139, + 1140, + 1141, + 1142, + 1143, + 1144, + 1145, + 1146, + 1147, + 1148, + 1149, + 1150, + 1151, + 1152, + 1153, + 1154, + 1155, + 1156, + 1157, + 1158, + 1159, + 1160, + 1161, + 1162, + 1163, + 1164, + 1165, + 1166, + 1167, + 1168, + 1169, + 1170, + 1171, + 1172, + 1173, + 1174, + 1175, + 1176, + 1177, + 1178, + 1179, + 1180, + 1181, + 1182, + 1183, + 1184, + 1185, + 1186, + 1187, + 1188, + 1189, + 1190, + 1191, + 1192, + 1193, + 1194, + 1195, + 1196, + 1197, + 1198, + 1199, + 1200, + 1201, + 1202, + 1203, + 1204, + 1205, + 1206, + 1207, + 1208, + 1209, + 1210, + 1211, + 1212, + 1213, + 1214, + 1215, + 1216, + 1217, + 1218, + 1219, + 1220, + 1221, + 1222, + 1223, + 1224, + 1225, + 1226, + 1227, + 1228, + 1229, + 1230, + 1231, + 1232, + 1233, + 1234, + 1235, + 1236, + 1237, + 1238, + 1239, + 1240, + 1241, + 1242, + 1243, + 1244, + 1245, + 1246, + 1247, + 1248, + 1249, + 1250, + 1251, + 1252, + 1253, + 1254, + 1255, + 1256, + 1257, + 1258, + 1259, + 1260, + 1261, + 1262, + 1263, + 1264, + 1265, + 1266, + 1267, + 1268, + 1269, + 1270, + 1271, + 1272, + 1273, + 1274, + 1275, + 1276, + 1277, + 1278, + 1279, + 1280, + 1281, + 1282, + 1283, + 1284, + 1285, + 1286, + 1287, + 1288, + 1289, + 1290, + 1291, + 1292, + 1293, + 1294, + 1295, + 1296, + 1297, + 1298, + 1299, + 1300, + 1301, + 1302, + 1303, + 1304, + 1305, + 1306, + 1307, + 1308, + 1309, + 1310, + 1311, + 1312, + 1313, + 1314, + 1315, + 1316, + 1317, + 1318, + 1319, + 1320, + 1321, + 1322, + 1323, + 1324, + 1325, + 1326, + 1327, + 1328, + 1329, + 1330, + 1331, + 1332, + 1333, + 1334, + 1335, + 1336, + 1337, + 1338, + 1339, + 1340, + 1341, + 1342, + 1343, + 1344, + 1345, + 1346, + 1347, + 1348, + 1349, + 1350, + 1351, + 1352, + 1353, + 1354, + 1355, + 1356, + 1357, + 1358, + 1359, + 1360, + 1361, + 1362, + 1363, + 1364, + 1365, + 1366, + 1367, + 1368, + 1369, + 1370, + 1371, + 1372, + 1373, + 1374, + 1375, + 1376, + 1377, + 1378, + 1379, + 1380, + 1381, + 1382, + 1383, + 1384, + 1385, + 1386, + 1387, + 1388, + 1389, + 1390, + 1391, + 1392, + 1393, + 1394, + 1395, + 1396, + 1397, + 1398, + 1399, + 1400, + 1401, + 1402, + 1403, + 1404, + 1405, + 1406, + 1407, + 1408, + 1409, + 1410, + 1411, + 1412, + 1413, + 1414, + 1415, + 1416, + 1417, + 1418, + 1419, + 1420, + 1421, + 1422, + 1423, + 1424, + 1425, + 1426, + 1427, + 1428, + 1429, + 1430, + 1431, + 1432, + 1433, + 1434, + 1435, + 1436, + 1437, + 1438, + 1439, + 1440, + 1441, + 1442, + 1443, + 1444, + 1445, + 1446, + 1447, + 1448, + 1449, + 1450, + 1451, + 1452, + 1453, + 1454, + 1455, + 1456, + 1457, + 1458, + 1459, + 1460, + 1461, + 1462, + 1463, + 1464, + 1465, + 1466, + 1467, + 1468, + 1469, + 1470, + 1471, + 1472, + 1473, + 1474, + 1475, + 1476, + 1477, + 1478, + 1479, + 1480, + 1481, + 1482, + 1483, + 1484, + 1485, + 1486, + 1487, + 1488, + 1489, + 1490, + 1491, + 1492, + 1493, + 1494, + 1495, + 1496, + 1497, + 1498, + 1499, + 1500, + 1501, + 1502, + 1503, + 1504, + 1505, + 1506, + 1507, + 1508, + 1509, + 1510, + 1511, + 1512, + 1513, + 1514, + 1515, + 1516, + 1517, + 1518, + 1519, + 1520, + 1521, + 1522, + 1523, + 1524, + 1525, + 1526, + 1527, + 1528, + 1529, + 1530, + 1531, + 1532, + 1533, + 1534, + 1535, + 1536, + 1537, + 1538, + 1539, + 1540, + 1541, + 1542, + 1543, + 1544, + 1545, + 1546, + 1547, + 1548, + 1549, + 1550, + 1551, + 1552, + 1553, + 1554, + 1555, + 1556, + 1557, + 1558, + 1559, + 1560, + 1561, + 1562, + 1563, + 1564, + 1565, + 1566, + 1567, + 1568, + 1569, + 1570, + 1571, + 1572, + 1573, + 1574, + 1575, + 1576, + 1577, + 1578, + 1579, + 1580, + 1581, + 1582, + 1583, + 1584, + 1585, + 1586, + 1587, + 1588, + 1589, + 1590, + 1591, + 1592, + 1593, + 1594, + 1595, + 1596, + 1597, + 1598, + 1599, + 1600, + 1601, + 1602, + 1603, + 1604, + 1605, + 1606, + 1607, + 1608, + 1609, + 1610, + 1611, + 1612, + 1613, + 1614, + 1615, + 1616, + 1617, + 1618, + 1619, + 1620, + 1621, + 1622, + 1623, + 1624, + 1625, + 1626, + 1627, + 1628, + 1629, + 1630, + 1631, + 1632, + 1633, + 1634, + 1635, + 1636, + 1637, + 1638, + 1639, + 1640, + 1641, + 1642, + 1643, + 1644, + 1645, + 1646, + 1647, + 1648, + 1649, + 1650, + 1651, + 1652, + 1653, + 1654, + 1655, + 1656, + 1657, + 1658, + 1659, + 1660, + 1661, + 1662, + 1663, + 1664, + 1665, + 1666, + 1667, + 1668, + 1669, + 1670, + 1671, + 1672, + 1673, + 1674, + 1675, + 1676, + 1677, + 1678, + 1679, + 1680, + 1681, + 1682, + 1683, + 1684, + 1685, + 1686, + 1687, + 1688, + 1689, + 1690, + 1691, + 1692, + 1693, + 1694, + 1695, + 1696, + 1697, + 1698, + 1699, + 1700, + 1701, + 1702, + 1703, + 1704, + 1705, + 1706, + 1707, + 1708, + 1709, + 1710, + 1711, + 1712, + 1713, + 1714, + 1715, + 1716, + 1717, + 1718, + 1719, + 1720, + 1721, + 1722, + 1723, + 1724, + 1725, + 1726, + 1727, + 1728, + 1729, + 1730, + 1731, + 1732, + 1733, + 1734, + 1735, + 1736, + 1737, + 1738, + 1739, + 1740, + 1741, + 1742, + 1743, + 1744, + 1745, + 1746, + 1747, + 1748, + 1749, + 1750, + 1751, + 1752, + 1753, + 1754, + 1755, + 1756, + 1757, + 1758, + 1759, + 1760, + 1761, + 1762, + 1763, + 1764, + 1765, + 1766, + 1767, + 1768, + 1769, + 1770, + 1771, + 1772, + 1773, + 1774, + 1775, + 1776, + 1777, + 1778, + 1779, + 1780, + 1781, + 1782, + 1783, + 1784, + 1785, + 1786, + 1787, + 1788, + 1789, + 1790, + 1791, + 1792, + 1793, + 1794, + 1795, + 1796, + 1797, + 1798, + 1799, + 1800, + 1801, + 1802, + 1803, + 1804, + 1805, + 1806, + 1807, + 1808, + 1809, + 1810, + 1811, + 1812, + 1813, + 1814, + 1815, + 1816, + 1817, + 1818, + 1819, + 1820, + 1821, + 1822, + 1823, + 1824, + 1825, + 1826, + 1827, + 1828, + 1829, + 1830, + 1831, + 1832, + 1833, + 1834, + 1835, + 1836, + 1837, + 1838, + 1839, + 1840, + 1841, + 1842, + 1843, + 1844, + 1845, + 1846, + 1847, + 1848, + 1849, + 1850, + 1851, + 1852, + 1853, + 1854, + 1855, + 1856, + 1857, + 1858, + 1859, + 1860, + 1861, + 1862, + 1863, + 1864, + 1865, + 1866, + 1867, + 1868, + 1869, + 1870, + 1871, + 1872, + 1873, + 1874, + 1875, + 1876, + 1877, + 1878, + 1879, + 1880, + 1881, + 1882, + 1883, + 1884, + 1885, + 1886, + 1887, + 1888, + 1889, + 1890, + 1891, + 1892, + 1893, + 1894, + 1895, + 1896, + 1897, + 1898, + 1899, + 1900, + 1901, + 1902, + 1903, + 1904, + 1905, + 1906, + 1907, + 1908, + 1909, + 1910, + 1911, + 1912, + 1913, + 1914, + 1915, + 1916, + 1917, + 1918, + 1919, + 1920, + 1921, + 1922, + 1923, + 1924, + 1925, + 1926, + 1927, + 1928, + 1929, + 1930, + 1931, + 1932, + 1933, + 1934, + 1935, + 1936, + 1937, + 1938, + 1939, + 1940, + 1941, + 1942, + 1943, + 1944, + 1945, + 1946, + 1947, + 1948, + 1949, + 1950, + 1951, + 1952, + 1953, + 1954, + 1955, + 1956, + 1957, + 1958, + 1959, + 1960, + 1961, + 1962, + 1963, + 1964, + 1965, + 1966, + 1967, + 1968, + 1969, + 1970, + 1971, + 1972, + 1973, + 1974, + 1975, + 1976, + 1977, + 1978, + 1979, + 1980, + 1981, + 1982, + 1983, + 1984, + 1985, + 1986, + 1987, + 1988, + 1989, + 1990, + 1991, + 1992, + 1993, + 1994, + 1995, + 1996, + 1997, + 1998, + 1999, + 2000, + 2001, + 2002, + 2003, + 2004, + 2005, + 2006, + 2007, + 2008, + 2009, + 2010, + 2011, + 2012, + 2013, + 2014, + 2015, + 2016, + 2017, + 2018, + 2019, + 2020, + 2021, + 2022, + 2023, + 2024, + 2025, + 2026, + 2027, + 2028, + 2029, + 2030, + 2031, + 2032, + 2033, + 2034, + 2035, + 2036, + 2037, + 2038, + 2039, + 2040, + 2041, + 2042, + 2043, + 2044, + 2045, + 2046, + 2047, + 2048, + 2049, + 2050, + 2051, + 2052, + 2053, + 2054, + 2055, + 2056, + 2057, + 2058, + 2059, + 2060, + 2061, + 2062, + 2063, + 2064, + 2065, + 2066, + 2067, + 2068, + 2069, + 2070, + 2071, + 2072, + 2073, + 2074, + 2075, + 2076, + 2077, + 2078, + 2079, + 2080, + 2081, + 2082, + 2083, + 2084, + 2085, + 2086, + 2087, + 2088, + 2089, + 2090, + 2091, + 2092, + 2093, + 2094, + 2095, + 2096, + 2097, + 2098, + 2099, + 2100, + 2101, + 2102, + 2103, + 2104, + 2105, + 2106, + 2107, + 2108, + 2109, + 2110, + 2111, + 2112, + 2113, + 2114, + 2115, + 2116, + 2117, + 2118, + 2119, + 2120, + 2121, + 2122, + 2123, + 2124, + 2125, + 2126, + 2127, + 2128, + 2129, + 2130, + 2131, + 2132, + 2133, + 2134, + 2135, + 2136, + 2137, + 2138, + 2139, + 2140, + 2141, + 2142, + 2143, + 2144, + 2145, + 2146, + 2147, + 2148, + 2149, + 2150, + 2151, + 2152, + 2153, + 2154, + 2155, + 2156, + 2157, + 2158, + 2159, + 2160, + 2161, + 2162, + 2163, + 2164, + 2165, + 2166, + 2167, + 2168, + 2169, + 2170, + 2171, + 2172, + 2173, + 2174, + 2175, + 2176, + 2177, + 2178, + 2179, + 2180, + 2181, + 2182, + 2183, + 2184, + 2185, + 2186, + 2187, + 2188, + 2189, + 2190, + 2191, + 2192, + 2193, + 2194, + 2195, + 2196, + 2197, + 2198, + 2199, + 2200, + 2201, + 2202, + 2203, + 2204, + 2205, + 2206, + 2207, + 2208, + 2209, + 2210, + 2211, + 2212, + 2213, + 2214, + 2215, + 2216, + 2217, + 2218, + 2219, + 2220, + 2221, + 2222, + 2223, + 2224, + 2225, + 2226, + 2227, + 2228, + 2229, + 2230, + 2231, + 2232, + 2233, + 2234, + 2235, + 2236, + 2237, + 2238, + 2239, + 2240, + 2241, + 2242, + 2243, + 2244, + 2245, + 2246, + 2247, + 2248, + 2249, + 2250, + 2251, + 2252, + 2253, + 2254, + 2255, + 2256, + 2257, + 2258, + 2259, + 2260, + 2261, + 2262, + 2263, + 2264, + 2265, + 2266, + 2267, + 2268, + 2269, + 2270, + 2271, + 2272, + 2273, + 2274, + 2275, + 2276, + 2277, + 2278, + 2279, + 2280, + 2281, + 2282, + 2283, + 2284, + 2285, + 2286, + 2287, + 2288, + 2289, + 2290, + 2291, + 2292, + 2293, + 2294, + 2295, + 2296, + 2297, + 2298, + 2299, + 2300, + 2301, + 2302, + 2303, + 2304, + 2305, + 2306, + 2307, + 2308, + 2309, + 2310, + 2311, + 2312, + 2313, + 2314, + 2315, + 2316, + 2317, + 2318, + 2319, + 2320, + 2321, + 2322, + 2323, + 2324, + 2325, + 2326, + 2327, + 2328, + 2329, + 2330, + 2331, + 2332, + 2333, + 2334, + 2335, + 2336, + 2337, + 2338, + 2339, + 2340, + 2341, + 2342, + 2343, + 2344, + 2345, + 2346, + 2347, + 2348, + 2349, + 2350, + 2351, + 2352, + 2353, + 2354, + 2355, + 2356, + 2357, + 2358, + 2359, + 2360, + 2361, + 2362, + 2363, + 2364, + 2365, + 2366, + 2367, + 2368, + 2369, + 2370, + 2371, + 2372, + 2373, + 2374, + 2375, + 2376, + 2377, + 2378, + 2379, + 2380, + 2381, + 2382, + 2383, + 2384, + 2385, + 2386, + 2387, + 2388, + 2389, + 2390, + 2391, + 2392, + 2393, + 2394, + 2395, + 2396, + 2397, + 2398, + 2399, + 2400, + 2401, + 2402, + 2403, + 2404, + 2405, + 2406, + 2407, + 2408, + 2409, + 2410, + 2411, + 2412, + 2413, + 2414, + 2415, + 2416, + 2417, + 2418, + 2419, + 2420, + 2421, + 2422, + 2423, + 2424, + 2425, + 2426, + 2427, + 2428, + 2429, + 2430, + 2431, + 2432, + 2433, + 2434, + 2435, + 2436, + 2437, + 2438, + 2439, + 2440, + 2441, + 2442, + 2443, + 2444, + 2445, + 2446, + 2447, + 2448, + 2449, + 2450, + 2451, + 2452, + 2453, + 2454, + 2455, + 2456, + 2457, + 2458, + 2459, + 2460, + 2461, + 2462, + 2463, + 2464, + 2465, + 2466, + 2467, + 2468, + 2469, + 2470, + 2471, + 2472, + 2473, + 2474, + 2475, + 2476, + 2477, + 2478, + 2479, + 2480, + 2481, + 2482, + 2483, + 2484, + 2485, + 2486, + 2487, + 2488, + 2489, + 2490, + 2491, + 2492, + 2493, + 2494, + 2495, + 2496, + 2497, + 2498, + 2499, + 2500, + 2501, + 2502, + 2503, + 2504, + 2505, + 2506, + 2507, + 2508, + 2509, + 2510, + 2511, + 2512, + 2513, + 2514, + 2515, + 2516, + 2517, + 2518, + 2519, + 2520, + 2521, + 2522, + 2523, + 2524, + 2525, + 2526, + 2527, + 2528, + 2529, + 2530, + 2531, + 2532, + 2533, + 2534, + 2535, + 2536, + 2537, + 2538, + 2539, + 2540, + 2541, + 2542, + 2543, + 2544, + 2545, + 2546, + 2547, + 2548, + 2549, + 2550, + 2551, + 2552, + 2553, + 2554, + 2555, + 2556, + 2557, + 2558, + 2559, + 2560, + 2561, + 2562, + 2563, + 2564, + 2565, + 2566, + 2567, + 2568, + 2569, + 2570, + 2571, + 2572, + 2573, + 2574, + 2575, + 2576, + 2577, + 2578, + 2579, + 2580, + 2581, + 2582, + 2583, + 2584, + 2585, + 2586, + 2587, + 2588, + 2589, + 2590, + 2591, + 2592, + 2593, + 2594, + 2595, + 2596, + 2597, + 2598, + 2599, + 2600, + 2601, + 2602, + 2603, + 2604, + 2605, + 2606, + 2607, + 2608, + 2609, + 2610, + 2611, + 2612, + 2613, + 2614, + 2615, + 2616, + 2617, + 2618, + 2619, + 2620, + 2621, + 2622, + 2623, + 2624, + 2625, + 2626, + 2627, + 2628, + 2629, + 2630, + 2631, + 2632, + 2633, + 2634, + 2635, + 2636, + 2637, + 2638, + 2639, + 2640, + 2641, + 2642, + 2643, + 2644, + 2645, + 2646, + 2647, + 2648, + 2649, + 2650, + 2651, + 2652, + 2653, + 2654, + 2655, + 2656, + 2657, + 2658, + 2659, + 2660, + 2661, + 2662, + 2663, + 2664, + 2665, + 2666, + 2667, + 2668, + 2669, + 2670, + 2671, + 2672, + 2673, + 2674, + 2675, + 2676, + 2677, + 2678, + 2679, + 2680, + 2681, + 2682, + 2683, + 2684, + 2685, + 2686, + 2687, + 2688, + 2689, + 2690, + 2691, + 2692, + 2693, + 2694, + 2695, + 2696, + 2697, + 2698, + 2699, + 2700, + 2701, + 2702, + 2703, + 2704, + 2705, + 2706, + 2707, + 2708, + 2709, + 2710, + 2711, + 2712, + 2713, + 2714, + 2715, + 2716, + 2717, + 2718, + 2719, + 2720, + 2721, + 2722, + 2723, + 2724, + 2725, + 2726, + 2727, + 2728, + 2729, + 2730, + 2731, + 2732, + 2733, + 2734, + 2735, + 2736, + 2737, + 2738, + 2739, + 2740, + 2741, + 2742, + 2743, + 2744, + 2745, + 2746, + 2747, + 2748, + 2749, + 2750, + 2751, + 2752, + 2753, + 2754, + 2755, + 2756, + 2757, + 2758, + 2759, + 2760, + 2761, + 2762, + 2763, + 2764, + 2765, + 2766, + 2767, + 2768, + 2769, + 2770, + 2771, + 2772, + 2773, + 2774, + 2775, + 2776, + 2777, + 2778, + 2779, + 2780, + 2781, + 2782, + 2783, + 2784, + 2785, + 2786, + 2787, + 2788, + 2789, + 2790, + 2791, + 2792, + 2793, + 2794, + 2795, + 2796, + 2797, + 2798, + 2799, + 2800, + 2801, + 2802, + 2803, + 2804, + 2805, + 2806, + 2807, + 2808, + 2809, + 2810, + 2811, + 2812, + 2813, + 2814, + 2815, + 2816, + 2817, + 2818, + 2819, + 2820, + 2821, + 2822, + 2823, + 2824, + 2825, + 2826, + 2827, + 2828, + 2829, + 2830, + 2831, + 2832, + 2833, + 2834, + 2835, + 2836, + 2837, + 2838, + 2839, + 2840, + 2841, + 2842, + 2843, + 2844, + 2845, + 2846, + 2847, + 2848, + 2849, + 2850, + 2851, + 2852, + 2853, + 2854, + 2855, + 2856, + 2857, + 2858, + 2859, + 2860, + 2861, + 2862, + 2863, + 2864, + 2865, + 2866, + 2867, + 2868, + 2869, + 2870, + 2871, + 2872, + 2873, + 2874, + 2875, + 2876, + 2877, + 2878, + 2879, + 2880, + 2881, + 2882, + 2883, + 2884, + 2885, + 2886, + 2887, + 2888, + 2889, + 2890, + 2891, + 2892, + 2893, + 2894, + 2895, + 2896, + 2897, + 2898, + 2899, + 2900, + 2901, + 2902, + 2903, + 2904, + 2905, + 2906, + 2907, + 2908, + 2909, + 2910, + 2911, + 2912, + 2913, + 2914, + 2915, + 2916, + 2917, + 2918, + 2919, + 2920, + 2921, + 2922, + 2923, + 2924, + 2925, + 2926, + 2927, + 2928, + 2929, + 2930, + 2931, + 2932, + 2933, + 2934, + 2935, + 2936, + 2937, + 2938, + 2939, + 2940, + 2941, + 2942, + 2943, + 2944, + 2945, + 2946, + 2947, + 2948, + 2949, + 2950, + 2951, + 2952, + 2953, + 2954, + 2955, + 2956, + 2957, + 2958, + 2959, + 2960, + 2961, + 2962, + 2963, + 2964, + 2965, + 2966, + 2967, + 2968, + 2969, + 2970, + 2971, + 2972, + 2973, + 2974, + 2975, + 2976, + 2977, + 2978, + 2979, + 2980, + 2981, + 2982, + 2983, + 2984, + 2985, + 2986, + 2987, + 2988, + 2989, + 2990, + 2991, + 2992, + 2993, + 2994, + 2995, + 2996, + 2997, + 2998, + 2999, + 3000, + 3001, + 3002, + 3003, + 3004, + 3005, + 3006, + 3007, + 3008, + 3009, + 3010, + 3011, + 3012, + 3013, + 3014, + 3015, + 3016, + 3017, + 3018, + 3019, + 3020, + 3021, + 3022, + 3023, + 3024, + 3025, + 3026, + 3027, + 3028, + 3029, + 3030, + 3031, + 3032, + 3033, + 3034, + 3035, + 3036, + 3037, + 3038, + 3039, + 3040, + 3041, + 3042, + 3043, + 3044, + 3045, + 3046, + 3047, + 3048, + 3049, + 3050, + 3051, + 3052, + 3053, + 3054, + 3055, + 3056, + 3057, + 3058, + 3059, + 3060, + 3061, + 3062, + 3063, + 3064, + 3065, + 3066, + 3067, + 3068, + 3069, + 3070, + 3071, + 3072, + 3073, + 3074, + 3075, + 3076, + 3077, + 3078, + 3079, + 3080, + 3081, + 3082, + 3083, + 3084, + 3085, + 3086, + 3087, + 3088, + 3089, + 3090, + 3091, + 3092, + 3093, + 3094, + 3095, + 3096, + 3097, + 3098, + 3099, + 3100, + 3101, + 3102, + 3103, + 3104, + 3105, + 3106, + 3107, + 3108, + 3109, + 3110, + 3111, + 3112, + 3113, + 3114, + 3115, + 3116, + 3117, + 3118, + 3119, + 3120, + 3121, + 3122, + 3123, + 3124, + 3125, + 3126, + 3127, + 3128, + 3129, + 3130, + 3131, + 3132, + 3133, + 3134, + 3135, + 3136, + 3137, + 3138, + 3139, + 3140, + 3141, + 3142, + 3143, + 3144, + 3145, + 3146, + 3147, + 3148, + 3149, + 3150, + 3151, + 3152, + 3153, + 3154, + 3155, + 3156, + 3157, + 3158, + 3159, + 3160, + 3161, + 3162, + 3163, + 3164, + 3165, + 3166, + 3167, + 3168, + 3169, + 3170, + 3171, + 3172, + 3173, + 3174, + 3175, + 3176, + 3177, + 3178, + 3179, + 3180, + 3181, + 3182, + 3183, + 3184, + 3185, + 3186, + 3187, + 3188, + 3189, + 3190, + 3191, + 3192, + 3193, + 3194, + 3195, + 3196, + 3197, + 3198, + 3199, + 3200, + 3201, + 3202, + 3203, + 3204, + 3205, + 3206, + 3207, + 3208, + 3209, + 3210, + 3211, + 3212, + 3213, + 3214, + 3215, + 3216, + 3217, + 3218, + 3219, + 3220, + 3221, + 3222, + 3223, + 3224, + 3225, + 3226, + 3227, + 3228, + 3229, + 3230, + 3231, + 3232, + 3233, + 3234, + 3235, + 3236, + 3237, + 3238, + 3239, + 3240, + 3241, + 3242, + 3243, + 3244, + 3245, + 3246, + 3247, + 3248, + 3249, + 3250, + 3251, + 3252, + 3253, + 3254, + 3255, + 3256, + 3257, + 3258, + 3259, + 3260, + 3261, + 3262, + 3263, + 3264, + 3265, + 3266, + 3267, + 3268, + 3269, + 3270, + 3271, + 3272, + 3273, + 3274, + 3275, + 3276, + 3277, + 3278, + 3279, + 3280, + 3281, + 3282, + 3283, + 3284, + 3285, + 3286, + 3287, + 3288, + 3289, + 3290, + 3291, + 3292, + 3293, + 3294, + 3295, + 3296, + 3297, + 3298, + 3299, + 3300, + 3301, + 3302, + 3303, + 3304, + 3305, + 3306, + 3307, + 3308, + 3309, + 3310, + 3311, + 3312, + 3313, + 3314, + 3315, + 3316, + 3317, + 3318, + 3319, + 3320, + 3321, + 3322, + 3323, + 3324, + 3325, + 3326, + 3327, + 3328, + 3329, + 3330, + 3331, + 3332, + 3333, + 3334, + 3335, + 3336, + 3337, + 3338, + 3339, + 3340, + 3341, + 3342, + 3343, + 3344, + 3345, + 3346, + 3347, + 3348, + 3349, + 3350, + 3351, + 3352, + 3353, + 3354, + 3355, + 3356, + 3357, + 3358, + 3359, + 3360, + 3361, + 3362, + 3363, + 3364, + 3365, + 3366, + 3367, + 3368, + 3369, + 3370, + 3371, + 3372, + 3373, + 3374, + 3375, + 3376, + 3377, + 3378, + 3379, + 3380, + 3381, + 3382, + 3383, + 3384, + 3385, + 3386, + 3387, + 3388, + 3389, + 3390, + 3391, + 3392, + 3393, + 3394, + 3395, + 3396, + 3397, + 3398, + 3399, + 3400, + 3401, + 3402, + 3403, + 3404, + 3405, + 3406, + 3407, + 3408, + 3409, + 3410, + 3411, + 3412, + 3413, + 3414, + 3415, + 3416, + 3417, + 3418, + 3419, + 3420, + 3421, + 3422, + 3423, + 3424, + 3425, + 3426, + 3427, + 3428, + 3429, + 3430, + 3431, + 3432, + 3433, + 3434, + 3435, + 3436, + 3437, + 3438, + 3439, + 3440, + 3441, + 3442, + 3443, + 3444, + 3445, + 3446, + 3447, + 3448, + 3449, + 3450, + 3451, + 3452, + 3453, + 3454, + 3455, + 3456, + 3457, + 3458, + 3459, + 3460, + 3461, + 3462, + 3463, + 3464, + 3465, + 3466, + 3467, + 3468, + 3469, + 3470, + 3471, + 3472, + 3473, + 3474, + 3475, + 3476, + 3477, + 3478, + 3479, + 3480, + 3481, + 3482, + 3483, + 3484, + 3485, + 3486, + 3487, + 3488, + 3489, + 3490, + 3491, + 3492, + 3493, + 3494, + 3495, + 3496, + 3497, + 3498, + 3499, + 3500, + 3501, + 3502, + 3503, + 3504, + 3505, + 3506, + 3507, + 3508, + 3509, + 3510, + 3511, + 3512, + 3513, + 3514, + 3515, + 3516, + 3517, + 3518, + 3519, + 3520, + 3521, + 3522, + 3523, + 3524, + 3525, + 3526, + 3527, + 3528, + 3529, + 3530, + 3531, + 3532, + 3533, + 3534, + 3535, + 3536, + 3537, + 3538, + 3539, + 3540, + 3541, + 3542, + 3543, + 3544, + 3545, + 3546, + 3547, + 3548, + 3549, + 3550, + 3551, + 3552, + 3553, + 3554, + 3555, + 3556, + 3557, + 3558, + 3559, + 3560, + 3561, + 3562, + 3563, + 3564, + 3565, + 3566, + 3567, + 3568, + 3569, + 3570, + 3571, + 3572, + 3573, + 3574, + 3575, + 3576, + 3577, + 3578, + 3579, + 3580, + 3581, + 3582, + 3583, + 3584, + 3585, + 3586, + 3587, + 3588, + 3589, + 3590, + 3591, + 3592, + 3593, + 3594, + 3595, + 3596, + 3597, + 3598, + 3599, + 3600, + 3601, + 3602, + 3603, + 3604, + 3605, + 3606, + 3607, + 3608, + 3609, + 3610, + 3611, + 3612, + 3613, + 3614, + 3615, + 3616, + 3617, + 3618, + 3619, + 3620, + 3621, + 3622, + 3623, + 3624, + 3625, + 3626, + 3627, + 3628, + 3629, + 3630, + 3631, + 3632, + 3633, + 3634, + 3635, + 3636, + 3637, + 3638, + 3639, + 3640, + 3641, + 3642, + 3643, + 3644, + 3645, + 3646, + 3647, + 3648, + 3649, + 3650, + 3651, + 3652, + 3653, + 3654, + 3655, + 3656, + 3657, + 3658, + 3659, + 3660, + 3661, + 3662, + 3663, + 3664, + 3665, + 3666, + 3667, + 3668, + 3669, + 3670, + 3671, + 3672, + 3673, + 3674, + 3675, + 3676, + 3677, + 3678, + 3679, + 3680, + 3681, + 3682, + 3683, + 3684, + 3685, + 3686, + 3687, + 3688, + 3689, + 3690, + 3691, + 3692, + 3693, + 3694, + 3695, + 3696, + 3697, + 3698, + 3699, + 3700, + 3701, + 3702, + 3703, + 3704, + 3705, + 3706, + 3707, + 3708, + 3709, + 3710, + 3711, + 3712, + 3713, + 3714, + 3715, + 3716, + 3717, + 3718, + 3719, + 3720, + 3721, + 3722, + 3723, + 3724, + 3725, + 3726, + 3727, + 3728, + 3729, + 3730, + 3731, + 3732, + 3733, + 3734, + 3735, + 3736, + 3737, + 3738, + 3739, + 3740, + 3741, + 3742, + 3743, + 3744, + 3745, + 3746, + 3747, + 3748, + 3749, + 3750, + 3751, + 3752, + 3753, + 3754, + 3755, + 3756, + 3757, + 3758, + 3759, + 3760, + 3761, + 3762, + 3763, + 3764, + 3765, + 3766, + 3767, + 3768, + 3769, + 3770, + 3771, + 3772, + 3773, + 3774, + 3775, + 3776, + 3777, + 3778, + 3779, + 3780, + 3781, + 3782, + 3783, + 3784, + 3785, + 3786, + 3787, + 3788, + 3789, + 3790, + 3791, + 3792, + 3793, + 3794, + 3795, + 3796, + 3797, + 3798, + 3799, + 3800, + 3801, + 3802, + 3803, + 3804, + 3805, + 3806, + 3807, + 3808, + 3809, + 3810, + 3811, + 3812, + 3813, + 3814, + 3815, + 3816, + 3817, + 3818, + 3819, + 3820, + 3821, + 3822, + 3823, + 3824, + 3825, + 3826, + 3827, + 3828, + 3829, + 3830, + 3831, + 3832, + 3833, + 3834, + 3835, + 3836, + 3837, + 3838, + 3839, + 3840, + 3841, + 3842, + 3843, + 3844, + 3845, + 3846, + 3847, + 3848, + 3849, + 3850, + 3851, + 3852, + 3853, + 3854, + 3855, + 3856, + 3857, + 3858, + 3859, + 3860, + 3861, + 3862, + 3863, + 3864, + 3865, + 3866, + 3867, + 3868, + 3869, + 3870, + 3871, + 3872, + 3873, + 3874, + 3875, + 3876, + 3877, + 3878, + 3879, + 3880, + 3881, + 3882, + 3883, + 3884, + 3885, + 3886, + 3887, + 3888, + 3889, + 3890, + 3891, + 3892, + 3893, + 3894, + 3895, + 3896, + 3897, + 3898, + 3899, + 3900, + 3901, + 3902, + 3903, + 3904, + 3905, + 3906, + 3907, + 3908, + 3909, + 3910, + 3911, + 3912, + 3913, + 3914, + 3915, + 3916, + 3917, + 3918, + 3919, + 3920, + 3921, + 3922, + 3923, + 3924, + 3925, + 3926, + 3927, + 3928, + 3929, + 3930, + 3931, + 3932, + 3933, + 3934, + 3935, + 3936, + 3937, + 3938, + 3939, + 3940, + 3941, + 3942, + 3943, + 3944, + 3945, + 3946, + 3947, + 3948, + 3949, + 3950, + 3951, + 3952, + 3953, + 3954, + 3955, + 3956, + 3957, + 3958, + 3959, + 3960, + 3961, + 3962, + 3963, + 3964, + 3965, + 3966, + 3967, + 3968, + 3969, + 3970, + 3971, + 3972, + 3973, + 3974, + 3975, + 3976, + 3977, + 3978, + 3979, + 3980, + 3981, + 3982, + 3983, + 3984, + 3985, + 3986, + 3987, + 3988, + 3989, + 3990, + 3991, + 3992, + 3993, + 3994, + 3995, + 3996, + 3997, + 3998, + 3999, + 4000, + 4001, + 4002, + 4003, + 4004, + 4005, + 4006, + 4007, + 4008, + 4009, + 4010, + 4011, + 4012, + 4013, + 4014, + 4015, + 4016, + 4017, + 4018, + 4019, + 4020, + 4021, + 4022, + 4023, + 4024, + 4025, + 4026, + 4027, + 4028, + 4029, + 4030, + 4031, + 4032, + 4033, + 4034, + 4035, + 4036, + 4037, + 4038, + 4039, + 4040, + 4041, + 4042, + 4043, + 4044, + 4045, + 4046, + 4047, + 4048, + 4049, + 4050, + 4051, + 4052, + 4053, + 4054, + 4055, + 4056, + 4057, + 4058, + 4059, + 4060, + 4061, + 4062, + 4063, + 4064, + 4065, + 4066, + 4067, + 4068, + 4069, + 4070, + 4071, + 4072, + 4073, + 4074, + 4075, + 4076, + 4077, + 4078, + 4079, + 4080, + 4081, + 4082, + 4083, + 4084, + 4085, + 4086, + 4087, + 4088, + 4089, + 4090, + 4091, + 4092, + 4093, + 4094, + 4095, + 4096, + 4097, + 4098, + 4099, + 4100, + 4101, + 4102, + 4103, + 4104, + 4105, + 4106, + 4107, + 4108, + 4109, + 4110, + 4111, + 4112, + 4113, + 4114, + 4115, + 4116, + 4117, + 4118, + 4119, + 4120, + 4121, + 4122, + 4123, + 4124, + 4125, + 4126, + 4127, + 4128, + 4129, + 4130, + 4131, + 4132, + 4133, + 4134, + 4135, + 4136, + 4137, + 4138, + 4139, + 4140, + 4141, + 4142, + 4143, + 4144, + 4145, + 4146, + 4147, + 4148, + 4149, + 4150, + 4151, + 4152, + 4153, + 4154, + 4155, + 4156, + 4157, + 4158, + 4159, + 4160, + 4161, + 4162, + 4163, + 4164, + 4165, + 4166, + 4167, + 4168, + 4169, + 4170, + 4171, + 4172, + 4173, + 4174, + 4175, + 4176, + 4177, + 4178, + 4179, + 4180, + 4181, + 4182, + 4183, + 4184, + 4185, + 4186, + 4187, + 4188, + 4189, + 4190, + 4191, + 4192, + 4193, + 4194, + 4195, + 4196, + 4197, + 4198, + 4199, + 4200, + 4201, + 4202, + 4203, + 4204, + 4205, + 4206, + 4207, + 4208, + 4209, + 4210, + 4211, + 4212, + 4213, + 4214, + 4215, + 4216, + 4217, + 4218, + 4219, + 4220, + 4221, + 4222, + 4223, + 4224, + 4225, + 4226, + 4227, + 4228, + 4229, + 4230, + 4231, + 4232, + 4233, + 4234, + 4235, + 4236, + 4237, + 4238, + 4239, + 4240, + 4241, + 4242, + 4243, + 4244, + 4245, + 4246, + 4247, + 4248, + 4249, + 4250, + 4251, + 4252, + 4253, + 4254, + 4255, + 4256, + 4257, + 4258, + 4259, + 4260, + 4261, + 4262, + 4263, + 4264, + 4265, + 4266, + 4267, + 4268, + 4269, + 4270, + 4271, + 4272, + 4273, + 4274, + 4275, + 4276, + 4277, + 4278, + 4279, + 4280, + 4281, + 4282, + 4283, + 4284, + 4285, + 4286, + 4287, + 4288, + 4289, + 4290, + 4291, + 4292, + 4293, + 4294, + 4295, + 4296, + 4297, + 4298, + 4299, + 4300, + 4301, + 4302, + 4303, + 4304, + 4305, + 4306, + 4307, + 4308, + 4309, + 4310, + 4311, + 4312, + 4313, + 4314, + 4315, + 4316, + 4317, + 4318, + 4319, + 4320, + 4321, + 4322, + 4323, + 4324, + 4325, + 4326, + 4327, + 4328, + 4329, + 4330, + 4331, + 4332, + 4333, + 4334, + 4335, + 4336, + 4337, + 4338, + 4339, + 4340, + 4341, + 4342, + 4343, + 4344, + 4345, + 4346, + 4347, + 4348, + 4349, + 4350, + 4351, + 4352, + 4353, + 4354, + 4355, + 4356, + 4357, + 4358, + 4359, + 4360, + 4361, + 4362, + 4363, + 4364, + 4365, + 4366, + 4367, + 4368, + 4369, + 4370, + 4371, + 4372, + 4373, + 4374, + 4375, + 4376, + 4377, + 4378, + 4379, + 4380, + 4381, + 4382, + 4383, + 4384, + 4385, + 4386, + 4387, + 4388, + 4389, + 4390, + 4391, + 4392, + 4393, + 4394, + 4395, + 4396, + 4397, + 4398, + 4399, + 4400, + 4401, + 4402, + 4403, + 4404, + 4405, + 4406, + 4407, + 4408, + 4409, + 4410, + 4411, + 4412, + 4413, + 4414, + 4415, + 4416, + 4417, + 4418, + 4419, + 4420, + 4421, + 4422, + 4423, + 4424, + 4425, + 4426, + 4427, + 4428, + 4429, + 4430, + 4431, + 4432, + 4433, + 4434, + 4435, + 4436, + 4437, + 4438, + 4439, + 4440, + 4441, + 4442, + 4443, + 4444, + 4445, + 4446, + 4447, + 4448, + 4449, + 4450, + 4451, + 4452, + 4453, + 4454, + 4455, + 4456, + 4457, + 4458, + 4459, + 4460, + 4461, + 4462, + 4463, + 4464, + 4465, + 4466, + 4467, + 4468, + 4469, + 4470, + 4471, + 4472, + 4473, + 4474, + 4475, + 4476, + 4477, + 4478, + 4479, + 4480, + 4481, + 4482, + 4483, + 4484, + 4485, + 4486, + 4487, + 4488, + 4489, + 4490, + 4491, + 4492, + 4493, + 4494, + 4495, + 4496, + 4497, + 4498, + 4499, + 4500, + 4501, + 4502, + 4503, + 4504, + 4505, + 4506, + 4507, + 4508, + 4509, + 4510, + 4511, + 4512, + 4513, + 4514, + 4515, + 4516, + 4517, + 4518, + 4519, + 4520, + 4521, + 4522, + 4523, + 4524, + 4525, + 4526, + 4527, + 4528, + 4529, + 4530, + 4531, + 4532, + 4533, + 4534, + 4535, + 4536, + 4537, + 4538, + 4539, + 4540, + 4541, + 4542, + 4543, + 4544, + 4545, + 4546, + 4547, + 4548, + 4549, + 4550, + 4551, + 4552, + 4553, + 4554, + 4555, + 4556, + 4557, + 4558, + 4559, + 4560, + 4561, + 4562, + 4563, + 4564, + 4565, + 4566, + 4567, + 4568, + 4569, + 4570, + 4571, + 4572, + 4573, + 4574, + 4575, + 4576, + 4577, + 4578, + 4579, + 4580, + 4581, + 4582, + 4583, + 4584, + 4585, + 4586, + 4587, + 4588, + 4589, + 4590, + 4591, + 4592, + 4593, + 4594, + 4595, + 4596, + 4597, + 4598, + 4599, + 4600, + 4601, + 4602, + 4603, + 4604, + 4605, + 4606, + 4607, + 4608, + 4609, + 4610, + 4611, + 4612, + 4613, + 4614, + 4615, + 4616, + 4617, + 4618, + 4619, + 4620, + 4621, + 4622, + 4623, + 4624, + 4625, + 4626, + 4627, + 4628, + 4629, + 4630, + 4631, + 4632, + 4633, + 4634, + 4635, + 4636, + 4637, + 4638, + 4639, + 4640, + 4641, + 4642, + 4643, + 4644, + 4645, + 4646, + 4647, + 4648, + 4649, + 4650, + 4651, + 4652, + 4653, + 4654, + 4655, + 4656, + 4657, + 4658, + 4659, + 4660, + 4661, + 4662, + 4663, + 4664, + 4665, + 4666, + 4667, + 4668, + 4669, + 4670, + 4671, + 4672, + 4673, + 4674, + 4675, + 4676, + 4677, + 4678, + 4679, + 4680, + 4681, + 4682, + 4683, + 4684, + 4685, + 4686, + 4687, + 4688, + 4689, + 4690, + 4691, + 4692, + 4693, + 4694, + 4695, + 4696, + 4697, + 4698, + 4699, + 4700, + 4701, + 4702, + 4703, + 4704, + 4705, + 4706, + 4707, + 4708, + 4709, + 4710, + 4711, + 4712, + 4713, + 4714, + 4715, + 4716, + 4717, + 4718, + 4719, + 4720, + 4721, + 4722, + 4723, + 4724, + 4725, + 4726, + 4727, + 4728, + 4729, + 4730, + 4731, + 4732, + 4733, + 4734, + 4735, + 4736, + 4737, + 4738, + 4739, + 4740, + 4741, + 4742, + 4743, + 4744, + 4745, + 4746, + 4747, + 4748, + 4749, + 4750, + 4751, + 4752, + 4753, + 4754, + 4755, + 4756, + 4757, + 4758, + 4759, + 4760, + 4761, + 4762, + 4763, + 4764, + 4765, + 4766, + 4767, + 4768, + 4769, + 4770, + 4771, + 4772, + 4773, + 4774, + 4775, + 4776, + 4777, + 4778, + 4779, + 4780, + 4781, + 4782, + 4783, + 4784, + 4785, + 4786, + 4787, + 4788, + 4789, + 4790, + 4791, + 4792, + 4793, + 4794, + 4795, + 4796, + 4797, + 4798, + 4799, + 4800, + 4801, + 4802, + 4803, + 4804, + 4805, + 4806, + 4807, + 4808, + 4809, + 4810, + 4811, + 4812, + 4813, + 4814, + 4815, + 4816, + 4817, + 4818, + 4819, + 4820, + 4821, + 4822, + 4823, + 4824, + 4825, + 4826, + 4827, + 4828, + 4829, + 4830, + 4831, + 4832, + 4833, + 4834, + 4835, + 4836, + 4837, + 4838, + 4839, + 4840, + 4841, + 4842, + 4843, + 4844, + 4845, + 4846, + 4847, + 4848, + 4849, + 4850, + 4851, + 4852, + 4853, + 4854, + 4855, + 4856, + 4857, + 4858, + 4859, + 4860, + 4861, + 4862, + 4863, + 4864, + 4865, + 4866, + 4867, + 4868, + 4869, + 4870, + 4871, + 4872, + 4873, + 4874, + 4875, + 4876, + 4877, + 4878, + 4879, + 4880, + 4881, + 4882, + 4883, + 4884, + 4885, + 4886, + 4887, + 4888, + 4889, + 4890, + 4891, + 4892, + 4893, + 4894, + 4895, + 4896, + 4897, + 4898, + 4899, + 4900, + 4901, + 4902, + 4903, + 4904, + 4905, + 4906, + 4907, + 4908, + 4909, + 4910, + 4911, + 4912, + 4913, + 4914, + 4915, + 4916, + 4917, + 4918, + 4919, + 4920, + 4921, + 4922, + 4923, + 4924, + 4925, + 4926, + 4927, + 4928, + 4929, + 4930, + 4931, + 4932, + 4933, + 4934, + 4935, + 4936, + 4937, + 4938, + 4939, + 4940, + 4941, + 4942, + 4943, + 4944, + 4945, + 4946, + 4947, + 4948, + 4949, + 4950, + 4951, + 4952, + 4953, + 4954, + 4955, + 4956, + 4957, + 4958, + 4959, + 4960, + 4961, + 4962, + 4963, + 4964, + 4965, + 4966, + 4967, + 4968, + 4969, + 4970, + 4971, + 4972, + 4973, + 4974, + 4975, + 4976, + 4977, + 4978, + 4979, + 4980, + 4981, + 4982, + 4983, + 4984, + 4985, + 4986, + 4987, + 4988, + 4989, + 4990, + 4991, + 4992, + 4993, + 4994, + 4995, + 4996, + 4997, + 4998, + 4999, + 5000, + 5001, + 5002, + 5003, + 5004, + 5005, + 5006, + 5007, + 5008, + 5009, + 5010, + 5011, + 5012, + 5013, + 5014, + 5015, + 5016, + 5017, + 5018, + 5019, + 5020, + 5021, + 5022, + 5023, + 5024, + 5025, + 5026, + 5027, + 5028, + 5029, + 5030, + 5031, + 5032, + 5033, + 5034, + 5035, + 5036, + 5037, + 5038, + 5039, + 5040, + 5041, + 5042, + 5043, + 5044, + 5045, + 5046, + 5047, + 5048, + 5049, + 5050, + 5051, + 5052, + 5053, + 5054, + 5055, + 5056, + 5057, + 5058, + 5059, + 5060, + 5061, + 5062, + 5063, + 5064, + 5065, + 5066, + 5067, + 5068, + 5069, + 5070, + 5071, + 5072, + 5073, + 5074, + 5075, + 5076, + 5077, + 5078, + 5079, + 5080, + 5081, + 5082, + 5083, + 5084, + 5085, + 5086, + 5087, + 5088, + 5089, + 5090, + 5091, + 5092, + 5093, + 5094, + 5095, + 5096, + 5097, + 5098, + 5099, + 5100, + 5101, + 5102, + 5103, + 5104, + 5105, + 5106, + 5107, + 5108, + 5109, + 5110, + 5111, + 5112, + 5113, + 5114, + 5115, + 5116, + 5117, + 5118, + 5119, + 5120, + 5121, + 5122, + 5123, + 5124, + 5125, + 5126, + 5127, + 5128, + 5129, + 5130, + 5131, + 5132, + 5133, + 5134, + 5135, + 5136, + 5137, + 5138, + 5139, + 5140, + 5141, + 5142, + 5143, + 5144, + 5145, + 5146, + 5147, + 5148, + 5149, + 5150, + 5151, + 5152, + 5153, + 5154, + 5155, + 5156, + 5157, + 5158, + 5159, + 5160, + 5161, + 5162, + 5163, + 5164, + 5165, + 5166, + 5167, + 5168, + 5169, + 5170, + 5171, + 5172, + 5173, + 5174, + 5175, + 5176, + 5177, + 5178, + 5179, + 5180, + 5181, + 5182, + 5183, + 5184, + 5185, + 5186, + 5187, + 5188, + 5189, + 5190, + 5191, + 5192, + 5193, + 5194, + 5195, + 5196, + 5197, + 5198, + 5199, + 5200, + 5201, + 5202, + 5203, + 5204, + 5205, + 5206, + 5207, + 5208, + 5209, + 5210, + 5211, + 5212, + 5213, + 5214, + 5215, + 5216, + 5217, + 5218, + 5219, + 5220, + 5221, + 5222, + 5223, + 5224, + 5225, + 5226, + 5227, + 5228, + 5229, + 5230, + 5231, + 5232, + 5233, + 5234, + 5235, + 5236, + 5237, + 5238, + 5239, + 5240, + 5241, + 5242, + 5243, + 5244, + 5245, + 5246, + 5247, + 5248, + 5249, + 5250, + 5251, + 5252, + 5253, + 5254, + 5255, + 5256, + 5257, + 5258, + 5259, + 5260, + 5261, + 5262, + 5263, + 5264, + 5265, + 5266, + 5267, + 5268, + 5269, + 5270, + 5271, + 5272, + 5273, + 5274, + 5275, + 5276, + 5277, + 5278, + 5279, + 5280, + 5281, + 5282, + 5283, + 5284, + 5285, + 5286, + 5287, + 5288, + 5289, + 5290, + 5291, + 5292, + 5293, + 5294, + 5295, + 5296, + 5297, + 5298, + 5299, + 5300, + 5301, + 5302, + 5303, + 5304, + 5305, + 5306, + 5307, + 5308, + 5309, + 5310, + 5311, + 5312, + 5313, + 5314, + 5315, + 5316, + 5317, + 5318, + 5319, + 5320, + 5321, + 5322, + 5323, + 5324, + 5325, + 5326, + 5327, + 5328, + 5329, + 5330, + 5331, + 5332, + 5333, + 5334, + 5335, + 5336, + 5337, + 5338, + 5339, + 5340, + 5341, + 5342, + 5343, + 5344, + 5345, + 5346, + 5347, + 5348, + 5349, + 5350, + 5351, + 5352, + 5353, + 5354, + 5355, + 5356, + 5357, + 5358, + 5359, + 5360, + 5361, + 5362, + 5363, + 5364, + 5365, + 5366, + 5367, + 5368, + 5369, + 5370, + 5371, + 5372, + 5373, + 5374, + 5375, + 5376, + 5377, + 5378, + 5379, + 5380, + 5381, + 5382, + 5383, + 5384, + 5385, + 5386, + 5387, + 5388, + 5389, + 5390, + 5391, + 5392, + 5393, + 5394, + 5395, + 5396, + 5397, + 5398, + 5399, + 5400, + 5401, + 5402, + 5403, + 5404, + 5405, + 5406, + 5407, + 5408, + 5409, + 5410, + 5411, + 5412, + 5413, + 5414, + 5415, + 5416, + 5417, + 5418, + 5419, + 5420, + 5421, + 5422, + 5423, + 5424, + 5425, + 5426, + 5427, + 5428, + 5429, + 5430, + 5431, + 5432, + 5433, + 5434, + 5435, + 5436, + 5437, + 5438, + 5439, + 5440, + 5441, + 5442, + 5443, + 5444, + 5445, + 5446, + 5447, + 5448, + 5449, + 5450, + 5451, + 5452, + 5453, + 5454, + 5455, + 5456, + 5457, + 5458, + 5459, + 5460, + 5461, + 5462, + 5463, + 5464, + 5465, + 5466, + 5467, + 5468, + 5469, + 5470, + 5471, + 5472, + 5473, + 5474, + 5475, + 5476, + 5477, + 5478, + 5479, + 5480, + 5481, + 5482, + 5483, + 5484, + 5485, + 5486, + 5487, + 5488, + 5489, + 5490, + 5491, + 5492, + 5493, + 5494, + 5495, + 5496, + 5497, + 5498, + 5499, + 5500, + 5501, + 5502, + 5503, + 5504, + 5505, + 5506, + 5507, + 5508, + 5509, + 5510, + 5511, + 5512, + 5513, + 5514, + 5515, + 5516, + 5517, + 5518, + 5519, + 5520, + 5521, + 5522, + 5523, + 5524, + 5525, + 5526, + 5527, + 5528, + 5529, + 5530, + 5531, + 5532, + 5533, + 5534, + 5535, + 5536, + 5537, + 5538, + 5539, + 5540, + 5541, + 5542, + 5543, + 5544, + 5545, + 5546, + 5547, + 5548, + 5549, + 5550, + 5551, + 5552, + 5553, + 5554, + 5555, + 5556, + 5557, + 5558, + 5559, + 5560, + 5561, + 5562, + 5563, + 5564, + 5565, + 5566, + 5567, + 5568, + 5569, + 5570, + 5571, + 5572, + 5573, + 5574, + 5575, + 5576, + 5577, + 5578, + 5579, + 5580, + 5581, + 5582, + 5583, + 5584, + 5585, + 5586, + 5587, + 5588, + 5589, + 5590, + 5591, + 5592, + 5593, + 5594, + 5595, + 5596, + 5597, + 5598, + 5599, + 5600, + 5601, + 5602, + 5603, + 5604, + 5605, + 5606, + 5607, + 5608, + 5609, + 5610, + 5611, + 5612, + 5613, + 5614, + 5615, + 5616, + 5617, + 5618, + 5619, + 5620, + 5621, + 5622, + 5623, + 5624, + 5625, + 5626, + 5627, + 5628, + 5629, + 5630, + 5631, + 5632, + 5633, + 5634, + 5635, + 5636, + 5637, + 5638, + 5639, + 5640, + 5641, + 5642, + 5643, + 5644, + 5645, + 5646, + 5647, + 5648, + 5649, + 5650, + 5651, + 5652, + 5653, + 5654, + 5655, + 5656, + 5657, + 5658, + 5659, + 5660, + 5661, + 5662, + 5663, + 5664, + 5665, + 5666, + 5667, + 5668, + 5669, + 5670, + 5671, + 5672, + 5673, + 5674, + 5675, + 5676, + 5677, + 5678, + 5679, + 5680, + 5681, + 5682, + 5683, + 5684, + 5685, + 5686, + 5687, + 5688, + 5689, + 5690, + 5691, + 5692, + 5693, + 5694, + 5695, + 5696, + 5697, + 5698, + 5699, + 5700, + 5701, + 5702, + 5703, + 5704, + 5705, + 5706, + 5707, + 5708, + 5709, + 5710, + 5711, + 5712, + 5713, + 5714, + 5715, + 5716, + 5717, + 5718, + 5719, + 5720, + 5721, + 5722, + 5723, + 5724, + 5725, + 5726, + 5727, + 5728, + 5729, + 5730, + 5731, + 5732, + 5733, + 5734, + 5735, + 5736, + 5737, + 5738, + 5739, + 5740, + 5741, + 5742, + 5743, + 5744, + 5745, + 5746, + 5747, + 5748, + 5749, + 5750, + 5751, + 5752, + 5753, + 5754, + 5755, + 5756, + 5757, + 5758, + 5759, + 5760, + 5761, + 5762, + 5763, + 5764, + 5765, + 5766, + 5767, + 5768, + 5769, + 5770, + 5771, + 5772, + 5773, + 5774, + 5775, + 5776, + 5777, + 5778, + 5779, + 5780, + 5781, + 5782, + 5783, + 5784, + 5785, + 5786, + 5787, + 5788, + 5789, + 5790, + 5791, + 5792, + 5793, + 5794, + 5795, + 5796, + 5797, + 5798, + 5799, + 5800, + 5801, + 5802, + 5803, + 5804, + 5805, + 5806, + 5807, + 5808, + 5809, + 5810, + 5811, + 5812, + 5813, + 5814, + 5815, + 5816, + 5817, + 5818, + 5819, + 5820, + 5821, + 5822, + 5823, + 5824, + 5825, + 5826, + 5827, + 5828, + 5829, + 5830, + 5831, + 5832, + 5833, + 5834, + 5835, + 5836, + 5837, + 5838, + 5839, + 5840, + 5841, + 5842, + 5843, + 5844, + 5845, + 5846, + 5847, + 5848, + 5849, + 5850, + 5851, + 5852, + 5853, + 5854, + 5855, + 5856, + 5857, + 5858, + 5859, + 5860, + 5861, + 5862, + 5863, + 5864, + 5865, + 5866, + 5867, + 5868, + 5869, + 5870, + 5871, + 5872, + 5873, + 5874, + 5875, + 5876, + 5877, + 5878, + 5879, + 5880, + 5881, + 5882, + 5883, + 5884, + 5885, + 5886, + 5887, + 5888, + 5889, + 5890, + 5891, + 5892, + 5893, + 5894, + 5895, + 5896, + 5897, + 5898, + 5899, + 5900, + 5901, + 5902, + 5903, + 5904, + 5905, + 5906, + 5907, + 5908, + 5909, + 5910, + 5911, + 5912, + 5913, + 5914, + 5915, + 5916, + 5917, + 5918, + 5919, + 5920, + 5921, + 5922, + 5923, + 5924, + 5925, + 5926, + 5927, + 5928, + 5929, + 5930, + 5931, + 5932, + 5933, + 5934, + 5935, + 5936, + 5937, + 5938, + 5939, + 5940, + 5941, + 5942, + 5943, + 5944, + 5945, + 5946, + 5947, + 5948, + 5949, + 5950, + 5951, + 5952, + 5953, + 5954, + 5955, + 5956, + 5957, + 5958, + 5959, + 5960, + 5961, + 5962, + 5963, + 5964, + 5965, + 5966, + 5967, + 5968, + 5969, + 5970, + 5971, + 5972, + 5973, + 5974, + 5975, + 5976, + 5977, + 5978, + 5979, + 5980, + 5981, + 5982, + 5983, + 5984, + 5985, + 5986, + 5987, + 5988, + 5989, + 5990, + 5991, + 5992, + 5993, + 5994, + 5995, + 5996, + 5997, + 5998, + 5999, + 6000, + 6001, + 6002, + 6003, + 6004, + 6005, + 6006, + 6007, + 6008, + 6009, + 6010, + 6011, + 6012, + 6013, + 6014, + 6015, + 6016, + 6017, + 6018, + 6019, + 6020, + 6021, + 6022, + 6023, + 6024, + 6025, + 6026, + 6027, + 6028, + 6029, + 6030, + 6031, + 6032, + 6033, + 6034, + 6035, + 6036, + 6037, + 6038, + 6039, + 6040, + 6041, + 6042, + 6043, + 6044, + 6045, + 6046, + 6047, + 6048, + 6049, + 6050, + 6051, + 6052, + 6053, + 6054, + 6055, + 6056, + 6057, + 6058, + 6059, + 6060, + 6061, + 6062, + 6063, + 6064, + 6065, + 6066, + 6067, + 6068, + 6069, + 6070, + 6071, + 6072, + 6073, + 6074, + 6075, + 6076, + 6077, + 6078, + 6079, + 6080, + 6081, + 6082, + 6083, + 6084, + 6085, + 6086, + 6087, + 6088, + 6089, + 6090, + 6091, + 6092, + 6093, + 6094, + 6095, + 6096, + 6097, + 6098, + 6099, + 6100, + 6101, + 6102, + 6103, + 6104, + 6105, + 6106, + 6107, + 6108, + 6109, + 6110, + 6111, + 6112, + 6113, + 6114, + 6115, + 6116, + 6117, + 6118, + 6119, + 6120, + 6121, + 6122, + 6123, + 6124, + 6125, + 6126, + 6127, + 6128, + 6129, + 6130, + 6131, + 6132, + 6133, + 6134, + 6135, + 6136, + 6137, + 6138, + 6139, + 6140, + 6141, + 6142, + 6143, + 6144, + 6145, + 6146, + 6147, + 6148, + 6149, + 6150, + 6151, + 6152, + 6153, + 6154, + 6155, + 6156, + 6157, + 6158, + 6159, + 6160, + 6161, + 6162, + 6163, + 6164, + 6165, + 6166, + 6167, + 6168, + 6169, + 6170, + 6171, + 6172, + 6173, + 6174, + 6175, + 6176, + 6177, + 6178, + 6179, + 6180, + 6181, + 6182, + 6183, + 6184, + 6185, + 6186, + 6187, + 6188, + 6189, + 6190, + 6191, + 6192, + 6193, + 6194, + 6195, + 6196, + 6197, + 6198, + 6199, + 6200, + 6201, + 6202, + 6203, + 6204, + 6205, + 6206, + 6207, + 6208, + 6209, + 6210, + 6211, + 6212, + 6213, + 6214, + 6215, + 6216, + 6217, + 6218, + 6219, + 6220, + 6221, + 6222, + 6223, + 6224, + 6225, + 6226, + 6227, + 6228, + 6229, + 6230, + 6231, + 6232, + 6233, + 6234, + 6235, + 6236, + 6237, + 6238, + 6239, + 6240, + 6241, + 6242, + 6243, + 6244, + 6245, + 6246, + 6247, + 6248, + 6249, + 6250, + 6251, + 6252, + 6253, + 6254, + 6255, + 6256, + 6257, + 6258, + 6259, + 6260, + 6261, + 6262, + 6263, + 6264, + 6265, + 6266, + 6267, + 6268, + 6269, + 6270, + 6271, + 6272, + 6273, + 6274, + 6275, + 6276, + 6277, + 6278, + 6279, + 6280, + 6281, + 6282, + 6283, + 6284, + 6285, + 6286, + 6287, + 6288, + 6289, + 6290, + 6291, + 6292, + 6293, + 6294, + 6295, + 6296, + 6297, + 6298, + 6299, + 6300, + 6301, + 6302, + 6303, + 6304, + 6305, + 6306, + 6307, + 6308, + 6309, + 6310, + 6311, + 6312, + 6313, + 6314, + 6315, + 6316, + 6317, + 6318, + 6319, + 6320, + 6321, + 6322, + 6323, + 6324, + 6325, + 6326, + 6327, + 6328, + 6329, + 6330, + 6331, + 6332, + 6333, + 6334, + 6335, + 6336, + 6337, + 6338, + 6339, + 6340, + 6341, + 6342, + 6343, + 6344, + 6345, + 6346, + 6347, + 6348, + 6349, + 6350, + 6351, + 6352, + 6353, + 6354, + 6355, + 6356, + 6357, + 6358, + 6359, + 6360, + 6361, + 6362, + 6363, + 6364, + 6365, + 6366, + 6367, + 6368, + 6369, + 6370, + 6371, + 6372, + 6373, + 6374, + 6375, + 6376, + 6377, + 6378, + 6379, + 6380, + 6381, + 6382, + 6383, + 6384, + 6385, + 6386, + 6387, + 6388, + 6389, + 6390, + 6391, + 6392, + 6393, + 6394, + 6395, + 6396, + 6397, + 6398, + 6399, + 6400, + 6401, + 6402, + 6403, + 6404, + 6405, + 6406, + 6407, + 6408, + 6409, + 6410, + 6411, + 6412, + 6413, + 6414, + 6415, + 6416, + 6417, + 6418, + 6419, + 6420, + 6421, + 6422, + 6423, + 6424, + 6425, + 6426, + 6427, + 6428, + 6429, + 6430, + 6431, + 6432, + 6433, + 6434, + 6435, + 6436, + 6437, + 6438, + 6439, + 6440, + 6441, + 6442, + 6443, + 6444, + 6445, + 6446, + 6447, + 6448, + 6449, + 6450, + 6451, + 6452, + 6453, + 6454, + 6455, + 6456, + 6457, + 6458, + 6459, + 6460, + 6461, + 6462, + 6463, + 6464, + 6465, + 6466, + 6467, + 6468, + 6469, + 6470, + 6471, + 6472, + 6473, + 6474, + 6475, + 6476, + 6477, + 6478, + 6479, + 6480, + 6481, + 6482, + 6483, + 6484, + 6485, + 6486, + 6487, + 6488, + 6489, + 6490, + 6491, + 6492, + 6493, + 6494, + 6495, + 6496, + 6497, + 6498, + 6499, + 6500, + 6501, + 6502, + 6503, + 6504, + 6505, + 6506, + 6507, + 6508, + 6509, + 6510, + 6511, + 6512, + 6513, + 6514, + 6515, + 6516, + 6517, + 6518, + 6519, + 6520, + 6521, + 6522, + 6523, + 6524, + 6525, + 6526, + 6527, + 6528, + 6529, + 6530, + 6531, + 6532, + 6533, + 6534, + 6535, + 6536, + 6537, + 6538, + 6539, + 6540, + 6541, + 6542, + 6543, + 6544, + 6545, + 6546, + 6547, + 6548, + 6549, + 6550, + 6551, + 6552, + 6553, + 6554, + 6555, + 6556, + 6557, + 6558, + 6559, + 6560, + 6561, + 6562, + 6563, + 6564, + 6565, + 6566, + 6567, + 6568, + 6569, + 6570, + 6571, + 6572, + 6573, + 6574, + 6575, + 6576, + 6577, + 6578, + 6579, + 6580, + 6581, + 6582, + 6583, + 6584, + 6585, + 6586, + 6587, + 6588, + 6589, + 6590, + 6591, + 6592, + 6593, + 6594, + 6595, + 6596, + 6597, + 6598, + 6599, + 6600, + 6601, + 6602, + 6603, + 6604, + 6605, + 6606, + 6607, + 6608, + 6609, + 6610, + 6611, + 6612, + 6613, + 6614, + 6615, + 6616, + 6617, + 6618, + 6619, + 6620, + 6621, + 6622, + 6623, + 6624, + 6625, + 6626, + 6627, + 6628, + 6629, + 6630, + 6631, + 6632, + 6633, + 6634, + 6635, + 6636, + 6637, + 6638, + 6639, + 6640, + 6641, + 6642, + 6643, + 6644, + 6645, + 6646, + 6647, + 6648, + 6649, + 6650, + 6651, + 6652, + 6653, + 6654, + 6655, + 6656, + 6657, + 6658, + 6659, + 6660, + 6661, + 6662, + 6663, + 6664, + 6665, + 6666, + 6667, + 6668, + 6669, + 6670, + 6671, + 6672, + 6673, + 6674, + 6675, + 6676, + 6677, + 6678, + 6679, + 6680, + 6681, + 6682, + 6683, + 6684, + 6685, + 6686, + 6687, + 6688, + 6689, + 6690, + 6691, + 6692, + 6693, + 6694, + 6695, + 6696, + 6697, + 6698, + 6699, + 6700, + 6701, + 6702, + 6703, + 6704, + 6705, + 6706, + 6707, + 6708, + 6709, + 6710, + 6711, + 6712, + 6713, + 6714, + 6715, + 6716, + 6717, + 6718, + 6719, + 6720, + 6721, + 6722, + 6723, + 6724, + 6725, + 6726, + 6727, + 6728, + 6729, + 6730, + 6731, + 6732, + 6733, + 6734, + 6735, + 6736, + 6737, + 6738, + 6739, + 6740, + 6741, + 6742, + 6743, + 6744, + 6745, + 6746, + 6747, + 6748, + 6749, + 6750, + 6751, + 6752, + 6753, + 6754, + 6755, + 6756, + 6757, + 6758, + 6759, + 6760, + 6761, + 6762, + 6763, + 6764, + 6765, + 6766, + 6767, + 6768, + 6769, + 6770, + 6771, + 6772, + 6773, + 6774, + 6775, + 6776, + 6777, + 6778, + 6779, + 6780, + 6781, + 6782, + 6783, + 6784, + 6785, + 6786, + 6787, + 6788, + 6789, + 6790, + 6791, + 6792, + 6793, + 6794, + 6795, + 6796, + 6797, + 6798, + 6799, + 6800, + 6801, + 6802, + 6803, + 6804, + 6805, + 6806, + 6807, + 6808, + 6809, + 6810, + 6811, + 6812, + 6813, + 6814, + 6815, + 6816, + 6817, + 6818, + 6819, + 6820, + 6821, + 6822, + 6823, + 6824, + 6825, + 6826, + 6827, + 6828, + 6829, + 6830, + 6831, + 6832, + 6833, + 6834, + 6835, + 6836, + 6837, + 6838, + 6839, + 6840, + 6841, + 6842, + 6843, + 6844, + 6845, + 6846, + 6847, + 6848, + 6849, + 6850, + 6851, + 6852, + 6853, + 6854, + 6855, + 6856, + 6857, + 6858, + 6859, + 6860, + 6861, + 6862, + 6863, + 6864, + 6865, + 6866, + 6867, + 6868, + 6869, + 6870, + 6871, + 6872, + 6873, + 6874, + 6875, + 6876, + 6877, + 6878, + 6879, + 6880, + 6881, + 6882, + 6883, + 6884, + 6885, + 6886, + 6887, + 6888, + 6889, + 6890, + 6891, + 6892, + 6893, + 6894, + 6895, + 6896, + 6897, + 6898, + 6899, + 6900, + 6901, + 6902, + 6903, + 6904, + 6905, + 6906, + 6907, + 6908, + 6909, + 6910, + 6911, + 6912, + 6913, + 6914, + 6915, + 6916, + 6917, + 6918, + 6919, + 6920, + 6921, + 6922, + 6923, + 6924, + 6925, + 6926, + 6927, + 6928, + 6929, + 6930, + 6931, + 6932, + 6933, + 6934, + 6935, + 6936, + 6937, + 6938, + 6939, + 6940, + 6941, + 6942, + 6943, + 6944, + 6945, + 6946, + 6947, + 6948, + 6949, + 6950, + 6951, + 6952, + 6953, + 6954, + 6955, + 6956, + 6957, + 6958, + 6959, + 6960, + 6961, + 6962, + 6963, + 6964, + 6965, + 6966, + 6967, + 6968, + 6969, + 6970, + 6971, + 6972, + 6973, + 6974, + 6975, + 6976, + 6977, + 6978, + 6979, + 6980, + 6981, + 6982, + 6983, + 6984, + 6985, + 6986, + 6987, + 6988, + 6989, + 6990, + 6991, + 6992, + 6993, + 6994, + 6995, + 6996, + 6997, + 6998, + 6999, + 7000, + 7001, + 7002, + 7003, + 7004, + 7005, + 7006, + 7007, + 7008, + 7009, + 7010, + 7011, + 7012, + 7013, + 7014, + 7015, + 7016, + 7017, + 7018, + 7019, + 7020, + 7021, + 7022, + 7023, + 7024, + 7025, + 7026, + 7027, + 7028, + 7029, + 7030, + 7031, + 7032, + 7033, + 7034, + 7035, + 7036, + 7037, + 7038, + 7039, + 7040, + 7041, + 7042, + 7043, + 7044, + 7045, + 7046, + 7047, + 7048, + 7049, + 7050, + 7051, + 7052, + 7053, + 7054, + 7055, + 7056, + 7057, + 7058, + 7059, + 7060, + 7061, + 7062, + 7063, + 7064, + 7065, + 7066, + 7067, + 7068, + 7069, + 7070, + 7071, + 7072, + 7073, + 7074, + 7075, + 7076, + 7077, + 7078, + 7079, + 7080, + 7081, + 7082, + 7083, + 7084, + 7085, + 7086, + 7087, + 7088, + 7089, + 7090, + 7091, + 7092, + 7093, + 7094, + 7095, + 7096, + 7097, + 7098, + 7099, + 7100, + 7101, + 7102, + 7103, + 7104, + 7105, + 7106, + 7107, + 7108, + 7109, + 7110, + 7111, + 7112, + 7113, + 7114, + 7115, + 7116, + 7117, + 7118, + 7119, + 7120, + 7121, + 7122, + 7123, + 7124, + 7125, + 7126, + 7127, + 7128, + 7129, + 7130, + 7131, + 7132, + 7133, + 7134, + 7135, + 7136, + 7137, + 7138, + 7139, + 7140, + 7141, + 7142, + 7143, + 7144, + 7145, + 7146, + 7147, + 7148, + 7149, + 7150, + 7151, + 7152, + 7153, + 7154, + 7155, + 7156, + 7157, + 7158, + 7159, + 7160, + 7161, + 7162, + 7163, + 7164, + 7165, + 7166, + 7167, + 7168, + 7169, + 7170, + 7171, + 7172, + 7173, + 7174, + 7175, + 7176, + 7177, + 7178, + 7179, + 7180, + 7181, + 7182, + 7183, + 7184, + 7185, + 7186, + 7187, + 7188, + 7189, + 7190, + 7191, + 7192, + 7193, + 7194, + 7195, + 7196, + 7197, + 7198, + 7199, + 7200, + 7201, + 7202, + 7203, + 7204, + 7205, + 7206, + 7207, + 7208, + 7209, + 7210, + 7211, + 7212, + 7213, + 7214, + 7215, + 7216, + 7217, + 7218, + 7219, + 7220, + 7221, + 7222, + 7223, + 7224, + 7225, + 7226, + 7227, + 7228, + 7229, + 7230, + 7231, + 7232, + 7233, + 7234, + 7235, + 7236, + 7237, + 7238, + 7239, + 7240, + 7241, + 7242, + 7243, + 7244, + 7245, + 7246, + 7247, + 7248, + 7249, + 7250, + 7251, + 7252, + 7253, + 7254, + 7255, + 7256, + 7257, + 7258, + 7259, + 7260, + 7261, + 7262, + 7263, + 7264, + 7265, + 7266, + 7267, + 7268, + 7269, + 7270, + 7271, + 7272, + 7273, + 7274, + 7275, + 7276, + 7277, + 7278, + 7279, + 7280, + 7281, + 7282, + 7283, + 7284, + 7285, + 7286, + 7287, + 7288, + 7289, + 7290, + 7291, + 7292, + 7293, + 7294, + 7295, + 7296, + 7297, + 7298, + 7299, + 7300, + 7301, + 7302, + 7303, + 7304, + 7305, + 7306, + 7307, + 7308, + 7309, + 7310, + 7311, + 7312, + 7313, + 7314, + 7315, + 7316, + 7317, + 7318, + 7319, + 7320, + 7321, + 7322, + 7323, + 7324, + 7325, + 7326, + 7327, + 7328, + 7329, + 7330, + 7331, + 7332, + 7333, + 7334, + 7335, + 7336, + 7337, + 7338, + 7339, + 7340, + 7341, + 7342, + 7343, + 7344, + 7345, + 7346, + 7347, + 7348, + 7349, + 7350, + 7351, + 7352, + 7353, + 7354, + 7355, + 7356, + 7357, + 7358, + 7359, + 7360, + 7361, + 7362, + 7363, + 7364, + 7365, + 7366, + 7367, + 7368, + 7369, + 7370, + 7371, + 7372, + 7373, + 7374, + 7375, + 7376, + 7377, + 7378, + 7379, + 7380, + 7381, + 7382, + 7383, + 7384, + 7385, + 7386, + 7387, + 7388, + 7389, + 7390, + 7391, + 7392, + 7393, + 7394, + 7395, + 7396, + 7397, + 7398, + 7399, + 7400, + 7401, + 7402, + 7403, + 7404, + 7405, + 7406, + 7407, + 7408, + 7409, + 7410, + 7411, + 7412, + 7413, + 7414, + 7415, + 7416, + 7417, + 7418, + 7419, + 7420, + 7421, + 7422, + 7423, + 7424, + 7425, + 7426, + 7427, + 7428, + 7429, + 7430, + 7431, + 7432, + 7433, + 7434, + 7435, + 7436, + 7437, + 7438, + 7439, + 7440, + 7441, + 7442, + 7443, + 7444, + 7445, + 7446, + 7447, + 7448, + 7449, + 7450, + 7451, + 7452, + 7453, + 7454, + 7455, + 7456, + 7457, + 7458, + 7459, + 7460, + 7461, + 7462, + 7463, + 7464, + 7465, + 7466, + 7467, + 7468, + 7469, + 7470, + 7471, + 7472, + 7473, + 7474, + 7475, + 7476, + 7477, + 7478, + 7479, + 7480, + 7481, + 7482, + 7483, + 7484, + 7485, + 7486, + 7487, + 7488, + 7489, + 7490, + 7491, + 7492, + 7493, + 7494, + 7495, + 7496, + 7497, + 7498, + 7499, + 7500, + 7501, + 7502, + 7503, + 7504, + 7505, + 7506, + 7507, + 7508, + 7509, + 7510, + 7511, + 7512, + 7513, + 7514, + 7515, + 7516, + 7517, + 7518, + 7519, + 7520, + 7521, + 7522, + 7523, + 7524, + 7525, + 7526, + 7527, + 7528, + 7529, + 7530, + 7531, + 7532, + 7533, + 7534, + 7535, + 7536, + 7537, + 7538, + 7539, + 7540, + 7541, + 7542, + 7543, + 7544, + 7545, + 7546, + 7547, + 7548, + 7549, + 7550, + 7551, + 7552, + 7553, + 7554, + 7555, + 7556, + 7557, + 7558, + 7559, + 7560, + 7561, + 7562, + 7563, + 7564, + 7565, + 7566, + 7567, + 7568, + 7569, + 7570, + 7571, + 7572, + 7573, + 7574, + 7575, + 7576, + 7577, + 7578, + 7579, + 7580, + 7581, + 7582, + 7583, + 7584, + 7585, + 7586, + 7587, + 7588, + 7589, + 7590, + 7591, + 7592, + 7593, + 7594, + 7595, + 7596, + 7597, + 7598, + 7599, + 7600, + 7601, + 7602, + 7603, + 7604, + 7605, + 7606, + 7607, + 7608, + 7609, + 7610, + 7611, + 7612, + 7613, + 7614, + 7615, + 7616, + 7617, + 7618, + 7619, + 7620, + 7621, + 7622, + 7623, + 7624, + 7625, + 7626, + 7627, + 7628, + 7629, + 7630, + 7631, + 7632, + 7633, + 7634, + 7635, + 7636, + 7637, + 7638, + 7639, + 7640, + 7641, + 7642, + 7643, + 7644, + 7645, + 7646, + 7647, + 7648, + 7649, + 7650, + 7651, + 7652, + 7653, + 7654, + 7655, + 7656, + 7657, + 7658, + 7659, + 7660, + 7661, + 7662, + 7663, + 7664, + 7665, + 7666, + 7667, + 7668, + 7669, + 7670, + 7671, + 7672, + 7673, + 7674, + 7675, + 7676, + 7677, + 7678, + 7679, + 7680, + 7681, + 7682, + 7683, + 7684, + 7685, + 7686, + 7687, + 7688, + 7689, + 7690, + 7691, + 7692, + 7693, + 7694, + 7695, + 7696, + 7697, + 7698, + 7699, + 7700, + 7701, + 7702, + 7703, + 7704, + 7705, + 7706, + 7707, + 7708, + 7709, + 7710, + 7711, + 7712, + 7713, + 7714, + 7715, + 7716, + 7717, + 7718, + 7719, + 7720, + 7721, + 7722, + 7723, + 7724, + 7725, + 7726, + 7727, + 7728, + 7729, + 7730, + 7731, + 7732, + 7733, + 7734, + 7735, + 7736, + 7737, + 7738, + 7739, + 7740, + 7741, + 7742, + 7743, + 7744, + 7745, + 7746, + 7747, + 7748, + 7749, + 7750, + 7751, + 7752, + 7753, + 7754, + 7755, + 7756, + 7757, + 7758, + 7759, + 7760, + 7761, + 7762, + 7763, + 7764, + 7765, + 7766, + 7767, + 7768, + 7769, + 7770, + 7771, + 7772, + 7773, + 7774, + 7775, + 7776, + 7777, + 7778, + 7779, + 7780, + 7781, + 7782, + 7783, + 7784, + 7785, + 7786, + 7787, + 7788, + 7789, + 7790, + 7791, + 7792, + 7793, + 7794, + 7795, + 7796, + 7797, + 7798, + 7799, + 7800, + 7801, + 7802, + 7803, + 7804, + 7805, + 7806, + 7807, + 7808, + 7809, + 7810, + 7811, + 7812, + 7813, + 7814, + 7815, + 7816, + 7817, + 7818, + 7819, + 7820, + 7821, + 7822, + 7823, + 7824, + 7825, + 7826, + 7827, + 7828, + 7829, + 7830, + 7831, + 7832, + 7833, + 7834, + 7835, + 7836, + 7837, + 7838, + 7839, + 7840, + 7841, + 7842, + 7843, + 7844, + 7845, + 7846, + 7847, + 7848, + 7849, + 7850, + 7851, + 7852, + 7853, + 7854, + 7855, + 7856, + 7857, + 7858, + 7859, + 7860, + 7861, + 7862, + 7863, + 7864, + 7865, + 7866, + 7867, + 7868, + 7869, + 7870, + 7871, + 7872, + 7873, + 7874, + 7875, + 7876, + 7877, + 7878, + 7879, + 7880, + 7881, + 7882, + 7883, + 7884, + 7885, + 7886, + 7887, + 7888, + 7889, + 7890, + 7891, + 7892, + 7893, + 7894, + 7895, + 7896, + 7897, + 7898, + 7899, + 7900, + 7901, + 7902, + 7903, + 7904, + 7905, + 7906, + 7907, + 7908, + 7909, + 7910, + 7911, + 7912, + 7913, + 7914, + 7915, + 7916, + 7917, + 7918, + 7919, + 7920, + 7921, + 7922, + 7923, + 7924, + 7925, + 7926, + 7927, + 7928, + 7929, + 7930, + 7931, + 7932, + 7933, + 7934, + 7935, + 7936, + 7937, + 7938, + 7939, + 7940, + 7941, + 7942, + 7943, + 7944, + 7945, + 7946, + 7947, + 7948, + 7949, + 7950, + 7951, + 7952, + 7953, + 7954, + 7955, + 7956, + 7957, + 7958, + 7959, + 7960, + 7961, + 7962, + 7963, + 7964, + 7965, + 7966, + 7967, + 7968, + 7969, + 7970, + 7971, + 7972, + 7973, + 7974, + 7975, + 7976, + 7977, + 7978, + 7979, + 7980, + 7981, + 7982, + 7983, + 7984, + 7985, + 7986, + 7987, + 7988, + 7989, + 7990, + 7991, + 7992, + 7993, + 7994, + 7995, + 7996, + 7997, + 7998, + 7999, + 8000, + 8001, + 8002, + 8003, + 8004, + 8005, + 8006, + 8007, + 8008, + 8009, + 8010, + 8011, + 8012, + 8013, + 8014, + 8015, + 8016, + 8017, + 8018, + 8019, + 8020, + 8021, + 8022, + 8023, + 8024, + 8025, + 8026, + 8027, + 8028, + 8029, + 8030, + 8031, + 8032, + 8033, + 8034, + 8035, + 8036, + 8037, + 8038, + 8039, + 8040, + 8041, + 8042, + 8043, + 8044, + 8045, + 8046, + 8047, + 8048, + 8049, + 8050, + 8051, + 8052, + 8053, + 8054, + 8055, + 8056, + 8057, + 8058, + 8059, + 8060, + 8061, + 8062, + 8063, + 8064, + 8065, + 8066, + 8067, + 8068, + 8069, + 8070, + 8071, + 8072, + 8073, + 8074, + 8075, + 8076, + 8077, + 8078, + 8079, + 8080, + 8081, + 8082, + 8083, + 8084, + 8085, + 8086, + 8087, + 8088, + 8089, + 8090, + 8091, + 8092, + 8093, + 8094, + 8095, + 8096, + 8097, + 8098, + 8099, + 8100, + 8101, + 8102, + 8103, + 8104, + 8105, + 8106, + 8107, + 8108, + 8109, + 8110, + 8111, + 8112, + 8113, + 8114, + 8115, + 8116, + 8117, + 8118, + 8119, + 8120, + 8121, + 8122, + 8123, + 8124, + 8125, + 8126, + 8127, + 8128, + 8129, + 8130, + 8131, + 8132, + 8133, + 8134, + 8135, + 8136, + 8137, + 8138, + 8139, + 8140, + 8141, + 8142, + 8143, + 8144, + 8145, + 8146, + 8147, + 8148, + 8149, + 8150, + 8151, + 8152, + 8153, + 8154, + 8155, + 8156, + 8157, + 8158, + 8159, + 8160, + 8161, + 8162, + 8163, + 8164, + 8165, + 8166, + 8167, + 8168, + 8169, + 8170, + 8171, + 8172, + 8173, + 8174, + 8175, + 8176, + 8177, + 8178, + 8179, + 8180, + 8181, + 8182, + 8183, + 8184, + 8185, + 8186, + 8187, + 8188, + 8189, + 8190, + 8191, + 8192, + 8193, + 8194, + 8195, + 8196, + 8197, + 8198, + 8199, + 8200, + 8201, + 8202, + 8203, + 8204, + 8205, + 8206, + 8207, + 8208, + 8209, + 8210, + 8211, + 8212, + 8213, + 8214, + 8215, + 8216, + 8217, + 8218, + 8219, + 8220, + 8221, + 8222, + 8223, + 8224, + 8225, + 8226, + 8227, + 8228, + 8229, + 8230, + 8231, + 8232, + 8233, + 8234, + 8235, + 8236, + 8237, + 8238, + 8239, + 8240, + 8241, + 8242, + 8243, + 8244, + 8245, + 8246, + 8247, + 8248, + 8249, + 8250, + 8251, + 8252, + 8253, + 8254, + 8255, + 8256, + 8257, + 8258, + 8259, + 8260, + 8261, + 8262, + 8263, + 8264, + 8265, + 8266, + 8267, + 8268, + 8269, + 8270, + 8271, + 8272, + 8273, + 8274, + 8275, + 8276, + 8277, + 8278, + 8279, + 8280, + 8281, + 8282, + 8283, + 8284, + 8285, + 8286, + 8287, + 8288, + 8289, + 8290, + 8291, + 8292, + 8293, + 8294, + 8295, + 8296, + 8297, + 8298, + 8299, + 8300, + 8301, + 8302, + 8303, + 8304, + 8305, + 8306, + 8307, + 8308, + 8309, + 8310, + 8311, + 8312, + 8313, + 8314, + 8315, + 8316, + 8317, + 8318, + 8319, + 8320, + 8321, + 8322, + 8323, + 8324, + 8325, + 8326, + 8327, + 8328, + 8329, + 8330, + 8331, + 8332, + 8333, + 8334, + 8335, + 8336, + 8337, + 8338, + 8339, + 8340, + 8341, + 8342, + 8343, + 8344, + 8345, + 8346, + 8347, + 8348, + 8349, + 8350, + 8351, + 8352, + 8353, + 8354, + 8355, + 8356, + 8357, + 8358, + 8359, + 8360, + 8361, + 8362, + 8363, + 8364, + 8365, + 8366, + 8367, + 8368, + 8369, + 8370, + 8371, + 8372, + 8373, + 8374, + 8375, + 8376, + 8377, + 8378, + 8379, + 8380, + 8381, + 8382, + 8383, + 8384, + 8385, + 8386, + 8387, + 8388, + 8389, + 8390, + 8391, + 8392, + 8393, + 8394, + 8395, + 8396, + 8397, + 8398, + 8399, + 8400, + 8401, + 8402, + 8403, + 8404, + 8405, + 8406, + 8407, + 8408, + 8409, + 8410, + 8411, + 8412, + 8413, + 8414, + 8415, + 8416, + 8417, + 8418, + 8419, + 8420, + 8421, + 8422, + 8423, + 8424, + 8425, + 8426, + 8427, + 8428, + 8429, + 8430, + 8431, + 8432, + 8433, + 8434, + 8435, + 8436, + 8437, + 8438, + 8439, + 8440, + 8441, + 8442, + 8443, + 8444, + 8445, + 8446, + 8447, + 8448, + 8449, + 8450, + 8451, + 8452, + 8453, + 8454, + 8455, + 8456, + 8457, + 8458, + 8459, + 8460, + 8461, + 8462, + 8463, + 8464, + 8465, + 8466, + 8467, + 8468, + 8469, + 8470, + 8471, + 8472, + 8473, + 8474, + 8475, + 8476, + 8477, + 8478, + 8479, + 8480, + 8481, + 8482, + 8483, + 8484, + 8485, + 8486, + 8487, + 8488, + 8489, + 8490, + 8491, + 8492, + 8493, + 8494, + 8495, + 8496, + 8497, + 8498, + 8499, + 8500, + 8501, + 8502, + 8503, + 8504, + 8505, + 8506, + 8507, + 8508, + 8509, + 8510, + 8511, + 8512, + 8513, + 8514, + 8515, + 8516, + 8517, + 8518, + 8519, + 8520, + 8521, + 8522, + 8523, + 8524, + 8525, + 8526, + 8527, + 8528, + 8529, + 8530, + 8531, + 8532, + 8533, + 8534, + 8535, + 8536, + 8537, + 8538, + 8539, + 8540, + 8541, + 8542, + 8543, + 8544, + 8545, + 8546, + 8547, + 8548, + 8549, + 8550, + 8551, + 8552, + 8553, + 8554, + 8555, + 8556, + 8557, + 8558, + 8559, + 8560, + 8561, + 8562, + 8563, + 8564, + 8565, + 8566, + 8567, + 8568, + 8569, + 8570, + 8571, + 8572, + 8573, + 8574, + 8575, + 8576, + 8577, + 8578, + 8579, + 8580, + 8581, + 8582, + 8583, + 8584, + 8585, + 8586, + 8587, + 8588, + 8589, + 8590, + 8591, + 8592, + 8593, + 8594, + 8595, + 8596, + 8597, + 8598, + 8599, + 8600, + 8601, + 8602, + 8603, + 8604, + 8605, + 8606, + 8607, + 8608, + 8609, + 8610, + 8611, + 8612, + 8613, + 8614, + 8615, + 8616, + 8617, + 8618, + 8619, + 8620, + 8621, + 8622, + 8623, + 8624, + 8625, + 8626, + 8627, + 8628, + 8629, + 8630, + 8631, + 8632, + 8633, + 8634, + 8635, + 8636, + 8637, + 8638, + 8639, + 8640, + 8641, + 8642, + 8643, + 8644, + 8645, + 8646, + 8647, + 8648, + 8649, + 8650, + 8651, + 8652, + 8653, + 8654, + 8655, + 8656, + 8657, + 8658, + 8659, + 8660, + 8661, + 8662, + 8663, + 8664, + 8665, + 8666, + 8667, + 8668, + 8669, + 8670, + 8671, + 8672, + 8673, + 8674, + 8675, + 8676, + 8677, + 8678, + 8679, + 8680, + 8681, + 8682, + 8683, + 8684, + 8685, + 8686, + 8687, + 8688, + 8689, + 8690, + 8691, + 8692, + 8693, + 8694, + 8695, + 8696, + 8697, + 8698, + 8699, + 8700, + 8701, + 8702, + 8703, + 8704, + 8705, + 8706, + 8707, + 8708, + 8709, + 8710, + 8711, + 8712, + 8713, + 8714, + 8715, + 8716, + 8717, + 8718, + 8719, + 8720, + 8721, + 8722, + 8723, + 8724, + 8725, + 8726, + 8727, + 8728, + 8729, + 8730, + 8731, + 8732, + 8733, + 8734, + 8735, + 8736, + 8737, + 8738, + 8739, + 8740, + 8741, + 8742, + 8743, + 8744, + 8745, + 8746, + 8747, + 8748, + 8749, + 8750, + 8751, + 8752, + 8753, + 8754, + 8755, + 8756, + 8757, + 8758, + 8759, + 8760, + 8761, + 8762, + 8763, + 8764, + 8765, + 8766, + 8767, + 8768, + 8769, + 8770, + 8771, + 8772, + 8773, + 8774, + 8775, + 8776, + 8777, + 8778, + 8779, + 8780, + 8781, + 8782, + 8783, + 8784, + 8785, + 8786, + 8787, + 8788, + 8789, + 8790, + 8791, + 8792, + 8793, + 8794, + 8795, + 8796, + 8797, + 8798, + 8799, + 8800, + 8801, + 8802, + 8803, + 8804, + 8805, + 8806, + 8807, + 8808, + 8809, + 8810, + 8811, + 8812, + 8813, + 8814, + 8815, + 8816, + 8817, + 8818, + 8819, + 8820, + 8821, + 8822, + 8823, + 8824, + 8825, + 8826, + 8827, + 8828, + 8829, + 8830, + 8831, + 8832, + 8833, + 8834, + 8835, + 8836, + 8837, + 8838, + 8839, + 8840, + 8841, + 8842, + 8843, + 8844, + 8845, + 8846, + 8847, + 8848, + 8849, + 8850, + 8851, + 8852, + 8853, + 8854, + 8855, + 8856, + 8857, + 8858, + 8859, + 8860, + 8861, + 8862, + 8863, + 8864, + 8865, + 8866, + 8867, + 8868, + 8869, + 8870, + 8871, + 8872, + 8873, + 8874, + 8875, + 8876, + 8877, + 8878, + 8879, + 8880, + 8881, + 8882, + 8883, + 8884, + 8885, + 8886, + 8887, + 8888, + 8889, + 8890, + 8891, + 8892, + 8893, + 8894, + 8895, + 8896, + 8897, + 8898, + 8899, + 8900, + 8901, + 8902, + 8903, + 8904, + 8905, + 8906, + 8907, + 8908, + 8909, + 8910, + 8911, + 8912, + 8913, + 8914, + 8915, + 8916, + 8917, + 8918, + 8919, + 8920, + 8921, + 8922, + 8923, + 8924, + 8925, + 8926, + 8927, + 8928, + 8929, + 8930, + 8931, + 8932, + 8933, + 8934, + 8935, + 8936, + 8937, + 8938, + 8939, + 8940, + 8941, + 8942, + 8943, + 8944, + 8945, + 8946, + 8947, + 8948, + 8949, + 8950, + 8951, + 8952, + 8953, + 8954, + 8955, + 8956, + 8957, + 8958, + 8959, + 8960, + 8961, + 8962, + 8963, + 8964, + 8965, + 8966, + 8967, + 8968, + 8969, + 8970, + 8971, + 8972, + 8973, + 8974, + 8975, + 8976, + 8977, + 8978, + 8979, + 8980, + 8981, + 8982, + 8983, + 8984, + 8985, + 8986, + 8987, + 8988, + 8989, + 8990, + 8991, + 8992, + 8993, + 8994, + 8995, + 8996, + 8997, + 8998, + 8999, + 9000, + 9001, + 9002, + 9003, + 9004, + 9005, + 9006, + 9007, + 9008, + 9009, + 9010, + 9011, + 9012, + 9013, + 9014, + 9015, + 9016, + 9017, + 9018, + 9019, + 9020, + 9021, + 9022, + 9023, + 9024, + 9025, + 9026, + 9027, + 9028, + 9029, + 9030, + 9031, + 9032, + 9033, + 9034, + 9035, + 9036, + 9037, + 9038, + 9039, + 9040, + 9041, + 9042, + 9043, + 9044, + 9045, + 9046, + 9047, + 9048, + 9049, + 9050, + 9051, + 9052, + 9053, + 9054, + 9055, + 9056, + 9057, + 9058, + 9059, + 9060, + 9061, + 9062, + 9063, + 9064, + 9065, + 9066, + 9067, + 9068, + 9069, + 9070, + 9071, + 9072, + 9073, + 9074, + 9075, + 9076, + 9077, + 9078, + 9079, + 9080, + 9081, + 9082, + 9083, + 9084, + 9085, + 9086, + 9087, + 9088, + 9089, + 9090, + 9091, + 9092, + 9093, + 9094, + 9095, + 9096, + 9097, + 9098, + 9099, + 9100, + 9101, + 9102, + 9103, + 9104, + 9105, + 9106, + 9107, + 9108, + 9109, + 9110, + 9111, + 9112, + 9113, + 9114, + 9115, + 9116, + 9117, + 9118, + 9119, + 9120, + 9121, + 9122, + 9123, + 9124, + 9125, + 9126, + 9127, + 9128, + 9129, + 9130, + 9131, + 9132, + 9133, + 9134, + 9135, + 9136, + 9137, + 9138, + 9139, + 9140, + 9141, + 9142, + 9143, + 9144, + 9145, + 9146, + 9147, + 9148, + 9149, + 9150, + 9151, + 9152, + 9153, + 9154, + 9155, + 9156, + 9157, + 9158, + 9159, + 9160, + 9161, + 9162, + 9163, + 9164, + 9165, + 9166, + 9167, + 9168, + 9169, + 9170, + 9171, + 9172, + 9173, + 9174, + 9175, + 9176, + 9177, + 9178, + 9179, + 9180, + 9181, + 9182, + 9183, + 9184, + 9185, + 9186, + 9187, + 9188, + 9189, + 9190, + 9191, + 9192, + 9193, + 9194, + 9195, + 9196, + 9197, + 9198, + 9199, + 9200, + 9201, + 9202, + 9203, + 9204, + 9205, + 9206, + 9207, + 9208, + 9209, + 9210, + 9211, + 9212, + 9213, + 9214, + 9215, + 9216, + 9217, + 9218, + 9219, + 9220, + 9221, + 9222, + 9223, + 9224, + 9225, + 9226, + 9227, + 9228, + 9229, + 9230, + 9231, + 9232, + 9233, + 9234, + 9235, + 9236, + 9237, + 9238, + 9239, + 9240, + 9241, + 9242, + 9243, + 9244, + 9245, + 9246, + 9247, + 9248, + 9249, + 9250, + 9251, + 9252, + 9253, + 9254, + 9255, + 9256, + 9257, + 9258, + 9259, + 9260, + 9261, + 9262, + 9263, + 9264, + 9265, + 9266, + 9267, + 9268, + 9269, + 9270, + 9271, + 9272, + 9273, + 9274, + 9275, + 9276, + 9277, + 9278, + 9279, + 9280, + 9281, + 9282, + 9283, + 9284, + 9285, + 9286, + 9287, + 9288, + 9289, + 9290, + 9291, + 9292, + 9293, + 9294, + 9295, + 9296, + 9297, + 9298, + 9299, + 9300, + 9301, + 9302, + 9303, + 9304, + 9305, + 9306, + 9307, + 9308, + 9309, + 9310, + 9311, + 9312, + 9313, + 9314, + 9315, + 9316, + 9317, + 9318, + 9319, + 9320, + 9321, + 9322, + 9323, + 9324, + 9325, + 9326, + 9327, + 9328, + 9329, + 9330, + 9331, + 9332, + 9333, + 9334, + 9335, + 9336, + 9337, + 9338, + 9339, + 9340, + 9341, + 9342, + 9343, + 9344, + 9345, + 9346, + 9347, + 9348, + 9349, + 9350, + 9351, + 9352, + 9353, + 9354, + 9355, + 9356, + 9357, + 9358, + 9359, + 9360, + 9361, + 9362, + 9363, + 9364, + 9365, + 9366, + 9367, + 9368, + 9369, + 9370, + 9371, + 9372, + 9373, + 9374, + 9375, + 9376, + 9377, + 9378, + 9379, + 9380, + 9381, + 9382, + 9383, + 9384, + 9385, + 9386, + 9387, + 9388, + 9389, + 9390, + 9391, + 9392, + 9393, + 9394, + 9395, + 9396, + 9397, + 9398, + 9399, + 9400, + 9401, + 9402, + 9403, + 9404, + 9405, + 9406, + 9407, + 9408, + 9409, + 9410, + 9411, + 9412, + 9413, + 9414, + 9415, + 9416, + 9417, + 9418, + 9419, + 9420, + 9421, + 9422, + 9423, + 9424, + 9425, + 9426, + 9427, + 9428, + 9429, + 9430, + 9431, + 9432, + 9433, + 9434, + 9435, + 9436, + 9437, + 9438, + 9439, + 9440, + 9441, + 9442, + 9443, + 9444, + 9445, + 9446, + 9447, + 9448, + 9449, + 9450, + 9451, + 9452, + 9453, + 9454, + 9455, + 9456, + 9457, + 9458, + 9459, + 9460, + 9461, + 9462, + 9463, + 9464, + 9465, + 9466, + 9467, + 9468, + 9469, + 9470, + 9471, + 9472, + 9473, + 9474, + 9475, + 9476, + 9477, + 9478, + 9479, + 9480, + 9481, + 9482, + 9483, + 9484, + 9485, + 9486, + 9487, + 9488, + 9489, + 9490, + 9491, + 9492, + 9493, + 9494, + 9495, + 9496, + 9497, + 9498, + 9499, + 9500, + 9501, + 9502, + 9503, + 9504, + 9505, + 9506, + 9507, + 9508, + 9509, + 9510, + 9511, + 9512, + 9513, + 9514, + 9515, + 9516, + 9517, + 9518, + 9519, + 9520, + 9521, + 9522, + 9523, + 9524, + 9525, + 9526, + 9527, + 9528, + 9529, + 9530, + 9531, + 9532, + 9533, + 9534, + 9535, + 9536, + 9537, + 9538, + 9539, + 9540, + 9541, + 9542, + 9543, + 9544, + 9545, + 9546, + 9547, + 9548, + 9549, + 9550, + 9551, + 9552, + 9553, + 9554, + 9555, + 9556, + 9557, + 9558, + 9559, + 9560, + 9561, + 9562, + 9563, + 9564, + 9565, + 9566, + 9567, + 9568, + 9569, + 9570, + 9571, + 9572, + 9573, + 9574, + 9575, + 9576, + 9577, + 9578, + 9579, + 9580, + 9581, + 9582, + 9583, + 9584, + 9585, + 9586, + 9587, + 9588, + 9589, + 9590, + 9591, + 9592, + 9593, + 9594, + 9595, + 9596, + 9597, + 9598, + 9599, + 9600, + 9601, + 9602, + 9603, + 9604, + 9605, + 9606, + 9607, + 9608, + 9609, + 9610, + 9611, + 9612, + 9613, + 9614, + 9615, + 9616, + 9617, + 9618, + 9619, + 9620, + 9621, + 9622, + 9623, + 9624, + 9625, + 9626, + 9627, + 9628, + 9629, + 9630, + 9631, + 9632, + 9633, + 9634, + 9635, + 9636, + 9637, + 9638, + 9639, + 9640, + 9641, + 9642, + 9643, + 9644, + 9645, + 9646, + 9647, + 9648, + 9649, + 9650, + 9651, + 9652, + 9653, + 9654, + 9655, + 9656, + 9657, + 9658, + 9659, + 9660, + 9661, + 9662, + 9663, + 9664, + 9665, + 9666, + 9667, + 9668, + 9669, + 9670, + 9671, + 9672, + 9673, + 9674, + 9675, + 9676, + 9677, + 9678, + 9679, + 9680, + 9681, + 9682, + 9683, + 9684, + 9685, + 9686, + 9687, + 9688, + 9689, + 9690, + 9691, + 9692, + 9693, + 9694, + 9695, + 9696, + 9697, + 9698, + 9699, + 9700, + 9701, + 9702, + 9703, + 9704, + 9705, + 9706, + 9707, + 9708, + 9709, + 9710, + 9711, + 9712, + 9713, + 9714, + 9715, + 9716, + 9717, + 9718, + 9719, + 9720, + 9721, + 9722, + 9723, + 9724, + 9725, + 9726, + 9727, + 9728, + 9729, + 9730, + 9731, + 9732, + 9733, + 9734, + 9735, + 9736, + 9737, + 9738, + 9739, + 9740, + 9741, + 9742, + 9743, + 9744, + 9745, + 9746, + 9747, + 9748, + 9749, + 9750, + 9751, + 9752, + 9753, + 9754, + 9755, + 9756, + 9757, + 9758, + 9759, + 9760, + 9761, + 9762, + 9763, + 9764, + 9765, + 9766, + 9767, + 9768, + 9769, + 9770, + 9771, + 9772, + 9773, + 9774, + 9775, + 9776, + 9777, + 9778, + 9779, + 9780, + 9781, + 9782, + 9783, + 9784, + 9785, + 9786, + 9787, + 9788, + 9789, + 9790, + 9791, + 9792, + 9793, + 9794, + 9795, + 9796, + 9797, + 9798, + 9799, + 9800, + 9801, + 9802, + 9803, + 9804, + 9805, + 9806, + 9807, + 9808, + 9809, + 9810, + 9811, + 9812, + 9813, + 9814, + 9815, + 9816, + 9817, + 9818, + 9819, + 9820, + 9821, + 9822, + 9823, + 9824, + 9825, + 9826, + 9827, + 9828, + 9829, + 9830, + 9831, + 9832, + 9833, + 9834, + 9835, + 9836, + 9837, + 9838, + 9839, + 9840, + 9841, + 9842, + 9843, + 9844, + 9845, + 9846, + 9847, + 9848, + 9849, + 9850, + 9851, + 9852, + 9853, + 9854, + 9855, + 9856, + 9857, + 9858, + 9859, + 9860, + 9861, + 9862, + 9863, + 9864, + 9865, + 9866, + 9867, + 9868, + 9869, + 9870, + 9871, + 9872, + 9873, + 9874, + 9875, + 9876, + 9877, + 9878, + 9879, + 9880, + 9881, + 9882, + 9883, + 9884, + 9885, + 9886, + 9887, + 9888, + 9889, + 9890, + 9891, + 9892, + 9893, + 9894, + 9895, + 9896, + 9897, + 9898, + 9899, + 9900, + 9901, + 9902, + 9903, + 9904, + 9905, + 9906, + 9907, + 9908, + 9909, + 9910, + 9911, + 9912, + 9913, + 9914, + 9915, + 9916, + 9917, + 9918, + 9919, + 9920, + 9921, + 9922, + 9923, + 9924, + 9925, + 9926, + 9927, + 9928, + 9929, + 9930, + 9931, + 9932, + 9933, + 9934, + 9935, + 9936, + 9937, + 9938, + 9939, + 9940, + 9941, + 9942, + 9943, + 9944, + 9945, + 9946, + 9947, + 9948, + 9949, + 9950, + 9951, + 9952, + 9953, + 9954, + 9955, + 9956, + 9957, + 9958, + 9959, + 9960, + 9961, + 9962, + 9963, + 9964, + 9965, + 9966, + 9967, + 9968, + 9969, + 9970, + 9971, + 9972, + 9973, + 9974, + 9975, + 9976, + 9977, + 9978, + 9979, + 9980, + 9981, + 9982, + 9983, + 9984, + 9985, + 9986, + 9987, + 9988, + 9989, + 9990, + 9991, + 9992, + 9993, + 9994, + 9995, + 9996, + 9997, + 9998, + 9999, + 10000, + 10001, + 10002, + 10003, + 10004, + 10005, + 10006, + 10007, + 10008, + 10009, + 10010, + 10011, + 10012, + 10013, + 10014, + 10015, + 10016, + 10017, + 10018, + 10019, + 10020, + 10021, + 10022, + 10023, + 10024, + 10025, + 10026, + 10027, + 10028, + 10029, + 10030, + 10031, + 10032, + 10033, + 10034, + 10035, + 10036, + 10037, + 10038, + 10039, + 10040, + 10041, + 10042, + 10043, + 10044, + 10045, + 10046, + 10047, + 10048, + 10049, + 10050, + 10051, + 10052, + 10053, + 10054, + 10055, + 10056, + 10057, + 10058, + 10059, + 10060, + 10061, + 10062, + 10063, + 10064, + 10065, + 10066, + 10067, + 10068, + 10069, + 10070, + 10071, + 10072, + 10073, + 10074, + 10075, + 10076, + 10077, + 10078, + 10079, + 10080, + 10081, + 10082, + 10083, + 10084, + 10085, + 10086, + 10087, + 10088, + 10089, + 10090, + 10091, + 10092, + 10093, + 10094, + 10095, + 10096, + 10097, + 10098, + 10099, + 10100, + 10101, + 10102, + 10103, + 10104, + 10105, + 10106, + 10107, + 10108, + 10109, + 10110, + 10111, + 10112, + 10113, + 10114, + 10115, + 10116, + 10117, + 10118, + 10119, + 10120, + 10121, + 10122, + 10123, + 10124, + 10125, + 10126, + 10127, + 10128, + 10129, + 10130, + 10131, + 10132, + 10133, + 10134, + 10135, + 10136, + 10137, + 10138, + 10139, + 10140, + 10141, + 10142, + 10143, + 10144, + 10145, + 10146, + 10147, + 10148, + 10149, + 10150, + 10151, + 10152, + 10153, + 10154, + 10155, + 10156, + 10157, + 10158, + 10159, + 10160, + 10161, + 10162, + 10163, + 10164, + 10165, + 10166, + 10167, + 10168, + 10169, + 10170, + 10171, + 10172, + 10173, + 10174, + 10175, + 10176, + 10177, + 10178, + 10179, + 10180, + 10181, + 10182, + 10183, + 10184, + 10185, + 10186, + 10187, + 10188, + 10189, + 10190, + 10191, + 10192, + 10193, + 10194, + 10195, + 10196, + 10197, + 10198, + 10199, + 10200, + 10201, + 10202, + 10203, + 10204, + 10205, + 10206, + 10207, + 10208, + 10209, + 10210, + 10211, + 10212, + 10213, + 10214, + 10215, + 10216, + 10217, + 10218, + 10219, + 10220, + 10221, + 10222, + 10223, + 10224, + 10225, + 10226, + 10227, + 10228, + 10229, + 10230, + 10231, + 10232, + 10233, + 10234, + 10235, + 10236, + 10237, + 10238, + 10239, + 10240, + 10241, + 10242, + 10243, + 10244, + 10245, + 10246, + 10247, + 10248, + 10249, + 10250, + 10251, + 10252, + 10253, + 10254, + 10255, + 10256, + 10257, + 10258, + 10259, + 10260, + 10261, + 10262, + 10263, + 10264, + 10265, + 10266, + 10267, + 10268, + 10269, + 10270, + 10271, + 10272, + 10273, + 10274, + 10275, + 10276, + 10277, + 10278, + 10279, + 10280, + 10281, + 10282, + 10283, + 10284, + 10285, + 10286, + 10287, + 10288, + 10289, + 10290, + 10291, + 10292, + 10293, + 10294, + 10295, + 10296, + 10297, + 10298, + 10299, + 10300, + 10301, + 10302, + 10303, + 10304, + 10305, + 10306, + 10307, + 10308, + 10309, + 10310, + 10311, + 10312, + 10313, + 10314, + 10315, + 10316, + 10317, + 10318, + 10319, + 10320, + 10321, + 10322, + 10323, + 10324, + 10325, + 10326, + 10327, + 10328, + 10329, + 10330, + 10331, + 10332, + 10333, + 10334, + 10335, + 10336, + 10337, + 10338, + 10339, + 10340, + 10341, + 10342, + 10343, + 10344, + 10345, + 10346, + 10347, + 10348, + 10349, + 10350, + 10351, + 10352, + 10353, + 10354, + 10355, + 10356, + 10357, + 10358, + 10359, + 10360, + 10361, + 10362, + 10363, + 10364, + 10365, + 10366, + 10367, + 10368, + 10369, + 10370, + 10371, + 10372, + 10373, + 10374, + 10375, + 10376, + 10377, + 10378, + 10379, + 10380, + 10381, + 10382, + 10383, + 10384, + 10385, + 10386, + 10387, + 10388, + 10389, + 10390, + 10391, + 10392, + 10393, + 10394, + 10395, + 10396, + 10397, + 10398, + 10399, + 10400, + 10401, + 10402, + 10403, + 10404, + 10405, + 10406, + 10407, + 10408, + 10409, + 10410, + 10411, + 10412, + 10413, + 10414, + 10415, + 10416, + 10417, + 10418, + 10419, + 10420, + 10421, + 10422, + 10423, + 10424, + 10425, + 10426, + 10427, + 10428, + 10429, + 10430, + 10431, + 10432, + 10433, + 10434, + 10435, + 10436, + 10437, + 10438, + 10439, + 10440, + 10441, + 10442, + 10443, + 10444, + 10445, + 10446, + 10447, + 10448, + 10449, + 10450, + 10451, + 10452, + 10453, + 10454, + 10455, + 10456, + 10457, + 10458, + 10459, + 10460, + 10461, + 10462, + 10463, + 10464, + 10465, + 10466, + 10467, + 10468, + 10469, + 10470, + 10471, + 10472, + 10473, + 10474, + 10475, + 10476, + 10477, + 10478, + 10479, + 10480, + 10481, + 10482, + 10483, + 10484, + 10485, + 10486, + 10487, + 10488, + 10489, + 10490, + 10491, + 10492, + 10493, + 10494, + 10495, + 10496, + 10497, + 10498, + 10499, + 10500, + 10501, + 10502, + 10503, + 10504, + 10505, + 10506, + 10507, + 10508, + 10509, + 10510, + 10511, + 10512, + 10513, + 10514, + 10515, + 10516, + 10517, + 10518, + 10519, + 10520, + 10521, + 10522, + 10523, + 10524, + 10525, + 10526, + 10527, + 10528, + 10529, + 10530, + 10531, + 10532, + 10533, + 10534, + 10535, + 10536, + 10537, + 10538, + 10539, + 10540, + 10541, + 10542, + 10543, + 10544, + 10545, + 10546, + 10547, + 10548, + 10549, + 10550, + 10551, + 10552, + 10553, + 10554, + 10555, + 10556, + 10557, + 10558, + 10559, + 10560, + 10561, + 10562, + 10563, + 10564, + 10565, + 10566, + 10567, + 10568, + 10569, + 10570, + 10571, + 10572, + 10573, + 10574, + 10575, + 10576, + 10577, + 10578, + 10579, + 10580, + 10581, + 10582, + 10583, + 10584, + 10585, + 10586, + 10587, + 10588, + 10589, + 10590, + 10591, + 10592, + 10593, + 10594, + 10595, + 10596, + 10597, + 10598, + 10599, + 10600, + 10601, + 10602, + 10603, + 10604, + 10605, + 10606, + 10607, + 10608, + 10609, + 10610, + 10611, + 10612, + 10613, + 10614, + 10615, + 10616, + 10617, + 10618, + 10619, + 10620, + 10621, + 10622, + 10623, + 10624, + 10625, + 10626, + 10627, + 10628, + 10629, + 10630, + 10631, + 10632, + 10633, + 10634, + 10635, + 10636, + 10637, + 10638, + 10639, + 10640, + 10641, + 10642, + 10643, + 10644, + 10645, + 10646, + 10647, + 10648, + 10649, + 10650, + 10651, + 10652, + 10653, + 10654, + 10655, + 10656, + 10657, + 10658, + 10659, + 10660, + 10661, + 10662, + 10663, + 10664, + 10665, + 10666, + 10667, + 10668, + 10669, + 10670, + 10671, + 10672, + 10673, + 10674, + 10675, + 10676, + 10677, + 10678, + 10679, + 10680, + 10681, + 10682, + 10683, + 10684, + 10685, + 10686, + 10687, + 10688, + 10689, + 10690, + 10691, + 10692, + 10693, + 10694, + 10695, + 10696, + 10697, + 10698, + 10699, + 10700, + 10701, + 10702, + 10703, + 10704, + 10705, + 10706, + 10707, + 10708, + 10709, + 10710, + 10711, + 10712, + 10713, + 10714, + 10715, + 10716, + 10717, + 10718, + 10719, + 10720, + 10721, + 10722, + 10723, + 10724, + 10725, + 10726, + 10727, + 10728, + 10729, + 10730, + 10731, + 10732, + 10733, + 10734, + 10735, + 10736, + 10737, + 10738, + 10739, + 10740, + 10741, + 10742, + 10743, + 10744, + 10745, + 10746, + 10747, + 10748, + 10749, + 10750, + 10751, + 10752, + 10753, + 10754, + 10755, + 10756, + 10757, + 10758, + 10759, + 10760, + 10761, + 10762, + 10763, + 10764, + 10765, + 10766, + 10767, + 10768, + 10769, + 10770, + 10771, + 10772, + 10773, + 10774, + 10775, + 10776, + 10777, + 10778, + 10779, + 10780, + 10781, + 10782, + 10783, + 10784, + 10785, + 10786, + 10787, + 10788, + 10789, + 10790, + 10791, + 10792, + 10793, + 10794, + 10795, + 10796, + 10797, + 10798, + 10799, + 10800, + 10801, + 10802, + 10803, + 10804, + 10805, + 10806, + 10807, + 10808, + 10809, + 10810, + 10811, + 10812, + 10813, + 10814, + 10815, + 10816, + 10817, + 10818, + 10819, + 10820, + 10821, + 10822, + 10823, + 10824, + 10825, + 10826, + 10827, + 10828, + 10829, + 10830, + 10831, + 10832, + 10833, + 10834, + 10835, + 10836, + 10837, + 10838, + 10839, + 10840, + 10841, + 10842, + 10843, + 10844, + 10845, + 10846, + 10847, + 10848, + 10849, + 10850, + 10851, + 10852, + 10853, + 10854, + 10855, + 10856, + 10857, + 10858, + 10859, + 10860, + 10861, + 10862, + 10863, + 10864, + 10865, + 10866, + 10867, + 10868, + 10869, + 10870, + 10871, + 10872, + 10873, + 10874, + 10875, + 10876, + 10877, + 10878, + 10879, + 10880, + 10881, + 10882, + 10883, + 10884, + 10885, + 10886, + 10887, + 10888, + 10889, + 10890, + 10891, + 10892, + 10893, + 10894, + 10895, + 10896, + 10897, + 10898, + 10899, + 10900, + 10901, + 10902, + 10903, + 10904, + 10905, + 10906, + 10907, + 10908, + 10909, + 10910, + 10911, + 10912, + 10913, + 10914, + 10915, + 10916, + 10917, + 10918, + 10919, + 10920, + 10921, + 10922, + 10923, + 10924, + 10925, + 10926, + 10927, + 10928, + 10929, + 10930, + 10931, + 10932, + 10933, + 10934, + 10935, + 10936, + 10937, + 10938, + 10939, + 10940, + 10941, + 10942, + 10943, + 10944, + 10945, + 10946, + 10947, + 10948, + 10949, + 10950, + 10951, + 10952, + 10953, + 10954, + 10955, + 10956, + 10957, + 10958, + 10959, + 10960, + 10961, + 10962, + 10963, + 10964, + 10965, + 10966, + 10967, + 10968, + 10969, + 10970, + 10971, + 10972, + 10973, + 10974, + 10975, + 10976, + 10977, + 10978, + 10979, + 10980, + 10981, + 10982, + 10983, + 10984, + 10985, + 10986, + 10987, + 10988, + 10989, + 10990, + 10991, + 10992, + 10993, + 10994, + 10995, + 10996, + 10997, + 10998, + 10999, + 11000, + 11001, + 11002, + 11003, + 11004, + 11005, + 11006, + 11007, + 11008, + 11009, + 11010, + 11011, + 11012, + 11013, + 11014, + 11015, + 11016, + 11017, + 11018, + 11019, + 11020, + 11021, + 11022, + 11023, + 11024, + 11025, + 11026, + 11027, + 11028, + 11029, + 11030, + 11031, + 11032, + 11033, + 11034, + 11035, + 11036, + 11037, + 11038, + 11039, + 11040, + 11041, + 11042, + 11043, + 11044, + 11045, + 11046, + 11047, + 11048, + 11049, + 11050, + 11051, + 11052, + 11053, + 11054, + 11055, + 11056, + 11057, + 11058, + 11059, + 11060, + 11061, + 11062, + 11063, + 11064, + 11065, + 11066, + 11067, + 11068, + 11069, + 11070, + 11071, + 11072, + 11073, + 11074, + 11075, + 11076, + 11077, + 11078, + 11079, + 11080, + 11081, + 11082, + 11083, + 11084, + 11085, + 11086, + 11087, + 11088, + 11089, + 11090, + 11091, + 11092, + 11093, + 11094, + 11095, + 11096, + 11097, + 11098, + 11099, + 11100, + 11101, + 11102, + 11103, + 11104, + 11105, + 11106, + 11107, + 11108, + 11109, + 11110, + 11111, + 11112, + 11113, + 11114, + 11115, + 11116, + 11117, + 11118, + 11119, + 11120, + 11121, + 11122, + 11123, + 11124, + 11125, + 11126, + 11127, + 11128, + 11129, + 11130, + 11131, + 11132, + 11133, + 11134, + 11135, + 11136, + 11137, + 11138, + 11139, + 11140, + 11141, + 11142, + 11143, + 11144, + 11145, + 11146, + 11147, + 11148, + 11149, + 11150, + 11151, + 11152, + 11153, + 11154, + 11155, + 11156, + 11157, + 11158, + 11159, + 11160, + 11161, + 11162, + 11163, + 11164, + 11165, + 11166, + 11167, + 11168, + 11169, + 11170, + 11171, + 11172, + 11173, + 11174, + 11175, + 11176, + 11177, + 11178, + 11179, + 11180, + 11181, + 11182, + 11183, + 11184, + 11185, + 11186, + 11187, + 11188, + 11189, + 11190, + 11191, + 11192, + 11193, + 11194, + 11195, + 11196, + 11197, + 11198, + 11199, + 11200, + 11201, + 11202, + 11203, + 11204, + 11205, + 11206, + 11207, + 11208, + 11209, + 11210, + 11211, + 11212, + 11213, + 11214, + 11215, + 11216, + 11217, + 11218, + 11219, + 11220, + 11221, + 11222, + 11223, + 11224, + 11225, + 11226, + 11227, + 11228, + 11229, + 11230, + 11231, + 11232, + 11233, + 11234, + 11235, + 11236, + 11237, + 11238, + 11239, + 11240, + 11241, + 11242, + 11243, + 11244, + 11245, + 11246, + 11247, + 11248, + 11249, + 11250, + 11251, + 11252, + 11253, + 11254, + 11255, + 11256, + 11257, + 11258, + 11259, + 11260, + 11261, + 11262, + 11263, + 11264, + 11265, + 11266, + 11267, + 11268, + 11269, + 11270, + 11271, + 11272, + 11273, + 11274, + 11275, + 11276, + 11277, + 11278, + 11279, + 11280, + 11281, + 11282, + 11283, + 11284, + 11285, + 11286, + 11287, + 11288, + 11289, + 11290, + 11291, + 11292, + 11293, + 11294, + 11295, + 11296, + 11297, + 11298, + 11299, + 11300, + 11301, + 11302, + 11303, + 11304, + 11305, + 11306, + 11307, + 11308, + 11309, + 11310, + 11311, + 11312, + 11313, + 11314, + 11315, + 11316, + 11317, + 11318, + 11319, + 11320, + 11321, + 11322, + 11323, + 11324, + 11325, + 11326, + 11327, + 11328, + 11329, + 11330, + 11331, + 11332, + 11333, + 11334, + 11335, + 11336, + 11337, + 11338, + 11339, + 11340, + 11341, + 11342, + 11343, + 11344, + 11345, + 11346, + 11347, + 11348, + 11349, + 11350, + 11351, + 11352, + 11353, + 11354, + 11355, + 11356, + 11357, + 11358, + 11359, + 11360, + 11361, + 11362, + 11363, + 11364, + 11365, + 11366, + 11367, + 11368, + 11369, + 11370, + 11371, + 11372, + 11373, + 11374, + 11375, + 11376, + 11377, + 11378, + 11379, + 11380, + 11381, + 11382, + 11383, + 11384, + 11385, + 11386, + 11387, + 11388, + 11389, + 11390, + 11391, + 11392, + 11393, + 11394, + 11395, + 11396, + 11397, + 11398, + 11399, + 11400, + 11401, + 11402, + 11403, + 11404, + 11405, + 11406, + 11407, + 11408, + 11409, + 11410, + 11411, + 11412, + 11413, + 11414, + 11415, + 11416, + 11417, + 11418, + 11419, + 11420, + 11421, + 11422, + 11423, + 11424, + 11425, + 11426, + 11427, + 11428, + 11429, + 11430, + 11431, + 11432, + 11433, + 11434, + 11435, + 11436, + 11437, + 11438, + 11439, + 11440, + 11441, + 11442, + 11443, + 11444, + 11445, + 11446, + 11447, + 11448, + 11449, + 11450, + 11451, + 11452, + 11453, + 11454, + 11455, + 11456, + 11457, + 11458, + 11459, + 11460, + 11461, + 11462, + 11463, + 11464, + 11465, + 11466, + 11467, + 11468, + 11469, + 11470, + 11471, + 11472, + 11473, + 11474, + 11475, + 11476, + 11477, + 11478, + 11479, + 11480, + 11481, + 11482, + 11483, + 11484, + 11485, + 11486, + 11487, + 11488, + 11489, + 11490, + 11491, + 11492, + 11493, + 11494, + 11495, + 11496, + 11497, + 11498, + 11499, + 11500, + 11501, + 11502, + 11503, + 11504, + 11505, + 11506, + 11507, + 11508, + 11509, + 11510, + 11511, + 11512, + 11513, + 11514, + 11515, + 11516, + 11517, + 11518, + 11519, + 11520, + 11521, + 11522, + 11523, + 11524, + 11525, + 11526, + 11527, + 11528, + 11529, + 11530, + 11531, + 11532, + 11533, + 11534, + 11535, + 11536, + 11537, + 11538, + 11539, + 11540, + 11541, + 11542, + 11543, + 11544, + 11545, + 11546, + 11547, + 11548, + 11549, + 11550, + 11551, + 11552, + 11553, + 11554, + 11555, + 11556, + 11557, + 11558, + 11559, + 11560, + 11561, + 11562, + 11563, + 11564, + 11565, + 11566, + 11567, + 11568, + 11569, + 11570, + 11571, + 11572, + 11573, + 11574, + 11575, + 11576, + 11577, + 11578, + 11579, + 11580, + 11581, + 11582, + 11583, + 11584, + 11585, + 11586, + 11587, + 11588, + 11589, + 11590, + 11591, + 11592, + 11593, + 11594, + 11595, + 11596, + 11597, + 11598, + 11599, + 11600, + 11601, + 11602, + 11603, + 11604, + 11605, + 11606, + 11607, + 11608, + 11609, + 11610, + 11611, + 11612, + 11613, + 11614, + 11615, + 11616, + 11617, + 11618, + 11619, + 11620, + 11621, + 11622, + 11623, + 11624, + 11625, + 11626, + 11627, + 11628, + 11629, + 11630, + 11631, + 11632, + 11633, + 11634, + 11635, + 11636, + 11637, + 11638, + 11639, + 11640, + 11641, + 11642, + 11643, + 11644, + 11645, + 11646, + 11647, + 11648, + 11649, + 11650, + 11651, + 11652, + 11653, + 11654, + 11655, + 11656, + 11657, + 11658, + 11659, + 11660, + 11661, + 11662, + 11663, + 11664, + 11665, + 11666, + 11667, + 11668, + 11669, + 11670, + 11671, + 11672, + 11673, + 11674, + 11675, + 11676, + 11677, + 11678, + 11679, + 11680, + 11681, + 11682, + 11683, + 11684, + 11685, + 11686, + 11687, + 11688, + 11689, + 11690, + 11691, + 11692, + 11693, + 11694, + 11695, + 11696, + 11697, + 11698, + 11699, + 11700, + 11701, + 11702, + 11703, + 11704, + 11705, + 11706, + 11707, + 11708, + 11709, + 11710, + 11711, + 11712, + 11713, + 11714, + 11715, + 11716, + 11717, + 11718, + 11719, + 11720, + 11721, + 11722, + 11723, + 11724, + 11725, + 11726, + 11727, + 11728, + 11729, + 11730, + 11731, + 11732, + 11733, + 11734, + 11735, + 11736, + 11737, + 11738, + 11739, + 11740, + 11741, + 11742, + 11743, + 11744, + 11745, + 11746, + 11747, + 11748, + 11749, + 11750, + 11751, + 11752, + 11753, + 11754, + 11755, + 11756, + 11757, + 11758, + 11759, + 11760, + 11761, + 11762, + 11763, + 11764, + 11765, + 11766, + 11767, + 11768, + 11769, + 11770, + 11771, + 11772, + 11773, + 11774, + 11775, + 11776, + 11777, + 11778, + 11779, + 11780, + 11781, + 11782, + 11783, + 11784, + 11785, + 11786, + 11787, + 11788, + 11789, + 11790, + 11791, + 11792, + 11793, + 11794, + 11795, + 11796, + 11797, + 11798, + 11799, + 11800, + 11801, + 11802, + 11803, + 11804, + 11805, + 11806, + 11807, + 11808, + 11809, + 11810, + 11811, + 11812, + 11813, + 11814, + 11815, + 11816, + 11817, + 11818, + 11819, + 11820, + 11821, + 11822, + 11823, + 11824, + 11825, + 11826, + 11827, + 11828, + 11829, + 11830, + 11831, + 11832, + 11833, + 11834, + 11835, + 11836, + 11837, + 11838, + 11839, + 11840, + 11841, + 11842, + 11843, + 11844, + 11845, + 11846, + 11847, + 11848, + 11849, + 11850, + 11851, + 11852, + 11853, + 11854, + 11855, + 11856, + 11857, + 11858, + 11859, + 11860, + 11861, + 11862, + 11863, + 11864, + 11865, + 11866, + 11867, + 11868, + 11869, + 11870, + 11871, + 11872, + 11873, + 11874, + 11875, + 11876, + 11877, + 11878, + 11879, + 11880, + 11881, + 11882, + 11883, + 11884, + 11885, + 11886, + 11887, + 11888, + 11889, + 11890, + 11891, + 11892, + 11893, + 11894, + 11895, + 11896, + 11897, + 11898, + 11899, + 11900, + 11901, + 11902, + 11903, + 11904, + 11905, + 11906, + 11907, + 11908, + 11909, + 11910, + 11911, + 11912, + 11913, + 11914, + 11915, + 11916, + 11917, + 11918, + 11919, + 11920, + 11921, + 11922, + 11923, + 11924, + 11925, + 11926, + 11927, + 11928, + 11929, + 11930, + 11931, + 11932, + 11933, + 11934, + 11935, + 11936, + 11937, + 11938, + 11939, + 11940, + 11941, + 11942, + 11943, + 11944, + 11945, + 11946, + 11947, + 11948, + 11949, + 11950, + 11951, + 11952, + 11953, + 11954, + 11955, + 11956, + 11957, + 11958, + 11959, + 11960, + 11961, + 11962, + 11963, + 11964, + 11965, + 11966, + 11967, + 11968, + 11969, + 11970, + 11971, + 11972, + 11973, + 11974, + 11975, + 11976, + 11977, + 11978, + 11979, + 11980, + 11981, + 11982, + 11983, + 11984, + 11985, + 11986, + 11987, + 11988, + 11989, + 11990, + 11991, + 11992, + 11993, + 11994, + 11995, + 11996, + 11997, + 11998, + 11999, + 12000, + 12001, + 12002, + 12003, + 12004, + 12005, + 12006, + 12007, + 12008, + 12009, + 12010, + 12011, + 12012, + 12013, + 12014, + 12015, + 12016, + 12017, + 12018, + 12019, + 12020, + 12021, + 12022, + 12023, + 12024, + 12025, + 12026, + 12027, + 12028, + 12029, + 12030, + 12031, + 12032, + 12033, + 12034, + 12035, + 12036, + 12037, + 12038, + 12039, + 12040, + 12041, + 12042, + 12043, + 12044, + 12045, + 12046, + 12047, + 12048, + 12049, + 12050, + 12051, + 12052, + 12053, + 12054, + 12055, + 12056, + 12057, + 12058, + 12059, + 12060, + 12061, + 12062, + 12063, + 12064, + 12065, + 12066, + 12067, + 12068, + 12069, + 12070, + 12071, + 12072, + 12073, + 12074, + 12075, + 12076, + 12077, + 12078, + 12079, + 12080, + 12081, + 12082, + 12083, + 12084, + 12085, + 12086, + 12087, + 12088, + 12089, + 12090, + 12091, + 12092, + 12093, + 12094, + 12095, + 12096, + 12097, + 12098, + 12099, + 12100, + 12101, + 12102, + 12103, + 12104, + 12105, + 12106, + 12107, + 12108, + 12109, + 12110, + 12111, + 12112, + 12113, + 12114, + 12115, + 12116, + 12117, + 12118, + 12119, + 12120, + 12121, + 12122, + 12123, + 12124, + 12125, + 12126, + 12127, + 12128, + 12129, + 12130, + 12131, + 12132, + 12133, + 12134, + 12135, + 12136, + 12137, + 12138, + 12139, + 12140, + 12141, + 12142, + 12143, + 12144, + 12145, + 12146, + 12147, + 12148, + 12149, + 12150, + 12151, + 12152, + 12153, + 12154, + 12155, + 12156, + 12157, + 12158, + 12159, + 12160, + 12161, + 12162, + 12163, + 12164, + 12165, + 12166, + 12167, + 12168, + 12169, + 12170, + 12171, + 12172, + 12173, + 12174, + 12175, + 12176, + 12177, + 12178, + 12179, + 12180, + 12181, + 12182, + 12183, + 12184, + 12185, + 12186, + 12187, + 12188, + 12189, + 12190, + 12191, + 12192, + 12193, + 12194, + 12195, + 12196, + 12197, + 12198, + 12199, + 12200, + 12201, + 12202, + 12203, + 12204, + 12205, + 12206, + 12207, + 12208, + 12209, + 12210, + 12211, + 12212, + 12213, + 12214, + 12215, + 12216, + 12217, + 12218, + 12219, + 12220, + 12221, + 12222, + 12223, + 12224, + 12225, + 12226, + 12227, + 12228, + 12229, + 12230, + 12231, + 12232, + 12233, + 12234, + 12235, + 12236, + 12237, + 12238, + 12239, + 12240, + 12241, + 12242, + 12243, + 12244, + 12245, + 12246, + 12247, + 12248, + 12249, + 12250, + 12251, + 12252, + 12253, + 12254, + 12255, + 12256, + 12257, + 12258, + 12259, + 12260, + 12261, + 12262, + 12263, + 12264, + 12265, + 12266, + 12267, + 12268, + 12269, + 12270, + 12271, + 12272, + 12273, + 12274, + 12275, + 12276, + 12277, + 12278, + 12279, + 12280, + 12281, + 12282, + 12283, + 12284, + 12285, + 12286, + 12287, + 12288, + 12289, + 12290, + 12291, + 12292, + 12293, + 12294, + 12295, + 12296, + 12297, + 12298, + 12299, + 12300, + 12301, + 12302, + 12303, + 12304, + 12305, + 12306, + 12307, + 12308, + 12309, + 12310, + 12311, + 12312, + 12313, + 12314, + 12315, + 12316, + 12317, + 12318, + 12319, + 12320, + 12321, + 12322, + 12323, + 12324, + 12325, + 12326, + 12327, + 12328, + 12329, + 12330, + 12331, + 12332, + 12333, + 12334, + 12335, + 12336, + 12337, + 12338, + 12339, + 12340, + 12341, + 12342, + 12343, + 12344, + 12345, + 12346, + 12347, + 12348, + 12349, + 12350, + 12351, + 12352, + 12353, + 12354, + 12355, + 12356, + 12357, + 12358, + 12359, + 12360, + 12361, + 12362, + 12363, + 12364, + 12365, + 12366, + 12367, + 12368, + 12369, + 12370, + 12371, + 12372, + 12373, + 12374, + 12375, + 12376, + 12377, + 12378, + 12379, + 12380, + 12381, + 12382, + 12383, + 12384, + 12385, + 12386, + 12387, + 12388, + 12389, + 12390, + 12391, + 12392, + 12393, + 12394, + 12395, + 12396, + 12397, + 12398, + 12399, + 12400, + 12401, + 12402, + 12403, + 12404, + 12405, + 12406, + 12407, + 12408, + 12409, + 12410, + 12411, + 12412, + 12413, + 12414, + 12415, + 12416, + 12417, + 12418, + 12419, + 12420, + 12421, + 12422, + 12423, + 12424, + 12425, + 12426, + 12427, + 12428, + 12429, + 12430, + 12431, + 12432, + 12433, + 12434, + 12435, + 12436, + 12437, + 12438, + 12439, + 12440, + 12441, + 12442, + 12443, + 12444, + 12445, + 12446, + 12447, + 12448, + 12449, + 12450, + 12451, + 12452, + 12453, + 12454, + 12455, + 12456, + 12457, + 12458, + 12459, + 12460, + 12461, + 12462, + 12463, + 12464, + 12465, + 12466, + 12467, + 12468, + 12469, + 12470, + 12471, + 12472, + 12473, + 12474, + 12475, + 12476, + 12477, + 12478, + 12479, + 12480, + 12481, + 12482, + 12483, + 12484, + 12485, + 12486, + 12487, + 12488, + 12489, + 12490, + 12491, + 12492, + 12493, + 12494, + 12495, + 12496, + 12497, + 12498, + 12499, + 12500, + 12501, + 12502, + 12503, + 12504, + 12505, + 12506, + 12507, + 12508, + 12509, + 12510, + 12511, + 12512, + 12513, + 12514, + 12515, + 12516, + 12517, + 12518, + 12519, + 12520, + 12521, + 12522, + 12523, + 12524, + 12525, + 12526, + 12527, + 12528, + 12529, + 12530, + 12531, + 12532, + 12533, + 12534, + 12535, + 12536, + 12537, + 12538, + 12539, + 12540, + 12541, + 12542, + 12543, + 12544, + 12545, + 12546, + 12547, + 12548, + 12549, + 12550, + 12551, + 12552, + 12553, + 12554, + 12555, + 12556, + 12557, + 12558, + 12559, + 12560, + 12561, + 12562, + 12563, + 12564, + 12565, + 12566, + 12567, + 12568, + 12569, + 12570, + 12571, + 12572, + 12573, + 12574, + 12575, + 12576, + 12577, + 12578, + 12579, + 12580, + 12581, + 12582, + 12583, + 12584, + 12585, + 12586, + 12587, + 12588, + 12589, + 12590, + 12591, + 12592, + 12593, + 12594, + 12595, + 12596, + 12597, + 12598, + 12599, + 12600, + 12601, + 12602, + 12603, + 12604, + 12605, + 12606, + 12607, + 12608, + 12609, + 12610, + 12611, + 12612, + 12613, + 12614, + 12615, + 12616, + 12617, + 12618, + 12619, + 12620, + 12621, + 12622, + 12623, + 12624, + 12625, + 12626, + 12627, + 12628, + 12629, + 12630, + 12631, + 12632, + 12633, + 12634, + 12635, + 12636, + 12637, + 12638, + 12639, + 12640, + 12641, + 12642, + 12643, + 12644, + 12645, + 12646, + 12647, + 12648, + 12649, + 12650, + 12651, + 12652, + 12653, + 12654, + 12655, + 12656, + 12657, + 12658, + 12659, + 12660, + 12661, + 12662, + 12663, + 12664, + 12665, + 12666, + 12667, + 12668, + 12669, + 12670, + 12671, + 12672, + 12673, + 12674, + 12675, + 12676, + 12677, + 12678, + 12679, + 12680, + 12681, + 12682, + 12683, + 12684, + 12685, + 12686, + 12687, + 12688, + 12689, + 12690, + 12691, + 12692, + 12693, + 12694, + 12695, + 12696, + 12697, + 12698, + 12699, + 12700, + 12701, + 12702, + 12703, + 12704, + 12705, + 12706, + 12707, + 12708, + 12709, + 12710, + 12711, + 12712, + 12713, + 12714, + 12715, + 12716, + 12717, + 12718, + 12719, + 12720, + 12721, + 12722, + 12723, + 12724, + 12725, + 12726, + 12727, + 12728, + 12729, + 12730, + 12731, + 12732, + 12733, + 12734, + 12735, + 12736, + 12737, + 12738, + 12739, + 12740, + 12741, + 12742, + 12743, + 12744, + 12745, + 12746, + 12747, + 12748, + 12749, + 12750, + 12751, + 12752, + 12753, + 12754, + 12755, + 12756, + 12757, + 12758, + 12759, + 12760, + 12761, + 12762, + 12763, + 12764, + 12765, + 12766, + 12767, + 12768, + 12769, + 12770, + 12771, + 12772, + 12773, + 12774, + 12775, + 12776, + 12777, + 12778, + 12779, + 12780, + 12781, + 12782, + 12783, + 12784, + 12785, + 12786, + 12787, + 12788, + 12789, + 12790, + 12791, + 12792, + 12793, + 12794, + 12795, + 12796, + 12797, + 12798, + 12799, + 12800, + 12801, + 12802, + 12803, + 12804, + 12805, + 12806, + 12807, + 12808, + 12809, + 12810, + 12811, + 12812, + 12813, + 12814, + 12815, + 12816, + 12817, + 12818, + 12819, + 12820, + 12821, + 12822, + 12823, + 12824, + 12825, + 12826, + 12827, + 12828, + 12829, + 12830, + 12831, + 12832, + 12833, + 12834, + 12835, + 12836, + 12837, + 12838, + 12839, + 12840, + 12841, + 12842, + 12843, + 12844, + 12845, + 12846, + 12847, + 12848, + 12849, + 12850, + 12851, + 12852, + 12853, + 12854, + 12855, + 12856, + 12857, + 12858, + 12859, + 12860, + 12861, + 12862, + 12863, + 12864, + 12865, + 12866, + 12867, + 12868, + 12869, + 12870, + 12871, + 12872, + 12873, + 12874, + 12875, + 12876, + 12877, + 12878, + 12879, + 12880, + 12881, + 12882, + 12883, + 12884, + 12885, + 12886, + 12887, + 12888, + 12889, + 12890, + 12891, + 12892, + 12893, + 12894, + 12895, + 12896, + 12897, + 12898, + 12899, + 12900, + 12901, + 12902, + 12903, + 12904, + 12905, + 12906, + 12907, + 12908, + 12909, + 12910, + 12911, + 12912, + 12913, + 12914, + 12915, + 12916, + 12917, + 12918, + 12919, + 12920, + 12921, + 12922, + 12923, + 12924, + 12925, + 12926, + 12927, + 12928, + 12929, + 12930, + 12931, + 12932, + 12933, + 12934, + 12935, + 12936, + 12937, + 12938, + 12939, + 12940, + 12941, + 12942, + 12943, + 12944, + 12945, + 12946, + 12947, + 12948, + 12949, + 12950, + 12951, + 12952, + 12953, + 12954, + 12955, + 12956, + 12957, + 12958, + 12959, + 12960, + 12961, + 12962, + 12963, + 12964, + 12965, + 12966, + 12967, + 12968, + 12969, + 12970, + 12971, + 12972, + 12973, + 12974, + 12975, + 12976, + 12977, + 12978, + 12979, + 12980, + 12981, + 12982, + 12983, + 12984, + 12985, + 12986, + 12987, + 12988, + 12989, + 12990, + 12991, + 12992, + 12993, + 12994, + 12995, + 12996, + 12997, + 12998, + 12999, + 13000, + 13001, + 13002, + 13003, + 13004, + 13005, + 13006, + 13007, + 13008, + 13009, + 13010, + 13011, + 13012, + 13013, + 13014, + 13015, + 13016, + 13017, + 13018, + 13019, + 13020, + 13021, + 13022, + 13023, + 13024, + 13025, + 13026, + 13027, + 13028, + 13029, + 13030, + 13031, + 13032, + 13033, + 13034, + 13035, + 13036, + 13037, + 13038, + 13039, + 13040, + 13041, + 13042, + 13043, + 13044, + 13045, + 13046, + 13047, + 13048, + 13049, + 13050, + 13051, + 13052, + 13053, + 13054, + 13055, + 13056, + 13057, + 13058, + 13059, + 13060, + 13061, + 13062, + 13063, + 13064, + 13065, + 13066, + 13067, + 13068, + 13069, + 13070, + 13071, + 13072, + 13073, + 13074, + 13075, + 13076, + 13077, + 13078, + 13079, + 13080, + 13081, + 13082, + 13083, + 13084, + 13085, + 13086, + 13087, + 13088, + 13089, + 13090, + 13091, + 13092, + 13093, + 13094, + 13095, + 13096, + 13097, + 13098, + 13099, + 13100, + 13101, + 13102, + 13103, + 13104, + 13105, + 13106, + 13107, + 13108, + 13109, + 13110, + 13111, + 13112, + 13113, + 13114, + 13115, + 13116, + 13117, + 13118, + 13119, + 13120, + 13121, + 13122, + 13123, + 13124, + 13125, + 13126, + 13127, + 13128, + 13129, + 13130, + 13131, + 13132, + 13133, + 13134, + 13135, + 13136, + 13137, + 13138, + 13139, + 13140, + 13141, + 13142, + 13143, + 13144, + 13145, + 13146, + 13147, + 13148, + 13149, + 13150, + 13151, + 13152, + 13153, + 13154, + 13155, + 13156, + 13157, + 13158, + 13159, + 13160, + 13161, + 13162, + 13163, + 13164, + 13165, + 13166, + 13167, + 13168, + 13169, + 13170, + 13171, + 13172, + 13173, + 13174, + 13175, + 13176, + 13177, + 13178, + 13179, + 13180, + 13181, + 13182, + 13183, + 13184, + 13185, + 13186, + 13187, + 13188, + 13189, + 13190, + 13191, + 13192, + 13193, + 13194, + 13195, + 13196, + 13197, + 13198, + 13199, + 13200, + 13201, + 13202, + 13203, + 13204, + 13205, + 13206, + 13207, + 13208, + 13209, + 13210, + 13211, + 13212, + 13213, + 13214, + 13215, + 13216, + 13217, + 13218, + 13219, + 13220, + 13221, + 13222, + 13223, + 13224, + 13225, + 13226, + 13227, + 13228, + 13229, + 13230, + 13231, + 13232, + 13233, + 13234, + 13235, + 13236, + 13237, + 13238, + 13239, + 13240, + 13241, + 13242, + 13243, + 13244, + 13245, + 13246, + 13247, + 13248, + 13249, + 13250, + 13251, + 13252, + 13253, + 13254, + 13255, + 13256, + 13257, + 13258, + 13259, + 13260, + 13261, + 13262, + 13263, + 13264, + 13265, + 13266, + 13267, + 13268, + 13269, + 13270, + 13271, + 13272, + 13273, + 13274, + 13275, + 13276, + 13277, + 13278, + 13279, + 13280, + 13281, + 13282, + 13283, + 13284, + 13285, + 13286, + 13287, + 13288, + 13289, + 13290, + 13291, + 13292, + 13293, + 13294, + 13295, + 13296, + 13297, + 13298, + 13299, + 13300, + 13301, + 13302, + 13303, + 13304, + 13305, + 13306, + 13307, + 13308, + 13309, + 13310, + 13311, + 13312, + 13313, + 13314, + 13315, + 13316, + 13317, + 13318, + 13319, + 13320, + 13321, + 13322, + 13323, + 13324, + 13325, + 13326, + 13327, + 13328, + 13329, + 13330, + 13331, + 13332, + 13333, + 13334, + 13335, + 13336, + 13337, + 13338, + 13339, + 13340, + 13341, + 13342, + 13343, + 13344, + 13345, + 13346, + 13347, + 13348, + 13349, + 13350, + 13351, + 13352, + 13353, + 13354, + 13355, + 13356, + 13357, + 13358, + 13359, + 13360, + 13361, + 13362, + 13363, + 13364, + 13365, + 13366, + 13367, + 13368, + 13369, + 13370, + 13371, + 13372, + 13373, + 13374, + 13375, + 13376, + 13377, + 13378, + 13379, + 13380, + 13381, + 13382, + 13383, + 13384, + 13385, + 13386, + 13387, + 13388, + 13389, + 13390, + 13391, + 13392, + 13393, + 13394, + 13395, + 13396, + 13397, + 13398, + 13399, + 13400, + 13401, + 13402, + 13403, + 13404, + 13405, + 13406, + 13407, + 13408, + 13409, + 13410, + 13411, + 13412, + 13413, + 13414, + 13415, + 13416, + 13417, + 13418, + 13419, + 13420, + 13421, + 13422, + 13423, + 13424, + 13425, + 13426, + 13427, + 13428, + 13429, + 13430, + 13431, + 13432, + 13433, + 13434, + 13435, + 13436, + 13437, + 13438, + 13439, + 13440, + 13441, + 13442, + 13443, + 13444, + 13445, + 13446, + 13447, + 13448, + 13449, + 13450, + 13451, + 13452, + 13453, + 13454, + 13455, + 13456, + 13457, + 13458, + 13459, + 13460, + 13461, + 13462, + 13463, + 13464, + 13465, + 13466, + 13467, + 13468, + 13469, + 13470, + 13471, + 13472, + 13473, + 13474, + 13475, + 13476, + 13477, + 13478, + 13479, + 13480, + 13481, + 13482, + 13483, + 13484, + 13485, + 13486, + 13487, + 13488, + 13489, + 13490, + 13491, + 13492, + 13493, + 13494, + 13495, + 13496, + 13497, + 13498, + 13499, + 13500, + 13501, + 13502, + 13503, + 13504, + 13505, + 13506, + 13507, + 13508, + 13509, + 13510, + 13511, + 13512, + 13513, + 13514, + 13515, + 13516, + 13517, + 13518, + 13519, + 13520, + 13521, + 13522, + 13523, + 13524, + 13525, + 13526, + 13527, + 13528, + 13529, + 13530, + 13531, + 13532, + 13533, + 13534, + 13535, + 13536, + 13537, + 13538, + 13539, + 13540, + 13541, + 13542, + 13543, + 13544, + 13545, + 13546, + 13547, + 13548, + 13549, + 13550, + 13551, + 13552, + 13553, + 13554, + 13555, + 13556, + 13557, + 13558, + 13559, + 13560, + 13561, + 13562, + 13563, + 13564, + 13565, + 13566, + 13567, + 13568, + 13569, + 13570, + 13571, + 13572, + 13573, + 13574, + 13575, + 13576, + 13577, + 13578, + 13579, + 13580, + 13581, + 13582, + 13583, + 13584, + 13585, + 13586, + 13587, + 13588, + 13589, + 13590, + 13591, + 13592, + 13593, + 13594, + 13595, + 13596, + 13597, + 13598, + 13599, + 13600, + 13601, + 13602, + 13603, + 13604, + 13605, + 13606, + 13607, + 13608, + 13609, + 13610, + 13611, + 13612, + 13613, + 13614, + 13615, + 13616, + 13617, + 13618, + 13619, + 13620, + 13621, + 13622, + 13623, + 13624, + 13625, + 13626, + 13627, + 13628, + 13629, + 13630, + 13631, + 13632, + 13633, + 13634, + 13635, + 13636, + 13637, + 13638, + 13639, + 13640, + 13641, + 13642, + 13643, + 13644, + 13645, + 13646, + 13647, + 13648, + 13649, + 13650, + 13651, + 13652, + 13653, + 13654, + 13655, + 13656, + 13657, + 13658, + 13659, + 13660, + 13661, + 13662, + 13663, + 13664, + 13665, + 13666, + 13667, + 13668, + 13669, + 13670, + 13671, + 13672, + 13673, + 13674, + 13675, + 13676, + 13677, + 13678, + 13679, + 13680, + 13681, + 13682, + 13683, + 13684, + 13685, + 13686, + 13687, + 13688, + 13689, + 13690, + 13691, + 13692, + 13693, + 13694, + 13695, + 13696, + 13697, + 13698, + 13699, + 13700, + 13701, + 13702, + 13703, + 13704, + 13705, + 13706, + 13707, + 13708, + 13709, + 13710, + 13711, + 13712, + 13713, + 13714, + 13715, + 13716, + 13717, + 13718, + 13719, + 13720, + 13721, + 13722, + 13723, + 13724, + 13725, + 13726, + 13727, + 13728, + 13729, + 13730, + 13731, + 13732, + 13733, + 13734, + 13735, + 13736, + 13737, + 13738, + 13739, + 13740, + 13741, + 13742, + 13743, + 13744, + 13745, + 13746, + 13747, + 13748, + 13749, + 13750, + 13751, + 13752, + 13753, + 13754, + 13755, + 13756, + 13757, + 13758, + 13759, + 13760, + 13761, + 13762, + 13763, + 13764, + 13765, + 13766, + 13767, + 13768, + 13769, + 13770, + 13771, + 13772, + 13773, + 13774, + 13775, + 13776, + 13777, + 13778, + 13779, + 13780, + 13781, + 13782, + 13783, + 13784, + 13785, + 13786, + 13787, + 13788, + 13789, + 13790, + 13791, + 13792, + 13793, + 13794, + 13795, + 13796, + 13797, + 13798, + 13799, + 13800, + 13801, + 13802, + 13803, + 13804, + 13805, + 13806, + 13807, + 13808, + 13809, + 13810, + 13811, + 13812, + 13813, + 13814, + 13815, + 13816, + 13817, + 13818, + 13819, + 13820, + 13821, + 13822, + 13823, + 13824, + 13825, + 13826, + 13827, + 13828, + 13829, + 13830, + 13831, + 13832, + 13833, + 13834, + 13835, + 13836, + 13837, + 13838, + 13839, + 13840, + 13841, + 13842, + 13843, + 13844, + 13845, + 13846, + 13847, + 13848, + 13849, + 13850, + 13851, + 13852, + 13853, + 13854, + 13855, + 13856, + 13857, + 13858, + 13859, + 13860, + 13861, + 13862, + 13863, + 13864, + 13865, + 13866, + 13867, + 13868, + 13869, + 13870, + 13871, + 13872, + 13873, + 13874, + 13875, + 13876, + 13877, + 13878, + 13879, + 13880, + 13881, + 13882, + 13883, + 13884, + 13885, + 13886, + 13887, + 13888, + 13889, + 13890, + 13891, + 13892, + 13893, + 13894, + 13895, + 13896, + 13897, + 13898, + 13899, + 13900, + 13901, + 13902, + 13903, + 13904, + 13905, + 13906, + 13907, + 13908, + 13909, + 13910, + 13911, + 13912, + 13913, + 13914, + 13915, + 13916, + 13917, + 13918, + 13919, + 13920, + 13921, + 13922, + 13923, + 13924, + 13925, + 13926, + 13927, + 13928, + 13929, + 13930, + 13931, + 13932, + 13933, + 13934, + 13935, + 13936, + 13937, + 13938, + 13939, + 13940, + 13941, + 13942, + 13943, + 13944, + 13945, + 13946, + 13947, + 13948, + 13949, + 13950, + 13951, + 13952, + 13953, + 13954, + 13955, + 13956, + 13957, + 13958, + 13959, + 13960, + 13961, + 13962, + 13963, + 13964, + 13965, + 13966, + 13967, + 13968, + 13969, + 13970, + 13971, + 13972, + 13973, + 13974, + 13975, + 13976, + 13977, + 13978, + 13979, + 13980, + 13981, + 13982, + 13983, + 13984, + 13985, + 13986, + 13987, + 13988, + 13989, + 13990, + 13991, + 13992, + 13993, + 13994, + 13995, + 13996, + 13997, + 13998, + 13999, + 14000, + 14001, + 14002, + 14003, + 14004, + 14005, + 14006, + 14007, + 14008, + 14009, + 14010, + 14011, + 14012, + 14013, + 14014, + 14015, + 14016, + 14017, + 14018, + 14019, + 14020, + 14021, + 14022, + 14023, + 14024, + 14025, + 14026, + 14027, + 14028, + 14029, + 14030, + 14031, + 14032, + 14033, + 14034, + 14035, + 14036, + 14037, + 14038, + 14039, + 14040, + 14041, + 14042, + 14043, + 14044, + 14045, + 14046, + 14047, + 14048, + 14049, + 14050, + 14051, + 14052, + 14053, + 14054, + 14055, + 14056, + 14057, + 14058, + 14059, + 14060, + 14061, + 14062, + 14063, + 14064, + 14065, + 14066, + 14067, + 14068, + 14069, + 14070, + 14071, + 14072, + 14073, + 14074, + 14075, + 14076, + 14077, + 14078, + 14079, + 14080, + 14081, + 14082, + 14083, + 14084, + 14085, + 14086, + 14087, + 14088, + 14089, + 14090, + 14091, + 14092, + 14093, + 14094, + 14095, + 14096, + 14097, + 14098, + 14099, + 14100, + 14101, + 14102, + 14103, + 14104, + 14105, + 14106, + 14107, + 14108, + 14109, + 14110, + 14111, + 14112, + 14113, + 14114, + 14115, + 14116, + 14117, + 14118, + 14119, + 14120, + 14121, + 14122, + 14123, + 14124, + 14125, + 14126, + 14127, + 14128, + 14129, + 14130, + 14131, + 14132, + 14133, + 14134, + 14135, + 14136, + 14137, + 14138, + 14139, + 14140, + 14141, + 14142, + 14143, + 14144, + 14145, + 14146, + 14147, + 14148, + 14149, + 14150, + 14151, + 14152, + 14153, + 14154, + 14155, + 14156, + 14157, + 14158, + 14159, + 14160, + 14161, + 14162, + 14163, + 14164, + 14165, + 14166, + 14167, + 14168, + 14169, + 14170, + 14171, + 14172, + 14173, + 14174, + 14175, + 14176, + 14177, + 14178, + 14179, + 14180, + 14181, + 14182, + 14183, + 14184, + 14185, + 14186, + 14187, + 14188, + 14189, + 14190, + 14191, + 14192, + 14193, + 14194, + 14195, + 14196, + 14197, + 14198, + 14199, + 14200, + 14201, + 14202, + 14203, + 14204, + 14205, + 14206, + 14207, + 14208, + 14209, + 14210, + 14211, + 14212, + 14213, + 14214, + 14215, + 14216, + 14217, + 14218, + 14219, + 14220, + 14221, + 14222, + 14223, + 14224, + 14225, + 14226, + 14227, + 14228, + 14229, + 14230, + 14231, + 14232, + 14233, + 14234, + 14235, + 14236, + 14237, + 14238, + 14239, + 14240, + 14241, + 14242, + 14243, + 14244, + 14245, + 14246, + 14247, + 14248, + 14249, + 14250, + 14251, + 14252, + 14253, + 14254, + 14255, + 14256, + 14257, + 14258, + 14259, + 14260, + 14261, + 14262, + 14263, + 14264, + 14265, + 14266, + 14267, + 14268, + 14269, + 14270, + 14271, + 14272, + 14273, + 14274, + 14275, + 14276, + 14277, + 14278, + 14279, + 14280, + 14281, + 14282, + 14283, + 14284, + 14285, + 14286, + 14287, + 14288, + 14289, + 14290, + 14291, + 14292, + 14293, + 14294, + 14295, + 14296, + 14297, + 14298, + 14299, + 14300, + 14301, + 14302, + 14303, + 14304, + 14305, + 14306, + 14307, + 14308, + 14309, + 14310, + 14311, + 14312, + 14313, + 14314, + 14315, + 14316, + 14317, + 14318, + 14319, + 14320, + 14321, + 14322, + 14323, + 14324, + 14325, + 14326, + 14327, + 14328, + 14329, + 14330, + 14331, + 14332, + 14333, + 14334, + 14335, + 14336, + 14337, + 14338, + 14339, + 14340, + 14341, + 14342, + 14343, + 14344, + 14345, + 14346, + 14347, + 14348, + 14349, + 14350, + 14351, + 14352, + 14353, + 14354, + 14355, + 14356, + 14357, + 14358, + 14359, + 14360, + 14361, + 14362, + 14363, + 14364, + 14365, + 14366, + 14367, + 14368, + 14369, + 14370, + 14371, + 14372, + 14373, + 14374, + 14375, + 14376, + 14377, + 14378, + 14379, + 14380, + 14381, + 14382, + 14383, + 14384, + 14385, + 14386, + 14387, + 14388, + 14389, + 14390, + 14391, + 14392, + 14393, + 14394, + 14395, + 14396, + 14397, + 14398, + 14399, + 14400, + 14401, + 14402, + 14403, + 14404, + 14405, + 14406, + 14407, + 14408, + 14409, + 14410, + 14411, + 14412, + 14413, + 14414, + 14415, + 14416, + 14417, + 14418, + 14419, + 14420, + 14421, + 14422, + 14423, + 14424, + 14425, + 14426, + 14427, + 14428, + 14429, + 14430, + 14431, + 14432, + 14433, + 14434, + 14435, + 14436, + 14437, + 14438, + 14439, + 14440, + 14441, + 14442, + 14443, + 14444, + 14445, + 14446, + 14447, + 14448, + 14449, + 14450, + 14451, + 14452, + 14453, + 14454, + 14455, + 14456, + 14457, + 14458, + 14459, + 14460, + 14461, + 14462, + 14463, + 14464, + 14465, + 14466, + 14467, + 14468, + 14469, + 14470, + 14471, + 14472, + 14473, + 14474, + 14475, + 14476, + 14477, + 14478, + 14479, + 14480, + 14481, + 14482, + 14483, + 14484, + 14485, + 14486, + 14487, + 14488, + 14489, + 14490, + 14491, + 14492, + 14493, + 14494, + 14495, + 14496, + 14497, + 14498, + 14499, + 14500, + 14501, + 14502, + 14503, + 14504, + 14505, + 14506, + 14507, + 14508, + 14509, + 14510, + 14511, + 14512, + 14513, + 14514, + 14515, + 14516, + 14517, + 14518, + 14519, + 14520, + 14521, + 14522, + 14523, + 14524, + 14525, + 14526, + 14527, + 14528, + 14529, + 14530, + 14531, + 14532, + 14533, + 14534, + 14535, + 14536, + 14537, + 14538, + 14539, + 14540, + 14541, + 14542, + 14543, + 14544, + 14545, + 14546, + 14547, + 14548, + 14549, + 14550, + 14551, + 14552, + 14553, + 14554, + 14555, + 14556, + 14557, + 14558, + 14559, + 14560, + 14561, + 14562, + 14563, + 14564, + 14565, + 14566, + 14567, + 14568, + 14569, + 14570, + 14571, + 14572, + 14573, + 14574, + 14575, + 14576, + 14577, + 14578, + 14579, + 14580, + 14581, + 14582, + 14583, + 14584, + 14585, + 14586, + 14587, + 14588, + 14589, + 14590, + 14591, + 14592, + 14593, + 14594, + 14595, + 14596, + 14597, + 14598, + 14599, + 14600, + 14601, + 14602, + 14603, + 14604, + 14605, + 14606, + 14607, + 14608, + 14609, + 14610, + 14611, + 14612, + 14613, + 14614, + 14615, + 14616, + 14617, + 14618, + 14619, + 14620, + 14621, + 14622, + 14623, + 14624, + 14625, + 14626, + 14627, + 14628, + 14629, + 14630, + 14631, + 14632, + 14633, + 14634, + 14635, + 14636, + 14637, + 14638, + 14639, + 14640, + 14641, + 14642, + 14643, + 14644, + 14645, + 14646, + 14647, + 14648, + 14649, + 14650, + 14651, + 14652, + 14653, + 14654, + 14655, + 14656, + 14657, + 14658, + 14659, + 14660, + 14661, + 14662, + 14663, + 14664, + 14665, + 14666, + 14667, + 14668, + 14669, + 14670, + 14671, + 14672, + 14673, + 14674, + 14675, + 14676, + 14677, + 14678, + 14679, + 14680, + 14681, + 14682, + 14683, + 14684, + 14685, + 14686, + 14687, + 14688, + 14689, + 14690, + 14691, + 14692, + 14693, + 14694, + 14695, + 14696, + 14697, + 14698, + 14699, + 14700, + 14701, + 14702, + 14703, + 14704, + 14705, + 14706, + 14707, + 14708, + 14709, + 14710, + 14711, + 14712, + 14713, + 14714, + 14715, + 14716, + 14717, + 14718, + 14719, + 14720, + 14721, + 14722, + 14723, + 14724, + 14725, + 14726, + 14727, + 14728, + 14729, + 14730, + 14731, + 14732, + 14733, + 14734, + 14735, + 14736, + 14737, + 14738, + 14739, + 14740, + 14741, + 14742, + 14743, + 14744, + 14745, + 14746, + 14747, + 14748, + 14749, + 14750, + 14751, + 14752, + 14753, + 14754, + 14755, + 14756, + 14757, + 14758, + 14759, + 14760, + 14761, + 14762, + 14763, + 14764, + 14765, + 14766, + 14767, + 14768, + 14769, + 14770, + 14771, + 14772, + 14773, + 14774, + 14775, + 14776, + 14777, + 14778, + 14779, + 14780, + 14781, + 14782, + 14783, + 14784, + 14785, + 14786, + 14787, + 14788, + 14789, + 14790, + 14791, + 14792, + 14793, + 14794, + 14795, + 14796, + 14797, + 14798, + 14799, + 14800, + 14801, + 14802, + 14803, + 14804, + 14805, + 14806, + 14807, + 14808, + 14809, + 14810, + 14811, + 14812, + 14813, + 14814, + 14815, + 14816, + 14817, + 14818, + 14819, + 14820, + 14821, + 14822, + 14823, + 14824, + 14825, + 14826, + 14827, + 14828, + 14829, + 14830, + 14831, + 14832, + 14833, + 14834, + 14835, + 14836, + 14837, + 14838, + 14839, + 14840, + 14841, + 14842, + 14843, + 14844, + 14845, + 14846, + 14847, + 14848, + 14849, + 14850, + 14851, + 14852, + 14853, + 14854, + 14855, + 14856, + 14857, + 14858, + 14859, + 14860, + 14861, + 14862, + 14863, + 14864, + 14865, + 14866, + 14867, + 14868, + 14869, + 14870, + 14871, + 14872, + 14873, + 14874, + 14875, + 14876, + 14877, + 14878, + 14879, + 14880, + 14881, + 14882, + 14883, + 14884, + 14885, + 14886, + 14887, + 14888, + 14889, + 14890, + 14891, + 14892, + 14893, + 14894, + 14895, + 14896, + 14897, + 14898, + 14899, + 14900, + 14901, + 14902, + 14903, + 14904, + 14905, + 14906, + 14907, + 14908, + 14909, + 14910, + 14911, + 14912, + 14913, + 14914, + 14915, + 14916, + 14917, + 14918, + 14919, + 14920, + 14921, + 14922, + 14923, + 14924, + 14925, + 14926, + 14927, + 14928, + 14929, + 14930, + 14931, + 14932, + 14933, + 14934, + 14935, + 14936, + 14937, + 14938, + 14939, + 14940, + 14941, + 14942, + 14943, + 14944, + 14945, + 14946, + 14947, + 14948, + 14949, + 14950, + 14951, + 14952, + 14953, + 14954, + 14955, + 14956, + 14957, + 14958, + 14959, + 14960, + 14961, + 14962, + 14963, + 14964, + 14965, + 14966, + 14967, + 14968, + 14969, + 14970, + 14971, + 14972, + 14973, + 14974, + 14975, + 14976, + 14977, + 14978, + 14979, + 14980, + 14981, + 14982, + 14983, + 14984, + 14985, + 14986, + 14987, + 14988, + 14989, + 14990, + 14991, + 14992, + 14993, + 14994, + 14995, + 14996, + 14997, + 14998, + 14999, + 15000, + 15001, + 15002, + 15003, + 15004, + 15005, + 15006, + 15007, + 15008, + 15009, + 15010, + 15011, + 15012, + 15013, + 15014, + 15015, + 15016, + 15017, + 15018, + 15019, + 15020, + 15021, + 15022, + 15023, + 15024, + 15025, + 15026, + 15027, + 15028, + 15029, + 15030, + 15031, + 15032, + 15033, + 15034, + 15035, + 15036, + 15037, + 15038, + 15039, + 15040, + 15041, + 15042, + 15043, + 15044, + 15045, + 15046, + 15047, + 15048, + 15049, + 15050, + 15051, + 15052, + 15053, + 15054, + 15055, + 15056, + 15057, + 15058, + 15059, + 15060, + 15061, + 15062, + 15063, + 15064, + 15065, + 15066, + 15067, + 15068, + 15069, + 15070, + 15071, + 15072, + 15073, + 15074, + 15075, + 15076, + 15077, + 15078, + 15079, + 15080, + 15081, + 15082, + 15083, + 15084, + 15085, + 15086, + 15087, + 15088, + 15089, + 15090, + 15091, + 15092, + 15093, + 15094, + 15095, + 15096, + 15097, + 15098, + 15099, + 15100, + 15101, + 15102, + 15103, + 15104, + 15105, + 15106, + 15107, + 15108, + 15109, + 15110, + 15111, + 15112, + 15113, + 15114, + 15115, + 15116, + 15117, + 15118, + 15119, + 15120, + 15121, + 15122, + 15123, + 15124, + 15125, + 15126, + 15127, + 15128, + 15129, + 15130, + 15131, + 15132, + 15133, + 15134, + 15135, + 15136, + 15137, + 15138, + 15139, + 15140, + 15141, + 15142, + 15143, + 15144, + 15145, + 15146, + 15147, + 15148, + 15149, + 15150, + 15151, + 15152, + 15153, + 15154, + 15155, + 15156, + 15157, + 15158, + 15159, + 15160, + 15161, + 15162, + 15163, + 15164, + 15165, + 15166, + 15167, + 15168, + 15169, + 15170, + 15171, + 15172, + 15173, + 15174, + 15175, + 15176, + 15177, + 15178, + 15179, + 15180, + 15181, + 15182, + 15183, + 15184, + 15185, + 15186, + 15187, + 15188, + 15189, + 15190, + 15191, + 15192, + 15193, + 15194, + 15195, + 15196, + 15197, + 15198, + 15199, + 15200, + 15201, + 15202, + 15203, + 15204, + 15205, + 15206, + 15207, + 15208, + 15209, + 15210, + 15211, + 15212, + 15213, + 15214, + 15215, + 15216, + 15217, + 15218, + 15219, + 15220, + 15221, + 15222, + 15223, + 15224, + 15225, + 15226, + 15227, + 15228, + 15229, + 15230, + 15231, + 15232, + 15233, + 15234, + 15235, + 15236, + 15237, + 15238, + 15239, + 15240, + 15241, + 15242, + 15243, + 15244, + 15245, + 15246, + 15247, + 15248, + 15249, + 15250, + 15251, + 15252, + 15253, + 15254, + 15255, + 15256, + 15257, + 15258, + 15259, + 15260, + 15261, + 15262, + 15263, + 15264, + 15265, + 15266, + 15267, + 15268, + 15269, + 15270, + 15271, + 15272, + 15273, + 15274, + 15275, + 15276, + 15277, + 15278, + 15279, + 15280, + 15281, + 15282, + 15283, + 15284, + 15285, + 15286, + 15287, + 15288, + 15289, + 15290, + 15291, + 15292, + 15293, + 15294, + 15295, + 15296, + 15297, + 15298, + 15299, + 15300, + 15301, + 15302, + 15303, + 15304, + 15305, + 15306, + 15307, + 15308, + 15309, + 15310, + 15311, + 15312, + 15313, + 15314, + 15315, + 15316, + 15317, + 15318, + 15319, + 15320, + 15321, + 15322, + 15323, + 15324, + 15325, + 15326, + 15327, + 15328, + 15329, + 15330, + 15331, + 15332, + 15333, + 15334, + 15335, + 15336, + 15337, + 15338, + 15339, + 15340, + 15341, + 15342, + 15343, + 15344, + 15345, + 15346, + 15347, + 15348, + 15349, + 15350, + 15351, + 15352, + 15353, + 15354, + 15355, + 15356, + 15357, + 15358, + 15359, + 15360, + 15361, + 15362, + 15363, + 15364, + 15365, + 15366, + 15367, + 15368, + 15369, + 15370, + 15371, + 15372, + 15373, + 15374, + 15375, + 15376, + 15377, + 15378, + 15379, + 15380, + 15381, + 15382, + 15383, + 15384, + 15385, + 15386, + 15387, + 15388, + 15389, + 15390, + 15391, + 15392, + 15393, + 15394, + 15395, + 15396, + 15397, + 15398, + 15399, + 15400, + 15401, + 15402, + 15403, + 15404, + 15405, + 15406, + 15407, + 15408, + 15409, + 15410, + 15411, + 15412, + 15413, + 15414, + 15415, + 15416, + 15417, + 15418, + 15419, + 15420, + 15421, + 15422, + 15423, + 15424, + 15425, + 15426, + 15427, + 15428, + 15429, + 15430, + 15431, + 15432, + 15433, + 15434, + 15435, + 15436, + 15437, + 15438, + 15439, + 15440, + 15441, + 15442, + 15443, + 15444, + 15445, + 15446, + 15447, + 15448, + 15449, + 15450, + 15451, + 15452, + 15453, + 15454, + 15455, + 15456, + 15457, + 15458, + 15459, + 15460, + 15461, + 15462, + 15463, + 15464, + 15465, + 15466, + 15467, + 15468, + 15469, + 15470, + 15471, + 15472, + 15473, + 15474, + 15475, + 15476, + 15477, + 15478, + 15479, + 15480, + 15481, + 15482, + 15483, + 15484, + 15485, + 15486, + 15487, + 15488, + 15489, + 15490, + 15491, + 15492, + 15493, + 15494, + 15495, + 15496, + 15497, + 15498, + 15499, + 15500, + 15501, + 15502, + 15503, + 15504, + 15505, + 15506, + 15507, + 15508, + 15509, + 15510, + 15511, + 15512, + 15513, + 15514, + 15515, + 15516, + 15517, + 15518, + 15519, + 15520, + 15521, + 15522, + 15523, + 15524, + 15525, + 15526, + 15527, + 15528, + 15529, + 15530, + 15531, + 15532, + 15533, + 15534, + 15535, + 15536, + 15537, + 15538, + 15539, + 15540, + 15541, + 15542, + 15543, + 15544, + 15545, + 15546, + 15547, + 15548, + 15549, + 15550, + 15551, + 15552, + 15553, + 15554, + 15555, + 15556, + 15557, + 15558, + 15559, + 15560, + 15561, + 15562, + 15563, + 15564, + 15565, + 15566, + 15567, + 15568, + 15569, + 15570, + 15571, + 15572, + 15573, + 15574, + 15575, + 15576, + 15577, + 15578, + 15579, + 15580, + 15581, + 15582, + 15583, + 15584, + 15585, + 15586, + 15587, + 15588, + 15589, + 15590, + 15591, + 15592, + 15593, + 15594, + 15595, + 15596, + 15597, + 15598, + 15599, + 15600, + 15601, + 15602, + 15603, + 15604, + 15605, + 15606, + 15607, + 15608, + 15609, + 15610, + 15611, + 15612, + 15613, + 15614, + 15615, + 15616, + 15617, + 15618, + 15619, + 15620, + 15621, + 15622, + 15623, + 15624, + 15625, + 15626, + 15627, + 15628, + 15629, + 15630, + 15631, + 15632, + 15633, + 15634, + 15635, + 15636, + 15637, + 15638, + 15639, + 15640, + 15641, + 15642, + 15643, + 15644, + 15645, + 15646, + 15647, + 15648, + 15649, + 15650, + 15651, + 15652, + 15653, + 15654, + 15655, + 15656, + 15657, + 15658, + 15659, + 15660, + 15661, + 15662, + 15663, + 15664, + 15665, + 15666, + 15667, + 15668, + 15669, + 15670, + 15671, + 15672, + 15673, + 15674, + 15675, + 15676, + 15677, + 15678, + 15679, + 15680, + 15681, + 15682, + 15683, + 15684, + 15685, + 15686, + 15687, + 15688, + 15689, + 15690, + 15691, + 15692, + 15693, + 15694, + 15695, + 15696, + 15697, + 15698, + 15699, + 15700, + 15701, + 15702, + 15703, + 15704, + 15705, + 15706, + 15707, + 15708, + 15709, + 15710, + 15711, + 15712, + 15713, + 15714, + 15715, + 15716, + 15717, + 15718, + 15719, + 15720, + 15721, + 15722, + 15723, + 15724, + 15725, + 15726, + 15727, + 15728, + 15729, + 15730, + 15731, + 15732, + 15733, + 15734, + 15735, + 15736, + 15737, + 15738, + 15739, + 15740, + 15741, + 15742, + 15743, + 15744, + 15745, + 15746, + 15747, + 15748, + 15749, + 15750, + 15751, + 15752, + 15753, + 15754, + 15755, + 15756, + 15757, + 15758, + 15759, + 15760, + 15761, + 15762, + 15763, + 15764, + 15765, + 15766, + 15767, + 15768, + 15769, + 15770, + 15771, + 15772, + 15773, + 15774, + 15775, + 15776, + 15777, + 15778, + 15779, + 15780, + 15781, + 15782, + 15783, + 15784, + 15785, + 15786, + 15787, + 15788, + 15789, + 15790, + 15791, + 15792, + 15793, + 15794, + 15795, + 15796, + 15797, + 15798, + 15799, + 15800, + 15801, + 15802, + 15803, + 15804, + 15805, + 15806, + 15807, + 15808, + 15809, + 15810, + 15811, + 15812, + 15813, + 15814, + 15815, + 15816, + 15817, + 15818, + 15819, + 15820, + 15821, + 15822, + 15823, + 15824, + 15825, + 15826, + 15827, + 15828, + 15829, + 15830, + 15831, + 15832, + 15833, + 15834, + 15835, + 15836, + 15837, + 15838, + 15839, + 15840, + 15841, + 15842, + 15843, + 15844, + 15845, + 15846, + 15847, + 15848, + 15849, + 15850, + 15851, + 15852, + 15853, + 15854, + 15855, + 15856, + 15857, + 15858, + 15859, + 15860, + 15861, + 15862, + 15863, + 15864, + 15865, + 15866, + 15867, + 15868, + 15869, + 15870, + 15871, + 15872, + 15873, + 15874, + 15875, + 15876, + 15877, + 15878, + 15879, + 15880, + 15881, + 15882, + 15883, + 15884, + 15885, + 15886, + 15887, + 15888, + 15889, + 15890, + 15891, + 15892, + 15893, + 15894, + 15895, + 15896, + 15897, + 15898, + 15899, + 15900, + 15901, + 15902, + 15903, + 15904, + 15905, + 15906, + 15907, + 15908, + 15909, + 15910, + 15911, + 15912, + 15913, + 15914, + 15915, + 15916, + 15917, + 15918, + 15919, + 15920, + 15921, + 15922, + 15923, + 15924, + 15925, + 15926, + 15927, + 15928, + 15929, + 15930, + 15931, + 15932, + 15933, + 15934, + 15935, + 15936, + 15937, + 15938, + 15939, + 15940, + 15941, + 15942, + 15943, + 15944, + 15945, + 15946, + 15947, + 15948, + 15949, + 15950, + 15951, + 15952, + 15953, + 15954, + 15955, + 15956, + 15957, + 15958, + 15959, + 15960, + 15961, + 15962, + 15963, + 15964, + 15965, + 15966, + 15967, + 15968, + 15969, + 15970, + 15971, + 15972, + 15973, + 15974, + 15975, + 15976, + 15977, + 15978, + 15979, + 15980, + 15981, + 15982, + 15983, + 15984, + 15985, + 15986, + 15987, + 15988, + 15989, + 15990, + 15991, + 15992, + 15993, + 15994, + 15995, + 15996, + 15997, + 15998, + 15999, + 16000, + 16001, + 16002, + 16003, + 16004, + 16005, + 16006, + 16007, + 16008, + 16009, + 16010, + 16011, + 16012, + 16013, + 16014, + 16015, + 16016, + 16017, + 16018, + 16019, + 16020, + 16021, + 16022, + 16023, + 16024, + 16025, + 16026, + 16027, + 16028, + 16029, + 16030, + 16031, + 16032, + 16033, + 16034, + 16035, + 16036, + 16037, + 16038, + 16039, + 16040, + 16041, + 16042, + 16043, + 16044, + 16045, + 16046, + 16047, + 16048, + 16049, + 16050, + 16051, + 16052, + 16053, + 16054, + 16055, + 16056, + 16057, + 16058, + 16059, + 16060, + 16061, + 16062, + 16063, + 16064, + 16065, + 16066, + 16067, + 16068, + 16069, + 16070, + 16071, + 16072, + 16073, + 16074, + 16075, + 16076, + 16077, + 16078, + 16079, + 16080, + 16081, + 16082, + 16083, + 16084, + 16085, + 16086, + 16087, + 16088, + 16089, + 16090, + 16091, + 16092, + 16093, + 16094, + 16095, + 16096, + 16097, + 16098, + 16099, + 16100, + 16101, + 16102, + 16103, + 16104, + 16105, + 16106, + 16107, + 16108, + 16109, + 16110, + 16111, + 16112, + 16113, + 16114, + 16115, + 16116, + 16117, + 16118, + 16119, + 16120, + 16121, + 16122, + 16123, + 16124, + 16125, + 16126, + 16127, + 16128, + 16129, + 16130, + 16131, + 16132, + 16133, + 16134, + 16135, + 16136, + 16137, + 16138, + 16139, + 16140, + 16141, + 16142, + 16143, + 16144, + 16145, + 16146, + 16147, + 16148, + 16149, + 16150, + 16151, + 16152, + 16153, + 16154, + 16155, + 16156, + 16157, + 16158, + 16159, + 16160, + 16161, + 16162, + 16163, + 16164, + 16165, + 16166, + 16167, + 16168, + 16169, + 16170, + 16171, + 16172, + 16173, + 16174, + 16175, + 16176, + 16177, + 16178, + 16179, + 16180, + 16181, + 16182, + 16183, + 16184, + 16185, + 16186, + 16187, + 16188, + 16189, + 16190, + 16191, + 16192, + 16193, + 16194, + 16195, + 16196, + 16197, + 16198, + 16199, + 16200, + 16201, + 16202, + 16203, + 16204, + 16205, + 16206, + 16207, + 16208, + 16209, + 16210, + 16211, + 16212, + 16213, + 16214, + 16215, + 16216, + 16217, + 16218, + 16219, + 16220, + 16221, + 16222, + 16223, + 16224, + 16225, + 16226, + 16227, + 16228, + 16229, + 16230, + 16231, + 16232, + 16233, + 16234, + 16235, + 16236, + 16237, + 16238, + 16239, + 16240, + 16241, + 16242, + 16243, + 16244, + 16245, + 16246, + 16247, + 16248, + 16249, + 16250, + 16251, + 16252, + 16253, + 16254, + 16255, + 16256, + 16257, + 16258, + 16259, + 16260, + 16261, + 16262, + 16263, + 16264, + 16265, + 16266, + 16267, + 16268, + 16269, + 16270, + 16271, + 16272, + 16273, + 16274, + 16275, + 16276, + 16277, + 16278, + 16279, + 16280, + 16281, + 16282, + 16283, + 16284, + 16285, + 16286, + 16287, + 16288, + 16289, + 16290, + 16291, + 16292, + 16293, + 16294, + 16295, + 16296, + 16297, + 16298, + 16299, + 16300, + 16301, + 16302, + 16303, + 16304, + 16305, + 16306, + 16307, + 16308, + 16309, + 16310, + 16311, + 16312, + 16313, + 16314, + 16315, + 16316, + 16317, + 16318, + 16319, + 16320, + 16321, + 16322, + 16323, + 16324, + 16325, + 16326, + 16327, + 16328, + 16329, + 16330, + 16331, + 16332, + 16333, + 16334, + 16335, + 16336, + 16337, + 16338, + 16339, + 16340, + 16341, + 16342, + 16343, + 16344, + 16345, + 16346, + 16347, + 16348, + 16349, + 16350, + 16351, + 16352, + 16353, + 16354, + 16355, + 16356, + 16357, + 16358, + 16359, + 16360, + 16361, + 16362, + 16363, + 16364, + 16365, + 16366, + 16367, + 16368, + 16369, + 16370, + 16371, + 16372, + 16373, + 16374, + 16375, + 16376, + 16377, + 16378, + 16379, + 16380, + 16381, + 16382, + 16383, + 16384, + 16385, + 16386, + 16387, + 16388, + 16389, + 16390, + 16391, + 16392, + 16393, + 16394, + 16395, + 16396, + 16397, + 16398, + 16399, + 16400, + 16401, + 16402, + 16403, + 16404, + 16405, + 16406, + 16407, + 16408, + 16409, + 16410, + 16411, + 16412, + 16413, + 16414, + 16415, + 16416, + 16417, + 16418, + 16419, + 16420, + 16421, + 16422, + 16423, + 16424, + 16425, + 16426, + 16427, + 16428, + 16429, + 16430, + 16431, + 16432, + 16433, + 16434, + 16435, + 16436, + 16437, + 16438, + 16439, + 16440, + 16441, + 16442, + 16443, + 16444, + 16445, + 16446, + 16447, + 16448, + 16449, + 16450, + 16451, + 16452, + 16453, + 16454, + 16455, + 16456, + 16457, + 16458, + 16459, + 16460, + 16461, + 16462, + 16463, + 16464, + 16465, + 16466, + 16467, + 16468, + 16469, + 16470, + 16471, + 16472, + 16473, + 16474, + 16475, + 16476, + 16477, + 16478, + 16479, + 16480, + 16481, + 16482, + 16483, + 16484, + 16485, + 16486, + 16487, + 16488, + 16489, + 16490, + 16491, + 16492, + 16493, + 16494, + 16495, + 16496, + 16497, + 16498, + 16499, + 16500, + 16501, + 16502, + 16503, + 16504, + 16505, + 16506, + 16507, + 16508, + 16509, + 16510, + 16511, + 16512, + 16513, + 16514, + 16515, + 16516, + 16517, + 16518, + 16519, + 16520, + 16521, + 16522, + 16523, + 16524, + 16525, + 16526, + 16527, + 16528, + 16529, + 16530, + 16531, + 16532, + 16533, + 16534, + 16535, + 16536, + 16537, + 16538, + 16539, + 16540, + 16541, + 16542, + 16543, + 16544, + 16545, + 16546, + 16547, + 16548, + 16549, + 16550, + 16551, + 16552, + 16553, + 16554, + 16555, + 16556, + 16557, + 16558, + 16559, + 16560, + 16561, + 16562, + 16563, + 16564, + 16565, + 16566, + 16567, + 16568, + 16569, + 16570, + 16571, + 16572, + 16573, + 16574, + 16575, + 16576, + 16577, + 16578, + 16579, + 16580, + 16581, + 16582, + 16583, + 16584, + 16585, + 16586, + 16587, + 16588, + 16589, + 16590, + 16591, + 16592, + 16593, + 16594, + 16595, + 16596, + 16597, + 16598, + 16599, + 16600, + 16601, + 16602, + 16603, + 16604, + 16605, + 16606, + 16607, + 16608, + 16609, + 16610, + 16611, + 16612, + 16613, + 16614, + 16615, + 16616, + 16617, + 16618, + 16619, + 16620, + 16621, + 16622, + 16623, + 16624, + 16625, + 16626, + 16627, + 16628, + 16629, + 16630, + 16631, + 16632, + 16633, + 16634, + 16635, + 16636, + 16637, + 16638, + 16639, + 16640, + 16641, + 16642, + 16643, + 16644, + 16645, + 16646, + 16647, + 16648, + 16649, + 16650, + 16651, + 16652, + 16653, + 16654, + 16655, + 16656, + 16657, + 16658, + 16659, + 16660, + 16661, + 16662, + 16663, + 16664, + 16665, + 16666, + 16667, + 16668, + 16669, + 16670, + 16671, + 16672, + 16673, + 16674, + 16675, + 16676, + 16677, + 16678, + 16679, + 16680, + 16681, + 16682, + 16683, + 16684, + 16685, + 16686, + 16687, + 16688, + 16689, + 16690, + 16691, + 16692, + 16693, + 16694, + 16695, + 16696, + 16697, + 16698, + 16699, + 16700, + 16701, + 16702, + 16703, + 16704, + 16705, + 16706, + 16707, + 16708, + 16709, + 16710, + 16711, + 16712, + 16713, + 16714, + 16715, + 16716, + 16717, + 16718, + 16719, + 16720, + 16721, + 16722, + 16723, + 16724, + 16725, + 16726, + 16727, + 16728, + 16729, + 16730, + 16731, + 16732, + 16733, + 16734, + 16735, + 16736, + 16737, + 16738, + 16739, + 16740, + 16741, + 16742, + 16743, + 16744, + 16745, + 16746, + 16747, + 16748, + 16749, + 16750, + 16751, + 16752, + 16753, + 16754, + 16755, + 16756, + 16757, + 16758, + 16759, + 16760, + 16761, + 16762, + 16763, + 16764, + 16765, + 16766, + 16767, + 16768, + 16769, + 16770, + 16771, + 16772, + 16773, + 16774, + 16775, + 16776, + 16777, + 16778, + 16779, + 16780, + 16781, + 16782, + 16783, + 16784, + 16785, + 16786, + 16787, + 16788, + 16789, + 16790, + 16791, + 16792, + 16793, + 16794, + 16795, + 16796, + 16797, + 16798, + 16799, + 16800, + 16801, + 16802, + 16803, + 16804, + 16805, + 16806, + 16807, + 16808, + 16809, + 16810, + 16811, + 16812, + 16813, + 16814, + 16815, + 16816, + 16817, + 16818, + 16819, + 16820, + 16821, + 16822, + 16823, + 16824, + 16825, + 16826, + 16827, + 16828, + 16829, + 16830, + 16831, + 16832, + 16833, + 16834, + 16835, + 16836, + 16837, + 16838, + 16839, + 16840, + 16841, + 16842, + 16843, + 16844, + 16845, + 16846, + 16847, + 16848, + 16849, + 16850, + 16851, + 16852, + 16853, + 16854, + 16855, + 16856, + 16857, + 16858, + 16859, + 16860, + 16861, + 16862, + 16863, + 16864, + 16865, + 16866, + 16867, + 16868, + 16869, + 16870, + 16871, + 16872, + 16873, + 16874, + 16875, + 16876, + 16877, + 16878, + 16879, + 16880, + 16881, + 16882, + 16883, + 16884, + 16885, + 16886, + 16887, + 16888, + 16889, + 16890, + 16891, + 16892, + 16893, + 16894, + 16895, + 16896, + 16897, + 16898, + 16899, + 16900, + 16901, + 16902, + 16903, + 16904, + 16905, + 16906, + 16907, + 16908, + 16909, + 16910, + 16911, + 16912, + 16913, + 16914, + 16915, + 16916, + 16917, + 16918, + 16919, + 16920, + 16921, + 16922, + 16923, + 16924, + 16925, + 16926, + 16927, + 16928, + 16929, + 16930, + 16931, + 16932, + 16933, + 16934, + 16935, + 16936, + 16937, + 16938, + 16939, + 16940, + 16941, + 16942, + 16943, + 16944, + 16945, + 16946, + 16947, + 16948, + 16949, + 16950, + 16951, + 16952, + 16953, + 16954, + 16955, + 16956, + 16957, + 16958, + 16959, + 16960, + 16961, + 16962, + 16963, + 16964, + 16965, + 16966, + 16967, + 16968, + 16969, + 16970, + 16971, + 16972, + 16973, + 16974, + 16975, + 16976, + 16977, + 16978, + 16979, + 16980, + 16981, + 16982, + 16983, + 16984, + 16985, + 16986, + 16987, + 16988, + 16989, + 16990, + 16991, + 16992, + 16993, + 16994, + 16995, + 16996, + 16997, + 16998, + 16999, + 17000, + 17001, + 17002, + 17003, + 17004, + 17005, + 17006, + 17007, + 17008, + 17009, + 17010, + 17011, + 17012, + 17013, + 17014, + 17015, + 17016, + 17017, + 17018, + 17019, + 17020, + 17021, + 17022, + 17023, + 17024, + 17025, + 17026, + 17027, + 17028, + 17029, + 17030, + 17031, + 17032, + 17033, + 17034, + 17035, + 17036, + 17037, + 17038, + 17039, + 17040, + 17041, + 17042, + 17043, + 17044, + 17045, + 17046, + 17047, + 17048, + 17049, + 17050, + 17051, + 17052, + 17053, + 17054, + 17055, + 17056, + 17057, + 17058, + 17059, + 17060, + 17061, + 17062, + 17063, + 17064, + 17065, + 17066, + 17067, + 17068, + 17069, + 17070, + 17071, + 17072, + 17073, + 17074, + 17075, + 17076, + 17077, + 17078, + 17079, + 17080, + 17081, + 17082, + 17083, + 17084, + 17085, + 17086, + 17087, + 17088, + 17089, + 17090, + 17091, + 17092, + 17093, + 17094, + 17095, + 17096, + 17097, + 17098, + 17099, + 17100, + 17101, + 17102, + 17103, + 17104, + 17105, + 17106, + 17107, + 17108, + 17109, + 17110, + 17111, + 17112, + 17113, + 17114, + 17115, + 17116, + 17117, + 17118, + 17119, + 17120, + 17121, + 17122, + 17123, + 17124, + 17125, + 17126, + 17127, + 17128, + 17129, + 17130, + 17131, + 17132, + 17133, + 17134, + 17135, + 17136, + 17137, + 17138, + 17139, + 17140, + 17141, + 17142, + 17143, + 17144, + 17145, + 17146, + 17147, + 17148, + 17149, + 17150, + 17151, + 17152, + 17153, + 17154, + 17155, + 17156, + 17157, + 17158, + 17159, + 17160, + 17161, + 17162, + 17163, + 17164, + 17165, + 17166, + 17167, + 17168, + 17169, + 17170, + 17171, + 17172, + 17173, + 17174, + 17175, + 17176, + 17177, + 17178, + 17179, + 17180, + 17181, + 17182, + 17183, + 17184, + 17185, + 17186, + 17187, + 17188, + 17189, + 17190, + 17191, + 17192, + 17193, + 17194, + 17195, + 17196, + 17197, + 17198, + 17199, + 17200, + 17201, + 17202, + 17203, + 17204, + 17205, + 17206, + 17207, + 17208, + 17209, + 17210, + 17211, + 17212, + 17213, + 17214, + 17215, + 17216, + 17217, + 17218, + 17219, + 17220, + 17221, + 17222, + 17223, + 17224, + 17225, + 17226, + 17227, + 17228, + 17229, + 17230, + 17231, + 17232, + 17233, + 17234, + 17235, + 17236, + 17237, + 17238, + 17239, + 17240, + 17241, + 17242, + 17243, + 17244, + 17245, + 17246, + 17247, + 17248, + 17249, + 17250, + 17251, + 17252, + 17253, + 17254, + 17255, + 17256, + 17257, + 17258, + 17259, + 17260, + 17261, + 17262, + 17263, + 17264, + 17265, + 17266, + 17267, + 17268, + 17269, + 17270, + 17271, + 17272, + 17273, + 17274, + 17275, + 17276, + 17277, + 17278, + 17279, + 17280, + 17281, + 17282, + 17283, + 17284, + 17285, + 17286, + 17287, + 17288, + 17289, + 17290, + 17291, + 17292, + 17293, + 17294, + 17295, + 17296, + 17297, + 17298, + 17299, + 17300, + 17301, + 17302, + 17303, + 17304, + 17305, + 17306, + 17307, + 17308, + 17309, + 17310, + 17311, + 17312, + 17313, + 17314, + 17315, + 17316, + 17317, + 17318, + 17319, + 17320, + 17321, + 17322, + 17323, + 17324, + 17325, + 17326, + 17327, + 17328, + 17329, + 17330, + 17331, + 17332, + 17333, + 17334, + 17335, + 17336, + 17337, + 17338, + 17339, + 17340, + 17341, + 17342, + 17343, + 17344, + 17345, + 17346, + 17347, + 17348, + 17349, + 17350, + 17351, + 17352, + 17353, + 17354, + 17355, + 17356, + 17357, + 17358, + 17359, + 17360, + 17361, + 17362, + 17363, + 17364, + 17365, + 17366, + 17367, + 17368, + 17369, + 17370, + 17371, + 17372, + 17373, + 17374, + 17375, + 17376, + 17377, + 17378, + 17379, + 17380, + 17381, + 17382, + 17383, + 17384, + 17385, + 17386, + 17387, + 17388, + 17389, + 17390, + 17391, + 17392, + 17393, + 17394, + 17395, + 17396, + 17397, + 17398, + 17399, + 17400, + 17401, + 17402, + 17403, + 17404, + 17405, + 17406, + 17407, + 17408, + 17409, + 17410, + 17411, + 17412, + 17413, + 17414, + 17415, + 17416, + 17417, + 17418, + 17419, + 17420, + 17421, + 17422, + 17423, + 17424, + 17425, + 17426, + 17427, + 17428, + 17429, + 17430, + 17431, + 17432, + 17433, + 17434, + 17435, + 17436, + 17437, + 17438, + 17439, + 17440, + 17441, + 17442, + 17443, + 17444, + 17445, + 17446, + 17447, + 17448, + 17449, + 17450, + 17451, + 17452, + 17453, + 17454, + 17455, + 17456, + 17457, + 17458, + 17459, + 17460, + 17461, + 17462, + 17463, + 17464, + 17465, + 17466, + 17467, + 17468, + 17469, + 17470, + 17471, + 17472, + 17473, + 17474, + 17475, + 17476, + 17477, + 17478, + 17479, + 17480, + 17481, + 17482, + 17483, + 17484, + 17485, + 17486, + 17487, + 17488, + 17489, + 17490, + 17491, + 17492, + 17493, + 17494, + 17495, + 17496, + 17497, + 17498, + 17499, + 17500, + 17501, + 17502, + 17503, + 17504, + 17505, + 17506, + 17507, + 17508, + 17509, + 17510, + 17511, + 17512, + 17513, + 17514, + 17515, + 17516, + 17517, + 17518, + 17519, + 17520, + 17521, + 17522, + 17523, + 17524, + 17525, + 17526, + 17527, + 17528, + 17529, + 17530, + 17531, + 17532, + 17533, + 17534, + 17535, + 17536, + 17537, + 17538, + 17539, + 17540, + 17541, + 17542, + 17543, + 17544, + 17545, + 17546, + 17547, + 17548, + 17549, + 17550, + 17551, + 17552, + 17553, + 17554, + 17555, + 17556, + 17557, + 17558, + 17559, + 17560, + 17561, + 17562, + 17563, + 17564, + 17565, + 17566, + 17567, + 17568, + 17569, + 17570, + 17571, + 17572, + 17573, + 17574, + 17575, + 17576, + 17577, + 17578, + 17579, + 17580, + 17581, + 17582, + 17583, + 17584, + 17585, + 17586, + 17587, + 17588, + 17589, + 17590, + 17591, + 17592, + 17593, + 17594, + 17595, + 17596, + 17597, + 17598, + 17599, + 17600, + 17601, + 17602, + 17603, + 17604, + 17605, + 17606, + 17607, + 17608, + 17609, + 17610, + 17611, + 17612, + 17613, + 17614, + 17615, + 17616, + 17617, + 17618, + 17619, + 17620, + 17621, + 17622, + 17623, + 17624, + 17625, + 17626, + 17627, + 17628, + 17629, + 17630, + 17631, + 17632, + 17633, + 17634, + 17635, + 17636, + 17637, + 17638, + 17639, + 17640, + 17641, + 17642, + 17643, + 17644, + 17645, + 17646, + 17647, + 17648, + 17649, + 17650, + 17651, + 17652, + 17653, + 17654, + 17655, + 17656, + 17657, + 17658, + 17659, + 17660, + 17661, + 17662, + 17663, + 17664, + 17665, + 17666, + 17667, + 17668, + 17669, + 17670, + 17671, + 17672, + 17673, + 17674, + 17675, + 17676, + 17677, + 17678, + 17679, + 17680, + 17681, + 17682, + 17683, + 17684, + 17685, + 17686, + 17687, + 17688, + 17689, + 17690, + 17691, + 17692, + 17693, + 17694, + 17695, + 17696, + 17697, + 17698, + 17699, + 17700, + 17701, + 17702, + 17703, + 17704, + 17705, + 17706, + 17707, + 17708, + 17709, + 17710, + 17711, + 17712, + 17713, + 17714, + 17715, + 17716, + 17717, + 17718, + 17719, + 17720, + 17721, + 17722, + 17723, + 17724, + 17725, + 17726, + 17727, + 17728, + 17729, + 17730, + 17731, + 17732, + 17733, + 17734, + 17735, + 17736, + 17737, + 17738, + 17739, + 17740, + 17741, + 17742, + 17743, + 17744, + 17745, + 17746, + 17747, + 17748, + 17749, + 17750, + 17751, + 17752, + 17753, + 17754, + 17755, + 17756, + 17757, + 17758, + 17759, + 17760, + 17761, + 17762, + 17763, + 17764, + 17765, + 17766, + 17767, + 17768, + 17769, + 17770, + 17771, + 17772, + 17773, + 17774, + 17775, + 17776, + 17777, + 17778, + 17779, + 17780, + 17781, + 17782, + 17783, + 17784, + 17785, + 17786, + 17787, + 17788, + 17789, + 17790, + 17791, + 17792, + 17793, + 17794, + 17795, + 17796, + 17797, + 17798, + 17799, + 17800, + 17801, + 17802, + 17803, + 17804, + 17805, + 17806, + 17807, + 17808, + 17809, + 17810, + 17811, + 17812, + 17813, + 17814, + 17815, + 17816, + 17817, + 17818, + 17819, + 17820, + 17821, + 17822, + 17823, + 17824, + 17825, + 17826, + 17827, + 17828, + 17829, + 17830, + 17831, + 17832, + 17833, + 17834, + 17835, + 17836, + 17837, + 17838, + 17839, + 17840, + 17841, + 17842, + 17843, + 17844, + 17845, + 17846, + 17847, + 17848, + 17849, + 17850, + 17851, + 17852, + 17853, + 17854, + 17855, + 17856, + 17857, + 17858, + 17859, + 17860, + 17861, + 17862, + 17863, + 17864, + 17865, + 17866, + 17867, + 17868, + 17869, + 17870, + 17871, + 17872, + 17873, + 17874, + 17875, + 17876, + 17877, + 17878, + 17879, + 17880, + 17881, + 17882, + 17883, + 17884, + 17885, + 17886, + 17887, + 17888, + 17889, + 17890, + 17891, + 17892, + 17893, + 17894, + 17895, + 17896, + 17897, + 17898, + 17899, + 17900, + 17901, + 17902, + 17903, + 17904, + 17905, + 17906, + 17907, + 17908, + 17909, + 17910, + 17911, + 17912, + 17913, + 17914, + 17915, + 17916, + 17917, + 17918, + 17919, + 17920, + 17921, + 17922, + 17923, + 17924, + 17925, + 17926, + 17927, + 17928, + 17929, + 17930, + 17931, + 17932, + 17933, + 17934, + 17935, + 17936, + 17937, + 17938, + 17939, + 17940, + 17941, + 17942, + 17943, + 17944, + 17945, + 17946, + 17947, + 17948, + 17949, + 17950, + 17951, + 17952, + 17953, + 17954, + 17955, + 17956, + 17957, + 17958, + 17959, + 17960, + 17961, + 17962, + 17963, + 17964, + 17965, + 17966, + 17967, + 17968, + 17969, + 17970, + 17971, + 17972, + 17973, + 17974, + 17975, + 17976, + 17977, + 17978, + 17979, + 17980, + 17981, + 17982, + 17983, + 17984, + 17985, + 17986, + 17987, + 17988, + 17989, + 17990, + 17991, + 17992, + 17993, + 17994, + 17995, + 17996, + 17997, + 17998, + 17999, + 18000, + 18001, + 18002, + 18003, + 18004, + 18005, + 18006, + 18007, + 18008, + 18009, + 18010, + 18011, + 18012, + 18013, + 18014, + 18015, + 18016, + 18017, + 18018, + 18019, + 18020, + 18021, + 18022, + 18023, + 18024, + 18025, + 18026, + 18027, + 18028, + 18029, + 18030, + 18031, + 18032, + 18033, + 18034, + 18035, + 18036, + 18037, + 18038, + 18039, + 18040, + 18041, + 18042, + 18043, + 18044, + 18045, + 18046, + 18047, + 18048, + 18049, + 18050, + 18051, + 18052, + 18053, + 18054, + 18055, + 18056, + 18057, + 18058, + 18059, + 18060, + 18061, + 18062, + 18063, + 18064, + 18065, + 18066, + 18067, + 18068, + 18069, + 18070, + 18071, + 18072, + 18073, + 18074, + 18075, + 18076, + 18077, + 18078, + 18079, + 18080, + 18081, + 18082, + 18083, + 18084, + 18085, + 18086, + 18087, + 18088, + 18089, + 18090, + 18091, + 18092, + 18093, + 18094, + 18095, + 18096, + 18097, + 18098, + 18099, + 18100, + 18101, + 18102, + 18103, + 18104, + 18105, + 18106, + 18107, + 18108, + 18109, + 18110, + 18111, + 18112, + 18113, + 18114, + 18115, + 18116, + 18117, + 18118, + 18119, + 18120, + 18121, + 18122, + 18123, + 18124, + 18125, + 18126, + 18127, + 18128, + 18129, + 18130, + 18131, + 18132, + 18133, + 18134, + 18135, + 18136, + 18137, + 18138, + 18139, + 18140, + 18141, + 18142, + 18143, + 18144, + 18145, + 18146, + 18147, + 18148, + 18149, + 18150, + 18151, + 18152, + 18153, + 18154, + 18155, + 18156, + 18157, + 18158, + 18159, + 18160, + 18161, + 18162, + 18163, + 18164, + 18165, + 18166, + 18167, + 18168, + 18169, + 18170, + 18171, + 18172, + 18173, + 18174, + 18175, + 18176, + 18177, + 18178, + 18179, + 18180, + 18181, + 18182, + 18183, + 18184, + 18185, + 18186, + 18187, + 18188, + 18189, + 18190, + 18191, + 18192, + 18193, + 18194, + 18195, + 18196, + 18197, + 18198, + 18199, + 18200, + 18201, + 18202, + 18203, + 18204, + 18205, + 18206, + 18207, + 18208, + 18209, + 18210, + 18211, + 18212, + 18213, + 18214, + 18215, + 18216, + 18217, + 18218, + 18219, + 18220, + 18221, + 18222, + 18223, + 18224, + 18225, + 18226, + 18227, + 18228, + 18229, + 18230, + 18231, + 18232, + 18233, + 18234, + 18235, + 18236, + 18237, + 18238, + 18239, + 18240, + 18241, + 18242, + 18243, + 18244, + 18245, + 18246, + 18247, + 18248, + 18249, + 18250, + 18251, + 18252, + 18253, + 18254, + 18255, + 18256, + 18257, + 18258, + 18259, + 18260, + 18261, + 18262, + 18263, + 18264, + 18265, + 18266, + 18267, + 18268, + 18269, + 18270, + 18271, + 18272, + 18273, + 18274, + 18275, + 18276, + 18277, + 18278, + 18279, + 18280, + 18281, + 18282, + 18283, + 18284, + 18285, + 18286, + 18287, + 18288, + 18289, + 18290, + 18291, + 18292, + 18293, + 18294, + 18295, + 18296, + 18297, + 18298, + 18299, + 18300, + 18301, + 18302, + 18303, + 18304, + 18305, + 18306, + 18307, + 18308, + 18309, + 18310, + 18311, + 18312, + 18313, + 18314, + 18315, + 18316, + 18317, + 18318, + 18319, + 18320, + 18321, + 18322, + 18323, + 18324, + 18325, + 18326, + 18327, + 18328, + 18329, + 18330, + 18331, + 18332, + 18333, + 18334, + 18335, + 18336, + 18337, + 18338, + 18339, + 18340, + 18341, + 18342, + 18343, + 18344, + 18345, + 18346, + 18347, + 18348, + 18349, + 18350, + 18351, + 18352, + 18353, + 18354, + 18355, + 18356, + 18357, + 18358, + 18359, + 18360, + 18361, + 18362, + 18363, + 18364, + 18365, + 18366, + 18367, + 18368, + 18369, + 18370, + 18371, + 18372, + 18373, + 18374, + 18375, + 18376, + 18377, + 18378, + 18379, + 18380, + 18381, + 18382, + 18383, + 18384, + 18385, + 18386, + 18387, + 18388, + 18389, + 18390, + 18391, + 18392, + 18393, + 18394, + 18395, + 18396, + 18397, + 18398, + 18399, + 18400, + 18401, + 18402, + 18403, + 18404, + 18405, + 18406, + 18407, + 18408, + 18409, + 18410, + 18411, + 18412, + 18413, + 18414, + 18415, + 18416, + 18417, + 18418, + 18419, + 18420, + 18421, + 18422, + 18423, + 18424, + 18425, + 18426, + 18427, + 18428, + 18429, + 18430, + 18431, + 18432, + 18433, + 18434, + 18435, + 18436, + 18437, + 18438, + 18439, + 18440, + 18441, + 18442, + 18443, + 18444, + 18445, + 18446, + 18447, + 18448, + 18449, + 18450, + 18451, + 18452, + 18453, + 18454, + 18455, + 18456, + 18457, + 18458, + 18459, + 18460, + 18461, + 18462, + 18463, + 18464, + 18465, + 18466, + 18467, + 18468, + 18469, + 18470, + 18471, + 18472, + 18473, + 18474, + 18475, + 18476, + 18477, + 18478, + 18479, + 18480, + 18481, + 18482, + 18483, + 18484, + 18485, + 18486, + 18487, + 18488, + 18489, + 18490, + 18491, + 18492, + 18493, + 18494, + 18495, + 18496, + 18497, + 18498, + 18499, + 18500, + 18501, + 18502, + 18503, + 18504, + 18505, + 18506, + 18507, + 18508, + 18509, + 18510, + 18511, + 18512, + 18513, + 18514, + 18515, + 18516, + 18517, + 18518, + 18519, + 18520, + 18521, + 18522, + 18523, + 18524, + 18525, + 18526, + 18527, + 18528, + 18529, + 18530, + 18531, + 18532, + 18533, + 18534, + 18535, + 18536, + 18537, + 18538, + 18539, + 18540, + 18541, + 18542, + 18543, + 18544, + 18545, + 18546, + 18547, + 18548, + 18549, + 18550, + 18551, + 18552, + 18553, + 18554, + 18555, + 18556, + 18557, + 18558, + 18559, + 18560, + 18561, + 18562, + 18563, + 18564, + 18565, + 18566, + 18567, + 18568, + 18569, + 18570, + 18571, + 18572, + 18573, + 18574, + 18575, + 18576, + 18577, + 18578, + 18579, + 18580, + 18581, + 18582, + 18583, + 18584, + 18585, + 18586, + 18587, + 18588, + 18589, + 18590, + 18591, + 18592, + 18593, + 18594, + 18595, + 18596, + 18597, + 18598, + 18599, + 18600, + 18601, + 18602, + 18603, + 18604, + 18605, + 18606, + 18607, + 18608, + 18609, + 18610, + 18611, + 18612, + 18613, + 18614, + 18615, + 18616, + 18617, + 18618, + 18619, + 18620, + 18621, + 18622, + 18623, + 18624, + 18625, + 18626, + 18627, + 18628, + 18629, + 18630, + 18631, + 18632, + 18633, + 18634, + 18635, + 18636, + 18637, + 18638, + 18639 + ], + "rate_pass_wall_s": 462.32700855000076 + }, + "routes": { + "b_s3_pdip": { + "label": "S3 PDIP (source-only)", + "status": "ok", + "solver": "library", + "ms": 51.093198700255016, + "log_likelihood": 29155.000172771943 + }, + "d_s3_certified_fallback": { + "label": "S3 certified active set, budget 7, PDIP fallback", + "status": "ok", + "solver": "harness-injected certified active set", + "pass_budget": 7, + "fallback": true, + "injected_solver_calls_jax": 1, + "injected_solver_calls_numpy": 0, + "ms": 32.257679799658945, + "log_likelihood": 29155.000174348042 + } + }, + "equivalence_pins": [ + { + "pin": "route d (certified, fallback) == route b (library PDIP)", + "route": "d_s3_certified_fallback", + "reference": "b_s3_pdip", + "expectation": "the certified active set returns the library's own positive solution", + "rtol": 1e-09, + "got": 29155.000174348042, + "reference_value": 29155.000172771943, + "rel_diff": 5.4059329073930475e-11, + "status": "PASS" + } + ], + "reference": { + "log_evidence_s3_library": 29155.000174339304 + }, + "library_revisions": { + "PyAutoNerves": { + "head": "1fa613aa8d89a79613009fb66f5b4e2d21deb57a", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoNerves", + "module_file": "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/__init__.py" + }, + "PyAutoFit": { + "head": "dd9fbe0aab60c4a57702b1444ca031b317c91331", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoFit", + "module_file": "/mnt/ral/jnightin/PyAuto/PyAutoFit/autofit/__init__.py" + }, + "PyAutoArray": { + "head": "3de624b5b91a4efa130dc3cb0a3a0f06f85025a3", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoArray", + "module_file": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/__init__.py" + }, + "PyAutoGalaxy": { + "head": "70a61e26cd715cefe7012a38285698091246a8a4", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy", + "module_file": "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/__init__.py" + }, + "PyAutoLens": { + "head": "86054bbc19baa2f710a12e04a94fa27ab37cc354", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoLens", + "module_file": "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/__init__.py" + } + }, + "timer": { + "dataset_load": 0.08223211599761271, + "mask_and_oversample": 0.015269248000549851, + "adapt_image_build": 0.0022622950018558186, + "image_mesh_hilbert": 0.36894183900221833, + "model_build": 0.6015521819972491, + "instance_from_vector": 0.012271265000890708, + "register_pytrees": 0.000763020998419961, + "fit_imaging_eager": 4.436135009000282, + "s3_system_build": 3.04290988700086, + "b_s3_pdip_library_likelihood_jit_lower": 1.5145720850014186, + "b_s3_pdip_library_likelihood_jit_compile": 4.607514628001809, + "b_s3_pdip_library_likelihood_jit_first_call": 0.11996164800075348, + "b_s3_pdip_library_likelihood_jit_steady_x10": 0.5109319870025502, + "d_s3_certified_fallback_library_likelihood_jit_lower": 0.4959455039970635, + "d_s3_certified_fallback_library_likelihood_jit_compile": 4.317585242999485, + "d_s3_certified_fallback_library_likelihood_jit_first_call": 0.050906137003039476, + "d_s3_certified_fallback_library_likelihood_jit_steady_x10": 0.32257679799658945, + "captured_rate_pass": 445.0608614369994, + "captured_rate_uncertified_pdip_recheck": 17.256552230002853 + }, + "note": "Phase C1 (#304) rate pass: untimed. No millisecond here is a result. The rate is the fraction of captured lanes whose certificate failed under the named certified_fallback; the phase-C2 verdict takes it together with the timed pass." +} \ No newline at end of file diff --git a/results/breakdown/imaging/fixed_light_trace_delaunay_captured_rate_libcertified_fboff_b16_pix2_hpc_a100_fp64_fixed_light_trace.json b/results/breakdown/imaging/fixed_light_trace_delaunay_captured_rate_libcertified_fboff_b16_pix2_hpc_a100_fp64_fixed_light_trace.json new file mode 100644 index 000000000..4697cd97a --- /dev/null +++ b/results/breakdown/imaging/fixed_light_trace_delaunay_captured_rate_libcertified_fboff_b16_pix2_hpc_a100_fp64_fixed_light_trace.json @@ -0,0 +1,6406 @@ +{ + "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": null, + "cpu_count": 124, + "jax_compilation_cache_dir": "/mnt/ral/jnightin/autolens_profiling_wt/certified-solver-phase-c1-lane-rate/output/jax_cache/fixed_light_lanerate_delaunay_pix2_rate_20_certified_off_350768_6", + "autotune_cache_entries_at_start": 0, + "cache_fresh": true, + "nvidia_smi": "NVIDIA A100 80GB PCIe, 4723 MiB, 81920 MiB" + }, + "machine": { + "cpu_model": "AMD EPYC 7702 64-Core Processor", + "cpu_count_os": 124, + "nproc": 4, + "nproc_all": 124, + "nproc_note": "GNU nproc honours OMP_NUM_THREADS, so `nproc` can print 1 on a multi-core host; `nproc_all` is the core count.", + "ram_total": "928298200 kB", + "kernel": "5.14.0-687.50.1.el9_8.x86_64", + "platform": "Linux-5.14.0-687.50.1.el9_8.x86_64-x86_64-with-glibc2.34", + "python": "3.12.4", + "jax_thread_env": { + "NPROC": null + }, + "blas_thread_env": { + "OMP_NUM_THREADS": null, + "OPENBLAS_NUM_THREADS": null, + "MKL_NUM_THREADS": null, + "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" + }, + "precision": "fp64", + "configuration": { + "mesh": "delaunay", + "source_pixels": 1500, + "dataset": "hst", + "dataset_sha256": { + "data.fits": "e4e833a28e9c6f6fb023cd85c0d3dde74068720256bc77a240633500e5b04fac", + "noise_map.fits": "315c6266a0acd3ac9c8da82fcd2b45a08697362481fd7a35072bab1658530ba3", + "psf.fits": "8389ba0e8bf4a09b4a561cfc246181a2fb944ed396754cd0ff76fdd22910d303" + }, + "cell_source_sha256": "06a162fcdae6b329384ec33322f443df07215d86e56f0505ac15b3d3473eb432", + "border_relocator_mode": "cell", + "border_relocator": true, + "regularization": { + "scheme": "adapt_split", + "inner_coefficient": 0.1, + "outer_coefficient": 10.0, + "signal_scale": 0.1 + }, + "vmap_batch": 20, + "lanes": "captured", + "captured_pass": "rate", + "batch_sample": null, + "solver_source": "library", + "solver": "certified", + "certified_fallback": "none", + "certified_pass_budget": 16, + "certified_tau_rel": 1e-09, + "use_mixed_precision": false, + "thread_env": { + "n_threads": null, + "vars": [ + "OPENBLAS_NUM_THREADS", + "MKL_NUM_THREADS", + "OMP_NUM_THREADS", + "VECLIB_MAXIMUM_THREADS", + "NUMEXPR_NUM_THREADS" + ], + "set_to": null, + "preexisting": {}, + "overridden": {}, + "note": "Not pinned (legacy variant): recorded as found." + } + }, + "captured": { + "batches_path": "/mnt/ral/jnightin/autolens_profiling_wt/certified-solver-phase-c1-lane-rate/results/breakdown/imaging/nautilus_batches_delaunay_pix2.npz", + "batches_sha256": "90f4640a92f9b1c60ca3fceca7b484aa8215970489f8e7daf5430b8460d171d5", + "schema_version": 2, + "n_calls": 84, + "n_lanes": 1680, + "call_sizes_seen": [ + 20 + ], + "calls_by_phase": { + "prior": 8, + "exploration": 72, + "sampling": 4 + }, + "parameter_paths": [ + "galaxies.source.pixelization.regularization.inner_coefficient", + "galaxies.source.pixelization.regularization.outer_coefficient", + "galaxies.source.pixelization.regularization.signal_scale" + ], + "stage": "pix2", + "regularization": { + "class": "AdaptSplit", + "free": true, + "priors": { + "inner_coefficient": [ + "LogUniform", + 1e-06, + 1000000.0 + ], + "outer_coefficient": [ + "LogUniform", + 1e-06, + 1000000.0 + ], + "signal_scale": [ + "Uniform", + 0.0, + 1.0 + ] + }, + "priors_source": "PyAutoGalaxy packaged config/priors/regularization (adapt_split.yaml / constant.yaml); adapt_split.yaml is identical to euclid_strong_lens_modeling_pipeline/config/priors/regularization/adapt_split.yaml" + }, + "nautilus": { + "departures_from_production": [ + "mass/shear fixed at the S3 fiducial, not at a source_pix_1 result", + "no positions likelihood", + "the cell's mesh (Hilbert 1500, weight_power 1) in both stages; source_pix_2 redraws a 500-vertex Hilbert grid at weight_power 3.5", + "seeded (production passes no seed)", + "quick updates disabled (iterations_per_quick_update=1e12; render-only)", + "NullPaths: no output directory, so no checkpoint and one Sampler.run call", + "post-fit perform_update skipped (samples / latent variables never built)" + ], + "n_batch": 20, + "n_like_max": 40000, + "n_live": 75, + "number_of_cores": 1, + "production_reference": "euclid_strong_lens_modeling_pipeline/scripts/full_model.py source_pix_1 (n_live=150) / source_pix_2 (n_live=75): af.Nautilus(n_batch=20, **SettingsSearch.search_dict) with use_jax_vmap=True and number_of_cores=1 (SettingsSearch defaults)", + "production_stage": "source_pix_2", + "seed": 1, + "stage": "pix2", + "use_jax_vmap": true, + "version": "1.0.5" + }, + "capture_fit_status": "sampling complete (n_like_max or convergence); post-fit result skipped", + "capture_library_revisions": { + "PyAutoArray": { + "head": "7fa8d2714f7da43fec2b23c31bff580764831670", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoArray" + }, + "PyAutoFit": { + "head": "a736840127be7a3c21e15a5c945e94d8f1082983", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoFit" + }, + "PyAutoGalaxy": { + "head": "70a61e26cd715cefe7012a38285698091246a8a4", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy" + }, + "PyAutoLens": { + "head": "86054bbc19baa2f710a12e04a94fa27ab37cc354", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoLens" + }, + "PyAutoNerves": { + "head": "1fa613aa8d89a79613009fb66f5b4e2d21deb57a", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoNerves" + } + }, + "fingerprint_check": { + "fields": [ + "mesh", + "source_pixels", + "dataset_sha256", + "regularization_class", + "regularization_s0_fiducial", + "border_relocator", + "use_mixed_precision", + "log_evidence_s3_library" + ], + "not_identity": "the regularization coefficients: free per lane since the capture frees them", + "log_evidence_s3_library_rel_diff": 0.0, + "passed": true + } + }, + "rate": { + "pass": "rate", + "solver": "certified", + "certified_fallback": "none", + "certified_pass_budget": 16, + "certified_pass_budget_basis": "config default (Settings().certified_pass_budget)", + "composition": "jax.jit(jax.vmap(fn)) \u2014 the current Fitness._vmap composition", + "chunk_size": 20, + "chunk_rule": "the replayed lanes in capture order, split into chunks of --vmap-batch; the last chunk is padded by repeating its final lane and the padded rows are dropped. At --vmap-batch == n_batch every chunk is exactly one captured Nautilus batch.", + "batch_sample": null, + "stage": "pix2", + "regularization_range": { + "galaxies.source.pixelization.regularization.inner_coefficient": { + "min": 1.002685583167557e-06, + "max": 973443.1376694659 + }, + "galaxies.source.pixelization.regularization.outer_coefficient": { + "min": 1.1397104977616871e-06, + "max": 722149.0007485969 + }, + "galaxies.source.pixelization.regularization.signal_scale": { + "min": 2.074268335094942e-05, + "max": 0.9997572431485441 + } + }, + "calls_replayed": 84, + "calls_rule": "all captured calls", + "report_source": "library solve observed through its stats= out-dict (PyAutoArray #566) and jax.debug.callback(..., ordered=True); untimed; one row per lane checked per chunk", + "traced_solver_kwargs_jax": [ + "certified" + ], + "overall": { + "n_lanes": 1680, + "n_uncertified": 82, + "uncertified_rate": 0.04880952380952381, + "max_passes": 16, + "mean_passes": 2.979761904761905, + "n_at_budget": 82, + "budget": 16, + "passes_histogram": { + "0": 94, + "1": 34, + "2": 1089, + "3": 278, + "4": 35, + "5": 19, + "6": 11, + "7": 9, + "8": 13, + "9": 3, + "10": 3, + "11": 3, + "12": 3, + "13": 2, + "14": 2, + "16": 82 + } + }, + "by_nautilus_phase": { + "prior": { + "n_lanes": 160, + "n_uncertified": 33, + "uncertified_rate": 0.20625, + "max_passes": 16, + "mean_passes": 4.28125, + "n_at_budget": 33, + "budget": 16, + "passes_histogram": { + "0": 89, + "1": 9, + "2": 7, + "3": 6, + "4": 4, + "5": 3, + "6": 1, + "8": 4, + "9": 1, + "12": 2, + "14": 1, + "16": 33 + } + }, + "exploration": { + "n_lanes": 1440, + "n_uncertified": 49, + "uncertified_rate": 0.034027777777777775, + "max_passes": 16, + "mean_passes": 2.861111111111111, + "n_at_budget": 49, + "budget": 16, + "passes_histogram": { + "0": 5, + "1": 25, + "2": 1043, + "3": 231, + "4": 31, + "5": 16, + "6": 10, + "7": 9, + "8": 9, + "9": 2, + "10": 3, + "11": 3, + "12": 1, + "13": 2, + "14": 1, + "16": 49 + } + }, + "sampling": { + "n_lanes": 80, + "n_uncertified": 0, + "uncertified_rate": 0.0, + "max_passes": 3, + "mean_passes": 2.5125, + "n_at_budget": 0, + "budget": 16, + "passes_histogram": { + "2": 39, + "3": 41 + } + } + }, + "by_call_half": { + "early": { + "n_lanes": 840, + "n_uncertified": 82, + "uncertified_rate": 0.09761904761904762, + "max_passes": 16, + "mean_passes": 3.7607142857142857, + "n_at_budget": 82, + "budget": 16, + "passes_histogram": { + "0": 94, + "1": 34, + "2": 416, + "3": 111, + "4": 35, + "5": 19, + "6": 11, + "7": 9, + "8": 13, + "9": 3, + "10": 3, + "11": 3, + "12": 3, + "13": 2, + "14": 2, + "16": 82 + } + }, + "late": { + "n_lanes": 840, + "n_uncertified": 0, + "uncertified_rate": 0.0, + "max_passes": 3, + "mean_passes": 2.198809523809524, + "n_at_budget": 0, + "budget": 16, + "passes_histogram": { + "2": 673, + "3": 167 + } + } + }, + "phase_rule": "by_nautilus_phase: the sampler state when the batch was requested (nautilus_batches.phase_of) \u2014 prior = only the unit-cube bound (prior draws), exploration = more bounds and Sampler.explored False, sampling = explored True. by_call_half: early = call index below the median replayed call index, late = the rest.", + "vs_capture_pdip": { + "reference": "the capture's own figure of merit for the lane: library PDIP through Fitness.call_wrap's jax.jit(jax.vmap(call)) over parameter vectors", + "n_compared": 1635, + "n_excluded_resampled_or_nonfinite": 45, + "max_rel_diff": 0.9999999905122139, + "median_rel_diff": 3.4485168042594903e-13, + "max_abs_diff_nats": 141599935363399.28, + "n_above_lane_rtol": 147, + "n_above_lane_rtol_uncertified": 75, + "lane_rtol": 1e-09, + "gated": false, + "note": "RECORDED, NOT GATED: a cross-composition comparison (Fitness over vectors vs this cell over trees) and, for certified lanes, certified vs PDIP. The gated 1e-9 pin is the timed pass's (same composition, same lanes). It still shows whether a certified_fallback=none lane that FAILED its certificate returned a wrong answer." + }, + "uncertified_pdip_recheck": { + "n_uncertified": 82, + "n_rechecked": 82, + "cap": 256, + "max_rel_diff": 0.0001416739213986454, + "rows": [ + { + "lane_row": 6, + "call_index": 0, + "lane_in_call": 6, + "phase": "prior", + "passes": 16, + "log_likelihood_certified_none": 19663.86131784399, + "log_likelihood_scalar_library_pdip": 19662.106322955842, + "rel_diff": 8.925772546032077e-05, + "abs_diff_nats": 1.7549948881460296 + }, + { + "lane_row": 9, + "call_index": 0, + "lane_in_call": 9, + "phase": "prior", + "passes": 16, + "log_likelihood_certified_none": 19661.650172117123, + "log_likelihood_scalar_library_pdip": 19661.81403446555, + "rel_diff": 8.3340401929053e-06, + "abs_diff_nats": 0.16386234842866543 + }, + { + "lane_row": 18, + "call_index": 0, + "lane_in_call": 18, + "phase": "prior", + "passes": 16, + "log_likelihood_certified_none": 19661.611557072392, + "log_likelihood_scalar_library_pdip": 19661.775418583118, + "rel_diff": 8.334013955370757e-06, + "abs_diff_nats": 0.16386151072583743 + }, + { + "lane_row": 20, + "call_index": 1, + "lane_in_call": 0, + "phase": "prior", + "passes": 16, + "log_likelihood_certified_none": 19661.672821556225, + "log_likelihood_scalar_library_pdip": 19661.836683866422, + "rel_diff": 8.334028648076599e-06, + "abs_diff_nats": 0.16386231019714614 + }, + { + "lane_row": 24, + "call_index": 1, + "lane_in_call": 4, + "phase": "prior", + "passes": 16, + "log_likelihood_certified_none": NaN, + "log_likelihood_scalar_library_pdip": NaN, + "rel_diff": NaN, + "abs_diff_nats": NaN + }, + { + "lane_row": 29, + "call_index": 1, + "lane_in_call": 9, + "phase": "prior", + "passes": 16, + "log_likelihood_certified_none": 21307.31217053325, + "log_likelihood_scalar_library_pdip": 21308.766706705574, + "rel_diff": 6.825998859273054e-05, + "abs_diff_nats": 1.4545361723248789 + }, + { + "lane_row": 31, + "call_index": 1, + "lane_in_call": 11, + "phase": "prior", + "passes": 16, + "log_likelihood_certified_none": 19661.825830852053, + "log_likelihood_scalar_library_pdip": 19661.90726698532, + "rel_diff": 4.141822670661001e-06, + "abs_diff_nats": 0.08143613326683408 + }, + { + "lane_row": 37, + "call_index": 1, + "lane_in_call": 17, + "phase": "prior", + "passes": 16, + "log_likelihood_certified_none": 19661.87142132885, + "log_likelihood_scalar_library_pdip": 19661.95285748109, + "rel_diff": 4.141814031860435e-06, + "abs_diff_nats": 0.08143615223889356 + }, + { + "lane_row": 42, + "call_index": 2, + "lane_in_call": 2, + "phase": "prior", + "passes": 16, + "log_likelihood_certified_none": 19661.611672182786, + "log_likelihood_scalar_library_pdip": 19661.77553344853, + "rel_diff": 8.334001446898042e-06, + "abs_diff_nats": 0.16386126574434456 + }, + { + "lane_row": 43, + "call_index": 2, + "lane_in_call": 3, + "phase": "prior", + "passes": 16, + "log_likelihood_certified_none": 19815.482255685187, + "log_likelihood_scalar_library_pdip": 19815.451624743066, + "rel_diff": 1.545810951033698e-06, + "abs_diff_nats": 0.030630942121206317 + }, + { + "lane_row": 52, + "call_index": 2, + "lane_in_call": 12, + "phase": "prior", + "passes": 16, + "log_likelihood_certified_none": 21962.679410805336, + "log_likelihood_scalar_library_pdip": 21962.11491702494, + "rel_diff": 2.570307015185638e-05, + "abs_diff_nats": 0.5644937803954235 + }, + { + "lane_row": 55, + "call_index": 2, + "lane_in_call": 15, + "phase": "prior", + "passes": 16, + "log_likelihood_certified_none": 23621.419838005702, + "log_likelihood_scalar_library_pdip": 23621.41983681297, + "rel_diff": 5.049371240246267e-11, + "abs_diff_nats": 1.1927331797778606e-06 + }, + { + "lane_row": 66, + "call_index": 3, + "lane_in_call": 6, + "phase": "prior", + "passes": 16, + "log_likelihood_certified_none": 19661.614176467978, + "log_likelihood_scalar_library_pdip": 19661.77803879745, + "rel_diff": 8.334054486212681e-06, + "abs_diff_nats": 0.16386232947115786 + }, + { + "lane_row": 72, + "call_index": 3, + "lane_in_call": 12, + "phase": "prior", + "passes": 16, + "log_likelihood_certified_none": 19661.611613152847, + "log_likelihood_scalar_library_pdip": 19661.775474867656, + "rel_diff": 8.33402431121371e-06, + "abs_diff_nats": 0.16386171480917255 + }, + { + "lane_row": 76, + "call_index": 3, + "lane_in_call": 16, + "phase": "prior", + "passes": 16, + "log_likelihood_certified_none": 19661.6115560198, + "log_likelihood_scalar_library_pdip": 19661.775416641434, + "rel_diff": 8.333968736832972e-06, + "abs_diff_nats": 0.1638606216329208 + }, + { + "lane_row": 80, + "call_index": 4, + "lane_in_call": 0, + "phase": "prior", + "passes": 16, + "log_likelihood_certified_none": 19936.500475900717, + "log_likelihood_scalar_library_pdip": 19937.05649490407, + "rel_diff": 2.7888720859871484e-05, + "abs_diff_nats": 0.5560190033538674 + }, + { + "lane_row": 82, + "call_index": 4, + "lane_in_call": 2, + "phase": "prior", + "passes": 16, + "log_likelihood_certified_none": 19661.831615044663, + "log_likelihood_scalar_library_pdip": 19661.995476313066, + "rel_diff": 8.333908356408271e-06, + "abs_diff_nats": 0.16386126840370707 + }, + { + "lane_row": 85, + "call_index": 4, + "lane_in_call": 5, + "phase": "prior", + "passes": 16, + "log_likelihood_certified_none": 22939.457976801576, + "log_likelihood_scalar_library_pdip": 22939.4579768015, + "rel_diff": 3.3303993070013357e-15, + "abs_diff_nats": 7.639755494892597e-11 + }, + { + "lane_row": 90, + "call_index": 4, + "lane_in_call": 10, + "phase": "prior", + "passes": 16, + "log_likelihood_certified_none": 22066.97677147836, + "log_likelihood_scalar_library_pdip": 22066.998138209125, + "rel_diff": 9.68266305705507e-07, + "abs_diff_nats": 0.02136673076529405 + }, + { + "lane_row": 97, + "call_index": 4, + "lane_in_call": 17, + "phase": "prior", + "passes": 16, + "log_likelihood_certified_none": 19661.611552867154, + "log_likelihood_scalar_library_pdip": 19661.77541432955, + "rel_diff": 8.334011499076851e-06, + "abs_diff_nats": 0.16386146239528898 + }, + { + "lane_row": 103, + "call_index": 5, + "lane_in_call": 3, + "phase": "prior", + "passes": 16, + "log_likelihood_certified_none": 22535.847228178307, + "log_likelihood_scalar_library_pdip": 22535.25396132729, + "rel_diff": 2.63261666380948e-05, + "abs_diff_nats": 0.5932668510176882 + }, + { + "lane_row": 106, + "call_index": 5, + "lane_in_call": 6, + "phase": "prior", + "passes": 16, + "log_likelihood_certified_none": 19661.611552867143, + "log_likelihood_scalar_library_pdip": 19661.775414306077, + "rel_diff": 8.334010305841286e-06, + "abs_diff_nats": 0.16386143893396365 + }, + { + "lane_row": 108, + "call_index": 5, + "lane_in_call": 8, + "phase": "prior", + "passes": 16, + "log_likelihood_certified_none": 20092.040762976438, + "log_likelihood_scalar_library_pdip": 20092.040762466524, + "rel_diff": 2.5378888463622906e-11, + "abs_diff_nats": 5.099136615172029e-07 + }, + { + "lane_row": 109, + "call_index": 5, + "lane_in_call": 9, + "phase": "prior", + "passes": 16, + "log_likelihood_certified_none": 19661.611552855113, + "log_likelihood_scalar_library_pdip": 19661.775414681426, + "rel_diff": 8.334030007832738e-06, + "abs_diff_nats": 0.163861826313223 + }, + { + "lane_row": 111, + "call_index": 5, + "lane_in_call": 11, + "phase": "prior", + "passes": 16, + "log_likelihood_certified_none": 19667.236508042675, + "log_likelihood_scalar_library_pdip": 19666.734728835458, + "rel_diff": 2.5514108678239937e-05, + "abs_diff_nats": 0.5017792072176235 + }, + { + "lane_row": 114, + "call_index": 5, + "lane_in_call": 14, + "phase": "prior", + "passes": 16, + "log_likelihood_certified_none": 19661.640882882974, + "log_likelihood_scalar_library_pdip": 19661.8047440368, + "rel_diff": 8.333983373284274e-06, + "abs_diff_nats": 0.16386115382556454 + }, + { + "lane_row": 124, + "call_index": 6, + "lane_in_call": 4, + "phase": "prior", + "passes": 16, + "log_likelihood_certified_none": 20668.467316778384, + "log_likelihood_scalar_library_pdip": 20668.5112219617, + "rel_diff": 2.1242547585977454e-06, + "abs_diff_nats": 0.043905183316383045 + }, + { + "lane_row": 135, + "call_index": 6, + "lane_in_call": 15, + "phase": "prior", + "passes": 16, + "log_likelihood_certified_none": 19780.670564633394, + "log_likelihood_scalar_library_pdip": 19780.671741123628, + "rel_diff": 5.947675838169993e-08, + "abs_diff_nats": 0.0011764902337745298 + }, + { + "lane_row": 136, + "call_index": 6, + "lane_in_call": 16, + "phase": "prior", + "passes": 16, + "log_likelihood_certified_none": 22111.25584344645, + "log_likelihood_scalar_library_pdip": 22112.598039254648, + "rel_diff": 6.0698241148035955e-05, + "abs_diff_nats": 1.3421958081962657 + }, + { + "lane_row": 138, + "call_index": 6, + "lane_in_call": 18, + "phase": "prior", + "passes": 16, + "log_likelihood_certified_none": 19661.612743598533, + "log_likelihood_scalar_library_pdip": 19661.776604909744, + "rel_diff": 8.33400330521942e-06, + "abs_diff_nats": 0.1638613112118037 + }, + { + "lane_row": 143, + "call_index": 7, + "lane_in_call": 3, + "phase": "prior", + "passes": 16, + "log_likelihood_certified_none": 19664.159989657688, + "log_likelihood_scalar_library_pdip": 19662.405115112306, + "rel_diff": 8.925024863990615e-05, + "abs_diff_nats": 1.7548745453823358 + }, + { + "lane_row": 146, + "call_index": 7, + "lane_in_call": 6, + "phase": "prior", + "passes": 16, + "log_likelihood_certified_none": 21374.8780556626, + "log_likelihood_scalar_library_pdip": 21375.430702552734, + "rel_diff": 2.58543043096425e-05, + "abs_diff_nats": 0.5526468901334738 + }, + { + "lane_row": 159, + "call_index": 7, + "lane_in_call": 19, + "phase": "prior", + "passes": 16, + "log_likelihood_certified_none": 21767.29693907161, + "log_likelihood_scalar_library_pdip": 21766.15701341164, + "rel_diff": 5.2371470961386504e-05, + "abs_diff_nats": 1.139925659968867 + }, + { + "lane_row": 160, + "call_index": 8, + "lane_in_call": 0, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 19852.251355902958, + "log_likelihood_scalar_library_pdip": 19851.594184582875, + "rel_diff": 3.310420885962017e-05, + "abs_diff_nats": 0.6571713200828526 + }, + { + "lane_row": 164, + "call_index": 8, + "lane_in_call": 4, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 19664.90800009171, + "log_likelihood_scalar_library_pdip": 19664.888362180216, + "rel_diff": 9.986281707532801e-07, + "abs_diff_nats": 0.019637911493191496 + }, + { + "lane_row": 165, + "call_index": 8, + "lane_in_call": 5, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 19661.61183973046, + "log_likelihood_scalar_library_pdip": 19661.775700753395, + "rel_diff": 8.333989026659798e-06, + "abs_diff_nats": 0.16386102293472504 + }, + { + "lane_row": 166, + "call_index": 8, + "lane_in_call": 6, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 19673.735940325118, + "log_likelihood_scalar_library_pdip": 19673.099041959198, + "rel_diff": 3.2374074087721925e-05, + "abs_diff_nats": 0.6368983659194782 + }, + { + "lane_row": 169, + "call_index": 8, + "lane_in_call": 9, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 19678.02975001747, + "log_likelihood_scalar_library_pdip": 19677.044939261974, + "rel_diff": 5.004871201631265e-05, + "abs_diff_nats": 0.9848107554971648 + }, + { + "lane_row": 171, + "call_index": 8, + "lane_in_call": 11, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 19840.56831757003, + "log_likelihood_scalar_library_pdip": 19843.37960697275, + "rel_diff": 0.0001416739213986454, + "abs_diff_nats": 2.8112894027217408 + }, + { + "lane_row": 173, + "call_index": 8, + "lane_in_call": 13, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 19663.530670551172, + "log_likelihood_scalar_library_pdip": 19663.704925197264, + "rel_diff": 8.861740285198028e-06, + "abs_diff_nats": 0.17425464609186747 + }, + { + "lane_row": 178, + "call_index": 8, + "lane_in_call": 18, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 21885.39202787072, + "log_likelihood_scalar_library_pdip": 21885.392028032624, + "rel_diff": 7.397839098492216e-12, + "abs_diff_nats": 1.619046088308096e-07 + }, + { + "lane_row": 180, + "call_index": 9, + "lane_in_call": 0, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 19762.372543698988, + "log_likelihood_scalar_library_pdip": 19761.17302001366, + "rel_diff": 6.070103652825624e-05, + "abs_diff_nats": 1.1995236853290407 + }, + { + "lane_row": 195, + "call_index": 9, + "lane_in_call": 15, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 21134.29601127171, + "log_likelihood_scalar_library_pdip": 21134.74588130819, + "rel_diff": 2.1285802962026402e-05, + "abs_diff_nats": 0.44987003648202517 + }, + { + "lane_row": 197, + "call_index": 9, + "lane_in_call": 17, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 22526.881173162023, + "log_likelihood_scalar_library_pdip": 22526.931435570714, + "rel_diff": 2.2312141729090803e-06, + "abs_diff_nats": 0.05026240869119647 + }, + { + "lane_row": 200, + "call_index": 10, + "lane_in_call": 0, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 19661.75856190954, + "log_likelihood_scalar_library_pdip": 19661.839997917774, + "rel_diff": 4.14183048187579e-06, + "abs_diff_nats": 0.08143600823314046 + }, + { + "lane_row": 201, + "call_index": 10, + "lane_in_call": 1, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 19661.827696018598, + "log_likelihood_scalar_library_pdip": 19661.991557580186, + "rel_diff": 8.333924928639614e-06, + "abs_diff_nats": 0.16386156158841914 + }, + { + "lane_row": 204, + "call_index": 10, + "lane_in_call": 4, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 19661.611868013664, + "log_likelihood_scalar_library_pdip": 19661.775729108405, + "rel_diff": 8.333992666723458e-06, + "abs_diff_nats": 0.16386109474115074 + }, + { + "lane_row": 205, + "call_index": 10, + "lane_in_call": 5, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 19685.42614822039, + "log_likelihood_scalar_library_pdip": 19685.142761718125, + "rel_diff": 1.4395958703275902e-05, + "abs_diff_nats": 0.28338650226578466 + }, + { + "lane_row": 206, + "call_index": 10, + "lane_in_call": 6, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 19661.611552845556, + "log_likelihood_scalar_library_pdip": 19661.775413694464, + "rel_diff": 8.333980297335785e-06, + "abs_diff_nats": 0.16386084890837083 + }, + { + "lane_row": 209, + "call_index": 10, + "lane_in_call": 9, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 19661.611552996765, + "log_likelihood_scalar_library_pdip": 19661.775415061857, + "rel_diff": 8.334042151983684e-06, + "abs_diff_nats": 0.163862065091962 + }, + { + "lane_row": 212, + "call_index": 10, + "lane_in_call": 12, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 20398.718243445765, + "log_likelihood_scalar_library_pdip": 20397.9669589847, + "rel_diff": 3.68313402299009e-05, + "abs_diff_nats": 0.7512844610646425 + }, + { + "lane_row": 213, + "call_index": 10, + "lane_in_call": 13, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 19661.611552855098, + "log_likelihood_scalar_library_pdip": 19661.77541471316, + "rel_diff": 8.334031622558566e-06, + "abs_diff_nats": 0.16386185806186404 + }, + { + "lane_row": 222, + "call_index": 11, + "lane_in_call": 2, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 19661.9727557309, + "log_likelihood_scalar_library_pdip": 19662.136617664048, + "rel_diff": 8.33388234109301e-06, + "abs_diff_nats": 0.16386193314610864 + }, + { + "lane_row": 228, + "call_index": 11, + "lane_in_call": 8, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 19661.611582371715, + "log_likelihood_scalar_library_pdip": 19661.775443428865, + "rel_diff": 8.333990875919576e-06, + "abs_diff_nats": 0.16386105714991572 + }, + { + "lane_row": 230, + "call_index": 11, + "lane_in_call": 10, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 19661.75970491638, + "log_likelihood_scalar_library_pdip": 19661.923566940262, + "rel_diff": 8.333977259298128e-06, + "abs_diff_nats": 0.16386202388093807 + }, + { + "lane_row": 239, + "call_index": 11, + "lane_in_call": 19, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 19661.61156043895, + "log_likelihood_scalar_library_pdip": 19661.77542208161, + "rel_diff": 8.33402066411298e-06, + "abs_diff_nats": 0.16386164266077685 + }, + { + "lane_row": 245, + "call_index": 12, + "lane_in_call": 5, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 21117.676163358436, + "log_likelihood_scalar_library_pdip": 21117.677863830024, + "rel_diff": 8.052360677295182e-08, + "abs_diff_nats": 0.001700471588264918 + }, + { + "lane_row": 246, + "call_index": 12, + "lane_in_call": 6, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 21121.09036966407, + "log_likelihood_scalar_library_pdip": 21122.65969515253, + "rel_diff": 7.429582785074349e-05, + "abs_diff_nats": 1.5693254884608905 + }, + { + "lane_row": 249, + "call_index": 12, + "lane_in_call": 9, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 21607.56148569296, + "log_likelihood_scalar_library_pdip": 21607.346719745965, + "rel_diff": 9.939487239279948e-06, + "abs_diff_nats": 0.21476594699561247 + }, + { + "lane_row": 253, + "call_index": 12, + "lane_in_call": 13, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 20272.747036659515, + "log_likelihood_scalar_library_pdip": 20272.564954719513, + "rel_diff": 8.98169227270962e-06, + "abs_diff_nats": 0.1820819400018081 + }, + { + "lane_row": 256, + "call_index": 12, + "lane_in_call": 16, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 21279.31407852511, + "log_likelihood_scalar_library_pdip": 21279.30427540181, + "rel_diff": 4.6068814902652466e-07, + "abs_diff_nats": 0.009803123299207073 + }, + { + "lane_row": 270, + "call_index": 13, + "lane_in_call": 10, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 22182.38497510637, + "log_likelihood_scalar_library_pdip": 22182.39666301651, + "rel_diff": 5.26900240516259e-07, + "abs_diff_nats": 0.011687910136970459 + }, + { + "lane_row": 271, + "call_index": 13, + "lane_in_call": 11, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 21862.380145484593, + "log_likelihood_scalar_library_pdip": 21862.19773853122, + "rel_diff": 8.343486576867808e-06, + "abs_diff_nats": 0.18240695337226498 + }, + { + "lane_row": 272, + "call_index": 13, + "lane_in_call": 12, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 21159.267293050103, + "log_likelihood_scalar_library_pdip": 21159.267286939856, + "rel_diff": 2.8877405148882793e-10, + "abs_diff_nats": 6.1102473409846425e-06 + }, + { + "lane_row": 278, + "call_index": 13, + "lane_in_call": 18, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 21184.536807643468, + "log_likelihood_scalar_library_pdip": 21185.2040000847, + "rel_diff": 3.149332152904395e-05, + "abs_diff_nats": 0.6671924412330554 + }, + { + "lane_row": 279, + "call_index": 13, + "lane_in_call": 19, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 21346.431387387252, + "log_likelihood_scalar_library_pdip": 21346.409439750816, + "rel_diff": 1.0281652517874772e-06, + "abs_diff_nats": 0.02194763643637998 + }, + { + "lane_row": 285, + "call_index": 14, + "lane_in_call": 5, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 20391.045708311896, + "log_likelihood_scalar_library_pdip": 20392.507231606247, + "rel_diff": 7.166962246238262e-05, + "abs_diff_nats": 1.4615232943506271 + }, + { + "lane_row": 296, + "call_index": 14, + "lane_in_call": 16, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 23225.536226031385, + "log_likelihood_scalar_library_pdip": 23225.53622601705, + "rel_diff": 6.171498629979931e-13, + "abs_diff_nats": 1.4333636499941349e-08 + }, + { + "lane_row": 299, + "call_index": 14, + "lane_in_call": 19, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 20683.999892556727, + "log_likelihood_scalar_library_pdip": 20683.723057190877, + "rel_diff": 1.338421352310799e-05, + "abs_diff_nats": 0.2768353658502747 + }, + { + "lane_row": 300, + "call_index": 15, + "lane_in_call": 0, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 21280.451696097363, + "log_likelihood_scalar_library_pdip": 21280.444107767566, + "rel_diff": 3.5658700350888085e-07, + "abs_diff_nats": 0.007588329797727056 + }, + { + "lane_row": 302, + "call_index": 15, + "lane_in_call": 2, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 19695.416756282284, + "log_likelihood_scalar_library_pdip": 19696.03137516066, + "rel_diff": 3.120521422148816e-05, + "abs_diff_nats": 0.6146188783750404 + }, + { + "lane_row": 305, + "call_index": 15, + "lane_in_call": 5, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 21450.50111511842, + "log_likelihood_scalar_library_pdip": 21450.320109506858, + "rel_diff": 8.438364119365962e-06, + "abs_diff_nats": 0.18100561156097683 + }, + { + "lane_row": 311, + "call_index": 15, + "lane_in_call": 11, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 21666.353798039952, + "log_likelihood_scalar_library_pdip": 21666.353177386918, + "rel_diff": 2.8645939129384165e-08, + "abs_diff_nats": 0.0006206530342751648 + }, + { + "lane_row": 314, + "call_index": 15, + "lane_in_call": 14, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 21511.49953086424, + "log_likelihood_scalar_library_pdip": 21511.441682553334, + "rel_diff": 2.6891880032662193e-06, + "abs_diff_nats": 0.05784831090568332 + }, + { + "lane_row": 320, + "call_index": 16, + "lane_in_call": 0, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 20922.95254710212, + "log_likelihood_scalar_library_pdip": 20924.00019991109, + "rel_diff": 5.006943218131067e-05, + "abs_diff_nats": 1.0476528089711792 + }, + { + "lane_row": 322, + "call_index": 16, + "lane_in_call": 2, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 20725.357419050408, + "log_likelihood_scalar_library_pdip": 20725.23483292655, + "rel_diff": 5.914824359990056e-06, + "abs_diff_nats": 0.1225861238563084 + }, + { + "lane_row": 324, + "call_index": 16, + "lane_in_call": 4, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 20900.27559618452, + "log_likelihood_scalar_library_pdip": 20900.274947457787, + "rel_diff": 3.103914835014123e-08, + "abs_diff_nats": 0.0006487267346528824 + }, + { + "lane_row": 325, + "call_index": 16, + "lane_in_call": 5, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 21993.17060511061, + "log_likelihood_scalar_library_pdip": 21992.532214258063, + "rel_diff": 2.902761929942638e-05, + "abs_diff_nats": 0.6383908525458537 + }, + { + "lane_row": 327, + "call_index": 16, + "lane_in_call": 7, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 22802.181286882853, + "log_likelihood_scalar_library_pdip": 22802.157427556584, + "rel_diff": 1.0463626674407924e-06, + "abs_diff_nats": 0.023859326269302983 + }, + { + "lane_row": 332, + "call_index": 16, + "lane_in_call": 12, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 20002.778821966825, + "log_likelihood_scalar_library_pdip": 20002.43128400599, + "rel_diff": 1.7374785889814183e-05, + "abs_diff_nats": 0.34753796083532507 + }, + { + "lane_row": 333, + "call_index": 16, + "lane_in_call": 13, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 21640.299553019824, + "log_likelihood_scalar_library_pdip": 21640.30020578231, + "rel_diff": 3.0164206606077674e-08, + "abs_diff_nats": 0.0006527624864247628 + }, + { + "lane_row": 467, + "call_index": 23, + "lane_in_call": 7, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 27581.051558411193, + "log_likelihood_scalar_library_pdip": 27582.991649276868, + "rel_diff": 7.033649178972087e-05, + "abs_diff_nats": 1.9400908656753018 + } + ], + "gated": false + }, + "lane_certified": [ + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ], + "lane_passes": [ + 0, + 0, + 1, + 0, + 0, + 8, + 16, + 3, + 0, + 16, + 5, + 0, + 3, + 0, + 2, + 2, + 0, + 0, + 16, + 0, + 16, + 0, + 0, + 0, + 16, + 0, + 0, + 0, + 1, + 16, + 1, + 16, + 0, + 0, + 0, + 2, + 0, + 16, + 0, + 0, + 0, + 8, + 16, + 16, + 0, + 0, + 0, + 4, + 0, + 0, + 0, + 1, + 16, + 0, + 0, + 16, + 0, + 0, + 6, + 0, + 0, + 0, + 0, + 0, + 0, + 8, + 16, + 0, + 0, + 0, + 0, + 0, + 16, + 3, + 4, + 0, + 16, + 4, + 0, + 0, + 16, + 3, + 16, + 0, + 0, + 16, + 12, + 0, + 0, + 0, + 16, + 0, + 0, + 9, + 0, + 0, + 0, + 16, + 0, + 0, + 2, + 4, + 0, + 16, + 2, + 0, + 16, + 0, + 16, + 16, + 1, + 16, + 1, + 1, + 16, + 3, + 0, + 0, + 5, + 0, + 0, + 0, + 8, + 2, + 16, + 12, + 0, + 0, + 5, + 1, + 0, + 0, + 0, + 0, + 3, + 16, + 16, + 2, + 16, + 0, + 0, + 0, + 14, + 16, + 0, + 0, + 16, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 16, + 16, + 0, + 2, + 4, + 16, + 16, + 16, + 1, + 2, + 16, + 4, + 16, + 5, + 16, + 2, + 1, + 2, + 0, + 16, + 1, + 16, + 10, + 4, + 0, + 9, + 5, + 3, + 2, + 2, + 3, + 11, + 1, + 1, + 10, + 2, + 16, + 4, + 16, + 7, + 1, + 16, + 16, + 8, + 2, + 16, + 16, + 16, + 2, + 13, + 16, + 2, + 3, + 16, + 16, + 2, + 1, + 0, + 1, + 7, + 9, + 4, + 2, + 16, + 3, + 3, + 2, + 2, + 2, + 16, + 2, + 16, + 2, + 3, + 2, + 8, + 1, + 8, + 1, + 1, + 16, + 1, + 1, + 8, + 5, + 2, + 16, + 16, + 11, + 2, + 16, + 4, + 3, + 3, + 16, + 6, + 2, + 16, + 4, + 13, + 2, + 4, + 2, + 1, + 2, + 4, + 4, + 2, + 2, + 6, + 4, + 16, + 16, + 16, + 8, + 2, + 14, + 2, + 2, + 16, + 16, + 11, + 6, + 2, + 6, + 4, + 16, + 8, + 6, + 10, + 3, + 12, + 8, + 2, + 4, + 7, + 2, + 16, + 5, + 6, + 16, + 16, + 2, + 16, + 2, + 7, + 16, + 2, + 6, + 8, + 4, + 2, + 16, + 2, + 7, + 16, + 1, + 3, + 2, + 4, + 3, + 16, + 3, + 16, + 7, + 16, + 16, + 3, + 16, + 7, + 3, + 6, + 1, + 16, + 16, + 3, + 6, + 5, + 4, + 5, + 5, + 2, + 1, + 3, + 4, + 1, + 2, + 2, + 5, + 1, + 5, + 7, + 2, + 2, + 2, + 3, + 2, + 2, + 2, + 2, + 3, + 2, + 2, + 3, + 2, + 2, + 3, + 3, + 1, + 2, + 4, + 4, + 3, + 3, + 3, + 3, + 2, + 1, + 2, + 2, + 3, + 1, + 2, + 3, + 2, + 2, + 3, + 2, + 5, + 2, + 3, + 3, + 2, + 0, + 1, + 3, + 2, + 2, + 4, + 2, + 2, + 5, + 3, + 2, + 8, + 7, + 1, + 2, + 2, + 2, + 3, + 3, + 4, + 4, + 2, + 5, + 3, + 4, + 2, + 5, + 5, + 3, + 4, + 5, + 3, + 6, + 2, + 1, + 3, + 2, + 3, + 4, + 2, + 2, + 2, + 4, + 2, + 2, + 2, + 2, + 5, + 3, + 3, + 2, + 2, + 4, + 2, + 4, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 3, + 3, + 2, + 2, + 3, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 16, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 3, + 3, + 2, + 3, + 2, + 2, + 2, + 3, + 2, + 2, + 3, + 2, + 2, + 4, + 2, + 2, + 2, + 2, + 2, + 3, + 2, + 2, + 3, + 2, + 2, + 3, + 2, + 3, + 2, + 2, + 4, + 3, + 3, + 2, + 2, + 3, + 3, + 2, + 3, + 3, + 2, + 3, + 3, + 2, + 2, + 2, + 2, + 2, + 3, + 2, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 3, + 3, + 2, + 3, + 3, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 3, + 3, + 2, + 2, + 2, + 3, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 3, + 2, + 2, + 3, + 2, + 2, + 2, + 2, + 2, + 2, + 3, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 3, + 2, + 2, + 2, + 3, + 2, + 2, + 2, + 2, + 3, + 2, + 2, + 2, + 2, + 2, + 2, + 3, + 2, + 2, + 2, + 3, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 3, + 2, + 2, + 2, + 2, + 3, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 3, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 3, + 2, + 2, + 2, + 3, + 2, + 3, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 3, + 2, + 2, + 2, + 2, + 2, + 3, + 2, + 2, + 2, + 2, + 2, + 2, + 3, + 2, + 2, + 2, + 2, + 2, + 3, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 3, + 2, + 2, + 2, + 2, + 2, + 2, + 4, + 2, + 2, + 2, + 2, + 2, + 3, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 3, + 3, + 2, + 2, + 2, + 2, + 2, + 3, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 3, + 2, + 2, + 2, + 2, + 3, + 2, + 2, + 2, + 2, + 2, + 2, + 3, + 2, + 3, + 2, + 2, + 2, + 2, + 3, + 2, + 2, + 2, + 2, + 3, + 2, + 3, + 2, + 2, + 3, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 3, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 3, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 3, + 3, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 3, + 2, + 3, + 2, + 2, + 2, + 2, + 3, + 2, + 2, + 2, + 3, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 3, + 2, + 3, + 2, + 3, + 3, + 3, + 2, + 2, + 2, + 3, + 2, + 3, + 2, + 2, + 2, + 3, + 2, + 2, + 2, + 2, + 2, + 2, + 3, + 3, + 2, + 2, + 3, + 2, + 2, + 2, + 3, + 2, + 3, + 2, + 2, + 2, + 2, + 2, + 3, + 3, + 3, + 2, + 3, + 3, + 3, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 3, + 3, + 2, + 2, + 2, + 2, + 2, + 3, + 2, + 2, + 2, + 3, + 2, + 2, + 2, + 2, + 3, + 3, + 2, + 2, + 2, + 2, + 3, + 3, + 2, + 2, + 2, + 3, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 3, + 2, + 2, + 2, + 3, + 2, + 2, + 3, + 3, + 2, + 2, + 3, + 2, + 2, + 3, + 2, + 2, + 3, + 3, + 2, + 2, + 2, + 2, + 3, + 2, + 2, + 3, + 2, + 2, + 2, + 2, + 2, + 3, + 2, + 3, + 3, + 3, + 3, + 2, + 2, + 3, + 2, + 2, + 2, + 2, + 2, + 3, + 2, + 2, + 3, + 2, + 3, + 3, + 3, + 2, + 3, + 2, + 3, + 3, + 2, + 2, + 3, + 2, + 2, + 2, + 2, + 2, + 2, + 3, + 2, + 2, + 2, + 2, + 2, + 3, + 2, + 2, + 3, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 3, + 2, + 3, + 2, + 3, + 2, + 2, + 3, + 2, + 2, + 2, + 3, + 2, + 3, + 2, + 2, + 3, + 2, + 3, + 2, + 2, + 3, + 3, + 2, + 3, + 2, + 3, + 3, + 2, + 3, + 2, + 3, + 3, + 3, + 2, + 2, + 3, + 2, + 2, + 2, + 2, + 3, + 2, + 3, + 2, + 2, + 2, + 3, + 3, + 2, + 2, + 3, + 2, + 3, + 2, + 2, + 2, + 3, + 3, + 3, + 3, + 2, + 3, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 3, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 3, + 3, + 3, + 2, + 2, + 2, + 3, + 2, + 2, + 2, + 2, + 2, + 3, + 2, + 2, + 2, + 3, + 2, + 2, + 2, + 2, + 3, + 2, + 2, + 3, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 3, + 2, + 3, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 3, + 3, + 2, + 2, + 2, + 2, + 2, + 3, + 3, + 2, + 2, + 3, + 3, + 2, + 3, + 3, + 2, + 2, + 2, + 3, + 2, + 2, + 2, + 2, + 2, + 2, + 3, + 2, + 3, + 2, + 2, + 3, + 2, + 2, + 2, + 3, + 3, + 2, + 2, + 2, + 2, + 3, + 2, + 2, + 2, + 2, + 3, + 3, + 2, + 2, + 2, + 3, + 2, + 2, + 2, + 2, + 2, + 2, + 3, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 3, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 3, + 2, + 2, + 2, + 2, + 2, + 2, + 3, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 3, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 3, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 3, + 3, + 3, + 2, + 2, + 3, + 3, + 3, + 2, + 3, + 2, + 2, + 3, + 2, + 3, + 2, + 3, + 3, + 2, + 2, + 2, + 3, + 2, + 3, + 3, + 2, + 3, + 3, + 3, + 2, + 2, + 3, + 3, + 2, + 2, + 2, + 3, + 2, + 2, + 3, + 3, + 2, + 3, + 3, + 3, + 3, + 3, + 2, + 3, + 3, + 2, + 3, + 3, + 3, + 3, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 3, + 2, + 3, + 3, + 2, + 3, + 2, + 2, + 2, + 3, + 3, + 2, + 2, + 3, + 3, + 2 + ], + "lane_rows": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 57, + 58, + 59, + 60, + 61, + 62, + 63, + 64, + 65, + 66, + 67, + 68, + 69, + 70, + 71, + 72, + 73, + 74, + 75, + 76, + 77, + 78, + 79, + 80, + 81, + 82, + 83, + 84, + 85, + 86, + 87, + 88, + 89, + 90, + 91, + 92, + 93, + 94, + 95, + 96, + 97, + 98, + 99, + 100, + 101, + 102, + 103, + 104, + 105, + 106, + 107, + 108, + 109, + 110, + 111, + 112, + 113, + 114, + 115, + 116, + 117, + 118, + 119, + 120, + 121, + 122, + 123, + 124, + 125, + 126, + 127, + 128, + 129, + 130, + 131, + 132, + 133, + 134, + 135, + 136, + 137, + 138, + 139, + 140, + 141, + 142, + 143, + 144, + 145, + 146, + 147, + 148, + 149, + 150, + 151, + 152, + 153, + 154, + 155, + 156, + 157, + 158, + 159, + 160, + 161, + 162, + 163, + 164, + 165, + 166, + 167, + 168, + 169, + 170, + 171, + 172, + 173, + 174, + 175, + 176, + 177, + 178, + 179, + 180, + 181, + 182, + 183, + 184, + 185, + 186, + 187, + 188, + 189, + 190, + 191, + 192, + 193, + 194, + 195, + 196, + 197, + 198, + 199, + 200, + 201, + 202, + 203, + 204, + 205, + 206, + 207, + 208, + 209, + 210, + 211, + 212, + 213, + 214, + 215, + 216, + 217, + 218, + 219, + 220, + 221, + 222, + 223, + 224, + 225, + 226, + 227, + 228, + 229, + 230, + 231, + 232, + 233, + 234, + 235, + 236, + 237, + 238, + 239, + 240, + 241, + 242, + 243, + 244, + 245, + 246, + 247, + 248, + 249, + 250, + 251, + 252, + 253, + 254, + 255, + 256, + 257, + 258, + 259, + 260, + 261, + 262, + 263, + 264, + 265, + 266, + 267, + 268, + 269, + 270, + 271, + 272, + 273, + 274, + 275, + 276, + 277, + 278, + 279, + 280, + 281, + 282, + 283, + 284, + 285, + 286, + 287, + 288, + 289, + 290, + 291, + 292, + 293, + 294, + 295, + 296, + 297, + 298, + 299, + 300, + 301, + 302, + 303, + 304, + 305, + 306, + 307, + 308, + 309, + 310, + 311, + 312, + 313, + 314, + 315, + 316, + 317, + 318, + 319, + 320, + 321, + 322, + 323, + 324, + 325, + 326, + 327, + 328, + 329, + 330, + 331, + 332, + 333, + 334, + 335, + 336, + 337, + 338, + 339, + 340, + 341, + 342, + 343, + 344, + 345, + 346, + 347, + 348, + 349, + 350, + 351, + 352, + 353, + 354, + 355, + 356, + 357, + 358, + 359, + 360, + 361, + 362, + 363, + 364, + 365, + 366, + 367, + 368, + 369, + 370, + 371, + 372, + 373, + 374, + 375, + 376, + 377, + 378, + 379, + 380, + 381, + 382, + 383, + 384, + 385, + 386, + 387, + 388, + 389, + 390, + 391, + 392, + 393, + 394, + 395, + 396, + 397, + 398, + 399, + 400, + 401, + 402, + 403, + 404, + 405, + 406, + 407, + 408, + 409, + 410, + 411, + 412, + 413, + 414, + 415, + 416, + 417, + 418, + 419, + 420, + 421, + 422, + 423, + 424, + 425, + 426, + 427, + 428, + 429, + 430, + 431, + 432, + 433, + 434, + 435, + 436, + 437, + 438, + 439, + 440, + 441, + 442, + 443, + 444, + 445, + 446, + 447, + 448, + 449, + 450, + 451, + 452, + 453, + 454, + 455, + 456, + 457, + 458, + 459, + 460, + 461, + 462, + 463, + 464, + 465, + 466, + 467, + 468, + 469, + 470, + 471, + 472, + 473, + 474, + 475, + 476, + 477, + 478, + 479, + 480, + 481, + 482, + 483, + 484, + 485, + 486, + 487, + 488, + 489, + 490, + 491, + 492, + 493, + 494, + 495, + 496, + 497, + 498, + 499, + 500, + 501, + 502, + 503, + 504, + 505, + 506, + 507, + 508, + 509, + 510, + 511, + 512, + 513, + 514, + 515, + 516, + 517, + 518, + 519, + 520, + 521, + 522, + 523, + 524, + 525, + 526, + 527, + 528, + 529, + 530, + 531, + 532, + 533, + 534, + 535, + 536, + 537, + 538, + 539, + 540, + 541, + 542, + 543, + 544, + 545, + 546, + 547, + 548, + 549, + 550, + 551, + 552, + 553, + 554, + 555, + 556, + 557, + 558, + 559, + 560, + 561, + 562, + 563, + 564, + 565, + 566, + 567, + 568, + 569, + 570, + 571, + 572, + 573, + 574, + 575, + 576, + 577, + 578, + 579, + 580, + 581, + 582, + 583, + 584, + 585, + 586, + 587, + 588, + 589, + 590, + 591, + 592, + 593, + 594, + 595, + 596, + 597, + 598, + 599, + 600, + 601, + 602, + 603, + 604, + 605, + 606, + 607, + 608, + 609, + 610, + 611, + 612, + 613, + 614, + 615, + 616, + 617, + 618, + 619, + 620, + 621, + 622, + 623, + 624, + 625, + 626, + 627, + 628, + 629, + 630, + 631, + 632, + 633, + 634, + 635, + 636, + 637, + 638, + 639, + 640, + 641, + 642, + 643, + 644, + 645, + 646, + 647, + 648, + 649, + 650, + 651, + 652, + 653, + 654, + 655, + 656, + 657, + 658, + 659, + 660, + 661, + 662, + 663, + 664, + 665, + 666, + 667, + 668, + 669, + 670, + 671, + 672, + 673, + 674, + 675, + 676, + 677, + 678, + 679, + 680, + 681, + 682, + 683, + 684, + 685, + 686, + 687, + 688, + 689, + 690, + 691, + 692, + 693, + 694, + 695, + 696, + 697, + 698, + 699, + 700, + 701, + 702, + 703, + 704, + 705, + 706, + 707, + 708, + 709, + 710, + 711, + 712, + 713, + 714, + 715, + 716, + 717, + 718, + 719, + 720, + 721, + 722, + 723, + 724, + 725, + 726, + 727, + 728, + 729, + 730, + 731, + 732, + 733, + 734, + 735, + 736, + 737, + 738, + 739, + 740, + 741, + 742, + 743, + 744, + 745, + 746, + 747, + 748, + 749, + 750, + 751, + 752, + 753, + 754, + 755, + 756, + 757, + 758, + 759, + 760, + 761, + 762, + 763, + 764, + 765, + 766, + 767, + 768, + 769, + 770, + 771, + 772, + 773, + 774, + 775, + 776, + 777, + 778, + 779, + 780, + 781, + 782, + 783, + 784, + 785, + 786, + 787, + 788, + 789, + 790, + 791, + 792, + 793, + 794, + 795, + 796, + 797, + 798, + 799, + 800, + 801, + 802, + 803, + 804, + 805, + 806, + 807, + 808, + 809, + 810, + 811, + 812, + 813, + 814, + 815, + 816, + 817, + 818, + 819, + 820, + 821, + 822, + 823, + 824, + 825, + 826, + 827, + 828, + 829, + 830, + 831, + 832, + 833, + 834, + 835, + 836, + 837, + 838, + 839, + 840, + 841, + 842, + 843, + 844, + 845, + 846, + 847, + 848, + 849, + 850, + 851, + 852, + 853, + 854, + 855, + 856, + 857, + 858, + 859, + 860, + 861, + 862, + 863, + 864, + 865, + 866, + 867, + 868, + 869, + 870, + 871, + 872, + 873, + 874, + 875, + 876, + 877, + 878, + 879, + 880, + 881, + 882, + 883, + 884, + 885, + 886, + 887, + 888, + 889, + 890, + 891, + 892, + 893, + 894, + 895, + 896, + 897, + 898, + 899, + 900, + 901, + 902, + 903, + 904, + 905, + 906, + 907, + 908, + 909, + 910, + 911, + 912, + 913, + 914, + 915, + 916, + 917, + 918, + 919, + 920, + 921, + 922, + 923, + 924, + 925, + 926, + 927, + 928, + 929, + 930, + 931, + 932, + 933, + 934, + 935, + 936, + 937, + 938, + 939, + 940, + 941, + 942, + 943, + 944, + 945, + 946, + 947, + 948, + 949, + 950, + 951, + 952, + 953, + 954, + 955, + 956, + 957, + 958, + 959, + 960, + 961, + 962, + 963, + 964, + 965, + 966, + 967, + 968, + 969, + 970, + 971, + 972, + 973, + 974, + 975, + 976, + 977, + 978, + 979, + 980, + 981, + 982, + 983, + 984, + 985, + 986, + 987, + 988, + 989, + 990, + 991, + 992, + 993, + 994, + 995, + 996, + 997, + 998, + 999, + 1000, + 1001, + 1002, + 1003, + 1004, + 1005, + 1006, + 1007, + 1008, + 1009, + 1010, + 1011, + 1012, + 1013, + 1014, + 1015, + 1016, + 1017, + 1018, + 1019, + 1020, + 1021, + 1022, + 1023, + 1024, + 1025, + 1026, + 1027, + 1028, + 1029, + 1030, + 1031, + 1032, + 1033, + 1034, + 1035, + 1036, + 1037, + 1038, + 1039, + 1040, + 1041, + 1042, + 1043, + 1044, + 1045, + 1046, + 1047, + 1048, + 1049, + 1050, + 1051, + 1052, + 1053, + 1054, + 1055, + 1056, + 1057, + 1058, + 1059, + 1060, + 1061, + 1062, + 1063, + 1064, + 1065, + 1066, + 1067, + 1068, + 1069, + 1070, + 1071, + 1072, + 1073, + 1074, + 1075, + 1076, + 1077, + 1078, + 1079, + 1080, + 1081, + 1082, + 1083, + 1084, + 1085, + 1086, + 1087, + 1088, + 1089, + 1090, + 1091, + 1092, + 1093, + 1094, + 1095, + 1096, + 1097, + 1098, + 1099, + 1100, + 1101, + 1102, + 1103, + 1104, + 1105, + 1106, + 1107, + 1108, + 1109, + 1110, + 1111, + 1112, + 1113, + 1114, + 1115, + 1116, + 1117, + 1118, + 1119, + 1120, + 1121, + 1122, + 1123, + 1124, + 1125, + 1126, + 1127, + 1128, + 1129, + 1130, + 1131, + 1132, + 1133, + 1134, + 1135, + 1136, + 1137, + 1138, + 1139, + 1140, + 1141, + 1142, + 1143, + 1144, + 1145, + 1146, + 1147, + 1148, + 1149, + 1150, + 1151, + 1152, + 1153, + 1154, + 1155, + 1156, + 1157, + 1158, + 1159, + 1160, + 1161, + 1162, + 1163, + 1164, + 1165, + 1166, + 1167, + 1168, + 1169, + 1170, + 1171, + 1172, + 1173, + 1174, + 1175, + 1176, + 1177, + 1178, + 1179, + 1180, + 1181, + 1182, + 1183, + 1184, + 1185, + 1186, + 1187, + 1188, + 1189, + 1190, + 1191, + 1192, + 1193, + 1194, + 1195, + 1196, + 1197, + 1198, + 1199, + 1200, + 1201, + 1202, + 1203, + 1204, + 1205, + 1206, + 1207, + 1208, + 1209, + 1210, + 1211, + 1212, + 1213, + 1214, + 1215, + 1216, + 1217, + 1218, + 1219, + 1220, + 1221, + 1222, + 1223, + 1224, + 1225, + 1226, + 1227, + 1228, + 1229, + 1230, + 1231, + 1232, + 1233, + 1234, + 1235, + 1236, + 1237, + 1238, + 1239, + 1240, + 1241, + 1242, + 1243, + 1244, + 1245, + 1246, + 1247, + 1248, + 1249, + 1250, + 1251, + 1252, + 1253, + 1254, + 1255, + 1256, + 1257, + 1258, + 1259, + 1260, + 1261, + 1262, + 1263, + 1264, + 1265, + 1266, + 1267, + 1268, + 1269, + 1270, + 1271, + 1272, + 1273, + 1274, + 1275, + 1276, + 1277, + 1278, + 1279, + 1280, + 1281, + 1282, + 1283, + 1284, + 1285, + 1286, + 1287, + 1288, + 1289, + 1290, + 1291, + 1292, + 1293, + 1294, + 1295, + 1296, + 1297, + 1298, + 1299, + 1300, + 1301, + 1302, + 1303, + 1304, + 1305, + 1306, + 1307, + 1308, + 1309, + 1310, + 1311, + 1312, + 1313, + 1314, + 1315, + 1316, + 1317, + 1318, + 1319, + 1320, + 1321, + 1322, + 1323, + 1324, + 1325, + 1326, + 1327, + 1328, + 1329, + 1330, + 1331, + 1332, + 1333, + 1334, + 1335, + 1336, + 1337, + 1338, + 1339, + 1340, + 1341, + 1342, + 1343, + 1344, + 1345, + 1346, + 1347, + 1348, + 1349, + 1350, + 1351, + 1352, + 1353, + 1354, + 1355, + 1356, + 1357, + 1358, + 1359, + 1360, + 1361, + 1362, + 1363, + 1364, + 1365, + 1366, + 1367, + 1368, + 1369, + 1370, + 1371, + 1372, + 1373, + 1374, + 1375, + 1376, + 1377, + 1378, + 1379, + 1380, + 1381, + 1382, + 1383, + 1384, + 1385, + 1386, + 1387, + 1388, + 1389, + 1390, + 1391, + 1392, + 1393, + 1394, + 1395, + 1396, + 1397, + 1398, + 1399, + 1400, + 1401, + 1402, + 1403, + 1404, + 1405, + 1406, + 1407, + 1408, + 1409, + 1410, + 1411, + 1412, + 1413, + 1414, + 1415, + 1416, + 1417, + 1418, + 1419, + 1420, + 1421, + 1422, + 1423, + 1424, + 1425, + 1426, + 1427, + 1428, + 1429, + 1430, + 1431, + 1432, + 1433, + 1434, + 1435, + 1436, + 1437, + 1438, + 1439, + 1440, + 1441, + 1442, + 1443, + 1444, + 1445, + 1446, + 1447, + 1448, + 1449, + 1450, + 1451, + 1452, + 1453, + 1454, + 1455, + 1456, + 1457, + 1458, + 1459, + 1460, + 1461, + 1462, + 1463, + 1464, + 1465, + 1466, + 1467, + 1468, + 1469, + 1470, + 1471, + 1472, + 1473, + 1474, + 1475, + 1476, + 1477, + 1478, + 1479, + 1480, + 1481, + 1482, + 1483, + 1484, + 1485, + 1486, + 1487, + 1488, + 1489, + 1490, + 1491, + 1492, + 1493, + 1494, + 1495, + 1496, + 1497, + 1498, + 1499, + 1500, + 1501, + 1502, + 1503, + 1504, + 1505, + 1506, + 1507, + 1508, + 1509, + 1510, + 1511, + 1512, + 1513, + 1514, + 1515, + 1516, + 1517, + 1518, + 1519, + 1520, + 1521, + 1522, + 1523, + 1524, + 1525, + 1526, + 1527, + 1528, + 1529, + 1530, + 1531, + 1532, + 1533, + 1534, + 1535, + 1536, + 1537, + 1538, + 1539, + 1540, + 1541, + 1542, + 1543, + 1544, + 1545, + 1546, + 1547, + 1548, + 1549, + 1550, + 1551, + 1552, + 1553, + 1554, + 1555, + 1556, + 1557, + 1558, + 1559, + 1560, + 1561, + 1562, + 1563, + 1564, + 1565, + 1566, + 1567, + 1568, + 1569, + 1570, + 1571, + 1572, + 1573, + 1574, + 1575, + 1576, + 1577, + 1578, + 1579, + 1580, + 1581, + 1582, + 1583, + 1584, + 1585, + 1586, + 1587, + 1588, + 1589, + 1590, + 1591, + 1592, + 1593, + 1594, + 1595, + 1596, + 1597, + 1598, + 1599, + 1600, + 1601, + 1602, + 1603, + 1604, + 1605, + 1606, + 1607, + 1608, + 1609, + 1610, + 1611, + 1612, + 1613, + 1614, + 1615, + 1616, + 1617, + 1618, + 1619, + 1620, + 1621, + 1622, + 1623, + 1624, + 1625, + 1626, + 1627, + 1628, + 1629, + 1630, + 1631, + 1632, + 1633, + 1634, + 1635, + 1636, + 1637, + 1638, + 1639, + 1640, + 1641, + 1642, + 1643, + 1644, + 1645, + 1646, + 1647, + 1648, + 1649, + 1650, + 1651, + 1652, + 1653, + 1654, + 1655, + 1656, + 1657, + 1658, + 1659, + 1660, + 1661, + 1662, + 1663, + 1664, + 1665, + 1666, + 1667, + 1668, + 1669, + 1670, + 1671, + 1672, + 1673, + 1674, + 1675, + 1676, + 1677, + 1678, + 1679 + ], + "rate_pass_wall_s": 25.16404759699799 + }, + "routes": { + "b_s3_pdip": { + "label": "S3 PDIP (source-only)", + "status": "ok", + "solver": "library", + "ms": 50.77375740002026, + "log_likelihood": 29155.00017684672 + }, + "d_s3_certified_fallback": { + "label": "S3 certified active set, budget 7, PDIP fallback", + "status": "ok", + "solver": "harness-injected certified active set", + "pass_budget": 7, + "fallback": true, + "injected_solver_calls_jax": 1, + "injected_solver_calls_numpy": 0, + "ms": 31.704955299937865, + "log_likelihood": 29155.00017745562 + } + }, + "equivalence_pins": [ + { + "pin": "route d (certified, fallback) == route b (library PDIP)", + "route": "d_s3_certified_fallback", + "reference": "b_s3_pdip", + "expectation": "the certified active set returns the library's own positive solution", + "rtol": 1e-09, + "got": 29155.00017745562, + "reference_value": 29155.00017684672, + "rel_diff": 2.088490561433491e-11, + "status": "PASS" + } + ], + "reference": { + "log_evidence_s3_library": 29155.000174339304 + }, + "library_revisions": { + "PyAutoNerves": { + "head": "1fa613aa8d89a79613009fb66f5b4e2d21deb57a", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoNerves", + "module_file": "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/__init__.py" + }, + "PyAutoFit": { + "head": "dd9fbe0aab60c4a57702b1444ca031b317c91331", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoFit", + "module_file": "/mnt/ral/jnightin/PyAuto/PyAutoFit/autofit/__init__.py" + }, + "PyAutoArray": { + "head": "3de624b5b91a4efa130dc3cb0a3a0f06f85025a3", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoArray", + "module_file": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/__init__.py" + }, + "PyAutoGalaxy": { + "head": "70a61e26cd715cefe7012a38285698091246a8a4", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy", + "module_file": "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/__init__.py" + }, + "PyAutoLens": { + "head": "86054bbc19baa2f710a12e04a94fa27ab37cc354", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoLens", + "module_file": "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/__init__.py" + } + }, + "timer": { + "dataset_load": 0.08223076600188506, + "mask_and_oversample": 0.015158120000705821, + "adapt_image_build": 0.00234464299865067, + "image_mesh_hilbert": 0.36998408699946594, + "model_build": 0.6079522469990479, + "instance_from_vector": 0.012293834002775839, + "register_pytrees": 0.0006979509998927824, + "fit_imaging_eager": 4.40731809999852, + "s3_system_build": 3.039376558997901, + "b_s3_pdip_library_likelihood_jit_lower": 1.533057615000871, + "b_s3_pdip_library_likelihood_jit_compile": 4.593687763001071, + "b_s3_pdip_library_likelihood_jit_first_call": 0.11929759600025136, + "b_s3_pdip_library_likelihood_jit_steady_x10": 0.5077375740002026, + "d_s3_certified_fallback_library_likelihood_jit_lower": 0.4799996319998172, + "d_s3_certified_fallback_library_likelihood_jit_compile": 4.254465371999686, + "d_s3_certified_fallback_library_likelihood_jit_first_call": 0.041063683998800116, + "d_s3_certified_fallback_library_likelihood_jit_steady_x10": 0.31704955299937865, + "captured_rate_pass": 17.03252149200125, + "captured_rate_uncertified_pdip_recheck": 8.128984453996964 + }, + "note": "Phase C1 (#304) rate pass: untimed. No millisecond here is a result. The rate is the fraction of captured lanes whose certificate failed under the named certified_fallback; the phase-C2 verdict takes it together with the timed pass." +} \ No newline at end of file diff --git a/results/breakdown/imaging/fixed_light_trace_delaunay_jitvmap16_captured_pix1_libcertified_fboff_b16_hpc_a100_fp64_fixed_light_trace.json b/results/breakdown/imaging/fixed_light_trace_delaunay_jitvmap16_captured_pix1_libcertified_fboff_b16_hpc_a100_fp64_fixed_light_trace.json new file mode 100644 index 000000000..734543645 --- /dev/null +++ b/results/breakdown/imaging/fixed_light_trace_delaunay_jitvmap16_captured_pix1_libcertified_fboff_b16_hpc_a100_fp64_fixed_light_trace.json @@ -0,0 +1,5795 @@ +{ + "device": { + "backend": "gpu", + "device": "cuda:0", + "hostname": "euclid-ral-gpu-2", + "xla_flags": "--xla_disable_hlo_passes=constant_folding --xla_gpu_autotune_level=0 --xla_gpu_enable_triton_gemm=false", + "omp_num_threads": null, + "cpu_count": 124, + "jax_compilation_cache_dir": "/mnt/ral/jnightin/autolens_profiling_wt/certified-solver-phase-c1-lane-rate/output/jax_cache/fixed_light_lanerate_delaunay_pix1_time_16_certified_off_350768_10", + "autotune_cache_entries_at_start": 0, + "cache_fresh": true, + "nvidia_smi": "NVIDIA A100 80GB PCIe, 35457 MiB, 81920 MiB" + }, + "machine": { + "cpu_model": "AMD EPYC 7702 64-Core Processor", + "cpu_count_os": 124, + "nproc": 4, + "nproc_all": 124, + "nproc_note": "GNU nproc honours OMP_NUM_THREADS, so `nproc` can print 1 on a multi-core host; `nproc_all` is the core count.", + "ram_total": "928298204 kB", + "kernel": "5.14.0-687.50.1.el9_8.x86_64", + "platform": "Linux-5.14.0-687.50.1.el9_8.x86_64-x86_64-with-glibc2.34", + "python": "3.12.4", + "jax_thread_env": { + "NPROC": null + }, + "blas_thread_env": { + "OMP_NUM_THREADS": null, + "OPENBLAS_NUM_THREADS": null, + "MKL_NUM_THREADS": null, + "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" + }, + "precision": "fp64", + "configuration": { + "pixel_scale_arcsec": 0.05, + "mask_radius_arcsec": 3.5, + "image_pixels_masked": 15361, + "over_sampled_pixels": 62752, + "mesh": "delaunay", + "mesh_shape": null, + "source_pixels": 1500, + "source_pixels_requested": null, + "dataset": "hst", + "dataset_sha256": { + "data.fits": "e4e833a28e9c6f6fb023cd85c0d3dde74068720256bc77a240633500e5b04fac", + "noise_map.fits": "315c6266a0acd3ac9c8da82fcd2b45a08697362481fd7a35072bab1658530ba3", + "psf.fits": "8389ba0e8bf4a09b4a561cfc246181a2fb944ed396754cd0ff76fdd22910d303" + }, + "cell_source_sha256": "06a162fcdae6b329384ec33322f443df07215d86e56f0505ac15b3d3473eb432", + "inversion_path": "dense", + "pass_budget": 7, + "pass_budget_basis": "phase 3 (autolens_profiling#255): the smallest ZERO-fallback budget per mesh, the budget a production run fixes. NOT phase 0's certifying budget (2 for Delaunay), which falls back on 67.5 % of a graded draw set and is not a production cost.", + "border_relocator_mode": "cell", + "border_relocator": true, + "border_relocator_note": "'cell' is use_border_relocator=True, which every profiling cell in this family forces; 'library' passes None and takes the shipped config default, which is what production runs. The resolved boolean is what this leg actually ran.", + "routes_selected": [ + "b", + "d" + ], + "trace_calls": 10, + "command_buffers_traced": "off", + "use_mixed_precision": false, + "tau_rel": 1e-09, + "regularization": { + "scheme": "adapt_split", + "inner_coefficient": 0.1, + "outer_coefficient": 10.0, + "signal_scale": 0.1 + }, + "thread_env": { + "n_threads": null, + "vars": [ + "OPENBLAS_NUM_THREADS", + "MKL_NUM_THREADS", + "OMP_NUM_THREADS", + "VECLIB_MAXIMUM_THREADS", + "NUMEXPR_NUM_THREADS" + ], + "set_to": null, + "preexisting": {}, + "overridden": {}, + "note": "Not pinned (legacy variant): recorded as found." + }, + "over_sample_size_lp_rule": { + "sub_size_list": [ + 4, + 2, + 2 + ], + "radial_list": [ + 0.3, + 0.6 + ], + "centre": [ + 0.0, + 0.0 + ] + }, + "vmap_batch": 16, + "lanes": "captured", + "arms": [ + "vmap", + "scalar" + ], + "fallback": "off", + "draw_seed": 0, + "vmap_composition": "jax.jit(jax.vmap(fn))", + "lane_rtol": 1e-09, + "vmap_flags_note": "Strict ProfileCLI.parse_cell_args rejects unknown flags. These keys record the exact batching program and prevent historical vmap(jit) artifacts from being mistaken for current jit(vmap) measurements.", + "solver_source": "library", + "solver": "certified", + "certified_fallback": "none", + "certified_pass_budget": 16, + "captured_pass": "time", + "batches": "/mnt/ral/jnightin/autolens_profiling_wt/certified-solver-phase-c1-lane-rate/results/breakdown/imaging/nautilus_batches_delaunay_pix1.npz" + }, + "solver_injection": { + "patched": null, + "part_v": "none \u2014 library mode selects the solver through al.Settings", + "part_b_route_d": { + "patched": "autoarray.inversion.inversion.inversion_util.reconstruction_positive_only_from", + "pass_budget": 7, + "fallback": true + }, + "note": "Library mode (phase B, #300): PART V's arms and references run the library's own positive-only solve, selected by Settings(positive_only_solver, certified_fallback, certified_pass_budget); nothing is injected. PART B's single-call route d (the fiducial d == b pin) still uses the phase-1 harness injection at the phase-3 budget and is not a phase-B row. The untimed certification report observes the library solve (library_solver_observed) without changing it." + }, + "routes": { + "b_s3_pdip": { + "label": "S3 PDIP (source-only)", + "status": "ok", + "solver": "library", + "ms": 50.846076300149434, + "log_likelihood": 29155.000173450033 + }, + "d_s3_certified_fallback": { + "label": "S3 certified active set, budget 7, PDIP fallback", + "status": "ok", + "solver": "harness-injected certified active set", + "pass_budget": 7, + "fallback": true, + "injected_solver_calls_jax": 1, + "injected_solver_calls_numpy": 0, + "ms": 31.670782400033204, + "log_likelihood": 29155.00017281842 + } + }, + "equivalence_pins": [ + { + "pin": "route d (certified, fallback) == route b (library PDIP)", + "route": "d_s3_certified_fallback", + "reference": "b_s3_pdip", + "expectation": "the certified active set returns the library's own positive solution", + "rtol": 1e-09, + "got": 29155.00017281842, + "reference_value": 29155.000173450033, + "rel_diff": 2.1663910986603628e-11, + "status": "PASS" + } + ], + "equivalence_rtol": 1e-09, + "reference": { + "log_evidence_s0_library": 29155.00017433923, + "log_evidence_s3_library": 29155.000174339304, + "s3": { + "n_params": 1500, + "n_mapper": 1500, + "n_funcs": 0, + "edge_zeroed_pixels": 0, + "subtracted_light_flux": 5105.448603818575 + } + }, + "command_buffers": { + "wall_on_ms": 512.7541152000049, + "wall_off_ms": 517.150563299947, + "command_buffer_delta_ms": 4.396448099942063, + "command_buffer_delta_pct": 0.8574183940439336, + "traced": "off", + "compiler_option": "xla_gpu_enable_command_buffer", + "probe": { + "note": "Not taken in --vmap-batch mode: the CUPTI-inside-a-CUDA-graph probe is a phase-1 diagnostic about the JOIN, and this mode already compiles and times both the command-buffers ON and OFF executable of every arm." + }, + "note": "ONE lowering, TWO compilations, one process. wall_on_ms is the PRODUCTION program (CUDA graphs as XLA ships them) and is the number comparable to phase 5's row; wall_off_ms is the graph-less program the stage rows attribute. The delta is the launch overhead the graphs remove \u2014 it lands in device_idle and host_outside_span, not in any stage. Reconciliation is computed against wall_off_ms." + }, + "trace": { + "parser": "ProfileData.from_file(xplane) + as_text() + stack_frame_index(proto field 17)", + "stage_audit": { + "mixed_fusion": [ + { + "instruction": "loop_divide_gather_fusion", + "ms": 1.0222060687499999, + "opcode": "fusion", + "shape": "(f64[15361,1,1,1500]{3,2,1,0}, f64[15361,1,1,1500]{3,2,1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:133", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:133 (curvature_matrix_via_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:93 (InversionImagingMapping.curvature_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:389 (AbstractInversion.curvature_reg_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "loop_broadcast_fusion.4", + "ms": 0.227287425, + "opcode": "fusion", + "shape": "f64[1500,180,180]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "input_reduce_fusion.5", + "ms": 0.12172564999999999, + "opcode": "fusion", + "shape": "f64[92,1500]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/inversion_imaging_util.py:123", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/inversion_imaging_util.py:123 (data_vector_via_blurred_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:67 (InversionImagingMapping.data_vector)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:699 (AbstractInversion.reconstruction)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "input_reduce_fusion.9", + "ms": 0.11514451250000009, + "opcode": "fusion", + "shape": "f64[15361]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:163", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:163 (mapped_reconstructed_data_via_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:120 (InversionImagingMapping._mapped_reconstructed_data_dict_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:196 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "loop_broadcast_fusion.2", + "ms": 0.11111129375, + "opcode": "fusion", + "shape": "f64[15361,1500]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:342", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:342 (mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/abstract.py:283 (Mapper.mapping_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:91 (AbstractInversionImaging._mapping_matrix_for_convolution_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:137 (AbstractInversionImaging.operated_mapping_matrix_list)" + ] + }, + { + "instruction": "input_multiply_transpose_fusion", + "ms": 0.11002071875, + "opcode": "fusion", + "shape": "(f64[1500,1500]{1,0}, f64[1500,1500]{1,0}, f64[1500,1500]{1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:237 (active_set_search)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:293 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:274 (_certified_positive_only_from)" + ] + } + ], + "border_relocator": [ + { + "instruction": "eigh.45", + "ms": 0.07492749374999988, + "opcode": "custom-call", + "shape": "(f64[2,2]{0,1}, f64[2]{0}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:245", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:245 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:454 (BorderRelocator.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:176 (AbstractMesh.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:214 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "custom-call.2", + "ms": 0.00796716875000001, + "opcode": "custom-call", + "shape": "(f64[2,2]{1,0}, s8[4194304]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:242", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:242 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:454 (BorderRelocator.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:176 (AbstractMesh.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:214 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "input_reduce_fusion.10", + "ms": 0.005843174999999995, + "opcode": "fusion", + "shape": "(f64[], f64[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:269", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:269 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:454 (BorderRelocator.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:176 (AbstractMesh.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:214 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "loop_add_fusion.3", + "ms": 0.0035635437499999985, + "opcode": "fusion", + "shape": "f64[15361]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:308", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:308 (relocated_grid_via_ellipse_border_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:423 (BorderRelocator.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:83 (AbstractMesh.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:208 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "loop_add_fusion.5", + "ms": 0.003449968749999998, + "opcode": "fusion", + "shape": "f64[1500]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:308", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:308 (relocated_grid_via_ellipse_border_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:458 (BorderRelocator.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:176 (AbstractMesh.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:214 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "input_concatenate_fusion.12", + "ms": 0.0024208062499999987, + "opcode": "fusion", + "shape": "f64[392,2]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:238", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:238 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:454 (BorderRelocator.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:176 (AbstractMesh.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:214 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + } + ], + "mesh_construction": [ + { + "instruction": "input_concatenate_fusion.7", + "ms": 0.002060987500000002, + "opcode": "fusion", + "shape": "f64[1500,2]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:820", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:820 (InterpolatorDelaunay.mesh_grid_xy)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:847 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + } + ], + "mesh_qhull_callback": [ + { + "instruction": "pure_callback.4", + "ms": 0.010662925000000023, + "opcode": "custom-call", + "shape": "(s32[3000,3]{1,0}, s32[3000,3]{1,0}, s32[1500]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:161", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:161 (_jax_delaunay_tables)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:405 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + } + ], + "other": [ + { + "instruction": "copy.80", + "ms": 0.0421512312500022, + "opcode": "copy", + "shape": "f64[1,1024,2]{2,1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "copy.48", + "ms": 0.016989462500000115, + "opcode": "copy", + "shape": "s32[21361]{0}", + "source": "", + "stack": [] + }, + { + "instruction": "copy.53", + "ms": 0.0019827937500000005, + "opcode": "copy", + "shape": "s64[1500]{0}", + "source": "", + "stack": [] + }, + { + "instruction": "copy.79", + "ms": 0.0017985875000000005, + "opcode": "copy", + "shape": "s32[]", + "source": "", + "stack": [] + }, + { + "instruction": "copy.78", + "ms": 0.0017723812499999992, + "opcode": "copy", + "shape": "s64[]", + "source": "", + "stack": [] + }, + { + "instruction": "copy.39", + "ms": 0.0016623937499999995, + "opcode": "copy", + "shape": "s32[]", + "source": "", + "stack": [] + } + ], + "mesh_seed_argmin": [ + { + "instruction": "input_reduce_fusion", + "ms": 0.15278476250000322, + "opcode": "fusion", + "shape": "(f64[1024]{0}, s64[1024]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:191", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:191 (_nearest_vertex_seed_from..argmin_chunk)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204 (_nearest_vertex_seed_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:351 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)" + ] + }, + { + "instruction": "loop_dynamic_update_slice_fusion", + "ms": 0.04134503124999953, + "opcode": "fusion", + "shape": "s32[21,1024]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204 (_nearest_vertex_seed_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:351 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "loop_add_fusion", + "ms": 0.03183429999999872, + "opcode": "fusion", + "shape": "s64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204 (_nearest_vertex_seed_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:351 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "loop_broadcast_fusion", + "ms": 0.0019629874999999995, + "opcode": "fusion", + "shape": "s32[21,1024]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204 (_nearest_vertex_seed_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:351 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "pdip_solve": [ + { + "instruction": "cholesky.50", + "ms": 5.925674424999978, + "opcode": "custom-call", + "shape": "(f64[1500,1500]{0,1}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:252 (active_set_search..body_fun)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:262 (active_set_search)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:293 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)" + ] + }, + { + "instruction": "triangular-solve.1", + "ms": 1.0751257125000189, + "opcode": "custom-call", + "shape": "(f64[1500,1]{0,1}, s8[0]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:154", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:154 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:252 (active_set_search..body_fun)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:262 (active_set_search)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:293 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)" + ] + }, + { + "instruction": "triangular-solve", + "ms": 0.9163587937499991, + "opcode": "custom-call", + "shape": "(f64[1500,1]{0,1}, s8[0]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:154", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:154 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:252 (active_set_search..body_fun)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:262 (active_set_search)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:293 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)" + ] + }, + { + "instruction": "cholesky.70", + "ms": 0.8940089249999981, + "opcode": "custom-call", + "shape": "(f64[1500,1500]{0,1}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:297 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:274 (_certified_positive_only_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:496 (reconstruction_positive_only_from)" + ] + }, + { + "instruction": "cholesky.60", + "ms": 0.8650892000000021, + "opcode": "custom-call", + "shape": "(f64[1500,1500]{0,1}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:237 (active_set_search)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:293 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:274 (_certified_positive_only_from)" + ] + }, + { + "instruction": "input_transpose_fusion", + "ms": 0.23345516249999987, + "opcode": "fusion", + "shape": "f64[1500,1500]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:252 (active_set_search..body_fun)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:262 (active_set_search)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:293 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)" + ] + } + ], + "regularization_H": [ + { + "instruction": "input_scatter_fusion.10", + "ms": 0.0020828, + "opcode": "fusion", + "shape": "f64[1500,1500]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:615", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:615 (pixel_splitted_regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt_split.py:137 (AdaptSplit.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:332 (AbstractInversion.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "input_concatenate_fusion.8", + "ms": 0.0018649875000000028, + "opcode": "fusion", + "shape": "pred[3]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:93", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:93 (split_points_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:410 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + }, + { + "instruction": "input_concatenate_fusion.9", + "ms": 0.0018535937500000009, + "opcode": "fusion", + "shape": "pred[3]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:91", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:91 (split_points_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:410 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + }, + { + "instruction": "input_concatenate_fusion.10", + "ms": 0.0018515874999999982, + "opcode": "fusion", + "shape": "pred[3]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:90", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:90 (split_points_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:410 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + }, + { + "instruction": "input_concatenate_fusion", + "ms": 0.0017653812499999993, + "opcode": "fusion", + "shape": "s32[1500,2]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:615", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:615 (pixel_splitted_regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt_split.py:137 (AdaptSplit.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:332 (AbstractInversion.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "input_concatenate_fusion.11", + "ms": 0.0015515937499999998, + "opcode": "fusion", + "shape": "pred[3]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:88", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:88 (split_points_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:410 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + } + ], + "mesh_locate_walk": [ + { + "instruction": "loop_reduce_fusion", + "ms": 0.025831068749999925, + "opcode": "fusion", + "shape": "(f64[21361]{0}, s64[21361]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:264", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:264 (_walk_from_seed..walk_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:292 (_walk_from_seed..body)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:264 (_walk_from_seed..walk_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:292 (_walk_from_seed..body)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)" + ] + }, + { + "instruction": "input_reduce_fusion.1", + "ms": 0.025124125, + "opcode": "fusion", + "shape": "pred[196]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:288", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:288 (_walk_from_seed..cond)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:353 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)" + ] + }, + { + "instruction": "loop_or_select_fusion", + "ms": 0.02352166874999974, + "opcode": "fusion", + "shape": "(s32[21361]{0}, pred[21361]{0}, pred[21361]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:270", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:270 (_walk_from_seed..walk_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:292 (_walk_from_seed..body)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:353 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)" + ] + }, + { + "instruction": "loop_select_fusion", + "ms": 0.02023009999999994, + "opcode": "fusion", + "shape": "s32[21361]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:242", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:242 (_walk_from_seed..weights_of)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:262 (_walk_from_seed..walk_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:292 (_walk_from_seed..body)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:353 (pix_indexes_delaunay_walk_from)" + ] + }, + { + "instruction": "input_reduce_fusion.2", + "ms": 0.016249318750000123, + "opcode": "fusion", + "shape": "pred[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:288", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:288 (_walk_from_seed..cond)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:353 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)" + ] + }, + { + "instruction": "while.20", + "ms": 0.014592549999999722, + "opcode": "while", + "shape": "(s32[], s32[21361]{0}, pred[21361]{0}, pred[21361]{0}, s32[3000,3]{1,0}, /*index=5*/f64[1500,2]{1,0}, f64[21361,2]{1,0}, s32[3000,3]{1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:353 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "psf_convolution_mapping_matrix": [ + { + "instruction": "input_scatter_fusion", + "ms": 1.9917171125000004, + "opcode": "fusion", + "shape": "f64[1500,180,180]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "fft.19.0", + "ms": 1.7617358500000007, + "opcode": "fft", + "shape": "f64[1500,180,180]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "fft.15.0", + "ms": 1.3688939375000002, + "opcode": "fft", + "shape": "c128[1500,180,91]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "fft.17.0", + "ms": 0.9794694999999998, + "opcode": "fft", + "shape": "c128[1500,91,180]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "input_transpose_fusion.2", + "ms": 0.5134825312500002, + "opcode": "fusion", + "shape": "c128[1500,91,180]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "wrapped_transpose", + "ms": 0.49957474375000005, + "opcode": "fusion", + "shape": "c128[1500,180,91]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + } + ], + "inversion_other": [ + { + "instruction": "cholesky.80", + "ms": 0.8981578250000019, + "opcode": "custom-call", + "shape": "(f64[1500,1500]{0,1}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986 (AbstractInversion._log_det_symmetric_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:1078 (AbstractInversion.log_det_curvature_reg_matrix_term)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:347 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/model/analysis.py:135 (AnalysisImaging.log_likelihood_function)" + ] + }, + { + "instruction": "cholesky.90", + "ms": 0.8934438625000016, + "opcode": "custom-call", + "shape": "(f64[1500,1500]{0,1}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986 (AbstractInversion._log_det_symmetric_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:1157 (AbstractInversion.log_det_regularization_matrix_term)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:348 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/model/analysis.py:135 (AnalysisImaging.log_likelihood_function)" + ] + }, + { + "instruction": "loop_reduce_window_fusion", + "ms": 0.002880768749999993, + "opcode": "fusion", + "shape": "s64[6,16]{1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "loop_reduce_window_fusion.1", + "ms": 0.0027893749999999998, + "opcode": "fusion", + "shape": "s64[94,16]{1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "loop_broadcast_convert_fusion", + "ms": 0.0021827874999999926, + "opcode": "fusion", + "shape": "(s32[1500]{0}, s64[1500]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:527", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:527 (AbstractInversion.zeroed_ids_to_keep)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:567 (AbstractInversion.solve_ids_to_keep)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:684 (AbstractInversion.reconstruction)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "input_scatter_fusion.5", + "ms": 0.0019523937499999978, + "opcode": "fusion", + "shape": "s64[1500]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:527", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:527 (AbstractInversion.zeroed_ids_to_keep)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:567 (AbstractInversion.solve_ids_to_keep)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:684 (AbstractInversion.reconstruction)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "mapping_matrix": [ + { + "instruction": "input_reduce_fusion.23", + "ms": 0.0029050062499999902, + "opcode": "fusion", + "shape": "f64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:93", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:93 (adaptive_pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/abstract.py:507 (Mapper.pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt.py:339 (Adapt.regularization_weights_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt_split.py:120 (AdaptSplit.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)" + ] + } + ], + "curvature_matrix_F": [ + { + "instruction": "cublas-lt-matmul.2", + "ms": 4.24611018125, + "opcode": "custom-call", + "shape": "(f64[1500,1500]{1,0}, s8[4194304]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:134", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:134 (curvature_matrix_via_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:93 (InversionImagingMapping.curvature_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:389 (AbstractInversion.curvature_reg_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "chi_squared_evidence": [ + { + "instruction": "loop_multiply_fusion", + "ms": 0.003007562499999996, + "opcode": "fusion", + "shape": "f64[15361]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/abstract_ndarray.py:300", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/abstract_ndarray.py:300 (AbstractNDArray.__pow__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/abstract_ndarray.py:60 (unwrap_array..wrapper)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/abstract_ndarray.py:35 (to_new_array..wrapper)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_util.py:78 (chi_squared_map_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:78 (AbstractFit.chi_squared_map)" + ] + } + ] + }, + "stage_audit_note": "The HLO instructions that contributed most of each stage's milliseconds, with their full source stack. A stage row is only as good as the rules that built it; this is how a reader checks a row against the HLO instead of trusting it.", + "untraced_wall_ms": 32.3350219937538, + "reconciliation_vs_untraced_pct": -7.586444739322157, + "wall_basis": "wall_ms is the TRACED run's wall, the run these kernel durations came from. untraced_wall_ms is the same executable without the profiler; the difference is the profiler's overhead and belongs in neither the stages nor the idle row.", + "calls": 160, + "call_split": "per-call (first-instruction recurrence)", + "call_blocks": 160, + "events": 73390, + "streams": [ + "Stream #14(MemcpyH2D,Compute,MemcpyD2H,Memset,MemcpyD2D)" + ], + "per_stage_ms": { + "border_relocator": { + "median_ms": 0.101663, + "min_ms": 0.10115000000000002, + "max_ms": 0.10242900000000002 + }, + "chi_squared_evidence": { + "median_ms": 0.003008, + "min_ms": 0.002847, + "max_ms": 0.003327 + }, + "curvature_matrix_F": { + "median_ms": 4.243834, + "min_ms": 4.229319, + "max_ms": 4.339802 + }, + "inversion_other": { + "median_ms": 1.8035354999999997, + "min_ms": 1.7878880000000001, + "max_ms": 1.817648 + }, + "mapping_matrix": { + "median_ms": 0.002912, + "min_ms": 0.002879, + "max_ms": 0.002944 + }, + "memset": { + "median_ms": 0.021216, + "min_ms": 0.010048, + "max_ms": 0.053536000000000014 + }, + "mesh_construction": { + "median_ms": 0.002048, + "min_ms": 0.002048, + "max_ms": 0.00208 + }, + "mesh_locate_walk": { + "median_ms": 0.15049600000000002, + "min_ms": 0.13251100000000002, + "max_ms": 0.18655800000000006 + }, + "mesh_qhull_callback": { + "median_ms": 0.010624, + "min_ms": 0.010527, + "max_ms": 0.011200000000000002 + }, + "mesh_seed_argmin": { + "median_ms": 0.22793350000000012, + "min_ms": 0.22752100000000008, + "max_ms": 0.2283820000000001 + }, + "mixed_fusion": { + "median_ms": 1.994142, + "min_ms": 1.9845259999999998, + "max_ms": 2.0064840000000004 + }, + "other": { + "median_ms": 0.06620799999999999, + "min_ms": 0.06383799999999999, + "max_ms": 0.07071899999999999 + }, + "pdip_solve": { + "median_ms": 7.627229, + "min_ms": 2.4333360000000006, + "max_ms": 23.172370000000008 + }, + "psf_convolution_mapping_matrix": { + "median_ms": 7.1153775, + "min_ms": 7.102593000000001, + "max_ms": 7.125762 + }, + "regularization_H": { + "median_ms": 0.010944, + "min_ms": 0.01088, + "max_ms": 0.01136 + } + }, + "stage_order": [ + "border_relocator", + "mesh_qhull_callback", + "mesh_seed_argmin", + "mesh_locate_walk", + "mesh_construction", + "mapping_matrix", + "psf_convolution_mapping_matrix", + "curvature_matrix_F", + "regularization_H", + "pdip_solve", + "chi_squared_evidence", + "inversion_other", + "mixed_fusion", + "other", + "memset" + ], + "mixed_fusion": { + "ms": 1.994142, + "constituent_stage_sets": { + "curvature_matrix_F + psf_convolution_mapping_matrix": 1.0222060687499999, + "pdip_solve + psf_convolution_mapping_matrix": 0.227287425, + "data_vector_D + pdip_solve": 0.1254148375, + "mapped_reconstruction + pdip_solve": 0.11514451250000009, + "mapping_matrix + pdip_solve": 0.11348248124999995, + "curvature_reg_reduce_gather + inversion_other + mapped_reconstruction + pdip_solve + reconstruction_scatter": 0.11002071875, + "pdip_solve + regularization_H": 0.045843649999999965, + "inversion_other + pdip_solve + regularization_H": 0.024280893750000008, + "inversion_other + pdip_solve": 0.023086343750000037, + "inversion_other + mapping_matrix + mesh_construction + mesh_dual_areas + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin + pdip_solve": 0.021611925000000008, + "inversion_other + mesh_construction + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin + pdip_solve + regularization_H": 0.019178118750000007, + "inversion_other + mesh_construction + mesh_dual_areas + mesh_interpolation_weights + pdip_solve + regularization_H": 0.014693356249999994, + "pdip_solve + ray_trace_data_grid": 0.013694924999999908, + "border_relocator + pdip_solve": 0.013572524999999964, + "inversion_other + mapping_matrix + mesh_construction + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin": 0.011665712499999996, + "grids_and_structures + mass_profile_deflections + pdip_solve": 0.010259375000000001, + "grids_and_structures + mass_profile_deflections + pdip_solve + ray_trace_data_grid": 0.0090448, + "chi_squared_evidence + pdip_solve": 0.0077099625000000005, + "inversion_other + mesh_construction + mesh_seed_argmin + pdip_solve + regularization_H": 0.0071267625000000015, + "inversion_other + mesh_dual_areas + mesh_locate_walk": 0.006757962499999999, + "inversion_other + mesh_construction + pdip_solve + regularization_H": 0.0065437687499999946, + "grids_and_structures + mass_profile_deflections + ray_trace_data_grid": 0.005568593749999997, + "inversion_other + pdip_solve + ray_trace_data_grid": 0.005387374999999999, + "inversion_other + regularization_H": 0.005236981249999982, + "inversion_other + mapped_reconstruction + pdip_solve + reconstruction_scatter": 0.004933956250000004, + "inversion_other + mapped_reconstruction + pdip_solve": 0.0038193812499999987, + "mapping_matrix + pdip_solve + regularization_H": 0.003507181250000001, + "inversion_other + mesh_construction + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin": 0.0031795812499999985, + "inversion_other + mesh_construction + mesh_dual_areas + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin": 0.00298280625, + "inversion_other + mesh_construction + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin + regularization_H": 0.002733193750000008, + "inversion_other + mesh_dual_areas + mesh_locate_walk + pdip_solve": 0.0026055750000000054, + "inversion_other + mesh_locate_walk + mesh_seed_argmin": 0.0025223999999999963, + "inversion_other + mesh_interpolation_weights": 0.0021609937500000013, + "chi_squared_evidence + inversion_other": 0.0019507687500000025 + }, + "example_kernels": { + "curvature_matrix_F + psf_convolution_mapping_matrix": [ + "loop_divide_gather_fusion" + ], + "pdip_solve + psf_convolution_mapping_matrix": [ + "loop_broadcast_fusion.4" + ], + "data_vector_D + pdip_solve": [ + "input_reduce_fusion.5", + "input_reduce_fusion.21" + ], + "mapped_reconstruction + pdip_solve": [ + "input_reduce_fusion.9" + ], + "mapping_matrix + pdip_solve": [ + "loop_broadcast_fusion.2", + "loop_divide_fusion" + ], + "curvature_reg_reduce_gather + inversion_other + mapped_reconstruction + pdip_solve + reconstruction_scatter": [ + "input_multiply_transpose_fusion" + ], + "pdip_solve + regularization_H": [ + "loop_select_fusion.2", + "input_transpose_fusion.3" + ], + "inversion_other + pdip_solve + regularization_H": [ + "input_transpose_fusion.4" + ], + "inversion_other + pdip_solve": [ + "input_reduce_fusion.7", + "loop_log_fusion", + "input_reduce_fusion.8", + "input_reduce_fusion.12" + ], + "inversion_other + mapping_matrix + mesh_construction + mesh_dual_areas + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin + pdip_solve": [ + "input_scatter_fusion.6", + "input_scatter_fusion.3" + ] + }, + "prorated_estimate_ms": { + "psf_convolution_mapping_matrix": 0.6247467468749999, + "curvature_matrix_F": 0.5111030343749999, + "pdip_solve": 0.39547136916666653, + "mapped_reconstruction": 0.08208301614583338, + "inversion_other": 0.06884685208333335, + "data_vector_D": 0.06270741875, + "mapping_matrix": 0.06255607708333331, + "regularization_H": 0.043508458229166644, + "reconstruction_scatter": 0.023237632812500002, + "curvature_reg_reduce_gather": 0.02200414375, + "mesh_construction": 0.014484277604166668, + "ray_trace_data_grid": 0.012760652083333286, + "mesh_locate_walk": 0.012718938125000002, + "mesh_interpolation_weights": 0.012503479791666671, + "mesh_seed_argmin": 0.011240242708333337, + "mesh_dual_areas": 0.008551565625, + "grids_and_structures": 0.007537189583333333, + "mass_profile_deflections": 0.007537189583333333, + "border_relocator": 0.006786262499999982, + "chi_squared_evidence": 0.004830365625000001 + }, + "prorated_note": "ESTIMATE ONLY \u2014 a mixed fusion's time split equally across the stages its constituents span. Never summed into the measured table, never reconciled." + }, + "other_sources_ms": { + "copy.80": 0.0421512312500022, + "copy.48": 0.016989462500000115, + "copy.53": 0.0019827937500000005, + "copy.79": 0.0017985875000000005, + "copy.78": 0.0017723812499999992, + "copy.39": 0.0016623937499999995 + }, + "device_span_ms": 33.28327708125, + "device_busy_ms": 26.782504162499997, + "device_idle_ms": 6.500772918750002, + "largest_idle_gaps": [ + { + "gap_ms": 5.438192, + "after": "pure_callback.4", + "before": "pure_callback.4" + }, + { + "gap_ms": 0.037408, + "after": "while.26", + "before": "input_reduce_select_fusion" + }, + { + "gap_ms": 0.033759, + "after": "pure_callback.4", + "before": "copy.79" + }, + { + "gap_ms": 0.031871, + "after": "copy.48", + "before": "input_reduce_fusion.1" + }, + { + "gap_ms": 0.02832, + "after": "pure_callback.4", + "before": "pure_callback.4" + }, + { + "gap_ms": 0.027456, + "after": "input_concatenate_fusion.7", + "before": "pure_callback.4" + }, + { + "gap_ms": 0.022272, + "after": "input_reduce_fusion.20", + "before": "loop_broadcast_fusion.4" + }, + { + "gap_ms": 0.021504, + "after": "loop_select_fusion", + "before": "loop_reduce_fusion" + } + ], + "kernel_ms": 23.3811705, + "sum_ms": 29.88194341875, + "wall_ms": 33.28910491250099, + "host_outside_span_ms": 0.0058278312509898456, + "reconciliation_pct": -10.23506490398756, + "unjoined_ms": 0.0, + "unjoined_pct": 0.0, + "other_ms": 0.06620799999999999, + "other_pct": 0.19888789492545664, + "note": "Stage rows attribute the command-buffers-OFF program (see the module docstring): kernel times are the same, the launch overhead the CUDA graphs remove is not. sum_ms = kernel rows + device_idle_ms; the residual against wall_ms is host_outside_span_ms (dispatch before the first kernel, teardown after the last).", + "per_stage_ms_per_lane": { + "border_relocator": 0.101663, + "chi_squared_evidence": 0.003008, + "curvature_matrix_F": 4.243834, + "inversion_other": 1.8035354999999997, + "mapping_matrix": 0.002912, + "memset": 0.021216, + "mesh_construction": 0.002048, + "mesh_locate_walk": 0.15049600000000002, + "mesh_qhull_callback": 0.010624, + "mesh_seed_argmin": 0.22793350000000012, + "mixed_fusion": 1.994142, + "other": 0.06620799999999999, + "pdip_solve": 7.627229, + "psf_convolution_mapping_matrix": 7.1153775, + "regularization_H": 0.010944 + }, + "per_lane_divisor": 1, + "host_callback": { + "pure_callback_span_ms": 79.30217320000008, + "qhull_ms": 73.9355556, + "callback_body_ms_note": "the OUTERMOST matching body event, not a sum: under the probe the body appears twice (the wrapper and the timed re-implementation it calls) and summing them would count the same work twice", + "events_by_name": { + "pure_callback.4": { + "count": 160, + "ms": 79.30217320000008 + }, + "$callback.py:815 _wrapped_callback": { + "count": 160, + "ms": 77.91111580000002 + }, + "$callback.py:224 _callback": { + "count": 160, + "ms": 77.5358856 + }, + "$callback.py:74 pure_callback_impl": { + "count": 160, + "ms": 77.40016880000003 + }, + "$callback.py:69 __call__": { + "count": 160, + "ms": 74.17798120000002 + }, + "$delaunay.py:162 ": { + "count": 160, + "ms": 74.07748219999998 + }, + "$host_callback_probe.py:225 wrapped": { + "count": 160, + "ms": 73.9355556 + }, + "$host_callback_probe.py:160 _timed_tri_only": { + "count": 160, + "ms": 73.80817850000001 + }, + "ThenExecuteCallback:GetEventForComputeStreamSyncPoint": { + "count": 160, + "ms": 0.28706550000000003 + }, + "$callback.py:822 ": { + "count": 640, + "ms": 0.23090409999999956 + }, + "$__init__.py:132 _xla_gc_callback": { + "count": 2, + "ms": 0.00037200000000000004 + } + }, + "note": "HOST milliseconds per traced BATCH (the whole invocation), aggregated by name because the events nest. Not a row of the device table: the device pays for them as the idle gaps largest_idle_gaps names." + }, + "host_callback_ms": 79.30217320000008 + }, + "hlo_census": { + "status": "excluded", + "reason": "The legacy census anchors PyAutoArray source line numbers that moved after the phase-1 run. No batched attribution is published from unsupported anchors; the device-event table and wall reconciliation remain valid." + }, + "stage_map_provenance": [ + { + "label": "log_det_curvature_reg", + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 850, + 882 + ], + "requires": { + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 884, + 896 + ] + }, + "function": null + }, + { + "label": "log_det_regularization", + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 850, + 882 + ], + "requires": { + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 897, + 943 + ] + }, + "function": null + }, + { + "label": "curvature_reg_add", + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 359, + 372 + ], + "requires": null, + "function": null + }, + { + "label": "curvature_reg_reduce_gather", + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 374, + 398 + ], + "requires": null, + "function": null + }, + { + "label": "edge_subset_gather", + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 606, + 614 + ], + "requires": null, + "function": null + }, + { + "label": "regularization_term", + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 786, + 849 + ], + "requires": null, + "function": null + }, + { + "label": "mapped_reconstruction", + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 722, + 785 + ], + "requires": null, + "function": null + }, + { + "label": "reconstruction_scatter", + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 583, + 605 + ], + "requires": null, + "function": null + }, + { + "label": "reconstruction_scatter", + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 615, + 721 + ], + "requires": null, + "function": null + }, + { + "label": "certified_active_set_solve", + "path": "likelihood_breakdown/active_set_steps.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "certified_active_set_solve", + "path": "likelihood_breakdown/library_solver_injection.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "pdip_solve", + "path": "PyAutoArray/autoarray/util/jax_nnls.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "pdip_solve", + "path": "PyAutoArray/autoarray/inversion/inversion/inversion_util.py", + "lines": [ + 256, + 488 + ], + "requires": null, + "function": null + }, + { + "label": "mapped_reconstruction", + "path": "PyAutoArray/autoarray/inversion/inversion/inversion_util.py", + "lines": [ + 156, + 200 + ], + "requires": null, + "function": null + }, + { + "label": "curvature_matrix_F", + "path": "PyAutoArray/autoarray/inversion/inversion/inversion_util.py", + "lines": [ + 12, + 155 + ], + "requires": null, + "function": null + }, + { + "label": "reconstruction_scatter", + "path": "PyAutoArray/autoarray/inversion/inversion/inversion_util.py", + "lines": [ + 201, + 255 + ], + "requires": null, + "function": null + }, + { + "label": "data_vector_D", + "path": "PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py", + "lines": [ + 54, + 73 + ], + "requires": null, + "function": null + }, + { + "label": "curvature_matrix_F", + "path": "PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py", + "lines": [ + 74, + 110 + ], + "requires": null, + "function": null + }, + { + "label": "data_vector_D", + "path": "PyAutoArray/autoarray/inversion/inversion/imaging/inversion_imaging_util.py", + "lines": null, + "requires": null, + "function": "data_vector_via_blurred_mapping_matrix_from" + }, + { + "label": "curvature_matrix_F", + "path": "PyAutoArray/autoarray/inversion/inversion/imaging/inversion_imaging_util.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "psf_convolution_mapping_matrix", + "path": "likelihood_breakdown/psf_cube_injection.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "psf_convolution_mapping_matrix", + "path": "PyAutoArray/autoarray/operators/convolver.py", + "lines": [ + 1086, + 1300 + ], + "requires": null, + "function": null + }, + { + "label": "psf_convolution_mapping_matrix", + "path": "PyAutoArray/autoarray/operators/convolver.py", + "lines": [ + 632, + 642 + ], + "requires": null, + "function": null + }, + { + "label": "psf_convolution_mapping_matrix", + "path": "PyAutoArray/autoarray/operators/convolver.py", + "lines": [ + 670, + 691 + ], + "requires": null, + "function": null + }, + { + "label": "psf_convolution_mapping_matrix", + "path": "PyAutoArray/autoarray/operators/convolver.py", + "lines": null, + "requires": { + "path": "PyAutoArray/autoarray/operators/convolver.py", + "lines": [ + 1086, + 1300 + ] + }, + "function": null + }, + { + "label": "psf_convolution_mapping_matrix", + "path": "PyAutoArray/autoarray/operators/convolver.py", + "lines": null, + "requires": { + "path": "PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py", + "lines": [ + 119, + 150 + ] + }, + "function": null + }, + { + "label": "psf_convolution_image", + "path": "PyAutoArray/autoarray/operators/convolver.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "psf_convolution_mapping_matrix", + "path": "PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py", + "lines": [ + 119, + 150 + ], + "requires": null, + "function": null + }, + { + "label": "mesh_qhull_callback", + "path": "PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py", + "lines": [ + 139, + 172 + ], + "requires": null, + "function": null + }, + { + "label": "mesh_seed_argmin", + "path": "PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py", + "lines": [ + 173, + 207 + ], + "requires": null, + "function": null + }, + { + "label": "mesh_locate_walk", + "path": "PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py", + "lines": [ + 208, + 372 + ], + "requires": null, + "function": null + }, + { + "label": "mesh_dual_areas", + "path": "PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py", + "lines": [ + 373, + 396 + ], + "requires": null, + "function": null + }, + { + "label": "mesh_dual_areas", + "path": "PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py", + "lines": [ + 437, + 494 + ], + "requires": null, + "function": null + }, + { + "label": "mesh_dual_areas", + "path": "PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py", + "lines": [ + 605, + 615 + ], + "requires": null, + "function": null + }, + { + "label": "mesh_interpolation_weights", + "path": "PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py", + "lines": [ + 616, + 695 + ], + "requires": null, + "function": null + }, + { + "label": "mesh_interpolation_weights", + "path": "PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py", + "lines": [ + 896, + 1000 + ], + "requires": null, + "function": null + }, + { + "label": "mesh_construction", + "path": "PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "border_relocator", + "path": "PyAutoArray/autoarray/inversion/mesh/border_relocator.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "mesh_construction", + "path": "PyAutoArray/autoarray/inversion/mesh/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "mapping_matrix", + "path": "PyAutoArray/autoarray/inversion/mappers/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "mapping_matrix", + "path": "PyAutoArray/autoarray/inversion/mappings/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "mapping_matrix", + "path": "PyAutoArray/autoarray/inversion/linear_obj/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "regularization_H", + "path": "PyAutoArray/autoarray/inversion/regularization/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "chi_squared_evidence", + "path": "PyAutoArray/autoarray/fit/fit_util.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "chi_squared_evidence", + "path": "PyAutoArray/autoarray/fit/fit_dataset.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "ray_trace_mesh_grid", + "path": "PyAutoLens/autolens/lens/to_inversion.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "ray_trace_mesh_grid", + "path": "PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "mass_profile_deflections", + "path": "PyAutoGalaxy/autogalaxy/profiles/mass/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "light_profile_image", + "path": "PyAutoGalaxy/autogalaxy/profiles/light/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "light_profile_image", + "path": "PyAutoGalaxy/autogalaxy/operate/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "ray_trace_data_grid", + "path": "PyAutoLens/autolens/lens/tracer.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "ray_trace_data_grid", + "path": "PyAutoLens/autolens/lens/tracer_util.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "grids_and_structures", + "path": "PyAutoArray/autoarray/structures/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "grids_and_structures", + "path": "PyAutoArray/autoarray/operators/over_sampling/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "grids_and_structures", + "path": "PyAutoArray/autoarray/geometry/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "inversion_other", + "path": "PyAutoArray/autoarray/inversion/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "fit_imaging_other", + "path": "PyAutoLens/autolens/imaging/fit_imaging.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "fit_imaging_other", + "path": "PyAutoGalaxy/autogalaxy/imaging/fit_imaging.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "fit_imaging_other", + "path": "PyAutoArray/autoarray/fit/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "analysis_other", + "path": "PyAutoLens/autolens/analysis/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "analysis_other", + "path": "PyAutoGalaxy/autogalaxy/analysis/", + "lines": null, + "requires": null, + "function": null + } + ], + "trace_timing": { + "traced_wall_ms": 33.28910491250099, + "untraced_wall_ms": 32.3350219937538, + "profiler_overhead_ms": 0.95408291874719, + "profiler_overhead_pct": 2.9506178128825504 + }, + "jit_phases": { + "b_s3_pdip_library_likelihood_jit": { + "lower_s": 1.6830586639989633, + "compile_s": 4.533538052000949, + "first_call_s": 1.9401397229994473, + "steady_per_call_s": 0.05084607630014944 + }, + "d_s3_certified_fallback_library_likelihood_jit": { + "lower_s": 0.46720191499844077, + "compile_s": 4.444933192997269, + "first_call_s": 0.04616038799940725, + "steady_per_call_s": 0.0316707824000332 + } + }, + "peak_bytes": { + "after_setup": 85108992, + "after_routes": 1181653248, + "after_all": 18893188096, + "note": "jax.devices()[0].memory_stats()['peak_bytes_in_use']; None on a backend that does not report it (CPU). Process-wide high-water marks." + }, + "note": "Every stage row is a MEASURED sum of GPU kernel durations joined to library source through the optimized HLO of ONE program \u2014 not arithmetic across compilations. The rows attribute the command-buffers-OFF program: kernel time is the same as production, the launch overhead the CUDA graphs remove is not, and command_buffers.* carries both walls and their delta. sum_ms = kernel rows + measured device_idle_ms; the residual against the wall is host_outside_span_ms and is reported, not absorbed. mixed_fusion.prorated_estimate_ms is an ESTIMATE and is never part of the table. No row may be quoted if reconciliation_pct is outside 5 % or unjoined_ms is non-zero.", + "vmap": { + "batch": 16, + "lanes_mode": "captured", + "arms": [ + "vmap", + "scalar" + ], + "draw_seed": 0, + "fallback": false, + "composition": "jax.jit(jax.vmap(fn))", + "composition_provenance": "Current Fitness._vmap after PyAutoFit#1638. Array 343376 used the retired jax.vmap(jax.jit(fn)) composition and is historical evidence only.", + "headline_arm": "scalar", + "lane_rtol": 1e-09, + "lanes": [ + { + "lane": 0, + "draw_name": "call00015_lane00", + "draw_kind": "captured", + "offsets": { + "centre_0": -0.0033655095107821688, + "centre_1": 0.004631951955766499, + "ell_comps_0": 0.000564301988937442, + "ell_comps_1": -0.00879076787683888, + "einstein_radius": 0.018337010967920175 + }, + "log_likelihood_vmap": 24758.506194309342, + "log_likelihood_scalar": 24758.506194309342, + "log_likelihood_library_pdip": 24758.50619430915, + "log_likelihood_library_pdip_scalar": 24758.50619430915, + "rel_diff_vmap_vs_library_pdip": 7.787742736279448e-15, + "rel_diff_scalar_vs_library_pdip_scalar": 7.787742736279448e-15, + "abs_diff_nats": 0.0, + "rel_diff": 0.0, + "rel_diff_scalar_vs_library_pdip": 7.787742736279448e-15, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 0.0, + "rel_diff_library_pdip_vmap_vs_scalar": 0.0, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": true, + "passes": 10, + "pdip_iter": null + }, + { + "lane": 1, + "draw_name": "call00015_lane01", + "draw_kind": "captured", + "offsets": { + "centre_0": -0.004311760382151672, + "centre_1": 0.0027192789928108052, + "ell_comps_0": 0.0061667694809026535, + "ell_comps_1": 0.003465536775180321, + "einstein_radius": -0.05732579988501185 + }, + "log_likelihood_vmap": 20552.706459416033, + "log_likelihood_scalar": 20552.706459416, + "log_likelihood_library_pdip": 20551.004887772695, + "log_likelihood_library_pdip_scalar": 20551.004887771654, + "rel_diff_vmap_vs_library_pdip": 8.279749105360521e-05, + "rel_diff_scalar_vs_library_pdip_scalar": 8.279749110264447e-05, + "abs_diff_nats": 3.2741809263825417e-11, + "rel_diff": 1.5930655813373479e-15, + "rel_diff_scalar_vs_library_pdip": 8.279749105201201e-05, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 1.04046193882823e-09, + "rel_diff_library_pdip_vmap_vs_scalar": 5.0628275576311595e-14, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "FAIL", + "certified": false, + "passes": 16, + "pdip_iter": null + }, + { + "lane": 2, + "draw_name": "call00015_lane02", + "draw_kind": "captured", + "offsets": { + "centre_0": 0.0002796502552123051, + "centre_1": 0.0016003321376979894, + "ell_comps_0": -0.002094430657472772, + "ell_comps_1": 0.006146479068253558, + "einstein_radius": -0.025968910196758177 + }, + "log_likelihood_vmap": -189709.69679849414, + "log_likelihood_scalar": -189709.06724982796, + "log_likelihood_library_pdip": -189709.91637924482, + "log_likelihood_library_pdip_scalar": -189709.0207892346, + "rel_diff_vmap_vs_library_pdip": 1.1574553131984852e-06, + "rel_diff_scalar_vs_library_pdip_scalar": 2.449045024786232e-07, + "abs_diff_nats": 0.6295486661838368, + "rel_diff": 3.318495395661736e-06, + "rel_diff_scalar_vs_library_pdip": 4.4759358554876936e-06, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 0.8955900102155283, + "rel_diff_library_pdip_vmap_vs_scalar": 4.720861488239521e-06, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "FAIL", + "certified": true, + "passes": 0, + "pdip_iter": null + }, + { + "lane": 3, + "draw_name": "call00015_lane03", + "draw_kind": "captured", + "offsets": { + "centre_0": 0.004594602299816973, + "centre_1": 0.004924922434755804, + "ell_comps_0": 0.028601845732661953, + "ell_comps_1": 0.003760187047606014, + "einstein_radius": -0.03088526730480501 + }, + "log_likelihood_vmap": -141741.97933878313, + "log_likelihood_scalar": -141741.96673248586, + "log_likelihood_library_pdip": -141741.97793200478, + "log_likelihood_library_pdip_scalar": -141741.9662947005, + "rel_diff_vmap_vs_library_pdip": 9.924923929625508e-09, + "rel_diff_scalar_vs_library_pdip_scalar": 3.0886078336726387e-09, + "abs_diff_nats": 0.012606297270394862, + "rel_diff": 8.893835439850449e-08, + "rel_diff_scalar_vs_library_pdip": 7.901342344155513e-08, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 0.011637304269243032, + "rel_diff_library_pdip_vmap_vs_scalar": 8.210203776239084e-08, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "FAIL", + "certified": true, + "passes": 0, + "pdip_iter": null + }, + { + "lane": 4, + "draw_name": "call00015_lane04", + "draw_kind": "captured", + "offsets": { + "centre_0": -0.0060950290987001, + "centre_1": -0.0006121094560707545, + "ell_comps_0": 0.009637314264800585, + "ell_comps_1": 0.006641580028105454, + "einstein_radius": -0.03125810931551931 + }, + "log_likelihood_vmap": 24880.545932988694, + "log_likelihood_scalar": 24880.545932988716, + "log_likelihood_library_pdip": 24880.54593298869, + "log_likelihood_library_pdip_scalar": 24880.54593298872, + "rel_diff_vmap_vs_library_pdip": 1.4621780474150203e-16, + "rel_diff_scalar_vs_library_pdip_scalar": 1.4621780474150186e-16, + "abs_diff_nats": 2.1827872842550278e-11, + "rel_diff": 8.773068284490113e-16, + "rel_diff_scalar_vs_library_pdip": 1.0235246331905143e-15, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 2.9103830456733704e-11, + "rel_diff_library_pdip_vmap_vs_scalar": 1.1697424379320148e-15, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": true, + "passes": 10, + "pdip_iter": null + }, + { + "lane": 5, + "draw_name": "call00015_lane05", + "draw_kind": "captured", + "offsets": { + "centre_0": -0.008435952123169364, + "centre_1": -0.007849511137408794, + "ell_comps_0": -0.01598149485178925, + "ell_comps_1": 0.01654417876136871, + "einstein_radius": 0.014294380855379263 + }, + "log_likelihood_vmap": 25472.519186595913, + "log_likelihood_scalar": 25472.519186791294, + "log_likelihood_library_pdip": 25472.51918661041, + "log_likelihood_library_pdip_scalar": 25472.519186758924, + "rel_diff_vmap_vs_library_pdip": 5.691367014017594e-13, + "rel_diff_scalar_vs_library_pdip_scalar": 1.270810130249267e-12, + "abs_diff_nats": 1.9538128981366754e-07, + "rel_diff": 7.670277461798203e-12, + "rel_diff_scalar_vs_library_pdip": 7.10114076045091e-12, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 1.48513208841905e-07, + "rel_diff_library_pdip_vmap_vs_scalar": 5.830330630160241e-12, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": true, + "passes": 4, + "pdip_iter": null + }, + { + "lane": 6, + "draw_name": "call00015_lane06", + "draw_kind": "captured", + "offsets": { + "centre_0": 0.0031698313356290646, + "centre_1": -0.0038584140676992847, + "ell_comps_0": 0.01810147576636289, + "ell_comps_1": -0.011577480306416508, + "einstein_radius": 0.016136835525067283 + }, + "log_likelihood_vmap": -83383.91629657254, + "log_likelihood_scalar": -83383.9155206514, + "log_likelihood_library_pdip": -83383.91628258814, + "log_likelihood_library_pdip_scalar": -83383.91548171044, + "rel_diff_vmap_vs_library_pdip": 1.6771106119533433e-10, + "rel_diff_scalar_vs_library_pdip_scalar": 4.670079838536909e-10, + "abs_diff_nats": 0.0007759211439406499, + "rel_diff": 9.305405474134641e-09, + "rel_diff_scalar_vs_library_pdip": 9.137694327909356e-09, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 0.0008008776931092143, + "rel_diff_library_pdip_vmap_vs_scalar": 9.60470239952788e-09, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": true, + "passes": 0, + "pdip_iter": null + }, + { + "lane": 7, + "draw_name": "call00015_lane07", + "draw_kind": "captured", + "offsets": { + "centre_0": 0.006158729760195174, + "centre_1": 0.004883559265258847, + "ell_comps_0": 0.007613883677130215, + "ell_comps_1": -0.005800175617006949, + "einstein_radius": 0.0662922007765554 + }, + "log_likelihood_vmap": -11960.284433550274, + "log_likelihood_scalar": -11960.284430311229, + "log_likelihood_library_pdip": -11960.284432913264, + "log_likelihood_library_pdip_scalar": -11960.284430044325, + "rel_diff_vmap_vs_library_pdip": 5.326044649647159e-11, + "rel_diff_scalar_vs_library_pdip_scalar": 2.2315853332937958e-11, + "abs_diff_nats": 3.23904532706365e-06, + "rel_diff": 2.708167473722332e-10, + "rel_diff_scalar_vs_library_pdip": 2.175563008168437e-10, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 2.8689391911029816e-06, + "rel_diff_library_pdip_vmap_vs_scalar": 2.398721542019674e-10, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": true, + "passes": 1, + "pdip_iter": null + }, + { + "lane": 8, + "draw_name": "call00015_lane08", + "draw_kind": "captured", + "offsets": { + "centre_0": 0.0030335293924908615, + "centre_1": 0.0012117081273721316, + "ell_comps_0": 0.0008852687687036301, + "ell_comps_1": -0.0027113633212058814, + "einstein_radius": -0.03873713959923952 + }, + "log_likelihood_vmap": 23223.5503914129, + "log_likelihood_scalar": 23223.550391490582, + "log_likelihood_library_pdip": 23223.550391423054, + "log_likelihood_library_pdip_scalar": 23223.55039148498, + "rel_diff_vmap_vs_library_pdip": 4.372113083253157e-13, + "rel_diff_scalar_vs_library_pdip_scalar": 2.412416391326373e-13, + "abs_diff_nats": 7.768176146782935e-08, + "rel_diff": 3.3449563119467287e-12, + "rel_diff_scalar_vs_library_pdip": 2.9077450036311395e-12, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 6.192567525431514e-08, + "rel_diff_library_pdip_vmap_vs_scalar": 2.6665033644907486e-12, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": true, + "passes": 4, + "pdip_iter": null + }, + { + "lane": 9, + "draw_name": "call00015_lane09", + "draw_kind": "captured", + "offsets": { + "centre_0": -0.0008035510098975272, + "centre_1": 0.005559773241319952, + "ell_comps_0": -0.003701655436278317, + "ell_comps_1": -0.012378591445614512, + "einstein_radius": 0.032284336889985665 + }, + "log_likelihood_vmap": -177119.01437774638, + "log_likelihood_scalar": -177117.76756649266, + "log_likelihood_library_pdip": -177119.3219600775, + "log_likelihood_library_pdip_scalar": -177117.7818270842, + "rel_diff_vmap_vs_library_pdip": 1.7365825914360673e-06, + "rel_diff_scalar_vs_library_pdip_scalar": 8.051473649077384e-08, + "abs_diff_nats": 1.2468112537171692, + "rel_diff": 7.039447655916832e-06, + "rel_diff_scalar_vs_library_pdip": 8.77596846938223e-06, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 1.5401329933083616, + "rel_diff_library_pdip_vmap_vs_scalar": 8.695530044588951e-06, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "FAIL", + "certified": true, + "passes": 0, + "pdip_iter": null + }, + { + "lane": 10, + "draw_name": "call00015_lane10", + "draw_kind": "captured", + "offsets": { + "centre_0": -0.008473569241265282, + "centre_1": -0.0051993251621340235, + "ell_comps_0": -0.0031466996514049606, + "ell_comps_1": -0.0076036423480284636, + "einstein_radius": 0.08283321334626792 + }, + "log_likelihood_vmap": -101745.38550684515, + "log_likelihood_scalar": -101745.38354083074, + "log_likelihood_library_pdip": -101745.38534975679, + "log_likelihood_library_pdip_scalar": -101745.38330068295, + "rel_diff_vmap_vs_library_pdip": 1.5439359820366783e-09, + "rel_diff_scalar_vs_library_pdip_scalar": 2.3602818663373926e-09, + "abs_diff_nats": 0.001966014417121187, + "rel_diff": 1.9322885704511786e-08, + "rel_diff_scalar_vs_library_pdip": 1.77789493789345e-08, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 0.002049073838861659, + "rel_diff_library_pdip_vmap_vs_scalar": 2.0139231603326272e-08, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "FAIL", + "certified": true, + "passes": 2, + "pdip_iter": null + }, + { + "lane": 11, + "draw_name": "call00015_lane11", + "draw_kind": "captured", + "offsets": { + "centre_0": 0.001017060353322001, + "centre_1": 0.003035861051809724, + "ell_comps_0": 0.0014054844842678396, + "ell_comps_1": -0.00019678252877009805, + "einstein_radius": -0.04179610309843307 + }, + "log_likelihood_vmap": 18959.672781158773, + "log_likelihood_scalar": 18959.672780967318, + "log_likelihood_library_pdip": 18957.528349914453, + "log_likelihood_library_pdip_scalar": 18957.528349734202, + "rel_diff_vmap_vs_library_pdip": 0.00011311765989418553, + "rel_diff_scalar_vs_library_pdip_scalar": 0.00011311765930420434, + "abs_diff_nats": 1.9145591068081558e-07, + "rel_diff": 1.00980598606643e-11, + "rel_diff_scalar_vs_library_pdip": 0.0001131176497949834, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 1.802509359549731e-07, + "rel_diff_library_pdip_vmap_vs_scalar": 9.508145399001887e-12, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "FAIL", + "certified": false, + "passes": 16, + "pdip_iter": null + }, + { + "lane": 12, + "draw_name": "call00015_lane12", + "draw_kind": "captured", + "offsets": { + "centre_0": -0.0012508260776529923, + "centre_1": -0.0075763258203543175, + "ell_comps_0": -0.0003476568325791879, + "ell_comps_1": 0.0070528223693464365, + "einstein_radius": -0.005182936058341969 + }, + "log_likelihood_vmap": 24810.049660195124, + "log_likelihood_scalar": 24810.049660195124, + "log_likelihood_library_pdip": 24810.049660194894, + "log_likelihood_library_pdip_scalar": 24810.049660194898, + "rel_diff_vmap_vs_library_pdip": 9.237896255181357e-15, + "rel_diff_scalar_vs_library_pdip_scalar": 9.091262981289588e-15, + "abs_diff_nats": 0.0, + "rel_diff": 0.0, + "rel_diff_scalar_vs_library_pdip": 9.237896255181357e-15, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 3.637978807091713e-12, + "rel_diff_library_pdip_vmap_vs_scalar": 1.4663327389176755e-16, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": true, + "passes": 9, + "pdip_iter": null + }, + { + "lane": 13, + "draw_name": "call00015_lane13", + "draw_kind": "captured", + "offsets": { + "centre_0": 0.0039046265841316857, + "centre_1": 0.008586063066835778, + "ell_comps_0": 0.01612319103606081, + "ell_comps_1": -0.006478405394829051, + "einstein_radius": -0.06420305523683667 + }, + "log_likelihood_vmap": -3605.706216745806, + "log_likelihood_scalar": -3605.7062159467096, + "log_likelihood_library_pdip": -3605.70621669307, + "log_likelihood_library_pdip_scalar": -3605.7062161423455, + "rel_diff_vmap_vs_library_pdip": 1.4625745309879346e-11, + "rel_diff_scalar_vs_library_pdip_scalar": 5.4257317874186085e-11, + "abs_diff_nats": 7.990965968929231e-07, + "rel_diff": 2.2161999592723706e-10, + "rel_diff_scalar_vs_library_pdip": 2.0699425057148364e-10, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 5.507245077751577e-07, + "rel_diff_library_pdip_vmap_vs_scalar": 1.5273693272891323e-10, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": true, + "passes": 2, + "pdip_iter": null + }, + { + "lane": 14, + "draw_name": "call00015_lane14", + "draw_kind": "captured", + "offsets": { + "centre_0": 0.007195835212073937, + "centre_1": -0.0022675171274400335, + "ell_comps_0": 0.004220685262914858, + "ell_comps_1": 0.006581974817750368, + "einstein_radius": 0.08589577997501685 + }, + "log_likelihood_vmap": 11129.438563023064, + "log_likelihood_scalar": 11129.43856306804, + "log_likelihood_library_pdip": 11126.921475740783, + "log_likelihood_library_pdip_scalar": 11126.921475785763, + "rel_diff_vmap_vs_library_pdip": 0.00022621596528470933, + "rel_diff_scalar_vs_library_pdip_scalar": 0.00022621596528346792, + "abs_diff_nats": 4.497633199207485e-08, + "rel_diff": 4.041204031740148e-12, + "rel_diff_scalar_vs_library_pdip": 0.00022621596932682756, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 4.497996997088194e-08, + "rel_diff_library_pdip_vmap_vs_scalar": 4.0424451694717775e-12, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "FAIL", + "certified": false, + "passes": 16, + "pdip_iter": null + }, + { + "lane": 15, + "draw_name": "call00015_lane15", + "draw_kind": "captured", + "offsets": { + "centre_0": 0.0024446743118905125, + "centre_1": 0.0028324231769206983, + "ell_comps_0": -0.017159158004659933, + "ell_comps_1": 0.008265799441903459, + "einstein_radius": -0.03860302877433641 + }, + "log_likelihood_vmap": 20407.78065499728, + "log_likelihood_scalar": 20407.780654983006, + "log_likelihood_library_pdip": 20410.34397373395, + "log_likelihood_library_pdip_scalar": 20410.343973721327, + "rel_diff_vmap_vs_library_pdip": 0.00012558919829906093, + "rel_diff_scalar_vs_library_pdip_scalar": 0.00012558919838006043, + "abs_diff_nats": 1.4275428839027882e-08, + "rel_diff": 6.995091274436167e-13, + "rel_diff_scalar_vs_library_pdip": 0.00012558919899848222, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 1.2623786460608244e-08, + "rel_diff_library_pdip_vmap_vs_scalar": 6.184994469893104e-13, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "FAIL", + "certified": false, + "passes": 16, + "pdip_iter": null + } + ], + "lane_pins": [ + { + "pin": "lane 0: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 24758.506194309342, + "reference_value": 24758.50619430915, + "rel_diff": 7.787742736279448e-15, + "abs_diff_nats": 1.9281287677586079e-10, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 0: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 24758.506194309342, + "reference_value": 24758.50619430915, + "rel_diff": 7.787742736279448e-15, + "abs_diff_nats": 1.9281287677586079e-10, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 0: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 24758.506194309342, + "reference_value": 24758.506194309342, + "rel_diff": 0.0, + "abs_diff_nats": 0.0, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 0: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 24758.50619430915, + "reference_value": 24758.50619430915, + "rel_diff": 0.0, + "abs_diff_nats": 0.0, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 1: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 20552.706459416033, + "reference_value": 20551.004887772695, + "rel_diff": 8.279749105360521e-05, + "abs_diff_nats": 1.7015716433379566, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 1: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 20552.706459416, + "reference_value": 20551.004887771654, + "rel_diff": 8.279749110264447e-05, + "abs_diff_nats": 1.7015716443456768, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 1: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 20552.706459416033, + "reference_value": 20552.706459416, + "rel_diff": 1.5930655813373479e-15, + "abs_diff_nats": 3.2741809263825417e-11, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 1: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 20551.004887772695, + "reference_value": 20551.004887771654, + "rel_diff": 5.0628275576311595e-14, + "abs_diff_nats": 1.04046193882823e-09, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 2: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -189709.69679849414, + "reference_value": -189709.91637924482, + "rel_diff": 1.1574553131984852e-06, + "abs_diff_nats": 0.21958075067959726, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 2: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -189709.06724982796, + "reference_value": -189709.0207892346, + "rel_diff": 2.449045024786232e-07, + "abs_diff_nats": 0.04646059335209429, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 2: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -189709.69679849414, + "reference_value": -189709.06724982796, + "rel_diff": 3.318495395661736e-06, + "abs_diff_nats": 0.6295486661838368, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 2: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -189709.91637924482, + "reference_value": -189709.0207892346, + "rel_diff": 4.720861488239521e-06, + "abs_diff_nats": 0.8955900102155283, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 3: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -141741.97933878313, + "reference_value": -141741.97793200478, + "rel_diff": 9.924923929625508e-09, + "abs_diff_nats": 0.001406778348609805, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 3: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -141741.96673248586, + "reference_value": -141741.9662947005, + "rel_diff": 3.0886078336726387e-09, + "abs_diff_nats": 0.00043778534745797515, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 3: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -141741.97933878313, + "reference_value": -141741.96673248586, + "rel_diff": 8.893835439850449e-08, + "abs_diff_nats": 0.012606297270394862, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 3: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -141741.97793200478, + "reference_value": -141741.9662947005, + "rel_diff": 8.210203776239084e-08, + "abs_diff_nats": 0.011637304269243032, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 4: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 24880.545932988694, + "reference_value": 24880.54593298869, + "rel_diff": 1.4621780474150203e-16, + "abs_diff_nats": 3.637978807091713e-12, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 4: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 24880.545932988716, + "reference_value": 24880.54593298872, + "rel_diff": 1.4621780474150186e-16, + "abs_diff_nats": 3.637978807091713e-12, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 4: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 24880.545932988694, + "reference_value": 24880.545932988716, + "rel_diff": 8.773068284490113e-16, + "abs_diff_nats": 2.1827872842550278e-11, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 4: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 24880.54593298869, + "reference_value": 24880.54593298872, + "rel_diff": 1.1697424379320148e-15, + "abs_diff_nats": 2.9103830456733704e-11, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 5: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 25472.519186595913, + "reference_value": 25472.51918661041, + "rel_diff": 5.691367014017594e-13, + "abs_diff_nats": 1.4497345546260476e-08, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 5: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 25472.519186791294, + "reference_value": 25472.519186758924, + "rel_diff": 1.270810130249267e-12, + "abs_diff_nats": 3.237073542550206e-08, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 5: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 25472.519186595913, + "reference_value": 25472.519186791294, + "rel_diff": 7.670277461798203e-12, + "abs_diff_nats": 1.9538128981366754e-07, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 5: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 25472.51918661041, + "reference_value": 25472.519186758924, + "rel_diff": 5.830330630160241e-12, + "abs_diff_nats": 1.48513208841905e-07, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 6: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -83383.91629657254, + "reference_value": -83383.91628258814, + "rel_diff": 1.6771106119533433e-10, + "abs_diff_nats": 1.3984405086375773e-05, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 6: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -83383.9155206514, + "reference_value": -83383.91548171044, + "rel_diff": 4.670079838536909e-10, + "abs_diff_nats": 3.894095425494015e-05, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 6: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -83383.91629657254, + "reference_value": -83383.9155206514, + "rel_diff": 9.305405474134641e-09, + "abs_diff_nats": 0.0007759211439406499, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 6: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -83383.91628258814, + "reference_value": -83383.91548171044, + "rel_diff": 9.60470239952788e-09, + "abs_diff_nats": 0.0008008776931092143, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 7: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -11960.284433550274, + "reference_value": -11960.284432913264, + "rel_diff": 5.326044649647159e-11, + "abs_diff_nats": 6.370100891217589e-07, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 7: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -11960.284430311229, + "reference_value": -11960.284430044325, + "rel_diff": 2.2315853332937958e-11, + "abs_diff_nats": 2.669039531610906e-07, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 7: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -11960.284433550274, + "reference_value": -11960.284430311229, + "rel_diff": 2.708167473722332e-10, + "abs_diff_nats": 3.23904532706365e-06, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 7: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -11960.284432913264, + "reference_value": -11960.284430044325, + "rel_diff": 2.398721542019674e-10, + "abs_diff_nats": 2.8689391911029816e-06, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 8: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 23223.5503914129, + "reference_value": 23223.550391423054, + "rel_diff": 4.372113083253157e-13, + "abs_diff_nats": 1.0153598850592971e-08, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 8: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 23223.550391490582, + "reference_value": 23223.55039148498, + "rel_diff": 2.412416391326373e-13, + "abs_diff_nats": 5.602487362921238e-09, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 8: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 23223.5503914129, + "reference_value": 23223.550391490582, + "rel_diff": 3.3449563119467287e-12, + "abs_diff_nats": 7.768176146782935e-08, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 8: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 23223.550391423054, + "reference_value": 23223.55039148498, + "rel_diff": 2.6665033644907486e-12, + "abs_diff_nats": 6.192567525431514e-08, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 9: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -177119.01437774638, + "reference_value": -177119.3219600775, + "rel_diff": 1.7365825914360673e-06, + "abs_diff_nats": 0.3075823311228305, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 9: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -177117.76756649266, + "reference_value": -177117.7818270842, + "rel_diff": 8.051473649077384e-08, + "abs_diff_nats": 0.014260591531638056, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 9: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -177119.01437774638, + "reference_value": -177117.76756649266, + "rel_diff": 7.039447655916832e-06, + "abs_diff_nats": 1.2468112537171692, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 9: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -177119.3219600775, + "reference_value": -177117.7818270842, + "rel_diff": 8.695530044588951e-06, + "abs_diff_nats": 1.5401329933083616, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 10: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -101745.38550684515, + "reference_value": -101745.38534975679, + "rel_diff": 1.5439359820366783e-09, + "abs_diff_nats": 0.00015708836144767702, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 10: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -101745.38354083074, + "reference_value": -101745.38330068295, + "rel_diff": 2.3602818663373926e-09, + "abs_diff_nats": 0.00024014778318814933, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 10: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -101745.38550684515, + "reference_value": -101745.38354083074, + "rel_diff": 1.9322885704511786e-08, + "abs_diff_nats": 0.001966014417121187, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 10: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -101745.38534975679, + "reference_value": -101745.38330068295, + "rel_diff": 2.0139231603326272e-08, + "abs_diff_nats": 0.002049073838861659, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 11: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 18959.672781158773, + "reference_value": 18957.528349914453, + "rel_diff": 0.00011311765989418553, + "abs_diff_nats": 2.1444312443200033, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 11: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 18959.672780967318, + "reference_value": 18957.528349734202, + "rel_diff": 0.00011311765930420434, + "abs_diff_nats": 2.1444312331150286, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 11: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 18959.672781158773, + "reference_value": 18959.672780967318, + "rel_diff": 1.00980598606643e-11, + "abs_diff_nats": 1.9145591068081558e-07, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 11: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 18957.528349914453, + "reference_value": 18957.528349734202, + "rel_diff": 9.508145399001887e-12, + "abs_diff_nats": 1.802509359549731e-07, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 12: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 24810.049660195124, + "reference_value": 24810.049660194894, + "rel_diff": 9.237896255181357e-15, + "abs_diff_nats": 2.2919266484677792e-10, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 12: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 24810.049660195124, + "reference_value": 24810.049660194898, + "rel_diff": 9.091262981289588e-15, + "abs_diff_nats": 2.255546860396862e-10, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 12: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 24810.049660195124, + "reference_value": 24810.049660195124, + "rel_diff": 0.0, + "abs_diff_nats": 0.0, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 12: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 24810.049660194894, + "reference_value": 24810.049660194898, + "rel_diff": 1.4663327389176755e-16, + "abs_diff_nats": 3.637978807091713e-12, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 13: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -3605.706216745806, + "reference_value": -3605.70621669307, + "rel_diff": 1.4625745309879346e-11, + "abs_diff_nats": 5.273614078760147e-08, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 13: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -3605.7062159467096, + "reference_value": -3605.7062161423455, + "rel_diff": 5.4257317874186085e-11, + "abs_diff_nats": 1.9563594833016396e-07, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 13: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -3605.706216745806, + "reference_value": -3605.7062159467096, + "rel_diff": 2.2161999592723706e-10, + "abs_diff_nats": 7.990965968929231e-07, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 13: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -3605.70621669307, + "reference_value": -3605.7062161423455, + "rel_diff": 1.5273693272891323e-10, + "abs_diff_nats": 5.507245077751577e-07, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 14: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 11129.438563023064, + "reference_value": 11126.921475740783, + "rel_diff": 0.00022621596528470933, + "abs_diff_nats": 2.5170872822818637, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 14: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 11129.43856306804, + "reference_value": 11126.921475785763, + "rel_diff": 0.00022621596528346792, + "abs_diff_nats": 2.5170872822782258, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 14: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 11129.438563023064, + "reference_value": 11129.43856306804, + "rel_diff": 4.041204031740148e-12, + "abs_diff_nats": 4.497633199207485e-08, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 14: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 11126.921475740783, + "reference_value": 11126.921475785763, + "rel_diff": 4.0424451694717775e-12, + "abs_diff_nats": 4.497996997088194e-08, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 15: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 20407.78065499728, + "reference_value": 20410.34397373395, + "rel_diff": 0.00012558919829906093, + "abs_diff_nats": 2.5633187366693164, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 15: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 20407.780654983006, + "reference_value": 20410.343973721327, + "rel_diff": 0.00012558919838006043, + "abs_diff_nats": 2.563318738320959, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 15: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 20407.78065499728, + "reference_value": 20407.780654983006, + "rel_diff": 6.995091274436167e-13, + "abs_diff_nats": 1.4275428839027882e-08, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 15: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 20410.34397373395, + "reference_value": 20410.343973721327, + "rel_diff": 6.184994469893104e-13, + "abs_diff_nats": 1.2623786460608244e-08, + "within_rtol": true, + "status": "RECORDED" + } + ], + "lanes_failed": 8, + "arm_rows": { + "vmap": { + "arm": "vmap", + "program": "jax.jit(jax.vmap(fn))", + "stands_for": "Nautilus(use_jax_vmap=True) \u2014 Fitness._vmap", + "hlo_source": "jax.jit(jax.vmap(fn)).lower(batched_tree) \u2014 the exact current Fitness._vmap composition (PyAutoFit#1638)", + "batch_wall_ms": 517.4162076000357, + "wall_production_nesting_ms": 517.4162076000357, + "wall_aot_command_buffers_on_ms": 517.7147279002384, + "wall_aot_command_buffers_off_ms": 518.2538695000403, + "command_buffer_delta_ms": 0.5391415998019511, + "production_nesting_vs_aot_on_delta_ms": -0.29852030020265374, + "production_nesting_vs_aot_on_delta_pct": -0.05766115663995123, + "wall_per_lane_ms": 32.33851297500223, + "wall_per_lane_command_buffers_off_ms": 32.39086684375252, + "traced_batch_wall_ms": 526.2971833999472, + "untraced_batch_wall_ms": 518.9798889998201, + "traced_wall_per_lane_ms": 32.8935739624967, + "callback_count_per_call": 16.0, + "callback_count_per_lane": 1.0, + "callback_expectation": "B per batched call \u2014 the qhull pure_callback is vmap_method='sequential'", + "host_qhull_ms": 71.46214839922322, + "host_tables_ms": 1.8509429031837499, + "host_qhull_ms_per_lane": 4.4663842749514515, + "host_tables_ms_per_lane": 0.11568393144898437, + "host_callback_probe": { + "calls": 160, + "qhull_ms_total": 714.6214839922322, + "tables_ms_total": 18.5094290318375, + "total_ms_total": 733.1309130240697, + "qhull_ms_mean": 4.4663842749514515, + "tables_ms_mean": 0.11568393144898437, + "total_ms_mean": 4.582068206400436, + "non_finite_calls": 0, + "n_points": [ + 1500 + ] + }, + "host_callback_records_first": [ + { + "n_points": 1500, + "qhull_ms": 4.855630002566613, + "tables_ms": 0.173308995726984, + "total_ms": 5.028938998293597, + "finite": true + }, + { + "n_points": 1500, + "qhull_ms": 4.505192999204155, + "tables_ms": 0.12541899923235178, + "total_ms": 4.630611998436507, + "finite": true + }, + { + "n_points": 1500, + "qhull_ms": 4.533261999313254, + "tables_ms": 0.1090990008378867, + "total_ms": 4.642361000151141, + "finite": true + }, + { + "n_points": 1500, + "qhull_ms": 4.491764000704279, + "tables_ms": 0.1084079995052889, + "total_ms": 4.600172000209568, + "finite": true + } + ], + "device_idle_ms": 92.4584172999999, + "device_idle_ms_per_lane": 5.778651081249993, + "trace": { + "parser": "ProfileData.from_file(xplane) + as_text() + stack_frame_index(proto field 17)", + "stage_audit": { + "mixed_fusion": [ + { + "instruction": "loop_divide_gather_fusion", + "ms": 17.121934, + "opcode": "fusion", + "shape": "(f64[15361,16,1,1,1500]{4,3,2,1,0}, f64[15361,16,1,1,1500]{4,3,2,1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:133", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:133 (curvature_matrix_via_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:93 (InversionImagingMapping.curvature_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:389 (AbstractInversion.curvature_reg_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "input_multiply_transpose_fusion", + "ms": 6.5314165, + "opcode": "fusion", + "shape": "(f64[16,1500,1500]{2,1,0}, f64[16,1500,1500]{2,1,0}, f64[16,1500,1500]{2,1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:237 (active_set_search)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:293 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:274 (_certified_positive_only_from)" + ] + }, + { + "instruction": "loop_broadcast_fusion.6", + "ms": 3.9842109, + "opcode": "fusion", + "shape": "f64[16,1500,180,180]{3,2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "input_reduce_fusion.9", + "ms": 1.9171259, + "opcode": "fusion", + "shape": "f64[92,16,1500]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/inversion_imaging_util.py:123", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/inversion_imaging_util.py:123 (data_vector_via_blurred_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:67 (InversionImagingMapping.data_vector)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:699 (AbstractInversion.reconstruction)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "input_reduce_fusion.13", + "ms": 1.7497338000000002, + "opcode": "fusion", + "shape": "f64[15361,16]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:163", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:163 (mapped_reconstructed_data_via_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:120 (InversionImagingMapping._mapped_reconstructed_data_dict_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:196 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "loop_broadcast_fusion.8", + "ms": 1.704139, + "opcode": "fusion", + "shape": "f64[15361,16,1500]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:353", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:353 (mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/abstract.py:283 (Mapper.mapping_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:91 (AbstractInversionImaging._mapping_matrix_for_convolution_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:137 (AbstractInversionImaging.operated_mapping_matrix_list)" + ] + } + ], + "other": [ + { + "instruction": "copy.113", + "ms": 0.04783049999999985, + "opcode": "copy", + "shape": "f64[1,16,1024,2]{3,2,1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "copy.99", + "ms": 0.03276490000000004, + "opcode": "copy", + "shape": "pred[16,1500]{1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "copy.115", + "ms": 0.03256010000000004, + "opcode": "copy", + "shape": "s32[1,3000,3]{2,1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "copy.116", + "ms": 0.03247050000000004, + "opcode": "copy", + "shape": "s32[1,3000,3]{2,1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "copy.117", + "ms": 0.03226570000000003, + "opcode": "copy", + "shape": "f64[1,1500,2]{2,1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "copy.114", + "ms": 0.029606399999999998, + "opcode": "copy", + "shape": "s32[1,1500]{1,0}", + "source": "", + "stack": [] + } + ], + "mesh_qhull_callback": [ + { + "instruction": "pure_callback.0", + "ms": 0.17269500000000038, + "opcode": "custom-call", + "shape": "(s32[3000,3]{1,0}, s32[3000,3]{1,0}, s32[1500]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:161", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:161 (_jax_delaunay_tables)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:405 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + }, + { + "instruction": "loop_add_fusion.1", + "ms": 0.024345599999999936, + "opcode": "fusion", + "shape": "s64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:161", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:161 (_jax_delaunay_tables)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:405 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + }, + { + "instruction": "loop_broadcast_fusion.2", + "ms": 0.0019872, + "opcode": "fusion", + "shape": "s32[16,1500]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:161", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:161 (_jax_delaunay_tables)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:405 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + } + ], + "border_relocator": [ + { + "instruction": "custom-call.2", + "ms": 0.0422018, + "opcode": "custom-call", + "shape": "(f64[16,2,2]{2,1,0}, s8[4194304]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:242", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:242 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:454 (BorderRelocator.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:176 (AbstractMesh.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:214 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "eigh.34", + "ms": 0.014806399999999999, + "opcode": "custom-call", + "shape": "(f64[16,2,2]{1,2,0}, f64[16,2]{1,0}, s32[16]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:245", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:245 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:454 (BorderRelocator.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:176 (AbstractMesh.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:214 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "loop_add_rsqrt_fusion", + "ms": 0.012992000000000002, + "opcode": "fusion", + "shape": "(f64[16,15361]{1,0}, f64[16,15361]{1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:311", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:311 (relocated_grid_via_ellipse_border_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:423 (BorderRelocator.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:83 (AbstractMesh.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:208 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "loop_add_fusion.3", + "ms": 0.003855999999999999, + "opcode": "fusion", + "shape": "f64[16,1500]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:308", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:308 (relocated_grid_via_ellipse_border_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:458 (BorderRelocator.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:176 (AbstractMesh.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:214 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "loop_abs_fusion.1", + "ms": 0.0032608000000000008, + "opcode": "fusion", + "shape": "(f64[16,392,1]{2,1,0}, f64[16,392,1]{2,1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:269", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:269 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:454 (BorderRelocator.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:176 (AbstractMesh.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:214 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "input_reduce_fusion.15", + "ms": 0.0031328000000000003, + "opcode": "fusion", + "shape": "f64[16]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:269", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:269 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:454 (BorderRelocator.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:176 (AbstractMesh.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:214 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + } + ], + "mesh_construction": [ + { + "instruction": "loop_compare_fusion.4", + "ms": 0.0046816, + "opcode": "fusion", + "shape": "pred[16,6000,3]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:736", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:736 (DelaunayInterface.splitted_sizes)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:997 (InterpolatorDelaunay._mappings_sizes_weights_split)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt_split.py:124 (AdaptSplit.regularization_matrix_from)" + ] + }, + { + "instruction": "input_concatenate_fusion.12", + "ms": 0.002368, + "opcode": "fusion", + "shape": "f64[16,1500,2]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:820", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:820 (InterpolatorDelaunay.mesh_grid_xy)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:847 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + }, + { + "instruction": "loop_multiply_fusion.2", + "ms": 0.002352, + "opcode": "fusion", + "shape": "f64[16,1500]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:412", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:412 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "mesh_seed_argmin": [ + { + "instruction": "input_reduce_fusion", + "ms": 1.3163613, + "opcode": "fusion", + "shape": "(f64[16,1024]{1,0}, s64[16,1024]{1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:191", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:191 (_nearest_vertex_seed_from..argmin_chunk)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204 (_nearest_vertex_seed_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:351 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)" + ] + }, + { + "instruction": "loop_dynamic_update_slice_fusion", + "ms": 0.04786569999999984, + "opcode": "fusion", + "shape": "s32[21,16,1024]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204 (_nearest_vertex_seed_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:351 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "loop_add_fusion", + "ms": 0.03175369999999992, + "opcode": "fusion", + "shape": "s64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204 (_nearest_vertex_seed_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:351 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "loop_broadcast_fusion.3", + "ms": 0.0024544, + "opcode": "fusion", + "shape": "s32[21,16,1024]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204 (_nearest_vertex_seed_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:351 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "pdip_solve": [ + { + "instruction": "cholesky.50", + "ms": 102.4557180000043, + "opcode": "custom-call", + "shape": "(f64[16,1500,1500]{1,2,0}, s32[16]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:252 (active_set_search..body_fun)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:262 (active_set_search)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:293 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)" + ] + }, + { + "instruction": "triangular-solve", + "ms": 29.055670900000038, + "opcode": "custom-call", + "shape": "(f64[16,1500,1]{1,2,0}, s8[256]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:154", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:154 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:252 (active_set_search..body_fun)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:262 (active_set_search)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:293 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)" + ] + }, + { + "instruction": "triangular-solve.1", + "ms": 27.039248900000448, + "opcode": "custom-call", + "shape": "(f64[16,1500,1]{1,2,0}, s8[256]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:154", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:154 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:252 (active_set_search..body_fun)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:262 (active_set_search)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:293 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)" + ] + }, + { + "instruction": "input_transpose_fusion", + "ms": 11.383020100000005, + "opcode": "fusion", + "shape": "f64[16,1500,1500]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:252 (active_set_search..body_fun)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:262 (active_set_search)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:293 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)" + ] + }, + { + "instruction": "input_transpose_fusion.1", + "ms": 7.330376499999998, + "opcode": "fusion", + "shape": "f64[16,1500,1500]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:252 (active_set_search..body_fun)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:262 (active_set_search)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:293 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)" + ] + }, + { + "instruction": "cholesky.60", + "ms": 6.784435399999944, + "opcode": "custom-call", + "shape": "(f64[16,1500,1500]{1,2,0}, s32[16]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:237 (active_set_search)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:293 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:274 (_certified_positive_only_from)" + ] + } + ], + "mesh_dual_areas": [ + { + "instruction": "input_scatter_fusion.9", + "ms": 0.0033888, + "opcode": "fusion", + "shape": "f64[16,1500]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:393", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:393 (_dual_areas_padded_jnp)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:408 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + }, + { + "instruction": "input_scatter_fusion.7", + "ms": 0.0033279999999999994, + "opcode": "fusion", + "shape": "f64[16,1500]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:393", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:393 (_dual_areas_padded_jnp)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:408 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + } + ], + "mesh_locate_walk": [ + { + "instruction": "loop_slice_subtract_fusion", + "ms": 0.3015302000000001, + "opcode": "fusion", + "shape": "(f64[16,21361,1]{2,1,0}, f64[16,21361,1]{2,1,0}, f64[16,21361,1]{2,1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:236", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:236 (_walk_from_seed..cross)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:250 (_walk_from_seed..weights_of)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:262 (_walk_from_seed..walk_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:292 (_walk_from_seed..body)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)" + ] + }, + { + "instruction": "loop_reduce_fusion", + "ms": 0.10584970000000009, + "opcode": "fusion", + "shape": "(f64[16,21361]{1,0}, s64[16,21361]{1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:264", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:264 (_walk_from_seed..walk_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:292 (_walk_from_seed..body)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:264 (_walk_from_seed..walk_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:292 (_walk_from_seed..body)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)" + ] + }, + { + "instruction": "loop_select_fusion", + "ms": 0.10036230000000003, + "opcode": "fusion", + "shape": "(pred[16,21361]{1,0}, pred[16,21361]{1,0}, s32[16,21361]{1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:353 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "loop_gather_fusion.1", + "ms": 0.07133170000000001, + "opcode": "fusion", + "shape": "s32[341776,1,1,3]{3,2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:239", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:239 (_walk_from_seed..weights_of)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:262 (_walk_from_seed..walk_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:292 (_walk_from_seed..body)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:353 (pix_indexes_delaunay_walk_from)" + ] + }, + { + "instruction": "loop_gather_fusion", + "ms": 0.05414459999999998, + "opcode": "fusion", + "shape": "s32[341776,1,1,1]{3,2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:267", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:267 (_walk_from_seed..walk_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:292 (_walk_from_seed..body)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:353 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)" + ] + }, + { + "instruction": "input_concatenate_fusion.1", + "ms": 0.04143370000000002, + "opcode": "fusion", + "shape": "s32[16,21361,2]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:244", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:244 (_walk_from_seed..weights_of)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:262 (_walk_from_seed..walk_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:292 (_walk_from_seed..body)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:353 (pix_indexes_delaunay_walk_from)" + ] + } + ], + "psf_convolution_mapping_matrix": [ + { + "instruction": "input_scatter_fusion", + "ms": 32.36828379999999, + "opcode": "fusion", + "shape": "f64[16,1500,180,180]{3,2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "fft.29.0", + "ms": 28.291890399999993, + "opcode": "fft", + "shape": "f64[16,1500,180,180]{3,2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "fft.25.0", + "ms": 21.586997999999994, + "opcode": "fft", + "shape": "c128[16,1500,180,91]{3,2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "fft.27.0", + "ms": 15.519218699999998, + "opcode": "fft", + "shape": "c128[16,1500,91,180]{3,2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "input_transpose_fusion.3", + "ms": 8.4352558, + "opcode": "fusion", + "shape": "c128[16,1500,91,180]{3,2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "wrapped_transpose", + "ms": 7.9144405, + "opcode": "fusion", + "shape": "c128[16,1500,180,91]{3,2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + } + ], + "mapping_matrix": [ + { + "instruction": "input_scatter_fusion.3", + "ms": 0.05075540000000001, + "opcode": "fusion", + "shape": "f64[16,1500]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:71", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:71 (adaptive_pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/abstract.py:507 (Mapper.pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt.py:339 (Adapt.regularization_weights_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt_split.py:120 (AdaptSplit.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)" + ] + }, + { + "instruction": "input_reduce_fusion.36", + "ms": 0.0037663999999999996, + "opcode": "fusion", + "shape": "f64[16]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:93", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:93 (adaptive_pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/abstract.py:507 (Mapper.pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt.py:339 (Adapt.regularization_weights_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt_split.py:120 (AdaptSplit.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)" + ] + } + ], + "regularization_H": [ + { + "instruction": "input_scatter_fusion.10", + "ms": 0.002784, + "opcode": "fusion", + "shape": "f64[16,1500,1500]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:615", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:615 (pixel_splitted_regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt_split.py:137 (AdaptSplit.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:332 (AbstractInversion.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "curvature_matrix_F": [ + { + "instruction": "cublas-lt-matmul.2", + "ms": 65.8913192, + "opcode": "custom-call", + "shape": "(f64[16,1500,1500]{2,1,0}, s8[4194304]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:134", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:134 (curvature_matrix_via_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:93 (InversionImagingMapping.curvature_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:389 (AbstractInversion.curvature_reg_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "inversion_other": [ + { + "instruction": "cholesky.80", + "ms": 7.005860600000064, + "opcode": "custom-call", + "shape": "(f64[16,1500,1500]{1,2,0}, s32[16]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986 (AbstractInversion._log_det_symmetric_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:1078 (AbstractInversion.log_det_curvature_reg_matrix_term)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:347 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/model/analysis.py:135 (AnalysisImaging.log_likelihood_function)" + ] + }, + { + "instruction": "cholesky.90", + "ms": 6.891396200000048, + "opcode": "custom-call", + "shape": "(f64[16,1500,1500]{1,2,0}, s32[16]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986 (AbstractInversion._log_det_symmetric_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:1157 (AbstractInversion.log_det_regularization_matrix_term)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:348 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/model/analysis.py:135 (AnalysisImaging.log_likelihood_function)" + ] + }, + { + "instruction": "loop_reduce_window_fusion", + "ms": 0.0031135999999999994, + "opcode": "fusion", + "shape": "s64[94,16]{1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "loop_broadcast_convert_fusion", + "ms": 0.0026239999999999996, + "opcode": "fusion", + "shape": "(s32[1500]{0}, s64[1500]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:527", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:527 (AbstractInversion.zeroed_ids_to_keep)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:567 (AbstractInversion.solve_ids_to_keep)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:684 (AbstractInversion.reconstruction)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "input_scatter_fusion.5", + "ms": 0.0021888000000000003, + "opcode": "fusion", + "shape": "s64[1500]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:527", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:527 (AbstractInversion.zeroed_ids_to_keep)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:567 (AbstractInversion.solve_ids_to_keep)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:684 (AbstractInversion.reconstruction)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "loop_reduce_window_fusion.1", + "ms": 0.0021152, + "opcode": "fusion", + "shape": "s64[6,16]{1,0}", + "source": "", + "stack": [] + } + ] + }, + "stage_audit_note": "The HLO instructions that contributed most of each stage's milliseconds, with their full source stack. A stage row is only as good as the rules that built it; this is how a reader checks a row against the HLO instead of trusting it.", + "untraced_wall_ms": 518.9798889998201, + "reconciliation_vs_untraced_pct": 1.3380213660232894, + "wall_basis": "wall_ms is the TRACED run's wall, the run these kernel durations came from. untraced_wall_ms is the same executable without the profiler; the difference is the profiler's overhead and belongs in neither the stages nor the idle row.", + "calls": 10, + "call_split": "per-call (first-instruction recurrence)", + "call_blocks": 10, + "events": 98230, + "streams": [ + "Stream #14(MemcpyD2H,Compute,MemcpyD2D,MemcpyH2D)" + ], + "per_stage_ms": { + "border_relocator": { + "median_ms": 0.089008, + "min_ms": 0.08854399999999998, + "max_ms": 0.089408 + }, + "curvature_matrix_F": { + "median_ms": 65.883822, + "min_ms": 65.410044, + "max_ms": 66.294655 + }, + "inversion_other": { + "median_ms": 13.86766849999999, + "min_ms": 13.665590000000007, + "max_ms": 14.308857000000021 + }, + "mapping_matrix": { + "median_ms": 0.054816, + "min_ms": 0.052001, + "max_ms": 0.056223999999999996 + }, + "mesh_construction": { + "median_ms": 0.009392, + "min_ms": 0.009216, + "max_ms": 0.009632 + }, + "mesh_dual_areas": { + "median_ms": 0.00672, + "min_ms": 0.0066879999999999995, + "max_ms": 0.006751999999999999 + }, + "mesh_locate_walk": { + "median_ms": 0.8697974999999997, + "min_ms": 0.8663129999999999, + "max_ms": 0.8747560000000002 + }, + "mesh_qhull_callback": { + "median_ms": 0.19901000000000008, + "min_ms": 0.19804800000000003, + "max_ms": 0.1998079999999999 + }, + "mesh_seed_argmin": { + "median_ms": 1.399573, + "min_ms": 1.3929960000000003, + "max_ms": 1.406666 + }, + "mixed_fusion": { + "median_ms": 34.89768500000001, + "min_ms": 34.76708100000001, + "max_ms": 35.313154 + }, + "other": { + "median_ms": 0.2646409999999998, + "min_ms": 0.2624009999999997, + "max_ms": 0.2663999999999998 + }, + "pdip_solve": { + "median_ms": 201.83499350000176, + "min_ms": 201.14833200000075, + "max_ms": 203.0447600000009 + }, + "psf_convolution_mapping_matrix": { + "median_ms": 114.085639, + "min_ms": 113.86171800000002, + "max_ms": 114.512041 + }, + "regularization_H": { + "median_ms": 0.002768, + "min_ms": 0.00272, + "max_ms": 0.002912 + } + }, + "stage_order": [ + "border_relocator", + "mesh_qhull_callback", + "mesh_seed_argmin", + "mesh_locate_walk", + "mesh_dual_areas", + "mesh_construction", + "mapping_matrix", + "psf_convolution_mapping_matrix", + "curvature_matrix_F", + "regularization_H", + "pdip_solve", + "inversion_other", + "mixed_fusion", + "other" + ], + "mixed_fusion": { + "ms": 34.89768500000001, + "constituent_stage_sets": { + "curvature_matrix_F + psf_convolution_mapping_matrix": 17.121934, + "curvature_reg_reduce_gather + inversion_other + mapped_reconstruction + pdip_solve + reconstruction_scatter": 6.5314165, + "pdip_solve + psf_convolution_mapping_matrix": 3.9842109, + "data_vector_D + pdip_solve": 1.9326139000000002, + "mapped_reconstruction + pdip_solve": 1.7497338000000002, + "mapping_matrix + pdip_solve": 1.7073294000000003, + "pdip_solve + regularization_H": 0.7604388000000001, + "inversion_other + pdip_solve + regularization_H": 0.4422260000000001, + "inversion_other + pdip_solve": 0.19286520000000004, + "inversion_other + regularization_H": 0.16288059999999988, + "inversion_other + mapping_matrix + mesh_construction + mesh_interpolation_weights + pdip_solve": 0.06121619999999999, + "mapping_matrix + mesh_interpolation_weights + pdip_solve": 0.0606661, + "grids_and_structures + mass_profile_deflections + ray_trace_data_grid": 0.03154590000000001, + "inversion_other + mesh_construction + mesh_dual_areas + mesh_interpolation_weights": 0.0231234, + "inversion_other + mesh_construction + mesh_dual_areas + mesh_interpolation_weights + pdip_solve + regularization_H": 0.022569699999999998, + "grids_and_structures + mass_profile_deflections + pdip_solve + ray_trace_data_grid": 0.022076899999999997, + "chi_squared_evidence + pdip_solve": 0.0216448, + "inversion_other + mesh_construction + mesh_interpolation_weights": 0.0209506, + "border_relocator + pdip_solve": 0.018896100000000002, + "inversion_other + mapping_matrix + mesh_construction + mesh_interpolation_weights": 0.014601700000000002, + "pdip_solve + ray_trace_data_grid": 0.013193599999999993, + "mesh_construction + pdip_solve + regularization_H": 0.010969700000000002, + "mesh_locate_walk + mesh_seed_argmin": 0.0098208, + "mesh_construction + mesh_seed_argmin + pdip_solve + regularization_H": 0.0097088, + "mesh_dual_areas + mesh_interpolation_weights": 0.008876799999999999, + "inversion_other + mapped_reconstruction + reconstruction_scatter": 0.0087617, + "inversion_other + mapped_reconstruction": 0.0087008, + "inversion_other + mapped_reconstruction + reconstruction_scatter + regularization_H": 0.008444900000000002, + "inversion_other + mesh_dual_areas + mesh_locate_walk": 0.008243199999999997, + "mesh_construction + mesh_dual_areas + mesh_interpolation_weights + pdip_solve + regularization_H": 0.0063648, + "inversion_other + pdip_solve + ray_trace_data_grid": 0.004764799999999999, + "grids_and_structures + mass_profile_deflections + pdip_solve": 0.0044128, + "mapping_matrix + pdip_solve + regularization_H": 0.0040032, + "inversion_other + mesh_locate_walk + mesh_seed_argmin": 0.0038016000000000005, + "inversion_other + mesh_dual_areas + mesh_locate_walk + pdip_solve": 0.0035873000000000003, + "inversion_other + mesh_interpolation_weights": 0.0034399999999999995, + "inversion_other + mesh_construction + mesh_interpolation_weights + pdip_solve + regularization_H": 0.0032768, + "inversion_other + mesh_construction + regularization_H": 0.0026720000000000003, + "chi_squared_evidence + inversion_other": 0.0023648000000000002, + "inversion_other + mapping_matrix": 0.0021536 + }, + "example_kernels": { + "curvature_matrix_F + psf_convolution_mapping_matrix": [ + "loop_divide_gather_fusion" + ], + "curvature_reg_reduce_gather + inversion_other + mapped_reconstruction + pdip_solve + reconstruction_scatter": [ + "input_multiply_transpose_fusion" + ], + "pdip_solve + psf_convolution_mapping_matrix": [ + "loop_broadcast_fusion.6" + ], + "data_vector_D + pdip_solve": [ + "input_reduce_fusion.9", + "input_reduce_fusion.34" + ], + "mapped_reconstruction + pdip_solve": [ + "input_reduce_fusion.13" + ], + "mapping_matrix + pdip_solve": [ + "loop_broadcast_fusion.8", + "loop_divide_fusion" + ], + "pdip_solve + regularization_H": [ + "loop_broadcast_fusion", + "input_transpose_fusion.4" + ], + "inversion_other + pdip_solve + regularization_H": [ + "input_transpose_fusion.5", + "loop_log_fusion" + ], + "inversion_other + pdip_solve": [ + "input_reduce_fusion.11", + "input_reduce_fusion.12", + "input_transpose_fusion.2", + "input_reduce_fusion.17" + ], + "inversion_other + regularization_H": [ + "input_reduce_fusion.31", + "input_reduce_fusion.24", + "input_reduce_fusion.25", + "input_reduce_fusion.26" + ] + }, + "prorated_estimate_ms": { + "psf_convolution_mapping_matrix": 10.55307245, + "curvature_matrix_F": 8.560967, + "pdip_solve": 6.699203843333333, + "mapped_reconstruction": 2.190532391666667, + "inversion_other": 1.6853919750000002, + "reconstruction_scatter": 1.3113150916666667, + "curvature_reg_reduce_gather": 1.3062833, + "data_vector_D": 0.9663069500000001, + "mapping_matrix": 0.8921915983333335, + "regularization_H": 0.6251783616666667, + "mesh_interpolation_weights": 0.06072841833333334, + "mesh_construction": 0.04132241833333333, + "ray_trace_data_grid": 0.024219591666666665, + "mesh_dual_areas": 0.018898384999999997, + "grids_and_structures": 0.017505458333333335, + "mass_profile_deflections": 0.017505458333333335, + "chi_squared_evidence": 0.0120048, + "mesh_locate_walk": 0.009822158333333332, + "border_relocator": 0.009448050000000001, + "mesh_seed_argmin": 0.0086048 + }, + "prorated_note": "ESTIMATE ONLY \u2014 a mixed fusion's time split equally across the stages its constituents span. Never summed into the measured table, never reconciled." + }, + "other_sources_ms": { + "copy.113": 0.04783049999999985, + "copy.99": 0.03276490000000004, + "copy.115": 0.03256010000000004, + "copy.116": 0.03247050000000004, + "copy.117": 0.03226570000000003, + "copy.114": 0.029606399999999998, + "copy.98": 0.023222500000000004, + "copy.97": 0.022992, + "loop_broadcast_fusion.1": 0.0026497, + "copy.112": 0.002304, + "copy.89": 0.0022624000000000003, + "copy.50": 0.0022176, + "loop_broadcast_fusion.4": 0.0014111999999999998 + }, + "device_span_ms": 526.1935725999999, + "device_busy_ms": 433.73515530000003, + "device_idle_ms": 92.4584172999999, + "largest_idle_gaps": [ + { + "gap_ms": 5.571638, + "after": "pure_callback.0", + "before": "pure_callback.0" + }, + { + "gap_ms": 5.103795, + "after": "pure_callback.0", + "before": "pure_callback.0" + }, + { + "gap_ms": 4.969235, + "after": "pure_callback.0", + "before": "pure_callback.0" + }, + { + "gap_ms": 4.963571, + "after": "pure_callback.0", + "before": "pure_callback.0" + }, + { + "gap_ms": 4.926515, + "after": "pure_callback.0", + "before": "pure_callback.0" + }, + { + "gap_ms": 4.917843, + "after": "pure_callback.0", + "before": "pure_callback.0" + }, + { + "gap_ms": 4.917523, + "after": "pure_callback.0", + "before": "pure_callback.0" + }, + { + "gap_ms": 4.882675, + "after": "pure_callback.0", + "before": "pure_callback.0" + } + ], + "kernel_ms": 433.46553350000175, + "sum_ms": 525.9239508000016, + "wall_ms": 526.2971833999472, + "host_outside_span_ms": 0.10361079994731881, + "reconciliation_pct": -0.07091670100426242, + "unjoined_ms": 0.0, + "unjoined_pct": 0.0, + "other_ms": 0.2646409999999998, + "other_pct": 0.05028356760155641, + "note": "Stage rows attribute the command-buffers-OFF program (see the module docstring): kernel times are the same, the launch overhead the CUDA graphs remove is not. sum_ms = kernel rows + device_idle_ms; the residual against wall_ms is host_outside_span_ms (dispatch before the first kernel, teardown after the last).", + "per_stage_ms_per_lane": { + "border_relocator": 0.005563, + "curvature_matrix_F": 4.117738875, + "inversion_other": 0.8667292812499994, + "mapping_matrix": 0.003426, + "mesh_construction": 0.000587, + "mesh_dual_areas": 0.00042, + "mesh_locate_walk": 0.05436234374999998, + "mesh_qhull_callback": 0.012438125000000005, + "mesh_seed_argmin": 0.0874733125, + "mixed_fusion": 2.1811053125000006, + "other": 0.016540062499999987, + "pdip_solve": 12.61468709375011, + "psf_convolution_mapping_matrix": 7.1303524375, + "regularization_H": 0.000173 + }, + "per_lane_divisor": 16, + "host_callback": { + "pure_callback_span_ms": 84.08972530000003, + "qhull_ms": 73.4500943, + "callback_body_ms_note": "the OUTERMOST matching body event, not a sum: under the probe the body appears twice (the wrapper and the timed re-implementation it calls) and summing them would count the same work twice", + "events_by_name": { + "pure_callback.0": { + "count": 160, + "ms": 84.08972530000003 + }, + "$callback.py:815 _wrapped_callback": { + "count": 160, + "ms": 77.31487520000003 + }, + "$callback.py:224 _callback": { + "count": 160, + "ms": 76.95211409999997 + }, + "$callback.py:74 pure_callback_impl": { + "count": 160, + "ms": 76.8157376 + }, + "$callback.py:69 __call__": { + "count": 160, + "ms": 73.69665320000001 + }, + "$delaunay.py:162 ": { + "count": 160, + "ms": 73.5889427 + }, + "$host_callback_probe.py:225 wrapped": { + "count": 160, + "ms": 73.4500943 + }, + "$host_callback_probe.py:160 _timed_tri_only": { + "count": 160, + "ms": 73.3321361 + }, + "$callback.py:822 ": { + "count": 640, + "ms": 0.2251277999999995 + }, + "ThenExecuteCallback:GetEventForComputeStreamSyncPoint": { + "count": 10, + "ms": 0.024644 + }, + "$__init__.py:132 _xla_gc_callback": { + "count": 2, + "ms": 0.000492 + } + }, + "note": "HOST milliseconds per traced BATCH (the whole invocation), aggregated by name because the events nest. Not a row of the device table: the device pays for them as the idle gaps largest_idle_gaps names." + }, + "host_callback_ms": 84.08972530000003 + }, + "hlo_census": { + "status": "excluded", + "reason": "The legacy census anchors PyAutoArray source line numbers that moved after the phase-1 run. No batched attribution is published from unsupported anchors; the device-event table and wall reconciliation remain valid." + }, + "trace_split": { + "expected_calls": 10, + "executions_per_invocation": 1, + "method": "per-call (first-instruction recurrence)", + "note": "DECIDED IN CODE: the scalar arm's trace is split by trace_calls * B, so every lane's execution is its own block and the per-stage median is taken over all of them. The vmap arm's is split by trace_calls, one block per batched execution, and per_stage_ms_per_lane divides those rows by B." + } + }, + "scalar": { + "arm": "scalar", + "program": "jax.jit(fn), called B times", + "stands_for": "Nautilus(use_jax_vmap=False, use_jax_jit=True). Plain use_jax_vmap=False is UNJITTED and is NOT this arm", + "hlo_source": "jax.jit(fn).lower(lane_trees[0]) \u2014 the same program phase 1 traced", + "batch_wall_ms": 512.9914576002193, + "wall_production_nesting_ms": 512.9914576002193, + "wall_aot_command_buffers_on_ms": 512.7541152000049, + "wall_aot_command_buffers_off_ms": 517.150563299947, + "command_buffer_delta_ms": 4.396448099942063, + "production_nesting_vs_aot_on_delta_ms": 0.237342400214402, + "production_nesting_vs_aot_on_delta_pct": 0.04628776116634856, + "wall_per_lane_ms": 32.061966100013706, + "wall_per_lane_command_buffers_off_ms": 32.321910206246685, + "traced_batch_wall_ms": 532.6256786000158, + "untraced_batch_wall_ms": 517.3603519000608, + "traced_wall_per_lane_ms": 33.28910491250099, + "callback_count_per_call": 16.0, + "callback_count_per_lane": 1.0, + "callback_expectation": "1 per likelihood evaluation, B per batch", + "host_qhull_ms": 71.96980369953963, + "host_tables_ms": 1.8175892008002847, + "host_qhull_ms_per_lane": 4.498112731221227, + "host_tables_ms_per_lane": 0.1135993250500178, + "host_callback_probe": { + "calls": 160, + "qhull_ms_total": 719.6980369953963, + "tables_ms_total": 18.175892008002847, + "total_ms_total": 737.8739290033991, + "qhull_ms_mean": 4.498112731221227, + "tables_ms_mean": 0.1135993250500178, + "total_ms_mean": 4.611712056271244, + "non_finite_calls": 0, + "n_points": [ + 1500 + ] + }, + "host_callback_records_first": [ + { + "n_points": 1500, + "qhull_ms": 4.742121000163024, + "tables_ms": 0.1932380000653211, + "total_ms": 4.935359000228345, + "finite": true + }, + { + "n_points": 1500, + "qhull_ms": 4.4789819985453505, + "tables_ms": 0.11332000212860294, + "total_ms": 4.592302000673953, + "finite": true + }, + { + "n_points": 1500, + "qhull_ms": 4.471012001886265, + "tables_ms": 0.11719000031007454, + "total_ms": 4.58820200219634, + "finite": true + }, + { + "n_points": 1500, + "qhull_ms": 4.563852999126539, + "tables_ms": 0.11627899948507547, + "total_ms": 4.680131998611614, + "finite": true + } + ], + "device_idle_ms": 6.500772918750002, + "device_idle_ms_per_lane": 6.500772918750002, + "trace": { + "parser": "ProfileData.from_file(xplane) + as_text() + stack_frame_index(proto field 17)", + "stage_audit": { + "mixed_fusion": [ + { + "instruction": "loop_divide_gather_fusion", + "ms": 1.0222060687499999, + "opcode": "fusion", + "shape": "(f64[15361,1,1,1500]{3,2,1,0}, f64[15361,1,1,1500]{3,2,1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:133", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:133 (curvature_matrix_via_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:93 (InversionImagingMapping.curvature_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:389 (AbstractInversion.curvature_reg_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "loop_broadcast_fusion.4", + "ms": 0.227287425, + "opcode": "fusion", + "shape": "f64[1500,180,180]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "input_reduce_fusion.5", + "ms": 0.12172564999999999, + "opcode": "fusion", + "shape": "f64[92,1500]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/inversion_imaging_util.py:123", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/inversion_imaging_util.py:123 (data_vector_via_blurred_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:67 (InversionImagingMapping.data_vector)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:699 (AbstractInversion.reconstruction)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "input_reduce_fusion.9", + "ms": 0.11514451250000009, + "opcode": "fusion", + "shape": "f64[15361]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:163", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:163 (mapped_reconstructed_data_via_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:120 (InversionImagingMapping._mapped_reconstructed_data_dict_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:196 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "loop_broadcast_fusion.2", + "ms": 0.11111129375, + "opcode": "fusion", + "shape": "f64[15361,1500]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:342", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:342 (mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/abstract.py:283 (Mapper.mapping_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:91 (AbstractInversionImaging._mapping_matrix_for_convolution_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:137 (AbstractInversionImaging.operated_mapping_matrix_list)" + ] + }, + { + "instruction": "input_multiply_transpose_fusion", + "ms": 0.11002071875, + "opcode": "fusion", + "shape": "(f64[1500,1500]{1,0}, f64[1500,1500]{1,0}, f64[1500,1500]{1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:237 (active_set_search)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:293 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:274 (_certified_positive_only_from)" + ] + } + ], + "border_relocator": [ + { + "instruction": "eigh.45", + "ms": 0.07492749374999988, + "opcode": "custom-call", + "shape": "(f64[2,2]{0,1}, f64[2]{0}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:245", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:245 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:454 (BorderRelocator.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:176 (AbstractMesh.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:214 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "custom-call.2", + "ms": 0.00796716875000001, + "opcode": "custom-call", + "shape": "(f64[2,2]{1,0}, s8[4194304]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:242", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:242 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:454 (BorderRelocator.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:176 (AbstractMesh.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:214 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "input_reduce_fusion.10", + "ms": 0.005843174999999995, + "opcode": "fusion", + "shape": "(f64[], f64[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:269", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:269 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:454 (BorderRelocator.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:176 (AbstractMesh.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:214 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "loop_add_fusion.3", + "ms": 0.0035635437499999985, + "opcode": "fusion", + "shape": "f64[15361]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:308", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:308 (relocated_grid_via_ellipse_border_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:423 (BorderRelocator.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:83 (AbstractMesh.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:208 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "loop_add_fusion.5", + "ms": 0.003449968749999998, + "opcode": "fusion", + "shape": "f64[1500]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:308", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:308 (relocated_grid_via_ellipse_border_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:458 (BorderRelocator.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:176 (AbstractMesh.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:214 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "input_concatenate_fusion.12", + "ms": 0.0024208062499999987, + "opcode": "fusion", + "shape": "f64[392,2]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:238", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:238 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:454 (BorderRelocator.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:176 (AbstractMesh.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:214 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + } + ], + "mesh_construction": [ + { + "instruction": "input_concatenate_fusion.7", + "ms": 0.002060987500000002, + "opcode": "fusion", + "shape": "f64[1500,2]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:820", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:820 (InterpolatorDelaunay.mesh_grid_xy)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:847 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + } + ], + "mesh_qhull_callback": [ + { + "instruction": "pure_callback.4", + "ms": 0.010662925000000023, + "opcode": "custom-call", + "shape": "(s32[3000,3]{1,0}, s32[3000,3]{1,0}, s32[1500]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:161", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:161 (_jax_delaunay_tables)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:405 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + } + ], + "other": [ + { + "instruction": "copy.80", + "ms": 0.0421512312500022, + "opcode": "copy", + "shape": "f64[1,1024,2]{2,1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "copy.48", + "ms": 0.016989462500000115, + "opcode": "copy", + "shape": "s32[21361]{0}", + "source": "", + "stack": [] + }, + { + "instruction": "copy.53", + "ms": 0.0019827937500000005, + "opcode": "copy", + "shape": "s64[1500]{0}", + "source": "", + "stack": [] + }, + { + "instruction": "copy.79", + "ms": 0.0017985875000000005, + "opcode": "copy", + "shape": "s32[]", + "source": "", + "stack": [] + }, + { + "instruction": "copy.78", + "ms": 0.0017723812499999992, + "opcode": "copy", + "shape": "s64[]", + "source": "", + "stack": [] + }, + { + "instruction": "copy.39", + "ms": 0.0016623937499999995, + "opcode": "copy", + "shape": "s32[]", + "source": "", + "stack": [] + } + ], + "mesh_seed_argmin": [ + { + "instruction": "input_reduce_fusion", + "ms": 0.15278476250000322, + "opcode": "fusion", + "shape": "(f64[1024]{0}, s64[1024]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:191", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:191 (_nearest_vertex_seed_from..argmin_chunk)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204 (_nearest_vertex_seed_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:351 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)" + ] + }, + { + "instruction": "loop_dynamic_update_slice_fusion", + "ms": 0.04134503124999953, + "opcode": "fusion", + "shape": "s32[21,1024]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204 (_nearest_vertex_seed_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:351 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "loop_add_fusion", + "ms": 0.03183429999999872, + "opcode": "fusion", + "shape": "s64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204 (_nearest_vertex_seed_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:351 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "loop_broadcast_fusion", + "ms": 0.0019629874999999995, + "opcode": "fusion", + "shape": "s32[21,1024]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204 (_nearest_vertex_seed_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:351 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "pdip_solve": [ + { + "instruction": "cholesky.50", + "ms": 5.925674424999978, + "opcode": "custom-call", + "shape": "(f64[1500,1500]{0,1}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:252 (active_set_search..body_fun)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:262 (active_set_search)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:293 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)" + ] + }, + { + "instruction": "triangular-solve.1", + "ms": 1.0751257125000189, + "opcode": "custom-call", + "shape": "(f64[1500,1]{0,1}, s8[0]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:154", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:154 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:252 (active_set_search..body_fun)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:262 (active_set_search)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:293 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)" + ] + }, + { + "instruction": "triangular-solve", + "ms": 0.9163587937499991, + "opcode": "custom-call", + "shape": "(f64[1500,1]{0,1}, s8[0]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:154", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:154 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:252 (active_set_search..body_fun)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:262 (active_set_search)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:293 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)" + ] + }, + { + "instruction": "cholesky.70", + "ms": 0.8940089249999981, + "opcode": "custom-call", + "shape": "(f64[1500,1500]{0,1}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:297 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:274 (_certified_positive_only_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:496 (reconstruction_positive_only_from)" + ] + }, + { + "instruction": "cholesky.60", + "ms": 0.8650892000000021, + "opcode": "custom-call", + "shape": "(f64[1500,1500]{0,1}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:237 (active_set_search)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:293 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:274 (_certified_positive_only_from)" + ] + }, + { + "instruction": "input_transpose_fusion", + "ms": 0.23345516249999987, + "opcode": "fusion", + "shape": "f64[1500,1500]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:252 (active_set_search..body_fun)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:262 (active_set_search)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:293 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)" + ] + } + ], + "regularization_H": [ + { + "instruction": "input_scatter_fusion.10", + "ms": 0.0020828, + "opcode": "fusion", + "shape": "f64[1500,1500]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:615", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:615 (pixel_splitted_regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt_split.py:137 (AdaptSplit.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:332 (AbstractInversion.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "input_concatenate_fusion.8", + "ms": 0.0018649875000000028, + "opcode": "fusion", + "shape": "pred[3]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:93", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:93 (split_points_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:410 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + }, + { + "instruction": "input_concatenate_fusion.9", + "ms": 0.0018535937500000009, + "opcode": "fusion", + "shape": "pred[3]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:91", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:91 (split_points_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:410 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + }, + { + "instruction": "input_concatenate_fusion.10", + "ms": 0.0018515874999999982, + "opcode": "fusion", + "shape": "pred[3]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:90", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:90 (split_points_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:410 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + }, + { + "instruction": "input_concatenate_fusion", + "ms": 0.0017653812499999993, + "opcode": "fusion", + "shape": "s32[1500,2]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:615", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:615 (pixel_splitted_regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt_split.py:137 (AdaptSplit.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:332 (AbstractInversion.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "input_concatenate_fusion.11", + "ms": 0.0015515937499999998, + "opcode": "fusion", + "shape": "pred[3]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:88", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:88 (split_points_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:410 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + } + ], + "mesh_locate_walk": [ + { + "instruction": "loop_reduce_fusion", + "ms": 0.025831068749999925, + "opcode": "fusion", + "shape": "(f64[21361]{0}, s64[21361]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:264", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:264 (_walk_from_seed..walk_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:292 (_walk_from_seed..body)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:264 (_walk_from_seed..walk_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:292 (_walk_from_seed..body)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)" + ] + }, + { + "instruction": "input_reduce_fusion.1", + "ms": 0.025124125, + "opcode": "fusion", + "shape": "pred[196]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:288", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:288 (_walk_from_seed..cond)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:353 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)" + ] + }, + { + "instruction": "loop_or_select_fusion", + "ms": 0.02352166874999974, + "opcode": "fusion", + "shape": "(s32[21361]{0}, pred[21361]{0}, pred[21361]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:270", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:270 (_walk_from_seed..walk_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:292 (_walk_from_seed..body)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:353 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)" + ] + }, + { + "instruction": "loop_select_fusion", + "ms": 0.02023009999999994, + "opcode": "fusion", + "shape": "s32[21361]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:242", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:242 (_walk_from_seed..weights_of)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:262 (_walk_from_seed..walk_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:292 (_walk_from_seed..body)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:353 (pix_indexes_delaunay_walk_from)" + ] + }, + { + "instruction": "input_reduce_fusion.2", + "ms": 0.016249318750000123, + "opcode": "fusion", + "shape": "pred[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:288", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:288 (_walk_from_seed..cond)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:353 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)" + ] + }, + { + "instruction": "while.20", + "ms": 0.014592549999999722, + "opcode": "while", + "shape": "(s32[], s32[21361]{0}, pred[21361]{0}, pred[21361]{0}, s32[3000,3]{1,0}, /*index=5*/f64[1500,2]{1,0}, f64[21361,2]{1,0}, s32[3000,3]{1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:353 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "psf_convolution_mapping_matrix": [ + { + "instruction": "input_scatter_fusion", + "ms": 1.9917171125000004, + "opcode": "fusion", + "shape": "f64[1500,180,180]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "fft.19.0", + "ms": 1.7617358500000007, + "opcode": "fft", + "shape": "f64[1500,180,180]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "fft.15.0", + "ms": 1.3688939375000002, + "opcode": "fft", + "shape": "c128[1500,180,91]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "fft.17.0", + "ms": 0.9794694999999998, + "opcode": "fft", + "shape": "c128[1500,91,180]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "input_transpose_fusion.2", + "ms": 0.5134825312500002, + "opcode": "fusion", + "shape": "c128[1500,91,180]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "wrapped_transpose", + "ms": 0.49957474375000005, + "opcode": "fusion", + "shape": "c128[1500,180,91]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + } + ], + "inversion_other": [ + { + "instruction": "cholesky.80", + "ms": 0.8981578250000019, + "opcode": "custom-call", + "shape": "(f64[1500,1500]{0,1}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986 (AbstractInversion._log_det_symmetric_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:1078 (AbstractInversion.log_det_curvature_reg_matrix_term)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:347 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/model/analysis.py:135 (AnalysisImaging.log_likelihood_function)" + ] + }, + { + "instruction": "cholesky.90", + "ms": 0.8934438625000016, + "opcode": "custom-call", + "shape": "(f64[1500,1500]{0,1}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986 (AbstractInversion._log_det_symmetric_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:1157 (AbstractInversion.log_det_regularization_matrix_term)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:348 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/model/analysis.py:135 (AnalysisImaging.log_likelihood_function)" + ] + }, + { + "instruction": "loop_reduce_window_fusion", + "ms": 0.002880768749999993, + "opcode": "fusion", + "shape": "s64[6,16]{1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "loop_reduce_window_fusion.1", + "ms": 0.0027893749999999998, + "opcode": "fusion", + "shape": "s64[94,16]{1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "loop_broadcast_convert_fusion", + "ms": 0.0021827874999999926, + "opcode": "fusion", + "shape": "(s32[1500]{0}, s64[1500]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:527", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:527 (AbstractInversion.zeroed_ids_to_keep)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:567 (AbstractInversion.solve_ids_to_keep)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:684 (AbstractInversion.reconstruction)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "input_scatter_fusion.5", + "ms": 0.0019523937499999978, + "opcode": "fusion", + "shape": "s64[1500]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:527", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:527 (AbstractInversion.zeroed_ids_to_keep)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:567 (AbstractInversion.solve_ids_to_keep)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:684 (AbstractInversion.reconstruction)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "mapping_matrix": [ + { + "instruction": "input_reduce_fusion.23", + "ms": 0.0029050062499999902, + "opcode": "fusion", + "shape": "f64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:93", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:93 (adaptive_pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/abstract.py:507 (Mapper.pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt.py:339 (Adapt.regularization_weights_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt_split.py:120 (AdaptSplit.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)" + ] + } + ], + "curvature_matrix_F": [ + { + "instruction": "cublas-lt-matmul.2", + "ms": 4.24611018125, + "opcode": "custom-call", + "shape": "(f64[1500,1500]{1,0}, s8[4194304]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:134", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:134 (curvature_matrix_via_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:93 (InversionImagingMapping.curvature_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:389 (AbstractInversion.curvature_reg_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "chi_squared_evidence": [ + { + "instruction": "loop_multiply_fusion", + "ms": 0.003007562499999996, + "opcode": "fusion", + "shape": "f64[15361]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/abstract_ndarray.py:300", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/abstract_ndarray.py:300 (AbstractNDArray.__pow__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/abstract_ndarray.py:60 (unwrap_array..wrapper)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/abstract_ndarray.py:35 (to_new_array..wrapper)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_util.py:78 (chi_squared_map_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:78 (AbstractFit.chi_squared_map)" + ] + } + ] + }, + "stage_audit_note": "The HLO instructions that contributed most of each stage's milliseconds, with their full source stack. A stage row is only as good as the rules that built it; this is how a reader checks a row against the HLO instead of trusting it.", + "untraced_wall_ms": 32.3350219937538, + "reconciliation_vs_untraced_pct": -7.586444739322157, + "wall_basis": "wall_ms is the TRACED run's wall, the run these kernel durations came from. untraced_wall_ms is the same executable without the profiler; the difference is the profiler's overhead and belongs in neither the stages nor the idle row.", + "calls": 160, + "call_split": "per-call (first-instruction recurrence)", + "call_blocks": 160, + "events": 73390, + "streams": [ + "Stream #14(MemcpyH2D,Compute,MemcpyD2H,Memset,MemcpyD2D)" + ], + "per_stage_ms": { + "border_relocator": { + "median_ms": 0.101663, + "min_ms": 0.10115000000000002, + "max_ms": 0.10242900000000002 + }, + "chi_squared_evidence": { + "median_ms": 0.003008, + "min_ms": 0.002847, + "max_ms": 0.003327 + }, + "curvature_matrix_F": { + "median_ms": 4.243834, + "min_ms": 4.229319, + "max_ms": 4.339802 + }, + "inversion_other": { + "median_ms": 1.8035354999999997, + "min_ms": 1.7878880000000001, + "max_ms": 1.817648 + }, + "mapping_matrix": { + "median_ms": 0.002912, + "min_ms": 0.002879, + "max_ms": 0.002944 + }, + "memset": { + "median_ms": 0.021216, + "min_ms": 0.010048, + "max_ms": 0.053536000000000014 + }, + "mesh_construction": { + "median_ms": 0.002048, + "min_ms": 0.002048, + "max_ms": 0.00208 + }, + "mesh_locate_walk": { + "median_ms": 0.15049600000000002, + "min_ms": 0.13251100000000002, + "max_ms": 0.18655800000000006 + }, + "mesh_qhull_callback": { + "median_ms": 0.010624, + "min_ms": 0.010527, + "max_ms": 0.011200000000000002 + }, + "mesh_seed_argmin": { + "median_ms": 0.22793350000000012, + "min_ms": 0.22752100000000008, + "max_ms": 0.2283820000000001 + }, + "mixed_fusion": { + "median_ms": 1.994142, + "min_ms": 1.9845259999999998, + "max_ms": 2.0064840000000004 + }, + "other": { + "median_ms": 0.06620799999999999, + "min_ms": 0.06383799999999999, + "max_ms": 0.07071899999999999 + }, + "pdip_solve": { + "median_ms": 7.627229, + "min_ms": 2.4333360000000006, + "max_ms": 23.172370000000008 + }, + "psf_convolution_mapping_matrix": { + "median_ms": 7.1153775, + "min_ms": 7.102593000000001, + "max_ms": 7.125762 + }, + "regularization_H": { + "median_ms": 0.010944, + "min_ms": 0.01088, + "max_ms": 0.01136 + } + }, + "stage_order": [ + "border_relocator", + "mesh_qhull_callback", + "mesh_seed_argmin", + "mesh_locate_walk", + "mesh_construction", + "mapping_matrix", + "psf_convolution_mapping_matrix", + "curvature_matrix_F", + "regularization_H", + "pdip_solve", + "chi_squared_evidence", + "inversion_other", + "mixed_fusion", + "other", + "memset" + ], + "mixed_fusion": { + "ms": 1.994142, + "constituent_stage_sets": { + "curvature_matrix_F + psf_convolution_mapping_matrix": 1.0222060687499999, + "pdip_solve + psf_convolution_mapping_matrix": 0.227287425, + "data_vector_D + pdip_solve": 0.1254148375, + "mapped_reconstruction + pdip_solve": 0.11514451250000009, + "mapping_matrix + pdip_solve": 0.11348248124999995, + "curvature_reg_reduce_gather + inversion_other + mapped_reconstruction + pdip_solve + reconstruction_scatter": 0.11002071875, + "pdip_solve + regularization_H": 0.045843649999999965, + "inversion_other + pdip_solve + regularization_H": 0.024280893750000008, + "inversion_other + pdip_solve": 0.023086343750000037, + "inversion_other + mapping_matrix + mesh_construction + mesh_dual_areas + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin + pdip_solve": 0.021611925000000008, + "inversion_other + mesh_construction + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin + pdip_solve + regularization_H": 0.019178118750000007, + "inversion_other + mesh_construction + mesh_dual_areas + mesh_interpolation_weights + pdip_solve + regularization_H": 0.014693356249999994, + "pdip_solve + ray_trace_data_grid": 0.013694924999999908, + "border_relocator + pdip_solve": 0.013572524999999964, + "inversion_other + mapping_matrix + mesh_construction + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin": 0.011665712499999996, + "grids_and_structures + mass_profile_deflections + pdip_solve": 0.010259375000000001, + "grids_and_structures + mass_profile_deflections + pdip_solve + ray_trace_data_grid": 0.0090448, + "chi_squared_evidence + pdip_solve": 0.0077099625000000005, + "inversion_other + mesh_construction + mesh_seed_argmin + pdip_solve + regularization_H": 0.0071267625000000015, + "inversion_other + mesh_dual_areas + mesh_locate_walk": 0.006757962499999999, + "inversion_other + mesh_construction + pdip_solve + regularization_H": 0.0065437687499999946, + "grids_and_structures + mass_profile_deflections + ray_trace_data_grid": 0.005568593749999997, + "inversion_other + pdip_solve + ray_trace_data_grid": 0.005387374999999999, + "inversion_other + regularization_H": 0.005236981249999982, + "inversion_other + mapped_reconstruction + pdip_solve + reconstruction_scatter": 0.004933956250000004, + "inversion_other + mapped_reconstruction + pdip_solve": 0.0038193812499999987, + "mapping_matrix + pdip_solve + regularization_H": 0.003507181250000001, + "inversion_other + mesh_construction + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin": 0.0031795812499999985, + "inversion_other + mesh_construction + mesh_dual_areas + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin": 0.00298280625, + "inversion_other + mesh_construction + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin + regularization_H": 0.002733193750000008, + "inversion_other + mesh_dual_areas + mesh_locate_walk + pdip_solve": 0.0026055750000000054, + "inversion_other + mesh_locate_walk + mesh_seed_argmin": 0.0025223999999999963, + "inversion_other + mesh_interpolation_weights": 0.0021609937500000013, + "chi_squared_evidence + inversion_other": 0.0019507687500000025 + }, + "example_kernels": { + "curvature_matrix_F + psf_convolution_mapping_matrix": [ + "loop_divide_gather_fusion" + ], + "pdip_solve + psf_convolution_mapping_matrix": [ + "loop_broadcast_fusion.4" + ], + "data_vector_D + pdip_solve": [ + "input_reduce_fusion.5", + "input_reduce_fusion.21" + ], + "mapped_reconstruction + pdip_solve": [ + "input_reduce_fusion.9" + ], + "mapping_matrix + pdip_solve": [ + "loop_broadcast_fusion.2", + "loop_divide_fusion" + ], + "curvature_reg_reduce_gather + inversion_other + mapped_reconstruction + pdip_solve + reconstruction_scatter": [ + "input_multiply_transpose_fusion" + ], + "pdip_solve + regularization_H": [ + "loop_select_fusion.2", + "input_transpose_fusion.3" + ], + "inversion_other + pdip_solve + regularization_H": [ + "input_transpose_fusion.4" + ], + "inversion_other + pdip_solve": [ + "input_reduce_fusion.7", + "loop_log_fusion", + "input_reduce_fusion.8", + "input_reduce_fusion.12" + ], + "inversion_other + mapping_matrix + mesh_construction + mesh_dual_areas + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin + pdip_solve": [ + "input_scatter_fusion.6", + "input_scatter_fusion.3" + ] + }, + "prorated_estimate_ms": { + "psf_convolution_mapping_matrix": 0.6247467468749999, + "curvature_matrix_F": 0.5111030343749999, + "pdip_solve": 0.39547136916666653, + "mapped_reconstruction": 0.08208301614583338, + "inversion_other": 0.06884685208333335, + "data_vector_D": 0.06270741875, + "mapping_matrix": 0.06255607708333331, + "regularization_H": 0.043508458229166644, + "reconstruction_scatter": 0.023237632812500002, + "curvature_reg_reduce_gather": 0.02200414375, + "mesh_construction": 0.014484277604166668, + "ray_trace_data_grid": 0.012760652083333286, + "mesh_locate_walk": 0.012718938125000002, + "mesh_interpolation_weights": 0.012503479791666671, + "mesh_seed_argmin": 0.011240242708333337, + "mesh_dual_areas": 0.008551565625, + "grids_and_structures": 0.007537189583333333, + "mass_profile_deflections": 0.007537189583333333, + "border_relocator": 0.006786262499999982, + "chi_squared_evidence": 0.004830365625000001 + }, + "prorated_note": "ESTIMATE ONLY \u2014 a mixed fusion's time split equally across the stages its constituents span. Never summed into the measured table, never reconciled." + }, + "other_sources_ms": { + "copy.80": 0.0421512312500022, + "copy.48": 0.016989462500000115, + "copy.53": 0.0019827937500000005, + "copy.79": 0.0017985875000000005, + "copy.78": 0.0017723812499999992, + "copy.39": 0.0016623937499999995 + }, + "device_span_ms": 33.28327708125, + "device_busy_ms": 26.782504162499997, + "device_idle_ms": 6.500772918750002, + "largest_idle_gaps": [ + { + "gap_ms": 5.438192, + "after": "pure_callback.4", + "before": "pure_callback.4" + }, + { + "gap_ms": 0.037408, + "after": "while.26", + "before": "input_reduce_select_fusion" + }, + { + "gap_ms": 0.033759, + "after": "pure_callback.4", + "before": "copy.79" + }, + { + "gap_ms": 0.031871, + "after": "copy.48", + "before": "input_reduce_fusion.1" + }, + { + "gap_ms": 0.02832, + "after": "pure_callback.4", + "before": "pure_callback.4" + }, + { + "gap_ms": 0.027456, + "after": "input_concatenate_fusion.7", + "before": "pure_callback.4" + }, + { + "gap_ms": 0.022272, + "after": "input_reduce_fusion.20", + "before": "loop_broadcast_fusion.4" + }, + { + "gap_ms": 0.021504, + "after": "loop_select_fusion", + "before": "loop_reduce_fusion" + } + ], + "kernel_ms": 23.3811705, + "sum_ms": 29.88194341875, + "wall_ms": 33.28910491250099, + "host_outside_span_ms": 0.0058278312509898456, + "reconciliation_pct": -10.23506490398756, + "unjoined_ms": 0.0, + "unjoined_pct": 0.0, + "other_ms": 0.06620799999999999, + "other_pct": 0.19888789492545664, + "note": "Stage rows attribute the command-buffers-OFF program (see the module docstring): kernel times are the same, the launch overhead the CUDA graphs remove is not. sum_ms = kernel rows + device_idle_ms; the residual against wall_ms is host_outside_span_ms (dispatch before the first kernel, teardown after the last).", + "per_stage_ms_per_lane": { + "border_relocator": 0.101663, + "chi_squared_evidence": 0.003008, + "curvature_matrix_F": 4.243834, + "inversion_other": 1.8035354999999997, + "mapping_matrix": 0.002912, + "memset": 0.021216, + "mesh_construction": 0.002048, + "mesh_locate_walk": 0.15049600000000002, + "mesh_qhull_callback": 0.010624, + "mesh_seed_argmin": 0.22793350000000012, + "mixed_fusion": 1.994142, + "other": 0.06620799999999999, + "pdip_solve": 7.627229, + "psf_convolution_mapping_matrix": 7.1153775, + "regularization_H": 0.010944 + }, + "per_lane_divisor": 1, + "host_callback": { + "pure_callback_span_ms": 79.30217320000008, + "qhull_ms": 73.9355556, + "callback_body_ms_note": "the OUTERMOST matching body event, not a sum: under the probe the body appears twice (the wrapper and the timed re-implementation it calls) and summing them would count the same work twice", + "events_by_name": { + "pure_callback.4": { + "count": 160, + "ms": 79.30217320000008 + }, + "$callback.py:815 _wrapped_callback": { + "count": 160, + "ms": 77.91111580000002 + }, + "$callback.py:224 _callback": { + "count": 160, + "ms": 77.5358856 + }, + "$callback.py:74 pure_callback_impl": { + "count": 160, + "ms": 77.40016880000003 + }, + "$callback.py:69 __call__": { + "count": 160, + "ms": 74.17798120000002 + }, + "$delaunay.py:162 ": { + "count": 160, + "ms": 74.07748219999998 + }, + "$host_callback_probe.py:225 wrapped": { + "count": 160, + "ms": 73.9355556 + }, + "$host_callback_probe.py:160 _timed_tri_only": { + "count": 160, + "ms": 73.80817850000001 + }, + "ThenExecuteCallback:GetEventForComputeStreamSyncPoint": { + "count": 160, + "ms": 0.28706550000000003 + }, + "$callback.py:822 ": { + "count": 640, + "ms": 0.23090409999999956 + }, + "$__init__.py:132 _xla_gc_callback": { + "count": 2, + "ms": 0.00037200000000000004 + } + }, + "note": "HOST milliseconds per traced BATCH (the whole invocation), aggregated by name because the events nest. Not a row of the device table: the device pays for them as the idle gaps largest_idle_gaps names." + }, + "host_callback_ms": 79.30217320000008 + }, + "hlo_census": { + "status": "excluded", + "reason": "The legacy census anchors PyAutoArray source line numbers that moved after the phase-1 run. No batched attribution is published from unsupported anchors; the device-event table and wall reconciliation remain valid." + }, + "trace_split": { + "expected_calls": 160, + "executions_per_invocation": 16, + "method": "per-call (first-instruction recurrence)", + "note": "DECIDED IN CODE: the scalar arm's trace is split by trace_calls * B, so every lane's execution is its own block and the per-stage median is taken over all of them. The vmap arm's is split by trace_calls, one block per batched execution, and per_stage_ms_per_lane divides those rows by B." + } + } + }, + "certification_report": { + "source": "vmap arm, library solve observed through its stats= out-dict (PyAutoArray #566) and jax.debug.callback(..., ordered=True); ordered because the unordered batching rule returns the lanes permuted. Untimed, separately compiled; max rel diff of its log likelihoods vs the timed arm's: 1.719e-06", + "rows": 16, + "pdip_iter": "NOT AVAILABLE per lane without changing library numerics. The fallback branch calls the library's own reconstruction_positive_only_from, which returns the solution alone \u2014 jax_nnls.solve_nnls' iteration count is discarded inside the library's custom_vjp primal. The PDIP while_loop's cost is in the pdip_solve stage row of each arm's device table instead, which is a max-over-lanes quantity under vmap because every lane runs the same fixed kernel sequence.", + "passes_semantics": "library `passes`: restricted active-set passes run (jax_active_set.solve_certified)" + }, + "lane_construction": { + "draws_sha256": "0d36cfdd54138e3d4343da6cff62621f6145bc8ee8d317d15fbcea328cacd342", + "lane_rows": [ + 300, + 301, + 302, + 303, + 304, + 305, + 306, + 307, + 308, + 309, + 310, + 311, + 312, + 313, + 314, + 315 + ], + "calls": [ + 15 + ], + "stage": "pix1", + "regularization_range": { + "galaxies.source.pixelization.regularization.inner_coefficient": { + "min": 8.610204122811597e-06, + "max": 609.7498208301598 + }, + "galaxies.source.pixelization.regularization.outer_coefficient": { + "min": 3.4330906156470037e-06, + "max": 159.11676392313697 + }, + "galaxies.source.pixelization.regularization.signal_scale": { + "min": 0.12452271846719754, + "max": 0.9404155018121758 + } + }, + "phases": [ + "exploration" + ], + "window_rule": "nautilus_batches.timed_window: consecutive captured calls, in call order, from the FIRST call that is not a prior batch, concatenated and truncated to B; at B == n_batch exactly one real Nautilus batch. Falls back to the latest B lanes if the post-prior lanes run out; never repeats a lane.", + "note": "Lane k is captured lane lane_rows[k]: the mass AND shear of a real Nautilus proposal (nautilus_batch_capture.py), lens light fixed at S3, the S3 light-subtracted dataset shared by every lane. `offsets` in the lane table are the mass offsets from the fiducial; the shear is in the capture file." + }, + "captured": { + "batches_path": "/mnt/ral/jnightin/autolens_profiling_wt/certified-solver-phase-c1-lane-rate/results/breakdown/imaging/nautilus_batches_delaunay_pix1.npz", + "batches_sha256": "e71a5e23026b342d1ff4359b8fb914a87980d8aea0060659d2334dcfa3215c00", + "schema_version": 2, + "n_calls": 932, + "n_lanes": 18640, + "call_sizes_seen": [ + 20 + ], + "calls_by_phase": { + "prior": 15, + "exploration": 917 + }, + "parameter_paths": [ + "galaxies.source.pixelization.regularization.inner_coefficient", + "galaxies.source.pixelization.regularization.outer_coefficient", + "galaxies.source.pixelization.regularization.signal_scale", + "galaxies.lens.mass.centre.centre_0", + "galaxies.lens.mass.centre.centre_1", + "galaxies.lens.mass.einstein_radius", + "galaxies.lens.mass.ell_comps.ell_comps_0", + "galaxies.lens.mass.ell_comps.ell_comps_1", + "galaxies.lens.shear.gamma_1", + "galaxies.lens.shear.gamma_2" + ], + "stage": "pix1", + "regularization": { + "class": "AdaptSplit", + "free": true, + "priors": { + "inner_coefficient": [ + "LogUniform", + 1e-06, + 1000000.0 + ], + "outer_coefficient": [ + "LogUniform", + 1e-06, + 1000000.0 + ], + "signal_scale": [ + "Uniform", + 0.0, + 1.0 + ] + }, + "priors_source": "PyAutoGalaxy packaged config/priors/regularization (adapt_split.yaml / constant.yaml); adapt_split.yaml is identical to euclid_strong_lens_modeling_pipeline/config/priors/regularization/adapt_split.yaml" + }, + "nautilus": { + "departures_from_production": [ + "mass/shear priors are the phase-B cell's Gaussians, not chained from source_lp", + "no positions likelihood", + "the cell's mesh (Hilbert 1500, weight_power 1) in both stages; source_pix_2 redraws a 500-vertex Hilbert grid at weight_power 3.5", + "seeded (production passes no seed)", + "quick updates disabled (iterations_per_quick_update=1e12; render-only)", + "NullPaths: no output directory, so no checkpoint and one Sampler.run call", + "post-fit perform_update skipped (samples / latent variables never built)" + ], + "n_batch": 20, + "n_like_max": 40000, + "n_live": 150, + "number_of_cores": 1, + "production_reference": "euclid_strong_lens_modeling_pipeline/scripts/full_model.py source_pix_1 (n_live=150) / source_pix_2 (n_live=75): af.Nautilus(n_batch=20, **SettingsSearch.search_dict) with use_jax_vmap=True and number_of_cores=1 (SettingsSearch defaults)", + "production_stage": "source_pix_1", + "seed": 1, + "stage": "pix1", + "use_jax_vmap": true, + "version": "1.0.5" + }, + "capture_fit_status": "sampling complete (n_like_max or convergence); post-fit result skipped", + "capture_library_revisions": { + "PyAutoArray": { + "head": "7fa8d2714f7da43fec2b23c31bff580764831670", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoArray" + }, + "PyAutoFit": { + "head": "a736840127be7a3c21e15a5c945e94d8f1082983", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoFit" + }, + "PyAutoGalaxy": { + "head": "70a61e26cd715cefe7012a38285698091246a8a4", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy" + }, + "PyAutoLens": { + "head": "86054bbc19baa2f710a12e04a94fa27ab37cc354", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoLens" + }, + "PyAutoNerves": { + "head": "1fa613aa8d89a79613009fb66f5b4e2d21deb57a", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoNerves" + } + }, + "fingerprint_check": { + "fields": [ + "mesh", + "source_pixels", + "dataset_sha256", + "regularization_class", + "regularization_s0_fiducial", + "border_relocator", + "use_mixed_precision", + "log_evidence_s3_library" + ], + "not_identity": "the regularization coefficients: free per lane since the capture frees them", + "log_evidence_s3_library_rel_diff": 0.0, + "passed": true + }, + "timed_window_vs_capture_pdip": { + "reference": "the capture's own figure of merit (library PDIP, Fitness.call_wrap jax.jit(jax.vmap(call)) over parameter vectors) for the same lanes", + "compared_against": "this cell's jit(vmap) library-PDIP reference", + "n_compared": 16, + "max_rel_diff": 1.309592033202303e-06, + "max_abs_diff_nats": 0.23195374920032918, + "gated": false, + "note": "RECORDED, NOT GATED: proves the lane trees rebuilt here are the models the sampler evaluated (a wrong parameter mapping shows up as nats, not 1e-10)." + } + }, + "matched": { + "vmap_wall_per_lane_ms": 32.33851297500223, + "scalar_wall_per_lane_ms": 32.061966100013706, + "speedup_vmap_over_scalar": 0.9914483737949764, + "note": "Both walls are the PRODUCTION nesting of their arm, measured in one process on the same B lanes with the SAME library Settings (no injection). A speedup below 1 means the batch is slower per lane than B sequential jitted calls." + }, + "solver_source": "library", + "solver": "certified", + "certified_fallback": "none", + "certified_pass_budget": 16, + "certified_pass_budget_basis": "config default (Settings().certified_pass_budget)", + "certified_tau_rel": 1e-09, + "solver_used": "certified", + "solver_check": { + "solver_used": "certified", + "solver_used_source": "AbstractInversion.positive_only_solver_used on the fiducial S3 inversion, built eagerly on the JAX backend (AnalysisImaging(use_jax=True).fit_from) with the arms' Settings", + "reference_solver_used": "pdip", + "traced_solver_kwargs_jax": [ + "certified" + ], + "observed_calls_jax": 1, + "report_rows": 16, + "report_vs_timed_arm_max_rel_diff": 1.7194866419029146e-06 + }, + "lanes_certified": [ + true, + false, + true, + true, + true, + true, + true, + true, + true, + true, + true, + false, + true, + true, + false, + false + ], + "lanes_passes": [ + 10, + 16, + 0, + 0, + 10, + 4, + 0, + 1, + 4, + 0, + 2, + 16, + 9, + 2, + 16, + 16 + ], + "uncertified_lanes": 4, + "per_lane_certification_note": "certified / passes come from the library's own solve through its stats= out-dict (PyAutoArray #566): passes is the number of restricted active-set passes the library ran (0 when the unconstrained solve was already non-negative), certified is its KKT certificate. With certified_fallback=pdip a False lane returned the PDIP solution; with none it returned the last uncertified iterate. null for a library-PDIP row (no certificate).", + "gate": { + "pre_registered": true, + "gated": [ + "per lane: jit(vmap) arm vs jit(vmap) library PDIP <= lane_rtol relative", + "per lane: scalar jit arm vs scalar jit library PDIP <= lane_rtol relative" + ], + "recorded_not_gated": [ + "per lane: jit(vmap) arm vs scalar jit arm (rel_diff, abs_diff_nats)", + "per lane: jit(vmap) library PDIP vs scalar jit library PDIP", + "uncertified_lanes (certified_fallback=none rows)" + ], + "lanes_failed": 8, + "passed": false, + "policy_eligible": false, + "note": "Pre-registered before submission (module docstring; submit header). Phase 3 (results/notes/hst_gpu_residue_phase3_psf_2026_09.md) placed phase 2's ~2.5e-9 certified-vs-PDIP residual BETWEEN the jit(vmap) and scalar-jit compositions, not in the solver \u2014 so each arm is gated against the library-PDIP reference of its OWN composition, and the cross-composition difference is recorded with its nats. A certified_fallback=none row is policy-eligible only if every lane certifies AND passes the gate. Timing is never gated." + }, + "library_revisions": { + "PyAutoArray": { + "head": "3de624b5b91a4efa130dc3cb0a3a0f06f85025a3", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoArray", + "module_file": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/__init__.py" + }, + "PyAutoFit": { + "head": "dd9fbe0aab60c4a57702b1444ca031b317c91331", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoFit", + "module_file": "/mnt/ral/jnightin/PyAuto/PyAutoFit/autofit/__init__.py" + }, + "PyAutoGalaxy": { + "head": "70a61e26cd715cefe7012a38285698091246a8a4", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy", + "module_file": "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/__init__.py" + }, + "PyAutoLens": { + "head": "86054bbc19baa2f710a12e04a94fa27ab37cc354", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoLens", + "module_file": "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/__init__.py" + }, + "autoarray_file": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/__init__.py" + } + }, + "headline_arm_note": "`trace`, `hlo_census`, `command_buffers` and `trace_timing` above describe the scalar arm \u2014 the program phase 1 traced. Both arms' full blocks, the lane table and the matched comparison are under `vmap`." +} \ No newline at end of file diff --git a/results/breakdown/imaging/fixed_light_trace_delaunay_jitvmap16_captured_pix1_libcertified_fboff_b16_hpc_a100_fp64_fixed_light_trace.png b/results/breakdown/imaging/fixed_light_trace_delaunay_jitvmap16_captured_pix1_libcertified_fboff_b16_hpc_a100_fp64_fixed_light_trace.png new file mode 100644 index 0000000000000000000000000000000000000000..688cc6f224c307e3c44a0334400d093aa4a05c14 GIT binary patch literal 150446 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
5U&2GWSLrea0Vk8)NXGwHLRCnh-f%m4& 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 PLEoN;=v_78Njbj&1a_`r literal 0 HcmV?d00001 diff --git a/results/breakdown/imaging/fixed_light_trace_delaunay_jitvmap16_captured_pix1_libcertified_fbon_b16_hpc_a100_fp64_fixed_light_trace.json b/results/breakdown/imaging/fixed_light_trace_delaunay_jitvmap16_captured_pix1_libcertified_fbon_b16_hpc_a100_fp64_fixed_light_trace.json new file mode 100644 index 000000000..4ba7d77d6 --- /dev/null +++ b/results/breakdown/imaging/fixed_light_trace_delaunay_jitvmap16_captured_pix1_libcertified_fbon_b16_hpc_a100_fp64_fixed_light_trace.json @@ -0,0 +1,5799 @@ +{ + "device": { + "backend": "gpu", + "device": "cuda:0", + "hostname": "euclid-ral-gpu-2", + "xla_flags": "--xla_disable_hlo_passes=constant_folding --xla_gpu_autotune_level=0 --xla_gpu_enable_triton_gemm=false", + "omp_num_threads": null, + "cpu_count": 124, + "jax_compilation_cache_dir": "/mnt/ral/jnightin/autolens_profiling_wt/certified-solver-phase-c1-lane-rate/output/jax_cache/fixed_light_lanerate_delaunay_pix1_time_16_certified_on_350768_9", + "autotune_cache_entries_at_start": 0, + "cache_fresh": true, + "nvidia_smi": "NVIDIA A100 80GB PCIe, 35457 MiB, 81920 MiB" + }, + "machine": { + "cpu_model": "AMD EPYC 7702 64-Core Processor", + "cpu_count_os": 124, + "nproc": 4, + "nproc_all": 124, + "nproc_note": "GNU nproc honours OMP_NUM_THREADS, so `nproc` can print 1 on a multi-core host; `nproc_all` is the core count.", + "ram_total": "928298204 kB", + "kernel": "5.14.0-687.50.1.el9_8.x86_64", + "platform": "Linux-5.14.0-687.50.1.el9_8.x86_64-x86_64-with-glibc2.34", + "python": "3.12.4", + "jax_thread_env": { + "NPROC": null + }, + "blas_thread_env": { + "OMP_NUM_THREADS": null, + "OPENBLAS_NUM_THREADS": null, + "MKL_NUM_THREADS": null, + "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" + }, + "precision": "fp64", + "configuration": { + "pixel_scale_arcsec": 0.05, + "mask_radius_arcsec": 3.5, + "image_pixels_masked": 15361, + "over_sampled_pixels": 62752, + "mesh": "delaunay", + "mesh_shape": null, + "source_pixels": 1500, + "source_pixels_requested": null, + "dataset": "hst", + "dataset_sha256": { + "data.fits": "e4e833a28e9c6f6fb023cd85c0d3dde74068720256bc77a240633500e5b04fac", + "noise_map.fits": "315c6266a0acd3ac9c8da82fcd2b45a08697362481fd7a35072bab1658530ba3", + "psf.fits": "8389ba0e8bf4a09b4a561cfc246181a2fb944ed396754cd0ff76fdd22910d303" + }, + "cell_source_sha256": "06a162fcdae6b329384ec33322f443df07215d86e56f0505ac15b3d3473eb432", + "inversion_path": "dense", + "pass_budget": 7, + "pass_budget_basis": "phase 3 (autolens_profiling#255): the smallest ZERO-fallback budget per mesh, the budget a production run fixes. NOT phase 0's certifying budget (2 for Delaunay), which falls back on 67.5 % of a graded draw set and is not a production cost.", + "border_relocator_mode": "cell", + "border_relocator": true, + "border_relocator_note": "'cell' is use_border_relocator=True, which every profiling cell in this family forces; 'library' passes None and takes the shipped config default, which is what production runs. The resolved boolean is what this leg actually ran.", + "routes_selected": [ + "b", + "d" + ], + "trace_calls": 10, + "command_buffers_traced": "off", + "use_mixed_precision": false, + "tau_rel": 1e-09, + "regularization": { + "scheme": "adapt_split", + "inner_coefficient": 0.1, + "outer_coefficient": 10.0, + "signal_scale": 0.1 + }, + "thread_env": { + "n_threads": null, + "vars": [ + "OPENBLAS_NUM_THREADS", + "MKL_NUM_THREADS", + "OMP_NUM_THREADS", + "VECLIB_MAXIMUM_THREADS", + "NUMEXPR_NUM_THREADS" + ], + "set_to": null, + "preexisting": {}, + "overridden": {}, + "note": "Not pinned (legacy variant): recorded as found." + }, + "over_sample_size_lp_rule": { + "sub_size_list": [ + 4, + 2, + 2 + ], + "radial_list": [ + 0.3, + 0.6 + ], + "centre": [ + 0.0, + 0.0 + ] + }, + "vmap_batch": 16, + "lanes": "captured", + "arms": [ + "vmap", + "scalar" + ], + "fallback": "on", + "draw_seed": 0, + "vmap_composition": "jax.jit(jax.vmap(fn))", + "lane_rtol": 1e-09, + "vmap_flags_note": "Strict ProfileCLI.parse_cell_args rejects unknown flags. These keys record the exact batching program and prevent historical vmap(jit) artifacts from being mistaken for current jit(vmap) measurements.", + "solver_source": "library", + "solver": "certified", + "certified_fallback": "pdip", + "certified_pass_budget": 16, + "captured_pass": "time", + "batches": "/mnt/ral/jnightin/autolens_profiling_wt/certified-solver-phase-c1-lane-rate/results/breakdown/imaging/nautilus_batches_delaunay_pix1.npz" + }, + "solver_injection": { + "patched": null, + "part_v": "none \u2014 library mode selects the solver through al.Settings", + "part_b_route_d": { + "patched": "autoarray.inversion.inversion.inversion_util.reconstruction_positive_only_from", + "pass_budget": 7, + "fallback": true + }, + "note": "Library mode (phase B, #300): PART V's arms and references run the library's own positive-only solve, selected by Settings(positive_only_solver, certified_fallback, certified_pass_budget); nothing is injected. PART B's single-call route d (the fiducial d == b pin) still uses the phase-1 harness injection at the phase-3 budget and is not a phase-B row. The untimed certification report observes the library solve (library_solver_observed) without changing it." + }, + "routes": { + "b_s3_pdip": { + "label": "S3 PDIP (source-only)", + "status": "ok", + "solver": "library", + "ms": 50.7018980999419, + "log_likelihood": 29155.00017618628 + }, + "d_s3_certified_fallback": { + "label": "S3 certified active set, budget 7, PDIP fallback", + "status": "ok", + "solver": "harness-injected certified active set", + "pass_budget": 7, + "fallback": true, + "injected_solver_calls_jax": 1, + "injected_solver_calls_numpy": 0, + "ms": 31.61700480013678, + "log_likelihood": 29155.000173222637 + } + }, + "equivalence_pins": [ + { + "pin": "route d (certified, fallback) == route b (library PDIP)", + "route": "d_s3_certified_fallback", + "reference": "b_s3_pdip", + "expectation": "the certified active set returns the library's own positive solution", + "rtol": 1e-09, + "got": 29155.000173222637, + "reference_value": 29155.00017618628, + "rel_diff": 1.0165127894013487e-10, + "status": "PASS" + } + ], + "equivalence_rtol": 1e-09, + "reference": { + "log_evidence_s0_library": 29155.00017433923, + "log_evidence_s3_library": 29155.000174339304, + "s3": { + "n_params": 1500, + "n_mapper": 1500, + "n_funcs": 0, + "edge_zeroed_pixels": 0, + "subtracted_light_flux": 5105.448603818575 + } + }, + "command_buffers": { + "wall_on_ms": 624.67713799997, + "wall_off_ms": 629.2699801000708, + "command_buffer_delta_ms": 4.592842100100825, + "command_buffer_delta_pct": 0.7352345428881447, + "traced": "off", + "compiler_option": "xla_gpu_enable_command_buffer", + "probe": { + "note": "Not taken in --vmap-batch mode: the CUPTI-inside-a-CUDA-graph probe is a phase-1 diagnostic about the JOIN, and this mode already compiles and times both the command-buffers ON and OFF executable of every arm." + }, + "note": "ONE lowering, TWO compilations, one process. wall_on_ms is the PRODUCTION program (CUDA graphs as XLA ships them) and is the number comparable to phase 5's row; wall_off_ms is the graph-less program the stage rows attribute. The delta is the launch overhead the graphs remove \u2014 it lands in device_idle and host_outside_span, not in any stage. Reconciliation is computed against wall_off_ms." + }, + "trace": { + "parser": "ProfileData.from_file(xplane) + as_text() + stack_frame_index(proto field 17)", + "stage_audit": { + "mixed_fusion": [ + { + "instruction": "loop_divide_gather_fusion", + "ms": 1.01618255, + "opcode": "fusion", + "shape": "(f64[15361,1,1,1500]{3,2,1,0}, f64[15361,1,1,1500]{3,2,1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:133", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:133 (curvature_matrix_via_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:93 (InversionImagingMapping.curvature_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:389 (AbstractInversion.curvature_reg_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "loop_broadcast_fusion.4", + "ms": 0.22685640624999995, + "opcode": "fusion", + "shape": "f64[1500,180,180]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "input_reduce_fusion.13", + "ms": 0.12212294375, + "opcode": "fusion", + "shape": "f64[92,1500]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/inversion_imaging_util.py:123", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/inversion_imaging_util.py:123 (data_vector_via_blurred_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:67 (InversionImagingMapping.data_vector)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:699 (AbstractInversion.reconstruction)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "input_reduce_fusion.17", + "ms": 0.11467717499999995, + "opcode": "fusion", + "shape": "f64[15361]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:163", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:163 (mapped_reconstructed_data_via_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:120 (InversionImagingMapping._mapped_reconstructed_data_dict_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:196 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "loop_broadcast_fusion.2", + "ms": 0.11074701249999995, + "opcode": "fusion", + "shape": "f64[15361,1500]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:342", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:342 (mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/abstract.py:283 (Mapper.mapping_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:91 (AbstractInversionImaging._mapping_matrix_for_convolution_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:137 (AbstractInversionImaging.operated_mapping_matrix_list)" + ] + }, + { + "instruction": "input_multiply_transpose_fusion", + "ms": 0.1094647, + "opcode": "fusion", + "shape": "(f64[1500,1500]{1,0}, f64[1500,1500]{1,0}, f64[1500,1500]{1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:237 (active_set_search)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:293 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:274 (_certified_positive_only_from)" + ] + } + ], + "border_relocator": [ + { + "instruction": "eigh.45", + "ms": 0.0747120687499999, + "opcode": "custom-call", + "shape": "(f64[2,2]{0,1}, f64[2]{0}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:245", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:245 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:454 (BorderRelocator.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:176 (AbstractMesh.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:214 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "custom-call.2", + "ms": 0.007940712500000002, + "opcode": "custom-call", + "shape": "(f64[2,2]{1,0}, s8[4194304]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:242", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:242 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:454 (BorderRelocator.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:176 (AbstractMesh.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:214 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "input_reduce_fusion.18", + "ms": 0.005587918750000001, + "opcode": "fusion", + "shape": "(f64[], f64[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:269", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:269 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:454 (BorderRelocator.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:176 (AbstractMesh.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:214 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "loop_add_fusion.7", + "ms": 0.0035423562500000007, + "opcode": "fusion", + "shape": "f64[15361]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:308", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:308 (relocated_grid_via_ellipse_border_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:423 (BorderRelocator.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:83 (AbstractMesh.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:208 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "loop_add_fusion.9", + "ms": 0.003390181250000005, + "opcode": "fusion", + "shape": "f64[1500]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:308", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:308 (relocated_grid_via_ellipse_border_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:458 (BorderRelocator.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:176 (AbstractMesh.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:214 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "input_concatenate_fusion.12", + "ms": 0.002420368749999997, + "opcode": "fusion", + "shape": "f64[392,2]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:238", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:238 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:454 (BorderRelocator.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:176 (AbstractMesh.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:214 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + } + ], + "mesh_construction": [ + { + "instruction": "input_concatenate_fusion.7", + "ms": 0.0020611750000000028, + "opcode": "fusion", + "shape": "f64[1500,2]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:820", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:820 (InterpolatorDelaunay.mesh_grid_xy)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:847 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + } + ], + "mesh_qhull_callback": [ + { + "instruction": "pure_callback.4", + "ms": 0.010633525000000033, + "opcode": "custom-call", + "shape": "(s32[3000,3]{1,0}, s32[3000,3]{1,0}, s32[1500]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:161", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:161 (_jax_delaunay_tables)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:405 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + } + ], + "other": [ + { + "instruction": "copy.106", + "ms": 0.04206421875000185, + "opcode": "copy", + "shape": "f64[1,1024,2]{2,1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "copy.70", + "ms": 0.016997462500000067, + "opcode": "copy", + "shape": "s32[21361]{0}", + "source": "", + "stack": [] + }, + { + "instruction": "copy.75", + "ms": 0.0019839874999999997, + "opcode": "copy", + "shape": "s64[1500]{0}", + "source": "", + "stack": [] + }, + { + "instruction": "copy.105", + "ms": 0.001800175, + "opcode": "copy", + "shape": "s32[]", + "source": "", + "stack": [] + }, + { + "instruction": "copy.104", + "ms": 0.0017587874999999999, + "opcode": "copy", + "shape": "s64[]", + "source": "", + "stack": [] + }, + { + "instruction": "copy.61", + "ms": 0.0016451812499999976, + "opcode": "copy", + "shape": "s32[]", + "source": "", + "stack": [] + } + ], + "mesh_seed_argmin": [ + { + "instruction": "input_reduce_fusion", + "ms": 0.14923728124999885, + "opcode": "fusion", + "shape": "(f64[1024]{0}, s64[1024]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:191", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:191 (_nearest_vertex_seed_from..argmin_chunk)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204 (_nearest_vertex_seed_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:351 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)" + ] + }, + { + "instruction": "loop_dynamic_update_slice_fusion", + "ms": 0.04132142499999959, + "opcode": "fusion", + "shape": "s32[21,1024]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204 (_nearest_vertex_seed_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:351 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "loop_add_fusion", + "ms": 0.0319596874999985, + "opcode": "fusion", + "shape": "s64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204 (_nearest_vertex_seed_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:351 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "loop_broadcast_fusion", + "ms": 0.001969968750000002, + "opcode": "fusion", + "shape": "s32[21,1024]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204 (_nearest_vertex_seed_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:351 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "pdip_solve": [ + { + "instruction": "cholesky.60", + "ms": 5.895535906249981, + "opcode": "custom-call", + "shape": "(f64[1500,1500]{0,1}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:252 (active_set_search..body_fun)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:262 (active_set_search)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:293 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)" + ] + }, + { + "instruction": "cholesky.80", + "ms": 3.7716603000000033, + "opcode": "custom-call", + "shape": "(f64[1500,1500]{0,1}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:106", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:106 (factorize_kkt)", + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:212 (pdip_pc_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:83 (solve_nnls)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:129 (_solve_nnls_primal_with..primal)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:164 (solve_nnls_primal_with_status)" + ] + }, + { + "instruction": "triangular-solve.1", + "ms": 1.0602555687500193, + "opcode": "custom-call", + "shape": "(f64[1500,1]{0,1}, s8[0]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:154", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:154 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:252 (active_set_search..body_fun)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:262 (active_set_search)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:293 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)" + ] + }, + { + "instruction": "triangular-solve", + "ms": 0.9150642125000006, + "opcode": "custom-call", + "shape": "(f64[1500,1]{0,1}, s8[0]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:154", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:154 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:252 (active_set_search..body_fun)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:262 (active_set_search)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:293 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)" + ] + }, + { + "instruction": "cholesky.110", + "ms": 0.8895390812499994, + "opcode": "custom-call", + "shape": "(f64[1500,1500]{0,1}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:297 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:274 (_certified_positive_only_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:496 (reconstruction_positive_only_from)" + ] + }, + { + "instruction": "cholesky.100", + "ms": 0.8622849687500019, + "opcode": "custom-call", + "shape": "(f64[1500,1500]{0,1}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:237 (active_set_search)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:293 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:274 (_certified_positive_only_from)" + ] + } + ], + "regularization_H": [ + { + "instruction": "input_scatter_fusion.10", + "ms": 0.0020717625, + "opcode": "fusion", + "shape": "f64[1500,1500]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:615", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:615 (pixel_splitted_regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt_split.py:137 (AdaptSplit.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:332 (AbstractInversion.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "input_concatenate_fusion.9", + "ms": 0.0018711750000000018, + "opcode": "fusion", + "shape": "pred[3]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:91", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:91 (split_points_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:410 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + }, + { + "instruction": "input_concatenate_fusion.8", + "ms": 0.001868987500000002, + "opcode": "fusion", + "shape": "pred[3]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:93", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:93 (split_points_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:410 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + }, + { + "instruction": "input_concatenate_fusion.10", + "ms": 0.001855962500000001, + "opcode": "fusion", + "shape": "pred[3]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:90", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:90 (split_points_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:410 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + }, + { + "instruction": "input_concatenate_fusion", + "ms": 0.0017665874999999987, + "opcode": "fusion", + "shape": "s32[1500,2]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:615", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:615 (pixel_splitted_regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt_split.py:137 (AdaptSplit.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:332 (AbstractInversion.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "input_concatenate_fusion.11", + "ms": 0.0015551812499999987, + "opcode": "fusion", + "shape": "pred[3]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:88", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:88 (split_points_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:410 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + } + ], + "mesh_locate_walk": [ + { + "instruction": "loop_reduce_fusion", + "ms": 0.02537100000000025, + "opcode": "fusion", + "shape": "(f64[21361]{0}, s64[21361]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:264", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:264 (_walk_from_seed..walk_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:292 (_walk_from_seed..body)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:264 (_walk_from_seed..walk_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:292 (_walk_from_seed..body)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)" + ] + }, + { + "instruction": "input_reduce_fusion.1", + "ms": 0.024173693749999777, + "opcode": "fusion", + "shape": "pred[196]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:288", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:288 (_walk_from_seed..cond)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:353 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)" + ] + }, + { + "instruction": "loop_or_select_fusion", + "ms": 0.02259331249999992, + "opcode": "fusion", + "shape": "(s32[21361]{0}, pred[21361]{0}, pred[21361]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:270", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:270 (_walk_from_seed..walk_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:292 (_walk_from_seed..body)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:353 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)" + ] + }, + { + "instruction": "loop_select_fusion", + "ms": 0.02015188124999996, + "opcode": "fusion", + "shape": "s32[21361]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:242", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:242 (_walk_from_seed..weights_of)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:262 (_walk_from_seed..walk_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:292 (_walk_from_seed..body)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:353 (pix_indexes_delaunay_walk_from)" + ] + }, + { + "instruction": "input_reduce_fusion.2", + "ms": 0.016261350000000098, + "opcode": "fusion", + "shape": "pred[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:288", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:288 (_walk_from_seed..cond)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:353 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)" + ] + }, + { + "instruction": "while.34", + "ms": 0.014478906249999883, + "opcode": "while", + "shape": "(s32[], s32[21361]{0}, pred[21361]{0}, pred[21361]{0}, s32[3000,3]{1,0}, /*index=5*/f64[1500,2]{1,0}, f64[21361,2]{1,0}, s32[3000,3]{1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:353 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "psf_convolution_mapping_matrix": [ + { + "instruction": "input_scatter_fusion", + "ms": 1.9813170499999992, + "opcode": "fusion", + "shape": "f64[1500,180,180]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "fft.19.0", + "ms": 1.7578670187499987, + "opcode": "fft", + "shape": "f64[1500,180,180]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "fft.15.0", + "ms": 1.3664876625000009, + "opcode": "fft", + "shape": "c128[1500,180,91]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "fft.17.0", + "ms": 0.9794295187499994, + "opcode": "fft", + "shape": "c128[1500,91,180]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "input_transpose_fusion.4", + "ms": 0.5138982312500002, + "opcode": "fusion", + "shape": "c128[1500,91,180]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "wrapped_transpose", + "ms": 0.49981874375000007, + "opcode": "fusion", + "shape": "c128[1500,180,91]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + } + ], + "inversion_other": [ + { + "instruction": "cholesky.120", + "ms": 0.893844968750001, + "opcode": "custom-call", + "shape": "(f64[1500,1500]{0,1}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986 (AbstractInversion._log_det_symmetric_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:1078 (AbstractInversion.log_det_curvature_reg_matrix_term)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:347 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/model/analysis.py:135 (AnalysisImaging.log_likelihood_function)" + ] + }, + { + "instruction": "cholesky.130", + "ms": 0.8885384437500004, + "opcode": "custom-call", + "shape": "(f64[1500,1500]{0,1}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986 (AbstractInversion._log_det_symmetric_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:1157 (AbstractInversion.log_det_regularization_matrix_term)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:348 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/model/analysis.py:135 (AnalysisImaging.log_likelihood_function)" + ] + }, + { + "instruction": "loop_reduce_window_fusion", + "ms": 0.002868962499999998, + "opcode": "fusion", + "shape": "s64[6,16]{1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "loop_reduce_window_fusion.1", + "ms": 0.0027941812499999996, + "opcode": "fusion", + "shape": "s64[94,16]{1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "loop_broadcast_convert_fusion", + "ms": 0.002191568749999996, + "opcode": "fusion", + "shape": "(s32[1500]{0}, s64[1500]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:527", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:527 (AbstractInversion.zeroed_ids_to_keep)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:567 (AbstractInversion.solve_ids_to_keep)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:684 (AbstractInversion.reconstruction)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "input_scatter_fusion.5", + "ms": 0.0019479874999999986, + "opcode": "fusion", + "shape": "s64[1500]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:527", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:527 (AbstractInversion.zeroed_ids_to_keep)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:567 (AbstractInversion.solve_ids_to_keep)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:684 (AbstractInversion.reconstruction)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "mapping_matrix": [ + { + "instruction": "input_reduce_fusion.31", + "ms": 0.00288934374999999, + "opcode": "fusion", + "shape": "f64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:93", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:93 (adaptive_pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/abstract.py:507 (Mapper.pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt.py:339 (Adapt.regularization_weights_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt_split.py:120 (AdaptSplit.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)" + ] + } + ], + "curvature_matrix_F": [ + { + "instruction": "cublas-lt-matmul.2", + "ms": 4.248923318749999, + "opcode": "custom-call", + "shape": "(f64[1500,1500]{1,0}, s8[4194304]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:134", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:134 (curvature_matrix_via_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:93 (InversionImagingMapping.curvature_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:389 (AbstractInversion.curvature_reg_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "chi_squared_evidence": [ + { + "instruction": "loop_multiply_fusion.2", + "ms": 0.002985412499999996, + "opcode": "fusion", + "shape": "f64[15361]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/abstract_ndarray.py:300", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/abstract_ndarray.py:300 (AbstractNDArray.__pow__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/abstract_ndarray.py:60 (unwrap_array..wrapper)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/abstract_ndarray.py:35 (to_new_array..wrapper)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_util.py:78 (chi_squared_map_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:78 (AbstractFit.chi_squared_map)" + ] + } + ] + }, + "stage_audit_note": "The HLO instructions that contributed most of each stage's milliseconds, with their full source stack. A stage row is only as good as the rules that built it; this is how a reader checks a row against the HLO instead of trusting it.", + "untraced_wall_ms": 39.41504491249361, + "reconciliation_vs_untraced_pct": -23.025230819582127, + "wall_basis": "wall_ms is the TRACED run's wall, the run these kernel durations came from. untraced_wall_ms is the same executable without the profiler; the difference is the profiler's overhead and belongs in neither the stages nor the idle row.", + "calls": 160, + "call_split": "per-call (first-instruction recurrence)", + "call_blocks": 160, + "events": 98790, + "streams": [ + "Stream #14(Memset,MemcpyD2H,Compute,MemcpyH2D,MemcpyD2D)" + ], + "per_stage_ms": { + "border_relocator": { + "median_ms": 0.101054, + "min_ms": 0.10041200000000002, + "max_ms": 0.10230200000000002 + }, + "chi_squared_evidence": { + "median_ms": 0.002944, + "min_ms": 0.002848, + "max_ms": 0.00336 + }, + "curvature_matrix_F": { + "median_ms": 4.2460915, + "min_ms": 4.231661, + "max_ms": 4.314042 + }, + "inversion_other": { + "median_ms": 1.794964, + "min_ms": 1.778482, + "max_ms": 1.80594 + }, + "mapping_matrix": { + "median_ms": 0.00288, + "min_ms": 0.002879, + "max_ms": 0.002912 + }, + "memset": { + "median_ms": 0.021343999999999995, + "min_ms": 0.009951, + "max_ms": 0.10031899999999999 + }, + "mesh_construction": { + "median_ms": 0.002048, + "min_ms": 0.002047, + "max_ms": 0.00208 + }, + "mesh_locate_walk": { + "median_ms": 0.14809450000000002, + "min_ms": 0.13039800000000001, + "max_ms": 0.18339200000000003 + }, + "mesh_qhull_callback": { + "median_ms": 0.010592, + "min_ms": 0.010495, + "max_ms": 0.011072000000000002 + }, + "mesh_seed_argmin": { + "median_ms": 0.22449350000000015, + "min_ms": 0.22418500000000013, + "max_ms": 0.2248270000000002 + }, + "mixed_fusion": { + "median_ms": 1.9843225000000002, + "min_ms": 1.9764949999999994, + "max_ms": 1.9972369999999995 + }, + "other": { + "median_ms": 0.06620649999999999, + "min_ms": 0.063579, + "max_ms": 0.07391900000000001 + }, + "pdip_solve": { + "median_ms": 7.5871984999999995, + "min_ms": 2.417604, + "max_ms": 50.35396399999999 + }, + "psf_convolution_mapping_matrix": { + "median_ms": 7.0983845, + "min_ms": 7.082967999999999, + "max_ms": 7.112631 + }, + "regularization_H": { + "median_ms": 0.010976, + "min_ms": 0.010879999999999999, + "max_ms": 0.011231999999999999 + } + }, + "stage_order": [ + "border_relocator", + "mesh_qhull_callback", + "mesh_seed_argmin", + "mesh_locate_walk", + "mesh_construction", + "mapping_matrix", + "psf_convolution_mapping_matrix", + "curvature_matrix_F", + "regularization_H", + "pdip_solve", + "chi_squared_evidence", + "inversion_other", + "mixed_fusion", + "other", + "memset" + ], + "mixed_fusion": { + "ms": 1.9843225000000002, + "constituent_stage_sets": { + "curvature_matrix_F + psf_convolution_mapping_matrix": 1.01618255, + "pdip_solve + psf_convolution_mapping_matrix": 0.22685640624999995, + "data_vector_D + pdip_solve": 0.12582651250000004, + "mapped_reconstruction + pdip_solve": 0.11467717499999995, + "mapping_matrix + pdip_solve": 0.11311618749999988, + "curvature_reg_reduce_gather + inversion_other + mapped_reconstruction + pdip_solve + reconstruction_scatter": 0.1094647, + "pdip_solve + regularization_H": 0.04574368125000003, + "inversion_other + pdip_solve + regularization_H": 0.024028306250000003, + "inversion_other + pdip_solve": 0.023009943750000022, + "inversion_other + mapping_matrix + mesh_construction + mesh_dual_areas + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin + pdip_solve": 0.021254193749999994, + "inversion_other + mesh_construction + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin + pdip_solve + regularization_H": 0.018688974999999986, + "inversion_other + mesh_construction + mesh_dual_areas + mesh_interpolation_weights + pdip_solve + regularization_H": 0.014765443749999992, + "pdip_solve + ray_trace_data_grid": 0.013713206249999926, + "border_relocator + pdip_solve": 0.013252043749999977, + "inversion_other + mapping_matrix + mesh_construction + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin": 0.011749874999999996, + "grids_and_structures + mass_profile_deflections + pdip_solve": 0.010185662500000007, + "grids_and_structures + mass_profile_deflections + pdip_solve + ray_trace_data_grid": 0.009021918750000005, + "chi_squared_evidence + pdip_solve": 0.007643331249999998, + "inversion_other + mesh_construction + mesh_seed_argmin + pdip_solve + regularization_H": 0.007074362499999999, + "inversion_other + mesh_dual_areas + mesh_locate_walk": 0.0067975187499999664, + "inversion_other + mesh_construction + pdip_solve + regularization_H": 0.006546906249999998, + "grids_and_structures + mass_profile_deflections + ray_trace_data_grid": 0.005509749999999998, + "inversion_other + pdip_solve + ray_trace_data_grid": 0.00529954999999999, + "inversion_other + regularization_H": 0.005251937499999984, + "inversion_other + mapped_reconstruction + pdip_solve + reconstruction_scatter": 0.0048135625, + "inversion_other + mapped_reconstruction": 0.0037877499999999973, + "mapping_matrix + pdip_solve + regularization_H": 0.0034847687500000027, + "inversion_other + mesh_construction + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin": 0.0031391749999999993, + "inversion_other + mesh_construction + mesh_dual_areas + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin": 0.002967537499999995, + "inversion_other + mesh_construction + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin + regularization_H": 0.0027021937500000016, + "inversion_other + mesh_dual_areas + mesh_locate_walk + pdip_solve": 0.0026039500000000037, + "inversion_other + mesh_locate_walk + mesh_seed_argmin": 0.0025089750000000014, + "inversion_other + mesh_interpolation_weights": 0.0021447562500000027, + "chi_squared_evidence + inversion_other": 0.0018979937500000006 + }, + "example_kernels": { + "curvature_matrix_F + psf_convolution_mapping_matrix": [ + "loop_divide_gather_fusion" + ], + "pdip_solve + psf_convolution_mapping_matrix": [ + "loop_broadcast_fusion.4" + ], + "data_vector_D + pdip_solve": [ + "input_reduce_fusion.13", + "input_reduce_fusion.29" + ], + "mapped_reconstruction + pdip_solve": [ + "input_reduce_fusion.17" + ], + "mapping_matrix + pdip_solve": [ + "loop_broadcast_fusion.2", + "loop_divide_fusion" + ], + "curvature_reg_reduce_gather + inversion_other + mapped_reconstruction + pdip_solve + reconstruction_scatter": [ + "input_multiply_transpose_fusion" + ], + "pdip_solve + regularization_H": [ + "loop_select_fusion.5", + "input_transpose_fusion.5" + ], + "inversion_other + pdip_solve + regularization_H": [ + "input_transpose_fusion.6" + ], + "inversion_other + pdip_solve": [ + "input_reduce_fusion.15", + "loop_log_fusion", + "input_reduce_fusion.16", + "input_reduce_fusion.20" + ], + "inversion_other + mapping_matrix + mesh_construction + mesh_dual_areas + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin + pdip_solve": [ + "input_scatter_fusion.6", + "input_scatter_fusion.3" + ] + }, + "prorated_estimate_ms": { + "psf_convolution_mapping_matrix": 0.621519478125, + "curvature_matrix_F": 0.508091275, + "pdip_solve": 0.39309393820684513, + "mapped_reconstruction": 0.08232879312499998, + "inversion_other": 0.06904186226934524, + "data_vector_D": 0.06291325625000002, + "mapping_matrix": 0.06233477005208327, + "regularization_H": 0.04330155992559524, + "reconstruction_scatter": 0.023096330625, + "curvature_reg_reduce_gather": 0.02189294, + "mesh_construction": 0.014370236852678566, + "ray_trace_data_grid": 0.01271518281249996, + "mesh_locate_walk": 0.012610882581845225, + "mesh_interpolation_weights": 0.012391015915178568, + "mesh_seed_argmin": 0.011108927998511903, + "mesh_dual_areas": 0.008529098177083319, + "grids_and_structures": 0.007487283854166669, + "mass_profile_deflections": 0.007487283854166669, + "border_relocator": 0.006626021874999988, + "chi_squared_evidence": 0.004770662499999999 + }, + "prorated_note": "ESTIMATE ONLY \u2014 a mixed fusion's time split equally across the stages its constituents span. Never summed into the measured table, never reconciled." + }, + "other_sources_ms": { + "copy.106": 0.04206421875000185, + "copy.70": 0.016997462500000067, + "copy.75": 0.0019839874999999997, + "copy.105": 0.001800175, + "copy.104": 0.0017587874999999999, + "copy.61": 0.0016451812499999976, + "copy.103": 0.0004564000000000001, + "copy.40": 0.00038679375000000017 + }, + "device_span_ms": 40.55124409375, + "device_busy_ms": 33.51319775, + "device_idle_ms": 7.038046343749997, + "largest_idle_gaps": [ + { + "gap_ms": 5.471902, + "after": "pure_callback.4", + "before": "pure_callback.4" + }, + { + "gap_ms": 0.034079, + "after": "pure_callback.4", + "before": "copy.105" + }, + { + "gap_ms": 0.034079, + "after": "copy.70", + "before": "input_reduce_fusion.1" + }, + { + "gap_ms": 0.031167, + "after": "loop_add_fusion", + "before": "copy.106" + }, + { + "gap_ms": 0.029344, + "after": "loop_add_fusion.8", + "before": "input_reduce_fusion.14" + }, + { + "gap_ms": 0.025887, + "after": "input_concatenate_fusion.7", + "before": "pure_callback.4" + }, + { + "gap_ms": 0.020896, + "after": "while.40", + "before": "input_reduce_select_fusion" + }, + { + "gap_ms": 0.020319, + "after": "eigh.45", + "before": "eigh.45" + } + ], + "kernel_ms": 23.3015935, + "sum_ms": 30.339639843749996, + "wall_ms": 40.55783274375244, + "host_outside_span_ms": 0.006588650002441909, + "reconciliation_pct": -25.19412949050258, + "unjoined_ms": 0.0, + "unjoined_pct": 0.0, + "other_ms": 0.06620649999999999, + "other_pct": 0.16323973822343474, + "note": "Stage rows attribute the command-buffers-OFF program (see the module docstring): kernel times are the same, the launch overhead the CUDA graphs remove is not. sum_ms = kernel rows + device_idle_ms; the residual against wall_ms is host_outside_span_ms (dispatch before the first kernel, teardown after the last).", + "per_stage_ms_per_lane": { + "border_relocator": 0.101054, + "chi_squared_evidence": 0.002944, + "curvature_matrix_F": 4.2460915, + "inversion_other": 1.794964, + "mapping_matrix": 0.00288, + "memset": 0.021343999999999995, + "mesh_construction": 0.002048, + "mesh_locate_walk": 0.14809450000000002, + "mesh_qhull_callback": 0.010592, + "mesh_seed_argmin": 0.22449350000000015, + "mixed_fusion": 1.9843225000000002, + "other": 0.06620649999999999, + "pdip_solve": 7.5871984999999995, + "psf_convolution_mapping_matrix": 7.0983845, + "regularization_H": 0.010976 + }, + "per_lane_divisor": 1, + "host_callback": { + "pure_callback_span_ms": 79.86106850000004, + "qhull_ms": 74.37435889999995, + "callback_body_ms_note": "the OUTERMOST matching body event, not a sum: under the probe the body appears twice (the wrapper and the timed re-implementation it calls) and summing them would count the same work twice", + "events_by_name": { + "pure_callback.4": { + "count": 160, + "ms": 79.86106850000004 + }, + "$callback.py:815 _wrapped_callback": { + "count": 160, + "ms": 78.47551830000002 + }, + "$callback.py:224 _callback": { + "count": 160, + "ms": 78.10033139999999 + }, + "$callback.py:74 pure_callback_impl": { + "count": 160, + "ms": 77.9551307 + }, + "$callback.py:69 __call__": { + "count": 160, + "ms": 74.62516729999999 + }, + "$delaunay.py:162 ": { + "count": 160, + "ms": 74.51630229999998 + }, + "$host_callback_probe.py:225 wrapped": { + "count": 160, + "ms": 74.37435889999995 + }, + "$host_callback_probe.py:160 _timed_tri_only": { + "count": 160, + "ms": 74.2428192 + }, + "ThenExecuteCallback:GetEventForComputeStreamSyncPoint": { + "count": 160, + "ms": 0.30488480000000007 + }, + "$callback.py:822 ": { + "count": 640, + "ms": 0.22714369999999948 + }, + "$__init__.py:132 _xla_gc_callback": { + "count": 2, + "ms": 0.00035299999999999996 + } + }, + "note": "HOST milliseconds per traced BATCH (the whole invocation), aggregated by name because the events nest. Not a row of the device table: the device pays for them as the idle gaps largest_idle_gaps names." + }, + "host_callback_ms": 79.86106850000004 + }, + "hlo_census": { + "status": "excluded", + "reason": "The legacy census anchors PyAutoArray source line numbers that moved after the phase-1 run. No batched attribution is published from unsupported anchors; the device-event table and wall reconciliation remain valid." + }, + "stage_map_provenance": [ + { + "label": "log_det_curvature_reg", + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 850, + 882 + ], + "requires": { + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 884, + 896 + ] + }, + "function": null + }, + { + "label": "log_det_regularization", + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 850, + 882 + ], + "requires": { + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 897, + 943 + ] + }, + "function": null + }, + { + "label": "curvature_reg_add", + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 359, + 372 + ], + "requires": null, + "function": null + }, + { + "label": "curvature_reg_reduce_gather", + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 374, + 398 + ], + "requires": null, + "function": null + }, + { + "label": "edge_subset_gather", + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 606, + 614 + ], + "requires": null, + "function": null + }, + { + "label": "regularization_term", + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 786, + 849 + ], + "requires": null, + "function": null + }, + { + "label": "mapped_reconstruction", + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 722, + 785 + ], + "requires": null, + "function": null + }, + { + "label": "reconstruction_scatter", + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 583, + 605 + ], + "requires": null, + "function": null + }, + { + "label": "reconstruction_scatter", + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 615, + 721 + ], + "requires": null, + "function": null + }, + { + "label": "certified_active_set_solve", + "path": "likelihood_breakdown/active_set_steps.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "certified_active_set_solve", + "path": "likelihood_breakdown/library_solver_injection.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "pdip_solve", + "path": "PyAutoArray/autoarray/util/jax_nnls.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "pdip_solve", + "path": "PyAutoArray/autoarray/inversion/inversion/inversion_util.py", + "lines": [ + 256, + 488 + ], + "requires": null, + "function": null + }, + { + "label": "mapped_reconstruction", + "path": "PyAutoArray/autoarray/inversion/inversion/inversion_util.py", + "lines": [ + 156, + 200 + ], + "requires": null, + "function": null + }, + { + "label": "curvature_matrix_F", + "path": "PyAutoArray/autoarray/inversion/inversion/inversion_util.py", + "lines": [ + 12, + 155 + ], + "requires": null, + "function": null + }, + { + "label": "reconstruction_scatter", + "path": "PyAutoArray/autoarray/inversion/inversion/inversion_util.py", + "lines": [ + 201, + 255 + ], + "requires": null, + "function": null + }, + { + "label": "data_vector_D", + "path": "PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py", + "lines": [ + 54, + 73 + ], + "requires": null, + "function": null + }, + { + "label": "curvature_matrix_F", + "path": "PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py", + "lines": [ + 74, + 110 + ], + "requires": null, + "function": null + }, + { + "label": "data_vector_D", + "path": "PyAutoArray/autoarray/inversion/inversion/imaging/inversion_imaging_util.py", + "lines": null, + "requires": null, + "function": "data_vector_via_blurred_mapping_matrix_from" + }, + { + "label": "curvature_matrix_F", + "path": "PyAutoArray/autoarray/inversion/inversion/imaging/inversion_imaging_util.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "psf_convolution_mapping_matrix", + "path": "likelihood_breakdown/psf_cube_injection.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "psf_convolution_mapping_matrix", + "path": "PyAutoArray/autoarray/operators/convolver.py", + "lines": [ + 1086, + 1300 + ], + "requires": null, + "function": null + }, + { + "label": "psf_convolution_mapping_matrix", + "path": "PyAutoArray/autoarray/operators/convolver.py", + "lines": [ + 632, + 642 + ], + "requires": null, + "function": null + }, + { + "label": "psf_convolution_mapping_matrix", + "path": "PyAutoArray/autoarray/operators/convolver.py", + "lines": [ + 670, + 691 + ], + "requires": null, + "function": null + }, + { + "label": "psf_convolution_mapping_matrix", + "path": "PyAutoArray/autoarray/operators/convolver.py", + "lines": null, + "requires": { + "path": "PyAutoArray/autoarray/operators/convolver.py", + "lines": [ + 1086, + 1300 + ] + }, + "function": null + }, + { + "label": "psf_convolution_mapping_matrix", + "path": "PyAutoArray/autoarray/operators/convolver.py", + "lines": null, + "requires": { + "path": "PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py", + "lines": [ + 119, + 150 + ] + }, + "function": null + }, + { + "label": "psf_convolution_image", + "path": "PyAutoArray/autoarray/operators/convolver.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "psf_convolution_mapping_matrix", + "path": "PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py", + "lines": [ + 119, + 150 + ], + "requires": null, + "function": null + }, + { + "label": "mesh_qhull_callback", + "path": "PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py", + "lines": [ + 139, + 172 + ], + "requires": null, + "function": null + }, + { + "label": "mesh_seed_argmin", + "path": "PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py", + "lines": [ + 173, + 207 + ], + "requires": null, + "function": null + }, + { + "label": "mesh_locate_walk", + "path": "PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py", + "lines": [ + 208, + 372 + ], + "requires": null, + "function": null + }, + { + "label": "mesh_dual_areas", + "path": "PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py", + "lines": [ + 373, + 396 + ], + "requires": null, + "function": null + }, + { + "label": "mesh_dual_areas", + "path": "PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py", + "lines": [ + 437, + 494 + ], + "requires": null, + "function": null + }, + { + "label": "mesh_dual_areas", + "path": "PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py", + "lines": [ + 605, + 615 + ], + "requires": null, + "function": null + }, + { + "label": "mesh_interpolation_weights", + "path": "PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py", + "lines": [ + 616, + 695 + ], + "requires": null, + "function": null + }, + { + "label": "mesh_interpolation_weights", + "path": "PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py", + "lines": [ + 896, + 1000 + ], + "requires": null, + "function": null + }, + { + "label": "mesh_construction", + "path": "PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "border_relocator", + "path": "PyAutoArray/autoarray/inversion/mesh/border_relocator.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "mesh_construction", + "path": "PyAutoArray/autoarray/inversion/mesh/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "mapping_matrix", + "path": "PyAutoArray/autoarray/inversion/mappers/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "mapping_matrix", + "path": "PyAutoArray/autoarray/inversion/mappings/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "mapping_matrix", + "path": "PyAutoArray/autoarray/inversion/linear_obj/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "regularization_H", + "path": "PyAutoArray/autoarray/inversion/regularization/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "chi_squared_evidence", + "path": "PyAutoArray/autoarray/fit/fit_util.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "chi_squared_evidence", + "path": "PyAutoArray/autoarray/fit/fit_dataset.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "ray_trace_mesh_grid", + "path": "PyAutoLens/autolens/lens/to_inversion.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "ray_trace_mesh_grid", + "path": "PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "mass_profile_deflections", + "path": "PyAutoGalaxy/autogalaxy/profiles/mass/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "light_profile_image", + "path": "PyAutoGalaxy/autogalaxy/profiles/light/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "light_profile_image", + "path": "PyAutoGalaxy/autogalaxy/operate/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "ray_trace_data_grid", + "path": "PyAutoLens/autolens/lens/tracer.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "ray_trace_data_grid", + "path": "PyAutoLens/autolens/lens/tracer_util.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "grids_and_structures", + "path": "PyAutoArray/autoarray/structures/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "grids_and_structures", + "path": "PyAutoArray/autoarray/operators/over_sampling/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "grids_and_structures", + "path": "PyAutoArray/autoarray/geometry/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "inversion_other", + "path": "PyAutoArray/autoarray/inversion/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "fit_imaging_other", + "path": "PyAutoLens/autolens/imaging/fit_imaging.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "fit_imaging_other", + "path": "PyAutoGalaxy/autogalaxy/imaging/fit_imaging.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "fit_imaging_other", + "path": "PyAutoArray/autoarray/fit/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "analysis_other", + "path": "PyAutoLens/autolens/analysis/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "analysis_other", + "path": "PyAutoGalaxy/autogalaxy/analysis/", + "lines": null, + "requires": null, + "function": null + } + ], + "trace_timing": { + "traced_wall_ms": 40.55783274375244, + "untraced_wall_ms": 39.41504491249361, + "profiler_overhead_ms": 1.142787831258829, + "profiler_overhead_pct": 2.8993696031451 + }, + "jit_phases": { + "b_s3_pdip_library_likelihood_jit": { + "lower_s": 1.6875748159982322, + "compile_s": 4.575258997003402, + "first_call_s": 1.8921440459998848, + "steady_per_call_s": 0.0507018980999419 + }, + "d_s3_certified_fallback_library_likelihood_jit": { + "lower_s": 0.47104399199815816, + "compile_s": 4.421622325997305, + "first_call_s": 0.04654441599996062, + "steady_per_call_s": 0.03161700480013678 + } + }, + "peak_bytes": { + "after_setup": 85108992, + "after_routes": 1181653248, + "after_all": 18893192192, + "note": "jax.devices()[0].memory_stats()['peak_bytes_in_use']; None on a backend that does not report it (CPU). Process-wide high-water marks." + }, + "note": "Every stage row is a MEASURED sum of GPU kernel durations joined to library source through the optimized HLO of ONE program \u2014 not arithmetic across compilations. The rows attribute the command-buffers-OFF program: kernel time is the same as production, the launch overhead the CUDA graphs remove is not, and command_buffers.* carries both walls and their delta. sum_ms = kernel rows + measured device_idle_ms; the residual against the wall is host_outside_span_ms and is reported, not absorbed. mixed_fusion.prorated_estimate_ms is an ESTIMATE and is never part of the table. No row may be quoted if reconciliation_pct is outside 5 % or unjoined_ms is non-zero.", + "vmap": { + "batch": 16, + "lanes_mode": "captured", + "arms": [ + "vmap", + "scalar" + ], + "draw_seed": 0, + "fallback": true, + "composition": "jax.jit(jax.vmap(fn))", + "composition_provenance": "Current Fitness._vmap after PyAutoFit#1638. Array 343376 used the retired jax.vmap(jax.jit(fn)) composition and is historical evidence only.", + "headline_arm": "scalar", + "lane_rtol": 1e-09, + "lanes": [ + { + "lane": 0, + "draw_name": "call00015_lane00", + "draw_kind": "captured", + "offsets": { + "centre_0": -0.0033655095107821688, + "centre_1": 0.004631951955766499, + "ell_comps_0": 0.000564301988937442, + "ell_comps_1": -0.00879076787683888, + "einstein_radius": 0.018337010967920175 + }, + "log_likelihood_vmap": 24758.50619430934, + "log_likelihood_scalar": 24758.506194309357, + "log_likelihood_library_pdip": 24758.50619430915, + "log_likelihood_library_pdip_scalar": 24758.506194309142, + "rel_diff_vmap_vs_library_pdip": 7.640804194085496e-15, + "rel_diff_scalar_vs_library_pdip_scalar": 8.66937398944316e-15, + "abs_diff_nats": 1.8189894035458565e-11, + "rel_diff": 7.34692710969753e-16, + "rel_diff_scalar_vs_library_pdip": 8.375496905055255e-15, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 7.275957614183426e-12, + "rel_diff_library_pdip_vmap_vs_scalar": 2.938770843879038e-16, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": true, + "passes": 10, + "pdip_iter": null + }, + { + "lane": 1, + "draw_name": "call00015_lane01", + "draw_kind": "captured", + "offsets": { + "centre_0": -0.004311760382151672, + "centre_1": 0.0027192789928108052, + "ell_comps_0": 0.0061667694809026535, + "ell_comps_1": 0.003465536775180321, + "einstein_radius": -0.05732579988501185 + }, + "log_likelihood_vmap": 20551.004887772728, + "log_likelihood_scalar": 20551.004887773106, + "log_likelihood_library_pdip": 20551.004887772702, + "log_likelihood_library_pdip_scalar": 20551.004887772997, + "rel_diff_vmap_vs_library_pdip": 1.2391535980215492e-15, + "rel_diff_scalar_vs_library_pdip_scalar": 5.310658277235135e-15, + "abs_diff_nats": 3.7834979593753815e-10, + "rel_diff": 1.8410282027748372e-14, + "rel_diff_scalar_vs_library_pdip": 1.9649435625770282e-14, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 2.9467628337442875e-10, + "rel_diff_library_pdip_vmap_vs_scalar": 1.4338777348534864e-14, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": false, + "passes": 16, + "pdip_iter": null + }, + { + "lane": 2, + "draw_name": "call00015_lane02", + "draw_kind": "captured", + "offsets": { + "centre_0": 0.0002796502552123051, + "centre_1": 0.0016003321376979894, + "ell_comps_0": -0.002094430657472772, + "ell_comps_1": 0.006146479068253558, + "einstein_radius": -0.025968910196758177 + }, + "log_likelihood_vmap": -189710.11837880412, + "log_likelihood_scalar": -189709.06217123155, + "log_likelihood_library_pdip": -189709.80717038375, + "log_likelihood_library_pdip_scalar": -189709.0186126798, + "rel_diff_vmap_vs_library_pdip": 1.640444555907388e-06, + "rel_diff_scalar_vs_library_pdip_scalar": 2.2960717457613137e-07, + "abs_diff_nats": 1.0562075725756586, + "rel_diff": 5.567512487212259e-06, + "rel_diff_scalar_vs_library_pdip": 3.927046067426853e-06, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 0.7885577039560303, + "rel_diff_library_pdip_vmap_vs_scalar": 4.156669565435855e-06, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "FAIL", + "certified": true, + "passes": 0, + "pdip_iter": null + }, + { + "lane": 3, + "draw_name": "call00015_lane03", + "draw_kind": "captured", + "offsets": { + "centre_0": 0.004594602299816973, + "centre_1": 0.004924922434755804, + "ell_comps_0": 0.028601845732661953, + "ell_comps_1": 0.003760187047606014, + "einstein_radius": -0.03088526730480501 + }, + "log_likelihood_vmap": -141741.97984036076, + "log_likelihood_scalar": -141741.9662679517, + "log_likelihood_library_pdip": -141741.98368558992, + "log_likelihood_library_pdip_scalar": -141741.96647750167, + "rel_diff_vmap_vs_library_pdip": 2.712837130432729e-08, + "rel_diff_scalar_vs_library_pdip_scalar": 1.478390423176762e-09, + "abs_diff_nats": 0.013572409050539136, + "rel_diff": 9.575434437590343e-08, + "rel_diff_scalar_vs_library_pdip": 1.2288270391367799e-07, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 0.01720808824757114, + "rel_diff_library_pdip_vmap_vs_scalar": 1.2140432840899337e-07, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "FAIL", + "certified": true, + "passes": 0, + "pdip_iter": null + }, + { + "lane": 4, + "draw_name": "call00015_lane04", + "draw_kind": "captured", + "offsets": { + "centre_0": -0.0060950290987001, + "centre_1": -0.0006121094560707545, + "ell_comps_0": 0.009637314264800585, + "ell_comps_1": 0.006641580028105454, + "einstein_radius": -0.03125810931551931 + }, + "log_likelihood_vmap": 24880.54593298869, + "log_likelihood_scalar": 24880.545932988738, + "log_likelihood_library_pdip": 24880.54593298869, + "log_likelihood_library_pdip_scalar": 24880.545932988724, + "rel_diff_vmap_vs_library_pdip": 0.0, + "rel_diff_scalar_vs_library_pdip_scalar": 5.848712189660073e-16, + "abs_diff_nats": 4.729372449219227e-11, + "rel_diff": 1.9008314616395227e-15, + "rel_diff_scalar_vs_library_pdip": 1.9008314616395266e-15, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 3.2741809263825417e-11, + "rel_diff_library_pdip_vmap_vs_scalar": 1.3159602426735166e-15, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": true, + "passes": 10, + "pdip_iter": null + }, + { + "lane": 5, + "draw_name": "call00015_lane05", + "draw_kind": "captured", + "offsets": { + "centre_0": -0.008435952123169364, + "centre_1": -0.007849511137408794, + "ell_comps_0": -0.01598149485178925, + "ell_comps_1": 0.01654417876136871, + "einstein_radius": 0.014294380855379263 + }, + "log_likelihood_vmap": 25472.519186609876, + "log_likelihood_scalar": 25472.519186782676, + "log_likelihood_library_pdip": 25472.51918659315, + "log_likelihood_library_pdip_scalar": 25472.519186784746, + "rel_diff_vmap_vs_library_pdip": 6.566852077909819e-13, + "rel_diff_scalar_vs_library_pdip_scalar": 8.126443741414924e-14, + "abs_diff_nats": 1.7280035535804927e-07, + "rel_diff": 6.783795277214391e-12, + "rel_diff_scalar_vs_library_pdip": 7.440480485055848e-12, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 1.9159779185429215e-07, + "rel_diff_library_pdip_vmap_vs_scalar": 7.521744922414032e-12, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": true, + "passes": 4, + "pdip_iter": null + }, + { + "lane": 6, + "draw_name": "call00015_lane06", + "draw_kind": "captured", + "offsets": { + "centre_0": 0.0031698313356290646, + "centre_1": -0.0038584140676992847, + "ell_comps_0": 0.01810147576636289, + "ell_comps_1": -0.011577480306416508, + "einstein_radius": 0.016136835525067283 + }, + "log_likelihood_vmap": -83383.91631621221, + "log_likelihood_scalar": -83383.91544755129, + "log_likelihood_library_pdip": -83383.91633831926, + "log_likelihood_library_pdip_scalar": -83383.91553842722, + "rel_diff_vmap_vs_library_pdip": 2.651236870011004e-10, + "rel_diff_scalar_vs_library_pdip_scalar": 1.0898495736368818e-09, + "abs_diff_nats": 0.0008686609216965735, + "rel_diff": 1.0417607724873073e-08, + "rel_diff_scalar_vs_library_pdip": 1.068273130058567e-08, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 0.0007998920482350513, + "rel_diff_library_pdip_vmap_vs_scalar": 9.592881829426966e-09, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "FAIL", + "certified": true, + "passes": 0, + "pdip_iter": null + }, + { + "lane": 7, + "draw_name": "call00015_lane07", + "draw_kind": "captured", + "offsets": { + "centre_0": 0.006158729760195174, + "centre_1": 0.004883559265258847, + "ell_comps_0": 0.007613883677130215, + "ell_comps_1": -0.005800175617006949, + "einstein_radius": 0.0662922007765554 + }, + "log_likelihood_vmap": -11960.284432425826, + "log_likelihood_scalar": -11960.284430105821, + "log_likelihood_library_pdip": -11960.284433607245, + "log_likelihood_library_pdip_scalar": -11960.284429711799, + "rel_diff_vmap_vs_library_pdip": 9.877850917726772e-11, + "rel_diff_scalar_vs_library_pdip_scalar": 3.294421725119323e-11, + "abs_diff_nats": 2.320004568900913e-06, + "rel_diff": 1.9397570203774712e-10, + "rel_diff_scalar_vs_library_pdip": 2.9275421115822764e-10, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 3.895445843227208e-06, + "rel_diff_library_pdip_vmap_vs_scalar": 3.2569842850477045e-10, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": true, + "passes": 1, + "pdip_iter": null + }, + { + "lane": 8, + "draw_name": "call00015_lane08", + "draw_kind": "captured", + "offsets": { + "centre_0": 0.0030335293924908615, + "centre_1": 0.0012117081273721316, + "ell_comps_0": 0.0008852687687036301, + "ell_comps_1": -0.0027113633212058814, + "einstein_radius": -0.03873713959923952 + }, + "log_likelihood_vmap": 23223.55039142083, + "log_likelihood_scalar": 23223.55039149491, + "log_likelihood_library_pdip": 23223.550391416982, + "log_likelihood_library_pdip_scalar": 23223.55039150207, + "rel_diff_vmap_vs_library_pdip": 1.6573613909290755e-13, + "rel_diff_scalar_vs_library_pdip_scalar": 3.082880167614811e-13, + "abs_diff_nats": 7.408016244880855e-08, + "rel_diff": 3.1898724010751904e-12, + "rel_diff_scalar_vs_library_pdip": 3.355608540178802e-12, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 8.508868631906807e-08, + "rel_diff_library_pdip_vmap_vs_scalar": 3.663896556927988e-12, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": true, + "passes": 4, + "pdip_iter": null + }, + { + "lane": 9, + "draw_name": "call00015_lane09", + "draw_kind": "captured", + "offsets": { + "centre_0": -0.0008035510098975272, + "centre_1": 0.005559773241319952, + "ell_comps_0": -0.003701655436278317, + "ell_comps_1": -0.012378591445614512, + "einstein_radius": 0.032284336889985665 + }, + "log_likelihood_vmap": -177119.561977738, + "log_likelihood_scalar": -177117.75747171917, + "log_likelihood_library_pdip": -177119.6181614268, + "log_likelihood_library_pdip_scalar": -177117.8047572617, + "rel_diff_vmap_vs_library_pdip": 3.1720759897430864e-07, + "rel_diff_scalar_vs_library_pdip_scalar": 2.6697227078407144e-07, + "abs_diff_nats": 1.8045060188160278, + "rel_diff": 1.0188171104775633e-05, + "rel_diff_scalar_vs_library_pdip": 1.0505271674244623e-05, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 1.8134041650919244, + "rel_diff_library_pdip_vmap_vs_scalar": 1.0238406960707184e-05, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "FAIL", + "certified": true, + "passes": 0, + "pdip_iter": null + }, + { + "lane": 10, + "draw_name": "call00015_lane10", + "draw_kind": "captured", + "offsets": { + "centre_0": -0.008473569241265282, + "centre_1": -0.0051993251621340235, + "ell_comps_0": -0.0031466996514049606, + "ell_comps_1": -0.0076036423480284636, + "einstein_radius": 0.08283321334626792 + }, + "log_likelihood_vmap": -101745.38570215808, + "log_likelihood_scalar": -101745.38349694449, + "log_likelihood_library_pdip": -101745.38544685252, + "log_likelihood_library_pdip_scalar": -101745.38338916081, + "rel_diff_vmap_vs_library_pdip": 2.5092592822157503e-09, + "rel_diff_scalar_vs_library_pdip_scalar": 1.0593471182273686e-09, + "abs_diff_nats": 0.0022052135900594294, + "rel_diff": 2.1673844200760757e-08, + "rel_diff_scalar_vs_library_pdip": 1.9164584503174787e-08, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 0.0020576917158905417, + "rel_diff_library_pdip_vmap_vs_scalar": 2.022393200898541e-08, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "FAIL", + "certified": true, + "passes": 2, + "pdip_iter": null + }, + { + "lane": 11, + "draw_name": "call00015_lane11", + "draw_kind": "captured", + "offsets": { + "centre_0": 0.001017060353322001, + "centre_1": 0.003035861051809724, + "ell_comps_0": 0.0014054844842678396, + "ell_comps_1": -0.00019678252877009805, + "einstein_radius": -0.04179610309843307 + }, + "log_likelihood_vmap": 18957.52834991338, + "log_likelihood_scalar": 18957.5283497521, + "log_likelihood_library_pdip": 18957.52834991469, + "log_likelihood_library_pdip_scalar": 18957.528349723354, + "rel_diff_vmap_vs_library_pdip": 6.908455292163181e-14, + "rel_diff_scalar_vs_library_pdip_scalar": 1.516405936645123e-12, + "abs_diff_nats": 1.6127887647598982e-07, + "rel_diff": 8.507378889300133e-12, + "rel_diff_scalar_vs_library_pdip": 8.576463442148802e-12, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 1.9133585738018155e-07, + "rel_diff_library_pdip_vmap_vs_scalar": 1.0092869378880486e-11, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": false, + "passes": 16, + "pdip_iter": null + }, + { + "lane": 12, + "draw_name": "call00015_lane12", + "draw_kind": "captured", + "offsets": { + "centre_0": -0.0012508260776529923, + "centre_1": -0.0075763258203543175, + "ell_comps_0": -0.0003476568325791879, + "ell_comps_1": 0.0070528223693464365, + "einstein_radius": -0.005182936058341969 + }, + "log_likelihood_vmap": 24810.049660195124, + "log_likelihood_scalar": 24810.049660195124, + "log_likelihood_library_pdip": 24810.0496601949, + "log_likelihood_library_pdip_scalar": 24810.049660194898, + "rel_diff_vmap_vs_library_pdip": 8.94462970739782e-15, + "rel_diff_scalar_vs_library_pdip_scalar": 9.091262981289588e-15, + "abs_diff_nats": 0.0, + "rel_diff": 0.0, + "rel_diff_scalar_vs_library_pdip": 8.94462970739782e-15, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 3.637978807091713e-12, + "rel_diff_library_pdip_vmap_vs_scalar": 1.4663327389176755e-16, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": true, + "passes": 9, + "pdip_iter": null + }, + { + "lane": 13, + "draw_name": "call00015_lane13", + "draw_kind": "captured", + "offsets": { + "centre_0": 0.0039046265841316857, + "centre_1": 0.008586063066835778, + "ell_comps_0": 0.01612319103606081, + "ell_comps_1": -0.006478405394829051, + "einstein_radius": -0.06420305523683667 + }, + "log_likelihood_vmap": -3605.706216813269, + "log_likelihood_scalar": -3605.7062159382913, + "log_likelihood_library_pdip": -3605.706216783161, + "log_likelihood_library_pdip_scalar": -3605.706215912789, + "rel_diff_vmap_vs_library_pdip": 8.350073688019946e-12, + "rel_diff_scalar_vs_library_pdip_scalar": 7.072742456156259e-12, + "abs_diff_nats": 8.749775588512421e-07, + "rel_diff": 2.4266468382354103e-10, + "rel_diff_scalar_vs_library_pdip": 2.343146100786612e-10, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 8.70371877681464e-07, + "rel_diff_library_pdip_vmap_vs_scalar": 2.4138735259137805e-10, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": true, + "passes": 2, + "pdip_iter": null + }, + { + "lane": 14, + "draw_name": "call00015_lane14", + "draw_kind": "captured", + "offsets": { + "centre_0": 0.007195835212073937, + "centre_1": -0.0022675171274400335, + "ell_comps_0": 0.004220685262914858, + "ell_comps_1": 0.006581974817750368, + "einstein_radius": 0.08589577997501685 + }, + "log_likelihood_vmap": 11126.92147574079, + "log_likelihood_scalar": 11126.921475785763, + "log_likelihood_library_pdip": 11126.92147574079, + "log_likelihood_library_pdip_scalar": 11126.921475785763, + "rel_diff_vmap_vs_library_pdip": 0.0, + "rel_diff_scalar_vs_library_pdip_scalar": 0.0, + "abs_diff_nats": 4.4972694013267756e-08, + "rel_diff": 4.041791263750414e-12, + "rel_diff_scalar_vs_library_pdip": 4.04179126376675e-12, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 4.4972694013267756e-08, + "rel_diff_library_pdip_vmap_vs_scalar": 4.041791263750414e-12, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": false, + "passes": 16, + "pdip_iter": null + }, + { + "lane": 15, + "draw_name": "call00015_lane15", + "draw_kind": "captured", + "offsets": { + "centre_0": 0.0024446743118905125, + "centre_1": 0.0028324231769206983, + "ell_comps_0": -0.017159158004659933, + "ell_comps_1": 0.008265799441903459, + "einstein_radius": -0.03860302877433641 + }, + "log_likelihood_vmap": 20410.34397373332, + "log_likelihood_scalar": 20410.34397372084, + "log_likelihood_library_pdip": 20410.343973733514, + "log_likelihood_library_pdip_scalar": 20410.343973722825, + "rel_diff_vmap_vs_library_pdip": 9.44682152461495e-15, + "rel_diff_scalar_vs_library_pdip_scalar": 9.732008589514083e-14, + "abs_diff_nats": 1.2481905287131667e-08, + "rel_diff": 6.115480122825287e-13, + "rel_diff_scalar_vs_library_pdip": 6.209948338067639e-13, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 1.0688381735235453e-08, + "rel_diff_library_pdip_vmap_vs_scalar": 5.236747479119483e-13, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": false, + "passes": 16, + "pdip_iter": null + } + ], + "lane_pins": [ + { + "pin": "lane 0: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 24758.50619430934, + "reference_value": 24758.50619430915, + "rel_diff": 7.640804194085496e-15, + "abs_diff_nats": 1.8917489796876907e-10, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 0: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 24758.506194309357, + "reference_value": 24758.506194309142, + "rel_diff": 8.66937398944316e-15, + "abs_diff_nats": 2.1464074961841106e-10, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 0: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 24758.50619430934, + "reference_value": 24758.506194309357, + "rel_diff": 7.34692710969753e-16, + "abs_diff_nats": 1.8189894035458565e-11, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 0: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 24758.50619430915, + "reference_value": 24758.506194309142, + "rel_diff": 2.938770843879038e-16, + "abs_diff_nats": 7.275957614183426e-12, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 1: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 20551.004887772728, + "reference_value": 20551.004887772702, + "rel_diff": 1.2391535980215492e-15, + "abs_diff_nats": 2.546585164964199e-11, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 1: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 20551.004887773106, + "reference_value": 20551.004887772997, + "rel_diff": 5.310658277235135e-15, + "abs_diff_nats": 1.0913936421275139e-10, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 1: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 20551.004887772728, + "reference_value": 20551.004887773106, + "rel_diff": 1.8410282027748372e-14, + "abs_diff_nats": 3.7834979593753815e-10, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 1: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 20551.004887772702, + "reference_value": 20551.004887772997, + "rel_diff": 1.4338777348534864e-14, + "abs_diff_nats": 2.9467628337442875e-10, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 2: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -189710.11837880412, + "reference_value": -189709.80717038375, + "rel_diff": 1.640444555907388e-06, + "abs_diff_nats": 0.3112084203748964, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 2: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -189709.06217123155, + "reference_value": -189709.0186126798, + "rel_diff": 2.2960717457613137e-07, + "abs_diff_nats": 0.04355855175526813, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 2: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -189710.11837880412, + "reference_value": -189709.06217123155, + "rel_diff": 5.567512487212259e-06, + "abs_diff_nats": 1.0562075725756586, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 2: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -189709.80717038375, + "reference_value": -189709.0186126798, + "rel_diff": 4.156669565435855e-06, + "abs_diff_nats": 0.7885577039560303, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 3: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -141741.97984036076, + "reference_value": -141741.98368558992, + "rel_diff": 2.712837130432729e-08, + "abs_diff_nats": 0.0038452291628345847, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 3: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -141741.9662679517, + "reference_value": -141741.96647750167, + "rel_diff": 1.478390423176762e-09, + "abs_diff_nats": 0.00020954996580258012, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 3: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -141741.97984036076, + "reference_value": -141741.9662679517, + "rel_diff": 9.575434437590343e-08, + "abs_diff_nats": 0.013572409050539136, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 3: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -141741.98368558992, + "reference_value": -141741.96647750167, + "rel_diff": 1.2140432840899337e-07, + "abs_diff_nats": 0.01720808824757114, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 4: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 24880.54593298869, + "reference_value": 24880.54593298869, + "rel_diff": 0.0, + "abs_diff_nats": 0.0, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 4: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 24880.545932988738, + "reference_value": 24880.545932988724, + "rel_diff": 5.848712189660073e-16, + "abs_diff_nats": 1.4551915228366852e-11, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 4: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 24880.54593298869, + "reference_value": 24880.545932988738, + "rel_diff": 1.9008314616395227e-15, + "abs_diff_nats": 4.729372449219227e-11, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 4: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 24880.54593298869, + "reference_value": 24880.545932988724, + "rel_diff": 1.3159602426735166e-15, + "abs_diff_nats": 3.2741809263825417e-11, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 5: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 25472.519186609876, + "reference_value": 25472.51918659315, + "rel_diff": 6.566852077909819e-13, + "abs_diff_nats": 1.6727426555007696e-08, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 5: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 25472.519186782676, + "reference_value": 25472.519186784746, + "rel_diff": 8.126443741414924e-14, + "abs_diff_nats": 2.0700099412351847e-09, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 5: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 25472.519186609876, + "reference_value": 25472.519186782676, + "rel_diff": 6.783795277214391e-12, + "abs_diff_nats": 1.7280035535804927e-07, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 5: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 25472.51918659315, + "reference_value": 25472.519186784746, + "rel_diff": 7.521744922414032e-12, + "abs_diff_nats": 1.9159779185429215e-07, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 6: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -83383.91631621221, + "reference_value": -83383.91633831926, + "rel_diff": 2.651236870011004e-10, + "abs_diff_nats": 2.2107051336206496e-05, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 6: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -83383.91544755129, + "reference_value": -83383.91553842722, + "rel_diff": 1.0898495736368818e-09, + "abs_diff_nats": 9.087592479772866e-05, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 6: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -83383.91631621221, + "reference_value": -83383.91544755129, + "rel_diff": 1.0417607724873073e-08, + "abs_diff_nats": 0.0008686609216965735, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 6: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -83383.91633831926, + "reference_value": -83383.91553842722, + "rel_diff": 9.592881829426966e-09, + "abs_diff_nats": 0.0007998920482350513, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 7: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -11960.284432425826, + "reference_value": -11960.284433607245, + "rel_diff": 9.877850917726772e-11, + "abs_diff_nats": 1.1814190656878054e-06, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 7: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -11960.284430105821, + "reference_value": -11960.284429711799, + "rel_diff": 3.294421725119323e-11, + "abs_diff_nats": 3.9402220863848925e-07, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 7: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -11960.284432425826, + "reference_value": -11960.284430105821, + "rel_diff": 1.9397570203774712e-10, + "abs_diff_nats": 2.320004568900913e-06, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 7: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -11960.284433607245, + "reference_value": -11960.284429711799, + "rel_diff": 3.2569842850477045e-10, + "abs_diff_nats": 3.895445843227208e-06, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 8: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 23223.55039142083, + "reference_value": 23223.550391416982, + "rel_diff": 1.6573613909290755e-13, + "abs_diff_nats": 3.848981577903032e-09, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 8: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 23223.55039149491, + "reference_value": 23223.55039150207, + "rel_diff": 3.082880167614811e-13, + "abs_diff_nats": 7.159542292356491e-09, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 8: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 23223.55039142083, + "reference_value": 23223.55039149491, + "rel_diff": 3.1898724010751904e-12, + "abs_diff_nats": 7.408016244880855e-08, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 8: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 23223.550391416982, + "reference_value": 23223.55039150207, + "rel_diff": 3.663896556927988e-12, + "abs_diff_nats": 8.508868631906807e-08, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 9: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -177119.561977738, + "reference_value": -177119.6181614268, + "rel_diff": 3.1720759897430864e-07, + "abs_diff_nats": 0.056183688808232546, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 9: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -177117.75747171917, + "reference_value": -177117.8047572617, + "rel_diff": 2.6697227078407144e-07, + "abs_diff_nats": 0.04728554253233597, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 9: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -177119.561977738, + "reference_value": -177117.75747171917, + "rel_diff": 1.0188171104775633e-05, + "abs_diff_nats": 1.8045060188160278, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 9: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -177119.6181614268, + "reference_value": -177117.8047572617, + "rel_diff": 1.0238406960707184e-05, + "abs_diff_nats": 1.8134041650919244, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 10: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -101745.38570215808, + "reference_value": -101745.38544685252, + "rel_diff": 2.5092592822157503e-09, + "abs_diff_nats": 0.000255305552855134, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 10: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -101745.38349694449, + "reference_value": -101745.38338916081, + "rel_diff": 1.0593471182273686e-09, + "abs_diff_nats": 0.00010778367868624628, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 10: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -101745.38570215808, + "reference_value": -101745.38349694449, + "rel_diff": 2.1673844200760757e-08, + "abs_diff_nats": 0.0022052135900594294, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 10: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -101745.38544685252, + "reference_value": -101745.38338916081, + "rel_diff": 2.022393200898541e-08, + "abs_diff_nats": 0.0020576917158905417, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 11: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 18957.52834991338, + "reference_value": 18957.52834991469, + "rel_diff": 6.908455292163181e-14, + "abs_diff_nats": 1.3096723705530167e-09, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 11: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 18957.5283497521, + "reference_value": 18957.528349723354, + "rel_diff": 1.516405936645123e-12, + "abs_diff_nats": 2.8747308533638716e-08, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 11: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 18957.52834991338, + "reference_value": 18957.5283497521, + "rel_diff": 8.507378889300133e-12, + "abs_diff_nats": 1.6127887647598982e-07, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 11: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 18957.52834991469, + "reference_value": 18957.528349723354, + "rel_diff": 1.0092869378880486e-11, + "abs_diff_nats": 1.9133585738018155e-07, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 12: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 24810.049660195124, + "reference_value": 24810.0496601949, + "rel_diff": 8.94462970739782e-15, + "abs_diff_nats": 2.219167072325945e-10, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 12: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 24810.049660195124, + "reference_value": 24810.049660194898, + "rel_diff": 9.091262981289588e-15, + "abs_diff_nats": 2.255546860396862e-10, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 12: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 24810.049660195124, + "reference_value": 24810.049660195124, + "rel_diff": 0.0, + "abs_diff_nats": 0.0, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 12: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 24810.0496601949, + "reference_value": 24810.049660194898, + "rel_diff": 1.4663327389176755e-16, + "abs_diff_nats": 3.637978807091713e-12, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 13: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -3605.706216813269, + "reference_value": -3605.706216783161, + "rel_diff": 8.350073688019946e-12, + "abs_diff_nats": 3.0107912607491016e-08, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 13: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -3605.7062159382913, + "reference_value": -3605.706215912789, + "rel_diff": 7.072742456156259e-12, + "abs_diff_nats": 2.5502231437712908e-08, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 13: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -3605.706216813269, + "reference_value": -3605.7062159382913, + "rel_diff": 2.4266468382354103e-10, + "abs_diff_nats": 8.749775588512421e-07, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 13: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -3605.706216783161, + "reference_value": -3605.706215912789, + "rel_diff": 2.4138735259137805e-10, + "abs_diff_nats": 8.70371877681464e-07, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 14: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 11126.92147574079, + "reference_value": 11126.92147574079, + "rel_diff": 0.0, + "abs_diff_nats": 0.0, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 14: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 11126.921475785763, + "reference_value": 11126.921475785763, + "rel_diff": 0.0, + "abs_diff_nats": 0.0, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 14: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 11126.92147574079, + "reference_value": 11126.921475785763, + "rel_diff": 4.041791263750414e-12, + "abs_diff_nats": 4.4972694013267756e-08, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 14: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 11126.92147574079, + "reference_value": 11126.921475785763, + "rel_diff": 4.041791263750414e-12, + "abs_diff_nats": 4.4972694013267756e-08, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 15: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 20410.34397373332, + "reference_value": 20410.343973733514, + "rel_diff": 9.44682152461495e-15, + "abs_diff_nats": 1.9281287677586079e-10, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 15: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 20410.34397372084, + "reference_value": 20410.343973722825, + "rel_diff": 9.732008589514083e-14, + "abs_diff_nats": 1.9863364286720753e-09, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 15: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 20410.34397373332, + "reference_value": 20410.34397372084, + "rel_diff": 6.115480122825287e-13, + "abs_diff_nats": 1.2481905287131667e-08, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 15: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 20410.343973733514, + "reference_value": 20410.343973722825, + "rel_diff": 5.236747479119483e-13, + "abs_diff_nats": 1.0688381735235453e-08, + "within_rtol": true, + "status": "RECORDED" + } + ], + "lanes_failed": 5, + "arm_rows": { + "vmap": { + "arm": "vmap", + "program": "jax.jit(jax.vmap(fn))", + "stands_for": "Nautilus(use_jax_vmap=True) \u2014 Fitness._vmap", + "hlo_source": "jax.jit(jax.vmap(fn)).lower(batched_tree) \u2014 the exact current Fitness._vmap composition (PyAutoFit#1638)", + "batch_wall_ms": 963.1363696000335, + "wall_production_nesting_ms": 963.1363696000335, + "wall_aot_command_buffers_on_ms": 964.3899668997619, + "wall_aot_command_buffers_off_ms": 966.9188494000991, + "command_buffer_delta_ms": 2.528882500337204, + "production_nesting_vs_aot_on_delta_ms": -1.2535972997284262, + "production_nesting_vs_aot_on_delta_pct": -0.12998862936726552, + "wall_per_lane_ms": 60.196023100002094, + "wall_per_lane_command_buffers_off_ms": 60.432428087506196, + "traced_batch_wall_ms": 983.1974248998449, + "untraced_batch_wall_ms": 966.1898319998727, + "traced_wall_per_lane_ms": 61.44983905624031, + "callback_count_per_call": 16.0, + "callback_count_per_lane": 1.0, + "callback_expectation": "B per batched call \u2014 the qhull pure_callback is vmap_method='sequential'", + "host_qhull_ms": 71.77601759976824, + "host_tables_ms": 1.8577926006400958, + "host_qhull_ms_per_lane": 4.486001099985515, + "host_tables_ms_per_lane": 0.11611203754000599, + "host_callback_probe": { + "calls": 160, + "qhull_ms_total": 717.7601759976824, + "tables_ms_total": 18.577926006400958, + "total_ms_total": 736.3381020040833, + "qhull_ms_mean": 4.486001099985515, + "tables_ms_mean": 0.11611203754000599, + "total_ms_mean": 4.602113137525521, + "non_finite_calls": 0, + "n_points": [ + 1500 + ] + }, + "host_callback_records_first": [ + { + "n_points": 1500, + "qhull_ms": 4.706781001004856, + "tables_ms": 0.19469799735816196, + "total_ms": 4.901478998363018, + "finite": true + }, + { + "n_points": 1500, + "qhull_ms": 4.4837440000264905, + "tables_ms": 0.1332280007773079, + "total_ms": 4.616972000803798, + "finite": true + }, + { + "n_points": 1500, + "qhull_ms": 4.455662998225307, + "tables_ms": 0.12346799849183299, + "total_ms": 4.57913099671714, + "finite": true + }, + { + "n_points": 1500, + "qhull_ms": 4.480153998883907, + "tables_ms": 0.12822799908462912, + "total_ms": 4.608381997968536, + "finite": true + } + ], + "device_idle_ms": 117.4971945000002, + "device_idle_ms_per_lane": 7.343574656250013, + "trace": { + "parser": "ProfileData.from_file(xplane) + as_text() + stack_frame_index(proto field 17)", + "stage_audit": { + "mixed_fusion": [ + { + "instruction": "loop_divide_gather_fusion", + "ms": 17.2570046, + "opcode": "fusion", + "shape": "(f64[15361,16,1,1,1500]{4,3,2,1,0}, f64[15361,16,1,1,1500]{4,3,2,1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:133", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:133 (curvature_matrix_via_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:93 (InversionImagingMapping.curvature_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:389 (AbstractInversion.curvature_reg_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "input_add_multiply_transpose_fusion", + "ms": 7.7020534000000005, + "opcode": "fusion", + "shape": "(f64[16,1500,1500]{2,1,0}, f64[16,1500,1500]{2,1,0}, f64[16,1500,1500]{2,1,0}, f64[16,1500,1500]{2,1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:237 (active_set_search)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:293 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:274 (_certified_positive_only_from)" + ] + }, + { + "instruction": "loop_broadcast_fusion.7", + "ms": 3.9764483, + "opcode": "fusion", + "shape": "f64[16,1500,180,180]{3,2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "input_reduce_fusion.21", + "ms": 1.9422168, + "opcode": "fusion", + "shape": "f64[92,16,1500]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/inversion_imaging_util.py:123", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/inversion_imaging_util.py:123 (data_vector_via_blurred_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:67 (InversionImagingMapping.data_vector)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:699 (AbstractInversion.reconstruction)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "input_reduce_fusion.25", + "ms": 1.7463912, + "opcode": "fusion", + "shape": "f64[15361,16]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:163", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:163 (mapped_reconstructed_data_via_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:120 (InversionImagingMapping._mapped_reconstructed_data_dict_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:196 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "loop_broadcast_fusion.8", + "ms": 1.7016860000000003, + "opcode": "fusion", + "shape": "f64[15361,16,1500]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:353", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:353 (mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/abstract.py:283 (Mapper.mapping_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:91 (AbstractInversionImaging._mapping_matrix_for_convolution_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:137 (AbstractInversionImaging.operated_mapping_matrix_list)" + ] + } + ], + "other": [ + { + "instruction": "copy.138", + "ms": 0.04782109999999985, + "opcode": "copy", + "shape": "f64[1,16,1024,2]{3,2,1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "copy.123", + "ms": 0.03263710000000005, + "opcode": "copy", + "shape": "pred[16,1500]{1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "copy.141", + "ms": 0.03252490000000003, + "opcode": "copy", + "shape": "s32[1,3000,3]{2,1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "copy.140", + "ms": 0.032499600000000024, + "opcode": "copy", + "shape": "s32[1,3000,3]{2,1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "copy.142", + "ms": 0.032099300000000025, + "opcode": "copy", + "shape": "f64[1,1500,2]{2,1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "copy.139", + "ms": 0.02960969999999999, + "opcode": "copy", + "shape": "s32[1,1500]{1,0}", + "source": "", + "stack": [] + } + ], + "mesh_qhull_callback": [ + { + "instruction": "pure_callback.0", + "ms": 0.17201450000000054, + "opcode": "custom-call", + "shape": "(s32[3000,3]{1,0}, s32[3000,3]{1,0}, s32[1500]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:161", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:161 (_jax_delaunay_tables)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:405 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + }, + { + "instruction": "loop_add_fusion.1", + "ms": 0.02440319999999997, + "opcode": "fusion", + "shape": "s64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:161", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:161 (_jax_delaunay_tables)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:405 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + }, + { + "instruction": "loop_broadcast_fusion.3", + "ms": 0.0019904, + "opcode": "fusion", + "shape": "s32[16,1500]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:161", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:161 (_jax_delaunay_tables)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:405 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + } + ], + "border_relocator": [ + { + "instruction": "custom-call.2", + "ms": 0.0422181, + "opcode": "custom-call", + "shape": "(f64[16,2,2]{2,1,0}, s8[4194304]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:242", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:242 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:454 (BorderRelocator.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:176 (AbstractMesh.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:214 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "eigh.34", + "ms": 0.0146272, + "opcode": "custom-call", + "shape": "(f64[16,2,2]{1,2,0}, f64[16,2]{1,0}, s32[16]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:245", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:245 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:454 (BorderRelocator.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:176 (AbstractMesh.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:214 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "loop_add_rsqrt_fusion", + "ms": 0.012505700000000002, + "opcode": "fusion", + "shape": "(f64[16,15361]{1,0}, f64[16,15361]{1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:311", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:311 (relocated_grid_via_ellipse_border_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:423 (BorderRelocator.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:83 (AbstractMesh.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:208 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "loop_add_fusion.4", + "ms": 0.0037536000000000006, + "opcode": "fusion", + "shape": "f64[16,1500]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:308", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:308 (relocated_grid_via_ellipse_border_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:458 (BorderRelocator.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:176 (AbstractMesh.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:214 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "loop_abs_fusion.1", + "ms": 0.003276900000000001, + "opcode": "fusion", + "shape": "(f64[16,392,1]{2,1,0}, f64[16,392,1]{2,1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:269", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:269 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:454 (BorderRelocator.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:176 (AbstractMesh.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:214 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "input_reduce_fusion.27", + "ms": 0.0031295999999999997, + "opcode": "fusion", + "shape": "f64[16]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:269", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:269 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:454 (BorderRelocator.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:176 (AbstractMesh.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:214 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + } + ], + "mesh_construction": [ + { + "instruction": "loop_compare_fusion.5", + "ms": 0.0046944000000000005, + "opcode": "fusion", + "shape": "pred[16,6000,3]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:736", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:736 (DelaunayInterface.splitted_sizes)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:997 (InterpolatorDelaunay._mappings_sizes_weights_split)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt_split.py:124 (AdaptSplit.regularization_matrix_from)" + ] + }, + { + "instruction": "input_concatenate_fusion.13", + "ms": 0.002352, + "opcode": "fusion", + "shape": "f64[16,1500,2]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:820", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:820 (InterpolatorDelaunay.mesh_grid_xy)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:847 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + }, + { + "instruction": "loop_multiply_fusion.4", + "ms": 0.0023455999999999998, + "opcode": "fusion", + "shape": "f64[16,1500]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:412", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:412 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "mesh_seed_argmin": [ + { + "instruction": "input_reduce_fusion", + "ms": 1.3077218000000002, + "opcode": "fusion", + "shape": "(f64[16,1024]{1,0}, s64[16,1024]{1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:191", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:191 (_nearest_vertex_seed_from..argmin_chunk)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204 (_nearest_vertex_seed_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:351 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)" + ] + }, + { + "instruction": "loop_dynamic_update_slice_fusion", + "ms": 0.04838119999999986, + "opcode": "fusion", + "shape": "s32[21,16,1024]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204 (_nearest_vertex_seed_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:351 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "loop_add_fusion", + "ms": 0.031513699999999895, + "opcode": "fusion", + "shape": "s64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204 (_nearest_vertex_seed_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:351 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "loop_broadcast_fusion.4", + "ms": 0.002432, + "opcode": "fusion", + "shape": "s32[21,16,1024]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204 (_nearest_vertex_seed_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:351 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "pdip_solve": [ + { + "instruction": "cholesky.80", + "ms": 191.69935839997527, + "opcode": "custom-call", + "shape": "(f64[16,1500,1500]{1,2,0}, s32[16]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:106", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:106 (factorize_kkt)", + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:212 (pdip_pc_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:83 (solve_nnls)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:129 (_solve_nnls_primal_with..primal)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:164 (solve_nnls_primal_with_status)" + ] + }, + { + "instruction": "cholesky.60", + "ms": 101.35508909998819, + "opcode": "custom-call", + "shape": "(f64[16,1500,1500]{1,2,0}, s32[16]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:252 (active_set_search..body_fun)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:262 (active_set_search)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:293 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)" + ] + }, + { + "instruction": "triangular-solve", + "ms": 54.49890020000196, + "opcode": "custom-call", + "shape": "(f64[16,1500,1]{1,2,0}, s8[256]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146 (solve_kkt_rhs)", + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:213 (pdip_pc_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:83 (solve_nnls)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:129 (_solve_nnls_primal_with..primal)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:164 (solve_nnls_primal_with_status)" + ] + }, + { + "instruction": "triangular-solve.2", + "ms": 50.11525630000035, + "opcode": "custom-call", + "shape": "(f64[16,1500,1]{1,2,0}, s8[256]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146 (solve_kkt_rhs)", + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:217 (pdip_pc_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:83 (solve_nnls)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:129 (_solve_nnls_primal_with..primal)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:164 (solve_nnls_primal_with_status)" + ] + }, + { + "instruction": "triangular-solve.3", + "ms": 49.00282360000046, + "opcode": "custom-call", + "shape": "(f64[16,1500,1]{1,2,0}, s8[256]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146 (solve_kkt_rhs)", + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:217 (pdip_pc_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:83 (solve_nnls)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:129 (_solve_nnls_primal_with..primal)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:164 (solve_nnls_primal_with_status)" + ] + }, + { + "instruction": "triangular-solve.1", + "ms": 48.29330050000044, + "opcode": "custom-call", + "shape": "(f64[16,1500,1]{1,2,0}, s8[256]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146 (solve_kkt_rhs)", + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:213 (pdip_pc_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:83 (solve_nnls)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:129 (_solve_nnls_primal_with..primal)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:164 (solve_nnls_primal_with_status)" + ] + } + ], + "mesh_dual_areas": [ + { + "instruction": "input_scatter_fusion.9", + "ms": 0.0031775999999999996, + "opcode": "fusion", + "shape": "f64[16,1500]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:393", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:393 (_dual_areas_padded_jnp)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:408 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + }, + { + "instruction": "input_scatter_fusion.7", + "ms": 0.0031519999999999994, + "opcode": "fusion", + "shape": "f64[16,1500]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:393", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:393 (_dual_areas_padded_jnp)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:408 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + } + ], + "mesh_locate_walk": [ + { + "instruction": "loop_slice_subtract_fusion", + "ms": 0.28669310000000015, + "opcode": "fusion", + "shape": "(f64[16,21361,1]{2,1,0}, f64[16,21361,1]{2,1,0}, f64[16,21361,1]{2,1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:236", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:236 (_walk_from_seed..cross)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:250 (_walk_from_seed..weights_of)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:262 (_walk_from_seed..walk_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:292 (_walk_from_seed..body)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)" + ] + }, + { + "instruction": "loop_reduce_fusion", + "ms": 0.10496080000000002, + "opcode": "fusion", + "shape": "(f64[16,21361]{1,0}, s64[16,21361]{1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:264", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:264 (_walk_from_seed..walk_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:292 (_walk_from_seed..body)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:264 (_walk_from_seed..walk_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:292 (_walk_from_seed..body)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)" + ] + }, + { + "instruction": "loop_select_fusion", + "ms": 0.09967749999999999, + "opcode": "fusion", + "shape": "(pred[16,21361]{1,0}, pred[16,21361]{1,0}, s32[16,21361]{1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:353 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "loop_gather_fusion.1", + "ms": 0.07103090000000001, + "opcode": "fusion", + "shape": "s32[341776,1,1,3]{3,2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:239", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:239 (_walk_from_seed..weights_of)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:262 (_walk_from_seed..walk_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:292 (_walk_from_seed..body)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:353 (pix_indexes_delaunay_walk_from)" + ] + }, + { + "instruction": "loop_gather_fusion", + "ms": 0.05417649999999998, + "opcode": "fusion", + "shape": "s32[341776,1,1,1]{3,2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:267", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:267 (_walk_from_seed..walk_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:292 (_walk_from_seed..body)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:353 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)" + ] + }, + { + "instruction": "input_concatenate_fusion.1", + "ms": 0.04070780000000003, + "opcode": "fusion", + "shape": "s32[16,21361,2]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:244", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:244 (_walk_from_seed..weights_of)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:262 (_walk_from_seed..walk_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:292 (_walk_from_seed..body)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:353 (pix_indexes_delaunay_walk_from)" + ] + } + ], + "psf_convolution_mapping_matrix": [ + { + "instruction": "input_scatter_fusion", + "ms": 32.2914924, + "opcode": "fusion", + "shape": "f64[16,1500,180,180]{3,2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "fft.29.0", + "ms": 28.261534899999997, + "opcode": "fft", + "shape": "f64[16,1500,180,180]{3,2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "fft.25.0", + "ms": 21.587690900000002, + "opcode": "fft", + "shape": "c128[16,1500,180,91]{3,2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "fft.27.0", + "ms": 15.515429199999998, + "opcode": "fft", + "shape": "c128[16,1500,91,180]{3,2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "input_transpose_fusion.4", + "ms": 8.436837, + "opcode": "fusion", + "shape": "c128[16,1500,91,180]{3,2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "wrapped_transpose", + "ms": 7.9106950000000005, + "opcode": "fusion", + "shape": "c128[16,1500,180,91]{3,2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + } + ], + "mapping_matrix": [ + { + "instruction": "input_scatter_fusion.3", + "ms": 0.050870599999999995, + "opcode": "fusion", + "shape": "f64[16,1500]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:71", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:71 (adaptive_pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/abstract.py:507 (Mapper.pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt.py:339 (Adapt.regularization_weights_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt_split.py:120 (AdaptSplit.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)" + ] + }, + { + "instruction": "input_reduce_fusion.49", + "ms": 0.0037889, + "opcode": "fusion", + "shape": "f64[16]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:93", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:93 (adaptive_pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/abstract.py:507 (Mapper.pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt.py:339 (Adapt.regularization_weights_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt_split.py:120 (AdaptSplit.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)" + ] + } + ], + "regularization_H": [ + { + "instruction": "input_scatter_fusion.10", + "ms": 0.0027808, + "opcode": "fusion", + "shape": "f64[16,1500,1500]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:615", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:615 (pixel_splitted_regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt_split.py:137 (AdaptSplit.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:332 (AbstractInversion.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "curvature_matrix_F": [ + { + "instruction": "cublas-lt-matmul.2", + "ms": 66.39081700000001, + "opcode": "custom-call", + "shape": "(f64[16,1500,1500]{2,1,0}, s8[4194304]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:134", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:134 (curvature_matrix_via_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:93 (InversionImagingMapping.curvature_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:389 (AbstractInversion.curvature_reg_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "inversion_other": [ + { + "instruction": "cholesky.120", + "ms": 7.007805500000042, + "opcode": "custom-call", + "shape": "(f64[16,1500,1500]{1,2,0}, s32[16]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986 (AbstractInversion._log_det_symmetric_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:1078 (AbstractInversion.log_det_curvature_reg_matrix_term)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:347 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/model/analysis.py:135 (AnalysisImaging.log_likelihood_function)" + ] + }, + { + "instruction": "cholesky.130", + "ms": 6.9099641000000105, + "opcode": "custom-call", + "shape": "(f64[16,1500,1500]{1,2,0}, s32[16]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986 (AbstractInversion._log_det_symmetric_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:1157 (AbstractInversion.log_det_regularization_matrix_term)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:348 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/model/analysis.py:135 (AnalysisImaging.log_likelihood_function)" + ] + }, + { + "instruction": "loop_reduce_window_fusion", + "ms": 0.0031327999999999994, + "opcode": "fusion", + "shape": "s64[94,16]{1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "loop_broadcast_convert_fusion", + "ms": 0.0026305, + "opcode": "fusion", + "shape": "(s32[1500]{0}, s64[1500]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:527", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:527 (AbstractInversion.zeroed_ids_to_keep)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:567 (AbstractInversion.solve_ids_to_keep)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:684 (AbstractInversion.reconstruction)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "input_scatter_fusion.5", + "ms": 0.0022143999999999996, + "opcode": "fusion", + "shape": "s64[1500]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:527", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:527 (AbstractInversion.zeroed_ids_to_keep)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:567 (AbstractInversion.solve_ids_to_keep)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:684 (AbstractInversion.reconstruction)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "loop_reduce_window_fusion.1", + "ms": 0.0021248, + "opcode": "fusion", + "shape": "s64[6,16]{1,0}", + "source": "", + "stack": [] + } + ] + }, + "stage_audit_note": "The HLO instructions that contributed most of each stage's milliseconds, with their full source stack. A stage row is only as good as the rules that built it; this is how a reader checks a row against the HLO instead of trusting it.", + "untraced_wall_ms": 966.1898319998727, + "reconciliation_vs_untraced_pct": 1.6368651352301196, + "wall_basis": "wall_ms is the TRACED run's wall, the run these kernel durations came from. untraced_wall_ms is the same executable without the profiler; the difference is the profiler's overhead and belongs in neither the stages nor the idle row.", + "calls": 10, + "call_split": "per-call (first-instruction recurrence)", + "call_blocks": 10, + "events": 310660, + "streams": [ + "Stream #14(MemcpyD2D,Compute,MemcpyD2H,MemcpyH2D)" + ], + "per_stage_ms": { + "border_relocator": { + "median_ms": 0.0882735, + "min_ms": 0.08780899999999998, + "max_ms": 0.088513 + }, + "curvature_matrix_F": { + "median_ms": 66.3122325, + "min_ms": 66.008172, + "max_ms": 67.084427 + }, + "inversion_other": { + "median_ms": 13.897173500000001, + "min_ms": 13.687939000000005, + "max_ms": 14.222793000000006 + }, + "mapping_matrix": { + "median_ms": 0.0546885, + "min_ms": 0.052352, + "max_ms": 0.056736 + }, + "mesh_construction": { + "median_ms": 0.009375999999999999, + "min_ms": 0.009216, + "max_ms": 0.009663999999999999 + }, + "mesh_dual_areas": { + "median_ms": 0.006336, + "min_ms": 0.006304, + "max_ms": 0.006368 + }, + "mesh_locate_walk": { + "median_ms": 0.8517189999999997, + "min_ms": 0.8457959999999999, + "max_ms": 0.8558780000000002 + }, + "mesh_qhull_callback": { + "median_ms": 0.19821000000000008, + "min_ms": 0.19731400000000004, + "max_ms": 0.2001319999999999 + }, + "mesh_seed_argmin": { + "median_ms": 1.3893509999999996, + "min_ms": 1.3848449999999999, + "max_ms": 1.3936389999999999 + }, + "mixed_fusion": { + "median_ms": 36.2498645, + "min_ms": 35.89858400000001, + "max_ms": 36.760322000000016 + }, + "other": { + "median_ms": 0.2628649999999998, + "min_ms": 0.2619529999999997, + "max_ms": 0.26524999999999965 + }, + "pdip_solve": { + "median_ms": 631.2192930000169, + "min_ms": 630.6065110000172, + "max_ms": 634.1925540000129 + }, + "psf_convolution_mapping_matrix": { + "median_ms": 113.96569549999998, + "min_ms": 113.743887, + "max_ms": 114.258175 + }, + "regularization_H": { + "median_ms": 0.002784, + "min_ms": 0.00272, + "max_ms": 0.002848 + } + }, + "stage_order": [ + "border_relocator", + "mesh_qhull_callback", + "mesh_seed_argmin", + "mesh_locate_walk", + "mesh_dual_areas", + "mesh_construction", + "mapping_matrix", + "psf_convolution_mapping_matrix", + "curvature_matrix_F", + "regularization_H", + "pdip_solve", + "inversion_other", + "mixed_fusion", + "other" + ], + "mixed_fusion": { + "ms": 36.2498645, + "constituent_stage_sets": { + "curvature_matrix_F + psf_convolution_mapping_matrix": 17.2570046, + "curvature_reg_reduce_gather + inversion_other + mapped_reconstruction + pdip_solve + reconstruction_scatter + regularization_H": 7.7020534000000005, + "pdip_solve + psf_convolution_mapping_matrix": 3.9764483, + "data_vector_D + pdip_solve": 1.9577304999999998, + "mapped_reconstruction + pdip_solve": 1.7463912, + "mapping_matrix + pdip_solve": 1.7048316000000003, + "pdip_solve + regularization_H": 0.7571771, + "inversion_other + pdip_solve + regularization_H": 0.44193940000000004, + "inversion_other + pdip_solve": 0.19358879999999998, + "inversion_other + regularization_H": 0.16271819999999987, + "inversion_other + mapping_matrix + mesh_construction + mesh_interpolation_weights + pdip_solve": 0.0616038, + "mapping_matrix + mesh_interpolation_weights + pdip_solve": 0.0598374, + "grids_and_structures + mass_profile_deflections + ray_trace_data_grid": 0.0308865, + "inversion_other + mesh_construction + mesh_dual_areas + mesh_interpolation_weights + pdip_solve + regularization_H": 0.0229409, + "grids_and_structures + mass_profile_deflections + pdip_solve + ray_trace_data_grid": 0.02206729999999999, + "chi_squared_evidence + pdip_solve": 0.021427400000000003, + "inversion_other + mesh_construction + mesh_dual_areas + mesh_interpolation_weights": 0.0214081, + "inversion_other + mesh_construction + mesh_interpolation_weights": 0.020777900000000005, + "border_relocator + pdip_solve": 0.018947400000000007, + "inversion_other + mapping_matrix + mesh_construction + mesh_interpolation_weights": 0.014419300000000001, + "pdip_solve + ray_trace_data_grid": 0.013171399999999998, + "mesh_construction + pdip_solve + regularization_H": 0.0110304, + "mesh_locate_walk + mesh_seed_argmin": 0.0096322, + "mesh_construction + mesh_seed_argmin + pdip_solve + regularization_H": 0.0095521, + "mesh_dual_areas + mesh_interpolation_weights": 0.009353700000000001, + "inversion_other + mapped_reconstruction + reconstruction_scatter": 0.0089473, + "inversion_other + mapped_reconstruction": 0.0088993, + "inversion_other + mapped_reconstruction + reconstruction_scatter + regularization_H": 0.008339599999999999, + "inversion_other + mesh_dual_areas + mesh_locate_walk": 0.008019299999999997, + "mesh_construction + mesh_dual_areas + mesh_interpolation_weights + pdip_solve + regularization_H": 0.0064928, + "inversion_other + pdip_solve + ray_trace_data_grid": 0.0046945, + "grids_and_structures + mass_profile_deflections + pdip_solve": 0.0044512, + "mapping_matrix + pdip_solve + regularization_H": 0.004067300000000001, + "inversion_other + mesh_locate_walk + mesh_seed_argmin": 0.003696, + "inversion_other + mesh_dual_areas + mesh_locate_walk + pdip_solve": 0.0034976, + "inversion_other + mesh_interpolation_weights": 0.0034400000000000003, + "inversion_other + mesh_construction + mesh_interpolation_weights + pdip_solve + regularization_H": 0.0033185000000000007, + "inversion_other + mesh_construction + regularization_H": 0.0027264, + "chi_squared_evidence + inversion_other": 0.0023584, + "inversion_other + mapping_matrix": 0.0021696000000000003 + }, + "example_kernels": { + "curvature_matrix_F + psf_convolution_mapping_matrix": [ + "loop_divide_gather_fusion" + ], + "curvature_reg_reduce_gather + inversion_other + mapped_reconstruction + pdip_solve + reconstruction_scatter + regularization_H": [ + "input_add_multiply_transpose_fusion" + ], + "pdip_solve + psf_convolution_mapping_matrix": [ + "loop_broadcast_fusion.7" + ], + "data_vector_D + pdip_solve": [ + "input_reduce_fusion.21", + "input_reduce_fusion.47" + ], + "mapped_reconstruction + pdip_solve": [ + "input_reduce_fusion.25" + ], + "mapping_matrix + pdip_solve": [ + "loop_broadcast_fusion.8", + "loop_divide_fusion" + ], + "pdip_solve + regularization_H": [ + "loop_broadcast_fusion", + "input_transpose_fusion.6" + ], + "inversion_other + pdip_solve + regularization_H": [ + "input_transpose_fusion.7", + "loop_log_fusion" + ], + "inversion_other + pdip_solve": [ + "input_reduce_fusion.23", + "input_reduce_fusion.24", + "input_transpose_fusion.3", + "input_reduce_fusion.29" + ], + "inversion_other + regularization_H": [ + "input_reduce_fusion.44", + "input_reduce_fusion.37", + "input_reduce_fusion.38", + "input_reduce_fusion.39" + ] + }, + "prorated_estimate_ms": { + "psf_convolution_mapping_matrix": 10.61672645, + "curvature_matrix_F": 8.6285023, + "pdip_solve": 6.680758236666668, + "mapped_reconstruction": 2.16638815, + "regularization_H": 1.907136385, + "inversion_other": 1.6625870766666666, + "reconstruction_scatter": 1.2887429000000001, + "curvature_reg_reduce_gather": 1.2836755666666668, + "data_vector_D": 0.9788652499999999, + "mapping_matrix": 0.890727751666667, + "mesh_interpolation_weights": 0.060331970000000006, + "mesh_construction": 0.04096294500000001, + "ray_trace_data_grid": 0.02396285833333333, + "mesh_dual_areas": 0.01869841833333333, + "grids_and_structures": 0.01729605833333333, + "mass_profile_deflections": 0.01729605833333333, + "chi_squared_evidence": 0.011892900000000001, + "mesh_locate_walk": 0.0095956, + "border_relocator": 0.009473700000000003, + "mesh_seed_argmin": 0.008436125 + }, + "prorated_note": "ESTIMATE ONLY \u2014 a mixed fusion's time split equally across the stages its constituents span. Never summed into the measured table, never reconciled." + }, + "other_sources_ms": { + "copy.138": 0.04782109999999985, + "copy.123": 0.03263710000000005, + "copy.141": 0.03252490000000003, + "copy.140": 0.032499600000000024, + "copy.142": 0.032099300000000025, + "copy.139": 0.02960969999999999, + "copy.121": 0.02258580000000002, + "copy.122": 0.022438500000000007, + "loop_broadcast_fusion.2": 0.0026240999999999994, + "copy.137": 0.0023616, + "copy.97": 0.0022976, + "copy.58": 0.0021792, + "loop_broadcast_fusion.5": 0.0014015999999999998 + }, + "device_span_ms": 983.0956613000001, + "device_busy_ms": 865.5984667999999, + "device_idle_ms": 117.4971945000002, + "largest_idle_gaps": [ + { + "gap_ms": 5.422875, + "after": "pure_callback.0", + "before": "pure_callback.0" + }, + { + "gap_ms": 5.148058, + "after": "pure_callback.0", + "before": "pure_callback.0" + }, + { + "gap_ms": 4.925337, + "after": "pure_callback.0", + "before": "pure_callback.0" + }, + { + "gap_ms": 4.920217, + "after": "pure_callback.0", + "before": "pure_callback.0" + }, + { + "gap_ms": 4.912537, + "after": "pure_callback.0", + "before": "pure_callback.0" + }, + { + "gap_ms": 4.893369, + "after": "pure_callback.0", + "before": "pure_callback.0" + }, + { + "gap_ms": 4.885785, + "after": "pure_callback.0", + "before": "pure_callback.0" + }, + { + "gap_ms": 4.885497, + "after": "pure_callback.0", + "before": "pure_callback.0" + } + ], + "kernel_ms": 864.5078620000169, + "sum_ms": 982.0050565000171, + "wall_ms": 983.1974248998449, + "host_outside_span_ms": 0.10176359984484407, + "reconciliation_pct": -0.12127456496840446, + "unjoined_ms": 0.0, + "unjoined_pct": 0.0, + "other_ms": 0.2628649999999998, + "other_pct": 0.0267357290959928, + "note": "Stage rows attribute the command-buffers-OFF program (see the module docstring): kernel times are the same, the launch overhead the CUDA graphs remove is not. sum_ms = kernel rows + device_idle_ms; the residual against wall_ms is host_outside_span_ms (dispatch before the first kernel, teardown after the last).", + "per_stage_ms_per_lane": { + "border_relocator": 0.00551709375, + "curvature_matrix_F": 4.14451453125, + "inversion_other": 0.8685733437500001, + "mapping_matrix": 0.00341803125, + "mesh_construction": 0.0005859999999999999, + "mesh_dual_areas": 0.000396, + "mesh_locate_walk": 0.05323243749999998, + "mesh_qhull_callback": 0.012388125000000005, + "mesh_seed_argmin": 0.08683443749999997, + "mixed_fusion": 2.26561653125, + "other": 0.016429062499999987, + "pdip_solve": 39.45120581250106, + "psf_convolution_mapping_matrix": 7.122855968749999, + "regularization_H": 0.000174 + }, + "per_lane_divisor": 16, + "host_callback": { + "pure_callback_span_ms": 84.32977940000004, + "qhull_ms": 73.77305450000001, + "callback_body_ms_note": "the OUTERMOST matching body event, not a sum: under the probe the body appears twice (the wrapper and the timed re-implementation it calls) and summing them would count the same work twice", + "events_by_name": { + "pure_callback.0": { + "count": 160, + "ms": 84.32977940000004 + }, + "$callback.py:815 _wrapped_callback": { + "count": 160, + "ms": 77.60940430000004 + }, + "$callback.py:224 _callback": { + "count": 160, + "ms": 77.25697470000003 + }, + "$callback.py:74 pure_callback_impl": { + "count": 160, + "ms": 77.11895030000001 + }, + "$callback.py:69 __call__": { + "count": 160, + "ms": 74.01667320000003 + }, + "$delaunay.py:162 ": { + "count": 160, + "ms": 73.90968079999999 + }, + "$host_callback_probe.py:225 wrapped": { + "count": 160, + "ms": 73.77305450000001 + }, + "$host_callback_probe.py:160 _timed_tri_only": { + "count": 160, + "ms": 73.65393510000004 + }, + "$callback.py:822 ": { + "count": 640, + "ms": 0.21493199999999957 + }, + "ThenExecuteCallback:GetEventForComputeStreamSyncPoint": { + "count": 10, + "ms": 0.031331700000000004 + }, + "$__init__.py:132 _xla_gc_callback": { + "count": 2, + "ms": 0.00041300000000000006 + } + }, + "note": "HOST milliseconds per traced BATCH (the whole invocation), aggregated by name because the events nest. Not a row of the device table: the device pays for them as the idle gaps largest_idle_gaps names." + }, + "host_callback_ms": 84.32977940000004 + }, + "hlo_census": { + "status": "excluded", + "reason": "The legacy census anchors PyAutoArray source line numbers that moved after the phase-1 run. No batched attribution is published from unsupported anchors; the device-event table and wall reconciliation remain valid." + }, + "trace_split": { + "expected_calls": 10, + "executions_per_invocation": 1, + "method": "per-call (first-instruction recurrence)", + "note": "DECIDED IN CODE: the scalar arm's trace is split by trace_calls * B, so every lane's execution is its own block and the per-stage median is taken over all of them. The vmap arm's is split by trace_calls, one block per batched execution, and per_stage_ms_per_lane divides those rows by B." + } + }, + "scalar": { + "arm": "scalar", + "program": "jax.jit(fn), called B times", + "stands_for": "Nautilus(use_jax_vmap=False, use_jax_jit=True). Plain use_jax_vmap=False is UNJITTED and is NOT this arm", + "hlo_source": "jax.jit(fn).lower(lane_trees[0]) \u2014 the same program phase 1 traced", + "batch_wall_ms": 623.1401064000238, + "wall_production_nesting_ms": 623.1401064000238, + "wall_aot_command_buffers_on_ms": 624.67713799997, + "wall_aot_command_buffers_off_ms": 629.2699801000708, + "command_buffer_delta_ms": 4.592842100100825, + "production_nesting_vs_aot_on_delta_ms": -1.5370315999462036, + "production_nesting_vs_aot_on_delta_pct": -0.24605216142010905, + "wall_per_lane_ms": 38.94625665000149, + "wall_per_lane_command_buffers_off_ms": 39.32937375625443, + "traced_batch_wall_ms": 648.9253239000391, + "untraced_batch_wall_ms": 630.6407185998978, + "traced_wall_per_lane_ms": 40.55783274375244, + "callback_count_per_call": 16.0, + "callback_count_per_lane": 1.0, + "callback_expectation": "1 per likelihood evaluation, B per batch", + "host_qhull_ms": 72.32723560045997, + "host_tables_ms": 1.8967355994391255, + "host_qhull_ms_per_lane": 4.520452225028748, + "host_tables_ms_per_lane": 0.11854597496494534, + "host_callback_probe": { + "calls": 160, + "qhull_ms_total": 723.2723560045997, + "tables_ms_total": 18.967355994391255, + "total_ms_total": 742.239711998991, + "qhull_ms_mean": 4.520452225028748, + "tables_ms_mean": 0.11854597496494534, + "total_ms_mean": 4.638998199993694, + "non_finite_calls": 0, + "n_points": [ + 1500 + ] + }, + "host_callback_records_first": [ + { + "n_points": 1500, + "qhull_ms": 4.733442001452204, + "tables_ms": 0.17900799866765738, + "total_ms": 4.912450000119861, + "finite": true + }, + { + "n_points": 1500, + "qhull_ms": 4.471472999284742, + "tables_ms": 0.11633800022536889, + "total_ms": 4.587810999510111, + "finite": true + }, + { + "n_points": 1500, + "qhull_ms": 4.518871999607654, + "tables_ms": 0.13704999946639873, + "total_ms": 4.655921999074053, + "finite": true + }, + { + "n_points": 1500, + "qhull_ms": 4.520321999734733, + "tables_ms": 0.1152199984062463, + "total_ms": 4.63554199814098, + "finite": true + } + ], + "device_idle_ms": 7.038046343749997, + "device_idle_ms_per_lane": 7.038046343749997, + "trace": { + "parser": "ProfileData.from_file(xplane) + as_text() + stack_frame_index(proto field 17)", + "stage_audit": { + "mixed_fusion": [ + { + "instruction": "loop_divide_gather_fusion", + "ms": 1.01618255, + "opcode": "fusion", + "shape": "(f64[15361,1,1,1500]{3,2,1,0}, f64[15361,1,1,1500]{3,2,1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:133", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:133 (curvature_matrix_via_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:93 (InversionImagingMapping.curvature_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:389 (AbstractInversion.curvature_reg_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "loop_broadcast_fusion.4", + "ms": 0.22685640624999995, + "opcode": "fusion", + "shape": "f64[1500,180,180]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "input_reduce_fusion.13", + "ms": 0.12212294375, + "opcode": "fusion", + "shape": "f64[92,1500]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/inversion_imaging_util.py:123", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/inversion_imaging_util.py:123 (data_vector_via_blurred_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:67 (InversionImagingMapping.data_vector)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:699 (AbstractInversion.reconstruction)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "input_reduce_fusion.17", + "ms": 0.11467717499999995, + "opcode": "fusion", + "shape": "f64[15361]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:163", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:163 (mapped_reconstructed_data_via_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:120 (InversionImagingMapping._mapped_reconstructed_data_dict_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:196 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "loop_broadcast_fusion.2", + "ms": 0.11074701249999995, + "opcode": "fusion", + "shape": "f64[15361,1500]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:342", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:342 (mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/abstract.py:283 (Mapper.mapping_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:91 (AbstractInversionImaging._mapping_matrix_for_convolution_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:137 (AbstractInversionImaging.operated_mapping_matrix_list)" + ] + }, + { + "instruction": "input_multiply_transpose_fusion", + "ms": 0.1094647, + "opcode": "fusion", + "shape": "(f64[1500,1500]{1,0}, f64[1500,1500]{1,0}, f64[1500,1500]{1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:237 (active_set_search)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:293 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:274 (_certified_positive_only_from)" + ] + } + ], + "border_relocator": [ + { + "instruction": "eigh.45", + "ms": 0.0747120687499999, + "opcode": "custom-call", + "shape": "(f64[2,2]{0,1}, f64[2]{0}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:245", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:245 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:454 (BorderRelocator.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:176 (AbstractMesh.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:214 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "custom-call.2", + "ms": 0.007940712500000002, + "opcode": "custom-call", + "shape": "(f64[2,2]{1,0}, s8[4194304]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:242", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:242 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:454 (BorderRelocator.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:176 (AbstractMesh.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:214 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "input_reduce_fusion.18", + "ms": 0.005587918750000001, + "opcode": "fusion", + "shape": "(f64[], f64[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:269", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:269 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:454 (BorderRelocator.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:176 (AbstractMesh.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:214 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "loop_add_fusion.7", + "ms": 0.0035423562500000007, + "opcode": "fusion", + "shape": "f64[15361]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:308", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:308 (relocated_grid_via_ellipse_border_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:423 (BorderRelocator.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:83 (AbstractMesh.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:208 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "loop_add_fusion.9", + "ms": 0.003390181250000005, + "opcode": "fusion", + "shape": "f64[1500]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:308", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:308 (relocated_grid_via_ellipse_border_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:458 (BorderRelocator.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:176 (AbstractMesh.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:214 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "input_concatenate_fusion.12", + "ms": 0.002420368749999997, + "opcode": "fusion", + "shape": "f64[392,2]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:238", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:238 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:454 (BorderRelocator.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:176 (AbstractMesh.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:214 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + } + ], + "mesh_construction": [ + { + "instruction": "input_concatenate_fusion.7", + "ms": 0.0020611750000000028, + "opcode": "fusion", + "shape": "f64[1500,2]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:820", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:820 (InterpolatorDelaunay.mesh_grid_xy)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:847 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + } + ], + "mesh_qhull_callback": [ + { + "instruction": "pure_callback.4", + "ms": 0.010633525000000033, + "opcode": "custom-call", + "shape": "(s32[3000,3]{1,0}, s32[3000,3]{1,0}, s32[1500]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:161", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:161 (_jax_delaunay_tables)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:405 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + } + ], + "other": [ + { + "instruction": "copy.106", + "ms": 0.04206421875000185, + "opcode": "copy", + "shape": "f64[1,1024,2]{2,1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "copy.70", + "ms": 0.016997462500000067, + "opcode": "copy", + "shape": "s32[21361]{0}", + "source": "", + "stack": [] + }, + { + "instruction": "copy.75", + "ms": 0.0019839874999999997, + "opcode": "copy", + "shape": "s64[1500]{0}", + "source": "", + "stack": [] + }, + { + "instruction": "copy.105", + "ms": 0.001800175, + "opcode": "copy", + "shape": "s32[]", + "source": "", + "stack": [] + }, + { + "instruction": "copy.104", + "ms": 0.0017587874999999999, + "opcode": "copy", + "shape": "s64[]", + "source": "", + "stack": [] + }, + { + "instruction": "copy.61", + "ms": 0.0016451812499999976, + "opcode": "copy", + "shape": "s32[]", + "source": "", + "stack": [] + } + ], + "mesh_seed_argmin": [ + { + "instruction": "input_reduce_fusion", + "ms": 0.14923728124999885, + "opcode": "fusion", + "shape": "(f64[1024]{0}, s64[1024]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:191", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:191 (_nearest_vertex_seed_from..argmin_chunk)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204 (_nearest_vertex_seed_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:351 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)" + ] + }, + { + "instruction": "loop_dynamic_update_slice_fusion", + "ms": 0.04132142499999959, + "opcode": "fusion", + "shape": "s32[21,1024]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204 (_nearest_vertex_seed_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:351 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "loop_add_fusion", + "ms": 0.0319596874999985, + "opcode": "fusion", + "shape": "s64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204 (_nearest_vertex_seed_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:351 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "loop_broadcast_fusion", + "ms": 0.001969968750000002, + "opcode": "fusion", + "shape": "s32[21,1024]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204 (_nearest_vertex_seed_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:351 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "pdip_solve": [ + { + "instruction": "cholesky.60", + "ms": 5.895535906249981, + "opcode": "custom-call", + "shape": "(f64[1500,1500]{0,1}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:252 (active_set_search..body_fun)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:262 (active_set_search)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:293 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)" + ] + }, + { + "instruction": "cholesky.80", + "ms": 3.7716603000000033, + "opcode": "custom-call", + "shape": "(f64[1500,1500]{0,1}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:106", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:106 (factorize_kkt)", + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:212 (pdip_pc_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:83 (solve_nnls)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:129 (_solve_nnls_primal_with..primal)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:164 (solve_nnls_primal_with_status)" + ] + }, + { + "instruction": "triangular-solve.1", + "ms": 1.0602555687500193, + "opcode": "custom-call", + "shape": "(f64[1500,1]{0,1}, s8[0]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:154", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:154 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:252 (active_set_search..body_fun)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:262 (active_set_search)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:293 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)" + ] + }, + { + "instruction": "triangular-solve", + "ms": 0.9150642125000006, + "opcode": "custom-call", + "shape": "(f64[1500,1]{0,1}, s8[0]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:154", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:154 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:252 (active_set_search..body_fun)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:262 (active_set_search)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:293 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)" + ] + }, + { + "instruction": "cholesky.110", + "ms": 0.8895390812499994, + "opcode": "custom-call", + "shape": "(f64[1500,1500]{0,1}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:297 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:274 (_certified_positive_only_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:496 (reconstruction_positive_only_from)" + ] + }, + { + "instruction": "cholesky.100", + "ms": 0.8622849687500019, + "opcode": "custom-call", + "shape": "(f64[1500,1500]{0,1}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:237 (active_set_search)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:293 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:274 (_certified_positive_only_from)" + ] + } + ], + "regularization_H": [ + { + "instruction": "input_scatter_fusion.10", + "ms": 0.0020717625, + "opcode": "fusion", + "shape": "f64[1500,1500]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:615", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:615 (pixel_splitted_regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt_split.py:137 (AdaptSplit.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:332 (AbstractInversion.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "input_concatenate_fusion.9", + "ms": 0.0018711750000000018, + "opcode": "fusion", + "shape": "pred[3]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:91", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:91 (split_points_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:410 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + }, + { + "instruction": "input_concatenate_fusion.8", + "ms": 0.001868987500000002, + "opcode": "fusion", + "shape": "pred[3]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:93", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:93 (split_points_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:410 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + }, + { + "instruction": "input_concatenate_fusion.10", + "ms": 0.001855962500000001, + "opcode": "fusion", + "shape": "pred[3]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:90", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:90 (split_points_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:410 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + }, + { + "instruction": "input_concatenate_fusion", + "ms": 0.0017665874999999987, + "opcode": "fusion", + "shape": "s32[1500,2]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:615", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:615 (pixel_splitted_regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt_split.py:137 (AdaptSplit.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:332 (AbstractInversion.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "input_concatenate_fusion.11", + "ms": 0.0015551812499999987, + "opcode": "fusion", + "shape": "pred[3]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:88", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:88 (split_points_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:410 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + } + ], + "mesh_locate_walk": [ + { + "instruction": "loop_reduce_fusion", + "ms": 0.02537100000000025, + "opcode": "fusion", + "shape": "(f64[21361]{0}, s64[21361]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:264", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:264 (_walk_from_seed..walk_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:292 (_walk_from_seed..body)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:264 (_walk_from_seed..walk_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:292 (_walk_from_seed..body)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)" + ] + }, + { + "instruction": "input_reduce_fusion.1", + "ms": 0.024173693749999777, + "opcode": "fusion", + "shape": "pred[196]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:288", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:288 (_walk_from_seed..cond)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:353 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)" + ] + }, + { + "instruction": "loop_or_select_fusion", + "ms": 0.02259331249999992, + "opcode": "fusion", + "shape": "(s32[21361]{0}, pred[21361]{0}, pred[21361]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:270", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:270 (_walk_from_seed..walk_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:292 (_walk_from_seed..body)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:353 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)" + ] + }, + { + "instruction": "loop_select_fusion", + "ms": 0.02015188124999996, + "opcode": "fusion", + "shape": "s32[21361]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:242", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:242 (_walk_from_seed..weights_of)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:262 (_walk_from_seed..walk_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:292 (_walk_from_seed..body)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:353 (pix_indexes_delaunay_walk_from)" + ] + }, + { + "instruction": "input_reduce_fusion.2", + "ms": 0.016261350000000098, + "opcode": "fusion", + "shape": "pred[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:288", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:288 (_walk_from_seed..cond)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:353 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)" + ] + }, + { + "instruction": "while.34", + "ms": 0.014478906249999883, + "opcode": "while", + "shape": "(s32[], s32[21361]{0}, pred[21361]{0}, pred[21361]{0}, s32[3000,3]{1,0}, /*index=5*/f64[1500,2]{1,0}, f64[21361,2]{1,0}, s32[3000,3]{1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:353 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "psf_convolution_mapping_matrix": [ + { + "instruction": "input_scatter_fusion", + "ms": 1.9813170499999992, + "opcode": "fusion", + "shape": "f64[1500,180,180]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "fft.19.0", + "ms": 1.7578670187499987, + "opcode": "fft", + "shape": "f64[1500,180,180]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "fft.15.0", + "ms": 1.3664876625000009, + "opcode": "fft", + "shape": "c128[1500,180,91]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "fft.17.0", + "ms": 0.9794295187499994, + "opcode": "fft", + "shape": "c128[1500,91,180]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "input_transpose_fusion.4", + "ms": 0.5138982312500002, + "opcode": "fusion", + "shape": "c128[1500,91,180]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "wrapped_transpose", + "ms": 0.49981874375000007, + "opcode": "fusion", + "shape": "c128[1500,180,91]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + } + ], + "inversion_other": [ + { + "instruction": "cholesky.120", + "ms": 0.893844968750001, + "opcode": "custom-call", + "shape": "(f64[1500,1500]{0,1}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986 (AbstractInversion._log_det_symmetric_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:1078 (AbstractInversion.log_det_curvature_reg_matrix_term)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:347 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/model/analysis.py:135 (AnalysisImaging.log_likelihood_function)" + ] + }, + { + "instruction": "cholesky.130", + "ms": 0.8885384437500004, + "opcode": "custom-call", + "shape": "(f64[1500,1500]{0,1}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986 (AbstractInversion._log_det_symmetric_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:1157 (AbstractInversion.log_det_regularization_matrix_term)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:348 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/model/analysis.py:135 (AnalysisImaging.log_likelihood_function)" + ] + }, + { + "instruction": "loop_reduce_window_fusion", + "ms": 0.002868962499999998, + "opcode": "fusion", + "shape": "s64[6,16]{1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "loop_reduce_window_fusion.1", + "ms": 0.0027941812499999996, + "opcode": "fusion", + "shape": "s64[94,16]{1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "loop_broadcast_convert_fusion", + "ms": 0.002191568749999996, + "opcode": "fusion", + "shape": "(s32[1500]{0}, s64[1500]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:527", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:527 (AbstractInversion.zeroed_ids_to_keep)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:567 (AbstractInversion.solve_ids_to_keep)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:684 (AbstractInversion.reconstruction)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "input_scatter_fusion.5", + "ms": 0.0019479874999999986, + "opcode": "fusion", + "shape": "s64[1500]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:527", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:527 (AbstractInversion.zeroed_ids_to_keep)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:567 (AbstractInversion.solve_ids_to_keep)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:684 (AbstractInversion.reconstruction)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "mapping_matrix": [ + { + "instruction": "input_reduce_fusion.31", + "ms": 0.00288934374999999, + "opcode": "fusion", + "shape": "f64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:93", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:93 (adaptive_pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/abstract.py:507 (Mapper.pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt.py:339 (Adapt.regularization_weights_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt_split.py:120 (AdaptSplit.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)" + ] + } + ], + "curvature_matrix_F": [ + { + "instruction": "cublas-lt-matmul.2", + "ms": 4.248923318749999, + "opcode": "custom-call", + "shape": "(f64[1500,1500]{1,0}, s8[4194304]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:134", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:134 (curvature_matrix_via_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:93 (InversionImagingMapping.curvature_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:389 (AbstractInversion.curvature_reg_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "chi_squared_evidence": [ + { + "instruction": "loop_multiply_fusion.2", + "ms": 0.002985412499999996, + "opcode": "fusion", + "shape": "f64[15361]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/abstract_ndarray.py:300", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/abstract_ndarray.py:300 (AbstractNDArray.__pow__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/abstract_ndarray.py:60 (unwrap_array..wrapper)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/abstract_ndarray.py:35 (to_new_array..wrapper)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_util.py:78 (chi_squared_map_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:78 (AbstractFit.chi_squared_map)" + ] + } + ] + }, + "stage_audit_note": "The HLO instructions that contributed most of each stage's milliseconds, with their full source stack. A stage row is only as good as the rules that built it; this is how a reader checks a row against the HLO instead of trusting it.", + "untraced_wall_ms": 39.41504491249361, + "reconciliation_vs_untraced_pct": -23.025230819582127, + "wall_basis": "wall_ms is the TRACED run's wall, the run these kernel durations came from. untraced_wall_ms is the same executable without the profiler; the difference is the profiler's overhead and belongs in neither the stages nor the idle row.", + "calls": 160, + "call_split": "per-call (first-instruction recurrence)", + "call_blocks": 160, + "events": 98790, + "streams": [ + "Stream #14(Memset,MemcpyD2H,Compute,MemcpyH2D,MemcpyD2D)" + ], + "per_stage_ms": { + "border_relocator": { + "median_ms": 0.101054, + "min_ms": 0.10041200000000002, + "max_ms": 0.10230200000000002 + }, + "chi_squared_evidence": { + "median_ms": 0.002944, + "min_ms": 0.002848, + "max_ms": 0.00336 + }, + "curvature_matrix_F": { + "median_ms": 4.2460915, + "min_ms": 4.231661, + "max_ms": 4.314042 + }, + "inversion_other": { + "median_ms": 1.794964, + "min_ms": 1.778482, + "max_ms": 1.80594 + }, + "mapping_matrix": { + "median_ms": 0.00288, + "min_ms": 0.002879, + "max_ms": 0.002912 + }, + "memset": { + "median_ms": 0.021343999999999995, + "min_ms": 0.009951, + "max_ms": 0.10031899999999999 + }, + "mesh_construction": { + "median_ms": 0.002048, + "min_ms": 0.002047, + "max_ms": 0.00208 + }, + "mesh_locate_walk": { + "median_ms": 0.14809450000000002, + "min_ms": 0.13039800000000001, + "max_ms": 0.18339200000000003 + }, + "mesh_qhull_callback": { + "median_ms": 0.010592, + "min_ms": 0.010495, + "max_ms": 0.011072000000000002 + }, + "mesh_seed_argmin": { + "median_ms": 0.22449350000000015, + "min_ms": 0.22418500000000013, + "max_ms": 0.2248270000000002 + }, + "mixed_fusion": { + "median_ms": 1.9843225000000002, + "min_ms": 1.9764949999999994, + "max_ms": 1.9972369999999995 + }, + "other": { + "median_ms": 0.06620649999999999, + "min_ms": 0.063579, + "max_ms": 0.07391900000000001 + }, + "pdip_solve": { + "median_ms": 7.5871984999999995, + "min_ms": 2.417604, + "max_ms": 50.35396399999999 + }, + "psf_convolution_mapping_matrix": { + "median_ms": 7.0983845, + "min_ms": 7.082967999999999, + "max_ms": 7.112631 + }, + "regularization_H": { + "median_ms": 0.010976, + "min_ms": 0.010879999999999999, + "max_ms": 0.011231999999999999 + } + }, + "stage_order": [ + "border_relocator", + "mesh_qhull_callback", + "mesh_seed_argmin", + "mesh_locate_walk", + "mesh_construction", + "mapping_matrix", + "psf_convolution_mapping_matrix", + "curvature_matrix_F", + "regularization_H", + "pdip_solve", + "chi_squared_evidence", + "inversion_other", + "mixed_fusion", + "other", + "memset" + ], + "mixed_fusion": { + "ms": 1.9843225000000002, + "constituent_stage_sets": { + "curvature_matrix_F + psf_convolution_mapping_matrix": 1.01618255, + "pdip_solve + psf_convolution_mapping_matrix": 0.22685640624999995, + "data_vector_D + pdip_solve": 0.12582651250000004, + "mapped_reconstruction + pdip_solve": 0.11467717499999995, + "mapping_matrix + pdip_solve": 0.11311618749999988, + "curvature_reg_reduce_gather + inversion_other + mapped_reconstruction + pdip_solve + reconstruction_scatter": 0.1094647, + "pdip_solve + regularization_H": 0.04574368125000003, + "inversion_other + pdip_solve + regularization_H": 0.024028306250000003, + "inversion_other + pdip_solve": 0.023009943750000022, + "inversion_other + mapping_matrix + mesh_construction + mesh_dual_areas + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin + pdip_solve": 0.021254193749999994, + "inversion_other + mesh_construction + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin + pdip_solve + regularization_H": 0.018688974999999986, + "inversion_other + mesh_construction + mesh_dual_areas + mesh_interpolation_weights + pdip_solve + regularization_H": 0.014765443749999992, + "pdip_solve + ray_trace_data_grid": 0.013713206249999926, + "border_relocator + pdip_solve": 0.013252043749999977, + "inversion_other + mapping_matrix + mesh_construction + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin": 0.011749874999999996, + "grids_and_structures + mass_profile_deflections + pdip_solve": 0.010185662500000007, + "grids_and_structures + mass_profile_deflections + pdip_solve + ray_trace_data_grid": 0.009021918750000005, + "chi_squared_evidence + pdip_solve": 0.007643331249999998, + "inversion_other + mesh_construction + mesh_seed_argmin + pdip_solve + regularization_H": 0.007074362499999999, + "inversion_other + mesh_dual_areas + mesh_locate_walk": 0.0067975187499999664, + "inversion_other + mesh_construction + pdip_solve + regularization_H": 0.006546906249999998, + "grids_and_structures + mass_profile_deflections + ray_trace_data_grid": 0.005509749999999998, + "inversion_other + pdip_solve + ray_trace_data_grid": 0.00529954999999999, + "inversion_other + regularization_H": 0.005251937499999984, + "inversion_other + mapped_reconstruction + pdip_solve + reconstruction_scatter": 0.0048135625, + "inversion_other + mapped_reconstruction": 0.0037877499999999973, + "mapping_matrix + pdip_solve + regularization_H": 0.0034847687500000027, + "inversion_other + mesh_construction + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin": 0.0031391749999999993, + "inversion_other + mesh_construction + mesh_dual_areas + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin": 0.002967537499999995, + "inversion_other + mesh_construction + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin + regularization_H": 0.0027021937500000016, + "inversion_other + mesh_dual_areas + mesh_locate_walk + pdip_solve": 0.0026039500000000037, + "inversion_other + mesh_locate_walk + mesh_seed_argmin": 0.0025089750000000014, + "inversion_other + mesh_interpolation_weights": 0.0021447562500000027, + "chi_squared_evidence + inversion_other": 0.0018979937500000006 + }, + "example_kernels": { + "curvature_matrix_F + psf_convolution_mapping_matrix": [ + "loop_divide_gather_fusion" + ], + "pdip_solve + psf_convolution_mapping_matrix": [ + "loop_broadcast_fusion.4" + ], + "data_vector_D + pdip_solve": [ + "input_reduce_fusion.13", + "input_reduce_fusion.29" + ], + "mapped_reconstruction + pdip_solve": [ + "input_reduce_fusion.17" + ], + "mapping_matrix + pdip_solve": [ + "loop_broadcast_fusion.2", + "loop_divide_fusion" + ], + "curvature_reg_reduce_gather + inversion_other + mapped_reconstruction + pdip_solve + reconstruction_scatter": [ + "input_multiply_transpose_fusion" + ], + "pdip_solve + regularization_H": [ + "loop_select_fusion.5", + "input_transpose_fusion.5" + ], + "inversion_other + pdip_solve + regularization_H": [ + "input_transpose_fusion.6" + ], + "inversion_other + pdip_solve": [ + "input_reduce_fusion.15", + "loop_log_fusion", + "input_reduce_fusion.16", + "input_reduce_fusion.20" + ], + "inversion_other + mapping_matrix + mesh_construction + mesh_dual_areas + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin + pdip_solve": [ + "input_scatter_fusion.6", + "input_scatter_fusion.3" + ] + }, + "prorated_estimate_ms": { + "psf_convolution_mapping_matrix": 0.621519478125, + "curvature_matrix_F": 0.508091275, + "pdip_solve": 0.39309393820684513, + "mapped_reconstruction": 0.08232879312499998, + "inversion_other": 0.06904186226934524, + "data_vector_D": 0.06291325625000002, + "mapping_matrix": 0.06233477005208327, + "regularization_H": 0.04330155992559524, + "reconstruction_scatter": 0.023096330625, + "curvature_reg_reduce_gather": 0.02189294, + "mesh_construction": 0.014370236852678566, + "ray_trace_data_grid": 0.01271518281249996, + "mesh_locate_walk": 0.012610882581845225, + "mesh_interpolation_weights": 0.012391015915178568, + "mesh_seed_argmin": 0.011108927998511903, + "mesh_dual_areas": 0.008529098177083319, + "grids_and_structures": 0.007487283854166669, + "mass_profile_deflections": 0.007487283854166669, + "border_relocator": 0.006626021874999988, + "chi_squared_evidence": 0.004770662499999999 + }, + "prorated_note": "ESTIMATE ONLY \u2014 a mixed fusion's time split equally across the stages its constituents span. Never summed into the measured table, never reconciled." + }, + "other_sources_ms": { + "copy.106": 0.04206421875000185, + "copy.70": 0.016997462500000067, + "copy.75": 0.0019839874999999997, + "copy.105": 0.001800175, + "copy.104": 0.0017587874999999999, + "copy.61": 0.0016451812499999976, + "copy.103": 0.0004564000000000001, + "copy.40": 0.00038679375000000017 + }, + "device_span_ms": 40.55124409375, + "device_busy_ms": 33.51319775, + "device_idle_ms": 7.038046343749997, + "largest_idle_gaps": [ + { + "gap_ms": 5.471902, + "after": "pure_callback.4", + "before": "pure_callback.4" + }, + { + "gap_ms": 0.034079, + "after": "pure_callback.4", + "before": "copy.105" + }, + { + "gap_ms": 0.034079, + "after": "copy.70", + "before": "input_reduce_fusion.1" + }, + { + "gap_ms": 0.031167, + "after": "loop_add_fusion", + "before": "copy.106" + }, + { + "gap_ms": 0.029344, + "after": "loop_add_fusion.8", + "before": "input_reduce_fusion.14" + }, + { + "gap_ms": 0.025887, + "after": "input_concatenate_fusion.7", + "before": "pure_callback.4" + }, + { + "gap_ms": 0.020896, + "after": "while.40", + "before": "input_reduce_select_fusion" + }, + { + "gap_ms": 0.020319, + "after": "eigh.45", + "before": "eigh.45" + } + ], + "kernel_ms": 23.3015935, + "sum_ms": 30.339639843749996, + "wall_ms": 40.55783274375244, + "host_outside_span_ms": 0.006588650002441909, + "reconciliation_pct": -25.19412949050258, + "unjoined_ms": 0.0, + "unjoined_pct": 0.0, + "other_ms": 0.06620649999999999, + "other_pct": 0.16323973822343474, + "note": "Stage rows attribute the command-buffers-OFF program (see the module docstring): kernel times are the same, the launch overhead the CUDA graphs remove is not. sum_ms = kernel rows + device_idle_ms; the residual against wall_ms is host_outside_span_ms (dispatch before the first kernel, teardown after the last).", + "per_stage_ms_per_lane": { + "border_relocator": 0.101054, + "chi_squared_evidence": 0.002944, + "curvature_matrix_F": 4.2460915, + "inversion_other": 1.794964, + "mapping_matrix": 0.00288, + "memset": 0.021343999999999995, + "mesh_construction": 0.002048, + "mesh_locate_walk": 0.14809450000000002, + "mesh_qhull_callback": 0.010592, + "mesh_seed_argmin": 0.22449350000000015, + "mixed_fusion": 1.9843225000000002, + "other": 0.06620649999999999, + "pdip_solve": 7.5871984999999995, + "psf_convolution_mapping_matrix": 7.0983845, + "regularization_H": 0.010976 + }, + "per_lane_divisor": 1, + "host_callback": { + "pure_callback_span_ms": 79.86106850000004, + "qhull_ms": 74.37435889999995, + "callback_body_ms_note": "the OUTERMOST matching body event, not a sum: under the probe the body appears twice (the wrapper and the timed re-implementation it calls) and summing them would count the same work twice", + "events_by_name": { + "pure_callback.4": { + "count": 160, + "ms": 79.86106850000004 + }, + "$callback.py:815 _wrapped_callback": { + "count": 160, + "ms": 78.47551830000002 + }, + "$callback.py:224 _callback": { + "count": 160, + "ms": 78.10033139999999 + }, + "$callback.py:74 pure_callback_impl": { + "count": 160, + "ms": 77.9551307 + }, + "$callback.py:69 __call__": { + "count": 160, + "ms": 74.62516729999999 + }, + "$delaunay.py:162 ": { + "count": 160, + "ms": 74.51630229999998 + }, + "$host_callback_probe.py:225 wrapped": { + "count": 160, + "ms": 74.37435889999995 + }, + "$host_callback_probe.py:160 _timed_tri_only": { + "count": 160, + "ms": 74.2428192 + }, + "ThenExecuteCallback:GetEventForComputeStreamSyncPoint": { + "count": 160, + "ms": 0.30488480000000007 + }, + "$callback.py:822 ": { + "count": 640, + "ms": 0.22714369999999948 + }, + "$__init__.py:132 _xla_gc_callback": { + "count": 2, + "ms": 0.00035299999999999996 + } + }, + "note": "HOST milliseconds per traced BATCH (the whole invocation), aggregated by name because the events nest. Not a row of the device table: the device pays for them as the idle gaps largest_idle_gaps names." + }, + "host_callback_ms": 79.86106850000004 + }, + "hlo_census": { + "status": "excluded", + "reason": "The legacy census anchors PyAutoArray source line numbers that moved after the phase-1 run. No batched attribution is published from unsupported anchors; the device-event table and wall reconciliation remain valid." + }, + "trace_split": { + "expected_calls": 160, + "executions_per_invocation": 16, + "method": "per-call (first-instruction recurrence)", + "note": "DECIDED IN CODE: the scalar arm's trace is split by trace_calls * B, so every lane's execution is its own block and the per-stage median is taken over all of them. The vmap arm's is split by trace_calls, one block per batched execution, and per_stage_ms_per_lane divides those rows by B." + } + } + }, + "certification_report": { + "source": "vmap arm, library solve observed through its stats= out-dict (PyAutoArray #566) and jax.debug.callback(..., ordered=True); ordered because the unordered batching rule returns the lanes permuted. Untimed, separately compiled; max rel diff of its log likelihoods vs the timed arm's: 4.523e-06", + "rows": 16, + "pdip_iter": "NOT AVAILABLE per lane without changing library numerics. The fallback branch calls the library's own reconstruction_positive_only_from, which returns the solution alone \u2014 jax_nnls.solve_nnls' iteration count is discarded inside the library's custom_vjp primal. The PDIP while_loop's cost is in the pdip_solve stage row of each arm's device table instead, which is a max-over-lanes quantity under vmap because every lane runs the same fixed kernel sequence.", + "passes_semantics": "library `passes`: restricted active-set passes run (jax_active_set.solve_certified)" + }, + "lane_construction": { + "draws_sha256": "0d36cfdd54138e3d4343da6cff62621f6145bc8ee8d317d15fbcea328cacd342", + "lane_rows": [ + 300, + 301, + 302, + 303, + 304, + 305, + 306, + 307, + 308, + 309, + 310, + 311, + 312, + 313, + 314, + 315 + ], + "calls": [ + 15 + ], + "stage": "pix1", + "regularization_range": { + "galaxies.source.pixelization.regularization.inner_coefficient": { + "min": 8.610204122811597e-06, + "max": 609.7498208301598 + }, + "galaxies.source.pixelization.regularization.outer_coefficient": { + "min": 3.4330906156470037e-06, + "max": 159.11676392313697 + }, + "galaxies.source.pixelization.regularization.signal_scale": { + "min": 0.12452271846719754, + "max": 0.9404155018121758 + } + }, + "phases": [ + "exploration" + ], + "window_rule": "nautilus_batches.timed_window: consecutive captured calls, in call order, from the FIRST call that is not a prior batch, concatenated and truncated to B; at B == n_batch exactly one real Nautilus batch. Falls back to the latest B lanes if the post-prior lanes run out; never repeats a lane.", + "note": "Lane k is captured lane lane_rows[k]: the mass AND shear of a real Nautilus proposal (nautilus_batch_capture.py), lens light fixed at S3, the S3 light-subtracted dataset shared by every lane. `offsets` in the lane table are the mass offsets from the fiducial; the shear is in the capture file." + }, + "captured": { + "batches_path": "/mnt/ral/jnightin/autolens_profiling_wt/certified-solver-phase-c1-lane-rate/results/breakdown/imaging/nautilus_batches_delaunay_pix1.npz", + "batches_sha256": "e71a5e23026b342d1ff4359b8fb914a87980d8aea0060659d2334dcfa3215c00", + "schema_version": 2, + "n_calls": 932, + "n_lanes": 18640, + "call_sizes_seen": [ + 20 + ], + "calls_by_phase": { + "prior": 15, + "exploration": 917 + }, + "parameter_paths": [ + "galaxies.source.pixelization.regularization.inner_coefficient", + "galaxies.source.pixelization.regularization.outer_coefficient", + "galaxies.source.pixelization.regularization.signal_scale", + "galaxies.lens.mass.centre.centre_0", + "galaxies.lens.mass.centre.centre_1", + "galaxies.lens.mass.einstein_radius", + "galaxies.lens.mass.ell_comps.ell_comps_0", + "galaxies.lens.mass.ell_comps.ell_comps_1", + "galaxies.lens.shear.gamma_1", + "galaxies.lens.shear.gamma_2" + ], + "stage": "pix1", + "regularization": { + "class": "AdaptSplit", + "free": true, + "priors": { + "inner_coefficient": [ + "LogUniform", + 1e-06, + 1000000.0 + ], + "outer_coefficient": [ + "LogUniform", + 1e-06, + 1000000.0 + ], + "signal_scale": [ + "Uniform", + 0.0, + 1.0 + ] + }, + "priors_source": "PyAutoGalaxy packaged config/priors/regularization (adapt_split.yaml / constant.yaml); adapt_split.yaml is identical to euclid_strong_lens_modeling_pipeline/config/priors/regularization/adapt_split.yaml" + }, + "nautilus": { + "departures_from_production": [ + "mass/shear priors are the phase-B cell's Gaussians, not chained from source_lp", + "no positions likelihood", + "the cell's mesh (Hilbert 1500, weight_power 1) in both stages; source_pix_2 redraws a 500-vertex Hilbert grid at weight_power 3.5", + "seeded (production passes no seed)", + "quick updates disabled (iterations_per_quick_update=1e12; render-only)", + "NullPaths: no output directory, so no checkpoint and one Sampler.run call", + "post-fit perform_update skipped (samples / latent variables never built)" + ], + "n_batch": 20, + "n_like_max": 40000, + "n_live": 150, + "number_of_cores": 1, + "production_reference": "euclid_strong_lens_modeling_pipeline/scripts/full_model.py source_pix_1 (n_live=150) / source_pix_2 (n_live=75): af.Nautilus(n_batch=20, **SettingsSearch.search_dict) with use_jax_vmap=True and number_of_cores=1 (SettingsSearch defaults)", + "production_stage": "source_pix_1", + "seed": 1, + "stage": "pix1", + "use_jax_vmap": true, + "version": "1.0.5" + }, + "capture_fit_status": "sampling complete (n_like_max or convergence); post-fit result skipped", + "capture_library_revisions": { + "PyAutoArray": { + "head": "7fa8d2714f7da43fec2b23c31bff580764831670", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoArray" + }, + "PyAutoFit": { + "head": "a736840127be7a3c21e15a5c945e94d8f1082983", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoFit" + }, + "PyAutoGalaxy": { + "head": "70a61e26cd715cefe7012a38285698091246a8a4", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy" + }, + "PyAutoLens": { + "head": "86054bbc19baa2f710a12e04a94fa27ab37cc354", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoLens" + }, + "PyAutoNerves": { + "head": "1fa613aa8d89a79613009fb66f5b4e2d21deb57a", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoNerves" + } + }, + "fingerprint_check": { + "fields": [ + "mesh", + "source_pixels", + "dataset_sha256", + "regularization_class", + "regularization_s0_fiducial", + "border_relocator", + "use_mixed_precision", + "log_evidence_s3_library" + ], + "not_identity": "the regularization coefficients: free per lane since the capture frees them", + "log_evidence_s3_library_rel_diff": 0.0, + "passed": true + }, + "timed_window_vs_capture_pdip": { + "reference": "the capture's own figure of merit (library PDIP, Fitness.call_wrap jax.jit(jax.vmap(call)) over parameter vectors) for the same lanes", + "compared_against": "this cell's jit(vmap) library-PDIP reference", + "n_compared": 16, + "max_rel_diff": 2.981920799591605e-06, + "max_abs_diff_nats": 0.528155098494608, + "gated": false, + "note": "RECORDED, NOT GATED: proves the lane trees rebuilt here are the models the sampler evaluated (a wrong parameter mapping shows up as nats, not 1e-10)." + } + }, + "matched": { + "vmap_wall_per_lane_ms": 60.196023100002094, + "scalar_wall_per_lane_ms": 38.94625665000149, + "speedup_vmap_over_scalar": 0.6469905260236392, + "note": "Both walls are the PRODUCTION nesting of their arm, measured in one process on the same B lanes with the SAME library Settings (no injection). A speedup below 1 means the batch is slower per lane than B sequential jitted calls." + }, + "solver_source": "library", + "solver": "certified", + "certified_fallback": "pdip", + "certified_pass_budget": 16, + "certified_pass_budget_basis": "config default (Settings().certified_pass_budget)", + "certified_tau_rel": 1e-09, + "solver_used": "certified", + "solver_check": { + "solver_used": "certified", + "solver_used_source": "AbstractInversion.positive_only_solver_used on the fiducial S3 inversion, built eagerly on the JAX backend (AnalysisImaging(use_jax=True).fit_from) with the arms' Settings", + "reference_solver_used": "pdip", + "traced_solver_kwargs_jax": [ + "certified" + ], + "observed_calls_jax": 1, + "report_rows": 16, + "report_vs_timed_arm_max_rel_diff": 4.52299316571609e-06 + }, + "lanes_certified": [ + true, + false, + true, + true, + true, + true, + true, + true, + true, + true, + true, + false, + true, + true, + false, + false + ], + "lanes_passes": [ + 10, + 16, + 0, + 0, + 10, + 4, + 0, + 1, + 4, + 0, + 2, + 16, + 9, + 2, + 16, + 16 + ], + "uncertified_lanes": 4, + "per_lane_certification_note": "certified / passes come from the library's own solve through its stats= out-dict (PyAutoArray #566): passes is the number of restricted active-set passes the library ran (0 when the unconstrained solve was already non-negative), certified is its KKT certificate. With certified_fallback=pdip a False lane returned the PDIP solution; with none it returned the last uncertified iterate. null for a library-PDIP row (no certificate).", + "gate": { + "pre_registered": true, + "gated": [ + "per lane: jit(vmap) arm vs jit(vmap) library PDIP <= lane_rtol relative", + "per lane: scalar jit arm vs scalar jit library PDIP <= lane_rtol relative" + ], + "recorded_not_gated": [ + "per lane: jit(vmap) arm vs scalar jit arm (rel_diff, abs_diff_nats)", + "per lane: jit(vmap) library PDIP vs scalar jit library PDIP", + "uncertified_lanes (certified_fallback=none rows)" + ], + "lanes_failed": 5, + "passed": false, + "policy_eligible": false, + "note": "Pre-registered before submission (module docstring; submit header). Phase 3 (results/notes/hst_gpu_residue_phase3_psf_2026_09.md) placed phase 2's ~2.5e-9 certified-vs-PDIP residual BETWEEN the jit(vmap) and scalar-jit compositions, not in the solver \u2014 so each arm is gated against the library-PDIP reference of its OWN composition, and the cross-composition difference is recorded with its nats. A certified_fallback=none row is policy-eligible only if every lane certifies AND passes the gate. Timing is never gated." + }, + "library_revisions": { + "PyAutoArray": { + "head": "3de624b5b91a4efa130dc3cb0a3a0f06f85025a3", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoArray", + "module_file": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/__init__.py" + }, + "PyAutoFit": { + "head": "dd9fbe0aab60c4a57702b1444ca031b317c91331", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoFit", + "module_file": "/mnt/ral/jnightin/PyAuto/PyAutoFit/autofit/__init__.py" + }, + "PyAutoGalaxy": { + "head": "70a61e26cd715cefe7012a38285698091246a8a4", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy", + "module_file": "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/__init__.py" + }, + "PyAutoLens": { + "head": "86054bbc19baa2f710a12e04a94fa27ab37cc354", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoLens", + "module_file": "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/__init__.py" + }, + "autoarray_file": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/__init__.py" + } + }, + "headline_arm_note": "`trace`, `hlo_census`, `command_buffers` and `trace_timing` above describe the scalar arm \u2014 the program phase 1 traced. Both arms' full blocks, the lane table and the matched comparison are under `vmap`." +} \ No newline at end of file diff --git a/results/breakdown/imaging/fixed_light_trace_delaunay_jitvmap16_captured_pix1_libcertified_fbon_b16_hpc_a100_fp64_fixed_light_trace.png b/results/breakdown/imaging/fixed_light_trace_delaunay_jitvmap16_captured_pix1_libcertified_fbon_b16_hpc_a100_fp64_fixed_light_trace.png new file mode 100644 index 0000000000000000000000000000000000000000..2757d7e239d4bbc85cc9fbfdf402e42521ca72d5 GIT binary patch literal 149475 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
  • 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 LS3j3^P6.wrapper)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/abstract_ndarray.py:35 (to_new_array..wrapper)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_util.py:78 (chi_squared_map_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:78 (AbstractFit.chi_squared_map)" + ] + } + ], + "psf_convolution_mapping_matrix": [ + { + "instruction": "input_scatter_fusion", + "ms": 1.9838513812500007, + "opcode": "fusion", + "shape": "f64[1500,180,180]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "fft.19.0", + "ms": 1.76107434375, + "opcode": "fft", + "shape": "f64[1500,180,180]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "fft.15.0", + "ms": 1.3677336124999995, + "opcode": "fft", + "shape": "c128[1500,180,91]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "fft.17.0", + "ms": 0.9792066249999994, + "opcode": "fft", + "shape": "c128[1500,91,180]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "input_transpose_fusion.1", + "ms": 0.5137675937500001, + "opcode": "fusion", + "shape": "c128[1500,91,180]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "wrapped_transpose", + "ms": 0.4998541, + "opcode": "fusion", + "shape": "c128[1500,180,91]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + } + ], + "mapping_matrix": [ + { + "instruction": "loop_broadcast_fusion.2", + "ms": 0.11097046250000002, + "opcode": "fusion", + "shape": "f64[15361,1500]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:342", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:342 (mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/abstract.py:283 (Mapper.mapping_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:91 (AbstractInversionImaging._mapping_matrix_for_convolution_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:137 (AbstractInversionImaging.operated_mapping_matrix_list)" + ] + }, + { + "instruction": "input_reduce_fusion.29", + "ms": 0.002914968749999992, + "opcode": "fusion", + "shape": "f64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:93", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:93 (adaptive_pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/abstract.py:507 (Mapper.pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt.py:339 (Adapt.regularization_weights_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt_split.py:120 (AdaptSplit.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)" + ] + }, + { + "instruction": "loop_divide_fusion", + "ms": 0.002381581250000002, + "opcode": "fusion", + "shape": "f64[1500]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:92", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:92 (adaptive_pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/abstract.py:507 (Mapper.pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt.py:339 (Adapt.regularization_weights_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt_split.py:120 (AdaptSplit.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)" + ] + } + ], + "mixed_fusion": [ + { + "instruction": "loop_divide_gather_fusion", + "ms": 1.0180024062500006, + "opcode": "fusion", + "shape": "(f64[15361,1,1,1500]{3,2,1,0}, f64[15361,1,1,1500]{3,2,1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:133", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:133 (curvature_matrix_via_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:93 (InversionImagingMapping.curvature_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:389 (AbstractInversion.curvature_reg_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "input_add_multiply_transpose_fusion", + "ms": 0.06093762499999998, + "opcode": "fusion", + "shape": "(f64[1500,1500]{1,0}, f64[1500,1500]{1,0}, f64[1500,1500]{1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:61", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:61 (initialize)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:72 (solve_nnls)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:129 (_solve_nnls_primal_with..primal)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:164 (solve_nnls_primal_with_status)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:508 (reconstruction_positive_only_from)" + ] + }, + { + "instruction": "input_transpose_fusion.3", + "ms": 0.024325706249999992, + "opcode": "fusion", + "shape": "f64[1500,1500]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986 (AbstractInversion._log_det_symmetric_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:1157 (AbstractInversion.log_det_regularization_matrix_term)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:348 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/model/analysis.py:135 (AnalysisImaging.log_likelihood_function)" + ] + }, + { + "instruction": "input_scatter_fusion.2", + "ms": 0.016327875000000002, + "opcode": "fusion", + "shape": "f64[1500,1500]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:579", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:579 (pixel_splitted_regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt_split.py:137 (AdaptSplit.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:332 (AbstractInversion.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "input_scatter_fusion.3", + "ms": 0.014850712500000003, + "opcode": "fusion", + "shape": "f64[1500]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:70", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:70 (adaptive_pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/abstract.py:507 (Mapper.pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt.py:339 (Adapt.regularization_weights_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt_split.py:120 (AdaptSplit.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)" + ] + }, + { + "instruction": "loop_abs_fusion", + "ms": 0.014794250000000004, + "opcode": "fusion", + "shape": "(f64[6000,1]{1,0}, f64[6000,1]{1,0}, f64[6000,1]{1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:613", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:613 (triangle_area_xp)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:657 (pixel_weights_delaunay_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:982 (InterpolatorDelaunay._mappings_sizes_weights_split)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt_split.py:124 (AdaptSplit.regularization_matrix_from)" + ] + } + ], + "ray_trace_data_grid": [ + { + "instruction": "input_reduce_fusion.18", + "ms": 0.003240987500000005, + "opcode": "fusion", + "shape": "f64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:506", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:506 (FlatLambdaCDM._simpson_1d)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:644 (FlatLambdaCDM.angular_diameter_distance_kpc_z1z2)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:133 (LensingCosmology.angular_diameter_distance_to_earth_in_kpc_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:362 (LensingCosmology.scaling_factor_between_redshifts_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/lens/tracer_util.py:252 (traced_grid_2d_list_from)" + ] + }, + { + "instruction": "input_reduce_fusion.20", + "ms": 0.002768362500000002, + "opcode": "fusion", + "shape": "f64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:506", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:506 (FlatLambdaCDM._simpson_1d)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:644 (FlatLambdaCDM.angular_diameter_distance_kpc_z1z2)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:151 (LensingCosmology.angular_diameter_distance_between_redshifts_in_kpc_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:355 (LensingCosmology.scaling_factor_between_redshifts_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/lens/tracer_util.py:252 (traced_grid_2d_list_from)" + ] + }, + { + "instruction": "input_reduce_fusion.19", + "ms": 0.0026012000000000058, + "opcode": "fusion", + "shape": "f64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:503", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:503 (FlatLambdaCDM._simpson_1d)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:644 (FlatLambdaCDM.angular_diameter_distance_kpc_z1z2)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:133 (LensingCosmology.angular_diameter_distance_to_earth_in_kpc_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:362 (LensingCosmology.scaling_factor_between_redshifts_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/lens/tracer_util.py:252 (traced_grid_2d_list_from)" + ] + }, + { + "instruction": "input_reduce_fusion.21", + "ms": 0.0025914000000000054, + "opcode": "fusion", + "shape": "f64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:503", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:503 (FlatLambdaCDM._simpson_1d)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:644 (FlatLambdaCDM.angular_diameter_distance_kpc_z1z2)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:151 (LensingCosmology.angular_diameter_distance_between_redshifts_in_kpc_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:355 (LensingCosmology.scaling_factor_between_redshifts_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/lens/tracer_util.py:252 (traced_grid_2d_list_from)" + ] + }, + { + "instruction": "loop_divide_fusion.1", + "ms": 0.0025315812500000014, + "opcode": "fusion", + "shape": "f64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:380", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:380 (LensingCosmology.scaling_factor_between_redshifts_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/lens/tracer_util.py:252 (traced_grid_2d_list_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/lens/tracer.py:632 (Tracer.traced_grid_2d_list_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/structures/decorators/abstract.py:93 (AbstractMaker.evaluate_func)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/structures/decorators/abstract.py:110 (AbstractMaker.result)" + ] + } + ], + "border_relocator": [ + { + "instruction": "eigh.45", + "ms": 0.07483110624999999, + "opcode": "custom-call", + "shape": "(f64[2,2]{0,1}, f64[2]{0}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:245", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:245 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:454 (BorderRelocator.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:176 (AbstractMesh.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:214 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "custom-call.2", + "ms": 0.007959975, + "opcode": "custom-call", + "shape": "(f64[2,2]{1,0}, s8[4194304]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:242", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:242 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:454 (BorderRelocator.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:176 (AbstractMesh.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:214 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "input_reduce_fusion.15", + "ms": 0.005811374999999996, + "opcode": "fusion", + "shape": "(f64[], f64[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:269", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:269 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:454 (BorderRelocator.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:176 (AbstractMesh.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:214 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "loop_select_sine_fusion", + "ms": 0.0036667749999999906, + "opcode": "fusion", + "shape": "(f64[], f64[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:301", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:301 (relocated_grid_via_ellipse_border_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:458 (BorderRelocator.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:176 (AbstractMesh.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:214 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "input_concatenate_fusion.3", + "ms": 0.0036359687499999986, + "opcode": "fusion", + "shape": "f64[15361,2]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:323", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:323 (relocated_grid_via_ellipse_border_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:423 (BorderRelocator.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:83 (AbstractMesh.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:208 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "loop_add_fusion.5", + "ms": 0.0035445687500000028, + "opcode": "fusion", + "shape": "f64[15361]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:308", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:308 (relocated_grid_via_ellipse_border_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:423 (BorderRelocator.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:83 (AbstractMesh.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:208 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + } + ], + "mesh_construction": [ + { + "instruction": "input_concatenate_fusion.7", + "ms": 0.002053781250000004, + "opcode": "fusion", + "shape": "f64[1500,2]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:820", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:820 (InterpolatorDelaunay.mesh_grid_xy)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:847 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + } + ], + "mesh_qhull_callback": [ + { + "instruction": "pure_callback.4", + "ms": 0.010638512500000029, + "opcode": "custom-call", + "shape": "(s32[3000,3]{1,0}, s32[3000,3]{1,0}, s32[1500]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:161", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:161 (_jax_delaunay_tables)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:405 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + } + ], + "other": [ + { + "instruction": "copy.72", + "ms": 0.042004900000001816, + "opcode": "copy", + "shape": "f64[1,1024,2]{2,1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "copy.35", + "ms": 0.017002456250000093, + "opcode": "copy", + "shape": "s32[21361]{0}", + "source": "", + "stack": [] + }, + { + "instruction": "copy.40", + "ms": 0.0019799687500000017, + "opcode": "copy", + "shape": "s64[1500]{0}", + "source": "", + "stack": [] + }, + { + "instruction": "loop_broadcast_fusion.1", + "ms": 0.0019762125000000034, + "opcode": "fusion", + "shape": "(pred[21361]{0}, pred[21361]{0})", + "source": "", + "stack": [] + }, + { + "instruction": "copy.71", + "ms": 0.0018016062500000013, + "opcode": "copy", + "shape": "s32[]", + "source": "", + "stack": [] + }, + { + "instruction": "loop_broadcast_fusion.4", + "ms": 0.0017822062499999992, + "opcode": "fusion", + "shape": "(f64[1500]{0}, f64[1500]{0}, f64[1500]{0}, f64[1500]{0})", + "source": "", + "stack": [] + } + ], + "mesh_seed_argmin": [ + { + "instruction": "input_reduce_fusion", + "ms": 0.15269622500000266, + "opcode": "fusion", + "shape": "(f64[1024]{0}, s64[1024]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:191", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:191 (_nearest_vertex_seed_from..argmin_chunk)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204 (_nearest_vertex_seed_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:351 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)" + ] + }, + { + "instruction": "loop_dynamic_update_slice_fusion", + "ms": 0.04129490624999953, + "opcode": "fusion", + "shape": "s32[21,1024]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204 (_nearest_vertex_seed_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:351 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "loop_add_fusion", + "ms": 0.03184760624999863, + "opcode": "fusion", + "shape": "s64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204 (_nearest_vertex_seed_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:351 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "loop_broadcast_fusion", + "ms": 0.001955412499999998, + "opcode": "fusion", + "shape": "s32[21,1024]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204 (_nearest_vertex_seed_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:351 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "regularization_H": [ + { + "instruction": "loop_select_fusion.3", + "ms": 0.020070875000000002, + "opcode": "fusion", + "shape": "f64[1500,1500]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:549", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:549 (pixel_splitted_regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt_split.py:137 (AdaptSplit.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:332 (AbstractInversion.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "input_scatter_fusion.10", + "ms": 0.0020686000000000007, + "opcode": "fusion", + "shape": "f64[1500,1500]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:615", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:615 (pixel_splitted_regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt_split.py:137 (AdaptSplit.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:332 (AbstractInversion.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "input_concatenate_fusion.8", + "ms": 0.0018732062500000017, + "opcode": "fusion", + "shape": "pred[3]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:93", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:93 (split_points_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:410 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + }, + { + "instruction": "input_concatenate_fusion.9", + "ms": 0.0018491749999999991, + "opcode": "fusion", + "shape": "pred[3]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:91", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:91 (split_points_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:410 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + }, + { + "instruction": "input_concatenate_fusion.10", + "ms": 0.001846981249999998, + "opcode": "fusion", + "shape": "pred[3]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:90", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:90 (split_points_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:410 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + }, + { + "instruction": "input_concatenate_fusion", + "ms": 0.0017675999999999992, + "opcode": "fusion", + "shape": "s32[1500,2]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:615", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:615 (pixel_splitted_regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt_split.py:137 (AdaptSplit.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:332 (AbstractInversion.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "mesh_locate_walk": [ + { + "instruction": "loop_reduce_fusion", + "ms": 0.02580061874999997, + "opcode": "fusion", + "shape": "(f64[21361]{0}, s64[21361]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:264", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:264 (_walk_from_seed..walk_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:292 (_walk_from_seed..body)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:264 (_walk_from_seed..walk_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:292 (_walk_from_seed..body)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)" + ] + }, + { + "instruction": "input_reduce_fusion.1", + "ms": 0.025136112500000016, + "opcode": "fusion", + "shape": "pred[196]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:288", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:288 (_walk_from_seed..cond)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:353 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)" + ] + }, + { + "instruction": "loop_or_select_fusion", + "ms": 0.023382499999999754, + "opcode": "fusion", + "shape": "(s32[21361]{0}, pred[21361]{0}, pred[21361]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:270", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:270 (_walk_from_seed..walk_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:292 (_walk_from_seed..body)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:353 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)" + ] + }, + { + "instruction": "loop_select_fusion", + "ms": 0.020160456249999886, + "opcode": "fusion", + "shape": "s32[21361]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:242", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:242 (_walk_from_seed..weights_of)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:262 (_walk_from_seed..walk_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:292 (_walk_from_seed..body)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:353 (pix_indexes_delaunay_walk_from)" + ] + }, + { + "instruction": "input_reduce_fusion.2", + "ms": 0.01623728750000017, + "opcode": "fusion", + "shape": "pred[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:288", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:288 (_walk_from_seed..cond)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:353 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)" + ] + }, + { + "instruction": "while.22", + "ms": 0.014526274999999767, + "opcode": "while", + "shape": "(s32[], s32[21361]{0}, pred[21361]{0}, pred[21361]{0}, s32[3000,3]{1,0}, /*index=5*/f64[1500,2]{1,0}, f64[21361,2]{1,0}, s32[3000,3]{1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:353 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "data_vector_D": [ + { + "instruction": "input_reduce_fusion.10", + "ms": 0.12160307499999996, + "opcode": "fusion", + "shape": "f64[92,1500]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/inversion_imaging_util.py:123", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/inversion_imaging_util.py:123 (data_vector_via_blurred_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:67 (InversionImagingMapping.data_vector)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:699 (AbstractInversion.reconstruction)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "input_reduce_fusion.27", + "ms": 0.0036965937499999963, + "opcode": "fusion", + "shape": "f64[1500]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/inversion_imaging_util.py:123", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/inversion_imaging_util.py:123 (data_vector_via_blurred_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:67 (InversionImagingMapping.data_vector)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:699 (AbstractInversion.reconstruction)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "inversion_other": [ + { + "instruction": "cholesky.60", + "ms": 0.8938812312500021, + "opcode": "custom-call", + "shape": "(f64[1500,1500]{0,1}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986 (AbstractInversion._log_det_symmetric_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:1078 (AbstractInversion.log_det_curvature_reg_matrix_term)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:347 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/model/analysis.py:135 (AnalysisImaging.log_likelihood_function)" + ] + }, + { + "instruction": "cholesky.70", + "ms": 0.8923673750000006, + "opcode": "custom-call", + "shape": "(f64[1500,1500]{0,1}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986 (AbstractInversion._log_det_symmetric_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:1157 (AbstractInversion.log_det_regularization_matrix_term)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:348 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/model/analysis.py:135 (AnalysisImaging.log_likelihood_function)" + ] + }, + { + "instruction": "input_reduce_fusion.17", + "ms": 0.01297495625, + "opcode": "fusion", + "shape": "f64[1500]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:946", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:946 (AbstractInversion.regularization_term)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:346 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/model/analysis.py:135 (AnalysisImaging.log_likelihood_function)", + "/mnt/ral/jnightin/autolens_profiling_wt/certified-solver-phase-c1-lane-rate/scripts/imaging/likelihood_breakdown/fixed_light_trace.py:1195 (_captured_likelihood_fn.._likelihood)" + ] + }, + { + "instruction": "loop_reduce_window_fusion", + "ms": 0.002881393749999993, + "opcode": "fusion", + "shape": "s64[6,16]{1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "loop_reduce_window_fusion.1", + "ms": 0.0027907937500000002, + "opcode": "fusion", + "shape": "s64[94,16]{1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "input_reduce_fusion.25", + "ms": 0.00266678125, + "opcode": "fusion", + "shape": "f64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:944", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:944 (AbstractInversion.regularization_term)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:346 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/model/analysis.py:135 (AnalysisImaging.log_likelihood_function)", + "/mnt/ral/jnightin/autolens_profiling_wt/certified-solver-phase-c1-lane-rate/scripts/imaging/likelihood_breakdown/fixed_light_trace.py:1195 (_captured_likelihood_fn.._likelihood)" + ] + } + ], + "curvature_matrix_F": [ + { + "instruction": "cublas-lt-matmul.2", + "ms": 4.26782450625, + "opcode": "custom-call", + "shape": "(f64[1500,1500]{1,0}, s8[4194304]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:134", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:134 (curvature_matrix_via_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:93 (InversionImagingMapping.curvature_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:389 (AbstractInversion.curvature_reg_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "pdip_solve": [ + { + "instruction": "cholesky.20", + "ms": 16.14834093749997, + "opcode": "custom-call", + "shape": "(f64[1500,1500]{0,1}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:106", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:106 (factorize_kkt)", + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:212 (pdip_pc_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:83 (solve_nnls)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:129 (_solve_nnls_primal_with..primal)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:164 (solve_nnls_primal_with_status)" + ] + }, + { + "instruction": "triangular-solve", + "ms": 2.571473356250029, + "opcode": "custom-call", + "shape": "(f64[1500,1]{0,1}, s8[0]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146 (solve_kkt_rhs)", + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:213 (pdip_pc_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:83 (solve_nnls)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:129 (_solve_nnls_primal_with..primal)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:164 (solve_nnls_primal_with_status)" + ] + }, + { + "instruction": "triangular-solve.2", + "ms": 2.5177017312498977, + "opcode": "custom-call", + "shape": "(f64[1500,1]{0,1}, s8[0]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146 (solve_kkt_rhs)", + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:217 (pdip_pc_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:83 (solve_nnls)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:129 (_solve_nnls_primal_with..primal)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:164 (solve_nnls_primal_with_status)" + ] + }, + { + "instruction": "triangular-solve.3", + "ms": 2.440972899999916, + "opcode": "custom-call", + "shape": "(f64[1500,1]{0,1}, s8[0]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146 (solve_kkt_rhs)", + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:217 (pdip_pc_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:83 (solve_nnls)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:129 (_solve_nnls_primal_with..primal)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:164 (solve_nnls_primal_with_status)" + ] + }, + { + "instruction": "triangular-solve.1", + "ms": 2.3317068874999007, + "opcode": "custom-call", + "shape": "(f64[1500,1]{0,1}, s8[0]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146 (solve_kkt_rhs)", + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:213 (pdip_pc_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:83 (solve_nnls)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:129 (_solve_nnls_primal_with..primal)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:164 (solve_nnls_primal_with_status)" + ] + }, + { + "instruction": "cholesky.40", + "ms": 0.8640322062500013, + "opcode": "custom-call", + "shape": "(f64[1500,1500]{0,1}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:62", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:62 (initialize)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:72 (solve_nnls)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:129 (_solve_nnls_primal_with..primal)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:164 (solve_nnls_primal_with_status)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:508 (reconstruction_positive_only_from)" + ] + } + ], + "mapped_reconstruction": [ + { + "instruction": "input_reduce_fusion.14", + "ms": 0.11515689999999999, + "opcode": "fusion", + "shape": "f64[15361]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:163", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:163 (mapped_reconstructed_data_via_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:120 (InversionImagingMapping._mapped_reconstructed_data_dict_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:196 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + } + ] + }, + "stage_audit_note": "The HLO instructions that contributed most of each stage's milliseconds, with their full source stack. A stage row is only as good as the rules that built it; this is how a reader checks a row against the HLO instead of trusting it.", + "untraced_wall_ms": 50.99743364999085, + "reconciliation_vs_untraced_pct": -0.5315860266644271, + "wall_basis": "wall_ms is the TRACED run's wall, the run these kernel durations came from. untraced_wall_ms is the same executable without the profiler; the difference is the profiler's overhead and belongs in neither the stages nor the idle row.", + "calls": 160, + "call_split": "per-call (first-instruction recurrence)", + "call_blocks": 160, + "events": 153930, + "streams": [ + "Stream #14(Memset,MemcpyD2H,Compute,MemcpyH2D,MemcpyD2D)" + ], + "per_stage_ms": { + "border_relocator": { + "median_ms": 0.11510500000000001, + "min_ms": 0.11436500000000002, + "max_ms": 0.116032 + }, + "chi_squared_evidence": { + "median_ms": 0.010688, + "min_ms": 0.010336000000000001, + "max_ms": 0.011296 + }, + "curvature_matrix_F": { + "median_ms": 4.267072, + "min_ms": 4.247425, + "max_ms": 4.332549 + }, + "data_vector_D": { + "median_ms": 0.12534099999999998, + "min_ms": 0.12447799999999999, + "max_ms": 0.12595299999999998 + }, + "inversion_other": { + "median_ms": 1.818591, + "min_ms": 1.8023280000000002, + "max_ms": 1.830704 + }, + "mapped_reconstruction": { + "median_ms": 0.115169, + "min_ms": 0.114593, + "max_ms": 0.115873 + }, + "mapping_matrix": { + "median_ms": 0.11622199999999999, + "min_ms": 0.115454, + "max_ms": 0.117345 + }, + "memset": { + "median_ms": 0.048959000000000016, + "min_ms": 0.04032000000000001, + "max_ms": 0.08275200000000003 + }, + "mesh_construction": { + "median_ms": 0.002048, + "min_ms": 0.002016, + "max_ms": 0.00208 + }, + "mesh_locate_walk": { + "median_ms": 0.15027249999999998, + "min_ms": 0.132226, + "max_ms": 0.18601800000000013 + }, + "mesh_qhull_callback": { + "median_ms": 0.010592, + "min_ms": 0.010496000000000002, + "max_ms": 0.011072 + }, + "mesh_seed_argmin": { + "median_ms": 0.2277760000000001, + "min_ms": 0.22751300000000008, + "max_ms": 0.2281290000000001 + }, + "mixed_fusion": { + "median_ms": 1.2594120000000002, + "min_ms": 1.253861, + "max_ms": 1.263404 + }, + "other": { + "median_ms": 0.07148649999999998, + "min_ms": 0.069149, + "max_ms": 0.07616 + }, + "pdip_solve": { + "median_ms": 27.291537000000034, + "min_ms": 22.702046000000006, + "max_ms": 47.42273900000002 + }, + "psf_convolution_mapping_matrix": { + "median_ms": 7.332478000000001, + "min_ms": 7.310459000000001, + "max_ms": 7.347292 + }, + "ray_trace_data_grid": { + "median_ms": 0.013696000000000002, + "min_ms": 0.013599, + "max_ms": 0.014079000000000001 + }, + "regularization_H": { + "median_ms": 0.031008, + "min_ms": 0.030431, + "max_ms": 0.031808 + } + }, + "stage_order": [ + "ray_trace_data_grid", + "border_relocator", + "mesh_qhull_callback", + "mesh_seed_argmin", + "mesh_locate_walk", + "mesh_construction", + "mapping_matrix", + "psf_convolution_mapping_matrix", + "data_vector_D", + "curvature_matrix_F", + "regularization_H", + "pdip_solve", + "mapped_reconstruction", + "chi_squared_evidence", + "inversion_other", + "mixed_fusion", + "other", + "memset" + ], + "mixed_fusion": { + "ms": 1.2594120000000002, + "constituent_stage_sets": { + "curvature_matrix_F + psf_convolution_mapping_matrix": 1.0180024062500006, + "curvature_reg_reduce_gather + inversion_other + mapped_reconstruction + pdip_solve + reconstruction_scatter + regularization_H": 0.06093762499999998, + "inversion_other + regularization_H": 0.0295624375000001, + "inversion_other + mesh_construction + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin + regularization_H": 0.021517068749999972, + "inversion_other + mapping_matrix + mesh_construction + mesh_dual_areas + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin": 0.0213614625, + "inversion_other + mesh_construction + mesh_dual_areas + mesh_interpolation_weights + regularization_H": 0.014794250000000004, + "grids_and_structures + mass_profile_deflections + ray_trace_data_grid": 0.014543493750000004, + "inversion_other + mapping_matrix + mesh_construction + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin": 0.011769274999999997, + "grids_and_structures + mass_profile_deflections": 0.010189981249999994, + "inversion_other + mesh_dual_areas + mesh_locate_walk": 0.00937176250000002, + "inversion_other + mesh_construction + mesh_seed_argmin + regularization_H": 0.007327943749999996, + "inversion_other + mesh_construction + regularization_H": 0.00661453749999999, + "inversion_other + ray_trace_data_grid": 0.0053681687500000035, + "inversion_other + mapped_reconstruction + pdip_solve + reconstruction_scatter": 0.004833356250000001, + "inversion_other + mapped_reconstruction": 0.0037823749999999954, + "mapping_matrix + regularization_H": 0.0034730125, + "inversion_other + mesh_construction + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin": 0.003182962499999998, + "inversion_other + mesh_construction + mesh_dual_areas + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin": 0.002953393749999999, + "inversion_other + pdip_solve": 0.0028459687499999987, + "inversion_other + mesh_locate_walk + mesh_seed_argmin": 0.0025221812499999965, + "inversion_other + mesh_interpolation_weights": 0.002148206250000002, + "chi_squared_evidence + inversion_other": 0.0019078125000000007 + }, + "example_kernels": { + "curvature_matrix_F + psf_convolution_mapping_matrix": [ + "loop_divide_gather_fusion" + ], + "curvature_reg_reduce_gather + inversion_other + mapped_reconstruction + pdip_solve + reconstruction_scatter + regularization_H": [ + "input_add_multiply_transpose_fusion" + ], + "inversion_other + regularization_H": [ + "loop_reduce_slice_fusion", + "loop_reduce_fusion.1", + "loop_reduce_fusion.2", + "input_transpose_fusion.3" + ], + "inversion_other + mesh_construction + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin + regularization_H": [ + "input_reduce_fusion.24", + "loop_select_fusion.4", + "input_scatter_fusion.2" + ], + "inversion_other + mapping_matrix + mesh_construction + mesh_dual_areas + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin": [ + "input_scatter_fusion.6", + "input_scatter_fusion.3" + ], + "inversion_other + mesh_construction + mesh_dual_areas + mesh_interpolation_weights + regularization_H": [ + "loop_abs_fusion" + ], + "grids_and_structures + mass_profile_deflections + ray_trace_data_grid": [ + "loop_subtract_fusion.2", + "loop_subtract_fusion.1" + ], + "inversion_other + mapping_matrix + mesh_construction + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin": [ + "input_scatter_fusion.4" + ], + "grids_and_structures + mass_profile_deflections": [ + "loop_divide_minimum_multiply_sine_sqrt_fusion", + "loop_slice_fusion" + ], + "inversion_other + mesh_dual_areas + mesh_locate_walk": [ + "loop_select_fusion.6", + "input_scatter_fusion.9", + "input_scatter_fusion.8", + "input_scatter_fusion.7" + ] + }, + "prorated_estimate_ms": { + "curvature_matrix_F": 0.5090012031250003, + "psf_convolution_mapping_matrix": 0.5090012031250003, + "inversion_other": 0.05486061020833337, + "regularization_H": 0.037255855729166704, + "mesh_construction": 0.016723868020833324, + "mesh_interpolation_weights": 0.013761139374999997, + "mesh_locate_walk": 0.013692834166666666, + "mapped_reconstruction": 0.013255797395833328, + "pdip_solve": 0.01278759427083333, + "mesh_seed_argmin": 0.012400899270833326, + "reconstruction_scatter": 0.01136460989583333, + "curvature_reg_reduce_gather": 0.01015627083333333, + "grids_and_structures": 0.009942821874999997, + "mass_profile_deflections": 0.009942821874999997, + "mesh_dual_areas": 0.009626640625000007, + "ray_trace_data_grid": 0.007531915625000003, + "mapping_matrix": 0.006749689583333333, + "chi_squared_evidence": 0.0009539062500000003 + }, + "prorated_note": "ESTIMATE ONLY \u2014 a mixed fusion's time split equally across the stages its constituents span. Never summed into the measured table, never reconciled." + }, + "other_sources_ms": { + "copy.72": 0.042004900000001816, + "copy.35": 0.017002456250000093, + "copy.40": 0.0019799687500000017, + "loop_broadcast_fusion.1": 0.0019762125000000034, + "copy.71": 0.0018016062500000013, + "loop_broadcast_fusion.4": 0.0017822062499999992, + "copy.70": 0.001763374999999999, + "copy.20": 0.0016625937500000004, + "copy.52": 0.0016511874999999999 + }, + "device_span_ms": 52.50365706875, + "device_busy_ms": 44.784771649999996, + "device_idle_ms": 7.718885418750006, + "largest_idle_gaps": [ + { + "gap_ms": 5.420902, + "after": "pure_callback.4", + "before": "pure_callback.4" + }, + { + "gap_ms": 0.050879, + "after": "copy.35", + "before": "input_reduce_fusion.1" + }, + { + "gap_ms": 0.034176, + "after": "pure_callback.4", + "before": "copy.71" + }, + { + "gap_ms": 0.031775, + "after": "loop_broadcast_fusion", + "before": "loop_add_fusion.5" + }, + { + "gap_ms": 0.031263, + "after": "input_scatter_fusion.7", + "before": "loop_reduce_fusion.1" + }, + { + "gap_ms": 0.031231, + "after": "input_concatenate_fusion.7", + "before": "pure_callback.4" + }, + { + "gap_ms": 0.022336, + "after": "eigh.45", + "before": "eigh.45" + }, + { + "gap_ms": 0.022143, + "after": "while.28", + "before": "input_reduce_fusion.3" + } + ], + "kernel_ms": 43.007453000000034, + "sum_ms": 50.72633841875004, + "wall_ms": 52.51032926876178, + "host_outside_span_ms": 0.006672200011777818, + "reconciliation_pct": -3.397409376126366, + "unjoined_ms": 0.0, + "unjoined_pct": 0.0, + "other_ms": 0.07148649999999998, + "other_pct": 0.13613797703326735, + "note": "Stage rows attribute the command-buffers-OFF program (see the module docstring): kernel times are the same, the launch overhead the CUDA graphs remove is not. sum_ms = kernel rows + device_idle_ms; the residual against wall_ms is host_outside_span_ms (dispatch before the first kernel, teardown after the last).", + "per_stage_ms_per_lane": { + "border_relocator": 0.11510500000000001, + "chi_squared_evidence": 0.010688, + "curvature_matrix_F": 4.267072, + "data_vector_D": 0.12534099999999998, + "inversion_other": 1.818591, + "mapped_reconstruction": 0.115169, + "mapping_matrix": 0.11622199999999999, + "memset": 0.048959000000000016, + "mesh_construction": 0.002048, + "mesh_locate_walk": 0.15027249999999998, + "mesh_qhull_callback": 0.010592, + "mesh_seed_argmin": 0.2277760000000001, + "mixed_fusion": 1.2594120000000002, + "other": 0.07148649999999998, + "pdip_solve": 27.291537000000034, + "psf_convolution_mapping_matrix": 7.332478000000001, + "ray_trace_data_grid": 0.013696000000000002, + "regularization_H": 0.031008 + }, + "per_lane_divisor": 1, + "host_callback": { + "pure_callback_span_ms": 83.9009001, + "qhull_ms": 78.39786950000001, + "callback_body_ms_note": "the OUTERMOST matching body event, not a sum: under the probe the body appears twice (the wrapper and the timed re-implementation it calls) and summing them would count the same work twice", + "events_by_name": { + "pure_callback.4": { + "count": 160, + "ms": 83.9009001 + }, + "$callback.py:815 _wrapped_callback": { + "count": 160, + "ms": 82.483341 + }, + "$callback.py:224 _callback": { + "count": 160, + "ms": 82.09361520000003 + }, + "$callback.py:74 pure_callback_impl": { + "count": 160, + "ms": 81.94491380000007 + }, + "$callback.py:69 __call__": { + "count": 160, + "ms": 78.653725 + }, + "$delaunay.py:162 ": { + "count": 160, + "ms": 78.54514460000006 + }, + "$host_callback_probe.py:225 wrapped": { + "count": 160, + "ms": 78.39786950000001 + }, + "$host_callback_probe.py:160 _timed_tri_only": { + "count": 160, + "ms": 78.2671368 + }, + "ThenExecuteCallback:GetEventForComputeStreamSyncPoint": { + "count": 160, + "ms": 0.3028661999999999 + }, + "$callback.py:822 ": { + "count": 640, + "ms": 0.2351646999999993 + }, + "$__init__.py:132 _xla_gc_callback": { + "count": 2, + "ms": 0.000771 + } + }, + "note": "HOST milliseconds per traced BATCH (the whole invocation), aggregated by name because the events nest. Not a row of the device table: the device pays for them as the idle gaps largest_idle_gaps names." + }, + "host_callback_ms": 83.9009001 + }, + "hlo_census": { + "status": "excluded", + "reason": "The legacy census anchors PyAutoArray source line numbers that moved after the phase-1 run. No batched attribution is published from unsupported anchors; the device-event table and wall reconciliation remain valid." + }, + "stage_map_provenance": [ + { + "label": "log_det_curvature_reg", + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 850, + 882 + ], + "requires": { + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 884, + 896 + ] + }, + "function": null + }, + { + "label": "log_det_regularization", + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 850, + 882 + ], + "requires": { + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 897, + 943 + ] + }, + "function": null + }, + { + "label": "curvature_reg_add", + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 359, + 372 + ], + "requires": null, + "function": null + }, + { + "label": "curvature_reg_reduce_gather", + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 374, + 398 + ], + "requires": null, + "function": null + }, + { + "label": "edge_subset_gather", + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 606, + 614 + ], + "requires": null, + "function": null + }, + { + "label": "regularization_term", + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 786, + 849 + ], + "requires": null, + "function": null + }, + { + "label": "mapped_reconstruction", + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 722, + 785 + ], + "requires": null, + "function": null + }, + { + "label": "reconstruction_scatter", + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 583, + 605 + ], + "requires": null, + "function": null + }, + { + "label": "reconstruction_scatter", + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 615, + 721 + ], + "requires": null, + "function": null + }, + { + "label": "certified_active_set_solve", + "path": "likelihood_breakdown/active_set_steps.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "certified_active_set_solve", + "path": "likelihood_breakdown/library_solver_injection.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "pdip_solve", + "path": "PyAutoArray/autoarray/util/jax_nnls.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "pdip_solve", + "path": "PyAutoArray/autoarray/inversion/inversion/inversion_util.py", + "lines": [ + 256, + 488 + ], + "requires": null, + "function": null + }, + { + "label": "mapped_reconstruction", + "path": "PyAutoArray/autoarray/inversion/inversion/inversion_util.py", + "lines": [ + 156, + 200 + ], + "requires": null, + "function": null + }, + { + "label": "curvature_matrix_F", + "path": "PyAutoArray/autoarray/inversion/inversion/inversion_util.py", + "lines": [ + 12, + 155 + ], + "requires": null, + "function": null + }, + { + "label": "reconstruction_scatter", + "path": "PyAutoArray/autoarray/inversion/inversion/inversion_util.py", + "lines": [ + 201, + 255 + ], + "requires": null, + "function": null + }, + { + "label": "data_vector_D", + "path": "PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py", + "lines": [ + 54, + 73 + ], + "requires": null, + "function": null + }, + { + "label": "curvature_matrix_F", + "path": "PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py", + "lines": [ + 74, + 110 + ], + "requires": null, + "function": null + }, + { + "label": "data_vector_D", + "path": "PyAutoArray/autoarray/inversion/inversion/imaging/inversion_imaging_util.py", + "lines": null, + "requires": null, + "function": "data_vector_via_blurred_mapping_matrix_from" + }, + { + "label": "curvature_matrix_F", + "path": "PyAutoArray/autoarray/inversion/inversion/imaging/inversion_imaging_util.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "psf_convolution_mapping_matrix", + "path": "likelihood_breakdown/psf_cube_injection.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "psf_convolution_mapping_matrix", + "path": "PyAutoArray/autoarray/operators/convolver.py", + "lines": [ + 1086, + 1300 + ], + "requires": null, + "function": null + }, + { + "label": "psf_convolution_mapping_matrix", + "path": "PyAutoArray/autoarray/operators/convolver.py", + "lines": [ + 632, + 642 + ], + "requires": null, + "function": null + }, + { + "label": "psf_convolution_mapping_matrix", + "path": "PyAutoArray/autoarray/operators/convolver.py", + "lines": [ + 670, + 691 + ], + "requires": null, + "function": null + }, + { + "label": "psf_convolution_mapping_matrix", + "path": "PyAutoArray/autoarray/operators/convolver.py", + "lines": null, + "requires": { + "path": "PyAutoArray/autoarray/operators/convolver.py", + "lines": [ + 1086, + 1300 + ] + }, + "function": null + }, + { + "label": "psf_convolution_mapping_matrix", + "path": "PyAutoArray/autoarray/operators/convolver.py", + "lines": null, + "requires": { + "path": "PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py", + "lines": [ + 119, + 150 + ] + }, + "function": null + }, + { + "label": "psf_convolution_image", + "path": "PyAutoArray/autoarray/operators/convolver.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "psf_convolution_mapping_matrix", + "path": "PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py", + "lines": [ + 119, + 150 + ], + "requires": null, + "function": null + }, + { + "label": "mesh_qhull_callback", + "path": "PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py", + "lines": [ + 139, + 172 + ], + "requires": null, + "function": null + }, + { + "label": "mesh_seed_argmin", + "path": "PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py", + "lines": [ + 173, + 207 + ], + "requires": null, + "function": null + }, + { + "label": "mesh_locate_walk", + "path": "PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py", + "lines": [ + 208, + 372 + ], + "requires": null, + "function": null + }, + { + "label": "mesh_dual_areas", + "path": "PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py", + "lines": [ + 373, + 396 + ], + "requires": null, + "function": null + }, + { + "label": "mesh_dual_areas", + "path": "PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py", + "lines": [ + 437, + 494 + ], + "requires": null, + "function": null + }, + { + "label": "mesh_dual_areas", + "path": "PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py", + "lines": [ + 605, + 615 + ], + "requires": null, + "function": null + }, + { + "label": "mesh_interpolation_weights", + "path": "PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py", + "lines": [ + 616, + 695 + ], + "requires": null, + "function": null + }, + { + "label": "mesh_interpolation_weights", + "path": "PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py", + "lines": [ + 896, + 1000 + ], + "requires": null, + "function": null + }, + { + "label": "mesh_construction", + "path": "PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "border_relocator", + "path": "PyAutoArray/autoarray/inversion/mesh/border_relocator.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "mesh_construction", + "path": "PyAutoArray/autoarray/inversion/mesh/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "mapping_matrix", + "path": "PyAutoArray/autoarray/inversion/mappers/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "mapping_matrix", + "path": "PyAutoArray/autoarray/inversion/mappings/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "mapping_matrix", + "path": "PyAutoArray/autoarray/inversion/linear_obj/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "regularization_H", + "path": "PyAutoArray/autoarray/inversion/regularization/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "chi_squared_evidence", + "path": "PyAutoArray/autoarray/fit/fit_util.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "chi_squared_evidence", + "path": "PyAutoArray/autoarray/fit/fit_dataset.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "ray_trace_mesh_grid", + "path": "PyAutoLens/autolens/lens/to_inversion.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "ray_trace_mesh_grid", + "path": "PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "mass_profile_deflections", + "path": "PyAutoGalaxy/autogalaxy/profiles/mass/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "light_profile_image", + "path": "PyAutoGalaxy/autogalaxy/profiles/light/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "light_profile_image", + "path": "PyAutoGalaxy/autogalaxy/operate/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "ray_trace_data_grid", + "path": "PyAutoLens/autolens/lens/tracer.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "ray_trace_data_grid", + "path": "PyAutoLens/autolens/lens/tracer_util.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "grids_and_structures", + "path": "PyAutoArray/autoarray/structures/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "grids_and_structures", + "path": "PyAutoArray/autoarray/operators/over_sampling/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "grids_and_structures", + "path": "PyAutoArray/autoarray/geometry/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "inversion_other", + "path": "PyAutoArray/autoarray/inversion/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "fit_imaging_other", + "path": "PyAutoLens/autolens/imaging/fit_imaging.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "fit_imaging_other", + "path": "PyAutoGalaxy/autogalaxy/imaging/fit_imaging.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "fit_imaging_other", + "path": "PyAutoArray/autoarray/fit/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "analysis_other", + "path": "PyAutoLens/autolens/analysis/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "analysis_other", + "path": "PyAutoGalaxy/autogalaxy/analysis/", + "lines": null, + "requires": null, + "function": null + } + ], + "trace_timing": { + "traced_wall_ms": 52.51032926876178, + "untraced_wall_ms": 50.99743364999085, + "profiler_overhead_ms": 1.5128956187709264, + "profiler_overhead_pct": 2.9666112792152193 + }, + "jit_phases": { + "b_s3_pdip_library_likelihood_jit": { + "lower_s": 1.6891905660013435, + "compile_s": 4.545904295002401, + "first_call_s": 1.9207261609990383, + "steady_per_call_s": 0.05078495950001525 + }, + "d_s3_certified_fallback_library_likelihood_jit": { + "lower_s": 0.4805432729990571, + "compile_s": 4.39150354999947, + "first_call_s": 0.04447846900075092, + "steady_per_call_s": 0.03175044390009134 + } + }, + "peak_bytes": { + "after_setup": 85108992, + "after_routes": 1181653248, + "after_all": 18893572608, + "note": "jax.devices()[0].memory_stats()['peak_bytes_in_use']; None on a backend that does not report it (CPU). Process-wide high-water marks." + }, + "note": "Every stage row is a MEASURED sum of GPU kernel durations joined to library source through the optimized HLO of ONE program \u2014 not arithmetic across compilations. The rows attribute the command-buffers-OFF program: kernel time is the same as production, the launch overhead the CUDA graphs remove is not, and command_buffers.* carries both walls and their delta. sum_ms = kernel rows + measured device_idle_ms; the residual against the wall is host_outside_span_ms and is reported, not absorbed. mixed_fusion.prorated_estimate_ms is an ESTIMATE and is never part of the table. No row may be quoted if reconciliation_pct is outside 5 % or unjoined_ms is non-zero.", + "vmap": { + "batch": 16, + "lanes_mode": "captured", + "arms": [ + "vmap", + "scalar" + ], + "draw_seed": 0, + "fallback": true, + "composition": "jax.jit(jax.vmap(fn))", + "composition_provenance": "Current Fitness._vmap after PyAutoFit#1638. Array 343376 used the retired jax.vmap(jax.jit(fn)) composition and is historical evidence only.", + "headline_arm": "scalar", + "lane_rtol": 1e-09, + "lanes": [ + { + "lane": 0, + "draw_name": "call00015_lane00", + "draw_kind": "captured", + "offsets": { + "centre_0": -0.0033655095107821688, + "centre_1": 0.004631951955766499, + "ell_comps_0": 0.000564301988937442, + "ell_comps_1": -0.00879076787683888, + "einstein_radius": 0.018337010967920175 + }, + "log_likelihood_vmap": 24758.506194309146, + "log_likelihood_scalar": 24758.506194309124, + "log_likelihood_library_pdip": 24758.50619430915, + "log_likelihood_library_pdip_scalar": 24758.506194309135, + "rel_diff_vmap_vs_library_pdip": 1.4693854219395184e-16, + "rel_diff_scalar_vs_library_pdip_scalar": 4.4081562658185577e-16, + "abs_diff_nats": 2.1827872842550278e-11, + "rel_diff": 8.816312531637119e-16, + "rel_diff_scalar_vs_library_pdip": 1.028569795357663e-15, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 1.4551915228366852e-11, + "rel_diff_library_pdip_vmap_vs_scalar": 5.877541687758077e-16, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": null, + "passes": null, + "pdip_iter": null + }, + { + "lane": 1, + "draw_name": "call00015_lane01", + "draw_kind": "captured", + "offsets": { + "centre_0": -0.004311760382151672, + "centre_1": 0.0027192789928108052, + "ell_comps_0": 0.0061667694809026535, + "ell_comps_1": 0.003465536775180321, + "einstein_radius": -0.05732579988501185 + }, + "log_likelihood_vmap": 20551.004887772695, + "log_likelihood_scalar": 20551.004887772382, + "log_likelihood_library_pdip": 20551.0048877727, + "log_likelihood_library_pdip_scalar": 20551.004887771785, + "rel_diff_vmap_vs_library_pdip": 1.7702194257450708e-16, + "rel_diff_scalar_vs_library_pdip_scalar": 2.903159858222045e-14, + "abs_diff_nats": 3.128661774098873e-10, + "rel_diff": 1.5223887061407843e-14, + "rel_diff_scalar_vs_library_pdip": 1.5400909003982116e-14, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 9.1313268058002e-10, + "rel_diff_library_pdip_vmap_vs_scalar": 4.443250758620325e-14, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": null, + "passes": null, + "pdip_iter": null + }, + { + "lane": 2, + "draw_name": "call00015_lane02", + "draw_kind": "captured", + "offsets": { + "centre_0": 0.0002796502552123051, + "centre_1": 0.0016003321376979894, + "ell_comps_0": -0.002094430657472772, + "ell_comps_1": 0.006146479068253558, + "einstein_radius": -0.025968910196758177 + }, + "log_likelihood_vmap": -189709.7266473121, + "log_likelihood_scalar": -189709.04549508705, + "log_likelihood_library_pdip": -189709.79900397593, + "log_likelihood_library_pdip_scalar": -189709.0304210228, + "rel_diff_vmap_vs_library_pdip": 3.81407097571277e-07, + "rel_diff_scalar_vs_library_pdip_scalar": 7.945886510077773e-08, + "abs_diff_nats": 0.6811522250645794, + "rel_diff": 3.5905100006537083e-06, + "rel_diff_scalar_vs_library_pdip": 3.971902837068127e-06, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 0.7685829531401396, + "rel_diff_library_pdip_vmap_vs_scalar": 4.051377793847858e-06, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "FAIL", + "certified": null, + "passes": null, + "pdip_iter": null + }, + { + "lane": 3, + "draw_name": "call00015_lane03", + "draw_kind": "captured", + "offsets": { + "centre_0": 0.004594602299816973, + "centre_1": 0.004924922434755804, + "ell_comps_0": 0.028601845732661953, + "ell_comps_1": 0.003760187047606014, + "einstein_radius": -0.03088526730480501 + }, + "log_likelihood_vmap": -141741.98159325594, + "log_likelihood_scalar": -141741.9655181495, + "log_likelihood_library_pdip": -141741.98025885387, + "log_likelihood_library_pdip_scalar": -141741.9670818188, + "rel_diff_vmap_vs_library_pdip": 9.414303846172863e-09, + "rel_diff_scalar_vs_library_pdip_scalar": 1.1031801878923308e-08, + "abs_diff_nats": 0.016075106454081833, + "rel_diff": 1.1341105928168804e-07, + "rel_diff_scalar_vs_library_pdip": 1.0399674364113432e-07, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 0.013177035085391253, + "rel_diff_library_pdip_vmap_vs_scalar": 9.296495143026323e-08, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "FAIL", + "certified": null, + "passes": null, + "pdip_iter": null + }, + { + "lane": 4, + "draw_name": "call00015_lane04", + "draw_kind": "captured", + "offsets": { + "centre_0": -0.0060950290987001, + "centre_1": -0.0006121094560707545, + "ell_comps_0": 0.009637314264800585, + "ell_comps_1": 0.006641580028105454, + "einstein_radius": -0.03125810931551931 + }, + "log_likelihood_vmap": 24880.545932988694, + "log_likelihood_scalar": 24880.54593298873, + "log_likelihood_library_pdip": 24880.54593298869, + "log_likelihood_library_pdip_scalar": 24880.54593298873, + "rel_diff_vmap_vs_library_pdip": 1.4621780474150203e-16, + "rel_diff_scalar_vs_library_pdip_scalar": 0.0, + "abs_diff_nats": 3.637978807091713e-11, + "rel_diff": 1.462178047415018e-15, + "rel_diff_scalar_vs_library_pdip": 1.6083958521565223e-15, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 4.001776687800884e-11, + "rel_diff_library_pdip_vmap_vs_scalar": 1.6083958521565197e-15, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": null, + "passes": null, + "pdip_iter": null + }, + { + "lane": 5, + "draw_name": "call00015_lane05", + "draw_kind": "captured", + "offsets": { + "centre_0": -0.008435952123169364, + "centre_1": -0.007849511137408794, + "ell_comps_0": -0.01598149485178925, + "ell_comps_1": 0.01654417876136871, + "einstein_radius": 0.014294380855379263 + }, + "log_likelihood_vmap": 25472.519186600086, + "log_likelihood_scalar": 25472.5191867783, + "log_likelihood_library_pdip": 25472.519186604342, + "log_likelihood_library_pdip_scalar": 25472.51918677379, + "rel_diff_vmap_vs_library_pdip": 1.67099106810594e-13, + "rel_diff_scalar_vs_library_pdip_scalar": 1.7709648926816943e-13, + "abs_diff_nats": 1.7821366782300174e-07, + "rel_diff": 6.996311064337322e-12, + "rel_diff_scalar_vs_library_pdip": 6.829211957574507e-12, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 1.6944613889791071e-07, + "rel_diff_library_pdip_vmap_vs_scalar": 6.6521154682609094e-12, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": null, + "passes": null, + "pdip_iter": null + }, + { + "lane": 6, + "draw_name": "call00015_lane06", + "draw_kind": "captured", + "offsets": { + "centre_0": 0.0031698313356290646, + "centre_1": -0.0038584140676992847, + "ell_comps_0": 0.01810147576636289, + "ell_comps_1": -0.011577480306416508, + "einstein_radius": 0.016136835525067283 + }, + "log_likelihood_vmap": -83383.91629577159, + "log_likelihood_scalar": -83383.91557044249, + "log_likelihood_library_pdip": -83383.91622255862, + "log_likelihood_library_pdip_scalar": -83383.91553139297, + "rel_diff_vmap_vs_library_pdip": 8.780226868835588e-10, + "rel_diff_scalar_vs_library_pdip_scalar": 4.683100553098559e-10, + "abs_diff_nats": 0.0007253290968947113, + "rel_diff": 8.698669184969555e-09, + "rel_diff_scalar_vs_library_pdip": 7.820646430056781e-09, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 0.0006911656528245658, + "rel_diff_library_pdip_vmap_vs_scalar": 8.288956550191635e-09, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": null, + "passes": null, + "pdip_iter": null + }, + { + "lane": 7, + "draw_name": "call00015_lane07", + "draw_kind": "captured", + "offsets": { + "centre_0": 0.006158729760195174, + "centre_1": 0.004883559265258847, + "ell_comps_0": 0.007613883677130215, + "ell_comps_1": -0.005800175617006949, + "einstein_radius": 0.0662922007765554 + }, + "log_likelihood_vmap": -11960.284433495239, + "log_likelihood_scalar": -11960.28442969585, + "log_likelihood_library_pdip": -11960.284432962995, + "log_likelihood_library_pdip_scalar": -11960.284430066371, + "rel_diff_vmap_vs_library_pdip": 4.450091286861443e-11, + "rel_diff_scalar_vs_library_pdip_scalar": 3.0979268738228547e-11, + "abs_diff_nats": 3.799388650804758e-06, + "rel_diff": 3.1766708167670024e-10, + "rel_diff_scalar_vs_library_pdip": 2.7316616872130993e-10, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 2.8966242098249495e-06, + "rel_diff_library_pdip_vmap_vs_scalar": 2.4218690004923866e-10, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": null, + "passes": null, + "pdip_iter": null + }, + { + "lane": 8, + "draw_name": "call00015_lane08", + "draw_kind": "captured", + "offsets": { + "centre_0": 0.0030335293924908615, + "centre_1": 0.0012117081273721316, + "ell_comps_0": 0.0008852687687036301, + "ell_comps_1": -0.0027113633212058814, + "einstein_radius": -0.03873713959923952 + }, + "log_likelihood_vmap": 23223.550391414446, + "log_likelihood_scalar": 23223.55039149581, + "log_likelihood_library_pdip": 23223.550391411005, + "log_likelihood_library_pdip_scalar": 23223.550391492525, + "rel_diff_vmap_vs_library_pdip": 1.4819129261052068e-13, + "rel_diff_scalar_vs_library_pdip_scalar": 1.414553247640914e-13, + "abs_diff_nats": 8.136339602060616e-08, + "rel_diff": 3.503486531947349e-12, + "rel_diff_scalar_vs_library_pdip": 3.651677824570663e-12, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 8.15198291093111e-08, + "rel_diff_library_pdip_vmap_vs_scalar": 3.510222499793754e-12, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": null, + "passes": null, + "pdip_iter": null + }, + { + "lane": 9, + "draw_name": "call00015_lane09", + "draw_kind": "captured", + "offsets": { + "centre_0": -0.0008035510098975272, + "centre_1": 0.005559773241319952, + "ell_comps_0": -0.003701655436278317, + "ell_comps_1": -0.012378591445614512, + "einstein_radius": 0.032284336889985665 + }, + "log_likelihood_vmap": -177118.65020104276, + "log_likelihood_scalar": -177117.73386044288, + "log_likelihood_library_pdip": -177119.41150152817, + "log_likelihood_library_pdip_scalar": -177117.74273056397, + "rel_diff_vmap_vs_library_pdip": 4.298232920675486e-06, + "rel_diff_scalar_vs_library_pdip_scalar": 5.0080364365854004e-08, + "abs_diff_nats": 0.9163405998842791, + "rel_diff": 5.173624232378081e-06, + "rel_diff_scalar_vs_library_pdip": 9.4718081494774e-06, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 1.6687709641992114, + "rel_diff_library_pdip_vmap_vs_scalar": 9.421817026754843e-06, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "FAIL", + "certified": null, + "passes": null, + "pdip_iter": null + }, + { + "lane": 10, + "draw_name": "call00015_lane10", + "draw_kind": "captured", + "offsets": { + "centre_0": -0.008473569241265282, + "centre_1": -0.0051993251621340235, + "ell_comps_0": -0.0031466996514049606, + "ell_comps_1": -0.0076036423480284636, + "einstein_radius": 0.08283321334626792 + }, + "log_likelihood_vmap": -101745.38551521233, + "log_likelihood_scalar": -101745.38334721276, + "log_likelihood_library_pdip": -101745.38547418748, + "log_likelihood_library_pdip_scalar": -101745.38352798171, + "rel_diff_vmap_vs_library_pdip": 4.0321088304993536e-10, + "rel_diff_scalar_vs_library_pdip_scalar": 1.776679675924146e-09, + "abs_diff_nats": 0.0021679995697923005, + "rel_diff": 2.13080878804482e-08, + "rel_diff_scalar_vs_library_pdip": 2.090487655195532e-08, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 0.0019462057680357248, + "rel_diff_library_pdip_vmap_vs_scalar": 1.9128197275903775e-08, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "FAIL", + "certified": null, + "passes": null, + "pdip_iter": null + }, + { + "lane": 11, + "draw_name": "call00015_lane11", + "draw_kind": "captured", + "offsets": { + "centre_0": 0.001017060353322001, + "centre_1": 0.003035861051809724, + "ell_comps_0": 0.0014054844842678396, + "ell_comps_1": -0.00019678252877009805, + "einstein_radius": -0.04179610309843307 + }, + "log_likelihood_vmap": 18957.528349913133, + "log_likelihood_scalar": 18957.52834975365, + "log_likelihood_library_pdip": 18957.52834991328, + "log_likelihood_library_pdip_scalar": 18957.528349738823, + "rel_diff_vmap_vs_library_pdip": 7.676061435737438e-15, + "rel_diff_scalar_vs_library_pdip_scalar": 7.821906603088431e-13, + "abs_diff_nats": 1.594817149452865e-07, + "rel_diff": 8.412579530567283e-12, + "rel_diff_scalar_vs_library_pdip": 8.420255591932183e-12, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 1.74455635715276e-07, + "rel_diff_library_pdip_vmap_vs_scalar": 9.202446252318514e-12, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": null, + "passes": null, + "pdip_iter": null + }, + { + "lane": 12, + "draw_name": "call00015_lane12", + "draw_kind": "captured", + "offsets": { + "centre_0": -0.0012508260776529923, + "centre_1": -0.0075763258203543175, + "ell_comps_0": -0.0003476568325791879, + "ell_comps_1": 0.0070528223693464365, + "einstein_radius": -0.005182936058341969 + }, + "log_likelihood_vmap": 24810.049660194898, + "log_likelihood_scalar": 24810.049660194905, + "log_likelihood_library_pdip": 24810.0496601949, + "log_likelihood_library_pdip_scalar": 24810.049660194898, + "rel_diff_vmap_vs_library_pdip": 1.4663327389176753e-16, + "rel_diff_scalar_vs_library_pdip_scalar": 2.932665477835351e-16, + "abs_diff_nats": 7.275957614183426e-12, + "rel_diff": 2.93266547783535e-16, + "rel_diff_scalar_vs_library_pdip": 1.4663327389176753e-16, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 3.637978807091713e-12, + "rel_diff_library_pdip_vmap_vs_scalar": 1.4663327389176755e-16, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": null, + "passes": null, + "pdip_iter": null + }, + { + "lane": 13, + "draw_name": "call00015_lane13", + "draw_kind": "captured", + "offsets": { + "centre_0": 0.0039046265841316857, + "centre_1": 0.008586063066835778, + "ell_comps_0": 0.01612319103606081, + "ell_comps_1": -0.006478405394829051, + "einstein_radius": -0.06420305523683667 + }, + "log_likelihood_vmap": -3605.7062167468175, + "log_likelihood_scalar": -3605.706215974824, + "log_likelihood_library_pdip": -3605.7062167202894, + "log_likelihood_library_pdip_scalar": -3605.7062159174166, + "rel_diff_vmap_vs_library_pdip": 7.357266473429572e-12, + "rel_diff_scalar_vs_library_pdip_scalar": 1.592123765449394e-11, + "abs_diff_nats": 7.719936547800899e-07, + "rel_diff": 2.1410331528393165e-10, + "rel_diff_scalar_vs_library_pdip": 2.0674604876623705e-10, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 8.028728188946843e-07, + "rel_diff_library_pdip_vmap_vs_scalar": 2.2266728646676658e-10, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": null, + "passes": null, + "pdip_iter": null + }, + { + "lane": 14, + "draw_name": "call00015_lane14", + "draw_kind": "captured", + "offsets": { + "centre_0": 0.007195835212073937, + "centre_1": -0.0022675171274400335, + "ell_comps_0": 0.004220685262914858, + "ell_comps_1": 0.006581974817750368, + "einstein_radius": 0.08589577997501685 + }, + "log_likelihood_vmap": 11126.921475740786, + "log_likelihood_scalar": 11126.921475785763, + "log_likelihood_library_pdip": 11126.92147574079, + "log_likelihood_library_pdip_scalar": 11126.921475785763, + "rel_diff_vmap_vs_library_pdip": 3.269528606832834e-16, + "rel_diff_scalar_vs_library_pdip_scalar": 0.0, + "abs_diff_nats": 4.497633199207485e-08, + "rel_diff": 4.042118216611096e-12, + "rel_diff_scalar_vs_library_pdip": 4.04179126376675e-12, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 4.4972694013267756e-08, + "rel_diff_library_pdip_vmap_vs_scalar": 4.041791263750414e-12, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": null, + "passes": null, + "pdip_iter": null + }, + { + "lane": 15, + "draw_name": "call00015_lane15", + "draw_kind": "captured", + "offsets": { + "centre_0": 0.0024446743118905125, + "centre_1": 0.0028324231769206983, + "ell_comps_0": -0.017159158004659933, + "ell_comps_1": 0.008265799441903459, + "einstein_radius": -0.03860302877433641 + }, + "log_likelihood_vmap": 20410.343973733572, + "log_likelihood_scalar": 20410.343973719955, + "log_likelihood_library_pdip": 20410.34397373363, + "log_likelihood_library_pdip_scalar": 20410.343973719544, + "rel_diff_vmap_vs_library_pdip": 2.851870648940346e-15, + "rel_diff_scalar_vs_library_pdip_scalar": 2.0141336458155093e-14, + "abs_diff_nats": 1.3616954674944282e-08, + "rel_diff": 6.671594899369292e-13, + "rel_diff_scalar_vs_library_pdip": 6.700113605854225e-13, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 1.4086253941059113e-08, + "rel_diff_library_pdip_vmap_vs_scalar": 6.901526970440401e-13, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": null, + "passes": null, + "pdip_iter": null + } + ], + "lane_pins": [ + { + "pin": "lane 0: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 24758.506194309146, + "reference_value": 24758.50619430915, + "rel_diff": 1.4693854219395184e-16, + "abs_diff_nats": 3.637978807091713e-12, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 0: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 24758.506194309124, + "reference_value": 24758.506194309135, + "rel_diff": 4.4081562658185577e-16, + "abs_diff_nats": 1.0913936421275139e-11, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 0: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 24758.506194309146, + "reference_value": 24758.506194309124, + "rel_diff": 8.816312531637119e-16, + "abs_diff_nats": 2.1827872842550278e-11, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 0: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 24758.50619430915, + "reference_value": 24758.506194309135, + "rel_diff": 5.877541687758077e-16, + "abs_diff_nats": 1.4551915228366852e-11, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 1: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 20551.004887772695, + "reference_value": 20551.0048877727, + "rel_diff": 1.7702194257450708e-16, + "abs_diff_nats": 3.637978807091713e-12, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 1: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 20551.004887772382, + "reference_value": 20551.004887771785, + "rel_diff": 2.903159858222045e-14, + "abs_diff_nats": 5.966285243630409e-10, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 1: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 20551.004887772695, + "reference_value": 20551.004887772382, + "rel_diff": 1.5223887061407843e-14, + "abs_diff_nats": 3.128661774098873e-10, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 1: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 20551.0048877727, + "reference_value": 20551.004887771785, + "rel_diff": 4.443250758620325e-14, + "abs_diff_nats": 9.1313268058002e-10, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 2: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -189709.7266473121, + "reference_value": -189709.79900397593, + "rel_diff": 3.81407097571277e-07, + "abs_diff_nats": 0.0723566638189368, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 2: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -189709.04549508705, + "reference_value": -189709.0304210228, + "rel_diff": 7.945886510077773e-08, + "abs_diff_nats": 0.015074064256623387, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 2: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -189709.7266473121, + "reference_value": -189709.04549508705, + "rel_diff": 3.5905100006537083e-06, + "abs_diff_nats": 0.6811522250645794, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 2: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -189709.79900397593, + "reference_value": -189709.0304210228, + "rel_diff": 4.051377793847858e-06, + "abs_diff_nats": 0.7685829531401396, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 3: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -141741.98159325594, + "reference_value": -141741.98025885387, + "rel_diff": 9.414303846172863e-09, + "abs_diff_nats": 0.001334402069915086, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 3: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -141741.9655181495, + "reference_value": -141741.9670818188, + "rel_diff": 1.1031801878923308e-08, + "abs_diff_nats": 0.001563669298775494, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 3: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -141741.98159325594, + "reference_value": -141741.9655181495, + "rel_diff": 1.1341105928168804e-07, + "abs_diff_nats": 0.016075106454081833, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 3: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -141741.98025885387, + "reference_value": -141741.9670818188, + "rel_diff": 9.296495143026323e-08, + "abs_diff_nats": 0.013177035085391253, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 4: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 24880.545932988694, + "reference_value": 24880.54593298869, + "rel_diff": 1.4621780474150203e-16, + "abs_diff_nats": 3.637978807091713e-12, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 4: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 24880.54593298873, + "reference_value": 24880.54593298873, + "rel_diff": 0.0, + "abs_diff_nats": 0.0, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 4: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 24880.545932988694, + "reference_value": 24880.54593298873, + "rel_diff": 1.462178047415018e-15, + "abs_diff_nats": 3.637978807091713e-11, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 4: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 24880.54593298869, + "reference_value": 24880.54593298873, + "rel_diff": 1.6083958521565197e-15, + "abs_diff_nats": 4.001776687800884e-11, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 5: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 25472.519186600086, + "reference_value": 25472.519186604342, + "rel_diff": 1.67099106810594e-13, + "abs_diff_nats": 4.256435204297304e-09, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 5: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 25472.5191867783, + "reference_value": 25472.51918677379, + "rel_diff": 1.7709648926816943e-13, + "abs_diff_nats": 4.511093720793724e-09, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 5: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 25472.519186600086, + "reference_value": 25472.5191867783, + "rel_diff": 6.996311064337322e-12, + "abs_diff_nats": 1.7821366782300174e-07, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 5: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 25472.519186604342, + "reference_value": 25472.51918677379, + "rel_diff": 6.6521154682609094e-12, + "abs_diff_nats": 1.6944613889791071e-07, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 6: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -83383.91629577159, + "reference_value": -83383.91622255862, + "rel_diff": 8.780226868835588e-10, + "abs_diff_nats": 7.321297016460449e-05, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 6: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -83383.91557044249, + "reference_value": -83383.91553139297, + "rel_diff": 4.683100553098559e-10, + "abs_diff_nats": 3.9049526094459e-05, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 6: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -83383.91629577159, + "reference_value": -83383.91557044249, + "rel_diff": 8.698669184969555e-09, + "abs_diff_nats": 0.0007253290968947113, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 6: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -83383.91622255862, + "reference_value": -83383.91553139297, + "rel_diff": 8.288956550191635e-09, + "abs_diff_nats": 0.0006911656528245658, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 7: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -11960.284433495239, + "reference_value": -11960.284432962995, + "rel_diff": 4.450091286861443e-11, + "abs_diff_nats": 5.322435754351318e-07, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 7: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -11960.28442969585, + "reference_value": -11960.284430066371, + "rel_diff": 3.0979268738228547e-11, + "abs_diff_nats": 3.705208655446768e-07, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 7: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -11960.284433495239, + "reference_value": -11960.28442969585, + "rel_diff": 3.1766708167670024e-10, + "abs_diff_nats": 3.799388650804758e-06, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 7: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -11960.284432962995, + "reference_value": -11960.284430066371, + "rel_diff": 2.4218690004923866e-10, + "abs_diff_nats": 2.8966242098249495e-06, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 8: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 23223.550391414446, + "reference_value": 23223.550391411005, + "rel_diff": 1.4819129261052068e-13, + "abs_diff_nats": 3.4415279515087605e-09, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 8: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 23223.55039149581, + "reference_value": 23223.550391492525, + "rel_diff": 1.414553247640914e-13, + "abs_diff_nats": 3.285094862803817e-09, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 8: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 23223.550391414446, + "reference_value": 23223.55039149581, + "rel_diff": 3.503486531947349e-12, + "abs_diff_nats": 8.136339602060616e-08, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 8: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 23223.550391411005, + "reference_value": 23223.550391492525, + "rel_diff": 3.510222499793754e-12, + "abs_diff_nats": 8.15198291093111e-08, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 9: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -177118.65020104276, + "reference_value": -177119.41150152817, + "rel_diff": 4.298232920675486e-06, + "abs_diff_nats": 0.7613004854065366, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 9: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -177117.73386044288, + "reference_value": -177117.74273056397, + "rel_diff": 5.0080364365854004e-08, + "abs_diff_nats": 0.008870121091604233, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 9: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -177118.65020104276, + "reference_value": -177117.73386044288, + "rel_diff": 5.173624232378081e-06, + "abs_diff_nats": 0.9163405998842791, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 9: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -177119.41150152817, + "reference_value": -177117.74273056397, + "rel_diff": 9.421817026754843e-06, + "abs_diff_nats": 1.6687709641992114, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 10: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -101745.38551521233, + "reference_value": -101745.38547418748, + "rel_diff": 4.0321088304993536e-10, + "abs_diff_nats": 4.10248467233032e-05, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 10: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -101745.38334721276, + "reference_value": -101745.38352798171, + "rel_diff": 1.776679675924146e-09, + "abs_diff_nats": 0.0001807689550332725, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 10: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -101745.38551521233, + "reference_value": -101745.38334721276, + "rel_diff": 2.13080878804482e-08, + "abs_diff_nats": 0.0021679995697923005, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 10: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -101745.38547418748, + "reference_value": -101745.38352798171, + "rel_diff": 1.9128197275903775e-08, + "abs_diff_nats": 0.0019462057680357248, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 11: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 18957.528349913133, + "reference_value": 18957.52834991328, + "rel_diff": 7.676061435737438e-15, + "abs_diff_nats": 1.4551915228366852e-10, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 11: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 18957.52834975365, + "reference_value": 18957.528349738823, + "rel_diff": 7.821906603088431e-13, + "abs_diff_nats": 1.4828401617705822e-08, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 11: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 18957.528349913133, + "reference_value": 18957.52834975365, + "rel_diff": 8.412579530567283e-12, + "abs_diff_nats": 1.594817149452865e-07, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 11: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 18957.52834991328, + "reference_value": 18957.528349738823, + "rel_diff": 9.202446252318514e-12, + "abs_diff_nats": 1.74455635715276e-07, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 12: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 24810.049660194898, + "reference_value": 24810.0496601949, + "rel_diff": 1.4663327389176753e-16, + "abs_diff_nats": 3.637978807091713e-12, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 12: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 24810.049660194905, + "reference_value": 24810.049660194898, + "rel_diff": 2.932665477835351e-16, + "abs_diff_nats": 7.275957614183426e-12, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 12: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 24810.049660194898, + "reference_value": 24810.049660194905, + "rel_diff": 2.93266547783535e-16, + "abs_diff_nats": 7.275957614183426e-12, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 12: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 24810.0496601949, + "reference_value": 24810.049660194898, + "rel_diff": 1.4663327389176755e-16, + "abs_diff_nats": 3.637978807091713e-12, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 13: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -3605.7062167468175, + "reference_value": -3605.7062167202894, + "rel_diff": 7.357266473429572e-12, + "abs_diff_nats": 2.652814146131277e-08, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 13: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -3605.706215974824, + "reference_value": -3605.7062159174166, + "rel_diff": 1.592123765449394e-11, + "abs_diff_nats": 5.740730557590723e-08, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 13: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -3605.7062167468175, + "reference_value": -3605.706215974824, + "rel_diff": 2.1410331528393165e-10, + "abs_diff_nats": 7.719936547800899e-07, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 13: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -3605.7062167202894, + "reference_value": -3605.7062159174166, + "rel_diff": 2.2266728646676658e-10, + "abs_diff_nats": 8.028728188946843e-07, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 14: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 11126.921475740786, + "reference_value": 11126.92147574079, + "rel_diff": 3.269528606832834e-16, + "abs_diff_nats": 3.637978807091713e-12, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 14: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 11126.921475785763, + "reference_value": 11126.921475785763, + "rel_diff": 0.0, + "abs_diff_nats": 0.0, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 14: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 11126.921475740786, + "reference_value": 11126.921475785763, + "rel_diff": 4.042118216611096e-12, + "abs_diff_nats": 4.497633199207485e-08, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 14: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 11126.92147574079, + "reference_value": 11126.921475785763, + "rel_diff": 4.041791263750414e-12, + "abs_diff_nats": 4.4972694013267756e-08, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 15: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 20410.343973733572, + "reference_value": 20410.34397373363, + "rel_diff": 2.851870648940346e-15, + "abs_diff_nats": 5.820766091346741e-11, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 15: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 20410.343973719955, + "reference_value": 20410.343973719544, + "rel_diff": 2.0141336458155093e-14, + "abs_diff_nats": 4.1109160520136356e-10, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 15: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 20410.343973733572, + "reference_value": 20410.343973719955, + "rel_diff": 6.671594899369292e-13, + "abs_diff_nats": 1.3616954674944282e-08, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 15: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 20410.34397373363, + "reference_value": 20410.343973719544, + "rel_diff": 6.901526970440401e-13, + "abs_diff_nats": 1.4086253941059113e-08, + "within_rtol": true, + "status": "RECORDED" + } + ], + "lanes_failed": 4, + "arm_rows": { + "vmap": { + "arm": "vmap", + "program": "jax.jit(jax.vmap(fn))", + "stands_for": "Nautilus(use_jax_vmap=True) \u2014 Fitness._vmap", + "hlo_source": "jax.jit(jax.vmap(fn)).lower(batched_tree) \u2014 the exact current Fitness._vmap composition (PyAutoFit#1638)", + "batch_wall_ms": 752.1205302000453, + "wall_production_nesting_ms": 752.1205302000453, + "wall_aot_command_buffers_on_ms": 752.9892208000092, + "wall_aot_command_buffers_off_ms": 753.1141911000304, + "command_buffer_delta_ms": 0.1249703000212321, + "production_nesting_vs_aot_on_delta_ms": -0.8686905999638839, + "production_nesting_vs_aot_on_delta_pct": -0.11536560895798062, + "wall_per_lane_ms": 47.00753313750283, + "wall_per_lane_command_buffers_off_ms": 47.0696369437519, + "traced_batch_wall_ms": 767.3282251998899, + "untraced_batch_wall_ms": 754.8854673001188, + "traced_wall_per_lane_ms": 47.958014074993116, + "callback_count_per_call": 16.0, + "callback_count_per_lane": 1.0, + "callback_expectation": "B per batched call \u2014 the qhull pure_callback is vmap_method='sequential'", + "host_qhull_ms": 71.24476080243767, + "host_tables_ms": 1.8442888955178205, + "host_qhull_ms_per_lane": 4.452797550152354, + "host_tables_ms_per_lane": 0.11526805596986378, + "host_callback_probe": { + "calls": 160, + "qhull_ms_total": 712.4476080243767, + "tables_ms_total": 18.442888955178205, + "total_ms_total": 730.8904969795549, + "qhull_ms_mean": 4.452797550152354, + "tables_ms_mean": 0.11526805596986378, + "total_ms_mean": 4.568065606122218, + "non_finite_calls": 0, + "n_points": [ + 1500 + ] + }, + "host_callback_records_first": [ + { + "n_points": 1500, + "qhull_ms": 4.6890009980415925, + "tables_ms": 0.19110900029772893, + "total_ms": 4.8801099983393215, + "finite": true + }, + { + "n_points": 1500, + "qhull_ms": 4.417472999193706, + "tables_ms": 0.11089899999205954, + "total_ms": 4.528371999185765, + "finite": true + }, + { + "n_points": 1500, + "qhull_ms": 4.406043000926729, + "tables_ms": 0.10991900126100518, + "total_ms": 4.5159620021877345, + "finite": true + }, + { + "n_points": 1500, + "qhull_ms": 4.457094000827055, + "tables_ms": 0.11845799963339232, + "total_ms": 4.575552000460448, + "finite": true + } + ], + "device_idle_ms": 104.49158350000005, + "device_idle_ms_per_lane": 6.530723968750003, + "trace": { + "parser": "ProfileData.from_file(xplane) + as_text() + stack_frame_index(proto field 17)", + "stage_audit": { + "chi_squared_evidence": [ + { + "instruction": "input_reduce_fusion.18", + "ms": 0.0151939, + "opcode": "fusion", + "shape": "f64[92,16]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_util.py:90", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_util.py:90 (chi_squared_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:87 (AbstractFit.chi_squared)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:293 (FitDataset.chi_squared)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:345 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)" + ] + }, + { + "instruction": "input_reduce_fusion.44", + "ms": 0.0040514, + "opcode": "fusion", + "shape": "f64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_util.py:104", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_util.py:104 (noise_normalization_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:98 (AbstractFit.noise_normalization)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:306 (FitDataset.noise_normalization)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:349 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)" + ] + }, + { + "instruction": "input_reduce_fusion.46", + "ms": 0.0022592, + "opcode": "fusion", + "shape": "f64[16]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_util.py:90", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_util.py:90 (chi_squared_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:87 (AbstractFit.chi_squared)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:293 (FitDataset.chi_squared)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:345 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)" + ] + } + ], + "psf_convolution_mapping_matrix": [ + { + "instruction": "input_scatter_fusion", + "ms": 32.2895165, + "opcode": "fusion", + "shape": "f64[16,1500,180,180]{3,2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "fft.29.0", + "ms": 28.3344094, + "opcode": "fft", + "shape": "f64[16,1500,180,180]{3,2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "fft.25.0", + "ms": 21.5615553, + "opcode": "fft", + "shape": "c128[16,1500,180,91]{3,2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "fft.27.0", + "ms": 15.516142199999997, + "opcode": "fft", + "shape": "c128[16,1500,91,180]{3,2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "input_transpose_fusion.2", + "ms": 8.438982, + "opcode": "fusion", + "shape": "c128[16,1500,91,180]{3,2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "wrapped_transpose", + "ms": 7.9173885, + "opcode": "fusion", + "shape": "c128[16,1500,180,91]{3,2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + } + ], + "mapping_matrix": [ + { + "instruction": "loop_broadcast_fusion.7", + "ms": 1.7026908, + "opcode": "fusion", + "shape": "f64[15361,16,1500]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:353", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:353 (mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/abstract.py:283 (Mapper.mapping_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:91 (AbstractInversionImaging._mapping_matrix_for_convolution_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:137 (AbstractInversionImaging.operated_mapping_matrix_list)" + ] + }, + { + "instruction": "input_scatter_fusion.3", + "ms": 0.052534599999999994, + "opcode": "fusion", + "shape": "f64[16,1500]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:71", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:71 (adaptive_pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/abstract.py:507 (Mapper.pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt.py:339 (Adapt.regularization_weights_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt_split.py:120 (AdaptSplit.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)" + ] + }, + { + "instruction": "input_reduce_fusion.47", + "ms": 0.0037729, + "opcode": "fusion", + "shape": "f64[16]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:93", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:93 (adaptive_pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/abstract.py:507 (Mapper.pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt.py:339 (Adapt.regularization_weights_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt_split.py:120 (AdaptSplit.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)" + ] + }, + { + "instruction": "loop_divide_fusion", + "ms": 0.0031872000000000003, + "opcode": "fusion", + "shape": "f64[16,1500]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:92", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:92 (adaptive_pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/abstract.py:507 (Mapper.pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt.py:339 (Adapt.regularization_weights_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt_split.py:120 (AdaptSplit.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)" + ] + } + ], + "other": [ + { + "instruction": "copy.105", + "ms": 0.047664199999999844, + "opcode": "copy", + "shape": "f64[1,16,1024,2]{3,2,1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "copy.107", + "ms": 0.032640200000000036, + "opcode": "copy", + "shape": "s32[1,3000,3]{2,1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "copy.108", + "ms": 0.032397, + "opcode": "copy", + "shape": "s32[1,3000,3]{2,1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "copy.109", + "ms": 0.03218270000000002, + "opcode": "copy", + "shape": "f64[1,1500,2]{2,1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "copy.106", + "ms": 0.029651300000000023, + "opcode": "copy", + "shape": "s32[1,1500]{1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "loop_broadcast_fusion.6", + "ms": 0.0029568, + "opcode": "fusion", + "shape": "(pred[16,21361]{1,0}, pred[16,21361]{1,0})", + "source": "", + "stack": [] + } + ], + "mesh_qhull_callback": [ + { + "instruction": "pure_callback.0", + "ms": 0.17187920000000026, + "opcode": "custom-call", + "shape": "(s32[3000,3]{1,0}, s32[3000,3]{1,0}, s32[1500]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:161", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:161 (_jax_delaunay_tables)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:405 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + }, + { + "instruction": "loop_add_fusion.1", + "ms": 0.024390599999999946, + "opcode": "fusion", + "shape": "s64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:161", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:161 (_jax_delaunay_tables)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:405 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + }, + { + "instruction": "loop_broadcast_fusion.3", + "ms": 0.0019904999999999996, + "opcode": "fusion", + "shape": "s32[16,1500]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:161", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:161 (_jax_delaunay_tables)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:405 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + } + ], + "mixed_fusion": [ + { + "instruction": "loop_divide_gather_fusion", + "ms": 17.3455473, + "opcode": "fusion", + "shape": "(f64[15361,16,1,1,1500]{4,3,2,1,0}, f64[15361,16,1,1,1500]{4,3,2,1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:133", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:133 (curvature_matrix_via_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:93 (InversionImagingMapping.curvature_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:389 (AbstractInversion.curvature_reg_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "input_add_multiply_transpose_fusion", + "ms": 1.6116155, + "opcode": "fusion", + "shape": "(f64[16,1500,1500]{2,1,0}, f64[16,1500,1500]{2,1,0}, f64[16,1500,1500]{2,1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:61", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:61 (initialize)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:72 (solve_nnls)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:129 (_solve_nnls_primal_with..primal)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:164 (solve_nnls_primal_with_status)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:508 (reconstruction_positive_only_from)" + ] + }, + { + "instruction": "input_transpose_fusion.3", + "ms": 0.43657850000000004, + "opcode": "fusion", + "shape": "f64[16,1500,1500]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986 (AbstractInversion._log_det_symmetric_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:1157 (AbstractInversion.log_det_regularization_matrix_term)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:348 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/model/analysis.py:135 (AnalysisImaging.log_likelihood_function)" + ] + }, + { + "instruction": "input_scatter_fusion.1", + "ms": 0.1452137, + "opcode": "fusion", + "shape": "f64[16,1500,1500]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:579", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:579 (pixel_splitted_regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt_split.py:137 (AdaptSplit.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:332 (AbstractInversion.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "input_scatter_fusion.2", + "ms": 0.0640675, + "opcode": "fusion", + "shape": "f64[16,1500]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:70", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:70 (adaptive_pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/abstract.py:507 (Mapper.pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt.py:339 (Adapt.regularization_weights_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt_split.py:120 (AdaptSplit.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)" + ] + }, + { + "instruction": "input_scatter_fusion.6", + "ms": 0.061084999999999993, + "opcode": "fusion", + "shape": "f64[15361,16,1500]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:353", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:353 (mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/abstract.py:283 (Mapper.mapping_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:91 (AbstractInversionImaging._mapping_matrix_for_convolution_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:137 (AbstractInversionImaging.operated_mapping_matrix_list)" + ] + } + ], + "ray_trace_data_grid": [ + { + "instruction": "input_reduce_fusion.29", + "ms": 0.0027744000000000007, + "opcode": "fusion", + "shape": "f64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:506", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:506 (FlatLambdaCDM._simpson_1d)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:644 (FlatLambdaCDM.angular_diameter_distance_kpc_z1z2)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:133 (LensingCosmology.angular_diameter_distance_to_earth_in_kpc_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:362 (LensingCosmology.scaling_factor_between_redshifts_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/lens/tracer_util.py:252 (traced_grid_2d_list_from)" + ] + }, + { + "instruction": "input_reduce_fusion.31", + "ms": 0.0027169000000000004, + "opcode": "fusion", + "shape": "f64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:506", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:506 (FlatLambdaCDM._simpson_1d)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:644 (FlatLambdaCDM.angular_diameter_distance_kpc_z1z2)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:151 (LensingCosmology.angular_diameter_distance_between_redshifts_in_kpc_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:355 (LensingCosmology.scaling_factor_between_redshifts_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/lens/tracer_util.py:252 (traced_grid_2d_list_from)" + ] + }, + { + "instruction": "input_reduce_fusion.32", + "ms": 0.0026016, + "opcode": "fusion", + "shape": "f64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:503", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:503 (FlatLambdaCDM._simpson_1d)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:644 (FlatLambdaCDM.angular_diameter_distance_kpc_z1z2)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:151 (LensingCosmology.angular_diameter_distance_between_redshifts_in_kpc_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:355 (LensingCosmology.scaling_factor_between_redshifts_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/lens/tracer_util.py:252 (traced_grid_2d_list_from)" + ] + }, + { + "instruction": "input_reduce_fusion.30", + "ms": 0.0025760000000000006, + "opcode": "fusion", + "shape": "f64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:503", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:503 (FlatLambdaCDM._simpson_1d)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:644 (FlatLambdaCDM.angular_diameter_distance_kpc_z1z2)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:133 (LensingCosmology.angular_diameter_distance_to_earth_in_kpc_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:362 (LensingCosmology.scaling_factor_between_redshifts_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/lens/tracer_util.py:252 (traced_grid_2d_list_from)" + ] + }, + { + "instruction": "loop_divide_fusion.1", + "ms": 0.0025504, + "opcode": "fusion", + "shape": "f64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:380", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:380 (LensingCosmology.scaling_factor_between_redshifts_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/lens/tracer_util.py:252 (traced_grid_2d_list_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/lens/tracer.py:632 (Tracer.traced_grid_2d_list_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/structures/decorators/abstract.py:93 (AbstractMaker.evaluate_func)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/structures/decorators/abstract.py:110 (AbstractMaker.result)" + ] + } + ], + "border_relocator": [ + { + "instruction": "custom-call.2", + "ms": 0.04217289999999999, + "opcode": "custom-call", + "shape": "(f64[16,2,2]{2,1,0}, s8[4194304]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:242", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:242 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:454 (BorderRelocator.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:176 (AbstractMesh.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:214 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "eigh.34", + "ms": 0.014585800000000001, + "opcode": "custom-call", + "shape": "(f64[16,2,2]{1,2,0}, f64[16,2]{1,0}, s32[16]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:245", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:245 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:454 (BorderRelocator.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:176 (AbstractMesh.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:214 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "loop_add_rsqrt_fusion", + "ms": 0.012931300000000001, + "opcode": "fusion", + "shape": "(f64[16,15361]{1,0}, f64[16,15361]{1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:311", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:311 (relocated_grid_via_ellipse_border_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:423 (BorderRelocator.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:83 (AbstractMesh.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:208 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "input_concatenate_fusion.7", + "ms": 0.008819200000000001, + "opcode": "fusion", + "shape": "f64[16,15361,2]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:323", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:323 (relocated_grid_via_ellipse_border_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:423 (BorderRelocator.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:83 (AbstractMesh.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:208 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "input_concatenate_fusion.9", + "ms": 0.0037696, + "opcode": "fusion", + "shape": "f64[16,1500,2]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:323", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:323 (relocated_grid_via_ellipse_border_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:458 (BorderRelocator.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:176 (AbstractMesh.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:214 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "loop_add_fusion.4", + "ms": 0.0036992000000000006, + "opcode": "fusion", + "shape": "f64[16,1500]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:308", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:308 (relocated_grid_via_ellipse_border_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:458 (BorderRelocator.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:176 (AbstractMesh.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:214 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + } + ], + "mesh_construction": [ + { + "instruction": "loop_compare_fusion.4", + "ms": 0.004681599999999999, + "opcode": "fusion", + "shape": "pred[16,6000,3]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:736", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:736 (DelaunayInterface.splitted_sizes)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:997 (InterpolatorDelaunay._mappings_sizes_weights_split)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt_split.py:124 (AdaptSplit.regularization_matrix_from)" + ] + }, + { + "instruction": "loop_transpose_fusion.1", + "ms": 0.0024575999999999995, + "opcode": "fusion", + "shape": "f64[16,1500,2]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:820", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:820 (InterpolatorDelaunay.mesh_grid_xy)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:847 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + }, + { + "instruction": "loop_multiply_fusion.4", + "ms": 0.002336, + "opcode": "fusion", + "shape": "f64[16,1500]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:412", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:412 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "mesh_seed_argmin": [ + { + "instruction": "input_reduce_fusion", + "ms": 1.3147235000000004, + "opcode": "fusion", + "shape": "(f64[16,1024]{1,0}, s64[16,1024]{1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:191", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:191 (_nearest_vertex_seed_from..argmin_chunk)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204 (_nearest_vertex_seed_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:351 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)" + ] + }, + { + "instruction": "loop_dynamic_update_slice_fusion", + "ms": 0.047932999999999816, + "opcode": "fusion", + "shape": "s32[21,16,1024]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204 (_nearest_vertex_seed_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:351 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "loop_add_fusion", + "ms": 0.03179209999999992, + "opcode": "fusion", + "shape": "s64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204 (_nearest_vertex_seed_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:351 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "loop_broadcast_fusion.4", + "ms": 0.0024608, + "opcode": "fusion", + "shape": "s32[21,16,1024]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204 (_nearest_vertex_seed_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:351 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "mesh_dual_areas": [ + { + "instruction": "input_scatter_fusion.9", + "ms": 0.0033984, + "opcode": "fusion", + "shape": "f64[16,1500]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:393", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:393 (_dual_areas_padded_jnp)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:408 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + }, + { + "instruction": "input_scatter_fusion.7", + "ms": 0.0033407999999999992, + "opcode": "fusion", + "shape": "f64[16,1500]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:393", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:393 (_dual_areas_padded_jnp)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:408 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + } + ], + "mesh_locate_walk": [ + { + "instruction": "loop_slice_subtract_fusion", + "ms": 0.29226370000000007, + "opcode": "fusion", + "shape": "(f64[16,21361,1]{2,1,0}, f64[16,21361,1]{2,1,0}, f64[16,21361,1]{2,1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:236", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:236 (_walk_from_seed..cross)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:250 (_walk_from_seed..weights_of)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:262 (_walk_from_seed..walk_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:292 (_walk_from_seed..body)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)" + ] + }, + { + "instruction": "loop_reduce_fusion", + "ms": 0.10811890000000002, + "opcode": "fusion", + "shape": "(f64[16,21361]{1,0}, s64[16,21361]{1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:264", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:264 (_walk_from_seed..walk_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:292 (_walk_from_seed..body)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:264 (_walk_from_seed..walk_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:292 (_walk_from_seed..body)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)" + ] + }, + { + "instruction": "loop_select_fusion", + "ms": 0.10122310000000004, + "opcode": "fusion", + "shape": "(pred[16,21361]{1,0}, pred[16,21361]{1,0}, s32[16,21361]{1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:353 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "loop_gather_fusion.1", + "ms": 0.0706945, + "opcode": "fusion", + "shape": "s32[341776,1,1,3]{3,2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:239", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:239 (_walk_from_seed..weights_of)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:262 (_walk_from_seed..walk_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:292 (_walk_from_seed..body)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:353 (pix_indexes_delaunay_walk_from)" + ] + }, + { + "instruction": "loop_gather_fusion", + "ms": 0.05425630000000002, + "opcode": "fusion", + "shape": "s32[341776,1,1,1]{3,2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:267", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:267 (_walk_from_seed..walk_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:292 (_walk_from_seed..body)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:353 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)" + ] + }, + { + "instruction": "input_concatenate_fusion.1", + "ms": 0.04155869999999998, + "opcode": "fusion", + "shape": "s32[16,21361,2]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:244", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:244 (_walk_from_seed..weights_of)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:262 (_walk_from_seed..walk_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:292 (_walk_from_seed..body)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:353 (pix_indexes_delaunay_walk_from)" + ] + } + ], + "regularization_H": [ + { + "instruction": "loop_broadcast_fusion", + "ms": 0.30042430000000003, + "opcode": "fusion", + "shape": "f64[16,1500,1500]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:579", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:579 (pixel_splitted_regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt_split.py:137 (AdaptSplit.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:332 (AbstractInversion.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "input_scatter_fusion.10", + "ms": 0.0028000000000000004, + "opcode": "fusion", + "shape": "f64[16,1500,1500]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:615", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:615 (pixel_splitted_regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt_split.py:137 (AdaptSplit.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:332 (AbstractInversion.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "curvature_matrix_F": [ + { + "instruction": "cublas-lt-matmul.2", + "ms": 66.9105534, + "opcode": "custom-call", + "shape": "(f64[16,1500,1500]{2,1,0}, s8[4194304]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:134", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:134 (curvature_matrix_via_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:93 (InversionImagingMapping.curvature_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:389 (AbstractInversion.curvature_reg_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "inversion_other": [ + { + "instruction": "cholesky.60", + "ms": 7.1283894000000565, + "opcode": "custom-call", + "shape": "(f64[16,1500,1500]{1,2,0}, s32[16]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986 (AbstractInversion._log_det_symmetric_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:1078 (AbstractInversion.log_det_curvature_reg_matrix_term)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:347 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/model/analysis.py:135 (AnalysisImaging.log_likelihood_function)" + ] + }, + { + "instruction": "cholesky.70", + "ms": 7.018967799999987, + "opcode": "custom-call", + "shape": "(f64[16,1500,1500]{1,2,0}, s32[16]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986 (AbstractInversion._log_det_symmetric_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:1157 (AbstractInversion.log_det_regularization_matrix_term)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:348 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/model/analysis.py:135 (AnalysisImaging.log_likelihood_function)" + ] + }, + { + "instruction": "input_reduce_fusion.27", + "ms": 0.169092, + "opcode": "fusion", + "shape": "f64[16,1500]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:946", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:946 (AbstractInversion.regularization_term)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:346 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/model/analysis.py:135 (AnalysisImaging.log_likelihood_function)", + "/mnt/ral/jnightin/autolens_profiling_wt/certified-solver-phase-c1-lane-rate/scripts/imaging/likelihood_breakdown/fixed_light_trace.py:1195 (_captured_likelihood_fn.._likelihood)" + ] + }, + { + "instruction": "input_reduce_fusion.22", + "ms": 0.0083072, + "opcode": "fusion", + "shape": "f64[16]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:985", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:985 (AbstractInversion._log_det_symmetric_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:1078 (AbstractInversion.log_det_curvature_reg_matrix_term)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:347 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/model/analysis.py:135 (AnalysisImaging.log_likelihood_function)" + ] + }, + { + "instruction": "input_reduce_fusion.21", + "ms": 0.0082435, + "opcode": "fusion", + "shape": "f64[16]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:985", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:985 (AbstractInversion._log_det_symmetric_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:1157 (AbstractInversion.log_det_regularization_matrix_term)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:348 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/model/analysis.py:135 (AnalysisImaging.log_likelihood_function)" + ] + }, + { + "instruction": "input_reduce_fusion.43", + "ms": 0.0053248, + "opcode": "fusion", + "shape": "f64[16]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:944", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:944 (AbstractInversion.regularization_term)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:346 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/model/analysis.py:135 (AnalysisImaging.log_likelihood_function)", + "/mnt/ral/jnightin/autolens_profiling_wt/certified-solver-phase-c1-lane-rate/scripts/imaging/likelihood_breakdown/fixed_light_trace.py:1195 (_captured_likelihood_fn.._likelihood)" + ] + } + ], + "pdip_solve": [ + { + "instruction": "cholesky.20", + "ms": 192.68626879995995, + "opcode": "custom-call", + "shape": "(f64[16,1500,1500]{1,2,0}, s32[16]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:106", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:106 (factorize_kkt)", + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:212 (pdip_pc_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:83 (solve_nnls)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:129 (_solve_nnls_primal_with..primal)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:164 (solve_nnls_primal_with_status)" + ] + }, + { + "instruction": "triangular-solve", + "ms": 54.51259210000317, + "opcode": "custom-call", + "shape": "(f64[16,1500,1]{1,2,0}, s8[256]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146 (solve_kkt_rhs)", + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:213 (pdip_pc_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:83 (solve_nnls)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:129 (_solve_nnls_primal_with..primal)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:164 (solve_nnls_primal_with_status)" + ] + }, + { + "instruction": "triangular-solve.2", + "ms": 50.17893129999953, + "opcode": "custom-call", + "shape": "(f64[16,1500,1]{1,2,0}, s8[256]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146 (solve_kkt_rhs)", + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:217 (pdip_pc_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:83 (solve_nnls)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:129 (_solve_nnls_primal_with..primal)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:164 (solve_nnls_primal_with_status)" + ] + }, + { + "instruction": "triangular-solve.3", + "ms": 49.353075700001405, + "opcode": "custom-call", + "shape": "(f64[16,1500,1]{1,2,0}, s8[256]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146 (solve_kkt_rhs)", + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:217 (pdip_pc_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:83 (solve_nnls)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:129 (_solve_nnls_primal_with..primal)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:164 (solve_nnls_primal_with_status)" + ] + }, + { + "instruction": "triangular-solve.1", + "ms": 48.945070000001365, + "opcode": "custom-call", + "shape": "(f64[16,1500,1]{1,2,0}, s8[256]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146 (solve_kkt_rhs)", + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:213 (pdip_pc_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:83 (solve_nnls)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:129 (_solve_nnls_primal_with..primal)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:164 (solve_nnls_primal_with_status)" + ] + }, + { + "instruction": "loop_add_fusion.2", + "ms": 10.710981900000005, + "opcode": "fusion", + "shape": "f64[16,1500,1500]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:107", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:107 (factorize_kkt)", + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:212 (pdip_pc_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:83 (solve_nnls)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:129 (_solve_nnls_primal_with..primal)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:164 (solve_nnls_primal_with_status)" + ] + } + ], + "data_vector_D": [ + { + "instruction": "input_reduce_fusion.19", + "ms": 1.9449486999999999, + "opcode": "fusion", + "shape": "f64[92,16,1500]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/inversion_imaging_util.py:123", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/inversion_imaging_util.py:123 (data_vector_via_blurred_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:67 (InversionImagingMapping.data_vector)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:699 (AbstractInversion.reconstruction)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "input_reduce_fusion.45", + "ms": 0.015552, + "opcode": "fusion", + "shape": "f64[16,1500]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/inversion_imaging_util.py:123", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/inversion_imaging_util.py:123 (data_vector_via_blurred_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:67 (InversionImagingMapping.data_vector)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:699 (AbstractInversion.reconstruction)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "mapped_reconstruction": [ + { + "instruction": "input_reduce_fusion.23", + "ms": 1.7459586000000002, + "opcode": "fusion", + "shape": "f64[15361,16]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:163", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:163 (mapped_reconstructed_data_via_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:120 (InversionImagingMapping._mapped_reconstructed_data_dict_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:196 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + } + ] + }, + "stage_audit_note": "The HLO instructions that contributed most of each stage's milliseconds, with their full source stack. A stage row is only as good as the rules that built it; this is how a reader checks a row against the HLO instead of trusting it.", + "untraced_wall_ms": 754.8854673001188, + "reconciliation_vs_untraced_pct": 1.568331848036606, + "wall_basis": "wall_ms is the TRACED run's wall, the run these kernel durations came from. untraced_wall_ms is the same executable without the profiler; the difference is the profiler's overhead and belongs in neither the stages nor the idle row.", + "calls": 10, + "call_split": "per-call (first-instruction recurrence)", + "call_blocks": 10, + "events": 222990, + "streams": [ + "Stream #14(MemcpyH2D,MemcpyD2D,Compute,MemcpyD2H)" + ], + "per_stage_ms": { + "border_relocator": { + "median_ms": 0.10747299999999997, + "min_ms": 0.10723299999999998, + "max_ms": 0.108161 + }, + "chi_squared_evidence": { + "median_ms": 0.0214405, + "min_ms": 0.021218, + "max_ms": 0.021984 + }, + "curvature_matrix_F": { + "median_ms": 66.9247895, + "min_ms": 66.383633, + "max_ms": 67.408864 + }, + "data_vector_D": { + "median_ms": 1.9590994999999998, + "min_ms": 1.9512070000000001, + "max_ms": 1.970191 + }, + "inversion_other": { + "median_ms": 14.301851000000006, + "min_ms": 14.042966999999994, + "max_ms": 14.797018999999999 + }, + "mapped_reconstruction": { + "median_ms": 1.746886, + "min_ms": 1.740102, + "max_ms": 1.752461 + }, + "mapping_matrix": { + "median_ms": 1.7595299999999998, + "min_ms": 1.755752, + "max_ms": 1.774663 + }, + "mesh_construction": { + "median_ms": 0.009488, + "min_ms": 0.009376, + "max_ms": 0.009536 + }, + "mesh_dual_areas": { + "median_ms": 0.006752, + "min_ms": 0.0066879999999999995, + "max_ms": 0.006784 + }, + "mesh_locate_walk": { + "median_ms": 0.862533, + "min_ms": 0.859811, + "max_ms": 0.867267 + }, + "mesh_qhull_callback": { + "median_ms": 0.19811250000000008, + "min_ms": 0.19734400000000002, + "max_ms": 0.19993699999999998 + }, + "mesh_seed_argmin": { + "median_ms": 1.3966954999999999, + "min_ms": 1.3900850000000002, + "max_ms": 1.4039090000000003 + }, + "mixed_fusion": { + "median_ms": 19.983020499999995, + "min_ms": 19.693801000000004, + "max_ms": 20.279307 + }, + "other": { + "median_ms": 0.19036849999999989, + "min_ms": 0.18992299999999984, + "max_ms": 0.19151999999999988 + }, + "pdip_solve": { + "median_ms": 434.4447084999864, + "min_ms": 433.3647849999802, + "max_ms": 437.58059599998387 + }, + "psf_convolution_mapping_matrix": { + "median_ms": 118.00395550000002, + "min_ms": 117.76141199999999, + "max_ms": 118.33052900000001 + }, + "ray_trace_data_grid": { + "median_ms": 0.013184000000000001, + "min_ms": 0.01312, + "max_ms": 0.013376 + }, + "regularization_H": { + "median_ms": 0.30310549999999997, + "min_ms": 0.29901, + "max_ms": 0.310082 + } + }, + "stage_order": [ + "ray_trace_data_grid", + "border_relocator", + "mesh_qhull_callback", + "mesh_seed_argmin", + "mesh_locate_walk", + "mesh_dual_areas", + "mesh_construction", + "mapping_matrix", + "psf_convolution_mapping_matrix", + "data_vector_D", + "curvature_matrix_F", + "regularization_H", + "pdip_solve", + "mapped_reconstruction", + "chi_squared_evidence", + "inversion_other", + "mixed_fusion", + "other" + ], + "mixed_fusion": { + "ms": 19.983020499999995, + "constituent_stage_sets": { + "curvature_matrix_F + psf_convolution_mapping_matrix": 17.3455473, + "curvature_reg_reduce_gather + inversion_other + mapped_reconstruction + pdip_solve + reconstruction_scatter + regularization_H": 1.6116155, + "inversion_other + regularization_H": 0.5983586999999999, + "inversion_other + mapping_matrix + mesh_construction + mesh_interpolation_weights": 0.0756996, + "mapping_matrix + mesh_interpolation_weights": 0.0640675, + "grids_and_structures + mass_profile_deflections + ray_trace_data_grid": 0.05337299999999999, + "inversion_other + mesh_construction + mesh_dual_areas + mesh_interpolation_weights": 0.023341, + "inversion_other + mesh_construction + mesh_dual_areas + mesh_interpolation_weights + regularization_H": 0.022755299999999996, + "inversion_other + mesh_construction + mesh_interpolation_weights": 0.0210688, + "inversion_other + mesh_dual_areas + mesh_locate_walk": 0.0118305, + "mesh_construction + regularization_H": 0.010937700000000002, + "mesh_locate_walk + mesh_seed_argmin": 0.0098433, + "mesh_seed_argmin + regularization_H": 0.009638400000000002, + "inversion_other + mapped_reconstruction + reconstruction_scatter": 0.009334400000000001, + "mesh_dual_areas + mesh_interpolation_weights": 0.0089537, + "inversion_other + mapped_reconstruction": 0.008796799999999999, + "inversion_other + mapped_reconstruction + reconstruction_scatter + regularization_H": 0.008483200000000002, + "inversion_other + pdip_solve + regularization_H": 0.0069632, + "mesh_dual_areas + mesh_interpolation_weights + regularization_H": 0.006540799999999999, + "inversion_other + ray_trace_data_grid": 0.004774400000000001, + "grids_and_structures + mass_profile_deflections": 0.0044481, + "mapping_matrix + regularization_H": 0.0040864, + "inversion_other + mesh_locate_walk + mesh_seed_argmin": 0.0038016000000000005, + "inversion_other + mesh_construction + mesh_interpolation_weights + regularization_H": 0.0033375999999999996, + "inversion_other + mesh_interpolation_weights": 0.0033248000000000006, + "inversion_other + mesh_construction + regularization_H": 0.0026784, + "chi_squared_evidence + inversion_other": 0.0023584, + "inversion_other + mapping_matrix": 0.00216 + }, + "example_kernels": { + "curvature_matrix_F + psf_convolution_mapping_matrix": [ + "loop_divide_gather_fusion" + ], + "curvature_reg_reduce_gather + inversion_other + mapped_reconstruction + pdip_solve + reconstruction_scatter + regularization_H": [ + "input_add_multiply_transpose_fusion" + ], + "inversion_other + regularization_H": [ + "input_reduce_fusion.42", + "input_reduce_fusion.35", + "input_reduce_fusion.36", + "input_reduce_fusion.37" + ], + "inversion_other + mapping_matrix + mesh_construction + mesh_interpolation_weights": [ + "loop_compare_fusion.3", + "input_scatter_fusion.6", + "input_concatenate_fusion.3" + ], + "mapping_matrix + mesh_interpolation_weights": [ + "input_scatter_fusion.2" + ], + "grids_and_structures + mass_profile_deflections + ray_trace_data_grid": [ + "loop_sqrt_fusion.1", + "loop_slice_fusion.3", + "loop_subtract_fusion.2", + "loop_sqrt_fusion" + ], + "inversion_other + mesh_construction + mesh_dual_areas + mesh_interpolation_weights": [ + "loop_abs_add_fusion" + ], + "inversion_other + mesh_construction + mesh_dual_areas + mesh_interpolation_weights + regularization_H": [ + "loop_abs_fusion", + "loop_convert_select_fusion" + ], + "inversion_other + mesh_construction + mesh_interpolation_weights": [ + "loop_slice_fusion.1", + "loop_slice_fusion" + ], + "inversion_other + mesh_dual_areas + mesh_locate_walk": [ + "input_concatenate_fusion.6", + "input_concatenate_fusion.5", + "loop_select_fusion.5", + "input_scatter_fusion.8" + ] + }, + "prorated_estimate_ms": { + "curvature_matrix_F": 8.67277365, + "psf_convolution_mapping_matrix": 8.67277365, + "inversion_other": 0.62931451, + "regularization_H": 0.5930135766666667, + "mapped_reconstruction": 0.27823325000000004, + "reconstruction_scatter": 0.27383485, + "pdip_solve": 0.27092365, + "curvature_reg_reduce_gather": 0.26860258333333337, + "mesh_interpolation_weights": 0.07752181, + "mapping_matrix": 0.05408185000000001, + "mesh_construction": 0.04353019333333333, + "mesh_dual_areas": 0.020986926666666666, + "ray_trace_data_grid": 0.020178199999999997, + "grids_and_structures": 0.02001505, + "mass_profile_deflections": 0.02001505, + "mesh_seed_argmin": 0.011008050000000002, + "mesh_locate_walk": 0.01013235, + "chi_squared_evidence": 0.0011792 + }, + "prorated_note": "ESTIMATE ONLY \u2014 a mixed fusion's time split equally across the stages its constituents span. Never summed into the measured table, never reconciled." + }, + "other_sources_ms": { + "copy.105": 0.047664199999999844, + "copy.107": 0.032640200000000036, + "copy.108": 0.032397, + "copy.109": 0.03218270000000002, + "copy.106": 0.029651300000000023, + "loop_broadcast_fusion.6": 0.0029568, + "loop_broadcast_fusion.2": 0.0026335999999999994, + "copy.76": 0.0023103999999999998, + "copy.104": 0.002272, + "loop_broadcast_fusion.9": 0.0022367999999999997, + "copy.37": 0.0021439999999999996, + "loop_broadcast_fusion.5": 0.0014079999999999997 + }, + "device_span_ms": 767.2261862, + "device_busy_ms": 662.7346027, + "device_idle_ms": 104.49158350000005, + "largest_idle_gaps": [ + { + "gap_ms": 5.400693, + "after": "pure_callback.0", + "before": "pure_callback.0" + }, + { + "gap_ms": 5.054899, + "after": "pure_callback.0", + "before": "pure_callback.0" + }, + { + "gap_ms": 4.881074, + "after": "pure_callback.0", + "before": "pure_callback.0" + }, + { + "gap_ms": 4.876243, + "after": "pure_callback.0", + "before": "pure_callback.0" + }, + { + "gap_ms": 4.865587, + "after": "pure_callback.0", + "before": "pure_callback.0" + }, + { + "gap_ms": 4.860627, + "after": "pure_callback.0", + "before": "pure_callback.0" + }, + { + "gap_ms": 4.845106, + "after": "pure_callback.0", + "before": "pure_callback.0" + }, + { + "gap_ms": 4.836915, + "after": "pure_callback.0", + "before": "pure_callback.0" + } + ], + "kernel_ms": 662.2329929999864, + "sum_ms": 766.7245764999865, + "wall_ms": 767.3282251998899, + "host_outside_span_ms": 0.10203899988982812, + "reconciliation_pct": -0.07866890335568237, + "unjoined_ms": 0.0, + "unjoined_pct": 0.0, + "other_ms": 0.19036849999999989, + "other_pct": 0.024809265937064763, + "note": "Stage rows attribute the command-buffers-OFF program (see the module docstring): kernel times are the same, the launch overhead the CUDA graphs remove is not. sum_ms = kernel rows + device_idle_ms; the residual against wall_ms is host_outside_span_ms (dispatch before the first kernel, teardown after the last).", + "per_stage_ms_per_lane": { + "border_relocator": 0.006717062499999998, + "chi_squared_evidence": 0.00134003125, + "curvature_matrix_F": 4.18279934375, + "data_vector_D": 0.12244371874999999, + "inversion_other": 0.8938656875000004, + "mapped_reconstruction": 0.109180375, + "mapping_matrix": 0.10997062499999999, + "mesh_construction": 0.000593, + "mesh_dual_areas": 0.000422, + "mesh_locate_walk": 0.0539083125, + "mesh_qhull_callback": 0.012382031250000005, + "mesh_seed_argmin": 0.08729346874999999, + "mixed_fusion": 1.2489387812499997, + "other": 0.011898031249999993, + "pdip_solve": 27.15279428124915, + "psf_convolution_mapping_matrix": 7.375247218750001, + "ray_trace_data_grid": 0.0008240000000000001, + "regularization_H": 0.018944093749999998 + }, + "per_lane_divisor": 16, + "host_callback": { + "pure_callback_span_ms": 83.8906656, + "qhull_ms": 73.22748900000002, + "callback_body_ms_note": "the OUTERMOST matching body event, not a sum: under the probe the body appears twice (the wrapper and the timed re-implementation it calls) and summing them would count the same work twice", + "events_by_name": { + "pure_callback.0": { + "count": 160, + "ms": 83.8906656 + }, + "$callback.py:815 _wrapped_callback": { + "count": 160, + "ms": 77.1702053 + }, + "$callback.py:224 _callback": { + "count": 160, + "ms": 76.80206680000003 + }, + "$callback.py:74 pure_callback_impl": { + "count": 160, + "ms": 76.63635840000003 + }, + "$callback.py:69 __call__": { + "count": 160, + "ms": 73.49709909999994 + }, + "$delaunay.py:162 ": { + "count": 160, + "ms": 73.38256719999998 + }, + "$host_callback_probe.py:225 wrapped": { + "count": 160, + "ms": 73.22748900000002 + }, + "$host_callback_probe.py:160 _timed_tri_only": { + "count": 160, + "ms": 73.10819069999998 + }, + "$callback.py:822 ": { + "count": 640, + "ms": 0.23173609999999903 + }, + "ThenExecuteCallback:GetEventForComputeStreamSyncPoint": { + "count": 10, + "ms": 0.0271619 + }, + "$__init__.py:132 _xla_gc_callback": { + "count": 2, + "ms": 0.00043900000000000005 + } + }, + "note": "HOST milliseconds per traced BATCH (the whole invocation), aggregated by name because the events nest. Not a row of the device table: the device pays for them as the idle gaps largest_idle_gaps names." + }, + "host_callback_ms": 83.8906656 + }, + "hlo_census": { + "status": "excluded", + "reason": "The legacy census anchors PyAutoArray source line numbers that moved after the phase-1 run. No batched attribution is published from unsupported anchors; the device-event table and wall reconciliation remain valid." + }, + "trace_split": { + "expected_calls": 10, + "executions_per_invocation": 1, + "method": "per-call (first-instruction recurrence)", + "note": "DECIDED IN CODE: the scalar arm's trace is split by trace_calls * B, so every lane's execution is its own block and the per-stage median is taken over all of them. The vmap arm's is split by trace_calls, one block per batched execution, and per_stage_ms_per_lane divides those rows by B." + } + }, + "scalar": { + "arm": "scalar", + "program": "jax.jit(fn), called B times", + "stands_for": "Nautilus(use_jax_vmap=False, use_jax_jit=True). Plain use_jax_vmap=False is UNJITTED and is NOT this arm", + "hlo_source": "jax.jit(fn).lower(lane_trees[0]) \u2014 the same program phase 1 traced", + "batch_wall_ms": 809.0416472998186, + "wall_production_nesting_ms": 809.0416472998186, + "wall_aot_command_buffers_on_ms": 808.6460623002495, + "wall_aot_command_buffers_off_ms": 816.1012223001308, + "command_buffer_delta_ms": 7.455159999881289, + "production_nesting_vs_aot_on_delta_ms": 0.39558499956910964, + "production_nesting_vs_aot_on_delta_pct": 0.048919424456707404, + "wall_per_lane_ms": 50.56510295623866, + "wall_per_lane_command_buffers_off_ms": 51.00632639375817, + "traced_batch_wall_ms": 840.1652683001885, + "untraced_batch_wall_ms": 815.9589383998537, + "traced_wall_per_lane_ms": 52.51032926876178, + "callback_count_per_call": 16.0, + "callback_count_per_lane": 1.0, + "callback_expectation": "1 per likelihood evaluation, B per batch", + "host_qhull_ms": 76.28499399907014, + "host_tables_ms": 1.9626227996923262, + "host_qhull_ms_per_lane": 4.767812124941884, + "host_tables_ms_per_lane": 0.12266392498077039, + "host_callback_probe": { + "calls": 160, + "qhull_ms_total": 762.8499399907014, + "tables_ms_total": 19.626227996923262, + "total_ms_total": 782.4761679876246, + "qhull_ms_mean": 4.767812124941884, + "tables_ms_mean": 0.12266392498077039, + "total_ms_mean": 4.890476049922654, + "non_finite_calls": 0, + "n_points": [ + 1500 + ] + }, + "host_callback_records_first": [ + { + "n_points": 1500, + "qhull_ms": 4.7203809990605805, + "tables_ms": 0.19024799985345453, + "total_ms": 4.910628998914035, + "finite": true + }, + { + "n_points": 1500, + "qhull_ms": 4.484843000682304, + "tables_ms": 0.13394800043897703, + "total_ms": 4.618791001121281, + "finite": true + }, + { + "n_points": 1500, + "qhull_ms": 4.5787719973304775, + "tables_ms": 0.12030900325044058, + "total_ms": 4.699081000580918, + "finite": true + }, + { + "n_points": 1500, + "qhull_ms": 4.963638999470277, + "tables_ms": 0.11594899842748418, + "total_ms": 5.079587997897761, + "finite": true + } + ], + "device_idle_ms": 7.718885418750006, + "device_idle_ms_per_lane": 7.718885418750006, + "trace": { + "parser": "ProfileData.from_file(xplane) + as_text() + stack_frame_index(proto field 17)", + "stage_audit": { + "chi_squared_evidence": [ + { + "instruction": "input_reduce_fusion.26", + "ms": 0.003917775, + "opcode": "fusion", + "shape": "f64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_util.py:104", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_util.py:104 (noise_normalization_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:98 (AbstractFit.noise_normalization)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:306 (FitDataset.noise_normalization)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:349 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)" + ] + }, + { + "instruction": "input_reduce_fusion.28", + "ms": 0.0037747749999999915, + "opcode": "fusion", + "shape": "f64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_util.py:90", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_util.py:90 (chi_squared_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:87 (AbstractFit.chi_squared)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:293 (FitDataset.chi_squared)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:345 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)" + ] + }, + { + "instruction": "loop_multiply_fusion.2", + "ms": 0.003001168749999995, + "opcode": "fusion", + "shape": "f64[15361]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/abstract_ndarray.py:300", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/abstract_ndarray.py:300 (AbstractNDArray.__pow__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/abstract_ndarray.py:60 (unwrap_array..wrapper)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/abstract_ndarray.py:35 (to_new_array..wrapper)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_util.py:78 (chi_squared_map_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:78 (AbstractFit.chi_squared_map)" + ] + } + ], + "psf_convolution_mapping_matrix": [ + { + "instruction": "input_scatter_fusion", + "ms": 1.9838513812500007, + "opcode": "fusion", + "shape": "f64[1500,180,180]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "fft.19.0", + "ms": 1.76107434375, + "opcode": "fft", + "shape": "f64[1500,180,180]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "fft.15.0", + "ms": 1.3677336124999995, + "opcode": "fft", + "shape": "c128[1500,180,91]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "fft.17.0", + "ms": 0.9792066249999994, + "opcode": "fft", + "shape": "c128[1500,91,180]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "input_transpose_fusion.1", + "ms": 0.5137675937500001, + "opcode": "fusion", + "shape": "c128[1500,91,180]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "wrapped_transpose", + "ms": 0.4998541, + "opcode": "fusion", + "shape": "c128[1500,180,91]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + } + ], + "mapping_matrix": [ + { + "instruction": "loop_broadcast_fusion.2", + "ms": 0.11097046250000002, + "opcode": "fusion", + "shape": "f64[15361,1500]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:342", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:342 (mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/abstract.py:283 (Mapper.mapping_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:91 (AbstractInversionImaging._mapping_matrix_for_convolution_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:137 (AbstractInversionImaging.operated_mapping_matrix_list)" + ] + }, + { + "instruction": "input_reduce_fusion.29", + "ms": 0.002914968749999992, + "opcode": "fusion", + "shape": "f64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:93", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:93 (adaptive_pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/abstract.py:507 (Mapper.pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt.py:339 (Adapt.regularization_weights_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt_split.py:120 (AdaptSplit.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)" + ] + }, + { + "instruction": "loop_divide_fusion", + "ms": 0.002381581250000002, + "opcode": "fusion", + "shape": "f64[1500]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:92", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:92 (adaptive_pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/abstract.py:507 (Mapper.pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt.py:339 (Adapt.regularization_weights_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt_split.py:120 (AdaptSplit.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)" + ] + } + ], + "mixed_fusion": [ + { + "instruction": "loop_divide_gather_fusion", + "ms": 1.0180024062500006, + "opcode": "fusion", + "shape": "(f64[15361,1,1,1500]{3,2,1,0}, f64[15361,1,1,1500]{3,2,1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:133", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:133 (curvature_matrix_via_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:93 (InversionImagingMapping.curvature_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:389 (AbstractInversion.curvature_reg_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "input_add_multiply_transpose_fusion", + "ms": 0.06093762499999998, + "opcode": "fusion", + "shape": "(f64[1500,1500]{1,0}, f64[1500,1500]{1,0}, f64[1500,1500]{1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:61", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:61 (initialize)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:72 (solve_nnls)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:129 (_solve_nnls_primal_with..primal)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:164 (solve_nnls_primal_with_status)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:508 (reconstruction_positive_only_from)" + ] + }, + { + "instruction": "input_transpose_fusion.3", + "ms": 0.024325706249999992, + "opcode": "fusion", + "shape": "f64[1500,1500]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986 (AbstractInversion._log_det_symmetric_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:1157 (AbstractInversion.log_det_regularization_matrix_term)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:348 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/model/analysis.py:135 (AnalysisImaging.log_likelihood_function)" + ] + }, + { + "instruction": "input_scatter_fusion.2", + "ms": 0.016327875000000002, + "opcode": "fusion", + "shape": "f64[1500,1500]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:579", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:579 (pixel_splitted_regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt_split.py:137 (AdaptSplit.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:332 (AbstractInversion.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "input_scatter_fusion.3", + "ms": 0.014850712500000003, + "opcode": "fusion", + "shape": "f64[1500]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:70", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:70 (adaptive_pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/abstract.py:507 (Mapper.pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt.py:339 (Adapt.regularization_weights_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt_split.py:120 (AdaptSplit.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)" + ] + }, + { + "instruction": "loop_abs_fusion", + "ms": 0.014794250000000004, + "opcode": "fusion", + "shape": "(f64[6000,1]{1,0}, f64[6000,1]{1,0}, f64[6000,1]{1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:613", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:613 (triangle_area_xp)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:657 (pixel_weights_delaunay_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:982 (InterpolatorDelaunay._mappings_sizes_weights_split)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt_split.py:124 (AdaptSplit.regularization_matrix_from)" + ] + } + ], + "ray_trace_data_grid": [ + { + "instruction": "input_reduce_fusion.18", + "ms": 0.003240987500000005, + "opcode": "fusion", + "shape": "f64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:506", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:506 (FlatLambdaCDM._simpson_1d)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:644 (FlatLambdaCDM.angular_diameter_distance_kpc_z1z2)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:133 (LensingCosmology.angular_diameter_distance_to_earth_in_kpc_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:362 (LensingCosmology.scaling_factor_between_redshifts_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/lens/tracer_util.py:252 (traced_grid_2d_list_from)" + ] + }, + { + "instruction": "input_reduce_fusion.20", + "ms": 0.002768362500000002, + "opcode": "fusion", + "shape": "f64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:506", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:506 (FlatLambdaCDM._simpson_1d)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:644 (FlatLambdaCDM.angular_diameter_distance_kpc_z1z2)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:151 (LensingCosmology.angular_diameter_distance_between_redshifts_in_kpc_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:355 (LensingCosmology.scaling_factor_between_redshifts_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/lens/tracer_util.py:252 (traced_grid_2d_list_from)" + ] + }, + { + "instruction": "input_reduce_fusion.19", + "ms": 0.0026012000000000058, + "opcode": "fusion", + "shape": "f64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:503", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:503 (FlatLambdaCDM._simpson_1d)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:644 (FlatLambdaCDM.angular_diameter_distance_kpc_z1z2)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:133 (LensingCosmology.angular_diameter_distance_to_earth_in_kpc_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:362 (LensingCosmology.scaling_factor_between_redshifts_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/lens/tracer_util.py:252 (traced_grid_2d_list_from)" + ] + }, + { + "instruction": "input_reduce_fusion.21", + "ms": 0.0025914000000000054, + "opcode": "fusion", + "shape": "f64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:503", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:503 (FlatLambdaCDM._simpson_1d)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:644 (FlatLambdaCDM.angular_diameter_distance_kpc_z1z2)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:151 (LensingCosmology.angular_diameter_distance_between_redshifts_in_kpc_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:355 (LensingCosmology.scaling_factor_between_redshifts_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/lens/tracer_util.py:252 (traced_grid_2d_list_from)" + ] + }, + { + "instruction": "loop_divide_fusion.1", + "ms": 0.0025315812500000014, + "opcode": "fusion", + "shape": "f64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:380", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:380 (LensingCosmology.scaling_factor_between_redshifts_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/lens/tracer_util.py:252 (traced_grid_2d_list_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/lens/tracer.py:632 (Tracer.traced_grid_2d_list_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/structures/decorators/abstract.py:93 (AbstractMaker.evaluate_func)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/structures/decorators/abstract.py:110 (AbstractMaker.result)" + ] + } + ], + "border_relocator": [ + { + "instruction": "eigh.45", + "ms": 0.07483110624999999, + "opcode": "custom-call", + "shape": "(f64[2,2]{0,1}, f64[2]{0}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:245", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:245 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:454 (BorderRelocator.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:176 (AbstractMesh.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:214 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "custom-call.2", + "ms": 0.007959975, + "opcode": "custom-call", + "shape": "(f64[2,2]{1,0}, s8[4194304]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:242", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:242 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:454 (BorderRelocator.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:176 (AbstractMesh.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:214 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "input_reduce_fusion.15", + "ms": 0.005811374999999996, + "opcode": "fusion", + "shape": "(f64[], f64[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:269", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:269 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:454 (BorderRelocator.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:176 (AbstractMesh.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:214 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "loop_select_sine_fusion", + "ms": 0.0036667749999999906, + "opcode": "fusion", + "shape": "(f64[], f64[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:301", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:301 (relocated_grid_via_ellipse_border_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:458 (BorderRelocator.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:176 (AbstractMesh.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:214 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "input_concatenate_fusion.3", + "ms": 0.0036359687499999986, + "opcode": "fusion", + "shape": "f64[15361,2]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:323", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:323 (relocated_grid_via_ellipse_border_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:423 (BorderRelocator.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:83 (AbstractMesh.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:208 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "loop_add_fusion.5", + "ms": 0.0035445687500000028, + "opcode": "fusion", + "shape": "f64[15361]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:308", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:308 (relocated_grid_via_ellipse_border_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:423 (BorderRelocator.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:83 (AbstractMesh.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:208 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + } + ], + "mesh_construction": [ + { + "instruction": "input_concatenate_fusion.7", + "ms": 0.002053781250000004, + "opcode": "fusion", + "shape": "f64[1500,2]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:820", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:820 (InterpolatorDelaunay.mesh_grid_xy)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:847 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + } + ], + "mesh_qhull_callback": [ + { + "instruction": "pure_callback.4", + "ms": 0.010638512500000029, + "opcode": "custom-call", + "shape": "(s32[3000,3]{1,0}, s32[3000,3]{1,0}, s32[1500]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:161", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:161 (_jax_delaunay_tables)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:405 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + } + ], + "other": [ + { + "instruction": "copy.72", + "ms": 0.042004900000001816, + "opcode": "copy", + "shape": "f64[1,1024,2]{2,1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "copy.35", + "ms": 0.017002456250000093, + "opcode": "copy", + "shape": "s32[21361]{0}", + "source": "", + "stack": [] + }, + { + "instruction": "copy.40", + "ms": 0.0019799687500000017, + "opcode": "copy", + "shape": "s64[1500]{0}", + "source": "", + "stack": [] + }, + { + "instruction": "loop_broadcast_fusion.1", + "ms": 0.0019762125000000034, + "opcode": "fusion", + "shape": "(pred[21361]{0}, pred[21361]{0})", + "source": "", + "stack": [] + }, + { + "instruction": "copy.71", + "ms": 0.0018016062500000013, + "opcode": "copy", + "shape": "s32[]", + "source": "", + "stack": [] + }, + { + "instruction": "loop_broadcast_fusion.4", + "ms": 0.0017822062499999992, + "opcode": "fusion", + "shape": "(f64[1500]{0}, f64[1500]{0}, f64[1500]{0}, f64[1500]{0})", + "source": "", + "stack": [] + } + ], + "mesh_seed_argmin": [ + { + "instruction": "input_reduce_fusion", + "ms": 0.15269622500000266, + "opcode": "fusion", + "shape": "(f64[1024]{0}, s64[1024]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:191", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:191 (_nearest_vertex_seed_from..argmin_chunk)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204 (_nearest_vertex_seed_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:351 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)" + ] + }, + { + "instruction": "loop_dynamic_update_slice_fusion", + "ms": 0.04129490624999953, + "opcode": "fusion", + "shape": "s32[21,1024]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204 (_nearest_vertex_seed_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:351 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "loop_add_fusion", + "ms": 0.03184760624999863, + "opcode": "fusion", + "shape": "s64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204 (_nearest_vertex_seed_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:351 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "loop_broadcast_fusion", + "ms": 0.001955412499999998, + "opcode": "fusion", + "shape": "s32[21,1024]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204 (_nearest_vertex_seed_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:351 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "regularization_H": [ + { + "instruction": "loop_select_fusion.3", + "ms": 0.020070875000000002, + "opcode": "fusion", + "shape": "f64[1500,1500]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:549", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:549 (pixel_splitted_regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt_split.py:137 (AdaptSplit.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:332 (AbstractInversion.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "input_scatter_fusion.10", + "ms": 0.0020686000000000007, + "opcode": "fusion", + "shape": "f64[1500,1500]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:615", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:615 (pixel_splitted_regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt_split.py:137 (AdaptSplit.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:332 (AbstractInversion.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "input_concatenate_fusion.8", + "ms": 0.0018732062500000017, + "opcode": "fusion", + "shape": "pred[3]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:93", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:93 (split_points_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:410 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + }, + { + "instruction": "input_concatenate_fusion.9", + "ms": 0.0018491749999999991, + "opcode": "fusion", + "shape": "pred[3]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:91", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:91 (split_points_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:410 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + }, + { + "instruction": "input_concatenate_fusion.10", + "ms": 0.001846981249999998, + "opcode": "fusion", + "shape": "pred[3]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:90", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:90 (split_points_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:410 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + }, + { + "instruction": "input_concatenate_fusion", + "ms": 0.0017675999999999992, + "opcode": "fusion", + "shape": "s32[1500,2]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:615", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:615 (pixel_splitted_regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt_split.py:137 (AdaptSplit.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:332 (AbstractInversion.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "mesh_locate_walk": [ + { + "instruction": "loop_reduce_fusion", + "ms": 0.02580061874999997, + "opcode": "fusion", + "shape": "(f64[21361]{0}, s64[21361]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:264", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:264 (_walk_from_seed..walk_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:292 (_walk_from_seed..body)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:264 (_walk_from_seed..walk_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:292 (_walk_from_seed..body)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)" + ] + }, + { + "instruction": "input_reduce_fusion.1", + "ms": 0.025136112500000016, + "opcode": "fusion", + "shape": "pred[196]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:288", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:288 (_walk_from_seed..cond)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:353 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)" + ] + }, + { + "instruction": "loop_or_select_fusion", + "ms": 0.023382499999999754, + "opcode": "fusion", + "shape": "(s32[21361]{0}, pred[21361]{0}, pred[21361]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:270", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:270 (_walk_from_seed..walk_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:292 (_walk_from_seed..body)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:353 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)" + ] + }, + { + "instruction": "loop_select_fusion", + "ms": 0.020160456249999886, + "opcode": "fusion", + "shape": "s32[21361]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:242", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:242 (_walk_from_seed..weights_of)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:262 (_walk_from_seed..walk_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:292 (_walk_from_seed..body)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:353 (pix_indexes_delaunay_walk_from)" + ] + }, + { + "instruction": "input_reduce_fusion.2", + "ms": 0.01623728750000017, + "opcode": "fusion", + "shape": "pred[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:288", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:288 (_walk_from_seed..cond)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:353 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)" + ] + }, + { + "instruction": "while.22", + "ms": 0.014526274999999767, + "opcode": "while", + "shape": "(s32[], s32[21361]{0}, pred[21361]{0}, pred[21361]{0}, s32[3000,3]{1,0}, /*index=5*/f64[1500,2]{1,0}, f64[21361,2]{1,0}, s32[3000,3]{1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:353 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "data_vector_D": [ + { + "instruction": "input_reduce_fusion.10", + "ms": 0.12160307499999996, + "opcode": "fusion", + "shape": "f64[92,1500]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/inversion_imaging_util.py:123", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/inversion_imaging_util.py:123 (data_vector_via_blurred_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:67 (InversionImagingMapping.data_vector)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:699 (AbstractInversion.reconstruction)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "input_reduce_fusion.27", + "ms": 0.0036965937499999963, + "opcode": "fusion", + "shape": "f64[1500]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/inversion_imaging_util.py:123", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/inversion_imaging_util.py:123 (data_vector_via_blurred_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:67 (InversionImagingMapping.data_vector)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:699 (AbstractInversion.reconstruction)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "inversion_other": [ + { + "instruction": "cholesky.60", + "ms": 0.8938812312500021, + "opcode": "custom-call", + "shape": "(f64[1500,1500]{0,1}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986 (AbstractInversion._log_det_symmetric_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:1078 (AbstractInversion.log_det_curvature_reg_matrix_term)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:347 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/model/analysis.py:135 (AnalysisImaging.log_likelihood_function)" + ] + }, + { + "instruction": "cholesky.70", + "ms": 0.8923673750000006, + "opcode": "custom-call", + "shape": "(f64[1500,1500]{0,1}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986 (AbstractInversion._log_det_symmetric_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:1157 (AbstractInversion.log_det_regularization_matrix_term)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:348 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/model/analysis.py:135 (AnalysisImaging.log_likelihood_function)" + ] + }, + { + "instruction": "input_reduce_fusion.17", + "ms": 0.01297495625, + "opcode": "fusion", + "shape": "f64[1500]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:946", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:946 (AbstractInversion.regularization_term)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:346 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/model/analysis.py:135 (AnalysisImaging.log_likelihood_function)", + "/mnt/ral/jnightin/autolens_profiling_wt/certified-solver-phase-c1-lane-rate/scripts/imaging/likelihood_breakdown/fixed_light_trace.py:1195 (_captured_likelihood_fn.._likelihood)" + ] + }, + { + "instruction": "loop_reduce_window_fusion", + "ms": 0.002881393749999993, + "opcode": "fusion", + "shape": "s64[6,16]{1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "loop_reduce_window_fusion.1", + "ms": 0.0027907937500000002, + "opcode": "fusion", + "shape": "s64[94,16]{1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "input_reduce_fusion.25", + "ms": 0.00266678125, + "opcode": "fusion", + "shape": "f64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:944", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:944 (AbstractInversion.regularization_term)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:346 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/model/analysis.py:135 (AnalysisImaging.log_likelihood_function)", + "/mnt/ral/jnightin/autolens_profiling_wt/certified-solver-phase-c1-lane-rate/scripts/imaging/likelihood_breakdown/fixed_light_trace.py:1195 (_captured_likelihood_fn.._likelihood)" + ] + } + ], + "curvature_matrix_F": [ + { + "instruction": "cublas-lt-matmul.2", + "ms": 4.26782450625, + "opcode": "custom-call", + "shape": "(f64[1500,1500]{1,0}, s8[4194304]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:134", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:134 (curvature_matrix_via_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:93 (InversionImagingMapping.curvature_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:389 (AbstractInversion.curvature_reg_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "pdip_solve": [ + { + "instruction": "cholesky.20", + "ms": 16.14834093749997, + "opcode": "custom-call", + "shape": "(f64[1500,1500]{0,1}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:106", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:106 (factorize_kkt)", + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:212 (pdip_pc_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:83 (solve_nnls)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:129 (_solve_nnls_primal_with..primal)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:164 (solve_nnls_primal_with_status)" + ] + }, + { + "instruction": "triangular-solve", + "ms": 2.571473356250029, + "opcode": "custom-call", + "shape": "(f64[1500,1]{0,1}, s8[0]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146 (solve_kkt_rhs)", + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:213 (pdip_pc_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:83 (solve_nnls)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:129 (_solve_nnls_primal_with..primal)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:164 (solve_nnls_primal_with_status)" + ] + }, + { + "instruction": "triangular-solve.2", + "ms": 2.5177017312498977, + "opcode": "custom-call", + "shape": "(f64[1500,1]{0,1}, s8[0]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146 (solve_kkt_rhs)", + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:217 (pdip_pc_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:83 (solve_nnls)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:129 (_solve_nnls_primal_with..primal)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:164 (solve_nnls_primal_with_status)" + ] + }, + { + "instruction": "triangular-solve.3", + "ms": 2.440972899999916, + "opcode": "custom-call", + "shape": "(f64[1500,1]{0,1}, s8[0]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146 (solve_kkt_rhs)", + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:217 (pdip_pc_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:83 (solve_nnls)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:129 (_solve_nnls_primal_with..primal)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:164 (solve_nnls_primal_with_status)" + ] + }, + { + "instruction": "triangular-solve.1", + "ms": 2.3317068874999007, + "opcode": "custom-call", + "shape": "(f64[1500,1]{0,1}, s8[0]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146 (solve_kkt_rhs)", + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:213 (pdip_pc_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:83 (solve_nnls)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:129 (_solve_nnls_primal_with..primal)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:164 (solve_nnls_primal_with_status)" + ] + }, + { + "instruction": "cholesky.40", + "ms": 0.8640322062500013, + "opcode": "custom-call", + "shape": "(f64[1500,1500]{0,1}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:62", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:62 (initialize)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:72 (solve_nnls)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:129 (_solve_nnls_primal_with..primal)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:164 (solve_nnls_primal_with_status)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:508 (reconstruction_positive_only_from)" + ] + } + ], + "mapped_reconstruction": [ + { + "instruction": "input_reduce_fusion.14", + "ms": 0.11515689999999999, + "opcode": "fusion", + "shape": "f64[15361]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:163", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:163 (mapped_reconstructed_data_via_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:120 (InversionImagingMapping._mapped_reconstructed_data_dict_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:196 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + } + ] + }, + "stage_audit_note": "The HLO instructions that contributed most of each stage's milliseconds, with their full source stack. A stage row is only as good as the rules that built it; this is how a reader checks a row against the HLO instead of trusting it.", + "untraced_wall_ms": 50.99743364999085, + "reconciliation_vs_untraced_pct": -0.5315860266644271, + "wall_basis": "wall_ms is the TRACED run's wall, the run these kernel durations came from. untraced_wall_ms is the same executable without the profiler; the difference is the profiler's overhead and belongs in neither the stages nor the idle row.", + "calls": 160, + "call_split": "per-call (first-instruction recurrence)", + "call_blocks": 160, + "events": 153930, + "streams": [ + "Stream #14(Memset,MemcpyD2H,Compute,MemcpyH2D,MemcpyD2D)" + ], + "per_stage_ms": { + "border_relocator": { + "median_ms": 0.11510500000000001, + "min_ms": 0.11436500000000002, + "max_ms": 0.116032 + }, + "chi_squared_evidence": { + "median_ms": 0.010688, + "min_ms": 0.010336000000000001, + "max_ms": 0.011296 + }, + "curvature_matrix_F": { + "median_ms": 4.267072, + "min_ms": 4.247425, + "max_ms": 4.332549 + }, + "data_vector_D": { + "median_ms": 0.12534099999999998, + "min_ms": 0.12447799999999999, + "max_ms": 0.12595299999999998 + }, + "inversion_other": { + "median_ms": 1.818591, + "min_ms": 1.8023280000000002, + "max_ms": 1.830704 + }, + "mapped_reconstruction": { + "median_ms": 0.115169, + "min_ms": 0.114593, + "max_ms": 0.115873 + }, + "mapping_matrix": { + "median_ms": 0.11622199999999999, + "min_ms": 0.115454, + "max_ms": 0.117345 + }, + "memset": { + "median_ms": 0.048959000000000016, + "min_ms": 0.04032000000000001, + "max_ms": 0.08275200000000003 + }, + "mesh_construction": { + "median_ms": 0.002048, + "min_ms": 0.002016, + "max_ms": 0.00208 + }, + "mesh_locate_walk": { + "median_ms": 0.15027249999999998, + "min_ms": 0.132226, + "max_ms": 0.18601800000000013 + }, + "mesh_qhull_callback": { + "median_ms": 0.010592, + "min_ms": 0.010496000000000002, + "max_ms": 0.011072 + }, + "mesh_seed_argmin": { + "median_ms": 0.2277760000000001, + "min_ms": 0.22751300000000008, + "max_ms": 0.2281290000000001 + }, + "mixed_fusion": { + "median_ms": 1.2594120000000002, + "min_ms": 1.253861, + "max_ms": 1.263404 + }, + "other": { + "median_ms": 0.07148649999999998, + "min_ms": 0.069149, + "max_ms": 0.07616 + }, + "pdip_solve": { + "median_ms": 27.291537000000034, + "min_ms": 22.702046000000006, + "max_ms": 47.42273900000002 + }, + "psf_convolution_mapping_matrix": { + "median_ms": 7.332478000000001, + "min_ms": 7.310459000000001, + "max_ms": 7.347292 + }, + "ray_trace_data_grid": { + "median_ms": 0.013696000000000002, + "min_ms": 0.013599, + "max_ms": 0.014079000000000001 + }, + "regularization_H": { + "median_ms": 0.031008, + "min_ms": 0.030431, + "max_ms": 0.031808 + } + }, + "stage_order": [ + "ray_trace_data_grid", + "border_relocator", + "mesh_qhull_callback", + "mesh_seed_argmin", + "mesh_locate_walk", + "mesh_construction", + "mapping_matrix", + "psf_convolution_mapping_matrix", + "data_vector_D", + "curvature_matrix_F", + "regularization_H", + "pdip_solve", + "mapped_reconstruction", + "chi_squared_evidence", + "inversion_other", + "mixed_fusion", + "other", + "memset" + ], + "mixed_fusion": { + "ms": 1.2594120000000002, + "constituent_stage_sets": { + "curvature_matrix_F + psf_convolution_mapping_matrix": 1.0180024062500006, + "curvature_reg_reduce_gather + inversion_other + mapped_reconstruction + pdip_solve + reconstruction_scatter + regularization_H": 0.06093762499999998, + "inversion_other + regularization_H": 0.0295624375000001, + "inversion_other + mesh_construction + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin + regularization_H": 0.021517068749999972, + "inversion_other + mapping_matrix + mesh_construction + mesh_dual_areas + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin": 0.0213614625, + "inversion_other + mesh_construction + mesh_dual_areas + mesh_interpolation_weights + regularization_H": 0.014794250000000004, + "grids_and_structures + mass_profile_deflections + ray_trace_data_grid": 0.014543493750000004, + "inversion_other + mapping_matrix + mesh_construction + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin": 0.011769274999999997, + "grids_and_structures + mass_profile_deflections": 0.010189981249999994, + "inversion_other + mesh_dual_areas + mesh_locate_walk": 0.00937176250000002, + "inversion_other + mesh_construction + mesh_seed_argmin + regularization_H": 0.007327943749999996, + "inversion_other + mesh_construction + regularization_H": 0.00661453749999999, + "inversion_other + ray_trace_data_grid": 0.0053681687500000035, + "inversion_other + mapped_reconstruction + pdip_solve + reconstruction_scatter": 0.004833356250000001, + "inversion_other + mapped_reconstruction": 0.0037823749999999954, + "mapping_matrix + regularization_H": 0.0034730125, + "inversion_other + mesh_construction + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin": 0.003182962499999998, + "inversion_other + mesh_construction + mesh_dual_areas + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin": 0.002953393749999999, + "inversion_other + pdip_solve": 0.0028459687499999987, + "inversion_other + mesh_locate_walk + mesh_seed_argmin": 0.0025221812499999965, + "inversion_other + mesh_interpolation_weights": 0.002148206250000002, + "chi_squared_evidence + inversion_other": 0.0019078125000000007 + }, + "example_kernels": { + "curvature_matrix_F + psf_convolution_mapping_matrix": [ + "loop_divide_gather_fusion" + ], + "curvature_reg_reduce_gather + inversion_other + mapped_reconstruction + pdip_solve + reconstruction_scatter + regularization_H": [ + "input_add_multiply_transpose_fusion" + ], + "inversion_other + regularization_H": [ + "loop_reduce_slice_fusion", + "loop_reduce_fusion.1", + "loop_reduce_fusion.2", + "input_transpose_fusion.3" + ], + "inversion_other + mesh_construction + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin + regularization_H": [ + "input_reduce_fusion.24", + "loop_select_fusion.4", + "input_scatter_fusion.2" + ], + "inversion_other + mapping_matrix + mesh_construction + mesh_dual_areas + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin": [ + "input_scatter_fusion.6", + "input_scatter_fusion.3" + ], + "inversion_other + mesh_construction + mesh_dual_areas + mesh_interpolation_weights + regularization_H": [ + "loop_abs_fusion" + ], + "grids_and_structures + mass_profile_deflections + ray_trace_data_grid": [ + "loop_subtract_fusion.2", + "loop_subtract_fusion.1" + ], + "inversion_other + mapping_matrix + mesh_construction + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin": [ + "input_scatter_fusion.4" + ], + "grids_and_structures + mass_profile_deflections": [ + "loop_divide_minimum_multiply_sine_sqrt_fusion", + "loop_slice_fusion" + ], + "inversion_other + mesh_dual_areas + mesh_locate_walk": [ + "loop_select_fusion.6", + "input_scatter_fusion.9", + "input_scatter_fusion.8", + "input_scatter_fusion.7" + ] + }, + "prorated_estimate_ms": { + "curvature_matrix_F": 0.5090012031250003, + "psf_convolution_mapping_matrix": 0.5090012031250003, + "inversion_other": 0.05486061020833337, + "regularization_H": 0.037255855729166704, + "mesh_construction": 0.016723868020833324, + "mesh_interpolation_weights": 0.013761139374999997, + "mesh_locate_walk": 0.013692834166666666, + "mapped_reconstruction": 0.013255797395833328, + "pdip_solve": 0.01278759427083333, + "mesh_seed_argmin": 0.012400899270833326, + "reconstruction_scatter": 0.01136460989583333, + "curvature_reg_reduce_gather": 0.01015627083333333, + "grids_and_structures": 0.009942821874999997, + "mass_profile_deflections": 0.009942821874999997, + "mesh_dual_areas": 0.009626640625000007, + "ray_trace_data_grid": 0.007531915625000003, + "mapping_matrix": 0.006749689583333333, + "chi_squared_evidence": 0.0009539062500000003 + }, + "prorated_note": "ESTIMATE ONLY \u2014 a mixed fusion's time split equally across the stages its constituents span. Never summed into the measured table, never reconciled." + }, + "other_sources_ms": { + "copy.72": 0.042004900000001816, + "copy.35": 0.017002456250000093, + "copy.40": 0.0019799687500000017, + "loop_broadcast_fusion.1": 0.0019762125000000034, + "copy.71": 0.0018016062500000013, + "loop_broadcast_fusion.4": 0.0017822062499999992, + "copy.70": 0.001763374999999999, + "copy.20": 0.0016625937500000004, + "copy.52": 0.0016511874999999999 + }, + "device_span_ms": 52.50365706875, + "device_busy_ms": 44.784771649999996, + "device_idle_ms": 7.718885418750006, + "largest_idle_gaps": [ + { + "gap_ms": 5.420902, + "after": "pure_callback.4", + "before": "pure_callback.4" + }, + { + "gap_ms": 0.050879, + "after": "copy.35", + "before": "input_reduce_fusion.1" + }, + { + "gap_ms": 0.034176, + "after": "pure_callback.4", + "before": "copy.71" + }, + { + "gap_ms": 0.031775, + "after": "loop_broadcast_fusion", + "before": "loop_add_fusion.5" + }, + { + "gap_ms": 0.031263, + "after": "input_scatter_fusion.7", + "before": "loop_reduce_fusion.1" + }, + { + "gap_ms": 0.031231, + "after": "input_concatenate_fusion.7", + "before": "pure_callback.4" + }, + { + "gap_ms": 0.022336, + "after": "eigh.45", + "before": "eigh.45" + }, + { + "gap_ms": 0.022143, + "after": "while.28", + "before": "input_reduce_fusion.3" + } + ], + "kernel_ms": 43.007453000000034, + "sum_ms": 50.72633841875004, + "wall_ms": 52.51032926876178, + "host_outside_span_ms": 0.006672200011777818, + "reconciliation_pct": -3.397409376126366, + "unjoined_ms": 0.0, + "unjoined_pct": 0.0, + "other_ms": 0.07148649999999998, + "other_pct": 0.13613797703326735, + "note": "Stage rows attribute the command-buffers-OFF program (see the module docstring): kernel times are the same, the launch overhead the CUDA graphs remove is not. sum_ms = kernel rows + device_idle_ms; the residual against wall_ms is host_outside_span_ms (dispatch before the first kernel, teardown after the last).", + "per_stage_ms_per_lane": { + "border_relocator": 0.11510500000000001, + "chi_squared_evidence": 0.010688, + "curvature_matrix_F": 4.267072, + "data_vector_D": 0.12534099999999998, + "inversion_other": 1.818591, + "mapped_reconstruction": 0.115169, + "mapping_matrix": 0.11622199999999999, + "memset": 0.048959000000000016, + "mesh_construction": 0.002048, + "mesh_locate_walk": 0.15027249999999998, + "mesh_qhull_callback": 0.010592, + "mesh_seed_argmin": 0.2277760000000001, + "mixed_fusion": 1.2594120000000002, + "other": 0.07148649999999998, + "pdip_solve": 27.291537000000034, + "psf_convolution_mapping_matrix": 7.332478000000001, + "ray_trace_data_grid": 0.013696000000000002, + "regularization_H": 0.031008 + }, + "per_lane_divisor": 1, + "host_callback": { + "pure_callback_span_ms": 83.9009001, + "qhull_ms": 78.39786950000001, + "callback_body_ms_note": "the OUTERMOST matching body event, not a sum: under the probe the body appears twice (the wrapper and the timed re-implementation it calls) and summing them would count the same work twice", + "events_by_name": { + "pure_callback.4": { + "count": 160, + "ms": 83.9009001 + }, + "$callback.py:815 _wrapped_callback": { + "count": 160, + "ms": 82.483341 + }, + "$callback.py:224 _callback": { + "count": 160, + "ms": 82.09361520000003 + }, + "$callback.py:74 pure_callback_impl": { + "count": 160, + "ms": 81.94491380000007 + }, + "$callback.py:69 __call__": { + "count": 160, + "ms": 78.653725 + }, + "$delaunay.py:162 ": { + "count": 160, + "ms": 78.54514460000006 + }, + "$host_callback_probe.py:225 wrapped": { + "count": 160, + "ms": 78.39786950000001 + }, + "$host_callback_probe.py:160 _timed_tri_only": { + "count": 160, + "ms": 78.2671368 + }, + "ThenExecuteCallback:GetEventForComputeStreamSyncPoint": { + "count": 160, + "ms": 0.3028661999999999 + }, + "$callback.py:822 ": { + "count": 640, + "ms": 0.2351646999999993 + }, + "$__init__.py:132 _xla_gc_callback": { + "count": 2, + "ms": 0.000771 + } + }, + "note": "HOST milliseconds per traced BATCH (the whole invocation), aggregated by name because the events nest. Not a row of the device table: the device pays for them as the idle gaps largest_idle_gaps names." + }, + "host_callback_ms": 83.9009001 + }, + "hlo_census": { + "status": "excluded", + "reason": "The legacy census anchors PyAutoArray source line numbers that moved after the phase-1 run. No batched attribution is published from unsupported anchors; the device-event table and wall reconciliation remain valid." + }, + "trace_split": { + "expected_calls": 160, + "executions_per_invocation": 16, + "method": "per-call (first-instruction recurrence)", + "note": "DECIDED IN CODE: the scalar arm's trace is split by trace_calls * B, so every lane's execution is its own block and the per-stage median is taken over all of them. The vmap arm's is split by trace_calls, one block per batched execution, and per_stage_ms_per_lane divides those rows by B." + } + } + }, + "certification_report": { + "source": "vmap arm, library solve observed through its stats= out-dict (PyAutoArray #566) and jax.debug.callback(..., ordered=True); ordered because the unordered batching rule returns the lanes permuted. Untimed, separately compiled; max rel diff of its log likelihoods vs the timed arm's: 1.686e-06", + "rows": 0, + "pdip_iter": "NOT AVAILABLE per lane without changing library numerics. The fallback branch calls the library's own reconstruction_positive_only_from, which returns the solution alone \u2014 jax_nnls.solve_nnls' iteration count is discarded inside the library's custom_vjp primal. The PDIP while_loop's cost is in the pdip_solve stage row of each arm's device table instead, which is a max-over-lanes quantity under vmap because every lane runs the same fixed kernel sequence.", + "passes_semantics": "library `passes`: restricted active-set passes run (jax_active_set.solve_certified)" + }, + "lane_construction": { + "draws_sha256": "0d36cfdd54138e3d4343da6cff62621f6145bc8ee8d317d15fbcea328cacd342", + "lane_rows": [ + 300, + 301, + 302, + 303, + 304, + 305, + 306, + 307, + 308, + 309, + 310, + 311, + 312, + 313, + 314, + 315 + ], + "calls": [ + 15 + ], + "stage": "pix1", + "regularization_range": { + "galaxies.source.pixelization.regularization.inner_coefficient": { + "min": 8.610204122811597e-06, + "max": 609.7498208301598 + }, + "galaxies.source.pixelization.regularization.outer_coefficient": { + "min": 3.4330906156470037e-06, + "max": 159.11676392313697 + }, + "galaxies.source.pixelization.regularization.signal_scale": { + "min": 0.12452271846719754, + "max": 0.9404155018121758 + } + }, + "phases": [ + "exploration" + ], + "window_rule": "nautilus_batches.timed_window: consecutive captured calls, in call order, from the FIRST call that is not a prior batch, concatenated and truncated to B; at B == n_batch exactly one real Nautilus batch. Falls back to the latest B lanes if the post-prior lanes run out; never repeats a lane.", + "note": "Lane k is captured lane lane_rows[k]: the mass AND shear of a real Nautilus proposal (nautilus_batch_capture.py), lens light fixed at S3, the S3 light-subtracted dataset shared by every lane. `offsets` in the lane table are the mass offsets from the fiducial; the shear is in the capture file." + }, + "captured": { + "batches_path": "/mnt/ral/jnightin/autolens_profiling_wt/certified-solver-phase-c1-lane-rate/results/breakdown/imaging/nautilus_batches_delaunay_pix1.npz", + "batches_sha256": "e71a5e23026b342d1ff4359b8fb914a87980d8aea0060659d2334dcfa3215c00", + "schema_version": 2, + "n_calls": 932, + "n_lanes": 18640, + "call_sizes_seen": [ + 20 + ], + "calls_by_phase": { + "prior": 15, + "exploration": 917 + }, + "parameter_paths": [ + "galaxies.source.pixelization.regularization.inner_coefficient", + "galaxies.source.pixelization.regularization.outer_coefficient", + "galaxies.source.pixelization.regularization.signal_scale", + "galaxies.lens.mass.centre.centre_0", + "galaxies.lens.mass.centre.centre_1", + "galaxies.lens.mass.einstein_radius", + "galaxies.lens.mass.ell_comps.ell_comps_0", + "galaxies.lens.mass.ell_comps.ell_comps_1", + "galaxies.lens.shear.gamma_1", + "galaxies.lens.shear.gamma_2" + ], + "stage": "pix1", + "regularization": { + "class": "AdaptSplit", + "free": true, + "priors": { + "inner_coefficient": [ + "LogUniform", + 1e-06, + 1000000.0 + ], + "outer_coefficient": [ + "LogUniform", + 1e-06, + 1000000.0 + ], + "signal_scale": [ + "Uniform", + 0.0, + 1.0 + ] + }, + "priors_source": "PyAutoGalaxy packaged config/priors/regularization (adapt_split.yaml / constant.yaml); adapt_split.yaml is identical to euclid_strong_lens_modeling_pipeline/config/priors/regularization/adapt_split.yaml" + }, + "nautilus": { + "departures_from_production": [ + "mass/shear priors are the phase-B cell's Gaussians, not chained from source_lp", + "no positions likelihood", + "the cell's mesh (Hilbert 1500, weight_power 1) in both stages; source_pix_2 redraws a 500-vertex Hilbert grid at weight_power 3.5", + "seeded (production passes no seed)", + "quick updates disabled (iterations_per_quick_update=1e12; render-only)", + "NullPaths: no output directory, so no checkpoint and one Sampler.run call", + "post-fit perform_update skipped (samples / latent variables never built)" + ], + "n_batch": 20, + "n_like_max": 40000, + "n_live": 150, + "number_of_cores": 1, + "production_reference": "euclid_strong_lens_modeling_pipeline/scripts/full_model.py source_pix_1 (n_live=150) / source_pix_2 (n_live=75): af.Nautilus(n_batch=20, **SettingsSearch.search_dict) with use_jax_vmap=True and number_of_cores=1 (SettingsSearch defaults)", + "production_stage": "source_pix_1", + "seed": 1, + "stage": "pix1", + "use_jax_vmap": true, + "version": "1.0.5" + }, + "capture_fit_status": "sampling complete (n_like_max or convergence); post-fit result skipped", + "capture_library_revisions": { + "PyAutoArray": { + "head": "7fa8d2714f7da43fec2b23c31bff580764831670", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoArray" + }, + "PyAutoFit": { + "head": "a736840127be7a3c21e15a5c945e94d8f1082983", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoFit" + }, + "PyAutoGalaxy": { + "head": "70a61e26cd715cefe7012a38285698091246a8a4", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy" + }, + "PyAutoLens": { + "head": "86054bbc19baa2f710a12e04a94fa27ab37cc354", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoLens" + }, + "PyAutoNerves": { + "head": "1fa613aa8d89a79613009fb66f5b4e2d21deb57a", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoNerves" + } + }, + "fingerprint_check": { + "fields": [ + "mesh", + "source_pixels", + "dataset_sha256", + "regularization_class", + "regularization_s0_fiducial", + "border_relocator", + "use_mixed_precision", + "log_evidence_s3_library" + ], + "not_identity": "the regularization coefficients: free per lane since the capture frees them", + "log_evidence_s3_library_rel_diff": 0.0, + "passed": true + }, + "timed_window_vs_capture_pdip": { + "reference": "the capture's own figure of merit (library PDIP, Fitness.call_wrap jax.jit(jax.vmap(call)) over parameter vectors) for the same lanes", + "compared_against": "this cell's jit(vmap) library-PDIP reference", + "n_compared": 16, + "max_rel_diff": 1.8151357928474666e-06, + "max_abs_diff_nats": 0.32149519986705855, + "gated": false, + "note": "RECORDED, NOT GATED: proves the lane trees rebuilt here are the models the sampler evaluated (a wrong parameter mapping shows up as nats, not 1e-10)." + } + }, + "matched": { + "vmap_wall_per_lane_ms": 47.00753313750283, + "scalar_wall_per_lane_ms": 50.56510295623866, + "speedup_vmap_over_scalar": 1.0756808447771444, + "note": "Both walls are the PRODUCTION nesting of their arm, measured in one process on the same B lanes with the SAME library Settings (no injection). A speedup below 1 means the batch is slower per lane than B sequential jitted calls." + }, + "solver_source": "library", + "solver": "pdip", + "certified_fallback": "pdip", + "certified_pass_budget": 16, + "certified_pass_budget_basis": "config default (Settings().certified_pass_budget)", + "certified_tau_rel": 1e-09, + "solver_used": "pdip", + "solver_check": { + "solver_used": "pdip", + "solver_used_source": "AbstractInversion.positive_only_solver_used on the fiducial S3 inversion, built eagerly on the JAX backend (AnalysisImaging(use_jax=True).fit_from) with the arms' Settings", + "reference_solver_used": "pdip", + "traced_solver_kwargs_jax": [ + "pdip" + ], + "observed_calls_jax": 1, + "report_rows": 0, + "report_vs_timed_arm_max_rel_diff": 1.6864381558265331e-06 + }, + "lanes_certified": [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null + ], + "lanes_passes": [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null + ], + "uncertified_lanes": null, + "per_lane_certification_note": "Not applicable: a library-PDIP row has no certificate or pass count.", + "gate": { + "pre_registered": true, + "gated": [ + "per lane: jit(vmap) arm vs jit(vmap) library PDIP <= lane_rtol relative", + "per lane: scalar jit arm vs scalar jit library PDIP <= lane_rtol relative" + ], + "recorded_not_gated": [ + "per lane: jit(vmap) arm vs scalar jit arm (rel_diff, abs_diff_nats)", + "per lane: jit(vmap) library PDIP vs scalar jit library PDIP", + "uncertified_lanes (certified_fallback=none rows)" + ], + "lanes_failed": 4, + "passed": false, + "policy_eligible": false, + "note": "Pre-registered before submission (module docstring; submit header). Phase 3 (results/notes/hst_gpu_residue_phase3_psf_2026_09.md) placed phase 2's ~2.5e-9 certified-vs-PDIP residual BETWEEN the jit(vmap) and scalar-jit compositions, not in the solver \u2014 so each arm is gated against the library-PDIP reference of its OWN composition, and the cross-composition difference is recorded with its nats. A certified_fallback=none row is policy-eligible only if every lane certifies AND passes the gate. Timing is never gated." + }, + "library_revisions": { + "PyAutoArray": { + "head": "3de624b5b91a4efa130dc3cb0a3a0f06f85025a3", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoArray", + "module_file": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/__init__.py" + }, + "PyAutoFit": { + "head": "dd9fbe0aab60c4a57702b1444ca031b317c91331", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoFit", + "module_file": "/mnt/ral/jnightin/PyAuto/PyAutoFit/autofit/__init__.py" + }, + "PyAutoGalaxy": { + "head": "70a61e26cd715cefe7012a38285698091246a8a4", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy", + "module_file": "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/__init__.py" + }, + "PyAutoLens": { + "head": "86054bbc19baa2f710a12e04a94fa27ab37cc354", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoLens", + "module_file": "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/__init__.py" + }, + "autoarray_file": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/__init__.py" + } + }, + "headline_arm_note": "`trace`, `hlo_census`, `command_buffers` and `trace_timing` above describe the scalar arm \u2014 the program phase 1 traced. Both arms' full blocks, the lane table and the matched comparison are under `vmap`." +} \ No newline at end of file diff --git a/results/breakdown/imaging/fixed_light_trace_delaunay_jitvmap16_captured_pix1_libpdip_fbon_b16_hpc_a100_fp64_fixed_light_trace.png b/results/breakdown/imaging/fixed_light_trace_delaunay_jitvmap16_captured_pix1_libpdip_fbon_b16_hpc_a100_fp64_fixed_light_trace.png new file mode 100644 index 0000000000000000000000000000000000000000..ce00c294cff402072147f0427e4a8eb78af60bec GIT binary patch literal 167926 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®vB7P;N(i^N!c)V!oS~v6p`1;53 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%0AaYM7X3=x44 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
    y*JyTAw-#O>& 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 K_6H_;NBt94qbE=R literal 0 HcmV?d00001 diff --git a/results/breakdown/imaging/fixed_light_trace_delaunay_jitvmap20_captured_pix1_libcertified_fbon_b16_hpc_a100_fp64_fixed_light_trace.json b/results/breakdown/imaging/fixed_light_trace_delaunay_jitvmap20_captured_pix1_libcertified_fbon_b16_hpc_a100_fp64_fixed_light_trace.json new file mode 100644 index 000000000..ff4ebf28c --- /dev/null +++ b/results/breakdown/imaging/fixed_light_trace_delaunay_jitvmap20_captured_pix1_libcertified_fbon_b16_hpc_a100_fp64_fixed_light_trace.json @@ -0,0 +1,6135 @@ +{ + "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": null, + "cpu_count": 124, + "jax_compilation_cache_dir": "/mnt/ral/jnightin/autolens_profiling_wt/certified-solver-phase-c1-lane-rate/output/jax_cache/fixed_light_lanerate_delaunay_pix1_time_20_certified_on_350768_12", + "autotune_cache_entries_at_start": 0, + "cache_fresh": true, + "nvidia_smi": "NVIDIA A100 80GB PCIe, 35457 MiB, 81920 MiB" + }, + "machine": { + "cpu_model": "AMD EPYC 7702 64-Core Processor", + "cpu_count_os": 124, + "nproc": 4, + "nproc_all": 124, + "nproc_note": "GNU nproc honours OMP_NUM_THREADS, so `nproc` can print 1 on a multi-core host; `nproc_all` is the core count.", + "ram_total": "928298200 kB", + "kernel": "5.14.0-687.50.1.el9_8.x86_64", + "platform": "Linux-5.14.0-687.50.1.el9_8.x86_64-x86_64-with-glibc2.34", + "python": "3.12.4", + "jax_thread_env": { + "NPROC": null + }, + "blas_thread_env": { + "OMP_NUM_THREADS": null, + "OPENBLAS_NUM_THREADS": null, + "MKL_NUM_THREADS": null, + "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" + }, + "precision": "fp64", + "configuration": { + "pixel_scale_arcsec": 0.05, + "mask_radius_arcsec": 3.5, + "image_pixels_masked": 15361, + "over_sampled_pixels": 62752, + "mesh": "delaunay", + "mesh_shape": null, + "source_pixels": 1500, + "source_pixels_requested": null, + "dataset": "hst", + "dataset_sha256": { + "data.fits": "e4e833a28e9c6f6fb023cd85c0d3dde74068720256bc77a240633500e5b04fac", + "noise_map.fits": "315c6266a0acd3ac9c8da82fcd2b45a08697362481fd7a35072bab1658530ba3", + "psf.fits": "8389ba0e8bf4a09b4a561cfc246181a2fb944ed396754cd0ff76fdd22910d303" + }, + "cell_source_sha256": "06a162fcdae6b329384ec33322f443df07215d86e56f0505ac15b3d3473eb432", + "inversion_path": "dense", + "pass_budget": 7, + "pass_budget_basis": "phase 3 (autolens_profiling#255): the smallest ZERO-fallback budget per mesh, the budget a production run fixes. NOT phase 0's certifying budget (2 for Delaunay), which falls back on 67.5 % of a graded draw set and is not a production cost.", + "border_relocator_mode": "cell", + "border_relocator": true, + "border_relocator_note": "'cell' is use_border_relocator=True, which every profiling cell in this family forces; 'library' passes None and takes the shipped config default, which is what production runs. The resolved boolean is what this leg actually ran.", + "routes_selected": [ + "b", + "d" + ], + "trace_calls": 10, + "command_buffers_traced": "off", + "use_mixed_precision": false, + "tau_rel": 1e-09, + "regularization": { + "scheme": "adapt_split", + "inner_coefficient": 0.1, + "outer_coefficient": 10.0, + "signal_scale": 0.1 + }, + "thread_env": { + "n_threads": null, + "vars": [ + "OPENBLAS_NUM_THREADS", + "MKL_NUM_THREADS", + "OMP_NUM_THREADS", + "VECLIB_MAXIMUM_THREADS", + "NUMEXPR_NUM_THREADS" + ], + "set_to": null, + "preexisting": {}, + "overridden": {}, + "note": "Not pinned (legacy variant): recorded as found." + }, + "over_sample_size_lp_rule": { + "sub_size_list": [ + 4, + 2, + 2 + ], + "radial_list": [ + 0.3, + 0.6 + ], + "centre": [ + 0.0, + 0.0 + ] + }, + "vmap_batch": 20, + "lanes": "captured", + "arms": [ + "vmap", + "scalar" + ], + "fallback": "on", + "draw_seed": 0, + "vmap_composition": "jax.jit(jax.vmap(fn))", + "lane_rtol": 1e-09, + "vmap_flags_note": "Strict ProfileCLI.parse_cell_args rejects unknown flags. These keys record the exact batching program and prevent historical vmap(jit) artifacts from being mistaken for current jit(vmap) measurements.", + "solver_source": "library", + "solver": "certified", + "certified_fallback": "pdip", + "certified_pass_budget": 16, + "captured_pass": "time", + "batches": "/mnt/ral/jnightin/autolens_profiling_wt/certified-solver-phase-c1-lane-rate/results/breakdown/imaging/nautilus_batches_delaunay_pix1.npz" + }, + "solver_injection": { + "patched": null, + "part_v": "none \u2014 library mode selects the solver through al.Settings", + "part_b_route_d": { + "patched": "autoarray.inversion.inversion.inversion_util.reconstruction_positive_only_from", + "pass_budget": 7, + "fallback": true + }, + "note": "Library mode (phase B, #300): PART V's arms and references run the library's own positive-only solve, selected by Settings(positive_only_solver, certified_fallback, certified_pass_budget); nothing is injected. PART B's single-call route d (the fiducial d == b pin) still uses the phase-1 harness injection at the phase-3 budget and is not a phase-B row. The untimed certification report observes the library solve (library_solver_observed) without changing it." + }, + "routes": { + "b_s3_pdip": { + "label": "S3 PDIP (source-only)", + "status": "ok", + "solver": "library", + "ms": 50.75694660008594, + "log_likelihood": 29155.000174806722 + }, + "d_s3_certified_fallback": { + "label": "S3 certified active set, budget 7, PDIP fallback", + "status": "ok", + "solver": "harness-injected certified active set", + "pass_budget": 7, + "fallback": true, + "injected_solver_calls_jax": 1, + "injected_solver_calls_numpy": 0, + "ms": 31.619597400276685, + "log_likelihood": 29155.00017354042 + } + }, + "equivalence_pins": [ + { + "pin": "route d (certified, fallback) == route b (library PDIP)", + "route": "d_s3_certified_fallback", + "reference": "b_s3_pdip", + "expectation": "the certified active set returns the library's own positive solution", + "rtol": 1e-09, + "got": 29155.00017354042, + "reference_value": 29155.000174806722, + "rel_diff": 4.3433511150787397e-11, + "status": "PASS" + } + ], + "equivalence_rtol": 1e-09, + "reference": { + "log_evidence_s0_library": 29155.00017433923, + "log_evidence_s3_library": 29155.000174339304, + "s3": { + "n_params": 1500, + "n_mapper": 1500, + "n_funcs": 0, + "edge_zeroed_pixels": 0, + "subtracted_light_flux": 5105.448603818575 + } + }, + "command_buffers": { + "wall_on_ms": 887.3907229000906, + "wall_off_ms": 895.7212022000022, + "command_buffer_delta_ms": 8.33047929991153, + "command_buffer_delta_pct": 0.938761143759381, + "traced": "off", + "compiler_option": "xla_gpu_enable_command_buffer", + "probe": { + "note": "Not taken in --vmap-batch mode: the CUPTI-inside-a-CUDA-graph probe is a phase-1 diagnostic about the JOIN, and this mode already compiles and times both the command-buffers ON and OFF executable of every arm." + }, + "note": "ONE lowering, TWO compilations, one process. wall_on_ms is the PRODUCTION program (CUDA graphs as XLA ships them) and is the number comparable to phase 5's row; wall_off_ms is the graph-less program the stage rows attribute. The delta is the launch overhead the graphs remove \u2014 it lands in device_idle and host_outside_span, not in any stage. Reconciliation is computed against wall_off_ms." + }, + "trace": { + "parser": "ProfileData.from_file(xplane) + as_text() + stack_frame_index(proto field 17)", + "stage_audit": { + "mixed_fusion": [ + { + "instruction": "loop_divide_gather_fusion", + "ms": 1.02100832, + "opcode": "fusion", + "shape": "(f64[15361,1,1,1500]{3,2,1,0}, f64[15361,1,1,1500]{3,2,1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:133", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:133 (curvature_matrix_via_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:93 (InversionImagingMapping.curvature_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:389 (AbstractInversion.curvature_reg_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "loop_broadcast_fusion.4", + "ms": 0.225944575, + "opcode": "fusion", + "shape": "f64[1500,180,180]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "input_reduce_fusion.13", + "ms": 0.1212174, + "opcode": "fusion", + "shape": "f64[92,1500]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/inversion_imaging_util.py:123", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/inversion_imaging_util.py:123 (data_vector_via_blurred_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:67 (InversionImagingMapping.data_vector)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:699 (AbstractInversion.reconstruction)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "input_reduce_fusion.17", + "ms": 0.11455684000000006, + "opcode": "fusion", + "shape": "f64[15361]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:163", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:163 (mapped_reconstructed_data_via_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:120 (InversionImagingMapping._mapped_reconstructed_data_dict_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:196 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "loop_broadcast_fusion.2", + "ms": 0.11049801, + "opcode": "fusion", + "shape": "f64[15361,1500]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:342", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:342 (mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/abstract.py:283 (Mapper.mapping_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:91 (AbstractInversionImaging._mapping_matrix_for_convolution_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:137 (AbstractInversionImaging.operated_mapping_matrix_list)" + ] + }, + { + "instruction": "input_multiply_transpose_fusion", + "ms": 0.10967261499999995, + "opcode": "fusion", + "shape": "(f64[1500,1500]{1,0}, f64[1500,1500]{1,0}, f64[1500,1500]{1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:237 (active_set_search)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:293 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:274 (_certified_positive_only_from)" + ] + } + ], + "border_relocator": [ + { + "instruction": "eigh.45", + "ms": 0.07491276499999945, + "opcode": "custom-call", + "shape": "(f64[2,2]{0,1}, f64[2]{0}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:245", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:245 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:454 (BorderRelocator.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:176 (AbstractMesh.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:214 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "custom-call.2", + "ms": 0.007952945000000019, + "opcode": "custom-call", + "shape": "(f64[2,2]{1,0}, s8[4194304]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:242", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:242 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:454 (BorderRelocator.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:176 (AbstractMesh.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:214 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "input_reduce_fusion.18", + "ms": 0.005679990000000003, + "opcode": "fusion", + "shape": "(f64[], f64[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:269", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:269 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:454 (BorderRelocator.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:176 (AbstractMesh.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:214 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "loop_add_fusion.7", + "ms": 0.0035153400000000018, + "opcode": "fusion", + "shape": "f64[15361]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:308", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:308 (relocated_grid_via_ellipse_border_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:423 (BorderRelocator.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:83 (AbstractMesh.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:208 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "loop_add_fusion.9", + "ms": 0.0033790250000000047, + "opcode": "fusion", + "shape": "f64[1500]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:308", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:308 (relocated_grid_via_ellipse_border_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:458 (BorderRelocator.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:176 (AbstractMesh.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:214 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "input_concatenate_fusion.12", + "ms": 0.002400159999999999, + "opcode": "fusion", + "shape": "f64[392,2]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:238", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:238 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:454 (BorderRelocator.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:176 (AbstractMesh.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:214 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + } + ], + "mesh_construction": [ + { + "instruction": "input_concatenate_fusion.7", + "ms": 0.001950709999999996, + "opcode": "fusion", + "shape": "f64[1500,2]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:820", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:820 (InterpolatorDelaunay.mesh_grid_xy)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:847 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + } + ], + "mesh_qhull_callback": [ + { + "instruction": "pure_callback.4", + "ms": 0.010635229999999964, + "opcode": "custom-call", + "shape": "(s32[3000,3]{1,0}, s32[3000,3]{1,0}, s32[1500]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:161", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:161 (_jax_delaunay_tables)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:405 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + } + ], + "other": [ + { + "instruction": "copy.106", + "ms": 0.04191224999999906, + "opcode": "copy", + "shape": "f64[1,1024,2]{2,1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "copy.70", + "ms": 0.017179350000000006, + "opcode": "copy", + "shape": "s32[21361]{0}", + "source": "", + "stack": [] + }, + { + "instruction": "copy.75", + "ms": 0.0019640150000000043, + "opcode": "copy", + "shape": "s64[1500]{0}", + "source": "", + "stack": [] + }, + { + "instruction": "copy.105", + "ms": 0.0018179299999999986, + "opcode": "copy", + "shape": "s32[]", + "source": "", + "stack": [] + }, + { + "instruction": "copy.104", + "ms": 0.001758395000000002, + "opcode": "copy", + "shape": "s64[]", + "source": "", + "stack": [] + }, + { + "instruction": "copy.61", + "ms": 0.0016627149999999993, + "opcode": "copy", + "shape": "s32[]", + "source": "", + "stack": [] + } + ], + "mesh_seed_argmin": [ + { + "instruction": "input_reduce_fusion", + "ms": 0.1494094300000016, + "opcode": "fusion", + "shape": "(f64[1024]{0}, s64[1024]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:191", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:191 (_nearest_vertex_seed_from..argmin_chunk)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204 (_nearest_vertex_seed_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:351 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)" + ] + }, + { + "instruction": "loop_dynamic_update_slice_fusion", + "ms": 0.04105313999999861, + "opcode": "fusion", + "shape": "s32[21,1024]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204 (_nearest_vertex_seed_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:351 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "loop_add_fusion", + "ms": 0.0318532000000001, + "opcode": "fusion", + "shape": "s64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204 (_nearest_vertex_seed_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:351 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "loop_broadcast_fusion", + "ms": 0.0019633499999999983, + "opcode": "fusion", + "shape": "s32[21,1024]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204 (_nearest_vertex_seed_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:351 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "pdip_solve": [ + { + "instruction": "cholesky.60", + "ms": 7.598958304999966, + "opcode": "custom-call", + "shape": "(f64[1500,1500]{0,1}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:252 (active_set_search..body_fun)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:262 (active_set_search)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:293 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)" + ] + }, + { + "instruction": "cholesky.80", + "ms": 5.308138535000001, + "opcode": "custom-call", + "shape": "(f64[1500,1500]{0,1}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:106", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:106 (factorize_kkt)", + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:212 (pdip_pc_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:83 (solve_nnls)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:129 (_solve_nnls_primal_with..primal)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:164 (solve_nnls_primal_with_status)" + ] + }, + { + "instruction": "triangular-solve.1", + "ms": 1.3578426950000397, + "opcode": "custom-call", + "shape": "(f64[1500,1]{0,1}, s8[0]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:154", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:154 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:252 (active_set_search..body_fun)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:262 (active_set_search)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:293 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)" + ] + }, + { + "instruction": "triangular-solve", + "ms": 1.1759390649999863, + "opcode": "custom-call", + "shape": "(f64[1500,1]{0,1}, s8[0]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:154", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:154 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:252 (active_set_search..body_fun)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:262 (active_set_search)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:293 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)" + ] + }, + { + "instruction": "cholesky.110", + "ms": 0.8948393449999995, + "opcode": "custom-call", + "shape": "(f64[1500,1500]{0,1}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:297 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:274 (_certified_positive_only_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:496 (reconstruction_positive_only_from)" + ] + }, + { + "instruction": "cholesky.100", + "ms": 0.8664200699999989, + "opcode": "custom-call", + "shape": "(f64[1500,1500]{0,1}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:237 (active_set_search)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:293 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:274 (_certified_positive_only_from)" + ] + } + ], + "regularization_H": [ + { + "instruction": "input_scatter_fusion.10", + "ms": 0.002064634999999996, + "opcode": "fusion", + "shape": "f64[1500,1500]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:615", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:615 (pixel_splitted_regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt_split.py:137 (AdaptSplit.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:332 (AbstractInversion.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "input_concatenate_fusion.8", + "ms": 0.001876489999999998, + "opcode": "fusion", + "shape": "pred[3]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:93", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:93 (split_points_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:410 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + }, + { + "instruction": "input_concatenate_fusion.9", + "ms": 0.0018718299999999982, + "opcode": "fusion", + "shape": "pred[3]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:91", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:91 (split_points_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:410 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + }, + { + "instruction": "input_concatenate_fusion.10", + "ms": 0.0018609449999999988, + "opcode": "fusion", + "shape": "pred[3]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:90", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:90 (split_points_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:410 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + }, + { + "instruction": "input_concatenate_fusion", + "ms": 0.0017558350000000003, + "opcode": "fusion", + "shape": "s32[1500,2]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:615", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:615 (pixel_splitted_regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt_split.py:137 (AdaptSplit.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:332 (AbstractInversion.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "input_concatenate_fusion.11", + "ms": 0.0015556699999999994, + "opcode": "fusion", + "shape": "pred[3]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:88", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:88 (split_points_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:410 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + } + ], + "mesh_locate_walk": [ + { + "instruction": "loop_reduce_fusion", + "ms": 0.02563361500000045, + "opcode": "fusion", + "shape": "(f64[21361]{0}, s64[21361]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:264", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:264 (_walk_from_seed..walk_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:292 (_walk_from_seed..body)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:264 (_walk_from_seed..walk_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:292 (_walk_from_seed..body)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)" + ] + }, + { + "instruction": "input_reduce_fusion.1", + "ms": 0.025435760000000616, + "opcode": "fusion", + "shape": "pred[196]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:288", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:288 (_walk_from_seed..cond)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:353 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)" + ] + }, + { + "instruction": "loop_or_select_fusion", + "ms": 0.022603170000000325, + "opcode": "fusion", + "shape": "(s32[21361]{0}, pred[21361]{0}, pred[21361]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:270", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:270 (_walk_from_seed..walk_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:292 (_walk_from_seed..body)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:353 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)" + ] + }, + { + "instruction": "loop_select_fusion", + "ms": 0.020302364999999784, + "opcode": "fusion", + "shape": "s32[21361]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:242", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:242 (_walk_from_seed..weights_of)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:262 (_walk_from_seed..walk_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:292 (_walk_from_seed..body)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:353 (pix_indexes_delaunay_walk_from)" + ] + }, + { + "instruction": "input_reduce_fusion.2", + "ms": 0.016408779999999915, + "opcode": "fusion", + "shape": "pred[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:288", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:288 (_walk_from_seed..cond)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:353 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)" + ] + }, + { + "instruction": "while.34", + "ms": 0.014675164999999662, + "opcode": "while", + "shape": "(s32[], s32[21361]{0}, pred[21361]{0}, pred[21361]{0}, s32[3000,3]{1,0}, /*index=5*/f64[1500,2]{1,0}, f64[21361,2]{1,0}, s32[3000,3]{1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:353 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "psf_convolution_mapping_matrix": [ + { + "instruction": "input_scatter_fusion", + "ms": 1.9909163300000001, + "opcode": "fusion", + "shape": "f64[1500,180,180]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "fft.19.0", + "ms": 1.761691964999997, + "opcode": "fft", + "shape": "f64[1500,180,180]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "fft.15.0", + "ms": 1.3703491899999993, + "opcode": "fft", + "shape": "c128[1500,180,91]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "fft.17.0", + "ms": 0.9796025600000007, + "opcode": "fft", + "shape": "c128[1500,91,180]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "input_transpose_fusion.4", + "ms": 0.5137482899999998, + "opcode": "fusion", + "shape": "c128[1500,91,180]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "wrapped_transpose", + "ms": 0.49763212999999995, + "opcode": "fusion", + "shape": "c128[1500,180,91]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + } + ], + "inversion_other": [ + { + "instruction": "cholesky.120", + "ms": 0.8974949200000008, + "opcode": "custom-call", + "shape": "(f64[1500,1500]{0,1}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986 (AbstractInversion._log_det_symmetric_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:1078 (AbstractInversion.log_det_curvature_reg_matrix_term)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:347 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/model/analysis.py:135 (AnalysisImaging.log_likelihood_function)" + ] + }, + { + "instruction": "cholesky.130", + "ms": 0.8941805499999996, + "opcode": "custom-call", + "shape": "(f64[1500,1500]{0,1}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986 (AbstractInversion._log_det_symmetric_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:1157 (AbstractInversion.log_det_regularization_matrix_term)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:348 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/model/analysis.py:135 (AnalysisImaging.log_likelihood_function)" + ] + }, + { + "instruction": "loop_reduce_window_fusion.1", + "ms": 0.0027814400000000035, + "opcode": "fusion", + "shape": "s64[94,16]{1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "loop_reduce_window_fusion", + "ms": 0.002690549999999995, + "opcode": "fusion", + "shape": "s64[6,16]{1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "loop_broadcast_convert_fusion", + "ms": 0.002170080000000002, + "opcode": "fusion", + "shape": "(s32[1500]{0}, s64[1500]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:527", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:527 (AbstractInversion.zeroed_ids_to_keep)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:567 (AbstractInversion.solve_ids_to_keep)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:684 (AbstractInversion.reconstruction)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "input_scatter_fusion.5", + "ms": 0.0019360049999999987, + "opcode": "fusion", + "shape": "s64[1500]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:527", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:527 (AbstractInversion.zeroed_ids_to_keep)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:567 (AbstractInversion.solve_ids_to_keep)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:684 (AbstractInversion.reconstruction)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "mapping_matrix": [ + { + "instruction": "input_reduce_fusion.31", + "ms": 0.0028889249999999927, + "opcode": "fusion", + "shape": "f64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:93", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:93 (adaptive_pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/abstract.py:507 (Mapper.pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt.py:339 (Adapt.regularization_weights_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt_split.py:120 (AdaptSplit.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)" + ] + } + ], + "curvature_matrix_F": [ + { + "instruction": "cublas-lt-matmul.2", + "ms": 4.203954090000001, + "opcode": "custom-call", + "shape": "(f64[1500,1500]{1,0}, s8[4194304]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:134", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:134 (curvature_matrix_via_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:93 (InversionImagingMapping.curvature_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:389 (AbstractInversion.curvature_reg_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "chi_squared_evidence": [ + { + "instruction": "loop_multiply_fusion.2", + "ms": 0.002985745000000001, + "opcode": "fusion", + "shape": "f64[15361]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/abstract_ndarray.py:300", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/abstract_ndarray.py:300 (AbstractNDArray.__pow__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/abstract_ndarray.py:60 (unwrap_array..wrapper)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/abstract_ndarray.py:35 (to_new_array..wrapper)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_util.py:78 (chi_squared_map_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:78 (AbstractFit.chi_squared_map)" + ] + } + ] + }, + "stage_audit_note": "The HLO instructions that contributed most of each stage's milliseconds, with their full source stack. A stage row is only as good as the rules that built it; this is how a reader checks a row against the HLO instead of trusting it.", + "untraced_wall_ms": 44.679426924994914, + "reconciliation_vs_untraced_pct": -15.467513720792189, + "wall_basis": "wall_ms is the TRACED run's wall, the run these kernel durations came from. untraced_wall_ms is the same executable without the profiler; the difference is the profiler's overhead and belongs in neither the stages nor the idle row.", + "calls": 200, + "call_split": "per-call (first-instruction recurrence)", + "call_blocks": 200, + "events": 144140, + "streams": [ + "Stream #14(MemcpyD2D,MemcpyH2D,Compute,MemcpyD2H,Memset)" + ], + "per_stage_ms": { + "border_relocator": { + "median_ms": 0.1013135, + "min_ms": 0.10057300000000001, + "max_ms": 0.10214500000000001 + }, + "chi_squared_evidence": { + "median_ms": 0.002976, + "min_ms": 0.002848, + "max_ms": 0.003296 + }, + "curvature_matrix_F": { + "median_ms": 4.202033500000001, + "min_ms": 4.179871, + "max_ms": 4.304915 + }, + "inversion_other": { + "median_ms": 1.803238, + "min_ms": 1.786004, + "max_ms": 1.8153169999999998 + }, + "mapping_matrix": { + "median_ms": 0.00288, + "min_ms": 0.002879, + "max_ms": 0.002913 + }, + "memset": { + "median_ms": 0.034432000000000004, + "min_ms": 0.009984, + "max_ms": 0.09769400000000002 + }, + "mesh_construction": { + "median_ms": 0.001952, + "min_ms": 0.00192, + "max_ms": 0.001984 + }, + "mesh_locate_walk": { + "median_ms": 0.1489275, + "min_ms": 0.130945, + "max_ms": 0.184289 + }, + "mesh_qhull_callback": { + "median_ms": 0.010592, + "min_ms": 0.010176, + "max_ms": 0.011104 + }, + "mesh_seed_argmin": { + "median_ms": 0.22428450000000014, + "min_ms": 0.22387400000000016, + "max_ms": 0.22467400000000018 + }, + "mixed_fusion": { + "median_ms": 1.986319, + "min_ms": 1.9782960000000003, + "max_ms": 1.999138 + }, + "other": { + "median_ms": 0.06702349999999999, + "min_ms": 0.06371199999999999, + "max_ms": 0.07388899999999998 + }, + "pdip_solve": { + "median_ms": 14.734703000000003, + "min_ms": 2.4263630000000003, + "max_ms": 52.05862700000007 + }, + "psf_convolution_mapping_matrix": { + "median_ms": 7.113619999999999, + "min_ms": 7.100212, + "max_ms": 7.1291709999999995 + }, + "regularization_H": { + "median_ms": 0.010976, + "min_ms": 0.010848, + "max_ms": 0.011328 + } + }, + "stage_order": [ + "border_relocator", + "mesh_qhull_callback", + "mesh_seed_argmin", + "mesh_locate_walk", + "mesh_construction", + "mapping_matrix", + "psf_convolution_mapping_matrix", + "curvature_matrix_F", + "regularization_H", + "pdip_solve", + "chi_squared_evidence", + "inversion_other", + "mixed_fusion", + "other", + "memset" + ], + "mixed_fusion": { + "ms": 1.986319, + "constituent_stage_sets": { + "curvature_matrix_F + psf_convolution_mapping_matrix": 1.02100832, + "pdip_solve + psf_convolution_mapping_matrix": 0.225944575, + "data_vector_D + pdip_solve": 0.12488812000000023, + "mapped_reconstruction + pdip_solve": 0.11455684000000006, + "mapping_matrix + pdip_solve": 0.11286072999999995, + "curvature_reg_reduce_gather + inversion_other + mapped_reconstruction + pdip_solve + reconstruction_scatter": 0.10967261499999995, + "pdip_solve + regularization_H": 0.045423489999999955, + "inversion_other + pdip_solve + regularization_H": 0.024202355, + "inversion_other + pdip_solve": 0.02294705499999994, + "inversion_other + mapping_matrix + mesh_construction + mesh_dual_areas + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin + pdip_solve": 0.02113966000000001, + "inversion_other + mesh_construction + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin + pdip_solve + regularization_H": 0.018736469999999984, + "inversion_other + mesh_construction + mesh_dual_areas + mesh_interpolation_weights + pdip_solve + regularization_H": 0.014469269999999989, + "pdip_solve + ray_trace_data_grid": 0.013680334999999941, + "border_relocator + pdip_solve": 0.013327340000000023, + "inversion_other + mapping_matrix + mesh_construction + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin": 0.011626745, + "grids_and_structures + mass_profile_deflections + pdip_solve": 0.010069740000000006, + "grids_and_structures + mass_profile_deflections + pdip_solve + ray_trace_data_grid": 0.008905150000000004, + "chi_squared_evidence + pdip_solve": 0.00768813999999998, + "inversion_other + mesh_construction + mesh_seed_argmin + pdip_solve + regularization_H": 0.007145729999999994, + "inversion_other + mesh_dual_areas + mesh_locate_walk": 0.006733585000000049, + "inversion_other + mesh_construction + pdip_solve + regularization_H": 0.006547775000000004, + "grids_and_structures + mass_profile_deflections + ray_trace_data_grid": 0.005420630000000002, + "inversion_other + pdip_solve + ray_trace_data_grid": 0.005286555000000029, + "inversion_other + regularization_H": 0.005250225000000012, + "inversion_other + mapped_reconstruction + pdip_solve + reconstruction_scatter": 0.004806700000000002, + "inversion_other + mapped_reconstruction": 0.0037300700000000003, + "mapping_matrix + pdip_solve + regularization_H": 0.0034841699999999948, + "inversion_other + mesh_construction + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin": 0.0031295899999999994, + "inversion_other + mesh_construction + mesh_dual_areas + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin": 0.0029588600000000054, + "inversion_other + mesh_construction + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin + regularization_H": 0.0027115199999999903, + "inversion_other + mesh_dual_areas + mesh_locate_walk + pdip_solve": 0.002606104999999996, + "inversion_other + mesh_locate_walk + mesh_seed_argmin": 0.0024943900000000047, + "inversion_other + mesh_interpolation_weights": 0.0021585600000000042, + "chi_squared_evidence + inversion_other": 0.0017876849999999987 + }, + "example_kernels": { + "curvature_matrix_F + psf_convolution_mapping_matrix": [ + "loop_divide_gather_fusion" + ], + "pdip_solve + psf_convolution_mapping_matrix": [ + "loop_broadcast_fusion.4" + ], + "data_vector_D + pdip_solve": [ + "input_reduce_fusion.13", + "input_reduce_fusion.29" + ], + "mapped_reconstruction + pdip_solve": [ + "input_reduce_fusion.17" + ], + "mapping_matrix + pdip_solve": [ + "loop_broadcast_fusion.2", + "loop_divide_fusion" + ], + "curvature_reg_reduce_gather + inversion_other + mapped_reconstruction + pdip_solve + reconstruction_scatter": [ + "input_multiply_transpose_fusion" + ], + "pdip_solve + regularization_H": [ + "loop_select_fusion.5", + "input_transpose_fusion.5" + ], + "inversion_other + pdip_solve + regularization_H": [ + "input_transpose_fusion.6" + ], + "inversion_other + pdip_solve": [ + "input_reduce_fusion.15", + "loop_log_fusion", + "input_reduce_fusion.16", + "input_reduce_fusion.20" + ], + "inversion_other + mapping_matrix + mesh_construction + mesh_dual_areas + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin + pdip_solve": [ + "input_scatter_fusion.6", + "input_scatter_fusion.3" + ] + }, + "prorated_estimate_ms": { + "psf_convolution_mapping_matrix": 0.6234764475, + "curvature_matrix_F": 0.51050416, + "pdip_solve": 0.3918166617380953, + "mapped_reconstruction": 0.08227965300000002, + "inversion_other": 0.06893565307142857, + "data_vector_D": 0.062444060000000114, + "mapping_matrix": 0.06217200333333331, + "regularization_H": 0.04317189248809522, + "reconstruction_scatter": 0.02313619799999999, + "curvature_reg_reduce_gather": 0.02193452299999999, + "mesh_construction": 0.014305502988095234, + "ray_trace_data_grid": 0.012635516666666647, + "mesh_locate_walk": 0.012555386154761919, + "mesh_interpolation_weights": 0.012318693238095237, + "mesh_seed_argmin": 0.011088477571428569, + "mesh_dual_areas": 0.008443200416666682, + "grids_and_structures": 0.00738974416666667, + "mass_profile_deflections": 0.00738974416666667, + "border_relocator": 0.006663670000000011, + "chi_squared_evidence": 0.004737912499999989 + }, + "prorated_note": "ESTIMATE ONLY \u2014 a mixed fusion's time split equally across the stages its constituents span. Never summed into the measured table, never reconciled." + }, + "other_sources_ms": { + "copy.106": 0.04191224999999906, + "copy.70": 0.017179350000000006, + "copy.75": 0.0019640150000000043, + "copy.105": 0.0018179299999999986, + "copy.104": 0.001758395000000002, + "copy.61": 0.0016627149999999993, + "copy.103": 0.0006374550000000004, + "copy.40": 0.0005414449999999996 + }, + "device_span_ms": 46.05030798, + "device_busy_ms": 38.726948045, + "device_idle_ms": 7.323359934999999, + "largest_idle_gaps": [ + { + "gap_ms": 5.59937, + "after": "pure_callback.4", + "before": "pure_callback.4" + }, + { + "gap_ms": 0.035807, + "after": "cholesky.60", + "before": "Memset 3" + }, + { + "gap_ms": 0.035455, + "after": "pure_callback.4", + "before": "copy.105" + }, + { + "gap_ms": 0.034399, + "after": "input_concatenate_fusion.7", + "before": "pure_callback.4" + }, + { + "gap_ms": 0.029407, + "after": "copy.70", + "before": "input_reduce_fusion.1" + }, + { + "gap_ms": 0.022912, + "after": "eigh.45", + "before": "eigh.45" + }, + { + "gap_ms": 0.021888, + "after": "input_reduce_fusion.28", + "before": "loop_broadcast_fusion.4" + }, + { + "gap_ms": 0.021631, + "after": "loop_add_fusion.1", + "before": "loop_select_fusion" + } + ], + "kernel_ms": 30.445270500000003, + "sum_ms": 37.768630435000006, + "wall_ms": 46.05666195500817, + "host_outside_span_ms": 0.006353975008167367, + "reconciliation_pct": -17.99529355406732, + "unjoined_ms": 0.0, + "unjoined_pct": 0.0, + "other_ms": 0.06702349999999999, + "other_pct": 0.14552400707084223, + "note": "Stage rows attribute the command-buffers-OFF program (see the module docstring): kernel times are the same, the launch overhead the CUDA graphs remove is not. sum_ms = kernel rows + device_idle_ms; the residual against wall_ms is host_outside_span_ms (dispatch before the first kernel, teardown after the last).", + "per_stage_ms_per_lane": { + "border_relocator": 0.1013135, + "chi_squared_evidence": 0.002976, + "curvature_matrix_F": 4.202033500000001, + "inversion_other": 1.803238, + "mapping_matrix": 0.00288, + "memset": 0.034432000000000004, + "mesh_construction": 0.001952, + "mesh_locate_walk": 0.1489275, + "mesh_qhull_callback": 0.010592, + "mesh_seed_argmin": 0.22428450000000014, + "mixed_fusion": 1.986319, + "other": 0.06702349999999999, + "pdip_solve": 14.734703000000003, + "psf_convolution_mapping_matrix": 7.113619999999999, + "regularization_H": 0.010976 + }, + "per_lane_divisor": 1, + "host_callback": { + "pure_callback_span_ms": 101.56374749999996, + "qhull_ms": 94.28838409999997, + "callback_body_ms_note": "the OUTERMOST matching body event, not a sum: under the probe the body appears twice (the wrapper and the timed re-implementation it calls) and summing them would count the same work twice", + "events_by_name": { + "pure_callback.4": { + "count": 200, + "ms": 101.56374749999996 + }, + "$callback.py:815 _wrapped_callback": { + "count": 200, + "ms": 99.82454449999999 + }, + "$callback.py:224 _callback": { + "count": 200, + "ms": 99.32401829999998 + }, + "$callback.py:74 pure_callback_impl": { + "count": 200, + "ms": 99.11897000000002 + }, + "$callback.py:69 __call__": { + "count": 200, + "ms": 94.63252060000005 + }, + "$delaunay.py:162 ": { + "count": 200, + "ms": 94.49607710000001 + }, + "$host_callback_probe.py:225 wrapped": { + "count": 200, + "ms": 94.28838409999997 + }, + "$host_callback_probe.py:160 _timed_tri_only": { + "count": 200, + "ms": 94.1085758 + }, + "ThenExecuteCallback:GetEventForComputeStreamSyncPoint": { + "count": 200, + "ms": 0.39008080000000017 + }, + "$callback.py:822 ": { + "count": 800, + "ms": 0.29828569999999965 + }, + "$__init__.py:132 _xla_gc_callback": { + "count": 2, + "ms": 0.000334 + } + }, + "note": "HOST milliseconds per traced BATCH (the whole invocation), aggregated by name because the events nest. Not a row of the device table: the device pays for them as the idle gaps largest_idle_gaps names." + }, + "host_callback_ms": 101.56374749999996 + }, + "hlo_census": { + "status": "excluded", + "reason": "The legacy census anchors PyAutoArray source line numbers that moved after the phase-1 run. No batched attribution is published from unsupported anchors; the device-event table and wall reconciliation remain valid." + }, + "stage_map_provenance": [ + { + "label": "log_det_curvature_reg", + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 850, + 882 + ], + "requires": { + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 884, + 896 + ] + }, + "function": null + }, + { + "label": "log_det_regularization", + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 850, + 882 + ], + "requires": { + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 897, + 943 + ] + }, + "function": null + }, + { + "label": "curvature_reg_add", + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 359, + 372 + ], + "requires": null, + "function": null + }, + { + "label": "curvature_reg_reduce_gather", + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 374, + 398 + ], + "requires": null, + "function": null + }, + { + "label": "edge_subset_gather", + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 606, + 614 + ], + "requires": null, + "function": null + }, + { + "label": "regularization_term", + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 786, + 849 + ], + "requires": null, + "function": null + }, + { + "label": "mapped_reconstruction", + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 722, + 785 + ], + "requires": null, + "function": null + }, + { + "label": "reconstruction_scatter", + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 583, + 605 + ], + "requires": null, + "function": null + }, + { + "label": "reconstruction_scatter", + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 615, + 721 + ], + "requires": null, + "function": null + }, + { + "label": "certified_active_set_solve", + "path": "likelihood_breakdown/active_set_steps.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "certified_active_set_solve", + "path": "likelihood_breakdown/library_solver_injection.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "pdip_solve", + "path": "PyAutoArray/autoarray/util/jax_nnls.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "pdip_solve", + "path": "PyAutoArray/autoarray/inversion/inversion/inversion_util.py", + "lines": [ + 256, + 488 + ], + "requires": null, + "function": null + }, + { + "label": "mapped_reconstruction", + "path": "PyAutoArray/autoarray/inversion/inversion/inversion_util.py", + "lines": [ + 156, + 200 + ], + "requires": null, + "function": null + }, + { + "label": "curvature_matrix_F", + "path": "PyAutoArray/autoarray/inversion/inversion/inversion_util.py", + "lines": [ + 12, + 155 + ], + "requires": null, + "function": null + }, + { + "label": "reconstruction_scatter", + "path": "PyAutoArray/autoarray/inversion/inversion/inversion_util.py", + "lines": [ + 201, + 255 + ], + "requires": null, + "function": null + }, + { + "label": "data_vector_D", + "path": "PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py", + "lines": [ + 54, + 73 + ], + "requires": null, + "function": null + }, + { + "label": "curvature_matrix_F", + "path": "PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py", + "lines": [ + 74, + 110 + ], + "requires": null, + "function": null + }, + { + "label": "data_vector_D", + "path": "PyAutoArray/autoarray/inversion/inversion/imaging/inversion_imaging_util.py", + "lines": null, + "requires": null, + "function": "data_vector_via_blurred_mapping_matrix_from" + }, + { + "label": "curvature_matrix_F", + "path": "PyAutoArray/autoarray/inversion/inversion/imaging/inversion_imaging_util.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "psf_convolution_mapping_matrix", + "path": "likelihood_breakdown/psf_cube_injection.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "psf_convolution_mapping_matrix", + "path": "PyAutoArray/autoarray/operators/convolver.py", + "lines": [ + 1086, + 1300 + ], + "requires": null, + "function": null + }, + { + "label": "psf_convolution_mapping_matrix", + "path": "PyAutoArray/autoarray/operators/convolver.py", + "lines": [ + 632, + 642 + ], + "requires": null, + "function": null + }, + { + "label": "psf_convolution_mapping_matrix", + "path": "PyAutoArray/autoarray/operators/convolver.py", + "lines": [ + 670, + 691 + ], + "requires": null, + "function": null + }, + { + "label": "psf_convolution_mapping_matrix", + "path": "PyAutoArray/autoarray/operators/convolver.py", + "lines": null, + "requires": { + "path": "PyAutoArray/autoarray/operators/convolver.py", + "lines": [ + 1086, + 1300 + ] + }, + "function": null + }, + { + "label": "psf_convolution_mapping_matrix", + "path": "PyAutoArray/autoarray/operators/convolver.py", + "lines": null, + "requires": { + "path": "PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py", + "lines": [ + 119, + 150 + ] + }, + "function": null + }, + { + "label": "psf_convolution_image", + "path": "PyAutoArray/autoarray/operators/convolver.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "psf_convolution_mapping_matrix", + "path": "PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py", + "lines": [ + 119, + 150 + ], + "requires": null, + "function": null + }, + { + "label": "mesh_qhull_callback", + "path": "PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py", + "lines": [ + 139, + 172 + ], + "requires": null, + "function": null + }, + { + "label": "mesh_seed_argmin", + "path": "PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py", + "lines": [ + 173, + 207 + ], + "requires": null, + "function": null + }, + { + "label": "mesh_locate_walk", + "path": "PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py", + "lines": [ + 208, + 372 + ], + "requires": null, + "function": null + }, + { + "label": "mesh_dual_areas", + "path": "PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py", + "lines": [ + 373, + 396 + ], + "requires": null, + "function": null + }, + { + "label": "mesh_dual_areas", + "path": "PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py", + "lines": [ + 437, + 494 + ], + "requires": null, + "function": null + }, + { + "label": "mesh_dual_areas", + "path": "PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py", + "lines": [ + 605, + 615 + ], + "requires": null, + "function": null + }, + { + "label": "mesh_interpolation_weights", + "path": "PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py", + "lines": [ + 616, + 695 + ], + "requires": null, + "function": null + }, + { + "label": "mesh_interpolation_weights", + "path": "PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py", + "lines": [ + 896, + 1000 + ], + "requires": null, + "function": null + }, + { + "label": "mesh_construction", + "path": "PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "border_relocator", + "path": "PyAutoArray/autoarray/inversion/mesh/border_relocator.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "mesh_construction", + "path": "PyAutoArray/autoarray/inversion/mesh/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "mapping_matrix", + "path": "PyAutoArray/autoarray/inversion/mappers/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "mapping_matrix", + "path": "PyAutoArray/autoarray/inversion/mappings/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "mapping_matrix", + "path": "PyAutoArray/autoarray/inversion/linear_obj/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "regularization_H", + "path": "PyAutoArray/autoarray/inversion/regularization/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "chi_squared_evidence", + "path": "PyAutoArray/autoarray/fit/fit_util.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "chi_squared_evidence", + "path": "PyAutoArray/autoarray/fit/fit_dataset.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "ray_trace_mesh_grid", + "path": "PyAutoLens/autolens/lens/to_inversion.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "ray_trace_mesh_grid", + "path": "PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "mass_profile_deflections", + "path": "PyAutoGalaxy/autogalaxy/profiles/mass/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "light_profile_image", + "path": "PyAutoGalaxy/autogalaxy/profiles/light/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "light_profile_image", + "path": "PyAutoGalaxy/autogalaxy/operate/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "ray_trace_data_grid", + "path": "PyAutoLens/autolens/lens/tracer.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "ray_trace_data_grid", + "path": "PyAutoLens/autolens/lens/tracer_util.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "grids_and_structures", + "path": "PyAutoArray/autoarray/structures/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "grids_and_structures", + "path": "PyAutoArray/autoarray/operators/over_sampling/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "grids_and_structures", + "path": "PyAutoArray/autoarray/geometry/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "inversion_other", + "path": "PyAutoArray/autoarray/inversion/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "fit_imaging_other", + "path": "PyAutoLens/autolens/imaging/fit_imaging.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "fit_imaging_other", + "path": "PyAutoGalaxy/autogalaxy/imaging/fit_imaging.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "fit_imaging_other", + "path": "PyAutoArray/autoarray/fit/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "analysis_other", + "path": "PyAutoLens/autolens/analysis/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "analysis_other", + "path": "PyAutoGalaxy/autogalaxy/analysis/", + "lines": null, + "requires": null, + "function": null + } + ], + "trace_timing": { + "traced_wall_ms": 46.05666195500817, + "untraced_wall_ms": 44.679426924994914, + "profiler_overhead_ms": 1.377235030013253, + "profiler_overhead_pct": 3.082481412139128 + }, + "jit_phases": { + "b_s3_pdip_library_likelihood_jit": { + "lower_s": 1.4992639060001238, + "compile_s": 4.435199229999853, + "first_call_s": 0.13880351500120014, + "steady_per_call_s": 0.050756946600085937 + }, + "d_s3_certified_fallback_library_likelihood_jit": { + "lower_s": 0.48623529900214635, + "compile_s": 4.206273212002998, + "first_call_s": 0.04199881200111122, + "steady_per_call_s": 0.031619597400276686 + } + }, + "peak_bytes": { + "after_setup": 85108992, + "after_routes": 1181653248, + "after_all": 23614098176, + "note": "jax.devices()[0].memory_stats()['peak_bytes_in_use']; None on a backend that does not report it (CPU). Process-wide high-water marks." + }, + "note": "Every stage row is a MEASURED sum of GPU kernel durations joined to library source through the optimized HLO of ONE program \u2014 not arithmetic across compilations. The rows attribute the command-buffers-OFF program: kernel time is the same as production, the launch overhead the CUDA graphs remove is not, and command_buffers.* carries both walls and their delta. sum_ms = kernel rows + measured device_idle_ms; the residual against the wall is host_outside_span_ms and is reported, not absorbed. mixed_fusion.prorated_estimate_ms is an ESTIMATE and is never part of the table. No row may be quoted if reconciliation_pct is outside 5 % or unjoined_ms is non-zero.", + "vmap": { + "batch": 20, + "lanes_mode": "captured", + "arms": [ + "vmap", + "scalar" + ], + "draw_seed": 0, + "fallback": true, + "composition": "jax.jit(jax.vmap(fn))", + "composition_provenance": "Current Fitness._vmap after PyAutoFit#1638. Array 343376 used the retired jax.vmap(jax.jit(fn)) composition and is historical evidence only.", + "headline_arm": "scalar", + "lane_rtol": 1e-09, + "lanes": [ + { + "lane": 0, + "draw_name": "call00015_lane00", + "draw_kind": "captured", + "offsets": { + "centre_0": -0.0033655095107821688, + "centre_1": 0.004631951955766499, + "ell_comps_0": 0.000564301988937442, + "ell_comps_1": -0.00879076787683888, + "einstein_radius": 0.018337010967920175 + }, + "log_likelihood_vmap": 24758.506194309346, + "log_likelihood_scalar": 24758.506194309346, + "log_likelihood_library_pdip": 24758.506194309142, + "log_likelihood_library_pdip_scalar": 24758.506194309142, + "rel_diff_vmap_vs_library_pdip": 8.228558362861305e-15, + "rel_diff_scalar_vs_library_pdip_scalar": 8.228558362861305e-15, + "abs_diff_nats": 0.0, + "rel_diff": 0.0, + "rel_diff_scalar_vs_library_pdip": 8.228558362861305e-15, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 0.0, + "rel_diff_library_pdip_vmap_vs_scalar": 0.0, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": true, + "passes": 10, + "pdip_iter": null + }, + { + "lane": 1, + "draw_name": "call00015_lane01", + "draw_kind": "captured", + "offsets": { + "centre_0": -0.004311760382151672, + "centre_1": 0.0027192789928108052, + "ell_comps_0": 0.0061667694809026535, + "ell_comps_1": 0.003465536775180321, + "einstein_radius": -0.05732579988501185 + }, + "log_likelihood_vmap": 20551.004887772666, + "log_likelihood_scalar": 20551.00488777375, + "log_likelihood_library_pdip": 20551.004887772702, + "log_likelihood_library_pdip_scalar": 20551.004887771745, + "rel_diff_vmap_vs_library_pdip": 1.7702194257450706e-15, + "rel_diff_scalar_vs_library_pdip_scalar": 9.753909035855792e-14, + "abs_diff_nats": 1.0841176845133305e-09, + "rel_diff": 5.275253888720041e-14, + "rel_diff_scalar_vs_library_pdip": 5.098231946145803e-14, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 9.567884262651205e-10, + "rel_diff_library_pdip_vmap_vs_scalar": 4.655677089709752e-14, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": false, + "passes": 16, + "pdip_iter": null + }, + { + "lane": 2, + "draw_name": "call00015_lane02", + "draw_kind": "captured", + "offsets": { + "centre_0": 0.0002796502552123051, + "centre_1": 0.0016003321376979894, + "ell_comps_0": -0.002094430657472772, + "ell_comps_1": 0.006146479068253558, + "einstein_radius": -0.025968910196758177 + }, + "log_likelihood_vmap": -189709.78523837583, + "log_likelihood_scalar": -189709.09646469186, + "log_likelihood_library_pdip": -189709.75902380055, + "log_likelihood_library_pdip_scalar": -189709.0875481008, + "rel_diff_vmap_vs_library_pdip": 1.381825342748125e-07, + "rel_diff_scalar_vs_library_pdip_scalar": 4.7001391322481445e-08, + "abs_diff_nats": 0.6887736839707941, + "rel_diff": 3.6306834875416045e-06, + "rel_diff_scalar_vs_library_pdip": 3.492488273147288e-06, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 0.6714756997535005, + "rel_diff_library_pdip_vmap_vs_scalar": 3.539502026139089e-06, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "FAIL", + "certified": true, + "passes": 0, + "pdip_iter": null + }, + { + "lane": 3, + "draw_name": "call00015_lane03", + "draw_kind": "captured", + "offsets": { + "centre_0": 0.004594602299816973, + "centre_1": 0.004924922434755804, + "ell_comps_0": 0.028601845732661953, + "ell_comps_1": 0.003760187047606014, + "einstein_radius": -0.03088526730480501 + }, + "log_likelihood_vmap": -141741.97961988975, + "log_likelihood_scalar": -141741.96673891594, + "log_likelihood_library_pdip": -141741.98068412492, + "log_likelihood_library_pdip_scalar": -141741.96778345545, + "rel_diff_vmap_vs_library_pdip": 7.508256655999751e-09, + "rel_diff_scalar_vs_library_pdip_scalar": 7.369302953986941e-09, + "abs_diff_nats": 0.01288097380893305, + "rel_diff": 9.087621757541563e-08, + "rel_diff_scalar_vs_library_pdip": 9.83844652906073e-08, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 0.012900669476948678, + "rel_diff_library_pdip_vmap_vs_scalar": 9.101517129109932e-08, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "FAIL", + "certified": true, + "passes": 0, + "pdip_iter": null + }, + { + "lane": 4, + "draw_name": "call00015_lane04", + "draw_kind": "captured", + "offsets": { + "centre_0": -0.0060950290987001, + "centre_1": -0.0006121094560707545, + "ell_comps_0": 0.009637314264800585, + "ell_comps_1": 0.006641580028105454, + "einstein_radius": -0.03125810931551931 + }, + "log_likelihood_vmap": 24880.545932988694, + "log_likelihood_scalar": 24880.545932988724, + "log_likelihood_library_pdip": 24880.545932988694, + "log_likelihood_library_pdip_scalar": 24880.545932988738, + "rel_diff_vmap_vs_library_pdip": 0.0, + "rel_diff_scalar_vs_library_pdip_scalar": 5.84871218966007e-16, + "abs_diff_nats": 2.9103830456733704e-11, + "rel_diff": 1.1697424379320147e-15, + "rel_diff_scalar_vs_library_pdip": 1.169742437932016e-15, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 4.3655745685100555e-11, + "rel_diff_library_pdip_vmap_vs_scalar": 1.754613656898021e-15, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": true, + "passes": 10, + "pdip_iter": null + }, + { + "lane": 5, + "draw_name": "call00015_lane05", + "draw_kind": "captured", + "offsets": { + "centre_0": -0.008435952123169364, + "centre_1": -0.007849511137408794, + "ell_comps_0": -0.01598149485178925, + "ell_comps_1": 0.01654417876136871, + "einstein_radius": 0.014294380855379263 + }, + "log_likelihood_vmap": 25472.51918660302, + "log_likelihood_scalar": 25472.519186782392, + "log_likelihood_library_pdip": 25472.519186607446, + "log_likelihood_library_pdip_scalar": 25472.519186788668, + "rel_diff_vmap_vs_library_pdip": 1.73668815283468e-13, + "rel_diff_scalar_vs_library_pdip_scalar": 2.4636406773178535e-13, + "abs_diff_nats": 1.793705450836569e-07, + "rel_diff": 7.041727744648504e-12, + "rel_diff_scalar_vs_library_pdip": 6.868058929413398e-12, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 1.812222762964666e-07, + "rel_diff_library_pdip_vmap_vs_scalar": 7.1144229970963214e-12, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": true, + "passes": 4, + "pdip_iter": null + }, + { + "lane": 6, + "draw_name": "call00015_lane06", + "draw_kind": "captured", + "offsets": { + "centre_0": 0.0031698313356290646, + "centre_1": -0.0038584140676992847, + "ell_comps_0": 0.01810147576636289, + "ell_comps_1": -0.011577480306416508, + "einstein_radius": 0.016136835525067283 + }, + "log_likelihood_vmap": -83383.91643904251, + "log_likelihood_scalar": -83383.9154726328, + "log_likelihood_library_pdip": -83383.91634310859, + "log_likelihood_library_pdip_scalar": -83383.91559144364, + "rel_diff_vmap_vs_library_pdip": 1.1505087234545408e-09, + "rel_diff_scalar_vs_library_pdip_scalar": 1.424865247898061e-09, + "abs_diff_nats": 0.0009664097160566598, + "rel_diff": 1.1589881700552218e-08, + "rel_diff_scalar_vs_library_pdip": 1.043937285610658e-08, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 0.0007516649493481964, + "rel_diff_library_pdip_vmap_vs_scalar": 9.014507702314328e-09, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "FAIL", + "certified": true, + "passes": 0, + "pdip_iter": null + }, + { + "lane": 7, + "draw_name": "call00015_lane07", + "draw_kind": "captured", + "offsets": { + "centre_0": 0.006158729760195174, + "centre_1": 0.004883559265258847, + "ell_comps_0": 0.007613883677130215, + "ell_comps_1": -0.005800175617006949, + "einstein_radius": 0.0662922007765554 + }, + "log_likelihood_vmap": -11960.284433619381, + "log_likelihood_scalar": -11960.28442968028, + "log_likelihood_library_pdip": -11960.284433112196, + "log_likelihood_library_pdip_scalar": -11960.284430403837, + "rel_diff_vmap_vs_library_pdip": 4.240577891339571e-11, + "rel_diff_scalar_vs_library_pdip_scalar": 6.049668878301417e-11, + "abs_diff_nats": 3.939101588912308e-06, + "rel_diff": 3.293484876611423e-10, + "rel_diff_scalar_vs_library_pdip": 2.8694270865324245e-10, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 2.7083588065579534e-06, + "rel_diff_library_pdip_vmap_vs_scalar": 2.2644601993520535e-10, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": true, + "passes": 1, + "pdip_iter": null + }, + { + "lane": 8, + "draw_name": "call00015_lane08", + "draw_kind": "captured", + "offsets": { + "centre_0": 0.0030335293924908615, + "centre_1": 0.0012117081273721316, + "ell_comps_0": 0.0008852687687036301, + "ell_comps_1": -0.0027113633212058814, + "einstein_radius": -0.03873713959923952 + }, + "log_likelihood_vmap": 23223.550391412664, + "log_likelihood_scalar": 23223.550391492507, + "log_likelihood_library_pdip": 23223.550391416265, + "log_likelihood_library_pdip_scalar": 23223.550391494133, + "rel_diff_vmap_vs_library_pdip": 1.5508391087144e-13, + "rel_diff_scalar_vs_library_pdip_scalar": 7.00227355144457e-14, + "abs_diff_nats": 7.984272087924182e-08, + "rel_diff": 3.4380066584690102e-12, + "rel_diff_scalar_vs_library_pdip": 3.282922747608857e-12, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 7.786729838699102e-08, + "rel_diff_library_pdip_vmap_vs_scalar": 3.352945483112295e-12, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": true, + "passes": 4, + "pdip_iter": null + }, + { + "lane": 9, + "draw_name": "call00015_lane09", + "draw_kind": "captured", + "offsets": { + "centre_0": -0.0008035510098975272, + "centre_1": 0.005559773241319952, + "ell_comps_0": -0.003701655436278317, + "ell_comps_1": -0.012378591445614512, + "einstein_radius": 0.032284336889985665 + }, + "log_likelihood_vmap": -177119.19820193516, + "log_likelihood_scalar": -177117.8065188944, + "log_likelihood_library_pdip": -177118.66823404492, + "log_likelihood_library_pdip_scalar": -177117.75734277815, + "rel_diff_vmap_vs_library_pdip": 2.992162799785495e-06, + "rel_diff_scalar_vs_library_pdip_scalar": 2.776464482099952e-07, + "abs_diff_nats": 1.3916830407688394, + "rel_diff": 7.857386380969996e-06, + "rel_diff_scalar_vs_library_pdip": 4.8651853535433625e-06, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 0.9108912667725235, + "rel_diff_library_pdip_vmap_vs_scalar": 5.142856822705047e-06, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "FAIL", + "certified": true, + "passes": 0, + "pdip_iter": null + }, + { + "lane": 10, + "draw_name": "call00015_lane10", + "draw_kind": "captured", + "offsets": { + "centre_0": -0.008473569241265282, + "centre_1": -0.0051993251621340235, + "ell_comps_0": -0.0031466996514049606, + "ell_comps_1": -0.0076036423480284636, + "einstein_radius": 0.08283321334626792 + }, + "log_likelihood_vmap": -101745.38549198136, + "log_likelihood_scalar": -101745.38336119395, + "log_likelihood_library_pdip": -101745.38555231605, + "log_likelihood_library_pdip_scalar": -101745.38339146243, + "rel_diff_vmap_vs_library_pdip": 5.929967725911666e-10, + "rel_diff_scalar_vs_library_pdip_scalar": 2.9749240143568695e-10, + "abs_diff_nats": 0.0021307874121703207, + "rel_diff": 2.0942349832287432e-08, + "rel_diff_scalar_vs_library_pdip": 2.1535346153877847e-08, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 0.0021608536189887673, + "rel_diff_library_pdip_vmap_vs_scalar": 2.1237854209806704e-08, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": true, + "passes": 2, + "pdip_iter": null + }, + { + "lane": 11, + "draw_name": "call00015_lane11", + "draw_kind": "captured", + "offsets": { + "centre_0": 0.001017060353322001, + "centre_1": 0.003035861051809724, + "ell_comps_0": 0.0014054844842678396, + "ell_comps_1": -0.00019678252877009805, + "einstein_radius": -0.04179610309843307 + }, + "log_likelihood_vmap": 18957.528349913606, + "log_likelihood_scalar": 18957.528349715554, + "log_likelihood_library_pdip": 18957.5283499144, + "log_likelihood_library_pdip_scalar": 18957.52834974652, + "rel_diff_vmap_vs_library_pdip": 4.1834534824766567e-14, + "rel_diff_scalar_vs_library_pdip_scalar": 1.6334658735392955e-12, + "abs_diff_nats": 1.9805156625807285e-07, + "rel_diff": 1.0447119614147616e-11, + "rel_diff_scalar_vs_library_pdip": 1.0488954148862804e-11, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 1.6787817003205419e-07, + "rel_diff_library_pdip_vmap_vs_scalar": 8.855488275416393e-12, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": false, + "passes": 16, + "pdip_iter": null + }, + { + "lane": 12, + "draw_name": "call00015_lane12", + "draw_kind": "captured", + "offsets": { + "centre_0": -0.0012508260776529923, + "centre_1": -0.0075763258203543175, + "ell_comps_0": -0.0003476568325791879, + "ell_comps_1": 0.0070528223693464365, + "einstein_radius": -0.005182936058341969 + }, + "log_likelihood_vmap": 24810.049660195116, + "log_likelihood_scalar": 24810.04966019512, + "log_likelihood_library_pdip": 24810.049660194898, + "log_likelihood_library_pdip_scalar": 24810.049660194905, + "rel_diff_vmap_vs_library_pdip": 8.797996433506053e-15, + "rel_diff_scalar_vs_library_pdip_scalar": 8.651363159614284e-15, + "abs_diff_nats": 3.637978807091713e-12, + "rel_diff": 1.4663327389176625e-16, + "rel_diff_scalar_vs_library_pdip": 8.944629707397821e-15, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 7.275957614183426e-12, + "rel_diff_library_pdip_vmap_vs_scalar": 2.93266547783535e-16, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": true, + "passes": 9, + "pdip_iter": null + }, + { + "lane": 13, + "draw_name": "call00015_lane13", + "draw_kind": "captured", + "offsets": { + "centre_0": 0.0039046265841316857, + "centre_1": 0.008586063066835778, + "ell_comps_0": 0.01612319103606081, + "ell_comps_1": -0.006478405394829051, + "einstein_radius": -0.06420305523683667 + }, + "log_likelihood_vmap": -3605.7062167846816, + "log_likelihood_scalar": -3605.706215981947, + "log_likelihood_library_pdip": -3605.7062168321354, + "log_likelihood_library_pdip_scalar": -3605.7062159505294, + "rel_diff_vmap_vs_library_pdip": 1.3160749297372256e-11, + "rel_diff_scalar_vs_library_pdip_scalar": 8.713295841758364e-12, + "abs_diff_nats": 8.027345757000148e-07, + "rel_diff": 2.2262894634675748e-10, + "rel_diff_scalar_vs_library_pdip": 2.3578969559163613e-10, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 8.816059562377632e-07, + "rel_diff_library_pdip_vmap_vs_scalar": 2.445029914910458e-10, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": true, + "passes": 2, + "pdip_iter": null + }, + { + "lane": 14, + "draw_name": "call00015_lane14", + "draw_kind": "captured", + "offsets": { + "centre_0": 0.007195835212073937, + "centre_1": -0.0022675171274400335, + "ell_comps_0": 0.004220685262914858, + "ell_comps_1": 0.006581974817750368, + "einstein_radius": 0.08589577997501685 + }, + "log_likelihood_vmap": 11126.92147574079, + "log_likelihood_scalar": 11126.921475785763, + "log_likelihood_library_pdip": 11126.92147574079, + "log_likelihood_library_pdip_scalar": 11126.921475785763, + "rel_diff_vmap_vs_library_pdip": 0.0, + "rel_diff_scalar_vs_library_pdip_scalar": 0.0, + "abs_diff_nats": 4.4972694013267756e-08, + "rel_diff": 4.041791263750414e-12, + "rel_diff_scalar_vs_library_pdip": 4.04179126376675e-12, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 4.4972694013267756e-08, + "rel_diff_library_pdip_vmap_vs_scalar": 4.041791263750414e-12, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": false, + "passes": 16, + "pdip_iter": null + }, + { + "lane": 15, + "draw_name": "call00015_lane15", + "draw_kind": "captured", + "offsets": { + "centre_0": 0.0024446743118905125, + "centre_1": 0.0028324231769206983, + "ell_comps_0": -0.017159158004659933, + "ell_comps_1": 0.008265799441903459, + "einstein_radius": -0.03860302877433641 + }, + "log_likelihood_vmap": 20410.34397373377, + "log_likelihood_scalar": 20410.34397372348, + "log_likelihood_library_pdip": 20410.343973733456, + "log_likelihood_library_pdip_scalar": 20410.343973722393, + "rel_diff_vmap_vs_library_pdip": 1.532880473805449e-14, + "rel_diff_scalar_vs_library_pdip_scalar": 5.329433275210206e-14, + "abs_diff_nats": 1.0288204066455364e-08, + "rel_diff": 5.040681372004568e-13, + "rel_diff_scalar_vs_library_pdip": 4.88739332462156e-13, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 1.1063093552365899e-08, + "rel_diff_library_pdip_vmap_vs_scalar": 5.420336652145229e-13, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": false, + "passes": 16, + "pdip_iter": null + }, + { + "lane": 16, + "draw_name": "call00015_lane16", + "draw_kind": "captured", + "offsets": { + "centre_0": 0.00546338030193603, + "centre_1": 0.0029217319844296002, + "ell_comps_0": 0.018887239108742314, + "ell_comps_1": 0.01610145140759906, + "einstein_radius": 0.09308737119031596 + }, + "log_likelihood_vmap": 9734.86224168558, + "log_likelihood_scalar": 9734.862241683746, + "log_likelihood_library_pdip": 9734.86224168339, + "log_likelihood_library_pdip_scalar": 9734.862241682975, + "rel_diff_vmap_vs_library_pdip": 2.2497115906701286e-13, + "rel_diff_scalar_vs_library_pdip_scalar": 7.922572379104445e-14, + "abs_diff_nats": 1.8335413187742233e-09, + "rel_diff": 1.8834794712586433e-13, + "rel_diff_scalar_vs_library_pdip": 3.6623211941141626e-14, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 4.147295840084553e-10, + "rel_diff_library_pdip_vmap_vs_scalar": 4.260251184990126e-14, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": true, + "passes": 16, + "pdip_iter": null + }, + { + "lane": 17, + "draw_name": "call00015_lane17", + "draw_kind": "captured", + "offsets": { + "centre_0": -0.0033403521024317102, + "centre_1": -0.004078467297591464, + "ell_comps_0": -0.01076606265657356, + "ell_comps_1": 0.014404445881011321, + "einstein_radius": -0.016103243806114165 + }, + "log_likelihood_vmap": 19481.557219621747, + "log_likelihood_scalar": 19481.557217641563, + "log_likelihood_library_pdip": 19481.557219621747, + "log_likelihood_library_pdip_scalar": 19481.557217641563, + "rel_diff_vmap_vs_library_pdip": 0.0, + "rel_diff_scalar_vs_library_pdip_scalar": 0.0, + "abs_diff_nats": 1.980184606509283e-06, + "rel_diff": 1.0164406183691123e-10, + "rel_diff_scalar_vs_library_pdip": 1.0164406182657971e-10, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 1.980184606509283e-06, + "rel_diff_library_pdip_vmap_vs_scalar": 1.0164406183691123e-10, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": false, + "passes": 16, + "pdip_iter": null + }, + { + "lane": 18, + "draw_name": "call00015_lane18", + "draw_kind": "captured", + "offsets": { + "centre_0": -0.0036504937209151113, + "centre_1": -0.0003963555596475738, + "ell_comps_0": -0.008227000946306733, + "ell_comps_1": -0.02487475830854786, + "einstein_radius": -0.0327871904693704 + }, + "log_likelihood_vmap": 18812.94686042335, + "log_likelihood_scalar": 18812.946857997056, + "log_likelihood_library_pdip": 18812.94686042335, + "log_likelihood_library_pdip_scalar": 18812.946857997056, + "rel_diff_vmap_vs_library_pdip": 0.0, + "rel_diff_scalar_vs_library_pdip_scalar": 0.0, + "abs_diff_nats": 2.4262953957077116e-06, + "rel_diff": 1.2896944928520519e-10, + "rel_diff_scalar_vs_library_pdip": 1.2896944926857206e-10, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 2.4262953957077116e-06, + "rel_diff_library_pdip_vmap_vs_scalar": 1.2896944928520519e-10, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": false, + "passes": 16, + "pdip_iter": null + }, + { + "lane": 19, + "draw_name": "call00015_lane19", + "draw_kind": "captured", + "offsets": { + "centre_0": 0.00840275144875603, + "centre_1": -0.003628185056462521, + "ell_comps_0": 0.005265994929748281, + "ell_comps_1": 0.009958068668923414, + "einstein_radius": -0.06501253116347949 + }, + "log_likelihood_vmap": 16927.63254956939, + "log_likelihood_scalar": 16927.63254956905, + "log_likelihood_library_pdip": 16927.63254956939, + "log_likelihood_library_pdip_scalar": 16927.63254956903, + "rel_diff_vmap_vs_library_pdip": 0.0, + "rel_diff_scalar_vs_library_pdip_scalar": 1.2894817263212632e-15, + "abs_diff_nats": 3.383320290595293e-10, + "rel_diff": 1.9986966757979556e-14, + "rel_diff_scalar_vs_library_pdip": 1.9986966757979155e-14, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 3.601599019020796e-10, + "rel_diff_library_pdip_vmap_vs_scalar": 2.1276448484300842e-14, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": false, + "passes": 16, + "pdip_iter": null + } + ], + "lane_pins": [ + { + "pin": "lane 0: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 24758.506194309346, + "reference_value": 24758.506194309142, + "rel_diff": 8.228558362861305e-15, + "abs_diff_nats": 2.0372681319713593e-10, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 0: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 24758.506194309346, + "reference_value": 24758.506194309142, + "rel_diff": 8.228558362861305e-15, + "abs_diff_nats": 2.0372681319713593e-10, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 0: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 24758.506194309346, + "reference_value": 24758.506194309346, + "rel_diff": 0.0, + "abs_diff_nats": 0.0, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 0: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 24758.506194309142, + "reference_value": 24758.506194309142, + "rel_diff": 0.0, + "abs_diff_nats": 0.0, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 1: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 20551.004887772666, + "reference_value": 20551.004887772702, + "rel_diff": 1.7702194257450706e-15, + "abs_diff_nats": 3.637978807091713e-11, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 1: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 20551.00488777375, + "reference_value": 20551.004887771745, + "rel_diff": 9.753909035855792e-14, + "abs_diff_nats": 2.004526322707534e-09, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 1: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 20551.004887772666, + "reference_value": 20551.00488777375, + "rel_diff": 5.275253888720041e-14, + "abs_diff_nats": 1.0841176845133305e-09, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 1: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 20551.004887772702, + "reference_value": 20551.004887771745, + "rel_diff": 4.655677089709752e-14, + "abs_diff_nats": 9.567884262651205e-10, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 2: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -189709.78523837583, + "reference_value": -189709.75902380055, + "rel_diff": 1.381825342748125e-07, + "abs_diff_nats": 0.026214575278572738, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 2: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -189709.09646469186, + "reference_value": -189709.0875481008, + "rel_diff": 4.7001391322481445e-08, + "abs_diff_nats": 0.008916591061279178, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 2: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -189709.78523837583, + "reference_value": -189709.09646469186, + "rel_diff": 3.6306834875416045e-06, + "abs_diff_nats": 0.6887736839707941, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 2: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -189709.75902380055, + "reference_value": -189709.0875481008, + "rel_diff": 3.539502026139089e-06, + "abs_diff_nats": 0.6714756997535005, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 3: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -141741.97961988975, + "reference_value": -141741.98068412492, + "rel_diff": 7.508256655999751e-09, + "abs_diff_nats": 0.0010642351699061692, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 3: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -141741.96673891594, + "reference_value": -141741.96778345545, + "rel_diff": 7.369302953986941e-09, + "abs_diff_nats": 0.0010445395018905401, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 3: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -141741.97961988975, + "reference_value": -141741.96673891594, + "rel_diff": 9.087621757541563e-08, + "abs_diff_nats": 0.01288097380893305, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 3: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -141741.98068412492, + "reference_value": -141741.96778345545, + "rel_diff": 9.101517129109932e-08, + "abs_diff_nats": 0.012900669476948678, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 4: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 24880.545932988694, + "reference_value": 24880.545932988694, + "rel_diff": 0.0, + "abs_diff_nats": 0.0, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 4: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 24880.545932988724, + "reference_value": 24880.545932988738, + "rel_diff": 5.84871218966007e-16, + "abs_diff_nats": 1.4551915228366852e-11, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 4: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 24880.545932988694, + "reference_value": 24880.545932988724, + "rel_diff": 1.1697424379320147e-15, + "abs_diff_nats": 2.9103830456733704e-11, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 4: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 24880.545932988694, + "reference_value": 24880.545932988738, + "rel_diff": 1.754613656898021e-15, + "abs_diff_nats": 4.3655745685100555e-11, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 5: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 25472.51918660302, + "reference_value": 25472.519186607446, + "rel_diff": 1.73668815283468e-13, + "abs_diff_nats": 4.423782229423523e-09, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 5: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 25472.519186782392, + "reference_value": 25472.519186788668, + "rel_diff": 2.4636406773178535e-13, + "abs_diff_nats": 6.275513442233205e-09, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 5: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 25472.51918660302, + "reference_value": 25472.519186782392, + "rel_diff": 7.041727744648504e-12, + "abs_diff_nats": 1.793705450836569e-07, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 5: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 25472.519186607446, + "reference_value": 25472.519186788668, + "rel_diff": 7.1144229970963214e-12, + "abs_diff_nats": 1.812222762964666e-07, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 6: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -83383.91643904251, + "reference_value": -83383.91634310859, + "rel_diff": 1.1505087234545408e-09, + "abs_diff_nats": 9.593392314855009e-05, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 6: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -83383.9154726328, + "reference_value": -83383.91559144364, + "rel_diff": 1.424865247898061e-09, + "abs_diff_nats": 0.00011881084355991334, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 6: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -83383.91643904251, + "reference_value": -83383.9154726328, + "rel_diff": 1.1589881700552218e-08, + "abs_diff_nats": 0.0009664097160566598, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 6: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -83383.91634310859, + "reference_value": -83383.91559144364, + "rel_diff": 9.014507702314328e-09, + "abs_diff_nats": 0.0007516649493481964, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 7: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -11960.284433619381, + "reference_value": -11960.284433112196, + "rel_diff": 4.240577891339571e-11, + "abs_diff_nats": 5.071851774118841e-07, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 7: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -11960.28442968028, + "reference_value": -11960.284430403837, + "rel_diff": 6.049668878301417e-11, + "abs_diff_nats": 7.235576049424708e-07, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 7: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -11960.284433619381, + "reference_value": -11960.28442968028, + "rel_diff": 3.293484876611423e-10, + "abs_diff_nats": 3.939101588912308e-06, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 7: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -11960.284433112196, + "reference_value": -11960.284430403837, + "rel_diff": 2.2644601993520535e-10, + "abs_diff_nats": 2.7083588065579534e-06, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 8: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 23223.550391412664, + "reference_value": 23223.550391416265, + "rel_diff": 1.5508391087144e-13, + "abs_diff_nats": 3.601599019020796e-09, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 8: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 23223.550391492507, + "reference_value": 23223.550391494133, + "rel_diff": 7.00227355144457e-14, + "abs_diff_nats": 1.6261765267699957e-09, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 8: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 23223.550391412664, + "reference_value": 23223.550391492507, + "rel_diff": 3.4380066584690102e-12, + "abs_diff_nats": 7.984272087924182e-08, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 8: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 23223.550391416265, + "reference_value": 23223.550391494133, + "rel_diff": 3.352945483112295e-12, + "abs_diff_nats": 7.786729838699102e-08, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 9: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -177119.19820193516, + "reference_value": -177118.66823404492, + "rel_diff": 2.992162799785495e-06, + "abs_diff_nats": 0.529967890237458, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 9: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -177117.8065188944, + "reference_value": -177117.75734277815, + "rel_diff": 2.776464482099952e-07, + "abs_diff_nats": 0.049176116241142154, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 9: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -177119.19820193516, + "reference_value": -177117.8065188944, + "rel_diff": 7.857386380969996e-06, + "abs_diff_nats": 1.3916830407688394, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 9: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -177118.66823404492, + "reference_value": -177117.75734277815, + "rel_diff": 5.142856822705047e-06, + "abs_diff_nats": 0.9108912667725235, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 10: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -101745.38549198136, + "reference_value": -101745.38555231605, + "rel_diff": 5.929967725911666e-10, + "abs_diff_nats": 6.033468525856733e-05, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 10: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -101745.38336119395, + "reference_value": -101745.38339146243, + "rel_diff": 2.9749240143568695e-10, + "abs_diff_nats": 3.0268478440120816e-05, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 10: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -101745.38549198136, + "reference_value": -101745.38336119395, + "rel_diff": 2.0942349832287432e-08, + "abs_diff_nats": 0.0021307874121703207, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 10: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -101745.38555231605, + "reference_value": -101745.38339146243, + "rel_diff": 2.1237854209806704e-08, + "abs_diff_nats": 0.0021608536189887673, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 11: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 18957.528349913606, + "reference_value": 18957.5283499144, + "rel_diff": 4.1834534824766567e-14, + "abs_diff_nats": 7.930793799459934e-10, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 11: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 18957.528349715554, + "reference_value": 18957.52834974652, + "rel_diff": 1.6334658735392955e-12, + "abs_diff_nats": 3.096647560596466e-08, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 11: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 18957.528349913606, + "reference_value": 18957.528349715554, + "rel_diff": 1.0447119614147616e-11, + "abs_diff_nats": 1.9805156625807285e-07, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 11: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 18957.5283499144, + "reference_value": 18957.52834974652, + "rel_diff": 8.855488275416393e-12, + "abs_diff_nats": 1.6787817003205419e-07, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 12: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 24810.049660195116, + "reference_value": 24810.049660194898, + "rel_diff": 8.797996433506053e-15, + "abs_diff_nats": 2.1827872842550278e-10, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 12: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 24810.04966019512, + "reference_value": 24810.049660194905, + "rel_diff": 8.651363159614284e-15, + "abs_diff_nats": 2.1464074961841106e-10, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 12: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 24810.049660195116, + "reference_value": 24810.04966019512, + "rel_diff": 1.4663327389176625e-16, + "abs_diff_nats": 3.637978807091713e-12, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 12: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 24810.049660194898, + "reference_value": 24810.049660194905, + "rel_diff": 2.93266547783535e-16, + "abs_diff_nats": 7.275957614183426e-12, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 13: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -3605.7062167846816, + "reference_value": -3605.7062168321354, + "rel_diff": 1.3160749297372256e-11, + "abs_diff_nats": 4.7453795559704304e-08, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 13: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -3605.706215981947, + "reference_value": -3605.7062159505294, + "rel_diff": 8.713295841758364e-12, + "abs_diff_nats": 3.141758497804403e-08, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 13: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -3605.7062167846816, + "reference_value": -3605.706215981947, + "rel_diff": 2.2262894634675748e-10, + "abs_diff_nats": 8.027345757000148e-07, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 13: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -3605.7062168321354, + "reference_value": -3605.7062159505294, + "rel_diff": 2.445029914910458e-10, + "abs_diff_nats": 8.816059562377632e-07, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 14: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 11126.92147574079, + "reference_value": 11126.92147574079, + "rel_diff": 0.0, + "abs_diff_nats": 0.0, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 14: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 11126.921475785763, + "reference_value": 11126.921475785763, + "rel_diff": 0.0, + "abs_diff_nats": 0.0, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 14: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 11126.92147574079, + "reference_value": 11126.921475785763, + "rel_diff": 4.041791263750414e-12, + "abs_diff_nats": 4.4972694013267756e-08, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 14: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 11126.92147574079, + "reference_value": 11126.921475785763, + "rel_diff": 4.041791263750414e-12, + "abs_diff_nats": 4.4972694013267756e-08, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 15: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 20410.34397373377, + "reference_value": 20410.343973733456, + "rel_diff": 1.532880473805449e-14, + "abs_diff_nats": 3.128661774098873e-10, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 15: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 20410.34397372348, + "reference_value": 20410.343973722393, + "rel_diff": 5.329433275210206e-14, + "abs_diff_nats": 1.0877556633204222e-09, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 15: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 20410.34397373377, + "reference_value": 20410.34397372348, + "rel_diff": 5.040681372004568e-13, + "abs_diff_nats": 1.0288204066455364e-08, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 15: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 20410.343973733456, + "reference_value": 20410.343973722393, + "rel_diff": 5.420336652145229e-13, + "abs_diff_nats": 1.1063093552365899e-08, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 16: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 9734.86224168558, + "reference_value": 9734.86224168339, + "rel_diff": 2.2497115906701286e-13, + "abs_diff_nats": 2.190063241869211e-09, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 16: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 9734.862241683746, + "reference_value": 9734.862241682975, + "rel_diff": 7.922572379104445e-14, + "abs_diff_nats": 7.712515071034431e-10, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 16: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 9734.86224168558, + "reference_value": 9734.862241683746, + "rel_diff": 1.8834794712586433e-13, + "abs_diff_nats": 1.8335413187742233e-09, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 16: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 9734.86224168339, + "reference_value": 9734.862241682975, + "rel_diff": 4.260251184990126e-14, + "abs_diff_nats": 4.147295840084553e-10, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 17: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 19481.557219621747, + "reference_value": 19481.557219621747, + "rel_diff": 0.0, + "abs_diff_nats": 0.0, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 17: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 19481.557217641563, + "reference_value": 19481.557217641563, + "rel_diff": 0.0, + "abs_diff_nats": 0.0, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 17: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 19481.557219621747, + "reference_value": 19481.557217641563, + "rel_diff": 1.0164406183691123e-10, + "abs_diff_nats": 1.980184606509283e-06, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 17: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 19481.557219621747, + "reference_value": 19481.557217641563, + "rel_diff": 1.0164406183691123e-10, + "abs_diff_nats": 1.980184606509283e-06, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 18: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 18812.94686042335, + "reference_value": 18812.94686042335, + "rel_diff": 0.0, + "abs_diff_nats": 0.0, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 18: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 18812.946857997056, + "reference_value": 18812.946857997056, + "rel_diff": 0.0, + "abs_diff_nats": 0.0, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 18: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 18812.94686042335, + "reference_value": 18812.946857997056, + "rel_diff": 1.2896944928520519e-10, + "abs_diff_nats": 2.4262953957077116e-06, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 18: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 18812.94686042335, + "reference_value": 18812.946857997056, + "rel_diff": 1.2896944928520519e-10, + "abs_diff_nats": 2.4262953957077116e-06, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 19: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 16927.63254956939, + "reference_value": 16927.63254956939, + "rel_diff": 0.0, + "abs_diff_nats": 0.0, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 19: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 16927.63254956905, + "reference_value": 16927.63254956903, + "rel_diff": 1.2894817263212632e-15, + "abs_diff_nats": 2.1827872842550278e-11, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 19: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 16927.63254956939, + "reference_value": 16927.63254956905, + "rel_diff": 1.9986966757979556e-14, + "abs_diff_nats": 3.383320290595293e-10, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 19: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 16927.63254956939, + "reference_value": 16927.63254956903, + "rel_diff": 2.1276448484300842e-14, + "abs_diff_nats": 3.601599019020796e-10, + "within_rtol": true, + "status": "RECORDED" + } + ], + "lanes_failed": 4, + "arm_rows": { + "vmap": { + "arm": "vmap", + "program": "jax.jit(jax.vmap(fn))", + "stands_for": "Nautilus(use_jax_vmap=True) \u2014 Fitness._vmap", + "hlo_source": "jax.jit(jax.vmap(fn)).lower(batched_tree) \u2014 the exact current Fitness._vmap composition (PyAutoFit#1638)", + "batch_wall_ms": 1087.2213063001254, + "wall_production_nesting_ms": 1087.2213063001254, + "wall_aot_command_buffers_on_ms": 1087.965231400085, + "wall_aot_command_buffers_off_ms": 1087.4690682998335, + "command_buffer_delta_ms": -0.4961631002515787, + "production_nesting_vs_aot_on_delta_ms": -0.743925099959597, + "production_nesting_vs_aot_on_delta_pct": -0.06837765385225149, + "wall_per_lane_ms": 54.36106531500627, + "wall_per_lane_command_buffers_off_ms": 54.37345341499167, + "traced_batch_wall_ms": 1104.6436848002486, + "untraced_batch_wall_ms": 1088.6439894999057, + "traced_wall_per_lane_ms": 55.23218424001243, + "callback_count_per_call": 20.0, + "callback_count_per_lane": 1.0, + "callback_expectation": "B per batched call \u2014 the qhull pure_callback is vmap_method='sequential'", + "host_qhull_ms": 89.15744930018263, + "host_tables_ms": 2.2919884027942317, + "host_qhull_ms_per_lane": 4.457872465009132, + "host_tables_ms_per_lane": 0.11459942013971158, + "host_callback_probe": { + "calls": 200, + "qhull_ms_total": 891.5744930018263, + "tables_ms_total": 22.919884027942317, + "total_ms_total": 914.4943770297687, + "qhull_ms_mean": 4.457872465009132, + "tables_ms_mean": 0.11459942013971158, + "total_ms_mean": 4.572471885148843, + "non_finite_calls": 0, + "n_points": [ + 1500 + ] + }, + "host_callback_records_first": [ + { + "n_points": 1500, + "qhull_ms": 4.677154996898025, + "tables_ms": 0.18203800209448673, + "total_ms": 4.859192998992512, + "finite": true + }, + { + "n_points": 1500, + "qhull_ms": 4.4130870010121725, + "tables_ms": 0.10997999925166368, + "total_ms": 4.523067000263836, + "finite": true + }, + { + "n_points": 1500, + "qhull_ms": 4.448677998880157, + "tables_ms": 0.12658800187637098, + "total_ms": 4.575266000756528, + "finite": true + }, + { + "n_points": 1500, + "qhull_ms": 4.559725999570219, + "tables_ms": 0.10892800128203817, + "total_ms": 4.668654000852257, + "finite": true + } + ], + "device_idle_ms": 133.6681006, + "device_idle_ms_per_lane": 6.68340503, + "trace": { + "parser": "ProfileData.from_file(xplane) + as_text() + stack_frame_index(proto field 17)", + "stage_audit": { + "mixed_fusion": [ + { + "instruction": "loop_divide_gather_fusion", + "ms": 21.202663899999997, + "opcode": "fusion", + "shape": "(f64[15361,20,1,1,1500]{4,3,2,1,0}, f64[15361,20,1,1,1500]{4,3,2,1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:133", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:133 (curvature_matrix_via_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:93 (InversionImagingMapping.curvature_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:389 (AbstractInversion.curvature_reg_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "loop_broadcast_fusion.7", + "ms": 5.021317099999999, + "opcode": "fusion", + "shape": "f64[20,1500,180,180]{3,2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "input_reduce_fusion.18", + "ms": 2.6243955999999997, + "opcode": "fusion", + "shape": "f64[92,20,1500]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/inversion_imaging_util.py:123", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/inversion_imaging_util.py:123 (data_vector_via_blurred_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:67 (InversionImagingMapping.data_vector)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:699 (AbstractInversion.reconstruction)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "input_reduce_fusion.22", + "ms": 2.1909431, + "opcode": "fusion", + "shape": "f64[15361,20]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:163", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:163 (mapped_reconstructed_data_via_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:120 (InversionImagingMapping._mapped_reconstructed_data_dict_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:196 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "loop_broadcast_fusion.8", + "ms": 2.117994, + "opcode": "fusion", + "shape": "f64[15361,20,1500]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:353", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:353 (mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/abstract.py:283 (Mapper.mapping_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:91 (AbstractInversionImaging._mapping_matrix_for_convolution_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:137 (AbstractInversionImaging.operated_mapping_matrix_list)" + ] + }, + { + "instruction": "input_multiply_transpose_fusion", + "ms": 1.8979407, + "opcode": "fusion", + "shape": "(f64[20,1500,1500]{2,1,0}, f64[20,1500,1500]{2,1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:491", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:491 (reconstruction_positive_only_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:706 (AbstractInversion.reconstruction)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:113 (InversionImagingMapping._mapped_reconstructed_data_dict_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:196 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)" + ] + } + ], + "other": [ + { + "instruction": "copy.138", + "ms": 0.0484356999999999, + "opcode": "copy", + "shape": "f64[1,20,1024,2]{3,2,1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "copy.140", + "ms": 0.04055390000000005, + "opcode": "copy", + "shape": "s32[1,3000,3]{2,1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "copy.141", + "ms": 0.0400260000000001, + "opcode": "copy", + "shape": "s32[1,3000,3]{2,1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "copy.142", + "ms": 0.039894800000000105, + "opcode": "copy", + "shape": "f64[1,1500,2]{2,1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "copy.139", + "ms": 0.03945300000000007, + "opcode": "copy", + "shape": "s32[1,1500]{1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "copy.122", + "ms": 0.03813460000000002, + "opcode": "copy", + "shape": "s32[20]{0}", + "source": "", + "stack": [] + } + ], + "mesh_qhull_callback": [ + { + "instruction": "pure_callback.0", + "ms": 0.21491770000000038, + "opcode": "custom-call", + "shape": "(s32[3000,3]{1,0}, s32[3000,3]{1,0}, s32[1500]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:161", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:161 (_jax_delaunay_tables)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:405 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + }, + { + "instruction": "loop_add_fusion.1", + "ms": 0.030790499999999964, + "opcode": "fusion", + "shape": "s64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:161", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:161 (_jax_delaunay_tables)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:405 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + }, + { + "instruction": "loop_broadcast_fusion.3", + "ms": 0.0020096, + "opcode": "fusion", + "shape": "s32[20,1500]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:161", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:161 (_jax_delaunay_tables)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:405 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + } + ], + "border_relocator": [ + { + "instruction": "custom-call.2", + "ms": 0.04224010000000001, + "opcode": "custom-call", + "shape": "(f64[20,2,2]{2,1,0}, s8[4194304]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:242", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:242 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:454 (BorderRelocator.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:176 (AbstractMesh.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:214 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "loop_add_rsqrt_fusion", + "ms": 0.015219300000000002, + "opcode": "fusion", + "shape": "(f64[20,15361]{1,0}, f64[20,15361]{1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:311", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:311 (relocated_grid_via_ellipse_border_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:423 (BorderRelocator.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:83 (AbstractMesh.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:208 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "eigh.34", + "ms": 0.014675299999999995, + "opcode": "custom-call", + "shape": "(f64[20,2,2]{1,2,0}, f64[20,2]{1,0}, s32[20]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:245", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:245 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:454 (BorderRelocator.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:176 (AbstractMesh.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:214 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "loop_add_fusion.4", + "ms": 0.0039041, + "opcode": "fusion", + "shape": "f64[20,1500]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:308", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:308 (relocated_grid_via_ellipse_border_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:458 (BorderRelocator.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:176 (AbstractMesh.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:214 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "input_reduce_fusion.23", + "ms": 0.0033503999999999995, + "opcode": "fusion", + "shape": "f64[20]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:270", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:270 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:454 (BorderRelocator.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:176 (AbstractMesh.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:214 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "input_reduce_fusion.24", + "ms": 0.0033312, + "opcode": "fusion", + "shape": "f64[20]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:269", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:269 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:454 (BorderRelocator.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:176 (AbstractMesh.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:214 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + } + ], + "mesh_construction": [ + { + "instruction": "loop_compare_fusion.5", + "ms": 0.0042496, + "opcode": "fusion", + "shape": "pred[20,6000,3]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:736", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:736 (DelaunayInterface.splitted_sizes)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:997 (InterpolatorDelaunay._mappings_sizes_weights_split)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt_split.py:124 (AdaptSplit.regularization_matrix_from)" + ] + }, + { + "instruction": "loop_multiply_fusion.4", + "ms": 0.0024031999999999994, + "opcode": "fusion", + "shape": "f64[20,1500]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:412", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:412 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "input_concatenate_fusion.10", + "ms": 0.0023168, + "opcode": "fusion", + "shape": "f64[20,1500,2]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:820", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:820 (InterpolatorDelaunay.mesh_grid_xy)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:847 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + } + ], + "mesh_seed_argmin": [ + { + "instruction": "input_reduce_fusion", + "ms": 1.6258166999999977, + "opcode": "fusion", + "shape": "(f64[20,1024]{1,0}, s64[20,1024]{1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:191", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:191 (_nearest_vertex_seed_from..argmin_chunk)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204 (_nearest_vertex_seed_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:351 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)" + ] + }, + { + "instruction": "loop_dynamic_update_slice_fusion", + "ms": 0.047878699999999844, + "opcode": "fusion", + "shape": "s32[21,20,1024]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204 (_nearest_vertex_seed_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:351 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "loop_add_fusion", + "ms": 0.03184359999999992, + "opcode": "fusion", + "shape": "s64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204 (_nearest_vertex_seed_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:351 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "loop_broadcast_fusion.4", + "ms": 0.0026527999999999994, + "opcode": "fusion", + "shape": "s32[21,20,1024]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204 (_nearest_vertex_seed_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:351 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "pdip_solve": [ + { + "instruction": "cholesky.80", + "ms": 214.59929849997786, + "opcode": "custom-call", + "shape": "(f64[20,1500,1500]{1,2,0}, s32[20]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:106", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:106 (factorize_kkt)", + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:212 (pdip_pc_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:83 (solve_nnls)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:129 (_solve_nnls_primal_with..primal)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:164 (solve_nnls_primal_with_status)" + ] + }, + { + "instruction": "cholesky.60", + "ms": 113.26437749998553, + "opcode": "custom-call", + "shape": "(f64[20,1500,1500]{1,2,0}, s32[20]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:252 (active_set_search..body_fun)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:262 (active_set_search)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:293 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)" + ] + }, + { + "instruction": "triangular-solve", + "ms": 55.21126220000091, + "opcode": "custom-call", + "shape": "(f64[20,1500,1]{1,2,0}, s8[320]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146 (solve_kkt_rhs)", + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:213 (pdip_pc_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:83 (solve_nnls)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:129 (_solve_nnls_primal_with..primal)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:164 (solve_nnls_primal_with_status)" + ] + }, + { + "instruction": "triangular-solve.2", + "ms": 51.438534200000134, + "opcode": "custom-call", + "shape": "(f64[20,1500,1]{1,2,0}, s8[320]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146 (solve_kkt_rhs)", + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:217 (pdip_pc_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:83 (solve_nnls)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:129 (_solve_nnls_primal_with..primal)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:164 (solve_nnls_primal_with_status)" + ] + }, + { + "instruction": "triangular-solve.3", + "ms": 50.28250209999937, + "opcode": "custom-call", + "shape": "(f64[20,1500,1]{1,2,0}, s8[320]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146 (solve_kkt_rhs)", + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:217 (pdip_pc_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:83 (solve_nnls)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:129 (_solve_nnls_primal_with..primal)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:164 (solve_nnls_primal_with_status)" + ] + }, + { + "instruction": "triangular-solve.1", + "ms": 50.08614869999917, + "opcode": "custom-call", + "shape": "(f64[20,1500,1]{1,2,0}, s8[320]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146 (solve_kkt_rhs)", + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:213 (pdip_pc_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:83 (solve_nnls)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:129 (_solve_nnls_primal_with..primal)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:164 (solve_nnls_primal_with_status)" + ] + } + ], + "mesh_dual_areas": [ + { + "instruction": "input_scatter_fusion.9", + "ms": 0.003286400000000001, + "opcode": "fusion", + "shape": "f64[20,1500]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:393", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:393 (_dual_areas_padded_jnp)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:408 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + }, + { + "instruction": "input_scatter_fusion.7", + "ms": 0.0032768000000000007, + "opcode": "fusion", + "shape": "f64[20,1500]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:393", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:393 (_dual_areas_padded_jnp)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:408 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + } + ], + "mesh_locate_walk": [ + { + "instruction": "loop_slice_subtract_fusion", + "ms": 0.322774, + "opcode": "fusion", + "shape": "(f64[20,21361,1]{2,1,0}, f64[20,21361,1]{2,1,0}, f64[20,21361,1]{2,1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:236", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:236 (_walk_from_seed..cross)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:250 (_walk_from_seed..weights_of)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:262 (_walk_from_seed..walk_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:292 (_walk_from_seed..body)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)" + ] + }, + { + "instruction": "loop_reduce_fusion", + "ms": 0.15188379999999999, + "opcode": "fusion", + "shape": "(f64[20,21361]{1,0}, s64[20,21361]{1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:264", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:264 (_walk_from_seed..walk_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:292 (_walk_from_seed..body)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:264 (_walk_from_seed..walk_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:292 (_walk_from_seed..body)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)" + ] + }, + { + "instruction": "loop_select_fusion", + "ms": 0.1282284999999999, + "opcode": "fusion", + "shape": "(pred[20,21361]{1,0}, pred[20,21361]{1,0}, s32[20,21361]{1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:353 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "loop_gather_fusion.1", + "ms": 0.0831593, + "opcode": "fusion", + "shape": "s32[427220,1,1,3]{3,2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:239", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:239 (_walk_from_seed..weights_of)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:262 (_walk_from_seed..walk_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:292 (_walk_from_seed..body)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:353 (pix_indexes_delaunay_walk_from)" + ] + }, + { + "instruction": "loop_gather_fusion", + "ms": 0.06232030000000002, + "opcode": "fusion", + "shape": "s32[427220,1,1,1]{3,2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:267", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:267 (_walk_from_seed..walk_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:292 (_walk_from_seed..body)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:353 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)" + ] + }, + { + "instruction": "input_concatenate_fusion.1", + "ms": 0.0454338, + "opcode": "fusion", + "shape": "s32[20,21361,2]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:244", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:244 (_walk_from_seed..weights_of)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:262 (_walk_from_seed..walk_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:292 (_walk_from_seed..body)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:353 (pix_indexes_delaunay_walk_from)" + ] + } + ], + "psf_convolution_mapping_matrix": [ + { + "instruction": "input_scatter_fusion", + "ms": 40.4667916, + "opcode": "fusion", + "shape": "f64[20,1500,180,180]{3,2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "fft.29.0", + "ms": 35.274714800000005, + "opcode": "fft", + "shape": "f64[20,1500,180,180]{3,2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "fft.25.0", + "ms": 26.990960899999994, + "opcode": "fft", + "shape": "c128[20,1500,180,91]{3,2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "fft.27.0", + "ms": 19.3955784, + "opcode": "fft", + "shape": "c128[20,1500,91,180]{3,2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "input_transpose_fusion.4", + "ms": 10.5481266, + "opcode": "fusion", + "shape": "c128[20,1500,91,180]{3,2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "wrapped_transpose", + "ms": 9.845067199999999, + "opcode": "fusion", + "shape": "c128[20,1500,180,91]{3,2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + } + ], + "mapping_matrix": [ + { + "instruction": "input_scatter_fusion.3", + "ms": 0.0593254, + "opcode": "fusion", + "shape": "f64[20,1500]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:71", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:71 (adaptive_pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/abstract.py:507 (Mapper.pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt.py:339 (Adapt.regularization_weights_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt_split.py:120 (AdaptSplit.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)" + ] + }, + { + "instruction": "input_reduce_fusion.46", + "ms": 0.0037279999999999995, + "opcode": "fusion", + "shape": "f64[20]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:93", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:93 (adaptive_pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/abstract.py:507 (Mapper.pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt.py:339 (Adapt.regularization_weights_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt_split.py:120 (AdaptSplit.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)" + ] + } + ], + "regularization_H": [ + { + "instruction": "input_scatter_fusion.10", + "ms": 0.0036352000000000008, + "opcode": "fusion", + "shape": "f64[20,1500,1500]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:615", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:615 (pixel_splitted_regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt_split.py:137 (AdaptSplit.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:332 (AbstractInversion.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "curvature_matrix_F": [ + { + "instruction": "cublas-lt-matmul.2", + "ms": 81.49325499999999, + "opcode": "custom-call", + "shape": "(f64[20,1500,1500]{2,1,0}, s8[4194304]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:134", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:134 (curvature_matrix_via_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:93 (InversionImagingMapping.curvature_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:389 (AbstractInversion.curvature_reg_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "inversion_other": [ + { + "instruction": "cholesky.120", + "ms": 7.880166300000053, + "opcode": "custom-call", + "shape": "(f64[20,1500,1500]{1,2,0}, s32[20]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986 (AbstractInversion._log_det_symmetric_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:1078 (AbstractInversion.log_det_curvature_reg_matrix_term)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:347 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/model/analysis.py:135 (AnalysisImaging.log_likelihood_function)" + ] + }, + { + "instruction": "cholesky.130", + "ms": 7.803016000000013, + "opcode": "custom-call", + "shape": "(f64[20,1500,1500]{1,2,0}, s32[20]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986 (AbstractInversion._log_det_symmetric_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:1157 (AbstractInversion.log_det_regularization_matrix_term)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:348 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/model/analysis.py:135 (AnalysisImaging.log_likelihood_function)" + ] + }, + { + "instruction": "loop_reduce_window_fusion", + "ms": 0.0031297999999999994, + "opcode": "fusion", + "shape": "s64[94,16]{1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "loop_broadcast_convert_fusion", + "ms": 0.0026209, + "opcode": "fusion", + "shape": "(s32[1500]{0}, s64[1500]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:527", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:527 (AbstractInversion.zeroed_ids_to_keep)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:567 (AbstractInversion.solve_ids_to_keep)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:684 (AbstractInversion.reconstruction)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "input_scatter_fusion.5", + "ms": 0.0021856, + "opcode": "fusion", + "shape": "s64[1500]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:527", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:527 (AbstractInversion.zeroed_ids_to_keep)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:567 (AbstractInversion.solve_ids_to_keep)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:684 (AbstractInversion.reconstruction)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "loop_reduce_window_fusion.1", + "ms": 0.0020832000000000003, + "opcode": "fusion", + "shape": "s64[6,16]{1,0}", + "source": "", + "stack": [] + } + ], + "chi_squared_evidence": [ + { + "instruction": "loop_divide_fusion", + "ms": 0.005110400000000001, + "opcode": "fusion", + "shape": "f64[15361,20]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/abstract_ndarray.py:352", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/abstract_ndarray.py:352 (AbstractNDArray.__truediv__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/abstract_ndarray.py:57 (unwrap_array..wrapper)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/abstract_ndarray.py:35 (to_new_array..wrapper)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_util.py:78 (chi_squared_map_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:78 (AbstractFit.chi_squared_map)" + ] + } + ] + }, + "stage_audit_note": "The HLO instructions that contributed most of each stage's milliseconds, with their full source stack. A stage row is only as good as the rules that built it; this is how a reader checks a row against the HLO instead of trusting it.", + "untraced_wall_ms": 1088.6439894999057, + "reconciliation_vs_untraced_pct": 1.4948157301263827, + "wall_basis": "wall_ms is the TRACED run's wall, the run these kernel durations came from. untraced_wall_ms is the same executable without the profiler; the difference is the profiler's overhead and belongs in neither the stages nor the idle row.", + "calls": 10, + "call_split": "per-call (first-instruction recurrence)", + "call_blocks": 10, + "events": 311040, + "streams": [ + "Stream #14(MemcpyD2H,Compute,MemcpyD2D,MemcpyH2D)" + ], + "per_stage_ms": { + "border_relocator": { + "median_ms": 0.09180849999999999, + "min_ms": 0.09110499999999999, + "max_ms": 0.09247999999999999 + }, + "chi_squared_evidence": { + "median_ms": 0.005088, + "min_ms": 0.004992, + "max_ms": 0.005248 + }, + "curvature_matrix_F": { + "median_ms": 81.5326455, + "min_ms": 80.890945, + "max_ms": 82.078981 + }, + "inversion_other": { + "median_ms": 15.674743999999993, + "min_ms": 15.611943000000007, + "max_ms": 15.802664000000023 + }, + "mapping_matrix": { + "median_ms": 0.062673, + "min_ms": 0.060704, + "max_ms": 0.06537599999999999 + }, + "mesh_construction": { + "median_ms": 0.008944, + "min_ms": 0.008896000000000001, + "max_ms": 0.009215999999999998 + }, + "mesh_dual_areas": { + "median_ms": 0.00656, + "min_ms": 0.006528, + "max_ms": 0.006592 + }, + "mesh_locate_walk": { + "median_ms": 1.0010324999999995, + "min_ms": 0.9964599999999998, + "max_ms": 1.0067319999999995 + }, + "mesh_qhull_callback": { + "median_ms": 0.24758800000000003, + "min_ms": 0.24675500000000014, + "max_ms": 0.24854500000000004 + }, + "mesh_seed_argmin": { + "median_ms": 1.7089075, + "min_ms": 1.7009140000000003, + "max_ms": 1.7098409999999997 + }, + "mixed_fusion": { + "median_ms": 38.955133499999995, + "min_ms": 38.739298000000005, + "max_ms": 39.069581 + }, + "other": { + "median_ms": 0.32731399999999994, + "min_ms": 0.326756, + "max_ms": 0.32794000000000006 + }, + "pdip_solve": { + "median_ms": 689.0386290000258, + "min_ms": 686.4094680000115, + "max_ms": 693.0778240000242 + }, + "psf_convolution_mapping_matrix": { + "median_ms": 142.584427, + "min_ms": 142.084308, + "max_ms": 142.692432 + }, + "regularization_H": { + "median_ms": 0.003616, + "min_ms": 0.003552, + "max_ms": 0.00384 + } + }, + "stage_order": [ + "border_relocator", + "mesh_qhull_callback", + "mesh_seed_argmin", + "mesh_locate_walk", + "mesh_dual_areas", + "mesh_construction", + "mapping_matrix", + "psf_convolution_mapping_matrix", + "curvature_matrix_F", + "regularization_H", + "pdip_solve", + "chi_squared_evidence", + "inversion_other", + "mixed_fusion", + "other" + ], + "mixed_fusion": { + "ms": 38.955133499999995, + "constituent_stage_sets": { + "curvature_matrix_F + psf_convolution_mapping_matrix": 21.202663899999997, + "pdip_solve + psf_convolution_mapping_matrix": 5.021317099999999, + "data_vector_D + pdip_solve": 2.6444533, + "pdip_solve + regularization_H": 2.3780223, + "mapped_reconstruction + pdip_solve": 2.1909431, + "mapping_matrix + pdip_solve": 2.1211651999999996, + "curvature_reg_reduce_gather + inversion_other + mapped_reconstruction + pdip_solve + reconstruction_scatter": 1.8979407, + "inversion_other + pdip_solve + regularization_H": 0.5537554, + "inversion_other + pdip_solve": 0.23352859999999995, + "inversion_other + regularization_H": 0.20234119999999986, + "mapping_matrix + mesh_interpolation_weights + pdip_solve": 0.0777736, + "inversion_other + mapping_matrix + mesh_construction + mesh_interpolation_weights + pdip_solve": 0.077732, + "grids_and_structures + mass_profile_deflections + ray_trace_data_grid": 0.03438770000000001, + "inversion_other + mesh_construction + mesh_interpolation_weights": 0.0253027, + "inversion_other + mesh_construction + mesh_dual_areas + mesh_interpolation_weights + pdip_solve + regularization_H": 0.024563400000000003, + "inversion_other + mesh_construction + mesh_dual_areas + mesh_interpolation_weights": 0.024512100000000002, + "grids_and_structures + mass_profile_deflections + pdip_solve + ray_trace_data_grid": 0.024057999999999996, + "border_relocator + pdip_solve": 0.0203298, + "inversion_other + mapping_matrix + mesh_construction + mesh_interpolation_weights": 0.0163201, + "pdip_solve + ray_trace_data_grid": 0.013190399999999993, + "mesh_construction + pdip_solve + regularization_H": 0.012493, + "mesh_dual_areas + mesh_interpolation_weights": 0.0111298, + "mesh_construction + mesh_seed_argmin + pdip_solve + regularization_H": 0.010409700000000001, + "inversion_other + mapped_reconstruction": 0.0096705, + "chi_squared_evidence + pdip_solve": 0.0096001, + "inversion_other + mapped_reconstruction + reconstruction_scatter + regularization_H": 0.009494500000000003, + "inversion_other + mapped_reconstruction + reconstruction_scatter": 0.0090081, + "mesh_locate_walk + mesh_seed_argmin": 0.0088352, + "inversion_other + mesh_dual_areas + mesh_locate_walk": 0.0084674, + "mesh_construction + mesh_dual_areas + mesh_interpolation_weights + pdip_solve + regularization_H": 0.006732799999999999, + "inversion_other + pdip_solve + ray_trace_data_grid": 0.0047072, + "grids_and_structures + mass_profile_deflections + pdip_solve": 0.0044832, + "mapping_matrix + pdip_solve + regularization_H": 0.004259300000000001, + "inversion_other + mesh_locate_walk + mesh_seed_argmin": 0.0038944, + "inversion_other + mesh_dual_areas + mesh_locate_walk + pdip_solve": 0.0038753, + "inversion_other + mesh_interpolation_weights": 0.0037408, + "inversion_other + mesh_construction + mesh_interpolation_weights + pdip_solve + regularization_H": 0.0034593000000000002, + "inversion_other + mesh_construction + regularization_H": 0.0028191999999999996, + "chi_squared_evidence + inversion_other": 0.0023296, + "inversion_other + mapping_matrix": 0.0021024 + }, + "example_kernels": { + "curvature_matrix_F + psf_convolution_mapping_matrix": [ + "loop_divide_gather_fusion" + ], + "pdip_solve + psf_convolution_mapping_matrix": [ + "loop_broadcast_fusion.7" + ], + "data_vector_D + pdip_solve": [ + "input_reduce_fusion.18", + "input_reduce_fusion.44" + ], + "pdip_solve + regularization_H": [ + "loop_broadcast_fusion", + "input_add_transpose_fusion", + "input_transpose_fusion.6" + ], + "mapped_reconstruction + pdip_solve": [ + "input_reduce_fusion.22" + ], + "mapping_matrix + pdip_solve": [ + "loop_broadcast_fusion.8", + "loop_divide_fusion.1" + ], + "curvature_reg_reduce_gather + inversion_other + mapped_reconstruction + pdip_solve + reconstruction_scatter": [ + "input_multiply_transpose_fusion" + ], + "inversion_other + pdip_solve + regularization_H": [ + "input_transpose_fusion.7", + "loop_log_fusion" + ], + "inversion_other + pdip_solve": [ + "input_reduce_fusion.20", + "input_reduce_fusion.21", + "input_transpose_fusion.3", + "input_reduce_fusion.26" + ], + "inversion_other + regularization_H": [ + "input_reduce_fusion.41", + "input_reduce_fusion.34", + "input_reduce_fusion.35", + "input_reduce_fusion.36" + ] + }, + "prorated_estimate_ms": { + "psf_convolution_mapping_matrix": 13.111990499999997, + "curvature_matrix_F": 10.601331949999999, + "pdip_solve": 7.946284793333332, + "regularization_H": 1.4923990866666665, + "mapped_reconstruction": 1.4852712650000002, + "data_vector_D": 1.32222665, + "mapping_matrix": 1.1086045249999998, + "inversion_other": 0.8429788166666664, + "reconstruction_scatter": 0.384964465, + "curvature_reg_reduce_gather": 0.37958813999999996, + "mesh_interpolation_weights": 0.07368083666666667, + "mesh_construction": 0.04802749499999999, + "ray_trace_data_grid": 0.02564133333333333, + "mesh_dual_areas": 0.02092467666666667, + "grids_and_structures": 0.018971466666666666, + "mass_profile_deflections": 0.018971466666666666, + "border_relocator": 0.0101649, + "mesh_locate_walk": 0.009507024999999999, + "mesh_seed_argmin": 0.008318158333333332, + "chi_squared_evidence": 0.00596485 + }, + "prorated_note": "ESTIMATE ONLY \u2014 a mixed fusion's time split equally across the stages its constituents span. Never summed into the measured table, never reconciled." + }, + "other_sources_ms": { + "copy.138": 0.0484356999999999, + "copy.140": 0.04055390000000005, + "copy.141": 0.0400260000000001, + "copy.142": 0.039894800000000105, + "copy.139": 0.03945300000000007, + "copy.122": 0.03813460000000002, + "copy.123": 0.03528999999999997, + "copy.121": 0.03454110000000006, + "loop_broadcast_fusion.2": 0.0028191999999999996, + "copy.137": 0.0023233, + "copy.97": 0.002272, + "copy.58": 0.0021792, + "loop_broadcast_fusion.5": 0.0013984000000000002 + }, + "device_span_ms": 1104.5367216, + "device_busy_ms": 970.868621, + "device_idle_ms": 133.6681006, + "largest_idle_gaps": [ + { + "gap_ms": 5.384581, + "after": "pure_callback.0", + "before": "pure_callback.0" + }, + { + "gap_ms": 5.016546, + "after": "pure_callback.0", + "before": "pure_callback.0" + }, + { + "gap_ms": 4.976545, + "after": "pure_callback.0", + "before": "pure_callback.0" + }, + { + "gap_ms": 4.95725, + "after": "pure_callback.0", + "before": "pure_callback.0" + }, + { + "gap_ms": 4.889409, + "after": "pure_callback.0", + "before": "pure_callback.0" + }, + { + "gap_ms": 4.874305, + "after": "pure_callback.0", + "before": "pure_callback.0" + }, + { + "gap_ms": 4.853824, + "after": "pure_callback.0", + "before": "pure_callback.0" + }, + { + "gap_ms": 4.853281, + "after": "pure_callback.0", + "before": "pure_callback.0" + } + ], + "kernel_ms": 971.2491105000258, + "sum_ms": 1104.9172111000257, + "wall_ms": 1104.6436848002486, + "host_outside_span_ms": 0.10696320024862871, + "reconciliation_pct": 0.024761495814516237, + "unjoined_ms": 0.0, + "unjoined_pct": 0.0, + "other_ms": 0.32731399999999994, + "other_pct": 0.029630731113009328, + "note": "Stage rows attribute the command-buffers-OFF program (see the module docstring): kernel times are the same, the launch overhead the CUDA graphs remove is not. sum_ms = kernel rows + device_idle_ms; the residual against wall_ms is host_outside_span_ms (dispatch before the first kernel, teardown after the last).", + "per_stage_ms_per_lane": { + "border_relocator": 0.0045904249999999995, + "chi_squared_evidence": 0.0002544, + "curvature_matrix_F": 4.076632275, + "inversion_other": 0.7837371999999997, + "mapping_matrix": 0.0031336500000000004, + "mesh_construction": 0.00044720000000000003, + "mesh_dual_areas": 0.000328, + "mesh_locate_walk": 0.050051624999999975, + "mesh_qhull_callback": 0.012379400000000002, + "mesh_seed_argmin": 0.085445375, + "mixed_fusion": 1.9477566749999997, + "other": 0.016365699999999997, + "pdip_solve": 34.45193145000129, + "psf_convolution_mapping_matrix": 7.12922135, + "regularization_H": 0.0001808 + }, + "per_lane_divisor": 20, + "host_callback": { + "pure_callback_span_ms": 104.78720049999998, + "qhull_ms": 91.6190019, + "callback_body_ms_note": "the OUTERMOST matching body event, not a sum: under the probe the body appears twice (the wrapper and the timed re-implementation it calls) and summing them would count the same work twice", + "events_by_name": { + "pure_callback.0": { + "count": 200, + "ms": 104.78720049999998 + }, + "$callback.py:815 _wrapped_callback": { + "count": 200, + "ms": 96.43105349999996 + }, + "$callback.py:224 _callback": { + "count": 200, + "ms": 95.96219969999999 + }, + "$callback.py:74 pure_callback_impl": { + "count": 200, + "ms": 95.79210599999999 + }, + "$callback.py:69 __call__": { + "count": 200, + "ms": 91.92109969999998 + }, + "$delaunay.py:162 ": { + "count": 200, + "ms": 91.79117300000004 + }, + "$host_callback_probe.py:225 wrapped": { + "count": 200, + "ms": 91.6190019 + }, + "$host_callback_probe.py:160 _timed_tri_only": { + "count": 200, + "ms": 91.47305369999998 + }, + "$callback.py:822 ": { + "count": 800, + "ms": 0.28740469999999974 + }, + "ThenExecuteCallback:GetEventForComputeStreamSyncPoint": { + "count": 10, + "ms": 0.027517599999999996 + }, + "$__init__.py:132 _xla_gc_callback": { + "count": 2, + "ms": 0.00047400000000000003 + } + }, + "note": "HOST milliseconds per traced BATCH (the whole invocation), aggregated by name because the events nest. Not a row of the device table: the device pays for them as the idle gaps largest_idle_gaps names." + }, + "host_callback_ms": 104.78720049999998 + }, + "hlo_census": { + "status": "excluded", + "reason": "The legacy census anchors PyAutoArray source line numbers that moved after the phase-1 run. No batched attribution is published from unsupported anchors; the device-event table and wall reconciliation remain valid." + }, + "trace_split": { + "expected_calls": 10, + "executions_per_invocation": 1, + "method": "per-call (first-instruction recurrence)", + "note": "DECIDED IN CODE: the scalar arm's trace is split by trace_calls * B, so every lane's execution is its own block and the per-stage median is taken over all of them. The vmap arm's is split by trace_calls, one block per batched execution, and per_stage_ms_per_lane divides those rows by B." + } + }, + "scalar": { + "arm": "scalar", + "program": "jax.jit(fn), called B times", + "stands_for": "Nautilus(use_jax_vmap=False, use_jax_jit=True). Plain use_jax_vmap=False is UNJITTED and is NOT this arm", + "hlo_source": "jax.jit(fn).lower(lane_trees[0]) \u2014 the same program phase 1 traced", + "batch_wall_ms": 885.5649066001206, + "wall_production_nesting_ms": 885.5649066001206, + "wall_aot_command_buffers_on_ms": 887.3907229000906, + "wall_aot_command_buffers_off_ms": 895.7212022000022, + "command_buffer_delta_ms": 8.33047929991153, + "production_nesting_vs_aot_on_delta_ms": -1.825816299970029, + "production_nesting_vs_aot_on_delta_pct": -0.20575111423331768, + "wall_per_lane_ms": 44.27824533000603, + "wall_per_lane_command_buffers_off_ms": 44.78606011000011, + "traced_batch_wall_ms": 921.1332391001633, + "untraced_batch_wall_ms": 893.5885384998983, + "traced_wall_per_lane_ms": 46.05666195500817, + "callback_count_per_call": 20.0, + "callback_count_per_lane": 1.0, + "callback_expectation": "1 per likelihood evaluation, B per batch", + "host_qhull_ms": 91.44411729830608, + "host_tables_ms": 2.635560899943812, + "host_qhull_ms_per_lane": 4.572205864915304, + "host_tables_ms_per_lane": 0.1317780449971906, + "host_callback_probe": { + "calls": 200, + "qhull_ms_total": 914.4411729830608, + "tables_ms_total": 26.355608999438118, + "total_ms_total": 940.7967819824989, + "qhull_ms_mean": 4.572205864915304, + "tables_ms_mean": 0.1317780449971906, + "total_ms_mean": 4.703983909912495, + "non_finite_calls": 0, + "n_points": [ + 1500 + ] + }, + "host_callback_records_first": [ + { + "n_points": 1500, + "qhull_ms": 4.811684000742389, + "tables_ms": 0.2024770001298748, + "total_ms": 5.014161000872264, + "finite": true + }, + { + "n_points": 1500, + "qhull_ms": 4.4830970000475645, + "tables_ms": 0.14030899910721928, + "total_ms": 4.623405999154784, + "finite": true + }, + { + "n_points": 1500, + "qhull_ms": 4.542815000604605, + "tables_ms": 0.14802999794483185, + "total_ms": 4.690844998549437, + "finite": true + }, + { + "n_points": 1500, + "qhull_ms": 4.565964998619165, + "tables_ms": 0.12157899982412346, + "total_ms": 4.687543998443289, + "finite": true + } + ], + "device_idle_ms": 7.323359934999999, + "device_idle_ms_per_lane": 7.323359934999999, + "trace": { + "parser": "ProfileData.from_file(xplane) + as_text() + stack_frame_index(proto field 17)", + "stage_audit": { + "mixed_fusion": [ + { + "instruction": "loop_divide_gather_fusion", + "ms": 1.02100832, + "opcode": "fusion", + "shape": "(f64[15361,1,1,1500]{3,2,1,0}, f64[15361,1,1,1500]{3,2,1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:133", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:133 (curvature_matrix_via_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:93 (InversionImagingMapping.curvature_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:389 (AbstractInversion.curvature_reg_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "loop_broadcast_fusion.4", + "ms": 0.225944575, + "opcode": "fusion", + "shape": "f64[1500,180,180]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "input_reduce_fusion.13", + "ms": 0.1212174, + "opcode": "fusion", + "shape": "f64[92,1500]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/inversion_imaging_util.py:123", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/inversion_imaging_util.py:123 (data_vector_via_blurred_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:67 (InversionImagingMapping.data_vector)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:699 (AbstractInversion.reconstruction)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "input_reduce_fusion.17", + "ms": 0.11455684000000006, + "opcode": "fusion", + "shape": "f64[15361]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:163", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:163 (mapped_reconstructed_data_via_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:120 (InversionImagingMapping._mapped_reconstructed_data_dict_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:196 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "loop_broadcast_fusion.2", + "ms": 0.11049801, + "opcode": "fusion", + "shape": "f64[15361,1500]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:342", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:342 (mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/abstract.py:283 (Mapper.mapping_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:91 (AbstractInversionImaging._mapping_matrix_for_convolution_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:137 (AbstractInversionImaging.operated_mapping_matrix_list)" + ] + }, + { + "instruction": "input_multiply_transpose_fusion", + "ms": 0.10967261499999995, + "opcode": "fusion", + "shape": "(f64[1500,1500]{1,0}, f64[1500,1500]{1,0}, f64[1500,1500]{1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:237 (active_set_search)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:293 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:274 (_certified_positive_only_from)" + ] + } + ], + "border_relocator": [ + { + "instruction": "eigh.45", + "ms": 0.07491276499999945, + "opcode": "custom-call", + "shape": "(f64[2,2]{0,1}, f64[2]{0}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:245", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:245 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:454 (BorderRelocator.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:176 (AbstractMesh.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:214 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "custom-call.2", + "ms": 0.007952945000000019, + "opcode": "custom-call", + "shape": "(f64[2,2]{1,0}, s8[4194304]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:242", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:242 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:454 (BorderRelocator.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:176 (AbstractMesh.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:214 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "input_reduce_fusion.18", + "ms": 0.005679990000000003, + "opcode": "fusion", + "shape": "(f64[], f64[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:269", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:269 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:454 (BorderRelocator.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:176 (AbstractMesh.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:214 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "loop_add_fusion.7", + "ms": 0.0035153400000000018, + "opcode": "fusion", + "shape": "f64[15361]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:308", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:308 (relocated_grid_via_ellipse_border_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:423 (BorderRelocator.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:83 (AbstractMesh.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:208 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "loop_add_fusion.9", + "ms": 0.0033790250000000047, + "opcode": "fusion", + "shape": "f64[1500]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:308", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:308 (relocated_grid_via_ellipse_border_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:458 (BorderRelocator.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:176 (AbstractMesh.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:214 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "input_concatenate_fusion.12", + "ms": 0.002400159999999999, + "opcode": "fusion", + "shape": "f64[392,2]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:238", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:238 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:454 (BorderRelocator.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:176 (AbstractMesh.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:214 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + } + ], + "mesh_construction": [ + { + "instruction": "input_concatenate_fusion.7", + "ms": 0.001950709999999996, + "opcode": "fusion", + "shape": "f64[1500,2]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:820", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:820 (InterpolatorDelaunay.mesh_grid_xy)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:847 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + } + ], + "mesh_qhull_callback": [ + { + "instruction": "pure_callback.4", + "ms": 0.010635229999999964, + "opcode": "custom-call", + "shape": "(s32[3000,3]{1,0}, s32[3000,3]{1,0}, s32[1500]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:161", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:161 (_jax_delaunay_tables)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:405 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + } + ], + "other": [ + { + "instruction": "copy.106", + "ms": 0.04191224999999906, + "opcode": "copy", + "shape": "f64[1,1024,2]{2,1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "copy.70", + "ms": 0.017179350000000006, + "opcode": "copy", + "shape": "s32[21361]{0}", + "source": "", + "stack": [] + }, + { + "instruction": "copy.75", + "ms": 0.0019640150000000043, + "opcode": "copy", + "shape": "s64[1500]{0}", + "source": "", + "stack": [] + }, + { + "instruction": "copy.105", + "ms": 0.0018179299999999986, + "opcode": "copy", + "shape": "s32[]", + "source": "", + "stack": [] + }, + { + "instruction": "copy.104", + "ms": 0.001758395000000002, + "opcode": "copy", + "shape": "s64[]", + "source": "", + "stack": [] + }, + { + "instruction": "copy.61", + "ms": 0.0016627149999999993, + "opcode": "copy", + "shape": "s32[]", + "source": "", + "stack": [] + } + ], + "mesh_seed_argmin": [ + { + "instruction": "input_reduce_fusion", + "ms": 0.1494094300000016, + "opcode": "fusion", + "shape": "(f64[1024]{0}, s64[1024]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:191", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:191 (_nearest_vertex_seed_from..argmin_chunk)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204 (_nearest_vertex_seed_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:351 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)" + ] + }, + { + "instruction": "loop_dynamic_update_slice_fusion", + "ms": 0.04105313999999861, + "opcode": "fusion", + "shape": "s32[21,1024]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204 (_nearest_vertex_seed_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:351 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "loop_add_fusion", + "ms": 0.0318532000000001, + "opcode": "fusion", + "shape": "s64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204 (_nearest_vertex_seed_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:351 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "loop_broadcast_fusion", + "ms": 0.0019633499999999983, + "opcode": "fusion", + "shape": "s32[21,1024]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204 (_nearest_vertex_seed_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:351 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "pdip_solve": [ + { + "instruction": "cholesky.60", + "ms": 7.598958304999966, + "opcode": "custom-call", + "shape": "(f64[1500,1500]{0,1}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:252 (active_set_search..body_fun)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:262 (active_set_search)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:293 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)" + ] + }, + { + "instruction": "cholesky.80", + "ms": 5.308138535000001, + "opcode": "custom-call", + "shape": "(f64[1500,1500]{0,1}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:106", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:106 (factorize_kkt)", + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:212 (pdip_pc_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:83 (solve_nnls)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:129 (_solve_nnls_primal_with..primal)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:164 (solve_nnls_primal_with_status)" + ] + }, + { + "instruction": "triangular-solve.1", + "ms": 1.3578426950000397, + "opcode": "custom-call", + "shape": "(f64[1500,1]{0,1}, s8[0]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:154", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:154 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:252 (active_set_search..body_fun)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:262 (active_set_search)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:293 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)" + ] + }, + { + "instruction": "triangular-solve", + "ms": 1.1759390649999863, + "opcode": "custom-call", + "shape": "(f64[1500,1]{0,1}, s8[0]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:154", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:154 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:252 (active_set_search..body_fun)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:262 (active_set_search)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:293 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)" + ] + }, + { + "instruction": "cholesky.110", + "ms": 0.8948393449999995, + "opcode": "custom-call", + "shape": "(f64[1500,1500]{0,1}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:297 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:274 (_certified_positive_only_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:496 (reconstruction_positive_only_from)" + ] + }, + { + "instruction": "cholesky.100", + "ms": 0.8664200699999989, + "opcode": "custom-call", + "shape": "(f64[1500,1500]{0,1}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:237 (active_set_search)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:293 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:274 (_certified_positive_only_from)" + ] + } + ], + "regularization_H": [ + { + "instruction": "input_scatter_fusion.10", + "ms": 0.002064634999999996, + "opcode": "fusion", + "shape": "f64[1500,1500]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:615", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:615 (pixel_splitted_regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt_split.py:137 (AdaptSplit.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:332 (AbstractInversion.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "input_concatenate_fusion.8", + "ms": 0.001876489999999998, + "opcode": "fusion", + "shape": "pred[3]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:93", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:93 (split_points_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:410 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + }, + { + "instruction": "input_concatenate_fusion.9", + "ms": 0.0018718299999999982, + "opcode": "fusion", + "shape": "pred[3]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:91", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:91 (split_points_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:410 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + }, + { + "instruction": "input_concatenate_fusion.10", + "ms": 0.0018609449999999988, + "opcode": "fusion", + "shape": "pred[3]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:90", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:90 (split_points_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:410 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + }, + { + "instruction": "input_concatenate_fusion", + "ms": 0.0017558350000000003, + "opcode": "fusion", + "shape": "s32[1500,2]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:615", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:615 (pixel_splitted_regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt_split.py:137 (AdaptSplit.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:332 (AbstractInversion.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "input_concatenate_fusion.11", + "ms": 0.0015556699999999994, + "opcode": "fusion", + "shape": "pred[3]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:88", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:88 (split_points_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:410 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + } + ], + "mesh_locate_walk": [ + { + "instruction": "loop_reduce_fusion", + "ms": 0.02563361500000045, + "opcode": "fusion", + "shape": "(f64[21361]{0}, s64[21361]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:264", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:264 (_walk_from_seed..walk_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:292 (_walk_from_seed..body)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:264 (_walk_from_seed..walk_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:292 (_walk_from_seed..body)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)" + ] + }, + { + "instruction": "input_reduce_fusion.1", + "ms": 0.025435760000000616, + "opcode": "fusion", + "shape": "pred[196]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:288", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:288 (_walk_from_seed..cond)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:353 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)" + ] + }, + { + "instruction": "loop_or_select_fusion", + "ms": 0.022603170000000325, + "opcode": "fusion", + "shape": "(s32[21361]{0}, pred[21361]{0}, pred[21361]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:270", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:270 (_walk_from_seed..walk_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:292 (_walk_from_seed..body)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:353 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)" + ] + }, + { + "instruction": "loop_select_fusion", + "ms": 0.020302364999999784, + "opcode": "fusion", + "shape": "s32[21361]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:242", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:242 (_walk_from_seed..weights_of)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:262 (_walk_from_seed..walk_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:292 (_walk_from_seed..body)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:353 (pix_indexes_delaunay_walk_from)" + ] + }, + { + "instruction": "input_reduce_fusion.2", + "ms": 0.016408779999999915, + "opcode": "fusion", + "shape": "pred[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:288", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:288 (_walk_from_seed..cond)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:353 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)" + ] + }, + { + "instruction": "while.34", + "ms": 0.014675164999999662, + "opcode": "while", + "shape": "(s32[], s32[21361]{0}, pred[21361]{0}, pred[21361]{0}, s32[3000,3]{1,0}, /*index=5*/f64[1500,2]{1,0}, f64[21361,2]{1,0}, s32[3000,3]{1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:353 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "psf_convolution_mapping_matrix": [ + { + "instruction": "input_scatter_fusion", + "ms": 1.9909163300000001, + "opcode": "fusion", + "shape": "f64[1500,180,180]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "fft.19.0", + "ms": 1.761691964999997, + "opcode": "fft", + "shape": "f64[1500,180,180]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "fft.15.0", + "ms": 1.3703491899999993, + "opcode": "fft", + "shape": "c128[1500,180,91]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "fft.17.0", + "ms": 0.9796025600000007, + "opcode": "fft", + "shape": "c128[1500,91,180]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "input_transpose_fusion.4", + "ms": 0.5137482899999998, + "opcode": "fusion", + "shape": "c128[1500,91,180]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "wrapped_transpose", + "ms": 0.49763212999999995, + "opcode": "fusion", + "shape": "c128[1500,180,91]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + } + ], + "inversion_other": [ + { + "instruction": "cholesky.120", + "ms": 0.8974949200000008, + "opcode": "custom-call", + "shape": "(f64[1500,1500]{0,1}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986 (AbstractInversion._log_det_symmetric_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:1078 (AbstractInversion.log_det_curvature_reg_matrix_term)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:347 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/model/analysis.py:135 (AnalysisImaging.log_likelihood_function)" + ] + }, + { + "instruction": "cholesky.130", + "ms": 0.8941805499999996, + "opcode": "custom-call", + "shape": "(f64[1500,1500]{0,1}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986 (AbstractInversion._log_det_symmetric_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:1157 (AbstractInversion.log_det_regularization_matrix_term)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:348 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/model/analysis.py:135 (AnalysisImaging.log_likelihood_function)" + ] + }, + { + "instruction": "loop_reduce_window_fusion.1", + "ms": 0.0027814400000000035, + "opcode": "fusion", + "shape": "s64[94,16]{1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "loop_reduce_window_fusion", + "ms": 0.002690549999999995, + "opcode": "fusion", + "shape": "s64[6,16]{1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "loop_broadcast_convert_fusion", + "ms": 0.002170080000000002, + "opcode": "fusion", + "shape": "(s32[1500]{0}, s64[1500]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:527", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:527 (AbstractInversion.zeroed_ids_to_keep)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:567 (AbstractInversion.solve_ids_to_keep)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:684 (AbstractInversion.reconstruction)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "input_scatter_fusion.5", + "ms": 0.0019360049999999987, + "opcode": "fusion", + "shape": "s64[1500]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:527", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:527 (AbstractInversion.zeroed_ids_to_keep)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:567 (AbstractInversion.solve_ids_to_keep)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:684 (AbstractInversion.reconstruction)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "mapping_matrix": [ + { + "instruction": "input_reduce_fusion.31", + "ms": 0.0028889249999999927, + "opcode": "fusion", + "shape": "f64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:93", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:93 (adaptive_pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/abstract.py:507 (Mapper.pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt.py:339 (Adapt.regularization_weights_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt_split.py:120 (AdaptSplit.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)" + ] + } + ], + "curvature_matrix_F": [ + { + "instruction": "cublas-lt-matmul.2", + "ms": 4.203954090000001, + "opcode": "custom-call", + "shape": "(f64[1500,1500]{1,0}, s8[4194304]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:134", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:134 (curvature_matrix_via_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:93 (InversionImagingMapping.curvature_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:389 (AbstractInversion.curvature_reg_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "chi_squared_evidence": [ + { + "instruction": "loop_multiply_fusion.2", + "ms": 0.002985745000000001, + "opcode": "fusion", + "shape": "f64[15361]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/abstract_ndarray.py:300", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/abstract_ndarray.py:300 (AbstractNDArray.__pow__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/abstract_ndarray.py:60 (unwrap_array..wrapper)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/abstract_ndarray.py:35 (to_new_array..wrapper)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_util.py:78 (chi_squared_map_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:78 (AbstractFit.chi_squared_map)" + ] + } + ] + }, + "stage_audit_note": "The HLO instructions that contributed most of each stage's milliseconds, with their full source stack. A stage row is only as good as the rules that built it; this is how a reader checks a row against the HLO instead of trusting it.", + "untraced_wall_ms": 44.679426924994914, + "reconciliation_vs_untraced_pct": -15.467513720792189, + "wall_basis": "wall_ms is the TRACED run's wall, the run these kernel durations came from. untraced_wall_ms is the same executable without the profiler; the difference is the profiler's overhead and belongs in neither the stages nor the idle row.", + "calls": 200, + "call_split": "per-call (first-instruction recurrence)", + "call_blocks": 200, + "events": 144140, + "streams": [ + "Stream #14(MemcpyD2D,MemcpyH2D,Compute,MemcpyD2H,Memset)" + ], + "per_stage_ms": { + "border_relocator": { + "median_ms": 0.1013135, + "min_ms": 0.10057300000000001, + "max_ms": 0.10214500000000001 + }, + "chi_squared_evidence": { + "median_ms": 0.002976, + "min_ms": 0.002848, + "max_ms": 0.003296 + }, + "curvature_matrix_F": { + "median_ms": 4.202033500000001, + "min_ms": 4.179871, + "max_ms": 4.304915 + }, + "inversion_other": { + "median_ms": 1.803238, + "min_ms": 1.786004, + "max_ms": 1.8153169999999998 + }, + "mapping_matrix": { + "median_ms": 0.00288, + "min_ms": 0.002879, + "max_ms": 0.002913 + }, + "memset": { + "median_ms": 0.034432000000000004, + "min_ms": 0.009984, + "max_ms": 0.09769400000000002 + }, + "mesh_construction": { + "median_ms": 0.001952, + "min_ms": 0.00192, + "max_ms": 0.001984 + }, + "mesh_locate_walk": { + "median_ms": 0.1489275, + "min_ms": 0.130945, + "max_ms": 0.184289 + }, + "mesh_qhull_callback": { + "median_ms": 0.010592, + "min_ms": 0.010176, + "max_ms": 0.011104 + }, + "mesh_seed_argmin": { + "median_ms": 0.22428450000000014, + "min_ms": 0.22387400000000016, + "max_ms": 0.22467400000000018 + }, + "mixed_fusion": { + "median_ms": 1.986319, + "min_ms": 1.9782960000000003, + "max_ms": 1.999138 + }, + "other": { + "median_ms": 0.06702349999999999, + "min_ms": 0.06371199999999999, + "max_ms": 0.07388899999999998 + }, + "pdip_solve": { + "median_ms": 14.734703000000003, + "min_ms": 2.4263630000000003, + "max_ms": 52.05862700000007 + }, + "psf_convolution_mapping_matrix": { + "median_ms": 7.113619999999999, + "min_ms": 7.100212, + "max_ms": 7.1291709999999995 + }, + "regularization_H": { + "median_ms": 0.010976, + "min_ms": 0.010848, + "max_ms": 0.011328 + } + }, + "stage_order": [ + "border_relocator", + "mesh_qhull_callback", + "mesh_seed_argmin", + "mesh_locate_walk", + "mesh_construction", + "mapping_matrix", + "psf_convolution_mapping_matrix", + "curvature_matrix_F", + "regularization_H", + "pdip_solve", + "chi_squared_evidence", + "inversion_other", + "mixed_fusion", + "other", + "memset" + ], + "mixed_fusion": { + "ms": 1.986319, + "constituent_stage_sets": { + "curvature_matrix_F + psf_convolution_mapping_matrix": 1.02100832, + "pdip_solve + psf_convolution_mapping_matrix": 0.225944575, + "data_vector_D + pdip_solve": 0.12488812000000023, + "mapped_reconstruction + pdip_solve": 0.11455684000000006, + "mapping_matrix + pdip_solve": 0.11286072999999995, + "curvature_reg_reduce_gather + inversion_other + mapped_reconstruction + pdip_solve + reconstruction_scatter": 0.10967261499999995, + "pdip_solve + regularization_H": 0.045423489999999955, + "inversion_other + pdip_solve + regularization_H": 0.024202355, + "inversion_other + pdip_solve": 0.02294705499999994, + "inversion_other + mapping_matrix + mesh_construction + mesh_dual_areas + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin + pdip_solve": 0.02113966000000001, + "inversion_other + mesh_construction + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin + pdip_solve + regularization_H": 0.018736469999999984, + "inversion_other + mesh_construction + mesh_dual_areas + mesh_interpolation_weights + pdip_solve + regularization_H": 0.014469269999999989, + "pdip_solve + ray_trace_data_grid": 0.013680334999999941, + "border_relocator + pdip_solve": 0.013327340000000023, + "inversion_other + mapping_matrix + mesh_construction + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin": 0.011626745, + "grids_and_structures + mass_profile_deflections + pdip_solve": 0.010069740000000006, + "grids_and_structures + mass_profile_deflections + pdip_solve + ray_trace_data_grid": 0.008905150000000004, + "chi_squared_evidence + pdip_solve": 0.00768813999999998, + "inversion_other + mesh_construction + mesh_seed_argmin + pdip_solve + regularization_H": 0.007145729999999994, + "inversion_other + mesh_dual_areas + mesh_locate_walk": 0.006733585000000049, + "inversion_other + mesh_construction + pdip_solve + regularization_H": 0.006547775000000004, + "grids_and_structures + mass_profile_deflections + ray_trace_data_grid": 0.005420630000000002, + "inversion_other + pdip_solve + ray_trace_data_grid": 0.005286555000000029, + "inversion_other + regularization_H": 0.005250225000000012, + "inversion_other + mapped_reconstruction + pdip_solve + reconstruction_scatter": 0.004806700000000002, + "inversion_other + mapped_reconstruction": 0.0037300700000000003, + "mapping_matrix + pdip_solve + regularization_H": 0.0034841699999999948, + "inversion_other + mesh_construction + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin": 0.0031295899999999994, + "inversion_other + mesh_construction + mesh_dual_areas + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin": 0.0029588600000000054, + "inversion_other + mesh_construction + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin + regularization_H": 0.0027115199999999903, + "inversion_other + mesh_dual_areas + mesh_locate_walk + pdip_solve": 0.002606104999999996, + "inversion_other + mesh_locate_walk + mesh_seed_argmin": 0.0024943900000000047, + "inversion_other + mesh_interpolation_weights": 0.0021585600000000042, + "chi_squared_evidence + inversion_other": 0.0017876849999999987 + }, + "example_kernels": { + "curvature_matrix_F + psf_convolution_mapping_matrix": [ + "loop_divide_gather_fusion" + ], + "pdip_solve + psf_convolution_mapping_matrix": [ + "loop_broadcast_fusion.4" + ], + "data_vector_D + pdip_solve": [ + "input_reduce_fusion.13", + "input_reduce_fusion.29" + ], + "mapped_reconstruction + pdip_solve": [ + "input_reduce_fusion.17" + ], + "mapping_matrix + pdip_solve": [ + "loop_broadcast_fusion.2", + "loop_divide_fusion" + ], + "curvature_reg_reduce_gather + inversion_other + mapped_reconstruction + pdip_solve + reconstruction_scatter": [ + "input_multiply_transpose_fusion" + ], + "pdip_solve + regularization_H": [ + "loop_select_fusion.5", + "input_transpose_fusion.5" + ], + "inversion_other + pdip_solve + regularization_H": [ + "input_transpose_fusion.6" + ], + "inversion_other + pdip_solve": [ + "input_reduce_fusion.15", + "loop_log_fusion", + "input_reduce_fusion.16", + "input_reduce_fusion.20" + ], + "inversion_other + mapping_matrix + mesh_construction + mesh_dual_areas + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin + pdip_solve": [ + "input_scatter_fusion.6", + "input_scatter_fusion.3" + ] + }, + "prorated_estimate_ms": { + "psf_convolution_mapping_matrix": 0.6234764475, + "curvature_matrix_F": 0.51050416, + "pdip_solve": 0.3918166617380953, + "mapped_reconstruction": 0.08227965300000002, + "inversion_other": 0.06893565307142857, + "data_vector_D": 0.062444060000000114, + "mapping_matrix": 0.06217200333333331, + "regularization_H": 0.04317189248809522, + "reconstruction_scatter": 0.02313619799999999, + "curvature_reg_reduce_gather": 0.02193452299999999, + "mesh_construction": 0.014305502988095234, + "ray_trace_data_grid": 0.012635516666666647, + "mesh_locate_walk": 0.012555386154761919, + "mesh_interpolation_weights": 0.012318693238095237, + "mesh_seed_argmin": 0.011088477571428569, + "mesh_dual_areas": 0.008443200416666682, + "grids_and_structures": 0.00738974416666667, + "mass_profile_deflections": 0.00738974416666667, + "border_relocator": 0.006663670000000011, + "chi_squared_evidence": 0.004737912499999989 + }, + "prorated_note": "ESTIMATE ONLY \u2014 a mixed fusion's time split equally across the stages its constituents span. Never summed into the measured table, never reconciled." + }, + "other_sources_ms": { + "copy.106": 0.04191224999999906, + "copy.70": 0.017179350000000006, + "copy.75": 0.0019640150000000043, + "copy.105": 0.0018179299999999986, + "copy.104": 0.001758395000000002, + "copy.61": 0.0016627149999999993, + "copy.103": 0.0006374550000000004, + "copy.40": 0.0005414449999999996 + }, + "device_span_ms": 46.05030798, + "device_busy_ms": 38.726948045, + "device_idle_ms": 7.323359934999999, + "largest_idle_gaps": [ + { + "gap_ms": 5.59937, + "after": "pure_callback.4", + "before": "pure_callback.4" + }, + { + "gap_ms": 0.035807, + "after": "cholesky.60", + "before": "Memset 3" + }, + { + "gap_ms": 0.035455, + "after": "pure_callback.4", + "before": "copy.105" + }, + { + "gap_ms": 0.034399, + "after": "input_concatenate_fusion.7", + "before": "pure_callback.4" + }, + { + "gap_ms": 0.029407, + "after": "copy.70", + "before": "input_reduce_fusion.1" + }, + { + "gap_ms": 0.022912, + "after": "eigh.45", + "before": "eigh.45" + }, + { + "gap_ms": 0.021888, + "after": "input_reduce_fusion.28", + "before": "loop_broadcast_fusion.4" + }, + { + "gap_ms": 0.021631, + "after": "loop_add_fusion.1", + "before": "loop_select_fusion" + } + ], + "kernel_ms": 30.445270500000003, + "sum_ms": 37.768630435000006, + "wall_ms": 46.05666195500817, + "host_outside_span_ms": 0.006353975008167367, + "reconciliation_pct": -17.99529355406732, + "unjoined_ms": 0.0, + "unjoined_pct": 0.0, + "other_ms": 0.06702349999999999, + "other_pct": 0.14552400707084223, + "note": "Stage rows attribute the command-buffers-OFF program (see the module docstring): kernel times are the same, the launch overhead the CUDA graphs remove is not. sum_ms = kernel rows + device_idle_ms; the residual against wall_ms is host_outside_span_ms (dispatch before the first kernel, teardown after the last).", + "per_stage_ms_per_lane": { + "border_relocator": 0.1013135, + "chi_squared_evidence": 0.002976, + "curvature_matrix_F": 4.202033500000001, + "inversion_other": 1.803238, + "mapping_matrix": 0.00288, + "memset": 0.034432000000000004, + "mesh_construction": 0.001952, + "mesh_locate_walk": 0.1489275, + "mesh_qhull_callback": 0.010592, + "mesh_seed_argmin": 0.22428450000000014, + "mixed_fusion": 1.986319, + "other": 0.06702349999999999, + "pdip_solve": 14.734703000000003, + "psf_convolution_mapping_matrix": 7.113619999999999, + "regularization_H": 0.010976 + }, + "per_lane_divisor": 1, + "host_callback": { + "pure_callback_span_ms": 101.56374749999996, + "qhull_ms": 94.28838409999997, + "callback_body_ms_note": "the OUTERMOST matching body event, not a sum: under the probe the body appears twice (the wrapper and the timed re-implementation it calls) and summing them would count the same work twice", + "events_by_name": { + "pure_callback.4": { + "count": 200, + "ms": 101.56374749999996 + }, + "$callback.py:815 _wrapped_callback": { + "count": 200, + "ms": 99.82454449999999 + }, + "$callback.py:224 _callback": { + "count": 200, + "ms": 99.32401829999998 + }, + "$callback.py:74 pure_callback_impl": { + "count": 200, + "ms": 99.11897000000002 + }, + "$callback.py:69 __call__": { + "count": 200, + "ms": 94.63252060000005 + }, + "$delaunay.py:162 ": { + "count": 200, + "ms": 94.49607710000001 + }, + "$host_callback_probe.py:225 wrapped": { + "count": 200, + "ms": 94.28838409999997 + }, + "$host_callback_probe.py:160 _timed_tri_only": { + "count": 200, + "ms": 94.1085758 + }, + "ThenExecuteCallback:GetEventForComputeStreamSyncPoint": { + "count": 200, + "ms": 0.39008080000000017 + }, + "$callback.py:822 ": { + "count": 800, + "ms": 0.29828569999999965 + }, + "$__init__.py:132 _xla_gc_callback": { + "count": 2, + "ms": 0.000334 + } + }, + "note": "HOST milliseconds per traced BATCH (the whole invocation), aggregated by name because the events nest. Not a row of the device table: the device pays for them as the idle gaps largest_idle_gaps names." + }, + "host_callback_ms": 101.56374749999996 + }, + "hlo_census": { + "status": "excluded", + "reason": "The legacy census anchors PyAutoArray source line numbers that moved after the phase-1 run. No batched attribution is published from unsupported anchors; the device-event table and wall reconciliation remain valid." + }, + "trace_split": { + "expected_calls": 200, + "executions_per_invocation": 20, + "method": "per-call (first-instruction recurrence)", + "note": "DECIDED IN CODE: the scalar arm's trace is split by trace_calls * B, so every lane's execution is its own block and the per-stage median is taken over all of them. The vmap arm's is split by trace_calls, one block per batched execution, and per_stage_ms_per_lane divides those rows by B." + } + } + }, + "certification_report": { + "source": "vmap arm, library solve observed through its stats= out-dict (PyAutoArray #566) and jax.debug.callback(..., ordered=True); ordered because the unordered batching rule returns the lanes permuted. Untimed, separately compiled; max rel diff of its log likelihoods vs the timed arm's: 3.348e-06", + "rows": 20, + "pdip_iter": "NOT AVAILABLE per lane without changing library numerics. The fallback branch calls the library's own reconstruction_positive_only_from, which returns the solution alone \u2014 jax_nnls.solve_nnls' iteration count is discarded inside the library's custom_vjp primal. The PDIP while_loop's cost is in the pdip_solve stage row of each arm's device table instead, which is a max-over-lanes quantity under vmap because every lane runs the same fixed kernel sequence.", + "passes_semantics": "library `passes`: restricted active-set passes run (jax_active_set.solve_certified)" + }, + "lane_construction": { + "draws_sha256": "2ef9de62dd3cb04c203df7c6177baeafe26acbe41f5db2137c5891526b265fcf", + "lane_rows": [ + 300, + 301, + 302, + 303, + 304, + 305, + 306, + 307, + 308, + 309, + 310, + 311, + 312, + 313, + 314, + 315, + 316, + 317, + 318, + 319 + ], + "calls": [ + 15 + ], + "stage": "pix1", + "regularization_range": { + "galaxies.source.pixelization.regularization.inner_coefficient": { + "min": 2.161360256524811e-06, + "max": 609.7498208301598 + }, + "galaxies.source.pixelization.regularization.outer_coefficient": { + "min": 3.4330906156470037e-06, + "max": 159.11676392313697 + }, + "galaxies.source.pixelization.regularization.signal_scale": { + "min": 0.12452271846719754, + "max": 0.9404155018121758 + } + }, + "phases": [ + "exploration" + ], + "window_rule": "nautilus_batches.timed_window: consecutive captured calls, in call order, from the FIRST call that is not a prior batch, concatenated and truncated to B; at B == n_batch exactly one real Nautilus batch. Falls back to the latest B lanes if the post-prior lanes run out; never repeats a lane.", + "note": "Lane k is captured lane lane_rows[k]: the mass AND shear of a real Nautilus proposal (nautilus_batch_capture.py), lens light fixed at S3, the S3 light-subtracted dataset shared by every lane. `offsets` in the lane table are the mass offsets from the fiducial; the shear is in the capture file." + }, + "captured": { + "batches_path": "/mnt/ral/jnightin/autolens_profiling_wt/certified-solver-phase-c1-lane-rate/results/breakdown/imaging/nautilus_batches_delaunay_pix1.npz", + "batches_sha256": "e71a5e23026b342d1ff4359b8fb914a87980d8aea0060659d2334dcfa3215c00", + "schema_version": 2, + "n_calls": 932, + "n_lanes": 18640, + "call_sizes_seen": [ + 20 + ], + "calls_by_phase": { + "prior": 15, + "exploration": 917 + }, + "parameter_paths": [ + "galaxies.source.pixelization.regularization.inner_coefficient", + "galaxies.source.pixelization.regularization.outer_coefficient", + "galaxies.source.pixelization.regularization.signal_scale", + "galaxies.lens.mass.centre.centre_0", + "galaxies.lens.mass.centre.centre_1", + "galaxies.lens.mass.einstein_radius", + "galaxies.lens.mass.ell_comps.ell_comps_0", + "galaxies.lens.mass.ell_comps.ell_comps_1", + "galaxies.lens.shear.gamma_1", + "galaxies.lens.shear.gamma_2" + ], + "stage": "pix1", + "regularization": { + "class": "AdaptSplit", + "free": true, + "priors": { + "inner_coefficient": [ + "LogUniform", + 1e-06, + 1000000.0 + ], + "outer_coefficient": [ + "LogUniform", + 1e-06, + 1000000.0 + ], + "signal_scale": [ + "Uniform", + 0.0, + 1.0 + ] + }, + "priors_source": "PyAutoGalaxy packaged config/priors/regularization (adapt_split.yaml / constant.yaml); adapt_split.yaml is identical to euclid_strong_lens_modeling_pipeline/config/priors/regularization/adapt_split.yaml" + }, + "nautilus": { + "departures_from_production": [ + "mass/shear priors are the phase-B cell's Gaussians, not chained from source_lp", + "no positions likelihood", + "the cell's mesh (Hilbert 1500, weight_power 1) in both stages; source_pix_2 redraws a 500-vertex Hilbert grid at weight_power 3.5", + "seeded (production passes no seed)", + "quick updates disabled (iterations_per_quick_update=1e12; render-only)", + "NullPaths: no output directory, so no checkpoint and one Sampler.run call", + "post-fit perform_update skipped (samples / latent variables never built)" + ], + "n_batch": 20, + "n_like_max": 40000, + "n_live": 150, + "number_of_cores": 1, + "production_reference": "euclid_strong_lens_modeling_pipeline/scripts/full_model.py source_pix_1 (n_live=150) / source_pix_2 (n_live=75): af.Nautilus(n_batch=20, **SettingsSearch.search_dict) with use_jax_vmap=True and number_of_cores=1 (SettingsSearch defaults)", + "production_stage": "source_pix_1", + "seed": 1, + "stage": "pix1", + "use_jax_vmap": true, + "version": "1.0.5" + }, + "capture_fit_status": "sampling complete (n_like_max or convergence); post-fit result skipped", + "capture_library_revisions": { + "PyAutoArray": { + "head": "7fa8d2714f7da43fec2b23c31bff580764831670", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoArray" + }, + "PyAutoFit": { + "head": "a736840127be7a3c21e15a5c945e94d8f1082983", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoFit" + }, + "PyAutoGalaxy": { + "head": "70a61e26cd715cefe7012a38285698091246a8a4", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy" + }, + "PyAutoLens": { + "head": "86054bbc19baa2f710a12e04a94fa27ab37cc354", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoLens" + }, + "PyAutoNerves": { + "head": "1fa613aa8d89a79613009fb66f5b4e2d21deb57a", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoNerves" + } + }, + "fingerprint_check": { + "fields": [ + "mesh", + "source_pixels", + "dataset_sha256", + "regularization_class", + "regularization_s0_fiducial", + "border_relocator", + "use_mixed_precision", + "log_evidence_s3_library" + ], + "not_identity": "the regularization coefficients: free per lane since the capture frees them", + "log_evidence_s3_library_rel_diff": 0.0, + "passed": true + }, + "timed_window_vs_capture_pdip": { + "reference": "the capture's own figure of merit (library PDIP, Fitness.call_wrap jax.jit(jax.vmap(call)) over parameter vectors) for the same lanes", + "compared_against": "this cell's jit(vmap) library-PDIP reference", + "n_compared": 20, + "max_rel_diff": 2.381292063833651e-06, + "max_abs_diff_nats": 0.42177228338550776, + "gated": false, + "note": "RECORDED, NOT GATED: proves the lane trees rebuilt here are the models the sampler evaluated (a wrong parameter mapping shows up as nats, not 1e-10)." + } + }, + "matched": { + "vmap_wall_per_lane_ms": 54.36106531500627, + "scalar_wall_per_lane_ms": 44.27824533000603, + "speedup_vmap_over_scalar": 0.8145212952216208, + "note": "Both walls are the PRODUCTION nesting of their arm, measured in one process on the same B lanes with the SAME library Settings (no injection). A speedup below 1 means the batch is slower per lane than B sequential jitted calls." + }, + "solver_source": "library", + "solver": "certified", + "certified_fallback": "pdip", + "certified_pass_budget": 16, + "certified_pass_budget_basis": "config default (Settings().certified_pass_budget)", + "certified_tau_rel": 1e-09, + "solver_used": "certified", + "solver_check": { + "solver_used": "certified", + "solver_used_source": "AbstractInversion.positive_only_solver_used on the fiducial S3 inversion, built eagerly on the JAX backend (AnalysisImaging(use_jax=True).fit_from) with the arms' Settings", + "reference_solver_used": "pdip", + "traced_solver_kwargs_jax": [ + "certified" + ], + "observed_calls_jax": 1, + "report_rows": 20, + "report_vs_timed_arm_max_rel_diff": 3.3480907795757523e-06 + }, + "lanes_certified": [ + true, + false, + true, + true, + true, + true, + true, + true, + true, + true, + true, + false, + true, + true, + false, + false, + true, + false, + false, + false + ], + "lanes_passes": [ + 10, + 16, + 0, + 0, + 10, + 4, + 0, + 1, + 4, + 0, + 2, + 16, + 9, + 2, + 16, + 16, + 16, + 16, + 16, + 16 + ], + "uncertified_lanes": 7, + "per_lane_certification_note": "certified / passes come from the library's own solve through its stats= out-dict (PyAutoArray #566): passes is the number of restricted active-set passes the library ran (0 when the unconstrained solve was already non-negative), certified is its KKT certificate. With certified_fallback=pdip a False lane returned the PDIP solution; with none it returned the last uncertified iterate. null for a library-PDIP row (no certificate).", + "gate": { + "pre_registered": true, + "gated": [ + "per lane: jit(vmap) arm vs jit(vmap) library PDIP <= lane_rtol relative", + "per lane: scalar jit arm vs scalar jit library PDIP <= lane_rtol relative" + ], + "recorded_not_gated": [ + "per lane: jit(vmap) arm vs scalar jit arm (rel_diff, abs_diff_nats)", + "per lane: jit(vmap) library PDIP vs scalar jit library PDIP", + "uncertified_lanes (certified_fallback=none rows)" + ], + "lanes_failed": 4, + "passed": false, + "policy_eligible": false, + "note": "Pre-registered before submission (module docstring; submit header). Phase 3 (results/notes/hst_gpu_residue_phase3_psf_2026_09.md) placed phase 2's ~2.5e-9 certified-vs-PDIP residual BETWEEN the jit(vmap) and scalar-jit compositions, not in the solver \u2014 so each arm is gated against the library-PDIP reference of its OWN composition, and the cross-composition difference is recorded with its nats. A certified_fallback=none row is policy-eligible only if every lane certifies AND passes the gate. Timing is never gated." + }, + "library_revisions": { + "PyAutoArray": { + "head": "3de624b5b91a4efa130dc3cb0a3a0f06f85025a3", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoArray", + "module_file": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/__init__.py" + }, + "PyAutoFit": { + "head": "dd9fbe0aab60c4a57702b1444ca031b317c91331", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoFit", + "module_file": "/mnt/ral/jnightin/PyAuto/PyAutoFit/autofit/__init__.py" + }, + "PyAutoGalaxy": { + "head": "70a61e26cd715cefe7012a38285698091246a8a4", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy", + "module_file": "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/__init__.py" + }, + "PyAutoLens": { + "head": "86054bbc19baa2f710a12e04a94fa27ab37cc354", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoLens", + "module_file": "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/__init__.py" + }, + "autoarray_file": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/__init__.py" + } + }, + "headline_arm_note": "`trace`, `hlo_census`, `command_buffers` and `trace_timing` above describe the scalar arm \u2014 the program phase 1 traced. Both arms' full blocks, the lane table and the matched comparison are under `vmap`." +} \ No newline at end of file diff --git a/results/breakdown/imaging/fixed_light_trace_delaunay_jitvmap20_captured_pix1_libcertified_fbon_b16_hpc_a100_fp64_fixed_light_trace.png b/results/breakdown/imaging/fixed_light_trace_delaunay_jitvmap20_captured_pix1_libcertified_fbon_b16_hpc_a100_fp64_fixed_light_trace.png new file mode 100644 index 0000000000000000000000000000000000000000..03df520e32fc8ad9e5db9bff097050f957fd57a8 GIT binary patch literal 152910 zcmeFZc{JAD`v&?b6&i(7DN?2gNs@%5WS*xoWGa#|Q|5|DlE_e!xy&T$>!w6!_R ze~e$4kIll-(eA34fPnS?^#lC24wnS>g!EY8Lul>J>RqK!wr?eWQ(cN}R;N%=C~`6< zHC-S7`r@L=sIzO`*WPCL>;tDy%VhWj2Ch}5UQfrarI{o1ygjbAdK*I`r%BqpaDj~J zz4Be|M>`ly$G0*usmWN5&#t?~$#=Z;7eDu-vJb}|SAQ-(>@wC}>=YOjKofMRmf7@w z{GLx;`~C3kDsKO`AAIhz=l}n;|BtMJyS16n!-mSZI5x`5B)KrQu=*T} zj|uX3Z7n;it;T!GL+Z`WDl12vudw*YUS}qx_((Xldor!gT8rAn#ihrg-)sN; z6Tgm17qzvPbKbadgFL6pxMBSu$BLt);{{XGn|K30y<8awcj+CvQy-d|w%FL%4E2;B zfB*QH#>L0MtdjhBtO)LGDPPSqFK>FON!i18K6nvT7GovORLyXnOxm8Hoytl8Ep zv*W#Qmgawd#Glnn*WS2x?b@8&Td zrFX5=-raRMbA`V>+`RtXJHHn%4vRSsseV?QZ~v73i$<`Pd2v=jUOrTRY;bVqmg!V) zKDL2+-MW1|Jj0T$^@{@Y17Rvn5i`sbFPI9X1(F&??xqDphrW6sWFrd3B!MC6Qx z1-D^^$L*NoE+%h+ck7nB9bw#@LPMFD9@bb|UL4mgapcj?(!Z?~EwWcwSaVpydwKrS=XHpbg|1UR-=v70ASE_p9TOX68Aj*S9vlo*HblA8Oj`vGRA8S=b_^%6aTdseen0 z=FsqP-y2r%2X8fOqfg)27LR9%617jL-Tl}8TWw#oZN+te|8*v&rp8$OCxwMyzQ2op ze(A#=kJ&FSg2KWN7Dv;wE2_9+J#HM(N@F{4fDRF1@j2I=qvpYLm-7w|LfEjN6YhV` zDnCijz4&ft5c47FZ=TzjnEL+C_P)8XX8ncBmjfdXp08?XpewZbQicEg`r`+ei_+rU zT-?N4I_^Xlfh=iVz`S32`(8zTjDES_0* zjp+<_7hlyab3JtC?#?yq*7*mDzim$tHy3d~zGK&}eMgQk?UN0z#%g^maT;j|Zm!(+ zuR^$wHas%hA?_;J|Lt4fuU|_S*)?fP9EWdQeD~!>Hdk?i|vwC=XGF6>EbEZM*WtrOyU44DMZiUCOwVPN1 zcy+SQjtNLgvSLxzQACd&>uXL{5Ow~=y!7|)k-$r5&aCasv%I-}JO73L>f8O)Z3xZ2 zA3ywYLgEqBc1}*=UGKlXx;cqs8npZPHVFxd1GDp4Dd+MJ@aq>*7#JA*dfPJ3uQN3@ zeJtiAUnW9b`S;JRso%eQHHDA->GNl;>gn0zx%fwG&iYG<6UArsx=j}1MKwKpK0Q@> z-SOO%DNEze7}jC!t<9|bZL^3Eyx{SM4M)uz82NN_C|J2FB;Ene=TF41-FW*}(NFMO z?OmMuU4otqj*77o<g-}@xQ8U`WQ9nRx{$r1?tiZMjkmY8ZHx6<;OX&R z@$Bg8y3?rgSoC^G$d(Ml@}0kbe2}g5`a4i%`Dsj`QI^${8d)G{&xw-mH#JcO>gwu( zc!r=|M>k=|(tiytSxt^?++iA|C3gJyao20tUNtx8<|a;c>Yh7S)!2B4tGvVNerV{b zxT33bPuCS#wPoC9^juGh@`~H8nLgF!~oXD}GZ_{W+Axv{bFc(sP%uinOv z4rY|4n#pf(?0>eTHUz)_ZycvPs*h{;=9;fZ8NH1Cxb)#keWr>G&HD8>6**t$S$-Pu za$lM|gwnDOg_n8PuGh`YTQkoW);?8=elX^ZLuS!ac1%%G@q(4roh*aWenbwFTToh$ zLd?U5x2aaIjgt>QK*~V5+swolm)`3E4NKcT;RBj7&mYBUdyNOXyX$BzzF@FTPFeYk zot+@%!eoDq!?=Ua?2KMx^rhe&`ICW zP{7=r>)oDRvEkuEeH82NNHMLR<`zP0)aP6Nm6%tu+)SB;J9≶Ig(ak7G>RnP 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
    6}Arfn|3@fX4W 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 L+Z?eTyW)QUb0$IM literal 0 HcmV?d00001 diff --git a/results/breakdown/imaging/fixed_light_trace_delaunay_jitvmap50_captured_pix1_libcertified_fboff_b16_hpc_a100_fp64_fixed_light_trace.json b/results/breakdown/imaging/fixed_light_trace_delaunay_jitvmap50_captured_pix1_libcertified_fboff_b16_hpc_a100_fp64_fixed_light_trace.json new file mode 100644 index 000000000..e181d6b62 --- /dev/null +++ b/results/breakdown/imaging/fixed_light_trace_delaunay_jitvmap50_captured_pix1_libcertified_fboff_b16_hpc_a100_fp64_fixed_light_trace.json @@ -0,0 +1,8478 @@ +{ + "device": { + "backend": "gpu", + "device": "cuda:0", + "hostname": "euclid-ral-gpu-2", + "xla_flags": "--xla_disable_hlo_passes=constant_folding --xla_gpu_autotune_level=0 --xla_gpu_enable_triton_gemm=false", + "omp_num_threads": null, + "cpu_count": 124, + "jax_compilation_cache_dir": "/mnt/ral/jnightin/autolens_profiling_wt/certified-solver-phase-c1-lane-rate/output/jax_cache/fixed_light_lanerate_delaunay_pix1_time_50_certified_off_350768_16", + "autotune_cache_entries_at_start": 0, + "cache_fresh": true, + "nvidia_smi": "NVIDIA A100 80GB PCIe, 61395 MiB, 81920 MiB" + }, + "machine": { + "cpu_model": "AMD EPYC 7702 64-Core Processor", + "cpu_count_os": 124, + "nproc": 4, + "nproc_all": 124, + "nproc_note": "GNU nproc honours OMP_NUM_THREADS, so `nproc` can print 1 on a multi-core host; `nproc_all` is the core count.", + "ram_total": "928298204 kB", + "kernel": "5.14.0-687.50.1.el9_8.x86_64", + "platform": "Linux-5.14.0-687.50.1.el9_8.x86_64-x86_64-with-glibc2.34", + "python": "3.12.4", + "jax_thread_env": { + "NPROC": null + }, + "blas_thread_env": { + "OMP_NUM_THREADS": null, + "OPENBLAS_NUM_THREADS": null, + "MKL_NUM_THREADS": null, + "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" + }, + "precision": "fp64", + "configuration": { + "pixel_scale_arcsec": 0.05, + "mask_radius_arcsec": 3.5, + "image_pixels_masked": 15361, + "over_sampled_pixels": 62752, + "mesh": "delaunay", + "mesh_shape": null, + "source_pixels": 1500, + "source_pixels_requested": null, + "dataset": "hst", + "dataset_sha256": { + "data.fits": "e4e833a28e9c6f6fb023cd85c0d3dde74068720256bc77a240633500e5b04fac", + "noise_map.fits": "315c6266a0acd3ac9c8da82fcd2b45a08697362481fd7a35072bab1658530ba3", + "psf.fits": "8389ba0e8bf4a09b4a561cfc246181a2fb944ed396754cd0ff76fdd22910d303" + }, + "cell_source_sha256": "06a162fcdae6b329384ec33322f443df07215d86e56f0505ac15b3d3473eb432", + "inversion_path": "dense", + "pass_budget": 7, + "pass_budget_basis": "phase 3 (autolens_profiling#255): the smallest ZERO-fallback budget per mesh, the budget a production run fixes. NOT phase 0's certifying budget (2 for Delaunay), which falls back on 67.5 % of a graded draw set and is not a production cost.", + "border_relocator_mode": "cell", + "border_relocator": true, + "border_relocator_note": "'cell' is use_border_relocator=True, which every profiling cell in this family forces; 'library' passes None and takes the shipped config default, which is what production runs. The resolved boolean is what this leg actually ran.", + "routes_selected": [ + "b", + "d" + ], + "trace_calls": 10, + "command_buffers_traced": "off", + "use_mixed_precision": false, + "tau_rel": 1e-09, + "regularization": { + "scheme": "adapt_split", + "inner_coefficient": 0.1, + "outer_coefficient": 10.0, + "signal_scale": 0.1 + }, + "thread_env": { + "n_threads": null, + "vars": [ + "OPENBLAS_NUM_THREADS", + "MKL_NUM_THREADS", + "OMP_NUM_THREADS", + "VECLIB_MAXIMUM_THREADS", + "NUMEXPR_NUM_THREADS" + ], + "set_to": null, + "preexisting": {}, + "overridden": {}, + "note": "Not pinned (legacy variant): recorded as found." + }, + "over_sample_size_lp_rule": { + "sub_size_list": [ + 4, + 2, + 2 + ], + "radial_list": [ + 0.3, + 0.6 + ], + "centre": [ + 0.0, + 0.0 + ] + }, + "vmap_batch": 50, + "lanes": "captured", + "arms": [ + "vmap", + "scalar" + ], + "fallback": "off", + "draw_seed": 0, + "vmap_composition": "jax.jit(jax.vmap(fn))", + "lane_rtol": 1e-09, + "vmap_flags_note": "Strict ProfileCLI.parse_cell_args rejects unknown flags. These keys record the exact batching program and prevent historical vmap(jit) artifacts from being mistaken for current jit(vmap) measurements.", + "solver_source": "library", + "solver": "certified", + "certified_fallback": "none", + "certified_pass_budget": 16, + "captured_pass": "time", + "batches": "/mnt/ral/jnightin/autolens_profiling_wt/certified-solver-phase-c1-lane-rate/results/breakdown/imaging/nautilus_batches_delaunay_pix1.npz" + }, + "solver_injection": { + "patched": null, + "part_v": "none \u2014 library mode selects the solver through al.Settings", + "part_b_route_d": { + "patched": "autoarray.inversion.inversion.inversion_util.reconstruction_positive_only_from", + "pass_budget": 7, + "fallback": true + }, + "note": "Library mode (phase B, #300): PART V's arms and references run the library's own positive-only solve, selected by Settings(positive_only_solver, certified_fallback, certified_pass_budget); nothing is injected. PART B's single-call route d (the fiducial d == b pin) still uses the phase-1 harness injection at the phase-3 budget and is not a phase-B row. The untimed certification report observes the library solve (library_solver_observed) without changing it." + }, + "routes": { + "b_s3_pdip": { + "label": "S3 PDIP (source-only)", + "status": "ok", + "solver": "library", + "ms": 51.39113889999862, + "log_likelihood": 29155.000173263223 + }, + "d_s3_certified_fallback": { + "label": "S3 certified active set, budget 7, PDIP fallback", + "status": "ok", + "solver": "harness-injected certified active set", + "pass_budget": 7, + "fallback": true, + "injected_solver_calls_jax": 1, + "injected_solver_calls_numpy": 0, + "ms": 31.84854139981326, + "log_likelihood": 29155.000175564644 + } + }, + "equivalence_pins": [ + { + "pin": "route d (certified, fallback) == route b (library PDIP)", + "route": "d_s3_certified_fallback", + "reference": "b_s3_pdip", + "expectation": "the certified active set returns the library's own positive solution", + "rtol": 1e-09, + "got": 29155.000175564644, + "reference_value": 29155.000173263223, + "rel_diff": 7.893746388191834e-11, + "status": "PASS" + } + ], + "equivalence_rtol": 1e-09, + "reference": { + "log_evidence_s0_library": 29155.00017433923, + "log_evidence_s3_library": 29155.000174339304, + "s3": { + "n_params": 1500, + "n_mapper": 1500, + "n_funcs": 0, + "edge_zeroed_pixels": 0, + "subtracted_light_flux": 5105.448603818575 + } + }, + "command_buffers": { + "wall_on_ms": 1714.8924133998662, + "wall_off_ms": 1727.6137147000554, + "command_buffer_delta_ms": 12.721301300189225, + "command_buffer_delta_pct": 0.7418133756256209, + "traced": "off", + "compiler_option": "xla_gpu_enable_command_buffer", + "probe": { + "note": "Not taken in --vmap-batch mode: the CUPTI-inside-a-CUDA-graph probe is a phase-1 diagnostic about the JOIN, and this mode already compiles and times both the command-buffers ON and OFF executable of every arm." + }, + "note": "ONE lowering, TWO compilations, one process. wall_on_ms is the PRODUCTION program (CUDA graphs as XLA ships them) and is the number comparable to phase 5's row; wall_off_ms is the graph-less program the stage rows attribute. The delta is the launch overhead the graphs remove \u2014 it lands in device_idle and host_outside_span, not in any stage. Reconciliation is computed against wall_off_ms." + }, + "trace": { + "parser": "ProfileData.from_file(xplane) + as_text() + stack_frame_index(proto field 17)", + "stage_audit": { + "mixed_fusion": [ + { + "instruction": "loop_divide_gather_fusion", + "ms": 1.0175930819999996, + "opcode": "fusion", + "shape": "(f64[15361,1,1,1500]{3,2,1,0}, f64[15361,1,1,1500]{3,2,1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:133", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:133 (curvature_matrix_via_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:93 (InversionImagingMapping.curvature_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:389 (AbstractInversion.curvature_reg_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "loop_broadcast_fusion.4", + "ms": 0.22712514000000011, + "opcode": "fusion", + "shape": "f64[1500,180,180]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "input_reduce_fusion.5", + "ms": 0.12176276800000001, + "opcode": "fusion", + "shape": "f64[92,1500]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/inversion_imaging_util.py:123", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/inversion_imaging_util.py:123 (data_vector_via_blurred_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:67 (InversionImagingMapping.data_vector)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:699 (AbstractInversion.reconstruction)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "input_reduce_fusion.9", + "ms": 0.11505236400000013, + "opcode": "fusion", + "shape": "f64[15361]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:163", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:163 (mapped_reconstructed_data_via_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:120 (InversionImagingMapping._mapped_reconstructed_data_dict_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:196 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "loop_broadcast_fusion.2", + "ms": 0.11096660999999992, + "opcode": "fusion", + "shape": "f64[15361,1500]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:342", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:342 (mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/abstract.py:283 (Mapper.mapping_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:91 (AbstractInversionImaging._mapping_matrix_for_convolution_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:137 (AbstractInversionImaging.operated_mapping_matrix_list)" + ] + }, + { + "instruction": "input_multiply_transpose_fusion", + "ms": 0.10992808600000005, + "opcode": "fusion", + "shape": "(f64[1500,1500]{1,0}, f64[1500,1500]{1,0}, f64[1500,1500]{1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:237 (active_set_search)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:293 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:274 (_certified_positive_only_from)" + ] + } + ], + "border_relocator": [ + { + "instruction": "eigh.45", + "ms": 0.07479145000000191, + "opcode": "custom-call", + "shape": "(f64[2,2]{0,1}, f64[2]{0}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:245", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:245 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:454 (BorderRelocator.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:176 (AbstractMesh.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:214 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "custom-call.2", + "ms": 0.007953370000000022, + "opcode": "custom-call", + "shape": "(f64[2,2]{1,0}, s8[4194304]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:242", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:242 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:454 (BorderRelocator.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:176 (AbstractMesh.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:214 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "input_reduce_fusion.10", + "ms": 0.005808486000000006, + "opcode": "fusion", + "shape": "(f64[], f64[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:269", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:269 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:454 (BorderRelocator.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:176 (AbstractMesh.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:214 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "loop_add_fusion.3", + "ms": 0.003513809999999997, + "opcode": "fusion", + "shape": "f64[15361]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:308", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:308 (relocated_grid_via_ellipse_border_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:423 (BorderRelocator.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:83 (AbstractMesh.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:208 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "loop_add_fusion.5", + "ms": 0.0034463339999999927, + "opcode": "fusion", + "shape": "f64[1500]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:308", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:308 (relocated_grid_via_ellipse_border_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:458 (BorderRelocator.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:176 (AbstractMesh.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:214 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "input_concatenate_fusion.12", + "ms": 0.0024006459999999937, + "opcode": "fusion", + "shape": "f64[392,2]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:238", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:238 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:454 (BorderRelocator.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:176 (AbstractMesh.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:214 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + } + ], + "mesh_construction": [ + { + "instruction": "input_concatenate_fusion.7", + "ms": 0.00206010400000001, + "opcode": "fusion", + "shape": "f64[1500,2]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:820", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:820 (InterpolatorDelaunay.mesh_grid_xy)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:847 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + } + ], + "mesh_qhull_callback": [ + { + "instruction": "pure_callback.4", + "ms": 0.010668695999999964, + "opcode": "custom-call", + "shape": "(s32[3000,3]{1,0}, s32[3000,3]{1,0}, s32[1500]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:161", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:161 (_jax_delaunay_tables)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:405 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + } + ], + "other": [ + { + "instruction": "copy.80", + "ms": 0.042013890000002906, + "opcode": "copy", + "shape": "f64[1,1024,2]{2,1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "copy.48", + "ms": 0.01694752399999989, + "opcode": "copy", + "shape": "s32[21361]{0}", + "source": "", + "stack": [] + }, + { + "instruction": "copy.53", + "ms": 0.0020209240000000064, + "opcode": "copy", + "shape": "s64[1500]{0}", + "source": "", + "stack": [] + }, + { + "instruction": "copy.39", + "ms": 0.0016531839999999976, + "opcode": "copy", + "shape": "s32[]", + "source": "", + "stack": [] + }, + { + "instruction": "copy.78", + "ms": 0.001652293999999998, + "opcode": "copy", + "shape": "s64[]", + "source": "", + "stack": [] + }, + { + "instruction": "copy.79", + "ms": 0.0016482640000000034, + "opcode": "copy", + "shape": "s32[]", + "source": "", + "stack": [] + } + ], + "mesh_seed_argmin": [ + { + "instruction": "input_reduce_fusion", + "ms": 0.15265030800001345, + "opcode": "fusion", + "shape": "(f64[1024]{0}, s64[1024]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:191", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:191 (_nearest_vertex_seed_from..argmin_chunk)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204 (_nearest_vertex_seed_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:351 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)" + ] + }, + { + "instruction": "loop_dynamic_update_slice_fusion", + "ms": 0.04134029799999785, + "opcode": "fusion", + "shape": "s32[21,1024]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204 (_nearest_vertex_seed_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:351 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "loop_add_fusion", + "ms": 0.03189977599999631, + "opcode": "fusion", + "shape": "s64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204 (_nearest_vertex_seed_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:351 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "loop_broadcast_fusion", + "ms": 0.0019563560000000224, + "opcode": "fusion", + "shape": "s32[21,1024]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204 (_nearest_vertex_seed_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:351 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "pdip_solve": [ + { + "instruction": "cholesky.50", + "ms": 7.369648399999985, + "opcode": "custom-call", + "shape": "(f64[1500,1500]{0,1}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:252 (active_set_search..body_fun)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:262 (active_set_search)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:293 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)" + ] + }, + { + "instruction": "triangular-solve.1", + "ms": 1.3328387779999877, + "opcode": "custom-call", + "shape": "(f64[1500,1]{0,1}, s8[0]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:154", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:154 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:252 (active_set_search..body_fun)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:262 (active_set_search)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:293 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)" + ] + }, + { + "instruction": "triangular-solve", + "ms": 1.1379613320000173, + "opcode": "custom-call", + "shape": "(f64[1500,1]{0,1}, s8[0]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:154", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:154 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:252 (active_set_search..body_fun)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:262 (active_set_search)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:293 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)" + ] + }, + { + "instruction": "cholesky.70", + "ms": 0.8937893680000013, + "opcode": "custom-call", + "shape": "(f64[1500,1500]{0,1}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:297 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:274 (_certified_positive_only_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:496 (reconstruction_positive_only_from)" + ] + }, + { + "instruction": "cholesky.60", + "ms": 0.8653709439999951, + "opcode": "custom-call", + "shape": "(f64[1500,1500]{0,1}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:237 (active_set_search)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:293 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:274 (_certified_positive_only_from)" + ] + }, + { + "instruction": "input_transpose_fusion", + "ms": 0.2912085159999993, + "opcode": "fusion", + "shape": "f64[1500,1500]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:252 (active_set_search..body_fun)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:262 (active_set_search)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:293 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)" + ] + } + ], + "regularization_H": [ + { + "instruction": "input_scatter_fusion.10", + "ms": 0.002067654000000009, + "opcode": "fusion", + "shape": "f64[1500,1500]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:615", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:615 (pixel_splitted_regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt_split.py:137 (AdaptSplit.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:332 (AbstractInversion.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "input_concatenate_fusion.9", + "ms": 0.0018498079999999884, + "opcode": "fusion", + "shape": "pred[3]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:91", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:91 (split_points_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:410 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + }, + { + "instruction": "input_concatenate_fusion.8", + "ms": 0.0018417339999999905, + "opcode": "fusion", + "shape": "pred[3]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:93", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:93 (split_points_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:410 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + }, + { + "instruction": "input_concatenate_fusion", + "ms": 0.0017630739999999877, + "opcode": "fusion", + "shape": "s32[1500,2]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:615", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:615 (pixel_splitted_regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt_split.py:137 (AdaptSplit.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:332 (AbstractInversion.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "input_concatenate_fusion.10", + "ms": 0.0016839700000000006, + "opcode": "fusion", + "shape": "pred[3]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:90", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:90 (split_points_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:410 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + }, + { + "instruction": "input_concatenate_fusion.11", + "ms": 0.0015004100000000015, + "opcode": "fusion", + "shape": "pred[3]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:88", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:88 (split_points_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:410 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + } + ], + "mesh_locate_walk": [ + { + "instruction": "loop_reduce_fusion", + "ms": 0.025697353999999336, + "opcode": "fusion", + "shape": "(f64[21361]{0}, s64[21361]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:264", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:264 (_walk_from_seed..walk_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:292 (_walk_from_seed..body)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:264 (_walk_from_seed..walk_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:292 (_walk_from_seed..body)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)" + ] + }, + { + "instruction": "input_reduce_fusion.1", + "ms": 0.02505042399999984, + "opcode": "fusion", + "shape": "pred[196]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:288", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:288 (_walk_from_seed..cond)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:353 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)" + ] + }, + { + "instruction": "loop_or_select_fusion", + "ms": 0.023336122000000445, + "opcode": "fusion", + "shape": "(s32[21361]{0}, pred[21361]{0}, pred[21361]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:270", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:270 (_walk_from_seed..walk_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:292 (_walk_from_seed..body)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:353 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)" + ] + }, + { + "instruction": "loop_select_fusion", + "ms": 0.0200991939999998, + "opcode": "fusion", + "shape": "s32[21361]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:242", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:242 (_walk_from_seed..weights_of)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:262 (_walk_from_seed..walk_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:292 (_walk_from_seed..body)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:353 (pix_indexes_delaunay_walk_from)" + ] + }, + { + "instruction": "input_reduce_fusion.2", + "ms": 0.01618481999999954, + "opcode": "fusion", + "shape": "pred[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:288", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:288 (_walk_from_seed..cond)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:353 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)" + ] + }, + { + "instruction": "while.20", + "ms": 0.014477788000000524, + "opcode": "while", + "shape": "(s32[], s32[21361]{0}, pred[21361]{0}, pred[21361]{0}, s32[3000,3]{1,0}, /*index=5*/f64[1500,2]{1,0}, f64[21361,2]{1,0}, s32[3000,3]{1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:353 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "psf_convolution_mapping_matrix": [ + { + "instruction": "input_scatter_fusion", + "ms": 1.9831097979999994, + "opcode": "fusion", + "shape": "f64[1500,180,180]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "fft.19.0", + "ms": 1.760859012000003, + "opcode": "fft", + "shape": "f64[1500,180,180]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "fft.15.0", + "ms": 1.3666725080000002, + "opcode": "fft", + "shape": "c128[1500,180,91]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "fft.17.0", + "ms": 0.9791528720000001, + "opcode": "fft", + "shape": "c128[1500,91,180]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "input_transpose_fusion.2", + "ms": 0.5137495439999998, + "opcode": "fusion", + "shape": "c128[1500,91,180]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "wrapped_transpose", + "ms": 0.4997207419999994, + "opcode": "fusion", + "shape": "c128[1500,180,91]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + } + ], + "inversion_other": [ + { + "instruction": "cholesky.80", + "ms": 0.8974853480000059, + "opcode": "custom-call", + "shape": "(f64[1500,1500]{0,1}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986 (AbstractInversion._log_det_symmetric_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:1078 (AbstractInversion.log_det_curvature_reg_matrix_term)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:347 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/model/analysis.py:135 (AnalysisImaging.log_likelihood_function)" + ] + }, + { + "instruction": "cholesky.90", + "ms": 0.8934377540000045, + "opcode": "custom-call", + "shape": "(f64[1500,1500]{0,1}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986 (AbstractInversion._log_det_symmetric_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:1157 (AbstractInversion.log_det_regularization_matrix_term)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:348 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/model/analysis.py:135 (AnalysisImaging.log_likelihood_function)" + ] + }, + { + "instruction": "loop_reduce_window_fusion", + "ms": 0.0028813000000000102, + "opcode": "fusion", + "shape": "s64[6,16]{1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "loop_reduce_window_fusion.1", + "ms": 0.002790532000000021, + "opcode": "fusion", + "shape": "s64[94,16]{1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "loop_broadcast_convert_fusion", + "ms": 0.002189315999999998, + "opcode": "fusion", + "shape": "(s32[1500]{0}, s64[1500]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:527", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:527 (AbstractInversion.zeroed_ids_to_keep)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:567 (AbstractInversion.solve_ids_to_keep)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:684 (AbstractInversion.reconstruction)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "input_scatter_fusion.5", + "ms": 0.0019471320000000172, + "opcode": "fusion", + "shape": "s64[1500]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:527", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:527 (AbstractInversion.zeroed_ids_to_keep)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:567 (AbstractInversion.solve_ids_to_keep)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:684 (AbstractInversion.reconstruction)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "mapping_matrix": [ + { + "instruction": "input_reduce_fusion.23", + "ms": 0.0029120620000000212, + "opcode": "fusion", + "shape": "f64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:93", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:93 (adaptive_pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/abstract.py:507 (Mapper.pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt.py:339 (Adapt.regularization_weights_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt_split.py:120 (AdaptSplit.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)" + ] + } + ], + "curvature_matrix_F": [ + { + "instruction": "cublas-lt-matmul.2", + "ms": 4.288411013999998, + "opcode": "custom-call", + "shape": "(f64[1500,1500]{1,0}, s8[4194304]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:134", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:134 (curvature_matrix_via_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:93 (InversionImagingMapping.curvature_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:389 (AbstractInversion.curvature_reg_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "chi_squared_evidence": [ + { + "instruction": "loop_multiply_fusion", + "ms": 0.0030087840000000096, + "opcode": "fusion", + "shape": "f64[15361]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/abstract_ndarray.py:300", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/abstract_ndarray.py:300 (AbstractNDArray.__pow__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/abstract_ndarray.py:60 (unwrap_array..wrapper)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/abstract_ndarray.py:35 (to_new_array..wrapper)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_util.py:78 (chi_squared_map_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:78 (AbstractFit.chi_squared_map)" + ] + } + ] + }, + "stage_audit_note": "The HLO instructions that contributed most of each stage's milliseconds, with their full source stack. A stage row is only as good as the rules that built it; this is how a reader checks a row against the HLO instead of trusting it.", + "untraced_wall_ms": 34.5870705020061, + "reconciliation_vs_untraced_pct": -9.032788081386911, + "wall_basis": "wall_ms is the TRACED run's wall, the run these kernel durations came from. untraced_wall_ms is the same executable without the profiler; the difference is the profiler's overhead and belongs in neither the stages nor the idle row.", + "calls": 500, + "call_split": "per-call (first-instruction recurrence)", + "call_blocks": 500, + "events": 246200, + "streams": [ + "Stream #14(MemcpyD2D,MemcpyD2H,Compute,MemcpyH2D,Memset)" + ], + "per_stage_ms": { + "border_relocator": { + "median_ms": 0.10140749999999998, + "min_ms": 0.10057100000000001, + "max_ms": 0.10249700000000003 + }, + "chi_squared_evidence": { + "median_ms": 0.002976, + "min_ms": 0.002848, + "max_ms": 0.003424 + }, + "curvature_matrix_F": { + "median_ms": 4.2873885000000005, + "min_ms": 4.269005, + "max_ms": 4.356782 + }, + "inversion_other": { + "median_ms": 1.8000515, + "min_ms": 1.780275, + "max_ms": 1.8460999999999999 + }, + "mapping_matrix": { + "median_ms": 0.002912, + "min_ms": 0.002879, + "max_ms": 0.002945 + }, + "memset": { + "median_ms": 0.023711499999999996, + "min_ms": 0.009951999999999999, + "max_ms": 0.05424000000000001 + }, + "mesh_construction": { + "median_ms": 0.002048, + "min_ms": 0.002047, + "max_ms": 0.002081 + }, + "mesh_locate_walk": { + "median_ms": 0.150146, + "min_ms": 0.13200199999999998, + "max_ms": 0.18605200000000013 + }, + "mesh_qhull_callback": { + "median_ms": 0.010624, + "min_ms": 0.010496, + "max_ms": 0.0112 + }, + "mesh_seed_argmin": { + "median_ms": 0.22784400000000016, + "min_ms": 0.22733000000000012, + "max_ms": 0.22825900000000016 + }, + "mixed_fusion": { + "median_ms": 1.9871890000000003, + "min_ms": 1.9793150000000002, + "max_ms": 1.9996699999999998 + }, + "other": { + "median_ms": 0.065856, + "min_ms": 0.063488, + "max_ms": 0.07020900000000001 + }, + "pdip_solve": { + "median_ms": 8.940318000000001, + "min_ms": 2.4265080000000006, + "max_ms": 23.48978300000001 + }, + "psf_convolution_mapping_matrix": { + "median_ms": 7.1034515, + "min_ms": 7.087626, + "max_ms": 7.119909000000001 + }, + "regularization_H": { + "median_ms": 0.01072, + "min_ms": 0.010496, + "max_ms": 0.011231999999999999 + } + }, + "stage_order": [ + "border_relocator", + "mesh_qhull_callback", + "mesh_seed_argmin", + "mesh_locate_walk", + "mesh_construction", + "mapping_matrix", + "psf_convolution_mapping_matrix", + "curvature_matrix_F", + "regularization_H", + "pdip_solve", + "chi_squared_evidence", + "inversion_other", + "mixed_fusion", + "other", + "memset" + ], + "mixed_fusion": { + "ms": 1.9871890000000003, + "constituent_stage_sets": { + "curvature_matrix_F + psf_convolution_mapping_matrix": 1.0175930819999996, + "pdip_solve + psf_convolution_mapping_matrix": 0.22712514000000011, + "data_vector_D + pdip_solve": 0.12545822000000006, + "mapped_reconstruction + pdip_solve": 0.11505236400000013, + "mapping_matrix + pdip_solve": 0.11334101599999974, + "curvature_reg_reduce_gather + inversion_other + mapped_reconstruction + pdip_solve + reconstruction_scatter": 0.10992808600000005, + "pdip_solve + regularization_H": 0.045231470000000114, + "inversion_other + pdip_solve + regularization_H": 0.024255044000000007, + "inversion_other + pdip_solve": 0.022968676000000212, + "inversion_other + mapping_matrix + mesh_construction + mesh_dual_areas + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin + pdip_solve": 0.021231599999999986, + "inversion_other + mesh_construction + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin + pdip_solve + regularization_H": 0.01925402400000005, + "inversion_other + mesh_construction + mesh_dual_areas + mesh_interpolation_weights + pdip_solve + regularization_H": 0.014702948, + "pdip_solve + ray_trace_data_grid": 0.013606675999999918, + "border_relocator + pdip_solve": 0.013358111999999946, + "inversion_other + mapping_matrix + mesh_construction + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin": 0.011698335999999995, + "grids_and_structures + mass_profile_deflections + pdip_solve": 0.009939747999999986, + "grids_and_structures + mass_profile_deflections + pdip_solve + ray_trace_data_grid": 0.009199003999999995, + "chi_squared_evidence + pdip_solve": 0.007668511999999986, + "inversion_other + mesh_construction + mesh_seed_argmin + pdip_solve + regularization_H": 0.007261795999999996, + "inversion_other + mesh_dual_areas + mesh_locate_walk": 0.006785176000000202, + "inversion_other + mesh_construction + pdip_solve + regularization_H": 0.006604364000000041, + "inversion_other + pdip_solve + ray_trace_data_grid": 0.005424466000000006, + "grids_and_structures + mass_profile_deflections + ray_trace_data_grid": 0.005373780000000001, + "inversion_other + regularization_H": 0.004859989999999979, + "inversion_other + mapped_reconstruction + pdip_solve + reconstruction_scatter": 0.0048386199999999905, + "inversion_other + mapped_reconstruction + pdip_solve": 0.003776149999999994, + "mapping_matrix + pdip_solve + regularization_H": 0.0034788620000000005, + "inversion_other + mesh_construction + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin": 0.0031791360000000056, + "inversion_other + mesh_construction + mesh_dual_areas + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin": 0.002958415999999999, + "inversion_other + mesh_construction + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin + regularization_H": 0.002713479999999986, + "inversion_other + mesh_dual_areas + mesh_locate_walk + pdip_solve": 0.0025845160000000037, + "inversion_other + mesh_locate_walk + mesh_seed_argmin": 0.002525331999999992, + "inversion_other + mesh_interpolation_weights": 0.002151244000000005, + "chi_squared_evidence + inversion_other": 0.001959109999999997 + }, + "example_kernels": { + "curvature_matrix_F + psf_convolution_mapping_matrix": [ + "loop_divide_gather_fusion" + ], + "pdip_solve + psf_convolution_mapping_matrix": [ + "loop_broadcast_fusion.4" + ], + "data_vector_D + pdip_solve": [ + "input_reduce_fusion.5", + "input_reduce_fusion.21" + ], + "mapped_reconstruction + pdip_solve": [ + "input_reduce_fusion.9" + ], + "mapping_matrix + pdip_solve": [ + "loop_broadcast_fusion.2", + "loop_divide_fusion" + ], + "curvature_reg_reduce_gather + inversion_other + mapped_reconstruction + pdip_solve + reconstruction_scatter": [ + "input_multiply_transpose_fusion" + ], + "pdip_solve + regularization_H": [ + "loop_select_fusion.2", + "input_transpose_fusion.3" + ], + "inversion_other + pdip_solve + regularization_H": [ + "input_transpose_fusion.4" + ], + "inversion_other + pdip_solve": [ + "input_reduce_fusion.7", + "loop_log_fusion", + "input_reduce_fusion.8", + "input_reduce_fusion.12" + ], + "inversion_other + mapping_matrix + mesh_construction + mesh_dual_areas + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin + pdip_solve": [ + "input_scatter_fusion.6", + "input_scatter_fusion.3" + ] + }, + "prorated_estimate_ms": { + "psf_convolution_mapping_matrix": 0.6223591109999999, + "curvature_matrix_F": 0.5087965409999998, + "pdip_solve": 0.39462946825714296, + "mapped_reconstruction": 0.08198017086666673, + "inversion_other": 0.06855563279047636, + "data_vector_D": 0.06272911000000003, + "mapping_matrix": 0.0624338013333332, + "regularization_H": 0.043047128390476246, + "reconstruction_scatter": 0.023195272200000006, + "curvature_reg_reduce_gather": 0.02198561720000001, + "mesh_construction": 0.01448933225714287, + "ray_trace_data_grid": 0.012702504333333295, + "mesh_locate_walk": 0.012685022390476258, + "mesh_interpolation_weights": 0.012461504057142863, + "mesh_seed_argmin": 0.011229527257142857, + "mesh_dual_areas": 0.008505365000000067, + "grids_and_structures": 0.007404260333333328, + "mass_profile_deflections": 0.007404260333333328, + "border_relocator": 0.006679055999999973, + "chi_squared_evidence": 0.004813810999999992 + }, + "prorated_note": "ESTIMATE ONLY \u2014 a mixed fusion's time split equally across the stages its constituents span. Never summed into the measured table, never reconciled." + }, + "other_sources_ms": { + "copy.80": 0.042013890000002906, + "copy.48": 0.01694752399999989, + "copy.53": 0.0020209240000000064, + "copy.39": 0.0016531839999999976, + "copy.78": 0.001652293999999998, + "copy.79": 0.0016482640000000034 + }, + "device_span_ms": 35.635434496, + "device_busy_ms": 28.889184276, + "device_idle_ms": 6.74625022, + "largest_idle_gaps": [ + { + "gap_ms": 5.648069, + "after": "pure_callback.4", + "before": "pure_callback.4" + }, + { + "gap_ms": 0.035071, + "after": "pure_callback.4", + "before": "copy.79" + }, + { + "gap_ms": 0.030176, + "after": "copy.48", + "before": "input_reduce_fusion.1" + }, + { + "gap_ms": 0.029056, + "after": "input_reduce_fusion", + "before": "loop_dynamic_update_slice_fusion" + }, + { + "gap_ms": 0.028351, + "after": "input_concatenate_fusion.7", + "before": "pure_callback.4" + }, + { + "gap_ms": 0.025535, + "after": "while.26", + "before": "input_reduce_select_fusion" + }, + { + "gap_ms": 0.023584, + "after": "input_scatter_fusion.7", + "before": "loop_reduce_fusion.1" + }, + { + "gap_ms": 0.021184, + "after": "while.26", + "before": "loop_select_fusion.5" + } + ], + "kernel_ms": 24.716643500000004, + "sum_ms": 31.462893720000004, + "wall_ms": 35.637704199994914, + "host_outside_span_ms": 0.00226970399491222, + "reconciliation_pct": -11.714588730425305, + "unjoined_ms": 0.0, + "unjoined_pct": 0.0, + "other_ms": 0.065856, + "other_pct": 0.18479304848152758, + "note": "Stage rows attribute the command-buffers-OFF program (see the module docstring): kernel times are the same, the launch overhead the CUDA graphs remove is not. sum_ms = kernel rows + device_idle_ms; the residual against wall_ms is host_outside_span_ms (dispatch before the first kernel, teardown after the last).", + "per_stage_ms_per_lane": { + "border_relocator": 0.10140749999999998, + "chi_squared_evidence": 0.002976, + "curvature_matrix_F": 4.2873885000000005, + "inversion_other": 1.8000515, + "mapping_matrix": 0.002912, + "memset": 0.023711499999999996, + "mesh_construction": 0.002048, + "mesh_locate_walk": 0.150146, + "mesh_qhull_callback": 0.010624, + "mesh_seed_argmin": 0.22784400000000016, + "mixed_fusion": 1.9871890000000003, + "other": 0.065856, + "pdip_solve": 8.940318000000001, + "psf_convolution_mapping_matrix": 7.1034515, + "regularization_H": 0.01072 + }, + "per_lane_divisor": 1, + "host_callback": { + "pure_callback_span_ms": 256.14753520000005, + "qhull_ms": 239.00725419999998, + "callback_body_ms_note": "the OUTERMOST matching body event, not a sum: under the probe the body appears twice (the wrapper and the timed re-implementation it calls) and summing them would count the same work twice", + "events_by_name": { + "pure_callback.4": { + "count": 500, + "ms": 256.14753520000005 + }, + "$callback.py:815 _wrapped_callback": { + "count": 500, + "ms": 251.73777559999988 + }, + "$callback.py:224 _callback": { + "count": 500, + "ms": 250.54260450000004 + }, + "$callback.py:74 pure_callback_impl": { + "count": 500, + "ms": 250.10687889999983 + }, + "$callback.py:69 __call__": { + "count": 500, + "ms": 239.77683659999997 + }, + "$delaunay.py:162 ": { + "count": 500, + "ms": 239.44376130000003 + }, + "$host_callback_probe.py:225 wrapped": { + "count": 500, + "ms": 239.00725419999998 + }, + "$host_callback_probe.py:160 _timed_tri_only": { + "count": 500, + "ms": 238.59765389999987 + }, + "ThenExecuteCallback:GetEventForComputeStreamSyncPoint": { + "count": 500, + "ms": 1.0067121000000008 + }, + "$callback.py:822 ": { + "count": 2000, + "ms": 0.7241742000000015 + }, + "$__init__.py:132 _xla_gc_callback": { + "count": 8, + "ms": 0.0031368999999999998 + } + }, + "note": "HOST milliseconds per traced BATCH (the whole invocation), aggregated by name because the events nest. Not a row of the device table: the device pays for them as the idle gaps largest_idle_gaps names." + }, + "host_callback_ms": 256.14753520000005 + }, + "hlo_census": { + "status": "excluded", + "reason": "The legacy census anchors PyAutoArray source line numbers that moved after the phase-1 run. No batched attribution is published from unsupported anchors; the device-event table and wall reconciliation remain valid." + }, + "stage_map_provenance": [ + { + "label": "log_det_curvature_reg", + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 850, + 882 + ], + "requires": { + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 884, + 896 + ] + }, + "function": null + }, + { + "label": "log_det_regularization", + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 850, + 882 + ], + "requires": { + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 897, + 943 + ] + }, + "function": null + }, + { + "label": "curvature_reg_add", + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 359, + 372 + ], + "requires": null, + "function": null + }, + { + "label": "curvature_reg_reduce_gather", + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 374, + 398 + ], + "requires": null, + "function": null + }, + { + "label": "edge_subset_gather", + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 606, + 614 + ], + "requires": null, + "function": null + }, + { + "label": "regularization_term", + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 786, + 849 + ], + "requires": null, + "function": null + }, + { + "label": "mapped_reconstruction", + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 722, + 785 + ], + "requires": null, + "function": null + }, + { + "label": "reconstruction_scatter", + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 583, + 605 + ], + "requires": null, + "function": null + }, + { + "label": "reconstruction_scatter", + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 615, + 721 + ], + "requires": null, + "function": null + }, + { + "label": "certified_active_set_solve", + "path": "likelihood_breakdown/active_set_steps.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "certified_active_set_solve", + "path": "likelihood_breakdown/library_solver_injection.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "pdip_solve", + "path": "PyAutoArray/autoarray/util/jax_nnls.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "pdip_solve", + "path": "PyAutoArray/autoarray/inversion/inversion/inversion_util.py", + "lines": [ + 256, + 488 + ], + "requires": null, + "function": null + }, + { + "label": "mapped_reconstruction", + "path": "PyAutoArray/autoarray/inversion/inversion/inversion_util.py", + "lines": [ + 156, + 200 + ], + "requires": null, + "function": null + }, + { + "label": "curvature_matrix_F", + "path": "PyAutoArray/autoarray/inversion/inversion/inversion_util.py", + "lines": [ + 12, + 155 + ], + "requires": null, + "function": null + }, + { + "label": "reconstruction_scatter", + "path": "PyAutoArray/autoarray/inversion/inversion/inversion_util.py", + "lines": [ + 201, + 255 + ], + "requires": null, + "function": null + }, + { + "label": "data_vector_D", + "path": "PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py", + "lines": [ + 54, + 73 + ], + "requires": null, + "function": null + }, + { + "label": "curvature_matrix_F", + "path": "PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py", + "lines": [ + 74, + 110 + ], + "requires": null, + "function": null + }, + { + "label": "data_vector_D", + "path": "PyAutoArray/autoarray/inversion/inversion/imaging/inversion_imaging_util.py", + "lines": null, + "requires": null, + "function": "data_vector_via_blurred_mapping_matrix_from" + }, + { + "label": "curvature_matrix_F", + "path": "PyAutoArray/autoarray/inversion/inversion/imaging/inversion_imaging_util.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "psf_convolution_mapping_matrix", + "path": "likelihood_breakdown/psf_cube_injection.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "psf_convolution_mapping_matrix", + "path": "PyAutoArray/autoarray/operators/convolver.py", + "lines": [ + 1086, + 1300 + ], + "requires": null, + "function": null + }, + { + "label": "psf_convolution_mapping_matrix", + "path": "PyAutoArray/autoarray/operators/convolver.py", + "lines": [ + 632, + 642 + ], + "requires": null, + "function": null + }, + { + "label": "psf_convolution_mapping_matrix", + "path": "PyAutoArray/autoarray/operators/convolver.py", + "lines": [ + 670, + 691 + ], + "requires": null, + "function": null + }, + { + "label": "psf_convolution_mapping_matrix", + "path": "PyAutoArray/autoarray/operators/convolver.py", + "lines": null, + "requires": { + "path": "PyAutoArray/autoarray/operators/convolver.py", + "lines": [ + 1086, + 1300 + ] + }, + "function": null + }, + { + "label": "psf_convolution_mapping_matrix", + "path": "PyAutoArray/autoarray/operators/convolver.py", + "lines": null, + "requires": { + "path": "PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py", + "lines": [ + 119, + 150 + ] + }, + "function": null + }, + { + "label": "psf_convolution_image", + "path": "PyAutoArray/autoarray/operators/convolver.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "psf_convolution_mapping_matrix", + "path": "PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py", + "lines": [ + 119, + 150 + ], + "requires": null, + "function": null + }, + { + "label": "mesh_qhull_callback", + "path": "PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py", + "lines": [ + 139, + 172 + ], + "requires": null, + "function": null + }, + { + "label": "mesh_seed_argmin", + "path": "PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py", + "lines": [ + 173, + 207 + ], + "requires": null, + "function": null + }, + { + "label": "mesh_locate_walk", + "path": "PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py", + "lines": [ + 208, + 372 + ], + "requires": null, + "function": null + }, + { + "label": "mesh_dual_areas", + "path": "PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py", + "lines": [ + 373, + 396 + ], + "requires": null, + "function": null + }, + { + "label": "mesh_dual_areas", + "path": "PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py", + "lines": [ + 437, + 494 + ], + "requires": null, + "function": null + }, + { + "label": "mesh_dual_areas", + "path": "PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py", + "lines": [ + 605, + 615 + ], + "requires": null, + "function": null + }, + { + "label": "mesh_interpolation_weights", + "path": "PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py", + "lines": [ + 616, + 695 + ], + "requires": null, + "function": null + }, + { + "label": "mesh_interpolation_weights", + "path": "PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py", + "lines": [ + 896, + 1000 + ], + "requires": null, + "function": null + }, + { + "label": "mesh_construction", + "path": "PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "border_relocator", + "path": "PyAutoArray/autoarray/inversion/mesh/border_relocator.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "mesh_construction", + "path": "PyAutoArray/autoarray/inversion/mesh/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "mapping_matrix", + "path": "PyAutoArray/autoarray/inversion/mappers/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "mapping_matrix", + "path": "PyAutoArray/autoarray/inversion/mappings/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "mapping_matrix", + "path": "PyAutoArray/autoarray/inversion/linear_obj/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "regularization_H", + "path": "PyAutoArray/autoarray/inversion/regularization/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "chi_squared_evidence", + "path": "PyAutoArray/autoarray/fit/fit_util.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "chi_squared_evidence", + "path": "PyAutoArray/autoarray/fit/fit_dataset.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "ray_trace_mesh_grid", + "path": "PyAutoLens/autolens/lens/to_inversion.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "ray_trace_mesh_grid", + "path": "PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "mass_profile_deflections", + "path": "PyAutoGalaxy/autogalaxy/profiles/mass/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "light_profile_image", + "path": "PyAutoGalaxy/autogalaxy/profiles/light/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "light_profile_image", + "path": "PyAutoGalaxy/autogalaxy/operate/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "ray_trace_data_grid", + "path": "PyAutoLens/autolens/lens/tracer.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "ray_trace_data_grid", + "path": "PyAutoLens/autolens/lens/tracer_util.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "grids_and_structures", + "path": "PyAutoArray/autoarray/structures/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "grids_and_structures", + "path": "PyAutoArray/autoarray/operators/over_sampling/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "grids_and_structures", + "path": "PyAutoArray/autoarray/geometry/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "inversion_other", + "path": "PyAutoArray/autoarray/inversion/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "fit_imaging_other", + "path": "PyAutoLens/autolens/imaging/fit_imaging.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "fit_imaging_other", + "path": "PyAutoGalaxy/autogalaxy/imaging/fit_imaging.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "fit_imaging_other", + "path": "PyAutoArray/autoarray/fit/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "analysis_other", + "path": "PyAutoLens/autolens/analysis/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "analysis_other", + "path": "PyAutoGalaxy/autogalaxy/analysis/", + "lines": null, + "requires": null, + "function": null + } + ], + "trace_timing": { + "traced_wall_ms": 35.637704199994914, + "untraced_wall_ms": 34.5870705020061, + "profiler_overhead_ms": 1.0506336979888147, + "profiler_overhead_pct": 3.0376487014934566 + }, + "jit_phases": { + "b_s3_pdip_library_likelihood_jit": { + "lower_s": 1.5342186550005863, + "compile_s": 4.5970975999989605, + "first_call_s": 0.13083492100122385, + "steady_per_call_s": 0.05139113889999862 + }, + "d_s3_certified_fallback_library_likelihood_jit": { + "lower_s": 0.4880992869984766, + "compile_s": 4.403072946002794, + "first_call_s": 0.05079533900061506, + "steady_per_call_s": 0.03184854139981326 + } + }, + "peak_bytes": { + "after_setup": 85108992, + "after_routes": 1181653248, + "after_all": 58804883456, + "note": "jax.devices()[0].memory_stats()['peak_bytes_in_use']; None on a backend that does not report it (CPU). Process-wide high-water marks." + }, + "note": "Every stage row is a MEASURED sum of GPU kernel durations joined to library source through the optimized HLO of ONE program \u2014 not arithmetic across compilations. The rows attribute the command-buffers-OFF program: kernel time is the same as production, the launch overhead the CUDA graphs remove is not, and command_buffers.* carries both walls and their delta. sum_ms = kernel rows + measured device_idle_ms; the residual against the wall is host_outside_span_ms and is reported, not absorbed. mixed_fusion.prorated_estimate_ms is an ESTIMATE and is never part of the table. No row may be quoted if reconciliation_pct is outside 5 % or unjoined_ms is non-zero.", + "vmap": { + "batch": 50, + "lanes_mode": "captured", + "arms": [ + "vmap", + "scalar" + ], + "draw_seed": 0, + "fallback": false, + "composition": "jax.jit(jax.vmap(fn))", + "composition_provenance": "Current Fitness._vmap after PyAutoFit#1638. Array 343376 used the retired jax.vmap(jax.jit(fn)) composition and is historical evidence only.", + "headline_arm": "scalar", + "lane_rtol": 1e-09, + "lanes": [ + { + "lane": 0, + "draw_name": "call00015_lane00", + "draw_kind": "captured", + "offsets": { + "centre_0": -0.0033655095107821688, + "centre_1": 0.004631951955766499, + "ell_comps_0": 0.000564301988937442, + "ell_comps_1": -0.00879076787683888, + "einstein_radius": 0.018337010967920175 + }, + "log_likelihood_vmap": 18701.11125441907, + "log_likelihood_scalar": 24758.50619430935, + "log_likelihood_library_pdip": 18700.594048999854, + "log_likelihood_library_pdip_scalar": 24758.50619430913, + "rel_diff_vmap_vs_library_pdip": 2.7657165214116645e-05, + "rel_diff_scalar_vs_library_pdip_scalar": 8.816312531637117e-15, + "abs_diff_nats": 6057.3949398902805, + "rel_diff": 0.24465914430986754, + "rel_diff_scalar_vs_library_pdip": 0.3239422303610449, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 6057.912145309278, + "rel_diff_library_pdip_vmap_vs_scalar": 0.24468003431894125, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "FAIL", + "certified": false, + "passes": 16, + "pdip_iter": null + }, + { + "lane": 1, + "draw_name": "call00015_lane01", + "draw_kind": "captured", + "offsets": { + "centre_0": -0.004311760382151672, + "centre_1": 0.0027192789928108052, + "ell_comps_0": 0.0061667694809026535, + "ell_comps_1": 0.003465536775180321, + "einstein_radius": -0.05732579988501185 + }, + "log_likelihood_vmap": 14176.345969423928, + "log_likelihood_scalar": 20552.70645941567, + "log_likelihood_library_pdip": 14200.214307642884, + "log_likelihood_library_pdip_scalar": 20551.004887773583, + "rel_diff_vmap_vs_library_pdip": 0.0016808435212213046, + "rel_diff_scalar_vs_library_pdip_scalar": 8.279749099270609e-05, + "abs_diff_nats": 6376.360489991741, + "rel_diff": 0.3102443224488609, + "rel_diff_scalar_vs_library_pdip": 0.447351850764233, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 6350.790580130699, + "rel_diff_library_pdip_vmap_vs_scalar": 0.3090257928900098, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "FAIL", + "certified": false, + "passes": 16, + "pdip_iter": null + }, + { + "lane": 2, + "draw_name": "call00015_lane02", + "draw_kind": "captured", + "offsets": { + "centre_0": 0.0002796502552123051, + "centre_1": 0.0016003321376979894, + "ell_comps_0": -0.002094430657472772, + "ell_comps_1": 0.006146479068253558, + "einstein_radius": -0.025968910196758177 + }, + "log_likelihood_vmap": -23119.33474596295, + "log_likelihood_scalar": -189709.06377243972, + "log_likelihood_library_pdip": -23119.20810591006, + "log_likelihood_library_pdip_scalar": -189709.05679042212, + "rel_diff_vmap_vs_library_pdip": 5.477698557451379e-06, + "rel_diff_scalar_vs_library_pdip_scalar": 3.6803818002348496e-08, + "abs_diff_nats": 166589.72902647677, + "rel_diff": 0.8781326822966397, + "rel_diff_scalar_vs_library_pdip": 7.2056903897129425, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 166589.84868451208, + "rel_diff_library_pdip_vmap_vs_scalar": 0.8781333453602556, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "FAIL", + "certified": true, + "passes": 1, + "pdip_iter": null + }, + { + "lane": 3, + "draw_name": "call00015_lane03", + "draw_kind": "captured", + "offsets": { + "centre_0": 0.004594602299816973, + "centre_1": 0.004924922434755804, + "ell_comps_0": 0.028601845732661953, + "ell_comps_1": 0.003760187047606014, + "einstein_radius": -0.03088526730480501 + }, + "log_likelihood_vmap": 18502.008921180433, + "log_likelihood_scalar": -141741.9647687315, + "log_likelihood_library_pdip": 18502.009704396118, + "log_likelihood_library_pdip_scalar": -141741.96566347557, + "rel_diff_vmap_vs_library_pdip": 4.2331384366558094e-08, + "rel_diff_scalar_vs_library_pdip_scalar": 6.312485236126246e-09, + "abs_diff_nats": 160243.97368991195, + "rel_diff": 1.1305330355154073, + "rel_diff_scalar_vs_library_pdip": 8.660895601792562, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 160243.9753678717, + "rel_diff_library_pdip_vmap_vs_scalar": 1.1305330402170637, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "FAIL", + "certified": true, + "passes": 3, + "pdip_iter": null + }, + { + "lane": 4, + "draw_name": "call00015_lane04", + "draw_kind": "captured", + "offsets": { + "centre_0": -0.0060950290987001, + "centre_1": -0.0006121094560707545, + "ell_comps_0": 0.009637314264800585, + "ell_comps_1": 0.006641580028105454, + "einstein_radius": -0.03125810931551931 + }, + "log_likelihood_vmap": 18750.51662542791, + "log_likelihood_scalar": 24880.545932988738, + "log_likelihood_library_pdip": 18751.910288039162, + "log_likelihood_library_pdip_scalar": 24880.545932988738, + "rel_diff_vmap_vs_library_pdip": 7.432110061558511e-05, + "rel_diff_scalar_vs_library_pdip_scalar": 0.0, + "abs_diff_nats": 6130.029307560828, + "rel_diff": 0.24637840841880865, + "rel_diff_scalar_vs_library_pdip": 0.32682726990533356, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 6128.635644949576, + "rel_diff_library_pdip_vmap_vs_scalar": 0.24632239426964145, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "FAIL", + "certified": false, + "passes": 16, + "pdip_iter": null + }, + { + "lane": 5, + "draw_name": "call00015_lane05", + "draw_kind": "captured", + "offsets": { + "centre_0": -0.008435952123169364, + "centre_1": -0.007849511137408794, + "ell_comps_0": -0.01598149485178925, + "ell_comps_1": 0.01654417876136871, + "einstein_radius": 0.014294380855379263 + }, + "log_likelihood_vmap": 24935.952740675293, + "log_likelihood_scalar": 25472.51918676291, + "log_likelihood_library_pdip": 24935.95274067247, + "log_likelihood_library_pdip_scalar": 25472.519186781192, + "rel_diff_vmap_vs_library_pdip": 1.1321290121385741e-13, + "rel_diff_scalar_vs_library_pdip_scalar": 7.17669240784107e-13, + "abs_diff_nats": 536.5664460876178, + "rel_diff": 0.021064522207385392, + "rel_diff_scalar_vs_library_pdip": 0.021517784047419188, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 536.5664461087217, + "rel_diff_library_pdip_vmap_vs_scalar": 0.021064522208198773, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": true, + "passes": 10, + "pdip_iter": null + }, + { + "lane": 6, + "draw_name": "call00015_lane06", + "draw_kind": "captured", + "offsets": { + "centre_0": 0.0031698313356290646, + "centre_1": -0.0038584140676992847, + "ell_comps_0": 0.01810147576636289, + "ell_comps_1": -0.011577480306416508, + "einstein_radius": 0.016136835525067283 + }, + "log_likelihood_vmap": 28315.20146518829, + "log_likelihood_scalar": -83383.91543837059, + "log_likelihood_library_pdip": 28315.201428712455, + "log_likelihood_library_pdip_scalar": -83383.91540684736, + "rel_diff_vmap_vs_library_pdip": 1.2882067761812063e-09, + "rel_diff_scalar_vs_library_pdip_scalar": 3.7804931237389863e-10, + "abs_diff_nats": 111699.11690355888, + "rel_diff": 1.3395762997735, + "rel_diff_scalar_vs_library_pdip": 3.9448462744756183, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 111699.1168355598, + "rel_diff_library_pdip_vmap_vs_scalar": 1.3395762994644318, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "FAIL", + "certified": true, + "passes": 3, + "pdip_iter": null + }, + { + "lane": 7, + "draw_name": "call00015_lane07", + "draw_kind": "captured", + "offsets": { + "centre_0": 0.006158729760195174, + "centre_1": 0.004883559265258847, + "ell_comps_0": 0.007613883677130215, + "ell_comps_1": -0.005800175617006949, + "einstein_radius": 0.0662922007765554 + }, + "log_likelihood_vmap": 23338.890014375043, + "log_likelihood_scalar": -11960.284429754305, + "log_likelihood_library_pdip": 23338.89001354625, + "log_likelihood_library_pdip_scalar": -11960.28442978162, + "rel_diff_vmap_vs_library_pdip": 3.5511261135990974e-11, + "rel_diff_scalar_vs_library_pdip_scalar": 2.2837203449469557e-12, + "abs_diff_nats": 35299.17444412935, + "rel_diff": 2.951365801662167, + "rel_diff_scalar_vs_library_pdip": 1.5124615790559177, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 35299.174443327865, + "rel_diff_library_pdip_vmap_vs_scalar": 2.9513658015884148, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": true, + "passes": 9, + "pdip_iter": null + }, + { + "lane": 8, + "draw_name": "call00015_lane08", + "draw_kind": "captured", + "offsets": { + "centre_0": 0.0030335293924908615, + "centre_1": 0.0012117081273721316, + "ell_comps_0": 0.0008852687687036301, + "ell_comps_1": -0.0027113633212058814, + "einstein_radius": -0.03873713959923952 + }, + "log_likelihood_vmap": 24869.037000613742, + "log_likelihood_scalar": 23223.550391500263, + "log_likelihood_library_pdip": 24869.03700060154, + "log_likelihood_library_pdip_scalar": 23223.55039150045, + "rel_diff_vmap_vs_library_pdip": 4.906414719110541e-13, + "rel_diff_scalar_vs_library_pdip_scalar": 7.989171166075526e-15, + "abs_diff_nats": 1645.486609113479, + "rel_diff": 0.07085422260481418, + "rel_diff_scalar_vs_library_pdip": 0.06616607667846068, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 1645.4866091010917, + "rel_diff_library_pdip_vmap_vs_scalar": 0.07085422260428022, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": true, + "passes": 10, + "pdip_iter": null + }, + { + "lane": 9, + "draw_name": "call00015_lane09", + "draw_kind": "captured", + "offsets": { + "centre_0": -0.0008035510098975272, + "centre_1": 0.005559773241319952, + "ell_comps_0": -0.003701655436278317, + "ell_comps_1": -0.012378591445614512, + "einstein_radius": 0.032284336889985665 + }, + "log_likelihood_vmap": -31750.335545040216, + "log_likelihood_scalar": -177117.75609302538, + "log_likelihood_library_pdip": NaN, + "log_likelihood_library_pdip_scalar": -177117.7774717681, + "rel_diff_vmap_vs_library_pdip": NaN, + "rel_diff_scalar_vs_library_pdip_scalar": 1.2070353981814522e-07, + "abs_diff_nats": 145367.42054798518, + "rel_diff": 0.8207388336132467, + "rel_diff_scalar_vs_library_pdip": NaN, + "abs_diff_library_pdip_vmap_vs_scalar_nats": NaN, + "rel_diff_library_pdip_vmap_vs_scalar": NaN, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "FAIL", + "certified": true, + "passes": 2, + "pdip_iter": null + }, + { + "lane": 10, + "draw_name": "call00015_lane10", + "draw_kind": "captured", + "offsets": { + "centre_0": -0.008473569241265282, + "centre_1": -0.0051993251621340235, + "ell_comps_0": -0.0031466996514049606, + "ell_comps_1": -0.0076036423480284636, + "einstein_radius": 0.08283321334626792 + }, + "log_likelihood_vmap": 6560.779794306516, + "log_likelihood_scalar": -101745.38349985592, + "log_likelihood_library_pdip": 6560.7795961357915, + "log_likelihood_library_pdip_scalar": -101745.38349137451, + "rel_diff_vmap_vs_library_pdip": 3.020536229149355e-08, + "rel_diff_scalar_vs_library_pdip_scalar": 8.335915475309887e-11, + "abs_diff_nats": 108306.16329416243, + "rel_diff": 1.0644823339263918, + "rel_diff_scalar_vs_library_pdip": 16.508123997913685, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 108306.1630875103, + "rel_diff_library_pdip_vmap_vs_scalar": 1.0644823319840548, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "FAIL", + "certified": true, + "passes": 5, + "pdip_iter": null + }, + { + "lane": 11, + "draw_name": "call00015_lane11", + "draw_kind": "captured", + "offsets": { + "centre_0": 0.001017060353322001, + "centre_1": 0.003035861051809724, + "ell_comps_0": 0.0014054844842678396, + "ell_comps_1": -0.00019678252877009805, + "einstein_radius": -0.04179610309843307 + }, + "log_likelihood_vmap": 12668.001326846505, + "log_likelihood_scalar": 18959.672780975976, + "log_likelihood_library_pdip": 12667.924915789376, + "log_likelihood_library_pdip_scalar": 18957.528349757773, + "rel_diff_vmap_vs_library_pdip": 6.031852701760834e-06, + "rel_diff_scalar_vs_library_pdip_scalar": 0.00011311765851745929, + "abs_diff_nats": 6291.671454129471, + "rel_diff": 0.3318449388241815, + "rel_diff_scalar_vs_library_pdip": 0.49666760002220484, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 6289.603433968397, + "rel_diff_library_pdip_vmap_vs_scalar": 0.3317733893326216, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "FAIL", + "certified": false, + "passes": 16, + "pdip_iter": null + }, + { + "lane": 12, + "draw_name": "call00015_lane12", + "draw_kind": "captured", + "offsets": { + "centre_0": -0.0012508260776529923, + "centre_1": -0.0075763258203543175, + "ell_comps_0": -0.0003476568325791879, + "ell_comps_1": 0.0070528223693464365, + "einstein_radius": -0.005182936058341969 + }, + "log_likelihood_vmap": 18842.345663340646, + "log_likelihood_scalar": 24810.049660195124, + "log_likelihood_library_pdip": 18842.279796731058, + "log_likelihood_library_pdip_scalar": 24810.049660194898, + "rel_diff_vmap_vs_library_pdip": 3.4956815363317152e-06, + "rel_diff_scalar_vs_library_pdip_scalar": 9.091262981289588e-15, + "abs_diff_nats": 5967.703996854478, + "rel_diff": 0.24053575380096776, + "rel_diff_scalar_vs_library_pdip": 0.31672228243311684, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 5967.76986346384, + "rel_diff_library_pdip_vmap_vs_scalar": 0.24053840863682333, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "FAIL", + "certified": false, + "passes": 16, + "pdip_iter": null + }, + { + "lane": 13, + "draw_name": "call00015_lane13", + "draw_kind": "captured", + "offsets": { + "centre_0": 0.0039046265841316857, + "centre_1": 0.008586063066835778, + "ell_comps_0": 0.01612319103606081, + "ell_comps_1": -0.006478405394829051, + "einstein_radius": -0.06420305523683667 + }, + "log_likelihood_vmap": 22879.755989048543, + "log_likelihood_scalar": -3605.706215917453, + "log_likelihood_library_pdip": 22879.7559893116, + "log_likelihood_library_pdip_scalar": -3605.706215970531, + "rel_diff_vmap_vs_library_pdip": 1.1497439469410595e-11, + "rel_diff_scalar_vs_library_pdip_scalar": 1.472058665244897e-11, + "abs_diff_nats": 26485.462204965996, + "rel_diff": 7.3454298877832755, + "rel_diff_scalar_vs_library_pdip": 1.157593735597612, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 26485.462205282132, + "rel_diff_library_pdip_vmap_vs_scalar": 7.3454298877628235, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": true, + "passes": 9, + "pdip_iter": null + }, + { + "lane": 14, + "draw_name": "call00015_lane14", + "draw_kind": "captured", + "offsets": { + "centre_0": 0.007195835212073937, + "centre_1": -0.0022675171274400335, + "ell_comps_0": 0.004220685262914858, + "ell_comps_1": 0.006581974817750368, + "einstein_radius": 0.08589577997501685 + }, + "log_likelihood_vmap": 4357.021950291826, + "log_likelihood_scalar": 11129.43856306804, + "log_likelihood_library_pdip": 4357.021950280177, + "log_likelihood_library_pdip_scalar": 11126.921475785763, + "rel_diff_vmap_vs_library_pdip": 2.673571139470296e-12, + "rel_diff_scalar_vs_library_pdip_scalar": 0.00022621596528346792, + "abs_diff_nats": 6772.416612776215, + "rel_diff": 0.6085137695310004, + "rel_diff_scalar_vs_library_pdip": 1.5543682565914925, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 6769.899525505585, + "rel_diff_library_pdip_vmap_vs_scalar": 0.6084252090965266, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "FAIL", + "certified": true, + "passes": 15, + "pdip_iter": null + }, + { + "lane": 15, + "draw_name": "call00015_lane15", + "draw_kind": "captured", + "offsets": { + "centre_0": 0.0024446743118905125, + "centre_1": 0.0028324231769206983, + "ell_comps_0": -0.017159158004659933, + "ell_comps_1": 0.008265799441903459, + "einstein_radius": -0.03860302877433641 + }, + "log_likelihood_vmap": 14146.844560201887, + "log_likelihood_scalar": 20407.780654983708, + "log_likelihood_library_pdip": 14146.464613817334, + "log_likelihood_library_pdip_scalar": 20410.343973720697, + "rel_diff_vmap_vs_library_pdip": 2.6858045096466776e-05, + "rel_diff_scalar_vs_library_pdip_scalar": 0.00012558919831482778, + "abs_diff_nats": 6260.93609478182, + "rel_diff": 0.30679162034470714, + "rel_diff_scalar_vs_library_pdip": 0.4426064187833003, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 6263.879359903363, + "rel_diff_library_pdip_vmap_vs_scalar": 0.3068972952130748, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "FAIL", + "certified": false, + "passes": 16, + "pdip_iter": null + }, + { + "lane": 16, + "draw_name": "call00015_lane16", + "draw_kind": "captured", + "offsets": { + "centre_0": 0.00546338030193603, + "centre_1": 0.0029217319844296002, + "ell_comps_0": 0.018887239108742314, + "ell_comps_1": 0.01610145140759906, + "einstein_radius": 0.09308737119031596 + }, + "log_likelihood_vmap": 2903.0452367721446, + "log_likelihood_scalar": 9734.862241683215, + "log_likelihood_library_pdip": 2903.043598923672, + "log_likelihood_library_pdip_scalar": 9734.862241678551, + "rel_diff_vmap_vs_library_pdip": 5.641832155268914e-07, + "rel_diff_scalar_vs_library_pdip_scalar": 4.790914051894582e-13, + "abs_diff_nats": 6831.81700491107, + "rel_diff": 0.7017887706369648, + "rel_diff_scalar_vs_library_pdip": 2.353329672793236, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 6831.818642754879, + "rel_diff_library_pdip_vmap_vs_scalar": 0.7017889388824973, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "FAIL", + "certified": false, + "passes": 16, + "pdip_iter": null + }, + { + "lane": 17, + "draw_name": "call00015_lane17", + "draw_kind": "captured", + "offsets": { + "centre_0": -0.0033403521024317102, + "centre_1": -0.004078467297591464, + "ell_comps_0": -0.01076606265657356, + "ell_comps_1": 0.014404445881011321, + "einstein_radius": -0.016103243806114165 + }, + "log_likelihood_vmap": 13362.515995368962, + "log_likelihood_scalar": 19481.580996516812, + "log_likelihood_library_pdip": 13360.530937095456, + "log_likelihood_library_pdip_scalar": 19481.557217641563, + "rel_diff_vmap_vs_library_pdip": 0.00014857630155952622, + "rel_diff_scalar_vs_library_pdip_scalar": 1.2205839083402613e-06, + "abs_diff_nats": 6119.06500114785, + "rel_diff": 0.31409488799917734, + "rel_diff_scalar_vs_library_pdip": 0.4581442225792305, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 6121.026280546106, + "rel_diff_library_pdip_vmap_vs_scalar": 0.3141959450245178, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "FAIL", + "certified": false, + "passes": 16, + "pdip_iter": null + }, + { + "lane": 18, + "draw_name": "call00015_lane18", + "draw_kind": "captured", + "offsets": { + "centre_0": -0.0036504937209151113, + "centre_1": -0.0003963555596475738, + "ell_comps_0": -0.008227000946306733, + "ell_comps_1": -0.02487475830854786, + "einstein_radius": -0.0327871904693704 + }, + "log_likelihood_vmap": 12584.040728899512, + "log_likelihood_scalar": 18817.121698566574, + "log_likelihood_library_pdip": 12594.119293045376, + "log_likelihood_library_pdip_scalar": 18812.946857997056, + "rel_diff_vmap_vs_library_pdip": 0.0008002595426763763, + "rel_diff_scalar_vs_library_pdip_scalar": 0.00022191316443034178, + "abs_diff_nats": 6233.080969667062, + "rel_diff": 0.33124518560890626, + "rel_diff_scalar_vs_library_pdip": 0.49411969671889755, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 6218.82756495168, + "rel_diff_library_pdip_vmap_vs_scalar": 0.3305610552080077, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "FAIL", + "certified": false, + "passes": 16, + "pdip_iter": null + }, + { + "lane": 19, + "draw_name": "call00015_lane19", + "draw_kind": "captured", + "offsets": { + "centre_0": 0.00840275144875603, + "centre_1": -0.003628185056462521, + "ell_comps_0": 0.005265994929748281, + "ell_comps_1": 0.009958068668923414, + "einstein_radius": -0.06501253116347949 + }, + "log_likelihood_vmap": 10418.210094661103, + "log_likelihood_scalar": 16927.857229254627, + "log_likelihood_library_pdip": 10415.233658083074, + "log_likelihood_library_pdip_scalar": 16927.632549568763, + "rel_diff_vmap_vs_library_pdip": 0.0002857772255275724, + "rel_diff_scalar_vs_library_pdip_scalar": 1.3272953864375116e-05, + "abs_diff_nats": 6509.647134593524, + "rel_diff": 0.38455234152988893, + "rel_diff_scalar_vs_library_pdip": 0.6252978843270812, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 6512.398891485689, + "rel_diff_library_pdip_vmap_vs_scalar": 0.38472000573119686, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "FAIL", + "certified": false, + "passes": 16, + "pdip_iter": null + }, + { + "lane": 20, + "draw_name": "call00016_lane00", + "draw_kind": "captured", + "offsets": { + "centre_0": -0.00884193513479277, + "centre_1": -0.0043653741820675615, + "ell_comps_0": 0.013534779280882363, + "ell_comps_1": -0.002720977381459688, + "einstein_radius": 0.03143265344345525 + }, + "log_likelihood_vmap": 23125.781207506672, + "log_likelihood_scalar": 27642.806005942835, + "log_likelihood_library_pdip": 23125.781207506327, + "log_likelihood_library_pdip_scalar": 27642.806005943203, + "rel_diff_vmap_vs_library_pdip": 1.494470537330574e-14, + "rel_diff_scalar_vs_library_pdip_scalar": 1.3292277905407444e-14, + "abs_diff_nats": 4517.024798436163, + "rel_diff": 0.16340688414428922, + "rel_diff_scalar_vs_library_pdip": 0.19532420366280823, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 4517.024798436876, + "rel_diff_library_pdip_vmap_vs_scalar": 0.16340688414431284, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": true, + "passes": 13, + "pdip_iter": null + }, + { + "lane": 21, + "draw_name": "call00016_lane01", + "draw_kind": "captured", + "offsets": { + "centre_0": 0.004620853605949627, + "centre_1": -0.006101969080571725, + "ell_comps_0": 0.006298490627944492, + "ell_comps_1": -0.0011939165979551265, + "einstein_radius": -0.008698400624736369 + }, + "log_likelihood_vmap": 25204.95975370948, + "log_likelihood_scalar": 27788.396151130026, + "log_likelihood_library_pdip": 25204.959753728468, + "log_likelihood_library_pdip_scalar": 27788.39615117224, + "rel_diff_vmap_vs_library_pdip": 7.532887011018947e-13, + "rel_diff_scalar_vs_library_pdip_scalar": 1.5191631013116751e-12, + "abs_diff_nats": 2583.4363974205444, + "rel_diff": 0.09296817215971236, + "rel_diff_scalar_vs_library_pdip": 0.10249714431777264, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 2583.436397443773, + "rel_diff_library_pdip_vmap_vs_scalar": 0.09296817216040702, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": true, + "passes": 6, + "pdip_iter": null + }, + { + "lane": 22, + "draw_name": "call00016_lane02", + "draw_kind": "captured", + "offsets": { + "centre_0": 0.0023954075319476313, + "centre_1": 0.005058697427718103, + "ell_comps_0": -0.012832403546307256, + "ell_comps_1": 0.008158705801962226, + "einstein_radius": -0.04064267210128203 + }, + "log_likelihood_vmap": 11552.670998697395, + "log_likelihood_scalar": 17853.26476931595, + "log_likelihood_library_pdip": 11553.07472359277, + "log_likelihood_library_pdip_scalar": 17852.91967933103, + "rel_diff_vmap_vs_library_pdip": 3.494523363127176e-05, + "rel_diff_scalar_vs_library_pdip_scalar": 1.932961056890832e-05, + "abs_diff_nats": 6300.593770618554, + "rel_diff": 0.35290989362613717, + "rel_diff_scalar_vs_library_pdip": 0.5453258285309478, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 6299.844955738259, + "rel_diff_library_pdip_vmap_vs_scalar": 0.3528747716840858, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "FAIL", + "certified": false, + "passes": 16, + "pdip_iter": null + }, + { + "lane": 23, + "draw_name": "call00016_lane03", + "draw_kind": "captured", + "offsets": { + "centre_0": -0.0034553415111254126, + "centre_1": -0.0012095214967760579, + "ell_comps_0": -0.013572031583894487, + "ell_comps_1": 0.012809349042796288, + "einstein_radius": 0.016462197503162912 + }, + "log_likelihood_vmap": 21983.89953487797, + "log_likelihood_scalar": 27386.085836286475, + "log_likelihood_library_pdip": 21983.89953487757, + "log_likelihood_library_pdip_scalar": 27386.085836286475, + "rel_diff_vmap_vs_library_pdip": 1.8203215864646964e-14, + "rel_diff_scalar_vs_library_pdip_scalar": 0.0, + "abs_diff_nats": 5402.186301408503, + "rel_diff": 0.19726025594539778, + "rel_diff_scalar_vs_library_pdip": 0.24573376042036155, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 5402.186301408903, + "rel_diff_library_pdip_vmap_vs_scalar": 0.19726025594541238, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": true, + "passes": 13, + "pdip_iter": null + }, + { + "lane": 24, + "draw_name": "call00016_lane04", + "draw_kind": "captured", + "offsets": { + "centre_0": 0.002118045409654518, + "centre_1": -0.002760233148797609, + "ell_comps_0": 0.017300773468951293, + "ell_comps_1": 0.0015174503365170395, + "einstein_radius": -0.009907496303277252 + }, + "log_likelihood_vmap": 23449.28672850168, + "log_likelihood_scalar": 28384.90598332627, + "log_likelihood_library_pdip": 23449.28672850127, + "log_likelihood_library_pdip_scalar": 28384.90598332596, + "rel_diff_vmap_vs_library_pdip": 1.7531092095083012e-14, + "rel_diff_scalar_vs_library_pdip_scalar": 1.0894106846238786e-14, + "abs_diff_nats": 4935.619254824589, + "rel_diff": 0.1738818249996617, + "rel_diff_scalar_vs_library_pdip": 0.21048057077258717, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 4935.619254824691, + "rel_diff_library_pdip_vmap_vs_scalar": 0.1738818249996672, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": true, + "passes": 13, + "pdip_iter": null + }, + { + "lane": 25, + "draw_name": "call00016_lane05", + "draw_kind": "captured", + "offsets": { + "centre_0": -0.004055224824141611, + "centre_1": 0.008121383491444374, + "ell_comps_0": -0.002675674189352585, + "ell_comps_1": 0.022116535787456582, + "einstein_radius": 0.03951210569146424 + }, + "log_likelihood_vmap": -136892.35618963442, + "log_likelihood_scalar": -189785.05556361115, + "log_likelihood_library_pdip": -136892.6262471882, + "log_likelihood_library_pdip_scalar": -189785.02878222853, + "rel_diff_vmap_vs_library_pdip": 1.9727691781369726e-06, + "rel_diff_scalar_vs_library_pdip_scalar": 1.4111430597614006e-07, + "abs_diff_nats": 52892.699373976735, + "rel_diff": 0.27869791547548084, + "rel_diff_scalar_vs_library_pdip": 0.3863789509079521, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 52892.40253504034, + "rel_diff_library_pdip_vmap_vs_scalar": 0.27869639072390934, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "FAIL", + "certified": true, + "passes": 0, + "pdip_iter": null + }, + { + "lane": 26, + "draw_name": "call00016_lane06", + "draw_kind": "captured", + "offsets": { + "centre_0": -0.008657008236802587, + "centre_1": 0.00296353203184632, + "ell_comps_0": 0.001140204699970393, + "ell_comps_1": 0.0024587369167136715, + "einstein_radius": -0.02214717629190477 + }, + "log_likelihood_vmap": 20216.49720683314, + "log_likelihood_scalar": -186990.0765165683, + "log_likelihood_library_pdip": 20216.48421884619, + "log_likelihood_library_pdip_scalar": -186990.08102622873, + "rel_diff_vmap_vs_library_pdip": 6.424453831120838e-07, + "rel_diff_scalar_vs_library_pdip_scalar": 2.4117110333348803e-08, + "abs_diff_nats": 207206.57372340147, + "rel_diff": 1.108115348062558, + "rel_diff_scalar_vs_library_pdip": 10.249386515101998, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 207206.56524507492, + "rel_diff_library_pdip_vmap_vs_scalar": 1.1081152759969684, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "FAIL", + "certified": true, + "passes": 1, + "pdip_iter": null + }, + { + "lane": 27, + "draw_name": "call00016_lane07", + "draw_kind": "captured", + "offsets": { + "centre_0": -0.008477184803652458, + "centre_1": 0.003915910494663854, + "ell_comps_0": -0.009104458058464132, + "ell_comps_1": 0.0040545395575112865, + "einstein_radius": -0.027672851325696968 + }, + "log_likelihood_vmap": 23997.437153359868, + "log_likelihood_scalar": 27662.094569023182, + "log_likelihood_library_pdip": 23997.437153358318, + "log_likelihood_library_pdip_scalar": 27662.094569023684, + "rel_diff_vmap_vs_library_pdip": 6.458102012798422e-14, + "rel_diff_scalar_vs_library_pdip_scalar": 1.8149062216743612e-14, + "abs_diff_nats": 3664.657415663314, + "rel_diff": 0.13247939003748127, + "rel_diff_scalar_vs_library_pdip": 0.15271036620475173, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 3664.657415665366, + "rel_diff_library_pdip_vmap_vs_scalar": 0.13247939003755302, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": true, + "passes": 11, + "pdip_iter": null + }, + { + "lane": 28, + "draw_name": "call00016_lane08", + "draw_kind": "captured", + "offsets": { + "centre_0": -0.0016692556339188685, + "centre_1": -0.0020136329026704475, + "ell_comps_0": -0.01765507329375373, + "ell_comps_1": 0.007611548713690083, + "einstein_radius": 0.032934930918189 + }, + "log_likelihood_vmap": 15428.367468178061, + "log_likelihood_scalar": -74102.37834738629, + "log_likelihood_library_pdip": 15428.348832724998, + "log_likelihood_library_pdip_scalar": -74102.37819471839, + "rel_diff_vmap_vs_library_pdip": 1.2078708658568625e-06, + "rel_diff_scalar_vs_library_pdip_scalar": 2.060229384997078e-09, + "abs_diff_nats": 89530.74581556435, + "rel_diff": 1.2082034046984438, + "rel_diff_scalar_vs_library_pdip": 5.8030012252645, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 89530.72702744338, + "rel_diff_library_pdip_vmap_vs_scalar": 1.208203153644867, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "FAIL", + "certified": true, + "passes": 3, + "pdip_iter": null + }, + { + "lane": 29, + "draw_name": "call00016_lane09", + "draw_kind": "captured", + "offsets": { + "centre_0": -0.0004381888692729163, + "centre_1": -0.005611258255408329, + "ell_comps_0": -0.028212995885542408, + "ell_comps_1": 0.02032938084918439, + "einstein_radius": 0.08210563031665497 + }, + "log_likelihood_vmap": 9200.047882830484, + "log_likelihood_scalar": 15883.222766170817, + "log_likelihood_library_pdip": 9199.664189086565, + "log_likelihood_library_pdip_scalar": 15888.26182677499, + "rel_diff_vmap_vs_library_pdip": 4.170736409860584e-05, + "rel_diff_scalar_vs_library_pdip_scalar": 0.00031715619109958225, + "abs_diff_nats": 6683.174883340333, + "rel_diff": 0.42076944847582315, + "rel_diff_scalar_vs_library_pdip": 0.7265002765006211, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 6688.597637688425, + "rel_diff_library_pdip_vmap_vs_scalar": 0.4209773045416939, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "FAIL", + "certified": false, + "passes": 16, + "pdip_iter": null + }, + { + "lane": 30, + "draw_name": "call00016_lane10", + "draw_kind": "captured", + "offsets": { + "centre_0": -0.006865422615785068, + "centre_1": 0.007672434011054661, + "ell_comps_0": -0.0004443754014717277, + "ell_comps_1": -0.009376937319187229, + "einstein_radius": 0.07069214800098655 + }, + "log_likelihood_vmap": 18699.685890786837, + "log_likelihood_scalar": -2303.265572369746, + "log_likelihood_library_pdip": 18699.685890621226, + "log_likelihood_library_pdip_scalar": -2303.2655716586596, + "rel_diff_vmap_vs_library_pdip": 8.856389898950021e-12, + "rel_diff_scalar_vs_library_pdip_scalar": 3.0872975411154296e-10, + "abs_diff_nats": 21002.951463156583, + "rel_diff": 9.118771067961308, + "rel_diff_scalar_vs_library_pdip": 1.1231713508901742, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 21002.951462279885, + "rel_diff_library_pdip_vmap_vs_scalar": 9.11877107039591, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": true, + "passes": 11, + "pdip_iter": null + }, + { + "lane": 31, + "draw_name": "call00016_lane11", + "draw_kind": "captured", + "offsets": { + "centre_0": -0.0009434846288846137, + "centre_1": -0.005019378037730504, + "ell_comps_0": -0.009906341245761709, + "ell_comps_1": 0.005337547203081457, + "einstein_radius": 0.021637810364502075 + }, + "log_likelihood_vmap": 13020.380277041753, + "log_likelihood_scalar": 19181.83341663636, + "log_likelihood_library_pdip": 13020.244793610349, + "log_likelihood_library_pdip_scalar": 19182.855515516767, + "rel_diff_vmap_vs_library_pdip": 1.0405597863318976e-05, + "rel_diff_scalar_vs_library_pdip_scalar": 5.3281894323811134e-05, + "abs_diff_nats": 6161.453139594607, + "rel_diff": 0.3212129417332335, + "rel_diff_scalar_vs_library_pdip": 0.47323139623686605, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 6162.610721906418, + "rel_diff_library_pdip_vmap_vs_scalar": 0.32125617152887176, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "FAIL", + "certified": false, + "passes": 16, + "pdip_iter": null + }, + { + "lane": 32, + "draw_name": "call00016_lane12", + "draw_kind": "captured", + "offsets": { + "centre_0": 0.007501332281640899, + "centre_1": -0.004481729694563993, + "ell_comps_0": 0.010332412839169434, + "ell_comps_1": -0.003991142259489408, + "einstein_radius": 0.009192357179279576 + }, + "log_likelihood_vmap": 20526.670805852016, + "log_likelihood_scalar": 25770.81257051679, + "log_likelihood_library_pdip": 20526.00740849176, + "log_likelihood_library_pdip_scalar": 25770.812570520167, + "rel_diff_vmap_vs_library_pdip": 3.2319844139795844e-05, + "rel_diff_scalar_vs_library_pdip_scalar": 1.3100263422982034e-13, + "abs_diff_nats": 5244.141764664775, + "rel_diff": 0.20349151779033767, + "rel_diff_scalar_vs_library_pdip": 0.25551998777196266, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 5244.805162028406, + "rel_diff_library_pdip_vmap_vs_scalar": 0.2035172599884592, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "FAIL", + "certified": false, + "passes": 16, + "pdip_iter": null + }, + { + "lane": 33, + "draw_name": "call00016_lane13", + "draw_kind": "captured", + "offsets": { + "centre_0": -0.007387955150592393, + "centre_1": -0.012189283154464192, + "ell_comps_0": 0.008975668561402167, + "ell_comps_1": 0.007167944425996534, + "einstein_radius": -0.04724415035491503 + }, + "log_likelihood_vmap": 9473.716101286089, + "log_likelihood_scalar": 15902.150933379533, + "log_likelihood_library_pdip": 9476.347543144104, + "log_likelihood_library_pdip_scalar": 15902.910586796046, + "rel_diff_vmap_vs_library_pdip": 0.00027768524170673797, + "rel_diff_scalar_vs_library_pdip_scalar": 4.776820018996418e-05, + "abs_diff_nats": 6428.434832093444, + "rel_diff": 0.40424939110594077, + "rel_diff_scalar_vs_library_pdip": 0.6780886159968177, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 6426.563043651942, + "rel_diff_library_pdip_vmap_vs_scalar": 0.40411237984245624, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "FAIL", + "certified": false, + "passes": 16, + "pdip_iter": null + }, + { + "lane": 34, + "draw_name": "call00016_lane14", + "draw_kind": "captured", + "offsets": { + "centre_0": -0.000386125459039801, + "centre_1": 0.006915867404617462, + "ell_comps_0": 0.009873645974923177, + "ell_comps_1": 0.0016807669637177417, + "einstein_radius": -0.02988317231293447 + }, + "log_likelihood_vmap": 23033.791171150646, + "log_likelihood_scalar": -130304.42414440234, + "log_likelihood_library_pdip": 23033.792090950028, + "log_likelihood_library_pdip_scalar": -130304.42373606384, + "rel_diff_vmap_vs_library_pdip": 3.9932607649384395e-08, + "rel_diff_scalar_vs_library_pdip_scalar": 3.1337270642674593e-09, + "abs_diff_nats": 153338.21531555298, + "rel_diff": 1.1767690646146043, + "rel_diff_scalar_vs_library_pdip": 6.6570982159554575, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 153338.21582701386, + "rel_diff_library_pdip_vmap_vs_scalar": 1.1767690722274002, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "FAIL", + "certified": true, + "passes": 2, + "pdip_iter": null + }, + { + "lane": 35, + "draw_name": "call00016_lane15", + "draw_kind": "captured", + "offsets": { + "centre_0": -0.007751700182654455, + "centre_1": 0.00045977673595488515, + "ell_comps_0": -0.0005571070710696721, + "ell_comps_1": 0.00652407778540843, + "einstein_radius": -0.018266703354617997 + }, + "log_likelihood_vmap": 12430.440762452068, + "log_likelihood_scalar": 18756.824766487727, + "log_likelihood_library_pdip": 12436.966956375632, + "log_likelihood_library_pdip_scalar": 18757.071353384403, + "rel_diff_vmap_vs_library_pdip": 0.0005247415986916905, + "rel_diff_scalar_vs_library_pdip_scalar": 1.3146343159327383e-05, + "abs_diff_nats": 6326.384004035659, + "rel_diff": 0.33728437956827456, + "rel_diff_scalar_vs_library_pdip": 0.5081510493900855, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 6320.10439700877, + "rel_diff_library_pdip_vmap_vs_scalar": 0.3369451593981601, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "FAIL", + "certified": false, + "passes": 16, + "pdip_iter": null + }, + { + "lane": 36, + "draw_name": "call00016_lane16", + "draw_kind": "captured", + "offsets": { + "centre_0": 0.002391640344038076, + "centre_1": 0.005471319325782662, + "ell_comps_0": 0.007125369000849133, + "ell_comps_1": -0.005032810664097539, + "einstein_radius": -0.08700102338561888 + }, + "log_likelihood_vmap": 4935.957801238474, + "log_likelihood_scalar": 11735.125602283828, + "log_likelihood_library_pdip": 4935.957801232442, + "log_likelihood_library_pdip_scalar": 11735.12560234069, + "rel_diff_vmap_vs_library_pdip": 1.2220057595816579e-12, + "rel_diff_scalar_vs_library_pdip_scalar": 4.845419698235002e-12, + "abs_diff_nats": 6799.167801045354, + "rel_diff": 0.5793860271697592, + "rel_diff_scalar_vs_library_pdip": 1.3774768899672776, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 6799.167801108248, + "rel_diff_library_pdip_vmap_vs_scalar": 0.5793860271723112, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": false, + "passes": 16, + "pdip_iter": null + }, + { + "lane": 37, + "draw_name": "call00016_lane17", + "draw_kind": "captured", + "offsets": { + "centre_0": 0.0026856669213289885, + "centre_1": -0.000701322842884467, + "ell_comps_0": -0.017963099482535792, + "ell_comps_1": -0.011368990220314417, + "einstein_radius": 0.1245417314838293 + }, + "log_likelihood_vmap": -10183.840816488875, + "log_likelihood_scalar": -3158.477740007991, + "log_likelihood_library_pdip": -10183.840801875529, + "log_likelihood_library_pdip_scalar": -3158.477740009388, + "rel_diff_vmap_vs_library_pdip": 1.4349542989529161e-09, + "rel_diff_scalar_vs_library_pdip_scalar": 4.422965671808298e-13, + "abs_diff_nats": 7025.363076480884, + "rel_diff": 2.2242876647479903, + "rel_diff_scalar_vs_library_pdip": 0.6898539753855635, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 7025.363061866141, + "rel_diff_library_pdip_vmap_vs_scalar": 2.2242876601198587, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "FAIL", + "certified": true, + "passes": 15, + "pdip_iter": null + }, + { + "lane": 38, + "draw_name": "call00016_lane18", + "draw_kind": "captured", + "offsets": { + "centre_0": 0.006475272480271436, + "centre_1": 0.00036104957026942186, + "ell_comps_0": 0.0058048443769378386, + "ell_comps_1": -0.006014005069002815, + "einstein_radius": -0.043358074001971 + }, + "log_likelihood_vmap": 12580.028458883913, + "log_likelihood_scalar": 18932.585368659475, + "log_likelihood_library_pdip": 12580.943022385865, + "log_likelihood_library_pdip_scalar": 18932.692618835783, + "rel_diff_vmap_vs_library_pdip": 7.26943521105604e-05, + "rel_diff_scalar_vs_library_pdip_scalar": 5.66481368855041e-06, + "abs_diff_nats": 6352.5569097755615, + "rel_diff": 0.3355356273893488, + "rel_diff_scalar_vs_library_pdip": 0.5048621820297439, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 6351.749596449918, + "rel_diff_library_pdip_vmap_vs_scalar": 0.33549108541120454, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "FAIL", + "certified": false, + "passes": 16, + "pdip_iter": null + }, + { + "lane": 39, + "draw_name": "call00016_lane19", + "draw_kind": "captured", + "offsets": { + "centre_0": 0.001791290147759792, + "centre_1": -0.0026344329251194233, + "ell_comps_0": 0.006109533754666233, + "ell_comps_1": 0.004739218846482723, + "einstein_radius": 0.0525326188965729 + }, + "log_likelihood_vmap": -2590.81211144424, + "log_likelihood_scalar": -92415.28094350263, + "log_likelihood_library_pdip": -2591.234409394616, + "log_likelihood_library_pdip_scalar": -92415.13407796873, + "rel_diff_vmap_vs_library_pdip": 0.00016297172839500502, + "rel_diff_scalar_vs_library_pdip_scalar": 1.589193538081607e-06, + "abs_diff_nats": 89824.4688320584, + "rel_diff": 0.9719655441719849, + "rel_diff_scalar_vs_library_pdip": 34.664577704142715, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 89823.89966857411, + "rel_diff_library_pdip_vmap_vs_scalar": 0.9719609300441154, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "FAIL", + "certified": true, + "passes": 4, + "pdip_iter": null + }, + { + "lane": 40, + "draw_name": "call00017_lane00", + "draw_kind": "captured", + "offsets": { + "centre_0": 0.00039504289511865966, + "centre_1": -0.0031177345874673803, + "ell_comps_0": -0.01319670439502501, + "ell_comps_1": -0.01412705504678942, + "einstein_radius": -0.08353374721414841 + }, + "log_likelihood_vmap": 6775.872816183211, + "log_likelihood_scalar": 13403.27005709926, + "log_likelihood_library_pdip": 6775.961380959467, + "log_likelihood_library_pdip_scalar": 13398.840222654067, + "rel_diff_vmap_vs_library_pdip": 1.3070436986859663e-05, + "rel_diff_scalar_vs_library_pdip_scalar": 0.00033061327484918784, + "abs_diff_nats": 6627.397240916049, + "rel_diff": 0.49446121824619504, + "rel_diff_scalar_vs_library_pdip": 0.9780617544194704, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 6622.878841694601, + "rel_diff_library_pdip_vmap_vs_scalar": 0.4942874705302463, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "FAIL", + "certified": false, + "passes": 16, + "pdip_iter": null + }, + { + "lane": 41, + "draw_name": "call00017_lane01", + "draw_kind": "captured", + "offsets": { + "centre_0": -0.0035711364854704077, + "centre_1": 0.0013105492408737255, + "ell_comps_0": -0.00180015387363288, + "ell_comps_1": 0.0054914513398384235, + "einstein_radius": 0.0036721503557828328 + }, + "log_likelihood_vmap": 13539.900754143935, + "log_likelihood_scalar": 19660.9410796756, + "log_likelihood_library_pdip": 13539.215247504355, + "log_likelihood_library_pdip_scalar": 19660.9031219574, + "rel_diff_vmap_vs_library_pdip": 5.063119442661076e-05, + "rel_diff_scalar_vs_library_pdip_scalar": 1.93061925812204e-06, + "abs_diff_nats": 6121.040325531663, + "rel_diff": 0.3113299765624779, + "rel_diff_scalar_vs_library_pdip": 0.4521477589552056, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 6121.687874453044, + "rel_diff_library_pdip_vmap_vs_scalar": 0.3113635134907059, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "FAIL", + "certified": false, + "passes": 16, + "pdip_iter": null + }, + { + "lane": 42, + "draw_name": "call00017_lane02", + "draw_kind": "captured", + "offsets": { + "centre_0": 0.0003080166678035941, + "centre_1": -0.0007105501404145155, + "ell_comps_0": 0.013423484811455881, + "ell_comps_1": -0.0026843168562135787, + "einstein_radius": -0.027211776311711677 + }, + "log_likelihood_vmap": 27099.01248309339, + "log_likelihood_scalar": 18324.10308373384, + "log_likelihood_library_pdip": 27099.012483073122, + "log_likelihood_library_pdip_scalar": 18324.10308381907, + "rel_diff_vmap_vs_library_pdip": 7.47893671290326e-13, + "rel_diff_scalar_vs_library_pdip_scalar": 4.651281817324348e-12, + "abs_diff_nats": 8774.909399359549, + "rel_diff": 0.4788725188491744, + "rel_diff_scalar_vs_library_pdip": 0.3238091943320946, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 8774.909399254051, + "rel_diff_library_pdip_vmap_vs_scalar": 0.47887251884118975, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": true, + "passes": 6, + "pdip_iter": null + }, + { + "lane": 43, + "draw_name": "call00017_lane03", + "draw_kind": "captured", + "offsets": { + "centre_0": 0.0007755113444017845, + "centre_1": -0.0035255229487048357, + "ell_comps_0": -0.00399848580683964, + "ell_comps_1": 0.0017146502467540014, + "einstein_radius": -0.08651392214907494 + }, + "log_likelihood_vmap": -89811.55653149403, + "log_likelihood_scalar": -175043.36003830942, + "log_likelihood_library_pdip": -89811.62460726776, + "log_likelihood_library_pdip_scalar": -175043.34190825332, + "rel_diff_vmap_vs_library_pdip": 7.579839917814789e-07, + "rel_diff_scalar_vs_library_pdip_scalar": 1.0357466840344527e-07, + "abs_diff_nats": 85231.80350681538, + "rel_diff": 0.4869182326491095, + "rel_diff_scalar_vs_library_pdip": 0.9490056081687281, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 85231.71730098556, + "rel_diff_library_pdip_vmap_vs_scalar": 0.4869177905987344, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "FAIL", + "certified": true, + "passes": 2, + "pdip_iter": null + }, + { + "lane": 44, + "draw_name": "call00017_lane04", + "draw_kind": "captured", + "offsets": { + "centre_0": -0.007147765623305864, + "centre_1": 0.0010457566746408338, + "ell_comps_0": 0.013576209131653673, + "ell_comps_1": -0.02008708588032471, + "einstein_radius": 0.032831422062920224 + }, + "log_likelihood_vmap": 26462.67126376893, + "log_likelihood_scalar": 13759.13327080456, + "log_likelihood_library_pdip": 26462.671263709253, + "log_likelihood_library_pdip_scalar": 13759.133270868886, + "rel_diff_vmap_vs_library_pdip": 2.25515420407968e-12, + "rel_diff_scalar_vs_library_pdip_scalar": 4.67520300883992e-12, + "abs_diff_nats": 12703.537992964371, + "rel_diff": 0.9232803944068155, + "rel_diff_scalar_vs_library_pdip": 0.48005501282579316, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 12703.537992840367, + "rel_diff_library_pdip_vmap_vs_scalar": 0.9232803943934865, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": true, + "passes": 8, + "pdip_iter": null + }, + { + "lane": 45, + "draw_name": "call00017_lane05", + "draw_kind": "captured", + "offsets": { + "centre_0": -0.001330428459324805, + "centre_1": 0.0005227443143650849, + "ell_comps_0": 0.011495347238845648, + "ell_comps_1": 0.016282146756616874, + "einstein_radius": -0.03990716965121255 + }, + "log_likelihood_vmap": 13511.99488308384, + "log_likelihood_scalar": 19903.288179667114, + "log_likelihood_library_pdip": 13504.069127412935, + "log_likelihood_library_pdip_scalar": 19903.394044775436, + "rel_diff_vmap_vs_library_pdip": 0.0005869161062583909, + "rel_diff_scalar_vs_library_pdip_scalar": 5.318947516389384e-06, + "abs_diff_nats": 6391.293296583273, + "rel_diff": 0.32111745752204496, + "rel_diff_scalar_vs_library_pdip": 0.47387339266976336, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 6399.324917362501, + "rel_diff_library_pdip_vmap_vs_scalar": 0.32151927972517325, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "FAIL", + "certified": false, + "passes": 16, + "pdip_iter": null + }, + { + "lane": 46, + "draw_name": "call00017_lane06", + "draw_kind": "captured", + "offsets": { + "centre_0": 0.002687443649497539, + "centre_1": -0.0019369334469605598, + "ell_comps_0": -0.015185516697078849, + "ell_comps_1": -0.012687661440239377, + "einstein_radius": 0.024820286560815807 + }, + "log_likelihood_vmap": 12905.863607846928, + "log_likelihood_scalar": 19139.791231082916, + "log_likelihood_library_pdip": 12905.386047434527, + "log_likelihood_library_pdip_scalar": 19139.565581617124, + "rel_diff_vmap_vs_library_pdip": 3.7004736677022505e-05, + "rel_diff_scalar_vs_library_pdip_scalar": 1.1789685864602834e-05, + "abs_diff_nats": 6233.927623235988, + "rel_diff": 0.3257051003310905, + "rel_diff_scalar_vs_library_pdip": 0.48308552419380985, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 6234.179534182596, + "rel_diff_library_pdip_vmap_vs_scalar": 0.32572210208210295, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "FAIL", + "certified": false, + "passes": 16, + "pdip_iter": null + }, + { + "lane": 47, + "draw_name": "call00017_lane07", + "draw_kind": "captured", + "offsets": { + "centre_0": -0.003693907069305896, + "centre_1": 0.002094959418050611, + "ell_comps_0": -0.003985235543017392, + "ell_comps_1": -0.01016688375069693, + "einstein_radius": -0.061293935299826074 + }, + "log_likelihood_vmap": 21569.14415015534, + "log_likelihood_scalar": 15503.41944203166, + "log_likelihood_library_pdip": 21569.144150185602, + "log_likelihood_library_pdip_scalar": 15503.419442057915, + "rel_diff_vmap_vs_library_pdip": 1.402962839261681e-12, + "rel_diff_scalar_vs_library_pdip_scalar": 1.6935162690338578e-12, + "abs_diff_nats": 6065.724708123682, + "rel_diff": 0.39125076443966694, + "rel_diff_scalar_vs_library_pdip": 0.2812223176737287, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 6065.724708127687, + "rel_diff_library_pdip_vmap_vs_scalar": 0.3912507644392627, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": false, + "passes": 16, + "pdip_iter": null + }, + { + "lane": 48, + "draw_name": "call00017_lane08", + "draw_kind": "captured", + "offsets": { + "centre_0": 0.003201023829002854, + "centre_1": 0.0051592827552293585, + "ell_comps_0": -0.016832634529093247, + "ell_comps_1": 0.018395875062653597, + "einstein_radius": -0.023696742396298376 + }, + "log_likelihood_vmap": 22377.520981646634, + "log_likelihood_scalar": 27530.81447304739, + "log_likelihood_library_pdip": 22376.16481042713, + "log_likelihood_library_pdip_scalar": 27530.814473047278, + "rel_diff_vmap_vs_library_pdip": 6.060784906590474e-05, + "rel_diff_scalar_vs_library_pdip_scalar": 4.0964041630607165e-15, + "abs_diff_nats": 5153.2934914007565, + "rel_diff": 0.18718274740639512, + "rel_diff_scalar_vs_library_pdip": 0.23036341152699374, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 5154.649662620148, + "rel_diff_library_pdip_vmap_vs_scalar": 0.18723200752620522, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "FAIL", + "certified": false, + "passes": 16, + "pdip_iter": null + }, + { + "lane": 49, + "draw_name": "call00017_lane09", + "draw_kind": "captured", + "offsets": { + "centre_0": 2.2604383701358236e-05, + "centre_1": -0.005697104995547526, + "ell_comps_0": -0.0005169325215696047, + "ell_comps_1": 0.0010224650903271142, + "einstein_radius": -0.016159263378539013 + }, + "log_likelihood_vmap": 26250.951903968835, + "log_likelihood_scalar": -177402.92031277675, + "log_likelihood_library_pdip": 26250.951111653103, + "log_likelihood_library_pdip_scalar": -177402.92016442568, + "rel_diff_vmap_vs_library_pdip": 3.0182362857811986e-08, + "rel_diff_scalar_vs_library_pdip_scalar": 8.362380465041473e-10, + "abs_diff_nats": 203653.8722167456, + "rel_diff": 1.1479736176703639, + "rel_diff_scalar_vs_library_pdip": 7.757961628065565, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 203653.87127607877, + "rel_diff_library_pdip_vmap_vs_scalar": 1.1479736133279115, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "FAIL", + "certified": true, + "passes": 2, + "pdip_iter": null + } + ], + "lane_pins": [ + { + "pin": "lane 0: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 18701.11125441907, + "reference_value": 18700.594048999854, + "rel_diff": 2.7657165214116645e-05, + "abs_diff_nats": 0.5172054192153155, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 0: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 24758.50619430935, + "reference_value": 24758.50619430913, + "rel_diff": 8.816312531637117e-15, + "abs_diff_nats": 2.1827872842550278e-10, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 0: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 18701.11125441907, + "reference_value": 24758.50619430935, + "rel_diff": 0.24465914430986754, + "abs_diff_nats": 6057.3949398902805, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 0: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 18700.594048999854, + "reference_value": 24758.50619430913, + "rel_diff": 0.24468003431894125, + "abs_diff_nats": 6057.912145309278, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 1: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 14176.345969423928, + "reference_value": 14200.214307642884, + "rel_diff": 0.0016808435212213046, + "abs_diff_nats": 23.868338218955614, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 1: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 20552.70645941567, + "reference_value": 20551.004887773583, + "rel_diff": 8.279749099270609e-05, + "abs_diff_nats": 1.701571642086492, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 1: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 14176.345969423928, + "reference_value": 20552.70645941567, + "rel_diff": 0.3102443224488609, + "abs_diff_nats": 6376.360489991741, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 1: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 14200.214307642884, + "reference_value": 20551.004887773583, + "rel_diff": 0.3090257928900098, + "abs_diff_nats": 6350.790580130699, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 2: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -23119.33474596295, + "reference_value": -23119.20810591006, + "rel_diff": 5.477698557451379e-06, + "abs_diff_nats": 0.12664005289116176, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 2: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -189709.06377243972, + "reference_value": -189709.05679042212, + "rel_diff": 3.6803818002348496e-08, + "abs_diff_nats": 0.006982017599511892, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 2: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -23119.33474596295, + "reference_value": -189709.06377243972, + "rel_diff": 0.8781326822966397, + "abs_diff_nats": 166589.72902647677, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 2: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -23119.20810591006, + "reference_value": -189709.05679042212, + "rel_diff": 0.8781333453602556, + "abs_diff_nats": 166589.84868451208, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 3: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 18502.008921180433, + "reference_value": 18502.009704396118, + "rel_diff": 4.2331384366558094e-08, + "abs_diff_nats": 0.00078321568435058, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 3: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -141741.9647687315, + "reference_value": -141741.96566347557, + "rel_diff": 6.312485236126246e-09, + "abs_diff_nats": 0.0008947440655902028, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 3: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 18502.008921180433, + "reference_value": -141741.9647687315, + "rel_diff": 1.1305330355154073, + "abs_diff_nats": 160243.97368991195, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 3: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 18502.009704396118, + "reference_value": -141741.96566347557, + "rel_diff": 1.1305330402170637, + "abs_diff_nats": 160243.9753678717, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 4: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 18750.51662542791, + "reference_value": 18751.910288039162, + "rel_diff": 7.432110061558511e-05, + "abs_diff_nats": 1.3936626112517843, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 4: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 24880.545932988738, + "reference_value": 24880.545932988738, + "rel_diff": 0.0, + "abs_diff_nats": 0.0, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 4: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 18750.51662542791, + "reference_value": 24880.545932988738, + "rel_diff": 0.24637840841880865, + "abs_diff_nats": 6130.029307560828, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 4: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 18751.910288039162, + "reference_value": 24880.545932988738, + "rel_diff": 0.24632239426964145, + "abs_diff_nats": 6128.635644949576, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 5: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 24935.952740675293, + "reference_value": 24935.95274067247, + "rel_diff": 1.1321290121385741e-13, + "abs_diff_nats": 2.8230715543031693e-09, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 5: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 25472.51918676291, + "reference_value": 25472.519186781192, + "rel_diff": 7.17669240784107e-13, + "abs_diff_nats": 1.8280843505635858e-08, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 5: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 24935.952740675293, + "reference_value": 25472.51918676291, + "rel_diff": 0.021064522207385392, + "abs_diff_nats": 536.5664460876178, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 5: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 24935.95274067247, + "reference_value": 25472.519186781192, + "rel_diff": 0.021064522208198773, + "abs_diff_nats": 536.5664461087217, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 6: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 28315.20146518829, + "reference_value": 28315.201428712455, + "rel_diff": 1.2882067761812063e-09, + "abs_diff_nats": 3.647583434940316e-05, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 6: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -83383.91543837059, + "reference_value": -83383.91540684736, + "rel_diff": 3.7804931237389863e-10, + "abs_diff_nats": 3.1523231882601976e-05, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 6: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 28315.20146518829, + "reference_value": -83383.91543837059, + "rel_diff": 1.3395762997735, + "abs_diff_nats": 111699.11690355888, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 6: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 28315.201428712455, + "reference_value": -83383.91540684736, + "rel_diff": 1.3395762994644318, + "abs_diff_nats": 111699.1168355598, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 7: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 23338.890014375043, + "reference_value": 23338.89001354625, + "rel_diff": 3.5511261135990974e-11, + "abs_diff_nats": 8.287934178952128e-07, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 7: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -11960.284429754305, + "reference_value": -11960.28442978162, + "rel_diff": 2.2837203449469557e-12, + "abs_diff_nats": 2.731394488364458e-08, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 7: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 23338.890014375043, + "reference_value": -11960.284429754305, + "rel_diff": 2.951365801662167, + "abs_diff_nats": 35299.17444412935, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 7: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 23338.89001354625, + "reference_value": -11960.28442978162, + "rel_diff": 2.9513658015884148, + "abs_diff_nats": 35299.174443327865, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 8: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 24869.037000613742, + "reference_value": 24869.03700060154, + "rel_diff": 4.906414719110541e-13, + "abs_diff_nats": 1.2201780918985605e-08, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 8: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 23223.550391500263, + "reference_value": 23223.55039150045, + "rel_diff": 7.989171166075526e-15, + "abs_diff_nats": 1.8553691916167736e-10, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 8: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 24869.037000613742, + "reference_value": 23223.550391500263, + "rel_diff": 0.07085422260481418, + "abs_diff_nats": 1645.486609113479, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 8: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 24869.03700060154, + "reference_value": 23223.55039150045, + "rel_diff": 0.07085422260428022, + "abs_diff_nats": 1645.4866091010917, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 9: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -31750.335545040216, + "reference_value": NaN, + "rel_diff": NaN, + "abs_diff_nats": NaN, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 9: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -177117.75609302538, + "reference_value": -177117.7774717681, + "rel_diff": 1.2070353981814522e-07, + "abs_diff_nats": 0.021378742705564946, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 9: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -31750.335545040216, + "reference_value": -177117.75609302538, + "rel_diff": 0.8207388336132467, + "abs_diff_nats": 145367.42054798518, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 9: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": NaN, + "reference_value": -177117.7774717681, + "rel_diff": NaN, + "abs_diff_nats": NaN, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 10: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 6560.779794306516, + "reference_value": 6560.7795961357915, + "rel_diff": 3.020536229149355e-08, + "abs_diff_nats": 0.00019817072461592034, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 10: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -101745.38349985592, + "reference_value": -101745.38349137451, + "rel_diff": 8.335915475309887e-11, + "abs_diff_nats": 8.48140916787088e-06, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 10: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 6560.779794306516, + "reference_value": -101745.38349985592, + "rel_diff": 1.0644823339263918, + "abs_diff_nats": 108306.16329416243, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 10: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 6560.7795961357915, + "reference_value": -101745.38349137451, + "rel_diff": 1.0644823319840548, + "abs_diff_nats": 108306.1630875103, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 11: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 12668.001326846505, + "reference_value": 12667.924915789376, + "rel_diff": 6.031852701760834e-06, + "abs_diff_nats": 0.07641105712900753, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 11: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 18959.672780975976, + "reference_value": 18957.528349757773, + "rel_diff": 0.00011311765851745929, + "abs_diff_nats": 2.1444312182029535, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 11: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 12668.001326846505, + "reference_value": 18959.672780975976, + "rel_diff": 0.3318449388241815, + "abs_diff_nats": 6291.671454129471, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 11: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 12667.924915789376, + "reference_value": 18957.528349757773, + "rel_diff": 0.3317733893326216, + "abs_diff_nats": 6289.603433968397, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 12: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 18842.345663340646, + "reference_value": 18842.279796731058, + "rel_diff": 3.4956815363317152e-06, + "abs_diff_nats": 0.06586660958782886, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 12: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 24810.049660195124, + "reference_value": 24810.049660194898, + "rel_diff": 9.091262981289588e-15, + "abs_diff_nats": 2.255546860396862e-10, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 12: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 18842.345663340646, + "reference_value": 24810.049660195124, + "rel_diff": 0.24053575380096776, + "abs_diff_nats": 5967.703996854478, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 12: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 18842.279796731058, + "reference_value": 24810.049660194898, + "rel_diff": 0.24053840863682333, + "abs_diff_nats": 5967.76986346384, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 13: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 22879.755989048543, + "reference_value": 22879.7559893116, + "rel_diff": 1.1497439469410595e-11, + "abs_diff_nats": 2.6305860956199467e-07, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 13: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -3605.706215917453, + "reference_value": -3605.706215970531, + "rel_diff": 1.472058665244897e-11, + "abs_diff_nats": 5.307811079546809e-08, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 13: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 22879.755989048543, + "reference_value": -3605.706215917453, + "rel_diff": 7.3454298877832755, + "abs_diff_nats": 26485.462204965996, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 13: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 22879.7559893116, + "reference_value": -3605.706215970531, + "rel_diff": 7.3454298877628235, + "abs_diff_nats": 26485.462205282132, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 14: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 4357.021950291826, + "reference_value": 4357.021950280177, + "rel_diff": 2.673571139470296e-12, + "abs_diff_nats": 1.1648808140307665e-08, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 14: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 11129.43856306804, + "reference_value": 11126.921475785763, + "rel_diff": 0.00022621596528346792, + "abs_diff_nats": 2.5170872822782258, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 14: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 4357.021950291826, + "reference_value": 11129.43856306804, + "rel_diff": 0.6085137695310004, + "abs_diff_nats": 6772.416612776215, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 14: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 4357.021950280177, + "reference_value": 11126.921475785763, + "rel_diff": 0.6084252090965266, + "abs_diff_nats": 6769.899525505585, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 15: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 14146.844560201887, + "reference_value": 14146.464613817334, + "rel_diff": 2.6858045096466776e-05, + "abs_diff_nats": 0.3799463845534774, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 15: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 20407.780654983708, + "reference_value": 20410.343973720697, + "rel_diff": 0.00012558919831482778, + "abs_diff_nats": 2.5633187369894586, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 15: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 14146.844560201887, + "reference_value": 20407.780654983708, + "rel_diff": 0.30679162034470714, + "abs_diff_nats": 6260.93609478182, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 15: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 14146.464613817334, + "reference_value": 20410.343973720697, + "rel_diff": 0.3068972952130748, + "abs_diff_nats": 6263.879359903363, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 16: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 2903.0452367721446, + "reference_value": 2903.043598923672, + "rel_diff": 5.641832155268914e-07, + "abs_diff_nats": 0.0016378484724555165, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 16: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 9734.862241683215, + "reference_value": 9734.862241678551, + "rel_diff": 4.790914051894582e-13, + "abs_diff_nats": 4.663888830691576e-09, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 16: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 2903.0452367721446, + "reference_value": 9734.862241683215, + "rel_diff": 0.7017887706369648, + "abs_diff_nats": 6831.81700491107, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 16: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 2903.043598923672, + "reference_value": 9734.862241678551, + "rel_diff": 0.7017889388824973, + "abs_diff_nats": 6831.818642754879, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 17: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 13362.515995368962, + "reference_value": 13360.530937095456, + "rel_diff": 0.00014857630155952622, + "abs_diff_nats": 1.985058273505274, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 17: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 19481.580996516812, + "reference_value": 19481.557217641563, + "rel_diff": 1.2205839083402613e-06, + "abs_diff_nats": 0.023778875249263365, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 17: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 13362.515995368962, + "reference_value": 19481.580996516812, + "rel_diff": 0.31409488799917734, + "abs_diff_nats": 6119.06500114785, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 17: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 13360.530937095456, + "reference_value": 19481.557217641563, + "rel_diff": 0.3141959450245178, + "abs_diff_nats": 6121.026280546106, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 18: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 12584.040728899512, + "reference_value": 12594.119293045376, + "rel_diff": 0.0008002595426763763, + "abs_diff_nats": 10.07856414586422, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 18: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 18817.121698566574, + "reference_value": 18812.946857997056, + "rel_diff": 0.00022191316443034178, + "abs_diff_nats": 4.174840569517983, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 18: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 12584.040728899512, + "reference_value": 18817.121698566574, + "rel_diff": 0.33124518560890626, + "abs_diff_nats": 6233.080969667062, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 18: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 12594.119293045376, + "reference_value": 18812.946857997056, + "rel_diff": 0.3305610552080077, + "abs_diff_nats": 6218.82756495168, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 19: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 10418.210094661103, + "reference_value": 10415.233658083074, + "rel_diff": 0.0002857772255275724, + "abs_diff_nats": 2.9764365780283697, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 19: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 16927.857229254627, + "reference_value": 16927.632549568763, + "rel_diff": 1.3272953864375116e-05, + "abs_diff_nats": 0.22467968586352072, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 19: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 10418.210094661103, + "reference_value": 16927.857229254627, + "rel_diff": 0.38455234152988893, + "abs_diff_nats": 6509.647134593524, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 19: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 10415.233658083074, + "reference_value": 16927.632549568763, + "rel_diff": 0.38472000573119686, + "abs_diff_nats": 6512.398891485689, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 20: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 23125.781207506672, + "reference_value": 23125.781207506327, + "rel_diff": 1.494470537330574e-14, + "abs_diff_nats": 3.4560798667371273e-10, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 20: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 27642.806005942835, + "reference_value": 27642.806005943203, + "rel_diff": 1.3292277905407444e-14, + "abs_diff_nats": 3.67435859516263e-10, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 20: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 23125.781207506672, + "reference_value": 27642.806005942835, + "rel_diff": 0.16340688414428922, + "abs_diff_nats": 4517.024798436163, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 20: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 23125.781207506327, + "reference_value": 27642.806005943203, + "rel_diff": 0.16340688414431284, + "abs_diff_nats": 4517.024798436876, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 21: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 25204.95975370948, + "reference_value": 25204.959753728468, + "rel_diff": 7.532887011018947e-13, + "abs_diff_nats": 1.898661139421165e-08, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 21: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 27788.396151130026, + "reference_value": 27788.39615117224, + "rel_diff": 1.5191631013116751e-12, + "abs_diff_nats": 4.221510607749224e-08, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 21: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 25204.95975370948, + "reference_value": 27788.396151130026, + "rel_diff": 0.09296817215971236, + "abs_diff_nats": 2583.4363974205444, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 21: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 25204.959753728468, + "reference_value": 27788.39615117224, + "rel_diff": 0.09296817216040702, + "abs_diff_nats": 2583.436397443773, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 22: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 11552.670998697395, + "reference_value": 11553.07472359277, + "rel_diff": 3.494523363127176e-05, + "abs_diff_nats": 0.4037248953754897, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 22: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 17853.26476931595, + "reference_value": 17852.91967933103, + "rel_diff": 1.932961056890832e-05, + "abs_diff_nats": 0.3450899849194684, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 22: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 11552.670998697395, + "reference_value": 17853.26476931595, + "rel_diff": 0.35290989362613717, + "abs_diff_nats": 6300.593770618554, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 22: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 11553.07472359277, + "reference_value": 17852.91967933103, + "rel_diff": 0.3528747716840858, + "abs_diff_nats": 6299.844955738259, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 23: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 21983.89953487797, + "reference_value": 21983.89953487757, + "rel_diff": 1.8203215864646964e-14, + "abs_diff_nats": 4.001776687800884e-10, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 23: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 27386.085836286475, + "reference_value": 27386.085836286475, + "rel_diff": 0.0, + "abs_diff_nats": 0.0, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 23: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 21983.89953487797, + "reference_value": 27386.085836286475, + "rel_diff": 0.19726025594539778, + "abs_diff_nats": 5402.186301408503, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 23: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 21983.89953487757, + "reference_value": 27386.085836286475, + "rel_diff": 0.19726025594541238, + "abs_diff_nats": 5402.186301408903, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 24: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 23449.28672850168, + "reference_value": 23449.28672850127, + "rel_diff": 1.7531092095083012e-14, + "abs_diff_nats": 4.1109160520136356e-10, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 24: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 28384.90598332627, + "reference_value": 28384.90598332596, + "rel_diff": 1.0894106846238786e-14, + "abs_diff_nats": 3.092281986027956e-10, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 24: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 23449.28672850168, + "reference_value": 28384.90598332627, + "rel_diff": 0.1738818249996617, + "abs_diff_nats": 4935.619254824589, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 24: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 23449.28672850127, + "reference_value": 28384.90598332596, + "rel_diff": 0.1738818249996672, + "abs_diff_nats": 4935.619254824691, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 25: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -136892.35618963442, + "reference_value": -136892.6262471882, + "rel_diff": 1.9727691781369726e-06, + "abs_diff_nats": 0.2700575537746772, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 25: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -189785.05556361115, + "reference_value": -189785.02878222853, + "rel_diff": 1.4111430597614006e-07, + "abs_diff_nats": 0.026781382621265948, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 25: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -136892.35618963442, + "reference_value": -189785.05556361115, + "rel_diff": 0.27869791547548084, + "abs_diff_nats": 52892.699373976735, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 25: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -136892.6262471882, + "reference_value": -189785.02878222853, + "rel_diff": 0.27869639072390934, + "abs_diff_nats": 52892.40253504034, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 26: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 20216.49720683314, + "reference_value": 20216.48421884619, + "rel_diff": 6.424453831120838e-07, + "abs_diff_nats": 0.012987986949156038, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 26: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -186990.0765165683, + "reference_value": -186990.08102622873, + "rel_diff": 2.4117110333348803e-08, + "abs_diff_nats": 0.004509660415351391, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 26: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 20216.49720683314, + "reference_value": -186990.0765165683, + "rel_diff": 1.108115348062558, + "abs_diff_nats": 207206.57372340147, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 26: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 20216.48421884619, + "reference_value": -186990.08102622873, + "rel_diff": 1.1081152759969684, + "abs_diff_nats": 207206.56524507492, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 27: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 23997.437153359868, + "reference_value": 23997.437153358318, + "rel_diff": 6.458102012798422e-14, + "abs_diff_nats": 1.5497789718210697e-09, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 27: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 27662.094569023182, + "reference_value": 27662.094569023684, + "rel_diff": 1.8149062216743612e-14, + "abs_diff_nats": 5.020410753786564e-10, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 27: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 23997.437153359868, + "reference_value": 27662.094569023182, + "rel_diff": 0.13247939003748127, + "abs_diff_nats": 3664.657415663314, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 27: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 23997.437153358318, + "reference_value": 27662.094569023684, + "rel_diff": 0.13247939003755302, + "abs_diff_nats": 3664.657415665366, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 28: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 15428.367468178061, + "reference_value": 15428.348832724998, + "rel_diff": 1.2078708658568625e-06, + "abs_diff_nats": 0.018635453063325258, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 28: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -74102.37834738629, + "reference_value": -74102.37819471839, + "rel_diff": 2.060229384997078e-09, + "abs_diff_nats": 0.00015266789705492556, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 28: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 15428.367468178061, + "reference_value": -74102.37834738629, + "rel_diff": 1.2082034046984438, + "abs_diff_nats": 89530.74581556435, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 28: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 15428.348832724998, + "reference_value": -74102.37819471839, + "rel_diff": 1.208203153644867, + "abs_diff_nats": 89530.72702744338, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 29: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 9200.047882830484, + "reference_value": 9199.664189086565, + "rel_diff": 4.170736409860584e-05, + "abs_diff_nats": 0.3836937439191388, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 29: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 15883.222766170817, + "reference_value": 15888.26182677499, + "rel_diff": 0.00031715619109958225, + "abs_diff_nats": 5.039060604172846, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 29: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 9200.047882830484, + "reference_value": 15883.222766170817, + "rel_diff": 0.42076944847582315, + "abs_diff_nats": 6683.174883340333, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 29: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 9199.664189086565, + "reference_value": 15888.26182677499, + "rel_diff": 0.4209773045416939, + "abs_diff_nats": 6688.597637688425, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 30: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 18699.685890786837, + "reference_value": 18699.685890621226, + "rel_diff": 8.856389898950021e-12, + "abs_diff_nats": 1.6561170923523605e-07, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 30: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -2303.265572369746, + "reference_value": -2303.2655716586596, + "rel_diff": 3.0872975411154296e-10, + "abs_diff_nats": 7.110866135917604e-07, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 30: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 18699.685890786837, + "reference_value": -2303.265572369746, + "rel_diff": 9.118771067961308, + "abs_diff_nats": 21002.951463156583, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 30: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 18699.685890621226, + "reference_value": -2303.2655716586596, + "rel_diff": 9.11877107039591, + "abs_diff_nats": 21002.951462279885, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 31: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 13020.380277041753, + "reference_value": 13020.244793610349, + "rel_diff": 1.0405597863318976e-05, + "abs_diff_nats": 0.13548343140428187, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 31: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 19181.83341663636, + "reference_value": 19182.855515516767, + "rel_diff": 5.3281894323811134e-05, + "abs_diff_nats": 1.022098880406702, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 31: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 13020.380277041753, + "reference_value": 19181.83341663636, + "rel_diff": 0.3212129417332335, + "abs_diff_nats": 6161.453139594607, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 31: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 13020.244793610349, + "reference_value": 19182.855515516767, + "rel_diff": 0.32125617152887176, + "abs_diff_nats": 6162.610721906418, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 32: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 20526.670805852016, + "reference_value": 20526.00740849176, + "rel_diff": 3.2319844139795844e-05, + "abs_diff_nats": 0.6633973602547485, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 32: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 25770.81257051679, + "reference_value": 25770.812570520167, + "rel_diff": 1.3100263422982034e-13, + "abs_diff_nats": 3.3760443329811096e-09, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 32: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 20526.670805852016, + "reference_value": 25770.81257051679, + "rel_diff": 0.20349151779033767, + "abs_diff_nats": 5244.141764664775, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 32: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 20526.00740849176, + "reference_value": 25770.812570520167, + "rel_diff": 0.2035172599884592, + "abs_diff_nats": 5244.805162028406, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 33: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 9473.716101286089, + "reference_value": 9476.347543144104, + "rel_diff": 0.00027768524170673797, + "abs_diff_nats": 2.631441858015023, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 33: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 15902.150933379533, + "reference_value": 15902.910586796046, + "rel_diff": 4.776820018996418e-05, + "abs_diff_nats": 0.7596534165131743, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 33: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 9473.716101286089, + "reference_value": 15902.150933379533, + "rel_diff": 0.40424939110594077, + "abs_diff_nats": 6428.434832093444, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 33: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 9476.347543144104, + "reference_value": 15902.910586796046, + "rel_diff": 0.40411237984245624, + "abs_diff_nats": 6426.563043651942, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 34: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 23033.791171150646, + "reference_value": 23033.792090950028, + "rel_diff": 3.9932607649384395e-08, + "abs_diff_nats": 0.0009197993822454009, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 34: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -130304.42414440234, + "reference_value": -130304.42373606384, + "rel_diff": 3.1337270642674593e-09, + "abs_diff_nats": 0.0004083384992554784, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 34: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 23033.791171150646, + "reference_value": -130304.42414440234, + "rel_diff": 1.1767690646146043, + "abs_diff_nats": 153338.21531555298, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 34: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 23033.792090950028, + "reference_value": -130304.42373606384, + "rel_diff": 1.1767690722274002, + "abs_diff_nats": 153338.21582701386, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 35: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 12430.440762452068, + "reference_value": 12436.966956375632, + "rel_diff": 0.0005247415986916905, + "abs_diff_nats": 6.5261939235642785, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 35: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 18756.824766487727, + "reference_value": 18757.071353384403, + "rel_diff": 1.3146343159327383e-05, + "abs_diff_nats": 0.24658689667558065, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 35: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 12430.440762452068, + "reference_value": 18756.824766487727, + "rel_diff": 0.33728437956827456, + "abs_diff_nats": 6326.384004035659, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 35: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 12436.966956375632, + "reference_value": 18757.071353384403, + "rel_diff": 0.3369451593981601, + "abs_diff_nats": 6320.10439700877, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 36: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 4935.957801238474, + "reference_value": 4935.957801232442, + "rel_diff": 1.2220057595816579e-12, + "abs_diff_nats": 6.03176886215806e-09, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 36: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 11735.125602283828, + "reference_value": 11735.12560234069, + "rel_diff": 4.845419698235002e-12, + "abs_diff_nats": 5.6861608754843473e-08, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 36: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 4935.957801238474, + "reference_value": 11735.125602283828, + "rel_diff": 0.5793860271697592, + "abs_diff_nats": 6799.167801045354, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 36: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 4935.957801232442, + "reference_value": 11735.12560234069, + "rel_diff": 0.5793860271723112, + "abs_diff_nats": 6799.167801108248, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 37: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -10183.840816488875, + "reference_value": -10183.840801875529, + "rel_diff": 1.4349542989529161e-09, + "abs_diff_nats": 1.4613346138503402e-05, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 37: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -3158.477740007991, + "reference_value": -3158.477740009388, + "rel_diff": 4.422965671808298e-13, + "abs_diff_nats": 1.3969838619232178e-09, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 37: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -10183.840816488875, + "reference_value": -3158.477740007991, + "rel_diff": 2.2242876647479903, + "abs_diff_nats": 7025.363076480884, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 37: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -10183.840801875529, + "reference_value": -3158.477740009388, + "rel_diff": 2.2242876601198587, + "abs_diff_nats": 7025.363061866141, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 38: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 12580.028458883913, + "reference_value": 12580.943022385865, + "rel_diff": 7.26943521105604e-05, + "abs_diff_nats": 0.914563501952216, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 38: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 18932.585368659475, + "reference_value": 18932.692618835783, + "rel_diff": 5.66481368855041e-06, + "abs_diff_nats": 0.10725017630829825, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 38: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 12580.028458883913, + "reference_value": 18932.585368659475, + "rel_diff": 0.3355356273893488, + "abs_diff_nats": 6352.5569097755615, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 38: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 12580.943022385865, + "reference_value": 18932.692618835783, + "rel_diff": 0.33549108541120454, + "abs_diff_nats": 6351.749596449918, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 39: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -2590.81211144424, + "reference_value": -2591.234409394616, + "rel_diff": 0.00016297172839500502, + "abs_diff_nats": 0.42229795037565054, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 39: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -92415.28094350263, + "reference_value": -92415.13407796873, + "rel_diff": 1.589193538081607e-06, + "abs_diff_nats": 0.14686553389765322, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 39: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -2590.81211144424, + "reference_value": -92415.28094350263, + "rel_diff": 0.9719655441719849, + "abs_diff_nats": 89824.4688320584, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 39: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -2591.234409394616, + "reference_value": -92415.13407796873, + "rel_diff": 0.9719609300441154, + "abs_diff_nats": 89823.89966857411, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 40: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 6775.872816183211, + "reference_value": 6775.961380959467, + "rel_diff": 1.3070436986859663e-05, + "abs_diff_nats": 0.0885647762552253, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 40: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 13403.27005709926, + "reference_value": 13398.840222654067, + "rel_diff": 0.00033061327484918784, + "abs_diff_nats": 4.429834445192682, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 40: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 6775.872816183211, + "reference_value": 13403.27005709926, + "rel_diff": 0.49446121824619504, + "abs_diff_nats": 6627.397240916049, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 40: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 6775.961380959467, + "reference_value": 13398.840222654067, + "rel_diff": 0.4942874705302463, + "abs_diff_nats": 6622.878841694601, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 41: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 13539.900754143935, + "reference_value": 13539.215247504355, + "rel_diff": 5.063119442661076e-05, + "abs_diff_nats": 0.6855066395801259, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 41: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 19660.9410796756, + "reference_value": 19660.9031219574, + "rel_diff": 1.93061925812204e-06, + "abs_diff_nats": 0.0379577181993227, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 41: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 13539.900754143935, + "reference_value": 19660.9410796756, + "rel_diff": 0.3113299765624779, + "abs_diff_nats": 6121.040325531663, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 41: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 13539.215247504355, + "reference_value": 19660.9031219574, + "rel_diff": 0.3113635134907059, + "abs_diff_nats": 6121.687874453044, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 42: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 27099.01248309339, + "reference_value": 27099.012483073122, + "rel_diff": 7.47893671290326e-13, + "abs_diff_nats": 2.0267179934307933e-08, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 42: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 18324.10308373384, + "reference_value": 18324.10308381907, + "rel_diff": 4.651281817324348e-12, + "abs_diff_nats": 8.523056749254465e-08, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 42: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 27099.01248309339, + "reference_value": 18324.10308373384, + "rel_diff": 0.4788725188491744, + "abs_diff_nats": 8774.909399359549, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 42: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 27099.012483073122, + "reference_value": 18324.10308381907, + "rel_diff": 0.47887251884118975, + "abs_diff_nats": 8774.909399254051, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 43: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -89811.55653149403, + "reference_value": -89811.62460726776, + "rel_diff": 7.579839917814789e-07, + "abs_diff_nats": 0.06807577372819651, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 43: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -175043.36003830942, + "reference_value": -175043.34190825332, + "rel_diff": 1.0357466840344527e-07, + "abs_diff_nats": 0.018130056094378233, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 43: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -89811.55653149403, + "reference_value": -175043.36003830942, + "rel_diff": 0.4869182326491095, + "abs_diff_nats": 85231.80350681538, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 43: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -89811.62460726776, + "reference_value": -175043.34190825332, + "rel_diff": 0.4869177905987344, + "abs_diff_nats": 85231.71730098556, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 44: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 26462.67126376893, + "reference_value": 26462.671263709253, + "rel_diff": 2.25515420407968e-12, + "abs_diff_nats": 5.967740435153246e-08, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 44: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 13759.13327080456, + "reference_value": 13759.133270868886, + "rel_diff": 4.67520300883992e-12, + "abs_diff_nats": 6.432674126699567e-08, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 44: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 26462.67126376893, + "reference_value": 13759.13327080456, + "rel_diff": 0.9232803944068155, + "abs_diff_nats": 12703.537992964371, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 44: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 26462.671263709253, + "reference_value": 13759.133270868886, + "rel_diff": 0.9232803943934865, + "abs_diff_nats": 12703.537992840367, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 45: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 13511.99488308384, + "reference_value": 13504.069127412935, + "rel_diff": 0.0005869161062583909, + "abs_diff_nats": 7.925755670905346, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 45: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 19903.288179667114, + "reference_value": 19903.394044775436, + "rel_diff": 5.318947516389384e-06, + "abs_diff_nats": 0.10586510832217755, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 45: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 13511.99488308384, + "reference_value": 19903.288179667114, + "rel_diff": 0.32111745752204496, + "abs_diff_nats": 6391.293296583273, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 45: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 13504.069127412935, + "reference_value": 19903.394044775436, + "rel_diff": 0.32151927972517325, + "abs_diff_nats": 6399.324917362501, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 46: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 12905.863607846928, + "reference_value": 12905.386047434527, + "rel_diff": 3.7004736677022505e-05, + "abs_diff_nats": 0.47756041240063496, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 46: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 19139.791231082916, + "reference_value": 19139.565581617124, + "rel_diff": 1.1789685864602834e-05, + "abs_diff_nats": 0.22564946579223033, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 46: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 12905.863607846928, + "reference_value": 19139.791231082916, + "rel_diff": 0.3257051003310905, + "abs_diff_nats": 6233.927623235988, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 46: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 12905.386047434527, + "reference_value": 19139.565581617124, + "rel_diff": 0.32572210208210295, + "abs_diff_nats": 6234.179534182596, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 47: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 21569.14415015534, + "reference_value": 21569.144150185602, + "rel_diff": 1.402962839261681e-12, + "abs_diff_nats": 3.026070771738887e-08, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 47: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 15503.41944203166, + "reference_value": 15503.419442057915, + "rel_diff": 1.6935162690338578e-12, + "abs_diff_nats": 2.6255293050780892e-08, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 47: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 21569.14415015534, + "reference_value": 15503.41944203166, + "rel_diff": 0.39125076443966694, + "abs_diff_nats": 6065.724708123682, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 47: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 21569.144150185602, + "reference_value": 15503.419442057915, + "rel_diff": 0.3912507644392627, + "abs_diff_nats": 6065.724708127687, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 48: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 22377.520981646634, + "reference_value": 22376.16481042713, + "rel_diff": 6.060784906590474e-05, + "abs_diff_nats": 1.3561712195041764, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 48: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 27530.81447304739, + "reference_value": 27530.814473047278, + "rel_diff": 4.0964041630607165e-15, + "abs_diff_nats": 1.127773430198431e-10, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 48: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 22377.520981646634, + "reference_value": 27530.81447304739, + "rel_diff": 0.18718274740639512, + "abs_diff_nats": 5153.2934914007565, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 48: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 22376.16481042713, + "reference_value": 27530.814473047278, + "rel_diff": 0.18723200752620522, + "abs_diff_nats": 5154.649662620148, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 49: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 26250.951903968835, + "reference_value": 26250.951111653103, + "rel_diff": 3.0182362857811986e-08, + "abs_diff_nats": 0.0007923157318145968, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 49: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -177402.92031277675, + "reference_value": -177402.92016442568, + "rel_diff": 8.362380465041473e-10, + "abs_diff_nats": 0.00014835107140243053, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 49: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 26250.951903968835, + "reference_value": -177402.92031277675, + "rel_diff": 1.1479736176703639, + "abs_diff_nats": 203653.8722167456, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 49: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 26250.951111653103, + "reference_value": -177402.92016442568, + "rel_diff": 1.1479736133279115, + "abs_diff_nats": 203653.87127607877, + "within_rtol": false, + "status": "RECORDED" + } + ], + "lanes_failed": 36, + "arm_rows": { + "vmap": { + "arm": "vmap", + "program": "jax.jit(jax.vmap(fn))", + "stands_for": "Nautilus(use_jax_vmap=True) \u2014 Fitness._vmap", + "hlo_source": "jax.jit(jax.vmap(fn)).lower(batched_tree) \u2014 the exact current Fitness._vmap composition (PyAutoFit#1638)", + "batch_wall_ms": 1334.9125412998546, + "wall_production_nesting_ms": 1334.9125412998546, + "wall_aot_command_buffers_on_ms": 1332.8061320997222, + "wall_aot_command_buffers_off_ms": 1333.4006604000024, + "command_buffer_delta_ms": 0.5945283002802171, + "production_nesting_vs_aot_on_delta_ms": 2.1064092001324752, + "production_nesting_vs_aot_on_delta_pct": 0.15804318042970042, + "wall_per_lane_ms": 26.698250825997093, + "wall_per_lane_command_buffers_off_ms": 26.668013208000048, + "traced_batch_wall_ms": 1342.4494053000672, + "untraced_batch_wall_ms": 1329.844211100135, + "traced_wall_per_lane_ms": 26.848988106001343, + "callback_count_per_call": 50.0, + "callback_count_per_lane": 1.0, + "callback_expectation": "B per batched call \u2014 the qhull pure_callback is vmap_method='sequential'", + "host_qhull_ms": 223.70700989777106, + "host_tables_ms": 5.708653602778213, + "host_qhull_ms_per_lane": 4.474140197955421, + "host_tables_ms_per_lane": 0.11417307205556426, + "host_callback_probe": { + "calls": 500, + "qhull_ms_total": 2237.0700989777106, + "tables_ms_total": 57.08653602778213, + "total_ms_total": 2294.1566350054927, + "qhull_ms_mean": 4.474140197955421, + "tables_ms_mean": 0.11417307205556426, + "total_ms_mean": 4.588313270010985, + "non_finite_calls": 0, + "n_points": [ + 1500 + ] + }, + "host_callback_records_first": [ + { + "n_points": 1500, + "qhull_ms": 4.88928000049782, + "tables_ms": 0.186348996066954, + "total_ms": 5.075628996564774, + "finite": true + }, + { + "n_points": 1500, + "qhull_ms": 4.657602003135253, + "tables_ms": 0.12456999684218317, + "total_ms": 4.782171999977436, + "finite": true + }, + { + "n_points": 1500, + "qhull_ms": 4.5452519989339635, + "tables_ms": 0.12100900130462833, + "total_ms": 4.666261000238592, + "finite": true + }, + { + "n_points": 1500, + "qhull_ms": 4.65873099892633, + "tables_ms": 0.12900900037493557, + "total_ms": 4.787739999301266, + "finite": true + } + ], + "device_idle_ms": 259.9388730999999, + "device_idle_ms_per_lane": 5.198777461999998, + "trace": { + "parser": "ProfileData.from_file(xplane) + as_text() + stack_frame_index(proto field 17)", + "stage_audit": { + "mixed_fusion": [ + { + "instruction": "loop_divide_gather_fusion", + "ms": 54.75914680000001, + "opcode": "fusion", + "shape": "(f64[15361,50,1,1,1500]{4,3,2,1,0}, f64[15361,50,1,1,1500]{4,3,2,1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:133", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:133 (curvature_matrix_via_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:93 (InversionImagingMapping.curvature_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:389 (AbstractInversion.curvature_reg_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "input_multiply_transpose_fusion", + "ms": 21.536992, + "opcode": "fusion", + "shape": "(f64[50,1500,1500]{2,1,0}, f64[50,1500,1500]{2,1,0}, f64[50,1500,1500]{2,1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:237 (active_set_search)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:293 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:274 (_certified_positive_only_from)" + ] + }, + { + "instruction": "loop_broadcast_fusion.6", + "ms": 11.9395463, + "opcode": "fusion", + "shape": "f64[50,1500,180,180]{3,2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "input_reduce_fusion.9", + "ms": 6.1216112, + "opcode": "fusion", + "shape": "f64[92,50,1500]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/inversion_imaging_util.py:123", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/inversion_imaging_util.py:123 (data_vector_via_blurred_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:67 (InversionImagingMapping.data_vector)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:699 (AbstractInversion.reconstruction)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "loop_broadcast_fusion.8", + "ms": 5.620474099999999, + "opcode": "fusion", + "shape": "f64[15361,50,1500]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:353", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:353 (mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/abstract.py:283 (Mapper.mapping_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:91 (AbstractInversionImaging._mapping_matrix_for_convolution_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:137 (AbstractInversionImaging.operated_mapping_matrix_list)" + ] + }, + { + "instruction": "input_reduce_fusion.13", + "ms": 5.518662300000001, + "opcode": "fusion", + "shape": "f64[15361,50]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:163", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:163 (mapped_reconstructed_data_via_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:120 (InversionImagingMapping._mapped_reconstructed_data_dict_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:196 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + } + ], + "other": [ + { + "instruction": "copy.115", + "ms": 0.10156600000000023, + "opcode": "copy", + "shape": "s32[1,3000,3]{2,1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "copy.116", + "ms": 0.10070189999999998, + "opcode": "copy", + "shape": "s32[1,3000,3]{2,1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "copy.117", + "ms": 0.10015440000000012, + "opcode": "copy", + "shape": "f64[1,1500,2]{2,1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "copy.114", + "ms": 0.09921340000000048, + "opcode": "copy", + "shape": "s32[1,1500]{1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "copy.113", + "ms": 0.059130300000000045, + "opcode": "copy", + "shape": "f64[1,50,1024,2]{3,2,1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "copy.98", + "ms": 0.03652829999999997, + "opcode": "copy", + "shape": "s32[50]{0}", + "source": "", + "stack": [] + } + ], + "mesh_qhull_callback": [ + { + "instruction": "pure_callback.0", + "ms": 0.5381324000000005, + "opcode": "custom-call", + "shape": "(s32[3000,3]{1,0}, s32[3000,3]{1,0}, s32[1500]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:161", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:161 (_jax_delaunay_tables)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:405 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + }, + { + "instruction": "loop_add_fusion.1", + "ms": 0.07620239999999973, + "opcode": "fusion", + "shape": "s64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:161", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:161 (_jax_delaunay_tables)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:405 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + }, + { + "instruction": "loop_broadcast_fusion.2", + "ms": 0.0022304, + "opcode": "fusion", + "shape": "s32[50,1500]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:161", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:161 (_jax_delaunay_tables)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:405 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + } + ], + "border_relocator": [ + { + "instruction": "custom-call.2", + "ms": 0.04265949999999999, + "opcode": "custom-call", + "shape": "(f64[50,2,2]{2,1,0}, s8[4194304]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:242", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:242 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:454 (BorderRelocator.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:176 (AbstractMesh.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:214 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "loop_add_rsqrt_fusion", + "ms": 0.019699499999999998, + "opcode": "fusion", + "shape": "(f64[50,15361]{1,0}, f64[50,15361]{1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:311", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:311 (relocated_grid_via_ellipse_border_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:423 (BorderRelocator.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:83 (AbstractMesh.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:208 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "eigh.36", + "ms": 0.014841999999999998, + "opcode": "custom-call", + "shape": "(f64[50,2,2]{1,2,0}, f64[50,2]{1,0}, s32[50]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:245", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:245 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:454 (BorderRelocator.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:176 (AbstractMesh.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:214 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "loop_add_rsqrt_fusion.1", + "ms": 0.0039392, + "opcode": "fusion", + "shape": "(f64[50,1500]{1,0}, f64[50,1500]{1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:311", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:311 (relocated_grid_via_ellipse_border_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:458 (BorderRelocator.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:176 (AbstractMesh.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:214 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "input_reduce_fusion.14", + "ms": 0.003376, + "opcode": "fusion", + "shape": "f64[50]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:270", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:270 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:454 (BorderRelocator.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:176 (AbstractMesh.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:214 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "input_reduce_fusion.15", + "ms": 0.0033567999999999996, + "opcode": "fusion", + "shape": "f64[50]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:269", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:269 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:454 (BorderRelocator.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:176 (AbstractMesh.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:214 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + } + ], + "mesh_construction": [ + { + "instruction": "loop_compare_fusion.4", + "ms": 0.0112992, + "opcode": "fusion", + "shape": "pred[50,15361,3]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:732", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:732 (DelaunayInterface.sizes)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:958 (InterpolatorDelaunay._mappings_sizes_weights)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/abstract.py:36 (AbstractInterpolator.mappings)" + ] + }, + { + "instruction": "loop_compare_fusion.5", + "ms": 0.006803299999999999, + "opcode": "fusion", + "shape": "pred[50,6000,3]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:736", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:736 (DelaunayInterface.splitted_sizes)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:997 (InterpolatorDelaunay._mappings_sizes_weights_split)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt_split.py:124 (AdaptSplit.regularization_matrix_from)" + ] + }, + { + "instruction": "loop_multiply_fusion.2", + "ms": 0.0027967999999999995, + "opcode": "fusion", + "shape": "f64[50,1500]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:412", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:412 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "input_concatenate_fusion.9", + "ms": 0.0026976, + "opcode": "fusion", + "shape": "f64[50,1500,2]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:820", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:820 (InterpolatorDelaunay.mesh_grid_xy)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:847 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + } + ], + "mesh_seed_argmin": [ + { + "instruction": "input_reduce_fusion", + "ms": 3.950360199999995, + "opcode": "fusion", + "shape": "(f64[50,1024]{1,0}, s64[50,1024]{1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:191", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:191 (_nearest_vertex_seed_from..argmin_chunk)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204 (_nearest_vertex_seed_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:351 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)" + ] + }, + { + "instruction": "loop_dynamic_update_slice_fusion", + "ms": 0.05106299999999988, + "opcode": "fusion", + "shape": "s32[21,50,1024]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204 (_nearest_vertex_seed_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:351 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "loop_add_fusion", + "ms": 0.031811399999999906, + "opcode": "fusion", + "shape": "s64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204 (_nearest_vertex_seed_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:351 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "loop_broadcast_fusion.3", + "ms": 0.003980900000000001, + "opcode": "fusion", + "shape": "s32[21,50,1024]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204 (_nearest_vertex_seed_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:351 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "pdip_solve": [ + { + "instruction": "cholesky.55", + "ms": 217.241369999995, + "opcode": "custom-call", + "shape": "(f64[50,1500,1500]{1,2,0}, s32[50]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:252 (active_set_search..body_fun)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:262 (active_set_search)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:293 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)" + ] + }, + { + "instruction": "input_transpose_fusion", + "ms": 36.933220499999976, + "opcode": "fusion", + "shape": "f64[50,1500,1500]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:252 (active_set_search..body_fun)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:262 (active_set_search)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:293 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)" + ] + }, + { + "instruction": "triangular-solve", + "ms": 32.42111720000004, + "opcode": "custom-call", + "shape": "(f64[50,1500,1]{1,2,0}, s8[800]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:154", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:154 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:252 (active_set_search..body_fun)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:262 (active_set_search)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:293 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)" + ] + }, + { + "instruction": "triangular-solve.1", + "ms": 31.591372300000064, + "opcode": "custom-call", + "shape": "(f64[50,1500,1]{1,2,0}, s8[800]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:154", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:154 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:252 (active_set_search..body_fun)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:262 (active_set_search)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:293 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)" + ] + }, + { + "instruction": "input_transpose_fusion.1", + "ms": 23.4356358, + "opcode": "fusion", + "shape": "f64[50,1500,1500]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:252 (active_set_search..body_fun)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:262 (active_set_search)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:293 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)" + ] + }, + { + "instruction": "cholesky.66", + "ms": 14.091648100000036, + "opcode": "custom-call", + "shape": "(f64[50,1500,1500]{1,2,0}, s32[50]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:237 (active_set_search)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:293 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:274 (_certified_positive_only_from)" + ] + } + ], + "mesh_dual_areas": [ + { + "instruction": "input_scatter_fusion.9", + "ms": 0.005084800000000001, + "opcode": "fusion", + "shape": "f64[50,1500]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:393", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:393 (_dual_areas_padded_jnp)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:408 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + }, + { + "instruction": "input_scatter_fusion.7", + "ms": 0.005059200000000001, + "opcode": "fusion", + "shape": "f64[50,1500]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:393", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:393 (_dual_areas_padded_jnp)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:408 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + } + ], + "mesh_locate_walk": [ + { + "instruction": "loop_reduce_fusion", + "ms": 0.5925718000000001, + "opcode": "fusion", + "shape": "(f64[50,21361]{1,0}, s64[50,21361]{1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:264", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:264 (_walk_from_seed..walk_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:292 (_walk_from_seed..body)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:264 (_walk_from_seed..walk_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:292 (_walk_from_seed..body)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)" + ] + }, + { + "instruction": "loop_slice_subtract_fusion", + "ms": 0.5085898, + "opcode": "fusion", + "shape": "(f64[50,21361,1]{2,1,0}, f64[50,21361,1]{2,1,0}, f64[50,21361,1]{2,1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:236", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:236 (_walk_from_seed..cross)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:250 (_walk_from_seed..weights_of)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:262 (_walk_from_seed..walk_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:292 (_walk_from_seed..body)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)" + ] + }, + { + "instruction": "loop_select_fusion", + "ms": 0.24081800000000012, + "opcode": "fusion", + "shape": "(pred[50,21361]{1,0}, pred[50,21361]{1,0}, s32[50,21361]{1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:353 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "loop_gather_fusion.1", + "ms": 0.1629683, + "opcode": "fusion", + "shape": "s32[1068050,1,1,3]{3,2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:239", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:239 (_walk_from_seed..weights_of)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:262 (_walk_from_seed..walk_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:292 (_walk_from_seed..body)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:353 (pix_indexes_delaunay_walk_from)" + ] + }, + { + "instruction": "loop_gather_fusion", + "ms": 0.14474369999999998, + "opcode": "fusion", + "shape": "s32[1068050,1,1,1]{3,2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:267", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:267 (_walk_from_seed..walk_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:292 (_walk_from_seed..body)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:353 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)" + ] + }, + { + "instruction": "input_concatenate_fusion", + "ms": 0.08595939999999998, + "opcode": "fusion", + "shape": "s32[50,21361,2]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:242", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:242 (_walk_from_seed..weights_of)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:262 (_walk_from_seed..walk_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:292 (_walk_from_seed..body)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:353 (pix_indexes_delaunay_walk_from)" + ] + } + ], + "mapping_matrix": [ + { + "instruction": "input_scatter_fusion.3", + "ms": 0.1373578, + "opcode": "fusion", + "shape": "f64[50,1500]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:71", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:71 (adaptive_pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/abstract.py:507 (Mapper.pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt.py:339 (Adapt.regularization_weights_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt_split.py:120 (AdaptSplit.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)" + ] + }, + { + "instruction": "input_reduce_fusion.36", + "ms": 0.0038560999999999995, + "opcode": "fusion", + "shape": "f64[50]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:93", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:93 (adaptive_pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/abstract.py:507 (Mapper.pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt.py:339 (Adapt.regularization_weights_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt_split.py:120 (AdaptSplit.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)" + ] + }, + { + "instruction": "loop_and_fusion.2", + "ms": 0.0020832, + "opcode": "fusion", + "shape": "pred[46083,1]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:338", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:338 (mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/abstract.py:283 (Mapper.mapping_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:91 (AbstractInversionImaging._mapping_matrix_for_convolution_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:137 (AbstractInversionImaging.operated_mapping_matrix_list)" + ] + } + ], + "psf_convolution_mapping_matrix": [ + { + "instruction": "input_scatter_fusion", + "ms": 100.85494529999998, + "opcode": "fusion", + "shape": "f64[50,1500,180,180]{3,2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "fft.25.0", + "ms": 76.3697391, + "opcode": "fft", + "shape": "c128[50,1500,180,91]{3,2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "fft.27.0", + "ms": 48.955093899999994, + "opcode": "fft", + "shape": "c128[50,1500,91,180]{3,2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "fft.29.0", + "ms": 47.2849958, + "opcode": "fft", + "shape": "f64[50,1500,180,180]{3,2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "input_transpose_fusion.3", + "ms": 26.3531131, + "opcode": "fusion", + "shape": "c128[50,1500,91,180]{3,2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "wrapped_transpose", + "ms": 24.7378321, + "opcode": "fusion", + "shape": "c128[50,1500,180,91]{3,2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + } + ], + "regularization_H": [ + { + "instruction": "input_scatter_fusion.10", + "ms": 0.0088224, + "opcode": "fusion", + "shape": "f64[50,1500,1500]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:615", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:615 (pixel_splitted_regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt_split.py:137 (AdaptSplit.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:332 (AbstractInversion.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "curvature_matrix_F": [ + { + "instruction": "cublas-lt-matmul.2", + "ms": 219.5750235, + "opcode": "custom-call", + "shape": "(f64[50,1500,1500]{2,1,0}, s8[4194304]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:134", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:134 (curvature_matrix_via_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:93 (InversionImagingMapping.curvature_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:389 (AbstractInversion.curvature_reg_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "inversion_other": [ + { + "instruction": "cholesky.88", + "ms": 14.479554699999975, + "opcode": "custom-call", + "shape": "(f64[50,1500,1500]{1,2,0}, s32[50]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986 (AbstractInversion._log_det_symmetric_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:1078 (AbstractInversion.log_det_curvature_reg_matrix_term)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:347 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/model/analysis.py:135 (AnalysisImaging.log_likelihood_function)" + ] + }, + { + "instruction": "cholesky.99", + "ms": 14.26143789999999, + "opcode": "custom-call", + "shape": "(f64[50,1500,1500]{1,2,0}, s32[50]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986 (AbstractInversion._log_det_symmetric_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:1157 (AbstractInversion.log_det_regularization_matrix_term)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:348 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/model/analysis.py:135 (AnalysisImaging.log_likelihood_function)" + ] + }, + { + "instruction": "loop_reduce_window_fusion", + "ms": 0.0033888, + "opcode": "fusion", + "shape": "s64[94,16]{1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "loop_broadcast_convert_fusion", + "ms": 0.002659199999999999, + "opcode": "fusion", + "shape": "(s32[1500]{0}, s64[1500]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:527", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:527 (AbstractInversion.zeroed_ids_to_keep)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:567 (AbstractInversion.solve_ids_to_keep)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:684 (AbstractInversion.reconstruction)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "input_scatter_fusion.5", + "ms": 0.0023583999999999996, + "opcode": "fusion", + "shape": "s64[1500]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:527", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:527 (AbstractInversion.zeroed_ids_to_keep)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:567 (AbstractInversion.solve_ids_to_keep)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:684 (AbstractInversion.reconstruction)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "loop_reduce_window_fusion.1", + "ms": 0.0023169, + "opcode": "fusion", + "shape": "s64[6,16]{1,0}", + "source": "", + "stack": [] + } + ] + }, + "stage_audit_note": "The HLO instructions that contributed most of each stage's milliseconds, with their full source stack. A stage row is only as good as the rules that built it; this is how a reader checks a row against the HLO instead of trusting it.", + "untraced_wall_ms": 1329.844211100135, + "reconciliation_vs_untraced_pct": 0.9099189889207662, + "wall_basis": "wall_ms is the TRACED run's wall, the run these kernel durations came from. untraced_wall_ms is the same executable without the profiler; the difference is the profiler's overhead and belongs in neither the stages nor the idle row.", + "calls": 10, + "call_split": "per-call (first-instruction recurrence)", + "call_blocks": 10, + "events": 101430, + "streams": [ + "Stream #14(MemcpyH2D,MemcpyD2H,Compute,MemcpyD2D)" + ], + "per_stage_ms": { + "border_relocator": { + "median_ms": 0.099313, + "min_ms": 0.09849699999999999, + "max_ms": 0.100256 + }, + "curvature_matrix_F": { + "median_ms": 219.634905, + "min_ms": 217.514839, + "max_ms": 220.758291 + }, + "inversion_other": { + "median_ms": 28.571857, + "min_ms": 28.316461999999987, + "max_ms": 30.690052999999974 + }, + "mapping_matrix": { + "median_ms": 0.1430735, + "min_ms": 0.14041700000000001, + "max_ms": 0.14700899999999997 + }, + "mesh_construction": { + "median_ms": 0.023119999999999998, + "min_ms": 0.022975999999999996, + "max_ms": 0.025728 + }, + "mesh_dual_areas": { + "median_ms": 0.010144, + "min_ms": 0.010048, + "max_ms": 0.010239999999999999 + }, + "mesh_locate_walk": { + "median_ms": 2.0298245, + "min_ms": 2.014867000000001, + "max_ms": 2.0363409999999997 + }, + "mesh_qhull_callback": { + "median_ms": 0.6168999999999991, + "min_ms": 0.6143399999999996, + "max_ms": 0.6185009999999994 + }, + "mesh_seed_argmin": { + "median_ms": 4.0332535000000025, + "min_ms": 4.032807000000002, + "max_ms": 4.044314000000003 + }, + "mixed_fusion": { + "median_ms": 111.22495350000003, + "min_ms": 110.48761100000004, + "max_ms": 111.87065000000001 + }, + "other": { + "median_ms": 0.5779875000000003, + "min_ms": 0.575557, + "max_ms": 0.5789170000000003 + }, + "pdip_solve": { + "median_ms": 390.49103849999887, + "min_ms": 389.5909619999995, + "max_ms": 392.1310309999969 + }, + "psf_convolution_mapping_matrix": { + "median_ms": 324.54059299999994, + "min_ms": 324.42048200000005, + "max_ms": 324.7382269999999 + }, + "regularization_H": { + "median_ms": 0.008879999999999999, + "min_ms": 0.008448, + "max_ms": 0.00912 + } + }, + "stage_order": [ + "border_relocator", + "mesh_qhull_callback", + "mesh_seed_argmin", + "mesh_locate_walk", + "mesh_dual_areas", + "mesh_construction", + "mapping_matrix", + "psf_convolution_mapping_matrix", + "curvature_matrix_F", + "regularization_H", + "pdip_solve", + "inversion_other", + "mixed_fusion", + "other" + ], + "mixed_fusion": { + "ms": 111.22495350000003, + "constituent_stage_sets": { + "curvature_matrix_F + psf_convolution_mapping_matrix": 54.75914680000001, + "curvature_reg_reduce_gather + inversion_other + mapped_reconstruction + pdip_solve + reconstruction_scatter": 21.536992, + "pdip_solve + psf_convolution_mapping_matrix": 11.9395463, + "data_vector_D + pdip_solve": 6.164443600000001, + "mapping_matrix + pdip_solve": 5.624442099999999, + "mapped_reconstruction + pdip_solve": 5.518662300000001, + "pdip_solve + regularization_H": 2.3664717, + "inversion_other + pdip_solve + regularization_H": 1.465763, + "inversion_other + pdip_solve": 0.5502348, + "inversion_other + regularization_H": 0.44380549999999996, + "inversion_other + mapping_matrix + mesh_construction + mesh_interpolation_weights + pdip_solve": 0.2030258, + "mapping_matrix + mesh_interpolation_weights + pdip_solve": 0.1657071, + "inversion_other + mesh_construction + mesh_dual_areas + mesh_interpolation_weights + pdip_solve + regularization_H": 0.0623717, + "inversion_other + mesh_construction + mesh_dual_areas + mesh_interpolation_weights": 0.05656370000000001, + "inversion_other + mesh_construction + mesh_interpolation_weights": 0.05577629999999999, + "mesh_dual_areas + mesh_interpolation_weights": 0.0441669, + "grids_and_structures + mass_profile_deflections + ray_trace_data_grid": 0.037516900000000006, + "grids_and_structures + mass_profile_deflections + pdip_solve + ray_trace_data_grid": 0.032778, + "mesh_construction + pdip_solve + regularization_H": 0.029753999999999996, + "inversion_other + mapping_matrix + mesh_construction + mesh_interpolation_weights": 0.029260900000000003, + "border_relocator + pdip_solve": 0.024499400000000005, + "mesh_construction + mesh_seed_argmin + pdip_solve + regularization_H": 0.0222371, + "mesh_locate_walk + mesh_seed_argmin": 0.0186242, + "chi_squared_evidence + pdip_solve": 0.016540899999999997, + "pdip_solve + ray_trace_data_grid": 0.013324899999999994, + "inversion_other + mesh_dual_areas + mesh_locate_walk": 0.012966600000000002, + "inversion_other + mapped_reconstruction + reconstruction_scatter + regularization_H": 0.0124416, + "inversion_other + mapped_reconstruction": 0.011961699999999999, + "mesh_construction + mesh_dual_areas + mesh_interpolation_weights + pdip_solve + regularization_H": 0.0116451, + "inversion_other + mapped_reconstruction + reconstruction_scatter": 0.009727999999999999, + "inversion_other + mesh_locate_walk + mesh_seed_argmin": 0.0066175999999999995, + "mapping_matrix + pdip_solve + regularization_H": 0.005571199999999999, + "inversion_other + mesh_dual_areas + mesh_locate_walk + pdip_solve": 0.0055072, + "grids_and_structures + mass_profile_deflections + pdip_solve": 0.005296100000000001, + "inversion_other + pdip_solve + ray_trace_data_grid": 0.004816099999999998, + "inversion_other + mesh_construction + mesh_interpolation_weights + regularization_H": 0.0045152000000000005, + "inversion_other + mesh_interpolation_weights": 0.0044192, + "inversion_other + mesh_construction + regularization_H": 0.0039136, + "inversion_other + mapping_matrix": 0.0028448, + "chi_squared_evidence + inversion_other": 0.0023104 + }, + "example_kernels": { + "curvature_matrix_F + psf_convolution_mapping_matrix": [ + "loop_divide_gather_fusion" + ], + "curvature_reg_reduce_gather + inversion_other + mapped_reconstruction + pdip_solve + reconstruction_scatter": [ + "input_multiply_transpose_fusion" + ], + "pdip_solve + psf_convolution_mapping_matrix": [ + "loop_broadcast_fusion.6" + ], + "data_vector_D + pdip_solve": [ + "input_reduce_fusion.9", + "input_reduce_fusion.34" + ], + "mapping_matrix + pdip_solve": [ + "loop_broadcast_fusion.8", + "loop_divide_fusion" + ], + "mapped_reconstruction + pdip_solve": [ + "input_reduce_fusion.13" + ], + "pdip_solve + regularization_H": [ + "loop_broadcast_fusion", + "input_transpose_fusion.4" + ], + "inversion_other + pdip_solve + regularization_H": [ + "input_reduce_fusion.32", + "input_transpose_fusion.5", + "loop_log_fusion" + ], + "inversion_other + pdip_solve": [ + "input_reduce_fusion.11", + "input_reduce_fusion.12", + "input_transpose_fusion.2", + "input_reduce_fusion.17" + ], + "inversion_other + regularization_H": [ + "input_reduce_fusion.31", + "input_reduce_fusion.24", + "input_reduce_fusion.25", + "input_reduce_fusion.26" + ] + }, + "prorated_estimate_ms": { + "psf_convolution_mapping_matrix": 33.34934655000001, + "curvature_matrix_F": 27.379573400000005, + "pdip_solve": 21.043910605, + "mapped_reconstruction": 7.079063466666668, + "inversion_other": 5.4131195933333345, + "reconstruction_scatter": 4.313751466666667, + "curvature_reg_reduce_gather": 4.3073984, + "data_vector_D": 3.0822218000000006, + "mapping_matrix": 2.918656601666666, + "regularization_H": 1.9293286449999998, + "mesh_interpolation_weights": 0.17403526333333336, + "mesh_construction": 0.11128832166666666, + "mesh_dual_areas": 0.05464767833333333, + "ray_trace_data_grid": 0.02896795, + "grids_and_structures": 0.022465500000000003, + "mass_profile_deflections": 0.022465500000000003, + "mesh_locate_walk": 0.017216966666666667, + "mesh_seed_argmin": 0.017077241666666666, + "border_relocator": 0.012249700000000002, + "chi_squared_evidence": 0.009425649999999999 + }, + "prorated_note": "ESTIMATE ONLY \u2014 a mixed fusion's time split equally across the stages its constituents span. Never summed into the measured table, never reconciled." + }, + "other_sources_ms": { + "copy.115": 0.10156600000000023, + "copy.116": 0.10070189999999998, + "copy.117": 0.10015440000000012, + "copy.114": 0.09921340000000048, + "copy.113": 0.059130300000000045, + "copy.98": 0.03652829999999997, + "copy.99": 0.03509779999999996, + "copy.97": 0.03311080000000003, + "loop_broadcast_fusion.1": 0.0037279999999999995, + "copy.89": 0.0024384, + "copy.112": 0.0024352, + "copy.50": 0.0021792, + "loop_broadcast_fusion.4": 0.0013088000000000002 + }, + "device_span_ms": 1342.3429282, + "device_busy_ms": 1082.4040551, + "device_idle_ms": 259.9388730999999, + "largest_idle_gaps": [ + { + "gap_ms": 5.848614, + "after": "pure_callback.0", + "before": "pure_callback.0" + }, + { + "gap_ms": 5.357572, + "after": "pure_callback.0", + "before": "pure_callback.0" + }, + { + "gap_ms": 5.337795, + "after": "pure_callback.0", + "before": "pure_callback.0" + }, + { + "gap_ms": 5.263331, + "after": "pure_callback.0", + "before": "pure_callback.0" + }, + { + "gap_ms": 5.254851, + "after": "pure_callback.0", + "before": "pure_callback.0" + }, + { + "gap_ms": 5.194178, + "after": "pure_callback.0", + "before": "pure_callback.0" + }, + { + "gap_ms": 5.168002, + "after": "pure_callback.0", + "before": "pure_callback.0" + }, + { + "gap_ms": 5.147906, + "after": "pure_callback.0", + "before": "pure_callback.0" + } + ], + "kernel_ms": 1082.0058429999988, + "sum_ms": 1341.9447160999987, + "wall_ms": 1342.4494053000672, + "host_outside_span_ms": 0.10647710006719535, + "reconciliation_pct": -0.03759465333113691, + "unjoined_ms": 0.0, + "unjoined_pct": 0.0, + "other_ms": 0.5779875000000003, + "other_pct": 0.04305469522486826, + "note": "Stage rows attribute the command-buffers-OFF program (see the module docstring): kernel times are the same, the launch overhead the CUDA graphs remove is not. sum_ms = kernel rows + device_idle_ms; the residual against wall_ms is host_outside_span_ms (dispatch before the first kernel, teardown after the last).", + "per_stage_ms_per_lane": { + "border_relocator": 0.00198626, + "curvature_matrix_F": 4.3926981000000005, + "inversion_other": 0.57143714, + "mapping_matrix": 0.0028614699999999996, + "mesh_construction": 0.00046239999999999996, + "mesh_dual_areas": 0.00020288, + "mesh_locate_walk": 0.040596490000000006, + "mesh_qhull_callback": 0.012337999999999983, + "mesh_seed_argmin": 0.08066507000000005, + "mixed_fusion": 2.2244990700000007, + "other": 0.011559750000000006, + "pdip_solve": 7.809820769999977, + "psf_convolution_mapping_matrix": 6.490811859999999, + "regularization_H": 0.00017759999999999998 + }, + "per_lane_divisor": 50, + "host_callback": { + "pure_callback_span_ms": 263.37043920000013, + "qhull_ms": 229.85580340000004, + "callback_body_ms_note": "the OUTERMOST matching body event, not a sum: under the probe the body appears twice (the wrapper and the timed re-implementation it calls) and summing them would count the same work twice", + "events_by_name": { + "pure_callback.0": { + "count": 500, + "ms": 263.37043920000013 + }, + "$callback.py:815 _wrapped_callback": { + "count": 500, + "ms": 241.89058669999986 + }, + "$callback.py:224 _callback": { + "count": 500, + "ms": 240.73032149999975 + }, + "$callback.py:74 pure_callback_impl": { + "count": 500, + "ms": 240.29741289999978 + }, + "$callback.py:69 __call__": { + "count": 500, + "ms": 230.60628719999988 + }, + "$delaunay.py:162 ": { + "count": 500, + "ms": 230.2918285 + }, + "$host_callback_probe.py:225 wrapped": { + "count": 500, + "ms": 229.85580340000004 + }, + "$host_callback_probe.py:160 _timed_tri_only": { + "count": 500, + "ms": 229.47494829999997 + }, + "$callback.py:822 ": { + "count": 2000, + "ms": 0.7166660000000005 + }, + "ThenExecuteCallback:GetEventForComputeStreamSyncPoint": { + "count": 10, + "ms": 0.0254457 + }, + "$__init__.py:132 _xla_gc_callback": { + "count": 6, + "ms": 0.001897 + } + }, + "note": "HOST milliseconds per traced BATCH (the whole invocation), aggregated by name because the events nest. Not a row of the device table: the device pays for them as the idle gaps largest_idle_gaps names." + }, + "host_callback_ms": 263.37043920000013 + }, + "hlo_census": { + "status": "excluded", + "reason": "The legacy census anchors PyAutoArray source line numbers that moved after the phase-1 run. No batched attribution is published from unsupported anchors; the device-event table and wall reconciliation remain valid." + }, + "trace_split": { + "expected_calls": 10, + "executions_per_invocation": 1, + "method": "per-call (first-instruction recurrence)", + "note": "DECIDED IN CODE: the scalar arm's trace is split by trace_calls * B, so every lane's execution is its own block and the per-stage median is taken over all of them. The vmap arm's is split by trace_calls, one block per batched execution, and per_stage_ms_per_lane divides those rows by B." + } + }, + "scalar": { + "arm": "scalar", + "program": "jax.jit(fn), called B times", + "stands_for": "Nautilus(use_jax_vmap=False, use_jax_jit=True). Plain use_jax_vmap=False is UNJITTED and is NOT this arm", + "hlo_source": "jax.jit(fn).lower(lane_trees[0]) \u2014 the same program phase 1 traced", + "batch_wall_ms": 1715.0854983003228, + "wall_production_nesting_ms": 1715.0854983003228, + "wall_aot_command_buffers_on_ms": 1714.8924133998662, + "wall_aot_command_buffers_off_ms": 1727.6137147000554, + "command_buffer_delta_ms": 12.721301300189225, + "production_nesting_vs_aot_on_delta_ms": 0.1930849004565971, + "production_nesting_vs_aot_on_delta_pct": 0.011259301105297674, + "wall_per_lane_ms": 34.301709966006456, + "wall_per_lane_command_buffers_off_ms": 34.55227429400111, + "traced_batch_wall_ms": 1781.8852099997457, + "untraced_batch_wall_ms": 1729.353525100305, + "traced_wall_per_lane_ms": 35.637704199994914, + "callback_count_per_call": 50.0, + "callback_count_per_lane": 1.0, + "callback_expectation": "1 per likelihood evaluation, B per batch", + "host_qhull_ms": 232.65888820424152, + "host_tables_ms": 5.876008098493912, + "host_qhull_ms_per_lane": 4.65317776408483, + "host_tables_ms_per_lane": 0.11752016196987825, + "host_callback_probe": { + "calls": 500, + "qhull_ms_total": 2326.588882042415, + "tables_ms_total": 58.76008098493912, + "total_ms_total": 2385.3489630273543, + "qhull_ms_mean": 4.65317776408483, + "tables_ms_mean": 0.11752016196987825, + "total_ms_mean": 4.770697926054709, + "non_finite_calls": 0, + "n_points": [ + 1500 + ] + }, + "host_callback_records_first": [ + { + "n_points": 1500, + "qhull_ms": 4.853190999710932, + "tables_ms": 0.20850799774052575, + "total_ms": 5.061698997451458, + "finite": true + }, + { + "n_points": 1500, + "qhull_ms": 4.765050998685183, + "tables_ms": 0.1315000008617062, + "total_ms": 4.896550999546889, + "finite": true + }, + { + "n_points": 1500, + "qhull_ms": 4.717492000054335, + "tables_ms": 0.11971899948548526, + "total_ms": 4.8372109995398205, + "finite": true + }, + { + "n_points": 1500, + "qhull_ms": 4.774879998876713, + "tables_ms": 0.11689999882946722, + "total_ms": 4.89177999770618, + "finite": true + } + ], + "device_idle_ms": 6.74625022, + "device_idle_ms_per_lane": 6.74625022, + "trace": { + "parser": "ProfileData.from_file(xplane) + as_text() + stack_frame_index(proto field 17)", + "stage_audit": { + "mixed_fusion": [ + { + "instruction": "loop_divide_gather_fusion", + "ms": 1.0175930819999996, + "opcode": "fusion", + "shape": "(f64[15361,1,1,1500]{3,2,1,0}, f64[15361,1,1,1500]{3,2,1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:133", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:133 (curvature_matrix_via_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:93 (InversionImagingMapping.curvature_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:389 (AbstractInversion.curvature_reg_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "loop_broadcast_fusion.4", + "ms": 0.22712514000000011, + "opcode": "fusion", + "shape": "f64[1500,180,180]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "input_reduce_fusion.5", + "ms": 0.12176276800000001, + "opcode": "fusion", + "shape": "f64[92,1500]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/inversion_imaging_util.py:123", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/inversion_imaging_util.py:123 (data_vector_via_blurred_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:67 (InversionImagingMapping.data_vector)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:699 (AbstractInversion.reconstruction)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "input_reduce_fusion.9", + "ms": 0.11505236400000013, + "opcode": "fusion", + "shape": "f64[15361]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:163", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:163 (mapped_reconstructed_data_via_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:120 (InversionImagingMapping._mapped_reconstructed_data_dict_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:196 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "loop_broadcast_fusion.2", + "ms": 0.11096660999999992, + "opcode": "fusion", + "shape": "f64[15361,1500]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:342", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:342 (mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/abstract.py:283 (Mapper.mapping_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:91 (AbstractInversionImaging._mapping_matrix_for_convolution_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:137 (AbstractInversionImaging.operated_mapping_matrix_list)" + ] + }, + { + "instruction": "input_multiply_transpose_fusion", + "ms": 0.10992808600000005, + "opcode": "fusion", + "shape": "(f64[1500,1500]{1,0}, f64[1500,1500]{1,0}, f64[1500,1500]{1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:237 (active_set_search)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:293 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:274 (_certified_positive_only_from)" + ] + } + ], + "border_relocator": [ + { + "instruction": "eigh.45", + "ms": 0.07479145000000191, + "opcode": "custom-call", + "shape": "(f64[2,2]{0,1}, f64[2]{0}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:245", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:245 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:454 (BorderRelocator.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:176 (AbstractMesh.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:214 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "custom-call.2", + "ms": 0.007953370000000022, + "opcode": "custom-call", + "shape": "(f64[2,2]{1,0}, s8[4194304]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:242", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:242 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:454 (BorderRelocator.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:176 (AbstractMesh.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:214 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "input_reduce_fusion.10", + "ms": 0.005808486000000006, + "opcode": "fusion", + "shape": "(f64[], f64[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:269", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:269 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:454 (BorderRelocator.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:176 (AbstractMesh.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:214 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "loop_add_fusion.3", + "ms": 0.003513809999999997, + "opcode": "fusion", + "shape": "f64[15361]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:308", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:308 (relocated_grid_via_ellipse_border_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:423 (BorderRelocator.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:83 (AbstractMesh.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:208 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "loop_add_fusion.5", + "ms": 0.0034463339999999927, + "opcode": "fusion", + "shape": "f64[1500]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:308", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:308 (relocated_grid_via_ellipse_border_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:458 (BorderRelocator.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:176 (AbstractMesh.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:214 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "input_concatenate_fusion.12", + "ms": 0.0024006459999999937, + "opcode": "fusion", + "shape": "f64[392,2]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:238", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:238 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:454 (BorderRelocator.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:176 (AbstractMesh.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:214 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + } + ], + "mesh_construction": [ + { + "instruction": "input_concatenate_fusion.7", + "ms": 0.00206010400000001, + "opcode": "fusion", + "shape": "f64[1500,2]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:820", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:820 (InterpolatorDelaunay.mesh_grid_xy)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:847 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + } + ], + "mesh_qhull_callback": [ + { + "instruction": "pure_callback.4", + "ms": 0.010668695999999964, + "opcode": "custom-call", + "shape": "(s32[3000,3]{1,0}, s32[3000,3]{1,0}, s32[1500]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:161", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:161 (_jax_delaunay_tables)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:405 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + } + ], + "other": [ + { + "instruction": "copy.80", + "ms": 0.042013890000002906, + "opcode": "copy", + "shape": "f64[1,1024,2]{2,1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "copy.48", + "ms": 0.01694752399999989, + "opcode": "copy", + "shape": "s32[21361]{0}", + "source": "", + "stack": [] + }, + { + "instruction": "copy.53", + "ms": 0.0020209240000000064, + "opcode": "copy", + "shape": "s64[1500]{0}", + "source": "", + "stack": [] + }, + { + "instruction": "copy.39", + "ms": 0.0016531839999999976, + "opcode": "copy", + "shape": "s32[]", + "source": "", + "stack": [] + }, + { + "instruction": "copy.78", + "ms": 0.001652293999999998, + "opcode": "copy", + "shape": "s64[]", + "source": "", + "stack": [] + }, + { + "instruction": "copy.79", + "ms": 0.0016482640000000034, + "opcode": "copy", + "shape": "s32[]", + "source": "", + "stack": [] + } + ], + "mesh_seed_argmin": [ + { + "instruction": "input_reduce_fusion", + "ms": 0.15265030800001345, + "opcode": "fusion", + "shape": "(f64[1024]{0}, s64[1024]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:191", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:191 (_nearest_vertex_seed_from..argmin_chunk)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204 (_nearest_vertex_seed_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:351 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)" + ] + }, + { + "instruction": "loop_dynamic_update_slice_fusion", + "ms": 0.04134029799999785, + "opcode": "fusion", + "shape": "s32[21,1024]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204 (_nearest_vertex_seed_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:351 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "loop_add_fusion", + "ms": 0.03189977599999631, + "opcode": "fusion", + "shape": "s64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204 (_nearest_vertex_seed_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:351 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "loop_broadcast_fusion", + "ms": 0.0019563560000000224, + "opcode": "fusion", + "shape": "s32[21,1024]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204 (_nearest_vertex_seed_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:351 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "pdip_solve": [ + { + "instruction": "cholesky.50", + "ms": 7.369648399999985, + "opcode": "custom-call", + "shape": "(f64[1500,1500]{0,1}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:252 (active_set_search..body_fun)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:262 (active_set_search)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:293 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)" + ] + }, + { + "instruction": "triangular-solve.1", + "ms": 1.3328387779999877, + "opcode": "custom-call", + "shape": "(f64[1500,1]{0,1}, s8[0]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:154", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:154 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:252 (active_set_search..body_fun)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:262 (active_set_search)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:293 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)" + ] + }, + { + "instruction": "triangular-solve", + "ms": 1.1379613320000173, + "opcode": "custom-call", + "shape": "(f64[1500,1]{0,1}, s8[0]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:154", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:154 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:252 (active_set_search..body_fun)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:262 (active_set_search)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:293 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)" + ] + }, + { + "instruction": "cholesky.70", + "ms": 0.8937893680000013, + "opcode": "custom-call", + "shape": "(f64[1500,1500]{0,1}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:297 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:274 (_certified_positive_only_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:496 (reconstruction_positive_only_from)" + ] + }, + { + "instruction": "cholesky.60", + "ms": 0.8653709439999951, + "opcode": "custom-call", + "shape": "(f64[1500,1500]{0,1}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:237 (active_set_search)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:293 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:274 (_certified_positive_only_from)" + ] + }, + { + "instruction": "input_transpose_fusion", + "ms": 0.2912085159999993, + "opcode": "fusion", + "shape": "f64[1500,1500]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:252 (active_set_search..body_fun)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:262 (active_set_search)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:293 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)" + ] + } + ], + "regularization_H": [ + { + "instruction": "input_scatter_fusion.10", + "ms": 0.002067654000000009, + "opcode": "fusion", + "shape": "f64[1500,1500]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:615", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:615 (pixel_splitted_regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt_split.py:137 (AdaptSplit.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:332 (AbstractInversion.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "input_concatenate_fusion.9", + "ms": 0.0018498079999999884, + "opcode": "fusion", + "shape": "pred[3]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:91", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:91 (split_points_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:410 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + }, + { + "instruction": "input_concatenate_fusion.8", + "ms": 0.0018417339999999905, + "opcode": "fusion", + "shape": "pred[3]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:93", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:93 (split_points_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:410 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + }, + { + "instruction": "input_concatenate_fusion", + "ms": 0.0017630739999999877, + "opcode": "fusion", + "shape": "s32[1500,2]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:615", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:615 (pixel_splitted_regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt_split.py:137 (AdaptSplit.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:332 (AbstractInversion.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "input_concatenate_fusion.10", + "ms": 0.0016839700000000006, + "opcode": "fusion", + "shape": "pred[3]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:90", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:90 (split_points_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:410 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + }, + { + "instruction": "input_concatenate_fusion.11", + "ms": 0.0015004100000000015, + "opcode": "fusion", + "shape": "pred[3]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:88", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:88 (split_points_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:410 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + } + ], + "mesh_locate_walk": [ + { + "instruction": "loop_reduce_fusion", + "ms": 0.025697353999999336, + "opcode": "fusion", + "shape": "(f64[21361]{0}, s64[21361]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:264", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:264 (_walk_from_seed..walk_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:292 (_walk_from_seed..body)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:264 (_walk_from_seed..walk_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:292 (_walk_from_seed..body)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)" + ] + }, + { + "instruction": "input_reduce_fusion.1", + "ms": 0.02505042399999984, + "opcode": "fusion", + "shape": "pred[196]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:288", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:288 (_walk_from_seed..cond)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:353 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)" + ] + }, + { + "instruction": "loop_or_select_fusion", + "ms": 0.023336122000000445, + "opcode": "fusion", + "shape": "(s32[21361]{0}, pred[21361]{0}, pred[21361]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:270", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:270 (_walk_from_seed..walk_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:292 (_walk_from_seed..body)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:353 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)" + ] + }, + { + "instruction": "loop_select_fusion", + "ms": 0.0200991939999998, + "opcode": "fusion", + "shape": "s32[21361]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:242", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:242 (_walk_from_seed..weights_of)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:262 (_walk_from_seed..walk_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:292 (_walk_from_seed..body)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:353 (pix_indexes_delaunay_walk_from)" + ] + }, + { + "instruction": "input_reduce_fusion.2", + "ms": 0.01618481999999954, + "opcode": "fusion", + "shape": "pred[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:288", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:288 (_walk_from_seed..cond)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:353 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)" + ] + }, + { + "instruction": "while.20", + "ms": 0.014477788000000524, + "opcode": "while", + "shape": "(s32[], s32[21361]{0}, pred[21361]{0}, pred[21361]{0}, s32[3000,3]{1,0}, /*index=5*/f64[1500,2]{1,0}, f64[21361,2]{1,0}, s32[3000,3]{1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:353 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "psf_convolution_mapping_matrix": [ + { + "instruction": "input_scatter_fusion", + "ms": 1.9831097979999994, + "opcode": "fusion", + "shape": "f64[1500,180,180]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "fft.19.0", + "ms": 1.760859012000003, + "opcode": "fft", + "shape": "f64[1500,180,180]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "fft.15.0", + "ms": 1.3666725080000002, + "opcode": "fft", + "shape": "c128[1500,180,91]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "fft.17.0", + "ms": 0.9791528720000001, + "opcode": "fft", + "shape": "c128[1500,91,180]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "input_transpose_fusion.2", + "ms": 0.5137495439999998, + "opcode": "fusion", + "shape": "c128[1500,91,180]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "wrapped_transpose", + "ms": 0.4997207419999994, + "opcode": "fusion", + "shape": "c128[1500,180,91]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + } + ], + "inversion_other": [ + { + "instruction": "cholesky.80", + "ms": 0.8974853480000059, + "opcode": "custom-call", + "shape": "(f64[1500,1500]{0,1}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986 (AbstractInversion._log_det_symmetric_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:1078 (AbstractInversion.log_det_curvature_reg_matrix_term)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:347 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/model/analysis.py:135 (AnalysisImaging.log_likelihood_function)" + ] + }, + { + "instruction": "cholesky.90", + "ms": 0.8934377540000045, + "opcode": "custom-call", + "shape": "(f64[1500,1500]{0,1}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986 (AbstractInversion._log_det_symmetric_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:1157 (AbstractInversion.log_det_regularization_matrix_term)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:348 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/model/analysis.py:135 (AnalysisImaging.log_likelihood_function)" + ] + }, + { + "instruction": "loop_reduce_window_fusion", + "ms": 0.0028813000000000102, + "opcode": "fusion", + "shape": "s64[6,16]{1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "loop_reduce_window_fusion.1", + "ms": 0.002790532000000021, + "opcode": "fusion", + "shape": "s64[94,16]{1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "loop_broadcast_convert_fusion", + "ms": 0.002189315999999998, + "opcode": "fusion", + "shape": "(s32[1500]{0}, s64[1500]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:527", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:527 (AbstractInversion.zeroed_ids_to_keep)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:567 (AbstractInversion.solve_ids_to_keep)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:684 (AbstractInversion.reconstruction)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "input_scatter_fusion.5", + "ms": 0.0019471320000000172, + "opcode": "fusion", + "shape": "s64[1500]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:527", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:527 (AbstractInversion.zeroed_ids_to_keep)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:567 (AbstractInversion.solve_ids_to_keep)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:684 (AbstractInversion.reconstruction)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "mapping_matrix": [ + { + "instruction": "input_reduce_fusion.23", + "ms": 0.0029120620000000212, + "opcode": "fusion", + "shape": "f64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:93", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:93 (adaptive_pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/abstract.py:507 (Mapper.pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt.py:339 (Adapt.regularization_weights_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt_split.py:120 (AdaptSplit.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)" + ] + } + ], + "curvature_matrix_F": [ + { + "instruction": "cublas-lt-matmul.2", + "ms": 4.288411013999998, + "opcode": "custom-call", + "shape": "(f64[1500,1500]{1,0}, s8[4194304]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:134", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:134 (curvature_matrix_via_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:93 (InversionImagingMapping.curvature_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:389 (AbstractInversion.curvature_reg_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "chi_squared_evidence": [ + { + "instruction": "loop_multiply_fusion", + "ms": 0.0030087840000000096, + "opcode": "fusion", + "shape": "f64[15361]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/abstract_ndarray.py:300", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/abstract_ndarray.py:300 (AbstractNDArray.__pow__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/abstract_ndarray.py:60 (unwrap_array..wrapper)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/abstract_ndarray.py:35 (to_new_array..wrapper)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_util.py:78 (chi_squared_map_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:78 (AbstractFit.chi_squared_map)" + ] + } + ] + }, + "stage_audit_note": "The HLO instructions that contributed most of each stage's milliseconds, with their full source stack. A stage row is only as good as the rules that built it; this is how a reader checks a row against the HLO instead of trusting it.", + "untraced_wall_ms": 34.5870705020061, + "reconciliation_vs_untraced_pct": -9.032788081386911, + "wall_basis": "wall_ms is the TRACED run's wall, the run these kernel durations came from. untraced_wall_ms is the same executable without the profiler; the difference is the profiler's overhead and belongs in neither the stages nor the idle row.", + "calls": 500, + "call_split": "per-call (first-instruction recurrence)", + "call_blocks": 500, + "events": 246200, + "streams": [ + "Stream #14(MemcpyD2D,MemcpyD2H,Compute,MemcpyH2D,Memset)" + ], + "per_stage_ms": { + "border_relocator": { + "median_ms": 0.10140749999999998, + "min_ms": 0.10057100000000001, + "max_ms": 0.10249700000000003 + }, + "chi_squared_evidence": { + "median_ms": 0.002976, + "min_ms": 0.002848, + "max_ms": 0.003424 + }, + "curvature_matrix_F": { + "median_ms": 4.2873885000000005, + "min_ms": 4.269005, + "max_ms": 4.356782 + }, + "inversion_other": { + "median_ms": 1.8000515, + "min_ms": 1.780275, + "max_ms": 1.8460999999999999 + }, + "mapping_matrix": { + "median_ms": 0.002912, + "min_ms": 0.002879, + "max_ms": 0.002945 + }, + "memset": { + "median_ms": 0.023711499999999996, + "min_ms": 0.009951999999999999, + "max_ms": 0.05424000000000001 + }, + "mesh_construction": { + "median_ms": 0.002048, + "min_ms": 0.002047, + "max_ms": 0.002081 + }, + "mesh_locate_walk": { + "median_ms": 0.150146, + "min_ms": 0.13200199999999998, + "max_ms": 0.18605200000000013 + }, + "mesh_qhull_callback": { + "median_ms": 0.010624, + "min_ms": 0.010496, + "max_ms": 0.0112 + }, + "mesh_seed_argmin": { + "median_ms": 0.22784400000000016, + "min_ms": 0.22733000000000012, + "max_ms": 0.22825900000000016 + }, + "mixed_fusion": { + "median_ms": 1.9871890000000003, + "min_ms": 1.9793150000000002, + "max_ms": 1.9996699999999998 + }, + "other": { + "median_ms": 0.065856, + "min_ms": 0.063488, + "max_ms": 0.07020900000000001 + }, + "pdip_solve": { + "median_ms": 8.940318000000001, + "min_ms": 2.4265080000000006, + "max_ms": 23.48978300000001 + }, + "psf_convolution_mapping_matrix": { + "median_ms": 7.1034515, + "min_ms": 7.087626, + "max_ms": 7.119909000000001 + }, + "regularization_H": { + "median_ms": 0.01072, + "min_ms": 0.010496, + "max_ms": 0.011231999999999999 + } + }, + "stage_order": [ + "border_relocator", + "mesh_qhull_callback", + "mesh_seed_argmin", + "mesh_locate_walk", + "mesh_construction", + "mapping_matrix", + "psf_convolution_mapping_matrix", + "curvature_matrix_F", + "regularization_H", + "pdip_solve", + "chi_squared_evidence", + "inversion_other", + "mixed_fusion", + "other", + "memset" + ], + "mixed_fusion": { + "ms": 1.9871890000000003, + "constituent_stage_sets": { + "curvature_matrix_F + psf_convolution_mapping_matrix": 1.0175930819999996, + "pdip_solve + psf_convolution_mapping_matrix": 0.22712514000000011, + "data_vector_D + pdip_solve": 0.12545822000000006, + "mapped_reconstruction + pdip_solve": 0.11505236400000013, + "mapping_matrix + pdip_solve": 0.11334101599999974, + "curvature_reg_reduce_gather + inversion_other + mapped_reconstruction + pdip_solve + reconstruction_scatter": 0.10992808600000005, + "pdip_solve + regularization_H": 0.045231470000000114, + "inversion_other + pdip_solve + regularization_H": 0.024255044000000007, + "inversion_other + pdip_solve": 0.022968676000000212, + "inversion_other + mapping_matrix + mesh_construction + mesh_dual_areas + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin + pdip_solve": 0.021231599999999986, + "inversion_other + mesh_construction + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin + pdip_solve + regularization_H": 0.01925402400000005, + "inversion_other + mesh_construction + mesh_dual_areas + mesh_interpolation_weights + pdip_solve + regularization_H": 0.014702948, + "pdip_solve + ray_trace_data_grid": 0.013606675999999918, + "border_relocator + pdip_solve": 0.013358111999999946, + "inversion_other + mapping_matrix + mesh_construction + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin": 0.011698335999999995, + "grids_and_structures + mass_profile_deflections + pdip_solve": 0.009939747999999986, + "grids_and_structures + mass_profile_deflections + pdip_solve + ray_trace_data_grid": 0.009199003999999995, + "chi_squared_evidence + pdip_solve": 0.007668511999999986, + "inversion_other + mesh_construction + mesh_seed_argmin + pdip_solve + regularization_H": 0.007261795999999996, + "inversion_other + mesh_dual_areas + mesh_locate_walk": 0.006785176000000202, + "inversion_other + mesh_construction + pdip_solve + regularization_H": 0.006604364000000041, + "inversion_other + pdip_solve + ray_trace_data_grid": 0.005424466000000006, + "grids_and_structures + mass_profile_deflections + ray_trace_data_grid": 0.005373780000000001, + "inversion_other + regularization_H": 0.004859989999999979, + "inversion_other + mapped_reconstruction + pdip_solve + reconstruction_scatter": 0.0048386199999999905, + "inversion_other + mapped_reconstruction + pdip_solve": 0.003776149999999994, + "mapping_matrix + pdip_solve + regularization_H": 0.0034788620000000005, + "inversion_other + mesh_construction + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin": 0.0031791360000000056, + "inversion_other + mesh_construction + mesh_dual_areas + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin": 0.002958415999999999, + "inversion_other + mesh_construction + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin + regularization_H": 0.002713479999999986, + "inversion_other + mesh_dual_areas + mesh_locate_walk + pdip_solve": 0.0025845160000000037, + "inversion_other + mesh_locate_walk + mesh_seed_argmin": 0.002525331999999992, + "inversion_other + mesh_interpolation_weights": 0.002151244000000005, + "chi_squared_evidence + inversion_other": 0.001959109999999997 + }, + "example_kernels": { + "curvature_matrix_F + psf_convolution_mapping_matrix": [ + "loop_divide_gather_fusion" + ], + "pdip_solve + psf_convolution_mapping_matrix": [ + "loop_broadcast_fusion.4" + ], + "data_vector_D + pdip_solve": [ + "input_reduce_fusion.5", + "input_reduce_fusion.21" + ], + "mapped_reconstruction + pdip_solve": [ + "input_reduce_fusion.9" + ], + "mapping_matrix + pdip_solve": [ + "loop_broadcast_fusion.2", + "loop_divide_fusion" + ], + "curvature_reg_reduce_gather + inversion_other + mapped_reconstruction + pdip_solve + reconstruction_scatter": [ + "input_multiply_transpose_fusion" + ], + "pdip_solve + regularization_H": [ + "loop_select_fusion.2", + "input_transpose_fusion.3" + ], + "inversion_other + pdip_solve + regularization_H": [ + "input_transpose_fusion.4" + ], + "inversion_other + pdip_solve": [ + "input_reduce_fusion.7", + "loop_log_fusion", + "input_reduce_fusion.8", + "input_reduce_fusion.12" + ], + "inversion_other + mapping_matrix + mesh_construction + mesh_dual_areas + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin + pdip_solve": [ + "input_scatter_fusion.6", + "input_scatter_fusion.3" + ] + }, + "prorated_estimate_ms": { + "psf_convolution_mapping_matrix": 0.6223591109999999, + "curvature_matrix_F": 0.5087965409999998, + "pdip_solve": 0.39462946825714296, + "mapped_reconstruction": 0.08198017086666673, + "inversion_other": 0.06855563279047636, + "data_vector_D": 0.06272911000000003, + "mapping_matrix": 0.0624338013333332, + "regularization_H": 0.043047128390476246, + "reconstruction_scatter": 0.023195272200000006, + "curvature_reg_reduce_gather": 0.02198561720000001, + "mesh_construction": 0.01448933225714287, + "ray_trace_data_grid": 0.012702504333333295, + "mesh_locate_walk": 0.012685022390476258, + "mesh_interpolation_weights": 0.012461504057142863, + "mesh_seed_argmin": 0.011229527257142857, + "mesh_dual_areas": 0.008505365000000067, + "grids_and_structures": 0.007404260333333328, + "mass_profile_deflections": 0.007404260333333328, + "border_relocator": 0.006679055999999973, + "chi_squared_evidence": 0.004813810999999992 + }, + "prorated_note": "ESTIMATE ONLY \u2014 a mixed fusion's time split equally across the stages its constituents span. Never summed into the measured table, never reconciled." + }, + "other_sources_ms": { + "copy.80": 0.042013890000002906, + "copy.48": 0.01694752399999989, + "copy.53": 0.0020209240000000064, + "copy.39": 0.0016531839999999976, + "copy.78": 0.001652293999999998, + "copy.79": 0.0016482640000000034 + }, + "device_span_ms": 35.635434496, + "device_busy_ms": 28.889184276, + "device_idle_ms": 6.74625022, + "largest_idle_gaps": [ + { + "gap_ms": 5.648069, + "after": "pure_callback.4", + "before": "pure_callback.4" + }, + { + "gap_ms": 0.035071, + "after": "pure_callback.4", + "before": "copy.79" + }, + { + "gap_ms": 0.030176, + "after": "copy.48", + "before": "input_reduce_fusion.1" + }, + { + "gap_ms": 0.029056, + "after": "input_reduce_fusion", + "before": "loop_dynamic_update_slice_fusion" + }, + { + "gap_ms": 0.028351, + "after": "input_concatenate_fusion.7", + "before": "pure_callback.4" + }, + { + "gap_ms": 0.025535, + "after": "while.26", + "before": "input_reduce_select_fusion" + }, + { + "gap_ms": 0.023584, + "after": "input_scatter_fusion.7", + "before": "loop_reduce_fusion.1" + }, + { + "gap_ms": 0.021184, + "after": "while.26", + "before": "loop_select_fusion.5" + } + ], + "kernel_ms": 24.716643500000004, + "sum_ms": 31.462893720000004, + "wall_ms": 35.637704199994914, + "host_outside_span_ms": 0.00226970399491222, + "reconciliation_pct": -11.714588730425305, + "unjoined_ms": 0.0, + "unjoined_pct": 0.0, + "other_ms": 0.065856, + "other_pct": 0.18479304848152758, + "note": "Stage rows attribute the command-buffers-OFF program (see the module docstring): kernel times are the same, the launch overhead the CUDA graphs remove is not. sum_ms = kernel rows + device_idle_ms; the residual against wall_ms is host_outside_span_ms (dispatch before the first kernel, teardown after the last).", + "per_stage_ms_per_lane": { + "border_relocator": 0.10140749999999998, + "chi_squared_evidence": 0.002976, + "curvature_matrix_F": 4.2873885000000005, + "inversion_other": 1.8000515, + "mapping_matrix": 0.002912, + "memset": 0.023711499999999996, + "mesh_construction": 0.002048, + "mesh_locate_walk": 0.150146, + "mesh_qhull_callback": 0.010624, + "mesh_seed_argmin": 0.22784400000000016, + "mixed_fusion": 1.9871890000000003, + "other": 0.065856, + "pdip_solve": 8.940318000000001, + "psf_convolution_mapping_matrix": 7.1034515, + "regularization_H": 0.01072 + }, + "per_lane_divisor": 1, + "host_callback": { + "pure_callback_span_ms": 256.14753520000005, + "qhull_ms": 239.00725419999998, + "callback_body_ms_note": "the OUTERMOST matching body event, not a sum: under the probe the body appears twice (the wrapper and the timed re-implementation it calls) and summing them would count the same work twice", + "events_by_name": { + "pure_callback.4": { + "count": 500, + "ms": 256.14753520000005 + }, + "$callback.py:815 _wrapped_callback": { + "count": 500, + "ms": 251.73777559999988 + }, + "$callback.py:224 _callback": { + "count": 500, + "ms": 250.54260450000004 + }, + "$callback.py:74 pure_callback_impl": { + "count": 500, + "ms": 250.10687889999983 + }, + "$callback.py:69 __call__": { + "count": 500, + "ms": 239.77683659999997 + }, + "$delaunay.py:162 ": { + "count": 500, + "ms": 239.44376130000003 + }, + "$host_callback_probe.py:225 wrapped": { + "count": 500, + "ms": 239.00725419999998 + }, + "$host_callback_probe.py:160 _timed_tri_only": { + "count": 500, + "ms": 238.59765389999987 + }, + "ThenExecuteCallback:GetEventForComputeStreamSyncPoint": { + "count": 500, + "ms": 1.0067121000000008 + }, + "$callback.py:822 ": { + "count": 2000, + "ms": 0.7241742000000015 + }, + "$__init__.py:132 _xla_gc_callback": { + "count": 8, + "ms": 0.0031368999999999998 + } + }, + "note": "HOST milliseconds per traced BATCH (the whole invocation), aggregated by name because the events nest. Not a row of the device table: the device pays for them as the idle gaps largest_idle_gaps names." + }, + "host_callback_ms": 256.14753520000005 + }, + "hlo_census": { + "status": "excluded", + "reason": "The legacy census anchors PyAutoArray source line numbers that moved after the phase-1 run. No batched attribution is published from unsupported anchors; the device-event table and wall reconciliation remain valid." + }, + "trace_split": { + "expected_calls": 500, + "executions_per_invocation": 50, + "method": "per-call (first-instruction recurrence)", + "note": "DECIDED IN CODE: the scalar arm's trace is split by trace_calls * B, so every lane's execution is its own block and the per-stage median is taken over all of them. The vmap arm's is split by trace_calls, one block per batched execution, and per_stage_ms_per_lane divides those rows by B." + } + } + }, + "certification_report": { + "source": "vmap arm, library solve observed through its stats= out-dict (PyAutoArray #566) and jax.debug.callback(..., ordered=True); ordered because the unordered batching rule returns the lanes permuted. Untimed, separately compiled; max rel diff of its log likelihoods vs the timed arm's: 4.866e-05", + "rows": 50, + "pdip_iter": "NOT AVAILABLE per lane without changing library numerics. The fallback branch calls the library's own reconstruction_positive_only_from, which returns the solution alone \u2014 jax_nnls.solve_nnls' iteration count is discarded inside the library's custom_vjp primal. The PDIP while_loop's cost is in the pdip_solve stage row of each arm's device table instead, which is a max-over-lanes quantity under vmap because every lane runs the same fixed kernel sequence.", + "passes_semantics": "library `passes`: restricted active-set passes run (jax_active_set.solve_certified)" + }, + "lane_construction": { + "draws_sha256": "246b41aea1e860763cb7b206a7f43d5e3145e5c63c8c9df4985518ebf778c02e", + "lane_rows": [ + 300, + 301, + 302, + 303, + 304, + 305, + 306, + 307, + 308, + 309, + 310, + 311, + 312, + 313, + 314, + 315, + 316, + 317, + 318, + 319, + 320, + 321, + 322, + 323, + 324, + 325, + 326, + 327, + 328, + 329, + 330, + 331, + 332, + 333, + 334, + 335, + 336, + 337, + 338, + 339, + 340, + 341, + 342, + 343, + 344, + 345, + 346, + 347, + 348, + 349 + ], + "calls": [ + 15, + 16, + 17 + ], + "stage": "pix1", + "regularization_range": { + "galaxies.source.pixelization.regularization.inner_coefficient": { + "min": 2.1069031993440453e-06, + "max": 4381.27190482627 + }, + "galaxies.source.pixelization.regularization.outer_coefficient": { + "min": 2.002369440956339e-06, + "max": 350.8013530115919 + }, + "galaxies.source.pixelization.regularization.signal_scale": { + "min": 0.015870361716511128, + "max": 0.971901829834744 + } + }, + "phases": [ + "exploration" + ], + "window_rule": "nautilus_batches.timed_window: consecutive captured calls, in call order, from the FIRST call that is not a prior batch, concatenated and truncated to B; at B == n_batch exactly one real Nautilus batch. Falls back to the latest B lanes if the post-prior lanes run out; never repeats a lane.", + "note": "Lane k is captured lane lane_rows[k]: the mass AND shear of a real Nautilus proposal (nautilus_batch_capture.py), lens light fixed at S3, the S3 light-subtracted dataset shared by every lane. `offsets` in the lane table are the mass offsets from the fiducial; the shear is in the capture file." + }, + "captured": { + "batches_path": "/mnt/ral/jnightin/autolens_profiling_wt/certified-solver-phase-c1-lane-rate/results/breakdown/imaging/nautilus_batches_delaunay_pix1.npz", + "batches_sha256": "e71a5e23026b342d1ff4359b8fb914a87980d8aea0060659d2334dcfa3215c00", + "schema_version": 2, + "n_calls": 932, + "n_lanes": 18640, + "call_sizes_seen": [ + 20 + ], + "calls_by_phase": { + "prior": 15, + "exploration": 917 + }, + "parameter_paths": [ + "galaxies.source.pixelization.regularization.inner_coefficient", + "galaxies.source.pixelization.regularization.outer_coefficient", + "galaxies.source.pixelization.regularization.signal_scale", + "galaxies.lens.mass.centre.centre_0", + "galaxies.lens.mass.centre.centre_1", + "galaxies.lens.mass.einstein_radius", + "galaxies.lens.mass.ell_comps.ell_comps_0", + "galaxies.lens.mass.ell_comps.ell_comps_1", + "galaxies.lens.shear.gamma_1", + "galaxies.lens.shear.gamma_2" + ], + "stage": "pix1", + "regularization": { + "class": "AdaptSplit", + "free": true, + "priors": { + "inner_coefficient": [ + "LogUniform", + 1e-06, + 1000000.0 + ], + "outer_coefficient": [ + "LogUniform", + 1e-06, + 1000000.0 + ], + "signal_scale": [ + "Uniform", + 0.0, + 1.0 + ] + }, + "priors_source": "PyAutoGalaxy packaged config/priors/regularization (adapt_split.yaml / constant.yaml); adapt_split.yaml is identical to euclid_strong_lens_modeling_pipeline/config/priors/regularization/adapt_split.yaml" + }, + "nautilus": { + "departures_from_production": [ + "mass/shear priors are the phase-B cell's Gaussians, not chained from source_lp", + "no positions likelihood", + "the cell's mesh (Hilbert 1500, weight_power 1) in both stages; source_pix_2 redraws a 500-vertex Hilbert grid at weight_power 3.5", + "seeded (production passes no seed)", + "quick updates disabled (iterations_per_quick_update=1e12; render-only)", + "NullPaths: no output directory, so no checkpoint and one Sampler.run call", + "post-fit perform_update skipped (samples / latent variables never built)" + ], + "n_batch": 20, + "n_like_max": 40000, + "n_live": 150, + "number_of_cores": 1, + "production_reference": "euclid_strong_lens_modeling_pipeline/scripts/full_model.py source_pix_1 (n_live=150) / source_pix_2 (n_live=75): af.Nautilus(n_batch=20, **SettingsSearch.search_dict) with use_jax_vmap=True and number_of_cores=1 (SettingsSearch defaults)", + "production_stage": "source_pix_1", + "seed": 1, + "stage": "pix1", + "use_jax_vmap": true, + "version": "1.0.5" + }, + "capture_fit_status": "sampling complete (n_like_max or convergence); post-fit result skipped", + "capture_library_revisions": { + "PyAutoArray": { + "head": "7fa8d2714f7da43fec2b23c31bff580764831670", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoArray" + }, + "PyAutoFit": { + "head": "a736840127be7a3c21e15a5c945e94d8f1082983", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoFit" + }, + "PyAutoGalaxy": { + "head": "70a61e26cd715cefe7012a38285698091246a8a4", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy" + }, + "PyAutoLens": { + "head": "86054bbc19baa2f710a12e04a94fa27ab37cc354", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoLens" + }, + "PyAutoNerves": { + "head": "1fa613aa8d89a79613009fb66f5b4e2d21deb57a", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoNerves" + } + }, + "fingerprint_check": { + "fields": [ + "mesh", + "source_pixels", + "dataset_sha256", + "regularization_class", + "regularization_s0_fiducial", + "border_relocator", + "use_mixed_precision", + "log_evidence_s3_library" + ], + "not_identity": "the regularization coefficients: free per lane since the capture frees them", + "log_evidence_s3_library_rel_diff": 0.0, + "passed": true + }, + "timed_window_vs_capture_pdip": { + "reference": "the capture's own figure of merit (library PDIP, Fitness.call_wrap jax.jit(jax.vmap(call)) over parameter vectors) for the same lanes", + "compared_against": "this cell's jit(vmap) library-PDIP reference", + "n_compared": 50, + "max_rel_diff": NaN, + "max_abs_diff_nats": NaN, + "gated": false, + "note": "RECORDED, NOT GATED: proves the lane trees rebuilt here are the models the sampler evaluated (a wrong parameter mapping shows up as nats, not 1e-10)." + } + }, + "matched": { + "vmap_wall_per_lane_ms": 26.698250825997093, + "scalar_wall_per_lane_ms": 34.301709966006456, + "speedup_vmap_over_scalar": 1.2847924079208062, + "note": "Both walls are the PRODUCTION nesting of their arm, measured in one process on the same B lanes with the SAME library Settings (no injection). A speedup below 1 means the batch is slower per lane than B sequential jitted calls." + }, + "solver_source": "library", + "solver": "certified", + "certified_fallback": "none", + "certified_pass_budget": 16, + "certified_pass_budget_basis": "config default (Settings().certified_pass_budget)", + "certified_tau_rel": 1e-09, + "solver_used": "certified", + "solver_check": { + "solver_used": "certified", + "solver_used_source": "AbstractInversion.positive_only_solver_used on the fiducial S3 inversion, built eagerly on the JAX backend (AnalysisImaging(use_jax=True).fit_from) with the arms' Settings", + "reference_solver_used": "pdip", + "traced_solver_kwargs_jax": [ + "certified" + ], + "observed_calls_jax": 1, + "report_rows": 50, + "report_vs_timed_arm_max_rel_diff": 4.8661620603430036e-05 + }, + "lanes_certified": [ + false, + false, + true, + true, + false, + true, + true, + true, + true, + true, + true, + false, + false, + true, + true, + false, + false, + false, + false, + false, + true, + true, + false, + true, + true, + true, + true, + true, + true, + false, + true, + false, + false, + false, + true, + false, + false, + true, + false, + true, + false, + false, + true, + true, + true, + false, + false, + false, + false, + true + ], + "lanes_passes": [ + 16, + 16, + 1, + 3, + 16, + 10, + 3, + 9, + 10, + 2, + 5, + 16, + 16, + 9, + 15, + 16, + 16, + 16, + 16, + 16, + 13, + 6, + 16, + 13, + 13, + 0, + 1, + 11, + 3, + 16, + 11, + 16, + 16, + 16, + 2, + 16, + 16, + 15, + 16, + 4, + 16, + 16, + 6, + 2, + 8, + 16, + 16, + 16, + 16, + 2 + ], + "uncertified_lanes": 24, + "per_lane_certification_note": "certified / passes come from the library's own solve through its stats= out-dict (PyAutoArray #566): passes is the number of restricted active-set passes the library ran (0 when the unconstrained solve was already non-negative), certified is its KKT certificate. With certified_fallback=pdip a False lane returned the PDIP solution; with none it returned the last uncertified iterate. null for a library-PDIP row (no certificate).", + "gate": { + "pre_registered": true, + "gated": [ + "per lane: jit(vmap) arm vs jit(vmap) library PDIP <= lane_rtol relative", + "per lane: scalar jit arm vs scalar jit library PDIP <= lane_rtol relative" + ], + "recorded_not_gated": [ + "per lane: jit(vmap) arm vs scalar jit arm (rel_diff, abs_diff_nats)", + "per lane: jit(vmap) library PDIP vs scalar jit library PDIP", + "uncertified_lanes (certified_fallback=none rows)" + ], + "lanes_failed": 36, + "passed": false, + "policy_eligible": false, + "note": "Pre-registered before submission (module docstring; submit header). Phase 3 (results/notes/hst_gpu_residue_phase3_psf_2026_09.md) placed phase 2's ~2.5e-9 certified-vs-PDIP residual BETWEEN the jit(vmap) and scalar-jit compositions, not in the solver \u2014 so each arm is gated against the library-PDIP reference of its OWN composition, and the cross-composition difference is recorded with its nats. A certified_fallback=none row is policy-eligible only if every lane certifies AND passes the gate. Timing is never gated." + }, + "library_revisions": { + "PyAutoArray": { + "head": "3de624b5b91a4efa130dc3cb0a3a0f06f85025a3", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoArray", + "module_file": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/__init__.py" + }, + "PyAutoFit": { + "head": "dd9fbe0aab60c4a57702b1444ca031b317c91331", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoFit", + "module_file": "/mnt/ral/jnightin/PyAuto/PyAutoFit/autofit/__init__.py" + }, + "PyAutoGalaxy": { + "head": "70a61e26cd715cefe7012a38285698091246a8a4", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy", + "module_file": "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/__init__.py" + }, + "PyAutoLens": { + "head": "86054bbc19baa2f710a12e04a94fa27ab37cc354", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoLens", + "module_file": "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/__init__.py" + }, + "autoarray_file": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/__init__.py" + } + }, + "headline_arm_note": "`trace`, `hlo_census`, `command_buffers` and `trace_timing` above describe the scalar arm \u2014 the program phase 1 traced. Both arms' full blocks, the lane table and the matched comparison are under `vmap`." +} \ No newline at end of file diff --git a/results/breakdown/imaging/fixed_light_trace_delaunay_jitvmap50_captured_pix1_libcertified_fboff_b16_hpc_a100_fp64_fixed_light_trace.png b/results/breakdown/imaging/fixed_light_trace_delaunay_jitvmap50_captured_pix1_libcertified_fboff_b16_hpc_a100_fp64_fixed_light_trace.png new file mode 100644 index 0000000000000000000000000000000000000000..272fb59d9f1eb06a7a14ae21f3d5f0abd6be019c GIT binary patch literal 151285 zcmeFZc{tWz`!@PfN;F7_RERPbC6&k+$>pGfk8Xkuq0A2pJ+t%1n_$r4Uhuk|~79 zm?4pQw$Ih?dH4H!_j|m5?c>;g?dLeY&+~k_-S_8SYhBlMUgvpU>$aAL@>&KC28yEA zsvK3+p{SMl6h$k#Y9)S>c5{aS{^y{h(g{ah+p~_&<_>45W9E)_7i}FcT3K*kIpc8I z%J$M;k%J=QJGsw0I@(>96cx4kzh59?>u^q#Gog{il^rHn+2YtgNCaNC3asHD({5vqvZ&l!) zkL;HJ?Y|-{R_=I6{jWdU^U*)xrpbSM5&4^^^<8mn|NSrVL*WUDzS95Y?e=_Bm0sua z|M-k7o#6lf?f$=6JN3-dV)vU1y}T&ueS%6DcUbxJ)8(NXj@g>$B@Dj5zC5J-bYH`> z2gTz%)b7dgg_+kTsFZ3%%DhTsG%+#3FH75k(%xC7ISn=(+o_qBQRmCZrN9?fR9QLr zFkzdt^w!Eq(NA&mH>;nUAC8KSwsv&is4si^>{-=}$h&v1(=+qE|MZFO?AfydhPgXk z#`~^^hqL6&8NN78&mn%EQd3iFYH5i#etSjY%I~NQ-vyIZXN>E_nAWeS?yKKgPPgu; zhUoM;Gc(H7)s>c()~wW@HME6!;QbBHq@<*g@o~jpRS)eK=Vy58#^;6$0|qtjiz&sA zv(3MJ{#@=`n*JV(l2wPUjVc;l>HT~kU*&wm(@lOyd-k*KJc0LLDJv`6-P^nIejDSD zXNIp>{ybWdn4D}m^0Ua!+1dB*-Mb10>kXuhSsrT$xvjP45fE6_QxWl@<&`aK(y!iL zi(+s3k;%zhw{NRt4KwRZJWg|4sQ&Zn#*~xH5?6|_?ox1nwNJ(nRWvj9t0qy6EnL`O z9Uj{5%9SH>a@0mqlc&#(jvQHOWNciMVf@zFj^+2#kEIK;imxBB%IlQ(;*Mbt2NjoAI)54rZvMdo(xN}MrCy*)BwCm|)(H8I$@ z<6-#HmiSN&$}%u(DJdagdwG9BLBa6B9ZQAlwn%ure=oOv#}0S9BBdm*NA8oGB%S}P z;fwV9bhwkWW%a`KQ zh)HpZJM+6KD@w{)MCkZazo;nosHiBvUqgpq*|hBc-CoEw*8AmVYHDinyYDa0b-ny5 zbNKsvEH>J#(CZkrJOBr+@to}aC{8h6#t1Oz1>s((xpqGm4k0>9^Jox`)}8$c#nnI z^X&!sBEBOgtjSepxiUxqe*Mb0_v~kZQFHmEt^YEyE5AR(i#1y$*4x|L+c`P8%hC(c zJd|`&z(Z*zsoxLPV3=bJt?YSi-?j3dh_QdHv}-}5yWz=`kI#LLO))K$8EDK5#=*2= zX`;Nu&QzRd^~PTdk;Cxu&SuN0KR+yfUB#BL@3Ejo$Uh!m9oFtKxAx_^ueWaATpq+F z8>AW`L_?APgRJB@+_sg5hUR%r&NqpziQl63Scb<2w&HL}Uit0Ecn^rzoOf zH6x=zpH`v!+(!KChcx~4>OxOXqqkR%Ie32m{{2LbH7oVLv~-0*hEY*@7=H~C(zDu` zpGC{FFMi(;DPmk)a+|r7YS5Hjphe^dZk5`&RnpPR*VniB%F1NzqLX zYIeW35i9%Jv46woFJB^hZCYP5VbAdG^*JP(-#UxFc=@v3KrCmnod41Lni{5jmkFKd zSN2^;sP`Qoe0SVz4$KNoydY)PUf|yML|rTMnw1&F3zf1JuGma zv#1CcWS6?K6X!OyvCHiD()UJF&u1*VnK^}`cbhNEa~@uI?%c1bJWu^Lr4|q5x!0~! zB4@wGK07?HsV+FrX^?08cG`Bgv9-6>Y+6P~=Nqa~>$$S9Eo9Hf6SoC)lh(MoyPI2D z>ei}UJ9qKo#h-(NmGYvK8skGPY;qo2eeR4Gkyg79XNr$x+_hd^GG^brxiDf4fRG_E6%NTG`#_CY7wM zg*;~albu6*Yq`b6_2$2Qetg(h{M4uVdY1C?a>{G4F|%uSVlcE4S&Uipk&IGZ(yf&Wx1A&(bD3 z)y6CDQKnG-Mg}trg=pVV?@LM)N6lBfF$yXxJ37BOH!R^g`P8KLD|=W29_;nox4cqP zn?D6}iS~E<{b&83zj~#Nq-auC5tWO?8F;|9&8)vRk)&Lfe~~53q%-W$R^TpmT5J=x z{qMjxVV|DctF~?1hVp~ZjV^xo>+2&+q?(jdIYQkI2eB{fSy;T0G}Bs_dcQoVd2MeQ z_29vWq9Phppw|vP{wBfNKb+-bW!(L-7>_T0e-TpIlVXxDi5JuH2#p%5JO62wS5R2C zW$V^$k(Jt+CenC~lKK5hKk~Ni-o2iB?%1#6GnH^*R?<5#a82Om1M7M!BYp4RC(pOX zzEcs~ooYN>o2Uj9u(|cekJ4fBlG0KYnf!EBY-(@S!+?;G^;cb7im{dJ)~!2Vm$VkS zo%c;p-tfZ|mvf#)wl!NM9ao`7Jb&@xMo!MY=2y1Cg-eTXo2=6Dm{`DskBtdZFU6NF0^u0JHue>o4urlQ78a88rQ#De@j#Ob76k^ z@5sbNDgHjop+}XP>Cs_VH-2rm?epi)+0Bi}4oqxpbSM=-EXCixvFklO&X^-!@wPsxse;8HK9nYh(U^^Pmoqr! z*m;J}-n%{`y@scFsO1%F19M6`^Ke^!!1d*H#VswH0e?E1~kjfk9Va~MU&lrHTHtjvj^2V)bu4C-i*P2XI+1Gh_WV^qm8yL9C z9`u-(C@wB8ahn<))ww^sqD3w`+mNAFSxQ0I%F2pe?DQ&}8uPPfZwcwAaUVRm>Dskx zs+DOM9;IFw`;qU;W}N4EJwBcniL~R_ujJ9U{x`+?C6aKOFhZTD|9_!P8t8z8LZr*-8sZ{EBC zo&p4;M~PY~m(_a6W1d~wbZd37`s9t_eU!gM??Z5O{P`2462_-uqKRey z2<)r<^6asu@89J`B0n@XvRQr%l()7{s~ufY2N1a2aj;=+RaF%UH^WyV_jVa3*>kRH zFT+vIt~i70OdbPi-M$%HP8Mx?dis59>z2vM$&};IIA+KD<6k^9WM?u5h#|l;=HWvu z(n@D%XIeTs%eHsdLMxX>D@D(LOJm)#Ws4bpB`PXfQc_}ugTqicaEg&FNeysNv>m5F zc4>Yu)`3=7Son^|wS+H=-usJ+Zqm_Eh^EMk%UOIyY)YK_jkAXsk)+cNGI_+rbk0=E z0G%UaE2BJ>43^^yE?>Dui~T^^=g%c5g5J-c@77DvqCsKH&CNYu^TcO*@@6r^q`dR* zrt4?FL>J-wU%7I{&(H5YK0f~WJ3gl?+U?tSUA@D=kh`a@wsyDMv|YHUDd)$JAK4`x zQ(m|FO0?;;x;17Gi#ENv%#SpXSv|Q$#_jdhM*;%E!mHcer?vt)Fw)V{kqlQ^x%%b^!IjjxA3i7TSPjN+u>K6XhIsBSxzef6(}Pd}cTo2q|ic)+J0rG(b&RQ7p! z?0n}qPJY6HNXLDlI*onZ=7O9Dg`-|g_-#<5GjwPr6mUr zISsd_re?X#jvYJh0-IlRb=5_Y*>|ZmiVC@Yoo1*xN6pBiqu7UK!v+Patfl1v-n*o5 z?dJU~*VF-c6Opc&Dd2{9KfhJh?FG{1Jq`oakC$J&di7}RFT5-SkxdiVoO3}}Pmg8a z#ikHE`TYkE>aflGD&B6Dy5jdMTR;7HXI8~&vC#6<<8_*{fz*(6 z7DwKV0X$U}yB~Py(4jt@=1wu3qmXw&Z4p*=Nh&6TJ~VNFdDZo)x~a~?ZQ{WCr}7*H zajaAwu03v5R#sN4!YLJ|iPLx}dAqJER$7fJtEtg;c-WX}8qhf5n__md(YvrvmL_gt zZt8;gLq7p2sRt-O^pwqyJbm+6tpjQgE8o34B(`@iFXcGYyf1MESQ|~`5k5Y?@!#L~ z^6*&KCeYKweR*);LWBp;6U$FQOq7s8MojIy55A0H>U{C!`MN#@ry69M(0aK{{n_<~ z%L#{AY30h5v|jV`^8z9wK{syR!~wdEL%?#+9hm&v)01IT2yz8dauAv=wf+0|(|Q35 zrewQQ-GBaQ0ORghy?V8EW5!k`Wo2E!IjiPutNLs!-DPq)*57ne(iypA)D;y01GZD$ z!^5JNF5~wW#%AW`kDtfN=|8;syJ-*hoR`vj<8a2`&o2(AAnfj4rcE3iwZO084V!>- zXt;60tbgR~!)Jt%qjmMFmhZZ)da;M~QPWjKB6Y7^$t@oDSwy`;OEL!|A+8zdadZw|10s?-hwc!mlz0F~gkARH% zaQ4N-#S`!lX%&}N6ff-Fxiiqs&Fx>DY~6b7`t|Fl&!0a^ZGV;HHsfILfifg0BBJrm zKvGJoE>SIV`oVxE8ZgBm)ldcc}K^_cnu8=$(mGGYoXZ?8Z>j7($}{s*nHp; z*%O*LG?rRMMqBpTw#6V8)^3r|8s$L!P5?Y)qF%gul?>R%uy*Z^%a<=Rpffm`n^P`z zY=G0|eC@g@u`>)baexSQ4-VKOwJC|4y{9-1UERIQI4>NjH{Rg~u#njP{d`Er&+3jh zVKYj^M3m0|a_Xy=kKqe{5VTcF$A^Kn3`qmIBh~!FEm|*>u>Q`{0P(9MW_aNG3}Y$s z@yN-`!cB}5PyR=^F$Bv~UE3j~JX<`ey`}$J!3b1nml9JI>2CwW;1B+K6%)CQXPe+{QY~c=mWMQNjU<|zlVW~!o$NAaUy8FP~dj7Py?%+$`EuB zz4>l4I`1waRi@NTX7A|!2Kb+9TIfO6HCozr|BnK9Lx&mXnq0Pw4`_2$s|wL>FbXmb7+BebrWpkQNBF+WU3c` zWbHCJ^w?UfZW-shL{vnIY9bMj|9a%$nQqF%^2#(aYuy_)+=)7rs z;QPzuCi|+gvh~Sm!A@1@G3-ovaq*3vyLMT9jg@8?yYjnf+q&Z{YpPOIyY6g0(1%S@?U%gVyXJdy zb7)RZPOX`o{S6cB0z=XJn3yd%quZ(R{^Um+g>6W_y>v+~p=LF-jpTU(#>YWus&xJK}3{lkSz8wc}%wFTBvsjFR3d4j2s z;NakH?(e~}ivsJCRu|0uky@rlC-QAYJ{TW4Dh2sHbZ~OG-Sl@#(Nvb00 z6{wRcd|`L7r3;fSwhUu97gjB~HVkzrsmj#(vXE`z_wNg8pqt$WSQ|`LBf?o4m@>xv zS%qssF@)D@)pPr#RTVt9(Z4yO@Ae zeR)mIT|~Uq!t8|Vr>FjQvb1twa2Oi@-dekP6@|JX@DzD|E0Pm=!w36qHY9_otgU{0 zn4ZFy)->O0+`KCS96AR9BQ+$? zjW_*#GK;>-%&9+ZF?o0OamXd}pW0kD&!7BPqV)?1;N_P6SKbnH!KKil$&&AxMYBTd zb*c5W_S0-MGq;{TeOgvq8(Lde7ty+7s0PV6{-*4S9Q#L?i%WKsa3J`$$^d_oHjL?HM%FzQ{In`4vmP2sJ-^Ns_M9E zfYwIzKxx@-=ykVB*vXkk=T1DAncJq|`tkE;bwOh#!K%fCWd=%j8C>%5O*9_K97C_Z zaW2(|^=ae2g)r;4tE@!lL9eLmCaG(mS_B67@tQyi-2Q8I4=*3z5y4^Gws$IM`q`Ei z#`|@fU!DurX_*F3*4@)X(243VmAgAI!L^|TDhsGW5GX=UdmR<(i-?X^HO#%ZjggTN z{e{87DBjq6q@V!cj)4~FUWK+A|&zs6ecP3<-6|juU+%!>mZeHTY6gv1h=3p3A z{rUdhQY&o14ocj-m^QIzX?9Q)YY^HPCxkMPm!K ztgL57_A_h*po#nB{UcTz22#;@`1Cg$xhnc!bNKn5=0$EUAM}?*uanx|bC3U3hc!&v z*x!hirQW%^;38^A@87>~5z<$7m$%dLKbb?@F2oiDuj-i36%8aV)}(Y{Tb-V1PRFjDvTtUy%97LO-M@epZJNQkdmE=L~Nz6 zjJ$GWe%}Ro1&%dq*7V{1v`=ZW3k;*69+_jR@N-ww^>2> zE8BMe>w)Mm``&5teEUzZpM^$Hs+yiVC#+GeHt@BnDT?n{bi#<7_fL@Yr>3?6K_q2A zMAsaCPt;TcZA~&Te>Ko_|JYYqHcu<53k^GcdfJs*Ohh8X2ogJN#IG5Prl7l9?>Aky zx1=lDFNQiF$)f`_aZjJ_B)yByCbvfUOxZfm{(OUJJ zespv+<;qYqDZ?^yyhgGe9UUCWugs!X_wEqpU6RH_ zf9?1qk5PG#s;M1zb33$wnVI!oOTOy?ikpW=!9fa`fsP_p9_FW%&>Qd4{8t_8)xx=w9bY4UeZLZAH{N;#2I$B!7nVLtV$Xbz)otCfr5e!xVskb<-c<=@fBO`_ej^A9wz;WcUj$OOnGjFY5LHX;`teMY zUA=1ZSX#n?+M~oLBq#HVifYauw=9~wk=tk@kK%p=TZ{iZ2Vp3FzFIDQVg(9!=Yd&< z(Z7F-N(0#bVuP|C@@%=#afO`%RmvkN$$`iC2$7=(O|Z{QbGG65k01g6{Cw$CIo65d z#^--+k-D-5s~g&5%nV_VhRU|8TZz6pbnYbh+2U*@0Nx!tR)~m*fD^l4D~SeRx-ULB zJgIQ_U7gQ}aXN76Q`16|cUO?#g22nhS(N&}cAwjiJS})FP~pDEXtzpMT`1H!w3VGe z*vC^^_S-ajBPMwT1?e5$7+Has7!drn8lMWj{u3T}drKIrkRHYTBUW8Sr3g&k$XD4V z?p?c%edc9mW{wzY1xAc_=&4Yx>+0&-<38(Ho~NR!s7Q;f<_q219F16~^Br{GM4r2P z?V4ctIVecfd;Ujm%TNfx=UrG>P=^pfL|$lgA0T2?zje0V|6clz_)ovgE^TY7Pnt>0{SI{BSK+q{4jw1+|8m$aR0{z$` z?a;l72)_{C!KmEuD{;sim{-Yp2E@R`%Ibsn??8@oDIa?R*7pfS7u7no4_5<3W-_eW zm(W5>crG471L_T|A^eOtth^dKA0y?w4v6ar!ii{1=H}N?+d9%S3luCYcmU-LyY2hN zI6sZrR|o9**d(Rh8f+HKzGoS>^dpc&$H0L9aKW60)us;Kr?+q44qd+I2HwqoN!0D) z4=`E|CsXC>BTYS0$M>A@T6k}q*Q68uk0k7Q8Zu3T3IDZ@#k~)lgAbm(3!HITMa2fXqdq~? z2%znaYMPpKl+QXV?ZK2&nh|$-m8~7WSU-6^@k9h7?M=v=K31Bshvb39N6=_J0j;Qd zlY`PqKfVk6!DdBo=u6~Hum0^^v0=joyZLGRL^^hyb$T8Jq&R?m)?TMSt()-o#XuE$ zEAzd78eO_1a;fdzZIECczz2kYCw79-X@oM%V)`B6p4&G$qiM~&B>} zP(V>k<{%r6YG`bvGf1r6UOm|?EC7OeO>{rU$g=DUnyWqueLEr~A-!Wq;)%JMb5aV- z(b<>LENt7frQTb_rs_%aZ6w6ucWWmzR!!Xj)gom47FLL(M~}XT4nSh6JU4KJQtYs7 zRMOH~51T>ON%PSu|1FBi}-HrQWx+7{(7-8#1Qr#&{gn zc0cGooGDSTIC~+{g%AN?nO3+={-y^PO$2@S!ZZ{#4#24oT%PmS(fs)j8Mwb13b6J) z?>YoFWdqy;O|NVpRh-d#DC-{at5e76M?vP_jm9ke?fZu2R)6xG7|<`LtmG9qPZ%0n zf>|a~GC7B+??v#`0A=*mCI(dOe=Rd?zmtnDAFeC+kj2G0TT&wA7JpWwQ6Y8;pEKUc z+gh@%mVgtmU(nxVWEb6W@qh$Ro9ff1Xr3z4}W#H)feP}j`^7} zckFnZ}>NjRjKu|_y{zycHRNZ6?G_7S- zRYwq1W)MsNE+*=wA76_S4ux)C@7G7c)6-WYDhD={Ky@M#bwI=sC$K3$ySu&V7&!$F zO^7qBra~BL4 zX^8-9%Chu5QWzKcNA_;>xaNk2 z+$O6%;^K;6_d>(MvaSrB8t<>8gR)+VHt6TTK$=5bVanjiy1@k~8^no$CEo2ic@Z`$ zm?V_kBuFj_EnHLg3N4c*Ak*~BuScbEk!kNAJ$}3m&wOW(L%rDpi*`K-D|yGocNI|sv)IV0R@nlV-SXx0A)n* zzG!1(e*U~4Ohvrgw|D2iQcFmAtC^a2sl5@^%0Fy4y5U>#-?y({b8p|SIP_x0+yP+F zRqNJ$1a^P!I(3Oyjb!IXmU~Qh(5>N;*#h6ho!Z&icb~G{wv1Z@?wKsQHaEEoaQW}# zkf9@TuJG}vawunL`JYvDGsjl)Yiob>CEPo9DD|ga zNOh`biXEBD6f`Y3M13)h?CR~k1ruN#ik^k%jG0fJpr9N02`%veU9o%p98!#&NMsj$Z%2Dt4^d#C63ktQW*Va+qrh++8oW7Z@j-N?OO` zuv@gG0)?rL?OTY@)*k;BR9%l!u|0Y9(3Uqw8FrTlgR)qxmG)3u&sEjhMSG|O=sCY` zf74sNWR0!V`v5jka5_#m(&RFp$HvFUo79E@gm!nIeroh)gZu1wQS`nGAz@)RA+O}O z+cGc@1Oj9l32NPk4H9y5nvubSyi@_y6Ca@E{kCm^I1^n6CJE<1TL$V=dB1Be8~tjD zMI^8eyGV?fsJS1(X6-N?7A|dW=AfsiN71B0xM%}|f<6Mr5UD>K4EB5uasKUVP6Bx) zRBAOi*y%p3$(+{g2XaT(MgN+1w!4;|z^@g<7hoSWJatMzB$9XEKK)VF+&m*!Fx5@( zuDz@keiI<+IlJ@gin(GP$9~4b|51!~Z1KD=b|%~7DpEMHIw@dT

    4mVS_TV2WFu0 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.argmin_chunk)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204 (_nearest_vertex_seed_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:351 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)" + ] + }, + { + "instruction": "loop_dynamic_update_slice_fusion", + "ms": 0.04092318799999643, + "opcode": "fusion", + "shape": "s32[21,1024]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204 (_nearest_vertex_seed_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:351 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "loop_add_fusion", + "ms": 0.03184665599999613, + "opcode": "fusion", + "shape": "s64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204 (_nearest_vertex_seed_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:351 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "loop_broadcast_fusion", + "ms": 0.001947906000000019, + "opcode": "fusion", + "shape": "s32[21,1024]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204 (_nearest_vertex_seed_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:351 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "pdip_solve": [ + { + "instruction": "cholesky.60", + "ms": 7.3568516539998265, + "opcode": "custom-call", + "shape": "(f64[1500,1500]{0,1}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:252 (active_set_search..body_fun)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:262 (active_set_search)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:293 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)" + ] + }, + { + "instruction": "cholesky.80", + "ms": 5.495896969999859, + "opcode": "custom-call", + "shape": "(f64[1500,1500]{0,1}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:106", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:106 (factorize_kkt)", + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:212 (pdip_pc_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:83 (solve_nnls)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:129 (_solve_nnls_primal_with..primal)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:164 (solve_nnls_primal_with_status)" + ] + }, + { + "instruction": "triangular-solve.1", + "ms": 1.3107075099999719, + "opcode": "custom-call", + "shape": "(f64[1500,1]{0,1}, s8[0]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:154", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:154 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:252 (active_set_search..body_fun)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:262 (active_set_search)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:293 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)" + ] + }, + { + "instruction": "triangular-solve", + "ms": 1.135827262000028, + "opcode": "custom-call", + "shape": "(f64[1500,1]{0,1}, s8[0]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:154", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:154 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:252 (active_set_search..body_fun)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:262 (active_set_search)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:293 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)" + ] + }, + { + "instruction": "cholesky.110", + "ms": 0.8924842900000037, + "opcode": "custom-call", + "shape": "(f64[1500,1500]{0,1}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:297 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:274 (_certified_positive_only_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:496 (reconstruction_positive_only_from)" + ] + }, + { + "instruction": "triangular-solve.2", + "ms": 0.8715290660000179, + "opcode": "custom-call", + "shape": "(f64[1500,1]{0,1}, s8[0]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146 (solve_kkt_rhs)", + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:213 (pdip_pc_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:83 (solve_nnls)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:129 (_solve_nnls_primal_with..primal)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:164 (solve_nnls_primal_with_status)" + ] + } + ], + "regularization_H": [ + { + "instruction": "input_scatter_fusion.10", + "ms": 0.0020572860000000115, + "opcode": "fusion", + "shape": "f64[1500,1500]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:615", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:615 (pixel_splitted_regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt_split.py:137 (AdaptSplit.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:332 (AbstractInversion.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "input_concatenate_fusion.8", + "ms": 0.0018499239999999874, + "opcode": "fusion", + "shape": "pred[3]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:93", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:93 (split_points_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:410 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + }, + { + "instruction": "input_concatenate_fusion.10", + "ms": 0.0018477559999999864, + "opcode": "fusion", + "shape": "pred[3]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:90", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:90 (split_points_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:410 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + }, + { + "instruction": "input_concatenate_fusion.9", + "ms": 0.0018391719999999924, + "opcode": "fusion", + "shape": "pred[3]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:91", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:91 (split_points_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:410 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + }, + { + "instruction": "input_concatenate_fusion", + "ms": 0.0017546959999999875, + "opcode": "fusion", + "shape": "s32[1500,2]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:615", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:615 (pixel_splitted_regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt_split.py:137 (AdaptSplit.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:332 (AbstractInversion.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "input_concatenate_fusion.11", + "ms": 0.001504771999999999, + "opcode": "fusion", + "shape": "pred[3]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:88", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:88 (split_points_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:410 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + } + ], + "mesh_locate_walk": [ + { + "instruction": "input_reduce_fusion.1", + "ms": 0.025060842, + "opcode": "fusion", + "shape": "pred[196]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:288", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:288 (_walk_from_seed..cond)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:353 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)" + ] + }, + { + "instruction": "loop_reduce_fusion", + "ms": 0.02501252400000029, + "opcode": "fusion", + "shape": "(f64[21361]{0}, s64[21361]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:264", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:264 (_walk_from_seed..walk_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:292 (_walk_from_seed..body)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:264 (_walk_from_seed..walk_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:292 (_walk_from_seed..body)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)" + ] + }, + { + "instruction": "loop_or_select_fusion", + "ms": 0.02211751599999975, + "opcode": "fusion", + "shape": "(s32[21361]{0}, pred[21361]{0}, pred[21361]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:270", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:270 (_walk_from_seed..walk_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:292 (_walk_from_seed..body)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:353 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)" + ] + }, + { + "instruction": "loop_select_fusion", + "ms": 0.019843684000000437, + "opcode": "fusion", + "shape": "s32[21361]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:242", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:242 (_walk_from_seed..weights_of)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:262 (_walk_from_seed..walk_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:292 (_walk_from_seed..body)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:353 (pix_indexes_delaunay_walk_from)" + ] + }, + { + "instruction": "input_reduce_fusion.2", + "ms": 0.01620201999999949, + "opcode": "fusion", + "shape": "pred[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:288", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:288 (_walk_from_seed..cond)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:353 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)" + ] + }, + { + "instruction": "while.34", + "ms": 0.01440621800000083, + "opcode": "while", + "shape": "(s32[], s32[21361]{0}, pred[21361]{0}, pred[21361]{0}, s32[3000,3]{1,0}, /*index=5*/f64[1500,2]{1,0}, f64[21361,2]{1,0}, s32[3000,3]{1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:353 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "psf_convolution_mapping_matrix": [ + { + "instruction": "input_scatter_fusion", + "ms": 1.9798064759999974, + "opcode": "fusion", + "shape": "f64[1500,180,180]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "fft.19.0", + "ms": 1.7557597519999995, + "opcode": "fft", + "shape": "f64[1500,180,180]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "fft.15.0", + "ms": 1.3637167439999986, + "opcode": "fft", + "shape": "c128[1500,180,91]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "fft.17.0", + "ms": 0.9788367500000004, + "opcode": "fft", + "shape": "c128[1500,91,180]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "input_transpose_fusion.4", + "ms": 0.5138481179999995, + "opcode": "fusion", + "shape": "c128[1500,91,180]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "wrapped_transpose", + "ms": 0.498117416, + "opcode": "fusion", + "shape": "c128[1500,180,91]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + } + ], + "inversion_other": [ + { + "instruction": "cholesky.120", + "ms": 0.8961964400000054, + "opcode": "custom-call", + "shape": "(f64[1500,1500]{0,1}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986 (AbstractInversion._log_det_symmetric_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:1078 (AbstractInversion.log_det_curvature_reg_matrix_term)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:347 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/model/analysis.py:135 (AnalysisImaging.log_likelihood_function)" + ] + }, + { + "instruction": "cholesky.130", + "ms": 0.8916410960000056, + "opcode": "custom-call", + "shape": "(f64[1500,1500]{0,1}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986 (AbstractInversion._log_det_symmetric_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:1157 (AbstractInversion.log_det_regularization_matrix_term)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:348 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/model/analysis.py:135 (AnalysisImaging.log_likelihood_function)" + ] + }, + { + "instruction": "loop_reduce_window_fusion.1", + "ms": 0.0027720500000000033, + "opcode": "fusion", + "shape": "s64[94,16]{1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "loop_reduce_window_fusion", + "ms": 0.002687965999999994, + "opcode": "fusion", + "shape": "s64[6,16]{1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "loop_broadcast_convert_fusion", + "ms": 0.0021780000000000002, + "opcode": "fusion", + "shape": "(s32[1500]{0}, s64[1500]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:527", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:527 (AbstractInversion.zeroed_ids_to_keep)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:567 (AbstractInversion.solve_ids_to_keep)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:684 (AbstractInversion.reconstruction)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "input_scatter_fusion.5", + "ms": 0.0019317339999999998, + "opcode": "fusion", + "shape": "s64[1500]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:527", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:527 (AbstractInversion.zeroed_ids_to_keep)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:567 (AbstractInversion.solve_ids_to_keep)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:684 (AbstractInversion.reconstruction)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "mapping_matrix": [ + { + "instruction": "input_reduce_fusion.31", + "ms": 0.00288795000000002, + "opcode": "fusion", + "shape": "f64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:93", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:93 (adaptive_pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/abstract.py:507 (Mapper.pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt.py:339 (Adapt.regularization_weights_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt_split.py:120 (AdaptSplit.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)" + ] + } + ], + "curvature_matrix_F": [ + { + "instruction": "cublas-lt-matmul.2", + "ms": 4.212703104000002, + "opcode": "custom-call", + "shape": "(f64[1500,1500]{1,0}, s8[4194304]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:134", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:134 (curvature_matrix_via_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:93 (InversionImagingMapping.curvature_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:389 (AbstractInversion.curvature_reg_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "chi_squared_evidence": [ + { + "instruction": "loop_multiply_fusion.2", + "ms": 0.003015510000000009, + "opcode": "fusion", + "shape": "f64[15361]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/abstract_ndarray.py:300", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/abstract_ndarray.py:300 (AbstractNDArray.__pow__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/abstract_ndarray.py:60 (unwrap_array..wrapper)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/abstract_ndarray.py:35 (to_new_array..wrapper)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_util.py:78 (chi_squared_map_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:78 (AbstractFit.chi_squared_map)" + ] + } + ] + }, + "stage_audit_note": "The HLO instructions that contributed most of each stage's milliseconds, with their full source stack. A stage row is only as good as the rules that built it; this is how a reader checks a row against the HLO instead of trusting it.", + "untraced_wall_ms": 44.54925777400058, + "reconciliation_vs_untraced_pct": -28.63822629935343, + "wall_basis": "wall_ms is the TRACED run's wall, the run these kernel durations came from. untraced_wall_ms is the same executable without the profiler; the difference is the profiler's overhead and belongs in neither the stages nor the idle row.", + "calls": 500, + "call_split": "per-call (first-instruction recurrence)", + "call_blocks": 500, + "events": 361000, + "streams": [ + "Stream #14(Memset,MemcpyD2H,Compute,MemcpyH2D,MemcpyD2D)" + ], + "per_stage_ms": { + "border_relocator": { + "median_ms": 0.10147300000000001, + "min_ms": 0.10067400000000001, + "max_ms": 0.10230600000000001 + }, + "chi_squared_evidence": { + "median_ms": 0.003008, + "min_ms": 0.002816, + "max_ms": 0.003488 + }, + "curvature_matrix_F": { + "median_ms": 4.211076, + "min_ms": 4.192884, + "max_ms": 4.322485 + }, + "inversion_other": { + "median_ms": 1.7970625, + "min_ms": 1.777718, + "max_ms": 1.841813 + }, + "mapping_matrix": { + "median_ms": 0.00288, + "min_ms": 0.002848, + "max_ms": 0.002913 + }, + "memset": { + "median_ms": 0.023728, + "min_ms": 0.009888000000000001, + "max_ms": 0.09891300000000001 + }, + "mesh_construction": { + "median_ms": 0.00192, + "min_ms": 0.001888, + "max_ms": 0.001953 + }, + "mesh_locate_walk": { + "median_ms": 0.14797050000000006, + "min_ms": 0.13011300000000003, + "max_ms": 0.1837410000000001 + }, + "mesh_qhull_callback": { + "median_ms": 0.010561000000000001, + "min_ms": 0.010464000000000001, + "max_ms": 0.011168 + }, + "mesh_seed_argmin": { + "median_ms": 0.22282000000000007, + "min_ms": 0.2224350000000001, + "max_ms": 0.2232690000000001 + }, + "mixed_fusion": { + "median_ms": 1.9793454999999995, + "min_ms": 1.9718319999999994, + "max_ms": 1.9932419999999993 + }, + "other": { + "median_ms": 0.0658245, + "min_ms": 0.06326299999999999, + "max_ms": 0.073409 + }, + "pdip_solve": { + "median_ms": 8.8988135, + "min_ms": 2.420607, + "max_ms": 52.51687400000008 + }, + "psf_convolution_mapping_matrix": { + "median_ms": 7.089864, + "min_ms": 7.076376000000001, + "max_ms": 7.105529000000001 + }, + "regularization_H": { + "median_ms": 0.010848, + "min_ms": 0.010656, + "max_ms": 0.011297 + } + }, + "stage_order": [ + "border_relocator", + "mesh_qhull_callback", + "mesh_seed_argmin", + "mesh_locate_walk", + "mesh_construction", + "mapping_matrix", + "psf_convolution_mapping_matrix", + "curvature_matrix_F", + "regularization_H", + "pdip_solve", + "chi_squared_evidence", + "inversion_other", + "mixed_fusion", + "other", + "memset" + ], + "mixed_fusion": { + "ms": 1.9793454999999995, + "constituent_stage_sets": { + "curvature_matrix_F + psf_convolution_mapping_matrix": 1.0147081019999997, + "pdip_solve + psf_convolution_mapping_matrix": 0.2257948400000001, + "data_vector_D + pdip_solve": 0.12487178999999989, + "mapped_reconstruction + pdip_solve": 0.114598196, + "mapping_matrix + pdip_solve": 0.1127868219999995, + "curvature_reg_reduce_gather + inversion_other + mapped_reconstruction + pdip_solve + reconstruction_scatter": 0.10947590399999996, + "pdip_solve + regularization_H": 0.04510727800000014, + "inversion_other + pdip_solve + regularization_H": 0.024210517999999997, + "inversion_other + pdip_solve": 0.022894710000000252, + "inversion_other + mapping_matrix + mesh_construction + mesh_dual_areas + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin + pdip_solve": 0.021158711999999927, + "inversion_other + mesh_construction + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin + pdip_solve + regularization_H": 0.01877424599999999, + "inversion_other + mesh_construction + mesh_dual_areas + mesh_interpolation_weights + pdip_solve + regularization_H": 0.014763329999999995, + "pdip_solve + ray_trace_data_grid": 0.013689534000000097, + "border_relocator + pdip_solve": 0.013573581999999999, + "inversion_other + mapping_matrix + mesh_construction + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin": 0.011661483999999995, + "grids_and_structures + mass_profile_deflections + pdip_solve": 0.010123599999999995, + "grids_and_structures + mass_profile_deflections + pdip_solve + ray_trace_data_grid": 0.008998284, + "chi_squared_evidence + pdip_solve": 0.007715376000000024, + "inversion_other + mesh_construction + mesh_seed_argmin + pdip_solve + regularization_H": 0.007110957999999991, + "inversion_other + mesh_dual_areas + mesh_locate_walk": 0.006664112000000127, + "inversion_other + mesh_construction + pdip_solve + regularization_H": 0.006312925999999992, + "grids_and_structures + mass_profile_deflections + ray_trace_data_grid": 0.0054836200000000015, + "inversion_other + pdip_solve + ray_trace_data_grid": 0.005315085999999961, + "inversion_other + regularization_H": 0.004865931999999971, + "inversion_other + mapped_reconstruction + pdip_solve + reconstruction_scatter": 0.004811862000000001, + "inversion_other + mapped_reconstruction": 0.003720097999999992, + "mapping_matrix + pdip_solve + regularization_H": 0.003487187999999997, + "inversion_other + mesh_construction + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin": 0.0030994140000000087, + "inversion_other + mesh_construction + mesh_dual_areas + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin": 0.0029285260000000177, + "inversion_other + mesh_construction + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin + regularization_H": 0.0026811060000000086, + "inversion_other + mesh_dual_areas + mesh_locate_walk + pdip_solve": 0.002590290000000015, + "inversion_other + mesh_locate_walk + mesh_seed_argmin": 0.002479748000000007, + "inversion_other + mesh_interpolation_weights": 0.002154182000000006, + "chi_squared_evidence + inversion_other": 0.0018707900000000017 + }, + "example_kernels": { + "curvature_matrix_F + psf_convolution_mapping_matrix": [ + "loop_divide_gather_fusion" + ], + "pdip_solve + psf_convolution_mapping_matrix": [ + "loop_broadcast_fusion.4" + ], + "data_vector_D + pdip_solve": [ + "input_reduce_fusion.13", + "input_reduce_fusion.29" + ], + "mapped_reconstruction + pdip_solve": [ + "input_reduce_fusion.17" + ], + "mapping_matrix + pdip_solve": [ + "loop_broadcast_fusion.2", + "loop_divide_fusion" + ], + "curvature_reg_reduce_gather + inversion_other + mapped_reconstruction + pdip_solve + reconstruction_scatter": [ + "input_multiply_transpose_fusion" + ], + "pdip_solve + regularization_H": [ + "loop_select_fusion.5", + "input_transpose_fusion.5" + ], + "inversion_other + pdip_solve + regularization_H": [ + "input_transpose_fusion.6" + ], + "inversion_other + pdip_solve": [ + "input_reduce_fusion.15", + "loop_log_fusion", + "input_reduce_fusion.16", + "input_reduce_fusion.20" + ], + "inversion_other + mapping_matrix + mesh_construction + mesh_dual_areas + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin + pdip_solve": [ + "input_scatter_fusion.6", + "input_scatter_fusion.3" + ] + }, + "prorated_estimate_ms": { + "psf_convolution_mapping_matrix": 0.6202514709999999, + "curvature_matrix_F": 0.5073540509999999, + "pdip_solve": 0.39167800337619035, + "mapped_reconstruction": 0.08225729329999998, + "inversion_other": 0.06867465050952395, + "data_vector_D": 0.06243589499999994, + "mapping_matrix": 0.0621442266666664, + "regularization_H": 0.04280903790952385, + "reconstruction_scatter": 0.02309814629999999, + "curvature_reg_reduce_gather": 0.02189518079999999, + "mesh_construction": 0.014286254376190466, + "ray_trace_data_grid": 0.012693906666666704, + "mesh_locate_walk": 0.012520802109523853, + "mesh_interpolation_weights": 0.012362922276190475, + "mesh_seed_argmin": 0.01107405054285714, + "mesh_dual_areas": 0.008462424833333372, + "grids_and_structures": 0.007451977666666666, + "mass_profile_deflections": 0.007451977666666666, + "border_relocator": 0.0067867909999999995, + "chi_squared_evidence": 0.004793083000000013 + }, + "prorated_note": "ESTIMATE ONLY \u2014 a mixed fusion's time split equally across the stages its constituents span. Never summed into the measured table, never reconciled." + }, + "other_sources_ms": { + "copy.106": 0.041848820000001674, + "copy.70": 0.01687242399999937, + "copy.75": 0.0019623840000000084, + "copy.61": 0.001654087999999997, + "copy.104": 0.001651657999999998, + "copy.105": 0.001639433999999996, + "copy.103": 0.0006567739999999985, + "copy.40": 0.0005587200000000002 + }, + "device_span_ms": 45.881268817999995, + "device_busy_ms": 38.6573228, + "device_idle_ms": 7.223946017999992, + "largest_idle_gaps": [ + { + "gap_ms": 5.429953, + "after": "pure_callback.4", + "before": "pure_callback.4" + }, + { + "gap_ms": 0.041119, + "after": "input_concatenate_fusion.7", + "before": "pure_callback.4" + }, + { + "gap_ms": 0.032543, + "after": "pure_callback.4", + "before": "copy.105" + }, + { + "gap_ms": 0.028608, + "after": "copy.70", + "before": "input_reduce_fusion.1" + }, + { + "gap_ms": 0.023872, + "after": "copy.105", + "before": "copy.61" + }, + { + "gap_ms": 0.021055, + "after": "loop_or_select_fusion", + "before": "copy.70" + }, + { + "gap_ms": 0.02032, + "after": "while.40", + "before": "input_reduce_select_fusion" + }, + { + "gap_ms": 0.019423, + "after": "input_reduce_fusion.28", + "before": "loop_broadcast_fusion.4" + } + ], + "kernel_ms": 24.5671945, + "sum_ms": 31.79114051799999, + "wall_ms": 45.88357532199734, + "host_outside_span_ms": 0.002306503997345999, + "reconciliation_pct": -30.713462726260573, + "unjoined_ms": 0.0, + "unjoined_pct": 0.0, + "other_ms": 0.0658245, + "other_pct": 0.14345983184192415, + "note": "Stage rows attribute the command-buffers-OFF program (see the module docstring): kernel times are the same, the launch overhead the CUDA graphs remove is not. sum_ms = kernel rows + device_idle_ms; the residual against wall_ms is host_outside_span_ms (dispatch before the first kernel, teardown after the last).", + "per_stage_ms_per_lane": { + "border_relocator": 0.10147300000000001, + "chi_squared_evidence": 0.003008, + "curvature_matrix_F": 4.211076, + "inversion_other": 1.7970625, + "mapping_matrix": 0.00288, + "memset": 0.023728, + "mesh_construction": 0.00192, + "mesh_locate_walk": 0.14797050000000006, + "mesh_qhull_callback": 0.010561000000000001, + "mesh_seed_argmin": 0.22282000000000007, + "mixed_fusion": 1.9793454999999995, + "other": 0.0658245, + "pdip_solve": 8.8988135, + "psf_convolution_mapping_matrix": 7.089864, + "regularization_H": 0.010848 + }, + "per_lane_divisor": 1, + "host_callback": { + "pure_callback_span_ms": 252.1864798000001, + "qhull_ms": 235.4625997999999, + "callback_body_ms_note": "the OUTERMOST matching body event, not a sum: under the probe the body appears twice (the wrapper and the timed re-implementation it calls) and summing them would count the same work twice", + "events_by_name": { + "pure_callback.4": { + "count": 500, + "ms": 252.1864798000001 + }, + "$callback.py:815 _wrapped_callback": { + "count": 500, + "ms": 247.94798569999986 + }, + "$callback.py:224 _callback": { + "count": 500, + "ms": 246.77904789999994 + }, + "$callback.py:74 pure_callback_impl": { + "count": 500, + "ms": 246.33716370000008 + }, + "$callback.py:69 __call__": { + "count": 500, + "ms": 236.22453499999978 + }, + "$delaunay.py:162 ": { + "count": 500, + "ms": 235.90392849999995 + }, + "$host_callback_probe.py:225 wrapped": { + "count": 500, + "ms": 235.4625997999999 + }, + "$host_callback_probe.py:160 _timed_tri_only": { + "count": 500, + "ms": 235.06521530000015 + }, + "ThenExecuteCallback:GetEventForComputeStreamSyncPoint": { + "count": 500, + "ms": 0.8981313000000002 + }, + "$callback.py:822 ": { + "count": 2000, + "ms": 0.7075121000000016 + }, + "$__init__.py:132 _xla_gc_callback": { + "count": 8, + "ms": 0.0033020000000000002 + } + }, + "note": "HOST milliseconds per traced BATCH (the whole invocation), aggregated by name because the events nest. Not a row of the device table: the device pays for them as the idle gaps largest_idle_gaps names." + }, + "host_callback_ms": 252.1864798000001 + }, + "hlo_census": { + "status": "excluded", + "reason": "The legacy census anchors PyAutoArray source line numbers that moved after the phase-1 run. No batched attribution is published from unsupported anchors; the device-event table and wall reconciliation remain valid." + }, + "stage_map_provenance": [ + { + "label": "log_det_curvature_reg", + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 850, + 882 + ], + "requires": { + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 884, + 896 + ] + }, + "function": null + }, + { + "label": "log_det_regularization", + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 850, + 882 + ], + "requires": { + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 897, + 943 + ] + }, + "function": null + }, + { + "label": "curvature_reg_add", + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 359, + 372 + ], + "requires": null, + "function": null + }, + { + "label": "curvature_reg_reduce_gather", + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 374, + 398 + ], + "requires": null, + "function": null + }, + { + "label": "edge_subset_gather", + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 606, + 614 + ], + "requires": null, + "function": null + }, + { + "label": "regularization_term", + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 786, + 849 + ], + "requires": null, + "function": null + }, + { + "label": "mapped_reconstruction", + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 722, + 785 + ], + "requires": null, + "function": null + }, + { + "label": "reconstruction_scatter", + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 583, + 605 + ], + "requires": null, + "function": null + }, + { + "label": "reconstruction_scatter", + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 615, + 721 + ], + "requires": null, + "function": null + }, + { + "label": "certified_active_set_solve", + "path": "likelihood_breakdown/active_set_steps.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "certified_active_set_solve", + "path": "likelihood_breakdown/library_solver_injection.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "pdip_solve", + "path": "PyAutoArray/autoarray/util/jax_nnls.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "pdip_solve", + "path": "PyAutoArray/autoarray/inversion/inversion/inversion_util.py", + "lines": [ + 256, + 488 + ], + "requires": null, + "function": null + }, + { + "label": "mapped_reconstruction", + "path": "PyAutoArray/autoarray/inversion/inversion/inversion_util.py", + "lines": [ + 156, + 200 + ], + "requires": null, + "function": null + }, + { + "label": "curvature_matrix_F", + "path": "PyAutoArray/autoarray/inversion/inversion/inversion_util.py", + "lines": [ + 12, + 155 + ], + "requires": null, + "function": null + }, + { + "label": "reconstruction_scatter", + "path": "PyAutoArray/autoarray/inversion/inversion/inversion_util.py", + "lines": [ + 201, + 255 + ], + "requires": null, + "function": null + }, + { + "label": "data_vector_D", + "path": "PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py", + "lines": [ + 54, + 73 + ], + "requires": null, + "function": null + }, + { + "label": "curvature_matrix_F", + "path": "PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py", + "lines": [ + 74, + 110 + ], + "requires": null, + "function": null + }, + { + "label": "data_vector_D", + "path": "PyAutoArray/autoarray/inversion/inversion/imaging/inversion_imaging_util.py", + "lines": null, + "requires": null, + "function": "data_vector_via_blurred_mapping_matrix_from" + }, + { + "label": "curvature_matrix_F", + "path": "PyAutoArray/autoarray/inversion/inversion/imaging/inversion_imaging_util.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "psf_convolution_mapping_matrix", + "path": "likelihood_breakdown/psf_cube_injection.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "psf_convolution_mapping_matrix", + "path": "PyAutoArray/autoarray/operators/convolver.py", + "lines": [ + 1086, + 1300 + ], + "requires": null, + "function": null + }, + { + "label": "psf_convolution_mapping_matrix", + "path": "PyAutoArray/autoarray/operators/convolver.py", + "lines": [ + 632, + 642 + ], + "requires": null, + "function": null + }, + { + "label": "psf_convolution_mapping_matrix", + "path": "PyAutoArray/autoarray/operators/convolver.py", + "lines": [ + 670, + 691 + ], + "requires": null, + "function": null + }, + { + "label": "psf_convolution_mapping_matrix", + "path": "PyAutoArray/autoarray/operators/convolver.py", + "lines": null, + "requires": { + "path": "PyAutoArray/autoarray/operators/convolver.py", + "lines": [ + 1086, + 1300 + ] + }, + "function": null + }, + { + "label": "psf_convolution_mapping_matrix", + "path": "PyAutoArray/autoarray/operators/convolver.py", + "lines": null, + "requires": { + "path": "PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py", + "lines": [ + 119, + 150 + ] + }, + "function": null + }, + { + "label": "psf_convolution_image", + "path": "PyAutoArray/autoarray/operators/convolver.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "psf_convolution_mapping_matrix", + "path": "PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py", + "lines": [ + 119, + 150 + ], + "requires": null, + "function": null + }, + { + "label": "mesh_qhull_callback", + "path": "PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py", + "lines": [ + 139, + 172 + ], + "requires": null, + "function": null + }, + { + "label": "mesh_seed_argmin", + "path": "PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py", + "lines": [ + 173, + 207 + ], + "requires": null, + "function": null + }, + { + "label": "mesh_locate_walk", + "path": "PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py", + "lines": [ + 208, + 372 + ], + "requires": null, + "function": null + }, + { + "label": "mesh_dual_areas", + "path": "PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py", + "lines": [ + 373, + 396 + ], + "requires": null, + "function": null + }, + { + "label": "mesh_dual_areas", + "path": "PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py", + "lines": [ + 437, + 494 + ], + "requires": null, + "function": null + }, + { + "label": "mesh_dual_areas", + "path": "PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py", + "lines": [ + 605, + 615 + ], + "requires": null, + "function": null + }, + { + "label": "mesh_interpolation_weights", + "path": "PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py", + "lines": [ + 616, + 695 + ], + "requires": null, + "function": null + }, + { + "label": "mesh_interpolation_weights", + "path": "PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py", + "lines": [ + 896, + 1000 + ], + "requires": null, + "function": null + }, + { + "label": "mesh_construction", + "path": "PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "border_relocator", + "path": "PyAutoArray/autoarray/inversion/mesh/border_relocator.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "mesh_construction", + "path": "PyAutoArray/autoarray/inversion/mesh/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "mapping_matrix", + "path": "PyAutoArray/autoarray/inversion/mappers/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "mapping_matrix", + "path": "PyAutoArray/autoarray/inversion/mappings/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "mapping_matrix", + "path": "PyAutoArray/autoarray/inversion/linear_obj/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "regularization_H", + "path": "PyAutoArray/autoarray/inversion/regularization/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "chi_squared_evidence", + "path": "PyAutoArray/autoarray/fit/fit_util.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "chi_squared_evidence", + "path": "PyAutoArray/autoarray/fit/fit_dataset.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "ray_trace_mesh_grid", + "path": "PyAutoLens/autolens/lens/to_inversion.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "ray_trace_mesh_grid", + "path": "PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "mass_profile_deflections", + "path": "PyAutoGalaxy/autogalaxy/profiles/mass/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "light_profile_image", + "path": "PyAutoGalaxy/autogalaxy/profiles/light/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "light_profile_image", + "path": "PyAutoGalaxy/autogalaxy/operate/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "ray_trace_data_grid", + "path": "PyAutoLens/autolens/lens/tracer.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "ray_trace_data_grid", + "path": "PyAutoLens/autolens/lens/tracer_util.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "grids_and_structures", + "path": "PyAutoArray/autoarray/structures/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "grids_and_structures", + "path": "PyAutoArray/autoarray/operators/over_sampling/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "grids_and_structures", + "path": "PyAutoArray/autoarray/geometry/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "inversion_other", + "path": "PyAutoArray/autoarray/inversion/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "fit_imaging_other", + "path": "PyAutoLens/autolens/imaging/fit_imaging.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "fit_imaging_other", + "path": "PyAutoGalaxy/autogalaxy/imaging/fit_imaging.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "fit_imaging_other", + "path": "PyAutoArray/autoarray/fit/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "analysis_other", + "path": "PyAutoLens/autolens/analysis/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "analysis_other", + "path": "PyAutoGalaxy/autogalaxy/analysis/", + "lines": null, + "requires": null, + "function": null + } + ], + "trace_timing": { + "traced_wall_ms": 45.88357532199734, + "untraced_wall_ms": 44.54925777400058, + "profiler_overhead_ms": 1.3343175479967613, + "profiler_overhead_pct": 2.995151018600097 + }, + "jit_phases": { + "b_s3_pdip_library_likelihood_jit": { + "lower_s": 1.5109468279988505, + "compile_s": 4.441316658001597, + "first_call_s": 0.13672840100116446, + "steady_per_call_s": 0.05058619160008675 + }, + "d_s3_certified_fallback_library_likelihood_jit": { + "lower_s": 0.4838310579980316, + "compile_s": 4.245811112999945, + "first_call_s": 0.04881459199896199, + "steady_per_call_s": 0.03148247690005519 + } + }, + "peak_bytes": { + "after_setup": 85108992, + "after_routes": 1181653248, + "after_all": 58804887808, + "note": "jax.devices()[0].memory_stats()['peak_bytes_in_use']; None on a backend that does not report it (CPU). Process-wide high-water marks." + }, + "note": "Every stage row is a MEASURED sum of GPU kernel durations joined to library source through the optimized HLO of ONE program \u2014 not arithmetic across compilations. The rows attribute the command-buffers-OFF program: kernel time is the same as production, the launch overhead the CUDA graphs remove is not, and command_buffers.* carries both walls and their delta. sum_ms = kernel rows + measured device_idle_ms; the residual against the wall is host_outside_span_ms and is reported, not absorbed. mixed_fusion.prorated_estimate_ms is an ESTIMATE and is never part of the table. No row may be quoted if reconciliation_pct is outside 5 % or unjoined_ms is non-zero.", + "vmap": { + "batch": 50, + "lanes_mode": "captured", + "arms": [ + "vmap", + "scalar" + ], + "draw_seed": 0, + "fallback": true, + "composition": "jax.jit(jax.vmap(fn))", + "composition_provenance": "Current Fitness._vmap after PyAutoFit#1638. Array 343376 used the retired jax.vmap(jax.jit(fn)) composition and is historical evidence only.", + "headline_arm": "scalar", + "lane_rtol": 1e-09, + "lanes": [ + { + "lane": 0, + "draw_name": "call00015_lane00", + "draw_kind": "captured", + "offsets": { + "centre_0": -0.0033655095107821688, + "centre_1": 0.004631951955766499, + "ell_comps_0": 0.000564301988937442, + "ell_comps_1": -0.00879076787683888, + "einstein_radius": 0.018337010967920175 + }, + "log_likelihood_vmap": 18700.594048999155, + "log_likelihood_scalar": 24758.506194309353, + "log_likelihood_library_pdip": 18700.594049000425, + "log_likelihood_library_pdip_scalar": 24758.506194309135, + "rel_diff_vmap_vs_library_pdip": 6.78938113061105e-14, + "rel_diff_scalar_vs_library_pdip_scalar": 8.816312531637115e-15, + "abs_diff_nats": 6057.912145310198, + "rel_diff": 0.24468003431897623, + "rel_diff_scalar_vs_library_pdip": 0.32394223036100467, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 6057.91214530871, + "rel_diff_library_pdip_vmap_vs_scalar": 0.24468003431891827, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": false, + "passes": 16, + "pdip_iter": null + }, + { + "lane": 1, + "draw_name": "call00015_lane01", + "draw_kind": "captured", + "offsets": { + "centre_0": -0.004311760382151672, + "centre_1": 0.0027192789928108052, + "ell_comps_0": 0.0061667694809026535, + "ell_comps_1": 0.003465536775180321, + "einstein_radius": -0.05732579988501185 + }, + "log_likelihood_vmap": 14200.2143078324, + "log_likelihood_scalar": 20551.004887772608, + "log_likelihood_library_pdip": 14200.214306774666, + "log_likelihood_library_pdip_scalar": 20551.00488777298, + "rel_diff_vmap_vs_library_pdip": 7.448726049857396e-11, + "rel_diff_scalar_vs_library_pdip_scalar": 1.8056238142599476e-14, + "abs_diff_nats": 6350.790579940207, + "rel_diff": 0.30902579288075527, + "rel_diff_scalar_vs_library_pdip": 0.4472320236722128, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 6350.790580998313, + "rel_diff_library_pdip_vmap_vs_scalar": 0.30902579293223653, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": false, + "passes": 16, + "pdip_iter": null + }, + { + "lane": 2, + "draw_name": "call00015_lane02", + "draw_kind": "captured", + "offsets": { + "centre_0": 0.0002796502552123051, + "centre_1": 0.0016003321376979894, + "ell_comps_0": -0.002094430657472772, + "ell_comps_1": 0.006146479068253558, + "einstein_radius": -0.025968910196758177 + }, + "log_likelihood_vmap": -23119.397918166338, + "log_likelihood_scalar": -189709.07359119633, + "log_likelihood_library_pdip": -23119.269283083646, + "log_likelihood_library_pdip_scalar": -189709.07575724524, + "rel_diff_vmap_vs_library_pdip": 5.563977006242197e-06, + "rel_diff_scalar_vs_library_pdip_scalar": 1.1417740063377248e-08, + "abs_diff_nats": 166589.67567303, + "rel_diff": 0.8781323556089559, + "rel_diff_scalar_vs_library_pdip": 7.205669100883147, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 166589.8064741616, + "rel_diff_library_pdip_vmap_vs_scalar": 0.8781330350653996, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "FAIL", + "certified": true, + "passes": 1, + "pdip_iter": null + }, + { + "lane": 3, + "draw_name": "call00015_lane03", + "draw_kind": "captured", + "offsets": { + "centre_0": 0.004594602299816973, + "centre_1": 0.004924922434755804, + "ell_comps_0": 0.028601845732661953, + "ell_comps_1": 0.003760187047606014, + "einstein_radius": -0.03088526730480501 + }, + "log_likelihood_vmap": 18502.010125207293, + "log_likelihood_scalar": -141741.96888570738, + "log_likelihood_library_pdip": 18502.009486267387, + "log_likelihood_library_pdip_scalar": -141741.9662042298, + "rel_diff_vmap_vs_library_pdip": 3.453354114783693e-08, + "rel_diff_scalar_vs_library_pdip_scalar": 1.8918021593985197e-08, + "abs_diff_nats": 160243.97901091469, + "rel_diff": 1.1305330402184992, + "rel_diff_scalar_vs_library_pdip": 8.660895914625463, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 160243.9756904972, + "rel_diff_library_pdip_vmap_vs_scalar": 1.1305330381801582, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "FAIL", + "certified": true, + "passes": 3, + "pdip_iter": null + }, + { + "lane": 4, + "draw_name": "call00015_lane04", + "draw_kind": "captured", + "offsets": { + "centre_0": -0.0060950290987001, + "centre_1": -0.0006121094560707545, + "ell_comps_0": 0.009637314264800585, + "ell_comps_1": 0.006641580028105454, + "einstein_radius": -0.03125810931551931 + }, + "log_likelihood_vmap": 18751.91028804102, + "log_likelihood_scalar": 24880.545932988724, + "log_likelihood_library_pdip": 18751.91028803973, + "log_likelihood_library_pdip_scalar": 24880.545932988734, + "rel_diff_vmap_vs_library_pdip": 6.887204859023277e-14, + "rel_diff_scalar_vs_library_pdip_scalar": 4.386534142245053e-16, + "abs_diff_nats": 6128.6356449477025, + "rel_diff": 0.24632239426956629, + "rel_diff_scalar_vs_library_pdip": 0.3268272699052926, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 6128.635644949005, + "rel_diff_library_pdip_vmap_vs_scalar": 0.24632239426961852, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": false, + "passes": 16, + "pdip_iter": null + }, + { + "lane": 5, + "draw_name": "call00015_lane05", + "draw_kind": "captured", + "offsets": { + "centre_0": -0.008435952123169364, + "centre_1": -0.007849511137408794, + "ell_comps_0": -0.01598149485178925, + "ell_comps_1": 0.01654417876136871, + "einstein_radius": 0.014294380855379263 + }, + "log_likelihood_vmap": 24935.95274065376, + "log_likelihood_scalar": 25472.51918677797, + "log_likelihood_library_pdip": 24935.952740667337, + "log_likelihood_library_pdip_scalar": 25472.519186809055, + "rel_diff_vmap_vs_library_pdip": 5.444723548069624e-13, + "rel_diff_scalar_vs_library_pdip_scalar": 1.2203947587051716e-12, + "abs_diff_nats": 536.5664461242086, + "rel_diff": 0.02106452220880942, + "rel_diff_scalar_vs_library_pdip": 0.021517784048233325, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 536.5664461417182, + "rel_diff_library_pdip_vmap_vs_scalar": 0.021064522209471106, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": true, + "passes": 10, + "pdip_iter": null + }, + { + "lane": 6, + "draw_name": "call00015_lane06", + "draw_kind": "captured", + "offsets": { + "centre_0": 0.0031698313356290646, + "centre_1": -0.0038584140676992847, + "ell_comps_0": 0.01810147576636289, + "ell_comps_1": -0.011577480306416508, + "einstein_radius": 0.016136835525067283 + }, + "log_likelihood_vmap": 28315.201514570836, + "log_likelihood_scalar": -83383.91553783754, + "log_likelihood_library_pdip": 28315.201450716388, + "log_likelihood_library_pdip_scalar": -83383.91543299965, + "rel_diff_vmap_vs_library_pdip": 2.255129565490238e-09, + "rel_diff_scalar_vs_library_pdip_scalar": 1.2572915326225146e-09, + "abs_diff_nats": 111699.11705240837, + "rel_diff": 1.3395762999606573, + "rel_diff_scalar_vs_library_pdip": 3.944846275700005, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 111699.11688371604, + "rel_diff_library_pdip_vmap_vs_scalar": 1.339576299621815, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "FAIL", + "certified": true, + "passes": 3, + "pdip_iter": null + }, + { + "lane": 7, + "draw_name": "call00015_lane07", + "draw_kind": "captured", + "offsets": { + "centre_0": 0.006158729760195174, + "centre_1": 0.004883559265258847, + "ell_comps_0": 0.007613883677130215, + "ell_comps_1": -0.005800175617006949, + "einstein_radius": 0.0662922007765554 + }, + "log_likelihood_vmap": 23338.89001398478, + "log_likelihood_scalar": -11960.284429561456, + "log_likelihood_library_pdip": 23338.89001459252, + "log_likelihood_library_pdip_scalar": -11960.284429931584, + "rel_diff_vmap_vs_library_pdip": 2.6039908034988732e-11, + "rel_diff_scalar_vs_library_pdip_scalar": 3.094641820617874e-11, + "abs_diff_nats": 35299.17444354623, + "rel_diff": 2.9513658016610007, + "rel_diff_scalar_vs_library_pdip": 1.5124615790246816, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 35299.174444524106, + "rel_diff_library_pdip_vmap_vs_scalar": 2.9513658016514266, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": true, + "passes": 9, + "pdip_iter": null + }, + { + "lane": 8, + "draw_name": "call00015_lane08", + "draw_kind": "captured", + "offsets": { + "centre_0": 0.0030335293924908615, + "centre_1": 0.0012117081273721316, + "ell_comps_0": 0.0008852687687036301, + "ell_comps_1": -0.0027113633212058814, + "einstein_radius": -0.03873713959923952 + }, + "log_likelihood_vmap": 24869.037000609715, + "log_likelihood_scalar": 23223.5503914968, + "log_likelihood_library_pdip": 24869.037000618693, + "log_likelihood_library_pdip_scalar": 23223.550391490266, + "rel_diff_vmap_vs_library_pdip": 3.6103254402970966e-13, + "rel_diff_scalar_vs_library_pdip_scalar": 2.8134414537799874e-13, + "abs_diff_nats": 1645.4866091129152, + "rel_diff": 0.07085422260480047, + "rel_diff_scalar_vs_library_pdip": 0.06616607667924404, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 1645.4866091284275, + "rel_diff_library_pdip_vmap_vs_scalar": 0.07085422260548835, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": true, + "passes": 10, + "pdip_iter": null + }, + { + "lane": 9, + "draw_name": "call00015_lane09", + "draw_kind": "captured", + "offsets": { + "centre_0": -0.0008035510098975272, + "centre_1": 0.005559773241319952, + "ell_comps_0": -0.003701655436278317, + "ell_comps_1": -0.012378591445614512, + "einstein_radius": 0.032284336889985665 + }, + "log_likelihood_vmap": -31749.513230927652, + "log_likelihood_scalar": -177117.70707592083, + "log_likelihood_library_pdip": -31750.031116865313, + "log_likelihood_library_pdip_scalar": -177117.67871082143, + "rel_diff_vmap_vs_library_pdip": 1.631135212922525e-05, + "rel_diff_scalar_vs_library_pdip_scalar": 1.6014832399351334e-07, + "abs_diff_nats": 145368.1938449932, + "rel_diff": 0.8207434267578999, + "rel_diff_scalar_vs_library_pdip": 4.578504991821491, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 145367.64759395612, + "rel_diff_library_pdip_vmap_vs_scalar": 0.8207404740850103, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "FAIL", + "certified": true, + "passes": 2, + "pdip_iter": null + }, + { + "lane": 10, + "draw_name": "call00015_lane10", + "draw_kind": "captured", + "offsets": { + "centre_0": -0.008473569241265282, + "centre_1": -0.0051993251621340235, + "ell_comps_0": -0.0031466996514049606, + "ell_comps_1": -0.0076036423480284636, + "einstein_radius": 0.08283321334626792 + }, + "log_likelihood_vmap": 6560.779755510557, + "log_likelihood_scalar": -101745.38334612483, + "log_likelihood_library_pdip": 6560.779574232118, + "log_likelihood_library_pdip_scalar": -101745.38351063897, + "rel_diff_vmap_vs_library_pdip": 2.7630624891784683e-08, + "rel_diff_scalar_vs_library_pdip_scalar": 1.6169200007374225e-09, + "abs_diff_nats": 108306.16310163538, + "rel_diff": 1.0644823336425164, + "rel_diff_scalar_vs_library_pdip": 16.508124026256933, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 108306.16308487109, + "rel_diff_library_pdip_vmap_vs_scalar": 1.0644823317565666, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "FAIL", + "certified": true, + "passes": 5, + "pdip_iter": null + }, + { + "lane": 11, + "draw_name": "call00015_lane11", + "draw_kind": "captured", + "offsets": { + "centre_0": 0.001017060353322001, + "centre_1": 0.003035861051809724, + "ell_comps_0": 0.0014054844842678396, + "ell_comps_1": -0.00019678252877009805, + "einstein_radius": -0.04179610309843307 + }, + "log_likelihood_vmap": 12667.92491578938, + "log_likelihood_scalar": 18957.52834973713, + "log_likelihood_library_pdip": 12667.924904351159, + "log_likelihood_library_pdip_scalar": 18957.52834974321, + "rel_diff_vmap_vs_library_pdip": 9.029276843243341e-10, + "rel_diff_scalar_vs_library_pdip_scalar": 3.206674664808082e-13, + "abs_diff_nats": 6289.603433947752, + "rel_diff": 0.3317733893318938, + "rel_diff_scalar_vs_library_pdip": 0.4964983209859121, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 6289.603445392051, + "rel_diff_library_pdip_vmap_vs_scalar": 0.3317733899354684, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": false, + "passes": 16, + "pdip_iter": null + }, + { + "lane": 12, + "draw_name": "call00015_lane12", + "draw_kind": "captured", + "offsets": { + "centre_0": -0.0012508260776529923, + "centre_1": -0.0075763258203543175, + "ell_comps_0": -0.0003476568325791879, + "ell_comps_1": 0.0070528223693464365, + "einstein_radius": -0.005182936058341969 + }, + "log_likelihood_vmap": 18842.279796744107, + "log_likelihood_scalar": 24810.049660195124, + "log_likelihood_library_pdip": 18842.279796748757, + "log_likelihood_library_pdip_scalar": 24810.0496601949, + "rel_diff_vmap_vs_library_pdip": 2.467502322232501e-13, + "rel_diff_scalar_vs_library_pdip_scalar": 8.94462970739782e-15, + "abs_diff_nats": 5967.769863451016, + "rel_diff": 0.24053840863630424, + "rel_diff_scalar_vs_library_pdip": 0.31672228243188005, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 5967.769863446145, + "rel_diff_library_pdip_vmap_vs_scalar": 0.24053840863611006, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": false, + "passes": 16, + "pdip_iter": null + }, + { + "lane": 13, + "draw_name": "call00015_lane13", + "draw_kind": "captured", + "offsets": { + "centre_0": 0.0039046265841316857, + "centre_1": 0.008586063066835778, + "ell_comps_0": 0.01612319103606081, + "ell_comps_1": -0.006478405394829051, + "einstein_radius": -0.06420305523683667 + }, + "log_likelihood_vmap": 22879.75598926498, + "log_likelihood_scalar": -3605.706216041661, + "log_likelihood_library_pdip": 22879.75598895483, + "log_likelihood_library_pdip_scalar": -3605.7062159501947, + "rel_diff_vmap_vs_library_pdip": 1.3555749692851728e-11, + "rel_diff_scalar_vs_library_pdip_scalar": 2.5367031502259044e-11, + "abs_diff_nats": 26485.46220530664, + "rel_diff": 7.345429887624717, + "rel_diff_scalar_vs_library_pdip": 1.1575937356054982, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 26485.462204905023, + "rel_diff_library_pdip_vmap_vs_scalar": 7.345429887699665, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": true, + "passes": 9, + "pdip_iter": null + }, + { + "lane": 14, + "draw_name": "call00015_lane14", + "draw_kind": "captured", + "offsets": { + "centre_0": 0.007195835212073937, + "centre_1": -0.0022675171274400335, + "ell_comps_0": 0.004220685262914858, + "ell_comps_1": 0.006581974817750368, + "einstein_radius": 0.08589577997501685 + }, + "log_likelihood_vmap": 4357.021950291826, + "log_likelihood_scalar": 11126.921475785763, + "log_likelihood_library_pdip": 4357.021950280177, + "log_likelihood_library_pdip_scalar": 11126.921475785763, + "rel_diff_vmap_vs_library_pdip": 2.673571139470296e-12, + "rel_diff_scalar_vs_library_pdip_scalar": 0.0, + "abs_diff_nats": 6769.899525493936, + "rel_diff": 0.6084252090954797, + "rel_diff_scalar_vs_library_pdip": 1.5537905483974548, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 6769.899525505585, + "rel_diff_library_pdip_vmap_vs_scalar": 0.6084252090965266, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": true, + "passes": 15, + "pdip_iter": null + }, + { + "lane": 15, + "draw_name": "call00015_lane15", + "draw_kind": "captured", + "offsets": { + "centre_0": 0.0024446743118905125, + "centre_1": 0.0028324231769206983, + "ell_comps_0": -0.017159158004659933, + "ell_comps_1": 0.008265799441903459, + "einstein_radius": -0.03860302877433641 + }, + "log_likelihood_vmap": 14146.464614111494, + "log_likelihood_scalar": 20410.34397371921, + "log_likelihood_library_pdip": 14146.464613419455, + "log_likelihood_library_pdip_scalar": 20410.343973721156, + "rel_diff_vmap_vs_library_pdip": 4.89195127877643e-11, + "rel_diff_scalar_vs_library_pdip_scalar": 9.53594248240011e-14, + "abs_diff_nats": 6263.879359607716, + "rel_diff": 0.30689729519861203, + "rel_diff_scalar_vs_library_pdip": 0.4427876173639727, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 6263.8793603017, + "rel_diff_library_pdip_vmap_vs_scalar": 0.30689729523258436, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": false, + "passes": 16, + "pdip_iter": null + }, + { + "lane": 16, + "draw_name": "call00015_lane16", + "draw_kind": "captured", + "offsets": { + "centre_0": 0.00546338030193603, + "centre_1": 0.0029217319844296002, + "ell_comps_0": 0.018887239108742314, + "ell_comps_1": 0.01610145140759906, + "einstein_radius": 0.09308737119031596 + }, + "log_likelihood_vmap": 2903.043598923672, + "log_likelihood_scalar": 9734.862241681745, + "log_likelihood_library_pdip": 2903.0436000279587, + "log_likelihood_library_pdip_scalar": 9734.862241683033, + "rel_diff_vmap_vs_library_pdip": 3.8038927111160565e-10, + "rel_diff_scalar_vs_library_pdip_scalar": 1.3229201048127153e-13, + "abs_diff_nats": 6831.818642758073, + "rel_diff": 0.7017889388825951, + "rel_diff_scalar_vs_library_pdip": 2.3533296715171588, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 6831.818641655074, + "rel_diff_library_pdip_vmap_vs_scalar": 0.7017889387691982, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": false, + "passes": 16, + "pdip_iter": null + }, + { + "lane": 17, + "draw_name": "call00015_lane17", + "draw_kind": "captured", + "offsets": { + "centre_0": -0.0033403521024317102, + "centre_1": -0.004078467297591464, + "ell_comps_0": -0.01076606265657356, + "ell_comps_1": 0.014404445881011321, + "einstein_radius": -0.016103243806114165 + }, + "log_likelihood_vmap": 13360.530937095456, + "log_likelihood_scalar": 19481.557217641563, + "log_likelihood_library_pdip": 13360.530937095456, + "log_likelihood_library_pdip_scalar": 19481.557217641563, + "rel_diff_vmap_vs_library_pdip": 0.0, + "rel_diff_scalar_vs_library_pdip_scalar": 0.0, + "abs_diff_nats": 6121.026280546106, + "rel_diff": 0.3141959450245178, + "rel_diff_scalar_vs_library_pdip": 0.4581424427940287, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 6121.026280546106, + "rel_diff_library_pdip_vmap_vs_scalar": 0.3141959450245178, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": false, + "passes": 16, + "pdip_iter": null + }, + { + "lane": 18, + "draw_name": "call00015_lane18", + "draw_kind": "captured", + "offsets": { + "centre_0": -0.0036504937209151113, + "centre_1": -0.0003963555596475738, + "ell_comps_0": -0.008227000946306733, + "ell_comps_1": -0.02487475830854786, + "einstein_radius": -0.0327871904693704 + }, + "log_likelihood_vmap": 12594.119293045376, + "log_likelihood_scalar": 18812.946857997056, + "log_likelihood_library_pdip": 12594.119293045376, + "log_likelihood_library_pdip_scalar": 18812.946857997056, + "rel_diff_vmap_vs_library_pdip": 0.0, + "rel_diff_scalar_vs_library_pdip_scalar": 0.0, + "abs_diff_nats": 6218.82756495168, + "rel_diff": 0.3305610552080077, + "rel_diff_scalar_vs_library_pdip": 0.49378820545123714, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 6218.82756495168, + "rel_diff_library_pdip_vmap_vs_scalar": 0.3305610552080077, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": false, + "passes": 16, + "pdip_iter": null + }, + { + "lane": 19, + "draw_name": "call00015_lane19", + "draw_kind": "captured", + "offsets": { + "centre_0": 0.00840275144875603, + "centre_1": -0.003628185056462521, + "ell_comps_0": 0.005265994929748281, + "ell_comps_1": 0.009958068668923414, + "einstein_radius": -0.06501253116347949 + }, + "log_likelihood_vmap": 10415.233657552137, + "log_likelihood_scalar": 16927.632549568836, + "log_likelihood_library_pdip": 10415.233657528348, + "log_likelihood_library_pdip_scalar": 16927.63254956867, + "rel_diff_vmap_vs_library_pdip": 2.284033580214277e-12, + "rel_diff_scalar_vs_library_pdip_scalar": 9.886026568463228e-15, + "abs_diff_nats": 6512.398892016699, + "rel_diff": 0.38472000576256465, + "rel_diff_scalar_vs_library_pdip": 0.6252763121961445, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 6512.398892040321, + "rel_diff_library_pdip_vmap_vs_scalar": 0.38472000576396387, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": false, + "passes": 16, + "pdip_iter": null + }, + { + "lane": 20, + "draw_name": "call00016_lane00", + "draw_kind": "captured", + "offsets": { + "centre_0": -0.00884193513479277, + "centre_1": -0.0043653741820675615, + "ell_comps_0": 0.013534779280882363, + "ell_comps_1": -0.002720977381459688, + "einstein_radius": 0.03143265344345525 + }, + "log_likelihood_vmap": 23125.781207506512, + "log_likelihood_scalar": 27642.806005943028, + "log_likelihood_library_pdip": 23125.78120750651, + "log_likelihood_library_pdip_scalar": 27642.8060059429, + "rel_diff_vmap_vs_library_pdip": 1.573126881400592e-16, + "rel_diff_scalar_vs_library_pdip_scalar": 4.606234917715501e-15, + "abs_diff_nats": 4517.024798436516, + "rel_diff": 0.16340688414430085, + "rel_diff_scalar_vs_library_pdip": 0.19532420366280714, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 4517.024798436392, + "rel_diff_library_pdip_vmap_vs_scalar": 0.16340688414429713, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": true, + "passes": 13, + "pdip_iter": null + }, + { + "lane": 21, + "draw_name": "call00016_lane01", + "draw_kind": "captured", + "offsets": { + "centre_0": 0.004620853605949627, + "centre_1": -0.006101969080571725, + "ell_comps_0": 0.006298490627944492, + "ell_comps_1": -0.0011939165979551265, + "einstein_radius": -0.008698400624736369 + }, + "log_likelihood_vmap": 25204.95975364132, + "log_likelihood_scalar": 27788.39615110059, + "log_likelihood_library_pdip": 25204.95975365577, + "log_likelihood_library_pdip_scalar": 27788.396151112443, + "rel_diff_vmap_vs_library_pdip": 5.733019200585084e-13, + "rel_diff_scalar_vs_library_pdip_scalar": 4.265282130372361e-13, + "abs_diff_nats": 2583.4363974592707, + "rel_diff": 0.09296817216120444, + "rel_diff_scalar_vs_library_pdip": 0.10249714431978471, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 2583.436397456673, + "rel_diff_library_pdip_vmap_vs_scalar": 0.09296817216107131, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": true, + "passes": 6, + "pdip_iter": null + }, + { + "lane": 22, + "draw_name": "call00016_lane02", + "draw_kind": "captured", + "offsets": { + "centre_0": 0.0023954075319476313, + "centre_1": 0.005058697427718103, + "ell_comps_0": -0.012832403546307256, + "ell_comps_1": 0.008158705801962226, + "einstein_radius": -0.04064267210128203 + }, + "log_likelihood_vmap": 11553.07472359277, + "log_likelihood_scalar": 17852.91967933103, + "log_likelihood_library_pdip": 11553.07472359277, + "log_likelihood_library_pdip_scalar": 17852.91967933103, + "rel_diff_vmap_vs_library_pdip": 0.0, + "rel_diff_scalar_vs_library_pdip_scalar": 0.0, + "abs_diff_nats": 6299.844955738259, + "rel_diff": 0.3528747716840858, + "rel_diff_scalar_vs_library_pdip": 0.5452959585618551, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 6299.844955738259, + "rel_diff_library_pdip_vmap_vs_scalar": 0.3528747716840858, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": false, + "passes": 16, + "pdip_iter": null + }, + { + "lane": 23, + "draw_name": "call00016_lane03", + "draw_kind": "captured", + "offsets": { + "centre_0": -0.0034553415111254126, + "centre_1": -0.0012095214967760579, + "ell_comps_0": -0.013572031583894487, + "ell_comps_1": 0.012809349042796288, + "einstein_radius": 0.016462197503162912 + }, + "log_likelihood_vmap": 21983.89953487791, + "log_likelihood_scalar": 27386.085836286547, + "log_likelihood_library_pdip": 21983.8995348776, + "log_likelihood_library_pdip_scalar": 27386.08583628653, + "rel_diff_vmap_vs_library_pdip": 1.4066121349954454e-14, + "rel_diff_scalar_vs_library_pdip_scalar": 6.642020383707766e-16, + "abs_diff_nats": 5402.1863014086375, + "rel_diff": 0.19726025594540217, + "rel_diff_scalar_vs_library_pdip": 0.2457337604203632, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 5402.186301408929, + "rel_diff_library_pdip_vmap_vs_scalar": 0.19726025594541294, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": true, + "passes": 13, + "pdip_iter": null + }, + { + "lane": 24, + "draw_name": "call00016_lane04", + "draw_kind": "captured", + "offsets": { + "centre_0": 0.002118045409654518, + "centre_1": -0.002760233148797609, + "ell_comps_0": 0.017300773468951293, + "ell_comps_1": 0.0015174503365170395, + "einstein_radius": -0.009907496303277252 + }, + "log_likelihood_vmap": 23449.286728500934, + "log_likelihood_scalar": 28384.905983325858, + "log_likelihood_library_pdip": 23449.286728501105, + "log_likelihood_library_pdip_scalar": 28384.905983325836, + "rel_diff_vmap_vs_library_pdip": 7.291693172291214e-15, + "rel_diff_scalar_vs_library_pdip_scalar": 7.689957773815647e-16, + "abs_diff_nats": 4935.619254824924, + "rel_diff": 0.17388182499967603, + "rel_diff_scalar_vs_library_pdip": 0.21048057077257806, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 4935.619254824731, + "rel_diff_library_pdip_vmap_vs_scalar": 0.17388182499966937, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": true, + "passes": 13, + "pdip_iter": null + }, + { + "lane": 25, + "draw_name": "call00016_lane05", + "draw_kind": "captured", + "offsets": { + "centre_0": -0.004055224824141611, + "centre_1": 0.008121383491444374, + "ell_comps_0": -0.002675674189352585, + "ell_comps_1": 0.022116535787456582, + "einstein_radius": 0.03951210569146424 + }, + "log_likelihood_vmap": -136892.73476270546, + "log_likelihood_scalar": -189785.101411741, + "log_likelihood_library_pdip": -136892.7373918455, + "log_likelihood_library_pdip_scalar": -189785.10368105007, + "rel_diff_vmap_vs_library_pdip": 1.9205840227843143e-08, + "rel_diff_scalar_vs_library_pdip_scalar": 1.195725601364047e-08, + "abs_diff_nats": 52892.36664903554, + "rel_diff": 0.278696094981054, + "rel_diff_scalar_vs_library_pdip": 0.3863781602123636, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 52892.36628920457, + "rel_diff_library_pdip_vmap_vs_scalar": 0.27869608975262183, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "FAIL", + "certified": true, + "passes": 0, + "pdip_iter": null + }, + { + "lane": 26, + "draw_name": "call00016_lane06", + "draw_kind": "captured", + "offsets": { + "centre_0": -0.008657008236802587, + "centre_1": 0.00296353203184632, + "ell_comps_0": 0.001140204699970393, + "ell_comps_1": 0.0024587369167136715, + "einstein_radius": -0.02214717629190477 + }, + "log_likelihood_vmap": 20216.49120362533, + "log_likelihood_scalar": -186990.07770962076, + "log_likelihood_library_pdip": 20216.488710127065, + "log_likelihood_library_pdip_scalar": -186990.07871807058, + "rel_diff_vmap_vs_library_pdip": 1.233398292139061e-07, + "rel_diff_scalar_vs_library_pdip_scalar": 5.393065919406771e-09, + "abs_diff_nats": 207206.5689132461, + "rel_diff": 1.108115315268331, + "rel_diff_scalar_vs_library_pdip": 10.249384519278644, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 207206.56742819765, + "rel_diff_library_pdip_vmap_vs_scalar": 1.108115301350335, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "FAIL", + "certified": true, + "passes": 1, + "pdip_iter": null + }, + { + "lane": 27, + "draw_name": "call00016_lane07", + "draw_kind": "captured", + "offsets": { + "centre_0": -0.008477184803652458, + "centre_1": 0.003915910494663854, + "ell_comps_0": -0.009104458058464132, + "ell_comps_1": 0.0040545395575112865, + "einstein_radius": -0.027672851325696968 + }, + "log_likelihood_vmap": 23997.437153357016, + "log_likelihood_scalar": 27662.094569021887, + "log_likelihood_library_pdip": 23997.437153352766, + "log_likelihood_library_pdip_scalar": 27662.094569021836, + "rel_diff_vmap_vs_library_pdip": 1.7706721011620424e-13, + "rel_diff_scalar_vs_library_pdip_scalar": 1.8412092103944024e-15, + "abs_diff_nats": 3664.657415664871, + "rel_diff": 0.13247939003754375, + "rel_diff_scalar_vs_library_pdip": 0.15271036620496445, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 3664.6574156690695, + "rel_diff_library_pdip_vmap_vs_scalar": 0.13247939003769577, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": true, + "passes": 11, + "pdip_iter": null + }, + { + "lane": 28, + "draw_name": "call00016_lane08", + "draw_kind": "captured", + "offsets": { + "centre_0": -0.0016692556339188685, + "centre_1": -0.0020136329026704475, + "ell_comps_0": -0.01765507329375373, + "ell_comps_1": 0.007611548713690083, + "einstein_radius": 0.032934930918189 + }, + "log_likelihood_vmap": 15428.346339165015, + "log_likelihood_scalar": -74102.3544780082, + "log_likelihood_library_pdip": 15428.35495122485, + "log_likelihood_library_pdip_scalar": -74102.36803813929, + "rel_diff_vmap_vs_library_pdip": 5.581968954248514e-07, + "rel_diff_scalar_vs_library_pdip_scalar": 1.8299187258583624e-07, + "abs_diff_nats": 89530.70081717322, + "rel_diff": 1.2082031866307807, + "rel_diff_scalar_vs_library_pdip": 5.802997773403265, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 89530.72298936415, + "rel_diff_library_pdip_vmap_vs_scalar": 1.2082032647497059, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "FAIL", + "certified": true, + "passes": 3, + "pdip_iter": null + }, + { + "lane": 29, + "draw_name": "call00016_lane09", + "draw_kind": "captured", + "offsets": { + "centre_0": -0.0004381888692729163, + "centre_1": -0.005611258255408329, + "ell_comps_0": -0.028212995885542408, + "ell_comps_1": 0.02032938084918439, + "einstein_radius": 0.08210563031665497 + }, + "log_likelihood_vmap": 9199.66418882041, + "log_likelihood_scalar": 15888.261826776452, + "log_likelihood_library_pdip": 9199.664188834518, + "log_likelihood_library_pdip_scalar": 15888.26182677463, + "rel_diff_vmap_vs_library_pdip": 1.533543129870372e-12, + "rel_diff_scalar_vs_library_pdip_scalar": 1.1471534156628055e-13, + "abs_diff_nats": 6688.597637956042, + "rel_diff": 0.42097730455849885, + "rel_diff_scalar_vs_library_pdip": 0.7270480205201159, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 6688.597637940111, + "rel_diff_library_pdip_vmap_vs_scalar": 0.42097730455754445, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": false, + "passes": 16, + "pdip_iter": null + }, + { + "lane": 30, + "draw_name": "call00016_lane10", + "draw_kind": "captured", + "offsets": { + "centre_0": -0.006865422615785068, + "centre_1": 0.007672434011054661, + "ell_comps_0": -0.0004443754014717277, + "ell_comps_1": -0.009376937319187229, + "einstein_radius": 0.07069214800098655 + }, + "log_likelihood_vmap": 18699.68589006445, + "log_likelihood_scalar": -2303.2655718650058, + "log_likelihood_library_pdip": 18699.68588990701, + "log_likelihood_library_pdip_scalar": -2303.265571702592, + "rel_diff_vmap_vs_library_pdip": 8.419436014135689e-12, + "rel_diff_scalar_vs_library_pdip_scalar": 7.051463272806392e-11, + "abs_diff_nats": 21002.951461929457, + "rel_diff": 9.11877106942683, + "rel_diff_scalar_vs_library_pdip": 1.1231713508678867, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 21002.951461609602, + "rel_diff_library_pdip_vmap_vs_scalar": 9.118771069930967, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": true, + "passes": 11, + "pdip_iter": null + }, + { + "lane": 31, + "draw_name": "call00016_lane11", + "draw_kind": "captured", + "offsets": { + "centre_0": -0.0009434846288846137, + "centre_1": -0.005019378037730504, + "ell_comps_0": -0.009906341245761709, + "ell_comps_1": 0.005337547203081457, + "einstein_radius": 0.021637810364502075 + }, + "log_likelihood_vmap": 13020.244793610349, + "log_likelihood_scalar": 19182.855515516767, + "log_likelihood_library_pdip": 13020.244793610349, + "log_likelihood_library_pdip_scalar": 19182.855515516767, + "rel_diff_vmap_vs_library_pdip": 0.0, + "rel_diff_scalar_vs_library_pdip_scalar": 0.0, + "abs_diff_nats": 6162.610721906418, + "rel_diff": 0.32125617152887176, + "rel_diff_scalar_vs_library_pdip": 0.4733098969791031, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 6162.610721906418, + "rel_diff_library_pdip_vmap_vs_scalar": 0.32125617152887176, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": false, + "passes": 16, + "pdip_iter": null + }, + { + "lane": 32, + "draw_name": "call00016_lane12", + "draw_kind": "captured", + "offsets": { + "centre_0": 0.007501332281640899, + "centre_1": -0.004481729694563993, + "ell_comps_0": 0.010332412839169434, + "ell_comps_1": -0.003991142259489408, + "einstein_radius": 0.009192357179279576 + }, + "log_likelihood_vmap": 20526.007408227943, + "log_likelihood_scalar": 25770.812570519138, + "log_likelihood_library_pdip": 20526.007408524267, + "log_likelihood_library_pdip_scalar": 25770.81257052731, + "rel_diff_vmap_vs_library_pdip": 1.4436528345545684e-11, + "rel_diff_scalar_vs_library_pdip_scalar": 3.1706025482768854e-13, + "abs_diff_nats": 5244.805162291195, + "rel_diff": 0.20351725999866452, + "rel_diff_scalar_vs_library_pdip": 0.2555199877700887, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 5244.805162003042, + "rel_diff_library_pdip_vmap_vs_scalar": 0.2035172599874186, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": false, + "passes": 16, + "pdip_iter": null + }, + { + "lane": 33, + "draw_name": "call00016_lane13", + "draw_kind": "captured", + "offsets": { + "centre_0": -0.007387955150592393, + "centre_1": -0.012189283154464192, + "ell_comps_0": 0.008975668561402167, + "ell_comps_1": 0.007167944425996534, + "einstein_radius": -0.04724415035491503 + }, + "log_likelihood_vmap": 9476.347543144097, + "log_likelihood_scalar": 15902.910586796046, + "log_likelihood_library_pdip": 9476.347543144097, + "log_likelihood_library_pdip_scalar": 15902.910586796046, + "rel_diff_vmap_vs_library_pdip": 0.0, + "rel_diff_scalar_vs_library_pdip_scalar": 0.0, + "abs_diff_nats": 6426.56304365195, + "rel_diff": 0.4041123798424567, + "rel_diff_scalar_vs_library_pdip": 0.6781687790990115, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 6426.56304365195, + "rel_diff_library_pdip_vmap_vs_scalar": 0.4041123798424567, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": false, + "passes": 16, + "pdip_iter": null + }, + { + "lane": 34, + "draw_name": "call00016_lane14", + "draw_kind": "captured", + "offsets": { + "centre_0": -0.000386125459039801, + "centre_1": 0.006915867404617462, + "ell_comps_0": 0.009873645974923177, + "ell_comps_1": 0.0016807669637177417, + "einstein_radius": -0.02988317231293447 + }, + "log_likelihood_vmap": 23033.791255159696, + "log_likelihood_scalar": -130304.42446636864, + "log_likelihood_library_pdip": 23033.791840214264, + "log_likelihood_library_pdip_scalar": -130304.42314719265, + "rel_diff_vmap_vs_library_pdip": 2.5399837408240072e-08, + "rel_diff_scalar_vs_library_pdip_scalar": 1.0123800571741685e-08, + "abs_diff_nats": 153338.21572152834, + "rel_diff": 1.176769064822543, + "rel_diff_scalar_vs_library_pdip": 6.657098291514148, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 153338.21498740691, + "rel_diff_library_pdip_vmap_vs_scalar": 1.1767690711020236, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "FAIL", + "certified": true, + "passes": 2, + "pdip_iter": null + }, + { + "lane": 35, + "draw_name": "call00016_lane15", + "draw_kind": "captured", + "offsets": { + "centre_0": -0.007751700182654455, + "centre_1": 0.00045977673595488515, + "ell_comps_0": -0.0005571070710696721, + "ell_comps_1": 0.00652407778540843, + "einstein_radius": -0.018266703354617997 + }, + "log_likelihood_vmap": 12436.966956375622, + "log_likelihood_scalar": 18757.071353384385, + "log_likelihood_library_pdip": 12436.966956375636, + "log_likelihood_library_pdip_scalar": 18757.071353417698, + "rel_diff_vmap_vs_library_pdip": 1.170053380330565e-15, + "rel_diff_scalar_vs_library_pdip_scalar": 1.7760220297114191e-12, + "abs_diff_nats": 6320.104397008763, + "rel_diff": 0.33694515939816005, + "rel_diff_scalar_vs_library_pdip": 0.5081708763219666, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 6320.1043970420615, + "rel_diff_library_pdip_vmap_vs_scalar": 0.3369451593993369, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": false, + "passes": 16, + "pdip_iter": null + }, + { + "lane": 36, + "draw_name": "call00016_lane16", + "draw_kind": "captured", + "offsets": { + "centre_0": 0.002391640344038076, + "centre_1": 0.005471319325782662, + "ell_comps_0": 0.007125369000849133, + "ell_comps_1": -0.005032810664097539, + "einstein_radius": -0.08700102338561888 + }, + "log_likelihood_vmap": 4935.957801232435, + "log_likelihood_scalar": 11735.12560234069, + "log_likelihood_library_pdip": 4935.957801232435, + "log_likelihood_library_pdip_scalar": 11735.12560247699, + "rel_diff_vmap_vs_library_pdip": 0.0, + "rel_diff_scalar_vs_library_pdip_scalar": 1.1614746923350229e-11, + "abs_diff_nats": 6799.167801108255, + "rel_diff": 0.5793860271723118, + "rel_diff_scalar_vs_library_pdip": 1.377476889978801, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 6799.167801244555, + "rel_diff_library_pdip_vmap_vs_scalar": 0.5793860271771971, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": false, + "passes": 16, + "pdip_iter": null + }, + { + "lane": 37, + "draw_name": "call00016_lane17", + "draw_kind": "captured", + "offsets": { + "centre_0": 0.0026856669213289885, + "centre_1": -0.000701322842884467, + "ell_comps_0": -0.017963099482535792, + "ell_comps_1": -0.011368990220314417, + "einstein_radius": 0.1245417314838293 + }, + "log_likelihood_vmap": -10183.840807931541, + "log_likelihood_scalar": -3158.477740005619, + "log_likelihood_library_pdip": -10183.840810860973, + "log_likelihood_library_pdip_scalar": -3158.4777400088497, + "rel_diff_vmap_vs_library_pdip": 2.876548796386419e-10, + "rel_diff_scalar_vs_library_pdip_scalar": 1.0228108116058432e-12, + "abs_diff_nats": 7025.363067925922, + "rel_diff": 2.2242876620410894, + "rel_diff_scalar_vs_library_pdip": 0.6898539756594455, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 7025.363070852123, + "rel_diff_library_pdip_vmap_vs_scalar": 2.2242876629652737, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": true, + "passes": 15, + "pdip_iter": null + }, + { + "lane": 38, + "draw_name": "call00016_lane18", + "draw_kind": "captured", + "offsets": { + "centre_0": 0.006475272480271436, + "centre_1": 0.00036104957026942186, + "ell_comps_0": 0.0058048443769378386, + "ell_comps_1": -0.006014005069002815, + "einstein_radius": -0.043358074001971 + }, + "log_likelihood_vmap": 12580.943015568031, + "log_likelihood_scalar": 18932.692618871544, + "log_likelihood_library_pdip": 12580.943017464866, + "log_likelihood_library_pdip_scalar": 18932.692618890847, + "rel_diff_vmap_vs_library_pdip": 1.5077048448807206e-10, + "rel_diff_scalar_vs_library_pdip_scalar": 1.0195652535534315e-12, + "abs_diff_nats": 6351.749603303513, + "rel_diff": 0.3354910857725688, + "rel_diff_scalar_vs_library_pdip": 0.5048707074333918, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 6351.749601425981, + "rel_diff_library_pdip_vmap_vs_scalar": 0.33549108567305796, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": false, + "passes": 16, + "pdip_iter": null + }, + { + "lane": 39, + "draw_name": "call00016_lane19", + "draw_kind": "captured", + "offsets": { + "centre_0": 0.001791290147759792, + "centre_1": -0.0026344329251194233, + "ell_comps_0": 0.006109533754666233, + "ell_comps_1": 0.004739218846482723, + "einstein_radius": 0.0525326188965729 + }, + "log_likelihood_vmap": -2591.194896997622, + "log_likelihood_scalar": -92415.23122412137, + "log_likelihood_library_pdip": -2590.8224259740236, + "log_likelihood_library_pdip_scalar": -92415.18628955261, + "rel_diff_vmap_vs_library_pdip": 0.00014376555485399797, + "rel_diff_scalar_vs_library_pdip_scalar": 4.862249437152171e-07, + "abs_diff_nats": 89824.03632712374, + "rel_diff": 0.971961387071428, + "rel_diff_scalar_vs_library_pdip": 34.6702297685947, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 89824.36386357859, + "rel_diff_library_pdip_vmap_vs_scalar": 0.971965403847626, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "FAIL", + "certified": true, + "passes": 4, + "pdip_iter": null + }, + { + "lane": 40, + "draw_name": "call00017_lane00", + "draw_kind": "captured", + "offsets": { + "centre_0": 0.00039504289511865966, + "centre_1": -0.0031177345874673803, + "ell_comps_0": -0.01319670439502501, + "ell_comps_1": -0.01412705504678942, + "einstein_radius": -0.08353374721414841 + }, + "log_likelihood_vmap": 6775.961380959467, + "log_likelihood_scalar": 13398.840222654067, + "log_likelihood_library_pdip": 6775.961380959467, + "log_likelihood_library_pdip_scalar": 13398.840222654067, + "rel_diff_vmap_vs_library_pdip": 0.0, + "rel_diff_scalar_vs_library_pdip_scalar": 0.0, + "abs_diff_nats": 6622.878841694601, + "rel_diff": 0.4942874705302463, + "rel_diff_scalar_vs_library_pdip": 0.9774079970858409, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 6622.878841694601, + "rel_diff_library_pdip_vmap_vs_scalar": 0.4942874705302463, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": false, + "passes": 16, + "pdip_iter": null + }, + { + "lane": 41, + "draw_name": "call00017_lane01", + "draw_kind": "captured", + "offsets": { + "centre_0": -0.0035711364854704077, + "centre_1": 0.0013105492408737255, + "ell_comps_0": -0.00180015387363288, + "ell_comps_1": 0.0054914513398384235, + "einstein_radius": 0.0036721503557828328 + }, + "log_likelihood_vmap": 13539.215248048647, + "log_likelihood_scalar": 19660.903121931384, + "log_likelihood_library_pdip": 13539.215247391869, + "log_likelihood_library_pdip_scalar": 19660.903121956206, + "rel_diff_vmap_vs_library_pdip": 4.8509374728052583e-11, + "rel_diff_scalar_vs_library_pdip_scalar": 1.2625019942785335e-12, + "abs_diff_nats": 6121.687873882736, + "rel_diff": 0.31136351346211066, + "rel_diff_scalar_vs_library_pdip": 0.4521449554263323, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 6121.687874564337, + "rel_diff_library_pdip_vmap_vs_scalar": 0.3113635134963854, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": false, + "passes": 16, + "pdip_iter": null + }, + { + "lane": 42, + "draw_name": "call00017_lane02", + "draw_kind": "captured", + "offsets": { + "centre_0": 0.0003080166678035941, + "centre_1": -0.0007105501404145155, + "ell_comps_0": 0.013423484811455881, + "ell_comps_1": -0.0026843168562135787, + "einstein_radius": -0.027211776311711677 + }, + "log_likelihood_vmap": 27099.01248330762, + "log_likelihood_scalar": 18324.103083663205, + "log_likelihood_library_pdip": 27099.012483295468, + "log_likelihood_library_pdip_scalar": 18324.1030840283, + "rel_diff_vmap_vs_library_pdip": 4.48387158874384e-13, + "rel_diff_scalar_vs_library_pdip_scalar": 1.9924194897305465e-11, + "abs_diff_nats": 8774.909399644413, + "rel_diff": 0.4788725188665663, + "rel_diff_scalar_vs_library_pdip": 0.32380919434024924, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 8774.90939926717, + "rel_diff_library_pdip_vmap_vs_scalar": 0.47887251883643783, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": true, + "passes": 6, + "pdip_iter": null + }, + { + "lane": 43, + "draw_name": "call00017_lane03", + "draw_kind": "captured", + "offsets": { + "centre_0": 0.0007755113444017845, + "centre_1": -0.0035255229487048357, + "ell_comps_0": -0.00399848580683964, + "ell_comps_1": 0.0017146502467540014, + "einstein_radius": -0.08651392214907494 + }, + "log_likelihood_vmap": -89812.6972414867, + "log_likelihood_scalar": -175043.29720358102, + "log_likelihood_library_pdip": NaN, + "log_likelihood_library_pdip_scalar": -175043.31207082624, + "rel_diff_vmap_vs_library_pdip": NaN, + "rel_diff_scalar_vs_library_pdip_scalar": 8.493466584791472e-08, + "abs_diff_nats": 85230.59996209432, + "rel_diff": 0.48691153173930657, + "rel_diff_scalar_vs_library_pdip": NaN, + "abs_diff_library_pdip_vmap_vs_scalar_nats": NaN, + "rel_diff_library_pdip_vmap_vs_scalar": NaN, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "FAIL", + "certified": true, + "passes": 2, + "pdip_iter": null + }, + { + "lane": 44, + "draw_name": "call00017_lane04", + "draw_kind": "captured", + "offsets": { + "centre_0": -0.007147765623305864, + "centre_1": 0.0010457566746408338, + "ell_comps_0": 0.013576209131653673, + "ell_comps_1": -0.02008708588032471, + "einstein_radius": 0.032831422062920224 + }, + "log_likelihood_vmap": 26462.671263610457, + "log_likelihood_scalar": 13759.133270745908, + "log_likelihood_library_pdip": 26462.67126365984, + "log_likelihood_library_pdip_scalar": 13759.133270653569, + "rel_diff_vmap_vs_library_pdip": 1.8660974863591035e-12, + "rel_diff_scalar_vs_library_pdip_scalar": 6.711118808518938e-12, + "abs_diff_nats": 12703.537992864549, + "rel_diff": 0.9232803944034962, + "rel_diff_scalar_vs_library_pdip": 0.48005501282703866, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 12703.53799300627, + "rel_diff_library_pdip_vmap_vs_scalar": 0.9232803944199927, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": true, + "passes": 8, + "pdip_iter": null + }, + { + "lane": 45, + "draw_name": "call00017_lane05", + "draw_kind": "captured", + "offsets": { + "centre_0": -0.001330428459324805, + "centre_1": 0.0005227443143650849, + "ell_comps_0": 0.011495347238845648, + "ell_comps_1": 0.016282146756616874, + "einstein_radius": -0.03990716965121255 + }, + "log_likelihood_vmap": 13504.069127366387, + "log_likelihood_scalar": 19903.394044775134, + "log_likelihood_library_pdip": 13504.069127931114, + "log_likelihood_library_pdip_scalar": 19903.39404477302, + "rel_diff_vmap_vs_library_pdip": 4.1819031201165996e-11, + "rel_diff_scalar_vs_library_pdip_scalar": 1.0619624382482499e-13, + "abs_diff_nats": 6399.324917408747, + "rel_diff": 0.32151927972750166, + "rel_diff_scalar_vs_library_pdip": 0.4738812321101044, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 6399.324916841906, + "rel_diff_library_pdip_vmap_vs_scalar": 0.3215192796990562, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": false, + "passes": 16, + "pdip_iter": null + }, + { + "lane": 46, + "draw_name": "call00017_lane06", + "draw_kind": "captured", + "offsets": { + "centre_0": 0.002687443649497539, + "centre_1": -0.0019369334469605598, + "ell_comps_0": -0.015185516697078849, + "ell_comps_1": -0.012687661440239377, + "einstein_radius": 0.024820286560815807 + }, + "log_likelihood_vmap": 12905.386047434527, + "log_likelihood_scalar": 19139.565581617124, + "log_likelihood_library_pdip": 12905.386047434527, + "log_likelihood_library_pdip_scalar": 19139.565581617124, + "rel_diff_vmap_vs_library_pdip": 0.0, + "rel_diff_scalar_vs_library_pdip_scalar": 0.0, + "abs_diff_nats": 6234.179534182596, + "rel_diff": 0.32572210208210295, + "rel_diff_scalar_vs_library_pdip": 0.48306803928751085, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 6234.179534182596, + "rel_diff_library_pdip_vmap_vs_scalar": 0.32572210208210295, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": false, + "passes": 16, + "pdip_iter": null + }, + { + "lane": 47, + "draw_name": "call00017_lane07", + "draw_kind": "captured", + "offsets": { + "centre_0": -0.003693907069305896, + "centre_1": 0.002094959418050611, + "ell_comps_0": -0.003985235543017392, + "ell_comps_1": -0.01016688375069693, + "einstein_radius": -0.061293935299826074 + }, + "log_likelihood_vmap": 21569.14415018888, + "log_likelihood_scalar": 15503.419442045153, + "log_likelihood_library_pdip": 21569.144150171986, + "log_likelihood_library_pdip_scalar": 15503.419442032253, + "rel_diff_vmap_vs_library_pdip": 7.83284374312979e-13, + "rel_diff_scalar_vs_library_pdip_scalar": 8.320921005963696e-13, + "abs_diff_nats": 6065.724708143727, + "rel_diff": 0.3912507644406194, + "rel_diff_scalar_vs_library_pdip": 0.2812223176726493, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 6065.724708139733, + "rel_diff_library_pdip_vmap_vs_scalar": 0.3912507644406873, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": false, + "passes": 16, + "pdip_iter": null + }, + { + "lane": 48, + "draw_name": "call00017_lane08", + "draw_kind": "captured", + "offsets": { + "centre_0": 0.003201023829002854, + "centre_1": 0.0051592827552293585, + "ell_comps_0": -0.016832634529093247, + "ell_comps_1": 0.018395875062653597, + "einstein_radius": -0.023696742396298376 + }, + "log_likelihood_vmap": 22376.164810427435, + "log_likelihood_scalar": 27530.814473047278, + "log_likelihood_library_pdip": 22376.16481042714, + "log_likelihood_library_pdip_scalar": 27530.81447304727, + "rel_diff_vmap_vs_library_pdip": 1.3169204189857933e-14, + "rel_diff_scalar_vs_library_pdip_scalar": 2.642841395523044e-16, + "abs_diff_nats": 5154.649662619842, + "rel_diff": 0.18723200752619412, + "rel_diff_scalar_vs_library_pdip": 0.23036341152698808, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 5154.64966262013, + "rel_diff_library_pdip_vmap_vs_scalar": 0.1872320075262046, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": false, + "passes": 16, + "pdip_iter": null + }, + { + "lane": 49, + "draw_name": "call00017_lane09", + "draw_kind": "captured", + "offsets": { + "centre_0": 2.2604383701358236e-05, + "centre_1": -0.005697104995547526, + "ell_comps_0": -0.0005169325215696047, + "ell_comps_1": 0.0010224650903271142, + "einstein_radius": -0.016159263378539013 + }, + "log_likelihood_vmap": 26250.953420722253, + "log_likelihood_scalar": -177402.9202812782, + "log_likelihood_library_pdip": 26250.95031934693, + "log_likelihood_library_pdip_scalar": -177402.92200116633, + "rel_diff_vmap_vs_library_pdip": 1.181433541907e-07, + "rel_diff_scalar_vs_library_pdip_scalar": 9.694812834420552e-09, + "abs_diff_nats": 203653.87370200045, + "rel_diff": 1.1479736262464029, + "rel_diff_scalar_vs_library_pdip": 7.757961830834459, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 203653.87232051327, + "rel_diff_library_pdip_vmap_vs_scalar": 1.147973607329728, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "FAIL", + "certified": true, + "passes": 2, + "pdip_iter": null + } + ], + "lane_pins": [ + { + "pin": "lane 0: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 18700.594048999155, + "reference_value": 18700.594049000425, + "rel_diff": 6.78938113061105e-14, + "abs_diff_nats": 1.2696546036750078e-09, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 0: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 24758.506194309353, + "reference_value": 24758.506194309135, + "rel_diff": 8.816312531637115e-15, + "abs_diff_nats": 2.1827872842550278e-10, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 0: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 18700.594048999155, + "reference_value": 24758.506194309353, + "rel_diff": 0.24468003431897623, + "abs_diff_nats": 6057.912145310198, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 0: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 18700.594049000425, + "reference_value": 24758.506194309135, + "rel_diff": 0.24468003431891827, + "abs_diff_nats": 6057.91214530871, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 1: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 14200.2143078324, + "reference_value": 14200.214306774666, + "rel_diff": 7.448726049857396e-11, + "abs_diff_nats": 1.0577350622043014e-06, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 1: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 20551.004887772608, + "reference_value": 20551.00488777298, + "rel_diff": 1.8056238142599476e-14, + "abs_diff_nats": 3.710738383233547e-10, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 1: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 14200.2143078324, + "reference_value": 20551.004887772608, + "rel_diff": 0.30902579288075527, + "abs_diff_nats": 6350.790579940207, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 1: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 14200.214306774666, + "reference_value": 20551.00488777298, + "rel_diff": 0.30902579293223653, + "abs_diff_nats": 6350.790580998313, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 2: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -23119.397918166338, + "reference_value": -23119.269283083646, + "rel_diff": 5.563977006242197e-06, + "abs_diff_nats": 0.12863508269219892, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 2: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -189709.07359119633, + "reference_value": -189709.07575724524, + "rel_diff": 1.1417740063377248e-08, + "abs_diff_nats": 0.0021660489146597683, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 2: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -23119.397918166338, + "reference_value": -189709.07359119633, + "rel_diff": 0.8781323556089559, + "abs_diff_nats": 166589.67567303, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 2: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -23119.269283083646, + "reference_value": -189709.07575724524, + "rel_diff": 0.8781330350653996, + "abs_diff_nats": 166589.8064741616, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 3: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 18502.010125207293, + "reference_value": 18502.009486267387, + "rel_diff": 3.453354114783693e-08, + "abs_diff_nats": 0.000638939905911684, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 3: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -141741.96888570738, + "reference_value": -141741.9662042298, + "rel_diff": 1.8918021593985197e-08, + "abs_diff_nats": 0.0026814775774255395, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 3: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 18502.010125207293, + "reference_value": -141741.96888570738, + "rel_diff": 1.1305330402184992, + "abs_diff_nats": 160243.97901091469, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 3: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 18502.009486267387, + "reference_value": -141741.9662042298, + "rel_diff": 1.1305330381801582, + "abs_diff_nats": 160243.9756904972, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 4: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 18751.91028804102, + "reference_value": 18751.91028803973, + "rel_diff": 6.887204859023277e-14, + "abs_diff_nats": 1.291482476517558e-09, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 4: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 24880.545932988724, + "reference_value": 24880.545932988734, + "rel_diff": 4.386534142245053e-16, + "abs_diff_nats": 1.0913936421275139e-11, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 4: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 18751.91028804102, + "reference_value": 24880.545932988724, + "rel_diff": 0.24632239426956629, + "abs_diff_nats": 6128.6356449477025, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 4: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 18751.91028803973, + "reference_value": 24880.545932988734, + "rel_diff": 0.24632239426961852, + "abs_diff_nats": 6128.635644949005, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 5: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 24935.95274065376, + "reference_value": 24935.952740667337, + "rel_diff": 5.444723548069624e-13, + "abs_diff_nats": 1.3576936908066273e-08, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 5: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 25472.51918677797, + "reference_value": 25472.519186809055, + "rel_diff": 1.2203947587051716e-12, + "abs_diff_nats": 3.108652890659869e-08, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 5: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 24935.95274065376, + "reference_value": 25472.51918677797, + "rel_diff": 0.02106452220880942, + "abs_diff_nats": 536.5664461242086, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 5: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 24935.952740667337, + "reference_value": 25472.519186809055, + "rel_diff": 0.021064522209471106, + "abs_diff_nats": 536.5664461417182, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 6: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 28315.201514570836, + "reference_value": 28315.201450716388, + "rel_diff": 2.255129565490238e-09, + "abs_diff_nats": 6.38544479443226e-05, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 6: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -83383.91553783754, + "reference_value": -83383.91543299965, + "rel_diff": 1.2572915326225146e-09, + "abs_diff_nats": 0.00010483789083082229, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 6: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 28315.201514570836, + "reference_value": -83383.91553783754, + "rel_diff": 1.3395762999606573, + "abs_diff_nats": 111699.11705240837, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 6: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 28315.201450716388, + "reference_value": -83383.91543299965, + "rel_diff": 1.339576299621815, + "abs_diff_nats": 111699.11688371604, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 7: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 23338.89001398478, + "reference_value": 23338.89001459252, + "rel_diff": 2.6039908034988732e-11, + "abs_diff_nats": 6.077425496187061e-07, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 7: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -11960.284429561456, + "reference_value": -11960.284429931584, + "rel_diff": 3.094641820617874e-11, + "abs_diff_nats": 3.701279638335109e-07, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 7: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 23338.89001398478, + "reference_value": -11960.284429561456, + "rel_diff": 2.9513658016610007, + "abs_diff_nats": 35299.17444354623, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 7: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 23338.89001459252, + "reference_value": -11960.284429931584, + "rel_diff": 2.9513658016514266, + "abs_diff_nats": 35299.174444524106, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 8: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 24869.037000609715, + "reference_value": 24869.037000618693, + "rel_diff": 3.6103254402970966e-13, + "abs_diff_nats": 8.978531695902348e-09, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 8: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 23223.5503914968, + "reference_value": 23223.550391490266, + "rel_diff": 2.8134414537799874e-13, + "abs_diff_nats": 6.5338099375367165e-09, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 8: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 24869.037000609715, + "reference_value": 23223.5503914968, + "rel_diff": 0.07085422260480047, + "abs_diff_nats": 1645.4866091129152, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 8: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 24869.037000618693, + "reference_value": 23223.550391490266, + "rel_diff": 0.07085422260548835, + "abs_diff_nats": 1645.4866091284275, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 9: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -31749.513230927652, + "reference_value": -31750.031116865313, + "rel_diff": 1.631135212922525e-05, + "abs_diff_nats": 0.517885937661049, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 9: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -177117.70707592083, + "reference_value": -177117.67871082143, + "rel_diff": 1.6014832399351334e-07, + "abs_diff_nats": 0.028365099395159632, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 9: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -31749.513230927652, + "reference_value": -177117.70707592083, + "rel_diff": 0.8207434267578999, + "abs_diff_nats": 145368.1938449932, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 9: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -31750.031116865313, + "reference_value": -177117.67871082143, + "rel_diff": 0.8207404740850103, + "abs_diff_nats": 145367.64759395612, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 10: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 6560.779755510557, + "reference_value": 6560.779574232118, + "rel_diff": 2.7630624891784683e-08, + "abs_diff_nats": 0.00018127843941329047, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 10: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -101745.38334612483, + "reference_value": -101745.38351063897, + "rel_diff": 1.6169200007374225e-09, + "abs_diff_nats": 0.0001645141455810517, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 10: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 6560.779755510557, + "reference_value": -101745.38334612483, + "rel_diff": 1.0644823336425164, + "abs_diff_nats": 108306.16310163538, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 10: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 6560.779574232118, + "reference_value": -101745.38351063897, + "rel_diff": 1.0644823317565666, + "abs_diff_nats": 108306.16308487109, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 11: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 12667.92491578938, + "reference_value": 12667.924904351159, + "rel_diff": 9.029276843243341e-10, + "abs_diff_nats": 1.1438220099080354e-05, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 11: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 18957.52834973713, + "reference_value": 18957.52834974321, + "rel_diff": 3.206674664808082e-13, + "abs_diff_nats": 6.079062586650252e-09, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 11: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 12667.92491578938, + "reference_value": 18957.52834973713, + "rel_diff": 0.3317733893318938, + "abs_diff_nats": 6289.603433947752, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 11: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 12667.924904351159, + "reference_value": 18957.52834974321, + "rel_diff": 0.3317733899354684, + "abs_diff_nats": 6289.603445392051, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 12: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 18842.279796744107, + "reference_value": 18842.279796748757, + "rel_diff": 2.467502322232501e-13, + "abs_diff_nats": 4.649336915463209e-09, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 12: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 24810.049660195124, + "reference_value": 24810.0496601949, + "rel_diff": 8.94462970739782e-15, + "abs_diff_nats": 2.219167072325945e-10, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 12: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 18842.279796744107, + "reference_value": 24810.049660195124, + "rel_diff": 0.24053840863630424, + "abs_diff_nats": 5967.769863451016, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 12: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 18842.279796748757, + "reference_value": 24810.0496601949, + "rel_diff": 0.24053840863611006, + "abs_diff_nats": 5967.769863446145, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 13: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 22879.75598926498, + "reference_value": 22879.75598895483, + "rel_diff": 1.3555749692851728e-11, + "abs_diff_nats": 3.101522452197969e-07, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 13: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -3605.706216041661, + "reference_value": -3605.7062159501947, + "rel_diff": 2.5367031502259044e-11, + "abs_diff_nats": 9.146606316789985e-08, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 13: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 22879.75598926498, + "reference_value": -3605.706216041661, + "rel_diff": 7.345429887624717, + "abs_diff_nats": 26485.46220530664, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 13: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 22879.75598895483, + "reference_value": -3605.7062159501947, + "rel_diff": 7.345429887699665, + "abs_diff_nats": 26485.462204905023, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 14: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 4357.021950291826, + "reference_value": 4357.021950280177, + "rel_diff": 2.673571139470296e-12, + "abs_diff_nats": 1.1648808140307665e-08, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 14: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 11126.921475785763, + "reference_value": 11126.921475785763, + "rel_diff": 0.0, + "abs_diff_nats": 0.0, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 14: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 4357.021950291826, + "reference_value": 11126.921475785763, + "rel_diff": 0.6084252090954797, + "abs_diff_nats": 6769.899525493936, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 14: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 4357.021950280177, + "reference_value": 11126.921475785763, + "rel_diff": 0.6084252090965266, + "abs_diff_nats": 6769.899525505585, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 15: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 14146.464614111494, + "reference_value": 14146.464613419455, + "rel_diff": 4.89195127877643e-11, + "abs_diff_nats": 6.920381565578282e-07, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 15: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 20410.34397371921, + "reference_value": 20410.343973721156, + "rel_diff": 9.53594248240011e-14, + "abs_diff_nats": 1.9463186617940664e-09, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 15: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 14146.464614111494, + "reference_value": 20410.34397371921, + "rel_diff": 0.30689729519861203, + "abs_diff_nats": 6263.879359607716, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 15: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 14146.464613419455, + "reference_value": 20410.343973721156, + "rel_diff": 0.30689729523258436, + "abs_diff_nats": 6263.8793603017, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 16: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 2903.043598923672, + "reference_value": 2903.0436000279587, + "rel_diff": 3.8038927111160565e-10, + "abs_diff_nats": 1.104286639019847e-06, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 16: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 9734.862241681745, + "reference_value": 9734.862241683033, + "rel_diff": 1.3229201048127153e-13, + "abs_diff_nats": 1.2878444977104664e-09, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 16: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 2903.043598923672, + "reference_value": 9734.862241681745, + "rel_diff": 0.7017889388825951, + "abs_diff_nats": 6831.818642758073, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 16: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 2903.0436000279587, + "reference_value": 9734.862241683033, + "rel_diff": 0.7017889387691982, + "abs_diff_nats": 6831.818641655074, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 17: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 13360.530937095456, + "reference_value": 13360.530937095456, + "rel_diff": 0.0, + "abs_diff_nats": 0.0, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 17: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 19481.557217641563, + "reference_value": 19481.557217641563, + "rel_diff": 0.0, + "abs_diff_nats": 0.0, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 17: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 13360.530937095456, + "reference_value": 19481.557217641563, + "rel_diff": 0.3141959450245178, + "abs_diff_nats": 6121.026280546106, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 17: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 13360.530937095456, + "reference_value": 19481.557217641563, + "rel_diff": 0.3141959450245178, + "abs_diff_nats": 6121.026280546106, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 18: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 12594.119293045376, + "reference_value": 12594.119293045376, + "rel_diff": 0.0, + "abs_diff_nats": 0.0, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 18: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 18812.946857997056, + "reference_value": 18812.946857997056, + "rel_diff": 0.0, + "abs_diff_nats": 0.0, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 18: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 12594.119293045376, + "reference_value": 18812.946857997056, + "rel_diff": 0.3305610552080077, + "abs_diff_nats": 6218.82756495168, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 18: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 12594.119293045376, + "reference_value": 18812.946857997056, + "rel_diff": 0.3305610552080077, + "abs_diff_nats": 6218.82756495168, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 19: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 10415.233657552137, + "reference_value": 10415.233657528348, + "rel_diff": 2.284033580214277e-12, + "abs_diff_nats": 2.378874341957271e-08, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 19: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 16927.632549568836, + "reference_value": 16927.63254956867, + "rel_diff": 9.886026568463228e-15, + "abs_diff_nats": 1.673470251262188e-10, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 19: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 10415.233657552137, + "reference_value": 16927.632549568836, + "rel_diff": 0.38472000576256465, + "abs_diff_nats": 6512.398892016699, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 19: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 10415.233657528348, + "reference_value": 16927.63254956867, + "rel_diff": 0.38472000576396387, + "abs_diff_nats": 6512.398892040321, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 20: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 23125.781207506512, + "reference_value": 23125.78120750651, + "rel_diff": 1.573126881400592e-16, + "abs_diff_nats": 3.637978807091713e-12, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 20: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 27642.806005943028, + "reference_value": 27642.8060059429, + "rel_diff": 4.606234917715501e-15, + "abs_diff_nats": 1.2732925824820995e-10, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 20: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 23125.781207506512, + "reference_value": 27642.806005943028, + "rel_diff": 0.16340688414430085, + "abs_diff_nats": 4517.024798436516, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 20: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 23125.78120750651, + "reference_value": 27642.8060059429, + "rel_diff": 0.16340688414429713, + "abs_diff_nats": 4517.024798436392, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 21: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 25204.95975364132, + "reference_value": 25204.95975365577, + "rel_diff": 5.733019200585084e-13, + "abs_diff_nats": 1.4450051821768284e-08, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 21: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 27788.39615110059, + "reference_value": 27788.396151112443, + "rel_diff": 4.265282130372361e-13, + "abs_diff_nats": 1.18525349535048e-08, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 21: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 25204.95975364132, + "reference_value": 27788.39615110059, + "rel_diff": 0.09296817216120444, + "abs_diff_nats": 2583.4363974592707, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 21: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 25204.95975365577, + "reference_value": 27788.396151112443, + "rel_diff": 0.09296817216107131, + "abs_diff_nats": 2583.436397456673, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 22: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 11553.07472359277, + "reference_value": 11553.07472359277, + "rel_diff": 0.0, + "abs_diff_nats": 0.0, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 22: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 17852.91967933103, + "reference_value": 17852.91967933103, + "rel_diff": 0.0, + "abs_diff_nats": 0.0, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 22: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 11553.07472359277, + "reference_value": 17852.91967933103, + "rel_diff": 0.3528747716840858, + "abs_diff_nats": 6299.844955738259, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 22: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 11553.07472359277, + "reference_value": 17852.91967933103, + "rel_diff": 0.3528747716840858, + "abs_diff_nats": 6299.844955738259, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 23: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 21983.89953487791, + "reference_value": 21983.8995348776, + "rel_diff": 1.4066121349954454e-14, + "abs_diff_nats": 3.092281986027956e-10, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 23: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 27386.085836286547, + "reference_value": 27386.08583628653, + "rel_diff": 6.642020383707766e-16, + "abs_diff_nats": 1.8189894035458565e-11, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 23: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 21983.89953487791, + "reference_value": 27386.085836286547, + "rel_diff": 0.19726025594540217, + "abs_diff_nats": 5402.1863014086375, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 23: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 21983.8995348776, + "reference_value": 27386.08583628653, + "rel_diff": 0.19726025594541294, + "abs_diff_nats": 5402.186301408929, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 24: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 23449.286728500934, + "reference_value": 23449.286728501105, + "rel_diff": 7.291693172291214e-15, + "abs_diff_nats": 1.709850039333105e-10, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 24: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 28384.905983325858, + "reference_value": 28384.905983325836, + "rel_diff": 7.689957773815647e-16, + "abs_diff_nats": 2.1827872842550278e-11, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 24: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 23449.286728500934, + "reference_value": 28384.905983325858, + "rel_diff": 0.17388182499967603, + "abs_diff_nats": 4935.619254824924, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 24: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 23449.286728501105, + "reference_value": 28384.905983325836, + "rel_diff": 0.17388182499966937, + "abs_diff_nats": 4935.619254824731, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 25: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -136892.73476270546, + "reference_value": -136892.7373918455, + "rel_diff": 1.9205840227843143e-08, + "abs_diff_nats": 0.0026291400426998734, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 25: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -189785.101411741, + "reference_value": -189785.10368105007, + "rel_diff": 1.195725601364047e-08, + "abs_diff_nats": 0.002269309072289616, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 25: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -136892.73476270546, + "reference_value": -189785.101411741, + "rel_diff": 0.278696094981054, + "abs_diff_nats": 52892.36664903554, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 25: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -136892.7373918455, + "reference_value": -189785.10368105007, + "rel_diff": 0.27869608975262183, + "abs_diff_nats": 52892.36628920457, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 26: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 20216.49120362533, + "reference_value": 20216.488710127065, + "rel_diff": 1.233398292139061e-07, + "abs_diff_nats": 0.002493498264811933, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 26: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -186990.07770962076, + "reference_value": -186990.07871807058, + "rel_diff": 5.393065919406771e-09, + "abs_diff_nats": 0.0010084498208016157, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 26: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 20216.49120362533, + "reference_value": -186990.07770962076, + "rel_diff": 1.108115315268331, + "abs_diff_nats": 207206.5689132461, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 26: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 20216.488710127065, + "reference_value": -186990.07871807058, + "rel_diff": 1.108115301350335, + "abs_diff_nats": 207206.56742819765, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 27: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 23997.437153357016, + "reference_value": 23997.437153352766, + "rel_diff": 1.7706721011620424e-13, + "abs_diff_nats": 4.249159246683121e-09, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 27: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 27662.094569021887, + "reference_value": 27662.094569021836, + "rel_diff": 1.8412092103944024e-15, + "abs_diff_nats": 5.093170329928398e-11, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 27: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 23997.437153357016, + "reference_value": 27662.094569021887, + "rel_diff": 0.13247939003754375, + "abs_diff_nats": 3664.657415664871, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 27: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 23997.437153352766, + "reference_value": 27662.094569021836, + "rel_diff": 0.13247939003769577, + "abs_diff_nats": 3664.6574156690695, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 28: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 15428.346339165015, + "reference_value": 15428.35495122485, + "rel_diff": 5.581968954248514e-07, + "abs_diff_nats": 0.008612059835286345, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 28: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -74102.3544780082, + "reference_value": -74102.36803813929, + "rel_diff": 1.8299187258583624e-07, + "abs_diff_nats": 0.01356013109034393, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 28: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 15428.346339165015, + "reference_value": -74102.3544780082, + "rel_diff": 1.2082031866307807, + "abs_diff_nats": 89530.70081717322, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 28: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 15428.35495122485, + "reference_value": -74102.36803813929, + "rel_diff": 1.2082032647497059, + "abs_diff_nats": 89530.72298936415, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 29: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 9199.66418882041, + "reference_value": 9199.664188834518, + "rel_diff": 1.533543129870372e-12, + "abs_diff_nats": 1.4108081813901663e-08, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 29: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 15888.261826776452, + "reference_value": 15888.26182677463, + "rel_diff": 1.1471534156628055e-13, + "abs_diff_nats": 1.8226273823529482e-09, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 29: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 9199.66418882041, + "reference_value": 15888.261826776452, + "rel_diff": 0.42097730455849885, + "abs_diff_nats": 6688.597637956042, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 29: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 9199.664188834518, + "reference_value": 15888.26182677463, + "rel_diff": 0.42097730455754445, + "abs_diff_nats": 6688.597637940111, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 30: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 18699.68589006445, + "reference_value": 18699.68588990701, + "rel_diff": 8.419436014135689e-12, + "abs_diff_nats": 1.5744080883450806e-07, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 30: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -2303.2655718650058, + "reference_value": -2303.265571702592, + "rel_diff": 7.051463272806392e-11, + "abs_diff_nats": 1.6241392586380243e-07, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 30: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 18699.68589006445, + "reference_value": -2303.2655718650058, + "rel_diff": 9.11877106942683, + "abs_diff_nats": 21002.951461929457, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 30: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 18699.68588990701, + "reference_value": -2303.265571702592, + "rel_diff": 9.118771069930967, + "abs_diff_nats": 21002.951461609602, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 31: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 13020.244793610349, + "reference_value": 13020.244793610349, + "rel_diff": 0.0, + "abs_diff_nats": 0.0, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 31: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 19182.855515516767, + "reference_value": 19182.855515516767, + "rel_diff": 0.0, + "abs_diff_nats": 0.0, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 31: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 13020.244793610349, + "reference_value": 19182.855515516767, + "rel_diff": 0.32125617152887176, + "abs_diff_nats": 6162.610721906418, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 31: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 13020.244793610349, + "reference_value": 19182.855515516767, + "rel_diff": 0.32125617152887176, + "abs_diff_nats": 6162.610721906418, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 32: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 20526.007408227943, + "reference_value": 20526.007408524267, + "rel_diff": 1.4436528345545684e-11, + "abs_diff_nats": 2.963242877740413e-07, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 32: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 25770.812570519138, + "reference_value": 25770.81257052731, + "rel_diff": 3.1706025482768854e-13, + "abs_diff_nats": 8.170900400727987e-09, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 32: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 20526.007408227943, + "reference_value": 25770.812570519138, + "rel_diff": 0.20351725999866452, + "abs_diff_nats": 5244.805162291195, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 32: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 20526.007408524267, + "reference_value": 25770.81257052731, + "rel_diff": 0.2035172599874186, + "abs_diff_nats": 5244.805162003042, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 33: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 9476.347543144097, + "reference_value": 9476.347543144097, + "rel_diff": 0.0, + "abs_diff_nats": 0.0, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 33: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 15902.910586796046, + "reference_value": 15902.910586796046, + "rel_diff": 0.0, + "abs_diff_nats": 0.0, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 33: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 9476.347543144097, + "reference_value": 15902.910586796046, + "rel_diff": 0.4041123798424567, + "abs_diff_nats": 6426.56304365195, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 33: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 9476.347543144097, + "reference_value": 15902.910586796046, + "rel_diff": 0.4041123798424567, + "abs_diff_nats": 6426.56304365195, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 34: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 23033.791255159696, + "reference_value": 23033.791840214264, + "rel_diff": 2.5399837408240072e-08, + "abs_diff_nats": 0.0005850545676366892, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 34: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -130304.42446636864, + "reference_value": -130304.42314719265, + "rel_diff": 1.0123800571741685e-08, + "abs_diff_nats": 0.0013191759935580194, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 34: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 23033.791255159696, + "reference_value": -130304.42446636864, + "rel_diff": 1.176769064822543, + "abs_diff_nats": 153338.21572152834, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 34: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 23033.791840214264, + "reference_value": -130304.42314719265, + "rel_diff": 1.1767690711020236, + "abs_diff_nats": 153338.21498740691, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 35: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 12436.966956375622, + "reference_value": 12436.966956375636, + "rel_diff": 1.170053380330565e-15, + "abs_diff_nats": 1.4551915228366852e-11, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 35: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 18757.071353384385, + "reference_value": 18757.071353417698, + "rel_diff": 1.7760220297114191e-12, + "abs_diff_nats": 3.3312971936538815e-08, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 35: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 12436.966956375622, + "reference_value": 18757.071353384385, + "rel_diff": 0.33694515939816005, + "abs_diff_nats": 6320.104397008763, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 35: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 12436.966956375636, + "reference_value": 18757.071353417698, + "rel_diff": 0.3369451593993369, + "abs_diff_nats": 6320.1043970420615, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 36: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 4935.957801232435, + "reference_value": 4935.957801232435, + "rel_diff": 0.0, + "abs_diff_nats": 0.0, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 36: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 11735.12560234069, + "reference_value": 11735.12560247699, + "rel_diff": 1.1614746923350229e-11, + "abs_diff_nats": 1.3630051398649812e-07, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 36: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 4935.957801232435, + "reference_value": 11735.12560234069, + "rel_diff": 0.5793860271723118, + "abs_diff_nats": 6799.167801108255, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 36: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 4935.957801232435, + "reference_value": 11735.12560247699, + "rel_diff": 0.5793860271771971, + "abs_diff_nats": 6799.167801244555, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 37: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -10183.840807931541, + "reference_value": -10183.840810860973, + "rel_diff": 2.876548796386419e-10, + "abs_diff_nats": 2.9294315027073026e-06, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 37: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -3158.477740005619, + "reference_value": -3158.4777400088497, + "rel_diff": 1.0228108116058432e-12, + "abs_diff_nats": 3.230525180697441e-09, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 37: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -10183.840807931541, + "reference_value": -3158.477740005619, + "rel_diff": 2.2242876620410894, + "abs_diff_nats": 7025.363067925922, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 37: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -10183.840810860973, + "reference_value": -3158.4777400088497, + "rel_diff": 2.2242876629652737, + "abs_diff_nats": 7025.363070852123, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 38: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 12580.943015568031, + "reference_value": 12580.943017464866, + "rel_diff": 1.5077048448807206e-10, + "abs_diff_nats": 1.896834874060005e-06, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 38: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 18932.692618871544, + "reference_value": 18932.692618890847, + "rel_diff": 1.0195652535534315e-12, + "abs_diff_nats": 1.930311555042863e-08, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 38: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 12580.943015568031, + "reference_value": 18932.692618871544, + "rel_diff": 0.3354910857725688, + "abs_diff_nats": 6351.749603303513, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 38: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 12580.943017464866, + "reference_value": 18932.692618890847, + "rel_diff": 0.33549108567305796, + "abs_diff_nats": 6351.749601425981, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 39: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -2591.194896997622, + "reference_value": -2590.8224259740236, + "rel_diff": 0.00014376555485399797, + "abs_diff_nats": 0.3724710235983366, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 39: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -92415.23122412137, + "reference_value": -92415.18628955261, + "rel_diff": 4.862249437152171e-07, + "abs_diff_nats": 0.044934568752069026, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 39: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -2591.194896997622, + "reference_value": -92415.23122412137, + "rel_diff": 0.971961387071428, + "abs_diff_nats": 89824.03632712374, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 39: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -2590.8224259740236, + "reference_value": -92415.18628955261, + "rel_diff": 0.971965403847626, + "abs_diff_nats": 89824.36386357859, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 40: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 6775.961380959467, + "reference_value": 6775.961380959467, + "rel_diff": 0.0, + "abs_diff_nats": 0.0, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 40: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 13398.840222654067, + "reference_value": 13398.840222654067, + "rel_diff": 0.0, + "abs_diff_nats": 0.0, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 40: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 6775.961380959467, + "reference_value": 13398.840222654067, + "rel_diff": 0.4942874705302463, + "abs_diff_nats": 6622.878841694601, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 40: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 6775.961380959467, + "reference_value": 13398.840222654067, + "rel_diff": 0.4942874705302463, + "abs_diff_nats": 6622.878841694601, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 41: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 13539.215248048647, + "reference_value": 13539.215247391869, + "rel_diff": 4.8509374728052583e-11, + "abs_diff_nats": 6.567788659594953e-07, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 41: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 19660.903121931384, + "reference_value": 19660.903121956206, + "rel_diff": 1.2625019942785335e-12, + "abs_diff_nats": 2.4821929400786757e-08, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 41: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 13539.215248048647, + "reference_value": 19660.903121931384, + "rel_diff": 0.31136351346211066, + "abs_diff_nats": 6121.687873882736, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 41: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 13539.215247391869, + "reference_value": 19660.903121956206, + "rel_diff": 0.3113635134963854, + "abs_diff_nats": 6121.687874564337, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 42: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 27099.01248330762, + "reference_value": 27099.012483295468, + "rel_diff": 4.48387158874384e-13, + "abs_diff_nats": 1.2150849215686321e-08, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 42: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 18324.103083663205, + "reference_value": 18324.1030840283, + "rel_diff": 1.9924194897305465e-11, + "abs_diff_nats": 3.6509300116449594e-07, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 42: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 27099.01248330762, + "reference_value": 18324.103083663205, + "rel_diff": 0.4788725188665663, + "abs_diff_nats": 8774.909399644413, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 42: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 27099.012483295468, + "reference_value": 18324.1030840283, + "rel_diff": 0.47887251883643783, + "abs_diff_nats": 8774.90939926717, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 43: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -89812.6972414867, + "reference_value": NaN, + "rel_diff": NaN, + "abs_diff_nats": NaN, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 43: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -175043.29720358102, + "reference_value": -175043.31207082624, + "rel_diff": 8.493466584791472e-08, + "abs_diff_nats": 0.014867245219647884, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 43: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -89812.6972414867, + "reference_value": -175043.29720358102, + "rel_diff": 0.48691153173930657, + "abs_diff_nats": 85230.59996209432, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 43: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": NaN, + "reference_value": -175043.31207082624, + "rel_diff": NaN, + "abs_diff_nats": NaN, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 44: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 26462.671263610457, + "reference_value": 26462.67126365984, + "rel_diff": 1.8660974863591035e-12, + "abs_diff_nats": 4.938192432746291e-08, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 44: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 13759.133270745908, + "reference_value": 13759.133270653569, + "rel_diff": 6.711118808518938e-12, + "abs_diff_nats": 9.233917808160186e-08, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 44: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 26462.671263610457, + "reference_value": 13759.133270745908, + "rel_diff": 0.9232803944034962, + "abs_diff_nats": 12703.537992864549, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 44: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 26462.67126365984, + "reference_value": 13759.133270653569, + "rel_diff": 0.9232803944199927, + "abs_diff_nats": 12703.53799300627, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 45: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 13504.069127366387, + "reference_value": 13504.069127931114, + "rel_diff": 4.1819031201165996e-11, + "abs_diff_nats": 5.647270882036537e-07, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 45: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 19903.394044775134, + "reference_value": 19903.39404477302, + "rel_diff": 1.0619624382482499e-13, + "abs_diff_nats": 2.1136656869202852e-09, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 45: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 13504.069127366387, + "reference_value": 19903.394044775134, + "rel_diff": 0.32151927972750166, + "abs_diff_nats": 6399.324917408747, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 45: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 13504.069127931114, + "reference_value": 19903.39404477302, + "rel_diff": 0.3215192796990562, + "abs_diff_nats": 6399.324916841906, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 46: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 12905.386047434527, + "reference_value": 12905.386047434527, + "rel_diff": 0.0, + "abs_diff_nats": 0.0, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 46: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 19139.565581617124, + "reference_value": 19139.565581617124, + "rel_diff": 0.0, + "abs_diff_nats": 0.0, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 46: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 12905.386047434527, + "reference_value": 19139.565581617124, + "rel_diff": 0.32572210208210295, + "abs_diff_nats": 6234.179534182596, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 46: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 12905.386047434527, + "reference_value": 19139.565581617124, + "rel_diff": 0.32572210208210295, + "abs_diff_nats": 6234.179534182596, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 47: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 21569.14415018888, + "reference_value": 21569.144150171986, + "rel_diff": 7.83284374312979e-13, + "abs_diff_nats": 1.6894773580133915e-08, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 47: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 15503.419442045153, + "reference_value": 15503.419442032253, + "rel_diff": 8.320921005963696e-13, + "abs_diff_nats": 1.2900272849947214e-08, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 47: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 21569.14415018888, + "reference_value": 15503.419442045153, + "rel_diff": 0.3912507644406194, + "abs_diff_nats": 6065.724708143727, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 47: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 21569.144150171986, + "reference_value": 15503.419442032253, + "rel_diff": 0.3912507644406873, + "abs_diff_nats": 6065.724708139733, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 48: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 22376.164810427435, + "reference_value": 22376.16481042714, + "rel_diff": 1.3169204189857933e-14, + "abs_diff_nats": 2.9467628337442875e-10, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 48: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 27530.814473047278, + "reference_value": 27530.81447304727, + "rel_diff": 2.642841395523044e-16, + "abs_diff_nats": 7.275957614183426e-12, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 48: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 22376.164810427435, + "reference_value": 27530.814473047278, + "rel_diff": 0.18723200752619412, + "abs_diff_nats": 5154.649662619842, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 48: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 22376.16481042714, + "reference_value": 27530.81447304727, + "rel_diff": 0.1872320075262046, + "abs_diff_nats": 5154.64966262013, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 49: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 26250.953420722253, + "reference_value": 26250.95031934693, + "rel_diff": 1.181433541907e-07, + "abs_diff_nats": 0.0031013753214210737, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 49: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -177402.9202812782, + "reference_value": -177402.92200116633, + "rel_diff": 9.694812834420552e-09, + "abs_diff_nats": 0.0017198881250806153, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 49: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 26250.953420722253, + "reference_value": -177402.9202812782, + "rel_diff": 1.1479736262464029, + "abs_diff_nats": 203653.87370200045, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 49: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 26250.95031934693, + "reference_value": -177402.92200116633, + "rel_diff": 1.147973607329728, + "abs_diff_nats": 203653.87232051327, + "within_rtol": false, + "status": "RECORDED" + } + ], + "lanes_failed": 12, + "arm_rows": { + "vmap": { + "arm": "vmap", + "program": "jax.jit(jax.vmap(fn))", + "stands_for": "Nautilus(use_jax_vmap=True) \u2014 Fitness._vmap", + "hlo_source": "jax.jit(jax.vmap(fn)).lower(batched_tree) \u2014 the exact current Fitness._vmap composition (PyAutoFit#1638)", + "batch_wall_ms": 2009.2500456998096, + "wall_production_nesting_ms": 2009.2500456998096, + "wall_aot_command_buffers_on_ms": 2013.3909659001802, + "wall_aot_command_buffers_off_ms": 2013.0392838000262, + "command_buffer_delta_ms": -0.3516821001539938, + "production_nesting_vs_aot_on_delta_ms": -4.140920200370601, + "production_nesting_vs_aot_on_delta_pct": -0.20566895702341698, + "wall_per_lane_ms": 40.18500091399619, + "wall_per_lane_command_buffers_off_ms": 40.26078567600052, + "traced_batch_wall_ms": 2036.1315101999935, + "untraced_batch_wall_ms": 2019.0398877999542, + "traced_wall_per_lane_ms": 40.72263020399987, + "callback_count_per_call": 50.0, + "callback_count_per_lane": 1.0, + "callback_expectation": "B per batched call \u2014 the qhull pure_callback is vmap_method='sequential'", + "host_qhull_ms": 223.58365839972976, + "host_tables_ms": 5.634685496625025, + "host_qhull_ms_per_lane": 4.471673167994595, + "host_tables_ms_per_lane": 0.1126937099325005, + "host_callback_probe": { + "calls": 500, + "qhull_ms_total": 2235.8365839972976, + "tables_ms_total": 56.34685496625025, + "total_ms_total": 2292.183438963548, + "qhull_ms_mean": 4.471673167994595, + "tables_ms_mean": 0.1126937099325005, + "total_ms_mean": 4.584366877927096, + "non_finite_calls": 0, + "n_points": [ + 1500 + ] + }, + "host_callback_records_first": [ + { + "n_points": 1500, + "qhull_ms": 4.72813399755978, + "tables_ms": 0.1792290022422094, + "total_ms": 4.90736299980199, + "finite": true + }, + { + "n_points": 1500, + "qhull_ms": 4.44361699919682, + "tables_ms": 0.11078900206484832, + "total_ms": 4.554406001261668, + "finite": true + }, + { + "n_points": 1500, + "qhull_ms": 4.454556998098269, + "tables_ms": 0.10813900371431373, + "total_ms": 4.562696001812583, + "finite": true + }, + { + "n_points": 1500, + "qhull_ms": 4.520385999057908, + "tables_ms": 0.12075899940100498, + "total_ms": 4.641144998458913, + "finite": true + } + ], + "device_idle_ms": 284.383957, + "device_idle_ms_per_lane": 5.68767914, + "trace": { + "parser": "ProfileData.from_file(xplane) + as_text() + stack_frame_index(proto field 17)", + "stage_audit": { + "mixed_fusion": [ + { + "instruction": "loop_divide_gather_fusion", + "ms": 52.8569282, + "opcode": "fusion", + "shape": "(f64[15361,50,1,1,1500]{4,3,2,1,0}, f64[15361,50,1,1,1500]{4,3,2,1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:133", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:133 (curvature_matrix_via_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:93 (InversionImagingMapping.curvature_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:389 (AbstractInversion.curvature_reg_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "loop_broadcast_fusion.7", + "ms": 11.7499662, + "opcode": "fusion", + "shape": "f64[50,1500,180,180]{3,2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "input_reduce_fusion.21", + "ms": 6.1222597, + "opcode": "fusion", + "shape": "f64[92,50,1500]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/inversion_imaging_util.py:123", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/inversion_imaging_util.py:123 (data_vector_via_blurred_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:67 (InversionImagingMapping.data_vector)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:699 (AbstractInversion.reconstruction)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "loop_broadcast_fusion.8", + "ms": 5.5549953, + "opcode": "fusion", + "shape": "f64[15361,50,1500]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:353", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:353 (mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/abstract.py:283 (Mapper.mapping_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:91 (AbstractInversionImaging._mapping_matrix_for_convolution_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:137 (AbstractInversionImaging.operated_mapping_matrix_list)" + ] + }, + { + "instruction": "input_reduce_fusion.25", + "ms": 5.5146478000000005, + "opcode": "fusion", + "shape": "f64[15361,50]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:163", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:163 (mapped_reconstructed_data_via_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:120 (InversionImagingMapping._mapped_reconstructed_data_dict_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:196 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "input_multiply_transpose_fusion", + "ms": 4.8581932, + "opcode": "fusion", + "shape": "(f64[50,1500,1500]{2,1,0}, f64[50,1500,1500]{2,1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:491", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:491 (reconstruction_positive_only_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:706 (AbstractInversion.reconstruction)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:113 (InversionImagingMapping._mapped_reconstructed_data_dict_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:196 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)" + ] + } + ], + "other": [ + { + "instruction": "copy.140", + "ms": 0.10097709999999976, + "opcode": "copy", + "shape": "s32[1,3000,3]{2,1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "copy.141", + "ms": 0.09987280000000025, + "opcode": "copy", + "shape": "s32[1,3000,3]{2,1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "copy.142", + "ms": 0.09971910000000034, + "opcode": "copy", + "shape": "f64[1,1500,2]{2,1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "copy.139", + "ms": 0.0980749000000009, + "opcode": "copy", + "shape": "s32[1,1500]{1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "copy.138", + "ms": 0.05825360000000002, + "opcode": "copy", + "shape": "f64[1,50,1024,2]{3,2,1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "copy.122", + "ms": 0.03668219999999998, + "opcode": "copy", + "shape": "s32[50]{0}", + "source": "", + "stack": [] + } + ], + "mesh_qhull_callback": [ + { + "instruction": "pure_callback.0", + "ms": 0.5341306000000033, + "opcode": "custom-call", + "shape": "(s32[3000,3]{1,0}, s32[3000,3]{1,0}, s32[1500]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:161", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:161 (_jax_delaunay_tables)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:405 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + }, + { + "instruction": "loop_add_fusion.1", + "ms": 0.07600079999999985, + "opcode": "fusion", + "shape": "s64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:161", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:161 (_jax_delaunay_tables)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:405 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + }, + { + "instruction": "loop_broadcast_fusion.3", + "ms": 0.0021888000000000003, + "opcode": "fusion", + "shape": "s32[50,1500]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:161", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:161 (_jax_delaunay_tables)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:405 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + } + ], + "border_relocator": [ + { + "instruction": "custom-call.2", + "ms": 0.0422661, + "opcode": "custom-call", + "shape": "(f64[50,2,2]{2,1,0}, s8[4194304]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:242", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:242 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:454 (BorderRelocator.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:176 (AbstractMesh.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:214 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "loop_add_rsqrt_fusion", + "ms": 0.0187682, + "opcode": "fusion", + "shape": "(f64[50,15361]{1,0}, f64[50,15361]{1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:311", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:311 (relocated_grid_via_ellipse_border_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:423 (BorderRelocator.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:83 (AbstractMesh.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:208 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "eigh.36", + "ms": 0.014643299999999998, + "opcode": "custom-call", + "shape": "(f64[50,2,2]{1,2,0}, f64[50,2]{1,0}, s32[50]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:245", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:245 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:454 (BorderRelocator.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:176 (AbstractMesh.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:214 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "loop_add_rsqrt_fusion.1", + "ms": 0.0038816, + "opcode": "fusion", + "shape": "(f64[50,1500]{1,0}, f64[50,1500]{1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:311", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:311 (relocated_grid_via_ellipse_border_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:458 (BorderRelocator.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:176 (AbstractMesh.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:214 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "input_reduce_fusion.27", + "ms": 0.003331199999999999, + "opcode": "fusion", + "shape": "f64[50]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:269", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:269 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:454 (BorderRelocator.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:176 (AbstractMesh.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:214 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "input_reduce_fusion.26", + "ms": 0.0033026, + "opcode": "fusion", + "shape": "f64[50]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:270", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:270 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:454 (BorderRelocator.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:176 (AbstractMesh.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:214 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + } + ], + "mesh_construction": [ + { + "instruction": "loop_compare_fusion.5", + "ms": 0.0110594, + "opcode": "fusion", + "shape": "pred[50,15361,3]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:732", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:732 (DelaunayInterface.sizes)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:958 (InterpolatorDelaunay._mappings_sizes_weights)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/abstract.py:36 (AbstractInterpolator.mappings)" + ] + }, + { + "instruction": "loop_compare_fusion.6", + "ms": 0.0058656, + "opcode": "fusion", + "shape": "pred[50,6000,3]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:736", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:736 (DelaunayInterface.splitted_sizes)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:997 (InterpolatorDelaunay._mappings_sizes_weights_split)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt_split.py:124 (AdaptSplit.regularization_matrix_from)" + ] + }, + { + "instruction": "loop_multiply_fusion.4", + "ms": 0.0027040000000000002, + "opcode": "fusion", + "shape": "f64[50,1500]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:412", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:412 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "input_concatenate_fusion.10", + "ms": 0.0026207999999999995, + "opcode": "fusion", + "shape": "f64[50,1500,2]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:820", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:820 (InterpolatorDelaunay.mesh_grid_xy)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:847 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + } + ], + "mesh_seed_argmin": [ + { + "instruction": "input_reduce_fusion", + "ms": 3.928828499999999, + "opcode": "fusion", + "shape": "(f64[50,1024]{1,0}, s64[50,1024]{1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:191", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:191 (_nearest_vertex_seed_from..argmin_chunk)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204 (_nearest_vertex_seed_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:351 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)" + ] + }, + { + "instruction": "loop_dynamic_update_slice_fusion", + "ms": 0.05091259999999987, + "opcode": "fusion", + "shape": "s32[21,50,1024]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204 (_nearest_vertex_seed_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:351 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "loop_add_fusion", + "ms": 0.031878499999999935, + "opcode": "fusion", + "shape": "s64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204 (_nearest_vertex_seed_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:351 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "loop_broadcast_fusion.4", + "ms": 0.004079999999999999, + "opcode": "fusion", + "shape": "s32[21,50,1024]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204 (_nearest_vertex_seed_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:351 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "pdip_solve": [ + { + "instruction": "cholesky.88", + "ms": 378.55732189995365, + "opcode": "custom-call", + "shape": "(f64[50,1500,1500]{1,2,0}, s32[50]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:106", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:106 (factorize_kkt)", + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:212 (pdip_pc_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:83 (solve_nnls)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:129 (_solve_nnls_primal_with..primal)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:164 (solve_nnls_primal_with_status)" + ] + }, + { + "instruction": "cholesky.66", + "ms": 214.6268899999894, + "opcode": "custom-call", + "shape": "(f64[50,1500,1500]{1,2,0}, s32[50]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:252 (active_set_search..body_fun)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:262 (active_set_search)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:293 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)" + ] + }, + { + "instruction": "triangular-solve", + "ms": 57.22778909999948, + "opcode": "custom-call", + "shape": "(f64[50,1500,1]{1,2,0}, s8[800]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146 (solve_kkt_rhs)", + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:213 (pdip_pc_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:83 (solve_nnls)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:129 (_solve_nnls_primal_with..primal)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:164 (solve_nnls_primal_with_status)" + ] + }, + { + "instruction": "triangular-solve.2", + "ms": 55.443527699998164, + "opcode": "custom-call", + "shape": "(f64[50,1500,1]{1,2,0}, s8[800]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146 (solve_kkt_rhs)", + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:217 (pdip_pc_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:83 (solve_nnls)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:129 (_solve_nnls_primal_with..primal)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:164 (solve_nnls_primal_with_status)" + ] + }, + { + "instruction": "triangular-solve.1", + "ms": 53.72170989999854, + "opcode": "custom-call", + "shape": "(f64[50,1500,1]{1,2,0}, s8[800]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146 (solve_kkt_rhs)", + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:213 (pdip_pc_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:83 (solve_nnls)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:129 (_solve_nnls_primal_with..primal)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:164 (solve_nnls_primal_with_status)" + ] + }, + { + "instruction": "triangular-solve.3", + "ms": 53.677886499998785, + "opcode": "custom-call", + "shape": "(f64[50,1500,1]{1,2,0}, s8[800]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146 (solve_kkt_rhs)", + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:217 (pdip_pc_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:83 (solve_nnls)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:129 (_solve_nnls_primal_with..primal)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:164 (solve_nnls_primal_with_status)" + ] + } + ], + "mesh_dual_areas": [ + { + "instruction": "input_scatter_fusion.7", + "ms": 0.0048672, + "opcode": "fusion", + "shape": "f64[50,1500]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:393", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:393 (_dual_areas_padded_jnp)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:408 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + }, + { + "instruction": "input_scatter_fusion.9", + "ms": 0.0048448, + "opcode": "fusion", + "shape": "f64[50,1500]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:393", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:393 (_dual_areas_padded_jnp)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:408 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + } + ], + "mesh_locate_walk": [ + { + "instruction": "loop_reduce_fusion", + "ms": 0.6012138000000001, + "opcode": "fusion", + "shape": "(f64[50,21361]{1,0}, s64[50,21361]{1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:264", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:264 (_walk_from_seed..walk_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:292 (_walk_from_seed..body)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:264 (_walk_from_seed..walk_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:292 (_walk_from_seed..body)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)" + ] + }, + { + "instruction": "loop_slice_subtract_fusion", + "ms": 0.5013109, + "opcode": "fusion", + "shape": "(f64[50,21361,1]{2,1,0}, f64[50,21361,1]{2,1,0}, f64[50,21361,1]{2,1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:236", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:236 (_walk_from_seed..cross)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:250 (_walk_from_seed..weights_of)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:262 (_walk_from_seed..walk_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:292 (_walk_from_seed..body)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)" + ] + }, + { + "instruction": "loop_select_fusion", + "ms": 0.23899830000000002, + "opcode": "fusion", + "shape": "(pred[50,21361]{1,0}, pred[50,21361]{1,0}, s32[50,21361]{1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:353 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "loop_gather_fusion.1", + "ms": 0.1629176, + "opcode": "fusion", + "shape": "s32[1068050,1,1,3]{3,2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:239", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:239 (_walk_from_seed..weights_of)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:262 (_walk_from_seed..walk_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:292 (_walk_from_seed..body)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:353 (pix_indexes_delaunay_walk_from)" + ] + }, + { + "instruction": "loop_gather_fusion", + "ms": 0.1479119, + "opcode": "fusion", + "shape": "s32[1068050,1,1,1]{3,2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:267", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:267 (_walk_from_seed..walk_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:292 (_walk_from_seed..body)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:353 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)" + ] + }, + { + "instruction": "input_concatenate_fusion", + "ms": 0.08578990000000002, + "opcode": "fusion", + "shape": "s32[50,21361,2]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:242", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:242 (_walk_from_seed..weights_of)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:262 (_walk_from_seed..walk_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:292 (_walk_from_seed..body)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:353 (pix_indexes_delaunay_walk_from)" + ] + } + ], + "mapping_matrix": [ + { + "instruction": "input_scatter_fusion.3", + "ms": 0.1349518, + "opcode": "fusion", + "shape": "f64[50,1500]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:71", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:71 (adaptive_pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/abstract.py:507 (Mapper.pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt.py:339 (Adapt.regularization_weights_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt_split.py:120 (AdaptSplit.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)" + ] + }, + { + "instruction": "input_reduce_fusion.49", + "ms": 0.0037856000000000005, + "opcode": "fusion", + "shape": "f64[50]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:93", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:93 (adaptive_pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/abstract.py:507 (Mapper.pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt.py:339 (Adapt.regularization_weights_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt_split.py:120 (AdaptSplit.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)" + ] + }, + { + "instruction": "loop_and_fusion.2", + "ms": 0.0020609, + "opcode": "fusion", + "shape": "pred[46083,1]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:338", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:338 (mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/abstract.py:283 (Mapper.mapping_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:91 (AbstractInversionImaging._mapping_matrix_for_convolution_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:137 (AbstractInversionImaging.operated_mapping_matrix_list)" + ] + } + ], + "psf_convolution_mapping_matrix": [ + { + "instruction": "input_scatter_fusion", + "ms": 100.69721580000001, + "opcode": "fusion", + "shape": "f64[50,1500,180,180]{3,2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "fft.25.0", + "ms": 75.8665442, + "opcode": "fft", + "shape": "c128[50,1500,180,91]{3,2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "fft.27.0", + "ms": 48.599778799999996, + "opcode": "fft", + "shape": "c128[50,1500,91,180]{3,2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "fft.29.0", + "ms": 47.0424031, + "opcode": "fft", + "shape": "f64[50,1500,180,180]{3,2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "input_transpose_fusion.4", + "ms": 26.356773599999997, + "opcode": "fusion", + "shape": "c128[50,1500,91,180]{3,2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "wrapped_transpose", + "ms": 24.605197099999998, + "opcode": "fusion", + "shape": "c128[50,1500,180,91]{3,2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + } + ], + "regularization_H": [ + { + "instruction": "input_scatter_fusion.10", + "ms": 0.0084259, + "opcode": "fusion", + "shape": "f64[50,1500,1500]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:615", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:615 (pixel_splitted_regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt_split.py:137 (AdaptSplit.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:332 (AbstractInversion.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "curvature_matrix_F": [ + { + "instruction": "cublas-lt-matmul.2", + "ms": 212.17574299999998, + "opcode": "custom-call", + "shape": "(f64[50,1500,1500]{2,1,0}, s8[4194304]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:134", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:134 (curvature_matrix_via_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:93 (InversionImagingMapping.curvature_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:389 (AbstractInversion.curvature_reg_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "inversion_other": [ + { + "instruction": "cholesky.132", + "ms": 14.861443999999912, + "opcode": "custom-call", + "shape": "(f64[50,1500,1500]{1,2,0}, s32[50]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986 (AbstractInversion._log_det_symmetric_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:1078 (AbstractInversion.log_det_curvature_reg_matrix_term)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:347 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/model/analysis.py:135 (AnalysisImaging.log_likelihood_function)" + ] + }, + { + "instruction": "cholesky.143", + "ms": 14.458568400000052, + "opcode": "custom-call", + "shape": "(f64[50,1500,1500]{1,2,0}, s32[50]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986 (AbstractInversion._log_det_symmetric_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:1157 (AbstractInversion.log_det_regularization_matrix_term)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:348 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/model/analysis.py:135 (AnalysisImaging.log_likelihood_function)" + ] + }, + { + "instruction": "loop_reduce_window_fusion", + "ms": 0.003283200000000001, + "opcode": "fusion", + "shape": "s64[94,16]{1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "loop_broadcast_convert_fusion", + "ms": 0.00256, + "opcode": "fusion", + "shape": "(s32[1500]{0}, s64[1500]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:527", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:527 (AbstractInversion.zeroed_ids_to_keep)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:567 (AbstractInversion.solve_ids_to_keep)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:684 (AbstractInversion.reconstruction)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "loop_reduce_window_fusion.1", + "ms": 0.0022879999999999997, + "opcode": "fusion", + "shape": "s64[6,16]{1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "input_scatter_fusion.5", + "ms": 0.0022688000000000005, + "opcode": "fusion", + "shape": "s64[1500]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:527", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:527 (AbstractInversion.zeroed_ids_to_keep)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:567 (AbstractInversion.solve_ids_to_keep)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:684 (AbstractInversion.reconstruction)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ] + }, + "stage_audit_note": "The HLO instructions that contributed most of each stage's milliseconds, with their full source stack. A stage row is only as good as the rules that built it; this is how a reader checks a row against the HLO instead of trusting it.", + "untraced_wall_ms": 2019.0398877999542, + "reconciliation_vs_untraced_pct": 0.8786415418164226, + "wall_basis": "wall_ms is the TRACED run's wall, the run these kernel durations came from. untraced_wall_ms is the same executable without the profiler; the difference is the profiler's overhead and belongs in neither the stages nor the idle row.", + "calls": 10, + "call_split": "per-call (first-instruction recurrence)", + "call_blocks": 10, + "events": 300030, + "streams": [ + "Stream #14(MemcpyH2D,MemcpyD2H,Compute,MemcpyD2D)" + ], + "per_stage_ms": { + "border_relocator": { + "median_ms": 0.09764849999999999, + "min_ms": 0.09734499999999999, + "max_ms": 0.09824000000000001 + }, + "curvature_matrix_F": { + "median_ms": 212.7999845, + "min_ms": 208.080725, + "max_ms": 213.716375 + }, + "inversion_other": { + "median_ms": 29.508730999999983, + "min_ms": 28.80029700000005, + "max_ms": 29.635223999999962 + }, + "mapping_matrix": { + "median_ms": 0.140401, + "min_ms": 0.138818, + "max_ms": 0.143361 + }, + "mesh_construction": { + "median_ms": 0.022048, + "min_ms": 0.021728, + "max_ms": 0.024289 + }, + "mesh_dual_areas": { + "median_ms": 0.009696, + "min_ms": 0.009600000000000001, + "max_ms": 0.009856 + }, + "mesh_locate_walk": { + "median_ms": 2.032842500000001, + "min_ms": 2.0163160000000016, + "max_ms": 2.043668000000001 + }, + "mesh_qhull_callback": { + "median_ms": 0.6125649999999996, + "min_ms": 0.6107279999999993, + "max_ms": 0.6134109999999998 + }, + "mesh_seed_argmin": { + "median_ms": 4.013916500000002, + "min_ms": 4.013073000000003, + "max_ms": 4.0319550000000035 + }, + "mixed_fusion": { + "median_ms": 96.0064145, + "min_ms": 95.70107399999995, + "max_ms": 96.67638900000001 + }, + "other": { + "median_ms": 0.5738310000000006, + "min_ms": 0.5726170000000006, + "max_ms": 0.5761340000000008 + }, + "pdip_solve": { + "median_ms": 1083.3945950000082, + "min_ms": 1081.6075210000167, + "max_ms": 1084.2923540000077 + }, + "psf_convolution_mapping_matrix": { + "median_ms": 323.17494800000003, + "min_ms": 323.009763, + "max_ms": 323.325376 + }, + "regularization_H": { + "median_ms": 0.008432499999999999, + "min_ms": 0.008032, + "max_ms": 0.008768 + } + }, + "stage_order": [ + "border_relocator", + "mesh_qhull_callback", + "mesh_seed_argmin", + "mesh_locate_walk", + "mesh_dual_areas", + "mesh_construction", + "mapping_matrix", + "psf_convolution_mapping_matrix", + "curvature_matrix_F", + "regularization_H", + "pdip_solve", + "inversion_other", + "mixed_fusion", + "other" + ], + "mixed_fusion": { + "ms": 96.0064145, + "constituent_stage_sets": { + "curvature_matrix_F + psf_convolution_mapping_matrix": 52.8569282, + "pdip_solve + psf_convolution_mapping_matrix": 11.7499662, + "data_vector_D + pdip_solve": 6.1645451, + "pdip_solve + regularization_H": 6.096179399999999, + "mapping_matrix + pdip_solve": 5.558908999999998, + "mapped_reconstruction + pdip_solve": 5.5146478000000005, + "curvature_reg_reduce_gather + inversion_other + mapped_reconstruction + pdip_solve + reconstruction_scatter": 4.8581932, + "inversion_other + pdip_solve + regularization_H": 1.4732787999999994, + "inversion_other + pdip_solve": 0.5538119, + "inversion_other + regularization_H": 0.42992820000000026, + "inversion_other + mapping_matrix + mesh_construction + mesh_interpolation_weights + pdip_solve": 0.20382019999999998, + "mapping_matrix + mesh_interpolation_weights + pdip_solve": 0.160738, + "inversion_other + mesh_construction + mesh_dual_areas + mesh_interpolation_weights + pdip_solve + regularization_H": 0.0619368, + "inversion_other + mesh_construction + mesh_dual_areas + mesh_interpolation_weights": 0.0561927, + "inversion_other + mesh_construction + mesh_interpolation_weights": 0.0559208, + "mesh_dual_areas + mesh_interpolation_weights": 0.044435600000000006, + "grids_and_structures + mass_profile_deflections + ray_trace_data_grid": 0.037479, + "grids_and_structures + mass_profile_deflections + pdip_solve + ray_trace_data_grid": 0.032205, + "inversion_other + mapping_matrix + mesh_construction + mesh_interpolation_weights": 0.029033899999999994, + "mesh_construction + pdip_solve + regularization_H": 0.028672500000000004, + "border_relocator + pdip_solve": 0.0242499, + "mesh_construction + mesh_seed_argmin + pdip_solve + regularization_H": 0.0222919, + "mesh_locate_walk + mesh_seed_argmin": 0.0185601, + "chi_squared_evidence + pdip_solve": 0.016505699999999998, + "pdip_solve + ray_trace_data_grid": 0.013311999999999994, + "inversion_other + mesh_dual_areas + mesh_locate_walk": 0.012713900000000002, + "inversion_other + mapped_reconstruction + reconstruction_scatter + regularization_H": 0.0123141, + "mesh_construction + mesh_dual_areas + mesh_interpolation_weights + pdip_solve + regularization_H": 0.011542600000000002, + "inversion_other + mapped_reconstruction": 0.011494599999999999, + "inversion_other + mapped_reconstruction + reconstruction_scatter": 0.0095809, + "inversion_other + mesh_locate_walk + mesh_seed_argmin": 0.0065696, + "mapping_matrix + pdip_solve + regularization_H": 0.0053634, + "inversion_other + mesh_dual_areas + mesh_locate_walk + pdip_solve": 0.0053472, + "grids_and_structures + mass_profile_deflections + pdip_solve": 0.0051746, + "inversion_other + pdip_solve + ray_trace_data_grid": 0.0047008, + "inversion_other + mesh_construction + mesh_interpolation_weights + regularization_H": 0.0044449, + "inversion_other + mesh_interpolation_weights": 0.0044, + "inversion_other + mesh_construction + regularization_H": 0.0037665000000000008, + "inversion_other + mapping_matrix": 0.0029569, + "chi_squared_evidence + inversion_other": 0.0023264 + }, + "example_kernels": { + "curvature_matrix_F + psf_convolution_mapping_matrix": [ + "loop_divide_gather_fusion" + ], + "pdip_solve + psf_convolution_mapping_matrix": [ + "loop_broadcast_fusion.7" + ], + "data_vector_D + pdip_solve": [ + "input_reduce_fusion.21", + "input_reduce_fusion.47" + ], + "pdip_solve + regularization_H": [ + "loop_broadcast_fusion", + "input_add_transpose_fusion", + "input_transpose_fusion.6" + ], + "mapping_matrix + pdip_solve": [ + "loop_broadcast_fusion.8", + "loop_divide_fusion" + ], + "mapped_reconstruction + pdip_solve": [ + "input_reduce_fusion.25" + ], + "curvature_reg_reduce_gather + inversion_other + mapped_reconstruction + pdip_solve + reconstruction_scatter": [ + "input_multiply_transpose_fusion" + ], + "inversion_other + pdip_solve + regularization_H": [ + "input_reduce_fusion.45", + "input_transpose_fusion.7", + "loop_log_fusion" + ], + "inversion_other + pdip_solve": [ + "input_reduce_fusion.23", + "input_reduce_fusion.24", + "input_transpose_fusion.3", + "input_reduce_fusion.29" + ], + "inversion_other + regularization_H": [ + "input_reduce_fusion.44", + "input_reduce_fusion.37", + "input_reduce_fusion.38", + "input_reduce_fusion.39" + ] + }, + "prorated_estimate_ms": { + "psf_convolution_mapping_matrix": 32.3034472, + "curvature_matrix_F": 26.4284641, + "pdip_solve": 19.445367891666663, + "regularization_H": 3.789141578333332, + "mapped_reconstruction": 3.7409819983333334, + "data_vector_D": 3.08227255, + "mapping_matrix": 2.8843225983333323, + "inversion_other": 2.07419478, + "reconstruction_scatter": 0.9779107983333333, + "curvature_reg_reduce_gather": 0.9716386399999999, + "mesh_interpolation_weights": 0.172450635, + "mesh_construction": 0.11083947666666666, + "mesh_dual_areas": 0.05447206166666667, + "ray_trace_data_grid": 0.028767183333333328, + "grids_and_structures": 0.022269116666666665, + "mass_profile_deflections": 0.022269116666666665, + "mesh_locate_walk": 0.017044683333333335, + "mesh_seed_argmin": 0.017042891666666667, + "border_relocator": 0.01212495, + "chi_squared_evidence": 0.009416049999999999 + }, + "prorated_note": "ESTIMATE ONLY \u2014 a mixed fusion's time split equally across the stages its constituents span. Never summed into the measured table, never reconciled." + }, + "other_sources_ms": { + "copy.140": 0.10097709999999976, + "copy.141": 0.09987280000000025, + "copy.142": 0.09971910000000034, + "copy.139": 0.0980749000000009, + "copy.138": 0.05825360000000002, + "copy.122": 0.03668219999999998, + "copy.121": 0.03484850000000002, + "copy.123": 0.033696600000000104, + "loop_broadcast_fusion.2": 0.0036256000000000005, + "copy.97": 0.0023711999999999995, + "copy.137": 0.0022848, + "copy.58": 0.0021953, + "loop_broadcast_fusion.5": 0.001312 + }, + "device_span_ms": 2036.0046376999999, + "device_busy_ms": 1751.6206806999999, + "device_idle_ms": 284.383957, + "largest_idle_gaps": [ + { + "gap_ms": 5.482229, + "after": "pure_callback.0", + "before": "pure_callback.0" + }, + { + "gap_ms": 5.408276, + "after": "pure_callback.0", + "before": "pure_callback.0" + }, + { + "gap_ms": 5.199634, + "after": "pure_callback.0", + "before": "pure_callback.0" + }, + { + "gap_ms": 5.093712, + "after": "pure_callback.0", + "before": "pure_callback.0" + }, + { + "gap_ms": 5.085937, + "after": "pure_callback.0", + "before": "pure_callback.0" + }, + { + "gap_ms": 5.012752, + "after": "pure_callback.0", + "before": "pure_callback.0" + }, + { + "gap_ms": 5.00472, + "after": "pure_callback.0", + "before": "pure_callback.0" + }, + { + "gap_ms": 4.999184, + "after": "pure_callback.0", + "before": "pure_callback.0" + } + ], + "kernel_ms": 1752.3960540000082, + "sum_ms": 2036.7800110000082, + "wall_ms": 2036.1315101999935, + "host_outside_span_ms": 0.12687249999362393, + "reconciliation_pct": 0.031849651987903634, + "unjoined_ms": 0.0, + "unjoined_pct": 0.0, + "other_ms": 0.5738310000000006, + "other_pct": 0.028182413421009217, + "note": "Stage rows attribute the command-buffers-OFF program (see the module docstring): kernel times are the same, the launch overhead the CUDA graphs remove is not. sum_ms = kernel rows + device_idle_ms; the residual against wall_ms is host_outside_span_ms (dispatch before the first kernel, teardown after the last).", + "per_stage_ms_per_lane": { + "border_relocator": 0.0019529699999999996, + "curvature_matrix_F": 4.2559996899999994, + "inversion_other": 0.5901746199999997, + "mapping_matrix": 0.00280802, + "mesh_construction": 0.00044096, + "mesh_dual_areas": 0.00019392, + "mesh_locate_walk": 0.04065685000000002, + "mesh_qhull_callback": 0.012251299999999991, + "mesh_seed_argmin": 0.08027833000000005, + "mixed_fusion": 1.92012829, + "other": 0.011476620000000014, + "pdip_solve": 21.667891900000164, + "psf_convolution_mapping_matrix": 6.463498960000001, + "regularization_H": 0.00016864999999999998 + }, + "per_lane_divisor": 50, + "host_callback": { + "pure_callback_span_ms": 262.2716595000004, + "qhull_ms": 229.64584760000022, + "callback_body_ms_note": "the OUTERMOST matching body event, not a sum: under the probe the body appears twice (the wrapper and the timed re-implementation it calls) and summing them would count the same work twice", + "events_by_name": { + "pure_callback.0": { + "count": 500, + "ms": 262.2716595000004 + }, + "$callback.py:815 _wrapped_callback": { + "count": 500, + "ms": 241.43280190000016 + }, + "$callback.py:224 _callback": { + "count": 500, + "ms": 240.30708929999992 + }, + "$callback.py:74 pure_callback_impl": { + "count": 500, + "ms": 239.89366789999997 + }, + "$callback.py:69 __call__": { + "count": 500, + "ms": 230.3962935999999 + }, + "$delaunay.py:162 ": { + "count": 500, + "ms": 230.08558550000004 + }, + "$host_callback_probe.py:225 wrapped": { + "count": 500, + "ms": 229.64584760000022 + }, + "$host_callback_probe.py:160 _timed_tri_only": { + "count": 500, + "ms": 229.27627980000005 + }, + "$callback.py:822 ": { + "count": 2000, + "ms": 0.7027242000000008 + }, + "ThenExecuteCallback:GetEventForComputeStreamSyncPoint": { + "count": 10, + "ms": 0.020968700000000003 + }, + "$__init__.py:132 _xla_gc_callback": { + "count": 4, + "ms": 0.0012829999999999999 + } + }, + "note": "HOST milliseconds per traced BATCH (the whole invocation), aggregated by name because the events nest. Not a row of the device table: the device pays for them as the idle gaps largest_idle_gaps names." + }, + "host_callback_ms": 262.2716595000004 + }, + "hlo_census": { + "status": "excluded", + "reason": "The legacy census anchors PyAutoArray source line numbers that moved after the phase-1 run. No batched attribution is published from unsupported anchors; the device-event table and wall reconciliation remain valid." + }, + "trace_split": { + "expected_calls": 10, + "executions_per_invocation": 1, + "method": "per-call (first-instruction recurrence)", + "note": "DECIDED IN CODE: the scalar arm's trace is split by trace_calls * B, so every lane's execution is its own block and the per-stage median is taken over all of them. The vmap arm's is split by trace_calls, one block per batched execution, and per_stage_ms_per_lane divides those rows by B." + } + }, + "scalar": { + "arm": "scalar", + "program": "jax.jit(fn), called B times", + "stands_for": "Nautilus(use_jax_vmap=False, use_jax_jit=True). Plain use_jax_vmap=False is UNJITTED and is NOT this arm", + "hlo_source": "jax.jit(fn).lower(lane_trees[0]) \u2014 the same program phase 1 traced", + "batch_wall_ms": 2208.2350181997754, + "wall_production_nesting_ms": 2208.2350181997754, + "wall_aot_command_buffers_on_ms": 2211.692346900236, + "wall_aot_command_buffers_off_ms": 2227.529951899851, + "command_buffer_delta_ms": 15.837604999614996, + "production_nesting_vs_aot_on_delta_ms": -3.4573287004604936, + "production_nesting_vs_aot_on_delta_pct": -0.1563205074750139, + "wall_per_lane_ms": 44.16470036399551, + "wall_per_lane_command_buffers_off_ms": 44.55059903799702, + "traced_batch_wall_ms": 2294.178766099867, + "untraced_batch_wall_ms": 2227.462888700029, + "traced_wall_per_lane_ms": 45.88357532199734, + "callback_count_per_call": 50.0, + "callback_count_per_lane": 1.0, + "callback_expectation": "1 per likelihood evaluation, B per batch", + "host_qhull_ms": 229.20175139443018, + "host_tables_ms": 5.79619670570537, + "host_qhull_ms_per_lane": 4.5840350278886035, + "host_tables_ms_per_lane": 0.1159239341141074, + "host_callback_probe": { + "calls": 500, + "qhull_ms_total": 2292.0175139443018, + "tables_ms_total": 57.9619670570537, + "total_ms_total": 2349.9794810013555, + "qhull_ms_mean": 4.5840350278886035, + "tables_ms_mean": 0.1159239341141074, + "total_ms_mean": 4.699958962002711, + "non_finite_calls": 0, + "n_points": [ + 1500 + ] + }, + "host_callback_records_first": [ + { + "n_points": 1500, + "qhull_ms": 4.718362000858178, + "tables_ms": 0.19707700266735628, + "total_ms": 4.915439003525535, + "finite": true + }, + { + "n_points": 1500, + "qhull_ms": 4.6097329977783374, + "tables_ms": 0.12480800432967953, + "total_ms": 4.734541002108017, + "finite": true + }, + { + "n_points": 1500, + "qhull_ms": 4.561943998851348, + "tables_ms": 0.13317900084075518, + "total_ms": 4.695122999692103, + "finite": true + }, + { + "n_points": 1500, + "qhull_ms": 4.543704999377951, + "tables_ms": 0.12166799933766015, + "total_ms": 4.665372998715611, + "finite": true + } + ], + "device_idle_ms": 7.223946017999992, + "device_idle_ms_per_lane": 7.223946017999992, + "trace": { + "parser": "ProfileData.from_file(xplane) + as_text() + stack_frame_index(proto field 17)", + "stage_audit": { + "mixed_fusion": [ + { + "instruction": "loop_divide_gather_fusion", + "ms": 1.0147081019999997, + "opcode": "fusion", + "shape": "(f64[15361,1,1,1500]{3,2,1,0}, f64[15361,1,1,1500]{3,2,1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:133", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:133 (curvature_matrix_via_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:93 (InversionImagingMapping.curvature_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:389 (AbstractInversion.curvature_reg_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "loop_broadcast_fusion.4", + "ms": 0.2257948400000001, + "opcode": "fusion", + "shape": "f64[1500,180,180]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "input_reduce_fusion.13", + "ms": 0.1211949, + "opcode": "fusion", + "shape": "f64[92,1500]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/inversion_imaging_util.py:123", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/inversion_imaging_util.py:123 (data_vector_via_blurred_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:67 (InversionImagingMapping.data_vector)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:699 (AbstractInversion.reconstruction)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "input_reduce_fusion.17", + "ms": 0.114598196, + "opcode": "fusion", + "shape": "f64[15361]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:163", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:163 (mapped_reconstructed_data_via_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:120 (InversionImagingMapping._mapped_reconstructed_data_dict_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:196 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "loop_broadcast_fusion.2", + "ms": 0.11043403600000004, + "opcode": "fusion", + "shape": "f64[15361,1500]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:342", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:342 (mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/abstract.py:283 (Mapper.mapping_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:91 (AbstractInversionImaging._mapping_matrix_for_convolution_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:137 (AbstractInversionImaging.operated_mapping_matrix_list)" + ] + }, + { + "instruction": "input_multiply_transpose_fusion", + "ms": 0.10947590399999996, + "opcode": "fusion", + "shape": "(f64[1500,1500]{1,0}, f64[1500,1500]{1,0}, f64[1500,1500]{1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:237 (active_set_search)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:293 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:274 (_certified_positive_only_from)" + ] + } + ], + "border_relocator": [ + { + "instruction": "eigh.45", + "ms": 0.07467376400000175, + "opcode": "custom-call", + "shape": "(f64[2,2]{0,1}, f64[2]{0}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:245", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:245 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:454 (BorderRelocator.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:176 (AbstractMesh.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:214 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "custom-call.2", + "ms": 0.007956532000000032, + "opcode": "custom-call", + "shape": "(f64[2,2]{1,0}, s8[4194304]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:242", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:242 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:454 (BorderRelocator.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:176 (AbstractMesh.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:214 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "input_reduce_fusion.18", + "ms": 0.005939429999999981, + "opcode": "fusion", + "shape": "(f64[], f64[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:269", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:269 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:454 (BorderRelocator.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:176 (AbstractMesh.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:214 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "loop_add_fusion.7", + "ms": 0.0035494579999999915, + "opcode": "fusion", + "shape": "f64[15361]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:308", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:308 (relocated_grid_via_ellipse_border_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:423 (BorderRelocator.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:83 (AbstractMesh.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:208 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "loop_add_fusion.9", + "ms": 0.0034543699999999883, + "opcode": "fusion", + "shape": "f64[1500]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:308", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:308 (relocated_grid_via_ellipse_border_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:458 (BorderRelocator.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:176 (AbstractMesh.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:214 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "input_concatenate_fusion.12", + "ms": 0.002402639999999993, + "opcode": "fusion", + "shape": "f64[392,2]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:238", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:238 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:454 (BorderRelocator.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:176 (AbstractMesh.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:214 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + } + ], + "mesh_construction": [ + { + "instruction": "input_concatenate_fusion.7", + "ms": 0.0019305759999999996, + "opcode": "fusion", + "shape": "f64[1500,2]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:820", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:820 (InterpolatorDelaunay.mesh_grid_xy)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:847 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + } + ], + "mesh_qhull_callback": [ + { + "instruction": "pure_callback.4", + "ms": 0.010630603999999938, + "opcode": "custom-call", + "shape": "(s32[3000,3]{1,0}, s32[3000,3]{1,0}, s32[1500]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:161", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:161 (_jax_delaunay_tables)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:405 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + } + ], + "other": [ + { + "instruction": "copy.106", + "ms": 0.041848820000001674, + "opcode": "copy", + "shape": "f64[1,1024,2]{2,1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "copy.70", + "ms": 0.01687242399999937, + "opcode": "copy", + "shape": "s32[21361]{0}", + "source": "", + "stack": [] + }, + { + "instruction": "copy.75", + "ms": 0.0019623840000000084, + "opcode": "copy", + "shape": "s64[1500]{0}", + "source": "", + "stack": [] + }, + { + "instruction": "copy.61", + "ms": 0.001654087999999997, + "opcode": "copy", + "shape": "s32[]", + "source": "", + "stack": [] + }, + { + "instruction": "copy.104", + "ms": 0.001651657999999998, + "opcode": "copy", + "shape": "s64[]", + "source": "", + "stack": [] + }, + { + "instruction": "copy.105", + "ms": 0.001639433999999996, + "opcode": "copy", + "shape": "s32[]", + "source": "", + "stack": [] + } + ], + "mesh_seed_argmin": [ + { + "instruction": "input_reduce_fusion", + "ms": 0.148111531999993, + "opcode": "fusion", + "shape": "(f64[1024]{0}, s64[1024]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:191", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:191 (_nearest_vertex_seed_from..argmin_chunk)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204 (_nearest_vertex_seed_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:351 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)" + ] + }, + { + "instruction": "loop_dynamic_update_slice_fusion", + "ms": 0.04092318799999643, + "opcode": "fusion", + "shape": "s32[21,1024]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204 (_nearest_vertex_seed_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:351 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "loop_add_fusion", + "ms": 0.03184665599999613, + "opcode": "fusion", + "shape": "s64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204 (_nearest_vertex_seed_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:351 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "loop_broadcast_fusion", + "ms": 0.001947906000000019, + "opcode": "fusion", + "shape": "s32[21,1024]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204 (_nearest_vertex_seed_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:351 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "pdip_solve": [ + { + "instruction": "cholesky.60", + "ms": 7.3568516539998265, + "opcode": "custom-call", + "shape": "(f64[1500,1500]{0,1}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:252 (active_set_search..body_fun)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:262 (active_set_search)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:293 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)" + ] + }, + { + "instruction": "cholesky.80", + "ms": 5.495896969999859, + "opcode": "custom-call", + "shape": "(f64[1500,1500]{0,1}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:106", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:106 (factorize_kkt)", + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:212 (pdip_pc_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:83 (solve_nnls)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:129 (_solve_nnls_primal_with..primal)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:164 (solve_nnls_primal_with_status)" + ] + }, + { + "instruction": "triangular-solve.1", + "ms": 1.3107075099999719, + "opcode": "custom-call", + "shape": "(f64[1500,1]{0,1}, s8[0]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:154", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:154 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:252 (active_set_search..body_fun)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:262 (active_set_search)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:293 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)" + ] + }, + { + "instruction": "triangular-solve", + "ms": 1.135827262000028, + "opcode": "custom-call", + "shape": "(f64[1500,1]{0,1}, s8[0]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:154", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:154 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:252 (active_set_search..body_fun)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:262 (active_set_search)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:293 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)" + ] + }, + { + "instruction": "cholesky.110", + "ms": 0.8924842900000037, + "opcode": "custom-call", + "shape": "(f64[1500,1500]{0,1}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:297 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:274 (_certified_positive_only_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:496 (reconstruction_positive_only_from)" + ] + }, + { + "instruction": "triangular-solve.2", + "ms": 0.8715290660000179, + "opcode": "custom-call", + "shape": "(f64[1500,1]{0,1}, s8[0]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146 (solve_kkt_rhs)", + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:213 (pdip_pc_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:83 (solve_nnls)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:129 (_solve_nnls_primal_with..primal)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:164 (solve_nnls_primal_with_status)" + ] + } + ], + "regularization_H": [ + { + "instruction": "input_scatter_fusion.10", + "ms": 0.0020572860000000115, + "opcode": "fusion", + "shape": "f64[1500,1500]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:615", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:615 (pixel_splitted_regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt_split.py:137 (AdaptSplit.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:332 (AbstractInversion.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "input_concatenate_fusion.8", + "ms": 0.0018499239999999874, + "opcode": "fusion", + "shape": "pred[3]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:93", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:93 (split_points_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:410 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + }, + { + "instruction": "input_concatenate_fusion.10", + "ms": 0.0018477559999999864, + "opcode": "fusion", + "shape": "pred[3]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:90", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:90 (split_points_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:410 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + }, + { + "instruction": "input_concatenate_fusion.9", + "ms": 0.0018391719999999924, + "opcode": "fusion", + "shape": "pred[3]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:91", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:91 (split_points_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:410 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + }, + { + "instruction": "input_concatenate_fusion", + "ms": 0.0017546959999999875, + "opcode": "fusion", + "shape": "s32[1500,2]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:615", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:615 (pixel_splitted_regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt_split.py:137 (AdaptSplit.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:332 (AbstractInversion.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "input_concatenate_fusion.11", + "ms": 0.001504771999999999, + "opcode": "fusion", + "shape": "pred[3]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:88", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:88 (split_points_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:410 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + } + ], + "mesh_locate_walk": [ + { + "instruction": "input_reduce_fusion.1", + "ms": 0.025060842, + "opcode": "fusion", + "shape": "pred[196]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:288", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:288 (_walk_from_seed..cond)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:353 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)" + ] + }, + { + "instruction": "loop_reduce_fusion", + "ms": 0.02501252400000029, + "opcode": "fusion", + "shape": "(f64[21361]{0}, s64[21361]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:264", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:264 (_walk_from_seed..walk_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:292 (_walk_from_seed..body)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:264 (_walk_from_seed..walk_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:292 (_walk_from_seed..body)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)" + ] + }, + { + "instruction": "loop_or_select_fusion", + "ms": 0.02211751599999975, + "opcode": "fusion", + "shape": "(s32[21361]{0}, pred[21361]{0}, pred[21361]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:270", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:270 (_walk_from_seed..walk_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:292 (_walk_from_seed..body)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:353 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)" + ] + }, + { + "instruction": "loop_select_fusion", + "ms": 0.019843684000000437, + "opcode": "fusion", + "shape": "s32[21361]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:242", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:242 (_walk_from_seed..weights_of)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:262 (_walk_from_seed..walk_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:292 (_walk_from_seed..body)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:353 (pix_indexes_delaunay_walk_from)" + ] + }, + { + "instruction": "input_reduce_fusion.2", + "ms": 0.01620201999999949, + "opcode": "fusion", + "shape": "pred[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:288", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:288 (_walk_from_seed..cond)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:353 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)" + ] + }, + { + "instruction": "while.34", + "ms": 0.01440621800000083, + "opcode": "while", + "shape": "(s32[], s32[21361]{0}, pred[21361]{0}, pred[21361]{0}, s32[3000,3]{1,0}, /*index=5*/f64[1500,2]{1,0}, f64[21361,2]{1,0}, s32[3000,3]{1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:353 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "psf_convolution_mapping_matrix": [ + { + "instruction": "input_scatter_fusion", + "ms": 1.9798064759999974, + "opcode": "fusion", + "shape": "f64[1500,180,180]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "fft.19.0", + "ms": 1.7557597519999995, + "opcode": "fft", + "shape": "f64[1500,180,180]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "fft.15.0", + "ms": 1.3637167439999986, + "opcode": "fft", + "shape": "c128[1500,180,91]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "fft.17.0", + "ms": 0.9788367500000004, + "opcode": "fft", + "shape": "c128[1500,91,180]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "input_transpose_fusion.4", + "ms": 0.5138481179999995, + "opcode": "fusion", + "shape": "c128[1500,91,180]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "wrapped_transpose", + "ms": 0.498117416, + "opcode": "fusion", + "shape": "c128[1500,180,91]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + } + ], + "inversion_other": [ + { + "instruction": "cholesky.120", + "ms": 0.8961964400000054, + "opcode": "custom-call", + "shape": "(f64[1500,1500]{0,1}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986 (AbstractInversion._log_det_symmetric_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:1078 (AbstractInversion.log_det_curvature_reg_matrix_term)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:347 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/model/analysis.py:135 (AnalysisImaging.log_likelihood_function)" + ] + }, + { + "instruction": "cholesky.130", + "ms": 0.8916410960000056, + "opcode": "custom-call", + "shape": "(f64[1500,1500]{0,1}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986 (AbstractInversion._log_det_symmetric_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:1157 (AbstractInversion.log_det_regularization_matrix_term)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:348 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/model/analysis.py:135 (AnalysisImaging.log_likelihood_function)" + ] + }, + { + "instruction": "loop_reduce_window_fusion.1", + "ms": 0.0027720500000000033, + "opcode": "fusion", + "shape": "s64[94,16]{1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "loop_reduce_window_fusion", + "ms": 0.002687965999999994, + "opcode": "fusion", + "shape": "s64[6,16]{1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "loop_broadcast_convert_fusion", + "ms": 0.0021780000000000002, + "opcode": "fusion", + "shape": "(s32[1500]{0}, s64[1500]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:527", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:527 (AbstractInversion.zeroed_ids_to_keep)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:567 (AbstractInversion.solve_ids_to_keep)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:684 (AbstractInversion.reconstruction)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "input_scatter_fusion.5", + "ms": 0.0019317339999999998, + "opcode": "fusion", + "shape": "s64[1500]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:527", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:527 (AbstractInversion.zeroed_ids_to_keep)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:567 (AbstractInversion.solve_ids_to_keep)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:684 (AbstractInversion.reconstruction)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "mapping_matrix": [ + { + "instruction": "input_reduce_fusion.31", + "ms": 0.00288795000000002, + "opcode": "fusion", + "shape": "f64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:93", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:93 (adaptive_pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/abstract.py:507 (Mapper.pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt.py:339 (Adapt.regularization_weights_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt_split.py:120 (AdaptSplit.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)" + ] + } + ], + "curvature_matrix_F": [ + { + "instruction": "cublas-lt-matmul.2", + "ms": 4.212703104000002, + "opcode": "custom-call", + "shape": "(f64[1500,1500]{1,0}, s8[4194304]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:134", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:134 (curvature_matrix_via_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:93 (InversionImagingMapping.curvature_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:389 (AbstractInversion.curvature_reg_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "chi_squared_evidence": [ + { + "instruction": "loop_multiply_fusion.2", + "ms": 0.003015510000000009, + "opcode": "fusion", + "shape": "f64[15361]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/abstract_ndarray.py:300", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/abstract_ndarray.py:300 (AbstractNDArray.__pow__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/abstract_ndarray.py:60 (unwrap_array..wrapper)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/abstract_ndarray.py:35 (to_new_array..wrapper)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_util.py:78 (chi_squared_map_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:78 (AbstractFit.chi_squared_map)" + ] + } + ] + }, + "stage_audit_note": "The HLO instructions that contributed most of each stage's milliseconds, with their full source stack. A stage row is only as good as the rules that built it; this is how a reader checks a row against the HLO instead of trusting it.", + "untraced_wall_ms": 44.54925777400058, + "reconciliation_vs_untraced_pct": -28.63822629935343, + "wall_basis": "wall_ms is the TRACED run's wall, the run these kernel durations came from. untraced_wall_ms is the same executable without the profiler; the difference is the profiler's overhead and belongs in neither the stages nor the idle row.", + "calls": 500, + "call_split": "per-call (first-instruction recurrence)", + "call_blocks": 500, + "events": 361000, + "streams": [ + "Stream #14(Memset,MemcpyD2H,Compute,MemcpyH2D,MemcpyD2D)" + ], + "per_stage_ms": { + "border_relocator": { + "median_ms": 0.10147300000000001, + "min_ms": 0.10067400000000001, + "max_ms": 0.10230600000000001 + }, + "chi_squared_evidence": { + "median_ms": 0.003008, + "min_ms": 0.002816, + "max_ms": 0.003488 + }, + "curvature_matrix_F": { + "median_ms": 4.211076, + "min_ms": 4.192884, + "max_ms": 4.322485 + }, + "inversion_other": { + "median_ms": 1.7970625, + "min_ms": 1.777718, + "max_ms": 1.841813 + }, + "mapping_matrix": { + "median_ms": 0.00288, + "min_ms": 0.002848, + "max_ms": 0.002913 + }, + "memset": { + "median_ms": 0.023728, + "min_ms": 0.009888000000000001, + "max_ms": 0.09891300000000001 + }, + "mesh_construction": { + "median_ms": 0.00192, + "min_ms": 0.001888, + "max_ms": 0.001953 + }, + "mesh_locate_walk": { + "median_ms": 0.14797050000000006, + "min_ms": 0.13011300000000003, + "max_ms": 0.1837410000000001 + }, + "mesh_qhull_callback": { + "median_ms": 0.010561000000000001, + "min_ms": 0.010464000000000001, + "max_ms": 0.011168 + }, + "mesh_seed_argmin": { + "median_ms": 0.22282000000000007, + "min_ms": 0.2224350000000001, + "max_ms": 0.2232690000000001 + }, + "mixed_fusion": { + "median_ms": 1.9793454999999995, + "min_ms": 1.9718319999999994, + "max_ms": 1.9932419999999993 + }, + "other": { + "median_ms": 0.0658245, + "min_ms": 0.06326299999999999, + "max_ms": 0.073409 + }, + "pdip_solve": { + "median_ms": 8.8988135, + "min_ms": 2.420607, + "max_ms": 52.51687400000008 + }, + "psf_convolution_mapping_matrix": { + "median_ms": 7.089864, + "min_ms": 7.076376000000001, + "max_ms": 7.105529000000001 + }, + "regularization_H": { + "median_ms": 0.010848, + "min_ms": 0.010656, + "max_ms": 0.011297 + } + }, + "stage_order": [ + "border_relocator", + "mesh_qhull_callback", + "mesh_seed_argmin", + "mesh_locate_walk", + "mesh_construction", + "mapping_matrix", + "psf_convolution_mapping_matrix", + "curvature_matrix_F", + "regularization_H", + "pdip_solve", + "chi_squared_evidence", + "inversion_other", + "mixed_fusion", + "other", + "memset" + ], + "mixed_fusion": { + "ms": 1.9793454999999995, + "constituent_stage_sets": { + "curvature_matrix_F + psf_convolution_mapping_matrix": 1.0147081019999997, + "pdip_solve + psf_convolution_mapping_matrix": 0.2257948400000001, + "data_vector_D + pdip_solve": 0.12487178999999989, + "mapped_reconstruction + pdip_solve": 0.114598196, + "mapping_matrix + pdip_solve": 0.1127868219999995, + "curvature_reg_reduce_gather + inversion_other + mapped_reconstruction + pdip_solve + reconstruction_scatter": 0.10947590399999996, + "pdip_solve + regularization_H": 0.04510727800000014, + "inversion_other + pdip_solve + regularization_H": 0.024210517999999997, + "inversion_other + pdip_solve": 0.022894710000000252, + "inversion_other + mapping_matrix + mesh_construction + mesh_dual_areas + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin + pdip_solve": 0.021158711999999927, + "inversion_other + mesh_construction + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin + pdip_solve + regularization_H": 0.01877424599999999, + "inversion_other + mesh_construction + mesh_dual_areas + mesh_interpolation_weights + pdip_solve + regularization_H": 0.014763329999999995, + "pdip_solve + ray_trace_data_grid": 0.013689534000000097, + "border_relocator + pdip_solve": 0.013573581999999999, + "inversion_other + mapping_matrix + mesh_construction + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin": 0.011661483999999995, + "grids_and_structures + mass_profile_deflections + pdip_solve": 0.010123599999999995, + "grids_and_structures + mass_profile_deflections + pdip_solve + ray_trace_data_grid": 0.008998284, + "chi_squared_evidence + pdip_solve": 0.007715376000000024, + "inversion_other + mesh_construction + mesh_seed_argmin + pdip_solve + regularization_H": 0.007110957999999991, + "inversion_other + mesh_dual_areas + mesh_locate_walk": 0.006664112000000127, + "inversion_other + mesh_construction + pdip_solve + regularization_H": 0.006312925999999992, + "grids_and_structures + mass_profile_deflections + ray_trace_data_grid": 0.0054836200000000015, + "inversion_other + pdip_solve + ray_trace_data_grid": 0.005315085999999961, + "inversion_other + regularization_H": 0.004865931999999971, + "inversion_other + mapped_reconstruction + pdip_solve + reconstruction_scatter": 0.004811862000000001, + "inversion_other + mapped_reconstruction": 0.003720097999999992, + "mapping_matrix + pdip_solve + regularization_H": 0.003487187999999997, + "inversion_other + mesh_construction + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin": 0.0030994140000000087, + "inversion_other + mesh_construction + mesh_dual_areas + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin": 0.0029285260000000177, + "inversion_other + mesh_construction + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin + regularization_H": 0.0026811060000000086, + "inversion_other + mesh_dual_areas + mesh_locate_walk + pdip_solve": 0.002590290000000015, + "inversion_other + mesh_locate_walk + mesh_seed_argmin": 0.002479748000000007, + "inversion_other + mesh_interpolation_weights": 0.002154182000000006, + "chi_squared_evidence + inversion_other": 0.0018707900000000017 + }, + "example_kernels": { + "curvature_matrix_F + psf_convolution_mapping_matrix": [ + "loop_divide_gather_fusion" + ], + "pdip_solve + psf_convolution_mapping_matrix": [ + "loop_broadcast_fusion.4" + ], + "data_vector_D + pdip_solve": [ + "input_reduce_fusion.13", + "input_reduce_fusion.29" + ], + "mapped_reconstruction + pdip_solve": [ + "input_reduce_fusion.17" + ], + "mapping_matrix + pdip_solve": [ + "loop_broadcast_fusion.2", + "loop_divide_fusion" + ], + "curvature_reg_reduce_gather + inversion_other + mapped_reconstruction + pdip_solve + reconstruction_scatter": [ + "input_multiply_transpose_fusion" + ], + "pdip_solve + regularization_H": [ + "loop_select_fusion.5", + "input_transpose_fusion.5" + ], + "inversion_other + pdip_solve + regularization_H": [ + "input_transpose_fusion.6" + ], + "inversion_other + pdip_solve": [ + "input_reduce_fusion.15", + "loop_log_fusion", + "input_reduce_fusion.16", + "input_reduce_fusion.20" + ], + "inversion_other + mapping_matrix + mesh_construction + mesh_dual_areas + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin + pdip_solve": [ + "input_scatter_fusion.6", + "input_scatter_fusion.3" + ] + }, + "prorated_estimate_ms": { + "psf_convolution_mapping_matrix": 0.6202514709999999, + "curvature_matrix_F": 0.5073540509999999, + "pdip_solve": 0.39167800337619035, + "mapped_reconstruction": 0.08225729329999998, + "inversion_other": 0.06867465050952395, + "data_vector_D": 0.06243589499999994, + "mapping_matrix": 0.0621442266666664, + "regularization_H": 0.04280903790952385, + "reconstruction_scatter": 0.02309814629999999, + "curvature_reg_reduce_gather": 0.02189518079999999, + "mesh_construction": 0.014286254376190466, + "ray_trace_data_grid": 0.012693906666666704, + "mesh_locate_walk": 0.012520802109523853, + "mesh_interpolation_weights": 0.012362922276190475, + "mesh_seed_argmin": 0.01107405054285714, + "mesh_dual_areas": 0.008462424833333372, + "grids_and_structures": 0.007451977666666666, + "mass_profile_deflections": 0.007451977666666666, + "border_relocator": 0.0067867909999999995, + "chi_squared_evidence": 0.004793083000000013 + }, + "prorated_note": "ESTIMATE ONLY \u2014 a mixed fusion's time split equally across the stages its constituents span. Never summed into the measured table, never reconciled." + }, + "other_sources_ms": { + "copy.106": 0.041848820000001674, + "copy.70": 0.01687242399999937, + "copy.75": 0.0019623840000000084, + "copy.61": 0.001654087999999997, + "copy.104": 0.001651657999999998, + "copy.105": 0.001639433999999996, + "copy.103": 0.0006567739999999985, + "copy.40": 0.0005587200000000002 + }, + "device_span_ms": 45.881268817999995, + "device_busy_ms": 38.6573228, + "device_idle_ms": 7.223946017999992, + "largest_idle_gaps": [ + { + "gap_ms": 5.429953, + "after": "pure_callback.4", + "before": "pure_callback.4" + }, + { + "gap_ms": 0.041119, + "after": "input_concatenate_fusion.7", + "before": "pure_callback.4" + }, + { + "gap_ms": 0.032543, + "after": "pure_callback.4", + "before": "copy.105" + }, + { + "gap_ms": 0.028608, + "after": "copy.70", + "before": "input_reduce_fusion.1" + }, + { + "gap_ms": 0.023872, + "after": "copy.105", + "before": "copy.61" + }, + { + "gap_ms": 0.021055, + "after": "loop_or_select_fusion", + "before": "copy.70" + }, + { + "gap_ms": 0.02032, + "after": "while.40", + "before": "input_reduce_select_fusion" + }, + { + "gap_ms": 0.019423, + "after": "input_reduce_fusion.28", + "before": "loop_broadcast_fusion.4" + } + ], + "kernel_ms": 24.5671945, + "sum_ms": 31.79114051799999, + "wall_ms": 45.88357532199734, + "host_outside_span_ms": 0.002306503997345999, + "reconciliation_pct": -30.713462726260573, + "unjoined_ms": 0.0, + "unjoined_pct": 0.0, + "other_ms": 0.0658245, + "other_pct": 0.14345983184192415, + "note": "Stage rows attribute the command-buffers-OFF program (see the module docstring): kernel times are the same, the launch overhead the CUDA graphs remove is not. sum_ms = kernel rows + device_idle_ms; the residual against wall_ms is host_outside_span_ms (dispatch before the first kernel, teardown after the last).", + "per_stage_ms_per_lane": { + "border_relocator": 0.10147300000000001, + "chi_squared_evidence": 0.003008, + "curvature_matrix_F": 4.211076, + "inversion_other": 1.7970625, + "mapping_matrix": 0.00288, + "memset": 0.023728, + "mesh_construction": 0.00192, + "mesh_locate_walk": 0.14797050000000006, + "mesh_qhull_callback": 0.010561000000000001, + "mesh_seed_argmin": 0.22282000000000007, + "mixed_fusion": 1.9793454999999995, + "other": 0.0658245, + "pdip_solve": 8.8988135, + "psf_convolution_mapping_matrix": 7.089864, + "regularization_H": 0.010848 + }, + "per_lane_divisor": 1, + "host_callback": { + "pure_callback_span_ms": 252.1864798000001, + "qhull_ms": 235.4625997999999, + "callback_body_ms_note": "the OUTERMOST matching body event, not a sum: under the probe the body appears twice (the wrapper and the timed re-implementation it calls) and summing them would count the same work twice", + "events_by_name": { + "pure_callback.4": { + "count": 500, + "ms": 252.1864798000001 + }, + "$callback.py:815 _wrapped_callback": { + "count": 500, + "ms": 247.94798569999986 + }, + "$callback.py:224 _callback": { + "count": 500, + "ms": 246.77904789999994 + }, + "$callback.py:74 pure_callback_impl": { + "count": 500, + "ms": 246.33716370000008 + }, + "$callback.py:69 __call__": { + "count": 500, + "ms": 236.22453499999978 + }, + "$delaunay.py:162 ": { + "count": 500, + "ms": 235.90392849999995 + }, + "$host_callback_probe.py:225 wrapped": { + "count": 500, + "ms": 235.4625997999999 + }, + "$host_callback_probe.py:160 _timed_tri_only": { + "count": 500, + "ms": 235.06521530000015 + }, + "ThenExecuteCallback:GetEventForComputeStreamSyncPoint": { + "count": 500, + "ms": 0.8981313000000002 + }, + "$callback.py:822 ": { + "count": 2000, + "ms": 0.7075121000000016 + }, + "$__init__.py:132 _xla_gc_callback": { + "count": 8, + "ms": 0.0033020000000000002 + } + }, + "note": "HOST milliseconds per traced BATCH (the whole invocation), aggregated by name because the events nest. Not a row of the device table: the device pays for them as the idle gaps largest_idle_gaps names." + }, + "host_callback_ms": 252.1864798000001 + }, + "hlo_census": { + "status": "excluded", + "reason": "The legacy census anchors PyAutoArray source line numbers that moved after the phase-1 run. No batched attribution is published from unsupported anchors; the device-event table and wall reconciliation remain valid." + }, + "trace_split": { + "expected_calls": 500, + "executions_per_invocation": 50, + "method": "per-call (first-instruction recurrence)", + "note": "DECIDED IN CODE: the scalar arm's trace is split by trace_calls * B, so every lane's execution is its own block and the per-stage median is taken over all of them. The vmap arm's is split by trace_calls, one block per batched execution, and per_stage_ms_per_lane divides those rows by B." + } + } + }, + "certification_report": { + "source": "vmap arm, library solve observed through its stats= out-dict (PyAutoArray #566) and jax.debug.callback(..., ordered=True); ordered because the unordered batching rule returns the lanes permuted. Untimed, separately compiled; max rel diff of its log likelihoods vs the timed arm's: nan", + "rows": 50, + "pdip_iter": "NOT AVAILABLE per lane without changing library numerics. The fallback branch calls the library's own reconstruction_positive_only_from, which returns the solution alone \u2014 jax_nnls.solve_nnls' iteration count is discarded inside the library's custom_vjp primal. The PDIP while_loop's cost is in the pdip_solve stage row of each arm's device table instead, which is a max-over-lanes quantity under vmap because every lane runs the same fixed kernel sequence.", + "passes_semantics": "library `passes`: restricted active-set passes run (jax_active_set.solve_certified)" + }, + "lane_construction": { + "draws_sha256": "246b41aea1e860763cb7b206a7f43d5e3145e5c63c8c9df4985518ebf778c02e", + "lane_rows": [ + 300, + 301, + 302, + 303, + 304, + 305, + 306, + 307, + 308, + 309, + 310, + 311, + 312, + 313, + 314, + 315, + 316, + 317, + 318, + 319, + 320, + 321, + 322, + 323, + 324, + 325, + 326, + 327, + 328, + 329, + 330, + 331, + 332, + 333, + 334, + 335, + 336, + 337, + 338, + 339, + 340, + 341, + 342, + 343, + 344, + 345, + 346, + 347, + 348, + 349 + ], + "calls": [ + 15, + 16, + 17 + ], + "stage": "pix1", + "regularization_range": { + "galaxies.source.pixelization.regularization.inner_coefficient": { + "min": 2.1069031993440453e-06, + "max": 4381.27190482627 + }, + "galaxies.source.pixelization.regularization.outer_coefficient": { + "min": 2.002369440956339e-06, + "max": 350.8013530115919 + }, + "galaxies.source.pixelization.regularization.signal_scale": { + "min": 0.015870361716511128, + "max": 0.971901829834744 + } + }, + "phases": [ + "exploration" + ], + "window_rule": "nautilus_batches.timed_window: consecutive captured calls, in call order, from the FIRST call that is not a prior batch, concatenated and truncated to B; at B == n_batch exactly one real Nautilus batch. Falls back to the latest B lanes if the post-prior lanes run out; never repeats a lane.", + "note": "Lane k is captured lane lane_rows[k]: the mass AND shear of a real Nautilus proposal (nautilus_batch_capture.py), lens light fixed at S3, the S3 light-subtracted dataset shared by every lane. `offsets` in the lane table are the mass offsets from the fiducial; the shear is in the capture file." + }, + "captured": { + "batches_path": "/mnt/ral/jnightin/autolens_profiling_wt/certified-solver-phase-c1-lane-rate/results/breakdown/imaging/nautilus_batches_delaunay_pix1.npz", + "batches_sha256": "e71a5e23026b342d1ff4359b8fb914a87980d8aea0060659d2334dcfa3215c00", + "schema_version": 2, + "n_calls": 932, + "n_lanes": 18640, + "call_sizes_seen": [ + 20 + ], + "calls_by_phase": { + "prior": 15, + "exploration": 917 + }, + "parameter_paths": [ + "galaxies.source.pixelization.regularization.inner_coefficient", + "galaxies.source.pixelization.regularization.outer_coefficient", + "galaxies.source.pixelization.regularization.signal_scale", + "galaxies.lens.mass.centre.centre_0", + "galaxies.lens.mass.centre.centre_1", + "galaxies.lens.mass.einstein_radius", + "galaxies.lens.mass.ell_comps.ell_comps_0", + "galaxies.lens.mass.ell_comps.ell_comps_1", + "galaxies.lens.shear.gamma_1", + "galaxies.lens.shear.gamma_2" + ], + "stage": "pix1", + "regularization": { + "class": "AdaptSplit", + "free": true, + "priors": { + "inner_coefficient": [ + "LogUniform", + 1e-06, + 1000000.0 + ], + "outer_coefficient": [ + "LogUniform", + 1e-06, + 1000000.0 + ], + "signal_scale": [ + "Uniform", + 0.0, + 1.0 + ] + }, + "priors_source": "PyAutoGalaxy packaged config/priors/regularization (adapt_split.yaml / constant.yaml); adapt_split.yaml is identical to euclid_strong_lens_modeling_pipeline/config/priors/regularization/adapt_split.yaml" + }, + "nautilus": { + "departures_from_production": [ + "mass/shear priors are the phase-B cell's Gaussians, not chained from source_lp", + "no positions likelihood", + "the cell's mesh (Hilbert 1500, weight_power 1) in both stages; source_pix_2 redraws a 500-vertex Hilbert grid at weight_power 3.5", + "seeded (production passes no seed)", + "quick updates disabled (iterations_per_quick_update=1e12; render-only)", + "NullPaths: no output directory, so no checkpoint and one Sampler.run call", + "post-fit perform_update skipped (samples / latent variables never built)" + ], + "n_batch": 20, + "n_like_max": 40000, + "n_live": 150, + "number_of_cores": 1, + "production_reference": "euclid_strong_lens_modeling_pipeline/scripts/full_model.py source_pix_1 (n_live=150) / source_pix_2 (n_live=75): af.Nautilus(n_batch=20, **SettingsSearch.search_dict) with use_jax_vmap=True and number_of_cores=1 (SettingsSearch defaults)", + "production_stage": "source_pix_1", + "seed": 1, + "stage": "pix1", + "use_jax_vmap": true, + "version": "1.0.5" + }, + "capture_fit_status": "sampling complete (n_like_max or convergence); post-fit result skipped", + "capture_library_revisions": { + "PyAutoArray": { + "head": "7fa8d2714f7da43fec2b23c31bff580764831670", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoArray" + }, + "PyAutoFit": { + "head": "a736840127be7a3c21e15a5c945e94d8f1082983", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoFit" + }, + "PyAutoGalaxy": { + "head": "70a61e26cd715cefe7012a38285698091246a8a4", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy" + }, + "PyAutoLens": { + "head": "86054bbc19baa2f710a12e04a94fa27ab37cc354", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoLens" + }, + "PyAutoNerves": { + "head": "1fa613aa8d89a79613009fb66f5b4e2d21deb57a", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoNerves" + } + }, + "fingerprint_check": { + "fields": [ + "mesh", + "source_pixels", + "dataset_sha256", + "regularization_class", + "regularization_s0_fiducial", + "border_relocator", + "use_mixed_precision", + "log_evidence_s3_library" + ], + "not_identity": "the regularization coefficients: free per lane since the capture frees them", + "log_evidence_s3_library_rel_diff": 0.0, + "passed": true + }, + "timed_window_vs_capture_pdip": { + "reference": "the capture's own figure of merit (library PDIP, Fitness.call_wrap jax.jit(jax.vmap(call)) over parameter vectors) for the same lanes", + "compared_against": "this cell's jit(vmap) library-PDIP reference", + "n_compared": 50, + "max_rel_diff": NaN, + "max_abs_diff_nats": NaN, + "gated": false, + "note": "RECORDED, NOT GATED: proves the lane trees rebuilt here are the models the sampler evaluated (a wrong parameter mapping shows up as nats, not 1e-10)." + } + }, + "matched": { + "vmap_wall_per_lane_ms": 40.18500091399619, + "scalar_wall_per_lane_ms": 44.16470036399551, + "speedup_vmap_over_scalar": 1.0990344496573898, + "note": "Both walls are the PRODUCTION nesting of their arm, measured in one process on the same B lanes with the SAME library Settings (no injection). A speedup below 1 means the batch is slower per lane than B sequential jitted calls." + }, + "solver_source": "library", + "solver": "certified", + "certified_fallback": "pdip", + "certified_pass_budget": 16, + "certified_pass_budget_basis": "config default (Settings().certified_pass_budget)", + "certified_tau_rel": 1e-09, + "solver_used": "certified", + "solver_check": { + "solver_used": "certified", + "solver_used_source": "AbstractInversion.positive_only_solver_used on the fiducial S3 inversion, built eagerly on the JAX backend (AnalysisImaging(use_jax=True).fit_from) with the arms' Settings", + "reference_solver_used": "pdip", + "traced_solver_kwargs_jax": [ + "certified" + ], + "observed_calls_jax": 1, + "report_rows": 50, + "report_vs_timed_arm_max_rel_diff": NaN + }, + "lanes_certified": [ + false, + false, + true, + true, + false, + true, + true, + true, + true, + true, + true, + false, + false, + true, + true, + false, + false, + false, + false, + false, + true, + true, + false, + true, + true, + true, + true, + true, + true, + false, + true, + false, + false, + false, + true, + false, + false, + true, + false, + true, + false, + false, + true, + true, + true, + false, + false, + false, + false, + true + ], + "lanes_passes": [ + 16, + 16, + 1, + 3, + 16, + 10, + 3, + 9, + 10, + 2, + 5, + 16, + 16, + 9, + 15, + 16, + 16, + 16, + 16, + 16, + 13, + 6, + 16, + 13, + 13, + 0, + 1, + 11, + 3, + 16, + 11, + 16, + 16, + 16, + 2, + 16, + 16, + 15, + 16, + 4, + 16, + 16, + 6, + 2, + 8, + 16, + 16, + 16, + 16, + 2 + ], + "uncertified_lanes": 24, + "per_lane_certification_note": "certified / passes come from the library's own solve through its stats= out-dict (PyAutoArray #566): passes is the number of restricted active-set passes the library ran (0 when the unconstrained solve was already non-negative), certified is its KKT certificate. With certified_fallback=pdip a False lane returned the PDIP solution; with none it returned the last uncertified iterate. null for a library-PDIP row (no certificate).", + "gate": { + "pre_registered": true, + "gated": [ + "per lane: jit(vmap) arm vs jit(vmap) library PDIP <= lane_rtol relative", + "per lane: scalar jit arm vs scalar jit library PDIP <= lane_rtol relative" + ], + "recorded_not_gated": [ + "per lane: jit(vmap) arm vs scalar jit arm (rel_diff, abs_diff_nats)", + "per lane: jit(vmap) library PDIP vs scalar jit library PDIP", + "uncertified_lanes (certified_fallback=none rows)" + ], + "lanes_failed": 12, + "passed": false, + "policy_eligible": false, + "note": "Pre-registered before submission (module docstring; submit header). Phase 3 (results/notes/hst_gpu_residue_phase3_psf_2026_09.md) placed phase 2's ~2.5e-9 certified-vs-PDIP residual BETWEEN the jit(vmap) and scalar-jit compositions, not in the solver \u2014 so each arm is gated against the library-PDIP reference of its OWN composition, and the cross-composition difference is recorded with its nats. A certified_fallback=none row is policy-eligible only if every lane certifies AND passes the gate. Timing is never gated." + }, + "library_revisions": { + "PyAutoArray": { + "head": "3de624b5b91a4efa130dc3cb0a3a0f06f85025a3", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoArray", + "module_file": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/__init__.py" + }, + "PyAutoFit": { + "head": "dd9fbe0aab60c4a57702b1444ca031b317c91331", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoFit", + "module_file": "/mnt/ral/jnightin/PyAuto/PyAutoFit/autofit/__init__.py" + }, + "PyAutoGalaxy": { + "head": "70a61e26cd715cefe7012a38285698091246a8a4", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy", + "module_file": "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/__init__.py" + }, + "PyAutoLens": { + "head": "86054bbc19baa2f710a12e04a94fa27ab37cc354", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoLens", + "module_file": "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/__init__.py" + }, + "autoarray_file": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/__init__.py" + } + }, + "headline_arm_note": "`trace`, `hlo_census`, `command_buffers` and `trace_timing` above describe the scalar arm \u2014 the program phase 1 traced. Both arms' full blocks, the lane table and the matched comparison are under `vmap`." +} \ No newline at end of file diff --git a/results/breakdown/imaging/fixed_light_trace_delaunay_jitvmap50_captured_pix1_libcertified_fbon_b16_hpc_a100_fp64_fixed_light_trace.png b/results/breakdown/imaging/fixed_light_trace_delaunay_jitvmap50_captured_pix1_libcertified_fbon_b16_hpc_a100_fp64_fixed_light_trace.png new file mode 100644 index 0000000000000000000000000000000000000000..b57584df97ab4bb4f54cb4e0bf46aa3533149a89 GIT binary patch literal 150852 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�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 literal 0 HcmV?d00001 diff --git a/results/breakdown/imaging/fixed_light_trace_delaunay_jitvmap50_captured_pix1_libpdip_fbon_b16_hpc_a100_fp64_fixed_light_trace.json b/results/breakdown/imaging/fixed_light_trace_delaunay_jitvmap50_captured_pix1_libpdip_fbon_b16_hpc_a100_fp64_fixed_light_trace.json new file mode 100644 index 000000000..88342ff91 --- /dev/null +++ b/results/breakdown/imaging/fixed_light_trace_delaunay_jitvmap50_captured_pix1_libpdip_fbon_b16_hpc_a100_fp64_fixed_light_trace.json @@ -0,0 +1,9081 @@ +{ + "device": { + "backend": "gpu", + "device": "cuda:0", + "hostname": "euclid-ral-gpu-2", + "xla_flags": "--xla_disable_hlo_passes=constant_folding --xla_gpu_autotune_level=0 --xla_gpu_enable_triton_gemm=false", + "omp_num_threads": null, + "cpu_count": 124, + "jax_compilation_cache_dir": "/mnt/ral/jnightin/autolens_profiling_wt/certified-solver-phase-c1-lane-rate/output/jax_cache/fixed_light_lanerate_delaunay_pix1_time_50_pdip_on_350768_14", + "autotune_cache_entries_at_start": 0, + "cache_fresh": true, + "nvidia_smi": "NVIDIA A100 80GB PCIe, 61395 MiB, 81920 MiB" + }, + "machine": { + "cpu_model": "AMD EPYC 7702 64-Core Processor", + "cpu_count_os": 124, + "nproc": 4, + "nproc_all": 124, + "nproc_note": "GNU nproc honours OMP_NUM_THREADS, so `nproc` can print 1 on a multi-core host; `nproc_all` is the core count.", + "ram_total": "928298204 kB", + "kernel": "5.14.0-687.50.1.el9_8.x86_64", + "platform": "Linux-5.14.0-687.50.1.el9_8.x86_64-x86_64-with-glibc2.34", + "python": "3.12.4", + "jax_thread_env": { + "NPROC": null + }, + "blas_thread_env": { + "OMP_NUM_THREADS": null, + "OPENBLAS_NUM_THREADS": null, + "MKL_NUM_THREADS": null, + "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" + }, + "precision": "fp64", + "configuration": { + "pixel_scale_arcsec": 0.05, + "mask_radius_arcsec": 3.5, + "image_pixels_masked": 15361, + "over_sampled_pixels": 62752, + "mesh": "delaunay", + "mesh_shape": null, + "source_pixels": 1500, + "source_pixels_requested": null, + "dataset": "hst", + "dataset_sha256": { + "data.fits": "e4e833a28e9c6f6fb023cd85c0d3dde74068720256bc77a240633500e5b04fac", + "noise_map.fits": "315c6266a0acd3ac9c8da82fcd2b45a08697362481fd7a35072bab1658530ba3", + "psf.fits": "8389ba0e8bf4a09b4a561cfc246181a2fb944ed396754cd0ff76fdd22910d303" + }, + "cell_source_sha256": "06a162fcdae6b329384ec33322f443df07215d86e56f0505ac15b3d3473eb432", + "inversion_path": "dense", + "pass_budget": 7, + "pass_budget_basis": "phase 3 (autolens_profiling#255): the smallest ZERO-fallback budget per mesh, the budget a production run fixes. NOT phase 0's certifying budget (2 for Delaunay), which falls back on 67.5 % of a graded draw set and is not a production cost.", + "border_relocator_mode": "cell", + "border_relocator": true, + "border_relocator_note": "'cell' is use_border_relocator=True, which every profiling cell in this family forces; 'library' passes None and takes the shipped config default, which is what production runs. The resolved boolean is what this leg actually ran.", + "routes_selected": [ + "b", + "d" + ], + "trace_calls": 10, + "command_buffers_traced": "off", + "use_mixed_precision": false, + "tau_rel": 1e-09, + "regularization": { + "scheme": "adapt_split", + "inner_coefficient": 0.1, + "outer_coefficient": 10.0, + "signal_scale": 0.1 + }, + "thread_env": { + "n_threads": null, + "vars": [ + "OPENBLAS_NUM_THREADS", + "MKL_NUM_THREADS", + "OMP_NUM_THREADS", + "VECLIB_MAXIMUM_THREADS", + "NUMEXPR_NUM_THREADS" + ], + "set_to": null, + "preexisting": {}, + "overridden": {}, + "note": "Not pinned (legacy variant): recorded as found." + }, + "over_sample_size_lp_rule": { + "sub_size_list": [ + 4, + 2, + 2 + ], + "radial_list": [ + 0.3, + 0.6 + ], + "centre": [ + 0.0, + 0.0 + ] + }, + "vmap_batch": 50, + "lanes": "captured", + "arms": [ + "vmap", + "scalar" + ], + "fallback": "on", + "draw_seed": 0, + "vmap_composition": "jax.jit(jax.vmap(fn))", + "lane_rtol": 1e-09, + "vmap_flags_note": "Strict ProfileCLI.parse_cell_args rejects unknown flags. These keys record the exact batching program and prevent historical vmap(jit) artifacts from being mistaken for current jit(vmap) measurements.", + "solver_source": "library", + "solver": "pdip", + "certified_fallback": "pdip", + "certified_pass_budget": 16, + "captured_pass": "time", + "batches": "/mnt/ral/jnightin/autolens_profiling_wt/certified-solver-phase-c1-lane-rate/results/breakdown/imaging/nautilus_batches_delaunay_pix1.npz" + }, + "solver_injection": { + "patched": null, + "part_v": "none \u2014 library mode selects the solver through al.Settings", + "part_b_route_d": { + "patched": "autoarray.inversion.inversion.inversion_util.reconstruction_positive_only_from", + "pass_budget": 7, + "fallback": true + }, + "note": "Library mode (phase B, #300): PART V's arms and references run the library's own positive-only solve, selected by Settings(positive_only_solver, certified_fallback, certified_pass_budget); nothing is injected. PART B's single-call route d (the fiducial d == b pin) still uses the phase-1 harness injection at the phase-3 budget and is not a phase-B row. The untimed certification report observes the library solve (library_solver_observed) without changing it." + }, + "routes": { + "b_s3_pdip": { + "label": "S3 PDIP (source-only)", + "status": "ok", + "solver": "library", + "ms": 51.00313639995875, + "log_likelihood": 29155.000174201366 + }, + "d_s3_certified_fallback": { + "label": "S3 certified active set, budget 7, PDIP fallback", + "status": "ok", + "solver": "harness-injected certified active set", + "pass_budget": 7, + "fallback": true, + "injected_solver_calls_jax": 1, + "injected_solver_calls_numpy": 0, + "ms": 31.69604540016735, + "log_likelihood": 29155.000171217343 + } + }, + "equivalence_pins": [ + { + "pin": "route d (certified, fallback) == route b (library PDIP)", + "route": "d_s3_certified_fallback", + "reference": "b_s3_pdip", + "expectation": "the certified active set returns the library's own positive solution", + "rtol": 1e-09, + "got": 29155.000171217343, + "reference_value": 29155.000174201366, + "rel_diff": 1.0235029994364462e-10, + "status": "PASS" + } + ], + "equivalence_rtol": 1e-09, + "reference": { + "log_evidence_s0_library": 29155.00017433923, + "log_evidence_s3_library": 29155.000174339304, + "s3": { + "n_params": 1500, + "n_mapper": 1500, + "n_funcs": 0, + "edge_zeroed_pixels": 0, + "subtracted_light_flux": 5105.448603818575 + } + }, + "command_buffers": { + "wall_on_ms": 2511.1598409999715, + "wall_off_ms": 2534.2873237001186, + "command_buffer_delta_ms": 23.127482700147084, + "command_buffer_delta_pct": 0.9209880758103183, + "traced": "off", + "compiler_option": "xla_gpu_enable_command_buffer", + "probe": { + "note": "Not taken in --vmap-batch mode: the CUPTI-inside-a-CUDA-graph probe is a phase-1 diagnostic about the JOIN, and this mode already compiles and times both the command-buffers ON and OFF executable of every arm." + }, + "note": "ONE lowering, TWO compilations, one process. wall_on_ms is the PRODUCTION program (CUDA graphs as XLA ships them) and is the number comparable to phase 5's row; wall_off_ms is the graph-less program the stage rows attribute. The delta is the launch overhead the graphs remove \u2014 it lands in device_idle and host_outside_span, not in any stage. Reconciliation is computed against wall_off_ms." + }, + "trace": { + "parser": "ProfileData.from_file(xplane) + as_text() + stack_frame_index(proto field 17)", + "stage_audit": { + "chi_squared_evidence": [ + { + "instruction": "input_reduce_fusion.26", + "ms": 0.003919388, + "opcode": "fusion", + "shape": "f64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_util.py:104", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_util.py:104 (noise_normalization_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:98 (AbstractFit.noise_normalization)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:306 (FitDataset.noise_normalization)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:349 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)" + ] + }, + { + "instruction": "input_reduce_fusion.28", + "ms": 0.0037901040000000003, + "opcode": "fusion", + "shape": "f64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_util.py:90", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_util.py:90 (chi_squared_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:87 (AbstractFit.chi_squared)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:293 (FitDataset.chi_squared)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:345 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)" + ] + }, + { + "instruction": "loop_multiply_fusion.2", + "ms": 0.003026890000000005, + "opcode": "fusion", + "shape": "f64[15361]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/abstract_ndarray.py:300", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/abstract_ndarray.py:300 (AbstractNDArray.__pow__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/abstract_ndarray.py:60 (unwrap_array..wrapper)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/abstract_ndarray.py:35 (to_new_array..wrapper)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_util.py:78 (chi_squared_map_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:78 (AbstractFit.chi_squared_map)" + ] + } + ], + "psf_convolution_mapping_matrix": [ + { + "instruction": "input_scatter_fusion", + "ms": 1.990607756, + "opcode": "fusion", + "shape": "f64[1500,180,180]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "fft.19.0", + "ms": 1.76163641, + "opcode": "fft", + "shape": "f64[1500,180,180]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "fft.15.0", + "ms": 1.368750455999999, + "opcode": "fft", + "shape": "c128[1500,180,91]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "fft.17.0", + "ms": 0.9792810760000001, + "opcode": "fft", + "shape": "c128[1500,91,180]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "input_transpose_fusion.1", + "ms": 0.5133236019999997, + "opcode": "fusion", + "shape": "c128[1500,91,180]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "wrapped_transpose", + "ms": 0.4998654180000001, + "opcode": "fusion", + "shape": "c128[1500,180,91]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + } + ], + "mapping_matrix": [ + { + "instruction": "loop_broadcast_fusion.2", + "ms": 0.11105047399999984, + "opcode": "fusion", + "shape": "f64[15361,1500]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:342", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:342 (mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/abstract.py:283 (Mapper.mapping_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:91 (AbstractInversionImaging._mapping_matrix_for_convolution_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:137 (AbstractInversionImaging.operated_mapping_matrix_list)" + ] + }, + { + "instruction": "input_reduce_fusion.29", + "ms": 0.0029026840000000234, + "opcode": "fusion", + "shape": "f64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:93", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:93 (adaptive_pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/abstract.py:507 (Mapper.pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt.py:339 (Adapt.regularization_weights_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt_split.py:120 (AdaptSplit.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)" + ] + }, + { + "instruction": "loop_divide_fusion", + "ms": 0.002370827999999994, + "opcode": "fusion", + "shape": "f64[1500]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:92", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:92 (adaptive_pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/abstract.py:507 (Mapper.pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt.py:339 (Adapt.regularization_weights_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt_split.py:120 (AdaptSplit.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)" + ] + } + ], + "mixed_fusion": [ + { + "instruction": "loop_divide_gather_fusion", + "ms": 1.0215624380000001, + "opcode": "fusion", + "shape": "(f64[15361,1,1,1500]{3,2,1,0}, f64[15361,1,1,1500]{3,2,1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:133", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:133 (curvature_matrix_via_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:93 (InversionImagingMapping.curvature_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:389 (AbstractInversion.curvature_reg_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "input_add_multiply_transpose_fusion", + "ms": 0.06107873599999999, + "opcode": "fusion", + "shape": "(f64[1500,1500]{1,0}, f64[1500,1500]{1,0}, f64[1500,1500]{1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:61", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:61 (initialize)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:72 (solve_nnls)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:129 (_solve_nnls_primal_with..primal)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:164 (solve_nnls_primal_with_status)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:508 (reconstruction_positive_only_from)" + ] + }, + { + "instruction": "input_transpose_fusion.3", + "ms": 0.024260194000000013, + "opcode": "fusion", + "shape": "f64[1500,1500]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986 (AbstractInversion._log_det_symmetric_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:1157 (AbstractInversion.log_det_regularization_matrix_term)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:348 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/model/analysis.py:135 (AnalysisImaging.log_likelihood_function)" + ] + }, + { + "instruction": "input_scatter_fusion.2", + "ms": 0.016409972000000012, + "opcode": "fusion", + "shape": "f64[1500,1500]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:579", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:579 (pixel_splitted_regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt_split.py:137 (AdaptSplit.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:332 (AbstractInversion.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "input_scatter_fusion.3", + "ms": 0.014906570000000003, + "opcode": "fusion", + "shape": "f64[1500]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:70", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:70 (adaptive_pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/abstract.py:507 (Mapper.pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt.py:339 (Adapt.regularization_weights_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt_split.py:120 (AdaptSplit.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)" + ] + }, + { + "instruction": "loop_abs_fusion", + "ms": 0.014613888000000004, + "opcode": "fusion", + "shape": "(f64[6000,1]{1,0}, f64[6000,1]{1,0}, f64[6000,1]{1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:613", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:613 (triangle_area_xp)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:657 (pixel_weights_delaunay_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:982 (InterpolatorDelaunay._mappings_sizes_weights_split)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt_split.py:124 (AdaptSplit.regularization_matrix_from)" + ] + } + ], + "ray_trace_data_grid": [ + { + "instruction": "input_reduce_fusion.18", + "ms": 0.003239702000000011, + "opcode": "fusion", + "shape": "f64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:506", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:506 (FlatLambdaCDM._simpson_1d)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:644 (FlatLambdaCDM.angular_diameter_distance_kpc_z1z2)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:133 (LensingCosmology.angular_diameter_distance_to_earth_in_kpc_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:362 (LensingCosmology.scaling_factor_between_redshifts_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/lens/tracer_util.py:252 (traced_grid_2d_list_from)" + ] + }, + { + "instruction": "input_reduce_fusion.20", + "ms": 0.002753751999999984, + "opcode": "fusion", + "shape": "f64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:506", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:506 (FlatLambdaCDM._simpson_1d)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:644 (FlatLambdaCDM.angular_diameter_distance_kpc_z1z2)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:151 (LensingCosmology.angular_diameter_distance_between_redshifts_in_kpc_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:355 (LensingCosmology.scaling_factor_between_redshifts_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/lens/tracer_util.py:252 (traced_grid_2d_list_from)" + ] + }, + { + "instruction": "input_reduce_fusion.19", + "ms": 0.0026018700000000118, + "opcode": "fusion", + "shape": "f64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:503", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:503 (FlatLambdaCDM._simpson_1d)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:644 (FlatLambdaCDM.angular_diameter_distance_kpc_z1z2)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:133 (LensingCosmology.angular_diameter_distance_to_earth_in_kpc_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:362 (LensingCosmology.scaling_factor_between_redshifts_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/lens/tracer_util.py:252 (traced_grid_2d_list_from)" + ] + }, + { + "instruction": "input_reduce_fusion.21", + "ms": 0.0025937420000000195, + "opcode": "fusion", + "shape": "f64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:503", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:503 (FlatLambdaCDM._simpson_1d)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:644 (FlatLambdaCDM.angular_diameter_distance_kpc_z1z2)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:151 (LensingCosmology.angular_diameter_distance_between_redshifts_in_kpc_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:355 (LensingCosmology.scaling_factor_between_redshifts_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/lens/tracer_util.py:252 (traced_grid_2d_list_from)" + ] + }, + { + "instruction": "loop_divide_fusion.1", + "ms": 0.002407555999999992, + "opcode": "fusion", + "shape": "f64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:380", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:380 (LensingCosmology.scaling_factor_between_redshifts_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/lens/tracer_util.py:252 (traced_grid_2d_list_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/lens/tracer.py:632 (Tracer.traced_grid_2d_list_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/structures/decorators/abstract.py:93 (AbstractMaker.evaluate_func)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/structures/decorators/abstract.py:110 (AbstractMaker.result)" + ] + } + ], + "border_relocator": [ + { + "instruction": "eigh.45", + "ms": 0.07489312200000166, + "opcode": "custom-call", + "shape": "(f64[2,2]{0,1}, f64[2]{0}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:245", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:245 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:454 (BorderRelocator.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:176 (AbstractMesh.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:214 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "custom-call.2", + "ms": 0.007958090000000027, + "opcode": "custom-call", + "shape": "(f64[2,2]{1,0}, s8[4194304]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:242", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:242 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:454 (BorderRelocator.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:176 (AbstractMesh.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:214 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "input_reduce_fusion.15", + "ms": 0.005655388000000012, + "opcode": "fusion", + "shape": "(f64[], f64[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:269", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:269 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:454 (BorderRelocator.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:176 (AbstractMesh.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:214 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "input_concatenate_fusion.3", + "ms": 0.003701535999999994, + "opcode": "fusion", + "shape": "f64[15361,2]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:323", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:323 (relocated_grid_via_ellipse_border_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:423 (BorderRelocator.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:83 (AbstractMesh.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:208 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "loop_add_fusion.5", + "ms": 0.003518159999999994, + "opcode": "fusion", + "shape": "f64[15361]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:308", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:308 (relocated_grid_via_ellipse_border_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:423 (BorderRelocator.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:83 (AbstractMesh.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:208 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "loop_select_sine_fusion", + "ms": 0.003516563999999997, + "opcode": "fusion", + "shape": "(f64[], f64[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:301", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:301 (relocated_grid_via_ellipse_border_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:458 (BorderRelocator.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:176 (AbstractMesh.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:214 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + } + ], + "mesh_construction": [ + { + "instruction": "input_concatenate_fusion.7", + "ms": 0.0020564660000000124, + "opcode": "fusion", + "shape": "f64[1500,2]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:820", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:820 (InterpolatorDelaunay.mesh_grid_xy)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:847 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + } + ], + "mesh_qhull_callback": [ + { + "instruction": "pure_callback.4", + "ms": 0.01067238399999995, + "opcode": "custom-call", + "shape": "(s32[3000,3]{1,0}, s32[3000,3]{1,0}, s32[1500]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:161", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:161 (_jax_delaunay_tables)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:405 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + } + ], + "other": [ + { + "instruction": "copy.72", + "ms": 0.04207180200000365, + "opcode": "copy", + "shape": "f64[1,1024,2]{2,1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "copy.35", + "ms": 0.016947231999999895, + "opcode": "copy", + "shape": "s32[21361]{0}", + "source": "", + "stack": [] + }, + { + "instruction": "copy.40", + "ms": 0.001985231999999996, + "opcode": "copy", + "shape": "s64[1500]{0}", + "source": "", + "stack": [] + }, + { + "instruction": "loop_broadcast_fusion.1", + "ms": 0.0019820140000000115, + "opcode": "fusion", + "shape": "(pred[21361]{0}, pred[21361]{0})", + "source": "", + "stack": [] + }, + { + "instruction": "loop_broadcast_fusion.4", + "ms": 0.0017839420000000104, + "opcode": "fusion", + "shape": "(f64[1500]{0}, f64[1500]{0}, f64[1500]{0}, f64[1500]{0})", + "source": "", + "stack": [] + }, + { + "instruction": "copy.71", + "ms": 0.001688267999999995, + "opcode": "copy", + "shape": "s32[]", + "source": "", + "stack": [] + } + ], + "mesh_seed_argmin": [ + { + "instruction": "input_reduce_fusion", + "ms": 0.15274307000001294, + "opcode": "fusion", + "shape": "(f64[1024]{0}, s64[1024]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:191", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:191 (_nearest_vertex_seed_from..argmin_chunk)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204 (_nearest_vertex_seed_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:351 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)" + ] + }, + { + "instruction": "loop_dynamic_update_slice_fusion", + "ms": 0.041346231999997825, + "opcode": "fusion", + "shape": "s32[21,1024]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204 (_nearest_vertex_seed_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:351 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "loop_add_fusion", + "ms": 0.0318549099999961, + "opcode": "fusion", + "shape": "s64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204 (_nearest_vertex_seed_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:351 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "loop_broadcast_fusion", + "ms": 0.001965440000000018, + "opcode": "fusion", + "shape": "s32[21,1024]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204 (_nearest_vertex_seed_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:351 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "regularization_H": [ + { + "instruction": "loop_select_fusion.3", + "ms": 0.020039702, + "opcode": "fusion", + "shape": "f64[1500,1500]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:549", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:549 (pixel_splitted_regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt_split.py:137 (AdaptSplit.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:332 (AbstractInversion.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "input_scatter_fusion.10", + "ms": 0.0020833440000000048, + "opcode": "fusion", + "shape": "f64[1500,1500]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:615", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:615 (pixel_splitted_regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt_split.py:137 (AdaptSplit.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:332 (AbstractInversion.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "input_concatenate_fusion.9", + "ms": 0.0018603019999999843, + "opcode": "fusion", + "shape": "pred[3]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:91", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:91 (split_points_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:410 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + }, + { + "instruction": "input_concatenate_fusion.8", + "ms": 0.001853195999999986, + "opcode": "fusion", + "shape": "pred[3]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:93", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:93 (split_points_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:410 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + }, + { + "instruction": "input_concatenate_fusion", + "ms": 0.0017644219999999905, + "opcode": "fusion", + "shape": "s32[1500,2]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:615", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:615 (pixel_splitted_regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt_split.py:137 (AdaptSplit.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:332 (AbstractInversion.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "input_concatenate_fusion.10", + "ms": 0.0016968999999999964, + "opcode": "fusion", + "shape": "pred[3]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:90", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:90 (split_points_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:410 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + } + ], + "mesh_locate_walk": [ + { + "instruction": "loop_reduce_fusion", + "ms": 0.02578724399999979, + "opcode": "fusion", + "shape": "(f64[21361]{0}, s64[21361]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:264", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:264 (_walk_from_seed..walk_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:292 (_walk_from_seed..body)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:264 (_walk_from_seed..walk_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:292 (_walk_from_seed..body)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)" + ] + }, + { + "instruction": "input_reduce_fusion.1", + "ms": 0.025037913999999953, + "opcode": "fusion", + "shape": "pred[196]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:288", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:288 (_walk_from_seed..cond)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:353 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)" + ] + }, + { + "instruction": "loop_or_select_fusion", + "ms": 0.023437020000000287, + "opcode": "fusion", + "shape": "(s32[21361]{0}, pred[21361]{0}, pred[21361]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:270", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:270 (_walk_from_seed..walk_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:292 (_walk_from_seed..body)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:353 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)" + ] + }, + { + "instruction": "loop_select_fusion", + "ms": 0.02014813199999979, + "opcode": "fusion", + "shape": "s32[21361]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:242", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:242 (_walk_from_seed..weights_of)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:262 (_walk_from_seed..walk_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:292 (_walk_from_seed..body)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:353 (pix_indexes_delaunay_walk_from)" + ] + }, + { + "instruction": "input_reduce_fusion.2", + "ms": 0.01618750399999952, + "opcode": "fusion", + "shape": "pred[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:288", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:288 (_walk_from_seed..cond)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:353 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)" + ] + }, + { + "instruction": "while.22", + "ms": 0.014539700000000235, + "opcode": "while", + "shape": "(s32[], s32[21361]{0}, pred[21361]{0}, pred[21361]{0}, s32[3000,3]{1,0}, /*index=5*/f64[1500,2]{1,0}, f64[21361,2]{1,0}, s32[3000,3]{1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:353 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "data_vector_D": [ + { + "instruction": "input_reduce_fusion.10", + "ms": 0.121802552, + "opcode": "fusion", + "shape": "f64[92,1500]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/inversion_imaging_util.py:123", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/inversion_imaging_util.py:123 (data_vector_via_blurred_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:67 (InversionImagingMapping.data_vector)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:699 (AbstractInversion.reconstruction)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "input_reduce_fusion.27", + "ms": 0.0036935299999999965, + "opcode": "fusion", + "shape": "f64[1500]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/inversion_imaging_util.py:123", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/inversion_imaging_util.py:123 (data_vector_via_blurred_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:67 (InversionImagingMapping.data_vector)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:699 (AbstractInversion.reconstruction)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "inversion_other": [ + { + "instruction": "cholesky.60", + "ms": 0.8977823380000047, + "opcode": "custom-call", + "shape": "(f64[1500,1500]{0,1}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986 (AbstractInversion._log_det_symmetric_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:1078 (AbstractInversion.log_det_curvature_reg_matrix_term)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:347 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/model/analysis.py:135 (AnalysisImaging.log_likelihood_function)" + ] + }, + { + "instruction": "cholesky.70", + "ms": 0.8948461680000047, + "opcode": "custom-call", + "shape": "(f64[1500,1500]{0,1}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986 (AbstractInversion._log_det_symmetric_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:1157 (AbstractInversion.log_det_regularization_matrix_term)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:348 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/model/analysis.py:135 (AnalysisImaging.log_likelihood_function)" + ] + }, + { + "instruction": "input_reduce_fusion.17", + "ms": 0.013029934000000005, + "opcode": "fusion", + "shape": "f64[1500]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:946", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:946 (AbstractInversion.regularization_term)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:346 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/model/analysis.py:135 (AnalysisImaging.log_likelihood_function)", + "/mnt/ral/jnightin/autolens_profiling_wt/certified-solver-phase-c1-lane-rate/scripts/imaging/likelihood_breakdown/fixed_light_trace.py:1195 (_captured_likelihood_fn.._likelihood)" + ] + }, + { + "instruction": "loop_reduce_window_fusion", + "ms": 0.002877652000000008, + "opcode": "fusion", + "shape": "s64[6,16]{1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "loop_reduce_window_fusion.1", + "ms": 0.002789264000000019, + "opcode": "fusion", + "shape": "s64[94,16]{1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "input_reduce_fusion.25", + "ms": 0.0026711860000000003, + "opcode": "fusion", + "shape": "f64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:944", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:944 (AbstractInversion.regularization_term)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:346 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/model/analysis.py:135 (AnalysisImaging.log_likelihood_function)", + "/mnt/ral/jnightin/autolens_profiling_wt/certified-solver-phase-c1-lane-rate/scripts/imaging/likelihood_breakdown/fixed_light_trace.py:1195 (_captured_likelihood_fn.._likelihood)" + ] + } + ], + "curvature_matrix_F": [ + { + "instruction": "cublas-lt-matmul.2", + "ms": 4.267420474000002, + "opcode": "custom-call", + "shape": "(f64[1500,1500]{1,0}, s8[4194304]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:134", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:134 (curvature_matrix_via_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:93 (InversionImagingMapping.curvature_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:389 (AbstractInversion.curvature_reg_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "pdip_solve": [ + { + "instruction": "cholesky.20", + "ms": 15.98784528799969, + "opcode": "custom-call", + "shape": "(f64[1500,1500]{0,1}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:106", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:106 (factorize_kkt)", + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:212 (pdip_pc_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:83 (solve_nnls)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:129 (_solve_nnls_primal_with..primal)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:164 (solve_nnls_primal_with_status)" + ] + }, + { + "instruction": "triangular-solve", + "ms": 2.541939273999906, + "opcode": "custom-call", + "shape": "(f64[1500,1]{0,1}, s8[0]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146 (solve_kkt_rhs)", + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:213 (pdip_pc_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:83 (solve_nnls)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:129 (_solve_nnls_primal_with..primal)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:164 (solve_nnls_primal_with_status)" + ] + }, + { + "instruction": "triangular-solve.2", + "ms": 2.4886216699998616, + "opcode": "custom-call", + "shape": "(f64[1500,1]{0,1}, s8[0]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146 (solve_kkt_rhs)", + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:217 (pdip_pc_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:83 (solve_nnls)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:129 (_solve_nnls_primal_with..primal)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:164 (solve_nnls_primal_with_status)" + ] + }, + { + "instruction": "triangular-solve.3", + "ms": 2.41211809800021, + "opcode": "custom-call", + "shape": "(f64[1500,1]{0,1}, s8[0]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146 (solve_kkt_rhs)", + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:217 (pdip_pc_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:83 (solve_nnls)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:129 (_solve_nnls_primal_with..primal)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:164 (solve_nnls_primal_with_status)" + ] + }, + { + "instruction": "triangular-solve.1", + "ms": 2.309823310000291, + "opcode": "custom-call", + "shape": "(f64[1500,1]{0,1}, s8[0]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146 (solve_kkt_rhs)", + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:213 (pdip_pc_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:83 (solve_nnls)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:129 (_solve_nnls_primal_with..primal)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:164 (solve_nnls_primal_with_status)" + ] + }, + { + "instruction": "cholesky.40", + "ms": 0.8675693959999949, + "opcode": "custom-call", + "shape": "(f64[1500,1500]{0,1}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:62", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:62 (initialize)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:72 (solve_nnls)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:129 (_solve_nnls_primal_with..primal)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:164 (solve_nnls_primal_with_status)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:508 (reconstruction_positive_only_from)" + ] + } + ], + "mapped_reconstruction": [ + { + "instruction": "input_reduce_fusion.14", + "ms": 0.11525491200000006, + "opcode": "fusion", + "shape": "f64[15361]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:163", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:163 (mapped_reconstructed_data_via_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:120 (InversionImagingMapping._mapped_reconstructed_data_dict_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:196 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + } + ] + }, + "stage_audit_note": "The HLO instructions that contributed most of each stage's milliseconds, with their full source stack. A stage row is only as good as the rules that built it; this is how a reader checks a row against the HLO instead of trusting it.", + "untraced_wall_ms": 50.70896519199596, + "reconciliation_vs_untraced_pct": -0.1284397852516002, + "wall_basis": "wall_ms is the TRACED run's wall, the run these kernel durations came from. untraced_wall_ms is the same executable without the profiler; the difference is the profiler's overhead and belongs in neither the stages nor the idle row.", + "calls": 500, + "call_split": "per-call (first-instruction recurrence)", + "call_blocks": 500, + "events": 476880, + "streams": [ + "Stream #14(MemcpyD2D,MemcpyD2H,Compute,MemcpyH2D,Memset)" + ], + "per_stage_ms": { + "border_relocator": { + "median_ms": 0.11462149999999999, + "min_ms": 0.113826, + "max_ms": 0.11581 + }, + "chi_squared_evidence": { + "median_ms": 0.01072, + "min_ms": 0.010304, + "max_ms": 0.011647999999999999 + }, + "curvature_matrix_F": { + "median_ms": 4.265858, + "min_ms": 4.248178, + "max_ms": 4.355059 + }, + "data_vector_D": { + "median_ms": 0.125474, + "min_ms": 0.124545, + "max_ms": 0.126818 + }, + "inversion_other": { + "median_ms": 1.8217969999999999, + "min_ms": 1.801407, + "max_ms": 1.866463 + }, + "mapped_reconstruction": { + "median_ms": 0.1152615, + "min_ms": 0.114305, + "max_ms": 0.116254 + }, + "mapping_matrix": { + "median_ms": 0.116321, + "min_ms": 0.11533, + "max_ms": 0.11778999999999999 + }, + "memset": { + "median_ms": 0.05048000000000001, + "min_ms": 0.041152000000000015, + "max_ms": 0.08899300000000002 + }, + "mesh_construction": { + "median_ms": 0.002048, + "min_ms": 0.002016, + "max_ms": 0.002081 + }, + "mesh_locate_walk": { + "median_ms": 0.15046500000000004, + "min_ms": 0.13212900000000002, + "max_ms": 0.18681700000000007 + }, + "mesh_qhull_callback": { + "median_ms": 0.010624, + "min_ms": 0.010464000000000001, + "max_ms": 0.011201000000000001 + }, + "mesh_seed_argmin": { + "median_ms": 0.2279080000000001, + "min_ms": 0.22745900000000008, + "max_ms": 0.2283550000000002 + }, + "mixed_fusion": { + "median_ms": 1.2617045, + "min_ms": 1.2538059999999995, + "max_ms": 1.2667919999999997 + }, + "other": { + "median_ms": 0.07129699999999999, + "min_ms": 0.06880099999999999, + "max_ms": 0.07574499999999999 + }, + "pdip_solve": { + "median_ms": 27.35843900000004, + "min_ms": 22.74273600000003, + "max_ms": 50.527277000000055 + }, + "psf_convolution_mapping_matrix": { + "median_ms": 7.3407265, + "min_ms": 7.324859, + "max_ms": 7.425078999999999 + }, + "ray_trace_data_grid": { + "median_ms": 0.013568, + "min_ms": 0.01344, + "max_ms": 0.014177 + }, + "regularization_H": { + "median_ms": 0.0308, + "min_ms": 0.030209, + "max_ms": 0.031648 + } + }, + "stage_order": [ + "ray_trace_data_grid", + "border_relocator", + "mesh_qhull_callback", + "mesh_seed_argmin", + "mesh_locate_walk", + "mesh_construction", + "mapping_matrix", + "psf_convolution_mapping_matrix", + "data_vector_D", + "curvature_matrix_F", + "regularization_H", + "pdip_solve", + "mapped_reconstruction", + "chi_squared_evidence", + "inversion_other", + "mixed_fusion", + "other", + "memset" + ], + "mixed_fusion": { + "ms": 1.2617045, + "constituent_stage_sets": { + "curvature_matrix_F + psf_convolution_mapping_matrix": 1.0215624380000001, + "curvature_reg_reduce_gather + inversion_other + mapped_reconstruction + pdip_solve + reconstruction_scatter + regularization_H": 0.06107873599999999, + "inversion_other + regularization_H": 0.029146561999999838, + "inversion_other + mesh_construction + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin + regularization_H": 0.021710695999999963, + "inversion_other + mapping_matrix + mesh_construction + mesh_dual_areas + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin": 0.02130523799999998, + "inversion_other + mesh_construction + mesh_dual_areas + mesh_interpolation_weights + regularization_H": 0.014613888000000004, + "grids_and_structures + mass_profile_deflections + ray_trace_data_grid": 0.01433572599999999, + "inversion_other + mapping_matrix + mesh_construction + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin": 0.011650641999999996, + "grids_and_structures + mass_profile_deflections": 0.00993355599999997, + "inversion_other + mesh_dual_areas + mesh_locate_walk": 0.00935706200000015, + "inversion_other + mesh_construction + mesh_seed_argmin + regularization_H": 0.007277492000000014, + "inversion_other + mesh_construction + regularization_H": 0.006316485999999993, + "inversion_other + ray_trace_data_grid": 0.005466850000000005, + "inversion_other + mapped_reconstruction + pdip_solve + reconstruction_scatter": 0.004779474000000001, + "inversion_other + mapped_reconstruction": 0.003808087999999994, + "mapping_matrix + regularization_H": 0.003491351999999997, + "inversion_other + mesh_construction + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin": 0.0031836320000000044, + "inversion_other + mesh_construction + mesh_dual_areas + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin": 0.003010507999999999, + "inversion_other + pdip_solve": 0.0028958200000000107, + "inversion_other + mesh_locate_walk + mesh_seed_argmin": 0.002525893999999991, + "inversion_other + mesh_interpolation_weights": 0.0021667300000000034, + "chi_squared_evidence + inversion_other": 0.0018687580000000033 + }, + "example_kernels": { + "curvature_matrix_F + psf_convolution_mapping_matrix": [ + "loop_divide_gather_fusion" + ], + "curvature_reg_reduce_gather + inversion_other + mapped_reconstruction + pdip_solve + reconstruction_scatter + regularization_H": [ + "input_add_multiply_transpose_fusion" + ], + "inversion_other + regularization_H": [ + "loop_reduce_slice_fusion", + "loop_reduce_fusion.1", + "loop_reduce_fusion.2", + "input_transpose_fusion.3" + ], + "inversion_other + mesh_construction + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin + regularization_H": [ + "input_reduce_fusion.24", + "loop_select_fusion.4", + "input_scatter_fusion.2" + ], + "inversion_other + mapping_matrix + mesh_construction + mesh_dual_areas + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin": [ + "input_scatter_fusion.6", + "input_scatter_fusion.3" + ], + "inversion_other + mesh_construction + mesh_dual_areas + mesh_interpolation_weights + regularization_H": [ + "loop_abs_fusion" + ], + "grids_and_structures + mass_profile_deflections + ray_trace_data_grid": [ + "loop_subtract_fusion.2", + "loop_subtract_fusion.1" + ], + "inversion_other + mapping_matrix + mesh_construction + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin": [ + "input_scatter_fusion.4" + ], + "grids_and_structures + mass_profile_deflections": [ + "loop_divide_minimum_multiply_sine_sqrt_fusion", + "loop_slice_fusion" + ], + "inversion_other + mesh_dual_areas + mesh_locate_walk": [ + "loop_select_fusion.6", + "input_scatter_fusion.9", + "input_scatter_fusion.8", + "input_scatter_fusion.7" + ] + }, + "prorated_estimate_ms": { + "curvature_matrix_F": 0.5107812190000001, + "psf_convolution_mapping_matrix": 0.5107812190000001, + "inversion_other": 0.05460199926190473, + "regularization_H": 0.036964841599999916, + "mesh_construction": 0.01658995209523809, + "mesh_interpolation_weights": 0.013748448761904754, + "mesh_locate_walk": 0.013703291495238133, + "mapped_reconstruction": 0.013278701833333328, + "pdip_solve": 0.012822567833333336, + "mesh_seed_argmin": 0.01240364382857142, + "reconstruction_scatter": 0.011374657833333331, + "curvature_reg_reduce_gather": 0.010179789333333331, + "grids_and_structures": 0.009745353333333314, + "mass_profile_deflections": 0.009745353333333314, + "mesh_dual_areas": 0.009587155028571477, + "ray_trace_data_grid": 0.007512000333333333, + "mapping_matrix": 0.00673105509523809, + "chi_squared_evidence": 0.0009343790000000017 + }, + "prorated_note": "ESTIMATE ONLY \u2014 a mixed fusion's time split equally across the stages its constituents span. Never summed into the measured table, never reconciled." + }, + "other_sources_ms": { + "copy.72": 0.04207180200000365, + "copy.35": 0.016947231999999895, + "copy.40": 0.001985231999999996, + "loop_broadcast_fusion.1": 0.0019820140000000115, + "loop_broadcast_fusion.4": 0.0017839420000000104, + "copy.71": 0.001688267999999995, + "copy.20": 0.0016628559999999942, + "copy.52": 0.001660284000000003, + "copy.70": 0.0016019320000000008 + }, + "device_span_ms": 52.07552502, + "device_busy_ms": 44.519803313999994, + "device_idle_ms": 7.555721706000007, + "largest_idle_gaps": [ + { + "gap_ms": 5.55734, + "after": "pure_callback.4", + "before": "pure_callback.4" + }, + { + "gap_ms": 0.037248, + "after": "pure_callback.4", + "before": "copy.71" + }, + { + "gap_ms": 0.036543, + "after": "copy.35", + "before": "input_reduce_fusion.1" + }, + { + "gap_ms": 0.030688, + "after": "input_reduce_fusion.3", + "before": "input_divide_reduce_subtract_fusion" + }, + { + "gap_ms": 0.029792, + "after": "input_concatenate_fusion.7", + "before": "pure_callback.4" + }, + { + "gap_ms": 0.022719, + "after": "loop_dynamic_update_slice_fusion", + "before": "loop_add_fusion" + }, + { + "gap_ms": 0.020511, + "after": "eigh.45", + "before": "eigh.45" + }, + { + "gap_ms": 0.019007, + "after": "while.28", + "before": "input_reduce_fusion.3" + } + ], + "kernel_ms": 43.08811300000004, + "sum_ms": 50.64383470600005, + "wall_ms": 52.07778352799505, + "host_outside_span_ms": 0.002258507995051673, + "reconciliation_pct": -2.75347513825001, + "unjoined_ms": 0.0, + "unjoined_pct": 0.0, + "other_ms": 0.07129699999999999, + "other_pct": 0.1369048280667963, + "note": "Stage rows attribute the command-buffers-OFF program (see the module docstring): kernel times are the same, the launch overhead the CUDA graphs remove is not. sum_ms = kernel rows + device_idle_ms; the residual against wall_ms is host_outside_span_ms (dispatch before the first kernel, teardown after the last).", + "per_stage_ms_per_lane": { + "border_relocator": 0.11462149999999999, + "chi_squared_evidence": 0.01072, + "curvature_matrix_F": 4.265858, + "data_vector_D": 0.125474, + "inversion_other": 1.8217969999999999, + "mapped_reconstruction": 0.1152615, + "mapping_matrix": 0.116321, + "memset": 0.05048000000000001, + "mesh_construction": 0.002048, + "mesh_locate_walk": 0.15046500000000004, + "mesh_qhull_callback": 0.010624, + "mesh_seed_argmin": 0.2279080000000001, + "mixed_fusion": 1.2617045, + "other": 0.07129699999999999, + "pdip_solve": 27.35843900000004, + "psf_convolution_mapping_matrix": 7.3407265, + "ray_trace_data_grid": 0.013568, + "regularization_H": 0.0308 + }, + "per_lane_divisor": 1, + "host_callback": { + "pure_callback_span_ms": 253.44177359999998, + "qhull_ms": 236.43602019999994, + "callback_body_ms_note": "the OUTERMOST matching body event, not a sum: under the probe the body appears twice (the wrapper and the timed re-implementation it calls) and summing them would count the same work twice", + "events_by_name": { + "pure_callback.4": { + "count": 500, + "ms": 253.44177359999998 + }, + "$callback.py:815 _wrapped_callback": { + "count": 500, + "ms": 249.06968640000014 + }, + "$callback.py:224 _callback": { + "count": 500, + "ms": 247.85900320000007 + }, + "$callback.py:74 pure_callback_impl": { + "count": 500, + "ms": 247.4164497000002 + }, + "$callback.py:69 __call__": { + "count": 500, + "ms": 237.21032869999976 + }, + "$delaunay.py:162 ": { + "count": 500, + "ms": 236.87959399999988 + }, + "$host_callback_probe.py:225 wrapped": { + "count": 500, + "ms": 236.43602019999994 + }, + "$host_callback_probe.py:160 _timed_tri_only": { + "count": 500, + "ms": 236.01510070000003 + }, + "ThenExecuteCallback:GetEventForComputeStreamSyncPoint": { + "count": 500, + "ms": 0.9465159999999991 + }, + "$callback.py:822 ": { + "count": 2000, + "ms": 0.7363693000000004 + }, + "$__init__.py:132 _xla_gc_callback": { + "count": 8, + "ms": 0.0014190000000000001 + } + }, + "note": "HOST milliseconds per traced BATCH (the whole invocation), aggregated by name because the events nest. Not a row of the device table: the device pays for them as the idle gaps largest_idle_gaps names." + }, + "host_callback_ms": 253.44177359999998 + }, + "hlo_census": { + "status": "excluded", + "reason": "The legacy census anchors PyAutoArray source line numbers that moved after the phase-1 run. No batched attribution is published from unsupported anchors; the device-event table and wall reconciliation remain valid." + }, + "stage_map_provenance": [ + { + "label": "log_det_curvature_reg", + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 850, + 882 + ], + "requires": { + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 884, + 896 + ] + }, + "function": null + }, + { + "label": "log_det_regularization", + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 850, + 882 + ], + "requires": { + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 897, + 943 + ] + }, + "function": null + }, + { + "label": "curvature_reg_add", + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 359, + 372 + ], + "requires": null, + "function": null + }, + { + "label": "curvature_reg_reduce_gather", + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 374, + 398 + ], + "requires": null, + "function": null + }, + { + "label": "edge_subset_gather", + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 606, + 614 + ], + "requires": null, + "function": null + }, + { + "label": "regularization_term", + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 786, + 849 + ], + "requires": null, + "function": null + }, + { + "label": "mapped_reconstruction", + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 722, + 785 + ], + "requires": null, + "function": null + }, + { + "label": "reconstruction_scatter", + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 583, + 605 + ], + "requires": null, + "function": null + }, + { + "label": "reconstruction_scatter", + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 615, + 721 + ], + "requires": null, + "function": null + }, + { + "label": "certified_active_set_solve", + "path": "likelihood_breakdown/active_set_steps.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "certified_active_set_solve", + "path": "likelihood_breakdown/library_solver_injection.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "pdip_solve", + "path": "PyAutoArray/autoarray/util/jax_nnls.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "pdip_solve", + "path": "PyAutoArray/autoarray/inversion/inversion/inversion_util.py", + "lines": [ + 256, + 488 + ], + "requires": null, + "function": null + }, + { + "label": "mapped_reconstruction", + "path": "PyAutoArray/autoarray/inversion/inversion/inversion_util.py", + "lines": [ + 156, + 200 + ], + "requires": null, + "function": null + }, + { + "label": "curvature_matrix_F", + "path": "PyAutoArray/autoarray/inversion/inversion/inversion_util.py", + "lines": [ + 12, + 155 + ], + "requires": null, + "function": null + }, + { + "label": "reconstruction_scatter", + "path": "PyAutoArray/autoarray/inversion/inversion/inversion_util.py", + "lines": [ + 201, + 255 + ], + "requires": null, + "function": null + }, + { + "label": "data_vector_D", + "path": "PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py", + "lines": [ + 54, + 73 + ], + "requires": null, + "function": null + }, + { + "label": "curvature_matrix_F", + "path": "PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py", + "lines": [ + 74, + 110 + ], + "requires": null, + "function": null + }, + { + "label": "data_vector_D", + "path": "PyAutoArray/autoarray/inversion/inversion/imaging/inversion_imaging_util.py", + "lines": null, + "requires": null, + "function": "data_vector_via_blurred_mapping_matrix_from" + }, + { + "label": "curvature_matrix_F", + "path": "PyAutoArray/autoarray/inversion/inversion/imaging/inversion_imaging_util.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "psf_convolution_mapping_matrix", + "path": "likelihood_breakdown/psf_cube_injection.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "psf_convolution_mapping_matrix", + "path": "PyAutoArray/autoarray/operators/convolver.py", + "lines": [ + 1086, + 1300 + ], + "requires": null, + "function": null + }, + { + "label": "psf_convolution_mapping_matrix", + "path": "PyAutoArray/autoarray/operators/convolver.py", + "lines": [ + 632, + 642 + ], + "requires": null, + "function": null + }, + { + "label": "psf_convolution_mapping_matrix", + "path": "PyAutoArray/autoarray/operators/convolver.py", + "lines": [ + 670, + 691 + ], + "requires": null, + "function": null + }, + { + "label": "psf_convolution_mapping_matrix", + "path": "PyAutoArray/autoarray/operators/convolver.py", + "lines": null, + "requires": { + "path": "PyAutoArray/autoarray/operators/convolver.py", + "lines": [ + 1086, + 1300 + ] + }, + "function": null + }, + { + "label": "psf_convolution_mapping_matrix", + "path": "PyAutoArray/autoarray/operators/convolver.py", + "lines": null, + "requires": { + "path": "PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py", + "lines": [ + 119, + 150 + ] + }, + "function": null + }, + { + "label": "psf_convolution_image", + "path": "PyAutoArray/autoarray/operators/convolver.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "psf_convolution_mapping_matrix", + "path": "PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py", + "lines": [ + 119, + 150 + ], + "requires": null, + "function": null + }, + { + "label": "mesh_qhull_callback", + "path": "PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py", + "lines": [ + 139, + 172 + ], + "requires": null, + "function": null + }, + { + "label": "mesh_seed_argmin", + "path": "PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py", + "lines": [ + 173, + 207 + ], + "requires": null, + "function": null + }, + { + "label": "mesh_locate_walk", + "path": "PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py", + "lines": [ + 208, + 372 + ], + "requires": null, + "function": null + }, + { + "label": "mesh_dual_areas", + "path": "PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py", + "lines": [ + 373, + 396 + ], + "requires": null, + "function": null + }, + { + "label": "mesh_dual_areas", + "path": "PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py", + "lines": [ + 437, + 494 + ], + "requires": null, + "function": null + }, + { + "label": "mesh_dual_areas", + "path": "PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py", + "lines": [ + 605, + 615 + ], + "requires": null, + "function": null + }, + { + "label": "mesh_interpolation_weights", + "path": "PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py", + "lines": [ + 616, + 695 + ], + "requires": null, + "function": null + }, + { + "label": "mesh_interpolation_weights", + "path": "PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py", + "lines": [ + 896, + 1000 + ], + "requires": null, + "function": null + }, + { + "label": "mesh_construction", + "path": "PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "border_relocator", + "path": "PyAutoArray/autoarray/inversion/mesh/border_relocator.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "mesh_construction", + "path": "PyAutoArray/autoarray/inversion/mesh/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "mapping_matrix", + "path": "PyAutoArray/autoarray/inversion/mappers/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "mapping_matrix", + "path": "PyAutoArray/autoarray/inversion/mappings/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "mapping_matrix", + "path": "PyAutoArray/autoarray/inversion/linear_obj/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "regularization_H", + "path": "PyAutoArray/autoarray/inversion/regularization/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "chi_squared_evidence", + "path": "PyAutoArray/autoarray/fit/fit_util.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "chi_squared_evidence", + "path": "PyAutoArray/autoarray/fit/fit_dataset.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "ray_trace_mesh_grid", + "path": "PyAutoLens/autolens/lens/to_inversion.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "ray_trace_mesh_grid", + "path": "PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "mass_profile_deflections", + "path": "PyAutoGalaxy/autogalaxy/profiles/mass/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "light_profile_image", + "path": "PyAutoGalaxy/autogalaxy/profiles/light/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "light_profile_image", + "path": "PyAutoGalaxy/autogalaxy/operate/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "ray_trace_data_grid", + "path": "PyAutoLens/autolens/lens/tracer.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "ray_trace_data_grid", + "path": "PyAutoLens/autolens/lens/tracer_util.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "grids_and_structures", + "path": "PyAutoArray/autoarray/structures/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "grids_and_structures", + "path": "PyAutoArray/autoarray/operators/over_sampling/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "grids_and_structures", + "path": "PyAutoArray/autoarray/geometry/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "inversion_other", + "path": "PyAutoArray/autoarray/inversion/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "fit_imaging_other", + "path": "PyAutoLens/autolens/imaging/fit_imaging.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "fit_imaging_other", + "path": "PyAutoGalaxy/autogalaxy/imaging/fit_imaging.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "fit_imaging_other", + "path": "PyAutoArray/autoarray/fit/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "analysis_other", + "path": "PyAutoLens/autolens/analysis/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "analysis_other", + "path": "PyAutoGalaxy/autogalaxy/analysis/", + "lines": null, + "requires": null, + "function": null + } + ], + "trace_timing": { + "traced_wall_ms": 52.07778352799505, + "untraced_wall_ms": 50.70896519199596, + "profiler_overhead_ms": 1.3688183359990944, + "profiler_overhead_pct": 2.6993616036462766 + }, + "jit_phases": { + "b_s3_pdip_library_likelihood_jit": { + "lower_s": 1.5246863440006564, + "compile_s": 4.384332739999081, + "first_call_s": 0.12422982099815272, + "steady_per_call_s": 0.05100313639995875 + }, + "d_s3_certified_fallback_library_likelihood_jit": { + "lower_s": 0.4940918300017074, + "compile_s": 4.264264093999373, + "first_call_s": 0.05011921400000574, + "steady_per_call_s": 0.03169604540016735 + } + }, + "peak_bytes": { + "after_setup": 85108992, + "after_routes": 1181653248, + "after_all": 58806084096, + "note": "jax.devices()[0].memory_stats()['peak_bytes_in_use']; None on a backend that does not report it (CPU). Process-wide high-water marks." + }, + "note": "Every stage row is a MEASURED sum of GPU kernel durations joined to library source through the optimized HLO of ONE program \u2014 not arithmetic across compilations. The rows attribute the command-buffers-OFF program: kernel time is the same as production, the launch overhead the CUDA graphs remove is not, and command_buffers.* carries both walls and their delta. sum_ms = kernel rows + measured device_idle_ms; the residual against the wall is host_outside_span_ms and is reported, not absorbed. mixed_fusion.prorated_estimate_ms is an ESTIMATE and is never part of the table. No row may be quoted if reconciliation_pct is outside 5 % or unjoined_ms is non-zero.", + "vmap": { + "batch": 50, + "lanes_mode": "captured", + "arms": [ + "vmap", + "scalar" + ], + "draw_seed": 0, + "fallback": true, + "composition": "jax.jit(jax.vmap(fn))", + "composition_provenance": "Current Fitness._vmap after PyAutoFit#1638. Array 343376 used the retired jax.vmap(jax.jit(fn)) composition and is historical evidence only.", + "headline_arm": "scalar", + "lane_rtol": 1e-09, + "lanes": [ + { + "lane": 0, + "draw_name": "call00015_lane00", + "draw_kind": "captured", + "offsets": { + "centre_0": -0.0033655095107821688, + "centre_1": 0.004631951955766499, + "ell_comps_0": 0.000564301988937442, + "ell_comps_1": -0.00879076787683888, + "einstein_radius": 0.018337010967920175 + }, + "log_likelihood_vmap": 18700.594048999716, + "log_likelihood_scalar": 24758.506194309142, + "log_likelihood_library_pdip": 18700.59404900047, + "log_likelihood_library_pdip_scalar": 24758.506194309157, + "rel_diff_vmap_vs_library_pdip": 4.02693952445984e-14, + "rel_diff_scalar_vs_library_pdip_scalar": 5.877541687758072e-16, + "abs_diff_nats": 6057.912145309427, + "rel_diff": 0.24468003431894716, + "rel_diff_scalar_vs_library_pdip": 0.3239422303609903, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 6057.912145308688, + "rel_diff_library_pdip_vmap_vs_scalar": 0.2446800343189172, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": null, + "passes": null, + "pdip_iter": null + }, + { + "lane": 1, + "draw_name": "call00015_lane01", + "draw_kind": "captured", + "offsets": { + "centre_0": -0.004311760382151672, + "centre_1": 0.0027192789928108052, + "ell_comps_0": 0.0061667694809026535, + "ell_comps_1": 0.003465536775180321, + "einstein_radius": -0.05732579988501185 + }, + "log_likelihood_vmap": 14200.214307612092, + "log_likelihood_scalar": 20551.004887772862, + "log_likelihood_library_pdip": 14200.214307378097, + "log_likelihood_library_pdip_scalar": 20551.004887772713, + "rel_diff_vmap_vs_library_pdip": 1.647825813097488e-11, + "rel_diff_scalar_vs_library_pdip_scalar": 7.257899645554785e-15, + "abs_diff_nats": 6350.79058016077, + "rel_diff": 0.3090257928914839, + "rel_diff_scalar_vs_library_pdip": 0.4472320236107313, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 6350.790580394616, + "rel_diff_library_pdip_vmap_vs_scalar": 0.30902579290286497, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": null, + "passes": null, + "pdip_iter": null + }, + { + "lane": 2, + "draw_name": "call00015_lane02", + "draw_kind": "captured", + "offsets": { + "centre_0": 0.0002796502552123051, + "centre_1": 0.0016003321376979894, + "ell_comps_0": -0.002094430657472772, + "ell_comps_1": 0.006146479068253558, + "einstein_radius": -0.025968910196758177 + }, + "log_likelihood_vmap": -23119.316937414085, + "log_likelihood_scalar": -189709.04191844532, + "log_likelihood_library_pdip": -23119.464418166448, + "log_likelihood_library_pdip_scalar": -189709.04904877947, + "rel_diff_vmap_vs_library_pdip": 6.379073048373394e-06, + "rel_diff_scalar_vs_library_pdip_scalar": 3.758563015061023e-08, + "abs_diff_nats": 166589.72498103124, + "rel_diff": 0.8781327621307954, + "rel_diff_scalar_vs_library_pdip": 7.20559847266093, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 166589.58463061304, + "rel_diff_library_pdip_vmap_vs_scalar": 0.8781319893063099, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "FAIL", + "certified": null, + "passes": null, + "pdip_iter": null + }, + { + "lane": 3, + "draw_name": "call00015_lane03", + "draw_kind": "captured", + "offsets": { + "centre_0": 0.004594602299816973, + "centre_1": 0.004924922434755804, + "ell_comps_0": 0.028601845732661953, + "ell_comps_1": 0.003760187047606014, + "einstein_radius": -0.03088526730480501 + }, + "log_likelihood_vmap": 18502.01091225886, + "log_likelihood_scalar": -141741.9662350511, + "log_likelihood_library_pdip": 18502.009653967685, + "log_likelihood_library_pdip_scalar": -141741.96606594877, + "rel_diff_vmap_vs_library_pdip": 6.80083513454663e-08, + "rel_diff_scalar_vs_library_pdip_scalar": 1.193029418471919e-09, + "abs_diff_nats": 160243.97714730995, + "rel_diff": 1.1305330482122486, + "rel_diff_scalar_vs_library_pdip": 8.66089570192474, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 160243.97571991646, + "rel_diff_library_pdip_vmap_vs_scalar": 1.1305330394906417, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "FAIL", + "certified": null, + "passes": null, + "pdip_iter": null + }, + { + "lane": 4, + "draw_name": "call00015_lane04", + "draw_kind": "captured", + "offsets": { + "centre_0": -0.0060950290987001, + "centre_1": -0.0006121094560707545, + "ell_comps_0": 0.009637314264800585, + "ell_comps_1": 0.006641580028105454, + "einstein_radius": -0.03125810931551931 + }, + "log_likelihood_vmap": 18751.91028804238, + "log_likelihood_scalar": 24880.54593298872, + "log_likelihood_library_pdip": 18751.910288041527, + "log_likelihood_library_pdip_scalar": 24880.545932988745, + "rel_diff_vmap_vs_library_pdip": 4.559135610902296e-14, + "rel_diff_scalar_vs_library_pdip_scalar": 1.023524633190512e-15, + "abs_diff_nats": 6128.635644946338, + "rel_diff": 0.2463223942695115, + "rel_diff_scalar_vs_library_pdip": 0.32682726990516525, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 6128.635644947219, + "rel_diff_library_pdip_vmap_vs_scalar": 0.24632239426954664, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": null, + "passes": null, + "pdip_iter": null + }, + { + "lane": 5, + "draw_name": "call00015_lane05", + "draw_kind": "captured", + "offsets": { + "centre_0": -0.008435952123169364, + "centre_1": -0.007849511137408794, + "ell_comps_0": -0.01598149485178925, + "ell_comps_1": 0.01654417876136871, + "einstein_radius": 0.014294380855379263 + }, + "log_likelihood_vmap": 24935.952740676803, + "log_likelihood_scalar": 25472.519186791807, + "log_likelihood_library_pdip": 24935.95274067806, + "log_likelihood_library_pdip_scalar": 25472.51918678188, + "rel_diff_vmap_vs_library_pdip": 5.047894822163129e-14, + "rel_diff_scalar_vs_library_pdip_scalar": 3.8975509613925874e-13, + "abs_diff_nats": 536.5664461150045, + "rel_diff": 0.02106452220843664, + "rel_diff_scalar_vs_library_pdip": 0.021517784048348955, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 536.5664461038177, + "rel_diff_library_pdip_vmap_vs_scalar": 0.02106452220800568, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": null, + "passes": null, + "pdip_iter": null + }, + { + "lane": 6, + "draw_name": "call00015_lane06", + "draw_kind": "captured", + "offsets": { + "centre_0": 0.0031698313356290646, + "centre_1": -0.0038584140676992847, + "ell_comps_0": 0.01810147576636289, + "ell_comps_1": -0.011577480306416508, + "einstein_radius": 0.016136835525067283 + }, + "log_likelihood_vmap": 28315.20147858392, + "log_likelihood_scalar": -83383.91554954817, + "log_likelihood_library_pdip": 28315.20140299416, + "log_likelihood_library_pdip_scalar": -83383.91545974431, + "rel_diff_vmap_vs_library_pdip": 2.6695822808702375e-09, + "rel_diff_scalar_vs_library_pdip_scalar": 1.0769925543059859e-09, + "abs_diff_nats": 111699.11702813208, + "rel_diff": 1.3395762994813853, + "rel_diff_scalar_vs_library_pdip": 3.944846281076808, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 111699.11686273848, + "rel_diff_library_pdip_vmap_vs_scalar": 1.3395762989405797, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "FAIL", + "certified": null, + "passes": null, + "pdip_iter": null + }, + { + "lane": 7, + "draw_name": "call00015_lane07", + "draw_kind": "captured", + "offsets": { + "centre_0": 0.006158729760195174, + "centre_1": 0.004883559265258847, + "ell_comps_0": 0.007613883677130215, + "ell_comps_1": -0.005800175617006949, + "einstein_radius": 0.0662922007765554 + }, + "log_likelihood_vmap": 23338.89001450443, + "log_likelihood_scalar": -11960.2844297919, + "log_likelihood_library_pdip": 23338.89001397335, + "log_likelihood_library_pdip_scalar": -11960.284429868196, + "rel_diff_vmap_vs_library_pdip": 2.2755283557945645e-11, + "rel_diff_scalar_vs_library_pdip_scalar": 6.379086717352273e-12, + "abs_diff_nats": 35299.17444429633, + "rel_diff": 2.9513658016668516, + "rel_diff_scalar_vs_library_pdip": 1.512461579048151, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 35299.17444384155, + "rel_diff_library_pdip_vmap_vs_scalar": 2.9513658016099997, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": null, + "passes": null, + "pdip_iter": null + }, + { + "lane": 8, + "draw_name": "call00015_lane08", + "draw_kind": "captured", + "offsets": { + "centre_0": 0.0030335293924908615, + "centre_1": 0.0012117081273721316, + "ell_comps_0": 0.0008852687687036301, + "ell_comps_1": -0.0027113633212058814, + "einstein_radius": -0.03873713959923952 + }, + "log_likelihood_vmap": 24869.037000615295, + "log_likelihood_scalar": 23223.55039149886, + "log_likelihood_library_pdip": 24869.037000609445, + "log_likelihood_library_pdip_scalar": 23223.550391489476, + "rel_diff_vmap_vs_library_pdip": 2.352270384116649e-13, + "rel_diff_scalar_vs_library_pdip_scalar": 4.040014203395787e-13, + "abs_diff_nats": 1645.4866091164367, + "rel_diff": 0.07085422260494582, + "rel_diff_scalar_vs_library_pdip": 0.066166076678814, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 1645.4866091199692, + "rel_diff_library_pdip_vmap_vs_scalar": 0.07085422260512655, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": null, + "passes": null, + "pdip_iter": null + }, + { + "lane": 9, + "draw_name": "call00015_lane09", + "draw_kind": "captured", + "offsets": { + "centre_0": -0.0008035510098975272, + "centre_1": 0.005559773241319952, + "ell_comps_0": -0.003701655436278317, + "ell_comps_1": -0.012378591445614512, + "einstein_radius": 0.032284336889985665 + }, + "log_likelihood_vmap": -31749.968535649372, + "log_likelihood_scalar": -177117.77789004147, + "log_likelihood_library_pdip": -31749.305307205344, + "log_likelihood_library_pdip_scalar": -177117.69794166007, + "rel_diff_vmap_vs_library_pdip": 2.08895419162751e-05, + "rel_diff_scalar_vs_library_pdip_scalar": 4.5138561721102667e-07, + "abs_diff_nats": 145367.8093543921, + "rel_diff": 0.8207409277946089, + "rel_diff_scalar_vs_library_pdip": 4.5786347504695, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 145368.3926344547, + "rel_diff_library_pdip_vmap_vs_scalar": 0.8207445914430126, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "FAIL", + "certified": null, + "passes": null, + "pdip_iter": null + }, + { + "lane": 10, + "draw_name": "call00015_lane10", + "draw_kind": "captured", + "offsets": { + "centre_0": -0.008473569241265282, + "centre_1": -0.0051993251621340235, + "ell_comps_0": -0.0031466996514049606, + "ell_comps_1": -0.0076036423480284636, + "einstein_radius": 0.08283321334626792 + }, + "log_likelihood_vmap": 6560.779511565073, + "log_likelihood_scalar": -101745.38335529093, + "log_likelihood_library_pdip": 6560.779593603307, + "log_likelihood_library_pdip_scalar": -101745.3835211835, + "rel_diff_vmap_vs_library_pdip": 1.2504342303062657e-08, + "rel_diff_scalar_vs_library_pdip_scalar": 1.6304676974813754e-09, + "abs_diff_nats": 108306.162866856, + "rel_diff": 1.0644823312390999, + "rel_diff_scalar_vs_library_pdip": 16.50812398186515, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 108306.1631147868, + "rel_diff_library_pdip_vmap_vs_scalar": 1.0644823319402728, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "FAIL", + "certified": null, + "passes": null, + "pdip_iter": null + }, + { + "lane": 11, + "draw_name": "call00015_lane11", + "draw_kind": "captured", + "offsets": { + "centre_0": 0.001017060353322001, + "centre_1": 0.003035861051809724, + "ell_comps_0": 0.0014054844842678396, + "ell_comps_1": -0.00019678252877009805, + "einstein_radius": -0.04179610309843307 + }, + "log_likelihood_vmap": 12667.92492649478, + "log_likelihood_scalar": 18957.528349732384, + "log_likelihood_library_pdip": 12667.924906617816, + "log_likelihood_library_pdip_scalar": 18957.528349744887, + "rel_diff_vmap_vs_library_pdip": 1.5690780611683128e-09, + "rel_diff_scalar_vs_library_pdip_scalar": 6.59565578871598e-13, + "abs_diff_nats": 6289.603423237604, + "rel_diff": 0.33177338876702206, + "rel_diff_scalar_vs_library_pdip": 0.4964983207177706, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 6289.603443127071, + "rel_diff_library_pdip_vmap_vs_scalar": 0.3317733898159625, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "FAIL", + "certified": null, + "passes": null, + "pdip_iter": null + }, + { + "lane": 12, + "draw_name": "call00015_lane12", + "draw_kind": "captured", + "offsets": { + "centre_0": -0.0012508260776529923, + "centre_1": -0.0075763258203543175, + "ell_comps_0": -0.0003476568325791879, + "ell_comps_1": 0.0070528223693464365, + "einstein_radius": -0.005182936058341969 + }, + "log_likelihood_vmap": 18842.27979675187, + "log_likelihood_scalar": 24810.0496601949, + "log_likelihood_library_pdip": 18842.27979674931, + "log_likelihood_library_pdip_scalar": 24810.04966019489, + "rel_diff_vmap_vs_library_pdip": 1.359250105517707e-13, + "rel_diff_scalar_vs_library_pdip_scalar": 4.3989982167530276e-16, + "abs_diff_nats": 5967.769863443031, + "rel_diff": 0.24053840863598455, + "rel_diff_scalar_vs_library_pdip": 0.3167222824318296, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 5967.769863445581, + "rel_diff_library_pdip_vmap_vs_scalar": 0.24053840863608744, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": null, + "passes": null, + "pdip_iter": null + }, + { + "lane": 13, + "draw_name": "call00015_lane13", + "draw_kind": "captured", + "offsets": { + "centre_0": 0.0039046265841316857, + "centre_1": 0.008586063066835778, + "ell_comps_0": 0.01612319103606081, + "ell_comps_1": -0.006478405394829051, + "einstein_radius": -0.06420305523683667 + }, + "log_likelihood_vmap": 22879.755989109253, + "log_likelihood_scalar": -3605.706215942817, + "log_likelihood_library_pdip": 22879.75598922863, + "log_likelihood_library_pdip_scalar": -3605.7062159744455, + "rel_diff_vmap_vs_library_pdip": 5.21756598418741e-12, + "rel_diff_scalar_vs_library_pdip_scalar": 8.771814966158493e-12, + "abs_diff_nats": 26485.46220505207, + "rel_diff": 7.3454298877554765, + "rel_diff_scalar_vs_library_pdip": 1.157593735599292, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 26485.462205203075, + "rel_diff_library_pdip_vmap_vs_scalar": 7.345429887732924, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": null, + "passes": null, + "pdip_iter": null + }, + { + "lane": 14, + "draw_name": "call00015_lane14", + "draw_kind": "captured", + "offsets": { + "centre_0": 0.007195835212073937, + "centre_1": -0.0022675171274400335, + "ell_comps_0": 0.004220685262914858, + "ell_comps_1": 0.006581974817750368, + "einstein_radius": 0.08589577997501685 + }, + "log_likelihood_vmap": 4357.02195028017, + "log_likelihood_scalar": 11126.921475785763, + "log_likelihood_library_pdip": 4357.021950280177, + "log_likelihood_library_pdip_scalar": 11126.921475785763, + "rel_diff_vmap_vs_library_pdip": 1.6699382507622086e-15, + "rel_diff_scalar_vs_library_pdip_scalar": 0.0, + "abs_diff_nats": 6769.8995255055925, + "rel_diff": 0.6084252090965273, + "rel_diff_scalar_vs_library_pdip": 1.5537905483974548, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 6769.899525505585, + "rel_diff_library_pdip_vmap_vs_scalar": 0.6084252090965266, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": null, + "passes": null, + "pdip_iter": null + }, + { + "lane": 15, + "draw_name": "call00015_lane15", + "draw_kind": "captured", + "offsets": { + "centre_0": 0.0024446743118905125, + "centre_1": 0.0028324231769206983, + "ell_comps_0": -0.017159158004659933, + "ell_comps_1": 0.008265799441903459, + "einstein_radius": -0.03860302877433641 + }, + "log_likelihood_vmap": 14146.464614247743, + "log_likelihood_scalar": 20410.343973720603, + "log_likelihood_library_pdip": 14146.464613876353, + "log_likelihood_library_pdip_scalar": 20410.343973722156, + "rel_diff_vmap_vs_library_pdip": 2.6253226697734263e-11, + "rel_diff_scalar_vs_library_pdip_scalar": 7.610929794363826e-14, + "abs_diff_nats": 6263.8793594728595, + "rel_diff": 0.3068972951919838, + "rel_diff_scalar_vs_library_pdip": 0.44278761731747257, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 6263.879359845803, + "rel_diff_library_pdip_vmap_vs_scalar": 0.30689729521023273, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": null, + "passes": null, + "pdip_iter": null + }, + { + "lane": 16, + "draw_name": "call00015_lane16", + "draw_kind": "captured", + "offsets": { + "centre_0": 0.00546338030193603, + "centre_1": 0.0029217319844296002, + "ell_comps_0": 0.018887239108742314, + "ell_comps_1": 0.01610145140759906, + "einstein_radius": 0.09308737119031596 + }, + "log_likelihood_vmap": 2903.043598923672, + "log_likelihood_scalar": 9734.862241679926, + "log_likelihood_library_pdip": 2903.043598923672, + "log_likelihood_library_pdip_scalar": 9734.86224168224, + "rel_diff_vmap_vs_library_pdip": 0.0, + "rel_diff_scalar_vs_library_pdip_scalar": 2.3767717137315127e-13, + "abs_diff_nats": 6831.818642756254, + "rel_diff": 0.7017889388825393, + "rel_diff_scalar_vs_library_pdip": 2.353329672792103, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 6831.818642758568, + "rel_diff_library_pdip_vmap_vs_scalar": 0.7017889388826103, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": null, + "passes": null, + "pdip_iter": null + }, + { + "lane": 17, + "draw_name": "call00015_lane17", + "draw_kind": "captured", + "offsets": { + "centre_0": -0.0033403521024317102, + "centre_1": -0.004078467297591464, + "ell_comps_0": -0.01076606265657356, + "ell_comps_1": 0.014404445881011321, + "einstein_radius": -0.016103243806114165 + }, + "log_likelihood_vmap": 13360.530937095456, + "log_likelihood_scalar": 19481.557217641563, + "log_likelihood_library_pdip": 13360.530937095456, + "log_likelihood_library_pdip_scalar": 19481.557217641563, + "rel_diff_vmap_vs_library_pdip": 0.0, + "rel_diff_scalar_vs_library_pdip_scalar": 0.0, + "abs_diff_nats": 6121.026280546106, + "rel_diff": 0.3141959450245178, + "rel_diff_scalar_vs_library_pdip": 0.4581424427940287, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 6121.026280546106, + "rel_diff_library_pdip_vmap_vs_scalar": 0.3141959450245178, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": null, + "passes": null, + "pdip_iter": null + }, + { + "lane": 18, + "draw_name": "call00015_lane18", + "draw_kind": "captured", + "offsets": { + "centre_0": -0.0036504937209151113, + "centre_1": -0.0003963555596475738, + "ell_comps_0": -0.008227000946306733, + "ell_comps_1": -0.02487475830854786, + "einstein_radius": -0.0327871904693704 + }, + "log_likelihood_vmap": 12594.119293045376, + "log_likelihood_scalar": 18812.946857997056, + "log_likelihood_library_pdip": 12594.119293045376, + "log_likelihood_library_pdip_scalar": 18812.946857997056, + "rel_diff_vmap_vs_library_pdip": 0.0, + "rel_diff_scalar_vs_library_pdip_scalar": 0.0, + "abs_diff_nats": 6218.82756495168, + "rel_diff": 0.3305610552080077, + "rel_diff_scalar_vs_library_pdip": 0.49378820545123714, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 6218.82756495168, + "rel_diff_library_pdip_vmap_vs_scalar": 0.3305610552080077, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": null, + "passes": null, + "pdip_iter": null + }, + { + "lane": 19, + "draw_name": "call00015_lane19", + "draw_kind": "captured", + "offsets": { + "centre_0": 0.00840275144875603, + "centre_1": -0.003628185056462521, + "ell_comps_0": 0.005265994929748281, + "ell_comps_1": 0.009958068668923414, + "einstein_radius": -0.06501253116347949 + }, + "log_likelihood_vmap": 10415.233658037694, + "log_likelihood_scalar": 16927.632549569014, + "log_likelihood_library_pdip": 10415.23365811746, + "log_likelihood_library_pdip_scalar": 16927.63254956904, + "rel_diff_vmap_vs_library_pdip": 7.658620626540083e-12, + "rel_diff_scalar_vs_library_pdip_scalar": 1.5043953473748062e-15, + "abs_diff_nats": 6512.39889153132, + "rel_diff": 0.3847200057338868, + "rel_diff_scalar_vs_library_pdip": 0.6252763121042318, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 6512.398891451579, + "rel_diff_library_pdip_vmap_vs_scalar": 0.38472000572917553, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": null, + "passes": null, + "pdip_iter": null + }, + { + "lane": 20, + "draw_name": "call00016_lane00", + "draw_kind": "captured", + "offsets": { + "centre_0": -0.00884193513479277, + "centre_1": -0.0043653741820675615, + "ell_comps_0": 0.013534779280882363, + "ell_comps_1": -0.002720977381459688, + "einstein_radius": 0.03143265344345525 + }, + "log_likelihood_vmap": 23125.781207506523, + "log_likelihood_scalar": 27642.80600594327, + "log_likelihood_library_pdip": 23125.78120750677, + "log_likelihood_library_pdip_scalar": 27642.806005943028, + "rel_diff_vmap_vs_library_pdip": 1.0697262793523905e-14, + "rel_diff_scalar_vs_library_pdip_scalar": 8.686042987692048e-15, + "abs_diff_nats": 4517.024798436745, + "rel_diff": 0.1634068841443077, + "rel_diff_scalar_vs_library_pdip": 0.195324203662804, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 4517.024798436258, + "rel_diff_library_pdip_vmap_vs_scalar": 0.1634068841442915, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": null, + "passes": null, + "pdip_iter": null + }, + { + "lane": 21, + "draw_name": "call00016_lane01", + "draw_kind": "captured", + "offsets": { + "centre_0": 0.004620853605949627, + "centre_1": -0.006101969080571725, + "ell_comps_0": 0.006298490627944492, + "ell_comps_1": -0.0011939165979551265, + "einstein_radius": -0.008698400624736369 + }, + "log_likelihood_vmap": 25204.959753670475, + "log_likelihood_scalar": 27788.396151208093, + "log_likelihood_library_pdip": 25204.959753667667, + "log_likelihood_library_pdip_scalar": 27788.39615112006, + "rel_diff_vmap_vs_library_pdip": 1.1142726140104725e-13, + "rel_diff_scalar_vs_library_pdip_scalar": 3.1679342231651965e-12, + "abs_diff_nats": 2583.436397537618, + "rel_diff": 0.09296817216366422, + "rel_diff_scalar_vs_library_pdip": 0.10249714432352948, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 2583.436397452395, + "rel_diff_library_pdip_vmap_vs_scalar": 0.09296817216089187, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": null, + "passes": null, + "pdip_iter": null + }, + { + "lane": 22, + "draw_name": "call00016_lane02", + "draw_kind": "captured", + "offsets": { + "centre_0": 0.0023954075319476313, + "centre_1": 0.005058697427718103, + "ell_comps_0": -0.012832403546307256, + "ell_comps_1": 0.008158705801962226, + "einstein_radius": -0.04064267210128203 + }, + "log_likelihood_vmap": 11553.07472359277, + "log_likelihood_scalar": 17852.91967933103, + "log_likelihood_library_pdip": 11553.07472359277, + "log_likelihood_library_pdip_scalar": 17852.91967933103, + "rel_diff_vmap_vs_library_pdip": 0.0, + "rel_diff_scalar_vs_library_pdip_scalar": 0.0, + "abs_diff_nats": 6299.844955738259, + "rel_diff": 0.3528747716840858, + "rel_diff_scalar_vs_library_pdip": 0.5452959585618551, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 6299.844955738259, + "rel_diff_library_pdip_vmap_vs_scalar": 0.3528747716840858, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": null, + "passes": null, + "pdip_iter": null + }, + { + "lane": 23, + "draw_name": "call00016_lane03", + "draw_kind": "captured", + "offsets": { + "centre_0": -0.0034553415111254126, + "centre_1": -0.0012095214967760579, + "ell_comps_0": -0.013572031583894487, + "ell_comps_1": 0.012809349042796288, + "einstein_radius": 0.016462197503162912 + }, + "log_likelihood_vmap": 21983.899534877724, + "log_likelihood_scalar": 27386.085836286504, + "log_likelihood_library_pdip": 21983.899534877615, + "log_likelihood_library_pdip_scalar": 27386.08583628653, + "rel_diff_vmap_vs_library_pdip": 4.9645134176309806e-15, + "rel_diff_scalar_vs_library_pdip_scalar": 9.298828537190872e-16, + "abs_diff_nats": 5402.186301408779, + "rel_diff": 0.19726025594540766, + "rel_diff_scalar_vs_library_pdip": 0.2457337604203604, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 5402.186301408914, + "rel_diff_library_pdip_vmap_vs_scalar": 0.19726025594541238, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": null, + "passes": null, + "pdip_iter": null + }, + { + "lane": 24, + "draw_name": "call00016_lane04", + "draw_kind": "captured", + "offsets": { + "centre_0": 0.002118045409654518, + "centre_1": -0.002760233148797609, + "ell_comps_0": 0.017300773468951293, + "ell_comps_1": 0.0015174503365170395, + "einstein_radius": -0.009907496303277252 + }, + "log_likelihood_vmap": 23449.28672850131, + "log_likelihood_scalar": 28384.90598332632, + "log_likelihood_library_pdip": 23449.286728501065, + "log_likelihood_library_pdip_scalar": 28384.905983326335, + "rel_diff_vmap_vs_library_pdip": 1.0394541330713026e-14, + "rel_diff_scalar_vs_library_pdip_scalar": 5.126638515877007e-16, + "abs_diff_nats": 4935.619254825011, + "rel_diff": 0.17388182499967628, + "rel_diff_scalar_vs_library_pdip": 0.21048057077259985, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 4935.619254825269, + "rel_diff_library_pdip_vmap_vs_scalar": 0.17388182499968527, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": null, + "passes": null, + "pdip_iter": null + }, + { + "lane": 25, + "draw_name": "call00016_lane05", + "draw_kind": "captured", + "offsets": { + "centre_0": -0.004055224824141611, + "centre_1": 0.008121383491444374, + "ell_comps_0": -0.002675674189352585, + "ell_comps_1": 0.022116535787456582, + "einstein_radius": 0.03951210569146424 + }, + "log_likelihood_vmap": -136892.6666871641, + "log_likelihood_scalar": -189785.11040523922, + "log_likelihood_library_pdip": -136892.82101562357, + "log_likelihood_library_pdip_scalar": -189785.06952934078, + "rel_diff_vmap_vs_library_pdip": 1.1273670768223002e-06, + "rel_diff_scalar_vs_library_pdip_scalar": 2.1537994818386058e-07, + "abs_diff_nats": 52892.44371807511, + "rel_diff": 0.2786964878600664, + "rel_diff_scalar_vs_library_pdip": 0.3863773790122935, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 52892.248513717204, + "rel_diff_library_pdip_vmap_vs_scalar": 0.2786955193308295, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "FAIL", + "certified": null, + "passes": null, + "pdip_iter": null + }, + { + "lane": 26, + "draw_name": "call00016_lane06", + "draw_kind": "captured", + "offsets": { + "centre_0": -0.008657008236802587, + "centre_1": 0.00296353203184632, + "ell_comps_0": 0.001140204699970393, + "ell_comps_1": 0.0024587369167136715, + "einstein_radius": -0.02214717629190477 + }, + "log_likelihood_vmap": 20216.485753679586, + "log_likelihood_scalar": -186990.07885292446, + "log_likelihood_library_pdip": 20216.492407061978, + "log_likelihood_library_pdip_scalar": -186990.08329202014, + "rel_diff_vmap_vs_library_pdip": 3.291066648948336e-07, + "rel_diff_scalar_vs_library_pdip_scalar": 2.373973847878948e-08, + "abs_diff_nats": 207206.56460660405, + "rel_diff": 1.1081152854616458, + "rel_diff_scalar_vs_library_pdip": 10.249382884421905, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 207206.5756990821, + "rel_diff_library_pdip_vmap_vs_scalar": 1.1081153184764891, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "FAIL", + "certified": null, + "passes": null, + "pdip_iter": null + }, + { + "lane": 27, + "draw_name": "call00016_lane07", + "draw_kind": "captured", + "offsets": { + "centre_0": -0.008477184803652458, + "centre_1": 0.003915910494663854, + "ell_comps_0": -0.009104458058464132, + "ell_comps_1": 0.0040545395575112865, + "einstein_radius": -0.027672851325696968 + }, + "log_likelihood_vmap": 23997.43715335727, + "log_likelihood_scalar": 27662.094569019268, + "log_likelihood_library_pdip": 23997.437153354946, + "log_likelihood_library_pdip_scalar": 27662.09456901923, + "rel_diff_vmap_vs_library_pdip": 9.687153019198994e-14, + "rel_diff_scalar_vs_library_pdip_scalar": 1.3151494359961256e-15, + "abs_diff_nats": 3664.657415661997, + "rel_diff": 0.1324793900374524, + "rel_diff_scalar_vs_library_pdip": 0.15271036620475062, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 3664.6574156642855, + "rel_diff_library_pdip_vmap_vs_scalar": 0.13247939003753528, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": null, + "passes": null, + "pdip_iter": null + }, + { + "lane": 28, + "draw_name": "call00016_lane08", + "draw_kind": "captured", + "offsets": { + "centre_0": -0.0016692556339188685, + "centre_1": -0.0020136329026704475, + "ell_comps_0": -0.01765507329375373, + "ell_comps_1": 0.007611548713690083, + "einstein_radius": 0.032934930918189 + }, + "log_likelihood_vmap": 15428.355976304025, + "log_likelihood_scalar": -74102.36862721092, + "log_likelihood_library_pdip": 15428.36951848779, + "log_likelihood_library_pdip_scalar": -74102.36796310006, + "rel_diff_vmap_vs_library_pdip": 8.777456198202808e-07, + "rel_diff_scalar_vs_library_pdip_scalar": 8.96207342969017e-09, + "abs_diff_nats": 89530.72460351494, + "rel_diff": 1.2082032769278932, + "rel_diff_scalar_vs_library_pdip": 5.802994155566093, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 89530.73748158784, + "rel_diff_library_pdip_vmap_vs_scalar": 1.2082034615435027, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "FAIL", + "certified": null, + "passes": null, + "pdip_iter": null + }, + { + "lane": 29, + "draw_name": "call00016_lane09", + "draw_kind": "captured", + "offsets": { + "centre_0": -0.0004381888692729163, + "centre_1": -0.005611258255408329, + "ell_comps_0": -0.028212995885542408, + "ell_comps_1": 0.02032938084918439, + "einstein_radius": 0.08210563031665497 + }, + "log_likelihood_vmap": 9199.66418883179, + "log_likelihood_scalar": 15888.26182677699, + "log_likelihood_library_pdip": 9199.664188830415, + "log_likelihood_library_pdip_scalar": 15888.261826777096, + "rel_diff_vmap_vs_library_pdip": 1.4947893323652892e-13, + "rel_diff_scalar_vs_library_pdip_scalar": 6.640209392059121e-15, + "abs_diff_nats": 6688.5976379452, + "rel_diff": 0.42097730455780225, + "rel_diff_scalar_vs_library_pdip": 0.7270480205209447, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 6688.597637946681, + "rel_diff_library_pdip_vmap_vs_scalar": 0.4209773045578926, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": null, + "passes": null, + "pdip_iter": null + }, + { + "lane": 30, + "draw_name": "call00016_lane10", + "draw_kind": "captured", + "offsets": { + "centre_0": -0.006865422615785068, + "centre_1": 0.007672434011054661, + "ell_comps_0": -0.0004443754014717277, + "ell_comps_1": -0.009376937319187229, + "einstein_radius": 0.07069214800098655 + }, + "log_likelihood_vmap": 18699.685890165503, + "log_likelihood_scalar": -2303.2655719854956, + "log_likelihood_library_pdip": 18699.685890304027, + "log_likelihood_library_pdip_scalar": -2303.2655717178277, + "rel_diff_vmap_vs_library_pdip": 7.407788550579711e-12, + "rel_diff_scalar_vs_library_pdip_scalar": 1.1621236039704577e-10, + "abs_diff_nats": 21002.951462151, + "rel_diff": 9.118771069045989, + "rel_diff_scalar_vs_library_pdip": 1.123171350871715, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 21002.951462021854, + "rel_diff_library_pdip_vmap_vs_scalar": 9.118771070049632, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": null, + "passes": null, + "pdip_iter": null + }, + { + "lane": 31, + "draw_name": "call00016_lane11", + "draw_kind": "captured", + "offsets": { + "centre_0": -0.0009434846288846137, + "centre_1": -0.005019378037730504, + "ell_comps_0": -0.009906341245761709, + "ell_comps_1": 0.005337547203081457, + "einstein_radius": 0.021637810364502075 + }, + "log_likelihood_vmap": 13020.244793610349, + "log_likelihood_scalar": 19182.855515516767, + "log_likelihood_library_pdip": 13020.244793610349, + "log_likelihood_library_pdip_scalar": 19182.855515516767, + "rel_diff_vmap_vs_library_pdip": 0.0, + "rel_diff_scalar_vs_library_pdip_scalar": 0.0, + "abs_diff_nats": 6162.610721906418, + "rel_diff": 0.32125617152887176, + "rel_diff_scalar_vs_library_pdip": 0.4733098969791031, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 6162.610721906418, + "rel_diff_library_pdip_vmap_vs_scalar": 0.32125617152887176, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": null, + "passes": null, + "pdip_iter": null + }, + { + "lane": 32, + "draw_name": "call00016_lane12", + "draw_kind": "captured", + "offsets": { + "centre_0": 0.007501332281640899, + "centre_1": -0.004481729694563993, + "ell_comps_0": 0.010332412839169434, + "ell_comps_1": -0.003991142259489408, + "einstein_radius": 0.009192357179279576 + }, + "log_likelihood_vmap": 20526.007408480735, + "log_likelihood_scalar": 25770.8125705254, + "log_likelihood_library_pdip": 20526.007408406545, + "log_likelihood_library_pdip_scalar": 25770.812570514885, + "rel_diff_vmap_vs_library_pdip": 3.614404902856882e-12, + "rel_diff_scalar_vs_library_pdip_scalar": 4.0797156565114053e-13, + "abs_diff_nats": 5244.805162044664, + "rel_diff": 0.20351725998904877, + "rel_diff_scalar_vs_library_pdip": 0.25551998777759444, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 5244.80516210834, + "rel_diff_library_pdip_vmap_vs_scalar": 0.20351725999160264, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": null, + "passes": null, + "pdip_iter": null + }, + { + "lane": 33, + "draw_name": "call00016_lane13", + "draw_kind": "captured", + "offsets": { + "centre_0": -0.007387955150592393, + "centre_1": -0.012189283154464192, + "ell_comps_0": 0.008975668561402167, + "ell_comps_1": 0.007167944425996534, + "einstein_radius": -0.04724415035491503 + }, + "log_likelihood_vmap": 9476.34754314409, + "log_likelihood_scalar": 15902.910586796046, + "log_likelihood_library_pdip": 9476.347543144097, + "log_likelihood_library_pdip_scalar": 15902.910586796046, + "rel_diff_vmap_vs_library_pdip": 7.678018963590462e-16, + "rel_diff_scalar_vs_library_pdip_scalar": 0.0, + "abs_diff_nats": 6426.563043651957, + "rel_diff": 0.4041123798424571, + "rel_diff_scalar_vs_library_pdip": 0.6781687790990115, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 6426.56304365195, + "rel_diff_library_pdip_vmap_vs_scalar": 0.4041123798424567, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": null, + "passes": null, + "pdip_iter": null + }, + { + "lane": 34, + "draw_name": "call00016_lane14", + "draw_kind": "captured", + "offsets": { + "centre_0": -0.000386125459039801, + "centre_1": 0.006915867404617462, + "ell_comps_0": 0.009873645974923177, + "ell_comps_1": 0.0016807669637177417, + "einstein_radius": -0.02988317231293447 + }, + "log_likelihood_vmap": 23033.79075623095, + "log_likelihood_scalar": -130304.42436466076, + "log_likelihood_library_pdip": 23033.79321236343, + "log_likelihood_library_pdip_scalar": -130304.42384542034, + "rel_diff_vmap_vs_library_pdip": 1.0663169804366194e-07, + "rel_diff_scalar_vs_library_pdip_scalar": 3.984825727486374e-09, + "abs_diff_nats": 153338.21512089172, + "rel_diff": 1.1767690611315715, + "rel_diff_scalar_vs_library_pdip": 6.657097950098797, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 153338.21705778377, + "rel_diff_library_pdip_vmap_vs_scalar": 1.1767690806851525, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "FAIL", + "certified": null, + "passes": null, + "pdip_iter": null + }, + { + "lane": 35, + "draw_name": "call00016_lane15", + "draw_kind": "captured", + "offsets": { + "centre_0": -0.007751700182654455, + "centre_1": 0.00045977673595488515, + "ell_comps_0": -0.0005571070710696721, + "ell_comps_1": 0.00652407778540843, + "einstein_radius": -0.018266703354617997 + }, + "log_likelihood_vmap": 12436.966956375636, + "log_likelihood_scalar": 18757.07135333741, + "log_likelihood_library_pdip": 12436.966956375622, + "log_likelihood_library_pdip_scalar": 18757.071353384385, + "rel_diff_vmap_vs_library_pdip": 1.1700533803305664e-15, + "rel_diff_scalar_vs_library_pdip_scalar": 2.504313251902869e-12, + "abs_diff_nats": 6320.104396961775, + "rel_diff": 0.3369451593964988, + "rel_diff_scalar_vs_library_pdip": 0.5081708763181915, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 6320.104397008763, + "rel_diff_library_pdip_vmap_vs_scalar": 0.33694515939816005, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": null, + "passes": null, + "pdip_iter": null + }, + { + "lane": 36, + "draw_name": "call00016_lane16", + "draw_kind": "captured", + "offsets": { + "centre_0": 0.002391640344038076, + "centre_1": 0.005471319325782662, + "ell_comps_0": 0.007125369000849133, + "ell_comps_1": -0.005032810664097539, + "einstein_radius": -0.08700102338561888 + }, + "log_likelihood_vmap": 4935.957801232435, + "log_likelihood_scalar": 11735.12560234069, + "log_likelihood_library_pdip": 4935.957801232442, + "log_likelihood_library_pdip_scalar": 11735.12560234069, + "rel_diff_vmap_vs_library_pdip": 1.474072086346994e-15, + "rel_diff_scalar_vs_library_pdip_scalar": 0.0, + "abs_diff_nats": 6799.167801108255, + "rel_diff": 0.5793860271723118, + "rel_diff_scalar_vs_library_pdip": 1.3774768899787975, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 6799.167801108248, + "rel_diff_library_pdip_vmap_vs_scalar": 0.5793860271723112, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": null, + "passes": null, + "pdip_iter": null + }, + { + "lane": 37, + "draw_name": "call00016_lane17", + "draw_kind": "captured", + "offsets": { + "centre_0": 0.0026856669213289885, + "centre_1": -0.000701322842884467, + "ell_comps_0": -0.017963099482535792, + "ell_comps_1": -0.011368990220314417, + "einstein_radius": 0.1245417314838293 + }, + "log_likelihood_vmap": -10183.840812325674, + "log_likelihood_scalar": -3158.4777400105595, + "log_likelihood_library_pdip": -10183.840812322262, + "log_likelihood_library_pdip_scalar": -3158.4777400070816, + "rel_diff_vmap_vs_library_pdip": 3.3508223311219237e-13, + "rel_diff_scalar_vs_library_pdip_scalar": 1.1011341620447449e-12, + "abs_diff_nats": 7025.363072315115, + "rel_diff": 2.2242876634272646, + "rel_diff_scalar_vs_library_pdip": 0.6898539757034635, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 7025.36307231518, + "rel_diff_library_pdip_vmap_vs_scalar": 2.2242876634297346, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": null, + "passes": null, + "pdip_iter": null + }, + { + "lane": 38, + "draw_name": "call00016_lane18", + "draw_kind": "captured", + "offsets": { + "centre_0": 0.006475272480271436, + "centre_1": 0.00036104957026942186, + "ell_comps_0": 0.0058048443769378386, + "ell_comps_1": -0.006014005069002815, + "einstein_radius": -0.043358074001971 + }, + "log_likelihood_vmap": 12580.943014183555, + "log_likelihood_scalar": 18932.6926188687, + "log_likelihood_library_pdip": 12580.943028265006, + "log_likelihood_library_pdip_scalar": 18932.692618848578, + "rel_diff_vmap_vs_library_pdip": 1.1192683869084872e-09, + "rel_diff_scalar_vs_library_pdip_scalar": 1.062799739430196e-12, + "abs_diff_nats": 6351.749604685145, + "rel_diff": 0.33549108584559517, + "rel_diff_scalar_vs_library_pdip": 0.5048707061413059, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 6351.749590583571, + "rel_diff_library_pdip_vmap_vs_scalar": 0.3354910851011251, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "FAIL", + "certified": null, + "passes": null, + "pdip_iter": null + }, + { + "lane": 39, + "draw_name": "call00016_lane19", + "draw_kind": "captured", + "offsets": { + "centre_0": 0.001791290147759792, + "centre_1": -0.0026344329251194233, + "ell_comps_0": 0.006109533754666233, + "ell_comps_1": 0.004739218846482723, + "einstein_radius": 0.0525326188965729 + }, + "log_likelihood_vmap": -2591.298263703502, + "log_likelihood_scalar": -92415.29466688, + "log_likelihood_library_pdip": -2590.88352512697, + "log_likelihood_library_pdip_scalar": -92415.1359782449, + "rel_diff_vmap_vs_library_pdip": 0.0001600761178607953, + "rel_diff_scalar_vs_library_pdip_scalar": 1.7171281892290406e-06, + "abs_diff_nats": 89823.9964031765, + "rel_diff": 0.9719602878176812, + "rel_diff_scalar_vs_library_pdip": 34.66941306724741, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 89824.25245311792, + "rel_diff_library_pdip_vmap_vs_scalar": 0.9719647274474942, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "FAIL", + "certified": null, + "passes": null, + "pdip_iter": null + }, + { + "lane": 40, + "draw_name": "call00017_lane00", + "draw_kind": "captured", + "offsets": { + "centre_0": 0.00039504289511865966, + "centre_1": -0.0031177345874673803, + "ell_comps_0": -0.01319670439502501, + "ell_comps_1": -0.01412705504678942, + "einstein_radius": -0.08353374721414841 + }, + "log_likelihood_vmap": 6775.961380959467, + "log_likelihood_scalar": 13398.840222654067, + "log_likelihood_library_pdip": 6775.961380959467, + "log_likelihood_library_pdip_scalar": 13398.840222654067, + "rel_diff_vmap_vs_library_pdip": 0.0, + "rel_diff_scalar_vs_library_pdip_scalar": 0.0, + "abs_diff_nats": 6622.878841694601, + "rel_diff": 0.4942874705302463, + "rel_diff_scalar_vs_library_pdip": 0.9774079970858409, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 6622.878841694601, + "rel_diff_library_pdip_vmap_vs_scalar": 0.4942874705302463, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": null, + "passes": null, + "pdip_iter": null + }, + { + "lane": 41, + "draw_name": "call00017_lane01", + "draw_kind": "captured", + "offsets": { + "centre_0": -0.0035711364854704077, + "centre_1": 0.0013105492408737255, + "ell_comps_0": -0.00180015387363288, + "ell_comps_1": 0.0054914513398384235, + "einstein_radius": 0.0036721503557828328 + }, + "log_likelihood_vmap": 13539.215248048655, + "log_likelihood_scalar": 19660.903121941425, + "log_likelihood_library_pdip": 13539.215247391854, + "log_likelihood_library_pdip_scalar": 19660.90312195964, + "rel_diff_vmap_vs_library_pdip": 4.8510986924361186e-11, + "rel_diff_scalar_vs_library_pdip_scalar": 9.264762546316156e-13, + "abs_diff_nats": 6121.68787389277, + "rel_diff": 0.311363513462462, + "rel_diff_scalar_vs_library_pdip": 0.4521449554270755, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 6121.687874567786, + "rel_diff_library_pdip_vmap_vs_scalar": 0.3113635134965064, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": null, + "passes": null, + "pdip_iter": null + }, + { + "lane": 42, + "draw_name": "call00017_lane02", + "draw_kind": "captured", + "offsets": { + "centre_0": 0.0003080166678035941, + "centre_1": -0.0007105501404145155, + "ell_comps_0": 0.013423484811455881, + "ell_comps_1": -0.0026843168562135787, + "einstein_radius": -0.027211776311711677 + }, + "log_likelihood_vmap": 27099.012483442064, + "log_likelihood_scalar": 18324.103083947335, + "log_likelihood_library_pdip": 27099.012483026338, + "log_likelihood_library_pdip_scalar": 18324.103084286315, + "rel_diff_vmap_vs_library_pdip": 1.534101622566474e-11, + "rel_diff_scalar_vs_library_pdip_scalar": 1.8499109491360635e-11, + "abs_diff_nats": 8774.909399494729, + "rel_diff": 0.47887251885097226, + "rel_diff_scalar_vs_library_pdip": 0.3238091943230489, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 8774.909398740023, + "rel_diff_library_pdip_vmap_vs_scalar": 0.478872518800927, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": null, + "passes": null, + "pdip_iter": null + }, + { + "lane": 43, + "draw_name": "call00017_lane03", + "draw_kind": "captured", + "offsets": { + "centre_0": 0.0007755113444017845, + "centre_1": -0.0035255229487048357, + "ell_comps_0": -0.00399848580683964, + "ell_comps_1": 0.0017146502467540014, + "einstein_radius": -0.08651392214907494 + }, + "log_likelihood_vmap": -89811.75397468379, + "log_likelihood_scalar": -175043.27920898062, + "log_likelihood_library_pdip": -89812.07647228788, + "log_likelihood_library_pdip_scalar": -175043.3948294912, + "rel_diff_vmap_vs_library_pdip": 3.5908044526081896e-06, + "rel_diff_scalar_vs_library_pdip_scalar": 6.605248413233698e-07, + "abs_diff_nats": 85231.52523429683, + "rel_diff": 0.48691686775669146, + "rel_diff_scalar_vs_library_pdip": 0.9489949022945862, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 85231.31835720333, + "rel_diff_library_pdip_vmap_vs_scalar": 0.4869153642742514, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "FAIL", + "certified": null, + "passes": null, + "pdip_iter": null + }, + { + "lane": 44, + "draw_name": "call00017_lane04", + "draw_kind": "captured", + "offsets": { + "centre_0": -0.007147765623305864, + "centre_1": 0.0010457566746408338, + "ell_comps_0": 0.013576209131653673, + "ell_comps_1": -0.02008708588032471, + "einstein_radius": 0.032831422062920224 + }, + "log_likelihood_vmap": 26462.671263571254, + "log_likelihood_scalar": 13759.133270842864, + "log_likelihood_library_pdip": 26462.671263586228, + "log_likelihood_library_pdip_scalar": 13759.13327099567, + "rel_diff_vmap_vs_library_pdip": 5.658506891023602e-13, + "rel_diff_scalar_vs_library_pdip_scalar": 1.1105788484249162e-11, + "abs_diff_nats": 12703.53799272839, + "rel_diff": 0.9232803943870943, + "rel_diff_scalar_vs_library_pdip": 0.4800550128219285, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 12703.537992590558, + "rel_diff_library_pdip_vmap_vs_scalar": 0.9232803943668231, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": null, + "passes": null, + "pdip_iter": null + }, + { + "lane": 45, + "draw_name": "call00017_lane05", + "draw_kind": "captured", + "offsets": { + "centre_0": -0.001330428459324805, + "centre_1": 0.0005227443143650849, + "ell_comps_0": 0.011495347238845648, + "ell_comps_1": 0.016282146756616874, + "einstein_radius": -0.03990716965121255 + }, + "log_likelihood_vmap": 13504.069127819737, + "log_likelihood_scalar": 19903.394044774566, + "log_likelihood_library_pdip": 13504.069127758157, + "log_likelihood_library_pdip_scalar": 19903.394044773173, + "rel_diff_vmap_vs_library_pdip": 4.560111969588568e-12, + "rel_diff_scalar_vs_library_pdip_scalar": 7.000544128211301e-14, + "abs_diff_nats": 6399.324916954829, + "rel_diff": 0.3215192797047048, + "rel_diff_scalar_vs_library_pdip": 0.4738812321289395, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 6399.324917015016, + "rel_diff_library_pdip_vmap_vs_scalar": 0.32151927970775124, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": null, + "passes": null, + "pdip_iter": null + }, + { + "lane": 46, + "draw_name": "call00017_lane06", + "draw_kind": "captured", + "offsets": { + "centre_0": 0.002687443649497539, + "centre_1": -0.0019369334469605598, + "ell_comps_0": -0.015185516697078849, + "ell_comps_1": -0.012687661440239377, + "einstein_radius": 0.024820286560815807 + }, + "log_likelihood_vmap": 12905.386047434527, + "log_likelihood_scalar": 19139.565581617124, + "log_likelihood_library_pdip": 12905.386047434527, + "log_likelihood_library_pdip_scalar": 19139.565581617124, + "rel_diff_vmap_vs_library_pdip": 0.0, + "rel_diff_scalar_vs_library_pdip_scalar": 0.0, + "abs_diff_nats": 6234.179534182596, + "rel_diff": 0.32572210208210295, + "rel_diff_scalar_vs_library_pdip": 0.48306803928751085, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 6234.179534182596, + "rel_diff_library_pdip_vmap_vs_scalar": 0.32572210208210295, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": null, + "passes": null, + "pdip_iter": null + }, + { + "lane": 47, + "draw_name": "call00017_lane07", + "draw_kind": "captured", + "offsets": { + "centre_0": -0.003693907069305896, + "centre_1": 0.002094959418050611, + "ell_comps_0": -0.003985235543017392, + "ell_comps_1": -0.01016688375069693, + "einstein_radius": -0.061293935299826074 + }, + "log_likelihood_vmap": 21569.144150194, + "log_likelihood_scalar": 15503.419442060345, + "log_likelihood_library_pdip": 21569.144150175754, + "log_likelihood_library_pdip_scalar": 15503.41944204284, + "rel_diff_vmap_vs_library_pdip": 8.458594179971799e-13, + "rel_diff_scalar_vs_library_pdip_scalar": 1.1291672837188372e-12, + "abs_diff_nats": 6065.724708133654, + "rel_diff": 0.39125076443958623, + "rel_diff_scalar_vs_library_pdip": 0.2812223176720706, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 6065.724708132915, + "rel_diff_library_pdip_vmap_vs_scalar": 0.3912507644399804, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": null, + "passes": null, + "pdip_iter": null + }, + { + "lane": 48, + "draw_name": "call00017_lane08", + "draw_kind": "captured", + "offsets": { + "centre_0": 0.003201023829002854, + "centre_1": 0.0051592827552293585, + "ell_comps_0": -0.016832634529093247, + "ell_comps_1": 0.018395875062653597, + "einstein_radius": -0.023696742396298376 + }, + "log_likelihood_vmap": 22376.164810427315, + "log_likelihood_scalar": 27530.814473047358, + "log_likelihood_library_pdip": 22376.1648104272, + "log_likelihood_library_pdip_scalar": 27530.814473047285, + "rel_diff_vmap_vs_library_pdip": 5.20264856883275e-15, + "rel_diff_scalar_vs_library_pdip_scalar": 2.6428413955230423e-15, + "abs_diff_nats": 5154.649662620042, + "rel_diff": 0.18723200752620087, + "rel_diff_scalar_vs_library_pdip": 0.23036341152698847, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 5154.649662620086, + "rel_diff_library_pdip_vmap_vs_scalar": 0.18723200752620295, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": null, + "passes": null, + "pdip_iter": null + }, + { + "lane": 49, + "draw_name": "call00017_lane09", + "draw_kind": "captured", + "offsets": { + "centre_0": 2.2604383701358236e-05, + "centre_1": -0.005697104995547526, + "ell_comps_0": -0.0005169325215696047, + "ell_comps_1": 0.0010224650903271142, + "einstein_radius": -0.016159263378539013 + }, + "log_likelihood_vmap": 26250.95091871082, + "log_likelihood_scalar": -177402.91878373944, + "log_likelihood_library_pdip": 26250.952011758898, + "log_likelihood_library_pdip_scalar": -177402.92030821444, + "rel_diff_vmap_vs_library_pdip": 4.1638416693765445e-08, + "rel_diff_scalar_vs_library_pdip_scalar": 8.59329143526979e-09, + "abs_diff_nats": 203653.86970245026, + "rel_diff": 1.1479736133919627, + "rel_diff_scalar_vs_library_pdip": 7.757961338098262, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 203653.87231997334, + "rel_diff_library_pdip_vmap_vs_scalar": 1.1479736182817695, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "FAIL", + "certified": null, + "passes": null, + "pdip_iter": null + } + ], + "lane_pins": [ + { + "pin": "lane 0: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 18700.594048999716, + "reference_value": 18700.59404900047, + "rel_diff": 4.02693952445984e-14, + "abs_diff_nats": 7.530616130679846e-10, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 0: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 24758.506194309142, + "reference_value": 24758.506194309157, + "rel_diff": 5.877541687758072e-16, + "abs_diff_nats": 1.4551915228366852e-11, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 0: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 18700.594048999716, + "reference_value": 24758.506194309142, + "rel_diff": 0.24468003431894716, + "abs_diff_nats": 6057.912145309427, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 0: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 18700.59404900047, + "reference_value": 24758.506194309157, + "rel_diff": 0.2446800343189172, + "abs_diff_nats": 6057.912145308688, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 1: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 14200.214307612092, + "reference_value": 14200.214307378097, + "rel_diff": 1.647825813097488e-11, + "abs_diff_nats": 2.3399479687213898e-07, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 1: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 20551.004887772862, + "reference_value": 20551.004887772713, + "rel_diff": 7.257899645554785e-15, + "abs_diff_nats": 1.4915713109076023e-10, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 1: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 14200.214307612092, + "reference_value": 20551.004887772862, + "rel_diff": 0.3090257928914839, + "abs_diff_nats": 6350.79058016077, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 1: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 14200.214307378097, + "reference_value": 20551.004887772713, + "rel_diff": 0.30902579290286497, + "abs_diff_nats": 6350.790580394616, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 2: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -23119.316937414085, + "reference_value": -23119.464418166448, + "rel_diff": 6.379073048373394e-06, + "abs_diff_nats": 0.14748075236275326, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 2: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -189709.04191844532, + "reference_value": -189709.04904877947, + "rel_diff": 3.758563015061023e-08, + "abs_diff_nats": 0.0071303341537714005, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 2: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -23119.316937414085, + "reference_value": -189709.04191844532, + "rel_diff": 0.8781327621307954, + "abs_diff_nats": 166589.72498103124, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 2: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -23119.464418166448, + "reference_value": -189709.04904877947, + "rel_diff": 0.8781319893063099, + "abs_diff_nats": 166589.58463061304, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 3: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 18502.01091225886, + "reference_value": 18502.009653967685, + "rel_diff": 6.80083513454663e-08, + "abs_diff_nats": 0.0012582911731442437, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 3: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -141741.9662350511, + "reference_value": -141741.96606594877, + "rel_diff": 1.193029418471919e-09, + "abs_diff_nats": 0.00016910233534872532, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 3: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 18502.01091225886, + "reference_value": -141741.9662350511, + "rel_diff": 1.1305330482122486, + "abs_diff_nats": 160243.97714730995, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 3: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 18502.009653967685, + "reference_value": -141741.96606594877, + "rel_diff": 1.1305330394906417, + "abs_diff_nats": 160243.97571991646, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 4: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 18751.91028804238, + "reference_value": 18751.910288041527, + "rel_diff": 4.559135610902296e-14, + "abs_diff_nats": 8.549250196665525e-10, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 4: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 24880.54593298872, + "reference_value": 24880.545932988745, + "rel_diff": 1.023524633190512e-15, + "abs_diff_nats": 2.546585164964199e-11, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 4: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 18751.91028804238, + "reference_value": 24880.54593298872, + "rel_diff": 0.2463223942695115, + "abs_diff_nats": 6128.635644946338, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 4: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 18751.910288041527, + "reference_value": 24880.545932988745, + "rel_diff": 0.24632239426954664, + "abs_diff_nats": 6128.635644947219, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 5: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 24935.952740676803, + "reference_value": 24935.95274067806, + "rel_diff": 5.047894822163129e-14, + "abs_diff_nats": 1.2587406672537327e-09, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 5: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 25472.519186791807, + "reference_value": 25472.51918678188, + "rel_diff": 3.8975509613925874e-13, + "abs_diff_nats": 9.928044164553285e-09, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 5: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 24935.952740676803, + "reference_value": 25472.519186791807, + "rel_diff": 0.02106452220843664, + "abs_diff_nats": 536.5664461150045, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 5: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 24935.95274067806, + "reference_value": 25472.51918678188, + "rel_diff": 0.02106452220800568, + "abs_diff_nats": 536.5664461038177, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 6: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 28315.20147858392, + "reference_value": 28315.20140299416, + "rel_diff": 2.6695822808702375e-09, + "abs_diff_nats": 7.558975994470529e-05, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 6: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -83383.91554954817, + "reference_value": -83383.91545974431, + "rel_diff": 1.0769925543059859e-09, + "abs_diff_nats": 8.980385609902442e-05, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 6: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 28315.20147858392, + "reference_value": -83383.91554954817, + "rel_diff": 1.3395762994813853, + "abs_diff_nats": 111699.11702813208, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 6: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 28315.20140299416, + "reference_value": -83383.91545974431, + "rel_diff": 1.3395762989405797, + "abs_diff_nats": 111699.11686273848, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 7: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 23338.89001450443, + "reference_value": 23338.89001397335, + "rel_diff": 2.2755283557945645e-11, + "abs_diff_nats": 5.310830601956695e-07, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 7: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -11960.2844297919, + "reference_value": -11960.284429868196, + "rel_diff": 6.379086717352273e-12, + "abs_diff_nats": 7.62956915423274e-08, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 7: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 23338.89001450443, + "reference_value": -11960.2844297919, + "rel_diff": 2.9513658016668516, + "abs_diff_nats": 35299.17444429633, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 7: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 23338.89001397335, + "reference_value": -11960.284429868196, + "rel_diff": 2.9513658016099997, + "abs_diff_nats": 35299.17444384155, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 8: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 24869.037000615295, + "reference_value": 24869.037000609445, + "rel_diff": 2.352270384116649e-13, + "abs_diff_nats": 5.8498699218034744e-09, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 8: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 23223.55039149886, + "reference_value": 23223.550391489476, + "rel_diff": 4.040014203395787e-13, + "abs_diff_nats": 9.382347343489528e-09, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 8: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 24869.037000615295, + "reference_value": 23223.55039149886, + "rel_diff": 0.07085422260494582, + "abs_diff_nats": 1645.4866091164367, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 8: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 24869.037000609445, + "reference_value": 23223.550391489476, + "rel_diff": 0.07085422260512655, + "abs_diff_nats": 1645.4866091199692, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 9: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -31749.968535649372, + "reference_value": -31749.305307205344, + "rel_diff": 2.08895419162751e-05, + "abs_diff_nats": 0.6632284440274816, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 9: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -177117.77789004147, + "reference_value": -177117.69794166007, + "rel_diff": 4.5138561721102667e-07, + "abs_diff_nats": 0.07994838140439242, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 9: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -31749.968535649372, + "reference_value": -177117.77789004147, + "rel_diff": 0.8207409277946089, + "abs_diff_nats": 145367.8093543921, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 9: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -31749.305307205344, + "reference_value": -177117.69794166007, + "rel_diff": 0.8207445914430126, + "abs_diff_nats": 145368.3926344547, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 10: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 6560.779511565073, + "reference_value": 6560.779593603307, + "rel_diff": 1.2504342303062657e-08, + "abs_diff_nats": 8.203823381336406e-05, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 10: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -101745.38335529093, + "reference_value": -101745.3835211835, + "rel_diff": 1.6304676974813754e-09, + "abs_diff_nats": 0.00016589256119914353, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 10: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 6560.779511565073, + "reference_value": -101745.38335529093, + "rel_diff": 1.0644823312390999, + "abs_diff_nats": 108306.162866856, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 10: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 6560.779593603307, + "reference_value": -101745.3835211835, + "rel_diff": 1.0644823319402728, + "abs_diff_nats": 108306.1631147868, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 11: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 12667.92492649478, + "reference_value": 12667.924906617816, + "rel_diff": 1.5690780611683128e-09, + "abs_diff_nats": 1.987696305150166e-05, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 11: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 18957.528349732384, + "reference_value": 18957.528349744887, + "rel_diff": 6.59565578871598e-13, + "abs_diff_nats": 1.2503733159974217e-08, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 11: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 12667.92492649478, + "reference_value": 18957.528349732384, + "rel_diff": 0.33177338876702206, + "abs_diff_nats": 6289.603423237604, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 11: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 12667.924906617816, + "reference_value": 18957.528349744887, + "rel_diff": 0.3317733898159625, + "abs_diff_nats": 6289.603443127071, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 12: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 18842.27979675187, + "reference_value": 18842.27979674931, + "rel_diff": 1.359250105517707e-13, + "abs_diff_nats": 2.561137080192566e-09, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 12: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 24810.0496601949, + "reference_value": 24810.04966019489, + "rel_diff": 4.3989982167530276e-16, + "abs_diff_nats": 1.0913936421275139e-11, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 12: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 18842.27979675187, + "reference_value": 24810.0496601949, + "rel_diff": 0.24053840863598455, + "abs_diff_nats": 5967.769863443031, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 12: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 18842.27979674931, + "reference_value": 24810.04966019489, + "rel_diff": 0.24053840863608744, + "abs_diff_nats": 5967.769863445581, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 13: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 22879.755989109253, + "reference_value": 22879.75598922863, + "rel_diff": 5.21756598418741e-12, + "abs_diff_nats": 1.1937663657590747e-07, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 13: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -3605.706215942817, + "reference_value": -3605.7062159744455, + "rel_diff": 8.771814966158493e-12, + "abs_diff_nats": 3.162858774885535e-08, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 13: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 22879.755989109253, + "reference_value": -3605.706215942817, + "rel_diff": 7.3454298877554765, + "abs_diff_nats": 26485.46220505207, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 13: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 22879.75598922863, + "reference_value": -3605.7062159744455, + "rel_diff": 7.345429887732924, + "abs_diff_nats": 26485.462205203075, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 14: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 4357.02195028017, + "reference_value": 4357.021950280177, + "rel_diff": 1.6699382507622086e-15, + "abs_diff_nats": 7.275957614183426e-12, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 14: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 11126.921475785763, + "reference_value": 11126.921475785763, + "rel_diff": 0.0, + "abs_diff_nats": 0.0, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 14: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 4357.02195028017, + "reference_value": 11126.921475785763, + "rel_diff": 0.6084252090965273, + "abs_diff_nats": 6769.8995255055925, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 14: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 4357.021950280177, + "reference_value": 11126.921475785763, + "rel_diff": 0.6084252090965266, + "abs_diff_nats": 6769.899525505585, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 15: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 14146.464614247743, + "reference_value": 14146.464613876353, + "rel_diff": 2.6253226697734263e-11, + "abs_diff_nats": 3.713903424795717e-07, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 15: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 20410.343973720603, + "reference_value": 20410.343973722156, + "rel_diff": 7.610929794363826e-14, + "abs_diff_nats": 1.5534169506281614e-09, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 15: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 14146.464614247743, + "reference_value": 20410.343973720603, + "rel_diff": 0.3068972951919838, + "abs_diff_nats": 6263.8793594728595, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 15: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 14146.464613876353, + "reference_value": 20410.343973722156, + "rel_diff": 0.30689729521023273, + "abs_diff_nats": 6263.879359845803, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 16: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 2903.043598923672, + "reference_value": 2903.043598923672, + "rel_diff": 0.0, + "abs_diff_nats": 0.0, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 16: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 9734.862241679926, + "reference_value": 9734.86224168224, + "rel_diff": 2.3767717137315127e-13, + "abs_diff_nats": 2.3137545213103294e-09, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 16: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 2903.043598923672, + "reference_value": 9734.862241679926, + "rel_diff": 0.7017889388825393, + "abs_diff_nats": 6831.818642756254, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 16: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 2903.043598923672, + "reference_value": 9734.86224168224, + "rel_diff": 0.7017889388826103, + "abs_diff_nats": 6831.818642758568, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 17: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 13360.530937095456, + "reference_value": 13360.530937095456, + "rel_diff": 0.0, + "abs_diff_nats": 0.0, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 17: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 19481.557217641563, + "reference_value": 19481.557217641563, + "rel_diff": 0.0, + "abs_diff_nats": 0.0, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 17: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 13360.530937095456, + "reference_value": 19481.557217641563, + "rel_diff": 0.3141959450245178, + "abs_diff_nats": 6121.026280546106, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 17: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 13360.530937095456, + "reference_value": 19481.557217641563, + "rel_diff": 0.3141959450245178, + "abs_diff_nats": 6121.026280546106, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 18: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 12594.119293045376, + "reference_value": 12594.119293045376, + "rel_diff": 0.0, + "abs_diff_nats": 0.0, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 18: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 18812.946857997056, + "reference_value": 18812.946857997056, + "rel_diff": 0.0, + "abs_diff_nats": 0.0, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 18: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 12594.119293045376, + "reference_value": 18812.946857997056, + "rel_diff": 0.3305610552080077, + "abs_diff_nats": 6218.82756495168, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 18: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 12594.119293045376, + "reference_value": 18812.946857997056, + "rel_diff": 0.3305610552080077, + "abs_diff_nats": 6218.82756495168, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 19: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 10415.233658037694, + "reference_value": 10415.23365811746, + "rel_diff": 7.658620626540083e-12, + "abs_diff_nats": 7.97663233242929e-08, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 19: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 16927.632549569014, + "reference_value": 16927.63254956904, + "rel_diff": 1.5043953473748062e-15, + "abs_diff_nats": 2.546585164964199e-11, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 19: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 10415.233658037694, + "reference_value": 16927.632549569014, + "rel_diff": 0.3847200057338868, + "abs_diff_nats": 6512.39889153132, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 19: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 10415.23365811746, + "reference_value": 16927.63254956904, + "rel_diff": 0.38472000572917553, + "abs_diff_nats": 6512.398891451579, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 20: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 23125.781207506523, + "reference_value": 23125.78120750677, + "rel_diff": 1.0697262793523905e-14, + "abs_diff_nats": 2.473825588822365e-10, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 20: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 27642.80600594327, + "reference_value": 27642.806005943028, + "rel_diff": 8.686042987692048e-15, + "abs_diff_nats": 2.4010660126805305e-10, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 20: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 23125.781207506523, + "reference_value": 27642.80600594327, + "rel_diff": 0.1634068841443077, + "abs_diff_nats": 4517.024798436745, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 20: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 23125.78120750677, + "reference_value": 27642.806005943028, + "rel_diff": 0.1634068841442915, + "abs_diff_nats": 4517.024798436258, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 21: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 25204.959753670475, + "reference_value": 25204.959753667667, + "rel_diff": 1.1142726140104725e-13, + "abs_diff_nats": 2.8085196390748024e-09, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 21: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 27788.396151208093, + "reference_value": 27788.39615112006, + "rel_diff": 3.1679342231651965e-12, + "abs_diff_nats": 8.803181117400527e-08, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 21: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 25204.959753670475, + "reference_value": 27788.396151208093, + "rel_diff": 0.09296817216366422, + "abs_diff_nats": 2583.436397537618, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 21: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 25204.959753667667, + "reference_value": 27788.39615112006, + "rel_diff": 0.09296817216089187, + "abs_diff_nats": 2583.436397452395, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 22: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 11553.07472359277, + "reference_value": 11553.07472359277, + "rel_diff": 0.0, + "abs_diff_nats": 0.0, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 22: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 17852.91967933103, + "reference_value": 17852.91967933103, + "rel_diff": 0.0, + "abs_diff_nats": 0.0, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 22: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 11553.07472359277, + "reference_value": 17852.91967933103, + "rel_diff": 0.3528747716840858, + "abs_diff_nats": 6299.844955738259, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 22: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 11553.07472359277, + "reference_value": 17852.91967933103, + "rel_diff": 0.3528747716840858, + "abs_diff_nats": 6299.844955738259, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 23: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 21983.899534877724, + "reference_value": 21983.899534877615, + "rel_diff": 4.9645134176309806e-15, + "abs_diff_nats": 1.0913936421275139e-10, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 23: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 27386.085836286504, + "reference_value": 27386.08583628653, + "rel_diff": 9.298828537190872e-16, + "abs_diff_nats": 2.546585164964199e-11, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 23: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 21983.899534877724, + "reference_value": 27386.085836286504, + "rel_diff": 0.19726025594540766, + "abs_diff_nats": 5402.186301408779, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 23: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 21983.899534877615, + "reference_value": 27386.08583628653, + "rel_diff": 0.19726025594541238, + "abs_diff_nats": 5402.186301408914, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 24: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 23449.28672850131, + "reference_value": 23449.286728501065, + "rel_diff": 1.0394541330713026e-14, + "abs_diff_nats": 2.4374458007514477e-10, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 24: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 28384.90598332632, + "reference_value": 28384.905983326335, + "rel_diff": 5.126638515877007e-16, + "abs_diff_nats": 1.4551915228366852e-11, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 24: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 23449.28672850131, + "reference_value": 28384.90598332632, + "rel_diff": 0.17388182499967628, + "abs_diff_nats": 4935.619254825011, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 24: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 23449.286728501065, + "reference_value": 28384.905983326335, + "rel_diff": 0.17388182499968527, + "abs_diff_nats": 4935.619254825269, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 25: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -136892.6666871641, + "reference_value": -136892.82101562357, + "rel_diff": 1.1273670768223002e-06, + "abs_diff_nats": 0.15432845946634188, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 25: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -189785.11040523922, + "reference_value": -189785.06952934078, + "rel_diff": 2.1537994818386058e-07, + "abs_diff_nats": 0.040875898441299796, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 25: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -136892.6666871641, + "reference_value": -189785.11040523922, + "rel_diff": 0.2786964878600664, + "abs_diff_nats": 52892.44371807511, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 25: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -136892.82101562357, + "reference_value": -189785.06952934078, + "rel_diff": 0.2786955193308295, + "abs_diff_nats": 52892.248513717204, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 26: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 20216.485753679586, + "reference_value": 20216.492407061978, + "rel_diff": 3.291066648948336e-07, + "abs_diff_nats": 0.0066533823919598944, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 26: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -186990.07885292446, + "reference_value": -186990.08329202014, + "rel_diff": 2.373973847878948e-08, + "abs_diff_nats": 0.004439095675479621, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 26: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 20216.485753679586, + "reference_value": -186990.07885292446, + "rel_diff": 1.1081152854616458, + "abs_diff_nats": 207206.56460660405, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 26: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 20216.492407061978, + "reference_value": -186990.08329202014, + "rel_diff": 1.1081153184764891, + "abs_diff_nats": 207206.5756990821, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 27: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 23997.43715335727, + "reference_value": 23997.437153354946, + "rel_diff": 9.687153019198994e-14, + "abs_diff_nats": 2.3246684577316046e-09, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 27: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 27662.094569019268, + "reference_value": 27662.09456901923, + "rel_diff": 1.3151494359961256e-15, + "abs_diff_nats": 3.637978807091713e-11, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 27: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 23997.43715335727, + "reference_value": 27662.094569019268, + "rel_diff": 0.1324793900374524, + "abs_diff_nats": 3664.657415661997, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 27: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 23997.437153354946, + "reference_value": 27662.09456901923, + "rel_diff": 0.13247939003753528, + "abs_diff_nats": 3664.6574156642855, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 28: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 15428.355976304025, + "reference_value": 15428.36951848779, + "rel_diff": 8.777456198202808e-07, + "abs_diff_nats": 0.013542183765821392, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 28: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -74102.36862721092, + "reference_value": -74102.36796310006, + "rel_diff": 8.96207342969017e-09, + "abs_diff_nats": 0.0006641108629992232, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 28: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 15428.355976304025, + "reference_value": -74102.36862721092, + "rel_diff": 1.2082032769278932, + "abs_diff_nats": 89530.72460351494, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 28: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 15428.36951848779, + "reference_value": -74102.36796310006, + "rel_diff": 1.2082034615435027, + "abs_diff_nats": 89530.73748158784, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 29: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 9199.66418883179, + "reference_value": 9199.664188830415, + "rel_diff": 1.4947893323652892e-13, + "abs_diff_nats": 1.3751559890806675e-09, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 29: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 15888.26182677699, + "reference_value": 15888.261826777096, + "rel_diff": 6.640209392059121e-15, + "abs_diff_nats": 1.0550138540565968e-10, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 29: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 9199.66418883179, + "reference_value": 15888.26182677699, + "rel_diff": 0.42097730455780225, + "abs_diff_nats": 6688.5976379452, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 29: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 9199.664188830415, + "reference_value": 15888.261826777096, + "rel_diff": 0.4209773045578926, + "abs_diff_nats": 6688.597637946681, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 30: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 18699.685890165503, + "reference_value": 18699.685890304027, + "rel_diff": 7.407788550579711e-12, + "abs_diff_nats": 1.3852331903763115e-07, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 30: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -2303.2655719854956, + "reference_value": -2303.2655717178277, + "rel_diff": 1.1621236039704577e-10, + "abs_diff_nats": 2.6766792871057987e-07, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 30: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 18699.685890165503, + "reference_value": -2303.2655719854956, + "rel_diff": 9.118771069045989, + "abs_diff_nats": 21002.951462151, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 30: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 18699.685890304027, + "reference_value": -2303.2655717178277, + "rel_diff": 9.118771070049632, + "abs_diff_nats": 21002.951462021854, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 31: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 13020.244793610349, + "reference_value": 13020.244793610349, + "rel_diff": 0.0, + "abs_diff_nats": 0.0, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 31: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 19182.855515516767, + "reference_value": 19182.855515516767, + "rel_diff": 0.0, + "abs_diff_nats": 0.0, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 31: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 13020.244793610349, + "reference_value": 19182.855515516767, + "rel_diff": 0.32125617152887176, + "abs_diff_nats": 6162.610721906418, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 31: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 13020.244793610349, + "reference_value": 19182.855515516767, + "rel_diff": 0.32125617152887176, + "abs_diff_nats": 6162.610721906418, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 32: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 20526.007408480735, + "reference_value": 20526.007408406545, + "rel_diff": 3.614404902856882e-12, + "abs_diff_nats": 7.41893018130213e-08, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 32: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 25770.8125705254, + "reference_value": 25770.812570514885, + "rel_diff": 4.0797156565114053e-13, + "abs_diff_nats": 1.051375875249505e-08, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 32: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 20526.007408480735, + "reference_value": 25770.8125705254, + "rel_diff": 0.20351725998904877, + "abs_diff_nats": 5244.805162044664, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 32: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 20526.007408406545, + "reference_value": 25770.812570514885, + "rel_diff": 0.20351725999160264, + "abs_diff_nats": 5244.80516210834, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 33: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 9476.34754314409, + "reference_value": 9476.347543144097, + "rel_diff": 7.678018963590462e-16, + "abs_diff_nats": 7.275957614183426e-12, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 33: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 15902.910586796046, + "reference_value": 15902.910586796046, + "rel_diff": 0.0, + "abs_diff_nats": 0.0, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 33: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 9476.34754314409, + "reference_value": 15902.910586796046, + "rel_diff": 0.4041123798424571, + "abs_diff_nats": 6426.563043651957, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 33: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 9476.347543144097, + "reference_value": 15902.910586796046, + "rel_diff": 0.4041123798424567, + "abs_diff_nats": 6426.56304365195, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 34: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 23033.79075623095, + "reference_value": 23033.79321236343, + "rel_diff": 1.0663169804366194e-07, + "abs_diff_nats": 0.0024561324826208875, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 34: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -130304.42436466076, + "reference_value": -130304.42384542034, + "rel_diff": 3.984825727486374e-09, + "abs_diff_nats": 0.00051924042054452, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 34: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 23033.79075623095, + "reference_value": -130304.42436466076, + "rel_diff": 1.1767690611315715, + "abs_diff_nats": 153338.21512089172, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 34: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 23033.79321236343, + "reference_value": -130304.42384542034, + "rel_diff": 1.1767690806851525, + "abs_diff_nats": 153338.21705778377, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 35: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 12436.966956375636, + "reference_value": 12436.966956375622, + "rel_diff": 1.1700533803305664e-15, + "abs_diff_nats": 1.4551915228366852e-11, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 35: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 18757.07135333741, + "reference_value": 18757.071353384385, + "rel_diff": 2.504313251902869e-12, + "abs_diff_nats": 4.69735823571682e-08, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 35: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 12436.966956375636, + "reference_value": 18757.07135333741, + "rel_diff": 0.3369451593964988, + "abs_diff_nats": 6320.104396961775, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 35: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 12436.966956375622, + "reference_value": 18757.071353384385, + "rel_diff": 0.33694515939816005, + "abs_diff_nats": 6320.104397008763, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 36: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 4935.957801232435, + "reference_value": 4935.957801232442, + "rel_diff": 1.474072086346994e-15, + "abs_diff_nats": 7.275957614183426e-12, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 36: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 11735.12560234069, + "reference_value": 11735.12560234069, + "rel_diff": 0.0, + "abs_diff_nats": 0.0, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 36: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 4935.957801232435, + "reference_value": 11735.12560234069, + "rel_diff": 0.5793860271723118, + "abs_diff_nats": 6799.167801108255, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 36: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 4935.957801232442, + "reference_value": 11735.12560234069, + "rel_diff": 0.5793860271723112, + "abs_diff_nats": 6799.167801108248, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 37: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -10183.840812325674, + "reference_value": -10183.840812322262, + "rel_diff": 3.3508223311219237e-13, + "abs_diff_nats": 3.4124241210520267e-09, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 37: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -3158.4777400105595, + "reference_value": -3158.4777400070816, + "rel_diff": 1.1011341620447449e-12, + "abs_diff_nats": 3.4779077395796776e-09, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 37: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -10183.840812325674, + "reference_value": -3158.4777400105595, + "rel_diff": 2.2242876634272646, + "abs_diff_nats": 7025.363072315115, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 37: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -10183.840812322262, + "reference_value": -3158.4777400070816, + "rel_diff": 2.2242876634297346, + "abs_diff_nats": 7025.36307231518, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 38: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 12580.943014183555, + "reference_value": 12580.943028265006, + "rel_diff": 1.1192683869084872e-09, + "abs_diff_nats": 1.4081451809033751e-05, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 38: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 18932.6926188687, + "reference_value": 18932.692618848578, + "rel_diff": 1.062799739430196e-12, + "abs_diff_nats": 2.0121660782024264e-08, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 38: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 12580.943014183555, + "reference_value": 18932.6926188687, + "rel_diff": 0.33549108584559517, + "abs_diff_nats": 6351.749604685145, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 38: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 12580.943028265006, + "reference_value": 18932.692618848578, + "rel_diff": 0.3354910851011251, + "abs_diff_nats": 6351.749590583571, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 39: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -2591.298263703502, + "reference_value": -2590.88352512697, + "rel_diff": 0.0001600761178607953, + "abs_diff_nats": 0.41473857653181767, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 39: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -92415.29466688, + "reference_value": -92415.1359782449, + "rel_diff": 1.7171281892290406e-06, + "abs_diff_nats": 0.15868863509967923, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 39: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -2591.298263703502, + "reference_value": -92415.29466688, + "rel_diff": 0.9719602878176812, + "abs_diff_nats": 89823.9964031765, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 39: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -2590.88352512697, + "reference_value": -92415.1359782449, + "rel_diff": 0.9719647274474942, + "abs_diff_nats": 89824.25245311792, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 40: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 6775.961380959467, + "reference_value": 6775.961380959467, + "rel_diff": 0.0, + "abs_diff_nats": 0.0, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 40: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 13398.840222654067, + "reference_value": 13398.840222654067, + "rel_diff": 0.0, + "abs_diff_nats": 0.0, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 40: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 6775.961380959467, + "reference_value": 13398.840222654067, + "rel_diff": 0.4942874705302463, + "abs_diff_nats": 6622.878841694601, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 40: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 6775.961380959467, + "reference_value": 13398.840222654067, + "rel_diff": 0.4942874705302463, + "abs_diff_nats": 6622.878841694601, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 41: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 13539.215248048655, + "reference_value": 13539.215247391854, + "rel_diff": 4.8510986924361186e-11, + "abs_diff_nats": 6.568006938323379e-07, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 41: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 19660.903121941425, + "reference_value": 19660.90312195964, + "rel_diff": 9.264762546316156e-13, + "abs_diff_nats": 1.8215359887108207e-08, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 41: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 13539.215248048655, + "reference_value": 19660.903121941425, + "rel_diff": 0.311363513462462, + "abs_diff_nats": 6121.68787389277, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 41: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 13539.215247391854, + "reference_value": 19660.90312195964, + "rel_diff": 0.3113635134965064, + "abs_diff_nats": 6121.687874567786, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 42: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 27099.012483442064, + "reference_value": 27099.012483026338, + "rel_diff": 1.534101622566474e-11, + "abs_diff_nats": 4.157263902015984e-07, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 42: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 18324.103083947335, + "reference_value": 18324.103084286315, + "rel_diff": 1.8499109491360635e-11, + "abs_diff_nats": 3.3897958928719163e-07, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 42: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 27099.012483442064, + "reference_value": 18324.103083947335, + "rel_diff": 0.47887251885097226, + "abs_diff_nats": 8774.909399494729, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 42: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 27099.012483026338, + "reference_value": 18324.103084286315, + "rel_diff": 0.478872518800927, + "abs_diff_nats": 8774.909398740023, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 43: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -89811.75397468379, + "reference_value": -89812.07647228788, + "rel_diff": 3.5908044526081896e-06, + "abs_diff_nats": 0.32249760409467854, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 43: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -175043.27920898062, + "reference_value": -175043.3948294912, + "rel_diff": 6.605248413233698e-07, + "abs_diff_nats": 0.11562051059445366, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 43: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -89811.75397468379, + "reference_value": -175043.27920898062, + "rel_diff": 0.48691686775669146, + "abs_diff_nats": 85231.52523429683, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 43: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -89812.07647228788, + "reference_value": -175043.3948294912, + "rel_diff": 0.4869153642742514, + "abs_diff_nats": 85231.31835720333, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 44: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 26462.671263571254, + "reference_value": 26462.671263586228, + "rel_diff": 5.658506891023602e-13, + "abs_diff_nats": 1.497392076998949e-08, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 44: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 13759.133270842864, + "reference_value": 13759.13327099567, + "rel_diff": 1.1105788484249162e-11, + "abs_diff_nats": 1.5280602383427322e-07, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 44: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 26462.671263571254, + "reference_value": 13759.133270842864, + "rel_diff": 0.9232803943870943, + "abs_diff_nats": 12703.53799272839, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 44: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 26462.671263586228, + "reference_value": 13759.13327099567, + "rel_diff": 0.9232803943668231, + "abs_diff_nats": 12703.537992590558, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 45: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 13504.069127819737, + "reference_value": 13504.069127758157, + "rel_diff": 4.560111969588568e-12, + "abs_diff_nats": 6.158006726764143e-08, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 45: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 19903.394044774566, + "reference_value": 19903.394044773173, + "rel_diff": 7.000544128211301e-14, + "abs_diff_nats": 1.393345883116126e-09, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 45: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 13504.069127819737, + "reference_value": 19903.394044774566, + "rel_diff": 0.3215192797047048, + "abs_diff_nats": 6399.324916954829, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 45: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 13504.069127758157, + "reference_value": 19903.394044773173, + "rel_diff": 0.32151927970775124, + "abs_diff_nats": 6399.324917015016, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 46: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 12905.386047434527, + "reference_value": 12905.386047434527, + "rel_diff": 0.0, + "abs_diff_nats": 0.0, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 46: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 19139.565581617124, + "reference_value": 19139.565581617124, + "rel_diff": 0.0, + "abs_diff_nats": 0.0, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 46: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 12905.386047434527, + "reference_value": 19139.565581617124, + "rel_diff": 0.32572210208210295, + "abs_diff_nats": 6234.179534182596, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 46: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 12905.386047434527, + "reference_value": 19139.565581617124, + "rel_diff": 0.32572210208210295, + "abs_diff_nats": 6234.179534182596, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 47: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 21569.144150194, + "reference_value": 21569.144150175754, + "rel_diff": 8.458594179971799e-13, + "abs_diff_nats": 1.824446371756494e-08, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 47: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 15503.419442060345, + "reference_value": 15503.41944204284, + "rel_diff": 1.1291672837188372e-12, + "abs_diff_nats": 1.7505954019725323e-08, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 47: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 21569.144150194, + "reference_value": 15503.419442060345, + "rel_diff": 0.39125076443958623, + "abs_diff_nats": 6065.724708133654, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 47: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 21569.144150175754, + "reference_value": 15503.41944204284, + "rel_diff": 0.3912507644399804, + "abs_diff_nats": 6065.724708132915, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 48: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 22376.164810427315, + "reference_value": 22376.1648104272, + "rel_diff": 5.20264856883275e-15, + "abs_diff_nats": 1.1641532182693481e-10, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 48: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 27530.814473047358, + "reference_value": 27530.814473047285, + "rel_diff": 2.6428413955230423e-15, + "abs_diff_nats": 7.275957614183426e-11, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 48: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 22376.164810427315, + "reference_value": 27530.814473047358, + "rel_diff": 0.18723200752620087, + "abs_diff_nats": 5154.649662620042, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 48: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 22376.1648104272, + "reference_value": 27530.814473047285, + "rel_diff": 0.18723200752620295, + "abs_diff_nats": 5154.649662620086, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 49: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 26250.95091871082, + "reference_value": 26250.952011758898, + "rel_diff": 4.1638416693765445e-08, + "abs_diff_nats": 0.0010930480784736574, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 49: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -177402.91878373944, + "reference_value": -177402.92030821444, + "rel_diff": 8.59329143526979e-09, + "abs_diff_nats": 0.001524474995676428, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 49: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 26250.95091871082, + "reference_value": -177402.91878373944, + "rel_diff": 1.1479736133919627, + "abs_diff_nats": 203653.86970245026, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 49: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 26250.952011758898, + "reference_value": -177402.92030821444, + "rel_diff": 1.1479736182817695, + "abs_diff_nats": 203653.87231997334, + "within_rtol": false, + "status": "RECORDED" + } + ], + "lanes_failed": 14, + "arm_rows": { + "vmap": { + "arm": "vmap", + "program": "jax.jit(jax.vmap(fn))", + "stands_for": "Nautilus(use_jax_vmap=True) \u2014 Fitness._vmap", + "hlo_source": "jax.jit(jax.vmap(fn)).lower(batched_tree) \u2014 the exact current Fitness._vmap composition (PyAutoFit#1638)", + "batch_wall_ms": 1631.2400945000263, + "wall_production_nesting_ms": 1631.2400945000263, + "wall_aot_command_buffers_on_ms": 1635.791891700137, + "wall_aot_command_buffers_off_ms": 1639.0278569000657, + "command_buffer_delta_ms": 3.2359651999286143, + "production_nesting_vs_aot_on_delta_ms": -4.551797200110741, + "production_nesting_vs_aot_on_delta_pct": -0.27826260927237484, + "wall_per_lane_ms": 32.624801890000526, + "wall_per_lane_command_buffers_off_ms": 32.78055713800131, + "traced_batch_wall_ms": 1660.119595100332, + "untraced_batch_wall_ms": 1640.3460579000239, + "traced_wall_per_lane_ms": 33.20239190200664, + "callback_count_per_call": 50.0, + "callback_count_per_lane": 1.0, + "callback_expectation": "B per batched call \u2014 the qhull pure_callback is vmap_method='sequential'", + "host_qhull_ms": 224.54846200089378, + "host_tables_ms": 5.621927292668261, + "host_qhull_ms_per_lane": 4.490969240017876, + "host_tables_ms_per_lane": 0.11243854585336521, + "host_callback_probe": { + "calls": 500, + "qhull_ms_total": 2245.484620008938, + "tables_ms_total": 56.219272926682606, + "total_ms_total": 2301.7038929356204, + "qhull_ms_mean": 4.490969240017876, + "tables_ms_mean": 0.11243854585336521, + "total_ms_mean": 4.603407785871241, + "non_finite_calls": 0, + "n_points": [ + 1500 + ] + }, + "host_callback_records_first": [ + { + "n_points": 1500, + "qhull_ms": 4.815570002392633, + "tables_ms": 0.17441899763070978, + "total_ms": 4.989989000023343, + "finite": true + }, + { + "n_points": 1500, + "qhull_ms": 4.503602998738643, + "tables_ms": 0.10974000178975984, + "total_ms": 4.613343000528403, + "finite": true + }, + { + "n_points": 1500, + "qhull_ms": 4.537831999186892, + "tables_ms": 0.10903899965342134, + "total_ms": 4.646870998840313, + "finite": true + }, + { + "n_points": 1500, + "qhull_ms": 4.560370998660801, + "tables_ms": 0.1078710010915529, + "total_ms": 4.668241999752354, + "finite": true + } + ], + "device_idle_ms": 273.92656809999994, + "device_idle_ms_per_lane": 5.478531361999999, + "trace": { + "parser": "ProfileData.from_file(xplane) + as_text() + stack_frame_index(proto field 17)", + "stage_audit": { + "chi_squared_evidence": [ + { + "instruction": "input_reduce_fusion.18", + "ms": 0.0098466, + "opcode": "fusion", + "shape": "f64[92,50]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_util.py:90", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_util.py:90 (chi_squared_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:87 (AbstractFit.chi_squared)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:293 (FitDataset.chi_squared)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:345 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)" + ] + }, + { + "instruction": "input_reduce_fusion.44", + "ms": 0.0040127999999999995, + "opcode": "fusion", + "shape": "f64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_util.py:104", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_util.py:104 (noise_normalization_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:98 (AbstractFit.noise_normalization)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:306 (FitDataset.noise_normalization)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:349 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)" + ] + }, + { + "instruction": "input_reduce_fusion.46", + "ms": 0.0028928, + "opcode": "fusion", + "shape": "f64[50]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_util.py:90", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_util.py:90 (chi_squared_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:87 (AbstractFit.chi_squared)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:293 (FitDataset.chi_squared)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:345 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)" + ] + } + ], + "psf_convolution_mapping_matrix": [ + { + "instruction": "input_scatter_fusion", + "ms": 101.0336657, + "opcode": "fusion", + "shape": "f64[50,1500,180,180]{3,2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "fft.25.0", + "ms": 76.3287065, + "opcode": "fft", + "shape": "c128[50,1500,180,91]{3,2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "fft.27.0", + "ms": 48.963247800000005, + "opcode": "fft", + "shape": "c128[50,1500,91,180]{3,2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "fft.29.0", + "ms": 47.28036060000001, + "opcode": "fft", + "shape": "f64[50,1500,180,180]{3,2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "input_transpose_fusion.2", + "ms": 26.349922799999998, + "opcode": "fusion", + "shape": "c128[50,1500,91,180]{3,2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "wrapped_transpose", + "ms": 24.726837399999997, + "opcode": "fusion", + "shape": "c128[50,1500,180,91]{3,2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + } + ], + "mapping_matrix": [ + { + "instruction": "loop_broadcast_fusion.7", + "ms": 5.665904800000001, + "opcode": "fusion", + "shape": "f64[15361,50,1500]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:353", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:353 (mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/abstract.py:283 (Mapper.mapping_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:91 (AbstractInversionImaging._mapping_matrix_for_convolution_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:137 (AbstractInversionImaging.operated_mapping_matrix_list)" + ] + }, + { + "instruction": "input_scatter_fusion.3", + "ms": 0.1389135, + "opcode": "fusion", + "shape": "f64[50,1500]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:71", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:71 (adaptive_pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/abstract.py:507 (Mapper.pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt.py:339 (Adapt.regularization_weights_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt_split.py:120 (AdaptSplit.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)" + ] + }, + { + "instruction": "loop_divide_fusion", + "ms": 0.0040545, + "opcode": "fusion", + "shape": "f64[50,1500]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:92", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:92 (adaptive_pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/abstract.py:507 (Mapper.pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt.py:339 (Adapt.regularization_weights_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt_split.py:120 (AdaptSplit.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)" + ] + }, + { + "instruction": "input_reduce_fusion.47", + "ms": 0.0038560999999999995, + "opcode": "fusion", + "shape": "f64[50]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:93", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:93 (adaptive_pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/abstract.py:507 (Mapper.pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt.py:339 (Adapt.regularization_weights_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt_split.py:120 (AdaptSplit.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)" + ] + }, + { + "instruction": "loop_and_fusion.2", + "ms": 0.0020992000000000003, + "opcode": "fusion", + "shape": "pred[46083,1]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:338", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:338 (mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/abstract.py:283 (Mapper.mapping_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:91 (AbstractInversionImaging._mapping_matrix_for_convolution_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:137 (AbstractInversionImaging.operated_mapping_matrix_list)" + ] + } + ], + "other": [ + { + "instruction": "copy.107", + "ms": 0.10212330000000037, + "opcode": "copy", + "shape": "s32[1,3000,3]{2,1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "copy.108", + "ms": 0.10080099999999997, + "opcode": "copy", + "shape": "s32[1,3000,3]{2,1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "copy.109", + "ms": 0.1006061000000001, + "opcode": "copy", + "shape": "f64[1,1500,2]{2,1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "copy.106", + "ms": 0.09933850000000043, + "opcode": "copy", + "shape": "s32[1,1500]{1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "copy.105", + "ms": 0.05873000000000005, + "opcode": "copy", + "shape": "f64[1,50,1024,2]{3,2,1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "loop_broadcast_fusion.6", + "ms": 0.0048384, + "opcode": "fusion", + "shape": "(pred[50,21361]{1,0}, pred[50,21361]{1,0})", + "source": "", + "stack": [] + } + ], + "mesh_qhull_callback": [ + { + "instruction": "pure_callback.0", + "ms": 0.5385581999999985, + "opcode": "custom-call", + "shape": "(s32[3000,3]{1,0}, s32[3000,3]{1,0}, s32[1500]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:161", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:161 (_jax_delaunay_tables)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:405 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + }, + { + "instruction": "loop_add_fusion.1", + "ms": 0.0763971999999998, + "opcode": "fusion", + "shape": "s64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:161", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:161 (_jax_delaunay_tables)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:405 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + }, + { + "instruction": "loop_broadcast_fusion.3", + "ms": 0.0022594, + "opcode": "fusion", + "shape": "s32[50,1500]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:161", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:161 (_jax_delaunay_tables)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:405 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + } + ], + "mixed_fusion": [ + { + "instruction": "loop_divide_gather_fusion", + "ms": 54.805799500000006, + "opcode": "fusion", + "shape": "(f64[15361,50,1,1,1500]{4,3,2,1,0}, f64[15361,50,1,1,1500]{4,3,2,1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:133", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:133 (curvature_matrix_via_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:93 (InversionImagingMapping.curvature_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:389 (AbstractInversion.curvature_reg_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "input_add_multiply_transpose_fusion", + "ms": 5.1975917, + "opcode": "fusion", + "shape": "(f64[50,1500,1500]{2,1,0}, f64[50,1500,1500]{2,1,0}, f64[50,1500,1500]{2,1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:61", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:61 (initialize)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:72 (solve_nnls)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:129 (_solve_nnls_primal_with..primal)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:164 (solve_nnls_primal_with_status)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:508 (reconstruction_positive_only_from)" + ] + }, + { + "instruction": "input_transpose_fusion.3", + "ms": 1.4619218, + "opcode": "fusion", + "shape": "f64[50,1500,1500]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986 (AbstractInversion._log_det_symmetric_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:1157 (AbstractInversion.log_det_regularization_matrix_term)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:348 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/model/analysis.py:135 (AnalysisImaging.log_likelihood_function)" + ] + }, + { + "instruction": "input_scatter_fusion.1", + "ms": 0.4247018, + "opcode": "fusion", + "shape": "f64[50,1500,1500]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:579", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:579 (pixel_splitted_regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt_split.py:137 (AdaptSplit.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:332 (AbstractInversion.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "input_scatter_fusion.6", + "ms": 0.20282440000000002, + "opcode": "fusion", + "shape": "f64[15361,50,1500]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:353", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:353 (mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/abstract.py:283 (Mapper.mapping_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:91 (AbstractInversionImaging._mapping_matrix_for_convolution_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:137 (AbstractInversionImaging.operated_mapping_matrix_list)" + ] + }, + { + "instruction": "input_scatter_fusion.2", + "ms": 0.1654833, + "opcode": "fusion", + "shape": "f64[50,1500]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:70", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:70 (adaptive_pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/abstract.py:507 (Mapper.pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt.py:339 (Adapt.regularization_weights_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt_split.py:120 (AdaptSplit.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)" + ] + } + ], + "ray_trace_data_grid": [ + { + "instruction": "input_reduce_fusion.29", + "ms": 0.0028384, + "opcode": "fusion", + "shape": "f64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:506", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:506 (FlatLambdaCDM._simpson_1d)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:644 (FlatLambdaCDM.angular_diameter_distance_kpc_z1z2)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:133 (LensingCosmology.angular_diameter_distance_to_earth_in_kpc_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:362 (LensingCosmology.scaling_factor_between_redshifts_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/lens/tracer_util.py:252 (traced_grid_2d_list_from)" + ] + }, + { + "instruction": "input_reduce_fusion.31", + "ms": 0.0028255999999999997, + "opcode": "fusion", + "shape": "f64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:506", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:506 (FlatLambdaCDM._simpson_1d)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:644 (FlatLambdaCDM.angular_diameter_distance_kpc_z1z2)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:151 (LensingCosmology.angular_diameter_distance_between_redshifts_in_kpc_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:355 (LensingCosmology.scaling_factor_between_redshifts_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/lens/tracer_util.py:252 (traced_grid_2d_list_from)" + ] + }, + { + "instruction": "input_reduce_fusion.30", + "ms": 0.0026688, + "opcode": "fusion", + "shape": "f64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:503", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:503 (FlatLambdaCDM._simpson_1d)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:644 (FlatLambdaCDM.angular_diameter_distance_kpc_z1z2)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:133 (LensingCosmology.angular_diameter_distance_to_earth_in_kpc_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:362 (LensingCosmology.scaling_factor_between_redshifts_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/lens/tracer_util.py:252 (traced_grid_2d_list_from)" + ] + }, + { + "instruction": "input_reduce_fusion.32", + "ms": 0.0026271999999999997, + "opcode": "fusion", + "shape": "f64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:503", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:503 (FlatLambdaCDM._simpson_1d)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:644 (FlatLambdaCDM.angular_diameter_distance_kpc_z1z2)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:151 (LensingCosmology.angular_diameter_distance_between_redshifts_in_kpc_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:355 (LensingCosmology.scaling_factor_between_redshifts_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/lens/tracer_util.py:252 (traced_grid_2d_list_from)" + ] + }, + { + "instruction": "loop_divide_fusion.1", + "ms": 0.0024672, + "opcode": "fusion", + "shape": "f64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:380", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:380 (LensingCosmology.scaling_factor_between_redshifts_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/lens/tracer_util.py:252 (traced_grid_2d_list_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/lens/tracer.py:632 (Tracer.traced_grid_2d_list_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/structures/decorators/abstract.py:93 (AbstractMaker.evaluate_func)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/structures/decorators/abstract.py:110 (AbstractMaker.result)" + ] + } + ], + "border_relocator": [ + { + "instruction": "custom-call.2", + "ms": 0.043046600000000004, + "opcode": "custom-call", + "shape": "(f64[50,2,2]{2,1,0}, s8[4194304]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:242", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:242 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:454 (BorderRelocator.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:176 (AbstractMesh.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:214 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "loop_add_rsqrt_fusion", + "ms": 0.0196705, + "opcode": "fusion", + "shape": "(f64[50,15361]{1,0}, f64[50,15361]{1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:311", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:311 (relocated_grid_via_ellipse_border_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:423 (BorderRelocator.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:83 (AbstractMesh.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:208 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "eigh.36", + "ms": 0.014928299999999999, + "opcode": "custom-call", + "shape": "(f64[50,2,2]{1,2,0}, f64[50,2]{1,0}, s32[50]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:245", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:245 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:454 (BorderRelocator.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:176 (AbstractMesh.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:214 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "input_concatenate_fusion.7", + "ms": 0.013673699999999999, + "opcode": "fusion", + "shape": "f64[50,15361,2]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:323", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:323 (relocated_grid_via_ellipse_border_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:423 (BorderRelocator.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:83 (AbstractMesh.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:208 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "loop_add_rsqrt_fusion.1", + "ms": 0.003971199999999999, + "opcode": "fusion", + "shape": "(f64[50,1500]{1,0}, f64[50,1500]{1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:311", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:311 (relocated_grid_via_ellipse_border_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:458 (BorderRelocator.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:176 (AbstractMesh.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:214 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "loop_cosine_sine_fusion", + "ms": 0.0038721, + "opcode": "fusion", + "shape": "(f64[50]{0}, f64[50]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:301", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:301 (relocated_grid_via_ellipse_border_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:458 (BorderRelocator.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:176 (AbstractMesh.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:214 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + } + ], + "mesh_locate_walk": [ + { + "instruction": "loop_reduce_fusion", + "ms": 0.5966102000000001, + "opcode": "fusion", + "shape": "(f64[50,21361]{1,0}, s64[50,21361]{1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:264", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:264 (_walk_from_seed..walk_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:292 (_walk_from_seed..body)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:264 (_walk_from_seed..walk_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:292 (_walk_from_seed..body)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)" + ] + }, + { + "instruction": "loop_slice_subtract_fusion", + "ms": 0.5114101000000002, + "opcode": "fusion", + "shape": "(f64[50,21361,1]{2,1,0}, f64[50,21361,1]{2,1,0}, f64[50,21361,1]{2,1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:236", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:236 (_walk_from_seed..cross)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:250 (_walk_from_seed..weights_of)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:262 (_walk_from_seed..walk_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:292 (_walk_from_seed..body)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)" + ] + }, + { + "instruction": "loop_select_fusion", + "ms": 0.23996750000000003, + "opcode": "fusion", + "shape": "(pred[50,21361]{1,0}, pred[50,21361]{1,0}, s32[50,21361]{1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:353 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "loop_gather_fusion.1", + "ms": 0.16270249999999997, + "opcode": "fusion", + "shape": "s32[1068050,1,1,3]{3,2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:239", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:239 (_walk_from_seed..weights_of)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:262 (_walk_from_seed..walk_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:292 (_walk_from_seed..body)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:353 (pix_indexes_delaunay_walk_from)" + ] + }, + { + "instruction": "loop_gather_fusion", + "ms": 0.14548350000000007, + "opcode": "fusion", + "shape": "s32[1068050,1,1,1]{3,2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:267", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:267 (_walk_from_seed..walk_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:292 (_walk_from_seed..body)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:353 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)" + ] + }, + { + "instruction": "input_concatenate_fusion", + "ms": 0.0859146, + "opcode": "fusion", + "shape": "s32[50,21361,2]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:242", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:242 (_walk_from_seed..weights_of)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:262 (_walk_from_seed..walk_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:292 (_walk_from_seed..body)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:353 (pix_indexes_delaunay_walk_from)" + ] + } + ], + "mesh_construction": [ + { + "instruction": "loop_compare_fusion.4", + "ms": 0.0110433, + "opcode": "fusion", + "shape": "pred[50,15361,3]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:732", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:732 (DelaunayInterface.sizes)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:958 (InterpolatorDelaunay._mappings_sizes_weights)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/abstract.py:36 (AbstractInterpolator.mappings)" + ] + }, + { + "instruction": "loop_compare_fusion.5", + "ms": 0.0068769, + "opcode": "fusion", + "shape": "pred[50,6000,3]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:736", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:736 (DelaunayInterface.splitted_sizes)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:997 (InterpolatorDelaunay._mappings_sizes_weights_split)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt_split.py:124 (AdaptSplit.regularization_matrix_from)" + ] + }, + { + "instruction": "loop_transpose_fusion.1", + "ms": 0.0030465, + "opcode": "fusion", + "shape": "f64[50,1500,2]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:820", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:820 (InterpolatorDelaunay.mesh_grid_xy)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:847 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + }, + { + "instruction": "loop_multiply_fusion.4", + "ms": 0.0028191999999999996, + "opcode": "fusion", + "shape": "f64[50,1500]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:412", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:412 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "mesh_seed_argmin": [ + { + "instruction": "input_reduce_fusion", + "ms": 3.9399414000000013, + "opcode": "fusion", + "shape": "(f64[50,1024]{1,0}, s64[50,1024]{1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:191", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:191 (_nearest_vertex_seed_from..argmin_chunk)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204 (_nearest_vertex_seed_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:351 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)" + ] + }, + { + "instruction": "loop_dynamic_update_slice_fusion", + "ms": 0.05092849999999988, + "opcode": "fusion", + "shape": "s32[21,50,1024]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204 (_nearest_vertex_seed_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:351 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "loop_add_fusion", + "ms": 0.03184979999999993, + "opcode": "fusion", + "shape": "s64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204 (_nearest_vertex_seed_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:351 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "loop_broadcast_fusion.4", + "ms": 0.0039809, + "opcode": "fusion", + "shape": "s32[21,50,1024]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204 (_nearest_vertex_seed_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:351 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "mesh_dual_areas": [ + { + "instruction": "input_scatter_fusion.9", + "ms": 0.0051521, + "opcode": "fusion", + "shape": "f64[50,1500]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:393", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:393 (_dual_areas_padded_jnp)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:408 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + }, + { + "instruction": "input_scatter_fusion.7", + "ms": 0.005110600000000002, + "opcode": "fusion", + "shape": "f64[50,1500]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:393", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:393 (_dual_areas_padded_jnp)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:408 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + } + ], + "regularization_H": [ + { + "instruction": "loop_broadcast_fusion", + "ms": 0.9053372000000002, + "opcode": "fusion", + "shape": "f64[50,1500,1500]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:579", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:579 (pixel_splitted_regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt_split.py:137 (AdaptSplit.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:332 (AbstractInversion.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "input_scatter_fusion.10", + "ms": 0.008848199999999999, + "opcode": "fusion", + "shape": "f64[50,1500,1500]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:615", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:615 (pixel_splitted_regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt_split.py:137 (AdaptSplit.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:332 (AbstractInversion.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "curvature_matrix_F": [ + { + "instruction": "cublas-lt-matmul.2", + "ms": 220.05394200000003, + "opcode": "custom-call", + "shape": "(f64[50,1500,1500]{2,1,0}, s8[4194304]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:134", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:134 (curvature_matrix_via_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:93 (InversionImagingMapping.curvature_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:389 (AbstractInversion.curvature_reg_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "inversion_other": [ + { + "instruction": "cholesky.66", + "ms": 15.32045429999997, + "opcode": "custom-call", + "shape": "(f64[50,1500,1500]{1,2,0}, s32[50]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986 (AbstractInversion._log_det_symmetric_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:1078 (AbstractInversion.log_det_curvature_reg_matrix_term)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:347 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/model/analysis.py:135 (AnalysisImaging.log_likelihood_function)" + ] + }, + { + "instruction": "cholesky.77", + "ms": 14.939852699999955, + "opcode": "custom-call", + "shape": "(f64[50,1500,1500]{1,2,0}, s32[50]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986 (AbstractInversion._log_det_symmetric_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:1157 (AbstractInversion.log_det_regularization_matrix_term)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:348 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/model/analysis.py:135 (AnalysisImaging.log_likelihood_function)" + ] + }, + { + "instruction": "input_reduce_fusion.27", + "ms": 0.5269170999999999, + "opcode": "fusion", + "shape": "f64[50,1500]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:946", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:946 (AbstractInversion.regularization_term)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:346 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/model/analysis.py:135 (AnalysisImaging.log_likelihood_function)", + "/mnt/ral/jnightin/autolens_profiling_wt/certified-solver-phase-c1-lane-rate/scripts/imaging/likelihood_breakdown/fixed_light_trace.py:1195 (_captured_likelihood_fn.._likelihood)" + ] + }, + { + "instruction": "input_reduce_fusion.21", + "ms": 0.007811199999999999, + "opcode": "fusion", + "shape": "f64[50]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:985", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:985 (AbstractInversion._log_det_symmetric_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:1157 (AbstractInversion.log_det_regularization_matrix_term)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:348 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/model/analysis.py:135 (AnalysisImaging.log_likelihood_function)" + ] + }, + { + "instruction": "input_reduce_fusion.22", + "ms": 0.0078048, + "opcode": "fusion", + "shape": "f64[50]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:985", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:985 (AbstractInversion._log_det_symmetric_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:1078 (AbstractInversion.log_det_curvature_reg_matrix_term)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:347 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/model/analysis.py:135 (AnalysisImaging.log_likelihood_function)" + ] + }, + { + "instruction": "input_reduce_fusion.28", + "ms": 0.0056833000000000005, + "opcode": "fusion", + "shape": "f64[50]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:944", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:944 (AbstractInversion.regularization_term)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:346 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/model/analysis.py:135 (AnalysisImaging.log_likelihood_function)", + "/mnt/ral/jnightin/autolens_profiling_wt/certified-solver-phase-c1-lane-rate/scripts/imaging/likelihood_breakdown/fixed_light_trace.py:1195 (_captured_likelihood_fn.._likelihood)" + ] + } + ], + "pdip_solve": [ + { + "instruction": "cholesky.22", + "ms": 385.256094299974, + "opcode": "custom-call", + "shape": "(f64[50,1500,1500]{1,2,0}, s32[50]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:106", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:106 (factorize_kkt)", + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:212 (pdip_pc_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:83 (solve_nnls)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:129 (_solve_nnls_primal_with..primal)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:164 (solve_nnls_primal_with_status)" + ] + }, + { + "instruction": "triangular-solve", + "ms": 57.985238499999674, + "opcode": "custom-call", + "shape": "(f64[50,1500,1]{1,2,0}, s8[800]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146 (solve_kkt_rhs)", + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:213 (pdip_pc_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:83 (solve_nnls)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:129 (_solve_nnls_primal_with..primal)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:164 (solve_nnls_primal_with_status)" + ] + }, + { + "instruction": "triangular-solve.2", + "ms": 56.42095830000068, + "opcode": "custom-call", + "shape": "(f64[50,1500,1]{1,2,0}, s8[800]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146 (solve_kkt_rhs)", + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:217 (pdip_pc_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:83 (solve_nnls)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:129 (_solve_nnls_primal_with..primal)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:164 (solve_nnls_primal_with_status)" + ] + }, + { + "instruction": "triangular-solve.3", + "ms": 54.835582500000335, + "opcode": "custom-call", + "shape": "(f64[50,1500,1]{1,2,0}, s8[800]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146 (solve_kkt_rhs)", + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:217 (pdip_pc_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:83 (solve_nnls)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:129 (_solve_nnls_primal_with..primal)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:164 (solve_nnls_primal_with_status)" + ] + }, + { + "instruction": "triangular-solve.1", + "ms": 54.71606110000037, + "opcode": "custom-call", + "shape": "(f64[50,1500,1]{1,2,0}, s8[800]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146 (solve_kkt_rhs)", + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:213 (pdip_pc_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:83 (solve_nnls)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:129 (_solve_nnls_primal_with..primal)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:164 (solve_nnls_primal_with_status)" + ] + }, + { + "instruction": "input_transpose_fusion", + "ms": 32.34523870000001, + "opcode": "fusion", + "shape": "f64[50,1500,1500]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:106", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:106 (factorize_kkt)", + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:212 (pdip_pc_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:83 (solve_nnls)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:129 (_solve_nnls_primal_with..primal)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:164 (solve_nnls_primal_with_status)" + ] + } + ], + "data_vector_D": [ + { + "instruction": "input_reduce_fusion.19", + "ms": 6.1533866999999995, + "opcode": "fusion", + "shape": "f64[92,50,1500]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/inversion_imaging_util.py:123", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/inversion_imaging_util.py:123 (data_vector_via_blurred_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:67 (InversionImagingMapping.data_vector)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:699 (AbstractInversion.reconstruction)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "input_reduce_fusion.45", + "ms": 0.0422278, + "opcode": "fusion", + "shape": "f64[50,1500]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/inversion_imaging_util.py:123", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/inversion_imaging_util.py:123 (data_vector_via_blurred_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:67 (InversionImagingMapping.data_vector)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:699 (AbstractInversion.reconstruction)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "mapped_reconstruction": [ + { + "instruction": "input_reduce_fusion.23", + "ms": 5.520571, + "opcode": "fusion", + "shape": "f64[15361,50]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:163", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:163 (mapped_reconstructed_data_via_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:120 (InversionImagingMapping._mapped_reconstructed_data_dict_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:196 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + } + ] + }, + "stage_audit_note": "The HLO instructions that contributed most of each stage's milliseconds, with their full source stack. A stage row is only as good as the rules that built it; this is how a reader checks a row against the HLO instead of trusting it.", + "untraced_wall_ms": 1640.3460579000239, + "reconciliation_vs_untraced_pct": 1.1533456680588061, + "wall_basis": "wall_ms is the TRACED run's wall, the run these kernel durations came from. untraced_wall_ms is the same executable without the profiler; the difference is the profiler's overhead and belongs in neither the stages nor the idle row.", + "calls": 10, + "call_split": "per-call (first-instruction recurrence)", + "call_blocks": 10, + "events": 212350, + "streams": [ + "Stream #14(MemcpyD2D,Compute,MemcpyD2H,MemcpyH2D)" + ], + "per_stage_ms": { + "border_relocator": { + "median_ms": 0.1244815, + "min_ms": 0.12393700000000002, + "max_ms": 0.125281 + }, + "chi_squared_evidence": { + "median_ms": 0.0168, + "min_ms": 0.016257, + "max_ms": 0.017152 + }, + "curvature_matrix_F": { + "median_ms": 219.5533085, + "min_ms": 218.473615, + "max_ms": 222.128423 + }, + "data_vector_D": { + "median_ms": 6.1951225, + "min_ms": 6.163362, + "max_ms": 6.21773 + }, + "inversion_other": { + "median_ms": 30.77405999999999, + "min_ms": 30.379458000000003, + "max_ms": 31.200743999999958 + }, + "mapped_reconstruction": { + "median_ms": 5.522114500000001, + "min_ms": 5.510139, + "max_ms": 5.52854 + }, + "mapping_matrix": { + "median_ms": 5.808398500000001, + "min_ms": 5.735051, + "max_ms": 5.892574000000001 + }, + "mesh_construction": { + "median_ms": 0.023535999999999998, + "min_ms": 0.023296, + "max_ms": 0.026272 + }, + "mesh_dual_areas": { + "median_ms": 0.0102725, + "min_ms": 0.010144, + "max_ms": 0.010369 + }, + "mesh_locate_walk": { + "median_ms": 2.0361475, + "min_ms": 2.0267700000000013, + "max_ms": 2.046071 + }, + "mesh_qhull_callback": { + "median_ms": 0.617202999999999, + "min_ms": 0.6146919999999994, + "max_ms": 0.6192389999999992 + }, + "mesh_seed_argmin": { + "median_ms": 4.022386000000003, + "min_ms": 4.014906000000003, + "max_ms": 4.0409700000000015 + }, + "mixed_fusion": { + "median_ms": 62.823379499999994, + "min_ms": 62.387893999999996, + "max_ms": 63.231229 + }, + "other": { + "median_ms": 0.4803885, + "min_ms": 0.47908000000000023, + "max_ms": 0.4827249999999999 + }, + "pdip_solve": { + "median_ms": 709.7905464999872, + "min_ms": 708.9586439999897, + "max_ms": 711.2571399999891 + }, + "psf_convolution_mapping_matrix": { + "median_ms": 336.610339, + "min_ms": 336.191826, + "max_ms": 337.291494 + }, + "ray_trace_data_grid": { + "median_ms": 0.013392000000000001, + "min_ms": 0.013248000000000001, + "max_ms": 0.013664000000000003 + }, + "regularization_H": { + "median_ms": 0.916474, + "min_ms": 0.90577, + "max_ms": 0.924587 + } + }, + "stage_order": [ + "ray_trace_data_grid", + "border_relocator", + "mesh_qhull_callback", + "mesh_seed_argmin", + "mesh_locate_walk", + "mesh_dual_areas", + "mesh_construction", + "mapping_matrix", + "psf_convolution_mapping_matrix", + "data_vector_D", + "curvature_matrix_F", + "regularization_H", + "pdip_solve", + "mapped_reconstruction", + "chi_squared_evidence", + "inversion_other", + "mixed_fusion", + "other" + ], + "mixed_fusion": { + "ms": 62.823379499999994, + "constituent_stage_sets": { + "curvature_matrix_F + psf_convolution_mapping_matrix": 54.805799500000006, + "curvature_reg_reduce_gather + inversion_other + mapped_reconstruction + pdip_solve + reconstruction_scatter + regularization_H": 5.1975917, + "inversion_other + regularization_H": 1.9066653999999998, + "inversion_other + mapping_matrix + mesh_construction + mesh_interpolation_weights": 0.23201489999999997, + "mapping_matrix + mesh_interpolation_weights": 0.1654833, + "grids_and_structures + mass_profile_deflections + ray_trace_data_grid": 0.0713064, + "inversion_other + mesh_construction + mesh_dual_areas + mesh_interpolation_weights + regularization_H": 0.0632552, + "inversion_other + mesh_construction + mesh_dual_areas + mesh_interpolation_weights": 0.056589400000000005, + "inversion_other + mesh_construction + mesh_interpolation_weights": 0.055990999999999985, + "mesh_dual_areas + mesh_interpolation_weights": 0.04413469999999999, + "mesh_construction + regularization_H": 0.029385799999999997, + "mesh_seed_argmin + regularization_H": 0.0222049, + "inversion_other + mesh_dual_areas + mesh_locate_walk": 0.018598600000000003, + "mesh_locate_walk + mesh_seed_argmin": 0.0185825, + "inversion_other + pdip_solve + regularization_H": 0.0182114, + "inversion_other + mapped_reconstruction + reconstruction_scatter + regularization_H": 0.0127905, + "inversion_other + mapped_reconstruction": 0.0122881, + "mesh_dual_areas + mesh_interpolation_weights + regularization_H": 0.0118178, + "inversion_other + mapped_reconstruction + reconstruction_scatter": 0.0099104, + "inversion_other + mesh_locate_walk + mesh_seed_argmin": 0.006636899999999999, + "mapping_matrix + regularization_H": 0.0055424, + "grids_and_structures + mass_profile_deflections": 0.005216, + "inversion_other + ray_trace_data_grid": 0.0049282, + "inversion_other + mesh_construction + mesh_interpolation_weights + regularization_H": 0.0044704, + "inversion_other + mesh_interpolation_weights": 0.0043297, + "inversion_other + mesh_construction + regularization_H": 0.0039265, + "inversion_other + mapping_matrix": 0.0028321, + "chi_squared_evidence + inversion_other": 0.0023584000000000005 + }, + "example_kernels": { + "curvature_matrix_F + psf_convolution_mapping_matrix": [ + "loop_divide_gather_fusion" + ], + "curvature_reg_reduce_gather + inversion_other + mapped_reconstruction + pdip_solve + reconstruction_scatter + regularization_H": [ + "input_add_multiply_transpose_fusion" + ], + "inversion_other + regularization_H": [ + "input_reduce_fusion.42", + "input_reduce_fusion.35", + "input_reduce_fusion.36", + "input_reduce_fusion.37" + ], + "inversion_other + mapping_matrix + mesh_construction + mesh_interpolation_weights": [ + "input_scatter_fusion.6", + "loop_compare_fusion.3", + "input_concatenate_fusion.3" + ], + "mapping_matrix + mesh_interpolation_weights": [ + "input_scatter_fusion.2" + ], + "grids_and_structures + mass_profile_deflections + ray_trace_data_grid": [ + "loop_sqrt_fusion.1", + "loop_slice_fusion.3", + "loop_subtract_fusion.2", + "loop_sqrt_fusion" + ], + "inversion_other + mesh_construction + mesh_dual_areas + mesh_interpolation_weights + regularization_H": [ + "loop_abs_fusion", + "loop_convert_select_fusion" + ], + "inversion_other + mesh_construction + mesh_dual_areas + mesh_interpolation_weights": [ + "loop_abs_add_fusion" + ], + "inversion_other + mesh_construction + mesh_interpolation_weights": [ + "loop_slice_fusion.1", + "loop_slice_fusion" + ], + "mesh_dual_areas + mesh_interpolation_weights": [ + "input_concatenate_fusion.8" + ] + }, + "prorated_estimate_ms": { + "curvature_matrix_F": 27.402899750000003, + "psf_convolution_mapping_matrix": 27.402899750000003, + "inversion_other": 1.95984184, + "regularization_H": 1.8764493650000003, + "mapped_reconstruction": 0.878910425, + "reconstruction_scatter": 0.8727663750000001, + "pdip_solve": 0.8723357500000001, + "curvature_reg_reduce_gather": 0.8662652833333334, + "mesh_interpolation_weights": 0.21549649833333331, + "mapping_matrix": 0.144932625, + "mesh_construction": 0.12058511499999998, + "mesh_dual_areas": 0.059004539999999994, + "grids_and_structures": 0.026376800000000002, + "mass_profile_deflections": 0.026376800000000002, + "ray_trace_data_grid": 0.026232900000000003, + "mesh_seed_argmin": 0.022606, + "mesh_locate_walk": 0.017703083333333335, + "chi_squared_evidence": 0.0011792000000000003 + }, + "prorated_note": "ESTIMATE ONLY \u2014 a mixed fusion's time split equally across the stages its constituents span. Never summed into the measured table, never reconciled." + }, + "other_sources_ms": { + "copy.107": 0.10212330000000037, + "copy.108": 0.10080099999999997, + "copy.109": 0.1006061000000001, + "copy.106": 0.09933850000000043, + "copy.105": 0.05873000000000005, + "loop_broadcast_fusion.6": 0.0048384, + "loop_broadcast_fusion.2": 0.0038304000000000003, + "loop_broadcast_fusion.9": 0.0032864, + "copy.76": 0.0024896, + "copy.104": 0.0023264, + "copy.37": 0.0022048 + }, + "device_span_ms": 1660.0121586, + "device_busy_ms": 1386.0855905, + "device_idle_ms": 273.92656809999994, + "largest_idle_gaps": [ + { + "gap_ms": 5.546698, + "after": "pure_callback.0", + "before": "pure_callback.0" + }, + { + "gap_ms": 5.225639, + "after": "pure_callback.0", + "before": "pure_callback.0" + }, + { + "gap_ms": 5.150119, + "after": "pure_callback.0", + "before": "pure_callback.0" + }, + { + "gap_ms": 5.149543, + "after": "pure_callback.0", + "before": "pure_callback.0" + }, + { + "gap_ms": 5.035975, + "after": "pure_callback.0", + "before": "pure_callback.0" + }, + { + "gap_ms": 5.012902, + "after": "pure_callback.0", + "before": "pure_callback.0" + }, + { + "gap_ms": 5.010086, + "after": "pure_callback.0", + "before": "pure_callback.0" + }, + { + "gap_ms": 4.987878, + "after": "pure_callback.0", + "before": "pure_callback.0" + } + ], + "kernel_ms": 1385.3383499999873, + "sum_ms": 1659.2649180999872, + "wall_ms": 1660.119595100332, + "host_outside_span_ms": 0.10743650033191443, + "reconciliation_pct": -0.05148285719096537, + "unjoined_ms": 0.0, + "unjoined_pct": 0.0, + "other_ms": 0.4803885, + "other_pct": 0.028936981493250004, + "note": "Stage rows attribute the command-buffers-OFF program (see the module docstring): kernel times are the same, the launch overhead the CUDA graphs remove is not. sum_ms = kernel rows + device_idle_ms; the residual against wall_ms is host_outside_span_ms (dispatch before the first kernel, teardown after the last).", + "per_stage_ms_per_lane": { + "border_relocator": 0.00248963, + "chi_squared_evidence": 0.000336, + "curvature_matrix_F": 4.39106617, + "data_vector_D": 0.12390245, + "inversion_other": 0.6154811999999998, + "mapped_reconstruction": 0.11044229000000001, + "mapping_matrix": 0.11616797000000002, + "mesh_construction": 0.00047071999999999994, + "mesh_dual_areas": 0.00020545, + "mesh_locate_walk": 0.04072295000000001, + "mesh_qhull_callback": 0.01234405999999998, + "mesh_seed_argmin": 0.08044772000000006, + "mixed_fusion": 1.25646759, + "other": 0.00960777, + "pdip_solve": 14.195810929999743, + "psf_convolution_mapping_matrix": 6.73220678, + "ray_trace_data_grid": 0.00026784000000000004, + "regularization_H": 0.01832948 + }, + "per_lane_divisor": 50, + "host_callback": { + "pure_callback_span_ms": 264.0023656999999, + "qhull_ms": 230.61412299999992, + "callback_body_ms_note": "the OUTERMOST matching body event, not a sum: under the probe the body appears twice (the wrapper and the timed re-implementation it calls) and summing them would count the same work twice", + "events_by_name": { + "pure_callback.0": { + "count": 500, + "ms": 264.0023656999999 + }, + "$callback.py:815 _wrapped_callback": { + "count": 500, + "ms": 242.46257949999992 + }, + "$callback.py:224 _callback": { + "count": 500, + "ms": 241.3029058000001 + }, + "$callback.py:74 pure_callback_impl": { + "count": 500, + "ms": 240.88512830000033 + }, + "$callback.py:69 __call__": { + "count": 500, + "ms": 231.3596381 + }, + "$delaunay.py:162 ": { + "count": 500, + "ms": 231.04208280000012 + }, + "$host_callback_probe.py:225 wrapped": { + "count": 500, + "ms": 230.61412299999992 + }, + "$host_callback_probe.py:160 _timed_tri_only": { + "count": 500, + "ms": 230.23205680000007 + }, + "$callback.py:822 ": { + "count": 2000, + "ms": 0.7266732999999993 + }, + "ThenExecuteCallback:GetEventForComputeStreamSyncPoint": { + "count": 10, + "ms": 0.0321138 + }, + "$__init__.py:132 _xla_gc_callback": { + "count": 4, + "ms": 0.0008500000000000001 + } + }, + "note": "HOST milliseconds per traced BATCH (the whole invocation), aggregated by name because the events nest. Not a row of the device table: the device pays for them as the idle gaps largest_idle_gaps names." + }, + "host_callback_ms": 264.0023656999999 + }, + "hlo_census": { + "status": "excluded", + "reason": "The legacy census anchors PyAutoArray source line numbers that moved after the phase-1 run. No batched attribution is published from unsupported anchors; the device-event table and wall reconciliation remain valid." + }, + "trace_split": { + "expected_calls": 10, + "executions_per_invocation": 1, + "method": "per-call (first-instruction recurrence)", + "note": "DECIDED IN CODE: the scalar arm's trace is split by trace_calls * B, so every lane's execution is its own block and the per-stage median is taken over all of them. The vmap arm's is split by trace_calls, one block per batched execution, and per_stage_ms_per_lane divides those rows by B." + } + }, + "scalar": { + "arm": "scalar", + "program": "jax.jit(fn), called B times", + "stands_for": "Nautilus(use_jax_vmap=False, use_jax_jit=True). Plain use_jax_vmap=False is UNJITTED and is NOT this arm", + "hlo_source": "jax.jit(fn).lower(lane_trees[0]) \u2014 the same program phase 1 traced", + "batch_wall_ms": 2507.076561800204, + "wall_production_nesting_ms": 2507.076561800204, + "wall_aot_command_buffers_on_ms": 2511.1598409999715, + "wall_aot_command_buffers_off_ms": 2534.2873237001186, + "command_buffer_delta_ms": 23.127482700147084, + "production_nesting_vs_aot_on_delta_ms": -4.083279199767276, + "production_nesting_vs_aot_on_delta_pct": -0.1626053082364231, + "wall_per_lane_ms": 50.141531236004084, + "wall_per_lane_command_buffers_off_ms": 50.68574647400237, + "traced_batch_wall_ms": 2603.8891763997526, + "untraced_batch_wall_ms": 2535.448259599798, + "traced_wall_per_lane_ms": 52.07778352799505, + "callback_count_per_call": 50.0, + "callback_count_per_lane": 1.0, + "callback_expectation": "1 per likelihood evaluation, B per batch", + "host_qhull_ms": 230.09632370012696, + "host_tables_ms": 5.85484240182268, + "host_qhull_ms_per_lane": 4.601926474002539, + "host_tables_ms_per_lane": 0.1170968480364536, + "host_callback_probe": { + "calls": 500, + "qhull_ms_total": 2300.9632370012696, + "tables_ms_total": 58.5484240182268, + "total_ms_total": 2359.5116610194964, + "qhull_ms_mean": 4.601926474002539, + "tables_ms_mean": 0.1170968480364536, + "total_ms_mean": 4.719023322038993, + "non_finite_calls": 0, + "n_points": [ + 1500 + ] + }, + "host_callback_records_first": [ + { + "n_points": 1500, + "qhull_ms": 4.813151001144433, + "tables_ms": 0.19559900101739913, + "total_ms": 5.0087500021618325, + "finite": true + }, + { + "n_points": 1500, + "qhull_ms": 4.6260109993454535, + "tables_ms": 0.12312000035308301, + "total_ms": 4.7491309996985365, + "finite": true + }, + { + "n_points": 1500, + "qhull_ms": 4.5573320021503605, + "tables_ms": 0.14070899851503782, + "total_ms": 4.698041000665398, + "finite": true + }, + { + "n_points": 1500, + "qhull_ms": 4.593382000166457, + "tables_ms": 0.12009900092380121, + "total_ms": 4.713481001090258, + "finite": true + } + ], + "device_idle_ms": 7.555721706000007, + "device_idle_ms_per_lane": 7.555721706000007, + "trace": { + "parser": "ProfileData.from_file(xplane) + as_text() + stack_frame_index(proto field 17)", + "stage_audit": { + "chi_squared_evidence": [ + { + "instruction": "input_reduce_fusion.26", + "ms": 0.003919388, + "opcode": "fusion", + "shape": "f64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_util.py:104", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_util.py:104 (noise_normalization_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:98 (AbstractFit.noise_normalization)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:306 (FitDataset.noise_normalization)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:349 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)" + ] + }, + { + "instruction": "input_reduce_fusion.28", + "ms": 0.0037901040000000003, + "opcode": "fusion", + "shape": "f64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_util.py:90", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_util.py:90 (chi_squared_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:87 (AbstractFit.chi_squared)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:293 (FitDataset.chi_squared)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:345 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)" + ] + }, + { + "instruction": "loop_multiply_fusion.2", + "ms": 0.003026890000000005, + "opcode": "fusion", + "shape": "f64[15361]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/abstract_ndarray.py:300", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/abstract_ndarray.py:300 (AbstractNDArray.__pow__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/abstract_ndarray.py:60 (unwrap_array..wrapper)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/abstract_ndarray.py:35 (to_new_array..wrapper)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_util.py:78 (chi_squared_map_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:78 (AbstractFit.chi_squared_map)" + ] + } + ], + "psf_convolution_mapping_matrix": [ + { + "instruction": "input_scatter_fusion", + "ms": 1.990607756, + "opcode": "fusion", + "shape": "f64[1500,180,180]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "fft.19.0", + "ms": 1.76163641, + "opcode": "fft", + "shape": "f64[1500,180,180]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "fft.15.0", + "ms": 1.368750455999999, + "opcode": "fft", + "shape": "c128[1500,180,91]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "fft.17.0", + "ms": 0.9792810760000001, + "opcode": "fft", + "shape": "c128[1500,91,180]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "input_transpose_fusion.1", + "ms": 0.5133236019999997, + "opcode": "fusion", + "shape": "c128[1500,91,180]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "wrapped_transpose", + "ms": 0.4998654180000001, + "opcode": "fusion", + "shape": "c128[1500,180,91]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + } + ], + "mapping_matrix": [ + { + "instruction": "loop_broadcast_fusion.2", + "ms": 0.11105047399999984, + "opcode": "fusion", + "shape": "f64[15361,1500]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:342", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:342 (mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/abstract.py:283 (Mapper.mapping_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:91 (AbstractInversionImaging._mapping_matrix_for_convolution_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:137 (AbstractInversionImaging.operated_mapping_matrix_list)" + ] + }, + { + "instruction": "input_reduce_fusion.29", + "ms": 0.0029026840000000234, + "opcode": "fusion", + "shape": "f64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:93", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:93 (adaptive_pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/abstract.py:507 (Mapper.pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt.py:339 (Adapt.regularization_weights_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt_split.py:120 (AdaptSplit.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)" + ] + }, + { + "instruction": "loop_divide_fusion", + "ms": 0.002370827999999994, + "opcode": "fusion", + "shape": "f64[1500]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:92", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:92 (adaptive_pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/abstract.py:507 (Mapper.pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt.py:339 (Adapt.regularization_weights_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt_split.py:120 (AdaptSplit.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)" + ] + } + ], + "mixed_fusion": [ + { + "instruction": "loop_divide_gather_fusion", + "ms": 1.0215624380000001, + "opcode": "fusion", + "shape": "(f64[15361,1,1,1500]{3,2,1,0}, f64[15361,1,1,1500]{3,2,1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:133", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:133 (curvature_matrix_via_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:93 (InversionImagingMapping.curvature_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:389 (AbstractInversion.curvature_reg_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "input_add_multiply_transpose_fusion", + "ms": 0.06107873599999999, + "opcode": "fusion", + "shape": "(f64[1500,1500]{1,0}, f64[1500,1500]{1,0}, f64[1500,1500]{1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:61", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:61 (initialize)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:72 (solve_nnls)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:129 (_solve_nnls_primal_with..primal)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:164 (solve_nnls_primal_with_status)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:508 (reconstruction_positive_only_from)" + ] + }, + { + "instruction": "input_transpose_fusion.3", + "ms": 0.024260194000000013, + "opcode": "fusion", + "shape": "f64[1500,1500]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986 (AbstractInversion._log_det_symmetric_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:1157 (AbstractInversion.log_det_regularization_matrix_term)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:348 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/model/analysis.py:135 (AnalysisImaging.log_likelihood_function)" + ] + }, + { + "instruction": "input_scatter_fusion.2", + "ms": 0.016409972000000012, + "opcode": "fusion", + "shape": "f64[1500,1500]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:579", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:579 (pixel_splitted_regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt_split.py:137 (AdaptSplit.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:332 (AbstractInversion.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "input_scatter_fusion.3", + "ms": 0.014906570000000003, + "opcode": "fusion", + "shape": "f64[1500]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:70", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:70 (adaptive_pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/abstract.py:507 (Mapper.pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt.py:339 (Adapt.regularization_weights_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt_split.py:120 (AdaptSplit.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)" + ] + }, + { + "instruction": "loop_abs_fusion", + "ms": 0.014613888000000004, + "opcode": "fusion", + "shape": "(f64[6000,1]{1,0}, f64[6000,1]{1,0}, f64[6000,1]{1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:613", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:613 (triangle_area_xp)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:657 (pixel_weights_delaunay_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:982 (InterpolatorDelaunay._mappings_sizes_weights_split)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt_split.py:124 (AdaptSplit.regularization_matrix_from)" + ] + } + ], + "ray_trace_data_grid": [ + { + "instruction": "input_reduce_fusion.18", + "ms": 0.003239702000000011, + "opcode": "fusion", + "shape": "f64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:506", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:506 (FlatLambdaCDM._simpson_1d)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:644 (FlatLambdaCDM.angular_diameter_distance_kpc_z1z2)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:133 (LensingCosmology.angular_diameter_distance_to_earth_in_kpc_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:362 (LensingCosmology.scaling_factor_between_redshifts_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/lens/tracer_util.py:252 (traced_grid_2d_list_from)" + ] + }, + { + "instruction": "input_reduce_fusion.20", + "ms": 0.002753751999999984, + "opcode": "fusion", + "shape": "f64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:506", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:506 (FlatLambdaCDM._simpson_1d)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:644 (FlatLambdaCDM.angular_diameter_distance_kpc_z1z2)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:151 (LensingCosmology.angular_diameter_distance_between_redshifts_in_kpc_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:355 (LensingCosmology.scaling_factor_between_redshifts_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/lens/tracer_util.py:252 (traced_grid_2d_list_from)" + ] + }, + { + "instruction": "input_reduce_fusion.19", + "ms": 0.0026018700000000118, + "opcode": "fusion", + "shape": "f64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:503", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:503 (FlatLambdaCDM._simpson_1d)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:644 (FlatLambdaCDM.angular_diameter_distance_kpc_z1z2)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:133 (LensingCosmology.angular_diameter_distance_to_earth_in_kpc_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:362 (LensingCosmology.scaling_factor_between_redshifts_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/lens/tracer_util.py:252 (traced_grid_2d_list_from)" + ] + }, + { + "instruction": "input_reduce_fusion.21", + "ms": 0.0025937420000000195, + "opcode": "fusion", + "shape": "f64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:503", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:503 (FlatLambdaCDM._simpson_1d)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:644 (FlatLambdaCDM.angular_diameter_distance_kpc_z1z2)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:151 (LensingCosmology.angular_diameter_distance_between_redshifts_in_kpc_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:355 (LensingCosmology.scaling_factor_between_redshifts_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/lens/tracer_util.py:252 (traced_grid_2d_list_from)" + ] + }, + { + "instruction": "loop_divide_fusion.1", + "ms": 0.002407555999999992, + "opcode": "fusion", + "shape": "f64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:380", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:380 (LensingCosmology.scaling_factor_between_redshifts_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/lens/tracer_util.py:252 (traced_grid_2d_list_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/lens/tracer.py:632 (Tracer.traced_grid_2d_list_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/structures/decorators/abstract.py:93 (AbstractMaker.evaluate_func)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/structures/decorators/abstract.py:110 (AbstractMaker.result)" + ] + } + ], + "border_relocator": [ + { + "instruction": "eigh.45", + "ms": 0.07489312200000166, + "opcode": "custom-call", + "shape": "(f64[2,2]{0,1}, f64[2]{0}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:245", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:245 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:454 (BorderRelocator.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:176 (AbstractMesh.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:214 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "custom-call.2", + "ms": 0.007958090000000027, + "opcode": "custom-call", + "shape": "(f64[2,2]{1,0}, s8[4194304]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:242", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:242 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:454 (BorderRelocator.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:176 (AbstractMesh.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:214 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "input_reduce_fusion.15", + "ms": 0.005655388000000012, + "opcode": "fusion", + "shape": "(f64[], f64[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:269", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:269 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:454 (BorderRelocator.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:176 (AbstractMesh.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:214 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "input_concatenate_fusion.3", + "ms": 0.003701535999999994, + "opcode": "fusion", + "shape": "f64[15361,2]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:323", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:323 (relocated_grid_via_ellipse_border_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:423 (BorderRelocator.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:83 (AbstractMesh.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:208 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "loop_add_fusion.5", + "ms": 0.003518159999999994, + "opcode": "fusion", + "shape": "f64[15361]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:308", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:308 (relocated_grid_via_ellipse_border_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:423 (BorderRelocator.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:83 (AbstractMesh.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:208 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "loop_select_sine_fusion", + "ms": 0.003516563999999997, + "opcode": "fusion", + "shape": "(f64[], f64[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:301", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:301 (relocated_grid_via_ellipse_border_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:458 (BorderRelocator.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:176 (AbstractMesh.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:214 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + } + ], + "mesh_construction": [ + { + "instruction": "input_concatenate_fusion.7", + "ms": 0.0020564660000000124, + "opcode": "fusion", + "shape": "f64[1500,2]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:820", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:820 (InterpolatorDelaunay.mesh_grid_xy)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:847 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + } + ], + "mesh_qhull_callback": [ + { + "instruction": "pure_callback.4", + "ms": 0.01067238399999995, + "opcode": "custom-call", + "shape": "(s32[3000,3]{1,0}, s32[3000,3]{1,0}, s32[1500]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:161", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:161 (_jax_delaunay_tables)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:405 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + } + ], + "other": [ + { + "instruction": "copy.72", + "ms": 0.04207180200000365, + "opcode": "copy", + "shape": "f64[1,1024,2]{2,1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "copy.35", + "ms": 0.016947231999999895, + "opcode": "copy", + "shape": "s32[21361]{0}", + "source": "", + "stack": [] + }, + { + "instruction": "copy.40", + "ms": 0.001985231999999996, + "opcode": "copy", + "shape": "s64[1500]{0}", + "source": "", + "stack": [] + }, + { + "instruction": "loop_broadcast_fusion.1", + "ms": 0.0019820140000000115, + "opcode": "fusion", + "shape": "(pred[21361]{0}, pred[21361]{0})", + "source": "", + "stack": [] + }, + { + "instruction": "loop_broadcast_fusion.4", + "ms": 0.0017839420000000104, + "opcode": "fusion", + "shape": "(f64[1500]{0}, f64[1500]{0}, f64[1500]{0}, f64[1500]{0})", + "source": "", + "stack": [] + }, + { + "instruction": "copy.71", + "ms": 0.001688267999999995, + "opcode": "copy", + "shape": "s32[]", + "source": "", + "stack": [] + } + ], + "mesh_seed_argmin": [ + { + "instruction": "input_reduce_fusion", + "ms": 0.15274307000001294, + "opcode": "fusion", + "shape": "(f64[1024]{0}, s64[1024]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:191", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:191 (_nearest_vertex_seed_from..argmin_chunk)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204 (_nearest_vertex_seed_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:351 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)" + ] + }, + { + "instruction": "loop_dynamic_update_slice_fusion", + "ms": 0.041346231999997825, + "opcode": "fusion", + "shape": "s32[21,1024]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204 (_nearest_vertex_seed_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:351 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "loop_add_fusion", + "ms": 0.0318549099999961, + "opcode": "fusion", + "shape": "s64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204 (_nearest_vertex_seed_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:351 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "loop_broadcast_fusion", + "ms": 0.001965440000000018, + "opcode": "fusion", + "shape": "s32[21,1024]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204 (_nearest_vertex_seed_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:351 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "regularization_H": [ + { + "instruction": "loop_select_fusion.3", + "ms": 0.020039702, + "opcode": "fusion", + "shape": "f64[1500,1500]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:549", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:549 (pixel_splitted_regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt_split.py:137 (AdaptSplit.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:332 (AbstractInversion.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "input_scatter_fusion.10", + "ms": 0.0020833440000000048, + "opcode": "fusion", + "shape": "f64[1500,1500]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:615", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:615 (pixel_splitted_regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt_split.py:137 (AdaptSplit.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:332 (AbstractInversion.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "input_concatenate_fusion.9", + "ms": 0.0018603019999999843, + "opcode": "fusion", + "shape": "pred[3]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:91", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:91 (split_points_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:410 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + }, + { + "instruction": "input_concatenate_fusion.8", + "ms": 0.001853195999999986, + "opcode": "fusion", + "shape": "pred[3]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:93", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:93 (split_points_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:410 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + }, + { + "instruction": "input_concatenate_fusion", + "ms": 0.0017644219999999905, + "opcode": "fusion", + "shape": "s32[1500,2]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:615", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:615 (pixel_splitted_regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt_split.py:137 (AdaptSplit.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:332 (AbstractInversion.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "input_concatenate_fusion.10", + "ms": 0.0016968999999999964, + "opcode": "fusion", + "shape": "pred[3]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:90", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:90 (split_points_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:410 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + } + ], + "mesh_locate_walk": [ + { + "instruction": "loop_reduce_fusion", + "ms": 0.02578724399999979, + "opcode": "fusion", + "shape": "(f64[21361]{0}, s64[21361]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:264", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:264 (_walk_from_seed..walk_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:292 (_walk_from_seed..body)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:264 (_walk_from_seed..walk_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:292 (_walk_from_seed..body)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)" + ] + }, + { + "instruction": "input_reduce_fusion.1", + "ms": 0.025037913999999953, + "opcode": "fusion", + "shape": "pred[196]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:288", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:288 (_walk_from_seed..cond)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:353 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)" + ] + }, + { + "instruction": "loop_or_select_fusion", + "ms": 0.023437020000000287, + "opcode": "fusion", + "shape": "(s32[21361]{0}, pred[21361]{0}, pred[21361]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:270", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:270 (_walk_from_seed..walk_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:292 (_walk_from_seed..body)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:353 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)" + ] + }, + { + "instruction": "loop_select_fusion", + "ms": 0.02014813199999979, + "opcode": "fusion", + "shape": "s32[21361]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:242", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:242 (_walk_from_seed..weights_of)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:262 (_walk_from_seed..walk_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:292 (_walk_from_seed..body)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:353 (pix_indexes_delaunay_walk_from)" + ] + }, + { + "instruction": "input_reduce_fusion.2", + "ms": 0.01618750399999952, + "opcode": "fusion", + "shape": "pred[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:288", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:288 (_walk_from_seed..cond)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:353 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)" + ] + }, + { + "instruction": "while.22", + "ms": 0.014539700000000235, + "opcode": "while", + "shape": "(s32[], s32[21361]{0}, pred[21361]{0}, pred[21361]{0}, s32[3000,3]{1,0}, /*index=5*/f64[1500,2]{1,0}, f64[21361,2]{1,0}, s32[3000,3]{1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:353 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "data_vector_D": [ + { + "instruction": "input_reduce_fusion.10", + "ms": 0.121802552, + "opcode": "fusion", + "shape": "f64[92,1500]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/inversion_imaging_util.py:123", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/inversion_imaging_util.py:123 (data_vector_via_blurred_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:67 (InversionImagingMapping.data_vector)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:699 (AbstractInversion.reconstruction)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "input_reduce_fusion.27", + "ms": 0.0036935299999999965, + "opcode": "fusion", + "shape": "f64[1500]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/inversion_imaging_util.py:123", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/inversion_imaging_util.py:123 (data_vector_via_blurred_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:67 (InversionImagingMapping.data_vector)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:699 (AbstractInversion.reconstruction)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "inversion_other": [ + { + "instruction": "cholesky.60", + "ms": 0.8977823380000047, + "opcode": "custom-call", + "shape": "(f64[1500,1500]{0,1}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986 (AbstractInversion._log_det_symmetric_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:1078 (AbstractInversion.log_det_curvature_reg_matrix_term)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:347 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/model/analysis.py:135 (AnalysisImaging.log_likelihood_function)" + ] + }, + { + "instruction": "cholesky.70", + "ms": 0.8948461680000047, + "opcode": "custom-call", + "shape": "(f64[1500,1500]{0,1}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986 (AbstractInversion._log_det_symmetric_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:1157 (AbstractInversion.log_det_regularization_matrix_term)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:348 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/model/analysis.py:135 (AnalysisImaging.log_likelihood_function)" + ] + }, + { + "instruction": "input_reduce_fusion.17", + "ms": 0.013029934000000005, + "opcode": "fusion", + "shape": "f64[1500]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:946", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:946 (AbstractInversion.regularization_term)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:346 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/model/analysis.py:135 (AnalysisImaging.log_likelihood_function)", + "/mnt/ral/jnightin/autolens_profiling_wt/certified-solver-phase-c1-lane-rate/scripts/imaging/likelihood_breakdown/fixed_light_trace.py:1195 (_captured_likelihood_fn.._likelihood)" + ] + }, + { + "instruction": "loop_reduce_window_fusion", + "ms": 0.002877652000000008, + "opcode": "fusion", + "shape": "s64[6,16]{1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "loop_reduce_window_fusion.1", + "ms": 0.002789264000000019, + "opcode": "fusion", + "shape": "s64[94,16]{1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "input_reduce_fusion.25", + "ms": 0.0026711860000000003, + "opcode": "fusion", + "shape": "f64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:944", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:944 (AbstractInversion.regularization_term)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:346 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/model/analysis.py:135 (AnalysisImaging.log_likelihood_function)", + "/mnt/ral/jnightin/autolens_profiling_wt/certified-solver-phase-c1-lane-rate/scripts/imaging/likelihood_breakdown/fixed_light_trace.py:1195 (_captured_likelihood_fn.._likelihood)" + ] + } + ], + "curvature_matrix_F": [ + { + "instruction": "cublas-lt-matmul.2", + "ms": 4.267420474000002, + "opcode": "custom-call", + "shape": "(f64[1500,1500]{1,0}, s8[4194304]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:134", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:134 (curvature_matrix_via_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:93 (InversionImagingMapping.curvature_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:389 (AbstractInversion.curvature_reg_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "pdip_solve": [ + { + "instruction": "cholesky.20", + "ms": 15.98784528799969, + "opcode": "custom-call", + "shape": "(f64[1500,1500]{0,1}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:106", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:106 (factorize_kkt)", + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:212 (pdip_pc_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:83 (solve_nnls)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:129 (_solve_nnls_primal_with..primal)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:164 (solve_nnls_primal_with_status)" + ] + }, + { + "instruction": "triangular-solve", + "ms": 2.541939273999906, + "opcode": "custom-call", + "shape": "(f64[1500,1]{0,1}, s8[0]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146 (solve_kkt_rhs)", + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:213 (pdip_pc_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:83 (solve_nnls)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:129 (_solve_nnls_primal_with..primal)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:164 (solve_nnls_primal_with_status)" + ] + }, + { + "instruction": "triangular-solve.2", + "ms": 2.4886216699998616, + "opcode": "custom-call", + "shape": "(f64[1500,1]{0,1}, s8[0]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146 (solve_kkt_rhs)", + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:217 (pdip_pc_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:83 (solve_nnls)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:129 (_solve_nnls_primal_with..primal)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:164 (solve_nnls_primal_with_status)" + ] + }, + { + "instruction": "triangular-solve.3", + "ms": 2.41211809800021, + "opcode": "custom-call", + "shape": "(f64[1500,1]{0,1}, s8[0]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146 (solve_kkt_rhs)", + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:217 (pdip_pc_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:83 (solve_nnls)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:129 (_solve_nnls_primal_with..primal)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:164 (solve_nnls_primal_with_status)" + ] + }, + { + "instruction": "triangular-solve.1", + "ms": 2.309823310000291, + "opcode": "custom-call", + "shape": "(f64[1500,1]{0,1}, s8[0]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146 (solve_kkt_rhs)", + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:213 (pdip_pc_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:83 (solve_nnls)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:129 (_solve_nnls_primal_with..primal)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:164 (solve_nnls_primal_with_status)" + ] + }, + { + "instruction": "cholesky.40", + "ms": 0.8675693959999949, + "opcode": "custom-call", + "shape": "(f64[1500,1500]{0,1}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:62", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:62 (initialize)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:72 (solve_nnls)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:129 (_solve_nnls_primal_with..primal)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:164 (solve_nnls_primal_with_status)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:508 (reconstruction_positive_only_from)" + ] + } + ], + "mapped_reconstruction": [ + { + "instruction": "input_reduce_fusion.14", + "ms": 0.11525491200000006, + "opcode": "fusion", + "shape": "f64[15361]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:163", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:163 (mapped_reconstructed_data_via_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:120 (InversionImagingMapping._mapped_reconstructed_data_dict_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:196 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + } + ] + }, + "stage_audit_note": "The HLO instructions that contributed most of each stage's milliseconds, with their full source stack. A stage row is only as good as the rules that built it; this is how a reader checks a row against the HLO instead of trusting it.", + "untraced_wall_ms": 50.70896519199596, + "reconciliation_vs_untraced_pct": -0.1284397852516002, + "wall_basis": "wall_ms is the TRACED run's wall, the run these kernel durations came from. untraced_wall_ms is the same executable without the profiler; the difference is the profiler's overhead and belongs in neither the stages nor the idle row.", + "calls": 500, + "call_split": "per-call (first-instruction recurrence)", + "call_blocks": 500, + "events": 476880, + "streams": [ + "Stream #14(MemcpyD2D,MemcpyD2H,Compute,MemcpyH2D,Memset)" + ], + "per_stage_ms": { + "border_relocator": { + "median_ms": 0.11462149999999999, + "min_ms": 0.113826, + "max_ms": 0.11581 + }, + "chi_squared_evidence": { + "median_ms": 0.01072, + "min_ms": 0.010304, + "max_ms": 0.011647999999999999 + }, + "curvature_matrix_F": { + "median_ms": 4.265858, + "min_ms": 4.248178, + "max_ms": 4.355059 + }, + "data_vector_D": { + "median_ms": 0.125474, + "min_ms": 0.124545, + "max_ms": 0.126818 + }, + "inversion_other": { + "median_ms": 1.8217969999999999, + "min_ms": 1.801407, + "max_ms": 1.866463 + }, + "mapped_reconstruction": { + "median_ms": 0.1152615, + "min_ms": 0.114305, + "max_ms": 0.116254 + }, + "mapping_matrix": { + "median_ms": 0.116321, + "min_ms": 0.11533, + "max_ms": 0.11778999999999999 + }, + "memset": { + "median_ms": 0.05048000000000001, + "min_ms": 0.041152000000000015, + "max_ms": 0.08899300000000002 + }, + "mesh_construction": { + "median_ms": 0.002048, + "min_ms": 0.002016, + "max_ms": 0.002081 + }, + "mesh_locate_walk": { + "median_ms": 0.15046500000000004, + "min_ms": 0.13212900000000002, + "max_ms": 0.18681700000000007 + }, + "mesh_qhull_callback": { + "median_ms": 0.010624, + "min_ms": 0.010464000000000001, + "max_ms": 0.011201000000000001 + }, + "mesh_seed_argmin": { + "median_ms": 0.2279080000000001, + "min_ms": 0.22745900000000008, + "max_ms": 0.2283550000000002 + }, + "mixed_fusion": { + "median_ms": 1.2617045, + "min_ms": 1.2538059999999995, + "max_ms": 1.2667919999999997 + }, + "other": { + "median_ms": 0.07129699999999999, + "min_ms": 0.06880099999999999, + "max_ms": 0.07574499999999999 + }, + "pdip_solve": { + "median_ms": 27.35843900000004, + "min_ms": 22.74273600000003, + "max_ms": 50.527277000000055 + }, + "psf_convolution_mapping_matrix": { + "median_ms": 7.3407265, + "min_ms": 7.324859, + "max_ms": 7.425078999999999 + }, + "ray_trace_data_grid": { + "median_ms": 0.013568, + "min_ms": 0.01344, + "max_ms": 0.014177 + }, + "regularization_H": { + "median_ms": 0.0308, + "min_ms": 0.030209, + "max_ms": 0.031648 + } + }, + "stage_order": [ + "ray_trace_data_grid", + "border_relocator", + "mesh_qhull_callback", + "mesh_seed_argmin", + "mesh_locate_walk", + "mesh_construction", + "mapping_matrix", + "psf_convolution_mapping_matrix", + "data_vector_D", + "curvature_matrix_F", + "regularization_H", + "pdip_solve", + "mapped_reconstruction", + "chi_squared_evidence", + "inversion_other", + "mixed_fusion", + "other", + "memset" + ], + "mixed_fusion": { + "ms": 1.2617045, + "constituent_stage_sets": { + "curvature_matrix_F + psf_convolution_mapping_matrix": 1.0215624380000001, + "curvature_reg_reduce_gather + inversion_other + mapped_reconstruction + pdip_solve + reconstruction_scatter + regularization_H": 0.06107873599999999, + "inversion_other + regularization_H": 0.029146561999999838, + "inversion_other + mesh_construction + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin + regularization_H": 0.021710695999999963, + "inversion_other + mapping_matrix + mesh_construction + mesh_dual_areas + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin": 0.02130523799999998, + "inversion_other + mesh_construction + mesh_dual_areas + mesh_interpolation_weights + regularization_H": 0.014613888000000004, + "grids_and_structures + mass_profile_deflections + ray_trace_data_grid": 0.01433572599999999, + "inversion_other + mapping_matrix + mesh_construction + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin": 0.011650641999999996, + "grids_and_structures + mass_profile_deflections": 0.00993355599999997, + "inversion_other + mesh_dual_areas + mesh_locate_walk": 0.00935706200000015, + "inversion_other + mesh_construction + mesh_seed_argmin + regularization_H": 0.007277492000000014, + "inversion_other + mesh_construction + regularization_H": 0.006316485999999993, + "inversion_other + ray_trace_data_grid": 0.005466850000000005, + "inversion_other + mapped_reconstruction + pdip_solve + reconstruction_scatter": 0.004779474000000001, + "inversion_other + mapped_reconstruction": 0.003808087999999994, + "mapping_matrix + regularization_H": 0.003491351999999997, + "inversion_other + mesh_construction + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin": 0.0031836320000000044, + "inversion_other + mesh_construction + mesh_dual_areas + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin": 0.003010507999999999, + "inversion_other + pdip_solve": 0.0028958200000000107, + "inversion_other + mesh_locate_walk + mesh_seed_argmin": 0.002525893999999991, + "inversion_other + mesh_interpolation_weights": 0.0021667300000000034, + "chi_squared_evidence + inversion_other": 0.0018687580000000033 + }, + "example_kernels": { + "curvature_matrix_F + psf_convolution_mapping_matrix": [ + "loop_divide_gather_fusion" + ], + "curvature_reg_reduce_gather + inversion_other + mapped_reconstruction + pdip_solve + reconstruction_scatter + regularization_H": [ + "input_add_multiply_transpose_fusion" + ], + "inversion_other + regularization_H": [ + "loop_reduce_slice_fusion", + "loop_reduce_fusion.1", + "loop_reduce_fusion.2", + "input_transpose_fusion.3" + ], + "inversion_other + mesh_construction + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin + regularization_H": [ + "input_reduce_fusion.24", + "loop_select_fusion.4", + "input_scatter_fusion.2" + ], + "inversion_other + mapping_matrix + mesh_construction + mesh_dual_areas + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin": [ + "input_scatter_fusion.6", + "input_scatter_fusion.3" + ], + "inversion_other + mesh_construction + mesh_dual_areas + mesh_interpolation_weights + regularization_H": [ + "loop_abs_fusion" + ], + "grids_and_structures + mass_profile_deflections + ray_trace_data_grid": [ + "loop_subtract_fusion.2", + "loop_subtract_fusion.1" + ], + "inversion_other + mapping_matrix + mesh_construction + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin": [ + "input_scatter_fusion.4" + ], + "grids_and_structures + mass_profile_deflections": [ + "loop_divide_minimum_multiply_sine_sqrt_fusion", + "loop_slice_fusion" + ], + "inversion_other + mesh_dual_areas + mesh_locate_walk": [ + "loop_select_fusion.6", + "input_scatter_fusion.9", + "input_scatter_fusion.8", + "input_scatter_fusion.7" + ] + }, + "prorated_estimate_ms": { + "curvature_matrix_F": 0.5107812190000001, + "psf_convolution_mapping_matrix": 0.5107812190000001, + "inversion_other": 0.05460199926190473, + "regularization_H": 0.036964841599999916, + "mesh_construction": 0.01658995209523809, + "mesh_interpolation_weights": 0.013748448761904754, + "mesh_locate_walk": 0.013703291495238133, + "mapped_reconstruction": 0.013278701833333328, + "pdip_solve": 0.012822567833333336, + "mesh_seed_argmin": 0.01240364382857142, + "reconstruction_scatter": 0.011374657833333331, + "curvature_reg_reduce_gather": 0.010179789333333331, + "grids_and_structures": 0.009745353333333314, + "mass_profile_deflections": 0.009745353333333314, + "mesh_dual_areas": 0.009587155028571477, + "ray_trace_data_grid": 0.007512000333333333, + "mapping_matrix": 0.00673105509523809, + "chi_squared_evidence": 0.0009343790000000017 + }, + "prorated_note": "ESTIMATE ONLY \u2014 a mixed fusion's time split equally across the stages its constituents span. Never summed into the measured table, never reconciled." + }, + "other_sources_ms": { + "copy.72": 0.04207180200000365, + "copy.35": 0.016947231999999895, + "copy.40": 0.001985231999999996, + "loop_broadcast_fusion.1": 0.0019820140000000115, + "loop_broadcast_fusion.4": 0.0017839420000000104, + "copy.71": 0.001688267999999995, + "copy.20": 0.0016628559999999942, + "copy.52": 0.001660284000000003, + "copy.70": 0.0016019320000000008 + }, + "device_span_ms": 52.07552502, + "device_busy_ms": 44.519803313999994, + "device_idle_ms": 7.555721706000007, + "largest_idle_gaps": [ + { + "gap_ms": 5.55734, + "after": "pure_callback.4", + "before": "pure_callback.4" + }, + { + "gap_ms": 0.037248, + "after": "pure_callback.4", + "before": "copy.71" + }, + { + "gap_ms": 0.036543, + "after": "copy.35", + "before": "input_reduce_fusion.1" + }, + { + "gap_ms": 0.030688, + "after": "input_reduce_fusion.3", + "before": "input_divide_reduce_subtract_fusion" + }, + { + "gap_ms": 0.029792, + "after": "input_concatenate_fusion.7", + "before": "pure_callback.4" + }, + { + "gap_ms": 0.022719, + "after": "loop_dynamic_update_slice_fusion", + "before": "loop_add_fusion" + }, + { + "gap_ms": 0.020511, + "after": "eigh.45", + "before": "eigh.45" + }, + { + "gap_ms": 0.019007, + "after": "while.28", + "before": "input_reduce_fusion.3" + } + ], + "kernel_ms": 43.08811300000004, + "sum_ms": 50.64383470600005, + "wall_ms": 52.07778352799505, + "host_outside_span_ms": 0.002258507995051673, + "reconciliation_pct": -2.75347513825001, + "unjoined_ms": 0.0, + "unjoined_pct": 0.0, + "other_ms": 0.07129699999999999, + "other_pct": 0.1369048280667963, + "note": "Stage rows attribute the command-buffers-OFF program (see the module docstring): kernel times are the same, the launch overhead the CUDA graphs remove is not. sum_ms = kernel rows + device_idle_ms; the residual against wall_ms is host_outside_span_ms (dispatch before the first kernel, teardown after the last).", + "per_stage_ms_per_lane": { + "border_relocator": 0.11462149999999999, + "chi_squared_evidence": 0.01072, + "curvature_matrix_F": 4.265858, + "data_vector_D": 0.125474, + "inversion_other": 1.8217969999999999, + "mapped_reconstruction": 0.1152615, + "mapping_matrix": 0.116321, + "memset": 0.05048000000000001, + "mesh_construction": 0.002048, + "mesh_locate_walk": 0.15046500000000004, + "mesh_qhull_callback": 0.010624, + "mesh_seed_argmin": 0.2279080000000001, + "mixed_fusion": 1.2617045, + "other": 0.07129699999999999, + "pdip_solve": 27.35843900000004, + "psf_convolution_mapping_matrix": 7.3407265, + "ray_trace_data_grid": 0.013568, + "regularization_H": 0.0308 + }, + "per_lane_divisor": 1, + "host_callback": { + "pure_callback_span_ms": 253.44177359999998, + "qhull_ms": 236.43602019999994, + "callback_body_ms_note": "the OUTERMOST matching body event, not a sum: under the probe the body appears twice (the wrapper and the timed re-implementation it calls) and summing them would count the same work twice", + "events_by_name": { + "pure_callback.4": { + "count": 500, + "ms": 253.44177359999998 + }, + "$callback.py:815 _wrapped_callback": { + "count": 500, + "ms": 249.06968640000014 + }, + "$callback.py:224 _callback": { + "count": 500, + "ms": 247.85900320000007 + }, + "$callback.py:74 pure_callback_impl": { + "count": 500, + "ms": 247.4164497000002 + }, + "$callback.py:69 __call__": { + "count": 500, + "ms": 237.21032869999976 + }, + "$delaunay.py:162 ": { + "count": 500, + "ms": 236.87959399999988 + }, + "$host_callback_probe.py:225 wrapped": { + "count": 500, + "ms": 236.43602019999994 + }, + "$host_callback_probe.py:160 _timed_tri_only": { + "count": 500, + "ms": 236.01510070000003 + }, + "ThenExecuteCallback:GetEventForComputeStreamSyncPoint": { + "count": 500, + "ms": 0.9465159999999991 + }, + "$callback.py:822 ": { + "count": 2000, + "ms": 0.7363693000000004 + }, + "$__init__.py:132 _xla_gc_callback": { + "count": 8, + "ms": 0.0014190000000000001 + } + }, + "note": "HOST milliseconds per traced BATCH (the whole invocation), aggregated by name because the events nest. Not a row of the device table: the device pays for them as the idle gaps largest_idle_gaps names." + }, + "host_callback_ms": 253.44177359999998 + }, + "hlo_census": { + "status": "excluded", + "reason": "The legacy census anchors PyAutoArray source line numbers that moved after the phase-1 run. No batched attribution is published from unsupported anchors; the device-event table and wall reconciliation remain valid." + }, + "trace_split": { + "expected_calls": 500, + "executions_per_invocation": 50, + "method": "per-call (first-instruction recurrence)", + "note": "DECIDED IN CODE: the scalar arm's trace is split by trace_calls * B, so every lane's execution is its own block and the per-stage median is taken over all of them. The vmap arm's is split by trace_calls, one block per batched execution, and per_stage_ms_per_lane divides those rows by B." + } + } + }, + "certification_report": { + "source": "vmap arm, library solve observed through its stats= out-dict (PyAutoArray #566) and jax.debug.callback(..., ordered=True); ordered because the unordered batching rule returns the lanes permuted. Untimed, separately compiled; max rel diff of its log likelihoods vs the timed arm's: 6.283e-05", + "rows": 0, + "pdip_iter": "NOT AVAILABLE per lane without changing library numerics. The fallback branch calls the library's own reconstruction_positive_only_from, which returns the solution alone \u2014 jax_nnls.solve_nnls' iteration count is discarded inside the library's custom_vjp primal. The PDIP while_loop's cost is in the pdip_solve stage row of each arm's device table instead, which is a max-over-lanes quantity under vmap because every lane runs the same fixed kernel sequence.", + "passes_semantics": "library `passes`: restricted active-set passes run (jax_active_set.solve_certified)" + }, + "lane_construction": { + "draws_sha256": "246b41aea1e860763cb7b206a7f43d5e3145e5c63c8c9df4985518ebf778c02e", + "lane_rows": [ + 300, + 301, + 302, + 303, + 304, + 305, + 306, + 307, + 308, + 309, + 310, + 311, + 312, + 313, + 314, + 315, + 316, + 317, + 318, + 319, + 320, + 321, + 322, + 323, + 324, + 325, + 326, + 327, + 328, + 329, + 330, + 331, + 332, + 333, + 334, + 335, + 336, + 337, + 338, + 339, + 340, + 341, + 342, + 343, + 344, + 345, + 346, + 347, + 348, + 349 + ], + "calls": [ + 15, + 16, + 17 + ], + "stage": "pix1", + "regularization_range": { + "galaxies.source.pixelization.regularization.inner_coefficient": { + "min": 2.1069031993440453e-06, + "max": 4381.27190482627 + }, + "galaxies.source.pixelization.regularization.outer_coefficient": { + "min": 2.002369440956339e-06, + "max": 350.8013530115919 + }, + "galaxies.source.pixelization.regularization.signal_scale": { + "min": 0.015870361716511128, + "max": 0.971901829834744 + } + }, + "phases": [ + "exploration" + ], + "window_rule": "nautilus_batches.timed_window: consecutive captured calls, in call order, from the FIRST call that is not a prior batch, concatenated and truncated to B; at B == n_batch exactly one real Nautilus batch. Falls back to the latest B lanes if the post-prior lanes run out; never repeats a lane.", + "note": "Lane k is captured lane lane_rows[k]: the mass AND shear of a real Nautilus proposal (nautilus_batch_capture.py), lens light fixed at S3, the S3 light-subtracted dataset shared by every lane. `offsets` in the lane table are the mass offsets from the fiducial; the shear is in the capture file." + }, + "captured": { + "batches_path": "/mnt/ral/jnightin/autolens_profiling_wt/certified-solver-phase-c1-lane-rate/results/breakdown/imaging/nautilus_batches_delaunay_pix1.npz", + "batches_sha256": "e71a5e23026b342d1ff4359b8fb914a87980d8aea0060659d2334dcfa3215c00", + "schema_version": 2, + "n_calls": 932, + "n_lanes": 18640, + "call_sizes_seen": [ + 20 + ], + "calls_by_phase": { + "prior": 15, + "exploration": 917 + }, + "parameter_paths": [ + "galaxies.source.pixelization.regularization.inner_coefficient", + "galaxies.source.pixelization.regularization.outer_coefficient", + "galaxies.source.pixelization.regularization.signal_scale", + "galaxies.lens.mass.centre.centre_0", + "galaxies.lens.mass.centre.centre_1", + "galaxies.lens.mass.einstein_radius", + "galaxies.lens.mass.ell_comps.ell_comps_0", + "galaxies.lens.mass.ell_comps.ell_comps_1", + "galaxies.lens.shear.gamma_1", + "galaxies.lens.shear.gamma_2" + ], + "stage": "pix1", + "regularization": { + "class": "AdaptSplit", + "free": true, + "priors": { + "inner_coefficient": [ + "LogUniform", + 1e-06, + 1000000.0 + ], + "outer_coefficient": [ + "LogUniform", + 1e-06, + 1000000.0 + ], + "signal_scale": [ + "Uniform", + 0.0, + 1.0 + ] + }, + "priors_source": "PyAutoGalaxy packaged config/priors/regularization (adapt_split.yaml / constant.yaml); adapt_split.yaml is identical to euclid_strong_lens_modeling_pipeline/config/priors/regularization/adapt_split.yaml" + }, + "nautilus": { + "departures_from_production": [ + "mass/shear priors are the phase-B cell's Gaussians, not chained from source_lp", + "no positions likelihood", + "the cell's mesh (Hilbert 1500, weight_power 1) in both stages; source_pix_2 redraws a 500-vertex Hilbert grid at weight_power 3.5", + "seeded (production passes no seed)", + "quick updates disabled (iterations_per_quick_update=1e12; render-only)", + "NullPaths: no output directory, so no checkpoint and one Sampler.run call", + "post-fit perform_update skipped (samples / latent variables never built)" + ], + "n_batch": 20, + "n_like_max": 40000, + "n_live": 150, + "number_of_cores": 1, + "production_reference": "euclid_strong_lens_modeling_pipeline/scripts/full_model.py source_pix_1 (n_live=150) / source_pix_2 (n_live=75): af.Nautilus(n_batch=20, **SettingsSearch.search_dict) with use_jax_vmap=True and number_of_cores=1 (SettingsSearch defaults)", + "production_stage": "source_pix_1", + "seed": 1, + "stage": "pix1", + "use_jax_vmap": true, + "version": "1.0.5" + }, + "capture_fit_status": "sampling complete (n_like_max or convergence); post-fit result skipped", + "capture_library_revisions": { + "PyAutoArray": { + "head": "7fa8d2714f7da43fec2b23c31bff580764831670", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoArray" + }, + "PyAutoFit": { + "head": "a736840127be7a3c21e15a5c945e94d8f1082983", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoFit" + }, + "PyAutoGalaxy": { + "head": "70a61e26cd715cefe7012a38285698091246a8a4", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy" + }, + "PyAutoLens": { + "head": "86054bbc19baa2f710a12e04a94fa27ab37cc354", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoLens" + }, + "PyAutoNerves": { + "head": "1fa613aa8d89a79613009fb66f5b4e2d21deb57a", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoNerves" + } + }, + "fingerprint_check": { + "fields": [ + "mesh", + "source_pixels", + "dataset_sha256", + "regularization_class", + "regularization_s0_fiducial", + "border_relocator", + "use_mixed_precision", + "log_evidence_s3_library" + ], + "not_identity": "the regularization coefficients: free per lane since the capture frees them", + "log_evidence_s3_library_rel_diff": 0.0, + "passed": true + }, + "timed_window_vs_capture_pdip": { + "reference": "the capture's own figure of merit (library PDIP, Fitness.call_wrap jax.jit(jax.vmap(call)) over parameter vectors) for the same lanes", + "compared_against": "this cell's jit(vmap) library-PDIP reference", + "n_compared": 50, + "max_rel_diff": 9.118771059168179, + "max_abs_diff_nats": 207206.6708886897, + "gated": false, + "note": "RECORDED, NOT GATED: proves the lane trees rebuilt here are the models the sampler evaluated (a wrong parameter mapping shows up as nats, not 1e-10)." + } + }, + "matched": { + "vmap_wall_per_lane_ms": 32.624801890000526, + "scalar_wall_per_lane_ms": 50.141531236004084, + "speedup_vmap_over_scalar": 1.5369145046478403, + "note": "Both walls are the PRODUCTION nesting of their arm, measured in one process on the same B lanes with the SAME library Settings (no injection). A speedup below 1 means the batch is slower per lane than B sequential jitted calls." + }, + "solver_source": "library", + "solver": "pdip", + "certified_fallback": "pdip", + "certified_pass_budget": 16, + "certified_pass_budget_basis": "config default (Settings().certified_pass_budget)", + "certified_tau_rel": 1e-09, + "solver_used": "pdip", + "solver_check": { + "solver_used": "pdip", + "solver_used_source": "AbstractInversion.positive_only_solver_used on the fiducial S3 inversion, built eagerly on the JAX backend (AnalysisImaging(use_jax=True).fit_from) with the arms' Settings", + "reference_solver_used": "pdip", + "traced_solver_kwargs_jax": [ + "pdip" + ], + "observed_calls_jax": 1, + "report_rows": 0, + "report_vs_timed_arm_max_rel_diff": 6.282871362996316e-05 + }, + "lanes_certified": [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null + ], + "lanes_passes": [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null + ], + "uncertified_lanes": null, + "per_lane_certification_note": "Not applicable: a library-PDIP row has no certificate or pass count.", + "gate": { + "pre_registered": true, + "gated": [ + "per lane: jit(vmap) arm vs jit(vmap) library PDIP <= lane_rtol relative", + "per lane: scalar jit arm vs scalar jit library PDIP <= lane_rtol relative" + ], + "recorded_not_gated": [ + "per lane: jit(vmap) arm vs scalar jit arm (rel_diff, abs_diff_nats)", + "per lane: jit(vmap) library PDIP vs scalar jit library PDIP", + "uncertified_lanes (certified_fallback=none rows)" + ], + "lanes_failed": 14, + "passed": false, + "policy_eligible": false, + "note": "Pre-registered before submission (module docstring; submit header). Phase 3 (results/notes/hst_gpu_residue_phase3_psf_2026_09.md) placed phase 2's ~2.5e-9 certified-vs-PDIP residual BETWEEN the jit(vmap) and scalar-jit compositions, not in the solver \u2014 so each arm is gated against the library-PDIP reference of its OWN composition, and the cross-composition difference is recorded with its nats. A certified_fallback=none row is policy-eligible only if every lane certifies AND passes the gate. Timing is never gated." + }, + "library_revisions": { + "PyAutoArray": { + "head": "3de624b5b91a4efa130dc3cb0a3a0f06f85025a3", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoArray", + "module_file": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/__init__.py" + }, + "PyAutoFit": { + "head": "dd9fbe0aab60c4a57702b1444ca031b317c91331", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoFit", + "module_file": "/mnt/ral/jnightin/PyAuto/PyAutoFit/autofit/__init__.py" + }, + "PyAutoGalaxy": { + "head": "70a61e26cd715cefe7012a38285698091246a8a4", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy", + "module_file": "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/__init__.py" + }, + "PyAutoLens": { + "head": "86054bbc19baa2f710a12e04a94fa27ab37cc354", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoLens", + "module_file": "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/__init__.py" + }, + "autoarray_file": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/__init__.py" + } + }, + "headline_arm_note": "`trace`, `hlo_census`, `command_buffers` and `trace_timing` above describe the scalar arm \u2014 the program phase 1 traced. Both arms' full blocks, the lane table and the matched comparison are under `vmap`." +} \ No newline at end of file diff --git a/results/breakdown/imaging/fixed_light_trace_delaunay_jitvmap50_captured_pix1_libpdip_fbon_b16_hpc_a100_fp64_fixed_light_trace.png b/results/breakdown/imaging/fixed_light_trace_delaunay_jitvmap50_captured_pix1_libpdip_fbon_b16_hpc_a100_fp64_fixed_light_trace.png new file mode 100644 index 0000000000000000000000000000000000000000..2041edb533cf1f0e6bfec93b14794bb7529f30f6 GIT binary patch literal 169077 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 z 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 literal 0 HcmV?d00001 diff --git a/results/breakdown/imaging/fixed_light_trace_rectangular_captured_rate_libcertified_fboff_b16_pix1_hpc_a100_fp64_fixed_light_trace.json b/results/breakdown/imaging/fixed_light_trace_rectangular_captured_rate_libcertified_fboff_b16_pix1_hpc_a100_fp64_fixed_light_trace.json new file mode 100644 index 000000000..9d93b9377 --- /dev/null +++ b/results/breakdown/imaging/fixed_light_trace_rectangular_captured_rate_libcertified_fboff_b16_pix1_hpc_a100_fp64_fixed_light_trace.json @@ -0,0 +1,61599 @@ +{ + "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": null, + "cpu_count": 124, + "jax_compilation_cache_dir": "/mnt/ral/jnightin/autolens_profiling_wt/certified-solver-phase-c1-lane-rate/output/jax_cache/fixed_light_lanerate_rectangular_pix1_rate_20_certified_off_350768_5", + "autotune_cache_entries_at_start": 0, + "cache_fresh": true, + "nvidia_smi": "NVIDIA A100 80GB PCIe, 35441 MiB, 81920 MiB" + }, + "machine": { + "cpu_model": "AMD EPYC 7702 64-Core Processor", + "cpu_count_os": 124, + "nproc": 4, + "nproc_all": 124, + "nproc_note": "GNU nproc honours OMP_NUM_THREADS, so `nproc` can print 1 on a multi-core host; `nproc_all` is the core count.", + "ram_total": "928298200 kB", + "kernel": "5.14.0-687.50.1.el9_8.x86_64", + "platform": "Linux-5.14.0-687.50.1.el9_8.x86_64-x86_64-with-glibc2.34", + "python": "3.12.4", + "jax_thread_env": { + "NPROC": null + }, + "blas_thread_env": { + "OMP_NUM_THREADS": null, + "OPENBLAS_NUM_THREADS": null, + "MKL_NUM_THREADS": null, + "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" + }, + "precision": "fp64", + "configuration": { + "mesh": "rectangular", + "source_pixels": 1521, + "dataset": "hst", + "dataset_sha256": { + "data.fits": "e4e833a28e9c6f6fb023cd85c0d3dde74068720256bc77a240633500e5b04fac", + "noise_map.fits": "315c6266a0acd3ac9c8da82fcd2b45a08697362481fd7a35072bab1658530ba3", + "psf.fits": "8389ba0e8bf4a09b4a561cfc246181a2fb944ed396754cd0ff76fdd22910d303" + }, + "cell_source_sha256": "06a162fcdae6b329384ec33322f443df07215d86e56f0505ac15b3d3473eb432", + "border_relocator_mode": "cell", + "border_relocator": true, + "regularization": { + "scheme": "constant", + "coefficient": 1.0 + }, + "vmap_batch": 20, + "lanes": "captured", + "captured_pass": "rate", + "batch_sample": null, + "solver_source": "library", + "solver": "certified", + "certified_fallback": "none", + "certified_pass_budget": 16, + "certified_tau_rel": 1e-09, + "use_mixed_precision": false, + "thread_env": { + "n_threads": null, + "vars": [ + "OPENBLAS_NUM_THREADS", + "MKL_NUM_THREADS", + "OMP_NUM_THREADS", + "VECLIB_MAXIMUM_THREADS", + "NUMEXPR_NUM_THREADS" + ], + "set_to": null, + "preexisting": {}, + "overridden": {}, + "note": "Not pinned (legacy variant): recorded as found." + } + }, + "captured": { + "batches_path": "/mnt/ral/jnightin/autolens_profiling_wt/certified-solver-phase-c1-lane-rate/results/breakdown/imaging/nautilus_batches_rectangular_pix1.npz", + "batches_sha256": "c0b62fba544cb62c8a273c19837cf364127f5af7fdaa110f3a2c8a973e0b6cc0", + "schema_version": 2, + "n_calls": 972, + "n_lanes": 19440, + "call_sizes_seen": [ + 20 + ], + "calls_by_phase": { + "prior": 15, + "exploration": 957 + }, + "parameter_paths": [ + "galaxies.source.pixelization.regularization.inner_coefficient", + "galaxies.source.pixelization.regularization.outer_coefficient", + "galaxies.source.pixelization.regularization.signal_scale", + "galaxies.lens.mass.centre.centre_0", + "galaxies.lens.mass.centre.centre_1", + "galaxies.lens.mass.einstein_radius", + "galaxies.lens.mass.ell_comps.ell_comps_0", + "galaxies.lens.mass.ell_comps.ell_comps_1", + "galaxies.lens.shear.gamma_1", + "galaxies.lens.shear.gamma_2" + ], + "stage": "pix1", + "regularization": { + "class": "Adapt", + "free": true, + "priors": { + "inner_coefficient": [ + "LogUniform", + 1e-06, + 1000000.0 + ], + "outer_coefficient": [ + "LogUniform", + 1e-06, + 1000000.0 + ], + "signal_scale": [ + "Uniform", + 0.0, + 1.0 + ] + }, + "priors_source": "PyAutoGalaxy packaged config/priors/regularization (adapt_split.yaml / adapt.yaml / constant.yaml); adapt_split.yaml and adapt.yaml are identical to euclid_strong_lens_modeling_pipeline/config/priors/regularization/'s copies" + }, + "nautilus": { + "departures_from_production": [ + "mass/shear priors are the phase-B cell's Gaussians, not chained from source_lp", + "no positions likelihood", + "the cell's mesh (39x39 RectangularBilinearAdaptImage, weight_power 1, weight_floor 0) fixed in both stages; source_pix_1 uses RectangularBilinearAdaptDensity, source_pix_2 frees weight_power / weight_floor", + "seeded (production passes no seed)", + "quick updates disabled (iterations_per_quick_update=1e12; render-only)", + "NullPaths: no output directory, so no checkpoint and one Sampler.run call", + "post-fit perform_update skipped (samples / latent variables never built)" + ], + "n_batch": 20, + "n_like_max": 40000, + "n_live": 150, + "number_of_cores": 1, + "production_reference": "euclid_strong_lens_modeling_pipeline/scripts/full_model.py source_pix_1 (n_live=150) / source_pix_2 (n_live=75): af.Nautilus(n_batch=20, **SettingsSearch.search_dict) with use_jax_vmap=True and number_of_cores=1 (SettingsSearch defaults)", + "production_stage": "source_pix_1", + "seed": 1, + "stage": "pix1", + "use_jax_vmap": true, + "version": "1.0.5" + }, + "capture_fit_status": "sampling complete (n_like_max or convergence); post-fit result skipped", + "capture_library_revisions": { + "PyAutoArray": { + "head": "3de624b5b91a4efa130dc3cb0a3a0f06f85025a3", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoArray" + }, + "PyAutoFit": { + "head": "dd9fbe0aab60c4a57702b1444ca031b317c91331", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoFit" + }, + "PyAutoGalaxy": { + "head": "70a61e26cd715cefe7012a38285698091246a8a4", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy" + }, + "PyAutoLens": { + "head": "86054bbc19baa2f710a12e04a94fa27ab37cc354", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoLens" + }, + "PyAutoNerves": { + "head": "1fa613aa8d89a79613009fb66f5b4e2d21deb57a", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoNerves" + } + }, + "fingerprint_check": { + "fields": [ + "mesh", + "source_pixels", + "dataset_sha256", + "regularization_class", + "regularization_s0_fiducial", + "border_relocator", + "use_mixed_precision", + "log_evidence_s3_library" + ], + "not_identity": "the regularization coefficients: free per lane since the capture frees them", + "log_evidence_s3_library_rel_diff": 0.0, + "passed": true + } + }, + "rate": { + "pass": "rate", + "solver": "certified", + "certified_fallback": "none", + "certified_pass_budget": 16, + "certified_pass_budget_basis": "config default (Settings().certified_pass_budget)", + "composition": "jax.jit(jax.vmap(fn)) \u2014 the current Fitness._vmap composition", + "chunk_size": 20, + "chunk_rule": "the replayed lanes in capture order, split into chunks of --vmap-batch; the last chunk is padded by repeating its final lane and the padded rows are dropped. At --vmap-batch == n_batch every chunk is exactly one captured Nautilus batch.", + "batch_sample": null, + "stage": "pix1", + "regularization_range": { + "galaxies.source.pixelization.regularization.inner_coefficient": { + "min": 1.0077697054123213e-06, + "max": 797698.1658704937 + }, + "galaxies.source.pixelization.regularization.outer_coefficient": { + "min": 1.1079234913024822e-06, + "max": 994245.7042339334 + }, + "galaxies.source.pixelization.regularization.signal_scale": { + "min": 6.277279855516904e-05, + "max": 0.9998558026350854 + } + }, + "calls_replayed": 972, + "calls_rule": "all captured calls", + "report_source": "library solve observed through its stats= out-dict (PyAutoArray #566) and jax.debug.callback(..., ordered=True); untimed; one row per lane checked per chunk", + "traced_solver_kwargs_jax": [ + "certified" + ], + "overall": { + "n_lanes": 19440, + "n_uncertified": 365, + "uncertified_rate": 0.018775720164609055, + "max_passes": 16, + "mean_passes": 5.948251028806585, + "n_at_budget": 376, + "budget": 16, + "passes_histogram": { + "0": 1, + "1": 23, + "2": 132, + "3": 358, + "4": 719, + "5": 9222, + "6": 3935, + "7": 2722, + "8": 1406, + "9": 326, + "10": 131, + "11": 32, + "12": 19, + "13": 13, + "14": 9, + "15": 16, + "16": 376 + } + }, + "by_nautilus_phase": { + "prior": { + "n_lanes": 300, + "n_uncertified": 43, + "uncertified_rate": 0.14333333333333334, + "max_passes": 16, + "mean_passes": 5.626666666666667, + "n_at_budget": 46, + "budget": 16, + "passes_histogram": { + "0": 1, + "1": 8, + "2": 28, + "3": 141, + "4": 26, + "5": 13, + "6": 8, + "7": 12, + "8": 5, + "9": 4, + "10": 5, + "11": 1, + "12": 1, + "15": 1, + "16": 46 + } + }, + "exploration": { + "n_lanes": 19140, + "n_uncertified": 322, + "uncertified_rate": 0.01682340647857889, + "max_passes": 16, + "mean_passes": 5.953291536050156, + "n_at_budget": 330, + "budget": 16, + "passes_histogram": { + "1": 15, + "2": 104, + "3": 217, + "4": 693, + "5": 9209, + "6": 3927, + "7": 2710, + "8": 1401, + "9": 322, + "10": 126, + "11": 31, + "12": 18, + "13": 13, + "14": 9, + "15": 15, + "16": 330 + } + } + }, + "by_call_half": { + "early": { + "n_lanes": 9720, + "n_uncertified": 365, + "uncertified_rate": 0.03755144032921811, + "max_passes": 16, + "mean_passes": 6.660082304526749, + "n_at_budget": 376, + "budget": 16, + "passes_histogram": { + "0": 1, + "1": 23, + "2": 132, + "3": 357, + "4": 664, + "5": 1818, + "6": 1765, + "7": 2637, + "8": 1401, + "9": 326, + "10": 131, + "11": 32, + "12": 19, + "13": 13, + "14": 9, + "15": 16, + "16": 376 + } + }, + "late": { + "n_lanes": 9720, + "n_uncertified": 0, + "uncertified_rate": 0.0, + "max_passes": 8, + "mean_passes": 5.23641975308642, + "n_at_budget": 0, + "budget": 16, + "passes_histogram": { + "3": 1, + "4": 55, + "5": 7404, + "6": 2170, + "7": 85, + "8": 5 + } + } + }, + "phase_rule": "by_nautilus_phase: the sampler state when the batch was requested (nautilus_batches.phase_of) \u2014 prior = only the unit-cube bound (prior draws), exploration = more bounds and Sampler.explored False, sampling = explored True. by_call_half: early = call index below the median replayed call index, late = the rest.", + "vs_capture_pdip": { + "reference": "the capture's own figure of merit for the lane: library PDIP through Fitness.call_wrap's jax.jit(jax.vmap(call)) over parameter vectors", + "n_compared": 19324, + "n_excluded_resampled_or_nonfinite": 116, + "max_rel_diff": 0.05000479767687287, + "median_rel_diff": 1.0305711991384924e-11, + "max_abs_diff_nats": 140.81189957504466, + "n_above_lane_rtol": 518, + "n_above_lane_rtol_uncertified": 354, + "lane_rtol": 1e-09, + "gated": false, + "note": "RECORDED, NOT GATED: a cross-composition comparison (Fitness over vectors vs this cell over trees) and, for certified lanes, certified vs PDIP. The gated 1e-9 pin is the timed pass's (same composition, same lanes). It still shows whether a certified_fallback=none lane that FAILED its certificate returned a wrong answer." + }, + "uncertified_pdip_recheck": { + "n_uncertified": 365, + "n_rechecked": 256, + "cap": 256, + "max_rel_diff": 0.05000479731872855, + "rows": [ + { + "lane_row": 6, + "call_index": 0, + "lane_in_call": 6, + "phase": "prior", + "passes": 16, + "log_likelihood_certified_none": 18421.546221008975, + "log_likelihood_scalar_library_pdip": 18400.78331401105, + "rel_diff": 0.001128370822241951, + "abs_diff_nats": 20.76290699792662 + }, + { + "lane_row": 11, + "call_index": 0, + "lane_in_call": 11, + "phase": "prior", + "passes": 16, + "log_likelihood_certified_none": 15839.779812746834, + "log_likelihood_scalar_library_pdip": 15837.789694055693, + "rel_diff": 0.00012565634028389997, + "abs_diff_nats": 1.990118691141106 + }, + { + "lane_row": 24, + "call_index": 1, + "lane_in_call": 4, + "phase": "prior", + "passes": 16, + "log_likelihood_certified_none": 19072.87558330359, + "log_likelihood_scalar_library_pdip": 19067.77680971184, + "rel_diff": 0.00026740262604471815, + "abs_diff_nats": 5.098773591751524 + }, + { + "lane_row": 27, + "call_index": 1, + "lane_in_call": 7, + "phase": "prior", + "passes": 16, + "log_likelihood_certified_none": 13159.48113672431, + "log_likelihood_scalar_library_pdip": 13149.428943270654, + "rel_diff": 0.0007644585553504053, + "abs_diff_nats": 10.05219345365549 + }, + { + "lane_row": 29, + "call_index": 1, + "lane_in_call": 9, + "phase": "prior", + "passes": 16, + "log_likelihood_certified_none": 3574.805242943723, + "log_likelihood_scalar_library_pdip": 3538.7353157210455, + "rel_diff": 0.010192886442349806, + "abs_diff_nats": 36.06992722267751 + }, + { + "lane_row": 32, + "call_index": 1, + "lane_in_call": 12, + "phase": "prior", + "passes": 16, + "log_likelihood_certified_none": 8741.256932303033, + "log_likelihood_scalar_library_pdip": 8757.817299905091, + "rel_diff": 0.0018909240778792811, + "abs_diff_nats": 16.56036760205825 + }, + { + "lane_row": 51, + "call_index": 2, + "lane_in_call": 11, + "phase": "prior", + "passes": 16, + "log_likelihood_certified_none": 20693.827209023395, + "log_likelihood_scalar_library_pdip": 20694.450129406825, + "rel_diff": 3.010084247393738e-05, + "abs_diff_nats": 0.6229203834300279 + }, + { + "lane_row": 56, + "call_index": 2, + "lane_in_call": 16, + "phase": "prior", + "passes": 16, + "log_likelihood_certified_none": 14876.00353341199, + "log_likelihood_scalar_library_pdip": 14865.989557974695, + "rel_diff": 0.0006736164718965585, + "abs_diff_nats": 10.013975437293993 + }, + { + "lane_row": 60, + "call_index": 3, + "lane_in_call": 0, + "phase": "prior", + "passes": 16, + "log_likelihood_certified_none": 17458.39748955646, + "log_likelihood_scalar_library_pdip": 17448.72923030406, + "rel_diff": 0.000554095322633, + "abs_diff_nats": 9.668259252401185 + }, + { + "lane_row": 78, + "call_index": 3, + "lane_in_call": 18, + "phase": "prior", + "passes": 16, + "log_likelihood_certified_none": 19895.955653410576, + "log_likelihood_scalar_library_pdip": 19893.260831711454, + "rel_diff": 0.00013546405096275096, + "abs_diff_nats": 2.694821699122258 + }, + { + "lane_row": 84, + "call_index": 4, + "lane_in_call": 4, + "phase": "prior", + "passes": 16, + "log_likelihood_certified_none": 17991.13252963745, + "log_likelihood_scalar_library_pdip": 17991.27353993335, + "rel_diff": 7.837705073443825e-06, + "abs_diff_nats": 0.14101029590165126 + }, + { + "lane_row": 86, + "call_index": 4, + "lane_in_call": 6, + "phase": "prior", + "passes": 16, + "log_likelihood_certified_none": 18605.42823404949, + "log_likelihood_scalar_library_pdip": 18605.704732640676, + "rel_diff": 1.4860957709400876e-05, + "abs_diff_nats": 0.2764985911853728 + }, + { + "lane_row": 91, + "call_index": 4, + "lane_in_call": 11, + "phase": "prior", + "passes": 16, + "log_likelihood_certified_none": 19073.13211616996, + "log_likelihood_scalar_library_pdip": 19068.364389141097, + "rel_diff": 0.0002500333500852003, + "abs_diff_nats": 4.767727028862282 + }, + { + "lane_row": 98, + "call_index": 4, + "lane_in_call": 18, + "phase": "prior", + "passes": 16, + "log_likelihood_certified_none": 22082.684603414513, + "log_likelihood_scalar_library_pdip": 22082.684603409605, + "rel_diff": 2.2223898492889644e-13, + "abs_diff_nats": 4.907633410766721e-09 + }, + { + "lane_row": 112, + "call_index": 5, + "lane_in_call": 12, + "phase": "prior", + "passes": 16, + "log_likelihood_certified_none": 16281.98382742959, + "log_likelihood_scalar_library_pdip": 16266.98959274841, + "rel_diff": 0.0009217584234433027, + "abs_diff_nats": 14.994234681180387 + }, + { + "lane_row": 115, + "call_index": 5, + "lane_in_call": 15, + "phase": "prior", + "passes": 16, + "log_likelihood_certified_none": 18842.710412277716, + "log_likelihood_scalar_library_pdip": 18842.39100328466, + "rel_diff": 1.695161686216687e-05, + "abs_diff_nats": 0.3194089930548216 + }, + { + "lane_row": 122, + "call_index": 6, + "lane_in_call": 2, + "phase": "prior", + "passes": 16, + "log_likelihood_certified_none": 9134.022674840024, + "log_likelihood_scalar_library_pdip": 9131.78323442171, + "rel_diff": 0.000245235827529584, + "abs_diff_nats": 2.2394404183141887 + }, + { + "lane_row": 127, + "call_index": 6, + "lane_in_call": 7, + "phase": "prior", + "passes": 16, + "log_likelihood_certified_none": 19251.43319558834, + "log_likelihood_scalar_library_pdip": 19251.264132559158, + "rel_diff": 8.781918320651165e-06, + "abs_diff_nats": 0.1690630291814159 + }, + { + "lane_row": 131, + "call_index": 6, + "lane_in_call": 11, + "phase": "prior", + "passes": 16, + "log_likelihood_certified_none": 20693.09862158689, + "log_likelihood_scalar_library_pdip": 20692.968209388644, + "rel_diff": 6.302247069004908e-06, + "abs_diff_nats": 0.1304121982466313 + }, + { + "lane_row": 133, + "call_index": 6, + "lane_in_call": 13, + "phase": "prior", + "passes": 16, + "log_likelihood_certified_none": 18435.623281508393, + "log_likelihood_scalar_library_pdip": 18437.445007567054, + "rel_diff": 9.880577584980168e-05, + "abs_diff_nats": 1.8217260586607154 + }, + { + "lane_row": 137, + "call_index": 6, + "lane_in_call": 17, + "phase": "prior", + "passes": 16, + "log_likelihood_certified_none": 1268.2537371400394, + "log_likelihood_scalar_library_pdip": 1267.1710998384588, + "rel_diff": 0.0008543734162803318, + "abs_diff_nats": 1.0826373015806894 + }, + { + "lane_row": 138, + "call_index": 6, + "lane_in_call": 18, + "phase": "prior", + "passes": 16, + "log_likelihood_certified_none": 20751.9108486485, + "log_likelihood_scalar_library_pdip": 20754.54346537806, + "rel_diff": 0.00012684532107172102, + "abs_diff_nats": 2.6326167295628693 + }, + { + "lane_row": 145, + "call_index": 7, + "lane_in_call": 5, + "phase": "prior", + "passes": 16, + "log_likelihood_certified_none": 18520.405774003622, + "log_likelihood_scalar_library_pdip": 18522.401053261885, + "rel_diff": 0.00010772249518434979, + "abs_diff_nats": 1.9952792582625989 + }, + { + "lane_row": 159, + "call_index": 7, + "lane_in_call": 19, + "phase": "prior", + "passes": 16, + "log_likelihood_certified_none": 19027.50342365381, + "log_likelihood_scalar_library_pdip": 19024.088020681098, + "rel_diff": 0.0001795304441925255, + "abs_diff_nats": 3.415402972710581 + }, + { + "lane_row": 161, + "call_index": 8, + "lane_in_call": 1, + "phase": "prior", + "passes": 16, + "log_likelihood_certified_none": 16420.241962014417, + "log_likelihood_scalar_library_pdip": 16420.241962010226, + "rel_diff": 2.5523080570102523e-13, + "abs_diff_nats": 4.190951585769653e-09 + }, + { + "lane_row": 162, + "call_index": 8, + "lane_in_call": 2, + "phase": "prior", + "passes": 16, + "log_likelihood_certified_none": 16771.387770521338, + "log_likelihood_scalar_library_pdip": 16795.121565497408, + "rel_diff": 0.0014131362421827501, + "abs_diff_nats": 23.733794976069476 + }, + { + "lane_row": 169, + "call_index": 8, + "lane_in_call": 9, + "phase": "prior", + "passes": 16, + "log_likelihood_certified_none": -1281.4521451736582, + "log_likelihood_scalar_library_pdip": -1348.9038066264766, + "rel_diff": 0.05000479731872855, + "abs_diff_nats": 67.45166145281837 + }, + { + "lane_row": 170, + "call_index": 8, + "lane_in_call": 10, + "phase": "prior", + "passes": 16, + "log_likelihood_certified_none": 16106.20215654446, + "log_likelihood_scalar_library_pdip": 16106.202136807471, + "rel_diff": 1.2254278203683474e-09, + "abs_diff_nats": 1.973698817892e-05 + }, + { + "lane_row": 184, + "call_index": 9, + "lane_in_call": 4, + "phase": "prior", + "passes": 16, + "log_likelihood_certified_none": 18681.757193178506, + "log_likelihood_scalar_library_pdip": 18684.596860679943, + "rel_diff": 0.00015197906182354872, + "abs_diff_nats": 2.8396675014373614 + }, + { + "lane_row": 185, + "call_index": 9, + "lane_in_call": 5, + "phase": "prior", + "passes": 16, + "log_likelihood_certified_none": 19162.883512805245, + "log_likelihood_scalar_library_pdip": 19158.74697543469, + "rel_diff": 0.00021590855476402523, + "abs_diff_nats": 4.136537370555743 + }, + { + "lane_row": 194, + "call_index": 9, + "lane_in_call": 14, + "phase": "prior", + "passes": 16, + "log_likelihood_certified_none": 7874.077596740972, + "log_likelihood_scalar_library_pdip": 7876.143002373472, + "rel_diff": 0.0002622356693977977, + "abs_diff_nats": 2.0654056325001875 + }, + { + "lane_row": 200, + "call_index": 10, + "lane_in_call": 0, + "phase": "prior", + "passes": 16, + "log_likelihood_certified_none": 17232.45006347257, + "log_likelihood_scalar_library_pdip": 17228.61918047958, + "rel_diff": 0.00022235577633109528, + "abs_diff_nats": 3.830882992988336 + }, + { + "lane_row": 210, + "call_index": 10, + "lane_in_call": 10, + "phase": "prior", + "passes": 16, + "log_likelihood_certified_none": 11265.98001294629, + "log_likelihood_scalar_library_pdip": 11222.198472371536, + "rel_diff": 0.0039013336542337196, + "abs_diff_nats": 43.78154057475331 + }, + { + "lane_row": 211, + "call_index": 10, + "lane_in_call": 11, + "phase": "prior", + "passes": 16, + "log_likelihood_certified_none": 17456.701447365027, + "log_likelihood_scalar_library_pdip": 17434.20400550346, + "rel_diff": 0.0012904197894246117, + "abs_diff_nats": 22.497441861567495 + }, + { + "lane_row": 215, + "call_index": 10, + "lane_in_call": 15, + "phase": "prior", + "passes": 16, + "log_likelihood_certified_none": 12339.3586796921, + "log_likelihood_scalar_library_pdip": 12329.945993231668, + "rel_diff": 0.0007634004614132233, + "abs_diff_nats": 9.412686460433179 + }, + { + "lane_row": 216, + "call_index": 10, + "lane_in_call": 16, + "phase": "prior", + "passes": 16, + "log_likelihood_certified_none": 16950.738169838107, + "log_likelihood_scalar_library_pdip": 16955.28697103611, + "rel_diff": 0.00026828217096955964, + "abs_diff_nats": 4.548801198001456 + }, + { + "lane_row": 238, + "call_index": 11, + "lane_in_call": 18, + "phase": "prior", + "passes": 16, + "log_likelihood_certified_none": 13961.651561334293, + "log_likelihood_scalar_library_pdip": 13937.93423810642, + "rel_diff": 0.0017016383362628798, + "abs_diff_nats": 23.71732322787284 + }, + { + "lane_row": 239, + "call_index": 11, + "lane_in_call": 19, + "phase": "prior", + "passes": 16, + "log_likelihood_certified_none": 13423.0540739042, + "log_likelihood_scalar_library_pdip": 13421.021939965402, + "rel_diff": 0.00015141424758035023, + "abs_diff_nats": 2.032133938799234 + }, + { + "lane_row": 241, + "call_index": 12, + "lane_in_call": 1, + "phase": "prior", + "passes": 16, + "log_likelihood_certified_none": 18288.829157042514, + "log_likelihood_scalar_library_pdip": 18285.305226076576, + "rel_diff": 0.00019271928591664227, + "abs_diff_nats": 3.523930965937325 + }, + { + "lane_row": 253, + "call_index": 12, + "lane_in_call": 13, + "phase": "prior", + "passes": 16, + "log_likelihood_certified_none": 18302.81187108045, + "log_likelihood_scalar_library_pdip": 18297.31272177783, + "rel_diff": 0.0003005440955311486, + "abs_diff_nats": 5.4991493026172975 + }, + { + "lane_row": 256, + "call_index": 12, + "lane_in_call": 16, + "phase": "prior", + "passes": 16, + "log_likelihood_certified_none": 17210.22031179483, + "log_likelihood_scalar_library_pdip": 17208.268824454368, + "rel_diff": 0.00011340404780805793, + "abs_diff_nats": 1.9514873404623359 + }, + { + "lane_row": 276, + "call_index": 13, + "lane_in_call": 16, + "phase": "prior", + "passes": 16, + "log_likelihood_certified_none": 17951.718345449422, + "log_likelihood_scalar_library_pdip": 17933.907135557507, + "rel_diff": 0.0009931583651730449, + "abs_diff_nats": 17.811209891915496 + }, + { + "lane_row": 283, + "call_index": 14, + "lane_in_call": 3, + "phase": "prior", + "passes": 16, + "log_likelihood_certified_none": 19020.849164870964, + "log_likelihood_scalar_library_pdip": 19013.67253337732, + "rel_diff": 0.0003774458343618226, + "abs_diff_nats": 7.176631493643072 + }, + { + "lane_row": 300, + "call_index": 15, + "lane_in_call": 0, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 18463.288067231657, + "log_likelihood_scalar_library_pdip": 18463.078970707007, + "rel_diff": 1.1325116736029837e-05, + "abs_diff_nats": 0.20909652464979445 + }, + { + "lane_row": 301, + "call_index": 15, + "lane_in_call": 1, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 15734.704790642205, + "log_likelihood_scalar_library_pdip": 15734.21749633948, + "rel_diff": 3.0970355077343616e-05, + "abs_diff_nats": 0.4872943027257861 + }, + { + "lane_row": 302, + "call_index": 15, + "lane_in_call": 2, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 18704.474460443, + "log_likelihood_scalar_library_pdip": 18706.16598652238, + "rel_diff": 9.042612369622558e-05, + "abs_diff_nats": 1.6915260793794005 + }, + { + "lane_row": 308, + "call_index": 15, + "lane_in_call": 8, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 19066.421358553263, + "log_likelihood_scalar_library_pdip": 19060.20267912919, + "rel_diff": 0.00032626512575770043, + "abs_diff_nats": 6.218679424073343 + }, + { + "lane_row": 309, + "call_index": 15, + "lane_in_call": 9, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 12781.02635455443, + "log_likelihood_scalar_library_pdip": 12782.70332143049, + "rel_diff": 0.00013119031506029615, + "abs_diff_nats": 1.6769668760607601 + }, + { + "lane_row": 311, + "call_index": 15, + "lane_in_call": 11, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": -3234.471614889735, + "log_likelihood_scalar_library_pdip": -3234.481430921878, + "rel_diff": 3.034808624743709e-06, + "abs_diff_nats": 0.00981603214313509 + }, + { + "lane_row": 312, + "call_index": 15, + "lane_in_call": 12, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 18887.307347644703, + "log_likelihood_scalar_library_pdip": 18883.93355609074, + "rel_diff": 0.0001786593637360021, + "abs_diff_nats": 3.373791553964111 + }, + { + "lane_row": 316, + "call_index": 15, + "lane_in_call": 16, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 16093.515739414663, + "log_likelihood_scalar_library_pdip": 16088.259041698664, + "rel_diff": 0.0003267412404520542, + "abs_diff_nats": 5.256697715998598 + }, + { + "lane_row": 318, + "call_index": 15, + "lane_in_call": 18, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 18622.433656659538, + "log_likelihood_scalar_library_pdip": 18620.968710155976, + "rel_diff": 7.86718739698443e-05, + "abs_diff_nats": 1.464946503561805 + }, + { + "lane_row": 319, + "call_index": 15, + "lane_in_call": 19, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 7274.769367446595, + "log_likelihood_scalar_library_pdip": 7217.440786173451, + "rel_diff": 0.007943062225459445, + "abs_diff_nats": 57.328581273144664 + }, + { + "lane_row": 322, + "call_index": 16, + "lane_in_call": 2, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 10571.238213018223, + "log_likelihood_scalar_library_pdip": 10567.732718102652, + "rel_diff": 0.0003317168411693532, + "abs_diff_nats": 3.5054949155710347 + }, + { + "lane_row": 324, + "call_index": 16, + "lane_in_call": 4, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 14135.04200895291, + "log_likelihood_scalar_library_pdip": 14131.499763663749, + "rel_diff": 0.00025066308236227074, + "abs_diff_nats": 3.542245289161656 + }, + { + "lane_row": 326, + "call_index": 16, + "lane_in_call": 6, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 18496.516906199387, + "log_likelihood_scalar_library_pdip": 18491.477137097572, + "rel_diff": 0.00027254551188365614, + "abs_diff_nats": 5.039769101815182 + }, + { + "lane_row": 330, + "call_index": 16, + "lane_in_call": 10, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 18456.654040055975, + "log_likelihood_scalar_library_pdip": 18458.059022989044, + "rel_diff": 7.611758805836259e-05, + "abs_diff_nats": 1.4049829330688226 + }, + { + "lane_row": 332, + "call_index": 16, + "lane_in_call": 12, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 19083.337271699602, + "log_likelihood_scalar_library_pdip": 19082.159112472924, + "rel_diff": 6.174140042191907e-05, + "abs_diff_nats": 1.1781592266779626 + }, + { + "lane_row": 335, + "call_index": 16, + "lane_in_call": 15, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 17579.3887001561, + "log_likelihood_scalar_library_pdip": 17571.275632183253, + "rel_diff": 0.000461723334302989, + "abs_diff_nats": 8.113067972848512 + }, + { + "lane_row": 336, + "call_index": 16, + "lane_in_call": 16, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 18668.585942099293, + "log_likelihood_scalar_library_pdip": 18664.94647956068, + "rel_diff": 0.0001949891762399805, + "abs_diff_nats": 3.639462538612861 + }, + { + "lane_row": 337, + "call_index": 16, + "lane_in_call": 17, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 15119.69716042437, + "log_likelihood_scalar_library_pdip": 15118.859355707224, + "rel_diff": 5.5414545332753016e-05, + "abs_diff_nats": 0.837804717146355 + }, + { + "lane_row": 338, + "call_index": 16, + "lane_in_call": 18, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 18913.042523045908, + "log_likelihood_scalar_library_pdip": 18915.856016800164, + "rel_diff": 0.0001487373213116832, + "abs_diff_nats": 2.813493754256342 + }, + { + "lane_row": 339, + "call_index": 16, + "lane_in_call": 19, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 19091.996147961163, + "log_likelihood_scalar_library_pdip": 19083.97025057711, + "rel_diff": 0.0004205570056268019, + "abs_diff_nats": 8.025897384053678 + }, + { + "lane_row": 343, + "call_index": 17, + "lane_in_call": 3, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 17931.309208985793, + "log_likelihood_scalar_library_pdip": 17930.42303106947, + "rel_diff": 4.942314605673013e-05, + "abs_diff_nats": 0.8861779163235042 + }, + { + "lane_row": 344, + "call_index": 17, + "lane_in_call": 4, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 16076.33104036175, + "log_likelihood_scalar_library_pdip": 16076.3203998807, + "rel_diff": 6.61872915299576e-07, + "abs_diff_nats": 0.010640481050359085 + }, + { + "lane_row": 357, + "call_index": 17, + "lane_in_call": 17, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 18771.639661782632, + "log_likelihood_scalar_library_pdip": 18770.911828116296, + "rel_diff": 3.877455037887226e-05, + "abs_diff_nats": 0.7278336663366645 + }, + { + "lane_row": 358, + "call_index": 17, + "lane_in_call": 18, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 22546.633560121656, + "log_likelihood_scalar_library_pdip": 22546.604462890118, + "rel_diff": 1.2905371886831623e-06, + "abs_diff_nats": 0.029097231537889456 + }, + { + "lane_row": 359, + "call_index": 17, + "lane_in_call": 19, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 7734.280054678009, + "log_likelihood_scalar_library_pdip": 7812.09695498721, + "rel_diff": 0.009961077129172435, + "abs_diff_nats": 77.81690030920072 + }, + { + "lane_row": 362, + "call_index": 18, + "lane_in_call": 2, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 13291.473654460879, + "log_likelihood_scalar_library_pdip": 13260.25168841827, + "rel_diff": 0.0023545530489348693, + "abs_diff_nats": 31.221966042608983 + }, + { + "lane_row": 366, + "call_index": 18, + "lane_in_call": 6, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 7810.896171039018, + "log_likelihood_scalar_library_pdip": 7804.299245169263, + "rel_diff": 0.0008452938133860591, + "abs_diff_nats": 6.596925869755069 + }, + { + "lane_row": 374, + "call_index": 18, + "lane_in_call": 14, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 17531.67396060824, + "log_likelihood_scalar_library_pdip": 17529.778526225873, + "rel_diff": 0.00010812654475538601, + "abs_diff_nats": 1.8954343823679665 + }, + { + "lane_row": 376, + "call_index": 18, + "lane_in_call": 16, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 18873.723176518466, + "log_likelihood_scalar_library_pdip": 18873.21401302624, + "rel_diff": 2.6978101974215545e-05, + "abs_diff_nats": 0.5091634922246158 + }, + { + "lane_row": 378, + "call_index": 18, + "lane_in_call": 18, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 19986.63747401181, + "log_likelihood_scalar_library_pdip": 19995.254723550373, + "rel_diff": 0.00043096472926710736, + "abs_diff_nats": 8.617249538561737 + }, + { + "lane_row": 380, + "call_index": 19, + "lane_in_call": 0, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 18798.97388205173, + "log_likelihood_scalar_library_pdip": 18783.815962903987, + "rel_diff": 0.0008069669750639776, + "abs_diff_nats": 15.157919147743087 + }, + { + "lane_row": 382, + "call_index": 19, + "lane_in_call": 2, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 18272.258407549605, + "log_likelihood_scalar_library_pdip": 18267.205813579974, + "rel_diff": 0.00027659369589380216, + "abs_diff_nats": 5.052593969630834 + }, + { + "lane_row": 386, + "call_index": 19, + "lane_in_call": 6, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 13701.684715387612, + "log_likelihood_scalar_library_pdip": 13721.263087942294, + "rel_diff": 0.0014268637245128896, + "abs_diff_nats": 19.578372554682574 + }, + { + "lane_row": 387, + "call_index": 19, + "lane_in_call": 7, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 17600.886279176797, + "log_likelihood_scalar_library_pdip": 17601.082237780687, + "rel_diff": 1.1133326987675304e-05, + "abs_diff_nats": 0.19595860389017616 + }, + { + "lane_row": 391, + "call_index": 19, + "lane_in_call": 11, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 11220.407702851615, + "log_likelihood_scalar_library_pdip": 11215.135969954568, + "rel_diff": 0.0004700551924800212, + "abs_diff_nats": 5.271732897046604 + }, + { + "lane_row": 392, + "call_index": 19, + "lane_in_call": 12, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 19084.044959251005, + "log_likelihood_scalar_library_pdip": 19088.015083180366, + "rel_diff": 0.0002079904019386057, + "abs_diff_nats": 3.9701239293608523 + }, + { + "lane_row": 393, + "call_index": 19, + "lane_in_call": 13, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 19617.704863749423, + "log_likelihood_scalar_library_pdip": 19617.474006642136, + "rel_diff": 1.1767932365202526e-05, + "abs_diff_nats": 0.23085710728628328 + }, + { + "lane_row": 395, + "call_index": 19, + "lane_in_call": 15, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 19113.432446940613, + "log_likelihood_scalar_library_pdip": 19113.30154508107, + "rel_diff": 6.848730933968461e-06, + "abs_diff_nats": 0.1309018595420639 + }, + { + "lane_row": 396, + "call_index": 19, + "lane_in_call": 16, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 18821.94189147732, + "log_likelihood_scalar_library_pdip": 18833.80956098336, + "rel_diff": 0.0006301258100553135, + "abs_diff_nats": 11.867669506042148 + }, + { + "lane_row": 400, + "call_index": 20, + "lane_in_call": 0, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 20783.620816837734, + "log_likelihood_scalar_library_pdip": 20787.916151274992, + "rel_diff": 0.00020662650387853748, + "abs_diff_nats": 4.295334437258134 + }, + { + "lane_row": 406, + "call_index": 20, + "lane_in_call": 6, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 17529.944661908114, + "log_likelihood_scalar_library_pdip": 17527.47241674812, + "rel_diff": 0.00014104972475264337, + "abs_diff_nats": 2.4722451599918713 + }, + { + "lane_row": 413, + "call_index": 20, + "lane_in_call": 13, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 19490.858826057018, + "log_likelihood_scalar_library_pdip": 19490.769825632862, + "rel_diff": 4.566285731745799e-06, + "abs_diff_nats": 0.08900042415552889 + }, + { + "lane_row": 418, + "call_index": 20, + "lane_in_call": 18, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 18549.013220055935, + "log_likelihood_scalar_library_pdip": 18544.783734615743, + "rel_diff": 0.00022806873893583721, + "abs_diff_nats": 4.229485440191638 + }, + { + "lane_row": 419, + "call_index": 20, + "lane_in_call": 19, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 22637.416650563304, + "log_likelihood_scalar_library_pdip": 22635.981564273956, + "rel_diff": 6.339845635909779e-05, + "abs_diff_nats": 1.4350862893479643 + }, + { + "lane_row": 422, + "call_index": 21, + "lane_in_call": 2, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 18904.977429940765, + "log_likelihood_scalar_library_pdip": 18902.15042473575, + "rel_diff": 0.0001495599781765766, + "abs_diff_nats": 2.8270052050138474 + }, + { + "lane_row": 423, + "call_index": 21, + "lane_in_call": 3, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 14899.589176653328, + "log_likelihood_scalar_library_pdip": 14894.645094963482, + "rel_diff": 0.00033193685773135487, + "abs_diff_nats": 4.944081689845916 + }, + { + "lane_row": 427, + "call_index": 21, + "lane_in_call": 7, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 21841.893619710452, + "log_likelihood_scalar_library_pdip": 21840.13667970527, + "rel_diff": 8.044546748720867e-05, + "abs_diff_nats": 1.7569400051834236 + }, + { + "lane_row": 434, + "call_index": 21, + "lane_in_call": 14, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 17610.041038876487, + "log_likelihood_scalar_library_pdip": 17598.780993226577, + "rel_diff": 0.0006398196360442927, + "abs_diff_nats": 11.260045649909443 + }, + { + "lane_row": 436, + "call_index": 21, + "lane_in_call": 16, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 18816.871852998003, + "log_likelihood_scalar_library_pdip": 18815.701296141517, + "rel_diff": 6.221170489811602e-05, + "abs_diff_nats": 1.1705568564866553 + }, + { + "lane_row": 438, + "call_index": 21, + "lane_in_call": 18, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 12593.978005861623, + "log_likelihood_scalar_library_pdip": 12539.917941267315, + "rel_diff": 0.00431103814614318, + "abs_diff_nats": 54.06006459430864 + }, + { + "lane_row": 441, + "call_index": 22, + "lane_in_call": 1, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 18526.916049920183, + "log_likelihood_scalar_library_pdip": 18535.898793523644, + "rel_diff": 0.0004846133280895804, + "abs_diff_nats": 8.982743603461131 + }, + { + "lane_row": 446, + "call_index": 22, + "lane_in_call": 6, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 15543.429866446673, + "log_likelihood_scalar_library_pdip": 15542.42820993387, + "rel_diff": 6.444659092344265e-05, + "abs_diff_nats": 1.0016565128025832 + }, + { + "lane_row": 451, + "call_index": 22, + "lane_in_call": 11, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 16863.138065493644, + "log_likelihood_scalar_library_pdip": 16857.37326841301, + "rel_diff": 0.0003419748135634852, + "abs_diff_nats": 5.764797080635617 + }, + { + "lane_row": 452, + "call_index": 22, + "lane_in_call": 12, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 19886.459123084343, + "log_likelihood_scalar_library_pdip": 19886.68299534447, + "rel_diff": 1.1257395724438916e-05, + "abs_diff_nats": 0.2238722601250629 + }, + { + "lane_row": 457, + "call_index": 22, + "lane_in_call": 17, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 10614.795963762048, + "log_likelihood_scalar_library_pdip": 10586.140449872186, + "rel_diff": 0.0027068896379707514, + "abs_diff_nats": 28.65551388986205 + }, + { + "lane_row": 459, + "call_index": 22, + "lane_in_call": 19, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 18499.881769023592, + "log_likelihood_scalar_library_pdip": 18494.680508430636, + "rel_diff": 0.0002812300861636867, + "abs_diff_nats": 5.201260592955805 + }, + { + "lane_row": 464, + "call_index": 23, + "lane_in_call": 4, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 20856.469878717686, + "log_likelihood_scalar_library_pdip": 20849.59862375062, + "rel_diff": 0.0003295629374485844, + "abs_diff_nats": 6.871254967067216 + }, + { + "lane_row": 467, + "call_index": 23, + "lane_in_call": 7, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 9777.567458826965, + "log_likelihood_scalar_library_pdip": 9775.289552817969, + "rel_diff": 0.00023302696014149339, + "abs_diff_nats": 2.2779060089960694 + }, + { + "lane_row": 469, + "call_index": 23, + "lane_in_call": 9, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 21109.068431970583, + "log_likelihood_scalar_library_pdip": 21108.56722998, + "rel_diff": 2.3744008066664603e-05, + "abs_diff_nats": 0.5012019905843772 + }, + { + "lane_row": 470, + "call_index": 23, + "lane_in_call": 10, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 18981.361470185966, + "log_likelihood_scalar_library_pdip": 18981.786027134778, + "rel_diff": 2.2366543812325414e-05, + "abs_diff_nats": 0.4245569488120964 + }, + { + "lane_row": 479, + "call_index": 23, + "lane_in_call": 19, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 17968.328208532475, + "log_likelihood_scalar_library_pdip": 17973.97590807239, + "rel_diff": 0.000314215372758844, + "abs_diff_nats": 5.647699539913447 + }, + { + "lane_row": 483, + "call_index": 24, + "lane_in_call": 3, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 20722.168836137196, + "log_likelihood_scalar_library_pdip": 20722.33432610673, + "rel_diff": 7.98606792703291e-06, + "abs_diff_nats": 0.16548996953497408 + }, + { + "lane_row": 487, + "call_index": 24, + "lane_in_call": 7, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 16934.024529165137, + "log_likelihood_scalar_library_pdip": 16929.850165480304, + "rel_diff": 0.0002465682592598891, + "abs_diff_nats": 4.174363684833224 + }, + { + "lane_row": 489, + "call_index": 24, + "lane_in_call": 9, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 15400.454938642724, + "log_likelihood_scalar_library_pdip": 15390.392053182299, + "rel_diff": 0.0006538420480552271, + "abs_diff_nats": 10.062885460425605 + }, + { + "lane_row": 490, + "call_index": 24, + "lane_in_call": 10, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 19042.905507307183, + "log_likelihood_scalar_library_pdip": 19044.211622285824, + "rel_diff": 6.858330523445768e-05, + "abs_diff_nats": 1.306114978640835 + }, + { + "lane_row": 493, + "call_index": 24, + "lane_in_call": 13, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 19059.94890892703, + "log_likelihood_scalar_library_pdip": 19058.826973087456, + "rel_diff": 5.8866993291676424e-05, + "abs_diff_nats": 1.121935839571961 + }, + { + "lane_row": 495, + "call_index": 24, + "lane_in_call": 15, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 16504.48085685824, + "log_likelihood_scalar_library_pdip": 16511.570177147576, + "rel_diff": 0.00042935470178037097, + "abs_diff_nats": 7.089320289334864 + }, + { + "lane_row": 496, + "call_index": 24, + "lane_in_call": 16, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 19215.064217861014, + "log_likelihood_scalar_library_pdip": 19215.100293451855, + "rel_diff": 1.877460449830517e-06, + "abs_diff_nats": 0.03607559084048262 + }, + { + "lane_row": 498, + "call_index": 24, + "lane_in_call": 18, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 18879.31724725113, + "log_likelihood_scalar_library_pdip": 18878.443312133197, + "rel_diff": 4.629275324678382e-05, + "abs_diff_nats": 0.8739351179319783 + }, + { + "lane_row": 499, + "call_index": 24, + "lane_in_call": 19, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 9960.015365887211, + "log_likelihood_scalar_library_pdip": 9962.098051675704, + "rel_diff": 0.00020906096062192284, + "abs_diff_nats": 2.0826857884931087 + }, + { + "lane_row": 500, + "call_index": 25, + "lane_in_call": 0, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 18994.659197239976, + "log_likelihood_scalar_library_pdip": 18993.70478381696, + "rel_diff": 5.024893425897389e-05, + "abs_diff_nats": 0.9544134230163763 + }, + { + "lane_row": 502, + "call_index": 25, + "lane_in_call": 2, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 19648.012887065786, + "log_likelihood_scalar_library_pdip": 19638.159842100948, + "rel_diff": 0.0005017295430967766, + "abs_diff_nats": 9.853044964838773 + }, + { + "lane_row": 503, + "call_index": 25, + "lane_in_call": 3, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 18220.142064552005, + "log_likelihood_scalar_library_pdip": 18219.41520401842, + "rel_diff": 3.989483336570135e-05, + "abs_diff_nats": 0.7268605335848406 + }, + { + "lane_row": 505, + "call_index": 25, + "lane_in_call": 5, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 11346.057632279473, + "log_likelihood_scalar_library_pdip": 11332.056992989495, + "rel_diff": 0.001235489664289467, + "abs_diff_nats": 14.000639289977698 + }, + { + "lane_row": 507, + "call_index": 25, + "lane_in_call": 7, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 18764.748307695314, + "log_likelihood_scalar_library_pdip": 18765.878002957543, + "rel_diff": 6.019943548874913e-05, + "abs_diff_nats": 1.129695262228779 + }, + { + "lane_row": 512, + "call_index": 25, + "lane_in_call": 12, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 16803.200190253756, + "log_likelihood_scalar_library_pdip": 16807.63580120027, + "rel_diff": 0.0002639045133402087, + "abs_diff_nats": 4.435610946515226 + }, + { + "lane_row": 518, + "call_index": 25, + "lane_in_call": 18, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 19163.74424924836, + "log_likelihood_scalar_library_pdip": 19163.594248826368, + "rel_diff": 7.827363700399331e-06, + "abs_diff_nats": 0.1500004219924449 + }, + { + "lane_row": 519, + "call_index": 25, + "lane_in_call": 19, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 18642.74707730409, + "log_likelihood_scalar_library_pdip": 18639.304941780454, + "rel_diff": 0.00018467080904511796, + "abs_diff_nats": 3.442135523637262 + }, + { + "lane_row": 520, + "call_index": 26, + "lane_in_call": 0, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 19042.75486105936, + "log_likelihood_scalar_library_pdip": 19042.335765200347, + "rel_diff": 2.2008637185017497e-05, + "abs_diff_nats": 0.419095859011577 + }, + { + "lane_row": 523, + "call_index": 26, + "lane_in_call": 3, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 18923.274104123175, + "log_likelihood_scalar_library_pdip": 18926.90775154504, + "rel_diff": 0.0001919831527455626, + "abs_diff_nats": 3.633647421866044 + }, + { + "lane_row": 525, + "call_index": 26, + "lane_in_call": 5, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 19763.15006561599, + "log_likelihood_scalar_library_pdip": 19762.41114727714, + "rel_diff": 3.739009037635425e-05, + "abs_diff_nats": 0.7389183388513629 + }, + { + "lane_row": 529, + "call_index": 26, + "lane_in_call": 9, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 22474.37176597792, + "log_likelihood_scalar_library_pdip": 22474.42654065338, + "rel_diff": 2.437200137720365e-06, + "abs_diff_nats": 0.054774675460066646 + }, + { + "lane_row": 530, + "call_index": 26, + "lane_in_call": 10, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 18957.56326879355, + "log_likelihood_scalar_library_pdip": 18964.53296597818, + "rel_diff": 0.00036751219748629247, + "abs_diff_nats": 6.969697184627876 + }, + { + "lane_row": 531, + "call_index": 26, + "lane_in_call": 11, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 19075.161367731263, + "log_likelihood_scalar_library_pdip": 19078.041374849978, + "rel_diff": 0.00015095926579291853, + "abs_diff_nats": 2.880007118714275 + }, + { + "lane_row": 532, + "call_index": 26, + "lane_in_call": 12, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 19007.317064935414, + "log_likelihood_scalar_library_pdip": 19004.58367170536, + "rel_diff": 0.00014382810364444048, + "abs_diff_nats": 2.73339323005348 + }, + { + "lane_row": 538, + "call_index": 26, + "lane_in_call": 18, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 16971.796207218962, + "log_likelihood_scalar_library_pdip": 16971.68551462597, + "rel_diff": 6.522192088533007e-06, + "abs_diff_nats": 0.11069259299256373 + }, + { + "lane_row": 539, + "call_index": 26, + "lane_in_call": 19, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 18567.093914169818, + "log_likelihood_scalar_library_pdip": 18567.46613047488, + "rel_diff": 2.004669363320099e-05, + "abs_diff_nats": 0.37221630506246584 + }, + { + "lane_row": 541, + "call_index": 27, + "lane_in_call": 1, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 19004.782919247562, + "log_likelihood_scalar_library_pdip": 19001.616051426237, + "rel_diff": 0.00016666307816944113, + "abs_diff_nats": 3.1668678213245585 + }, + { + "lane_row": 542, + "call_index": 27, + "lane_in_call": 2, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 18459.745950573175, + "log_likelihood_scalar_library_pdip": 18469.610100370675, + "rel_diff": 0.0005340746092578567, + "abs_diff_nats": 9.864149797500431 + }, + { + "lane_row": 545, + "call_index": 27, + "lane_in_call": 5, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 22130.36775956621, + "log_likelihood_scalar_library_pdip": 22130.367759564677, + "rel_diff": 6.920757460633085e-14, + "abs_diff_nats": 1.5315890777856112e-09 + }, + { + "lane_row": 547, + "call_index": 27, + "lane_in_call": 7, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 18404.373148546525, + "log_likelihood_scalar_library_pdip": 18401.01615623879, + "rel_diff": 0.0001824351589733111, + "abs_diff_nats": 3.35699230773389 + }, + { + "lane_row": 550, + "call_index": 27, + "lane_in_call": 10, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 18958.4861545106, + "log_likelihood_scalar_library_pdip": 18956.512127302994, + "rel_diff": 0.00010413451558749145, + "abs_diff_nats": 1.9740272076051042 + }, + { + "lane_row": 551, + "call_index": 27, + "lane_in_call": 11, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 19196.654909867997, + "log_likelihood_scalar_library_pdip": 19201.114409850314, + "rel_diff": 0.00023225214365833229, + "abs_diff_nats": 4.459499982316629 + }, + { + "lane_row": 552, + "call_index": 27, + "lane_in_call": 12, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 1652.9336681586283, + "log_likelihood_scalar_library_pdip": 1652.9206007058237, + "rel_diff": 7.905674839405282e-06, + "abs_diff_nats": 0.013067452804534696 + }, + { + "lane_row": 554, + "call_index": 27, + "lane_in_call": 14, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 3717.6756793826935, + "log_likelihood_scalar_library_pdip": 3717.679331811596, + "rel_diff": 9.824486128526387e-07, + "abs_diff_nats": 0.003652428902569227 + }, + { + "lane_row": 555, + "call_index": 27, + "lane_in_call": 15, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 19043.014325846838, + "log_likelihood_scalar_library_pdip": 19038.995788104075, + "rel_diff": 0.00021106878679353862, + "abs_diff_nats": 4.018537742762419 + }, + { + "lane_row": 556, + "call_index": 27, + "lane_in_call": 16, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 18625.851806135834, + "log_likelihood_scalar_library_pdip": 18622.930504148382, + "rel_diff": 0.0001568658588292913, + "abs_diff_nats": 2.921301987451443 + }, + { + "lane_row": 557, + "call_index": 27, + "lane_in_call": 17, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 17679.792803018805, + "log_likelihood_scalar_library_pdip": 17659.8546849961, + "rel_diff": 0.001129008045555777, + "abs_diff_nats": 19.938118022706476 + }, + { + "lane_row": 559, + "call_index": 27, + "lane_in_call": 19, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 18746.11717812258, + "log_likelihood_scalar_library_pdip": 18742.568145385263, + "rel_diff": 0.0001893568005081129, + "abs_diff_nats": 3.5490327373154287 + }, + { + "lane_row": 560, + "call_index": 28, + "lane_in_call": 0, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 15921.901807459926, + "log_likelihood_scalar_library_pdip": 15909.41518834277, + "rel_diff": 0.0007848572036957127, + "abs_diff_nats": 12.486619117156806 + }, + { + "lane_row": 561, + "call_index": 28, + "lane_in_call": 1, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 18414.335278982762, + "log_likelihood_scalar_library_pdip": 18413.710999987867, + "rel_diff": 3.39029430241404e-05, + "abs_diff_nats": 0.624278994895576 + }, + { + "lane_row": 562, + "call_index": 28, + "lane_in_call": 2, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 18003.354541310437, + "log_likelihood_scalar_library_pdip": 18001.683535118544, + "rel_diff": 9.282499543073725e-05, + "abs_diff_nats": 1.6710061918929568 + }, + { + "lane_row": 564, + "call_index": 28, + "lane_in_call": 4, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 19394.088517460208, + "log_likelihood_scalar_library_pdip": 19393.25904961221, + "rel_diff": 4.27709363277165e-05, + "abs_diff_nats": 0.8294678479978757 + }, + { + "lane_row": 565, + "call_index": 28, + "lane_in_call": 5, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 18968.33778864173, + "log_likelihood_scalar_library_pdip": 18968.52987091174, + "rel_diff": 1.0126365686712351e-05, + "abs_diff_nats": 0.19208227001217892 + }, + { + "lane_row": 566, + "call_index": 28, + "lane_in_call": 6, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 19035.54701230508, + "log_likelihood_scalar_library_pdip": 19032.298352766666, + "rel_diff": 0.00017069191950440978, + "abs_diff_nats": 3.2486595384143584 + }, + { + "lane_row": 567, + "call_index": 28, + "lane_in_call": 7, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 18005.684074353063, + "log_likelihood_scalar_library_pdip": 18011.690119979656, + "rel_diff": 0.0003334526402900166, + "abs_diff_nats": 6.006045626592822 + }, + { + "lane_row": 569, + "call_index": 28, + "lane_in_call": 9, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 23138.770830761183, + "log_likelihood_scalar_library_pdip": 23138.770830760597, + "rel_diff": 2.5313124548652296e-14, + "abs_diff_nats": 5.857145879417658e-10 + }, + { + "lane_row": 570, + "call_index": 28, + "lane_in_call": 10, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 20799.750651541726, + "log_likelihood_scalar_library_pdip": 20799.07111933696, + "rel_diff": 3.2671276561663435e-05, + "abs_diff_nats": 0.6795322047655645 + }, + { + "lane_row": 571, + "call_index": 28, + "lane_in_call": 11, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 18113.389023472882, + "log_likelihood_scalar_library_pdip": 18113.17217290437, + "rel_diff": 1.1971981850626852e-05, + "abs_diff_nats": 0.21685056851129048 + }, + { + "lane_row": 574, + "call_index": 28, + "lane_in_call": 14, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 18853.38838088112, + "log_likelihood_scalar_library_pdip": 18850.431793345935, + "rel_diff": 0.0001568445522944094, + "abs_diff_nats": 2.956587535183644 + }, + { + "lane_row": 575, + "call_index": 28, + "lane_in_call": 15, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 19087.286612035696, + "log_likelihood_scalar_library_pdip": 19083.96339665186, + "rel_diff": 0.0001741365414911269, + "abs_diff_nats": 3.3232153838362137 + }, + { + "lane_row": 578, + "call_index": 28, + "lane_in_call": 18, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 19051.961370189536, + "log_likelihood_scalar_library_pdip": 19051.689691702115, + "rel_diff": 1.4260073086291231e-05, + "abs_diff_nats": 0.2716784874210134 + }, + { + "lane_row": 579, + "call_index": 28, + "lane_in_call": 19, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 4640.569299588562, + "log_likelihood_scalar_library_pdip": 4569.735813683321, + "rel_diff": 0.01550056475762601, + "abs_diff_nats": 70.8334859052411 + }, + { + "lane_row": 581, + "call_index": 29, + "lane_in_call": 1, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 22707.405424800578, + "log_likelihood_scalar_library_pdip": 22707.155588629757, + "rel_diff": 1.1002530451037476e-05, + "abs_diff_nats": 0.2498361708203447 + }, + { + "lane_row": 583, + "call_index": 29, + "lane_in_call": 3, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 18794.104488372595, + "log_likelihood_scalar_library_pdip": 18796.231989338048, + "rel_diff": 0.0001131876307261787, + "abs_diff_nats": 2.127500965452782 + }, + { + "lane_row": 585, + "call_index": 29, + "lane_in_call": 5, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 19049.678972498405, + "log_likelihood_scalar_library_pdip": 19047.758334915008, + "rel_diff": 0.00010083273578056058, + "abs_diff_nats": 1.9206375833964557 + }, + { + "lane_row": 586, + "call_index": 29, + "lane_in_call": 6, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 21634.912150988657, + "log_likelihood_scalar_library_pdip": 21634.912908724014, + "rel_diff": 3.5023730411122525e-08, + "abs_diff_nats": 0.0007577353571832646 + }, + { + "lane_row": 587, + "call_index": 29, + "lane_in_call": 7, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 17279.073387463533, + "log_likelihood_scalar_library_pdip": 17277.548844486642, + "rel_diff": 8.823838326913993e-05, + "abs_diff_nats": 1.524542976891098 + }, + { + "lane_row": 589, + "call_index": 29, + "lane_in_call": 9, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 19085.76586038474, + "log_likelihood_scalar_library_pdip": 19085.260758097837, + "rel_diff": 2.6465569074837832e-05, + "abs_diff_nats": 0.5051022869047301 + }, + { + "lane_row": 590, + "call_index": 29, + "lane_in_call": 10, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 18850.657974117665, + "log_likelihood_scalar_library_pdip": 18852.377477863465, + "rel_diff": 9.120885404610184e-05, + "abs_diff_nats": 1.7195037458004663 + }, + { + "lane_row": 591, + "call_index": 29, + "lane_in_call": 11, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 17948.29558472064, + "log_likelihood_scalar_library_pdip": 17938.81214590915, + "rel_diff": 0.0005286547812840068, + "abs_diff_nats": 9.483438811490487 + }, + { + "lane_row": 592, + "call_index": 29, + "lane_in_call": 12, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 19567.59008597873, + "log_likelihood_scalar_library_pdip": 19567.87452760185, + "rel_diff": 1.4536153260736072e-05, + "abs_diff_nats": 0.2844416231200739 + }, + { + "lane_row": 594, + "call_index": 29, + "lane_in_call": 14, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 20513.178506964596, + "log_likelihood_scalar_library_pdip": 20515.615684313987, + "rel_diff": 0.000118796208063827, + "abs_diff_nats": 2.437177349391277 + }, + { + "lane_row": 596, + "call_index": 29, + "lane_in_call": 16, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 20381.419794201614, + "log_likelihood_scalar_library_pdip": 20381.392098285884, + "rel_diff": 1.358882435376095e-06, + "abs_diff_nats": 0.02769591573087382 + }, + { + "lane_row": 598, + "call_index": 29, + "lane_in_call": 18, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 21879.106470076695, + "log_likelihood_scalar_library_pdip": 21876.421633665625, + "rel_diff": 0.0001227274028645728, + "abs_diff_nats": 2.684836411070137 + }, + { + "lane_row": 599, + "call_index": 29, + "lane_in_call": 19, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 19070.98076961306, + "log_likelihood_scalar_library_pdip": 19068.74771725614, + "rel_diff": 0.00011710534902600158, + "abs_diff_nats": 2.2330523569180514 + }, + { + "lane_row": 601, + "call_index": 30, + "lane_in_call": 1, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 19006.107952982842, + "log_likelihood_scalar_library_pdip": 19000.52538627992, + "rel_diff": 0.00029381117571366817, + "abs_diff_nats": 5.582566702920303 + }, + { + "lane_row": 605, + "call_index": 30, + "lane_in_call": 5, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 19093.695409967768, + "log_likelihood_scalar_library_pdip": 19100.545050767436, + "rel_diff": 0.000358609703621673, + "abs_diff_nats": 6.849640799668123 + }, + { + "lane_row": 607, + "call_index": 30, + "lane_in_call": 7, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 15457.905053819479, + "log_likelihood_scalar_library_pdip": 15458.843389994363, + "rel_diff": 6.069898964701996e-05, + "abs_diff_nats": 0.9383361748841708 + }, + { + "lane_row": 608, + "call_index": 30, + "lane_in_call": 8, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 19093.578904194008, + "log_likelihood_scalar_library_pdip": 19093.09632542886, + "rel_diff": 2.5275039570373763e-05, + "abs_diff_nats": 0.4825787651461724 + }, + { + "lane_row": 609, + "call_index": 30, + "lane_in_call": 9, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 18816.524739166347, + "log_likelihood_scalar_library_pdip": 18819.47117422664, + "rel_diff": 0.00015656311662620132, + "abs_diff_nats": 2.9464350602938794 + }, + { + "lane_row": 610, + "call_index": 30, + "lane_in_call": 10, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 19961.793089449005, + "log_likelihood_scalar_library_pdip": 19962.72690550076, + "rel_diff": 4.6777980592282364e-05, + "abs_diff_nats": 0.9338160517545475 + }, + { + "lane_row": 611, + "call_index": 30, + "lane_in_call": 11, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 18964.328572389804, + "log_likelihood_scalar_library_pdip": 18963.81071228585, + "rel_diff": 2.7307808109457275e-05, + "abs_diff_nats": 0.5178601039551722 + }, + { + "lane_row": 616, + "call_index": 30, + "lane_in_call": 16, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 16157.618611578793, + "log_likelihood_scalar_library_pdip": 16137.966518201494, + "rel_diff": 0.0012177552453795253, + "abs_diff_nats": 19.652093377299025 + }, + { + "lane_row": 618, + "call_index": 30, + "lane_in_call": 18, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 15147.925921746471, + "log_likelihood_scalar_library_pdip": 15130.095556260629, + "rel_diff": 0.0011784701173592265, + "abs_diff_nats": 17.830365485842776 + }, + { + "lane_row": 619, + "call_index": 30, + "lane_in_call": 19, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 18170.391596124777, + "log_likelihood_scalar_library_pdip": 18173.122283071156, + "rel_diff": 0.00015025964739822718, + "abs_diff_nats": 2.7306869463791372 + }, + { + "lane_row": 620, + "call_index": 31, + "lane_in_call": 0, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 12243.070891139672, + "log_likelihood_scalar_library_pdip": 12237.764278143277, + "rel_diff": 0.00043362601826487697, + "abs_diff_nats": 5.306612996395415 + }, + { + "lane_row": 621, + "call_index": 31, + "lane_in_call": 1, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 20375.88154792207, + "log_likelihood_scalar_library_pdip": 20376.599150858965, + "rel_diff": 3.521701200400424e-05, + "abs_diff_nats": 0.7176029368965828 + }, + { + "lane_row": 623, + "call_index": 31, + "lane_in_call": 3, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 18940.663382936895, + "log_likelihood_scalar_library_pdip": 18939.878128135104, + "rel_diff": 4.1460393592732665e-05, + "abs_diff_nats": 0.7852548017908703 + }, + { + "lane_row": 624, + "call_index": 31, + "lane_in_call": 4, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 18556.343193916073, + "log_likelihood_scalar_library_pdip": 18559.1815404523, + "rel_diff": 0.00015293489802020903, + "abs_diff_nats": 2.8383465362276183 + }, + { + "lane_row": 627, + "call_index": 31, + "lane_in_call": 7, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 14418.540788760609, + "log_likelihood_scalar_library_pdip": 14406.334483179038, + "rel_diff": 0.0008472873926273766, + "abs_diff_nats": 12.206305581570632 + }, + { + "lane_row": 629, + "call_index": 31, + "lane_in_call": 9, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 22101.491967827496, + "log_likelihood_scalar_library_pdip": 22100.42695799777, + "rel_diff": 4.81895590411238e-05, + "abs_diff_nats": 1.0650098297264776 + }, + { + "lane_row": 630, + "call_index": 31, + "lane_in_call": 10, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 21945.29840753947, + "log_likelihood_scalar_library_pdip": 21945.367092616136, + "rel_diff": 3.129821268209426e-06, + "abs_diff_nats": 0.06868507666513324 + }, + { + "lane_row": 633, + "call_index": 31, + "lane_in_call": 13, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 18096.64218456883, + "log_likelihood_scalar_library_pdip": 18095.664398997113, + "rel_diff": 5.403424545012031e-05, + "abs_diff_nats": 0.9777855717184138 + }, + { + "lane_row": 635, + "call_index": 31, + "lane_in_call": 15, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 14797.835725126064, + "log_likelihood_scalar_library_pdip": 14722.729462192783, + "rel_diff": 0.0051013817190725405, + "abs_diff_nats": 75.10626293328096 + }, + { + "lane_row": 636, + "call_index": 31, + "lane_in_call": 16, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 19057.351935080114, + "log_likelihood_scalar_library_pdip": 19057.852061954913, + "rel_diff": 2.6242562549674643e-05, + "abs_diff_nats": 0.5001268747982976 + }, + { + "lane_row": 637, + "call_index": 31, + "lane_in_call": 17, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 19023.544109066046, + "log_likelihood_scalar_library_pdip": 19026.626512055678, + "rel_diff": 0.00016200470365458766, + "abs_diff_nats": 3.082402989632101 + }, + { + "lane_row": 638, + "call_index": 31, + "lane_in_call": 18, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 17243.765128367446, + "log_likelihood_scalar_library_pdip": 17244.917110508817, + "rel_diff": 6.680125708863287e-05, + "abs_diff_nats": 1.1519821413712634 + }, + { + "lane_row": 639, + "call_index": 31, + "lane_in_call": 19, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 2071.5958555061225, + "log_likelihood_scalar_library_pdip": 1986.8166325577913, + "rel_diff": 0.04267088444855021, + "abs_diff_nats": 84.77922294833115 + }, + { + "lane_row": 641, + "call_index": 32, + "lane_in_call": 1, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 19060.7277604322, + "log_likelihood_scalar_library_pdip": 19058.121136663103, + "rel_diff": 0.00013677233712629719, + "abs_diff_nats": 2.606623769097496 + }, + { + "lane_row": 642, + "call_index": 32, + "lane_in_call": 2, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 17859.344888080766, + "log_likelihood_scalar_library_pdip": 17866.02936932458, + "rel_diff": 0.0003741447585041465, + "abs_diff_nats": 6.684481243813934 + }, + { + "lane_row": 643, + "call_index": 32, + "lane_in_call": 3, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 18455.987145840412, + "log_likelihood_scalar_library_pdip": 18455.371026349516, + "rel_diff": 3.3384291760741134e-05, + "abs_diff_nats": 0.6161194908963807 + }, + { + "lane_row": 647, + "call_index": 32, + "lane_in_call": 7, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 18954.587842630874, + "log_likelihood_scalar_library_pdip": 18953.671837205202, + "rel_diff": 4.832865280877548e-05, + "abs_diff_nats": 0.9160054256717558 + }, + { + "lane_row": 649, + "call_index": 32, + "lane_in_call": 9, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 10045.70260958156, + "log_likelihood_scalar_library_pdip": 9904.890709970048, + "rel_diff": 0.014216401143101312, + "abs_diff_nats": 140.81189961151176 + }, + { + "lane_row": 650, + "call_index": 32, + "lane_in_call": 10, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 19015.577522130814, + "log_likelihood_scalar_library_pdip": 19018.479914296095, + "rel_diff": 0.00015260905068963495, + "abs_diff_nats": 2.9023921652806166 + }, + { + "lane_row": 651, + "call_index": 32, + "lane_in_call": 11, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 17818.844598713717, + "log_likelihood_scalar_library_pdip": 17818.72804797772, + "rel_diff": 6.5409122180044854e-06, + "abs_diff_nats": 0.11655073599831667 + }, + { + "lane_row": 652, + "call_index": 32, + "lane_in_call": 12, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 18084.000610569554, + "log_likelihood_scalar_library_pdip": 18077.36232895188, + "rel_diff": 0.000367215166509232, + "abs_diff_nats": 6.638281617673783 + }, + { + "lane_row": 653, + "call_index": 32, + "lane_in_call": 13, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 5722.700672000232, + "log_likelihood_scalar_library_pdip": 5725.1783476435085, + "rel_diff": 0.00043276828996889025, + "abs_diff_nats": 2.477675643276598 + }, + { + "lane_row": 654, + "call_index": 32, + "lane_in_call": 14, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 19098.279929981756, + "log_likelihood_scalar_library_pdip": 19096.811823947988, + "rel_diff": 7.687702257855058e-05, + "abs_diff_nats": 1.468106033767981 + }, + { + "lane_row": 655, + "call_index": 32, + "lane_in_call": 15, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 10764.279131054449, + "log_likelihood_scalar_library_pdip": 10757.56067435495, + "rel_diff": 0.0006245334702610173, + "abs_diff_nats": 6.718456699498347 + }, + { + "lane_row": 656, + "call_index": 32, + "lane_in_call": 16, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 12948.060576331733, + "log_likelihood_scalar_library_pdip": 12874.726978418752, + "rel_diff": 0.005695934215607523, + "abs_diff_nats": 73.33359791298062 + }, + { + "lane_row": 657, + "call_index": 32, + "lane_in_call": 17, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 21267.336828702788, + "log_likelihood_scalar_library_pdip": 21269.59633783919, + "rel_diff": 0.0001062318767367566, + "abs_diff_nats": 2.2595091364019027 + }, + { + "lane_row": 658, + "call_index": 32, + "lane_in_call": 18, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 19491.290465709688, + "log_likelihood_scalar_library_pdip": 19497.001010608812, + "rel_diff": 0.0002928935017245454, + "abs_diff_nats": 5.710544899124216 + }, + { + "lane_row": 660, + "call_index": 33, + "lane_in_call": 0, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 18619.187952722354, + "log_likelihood_scalar_library_pdip": 18605.19025711948, + "rel_diff": 0.0007523543381942447, + "abs_diff_nats": 13.997695602873137 + }, + { + "lane_row": 661, + "call_index": 33, + "lane_in_call": 1, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 19138.77011854242, + "log_likelihood_scalar_library_pdip": 19131.295200573397, + "rel_diff": 0.0003907167753492437, + "abs_diff_nats": 7.474917969022499 + }, + { + "lane_row": 663, + "call_index": 33, + "lane_in_call": 3, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 18659.166449875152, + "log_likelihood_scalar_library_pdip": 18660.350001495302, + "rel_diff": 6.342601398447054e-05, + "abs_diff_nats": 1.1835516201499559 + }, + { + "lane_row": 666, + "call_index": 33, + "lane_in_call": 6, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 10287.131033381225, + "log_likelihood_scalar_library_pdip": 10290.409185060169, + "rel_diff": 0.0003185637830323575, + "abs_diff_nats": 3.2781516789436864 + }, + { + "lane_row": 667, + "call_index": 33, + "lane_in_call": 7, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 19643.238396664165, + "log_likelihood_scalar_library_pdip": 19644.90718285182, + "rel_diff": 8.494752212995535e-05, + "abs_diff_nats": 1.6687861876562238 + }, + { + "lane_row": 670, + "call_index": 33, + "lane_in_call": 10, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 13373.390251866007, + "log_likelihood_scalar_library_pdip": 13360.317258229508, + "rel_diff": 0.0009784942515827007, + "abs_diff_nats": 13.072993636498722 + }, + { + "lane_row": 672, + "call_index": 33, + "lane_in_call": 12, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 22156.293896100688, + "log_likelihood_scalar_library_pdip": 22158.603292659467, + "rel_diff": 0.00010422121504131955, + "abs_diff_nats": 2.3093965587795537 + }, + { + "lane_row": 677, + "call_index": 33, + "lane_in_call": 17, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 20223.248964808176, + "log_likelihood_scalar_library_pdip": 20223.24896480695, + "rel_diff": 6.062323913053852e-14, + "abs_diff_nats": 1.2259988579899073e-09 + }, + { + "lane_row": 679, + "call_index": 33, + "lane_in_call": 19, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 16085.82259513007, + "log_likelihood_scalar_library_pdip": 16067.329556287332, + "rel_diff": 0.0011509715275306452, + "abs_diff_nats": 18.493038842738315 + }, + { + "lane_row": 694, + "call_index": 34, + "lane_in_call": 14, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 19307.48772002191, + "log_likelihood_scalar_library_pdip": 19301.764865201843, + "rel_diff": 0.00029649386260957876, + "abs_diff_nats": 5.72285482006555 + }, + { + "lane_row": 699, + "call_index": 34, + "lane_in_call": 19, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 22350.15350382489, + "log_likelihood_scalar_library_pdip": 22350.153503824426, + "rel_diff": 2.0834813829267796e-14, + "abs_diff_nats": 4.656612873077393e-10 + }, + { + "lane_row": 702, + "call_index": 35, + "lane_in_call": 2, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 21760.480200258753, + "log_likelihood_scalar_library_pdip": 21759.57782276658, + "rel_diff": 4.1470358456553415e-05, + "abs_diff_nats": 0.9023774921734002 + }, + { + "lane_row": 705, + "call_index": 35, + "lane_in_call": 5, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 21351.555615724563, + "log_likelihood_scalar_library_pdip": 21349.60577645093, + "rel_diff": 9.13290528194241e-05, + "abs_diff_nats": 1.949839273631369 + }, + { + "lane_row": 712, + "call_index": 35, + "lane_in_call": 12, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 19009.15691285422, + "log_likelihood_scalar_library_pdip": 19009.339829244982, + "rel_diff": 9.622448354524252e-06, + "abs_diff_nats": 0.1829163907605107 + }, + { + "lane_row": 713, + "call_index": 35, + "lane_in_call": 13, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 19281.55486713585, + "log_likelihood_scalar_library_pdip": 19282.095475221624, + "rel_diff": 2.803679125385042e-05, + "abs_diff_nats": 0.5406080857756024 + }, + { + "lane_row": 723, + "call_index": 36, + "lane_in_call": 3, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 20251.060123143234, + "log_likelihood_scalar_library_pdip": 20250.684620165433, + "rel_diff": 1.854273002831863e-05, + "abs_diff_nats": 0.3755029778003518 + }, + { + "lane_row": 724, + "call_index": 36, + "lane_in_call": 4, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 16676.78640919952, + "log_likelihood_scalar_library_pdip": 16652.354001429117, + "rel_diff": 0.0014672044425855521, + "abs_diff_nats": 24.432407770404097 + }, + { + "lane_row": 727, + "call_index": 36, + "lane_in_call": 7, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 19960.565884317868, + "log_likelihood_scalar_library_pdip": 19960.685686422235, + "rel_diff": 6.001903253699412e-06, + "abs_diff_nats": 0.1198021043674089 + }, + { + "lane_row": 730, + "call_index": 36, + "lane_in_call": 10, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 16801.494710389663, + "log_likelihood_scalar_library_pdip": 16792.545243211687, + "rel_diff": 0.0005329428653225472, + "abs_diff_nats": 8.949467177975748 + }, + { + "lane_row": 732, + "call_index": 36, + "lane_in_call": 12, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 19107.160142547385, + "log_likelihood_scalar_library_pdip": 19108.89932941497, + "rel_diff": 9.101449736075998e-05, + "abs_diff_nats": 1.739186867584067 + }, + { + "lane_row": 739, + "call_index": 36, + "lane_in_call": 19, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 19694.648776787784, + "log_likelihood_scalar_library_pdip": 19700.26945602437, + "rel_diff": 0.00028530976437308986, + "abs_diff_nats": 5.620679236584692 + }, + { + "lane_row": 744, + "call_index": 37, + "lane_in_call": 4, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 18676.364032493715, + "log_likelihood_scalar_library_pdip": 18677.143486790243, + "rel_diff": 4.173305714970977e-05, + "abs_diff_nats": 0.7794542965275468 + }, + { + "lane_row": 746, + "call_index": 37, + "lane_in_call": 6, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 16772.122180434395, + "log_likelihood_scalar_library_pdip": 16767.987794581466, + "rel_diff": 0.00024656422127555393, + "abs_diff_nats": 4.134385852928972 + }, + { + "lane_row": 749, + "call_index": 37, + "lane_in_call": 9, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 20373.309365091198, + "log_likelihood_scalar_library_pdip": 20379.64226899312, + "rel_diff": 0.0003107465684791716, + "abs_diff_nats": 6.332903901922691 + }, + { + "lane_row": 750, + "call_index": 37, + "lane_in_call": 10, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 19158.250033109958, + "log_likelihood_scalar_library_pdip": 19161.18205035649, + "rel_diff": 0.00015301859973069354, + "abs_diff_nats": 2.9320172465304495 + }, + { + "lane_row": 753, + "call_index": 37, + "lane_in_call": 13, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 20045.522563390543, + "log_likelihood_scalar_library_pdip": 20046.03042166463, + "rel_diff": 2.533460557544151e-05, + "abs_diff_nats": 0.5078582740861748 + }, + { + "lane_row": 757, + "call_index": 37, + "lane_in_call": 17, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 22526.788543957333, + "log_likelihood_scalar_library_pdip": 22526.91967609955, + "rel_diff": 5.82113063408525e-06, + "abs_diff_nats": 0.13113214221812086 + }, + { + "lane_row": 758, + "call_index": 37, + "lane_in_call": 18, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 17546.92179114587, + "log_likelihood_scalar_library_pdip": 17538.58436211952, + "rel_diff": 0.00047537639607656213, + "abs_diff_nats": 8.337429026349128 + }, + { + "lane_row": 765, + "call_index": 38, + "lane_in_call": 5, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 20755.66506729152, + "log_likelihood_scalar_library_pdip": 20755.2687909561, + "rel_diff": 1.9092806718735832e-05, + "abs_diff_nats": 0.3962763354211347 + }, + { + "lane_row": 768, + "call_index": 38, + "lane_in_call": 8, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 18021.799304826443, + "log_likelihood_scalar_library_pdip": 18016.497025570374, + "rel_diff": 0.0002943013421834556, + "abs_diff_nats": 5.302279256069596 + }, + { + "lane_row": 769, + "call_index": 38, + "lane_in_call": 9, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 21967.26897365337, + "log_likelihood_scalar_library_pdip": 21967.246576628102, + "rel_diff": 1.0195645224936595e-06, + "abs_diff_nats": 0.022397025266400306 + }, + { + "lane_row": 773, + "call_index": 38, + "lane_in_call": 13, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 18948.091512758045, + "log_likelihood_scalar_library_pdip": 18946.271819967063, + "rel_diff": 9.60449004570637e-05, + "abs_diff_nats": 1.8196927909812075 + }, + { + "lane_row": 774, + "call_index": 38, + "lane_in_call": 14, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 18554.774486529954, + "log_likelihood_scalar_library_pdip": 18579.585813092646, + "rel_diff": 0.001335407947856864, + "abs_diff_nats": 24.811326562692557 + }, + { + "lane_row": 776, + "call_index": 38, + "lane_in_call": 16, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 17923.223175628053, + "log_likelihood_scalar_library_pdip": 17917.499476410667, + "rel_diff": 0.0003194474332158503, + "abs_diff_nats": 5.723699217385729 + }, + { + "lane_row": 778, + "call_index": 38, + "lane_in_call": 18, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 18607.763262769542, + "log_likelihood_scalar_library_pdip": 18598.17153143034, + "rel_diff": 0.0005157351798262647, + "abs_diff_nats": 9.591731339201942 + }, + { + "lane_row": 779, + "call_index": 38, + "lane_in_call": 19, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 18982.272073743436, + "log_likelihood_scalar_library_pdip": 18991.640181492556, + "rel_diff": 0.000493275339022554, + "abs_diff_nats": 9.3681077491201 + }, + { + "lane_row": 780, + "call_index": 39, + "lane_in_call": 0, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 18612.38454657095, + "log_likelihood_scalar_library_pdip": 18600.957396827485, + "rel_diff": 0.0006143312679923018, + "abs_diff_nats": 11.427149743463815 + }, + { + "lane_row": 781, + "call_index": 39, + "lane_in_call": 1, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 18554.55423972136, + "log_likelihood_scalar_library_pdip": 18554.203173293135, + "rel_diff": 1.892112665506829e-05, + "abs_diff_nats": 0.3510664282257494 + }, + { + "lane_row": 784, + "call_index": 39, + "lane_in_call": 4, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 19153.05593273616, + "log_likelihood_scalar_library_pdip": 19155.301389397915, + "rel_diff": 0.00011722377090861102, + "abs_diff_nats": 2.2454566617561795 + }, + { + "lane_row": 787, + "call_index": 39, + "lane_in_call": 7, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 20310.002954694806, + "log_likelihood_scalar_library_pdip": 20306.382871777856, + "rel_diff": 0.0001782731538063062, + "abs_diff_nats": 3.620082916950196 + }, + { + "lane_row": 790, + "call_index": 39, + "lane_in_call": 10, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 21712.397031071923, + "log_likelihood_scalar_library_pdip": 21712.39692193074, + "rel_diff": 5.026675939767673e-09, + "abs_diff_nats": 0.00010914118320215493 + }, + { + "lane_row": 792, + "call_index": 39, + "lane_in_call": 12, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 19305.65398751985, + "log_likelihood_scalar_library_pdip": 19312.193076072588, + "rel_diff": 0.0003385989632031726, + "abs_diff_nats": 6.539088552737667 + }, + { + "lane_row": 794, + "call_index": 39, + "lane_in_call": 14, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 15870.333128117883, + "log_likelihood_scalar_library_pdip": 15854.708639049531, + "rel_diff": 0.0009854794196513625, + "abs_diff_nats": 15.624489068351977 + }, + { + "lane_row": 796, + "call_index": 39, + "lane_in_call": 16, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 19006.562508385163, + "log_likelihood_scalar_library_pdip": 19003.083723313946, + "rel_diff": 0.00018306423956594253, + "abs_diff_nats": 3.4787850712164072 + }, + { + "lane_row": 797, + "call_index": 39, + "lane_in_call": 17, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 21663.800803347924, + "log_likelihood_scalar_library_pdip": 21664.02598523534, + "rel_diff": 1.039427701808004e-05, + "abs_diff_nats": 0.2251818874174205 + }, + { + "lane_row": 800, + "call_index": 40, + "lane_in_call": 0, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 19382.610465256235, + "log_likelihood_scalar_library_pdip": 19382.61224667751, + "rel_diff": 9.19082139529952e-08, + "abs_diff_nats": 0.0017814212733355816 + }, + { + "lane_row": 801, + "call_index": 40, + "lane_in_call": 1, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 17868.666212812343, + "log_likelihood_scalar_library_pdip": 17859.710662896796, + "rel_diff": 0.0005014386898300491, + "abs_diff_nats": 8.955549915546726 + }, + { + "lane_row": 805, + "call_index": 40, + "lane_in_call": 5, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 18995.372011418567, + "log_likelihood_scalar_library_pdip": 18991.636767999404, + "rel_diff": 0.000196678330824928, + "abs_diff_nats": 3.735243419163453 + }, + { + "lane_row": 811, + "call_index": 40, + "lane_in_call": 11, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 19190.96308244856, + "log_likelihood_scalar_library_pdip": 19191.807562218146, + "rel_diff": 4.4002096563702716e-05, + "abs_diff_nats": 0.8444797695847228 + }, + { + "lane_row": 812, + "call_index": 40, + "lane_in_call": 12, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 22551.011687354607, + "log_likelihood_scalar_library_pdip": 22551.208154687287, + "rel_diff": 8.712053533120793e-06, + "abs_diff_nats": 0.1964673326801858 + } + ], + "gated": false + }, + "lane_certified": [ + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ], + "lane_passes": [ + 3, + 4, + 2, + 7, + 3, + 3, + 16, + 7, + 4, + 1, + 4, + 16, + 3, + 3, + 8, + 4, + 2, + 2, + 3, + 4, + 4, + 3, + 3, + 7, + 16, + 4, + 2, + 16, + 11, + 16, + 5, + 6, + 16, + 3, + 2, + 3, + 2, + 3, + 3, + 3, + 3, + 3, + 2, + 9, + 3, + 3, + 3, + 3, + 4, + 4, + 10, + 16, + 3, + 2, + 3, + 3, + 16, + 3, + 7, + 4, + 16, + 3, + 0, + 2, + 3, + 4, + 3, + 3, + 3, + 3, + 3, + 2, + 3, + 3, + 4, + 3, + 3, + 3, + 16, + 3, + 9, + 3, + 3, + 3, + 16, + 3, + 16, + 4, + 2, + 3, + 3, + 16, + 2, + 3, + 3, + 3, + 1, + 3, + 16, + 3, + 3, + 3, + 2, + 3, + 5, + 3, + 3, + 5, + 3, + 4, + 3, + 3, + 16, + 3, + 5, + 16, + 5, + 1, + 3, + 2, + 7, + 3, + 16, + 2, + 3, + 3, + 7, + 16, + 2, + 5, + 3, + 16, + 9, + 16, + 3, + 4, + 3, + 16, + 16, + 3, + 3, + 3, + 4, + 3, + 3, + 16, + 2, + 3, + 4, + 3, + 3, + 2, + 3, + 5, + 3, + 2, + 2, + 6, + 5, + 16, + 15, + 16, + 16, + 3, + 3, + 6, + 3, + 3, + 3, + 16, + 16, + 3, + 6, + 8, + 2, + 8, + 1, + 5, + 3, + 3, + 3, + 3, + 3, + 8, + 16, + 16, + 2, + 3, + 3, + 7, + 3, + 3, + 5, + 5, + 16, + 3, + 4, + 3, + 3, + 9, + 16, + 4, + 3, + 10, + 3, + 4, + 3, + 5, + 4, + 3, + 16, + 16, + 10, + 6, + 4, + 16, + 16, + 3, + 3, + 3, + 3, + 3, + 16, + 3, + 3, + 3, + 2, + 3, + 3, + 3, + 3, + 7, + 4, + 3, + 5, + 6, + 12, + 3, + 16, + 16, + 3, + 16, + 3, + 3, + 3, + 10, + 8, + 7, + 16, + 3, + 6, + 4, + 3, + 16, + 3, + 6, + 16, + 3, + 3, + 2, + 3, + 3, + 2, + 2, + 1, + 2, + 3, + 4, + 4, + 3, + 7, + 2, + 3, + 3, + 7, + 1, + 16, + 3, + 3, + 1, + 3, + 7, + 3, + 16, + 3, + 3, + 3, + 3, + 10, + 3, + 3, + 16, + 1, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 16, + 16, + 16, + 4, + 2, + 14, + 6, + 6, + 16, + 16, + 6, + 16, + 16, + 9, + 2, + 8, + 16, + 3, + 16, + 16, + 2, + 1, + 16, + 5, + 16, + 7, + 16, + 5, + 5, + 9, + 16, + 5, + 16, + 5, + 2, + 16, + 16, + 16, + 16, + 16, + 3, + 2, + 10, + 16, + 16, + 7, + 9, + 3, + 3, + 3, + 4, + 6, + 13, + 5, + 9, + 3, + 3, + 16, + 16, + 16, + 3, + 9, + 16, + 1, + 3, + 3, + 16, + 16, + 3, + 5, + 2, + 2, + 3, + 3, + 16, + 6, + 16, + 5, + 16, + 1, + 16, + 6, + 16, + 8, + 6, + 2, + 16, + 16, + 8, + 3, + 3, + 16, + 16, + 16, + 1, + 16, + 16, + 7, + 3, + 7, + 16, + 10, + 3, + 7, + 3, + 3, + 16, + 7, + 7, + 8, + 7, + 2, + 2, + 16, + 12, + 5, + 8, + 5, + 16, + 16, + 2, + 4, + 16, + 16, + 5, + 4, + 3, + 16, + 3, + 2, + 1, + 2, + 7, + 4, + 16, + 3, + 16, + 5, + 16, + 5, + 7, + 16, + 2, + 6, + 3, + 2, + 16, + 6, + 6, + 10, + 3, + 16, + 16, + 9, + 4, + 5, + 2, + 16, + 4, + 16, + 3, + 4, + 2, + 4, + 16, + 7, + 2, + 16, + 3, + 16, + 16, + 15, + 3, + 3, + 2, + 5, + 4, + 4, + 4, + 16, + 2, + 4, + 5, + 16, + 10, + 7, + 6, + 16, + 11, + 16, + 16, + 7, + 6, + 16, + 4, + 16, + 16, + 7, + 16, + 16, + 16, + 6, + 16, + 16, + 5, + 16, + 2, + 16, + 5, + 5, + 4, + 1, + 16, + 9, + 11, + 11, + 5, + 14, + 16, + 16, + 16, + 7, + 7, + 16, + 1, + 16, + 6, + 5, + 5, + 16, + 16, + 16, + 16, + 11, + 3, + 6, + 5, + 7, + 16, + 16, + 5, + 16, + 16, + 2, + 15, + 16, + 7, + 16, + 9, + 1, + 16, + 16, + 16, + 4, + 16, + 16, + 16, + 16, + 6, + 16, + 16, + 16, + 16, + 6, + 16, + 16, + 16, + 16, + 9, + 16, + 16, + 16, + 7, + 10, + 16, + 16, + 2, + 9, + 16, + 16, + 10, + 16, + 15, + 16, + 8, + 16, + 16, + 16, + 10, + 16, + 16, + 16, + 16, + 7, + 16, + 7, + 16, + 3, + 16, + 16, + 5, + 16, + 8, + 7, + 9, + 16, + 6, + 16, + 16, + 16, + 16, + 16, + 8, + 4, + 6, + 9, + 16, + 11, + 16, + 16, + 16, + 16, + 2, + 16, + 16, + 11, + 10, + 16, + 3, + 16, + 16, + 3, + 16, + 16, + 8, + 16, + 16, + 16, + 16, + 16, + 7, + 16, + 16, + 16, + 7, + 7, + 1, + 16, + 8, + 16, + 16, + 16, + 16, + 16, + 16, + 16, + 16, + 16, + 16, + 7, + 16, + 16, + 16, + 16, + 2, + 4, + 16, + 16, + 5, + 3, + 16, + 10, + 16, + 4, + 4, + 14, + 4, + 16, + 7, + 16, + 3, + 9, + 3, + 2, + 2, + 7, + 5, + 8, + 3, + 13, + 3, + 2, + 3, + 4, + 16, + 7, + 2, + 10, + 5, + 16, + 6, + 3, + 16, + 3, + 3, + 16, + 7, + 8, + 7, + 4, + 11, + 3, + 16, + 16, + 5, + 8, + 4, + 9, + 7, + 6, + 7, + 12, + 5, + 16, + 16, + 2, + 15, + 16, + 2, + 8, + 16, + 5, + 16, + 9, + 11, + 7, + 8, + 2, + 7, + 16, + 10, + 7, + 10, + 3, + 16, + 3, + 16, + 16, + 8, + 16, + 16, + 6, + 2, + 16, + 7, + 11, + 6, + 16, + 16, + 6, + 8, + 10, + 16, + 2, + 3, + 16, + 8, + 7, + 16, + 16, + 2, + 6, + 6, + 16, + 16, + 14, + 16, + 7, + 16, + 16, + 16, + 16, + 7, + 8, + 16, + 3, + 8, + 16, + 3, + 4, + 16, + 4, + 16, + 9, + 16, + 9, + 16, + 16, + 8, + 8, + 16, + 16, + 5, + 3, + 8, + 16, + 2, + 4, + 3, + 5, + 7, + 16, + 16, + 4, + 16, + 16, + 16, + 2, + 16, + 4, + 16, + 16, + 16, + 16, + 3, + 16, + 10, + 16, + 15, + 16, + 11, + 10, + 5, + 13, + 8, + 6, + 7, + 10, + 4, + 8, + 14, + 16, + 16, + 2, + 6, + 16, + 8, + 6, + 11, + 7, + 3, + 11, + 16, + 16, + 7, + 16, + 4, + 7, + 16, + 9, + 1, + 8, + 7, + 12, + 16, + 5, + 16, + 16, + 6, + 8, + 16, + 2, + 14, + 16, + 6, + 7, + 16, + 6, + 16, + 5, + 16, + 2, + 9, + 15, + 16, + 16, + 16, + 8, + 16, + 4, + 8, + 16, + 3, + 4, + 7, + 10, + 7, + 16, + 16, + 5, + 16, + 8, + 15, + 8, + 5, + 2, + 16, + 6, + 16, + 16, + 16, + 11, + 7, + 15, + 4, + 16, + 5, + 4, + 5, + 16, + 16, + 16, + 16, + 6, + 4, + 16, + 5, + 7, + 5, + 4, + 10, + 7, + 9, + 7, + 13, + 4, + 3, + 4, + 11, + 3, + 9, + 16, + 16, + 8, + 16, + 2, + 16, + 2, + 2, + 3, + 16, + 5, + 3, + 9, + 6, + 16, + 10, + 7, + 3, + 9, + 16, + 9, + 2, + 9, + 7, + 4, + 13, + 11, + 5, + 3, + 7, + 5, + 7, + 4, + 6, + 7, + 10, + 6, + 5, + 6, + 7, + 3, + 5, + 5, + 8, + 9, + 9, + 2, + 1, + 5, + 16, + 16, + 6, + 7, + 3, + 7, + 7, + 6, + 16, + 12, + 2, + 8, + 3, + 9, + 8, + 4, + 9, + 8, + 3, + 3, + 6, + 7, + 16, + 5, + 7, + 3, + 9, + 5, + 6, + 3, + 5, + 3, + 5, + 7, + 9, + 8, + 4, + 3, + 10, + 5, + 3, + 2, + 16, + 7, + 5, + 11, + 12, + 16, + 2, + 10, + 6, + 7, + 9, + 5, + 7, + 7, + 1, + 7, + 16, + 3, + 8, + 3, + 10, + 6, + 4, + 4, + 16, + 3, + 9, + 7, + 6, + 4, + 9, + 3, + 15, + 5, + 11, + 16, + 4, + 4, + 9, + 7, + 4, + 5, + 7, + 5, + 3, + 7, + 5, + 4, + 8, + 5, + 8, + 6, + 4, + 8, + 7, + 11, + 6, + 6, + 2, + 5, + 8, + 6, + 3, + 6, + 9, + 8, + 8, + 7, + 9, + 4, + 5, + 7, + 9, + 16, + 8, + 2, + 12, + 8, + 10, + 2, + 6, + 10, + 8, + 5, + 7, + 2, + 5, + 7, + 13, + 2, + 5, + 8, + 7, + 9, + 16, + 5, + 7, + 6, + 14, + 16, + 10, + 16, + 3, + 8, + 3, + 5, + 8, + 16, + 7, + 5, + 4, + 16, + 16, + 9, + 5, + 5, + 13, + 5, + 12, + 10, + 7, + 12, + 8, + 5, + 6, + 9, + 3, + 7, + 5, + 16, + 7, + 6, + 6, + 6, + 4, + 5, + 16, + 16, + 4, + 9, + 7, + 3, + 9, + 6, + 4, + 2, + 7, + 6, + 3, + 3, + 7, + 9, + 2, + 8, + 7, + 3, + 16, + 13, + 15, + 2, + 6, + 9, + 6, + 16, + 5, + 5, + 10, + 5, + 7, + 3, + 7, + 16, + 5, + 8, + 7, + 2, + 16, + 8, + 6, + 6, + 5, + 15, + 7, + 3, + 16, + 4, + 9, + 7, + 7, + 7, + 16, + 3, + 12, + 4, + 4, + 2, + 4, + 5, + 6, + 12, + 7, + 6, + 7, + 7, + 6, + 16, + 3, + 4, + 6, + 5, + 5, + 7, + 7, + 8, + 7, + 5, + 2, + 16, + 16, + 16, + 12, + 16, + 9, + 3, + 6, + 11, + 2, + 3, + 5, + 16, + 6, + 12, + 16, + 7, + 8, + 7, + 7, + 10, + 6, + 7, + 5, + 5, + 16, + 11, + 7, + 6, + 6, + 4, + 5, + 4, + 9, + 8, + 7, + 5, + 16, + 7, + 8, + 1, + 11, + 7, + 4, + 10, + 5, + 9, + 4, + 8, + 7, + 16, + 12, + 4, + 5, + 5, + 7, + 6, + 9, + 10, + 6, + 9, + 6, + 9, + 3, + 9, + 8, + 9, + 6, + 4, + 8, + 6, + 12, + 16, + 7, + 7, + 16, + 6, + 9, + 8, + 6, + 7, + 5, + 8, + 7, + 7, + 6, + 2, + 8, + 8, + 9, + 9, + 8, + 7, + 7, + 6, + 2, + 5, + 9, + 8, + 3, + 7, + 9, + 7, + 7, + 5, + 16, + 16, + 6, + 7, + 5, + 8, + 5, + 9, + 7, + 6, + 6, + 7, + 7, + 8, + 1, + 8, + 10, + 3, + 4, + 6, + 8, + 5, + 7, + 6, + 5, + 6, + 5, + 8, + 8, + 7, + 7, + 9, + 8, + 11, + 7, + 8, + 8, + 7, + 9, + 4, + 8, + 8, + 5, + 8, + 4, + 9, + 16, + 7, + 16, + 3, + 7, + 8, + 5, + 8, + 7, + 8, + 13, + 7, + 3, + 7, + 7, + 9, + 5, + 9, + 7, + 7, + 8, + 8, + 9, + 8, + 6, + 4, + 3, + 10, + 5, + 9, + 9, + 7, + 3, + 8, + 9, + 7, + 5, + 9, + 9, + 6, + 7, + 3, + 8, + 6, + 9, + 5, + 7, + 6, + 7, + 6, + 8, + 5, + 6, + 7, + 7, + 7, + 7, + 6, + 16, + 6, + 2, + 9, + 7, + 8, + 7, + 6, + 10, + 7, + 5, + 9, + 9, + 6, + 4, + 8, + 7, + 5, + 8, + 8, + 10, + 6, + 7, + 8, + 16, + 8, + 7, + 7, + 7, + 3, + 8, + 7, + 6, + 5, + 3, + 9, + 4, + 3, + 5, + 6, + 7, + 7, + 6, + 9, + 9, + 7, + 7, + 9, + 3, + 7, + 9, + 7, + 4, + 5, + 5, + 16, + 10, + 7, + 9, + 7, + 8, + 10, + 7, + 8, + 6, + 7, + 3, + 11, + 5, + 6, + 6, + 5, + 6, + 9, + 8, + 8, + 4, + 5, + 6, + 7, + 7, + 7, + 7, + 9, + 7, + 6, + 8, + 8, + 3, + 6, + 7, + 4, + 3, + 8, + 7, + 8, + 6, + 8, + 7, + 8, + 6, + 9, + 9, + 4, + 7, + 9, + 8, + 9, + 6, + 7, + 8, + 4, + 5, + 6, + 2, + 6, + 16, + 4, + 16, + 7, + 10, + 7, + 7, + 5, + 7, + 6, + 5, + 8, + 8, + 8, + 2, + 5, + 4, + 4, + 6, + 10, + 8, + 1, + 9, + 8, + 8, + 7, + 4, + 6, + 9, + 11, + 8, + 6, + 3, + 4, + 3, + 7, + 4, + 3, + 7, + 4, + 8, + 5, + 7, + 6, + 6, + 8, + 6, + 4, + 7, + 7, + 12, + 8, + 2, + 7, + 5, + 8, + 7, + 8, + 3, + 5, + 7, + 3, + 5, + 6, + 3, + 3, + 5, + 6, + 7, + 7, + 4, + 11, + 9, + 7, + 5, + 3, + 7, + 6, + 4, + 6, + 7, + 8, + 7, + 7, + 9, + 7, + 7, + 6, + 5, + 9, + 7, + 5, + 3, + 7, + 8, + 6, + 3, + 8, + 3, + 4, + 9, + 10, + 8, + 6, + 7, + 4, + 9, + 7, + 4, + 5, + 6, + 6, + 4, + 7, + 5, + 7, + 9, + 7, + 8, + 9, + 6, + 5, + 7, + 6, + 8, + 7, + 6, + 7, + 13, + 7, + 6, + 8, + 5, + 9, + 7, + 8, + 5, + 5, + 6, + 7, + 9, + 2, + 7, + 8, + 8, + 5, + 6, + 7, + 8, + 4, + 4, + 9, + 4, + 6, + 6, + 4, + 6, + 7, + 7, + 6, + 8, + 9, + 6, + 8, + 5, + 7, + 9, + 8, + 5, + 7, + 10, + 5, + 6, + 7, + 2, + 6, + 9, + 7, + 6, + 7, + 4, + 7, + 6, + 8, + 9, + 4, + 8, + 5, + 5, + 7, + 6, + 5, + 5, + 5, + 7, + 6, + 5, + 13, + 5, + 8, + 9, + 2, + 8, + 7, + 8, + 5, + 8, + 6, + 3, + 8, + 9, + 6, + 7, + 7, + 4, + 3, + 9, + 8, + 6, + 6, + 16, + 7, + 4, + 7, + 5, + 10, + 6, + 7, + 10, + 9, + 4, + 3, + 5, + 7, + 5, + 7, + 9, + 5, + 7, + 8, + 7, + 4, + 7, + 9, + 7, + 7, + 7, + 8, + 7, + 7, + 5, + 7, + 7, + 7, + 6, + 9, + 6, + 7, + 6, + 5, + 7, + 5, + 10, + 8, + 6, + 9, + 7, + 5, + 5, + 7, + 5, + 10, + 3, + 8, + 11, + 8, + 3, + 9, + 9, + 8, + 8, + 8, + 7, + 9, + 7, + 6, + 7, + 8, + 10, + 7, + 8, + 7, + 10, + 8, + 10, + 6, + 6, + 8, + 7, + 6, + 8, + 8, + 8, + 7, + 8, + 6, + 8, + 8, + 9, + 7, + 7, + 2, + 6, + 4, + 7, + 7, + 7, + 6, + 10, + 9, + 9, + 4, + 4, + 9, + 6, + 9, + 16, + 8, + 7, + 6, + 10, + 7, + 6, + 7, + 7, + 8, + 5, + 4, + 6, + 6, + 4, + 10, + 8, + 7, + 8, + 8, + 10, + 6, + 5, + 6, + 8, + 6, + 7, + 7, + 5, + 9, + 10, + 5, + 5, + 8, + 4, + 8, + 7, + 7, + 7, + 4, + 8, + 4, + 5, + 5, + 3, + 5, + 8, + 7, + 7, + 7, + 7, + 9, + 5, + 7, + 6, + 7, + 8, + 7, + 9, + 8, + 3, + 6, + 8, + 7, + 7, + 7, + 8, + 8, + 7, + 8, + 6, + 7, + 15, + 7, + 8, + 6, + 8, + 8, + 5, + 6, + 9, + 6, + 9, + 8, + 8, + 7, + 7, + 7, + 6, + 6, + 9, + 8, + 7, + 7, + 8, + 9, + 8, + 5, + 8, + 9, + 8, + 6, + 5, + 5, + 3, + 7, + 6, + 7, + 4, + 5, + 5, + 6, + 5, + 8, + 7, + 7, + 6, + 6, + 7, + 6, + 6, + 5, + 8, + 6, + 5, + 7, + 8, + 8, + 8, + 8, + 8, + 5, + 8, + 8, + 3, + 9, + 5, + 6, + 6, + 8, + 7, + 6, + 9, + 7, + 7, + 5, + 5, + 9, + 8, + 6, + 6, + 9, + 9, + 6, + 10, + 8, + 8, + 7, + 13, + 6, + 8, + 8, + 7, + 9, + 8, + 5, + 7, + 8, + 8, + 7, + 9, + 8, + 7, + 7, + 5, + 8, + 10, + 8, + 6, + 6, + 8, + 8, + 10, + 10, + 8, + 8, + 8, + 7, + 8, + 6, + 6, + 8, + 9, + 4, + 8, + 7, + 8, + 8, + 7, + 8, + 14, + 5, + 7, + 8, + 5, + 5, + 8, + 6, + 7, + 8, + 6, + 4, + 8, + 7, + 8, + 7, + 9, + 7, + 8, + 6, + 7, + 7, + 7, + 10, + 7, + 7, + 7, + 9, + 7, + 10, + 8, + 8, + 7, + 9, + 7, + 7, + 8, + 6, + 8, + 7, + 4, + 7, + 6, + 6, + 8, + 8, + 7, + 8, + 4, + 3, + 9, + 5, + 7, + 8, + 6, + 6, + 8, + 7, + 6, + 9, + 8, + 8, + 5, + 8, + 8, + 5, + 7, + 9, + 7, + 5, + 7, + 7, + 5, + 5, + 7, + 7, + 5, + 7, + 4, + 7, + 9, + 11, + 9, + 5, + 9, + 8, + 5, + 2, + 5, + 7, + 8, + 9, + 6, + 7, + 8, + 8, + 7, + 8, + 4, + 10, + 7, + 7, + 8, + 8, + 9, + 7, + 8, + 10, + 7, + 9, + 8, + 7, + 8, + 8, + 6, + 7, + 7, + 7, + 3, + 5, + 8, + 9, + 7, + 7, + 7, + 8, + 7, + 6, + 7, + 5, + 7, + 7, + 9, + 9, + 6, + 9, + 7, + 7, + 8, + 8, + 4, + 6, + 7, + 6, + 7, + 7, + 7, + 6, + 9, + 6, + 8, + 7, + 4, + 6, + 8, + 9, + 6, + 8, + 8, + 7, + 7, + 9, + 9, + 6, + 8, + 8, + 8, + 8, + 5, + 7, + 6, + 7, + 8, + 8, + 8, + 7, + 7, + 8, + 8, + 8, + 8, + 8, + 8, + 5, + 6, + 6, + 4, + 7, + 16, + 8, + 7, + 7, + 8, + 7, + 6, + 6, + 7, + 5, + 4, + 7, + 8, + 11, + 7, + 7, + 5, + 8, + 8, + 3, + 5, + 7, + 7, + 9, + 5, + 16, + 7, + 2, + 6, + 6, + 7, + 7, + 7, + 7, + 8, + 5, + 16, + 5, + 4, + 2, + 6, + 7, + 7, + 5, + 4, + 8, + 7, + 4, + 8, + 9, + 5, + 8, + 8, + 4, + 5, + 8, + 7, + 6, + 8, + 6, + 6, + 6, + 4, + 3, + 9, + 5, + 8, + 10, + 7, + 8, + 8, + 6, + 9, + 5, + 5, + 8, + 7, + 9, + 7, + 8, + 11, + 8, + 10, + 8, + 8, + 7, + 8, + 6, + 5, + 5, + 7, + 6, + 8, + 7, + 6, + 10, + 8, + 8, + 7, + 10, + 7, + 7, + 8, + 6, + 8, + 4, + 7, + 5, + 6, + 8, + 7, + 7, + 9, + 7, + 9, + 7, + 7, + 16, + 7, + 8, + 7, + 4, + 8, + 8, + 7, + 7, + 7, + 8, + 7, + 7, + 7, + 7, + 7, + 9, + 9, + 6, + 9, + 6, + 7, + 8, + 7, + 7, + 8, + 8, + 7, + 8, + 8, + 7, + 6, + 7, + 8, + 8, + 8, + 8, + 7, + 7, + 6, + 5, + 7, + 7, + 8, + 7, + 8, + 8, + 5, + 7, + 6, + 8, + 8, + 3, + 5, + 8, + 7, + 8, + 8, + 7, + 5, + 6, + 4, + 9, + 7, + 5, + 6, + 8, + 8, + 7, + 7, + 4, + 8, + 8, + 7, + 6, + 9, + 7, + 8, + 7, + 8, + 7, + 6, + 5, + 9, + 7, + 9, + 7, + 9, + 8, + 5, + 10, + 8, + 7, + 6, + 7, + 7, + 7, + 8, + 5, + 6, + 7, + 8, + 6, + 8, + 6, + 4, + 8, + 8, + 7, + 6, + 6, + 9, + 8, + 5, + 6, + 6, + 9, + 9, + 6, + 8, + 8, + 9, + 7, + 7, + 7, + 7, + 6, + 9, + 9, + 7, + 7, + 7, + 8, + 9, + 9, + 9, + 8, + 5, + 9, + 8, + 7, + 4, + 7, + 9, + 7, + 8, + 7, + 6, + 7, + 8, + 9, + 4, + 8, + 9, + 8, + 7, + 9, + 6, + 9, + 8, + 8, + 7, + 5, + 9, + 9, + 6, + 7, + 8, + 9, + 9, + 7, + 7, + 8, + 2, + 6, + 7, + 8, + 5, + 7, + 6, + 6, + 7, + 5, + 7, + 6, + 4, + 5, + 8, + 8, + 7, + 8, + 8, + 8, + 7, + 9, + 8, + 6, + 6, + 8, + 6, + 8, + 7, + 7, + 7, + 8, + 9, + 7, + 8, + 6, + 5, + 5, + 7, + 8, + 5, + 7, + 5, + 6, + 7, + 6, + 6, + 8, + 8, + 7, + 8, + 8, + 7, + 6, + 8, + 7, + 8, + 7, + 8, + 9, + 7, + 8, + 6, + 9, + 7, + 8, + 5, + 9, + 9, + 8, + 7, + 7, + 3, + 5, + 8, + 7, + 5, + 6, + 7, + 7, + 7, + 7, + 5, + 7, + 4, + 7, + 8, + 7, + 4, + 6, + 6, + 7, + 7, + 5, + 8, + 6, + 5, + 6, + 7, + 16, + 6, + 10, + 7, + 5, + 6, + 8, + 6, + 8, + 7, + 6, + 5, + 8, + 8, + 7, + 5, + 6, + 8, + 5, + 8, + 9, + 8, + 9, + 7, + 5, + 8, + 7, + 9, + 8, + 7, + 6, + 6, + 8, + 8, + 9, + 5, + 7, + 8, + 5, + 5, + 7, + 7, + 8, + 8, + 8, + 4, + 9, + 9, + 6, + 8, + 7, + 5, + 8, + 7, + 5, + 6, + 5, + 8, + 9, + 10, + 7, + 5, + 7, + 6, + 6, + 7, + 7, + 8, + 6, + 7, + 8, + 8, + 8, + 6, + 8, + 8, + 6, + 7, + 5, + 7, + 9, + 9, + 5, + 7, + 5, + 6, + 7, + 8, + 8, + 8, + 6, + 5, + 7, + 10, + 6, + 8, + 7, + 7, + 9, + 7, + 8, + 8, + 8, + 6, + 4, + 6, + 9, + 7, + 8, + 8, + 7, + 5, + 6, + 5, + 4, + 6, + 5, + 8, + 6, + 8, + 5, + 7, + 6, + 7, + 6, + 8, + 10, + 5, + 6, + 10, + 7, + 8, + 6, + 7, + 8, + 7, + 4, + 8, + 9, + 4, + 4, + 8, + 7, + 8, + 7, + 7, + 5, + 7, + 9, + 6, + 7, + 7, + 6, + 8, + 6, + 7, + 9, + 7, + 5, + 7, + 5, + 7, + 5, + 9, + 6, + 4, + 7, + 6, + 8, + 8, + 7, + 8, + 7, + 8, + 7, + 7, + 8, + 5, + 7, + 7, + 5, + 5, + 7, + 6, + 7, + 5, + 6, + 5, + 6, + 7, + 7, + 7, + 5, + 8, + 7, + 9, + 6, + 6, + 9, + 4, + 8, + 7, + 7, + 7, + 5, + 7, + 5, + 7, + 8, + 8, + 8, + 8, + 5, + 5, + 7, + 5, + 8, + 7, + 8, + 8, + 8, + 5, + 10, + 8, + 7, + 9, + 7, + 6, + 7, + 6, + 7, + 8, + 7, + 6, + 8, + 6, + 7, + 7, + 7, + 5, + 6, + 8, + 5, + 6, + 7, + 5, + 7, + 8, + 7, + 6, + 8, + 6, + 5, + 7, + 10, + 7, + 6, + 7, + 7, + 9, + 6, + 6, + 6, + 6, + 12, + 7, + 8, + 6, + 5, + 4, + 9, + 8, + 6, + 9, + 6, + 8, + 7, + 7, + 7, + 8, + 5, + 7, + 8, + 7, + 5, + 8, + 7, + 7, + 7, + 6, + 5, + 5, + 7, + 7, + 3, + 8, + 8, + 5, + 5, + 7, + 7, + 8, + 6, + 8, + 5, + 6, + 9, + 9, + 7, + 8, + 8, + 7, + 6, + 8, + 5, + 7, + 6, + 7, + 9, + 7, + 8, + 6, + 8, + 7, + 7, + 8, + 7, + 8, + 7, + 8, + 8, + 9, + 7, + 5, + 6, + 7, + 10, + 10, + 8, + 8, + 8, + 4, + 7, + 8, + 6, + 8, + 5, + 8, + 7, + 6, + 7, + 7, + 5, + 8, + 8, + 7, + 5, + 7, + 7, + 5, + 6, + 8, + 7, + 6, + 7, + 7, + 6, + 8, + 6, + 7, + 8, + 8, + 8, + 6, + 6, + 5, + 8, + 7, + 7, + 7, + 8, + 6, + 8, + 8, + 7, + 8, + 8, + 9, + 7, + 7, + 7, + 7, + 7, + 9, + 6, + 5, + 8, + 8, + 5, + 8, + 8, + 8, + 8, + 8, + 7, + 8, + 7, + 8, + 8, + 5, + 7, + 8, + 8, + 8, + 7, + 8, + 6, + 7, + 7, + 6, + 9, + 5, + 7, + 5, + 6, + 5, + 5, + 6, + 5, + 6, + 8, + 8, + 8, + 9, + 8, + 9, + 9, + 7, + 8, + 7, + 8, + 9, + 8, + 8, + 7, + 7, + 3, + 8, + 6, + 7, + 4, + 11, + 7, + 8, + 7, + 7, + 8, + 6, + 7, + 7, + 6, + 8, + 9, + 6, + 8, + 7, + 7, + 3, + 4, + 8, + 5, + 8, + 10, + 8, + 6, + 8, + 7, + 6, + 6, + 7, + 6, + 8, + 7, + 8, + 6, + 6, + 9, + 8, + 10, + 7, + 7, + 10, + 6, + 8, + 8, + 5, + 7, + 8, + 7, + 6, + 8, + 7, + 8, + 7, + 6, + 8, + 7, + 8, + 7, + 8, + 7, + 8, + 6, + 7, + 8, + 9, + 7, + 8, + 5, + 7, + 6, + 9, + 9, + 7, + 9, + 8, + 9, + 8, + 5, + 9, + 9, + 5, + 7, + 6, + 8, + 9, + 7, + 7, + 6, + 7, + 8, + 7, + 5, + 6, + 7, + 7, + 8, + 3, + 6, + 8, + 7, + 8, + 7, + 7, + 8, + 5, + 8, + 8, + 9, + 8, + 8, + 5, + 5, + 8, + 8, + 8, + 7, + 7, + 6, + 8, + 7, + 8, + 8, + 7, + 8, + 5, + 3, + 7, + 8, + 5, + 6, + 8, + 7, + 10, + 9, + 16, + 7, + 8, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 10, + 8, + 7, + 7, + 6, + 8, + 7, + 8, + 5, + 6, + 8, + 7, + 6, + 5, + 7, + 4, + 5, + 9, + 5, + 7, + 7, + 8, + 7, + 7, + 9, + 7, + 16, + 6, + 8, + 5, + 14, + 5, + 7, + 8, + 8, + 8, + 7, + 6, + 10, + 7, + 6, + 8, + 8, + 8, + 7, + 6, + 7, + 8, + 8, + 7, + 10, + 7, + 8, + 6, + 7, + 6, + 7, + 9, + 10, + 8, + 7, + 7, + 8, + 7, + 7, + 6, + 5, + 8, + 7, + 6, + 7, + 8, + 8, + 7, + 7, + 5, + 6, + 10, + 7, + 5, + 6, + 5, + 5, + 8, + 7, + 7, + 5, + 6, + 9, + 8, + 7, + 8, + 8, + 8, + 7, + 7, + 8, + 9, + 7, + 5, + 5, + 7, + 7, + 7, + 7, + 8, + 5, + 8, + 7, + 6, + 7, + 8, + 7, + 9, + 8, + 9, + 5, + 8, + 8, + 7, + 8, + 8, + 8, + 7, + 5, + 8, + 7, + 8, + 8, + 7, + 7, + 9, + 7, + 8, + 7, + 7, + 7, + 8, + 6, + 8, + 6, + 8, + 8, + 7, + 10, + 8, + 8, + 7, + 5, + 5, + 6, + 8, + 9, + 8, + 8, + 6, + 8, + 5, + 5, + 9, + 8, + 6, + 8, + 8, + 8, + 7, + 6, + 7, + 10, + 6, + 8, + 8, + 6, + 8, + 7, + 5, + 8, + 7, + 7, + 8, + 7, + 7, + 7, + 7, + 5, + 7, + 8, + 6, + 7, + 8, + 7, + 6, + 9, + 7, + 7, + 8, + 8, + 7, + 6, + 7, + 6, + 7, + 4, + 7, + 7, + 8, + 7, + 8, + 7, + 8, + 6, + 8, + 5, + 8, + 6, + 6, + 7, + 8, + 6, + 8, + 8, + 5, + 7, + 7, + 8, + 8, + 7, + 8, + 8, + 8, + 8, + 7, + 6, + 7, + 8, + 7, + 6, + 7, + 8, + 7, + 7, + 7, + 6, + 8, + 7, + 5, + 7, + 9, + 7, + 10, + 8, + 7, + 6, + 7, + 7, + 8, + 5, + 8, + 8, + 8, + 7, + 7, + 7, + 8, + 8, + 7, + 7, + 7, + 7, + 8, + 8, + 5, + 10, + 8, + 8, + 7, + 6, + 7, + 7, + 7, + 7, + 8, + 7, + 7, + 8, + 8, + 5, + 9, + 6, + 7, + 7, + 8, + 8, + 6, + 7, + 7, + 10, + 7, + 8, + 5, + 7, + 6, + 7, + 9, + 8, + 7, + 5, + 5, + 8, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 5, + 8, + 4, + 6, + 7, + 10, + 7, + 7, + 7, + 7, + 9, + 8, + 8, + 8, + 5, + 8, + 7, + 5, + 6, + 5, + 7, + 9, + 7, + 8, + 8, + 9, + 8, + 7, + 6, + 8, + 7, + 7, + 7, + 8, + 5, + 9, + 7, + 7, + 6, + 8, + 8, + 5, + 5, + 8, + 8, + 8, + 8, + 8, + 7, + 9, + 8, + 5, + 7, + 7, + 8, + 7, + 8, + 6, + 6, + 7, + 7, + 7, + 7, + 7, + 8, + 7, + 8, + 7, + 8, + 5, + 6, + 7, + 8, + 8, + 8, + 6, + 8, + 5, + 8, + 7, + 8, + 7, + 8, + 5, + 8, + 7, + 7, + 6, + 7, + 7, + 8, + 7, + 7, + 7, + 7, + 7, + 8, + 5, + 8, + 6, + 8, + 6, + 6, + 7, + 7, + 7, + 8, + 5, + 9, + 6, + 8, + 7, + 7, + 7, + 8, + 8, + 7, + 7, + 7, + 4, + 7, + 7, + 8, + 8, + 6, + 7, + 6, + 5, + 7, + 10, + 10, + 8, + 8, + 7, + 8, + 6, + 8, + 5, + 5, + 5, + 8, + 6, + 6, + 8, + 4, + 8, + 5, + 8, + 8, + 6, + 7, + 5, + 8, + 10, + 8, + 7, + 5, + 7, + 8, + 7, + 8, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 7, + 8, + 8, + 7, + 9, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 6, + 8, + 8, + 7, + 7, + 8, + 7, + 7, + 7, + 7, + 7, + 7, + 5, + 5, + 7, + 7, + 7, + 6, + 8, + 7, + 5, + 5, + 7, + 8, + 6, + 8, + 3, + 5, + 7, + 7, + 4, + 7, + 8, + 8, + 6, + 8, + 8, + 6, + 7, + 7, + 7, + 7, + 8, + 8, + 10, + 7, + 5, + 7, + 7, + 5, + 7, + 8, + 8, + 8, + 8, + 6, + 8, + 7, + 8, + 8, + 7, + 7, + 8, + 7, + 5, + 7, + 6, + 6, + 7, + 5, + 7, + 8, + 6, + 6, + 3, + 8, + 3, + 6, + 7, + 8, + 4, + 5, + 8, + 6, + 8, + 6, + 5, + 7, + 7, + 7, + 8, + 7, + 7, + 6, + 5, + 7, + 6, + 8, + 5, + 7, + 7, + 8, + 7, + 8, + 7, + 7, + 5, + 8, + 7, + 7, + 7, + 3, + 5, + 7, + 6, + 6, + 8, + 7, + 5, + 7, + 8, + 10, + 6, + 7, + 8, + 8, + 8, + 7, + 7, + 7, + 5, + 7, + 8, + 8, + 8, + 10, + 7, + 8, + 6, + 5, + 8, + 8, + 7, + 7, + 7, + 7, + 7, + 5, + 7, + 5, + 5, + 7, + 7, + 7, + 6, + 7, + 5, + 7, + 7, + 7, + 5, + 8, + 7, + 6, + 7, + 8, + 7, + 8, + 8, + 6, + 7, + 5, + 5, + 6, + 8, + 4, + 7, + 5, + 8, + 7, + 7, + 6, + 15, + 8, + 7, + 7, + 8, + 9, + 8, + 7, + 8, + 7, + 7, + 7, + 8, + 8, + 8, + 7, + 5, + 7, + 6, + 9, + 7, + 7, + 7, + 8, + 7, + 6, + 8, + 8, + 6, + 7, + 4, + 7, + 9, + 10, + 8, + 6, + 4, + 6, + 7, + 7, + 9, + 8, + 7, + 6, + 8, + 8, + 4, + 7, + 7, + 7, + 7, + 8, + 7, + 7, + 7, + 8, + 8, + 5, + 8, + 8, + 6, + 6, + 7, + 7, + 7, + 7, + 6, + 7, + 8, + 9, + 8, + 7, + 6, + 7, + 4, + 8, + 7, + 7, + 5, + 5, + 7, + 7, + 7, + 8, + 7, + 5, + 7, + 8, + 7, + 7, + 7, + 8, + 4, + 6, + 8, + 7, + 7, + 10, + 5, + 7, + 7, + 8, + 10, + 7, + 8, + 5, + 10, + 8, + 6, + 8, + 5, + 5, + 7, + 8, + 8, + 8, + 8, + 8, + 6, + 5, + 8, + 6, + 5, + 4, + 5, + 7, + 7, + 7, + 8, + 8, + 8, + 7, + 8, + 7, + 6, + 5, + 6, + 7, + 7, + 8, + 6, + 5, + 7, + 6, + 8, + 8, + 7, + 7, + 7, + 8, + 7, + 6, + 6, + 7, + 4, + 7, + 8, + 8, + 6, + 7, + 7, + 5, + 6, + 7, + 7, + 7, + 6, + 7, + 4, + 6, + 9, + 7, + 7, + 8, + 7, + 7, + 7, + 8, + 8, + 9, + 8, + 8, + 8, + 6, + 8, + 8, + 8, + 7, + 8, + 7, + 6, + 7, + 6, + 7, + 8, + 6, + 6, + 7, + 8, + 8, + 8, + 8, + 6, + 8, + 7, + 5, + 9, + 6, + 8, + 4, + 8, + 8, + 8, + 7, + 7, + 7, + 5, + 8, + 8, + 4, + 5, + 8, + 7, + 6, + 8, + 7, + 6, + 8, + 6, + 7, + 8, + 7, + 5, + 8, + 5, + 6, + 6, + 5, + 6, + 8, + 6, + 8, + 5, + 8, + 8, + 6, + 6, + 8, + 8, + 4, + 7, + 5, + 8, + 8, + 8, + 6, + 8, + 6, + 7, + 8, + 8, + 7, + 8, + 7, + 5, + 8, + 7, + 7, + 8, + 7, + 8, + 7, + 7, + 7, + 10, + 9, + 7, + 7, + 7, + 6, + 7, + 7, + 6, + 7, + 4, + 7, + 7, + 6, + 6, + 6, + 9, + 6, + 5, + 6, + 5, + 8, + 7, + 5, + 8, + 8, + 8, + 7, + 6, + 7, + 8, + 7, + 7, + 8, + 7, + 6, + 8, + 7, + 7, + 8, + 5, + 8, + 7, + 8, + 5, + 7, + 7, + 9, + 4, + 6, + 5, + 6, + 6, + 7, + 7, + 8, + 8, + 7, + 8, + 7, + 7, + 7, + 13, + 6, + 7, + 6, + 8, + 8, + 5, + 8, + 6, + 6, + 7, + 6, + 7, + 4, + 8, + 6, + 8, + 8, + 8, + 7, + 7, + 8, + 6, + 8, + 7, + 7, + 8, + 7, + 8, + 7, + 5, + 8, + 6, + 7, + 6, + 5, + 7, + 8, + 6, + 5, + 7, + 3, + 8, + 7, + 5, + 7, + 6, + 7, + 6, + 4, + 6, + 7, + 8, + 8, + 6, + 16, + 8, + 7, + 7, + 7, + 7, + 5, + 7, + 9, + 7, + 7, + 7, + 7, + 10, + 6, + 7, + 8, + 8, + 9, + 6, + 6, + 7, + 7, + 10, + 7, + 8, + 8, + 7, + 6, + 7, + 7, + 5, + 7, + 7, + 6, + 7, + 8, + 8, + 5, + 9, + 6, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 8, + 6, + 7, + 8, + 7, + 7, + 7, + 6, + 5, + 6, + 6, + 16, + 7, + 3, + 10, + 6, + 6, + 7, + 5, + 7, + 6, + 7, + 9, + 6, + 8, + 6, + 8, + 7, + 7, + 7, + 8, + 7, + 6, + 7, + 8, + 7, + 7, + 4, + 7, + 7, + 5, + 7, + 5, + 5, + 9, + 7, + 7, + 7, + 8, + 7, + 7, + 8, + 4, + 8, + 8, + 6, + 6, + 8, + 7, + 7, + 7, + 8, + 7, + 7, + 4, + 8, + 8, + 6, + 7, + 6, + 7, + 7, + 7, + 7, + 8, + 8, + 8, + 6, + 7, + 8, + 6, + 7, + 6, + 4, + 8, + 8, + 6, + 8, + 6, + 8, + 7, + 7, + 8, + 8, + 8, + 5, + 8, + 8, + 8, + 8, + 8, + 7, + 7, + 6, + 7, + 7, + 8, + 5, + 7, + 7, + 7, + 8, + 6, + 7, + 6, + 6, + 8, + 5, + 6, + 6, + 5, + 8, + 8, + 5, + 7, + 8, + 4, + 8, + 7, + 9, + 6, + 7, + 6, + 6, + 7, + 10, + 7, + 7, + 8, + 7, + 7, + 7, + 8, + 6, + 7, + 7, + 6, + 8, + 6, + 8, + 7, + 6, + 7, + 5, + 7, + 8, + 7, + 5, + 8, + 7, + 6, + 7, + 8, + 8, + 6, + 8, + 8, + 5, + 7, + 6, + 10, + 7, + 7, + 7, + 9, + 6, + 7, + 8, + 7, + 7, + 5, + 7, + 5, + 7, + 6, + 7, + 6, + 8, + 5, + 7, + 8, + 8, + 7, + 7, + 7, + 7, + 8, + 7, + 9, + 6, + 7, + 7, + 5, + 6, + 9, + 8, + 7, + 6, + 7, + 7, + 7, + 8, + 7, + 7, + 5, + 5, + 8, + 7, + 7, + 6, + 8, + 8, + 7, + 8, + 8, + 8, + 8, + 7, + 8, + 7, + 7, + 5, + 8, + 7, + 9, + 8, + 7, + 8, + 5, + 8, + 6, + 7, + 9, + 8, + 6, + 7, + 7, + 10, + 7, + 10, + 8, + 8, + 7, + 7, + 7, + 8, + 8, + 8, + 6, + 7, + 6, + 5, + 6, + 8, + 7, + 9, + 8, + 4, + 8, + 6, + 8, + 8, + 6, + 6, + 8, + 7, + 7, + 7, + 7, + 7, + 6, + 16, + 6, + 7, + 7, + 7, + 9, + 6, + 16, + 7, + 7, + 8, + 6, + 7, + 7, + 5, + 6, + 6, + 7, + 7, + 5, + 5, + 4, + 6, + 7, + 6, + 4, + 7, + 9, + 5, + 7, + 5, + 5, + 9, + 7, + 8, + 6, + 6, + 15, + 7, + 7, + 5, + 7, + 6, + 6, + 8, + 7, + 5, + 5, + 7, + 7, + 5, + 3, + 6, + 8, + 7, + 5, + 7, + 8, + 10, + 7, + 4, + 4, + 5, + 5, + 7, + 5, + 7, + 6, + 8, + 4, + 6, + 4, + 3, + 7, + 6, + 5, + 7, + 6, + 9, + 4, + 5, + 7, + 7, + 5, + 5, + 8, + 7, + 4, + 6, + 8, + 8, + 7, + 7, + 6, + 7, + 4, + 7, + 5, + 7, + 4, + 7, + 7, + 4, + 7, + 5, + 5, + 8, + 5, + 6, + 8, + 7, + 7, + 5, + 7, + 5, + 4, + 8, + 6, + 7, + 4, + 8, + 7, + 9, + 8, + 8, + 6, + 4, + 5, + 4, + 6, + 6, + 5, + 5, + 4, + 4, + 7, + 6, + 4, + 8, + 8, + 4, + 6, + 4, + 7, + 8, + 6, + 7, + 7, + 7, + 7, + 7, + 5, + 5, + 9, + 8, + 7, + 6, + 8, + 3, + 6, + 7, + 8, + 7, + 8, + 7, + 8, + 7, + 5, + 4, + 4, + 4, + 7, + 5, + 7, + 6, + 8, + 7, + 7, + 6, + 6, + 8, + 7, + 5, + 7, + 5, + 8, + 6, + 8, + 7, + 5, + 8, + 4, + 5, + 6, + 4, + 7, + 8, + 4, + 7, + 8, + 7, + 7, + 7, + 6, + 5, + 7, + 6, + 8, + 8, + 8, + 8, + 6, + 4, + 8, + 7, + 7, + 5, + 3, + 6, + 7, + 8, + 5, + 10, + 7, + 8, + 6, + 6, + 7, + 7, + 6, + 5, + 7, + 8, + 7, + 8, + 8, + 7, + 3, + 7, + 9, + 8, + 7, + 6, + 8, + 6, + 4, + 6, + 8, + 4, + 7, + 7, + 5, + 5, + 6, + 6, + 7, + 5, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 8, + 7, + 7, + 6, + 4, + 5, + 4, + 8, + 7, + 6, + 7, + 8, + 8, + 5, + 8, + 7, + 7, + 7, + 4, + 6, + 7, + 5, + 7, + 5, + 4, + 7, + 8, + 8, + 4, + 6, + 7, + 6, + 4, + 7, + 8, + 7, + 6, + 4, + 5, + 8, + 7, + 8, + 6, + 5, + 7, + 7, + 4, + 4, + 7, + 6, + 8, + 8, + 8, + 5, + 4, + 5, + 8, + 6, + 5, + 7, + 6, + 5, + 7, + 6, + 8, + 7, + 7, + 7, + 10, + 7, + 6, + 6, + 6, + 6, + 6, + 7, + 6, + 7, + 5, + 5, + 7, + 11, + 9, + 7, + 6, + 4, + 6, + 5, + 5, + 5, + 7, + 4, + 8, + 8, + 7, + 7, + 8, + 7, + 6, + 7, + 4, + 7, + 6, + 8, + 6, + 6, + 8, + 8, + 8, + 8, + 7, + 7, + 5, + 7, + 7, + 7, + 5, + 7, + 9, + 4, + 4, + 5, + 8, + 7, + 7, + 8, + 8, + 8, + 7, + 8, + 5, + 7, + 6, + 7, + 8, + 5, + 8, + 6, + 7, + 8, + 9, + 6, + 8, + 6, + 6, + 6, + 7, + 7, + 7, + 8, + 7, + 8, + 7, + 7, + 8, + 7, + 6, + 6, + 6, + 6, + 7, + 7, + 8, + 7, + 8, + 6, + 5, + 5, + 8, + 7, + 7, + 9, + 5, + 5, + 7, + 9, + 7, + 7, + 8, + 6, + 6, + 8, + 5, + 8, + 4, + 4, + 8, + 7, + 7, + 8, + 8, + 6, + 4, + 5, + 7, + 6, + 7, + 8, + 6, + 5, + 5, + 5, + 6, + 3, + 7, + 5, + 7, + 8, + 8, + 7, + 8, + 7, + 7, + 5, + 5, + 5, + 5, + 7, + 6, + 6, + 7, + 7, + 8, + 5, + 6, + 7, + 5, + 6, + 4, + 5, + 7, + 8, + 8, + 7, + 9, + 7, + 7, + 5, + 5, + 5, + 7, + 8, + 8, + 8, + 8, + 7, + 8, + 8, + 8, + 8, + 5, + 8, + 6, + 9, + 7, + 7, + 6, + 5, + 8, + 3, + 7, + 7, + 5, + 8, + 7, + 8, + 7, + 6, + 7, + 7, + 8, + 7, + 8, + 6, + 6, + 7, + 5, + 8, + 7, + 8, + 7, + 7, + 5, + 9, + 5, + 5, + 7, + 4, + 5, + 5, + 8, + 5, + 7, + 6, + 6, + 6, + 7, + 9, + 7, + 7, + 6, + 6, + 6, + 6, + 6, + 7, + 7, + 8, + 7, + 6, + 8, + 6, + 6, + 7, + 8, + 8, + 7, + 5, + 5, + 8, + 6, + 5, + 8, + 6, + 7, + 3, + 7, + 4, + 9, + 8, + 6, + 7, + 8, + 7, + 6, + 5, + 7, + 6, + 7, + 5, + 8, + 6, + 4, + 7, + 6, + 5, + 5, + 8, + 5, + 8, + 8, + 8, + 8, + 7, + 8, + 8, + 6, + 7, + 6, + 7, + 8, + 5, + 7, + 7, + 5, + 6, + 7, + 8, + 7, + 8, + 5, + 7, + 4, + 6, + 7, + 7, + 7, + 7, + 7, + 7, + 8, + 5, + 8, + 8, + 5, + 8, + 8, + 7, + 7, + 3, + 7, + 8, + 7, + 3, + 7, + 9, + 8, + 8, + 4, + 7, + 7, + 8, + 9, + 7, + 7, + 8, + 9, + 6, + 6, + 8, + 7, + 7, + 10, + 4, + 5, + 6, + 7, + 7, + 5, + 7, + 6, + 8, + 6, + 7, + 8, + 4, + 7, + 5, + 7, + 7, + 6, + 5, + 7, + 8, + 8, + 8, + 5, + 6, + 7, + 4, + 2, + 8, + 5, + 7, + 10, + 7, + 7, + 6, + 5, + 6, + 8, + 7, + 7, + 7, + 7, + 10, + 8, + 6, + 7, + 7, + 6, + 7, + 5, + 7, + 8, + 6, + 8, + 7, + 5, + 4, + 7, + 6, + 7, + 8, + 7, + 5, + 5, + 7, + 5, + 7, + 4, + 9, + 10, + 7, + 7, + 7, + 8, + 6, + 6, + 6, + 8, + 7, + 5, + 8, + 7, + 8, + 4, + 8, + 8, + 7, + 8, + 6, + 9, + 6, + 8, + 8, + 7, + 7, + 8, + 6, + 8, + 7, + 5, + 6, + 6, + 7, + 7, + 8, + 7, + 7, + 8, + 9, + 5, + 6, + 8, + 8, + 6, + 8, + 8, + 8, + 7, + 5, + 6, + 5, + 7, + 7, + 7, + 8, + 5, + 7, + 9, + 7, + 6, + 7, + 8, + 7, + 4, + 8, + 7, + 5, + 7, + 6, + 7, + 5, + 7, + 7, + 6, + 7, + 7, + 2, + 8, + 6, + 5, + 5, + 7, + 7, + 6, + 8, + 5, + 5, + 5, + 4, + 7, + 5, + 4, + 7, + 6, + 5, + 4, + 7, + 6, + 8, + 7, + 7, + 5, + 6, + 7, + 5, + 4, + 6, + 7, + 8, + 6, + 8, + 7, + 5, + 8, + 5, + 8, + 5, + 4, + 7, + 8, + 6, + 6, + 8, + 7, + 6, + 6, + 7, + 8, + 8, + 7, + 8, + 7, + 6, + 7, + 5, + 6, + 7, + 2, + 7, + 7, + 6, + 8, + 5, + 6, + 6, + 5, + 7, + 7, + 5, + 6, + 8, + 8, + 8, + 5, + 6, + 6, + 10, + 6, + 4, + 6, + 7, + 7, + 7, + 7, + 6, + 8, + 5, + 7, + 5, + 5, + 8, + 8, + 6, + 8, + 4, + 8, + 7, + 5, + 5, + 8, + 7, + 7, + 7, + 6, + 7, + 6, + 4, + 8, + 6, + 7, + 7, + 6, + 8, + 8, + 3, + 7, + 8, + 7, + 3, + 8, + 8, + 8, + 7, + 7, + 8, + 8, + 4, + 5, + 6, + 8, + 6, + 7, + 6, + 9, + 8, + 9, + 7, + 8, + 5, + 7, + 8, + 8, + 7, + 5, + 4, + 4, + 7, + 6, + 6, + 5, + 5, + 8, + 6, + 7, + 6, + 7, + 6, + 5, + 4, + 7, + 6, + 6, + 8, + 10, + 8, + 8, + 8, + 6, + 7, + 7, + 7, + 5, + 7, + 6, + 4, + 10, + 8, + 4, + 7, + 8, + 7, + 7, + 7, + 7, + 8, + 6, + 6, + 6, + 5, + 7, + 7, + 6, + 7, + 4, + 5, + 7, + 7, + 4, + 7, + 5, + 8, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 6, + 7, + 6, + 6, + 7, + 12, + 7, + 7, + 7, + 9, + 7, + 8, + 10, + 7, + 7, + 7, + 8, + 6, + 7, + 5, + 7, + 7, + 6, + 6, + 7, + 8, + 7, + 7, + 7, + 8, + 6, + 4, + 7, + 7, + 8, + 8, + 8, + 6, + 7, + 7, + 7, + 5, + 8, + 7, + 7, + 6, + 5, + 7, + 7, + 7, + 4, + 8, + 8, + 7, + 3, + 8, + 6, + 4, + 8, + 5, + 7, + 6, + 8, + 7, + 8, + 7, + 7, + 5, + 6, + 7, + 7, + 5, + 6, + 7, + 6, + 7, + 6, + 6, + 6, + 4, + 7, + 16, + 9, + 7, + 4, + 5, + 5, + 6, + 6, + 6, + 8, + 7, + 8, + 7, + 6, + 7, + 8, + 7, + 8, + 8, + 6, + 8, + 7, + 7, + 7, + 5, + 7, + 7, + 5, + 7, + 5, + 6, + 6, + 5, + 7, + 7, + 7, + 7, + 9, + 5, + 6, + 6, + 6, + 6, + 5, + 7, + 7, + 7, + 7, + 6, + 5, + 7, + 6, + 6, + 6, + 6, + 6, + 6, + 7, + 7, + 6, + 8, + 6, + 7, + 5, + 6, + 7, + 8, + 8, + 6, + 8, + 7, + 6, + 7, + 5, + 5, + 7, + 7, + 8, + 7, + 5, + 8, + 6, + 7, + 7, + 10, + 7, + 7, + 5, + 7, + 5, + 8, + 5, + 5, + 7, + 5, + 5, + 6, + 6, + 6, + 5, + 8, + 8, + 6, + 8, + 5, + 7, + 7, + 7, + 7, + 7, + 8, + 7, + 6, + 7, + 6, + 7, + 7, + 8, + 7, + 6, + 5, + 7, + 7, + 6, + 5, + 10, + 7, + 15, + 8, + 7, + 6, + 7, + 4, + 8, + 8, + 7, + 7, + 5, + 5, + 6, + 7, + 7, + 6, + 4, + 12, + 6, + 7, + 10, + 5, + 7, + 6, + 5, + 8, + 9, + 7, + 7, + 7, + 8, + 5, + 8, + 4, + 7, + 8, + 7, + 5, + 5, + 8, + 7, + 7, + 6, + 4, + 5, + 6, + 6, + 5, + 5, + 5, + 4, + 7, + 8, + 7, + 4, + 8, + 7, + 7, + 7, + 5, + 7, + 7, + 6, + 7, + 7, + 7, + 7, + 7, + 8, + 3, + 7, + 8, + 7, + 7, + 7, + 6, + 8, + 7, + 7, + 4, + 16, + 8, + 9, + 4, + 6, + 7, + 6, + 7, + 7, + 6, + 5, + 6, + 10, + 7, + 7, + 6, + 5, + 8, + 8, + 4, + 7, + 7, + 7, + 7, + 7, + 6, + 8, + 8, + 7, + 4, + 7, + 5, + 6, + 8, + 7, + 6, + 7, + 8, + 7, + 7, + 6, + 7, + 6, + 8, + 7, + 8, + 5, + 7, + 7, + 5, + 5, + 8, + 4, + 6, + 5, + 7, + 4, + 7, + 6, + 7, + 7, + 6, + 7, + 3, + 8, + 7, + 7, + 6, + 4, + 7, + 8, + 8, + 6, + 4, + 7, + 5, + 7, + 4, + 7, + 3, + 6, + 4, + 6, + 8, + 7, + 7, + 6, + 7, + 5, + 8, + 5, + 6, + 7, + 7, + 7, + 4, + 5, + 7, + 5, + 4, + 5, + 4, + 5, + 7, + 4, + 3, + 9, + 7, + 7, + 3, + 5, + 5, + 3, + 5, + 4, + 7, + 4, + 8, + 3, + 6, + 7, + 7, + 6, + 7, + 7, + 6, + 5, + 5, + 7, + 5, + 7, + 8, + 7, + 5, + 7, + 6, + 4, + 7, + 7, + 8, + 5, + 7, + 6, + 6, + 8, + 6, + 7, + 5, + 6, + 8, + 8, + 5, + 3, + 5, + 7, + 7, + 7, + 8, + 7, + 4, + 7, + 8, + 6, + 5, + 6, + 5, + 6, + 4, + 3, + 7, + 7, + 4, + 5, + 7, + 4, + 6, + 6, + 8, + 4, + 6, + 5, + 8, + 8, + 7, + 7, + 6, + 7, + 7, + 5, + 7, + 5, + 7, + 6, + 3, + 6, + 7, + 7, + 7, + 7, + 4, + 5, + 10, + 7, + 7, + 7, + 5, + 5, + 2, + 7, + 3, + 8, + 7, + 7, + 4, + 7, + 5, + 7, + 6, + 7, + 7, + 7, + 7, + 6, + 4, + 7, + 3, + 5, + 8, + 7, + 7, + 6, + 4, + 7, + 5, + 7, + 6, + 7, + 5, + 6, + 5, + 5, + 5, + 6, + 7, + 6, + 8, + 9, + 5, + 8, + 7, + 5, + 6, + 6, + 6, + 2, + 2, + 2, + 5, + 6, + 3, + 2, + 7, + 7, + 2, + 2, + 7, + 8, + 8, + 6, + 5, + 6, + 6, + 7, + 7, + 6, + 7, + 7, + 7, + 6, + 3, + 4, + 7, + 5, + 5, + 2, + 7, + 6, + 4, + 3, + 6, + 4, + 4, + 5, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 5, + 7, + 5, + 2, + 7, + 6, + 8, + 3, + 8, + 4, + 7, + 4, + 6, + 7, + 4, + 8, + 6, + 7, + 8, + 5, + 4, + 7, + 5, + 6, + 7, + 2, + 5, + 6, + 5, + 6, + 7, + 7, + 4, + 5, + 7, + 6, + 7, + 4, + 5, + 8, + 6, + 8, + 6, + 7, + 7, + 5, + 7, + 8, + 5, + 5, + 8, + 7, + 5, + 5, + 7, + 7, + 6, + 5, + 6, + 2, + 4, + 6, + 6, + 7, + 7, + 6, + 7, + 7, + 4, + 7, + 7, + 4, + 5, + 8, + 4, + 7, + 7, + 6, + 5, + 3, + 7, + 7, + 5, + 7, + 6, + 7, + 4, + 6, + 7, + 8, + 7, + 7, + 6, + 8, + 6, + 7, + 7, + 7, + 4, + 6, + 6, + 5, + 4, + 6, + 8, + 5, + 4, + 7, + 4, + 5, + 4, + 6, + 5, + 2, + 7, + 5, + 3, + 7, + 8, + 7, + 7, + 4, + 4, + 4, + 7, + 6, + 8, + 7, + 7, + 7, + 7, + 6, + 9, + 3, + 7, + 8, + 5, + 7, + 2, + 5, + 7, + 9, + 4, + 7, + 7, + 7, + 5, + 5, + 6, + 8, + 6, + 7, + 5, + 6, + 6, + 7, + 5, + 4, + 4, + 7, + 7, + 6, + 5, + 6, + 3, + 7, + 6, + 7, + 5, + 4, + 4, + 8, + 7, + 7, + 8, + 4, + 6, + 7, + 6, + 7, + 7, + 4, + 7, + 5, + 7, + 4, + 6, + 8, + 5, + 7, + 4, + 6, + 4, + 5, + 7, + 7, + 7, + 5, + 6, + 2, + 6, + 6, + 7, + 6, + 6, + 8, + 6, + 7, + 4, + 7, + 6, + 7, + 4, + 6, + 5, + 7, + 7, + 4, + 6, + 7, + 5, + 5, + 5, + 7, + 4, + 5, + 6, + 6, + 7, + 4, + 6, + 5, + 7, + 6, + 4, + 7, + 5, + 4, + 5, + 7, + 4, + 4, + 6, + 4, + 6, + 7, + 4, + 7, + 5, + 7, + 4, + 5, + 5, + 8, + 7, + 6, + 7, + 6, + 7, + 7, + 7, + 7, + 7, + 5, + 7, + 7, + 6, + 6, + 4, + 7, + 5, + 7, + 7, + 6, + 6, + 5, + 4, + 6, + 7, + 6, + 7, + 6, + 7, + 6, + 4, + 6, + 5, + 7, + 5, + 5, + 8, + 4, + 7, + 6, + 5, + 7, + 7, + 5, + 7, + 6, + 6, + 6, + 6, + 6, + 7, + 2, + 7, + 5, + 7, + 8, + 7, + 5, + 7, + 6, + 6, + 6, + 5, + 7, + 8, + 6, + 5, + 7, + 7, + 6, + 7, + 4, + 4, + 5, + 5, + 6, + 7, + 5, + 4, + 7, + 6, + 6, + 7, + 5, + 7, + 7, + 7, + 5, + 7, + 6, + 4, + 6, + 5, + 8, + 6, + 6, + 7, + 7, + 7, + 5, + 7, + 7, + 4, + 7, + 7, + 6, + 7, + 4, + 4, + 7, + 7, + 5, + 8, + 8, + 6, + 7, + 6, + 4, + 7, + 6, + 5, + 4, + 5, + 6, + 5, + 6, + 6, + 6, + 6, + 8, + 6, + 4, + 4, + 4, + 8, + 6, + 7, + 7, + 7, + 5, + 5, + 7, + 7, + 7, + 6, + 7, + 7, + 7, + 7, + 4, + 9, + 7, + 7, + 6, + 5, + 6, + 6, + 8, + 4, + 7, + 8, + 6, + 4, + 7, + 7, + 7, + 7, + 8, + 6, + 4, + 4, + 7, + 7, + 7, + 5, + 6, + 7, + 7, + 5, + 7, + 7, + 8, + 6, + 7, + 7, + 8, + 4, + 7, + 5, + 5, + 7, + 6, + 7, + 6, + 5, + 7, + 7, + 7, + 6, + 7, + 5, + 7, + 5, + 6, + 7, + 7, + 6, + 6, + 7, + 4, + 4, + 7, + 7, + 7, + 6, + 9, + 7, + 6, + 5, + 7, + 7, + 7, + 5, + 4, + 7, + 5, + 7, + 4, + 7, + 7, + 4, + 6, + 7, + 6, + 4, + 6, + 6, + 5, + 7, + 7, + 7, + 7, + 7, + 5, + 7, + 8, + 6, + 7, + 7, + 4, + 6, + 4, + 4, + 6, + 8, + 8, + 6, + 5, + 8, + 6, + 4, + 7, + 6, + 6, + 7, + 4, + 7, + 7, + 7, + 7, + 6, + 6, + 7, + 5, + 7, + 7, + 7, + 5, + 7, + 5, + 5, + 7, + 7, + 7, + 7, + 3, + 6, + 5, + 6, + 7, + 6, + 6, + 5, + 5, + 5, + 8, + 7, + 7, + 6, + 6, + 7, + 7, + 7, + 7, + 7, + 6, + 6, + 4, + 5, + 7, + 7, + 6, + 6, + 5, + 6, + 6, + 7, + 2, + 6, + 6, + 6, + 7, + 5, + 5, + 4, + 5, + 7, + 6, + 5, + 8, + 8, + 7, + 5, + 6, + 6, + 8, + 5, + 7, + 8, + 4, + 7, + 7, + 8, + 6, + 6, + 6, + 7, + 7, + 6, + 6, + 7, + 7, + 7, + 5, + 7, + 6, + 6, + 7, + 5, + 5, + 8, + 5, + 7, + 6, + 5, + 7, + 6, + 7, + 7, + 4, + 5, + 5, + 7, + 7, + 7, + 10, + 5, + 3, + 7, + 7, + 6, + 3, + 8, + 4, + 8, + 7, + 6, + 6, + 7, + 4, + 6, + 5, + 7, + 6, + 6, + 6, + 5, + 7, + 6, + 5, + 6, + 3, + 5, + 4, + 7, + 7, + 6, + 6, + 7, + 3, + 7, + 7, + 6, + 7, + 6, + 7, + 7, + 6, + 7, + 8, + 6, + 6, + 7, + 7, + 4, + 5, + 6, + 7, + 7, + 6, + 7, + 7, + 6, + 8, + 4, + 7, + 6, + 6, + 7, + 5, + 5, + 7, + 7, + 6, + 8, + 5, + 5, + 7, + 7, + 6, + 7, + 5, + 7, + 5, + 6, + 6, + 5, + 6, + 7, + 7, + 7, + 5, + 6, + 4, + 5, + 5, + 7, + 8, + 7, + 7, + 4, + 4, + 7, + 7, + 7, + 8, + 6, + 7, + 6, + 8, + 7, + 7, + 6, + 6, + 6, + 5, + 7, + 7, + 5, + 5, + 7, + 6, + 5, + 8, + 7, + 7, + 3, + 6, + 7, + 5, + 6, + 5, + 7, + 7, + 5, + 8, + 6, + 6, + 5, + 6, + 5, + 6, + 7, + 7, + 6, + 6, + 7, + 4, + 6, + 6, + 5, + 8, + 7, + 8, + 6, + 4, + 7, + 5, + 7, + 5, + 8, + 5, + 4, + 7, + 4, + 7, + 7, + 7, + 6, + 7, + 8, + 5, + 4, + 6, + 7, + 6, + 6, + 6, + 7, + 7, + 5, + 7, + 8, + 5, + 7, + 7, + 7, + 6, + 6, + 4, + 7, + 7, + 4, + 7, + 8, + 7, + 6, + 6, + 6, + 6, + 5, + 6, + 7, + 7, + 6, + 5, + 7, + 7, + 5, + 6, + 5, + 7, + 7, + 7, + 7, + 8, + 7, + 6, + 6, + 7, + 5, + 7, + 4, + 7, + 6, + 7, + 6, + 4, + 5, + 7, + 5, + 6, + 4, + 6, + 7, + 5, + 5, + 5, + 7, + 6, + 6, + 5, + 7, + 7, + 5, + 6, + 5, + 8, + 5, + 5, + 3, + 4, + 5, + 2, + 4, + 4, + 5, + 8, + 4, + 5, + 6, + 5, + 5, + 7, + 5, + 4, + 6, + 5, + 7, + 6, + 7, + 7, + 5, + 5, + 6, + 6, + 5, + 7, + 7, + 7, + 5, + 5, + 6, + 6, + 7, + 5, + 6, + 6, + 7, + 3, + 4, + 6, + 5, + 7, + 5, + 5, + 4, + 5, + 7, + 6, + 8, + 7, + 8, + 6, + 7, + 6, + 6, + 5, + 7, + 6, + 5, + 6, + 6, + 5, + 3, + 4, + 7, + 5, + 6, + 5, + 5, + 6, + 7, + 4, + 6, + 7, + 8, + 5, + 6, + 7, + 7, + 5, + 6, + 8, + 5, + 3, + 6, + 6, + 6, + 8, + 4, + 5, + 7, + 7, + 5, + 7, + 7, + 5, + 7, + 7, + 7, + 6, + 4, + 3, + 5, + 7, + 5, + 5, + 5, + 5, + 4, + 5, + 6, + 4, + 5, + 6, + 7, + 4, + 6, + 6, + 6, + 6, + 5, + 5, + 6, + 4, + 6, + 5, + 7, + 7, + 8, + 3, + 6, + 5, + 5, + 5, + 5, + 5, + 8, + 4, + 5, + 5, + 7, + 3, + 5, + 3, + 7, + 6, + 7, + 5, + 8, + 7, + 7, + 7, + 5, + 5, + 5, + 7, + 4, + 3, + 5, + 5, + 4, + 6, + 6, + 6, + 7, + 6, + 8, + 8, + 5, + 7, + 4, + 6, + 6, + 4, + 5, + 5, + 7, + 5, + 6, + 6, + 7, + 7, + 5, + 5, + 5, + 6, + 7, + 7, + 6, + 8, + 7, + 6, + 6, + 6, + 4, + 6, + 7, + 7, + 7, + 7, + 7, + 6, + 6, + 8, + 7, + 6, + 8, + 5, + 5, + 7, + 8, + 5, + 5, + 6, + 7, + 7, + 6, + 7, + 5, + 5, + 5, + 8, + 6, + 7, + 8, + 7, + 5, + 7, + 6, + 5, + 6, + 7, + 6, + 3, + 8, + 6, + 5, + 7, + 4, + 4, + 8, + 4, + 6, + 7, + 7, + 5, + 7, + 4, + 6, + 4, + 6, + 6, + 6, + 4, + 6, + 3, + 7, + 6, + 6, + 7, + 5, + 6, + 5, + 7, + 6, + 6, + 5, + 5, + 3, + 7, + 6, + 7, + 4, + 7, + 6, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 8, + 7, + 4, + 7, + 8, + 5, + 7, + 7, + 7, + 7, + 7, + 8, + 7, + 5, + 7, + 6, + 5, + 7, + 5, + 7, + 7, + 6, + 6, + 7, + 5, + 5, + 6, + 6, + 5, + 5, + 7, + 5, + 7, + 6, + 4, + 7, + 4, + 6, + 7, + 5, + 4, + 6, + 5, + 7, + 7, + 7, + 5, + 6, + 6, + 7, + 7, + 4, + 7, + 5, + 5, + 4, + 6, + 7, + 8, + 5, + 6, + 4, + 6, + 4, + 5, + 7, + 5, + 6, + 6, + 5, + 6, + 7, + 6, + 7, + 7, + 6, + 7, + 6, + 5, + 7, + 8, + 4, + 6, + 5, + 7, + 8, + 4, + 5, + 5, + 4, + 7, + 6, + 4, + 4, + 6, + 6, + 7, + 5, + 7, + 7, + 5, + 4, + 7, + 3, + 7, + 5, + 7, + 4, + 7, + 5, + 6, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 8, + 6, + 5, + 5, + 6, + 5, + 7, + 7, + 6, + 7, + 4, + 6, + 6, + 6, + 6, + 7, + 5, + 5, + 6, + 4, + 4, + 7, + 5, + 6, + 7, + 7, + 4, + 5, + 5, + 5, + 7, + 7, + 5, + 5, + 5, + 7, + 5, + 6, + 7, + 6, + 7, + 8, + 5, + 4, + 7, + 6, + 6, + 7, + 7, + 7, + 6, + 5, + 8, + 5, + 6, + 7, + 7, + 5, + 5, + 7, + 7, + 4, + 8, + 5, + 5, + 5, + 7, + 7, + 5, + 7, + 5, + 6, + 6, + 7, + 5, + 4, + 4, + 5, + 5, + 6, + 5, + 4, + 5, + 5, + 4, + 5, + 7, + 7, + 6, + 5, + 7, + 6, + 5, + 5, + 6, + 7, + 7, + 7, + 7, + 5, + 5, + 4, + 7, + 6, + 3, + 5, + 7, + 7, + 7, + 6, + 6, + 4, + 6, + 5, + 5, + 6, + 5, + 5, + 4, + 7, + 5, + 8, + 7, + 7, + 5, + 7, + 7, + 7, + 7, + 6, + 7, + 8, + 5, + 5, + 7, + 7, + 8, + 7, + 5, + 5, + 7, + 6, + 7, + 5, + 7, + 6, + 6, + 7, + 7, + 6, + 7, + 6, + 6, + 7, + 5, + 6, + 6, + 7, + 7, + 7, + 5, + 7, + 7, + 6, + 8, + 7, + 7, + 7, + 6, + 4, + 7, + 6, + 6, + 7, + 5, + 5, + 4, + 6, + 6, + 4, + 6, + 6, + 5, + 8, + 5, + 7, + 5, + 7, + 5, + 5, + 6, + 7, + 7, + 7, + 7, + 5, + 6, + 8, + 6, + 5, + 7, + 7, + 7, + 6, + 4, + 7, + 10, + 6, + 5, + 6, + 5, + 6, + 5, + 7, + 5, + 7, + 4, + 5, + 6, + 6, + 5, + 6, + 6, + 7, + 5, + 6, + 7, + 7, + 6, + 5, + 7, + 6, + 7, + 4, + 7, + 5, + 4, + 5, + 6, + 5, + 8, + 5, + 6, + 6, + 6, + 7, + 6, + 7, + 6, + 4, + 7, + 7, + 5, + 5, + 7, + 7, + 5, + 8, + 6, + 7, + 5, + 7, + 6, + 6, + 7, + 8, + 6, + 6, + 7, + 7, + 4, + 7, + 8, + 5, + 7, + 7, + 4, + 7, + 6, + 5, + 8, + 7, + 7, + 6, + 5, + 7, + 4, + 6, + 4, + 7, + 6, + 6, + 6, + 6, + 7, + 7, + 4, + 6, + 7, + 4, + 4, + 7, + 7, + 7, + 7, + 7, + 6, + 3, + 5, + 5, + 4, + 4, + 6, + 6, + 5, + 6, + 4, + 6, + 6, + 5, + 5, + 7, + 6, + 5, + 5, + 5, + 8, + 6, + 5, + 7, + 4, + 7, + 6, + 7, + 6, + 7, + 7, + 6, + 6, + 5, + 7, + 7, + 4, + 6, + 5, + 7, + 7, + 6, + 6, + 7, + 5, + 5, + 5, + 6, + 5, + 6, + 5, + 6, + 7, + 5, + 5, + 5, + 6, + 7, + 6, + 6, + 7, + 5, + 7, + 7, + 6, + 7, + 7, + 7, + 8, + 7, + 8, + 7, + 5, + 4, + 5, + 5, + 7, + 4, + 5, + 7, + 7, + 6, + 6, + 5, + 7, + 6, + 5, + 4, + 6, + 4, + 8, + 5, + 6, + 5, + 6, + 4, + 5, + 5, + 5, + 5, + 5, + 7, + 6, + 6, + 5, + 5, + 5, + 6, + 6, + 6, + 5, + 4, + 5, + 7, + 6, + 5, + 6, + 5, + 6, + 8, + 7, + 2, + 7, + 7, + 7, + 5, + 5, + 7, + 5, + 5, + 5, + 3, + 6, + 7, + 6, + 5, + 4, + 7, + 6, + 5, + 3, + 6, + 6, + 8, + 5, + 6, + 7, + 5, + 7, + 7, + 5, + 6, + 7, + 5, + 5, + 4, + 5, + 7, + 6, + 5, + 7, + 5, + 7, + 6, + 5, + 9, + 6, + 6, + 4, + 5, + 6, + 5, + 6, + 5, + 5, + 5, + 7, + 3, + 2, + 5, + 7, + 5, + 6, + 7, + 6, + 3, + 5, + 5, + 7, + 5, + 7, + 6, + 5, + 7, + 3, + 5, + 5, + 6, + 2, + 5, + 6, + 5, + 5, + 6, + 5, + 5, + 3, + 7, + 5, + 5, + 5, + 5, + 6, + 2, + 7, + 4, + 7, + 4, + 5, + 5, + 6, + 5, + 4, + 6, + 8, + 4, + 5, + 6, + 6, + 6, + 6, + 5, + 5, + 5, + 5, + 5, + 3, + 6, + 6, + 7, + 6, + 4, + 5, + 6, + 4, + 7, + 5, + 6, + 5, + 8, + 6, + 6, + 7, + 7, + 5, + 3, + 6, + 3, + 5, + 7, + 6, + 6, + 6, + 6, + 5, + 3, + 7, + 5, + 6, + 4, + 5, + 5, + 7, + 5, + 5, + 8, + 5, + 3, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 6, + 4, + 5, + 3, + 5, + 5, + 6, + 5, + 4, + 5, + 7, + 4, + 5, + 5, + 5, + 4, + 8, + 6, + 5, + 7, + 6, + 5, + 4, + 7, + 5, + 6, + 5, + 5, + 5, + 5, + 4, + 6, + 5, + 6, + 7, + 5, + 5, + 4, + 5, + 4, + 6, + 7, + 7, + 5, + 5, + 7, + 6, + 5, + 7, + 6, + 4, + 8, + 7, + 6, + 6, + 5, + 8, + 6, + 5, + 6, + 6, + 5, + 5, + 4, + 5, + 5, + 6, + 5, + 5, + 8, + 5, + 6, + 5, + 4, + 5, + 3, + 6, + 5, + 2, + 7, + 4, + 5, + 4, + 4, + 5, + 5, + 6, + 5, + 6, + 5, + 7, + 3, + 7, + 5, + 6, + 6, + 5, + 5, + 5, + 7, + 6, + 7, + 5, + 6, + 5, + 5, + 5, + 5, + 6, + 7, + 5, + 5, + 4, + 7, + 5, + 7, + 5, + 5, + 5, + 6, + 6, + 2, + 5, + 5, + 5, + 3, + 5, + 5, + 7, + 4, + 7, + 5, + 7, + 4, + 6, + 3, + 6, + 6, + 5, + 5, + 5, + 6, + 5, + 7, + 5, + 7, + 6, + 5, + 5, + 5, + 5, + 6, + 4, + 4, + 5, + 7, + 5, + 6, + 4, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 3, + 6, + 6, + 6, + 5, + 2, + 3, + 6, + 7, + 4, + 7, + 5, + 5, + 3, + 7, + 3, + 5, + 4, + 6, + 6, + 5, + 7, + 5, + 3, + 6, + 5, + 7, + 5, + 5, + 7, + 5, + 8, + 7, + 6, + 5, + 5, + 6, + 4, + 6, + 8, + 5, + 5, + 3, + 6, + 7, + 5, + 8, + 6, + 6, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 6, + 9, + 7, + 6, + 5, + 5, + 6, + 2, + 5, + 4, + 6, + 5, + 6, + 5, + 7, + 6, + 7, + 5, + 5, + 7, + 7, + 5, + 6, + 5, + 6, + 7, + 5, + 5, + 6, + 6, + 5, + 6, + 5, + 5, + 5, + 6, + 7, + 6, + 5, + 7, + 5, + 7, + 4, + 7, + 6, + 5, + 3, + 5, + 7, + 5, + 7, + 7, + 6, + 6, + 5, + 7, + 6, + 7, + 6, + 5, + 5, + 5, + 7, + 5, + 7, + 7, + 5, + 2, + 6, + 4, + 5, + 7, + 4, + 7, + 5, + 7, + 5, + 6, + 6, + 7, + 6, + 5, + 7, + 5, + 5, + 5, + 5, + 6, + 5, + 4, + 6, + 6, + 6, + 5, + 7, + 7, + 5, + 5, + 7, + 7, + 5, + 6, + 6, + 5, + 7, + 4, + 7, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 7, + 6, + 7, + 5, + 5, + 5, + 7, + 5, + 6, + 6, + 5, + 7, + 5, + 7, + 6, + 5, + 7, + 6, + 5, + 7, + 6, + 4, + 7, + 5, + 5, + 7, + 4, + 6, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 6, + 7, + 7, + 5, + 6, + 5, + 5, + 5, + 6, + 5, + 5, + 6, + 6, + 7, + 5, + 6, + 7, + 6, + 5, + 6, + 5, + 5, + 7, + 5, + 5, + 7, + 7, + 7, + 6, + 4, + 7, + 5, + 6, + 6, + 5, + 5, + 6, + 7, + 4, + 7, + 7, + 4, + 5, + 7, + 4, + 5, + 8, + 6, + 4, + 5, + 5, + 5, + 4, + 5, + 7, + 5, + 7, + 5, + 5, + 5, + 6, + 4, + 4, + 6, + 5, + 7, + 5, + 5, + 7, + 5, + 7, + 7, + 7, + 4, + 7, + 5, + 7, + 5, + 4, + 7, + 7, + 4, + 4, + 5, + 4, + 7, + 5, + 4, + 7, + 5, + 5, + 4, + 7, + 7, + 5, + 6, + 6, + 6, + 7, + 5, + 5, + 6, + 4, + 6, + 5, + 6, + 7, + 7, + 5, + 5, + 8, + 6, + 5, + 6, + 8, + 4, + 7, + 4, + 6, + 5, + 6, + 7, + 6, + 5, + 5, + 5, + 5, + 5, + 7, + 8, + 7, + 5, + 5, + 5, + 5, + 6, + 5, + 4, + 7, + 4, + 8, + 6, + 5, + 8, + 8, + 4, + 5, + 7, + 6, + 4, + 7, + 5, + 5, + 6, + 6, + 7, + 7, + 5, + 4, + 8, + 7, + 5, + 5, + 5, + 4, + 5, + 5, + 5, + 7, + 5, + 7, + 6, + 8, + 7, + 6, + 4, + 5, + 4, + 5, + 5, + 8, + 4, + 7, + 7, + 5, + 5, + 5, + 7, + 7, + 7, + 6, + 6, + 6, + 6, + 6, + 5, + 6, + 6, + 5, + 5, + 7, + 4, + 6, + 6, + 5, + 5, + 5, + 5, + 4, + 5, + 5, + 6, + 5, + 7, + 4, + 5, + 6, + 6, + 7, + 7, + 5, + 6, + 7, + 7, + 5, + 5, + 7, + 5, + 6, + 6, + 6, + 5, + 7, + 5, + 5, + 4, + 7, + 7, + 7, + 6, + 5, + 6, + 7, + 6, + 4, + 4, + 6, + 7, + 5, + 6, + 5, + 4, + 7, + 4, + 6, + 7, + 7, + 6, + 5, + 7, + 5, + 5, + 4, + 7, + 5, + 7, + 5, + 6, + 5, + 5, + 6, + 5, + 6, + 6, + 5, + 5, + 7, + 6, + 4, + 5, + 5, + 6, + 6, + 5, + 7, + 6, + 6, + 6, + 4, + 6, + 6, + 6, + 6, + 6, + 5, + 7, + 5, + 5, + 5, + 5, + 6, + 7, + 7, + 6, + 6, + 5, + 7, + 6, + 6, + 6, + 5, + 4, + 5, + 5, + 7, + 5, + 7, + 8, + 5, + 5, + 7, + 6, + 4, + 5, + 5, + 5, + 4, + 5, + 7, + 7, + 6, + 8, + 6, + 7, + 5, + 5, + 7, + 7, + 7, + 5, + 5, + 6, + 6, + 7, + 4, + 8, + 5, + 6, + 5, + 4, + 7, + 6, + 5, + 4, + 5, + 6, + 6, + 6, + 4, + 5, + 7, + 6, + 7, + 6, + 5, + 4, + 4, + 5, + 6, + 5, + 5, + 5, + 6, + 6, + 6, + 4, + 4, + 7, + 4, + 6, + 5, + 4, + 6, + 4, + 7, + 6, + 5, + 4, + 7, + 8, + 6, + 7, + 5, + 4, + 6, + 8, + 4, + 6, + 5, + 5, + 5, + 6, + 5, + 8, + 4, + 4, + 7, + 6, + 7, + 5, + 5, + 7, + 6, + 5, + 7, + 6, + 6, + 6, + 6, + 7, + 5, + 5, + 7, + 7, + 5, + 5, + 5, + 6, + 7, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 6, + 4, + 6, + 6, + 6, + 5, + 5, + 7, + 4, + 4, + 5, + 6, + 6, + 6, + 5, + 6, + 8, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 7, + 5, + 5, + 7, + 5, + 6, + 7, + 5, + 8, + 6, + 8, + 7, + 6, + 5, + 6, + 7, + 5, + 4, + 6, + 7, + 5, + 7, + 6, + 7, + 6, + 5, + 7, + 5, + 5, + 5, + 5, + 7, + 6, + 7, + 7, + 7, + 6, + 5, + 4, + 7, + 5, + 4, + 6, + 7, + 6, + 6, + 6, + 6, + 5, + 5, + 6, + 5, + 7, + 7, + 7, + 7, + 6, + 7, + 4, + 5, + 6, + 7, + 7, + 6, + 6, + 5, + 5, + 6, + 8, + 5, + 6, + 4, + 6, + 5, + 6, + 6, + 4, + 5, + 5, + 6, + 6, + 5, + 5, + 5, + 6, + 6, + 8, + 6, + 7, + 7, + 4, + 5, + 5, + 6, + 5, + 5, + 4, + 5, + 6, + 5, + 7, + 6, + 7, + 5, + 6, + 4, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 7, + 8, + 6, + 5, + 6, + 7, + 5, + 6, + 4, + 6, + 5, + 6, + 7, + 4, + 5, + 6, + 7, + 5, + 7, + 5, + 5, + 5, + 5, + 6, + 8, + 4, + 5, + 6, + 5, + 5, + 5, + 6, + 5, + 5, + 6, + 6, + 6, + 4, + 4, + 6, + 6, + 5, + 6, + 4, + 6, + 6, + 5, + 6, + 5, + 8, + 6, + 5, + 7, + 5, + 4, + 5, + 7, + 5, + 6, + 6, + 5, + 6, + 4, + 6, + 6, + 5, + 5, + 5, + 6, + 5, + 5, + 8, + 5, + 6, + 5, + 5, + 5, + 5, + 6, + 5, + 7, + 5, + 5, + 8, + 6, + 5, + 5, + 6, + 5, + 5, + 7, + 7, + 5, + 5, + 8, + 6, + 7, + 6, + 5, + 5, + 6, + 4, + 4, + 5, + 5, + 4, + 4, + 6, + 5, + 5, + 5, + 6, + 6, + 5, + 5, + 8, + 5, + 7, + 5, + 5, + 7, + 6, + 6, + 5, + 4, + 6, + 5, + 6, + 8, + 6, + 5, + 5, + 7, + 4, + 6, + 7, + 5, + 6, + 5, + 7, + 5, + 5, + 7, + 6, + 7, + 5, + 6, + 6, + 5, + 5, + 6, + 6, + 6, + 6, + 5, + 6, + 4, + 5, + 5, + 6, + 5, + 7, + 6, + 5, + 7, + 4, + 5, + 4, + 6, + 5, + 5, + 5, + 5, + 6, + 4, + 5, + 5, + 5, + 5, + 6, + 4, + 5, + 5, + 7, + 4, + 5, + 5, + 5, + 5, + 6, + 7, + 4, + 5, + 4, + 4, + 6, + 4, + 6, + 4, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 7, + 4, + 5, + 4, + 4, + 5, + 5, + 6, + 7, + 6, + 6, + 5, + 5, + 5, + 7, + 6, + 7, + 5, + 6, + 5, + 5, + 7, + 6, + 5, + 5, + 6, + 4, + 5, + 6, + 5, + 7, + 6, + 6, + 7, + 6, + 6, + 6, + 6, + 7, + 7, + 4, + 5, + 5, + 5, + 4, + 6, + 6, + 5, + 5, + 7, + 6, + 5, + 4, + 5, + 8, + 5, + 6, + 6, + 7, + 4, + 6, + 6, + 5, + 5, + 6, + 5, + 6, + 6, + 4, + 6, + 5, + 5, + 4, + 6, + 5, + 5, + 5, + 6, + 6, + 6, + 5, + 4, + 6, + 6, + 5, + 5, + 5, + 6, + 5, + 5, + 6, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 7, + 5, + 6, + 5, + 5, + 6, + 5, + 6, + 5, + 4, + 5, + 6, + 5, + 6, + 6, + 5, + 7, + 7, + 6, + 6, + 4, + 6, + 5, + 5, + 4, + 5, + 5, + 5, + 6, + 6, + 5, + 6, + 6, + 5, + 5, + 5, + 7, + 4, + 6, + 5, + 6, + 7, + 5, + 5, + 5, + 6, + 5, + 4, + 5, + 5, + 7, + 5, + 4, + 8, + 7, + 5, + 7, + 6, + 5, + 6, + 5, + 6, + 5, + 5, + 6, + 5, + 5, + 7, + 7, + 6, + 6, + 5, + 6, + 5, + 6, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 6, + 6, + 5, + 7, + 6, + 6, + 5, + 4, + 5, + 5, + 4, + 5, + 5, + 7, + 5, + 5, + 4, + 6, + 6, + 5, + 6, + 6, + 6, + 6, + 4, + 5, + 5, + 6, + 5, + 7, + 6, + 6, + 5, + 6, + 4, + 5, + 5, + 6, + 5, + 6, + 6, + 6, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 4, + 5, + 5, + 7, + 5, + 5, + 6, + 5, + 5, + 7, + 5, + 6, + 5, + 5, + 6, + 5, + 5, + 6, + 7, + 5, + 7, + 5, + 5, + 6, + 5, + 6, + 7, + 6, + 5, + 7, + 7, + 7, + 6, + 5, + 5, + 6, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 7, + 4, + 5, + 6, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 6, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 4, + 5, + 5, + 7, + 6, + 5, + 6, + 7, + 5, + 6, + 5, + 7, + 4, + 5, + 5, + 7, + 5, + 5, + 6, + 6, + 5, + 6, + 5, + 6, + 5, + 6, + 6, + 6, + 5, + 5, + 5, + 5, + 5, + 7, + 6, + 4, + 6, + 4, + 5, + 7, + 5, + 5, + 6, + 5, + 4, + 5, + 5, + 7, + 6, + 5, + 6, + 5, + 5, + 5, + 5, + 6, + 6, + 6, + 6, + 6, + 7, + 5, + 5, + 5, + 5, + 4, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 7, + 5, + 5, + 5, + 5, + 5, + 7, + 5, + 6, + 5, + 6, + 5, + 5, + 5, + 6, + 5, + 6, + 5, + 6, + 5, + 7, + 6, + 5, + 4, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 4, + 5, + 5, + 5, + 4, + 5, + 6, + 5, + 5, + 5, + 5, + 6, + 6, + 6, + 6, + 5, + 6, + 5, + 6, + 5, + 6, + 5, + 7, + 7, + 5, + 5, + 7, + 6, + 6, + 5, + 5, + 5, + 6, + 7, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 4, + 6, + 6, + 7, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 4, + 4, + 6, + 7, + 5, + 5, + 7, + 5, + 4, + 5, + 5, + 6, + 5, + 5, + 5, + 7, + 5, + 5, + 6, + 5, + 5, + 5, + 7, + 5, + 5, + 6, + 4, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 4, + 5, + 5, + 5, + 5, + 6, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 6, + 5, + 5, + 6, + 6, + 7, + 6, + 5, + 5, + 5, + 5, + 5, + 4, + 5, + 6, + 4, + 6, + 5, + 4, + 5, + 4, + 5, + 5, + 6, + 7, + 6, + 6, + 5, + 5, + 7, + 5, + 4, + 4, + 6, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 4, + 5, + 5, + 5, + 6, + 6, + 5, + 4, + 6, + 5, + 5, + 6, + 5, + 4, + 6, + 4, + 7, + 5, + 5, + 5, + 6, + 5, + 6, + 6, + 4, + 5, + 6, + 6, + 5, + 5, + 5, + 6, + 5, + 5, + 6, + 4, + 6, + 5, + 5, + 6, + 6, + 5, + 5, + 6, + 6, + 7, + 5, + 6, + 7, + 4, + 5, + 6, + 7, + 5, + 4, + 5, + 5, + 6, + 7, + 5, + 5, + 5, + 5, + 6, + 6, + 4, + 7, + 5, + 4, + 6, + 5, + 6, + 6, + 5, + 6, + 5, + 4, + 6, + 4, + 6, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 8, + 4, + 5, + 5, + 5, + 5, + 5, + 5, + 7, + 5, + 6, + 5, + 4, + 6, + 5, + 5, + 5, + 7, + 6, + 6, + 6, + 7, + 5, + 5, + 5, + 4, + 4, + 6, + 7, + 4, + 4, + 5, + 6, + 5, + 7, + 6, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 7, + 5, + 5, + 6, + 6, + 5, + 6, + 6, + 5, + 5, + 5, + 6, + 5, + 5, + 6, + 7, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 7, + 5, + 5, + 5, + 5, + 5, + 7, + 7, + 5, + 5, + 4, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 4, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 7, + 5, + 5, + 5, + 5, + 4, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 8, + 5, + 5, + 5, + 6, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 6, + 6, + 5, + 6, + 5, + 6, + 5, + 7, + 5, + 5, + 6, + 6, + 6, + 5, + 7, + 5, + 4, + 6, + 5, + 6, + 6, + 5, + 5, + 5, + 5, + 7, + 6, + 5, + 5, + 4, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 4, + 5, + 5, + 5, + 5, + 5, + 7, + 5, + 5, + 5, + 7, + 5, + 6, + 5, + 7, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 4, + 5, + 7, + 5, + 6, + 6, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 6, + 6, + 5, + 7, + 5, + 5, + 5, + 6, + 5, + 5, + 6, + 5, + 6, + 5, + 7, + 6, + 5, + 6, + 5, + 5, + 6, + 8, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 6, + 6, + 6, + 5, + 6, + 5, + 5, + 6, + 6, + 5, + 6, + 6, + 6, + 5, + 5, + 5, + 5, + 6, + 7, + 5, + 5, + 5, + 6, + 6, + 6, + 4, + 5, + 5, + 6, + 5, + 5, + 6, + 5, + 5, + 6, + 6, + 5, + 4, + 6, + 5, + 5, + 5, + 7, + 5, + 6, + 5, + 5, + 6, + 5, + 5, + 5, + 4, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 4, + 6, + 5, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 6, + 5, + 6, + 5, + 7, + 5, + 5, + 6, + 5, + 6, + 6, + 6, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 7, + 6, + 5, + 5, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 7, + 5, + 6, + 5, + 5, + 6, + 5, + 4, + 5, + 5, + 5, + 6, + 6, + 6, + 5, + 6, + 5, + 5, + 6, + 7, + 5, + 5, + 5, + 5, + 6, + 5, + 7, + 5, + 6, + 5, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 6, + 5, + 5, + 5, + 6, + 5, + 6, + 6, + 5, + 6, + 5, + 6, + 4, + 5, + 5, + 5, + 5, + 5, + 7, + 5, + 5, + 7, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 6, + 5, + 6, + 6, + 5, + 6, + 4, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 5, + 6, + 5, + 5, + 7, + 6, + 5, + 6, + 6, + 5, + 5, + 5, + 6, + 6, + 5, + 6, + 5, + 6, + 6, + 5, + 6, + 5, + 6, + 7, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 7, + 6, + 7, + 5, + 5, + 5, + 6, + 5, + 6, + 6, + 5, + 4, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 7, + 5, + 5, + 6, + 4, + 6, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 6, + 6, + 5, + 5, + 7, + 5, + 5, + 7, + 7, + 6, + 5, + 5, + 4, + 6, + 5, + 5, + 6, + 6, + 5, + 5, + 5, + 6, + 6, + 6, + 5, + 5, + 6, + 5, + 6, + 5, + 7, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 6, + 7, + 5, + 5, + 6, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 5, + 7, + 5, + 6, + 6, + 5, + 7, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 6, + 5, + 5, + 5, + 5, + 6, + 6, + 6, + 6, + 6, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 6, + 5, + 5, + 5, + 6, + 6, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 6, + 5, + 6, + 5, + 6, + 4, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 7, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 6, + 5, + 6, + 5, + 6, + 5, + 5, + 5, + 6, + 5, + 5, + 6, + 6, + 6, + 5, + 5, + 4, + 5, + 7, + 5, + 5, + 5, + 4, + 5, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 7, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 6, + 5, + 5, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 6, + 6, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 6, + 5, + 6, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 6, + 5, + 5, + 5, + 5, + 5, + 6, + 6, + 6, + 5, + 6, + 5, + 5, + 7, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 6, + 5, + 5, + 7, + 5, + 5, + 5, + 5, + 4, + 6, + 5, + 5, + 6, + 5, + 7, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 5, + 6, + 6, + 5, + 5, + 5, + 5, + 6, + 5, + 6, + 6, + 6, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 6, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 6, + 5, + 6, + 5, + 7, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 7, + 5, + 5, + 4, + 5, + 5, + 6, + 5, + 5, + 5, + 6, + 5, + 5, + 6, + 6, + 6, + 5, + 5, + 5, + 4, + 6, + 6, + 6, + 6, + 6, + 5, + 5, + 5, + 5, + 3, + 5, + 6, + 5, + 5, + 5, + 5, + 6, + 6, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 6, + 5, + 6, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 6, + 6, + 5, + 5, + 5, + 6, + 5, + 6, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 6, + 6, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 6, + 6, + 6, + 6, + 5, + 6, + 5, + 5, + 5, + 6, + 6, + 5, + 6, + 6, + 5, + 5, + 5, + 5, + 5, + 6, + 6, + 5, + 6, + 5, + 5, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 6, + 5, + 6, + 5, + 6, + 5, + 6, + 6, + 5, + 5, + 5, + 6, + 5, + 5, + 6, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 7, + 6, + 6, + 6, + 5, + 6, + 5, + 5, + 5, + 5, + 6, + 5, + 7, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 6, + 6, + 6, + 5, + 5, + 6, + 5, + 6, + 6, + 5, + 5, + 5, + 5, + 5, + 6, + 6, + 5, + 6, + 5, + 5, + 5, + 5, + 6, + 6, + 5, + 5, + 6, + 5, + 5, + 6, + 6, + 6, + 5, + 5, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 7, + 6, + 5, + 5, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 6, + 5, + 5, + 5, + 6, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 6, + 5, + 6, + 5, + 5, + 5, + 5, + 6, + 7, + 6, + 7, + 6, + 6, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 6, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 5, + 6, + 6, + 5, + 6, + 5, + 5, + 6, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 6, + 7, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 6, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 8, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 6, + 6, + 5, + 5, + 5, + 5, + 6, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 7, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 6, + 5, + 6, + 5, + 5, + 5, + 6, + 6, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 7, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 6, + 5, + 6, + 6, + 6, + 5, + 6, + 5, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 6, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 8, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 7, + 6, + 6, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 6, + 6, + 5, + 5, + 7, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 6, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 6, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 6, + 6, + 7, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 6, + 6, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 6, + 6, + 6, + 5, + 5, + 5, + 5, + 6, + 5, + 6, + 6, + 5, + 6, + 5, + 5, + 5, + 5, + 7, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 6, + 5, + 6, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 6, + 5, + 7, + 5, + 6, + 5, + 6, + 6, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 6, + 6, + 5, + 5, + 5, + 5, + 6, + 7, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 6, + 6, + 5, + 6, + 5, + 5, + 6, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 6, + 5, + 6, + 5, + 5, + 6, + 5, + 5, + 6, + 6, + 5, + 5, + 5, + 6, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 6, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 6, + 6, + 5, + 5, + 6, + 5, + 5, + 6, + 6, + 6, + 6, + 5, + 6, + 6, + 6, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 7, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 6, + 5, + 5, + 6, + 5, + 5, + 6, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 6, + 6, + 5, + 6, + 6, + 5, + 5, + 6, + 6, + 6, + 6, + 5, + 5, + 5, + 5, + 6, + 6, + 5, + 6, + 5, + 5, + 6, + 5, + 5, + 6, + 5, + 6, + 6, + 6, + 5, + 6, + 6, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 6, + 5, + 6, + 5, + 5, + 6, + 5, + 5, + 5, + 6, + 6, + 5, + 6, + 5, + 6, + 5, + 6, + 6, + 6, + 5, + 6, + 6, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 6, + 5, + 5, + 6, + 5, + 5, + 5, + 6, + 5, + 6, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 6, + 5, + 6, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 6, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 6, + 6, + 5, + 6, + 6, + 5, + 5, + 6, + 6, + 5, + 6, + 6, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 6, + 6, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 6, + 6, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 6, + 5, + 6, + 6, + 6, + 6, + 6, + 5, + 5, + 5, + 6, + 6, + 6, + 6, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 5, + 6, + 6, + 6, + 5, + 5, + 6, + 5, + 5, + 5, + 6, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 6, + 6, + 5, + 5, + 5, + 6, + 5, + 7, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 6, + 5, + 5, + 6, + 5, + 6, + 5, + 6, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 6, + 5, + 6, + 5, + 6, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 6, + 5, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 5, + 5, + 6, + 6, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 6, + 5, + 5, + 5, + 6, + 6, + 6, + 5, + 6, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 6, + 6, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 6, + 5, + 6, + 6, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 6, + 5, + 6, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 6, + 5, + 5, + 6, + 6, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 6, + 6, + 5, + 6, + 6, + 6, + 5, + 5, + 5, + 5, + 5, + 6, + 6, + 5, + 6, + 6, + 6, + 5, + 5, + 5, + 6, + 6, + 6, + 6, + 5, + 5, + 6, + 6, + 6, + 5, + 5, + 5, + 6, + 6, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 6, + 6, + 5, + 5, + 5, + 5, + 5, + 6, + 6, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 6, + 6, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 6, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 6, + 6, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 6, + 6, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 6, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 6, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 6, + 6, + 6, + 5, + 5, + 6, + 6, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 6, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 6, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 6, + 5, + 6, + 6, + 6, + 5, + 5, + 5, + 5, + 5, + 6, + 6, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 6, + 5, + 6, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 6, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 6, + 6, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 6, + 5, + 5, + 6, + 6, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 6, + 6, + 5, + 5, + 6, + 5, + 5, + 6, + 5, + 6, + 6, + 5, + 6, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 6, + 7, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 6, + 6, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 5, + 6, + 5, + 6, + 6, + 6, + 5, + 5, + 5, + 6, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 6, + 6, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 6, + 6, + 5, + 6, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 6, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 6, + 6, + 5, + 6, + 6, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 6, + 6, + 6, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 6, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 6, + 6, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 6, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 6, + 5, + 5, + 6, + 6, + 5, + 6, + 5, + 5, + 5, + 6, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 6, + 5, + 5, + 5, + 6, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 6, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 6, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 7, + 5, + 6, + 5, + 5, + 5, + 6, + 6, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 6, + 5, + 6, + 5, + 6, + 6, + 5, + 5, + 6, + 5, + 5, + 5, + 6, + 5, + 6, + 5, + 6, + 6, + 5, + 6, + 6, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 6, + 5, + 5, + 6, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 6, + 6, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 6, + 5, + 5, + 6, + 5, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 6, + 5, + 6, + 6, + 5, + 5, + 6, + 6, + 5, + 5, + 6, + 5, + 5, + 6, + 5, + 5, + 5, + 6, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 6, + 5, + 6, + 6, + 6, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 6, + 6, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 6, + 5, + 5, + 6, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 6, + 6, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 6, + 5, + 5, + 6, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 6, + 6, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 6, + 5, + 5, + 5, + 6, + 5, + 6, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 6, + 5, + 6, + 6, + 5, + 6, + 6, + 6, + 6, + 6, + 5, + 6, + 5, + 6, + 6, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 6, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 6, + 5, + 5, + 6, + 6, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 6, + 6, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 6, + 6, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 6, + 5, + 6, + 5, + 5, + 5, + 5, + 6, + 6, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 5, + 6, + 5, + 6, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 6, + 6, + 6, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 6, + 6, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 6, + 5, + 5, + 6, + 5, + 5, + 5, + 6, + 5, + 6, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 6, + 5, + 6, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 6, + 6, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 6, + 5, + 6, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 6, + 5, + 5, + 6, + 5, + 6, + 6, + 6, + 5, + 5, + 5, + 6, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 6, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 5, + 5, + 6, + 6, + 5, + 5, + 5, + 6, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 6, + 5, + 6, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 6, + 5, + 5, + 6, + 5, + 6, + 5, + 6, + 6, + 6, + 5, + 5, + 5, + 5, + 6, + 6, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 6, + 6, + 5, + 6, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 6, + 5, + 5, + 6, + 5, + 6, + 6, + 5, + 6, + 6, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 6, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 6, + 6, + 5, + 5, + 5, + 6, + 6, + 6, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 6, + 5, + 5, + 6, + 6, + 6, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 6, + 5, + 6, + 5, + 6, + 5, + 5, + 5, + 6, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 6, + 5, + 6, + 5, + 6, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 6, + 6, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 6, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 6, + 6, + 6, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 6, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 6, + 5, + 5, + 6, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 6, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 6, + 6, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 6, + 6, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 6, + 5, + 6, + 6, + 6, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 6, + 5, + 5, + 5, + 6, + 6, + 5, + 6, + 5, + 6, + 5, + 6, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 6, + 5, + 5, + 6, + 5, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 5, + 6, + 6, + 5, + 6, + 6, + 5, + 6, + 6, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 6, + 6, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 6, + 5, + 6, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 6, + 6, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 6, + 6, + 5, + 6, + 5, + 6, + 6, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 6, + 6, + 6, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 6, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 6, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 5, + 5, + 6, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 6, + 6, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 6, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 6, + 5, + 5, + 6, + 6, + 5, + 5, + 6, + 5, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 6, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 6, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 6, + 5, + 5, + 6, + 6, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 6, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 6, + 6, + 6, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 6, + 5, + 5, + 5, + 5, + 6, + 6, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 6, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 5, + 6, + 6, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 6, + 5, + 6, + 6, + 5, + 6, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 6, + 6, + 6, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 6, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 6, + 6, + 5, + 6, + 6, + 5, + 5, + 6, + 6, + 6, + 5, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 6, + 6, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 6, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 6, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 6, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 6, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 6, + 6, + 6, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 6, + 5, + 6, + 6, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 6, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 6, + 5, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 6, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 6, + 6, + 5, + 6, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 6, + 6, + 5, + 6, + 6, + 6, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 6, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 6, + 5, + 6, + 6, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 6, + 6, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 6, + 6, + 5, + 6, + 6, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 6, + 6, + 5, + 5, + 6, + 5, + 5, + 6, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 6, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 6, + 5, + 6, + 5, + 6, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 6, + 6, + 5, + 5, + 5, + 6, + 5, + 6, + 5, + 6, + 6, + 6, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 6, + 6, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 5, + 5, + 6, + 6, + 6, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 6, + 5, + 5, + 6, + 5, + 5, + 5, + 6, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 6, + 6, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 6, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 6, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 6, + 5, + 6, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 6, + 6, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 6, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 6, + 6, + 5, + 5, + 5, + 6, + 6, + 6, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 6, + 6, + 6, + 6, + 5, + 6, + 5, + 6, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 6, + 6, + 5, + 5, + 6, + 5, + 5, + 6, + 5, + 5, + 5, + 6, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 6, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 6, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 6, + 5, + 6, + 5, + 6, + 5, + 6, + 5, + 5, + 5, + 6, + 5, + 5, + 6, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 6, + 6, + 6, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 6, + 5, + 6, + 6, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 6, + 6, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 6, + 6, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 5, + 6, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 6, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 6, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 6, + 6, + 6, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 6, + 6, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 6, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 6, + 5, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 6, + 5, + 5, + 6, + 6, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 6, + 6, + 5, + 6, + 6, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 6, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 5, + 6, + 6, + 6, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 6, + 6, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 6, + 6, + 5, + 6, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 6, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 6, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 6, + 6, + 6, + 6, + 6, + 5, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 6, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 6, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 6, + 6, + 5, + 5, + 6, + 6, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 6, + 5, + 5, + 6, + 6, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 6, + 6, + 5, + 5, + 5, + 6, + 5, + 6, + 6, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 6, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 6, + 5, + 6, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 6, + 5, + 5, + 5, + 6, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 6, + 6, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 6, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 6, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 6, + 5, + 5, + 6, + 5, + 5, + 6, + 5, + 5, + 5, + 6, + 6, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 6, + 6, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 5, + 6, + 6, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 6, + 5, + 5, + 6, + 6, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 6, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 6, + 5, + 6, + 6, + 5, + 6, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 6, + 5, + 6, + 5, + 6, + 5, + 5, + 5, + 6, + 6, + 6, + 5, + 5, + 5, + 5, + 5, + 6, + 6, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 6, + 6, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 6, + 5, + 6, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 6, + 5, + 6, + 5, + 6, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 6, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 6, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 6, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 6, + 6, + 5, + 5, + 5, + 5, + 5, + 6, + 6, + 6, + 6, + 5, + 5, + 5, + 5, + 6, + 6, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 6, + 5, + 6, + 6, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 6, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 6, + 6, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 6, + 6, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 6, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 6, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 6, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 6, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 6, + 5, + 6, + 5, + 6, + 5, + 6, + 5, + 5, + 5, + 6, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 6, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 6, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 6, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 6, + 6, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 6, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 6, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5 + ], + "lane_rows": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 57, + 58, + 59, + 60, + 61, + 62, + 63, + 64, + 65, + 66, + 67, + 68, + 69, + 70, + 71, + 72, + 73, + 74, + 75, + 76, + 77, + 78, + 79, + 80, + 81, + 82, + 83, + 84, + 85, + 86, + 87, + 88, + 89, + 90, + 91, + 92, + 93, + 94, + 95, + 96, + 97, + 98, + 99, + 100, + 101, + 102, + 103, + 104, + 105, + 106, + 107, + 108, + 109, + 110, + 111, + 112, + 113, + 114, + 115, + 116, + 117, + 118, + 119, + 120, + 121, + 122, + 123, + 124, + 125, + 126, + 127, + 128, + 129, + 130, + 131, + 132, + 133, + 134, + 135, + 136, + 137, + 138, + 139, + 140, + 141, + 142, + 143, + 144, + 145, + 146, + 147, + 148, + 149, + 150, + 151, + 152, + 153, + 154, + 155, + 156, + 157, + 158, + 159, + 160, + 161, + 162, + 163, + 164, + 165, + 166, + 167, + 168, + 169, + 170, + 171, + 172, + 173, + 174, + 175, + 176, + 177, + 178, + 179, + 180, + 181, + 182, + 183, + 184, + 185, + 186, + 187, + 188, + 189, + 190, + 191, + 192, + 193, + 194, + 195, + 196, + 197, + 198, + 199, + 200, + 201, + 202, + 203, + 204, + 205, + 206, + 207, + 208, + 209, + 210, + 211, + 212, + 213, + 214, + 215, + 216, + 217, + 218, + 219, + 220, + 221, + 222, + 223, + 224, + 225, + 226, + 227, + 228, + 229, + 230, + 231, + 232, + 233, + 234, + 235, + 236, + 237, + 238, + 239, + 240, + 241, + 242, + 243, + 244, + 245, + 246, + 247, + 248, + 249, + 250, + 251, + 252, + 253, + 254, + 255, + 256, + 257, + 258, + 259, + 260, + 261, + 262, + 263, + 264, + 265, + 266, + 267, + 268, + 269, + 270, + 271, + 272, + 273, + 274, + 275, + 276, + 277, + 278, + 279, + 280, + 281, + 282, + 283, + 284, + 285, + 286, + 287, + 288, + 289, + 290, + 291, + 292, + 293, + 294, + 295, + 296, + 297, + 298, + 299, + 300, + 301, + 302, + 303, + 304, + 305, + 306, + 307, + 308, + 309, + 310, + 311, + 312, + 313, + 314, + 315, + 316, + 317, + 318, + 319, + 320, + 321, + 322, + 323, + 324, + 325, + 326, + 327, + 328, + 329, + 330, + 331, + 332, + 333, + 334, + 335, + 336, + 337, + 338, + 339, + 340, + 341, + 342, + 343, + 344, + 345, + 346, + 347, + 348, + 349, + 350, + 351, + 352, + 353, + 354, + 355, + 356, + 357, + 358, + 359, + 360, + 361, + 362, + 363, + 364, + 365, + 366, + 367, + 368, + 369, + 370, + 371, + 372, + 373, + 374, + 375, + 376, + 377, + 378, + 379, + 380, + 381, + 382, + 383, + 384, + 385, + 386, + 387, + 388, + 389, + 390, + 391, + 392, + 393, + 394, + 395, + 396, + 397, + 398, + 399, + 400, + 401, + 402, + 403, + 404, + 405, + 406, + 407, + 408, + 409, + 410, + 411, + 412, + 413, + 414, + 415, + 416, + 417, + 418, + 419, + 420, + 421, + 422, + 423, + 424, + 425, + 426, + 427, + 428, + 429, + 430, + 431, + 432, + 433, + 434, + 435, + 436, + 437, + 438, + 439, + 440, + 441, + 442, + 443, + 444, + 445, + 446, + 447, + 448, + 449, + 450, + 451, + 452, + 453, + 454, + 455, + 456, + 457, + 458, + 459, + 460, + 461, + 462, + 463, + 464, + 465, + 466, + 467, + 468, + 469, + 470, + 471, + 472, + 473, + 474, + 475, + 476, + 477, + 478, + 479, + 480, + 481, + 482, + 483, + 484, + 485, + 486, + 487, + 488, + 489, + 490, + 491, + 492, + 493, + 494, + 495, + 496, + 497, + 498, + 499, + 500, + 501, + 502, + 503, + 504, + 505, + 506, + 507, + 508, + 509, + 510, + 511, + 512, + 513, + 514, + 515, + 516, + 517, + 518, + 519, + 520, + 521, + 522, + 523, + 524, + 525, + 526, + 527, + 528, + 529, + 530, + 531, + 532, + 533, + 534, + 535, + 536, + 537, + 538, + 539, + 540, + 541, + 542, + 543, + 544, + 545, + 546, + 547, + 548, + 549, + 550, + 551, + 552, + 553, + 554, + 555, + 556, + 557, + 558, + 559, + 560, + 561, + 562, + 563, + 564, + 565, + 566, + 567, + 568, + 569, + 570, + 571, + 572, + 573, + 574, + 575, + 576, + 577, + 578, + 579, + 580, + 581, + 582, + 583, + 584, + 585, + 586, + 587, + 588, + 589, + 590, + 591, + 592, + 593, + 594, + 595, + 596, + 597, + 598, + 599, + 600, + 601, + 602, + 603, + 604, + 605, + 606, + 607, + 608, + 609, + 610, + 611, + 612, + 613, + 614, + 615, + 616, + 617, + 618, + 619, + 620, + 621, + 622, + 623, + 624, + 625, + 626, + 627, + 628, + 629, + 630, + 631, + 632, + 633, + 634, + 635, + 636, + 637, + 638, + 639, + 640, + 641, + 642, + 643, + 644, + 645, + 646, + 647, + 648, + 649, + 650, + 651, + 652, + 653, + 654, + 655, + 656, + 657, + 658, + 659, + 660, + 661, + 662, + 663, + 664, + 665, + 666, + 667, + 668, + 669, + 670, + 671, + 672, + 673, + 674, + 675, + 676, + 677, + 678, + 679, + 680, + 681, + 682, + 683, + 684, + 685, + 686, + 687, + 688, + 689, + 690, + 691, + 692, + 693, + 694, + 695, + 696, + 697, + 698, + 699, + 700, + 701, + 702, + 703, + 704, + 705, + 706, + 707, + 708, + 709, + 710, + 711, + 712, + 713, + 714, + 715, + 716, + 717, + 718, + 719, + 720, + 721, + 722, + 723, + 724, + 725, + 726, + 727, + 728, + 729, + 730, + 731, + 732, + 733, + 734, + 735, + 736, + 737, + 738, + 739, + 740, + 741, + 742, + 743, + 744, + 745, + 746, + 747, + 748, + 749, + 750, + 751, + 752, + 753, + 754, + 755, + 756, + 757, + 758, + 759, + 760, + 761, + 762, + 763, + 764, + 765, + 766, + 767, + 768, + 769, + 770, + 771, + 772, + 773, + 774, + 775, + 776, + 777, + 778, + 779, + 780, + 781, + 782, + 783, + 784, + 785, + 786, + 787, + 788, + 789, + 790, + 791, + 792, + 793, + 794, + 795, + 796, + 797, + 798, + 799, + 800, + 801, + 802, + 803, + 804, + 805, + 806, + 807, + 808, + 809, + 810, + 811, + 812, + 813, + 814, + 815, + 816, + 817, + 818, + 819, + 820, + 821, + 822, + 823, + 824, + 825, + 826, + 827, + 828, + 829, + 830, + 831, + 832, + 833, + 834, + 835, + 836, + 837, + 838, + 839, + 840, + 841, + 842, + 843, + 844, + 845, + 846, + 847, + 848, + 849, + 850, + 851, + 852, + 853, + 854, + 855, + 856, + 857, + 858, + 859, + 860, + 861, + 862, + 863, + 864, + 865, + 866, + 867, + 868, + 869, + 870, + 871, + 872, + 873, + 874, + 875, + 876, + 877, + 878, + 879, + 880, + 881, + 882, + 883, + 884, + 885, + 886, + 887, + 888, + 889, + 890, + 891, + 892, + 893, + 894, + 895, + 896, + 897, + 898, + 899, + 900, + 901, + 902, + 903, + 904, + 905, + 906, + 907, + 908, + 909, + 910, + 911, + 912, + 913, + 914, + 915, + 916, + 917, + 918, + 919, + 920, + 921, + 922, + 923, + 924, + 925, + 926, + 927, + 928, + 929, + 930, + 931, + 932, + 933, + 934, + 935, + 936, + 937, + 938, + 939, + 940, + 941, + 942, + 943, + 944, + 945, + 946, + 947, + 948, + 949, + 950, + 951, + 952, + 953, + 954, + 955, + 956, + 957, + 958, + 959, + 960, + 961, + 962, + 963, + 964, + 965, + 966, + 967, + 968, + 969, + 970, + 971, + 972, + 973, + 974, + 975, + 976, + 977, + 978, + 979, + 980, + 981, + 982, + 983, + 984, + 985, + 986, + 987, + 988, + 989, + 990, + 991, + 992, + 993, + 994, + 995, + 996, + 997, + 998, + 999, + 1000, + 1001, + 1002, + 1003, + 1004, + 1005, + 1006, + 1007, + 1008, + 1009, + 1010, + 1011, + 1012, + 1013, + 1014, + 1015, + 1016, + 1017, + 1018, + 1019, + 1020, + 1021, + 1022, + 1023, + 1024, + 1025, + 1026, + 1027, + 1028, + 1029, + 1030, + 1031, + 1032, + 1033, + 1034, + 1035, + 1036, + 1037, + 1038, + 1039, + 1040, + 1041, + 1042, + 1043, + 1044, + 1045, + 1046, + 1047, + 1048, + 1049, + 1050, + 1051, + 1052, + 1053, + 1054, + 1055, + 1056, + 1057, + 1058, + 1059, + 1060, + 1061, + 1062, + 1063, + 1064, + 1065, + 1066, + 1067, + 1068, + 1069, + 1070, + 1071, + 1072, + 1073, + 1074, + 1075, + 1076, + 1077, + 1078, + 1079, + 1080, + 1081, + 1082, + 1083, + 1084, + 1085, + 1086, + 1087, + 1088, + 1089, + 1090, + 1091, + 1092, + 1093, + 1094, + 1095, + 1096, + 1097, + 1098, + 1099, + 1100, + 1101, + 1102, + 1103, + 1104, + 1105, + 1106, + 1107, + 1108, + 1109, + 1110, + 1111, + 1112, + 1113, + 1114, + 1115, + 1116, + 1117, + 1118, + 1119, + 1120, + 1121, + 1122, + 1123, + 1124, + 1125, + 1126, + 1127, + 1128, + 1129, + 1130, + 1131, + 1132, + 1133, + 1134, + 1135, + 1136, + 1137, + 1138, + 1139, + 1140, + 1141, + 1142, + 1143, + 1144, + 1145, + 1146, + 1147, + 1148, + 1149, + 1150, + 1151, + 1152, + 1153, + 1154, + 1155, + 1156, + 1157, + 1158, + 1159, + 1160, + 1161, + 1162, + 1163, + 1164, + 1165, + 1166, + 1167, + 1168, + 1169, + 1170, + 1171, + 1172, + 1173, + 1174, + 1175, + 1176, + 1177, + 1178, + 1179, + 1180, + 1181, + 1182, + 1183, + 1184, + 1185, + 1186, + 1187, + 1188, + 1189, + 1190, + 1191, + 1192, + 1193, + 1194, + 1195, + 1196, + 1197, + 1198, + 1199, + 1200, + 1201, + 1202, + 1203, + 1204, + 1205, + 1206, + 1207, + 1208, + 1209, + 1210, + 1211, + 1212, + 1213, + 1214, + 1215, + 1216, + 1217, + 1218, + 1219, + 1220, + 1221, + 1222, + 1223, + 1224, + 1225, + 1226, + 1227, + 1228, + 1229, + 1230, + 1231, + 1232, + 1233, + 1234, + 1235, + 1236, + 1237, + 1238, + 1239, + 1240, + 1241, + 1242, + 1243, + 1244, + 1245, + 1246, + 1247, + 1248, + 1249, + 1250, + 1251, + 1252, + 1253, + 1254, + 1255, + 1256, + 1257, + 1258, + 1259, + 1260, + 1261, + 1262, + 1263, + 1264, + 1265, + 1266, + 1267, + 1268, + 1269, + 1270, + 1271, + 1272, + 1273, + 1274, + 1275, + 1276, + 1277, + 1278, + 1279, + 1280, + 1281, + 1282, + 1283, + 1284, + 1285, + 1286, + 1287, + 1288, + 1289, + 1290, + 1291, + 1292, + 1293, + 1294, + 1295, + 1296, + 1297, + 1298, + 1299, + 1300, + 1301, + 1302, + 1303, + 1304, + 1305, + 1306, + 1307, + 1308, + 1309, + 1310, + 1311, + 1312, + 1313, + 1314, + 1315, + 1316, + 1317, + 1318, + 1319, + 1320, + 1321, + 1322, + 1323, + 1324, + 1325, + 1326, + 1327, + 1328, + 1329, + 1330, + 1331, + 1332, + 1333, + 1334, + 1335, + 1336, + 1337, + 1338, + 1339, + 1340, + 1341, + 1342, + 1343, + 1344, + 1345, + 1346, + 1347, + 1348, + 1349, + 1350, + 1351, + 1352, + 1353, + 1354, + 1355, + 1356, + 1357, + 1358, + 1359, + 1360, + 1361, + 1362, + 1363, + 1364, + 1365, + 1366, + 1367, + 1368, + 1369, + 1370, + 1371, + 1372, + 1373, + 1374, + 1375, + 1376, + 1377, + 1378, + 1379, + 1380, + 1381, + 1382, + 1383, + 1384, + 1385, + 1386, + 1387, + 1388, + 1389, + 1390, + 1391, + 1392, + 1393, + 1394, + 1395, + 1396, + 1397, + 1398, + 1399, + 1400, + 1401, + 1402, + 1403, + 1404, + 1405, + 1406, + 1407, + 1408, + 1409, + 1410, + 1411, + 1412, + 1413, + 1414, + 1415, + 1416, + 1417, + 1418, + 1419, + 1420, + 1421, + 1422, + 1423, + 1424, + 1425, + 1426, + 1427, + 1428, + 1429, + 1430, + 1431, + 1432, + 1433, + 1434, + 1435, + 1436, + 1437, + 1438, + 1439, + 1440, + 1441, + 1442, + 1443, + 1444, + 1445, + 1446, + 1447, + 1448, + 1449, + 1450, + 1451, + 1452, + 1453, + 1454, + 1455, + 1456, + 1457, + 1458, + 1459, + 1460, + 1461, + 1462, + 1463, + 1464, + 1465, + 1466, + 1467, + 1468, + 1469, + 1470, + 1471, + 1472, + 1473, + 1474, + 1475, + 1476, + 1477, + 1478, + 1479, + 1480, + 1481, + 1482, + 1483, + 1484, + 1485, + 1486, + 1487, + 1488, + 1489, + 1490, + 1491, + 1492, + 1493, + 1494, + 1495, + 1496, + 1497, + 1498, + 1499, + 1500, + 1501, + 1502, + 1503, + 1504, + 1505, + 1506, + 1507, + 1508, + 1509, + 1510, + 1511, + 1512, + 1513, + 1514, + 1515, + 1516, + 1517, + 1518, + 1519, + 1520, + 1521, + 1522, + 1523, + 1524, + 1525, + 1526, + 1527, + 1528, + 1529, + 1530, + 1531, + 1532, + 1533, + 1534, + 1535, + 1536, + 1537, + 1538, + 1539, + 1540, + 1541, + 1542, + 1543, + 1544, + 1545, + 1546, + 1547, + 1548, + 1549, + 1550, + 1551, + 1552, + 1553, + 1554, + 1555, + 1556, + 1557, + 1558, + 1559, + 1560, + 1561, + 1562, + 1563, + 1564, + 1565, + 1566, + 1567, + 1568, + 1569, + 1570, + 1571, + 1572, + 1573, + 1574, + 1575, + 1576, + 1577, + 1578, + 1579, + 1580, + 1581, + 1582, + 1583, + 1584, + 1585, + 1586, + 1587, + 1588, + 1589, + 1590, + 1591, + 1592, + 1593, + 1594, + 1595, + 1596, + 1597, + 1598, + 1599, + 1600, + 1601, + 1602, + 1603, + 1604, + 1605, + 1606, + 1607, + 1608, + 1609, + 1610, + 1611, + 1612, + 1613, + 1614, + 1615, + 1616, + 1617, + 1618, + 1619, + 1620, + 1621, + 1622, + 1623, + 1624, + 1625, + 1626, + 1627, + 1628, + 1629, + 1630, + 1631, + 1632, + 1633, + 1634, + 1635, + 1636, + 1637, + 1638, + 1639, + 1640, + 1641, + 1642, + 1643, + 1644, + 1645, + 1646, + 1647, + 1648, + 1649, + 1650, + 1651, + 1652, + 1653, + 1654, + 1655, + 1656, + 1657, + 1658, + 1659, + 1660, + 1661, + 1662, + 1663, + 1664, + 1665, + 1666, + 1667, + 1668, + 1669, + 1670, + 1671, + 1672, + 1673, + 1674, + 1675, + 1676, + 1677, + 1678, + 1679, + 1680, + 1681, + 1682, + 1683, + 1684, + 1685, + 1686, + 1687, + 1688, + 1689, + 1690, + 1691, + 1692, + 1693, + 1694, + 1695, + 1696, + 1697, + 1698, + 1699, + 1700, + 1701, + 1702, + 1703, + 1704, + 1705, + 1706, + 1707, + 1708, + 1709, + 1710, + 1711, + 1712, + 1713, + 1714, + 1715, + 1716, + 1717, + 1718, + 1719, + 1720, + 1721, + 1722, + 1723, + 1724, + 1725, + 1726, + 1727, + 1728, + 1729, + 1730, + 1731, + 1732, + 1733, + 1734, + 1735, + 1736, + 1737, + 1738, + 1739, + 1740, + 1741, + 1742, + 1743, + 1744, + 1745, + 1746, + 1747, + 1748, + 1749, + 1750, + 1751, + 1752, + 1753, + 1754, + 1755, + 1756, + 1757, + 1758, + 1759, + 1760, + 1761, + 1762, + 1763, + 1764, + 1765, + 1766, + 1767, + 1768, + 1769, + 1770, + 1771, + 1772, + 1773, + 1774, + 1775, + 1776, + 1777, + 1778, + 1779, + 1780, + 1781, + 1782, + 1783, + 1784, + 1785, + 1786, + 1787, + 1788, + 1789, + 1790, + 1791, + 1792, + 1793, + 1794, + 1795, + 1796, + 1797, + 1798, + 1799, + 1800, + 1801, + 1802, + 1803, + 1804, + 1805, + 1806, + 1807, + 1808, + 1809, + 1810, + 1811, + 1812, + 1813, + 1814, + 1815, + 1816, + 1817, + 1818, + 1819, + 1820, + 1821, + 1822, + 1823, + 1824, + 1825, + 1826, + 1827, + 1828, + 1829, + 1830, + 1831, + 1832, + 1833, + 1834, + 1835, + 1836, + 1837, + 1838, + 1839, + 1840, + 1841, + 1842, + 1843, + 1844, + 1845, + 1846, + 1847, + 1848, + 1849, + 1850, + 1851, + 1852, + 1853, + 1854, + 1855, + 1856, + 1857, + 1858, + 1859, + 1860, + 1861, + 1862, + 1863, + 1864, + 1865, + 1866, + 1867, + 1868, + 1869, + 1870, + 1871, + 1872, + 1873, + 1874, + 1875, + 1876, + 1877, + 1878, + 1879, + 1880, + 1881, + 1882, + 1883, + 1884, + 1885, + 1886, + 1887, + 1888, + 1889, + 1890, + 1891, + 1892, + 1893, + 1894, + 1895, + 1896, + 1897, + 1898, + 1899, + 1900, + 1901, + 1902, + 1903, + 1904, + 1905, + 1906, + 1907, + 1908, + 1909, + 1910, + 1911, + 1912, + 1913, + 1914, + 1915, + 1916, + 1917, + 1918, + 1919, + 1920, + 1921, + 1922, + 1923, + 1924, + 1925, + 1926, + 1927, + 1928, + 1929, + 1930, + 1931, + 1932, + 1933, + 1934, + 1935, + 1936, + 1937, + 1938, + 1939, + 1940, + 1941, + 1942, + 1943, + 1944, + 1945, + 1946, + 1947, + 1948, + 1949, + 1950, + 1951, + 1952, + 1953, + 1954, + 1955, + 1956, + 1957, + 1958, + 1959, + 1960, + 1961, + 1962, + 1963, + 1964, + 1965, + 1966, + 1967, + 1968, + 1969, + 1970, + 1971, + 1972, + 1973, + 1974, + 1975, + 1976, + 1977, + 1978, + 1979, + 1980, + 1981, + 1982, + 1983, + 1984, + 1985, + 1986, + 1987, + 1988, + 1989, + 1990, + 1991, + 1992, + 1993, + 1994, + 1995, + 1996, + 1997, + 1998, + 1999, + 2000, + 2001, + 2002, + 2003, + 2004, + 2005, + 2006, + 2007, + 2008, + 2009, + 2010, + 2011, + 2012, + 2013, + 2014, + 2015, + 2016, + 2017, + 2018, + 2019, + 2020, + 2021, + 2022, + 2023, + 2024, + 2025, + 2026, + 2027, + 2028, + 2029, + 2030, + 2031, + 2032, + 2033, + 2034, + 2035, + 2036, + 2037, + 2038, + 2039, + 2040, + 2041, + 2042, + 2043, + 2044, + 2045, + 2046, + 2047, + 2048, + 2049, + 2050, + 2051, + 2052, + 2053, + 2054, + 2055, + 2056, + 2057, + 2058, + 2059, + 2060, + 2061, + 2062, + 2063, + 2064, + 2065, + 2066, + 2067, + 2068, + 2069, + 2070, + 2071, + 2072, + 2073, + 2074, + 2075, + 2076, + 2077, + 2078, + 2079, + 2080, + 2081, + 2082, + 2083, + 2084, + 2085, + 2086, + 2087, + 2088, + 2089, + 2090, + 2091, + 2092, + 2093, + 2094, + 2095, + 2096, + 2097, + 2098, + 2099, + 2100, + 2101, + 2102, + 2103, + 2104, + 2105, + 2106, + 2107, + 2108, + 2109, + 2110, + 2111, + 2112, + 2113, + 2114, + 2115, + 2116, + 2117, + 2118, + 2119, + 2120, + 2121, + 2122, + 2123, + 2124, + 2125, + 2126, + 2127, + 2128, + 2129, + 2130, + 2131, + 2132, + 2133, + 2134, + 2135, + 2136, + 2137, + 2138, + 2139, + 2140, + 2141, + 2142, + 2143, + 2144, + 2145, + 2146, + 2147, + 2148, + 2149, + 2150, + 2151, + 2152, + 2153, + 2154, + 2155, + 2156, + 2157, + 2158, + 2159, + 2160, + 2161, + 2162, + 2163, + 2164, + 2165, + 2166, + 2167, + 2168, + 2169, + 2170, + 2171, + 2172, + 2173, + 2174, + 2175, + 2176, + 2177, + 2178, + 2179, + 2180, + 2181, + 2182, + 2183, + 2184, + 2185, + 2186, + 2187, + 2188, + 2189, + 2190, + 2191, + 2192, + 2193, + 2194, + 2195, + 2196, + 2197, + 2198, + 2199, + 2200, + 2201, + 2202, + 2203, + 2204, + 2205, + 2206, + 2207, + 2208, + 2209, + 2210, + 2211, + 2212, + 2213, + 2214, + 2215, + 2216, + 2217, + 2218, + 2219, + 2220, + 2221, + 2222, + 2223, + 2224, + 2225, + 2226, + 2227, + 2228, + 2229, + 2230, + 2231, + 2232, + 2233, + 2234, + 2235, + 2236, + 2237, + 2238, + 2239, + 2240, + 2241, + 2242, + 2243, + 2244, + 2245, + 2246, + 2247, + 2248, + 2249, + 2250, + 2251, + 2252, + 2253, + 2254, + 2255, + 2256, + 2257, + 2258, + 2259, + 2260, + 2261, + 2262, + 2263, + 2264, + 2265, + 2266, + 2267, + 2268, + 2269, + 2270, + 2271, + 2272, + 2273, + 2274, + 2275, + 2276, + 2277, + 2278, + 2279, + 2280, + 2281, + 2282, + 2283, + 2284, + 2285, + 2286, + 2287, + 2288, + 2289, + 2290, + 2291, + 2292, + 2293, + 2294, + 2295, + 2296, + 2297, + 2298, + 2299, + 2300, + 2301, + 2302, + 2303, + 2304, + 2305, + 2306, + 2307, + 2308, + 2309, + 2310, + 2311, + 2312, + 2313, + 2314, + 2315, + 2316, + 2317, + 2318, + 2319, + 2320, + 2321, + 2322, + 2323, + 2324, + 2325, + 2326, + 2327, + 2328, + 2329, + 2330, + 2331, + 2332, + 2333, + 2334, + 2335, + 2336, + 2337, + 2338, + 2339, + 2340, + 2341, + 2342, + 2343, + 2344, + 2345, + 2346, + 2347, + 2348, + 2349, + 2350, + 2351, + 2352, + 2353, + 2354, + 2355, + 2356, + 2357, + 2358, + 2359, + 2360, + 2361, + 2362, + 2363, + 2364, + 2365, + 2366, + 2367, + 2368, + 2369, + 2370, + 2371, + 2372, + 2373, + 2374, + 2375, + 2376, + 2377, + 2378, + 2379, + 2380, + 2381, + 2382, + 2383, + 2384, + 2385, + 2386, + 2387, + 2388, + 2389, + 2390, + 2391, + 2392, + 2393, + 2394, + 2395, + 2396, + 2397, + 2398, + 2399, + 2400, + 2401, + 2402, + 2403, + 2404, + 2405, + 2406, + 2407, + 2408, + 2409, + 2410, + 2411, + 2412, + 2413, + 2414, + 2415, + 2416, + 2417, + 2418, + 2419, + 2420, + 2421, + 2422, + 2423, + 2424, + 2425, + 2426, + 2427, + 2428, + 2429, + 2430, + 2431, + 2432, + 2433, + 2434, + 2435, + 2436, + 2437, + 2438, + 2439, + 2440, + 2441, + 2442, + 2443, + 2444, + 2445, + 2446, + 2447, + 2448, + 2449, + 2450, + 2451, + 2452, + 2453, + 2454, + 2455, + 2456, + 2457, + 2458, + 2459, + 2460, + 2461, + 2462, + 2463, + 2464, + 2465, + 2466, + 2467, + 2468, + 2469, + 2470, + 2471, + 2472, + 2473, + 2474, + 2475, + 2476, + 2477, + 2478, + 2479, + 2480, + 2481, + 2482, + 2483, + 2484, + 2485, + 2486, + 2487, + 2488, + 2489, + 2490, + 2491, + 2492, + 2493, + 2494, + 2495, + 2496, + 2497, + 2498, + 2499, + 2500, + 2501, + 2502, + 2503, + 2504, + 2505, + 2506, + 2507, + 2508, + 2509, + 2510, + 2511, + 2512, + 2513, + 2514, + 2515, + 2516, + 2517, + 2518, + 2519, + 2520, + 2521, + 2522, + 2523, + 2524, + 2525, + 2526, + 2527, + 2528, + 2529, + 2530, + 2531, + 2532, + 2533, + 2534, + 2535, + 2536, + 2537, + 2538, + 2539, + 2540, + 2541, + 2542, + 2543, + 2544, + 2545, + 2546, + 2547, + 2548, + 2549, + 2550, + 2551, + 2552, + 2553, + 2554, + 2555, + 2556, + 2557, + 2558, + 2559, + 2560, + 2561, + 2562, + 2563, + 2564, + 2565, + 2566, + 2567, + 2568, + 2569, + 2570, + 2571, + 2572, + 2573, + 2574, + 2575, + 2576, + 2577, + 2578, + 2579, + 2580, + 2581, + 2582, + 2583, + 2584, + 2585, + 2586, + 2587, + 2588, + 2589, + 2590, + 2591, + 2592, + 2593, + 2594, + 2595, + 2596, + 2597, + 2598, + 2599, + 2600, + 2601, + 2602, + 2603, + 2604, + 2605, + 2606, + 2607, + 2608, + 2609, + 2610, + 2611, + 2612, + 2613, + 2614, + 2615, + 2616, + 2617, + 2618, + 2619, + 2620, + 2621, + 2622, + 2623, + 2624, + 2625, + 2626, + 2627, + 2628, + 2629, + 2630, + 2631, + 2632, + 2633, + 2634, + 2635, + 2636, + 2637, + 2638, + 2639, + 2640, + 2641, + 2642, + 2643, + 2644, + 2645, + 2646, + 2647, + 2648, + 2649, + 2650, + 2651, + 2652, + 2653, + 2654, + 2655, + 2656, + 2657, + 2658, + 2659, + 2660, + 2661, + 2662, + 2663, + 2664, + 2665, + 2666, + 2667, + 2668, + 2669, + 2670, + 2671, + 2672, + 2673, + 2674, + 2675, + 2676, + 2677, + 2678, + 2679, + 2680, + 2681, + 2682, + 2683, + 2684, + 2685, + 2686, + 2687, + 2688, + 2689, + 2690, + 2691, + 2692, + 2693, + 2694, + 2695, + 2696, + 2697, + 2698, + 2699, + 2700, + 2701, + 2702, + 2703, + 2704, + 2705, + 2706, + 2707, + 2708, + 2709, + 2710, + 2711, + 2712, + 2713, + 2714, + 2715, + 2716, + 2717, + 2718, + 2719, + 2720, + 2721, + 2722, + 2723, + 2724, + 2725, + 2726, + 2727, + 2728, + 2729, + 2730, + 2731, + 2732, + 2733, + 2734, + 2735, + 2736, + 2737, + 2738, + 2739, + 2740, + 2741, + 2742, + 2743, + 2744, + 2745, + 2746, + 2747, + 2748, + 2749, + 2750, + 2751, + 2752, + 2753, + 2754, + 2755, + 2756, + 2757, + 2758, + 2759, + 2760, + 2761, + 2762, + 2763, + 2764, + 2765, + 2766, + 2767, + 2768, + 2769, + 2770, + 2771, + 2772, + 2773, + 2774, + 2775, + 2776, + 2777, + 2778, + 2779, + 2780, + 2781, + 2782, + 2783, + 2784, + 2785, + 2786, + 2787, + 2788, + 2789, + 2790, + 2791, + 2792, + 2793, + 2794, + 2795, + 2796, + 2797, + 2798, + 2799, + 2800, + 2801, + 2802, + 2803, + 2804, + 2805, + 2806, + 2807, + 2808, + 2809, + 2810, + 2811, + 2812, + 2813, + 2814, + 2815, + 2816, + 2817, + 2818, + 2819, + 2820, + 2821, + 2822, + 2823, + 2824, + 2825, + 2826, + 2827, + 2828, + 2829, + 2830, + 2831, + 2832, + 2833, + 2834, + 2835, + 2836, + 2837, + 2838, + 2839, + 2840, + 2841, + 2842, + 2843, + 2844, + 2845, + 2846, + 2847, + 2848, + 2849, + 2850, + 2851, + 2852, + 2853, + 2854, + 2855, + 2856, + 2857, + 2858, + 2859, + 2860, + 2861, + 2862, + 2863, + 2864, + 2865, + 2866, + 2867, + 2868, + 2869, + 2870, + 2871, + 2872, + 2873, + 2874, + 2875, + 2876, + 2877, + 2878, + 2879, + 2880, + 2881, + 2882, + 2883, + 2884, + 2885, + 2886, + 2887, + 2888, + 2889, + 2890, + 2891, + 2892, + 2893, + 2894, + 2895, + 2896, + 2897, + 2898, + 2899, + 2900, + 2901, + 2902, + 2903, + 2904, + 2905, + 2906, + 2907, + 2908, + 2909, + 2910, + 2911, + 2912, + 2913, + 2914, + 2915, + 2916, + 2917, + 2918, + 2919, + 2920, + 2921, + 2922, + 2923, + 2924, + 2925, + 2926, + 2927, + 2928, + 2929, + 2930, + 2931, + 2932, + 2933, + 2934, + 2935, + 2936, + 2937, + 2938, + 2939, + 2940, + 2941, + 2942, + 2943, + 2944, + 2945, + 2946, + 2947, + 2948, + 2949, + 2950, + 2951, + 2952, + 2953, + 2954, + 2955, + 2956, + 2957, + 2958, + 2959, + 2960, + 2961, + 2962, + 2963, + 2964, + 2965, + 2966, + 2967, + 2968, + 2969, + 2970, + 2971, + 2972, + 2973, + 2974, + 2975, + 2976, + 2977, + 2978, + 2979, + 2980, + 2981, + 2982, + 2983, + 2984, + 2985, + 2986, + 2987, + 2988, + 2989, + 2990, + 2991, + 2992, + 2993, + 2994, + 2995, + 2996, + 2997, + 2998, + 2999, + 3000, + 3001, + 3002, + 3003, + 3004, + 3005, + 3006, + 3007, + 3008, + 3009, + 3010, + 3011, + 3012, + 3013, + 3014, + 3015, + 3016, + 3017, + 3018, + 3019, + 3020, + 3021, + 3022, + 3023, + 3024, + 3025, + 3026, + 3027, + 3028, + 3029, + 3030, + 3031, + 3032, + 3033, + 3034, + 3035, + 3036, + 3037, + 3038, + 3039, + 3040, + 3041, + 3042, + 3043, + 3044, + 3045, + 3046, + 3047, + 3048, + 3049, + 3050, + 3051, + 3052, + 3053, + 3054, + 3055, + 3056, + 3057, + 3058, + 3059, + 3060, + 3061, + 3062, + 3063, + 3064, + 3065, + 3066, + 3067, + 3068, + 3069, + 3070, + 3071, + 3072, + 3073, + 3074, + 3075, + 3076, + 3077, + 3078, + 3079, + 3080, + 3081, + 3082, + 3083, + 3084, + 3085, + 3086, + 3087, + 3088, + 3089, + 3090, + 3091, + 3092, + 3093, + 3094, + 3095, + 3096, + 3097, + 3098, + 3099, + 3100, + 3101, + 3102, + 3103, + 3104, + 3105, + 3106, + 3107, + 3108, + 3109, + 3110, + 3111, + 3112, + 3113, + 3114, + 3115, + 3116, + 3117, + 3118, + 3119, + 3120, + 3121, + 3122, + 3123, + 3124, + 3125, + 3126, + 3127, + 3128, + 3129, + 3130, + 3131, + 3132, + 3133, + 3134, + 3135, + 3136, + 3137, + 3138, + 3139, + 3140, + 3141, + 3142, + 3143, + 3144, + 3145, + 3146, + 3147, + 3148, + 3149, + 3150, + 3151, + 3152, + 3153, + 3154, + 3155, + 3156, + 3157, + 3158, + 3159, + 3160, + 3161, + 3162, + 3163, + 3164, + 3165, + 3166, + 3167, + 3168, + 3169, + 3170, + 3171, + 3172, + 3173, + 3174, + 3175, + 3176, + 3177, + 3178, + 3179, + 3180, + 3181, + 3182, + 3183, + 3184, + 3185, + 3186, + 3187, + 3188, + 3189, + 3190, + 3191, + 3192, + 3193, + 3194, + 3195, + 3196, + 3197, + 3198, + 3199, + 3200, + 3201, + 3202, + 3203, + 3204, + 3205, + 3206, + 3207, + 3208, + 3209, + 3210, + 3211, + 3212, + 3213, + 3214, + 3215, + 3216, + 3217, + 3218, + 3219, + 3220, + 3221, + 3222, + 3223, + 3224, + 3225, + 3226, + 3227, + 3228, + 3229, + 3230, + 3231, + 3232, + 3233, + 3234, + 3235, + 3236, + 3237, + 3238, + 3239, + 3240, + 3241, + 3242, + 3243, + 3244, + 3245, + 3246, + 3247, + 3248, + 3249, + 3250, + 3251, + 3252, + 3253, + 3254, + 3255, + 3256, + 3257, + 3258, + 3259, + 3260, + 3261, + 3262, + 3263, + 3264, + 3265, + 3266, + 3267, + 3268, + 3269, + 3270, + 3271, + 3272, + 3273, + 3274, + 3275, + 3276, + 3277, + 3278, + 3279, + 3280, + 3281, + 3282, + 3283, + 3284, + 3285, + 3286, + 3287, + 3288, + 3289, + 3290, + 3291, + 3292, + 3293, + 3294, + 3295, + 3296, + 3297, + 3298, + 3299, + 3300, + 3301, + 3302, + 3303, + 3304, + 3305, + 3306, + 3307, + 3308, + 3309, + 3310, + 3311, + 3312, + 3313, + 3314, + 3315, + 3316, + 3317, + 3318, + 3319, + 3320, + 3321, + 3322, + 3323, + 3324, + 3325, + 3326, + 3327, + 3328, + 3329, + 3330, + 3331, + 3332, + 3333, + 3334, + 3335, + 3336, + 3337, + 3338, + 3339, + 3340, + 3341, + 3342, + 3343, + 3344, + 3345, + 3346, + 3347, + 3348, + 3349, + 3350, + 3351, + 3352, + 3353, + 3354, + 3355, + 3356, + 3357, + 3358, + 3359, + 3360, + 3361, + 3362, + 3363, + 3364, + 3365, + 3366, + 3367, + 3368, + 3369, + 3370, + 3371, + 3372, + 3373, + 3374, + 3375, + 3376, + 3377, + 3378, + 3379, + 3380, + 3381, + 3382, + 3383, + 3384, + 3385, + 3386, + 3387, + 3388, + 3389, + 3390, + 3391, + 3392, + 3393, + 3394, + 3395, + 3396, + 3397, + 3398, + 3399, + 3400, + 3401, + 3402, + 3403, + 3404, + 3405, + 3406, + 3407, + 3408, + 3409, + 3410, + 3411, + 3412, + 3413, + 3414, + 3415, + 3416, + 3417, + 3418, + 3419, + 3420, + 3421, + 3422, + 3423, + 3424, + 3425, + 3426, + 3427, + 3428, + 3429, + 3430, + 3431, + 3432, + 3433, + 3434, + 3435, + 3436, + 3437, + 3438, + 3439, + 3440, + 3441, + 3442, + 3443, + 3444, + 3445, + 3446, + 3447, + 3448, + 3449, + 3450, + 3451, + 3452, + 3453, + 3454, + 3455, + 3456, + 3457, + 3458, + 3459, + 3460, + 3461, + 3462, + 3463, + 3464, + 3465, + 3466, + 3467, + 3468, + 3469, + 3470, + 3471, + 3472, + 3473, + 3474, + 3475, + 3476, + 3477, + 3478, + 3479, + 3480, + 3481, + 3482, + 3483, + 3484, + 3485, + 3486, + 3487, + 3488, + 3489, + 3490, + 3491, + 3492, + 3493, + 3494, + 3495, + 3496, + 3497, + 3498, + 3499, + 3500, + 3501, + 3502, + 3503, + 3504, + 3505, + 3506, + 3507, + 3508, + 3509, + 3510, + 3511, + 3512, + 3513, + 3514, + 3515, + 3516, + 3517, + 3518, + 3519, + 3520, + 3521, + 3522, + 3523, + 3524, + 3525, + 3526, + 3527, + 3528, + 3529, + 3530, + 3531, + 3532, + 3533, + 3534, + 3535, + 3536, + 3537, + 3538, + 3539, + 3540, + 3541, + 3542, + 3543, + 3544, + 3545, + 3546, + 3547, + 3548, + 3549, + 3550, + 3551, + 3552, + 3553, + 3554, + 3555, + 3556, + 3557, + 3558, + 3559, + 3560, + 3561, + 3562, + 3563, + 3564, + 3565, + 3566, + 3567, + 3568, + 3569, + 3570, + 3571, + 3572, + 3573, + 3574, + 3575, + 3576, + 3577, + 3578, + 3579, + 3580, + 3581, + 3582, + 3583, + 3584, + 3585, + 3586, + 3587, + 3588, + 3589, + 3590, + 3591, + 3592, + 3593, + 3594, + 3595, + 3596, + 3597, + 3598, + 3599, + 3600, + 3601, + 3602, + 3603, + 3604, + 3605, + 3606, + 3607, + 3608, + 3609, + 3610, + 3611, + 3612, + 3613, + 3614, + 3615, + 3616, + 3617, + 3618, + 3619, + 3620, + 3621, + 3622, + 3623, + 3624, + 3625, + 3626, + 3627, + 3628, + 3629, + 3630, + 3631, + 3632, + 3633, + 3634, + 3635, + 3636, + 3637, + 3638, + 3639, + 3640, + 3641, + 3642, + 3643, + 3644, + 3645, + 3646, + 3647, + 3648, + 3649, + 3650, + 3651, + 3652, + 3653, + 3654, + 3655, + 3656, + 3657, + 3658, + 3659, + 3660, + 3661, + 3662, + 3663, + 3664, + 3665, + 3666, + 3667, + 3668, + 3669, + 3670, + 3671, + 3672, + 3673, + 3674, + 3675, + 3676, + 3677, + 3678, + 3679, + 3680, + 3681, + 3682, + 3683, + 3684, + 3685, + 3686, + 3687, + 3688, + 3689, + 3690, + 3691, + 3692, + 3693, + 3694, + 3695, + 3696, + 3697, + 3698, + 3699, + 3700, + 3701, + 3702, + 3703, + 3704, + 3705, + 3706, + 3707, + 3708, + 3709, + 3710, + 3711, + 3712, + 3713, + 3714, + 3715, + 3716, + 3717, + 3718, + 3719, + 3720, + 3721, + 3722, + 3723, + 3724, + 3725, + 3726, + 3727, + 3728, + 3729, + 3730, + 3731, + 3732, + 3733, + 3734, + 3735, + 3736, + 3737, + 3738, + 3739, + 3740, + 3741, + 3742, + 3743, + 3744, + 3745, + 3746, + 3747, + 3748, + 3749, + 3750, + 3751, + 3752, + 3753, + 3754, + 3755, + 3756, + 3757, + 3758, + 3759, + 3760, + 3761, + 3762, + 3763, + 3764, + 3765, + 3766, + 3767, + 3768, + 3769, + 3770, + 3771, + 3772, + 3773, + 3774, + 3775, + 3776, + 3777, + 3778, + 3779, + 3780, + 3781, + 3782, + 3783, + 3784, + 3785, + 3786, + 3787, + 3788, + 3789, + 3790, + 3791, + 3792, + 3793, + 3794, + 3795, + 3796, + 3797, + 3798, + 3799, + 3800, + 3801, + 3802, + 3803, + 3804, + 3805, + 3806, + 3807, + 3808, + 3809, + 3810, + 3811, + 3812, + 3813, + 3814, + 3815, + 3816, + 3817, + 3818, + 3819, + 3820, + 3821, + 3822, + 3823, + 3824, + 3825, + 3826, + 3827, + 3828, + 3829, + 3830, + 3831, + 3832, + 3833, + 3834, + 3835, + 3836, + 3837, + 3838, + 3839, + 3840, + 3841, + 3842, + 3843, + 3844, + 3845, + 3846, + 3847, + 3848, + 3849, + 3850, + 3851, + 3852, + 3853, + 3854, + 3855, + 3856, + 3857, + 3858, + 3859, + 3860, + 3861, + 3862, + 3863, + 3864, + 3865, + 3866, + 3867, + 3868, + 3869, + 3870, + 3871, + 3872, + 3873, + 3874, + 3875, + 3876, + 3877, + 3878, + 3879, + 3880, + 3881, + 3882, + 3883, + 3884, + 3885, + 3886, + 3887, + 3888, + 3889, + 3890, + 3891, + 3892, + 3893, + 3894, + 3895, + 3896, + 3897, + 3898, + 3899, + 3900, + 3901, + 3902, + 3903, + 3904, + 3905, + 3906, + 3907, + 3908, + 3909, + 3910, + 3911, + 3912, + 3913, + 3914, + 3915, + 3916, + 3917, + 3918, + 3919, + 3920, + 3921, + 3922, + 3923, + 3924, + 3925, + 3926, + 3927, + 3928, + 3929, + 3930, + 3931, + 3932, + 3933, + 3934, + 3935, + 3936, + 3937, + 3938, + 3939, + 3940, + 3941, + 3942, + 3943, + 3944, + 3945, + 3946, + 3947, + 3948, + 3949, + 3950, + 3951, + 3952, + 3953, + 3954, + 3955, + 3956, + 3957, + 3958, + 3959, + 3960, + 3961, + 3962, + 3963, + 3964, + 3965, + 3966, + 3967, + 3968, + 3969, + 3970, + 3971, + 3972, + 3973, + 3974, + 3975, + 3976, + 3977, + 3978, + 3979, + 3980, + 3981, + 3982, + 3983, + 3984, + 3985, + 3986, + 3987, + 3988, + 3989, + 3990, + 3991, + 3992, + 3993, + 3994, + 3995, + 3996, + 3997, + 3998, + 3999, + 4000, + 4001, + 4002, + 4003, + 4004, + 4005, + 4006, + 4007, + 4008, + 4009, + 4010, + 4011, + 4012, + 4013, + 4014, + 4015, + 4016, + 4017, + 4018, + 4019, + 4020, + 4021, + 4022, + 4023, + 4024, + 4025, + 4026, + 4027, + 4028, + 4029, + 4030, + 4031, + 4032, + 4033, + 4034, + 4035, + 4036, + 4037, + 4038, + 4039, + 4040, + 4041, + 4042, + 4043, + 4044, + 4045, + 4046, + 4047, + 4048, + 4049, + 4050, + 4051, + 4052, + 4053, + 4054, + 4055, + 4056, + 4057, + 4058, + 4059, + 4060, + 4061, + 4062, + 4063, + 4064, + 4065, + 4066, + 4067, + 4068, + 4069, + 4070, + 4071, + 4072, + 4073, + 4074, + 4075, + 4076, + 4077, + 4078, + 4079, + 4080, + 4081, + 4082, + 4083, + 4084, + 4085, + 4086, + 4087, + 4088, + 4089, + 4090, + 4091, + 4092, + 4093, + 4094, + 4095, + 4096, + 4097, + 4098, + 4099, + 4100, + 4101, + 4102, + 4103, + 4104, + 4105, + 4106, + 4107, + 4108, + 4109, + 4110, + 4111, + 4112, + 4113, + 4114, + 4115, + 4116, + 4117, + 4118, + 4119, + 4120, + 4121, + 4122, + 4123, + 4124, + 4125, + 4126, + 4127, + 4128, + 4129, + 4130, + 4131, + 4132, + 4133, + 4134, + 4135, + 4136, + 4137, + 4138, + 4139, + 4140, + 4141, + 4142, + 4143, + 4144, + 4145, + 4146, + 4147, + 4148, + 4149, + 4150, + 4151, + 4152, + 4153, + 4154, + 4155, + 4156, + 4157, + 4158, + 4159, + 4160, + 4161, + 4162, + 4163, + 4164, + 4165, + 4166, + 4167, + 4168, + 4169, + 4170, + 4171, + 4172, + 4173, + 4174, + 4175, + 4176, + 4177, + 4178, + 4179, + 4180, + 4181, + 4182, + 4183, + 4184, + 4185, + 4186, + 4187, + 4188, + 4189, + 4190, + 4191, + 4192, + 4193, + 4194, + 4195, + 4196, + 4197, + 4198, + 4199, + 4200, + 4201, + 4202, + 4203, + 4204, + 4205, + 4206, + 4207, + 4208, + 4209, + 4210, + 4211, + 4212, + 4213, + 4214, + 4215, + 4216, + 4217, + 4218, + 4219, + 4220, + 4221, + 4222, + 4223, + 4224, + 4225, + 4226, + 4227, + 4228, + 4229, + 4230, + 4231, + 4232, + 4233, + 4234, + 4235, + 4236, + 4237, + 4238, + 4239, + 4240, + 4241, + 4242, + 4243, + 4244, + 4245, + 4246, + 4247, + 4248, + 4249, + 4250, + 4251, + 4252, + 4253, + 4254, + 4255, + 4256, + 4257, + 4258, + 4259, + 4260, + 4261, + 4262, + 4263, + 4264, + 4265, + 4266, + 4267, + 4268, + 4269, + 4270, + 4271, + 4272, + 4273, + 4274, + 4275, + 4276, + 4277, + 4278, + 4279, + 4280, + 4281, + 4282, + 4283, + 4284, + 4285, + 4286, + 4287, + 4288, + 4289, + 4290, + 4291, + 4292, + 4293, + 4294, + 4295, + 4296, + 4297, + 4298, + 4299, + 4300, + 4301, + 4302, + 4303, + 4304, + 4305, + 4306, + 4307, + 4308, + 4309, + 4310, + 4311, + 4312, + 4313, + 4314, + 4315, + 4316, + 4317, + 4318, + 4319, + 4320, + 4321, + 4322, + 4323, + 4324, + 4325, + 4326, + 4327, + 4328, + 4329, + 4330, + 4331, + 4332, + 4333, + 4334, + 4335, + 4336, + 4337, + 4338, + 4339, + 4340, + 4341, + 4342, + 4343, + 4344, + 4345, + 4346, + 4347, + 4348, + 4349, + 4350, + 4351, + 4352, + 4353, + 4354, + 4355, + 4356, + 4357, + 4358, + 4359, + 4360, + 4361, + 4362, + 4363, + 4364, + 4365, + 4366, + 4367, + 4368, + 4369, + 4370, + 4371, + 4372, + 4373, + 4374, + 4375, + 4376, + 4377, + 4378, + 4379, + 4380, + 4381, + 4382, + 4383, + 4384, + 4385, + 4386, + 4387, + 4388, + 4389, + 4390, + 4391, + 4392, + 4393, + 4394, + 4395, + 4396, + 4397, + 4398, + 4399, + 4400, + 4401, + 4402, + 4403, + 4404, + 4405, + 4406, + 4407, + 4408, + 4409, + 4410, + 4411, + 4412, + 4413, + 4414, + 4415, + 4416, + 4417, + 4418, + 4419, + 4420, + 4421, + 4422, + 4423, + 4424, + 4425, + 4426, + 4427, + 4428, + 4429, + 4430, + 4431, + 4432, + 4433, + 4434, + 4435, + 4436, + 4437, + 4438, + 4439, + 4440, + 4441, + 4442, + 4443, + 4444, + 4445, + 4446, + 4447, + 4448, + 4449, + 4450, + 4451, + 4452, + 4453, + 4454, + 4455, + 4456, + 4457, + 4458, + 4459, + 4460, + 4461, + 4462, + 4463, + 4464, + 4465, + 4466, + 4467, + 4468, + 4469, + 4470, + 4471, + 4472, + 4473, + 4474, + 4475, + 4476, + 4477, + 4478, + 4479, + 4480, + 4481, + 4482, + 4483, + 4484, + 4485, + 4486, + 4487, + 4488, + 4489, + 4490, + 4491, + 4492, + 4493, + 4494, + 4495, + 4496, + 4497, + 4498, + 4499, + 4500, + 4501, + 4502, + 4503, + 4504, + 4505, + 4506, + 4507, + 4508, + 4509, + 4510, + 4511, + 4512, + 4513, + 4514, + 4515, + 4516, + 4517, + 4518, + 4519, + 4520, + 4521, + 4522, + 4523, + 4524, + 4525, + 4526, + 4527, + 4528, + 4529, + 4530, + 4531, + 4532, + 4533, + 4534, + 4535, + 4536, + 4537, + 4538, + 4539, + 4540, + 4541, + 4542, + 4543, + 4544, + 4545, + 4546, + 4547, + 4548, + 4549, + 4550, + 4551, + 4552, + 4553, + 4554, + 4555, + 4556, + 4557, + 4558, + 4559, + 4560, + 4561, + 4562, + 4563, + 4564, + 4565, + 4566, + 4567, + 4568, + 4569, + 4570, + 4571, + 4572, + 4573, + 4574, + 4575, + 4576, + 4577, + 4578, + 4579, + 4580, + 4581, + 4582, + 4583, + 4584, + 4585, + 4586, + 4587, + 4588, + 4589, + 4590, + 4591, + 4592, + 4593, + 4594, + 4595, + 4596, + 4597, + 4598, + 4599, + 4600, + 4601, + 4602, + 4603, + 4604, + 4605, + 4606, + 4607, + 4608, + 4609, + 4610, + 4611, + 4612, + 4613, + 4614, + 4615, + 4616, + 4617, + 4618, + 4619, + 4620, + 4621, + 4622, + 4623, + 4624, + 4625, + 4626, + 4627, + 4628, + 4629, + 4630, + 4631, + 4632, + 4633, + 4634, + 4635, + 4636, + 4637, + 4638, + 4639, + 4640, + 4641, + 4642, + 4643, + 4644, + 4645, + 4646, + 4647, + 4648, + 4649, + 4650, + 4651, + 4652, + 4653, + 4654, + 4655, + 4656, + 4657, + 4658, + 4659, + 4660, + 4661, + 4662, + 4663, + 4664, + 4665, + 4666, + 4667, + 4668, + 4669, + 4670, + 4671, + 4672, + 4673, + 4674, + 4675, + 4676, + 4677, + 4678, + 4679, + 4680, + 4681, + 4682, + 4683, + 4684, + 4685, + 4686, + 4687, + 4688, + 4689, + 4690, + 4691, + 4692, + 4693, + 4694, + 4695, + 4696, + 4697, + 4698, + 4699, + 4700, + 4701, + 4702, + 4703, + 4704, + 4705, + 4706, + 4707, + 4708, + 4709, + 4710, + 4711, + 4712, + 4713, + 4714, + 4715, + 4716, + 4717, + 4718, + 4719, + 4720, + 4721, + 4722, + 4723, + 4724, + 4725, + 4726, + 4727, + 4728, + 4729, + 4730, + 4731, + 4732, + 4733, + 4734, + 4735, + 4736, + 4737, + 4738, + 4739, + 4740, + 4741, + 4742, + 4743, + 4744, + 4745, + 4746, + 4747, + 4748, + 4749, + 4750, + 4751, + 4752, + 4753, + 4754, + 4755, + 4756, + 4757, + 4758, + 4759, + 4760, + 4761, + 4762, + 4763, + 4764, + 4765, + 4766, + 4767, + 4768, + 4769, + 4770, + 4771, + 4772, + 4773, + 4774, + 4775, + 4776, + 4777, + 4778, + 4779, + 4780, + 4781, + 4782, + 4783, + 4784, + 4785, + 4786, + 4787, + 4788, + 4789, + 4790, + 4791, + 4792, + 4793, + 4794, + 4795, + 4796, + 4797, + 4798, + 4799, + 4800, + 4801, + 4802, + 4803, + 4804, + 4805, + 4806, + 4807, + 4808, + 4809, + 4810, + 4811, + 4812, + 4813, + 4814, + 4815, + 4816, + 4817, + 4818, + 4819, + 4820, + 4821, + 4822, + 4823, + 4824, + 4825, + 4826, + 4827, + 4828, + 4829, + 4830, + 4831, + 4832, + 4833, + 4834, + 4835, + 4836, + 4837, + 4838, + 4839, + 4840, + 4841, + 4842, + 4843, + 4844, + 4845, + 4846, + 4847, + 4848, + 4849, + 4850, + 4851, + 4852, + 4853, + 4854, + 4855, + 4856, + 4857, + 4858, + 4859, + 4860, + 4861, + 4862, + 4863, + 4864, + 4865, + 4866, + 4867, + 4868, + 4869, + 4870, + 4871, + 4872, + 4873, + 4874, + 4875, + 4876, + 4877, + 4878, + 4879, + 4880, + 4881, + 4882, + 4883, + 4884, + 4885, + 4886, + 4887, + 4888, + 4889, + 4890, + 4891, + 4892, + 4893, + 4894, + 4895, + 4896, + 4897, + 4898, + 4899, + 4900, + 4901, + 4902, + 4903, + 4904, + 4905, + 4906, + 4907, + 4908, + 4909, + 4910, + 4911, + 4912, + 4913, + 4914, + 4915, + 4916, + 4917, + 4918, + 4919, + 4920, + 4921, + 4922, + 4923, + 4924, + 4925, + 4926, + 4927, + 4928, + 4929, + 4930, + 4931, + 4932, + 4933, + 4934, + 4935, + 4936, + 4937, + 4938, + 4939, + 4940, + 4941, + 4942, + 4943, + 4944, + 4945, + 4946, + 4947, + 4948, + 4949, + 4950, + 4951, + 4952, + 4953, + 4954, + 4955, + 4956, + 4957, + 4958, + 4959, + 4960, + 4961, + 4962, + 4963, + 4964, + 4965, + 4966, + 4967, + 4968, + 4969, + 4970, + 4971, + 4972, + 4973, + 4974, + 4975, + 4976, + 4977, + 4978, + 4979, + 4980, + 4981, + 4982, + 4983, + 4984, + 4985, + 4986, + 4987, + 4988, + 4989, + 4990, + 4991, + 4992, + 4993, + 4994, + 4995, + 4996, + 4997, + 4998, + 4999, + 5000, + 5001, + 5002, + 5003, + 5004, + 5005, + 5006, + 5007, + 5008, + 5009, + 5010, + 5011, + 5012, + 5013, + 5014, + 5015, + 5016, + 5017, + 5018, + 5019, + 5020, + 5021, + 5022, + 5023, + 5024, + 5025, + 5026, + 5027, + 5028, + 5029, + 5030, + 5031, + 5032, + 5033, + 5034, + 5035, + 5036, + 5037, + 5038, + 5039, + 5040, + 5041, + 5042, + 5043, + 5044, + 5045, + 5046, + 5047, + 5048, + 5049, + 5050, + 5051, + 5052, + 5053, + 5054, + 5055, + 5056, + 5057, + 5058, + 5059, + 5060, + 5061, + 5062, + 5063, + 5064, + 5065, + 5066, + 5067, + 5068, + 5069, + 5070, + 5071, + 5072, + 5073, + 5074, + 5075, + 5076, + 5077, + 5078, + 5079, + 5080, + 5081, + 5082, + 5083, + 5084, + 5085, + 5086, + 5087, + 5088, + 5089, + 5090, + 5091, + 5092, + 5093, + 5094, + 5095, + 5096, + 5097, + 5098, + 5099, + 5100, + 5101, + 5102, + 5103, + 5104, + 5105, + 5106, + 5107, + 5108, + 5109, + 5110, + 5111, + 5112, + 5113, + 5114, + 5115, + 5116, + 5117, + 5118, + 5119, + 5120, + 5121, + 5122, + 5123, + 5124, + 5125, + 5126, + 5127, + 5128, + 5129, + 5130, + 5131, + 5132, + 5133, + 5134, + 5135, + 5136, + 5137, + 5138, + 5139, + 5140, + 5141, + 5142, + 5143, + 5144, + 5145, + 5146, + 5147, + 5148, + 5149, + 5150, + 5151, + 5152, + 5153, + 5154, + 5155, + 5156, + 5157, + 5158, + 5159, + 5160, + 5161, + 5162, + 5163, + 5164, + 5165, + 5166, + 5167, + 5168, + 5169, + 5170, + 5171, + 5172, + 5173, + 5174, + 5175, + 5176, + 5177, + 5178, + 5179, + 5180, + 5181, + 5182, + 5183, + 5184, + 5185, + 5186, + 5187, + 5188, + 5189, + 5190, + 5191, + 5192, + 5193, + 5194, + 5195, + 5196, + 5197, + 5198, + 5199, + 5200, + 5201, + 5202, + 5203, + 5204, + 5205, + 5206, + 5207, + 5208, + 5209, + 5210, + 5211, + 5212, + 5213, + 5214, + 5215, + 5216, + 5217, + 5218, + 5219, + 5220, + 5221, + 5222, + 5223, + 5224, + 5225, + 5226, + 5227, + 5228, + 5229, + 5230, + 5231, + 5232, + 5233, + 5234, + 5235, + 5236, + 5237, + 5238, + 5239, + 5240, + 5241, + 5242, + 5243, + 5244, + 5245, + 5246, + 5247, + 5248, + 5249, + 5250, + 5251, + 5252, + 5253, + 5254, + 5255, + 5256, + 5257, + 5258, + 5259, + 5260, + 5261, + 5262, + 5263, + 5264, + 5265, + 5266, + 5267, + 5268, + 5269, + 5270, + 5271, + 5272, + 5273, + 5274, + 5275, + 5276, + 5277, + 5278, + 5279, + 5280, + 5281, + 5282, + 5283, + 5284, + 5285, + 5286, + 5287, + 5288, + 5289, + 5290, + 5291, + 5292, + 5293, + 5294, + 5295, + 5296, + 5297, + 5298, + 5299, + 5300, + 5301, + 5302, + 5303, + 5304, + 5305, + 5306, + 5307, + 5308, + 5309, + 5310, + 5311, + 5312, + 5313, + 5314, + 5315, + 5316, + 5317, + 5318, + 5319, + 5320, + 5321, + 5322, + 5323, + 5324, + 5325, + 5326, + 5327, + 5328, + 5329, + 5330, + 5331, + 5332, + 5333, + 5334, + 5335, + 5336, + 5337, + 5338, + 5339, + 5340, + 5341, + 5342, + 5343, + 5344, + 5345, + 5346, + 5347, + 5348, + 5349, + 5350, + 5351, + 5352, + 5353, + 5354, + 5355, + 5356, + 5357, + 5358, + 5359, + 5360, + 5361, + 5362, + 5363, + 5364, + 5365, + 5366, + 5367, + 5368, + 5369, + 5370, + 5371, + 5372, + 5373, + 5374, + 5375, + 5376, + 5377, + 5378, + 5379, + 5380, + 5381, + 5382, + 5383, + 5384, + 5385, + 5386, + 5387, + 5388, + 5389, + 5390, + 5391, + 5392, + 5393, + 5394, + 5395, + 5396, + 5397, + 5398, + 5399, + 5400, + 5401, + 5402, + 5403, + 5404, + 5405, + 5406, + 5407, + 5408, + 5409, + 5410, + 5411, + 5412, + 5413, + 5414, + 5415, + 5416, + 5417, + 5418, + 5419, + 5420, + 5421, + 5422, + 5423, + 5424, + 5425, + 5426, + 5427, + 5428, + 5429, + 5430, + 5431, + 5432, + 5433, + 5434, + 5435, + 5436, + 5437, + 5438, + 5439, + 5440, + 5441, + 5442, + 5443, + 5444, + 5445, + 5446, + 5447, + 5448, + 5449, + 5450, + 5451, + 5452, + 5453, + 5454, + 5455, + 5456, + 5457, + 5458, + 5459, + 5460, + 5461, + 5462, + 5463, + 5464, + 5465, + 5466, + 5467, + 5468, + 5469, + 5470, + 5471, + 5472, + 5473, + 5474, + 5475, + 5476, + 5477, + 5478, + 5479, + 5480, + 5481, + 5482, + 5483, + 5484, + 5485, + 5486, + 5487, + 5488, + 5489, + 5490, + 5491, + 5492, + 5493, + 5494, + 5495, + 5496, + 5497, + 5498, + 5499, + 5500, + 5501, + 5502, + 5503, + 5504, + 5505, + 5506, + 5507, + 5508, + 5509, + 5510, + 5511, + 5512, + 5513, + 5514, + 5515, + 5516, + 5517, + 5518, + 5519, + 5520, + 5521, + 5522, + 5523, + 5524, + 5525, + 5526, + 5527, + 5528, + 5529, + 5530, + 5531, + 5532, + 5533, + 5534, + 5535, + 5536, + 5537, + 5538, + 5539, + 5540, + 5541, + 5542, + 5543, + 5544, + 5545, + 5546, + 5547, + 5548, + 5549, + 5550, + 5551, + 5552, + 5553, + 5554, + 5555, + 5556, + 5557, + 5558, + 5559, + 5560, + 5561, + 5562, + 5563, + 5564, + 5565, + 5566, + 5567, + 5568, + 5569, + 5570, + 5571, + 5572, + 5573, + 5574, + 5575, + 5576, + 5577, + 5578, + 5579, + 5580, + 5581, + 5582, + 5583, + 5584, + 5585, + 5586, + 5587, + 5588, + 5589, + 5590, + 5591, + 5592, + 5593, + 5594, + 5595, + 5596, + 5597, + 5598, + 5599, + 5600, + 5601, + 5602, + 5603, + 5604, + 5605, + 5606, + 5607, + 5608, + 5609, + 5610, + 5611, + 5612, + 5613, + 5614, + 5615, + 5616, + 5617, + 5618, + 5619, + 5620, + 5621, + 5622, + 5623, + 5624, + 5625, + 5626, + 5627, + 5628, + 5629, + 5630, + 5631, + 5632, + 5633, + 5634, + 5635, + 5636, + 5637, + 5638, + 5639, + 5640, + 5641, + 5642, + 5643, + 5644, + 5645, + 5646, + 5647, + 5648, + 5649, + 5650, + 5651, + 5652, + 5653, + 5654, + 5655, + 5656, + 5657, + 5658, + 5659, + 5660, + 5661, + 5662, + 5663, + 5664, + 5665, + 5666, + 5667, + 5668, + 5669, + 5670, + 5671, + 5672, + 5673, + 5674, + 5675, + 5676, + 5677, + 5678, + 5679, + 5680, + 5681, + 5682, + 5683, + 5684, + 5685, + 5686, + 5687, + 5688, + 5689, + 5690, + 5691, + 5692, + 5693, + 5694, + 5695, + 5696, + 5697, + 5698, + 5699, + 5700, + 5701, + 5702, + 5703, + 5704, + 5705, + 5706, + 5707, + 5708, + 5709, + 5710, + 5711, + 5712, + 5713, + 5714, + 5715, + 5716, + 5717, + 5718, + 5719, + 5720, + 5721, + 5722, + 5723, + 5724, + 5725, + 5726, + 5727, + 5728, + 5729, + 5730, + 5731, + 5732, + 5733, + 5734, + 5735, + 5736, + 5737, + 5738, + 5739, + 5740, + 5741, + 5742, + 5743, + 5744, + 5745, + 5746, + 5747, + 5748, + 5749, + 5750, + 5751, + 5752, + 5753, + 5754, + 5755, + 5756, + 5757, + 5758, + 5759, + 5760, + 5761, + 5762, + 5763, + 5764, + 5765, + 5766, + 5767, + 5768, + 5769, + 5770, + 5771, + 5772, + 5773, + 5774, + 5775, + 5776, + 5777, + 5778, + 5779, + 5780, + 5781, + 5782, + 5783, + 5784, + 5785, + 5786, + 5787, + 5788, + 5789, + 5790, + 5791, + 5792, + 5793, + 5794, + 5795, + 5796, + 5797, + 5798, + 5799, + 5800, + 5801, + 5802, + 5803, + 5804, + 5805, + 5806, + 5807, + 5808, + 5809, + 5810, + 5811, + 5812, + 5813, + 5814, + 5815, + 5816, + 5817, + 5818, + 5819, + 5820, + 5821, + 5822, + 5823, + 5824, + 5825, + 5826, + 5827, + 5828, + 5829, + 5830, + 5831, + 5832, + 5833, + 5834, + 5835, + 5836, + 5837, + 5838, + 5839, + 5840, + 5841, + 5842, + 5843, + 5844, + 5845, + 5846, + 5847, + 5848, + 5849, + 5850, + 5851, + 5852, + 5853, + 5854, + 5855, + 5856, + 5857, + 5858, + 5859, + 5860, + 5861, + 5862, + 5863, + 5864, + 5865, + 5866, + 5867, + 5868, + 5869, + 5870, + 5871, + 5872, + 5873, + 5874, + 5875, + 5876, + 5877, + 5878, + 5879, + 5880, + 5881, + 5882, + 5883, + 5884, + 5885, + 5886, + 5887, + 5888, + 5889, + 5890, + 5891, + 5892, + 5893, + 5894, + 5895, + 5896, + 5897, + 5898, + 5899, + 5900, + 5901, + 5902, + 5903, + 5904, + 5905, + 5906, + 5907, + 5908, + 5909, + 5910, + 5911, + 5912, + 5913, + 5914, + 5915, + 5916, + 5917, + 5918, + 5919, + 5920, + 5921, + 5922, + 5923, + 5924, + 5925, + 5926, + 5927, + 5928, + 5929, + 5930, + 5931, + 5932, + 5933, + 5934, + 5935, + 5936, + 5937, + 5938, + 5939, + 5940, + 5941, + 5942, + 5943, + 5944, + 5945, + 5946, + 5947, + 5948, + 5949, + 5950, + 5951, + 5952, + 5953, + 5954, + 5955, + 5956, + 5957, + 5958, + 5959, + 5960, + 5961, + 5962, + 5963, + 5964, + 5965, + 5966, + 5967, + 5968, + 5969, + 5970, + 5971, + 5972, + 5973, + 5974, + 5975, + 5976, + 5977, + 5978, + 5979, + 5980, + 5981, + 5982, + 5983, + 5984, + 5985, + 5986, + 5987, + 5988, + 5989, + 5990, + 5991, + 5992, + 5993, + 5994, + 5995, + 5996, + 5997, + 5998, + 5999, + 6000, + 6001, + 6002, + 6003, + 6004, + 6005, + 6006, + 6007, + 6008, + 6009, + 6010, + 6011, + 6012, + 6013, + 6014, + 6015, + 6016, + 6017, + 6018, + 6019, + 6020, + 6021, + 6022, + 6023, + 6024, + 6025, + 6026, + 6027, + 6028, + 6029, + 6030, + 6031, + 6032, + 6033, + 6034, + 6035, + 6036, + 6037, + 6038, + 6039, + 6040, + 6041, + 6042, + 6043, + 6044, + 6045, + 6046, + 6047, + 6048, + 6049, + 6050, + 6051, + 6052, + 6053, + 6054, + 6055, + 6056, + 6057, + 6058, + 6059, + 6060, + 6061, + 6062, + 6063, + 6064, + 6065, + 6066, + 6067, + 6068, + 6069, + 6070, + 6071, + 6072, + 6073, + 6074, + 6075, + 6076, + 6077, + 6078, + 6079, + 6080, + 6081, + 6082, + 6083, + 6084, + 6085, + 6086, + 6087, + 6088, + 6089, + 6090, + 6091, + 6092, + 6093, + 6094, + 6095, + 6096, + 6097, + 6098, + 6099, + 6100, + 6101, + 6102, + 6103, + 6104, + 6105, + 6106, + 6107, + 6108, + 6109, + 6110, + 6111, + 6112, + 6113, + 6114, + 6115, + 6116, + 6117, + 6118, + 6119, + 6120, + 6121, + 6122, + 6123, + 6124, + 6125, + 6126, + 6127, + 6128, + 6129, + 6130, + 6131, + 6132, + 6133, + 6134, + 6135, + 6136, + 6137, + 6138, + 6139, + 6140, + 6141, + 6142, + 6143, + 6144, + 6145, + 6146, + 6147, + 6148, + 6149, + 6150, + 6151, + 6152, + 6153, + 6154, + 6155, + 6156, + 6157, + 6158, + 6159, + 6160, + 6161, + 6162, + 6163, + 6164, + 6165, + 6166, + 6167, + 6168, + 6169, + 6170, + 6171, + 6172, + 6173, + 6174, + 6175, + 6176, + 6177, + 6178, + 6179, + 6180, + 6181, + 6182, + 6183, + 6184, + 6185, + 6186, + 6187, + 6188, + 6189, + 6190, + 6191, + 6192, + 6193, + 6194, + 6195, + 6196, + 6197, + 6198, + 6199, + 6200, + 6201, + 6202, + 6203, + 6204, + 6205, + 6206, + 6207, + 6208, + 6209, + 6210, + 6211, + 6212, + 6213, + 6214, + 6215, + 6216, + 6217, + 6218, + 6219, + 6220, + 6221, + 6222, + 6223, + 6224, + 6225, + 6226, + 6227, + 6228, + 6229, + 6230, + 6231, + 6232, + 6233, + 6234, + 6235, + 6236, + 6237, + 6238, + 6239, + 6240, + 6241, + 6242, + 6243, + 6244, + 6245, + 6246, + 6247, + 6248, + 6249, + 6250, + 6251, + 6252, + 6253, + 6254, + 6255, + 6256, + 6257, + 6258, + 6259, + 6260, + 6261, + 6262, + 6263, + 6264, + 6265, + 6266, + 6267, + 6268, + 6269, + 6270, + 6271, + 6272, + 6273, + 6274, + 6275, + 6276, + 6277, + 6278, + 6279, + 6280, + 6281, + 6282, + 6283, + 6284, + 6285, + 6286, + 6287, + 6288, + 6289, + 6290, + 6291, + 6292, + 6293, + 6294, + 6295, + 6296, + 6297, + 6298, + 6299, + 6300, + 6301, + 6302, + 6303, + 6304, + 6305, + 6306, + 6307, + 6308, + 6309, + 6310, + 6311, + 6312, + 6313, + 6314, + 6315, + 6316, + 6317, + 6318, + 6319, + 6320, + 6321, + 6322, + 6323, + 6324, + 6325, + 6326, + 6327, + 6328, + 6329, + 6330, + 6331, + 6332, + 6333, + 6334, + 6335, + 6336, + 6337, + 6338, + 6339, + 6340, + 6341, + 6342, + 6343, + 6344, + 6345, + 6346, + 6347, + 6348, + 6349, + 6350, + 6351, + 6352, + 6353, + 6354, + 6355, + 6356, + 6357, + 6358, + 6359, + 6360, + 6361, + 6362, + 6363, + 6364, + 6365, + 6366, + 6367, + 6368, + 6369, + 6370, + 6371, + 6372, + 6373, + 6374, + 6375, + 6376, + 6377, + 6378, + 6379, + 6380, + 6381, + 6382, + 6383, + 6384, + 6385, + 6386, + 6387, + 6388, + 6389, + 6390, + 6391, + 6392, + 6393, + 6394, + 6395, + 6396, + 6397, + 6398, + 6399, + 6400, + 6401, + 6402, + 6403, + 6404, + 6405, + 6406, + 6407, + 6408, + 6409, + 6410, + 6411, + 6412, + 6413, + 6414, + 6415, + 6416, + 6417, + 6418, + 6419, + 6420, + 6421, + 6422, + 6423, + 6424, + 6425, + 6426, + 6427, + 6428, + 6429, + 6430, + 6431, + 6432, + 6433, + 6434, + 6435, + 6436, + 6437, + 6438, + 6439, + 6440, + 6441, + 6442, + 6443, + 6444, + 6445, + 6446, + 6447, + 6448, + 6449, + 6450, + 6451, + 6452, + 6453, + 6454, + 6455, + 6456, + 6457, + 6458, + 6459, + 6460, + 6461, + 6462, + 6463, + 6464, + 6465, + 6466, + 6467, + 6468, + 6469, + 6470, + 6471, + 6472, + 6473, + 6474, + 6475, + 6476, + 6477, + 6478, + 6479, + 6480, + 6481, + 6482, + 6483, + 6484, + 6485, + 6486, + 6487, + 6488, + 6489, + 6490, + 6491, + 6492, + 6493, + 6494, + 6495, + 6496, + 6497, + 6498, + 6499, + 6500, + 6501, + 6502, + 6503, + 6504, + 6505, + 6506, + 6507, + 6508, + 6509, + 6510, + 6511, + 6512, + 6513, + 6514, + 6515, + 6516, + 6517, + 6518, + 6519, + 6520, + 6521, + 6522, + 6523, + 6524, + 6525, + 6526, + 6527, + 6528, + 6529, + 6530, + 6531, + 6532, + 6533, + 6534, + 6535, + 6536, + 6537, + 6538, + 6539, + 6540, + 6541, + 6542, + 6543, + 6544, + 6545, + 6546, + 6547, + 6548, + 6549, + 6550, + 6551, + 6552, + 6553, + 6554, + 6555, + 6556, + 6557, + 6558, + 6559, + 6560, + 6561, + 6562, + 6563, + 6564, + 6565, + 6566, + 6567, + 6568, + 6569, + 6570, + 6571, + 6572, + 6573, + 6574, + 6575, + 6576, + 6577, + 6578, + 6579, + 6580, + 6581, + 6582, + 6583, + 6584, + 6585, + 6586, + 6587, + 6588, + 6589, + 6590, + 6591, + 6592, + 6593, + 6594, + 6595, + 6596, + 6597, + 6598, + 6599, + 6600, + 6601, + 6602, + 6603, + 6604, + 6605, + 6606, + 6607, + 6608, + 6609, + 6610, + 6611, + 6612, + 6613, + 6614, + 6615, + 6616, + 6617, + 6618, + 6619, + 6620, + 6621, + 6622, + 6623, + 6624, + 6625, + 6626, + 6627, + 6628, + 6629, + 6630, + 6631, + 6632, + 6633, + 6634, + 6635, + 6636, + 6637, + 6638, + 6639, + 6640, + 6641, + 6642, + 6643, + 6644, + 6645, + 6646, + 6647, + 6648, + 6649, + 6650, + 6651, + 6652, + 6653, + 6654, + 6655, + 6656, + 6657, + 6658, + 6659, + 6660, + 6661, + 6662, + 6663, + 6664, + 6665, + 6666, + 6667, + 6668, + 6669, + 6670, + 6671, + 6672, + 6673, + 6674, + 6675, + 6676, + 6677, + 6678, + 6679, + 6680, + 6681, + 6682, + 6683, + 6684, + 6685, + 6686, + 6687, + 6688, + 6689, + 6690, + 6691, + 6692, + 6693, + 6694, + 6695, + 6696, + 6697, + 6698, + 6699, + 6700, + 6701, + 6702, + 6703, + 6704, + 6705, + 6706, + 6707, + 6708, + 6709, + 6710, + 6711, + 6712, + 6713, + 6714, + 6715, + 6716, + 6717, + 6718, + 6719, + 6720, + 6721, + 6722, + 6723, + 6724, + 6725, + 6726, + 6727, + 6728, + 6729, + 6730, + 6731, + 6732, + 6733, + 6734, + 6735, + 6736, + 6737, + 6738, + 6739, + 6740, + 6741, + 6742, + 6743, + 6744, + 6745, + 6746, + 6747, + 6748, + 6749, + 6750, + 6751, + 6752, + 6753, + 6754, + 6755, + 6756, + 6757, + 6758, + 6759, + 6760, + 6761, + 6762, + 6763, + 6764, + 6765, + 6766, + 6767, + 6768, + 6769, + 6770, + 6771, + 6772, + 6773, + 6774, + 6775, + 6776, + 6777, + 6778, + 6779, + 6780, + 6781, + 6782, + 6783, + 6784, + 6785, + 6786, + 6787, + 6788, + 6789, + 6790, + 6791, + 6792, + 6793, + 6794, + 6795, + 6796, + 6797, + 6798, + 6799, + 6800, + 6801, + 6802, + 6803, + 6804, + 6805, + 6806, + 6807, + 6808, + 6809, + 6810, + 6811, + 6812, + 6813, + 6814, + 6815, + 6816, + 6817, + 6818, + 6819, + 6820, + 6821, + 6822, + 6823, + 6824, + 6825, + 6826, + 6827, + 6828, + 6829, + 6830, + 6831, + 6832, + 6833, + 6834, + 6835, + 6836, + 6837, + 6838, + 6839, + 6840, + 6841, + 6842, + 6843, + 6844, + 6845, + 6846, + 6847, + 6848, + 6849, + 6850, + 6851, + 6852, + 6853, + 6854, + 6855, + 6856, + 6857, + 6858, + 6859, + 6860, + 6861, + 6862, + 6863, + 6864, + 6865, + 6866, + 6867, + 6868, + 6869, + 6870, + 6871, + 6872, + 6873, + 6874, + 6875, + 6876, + 6877, + 6878, + 6879, + 6880, + 6881, + 6882, + 6883, + 6884, + 6885, + 6886, + 6887, + 6888, + 6889, + 6890, + 6891, + 6892, + 6893, + 6894, + 6895, + 6896, + 6897, + 6898, + 6899, + 6900, + 6901, + 6902, + 6903, + 6904, + 6905, + 6906, + 6907, + 6908, + 6909, + 6910, + 6911, + 6912, + 6913, + 6914, + 6915, + 6916, + 6917, + 6918, + 6919, + 6920, + 6921, + 6922, + 6923, + 6924, + 6925, + 6926, + 6927, + 6928, + 6929, + 6930, + 6931, + 6932, + 6933, + 6934, + 6935, + 6936, + 6937, + 6938, + 6939, + 6940, + 6941, + 6942, + 6943, + 6944, + 6945, + 6946, + 6947, + 6948, + 6949, + 6950, + 6951, + 6952, + 6953, + 6954, + 6955, + 6956, + 6957, + 6958, + 6959, + 6960, + 6961, + 6962, + 6963, + 6964, + 6965, + 6966, + 6967, + 6968, + 6969, + 6970, + 6971, + 6972, + 6973, + 6974, + 6975, + 6976, + 6977, + 6978, + 6979, + 6980, + 6981, + 6982, + 6983, + 6984, + 6985, + 6986, + 6987, + 6988, + 6989, + 6990, + 6991, + 6992, + 6993, + 6994, + 6995, + 6996, + 6997, + 6998, + 6999, + 7000, + 7001, + 7002, + 7003, + 7004, + 7005, + 7006, + 7007, + 7008, + 7009, + 7010, + 7011, + 7012, + 7013, + 7014, + 7015, + 7016, + 7017, + 7018, + 7019, + 7020, + 7021, + 7022, + 7023, + 7024, + 7025, + 7026, + 7027, + 7028, + 7029, + 7030, + 7031, + 7032, + 7033, + 7034, + 7035, + 7036, + 7037, + 7038, + 7039, + 7040, + 7041, + 7042, + 7043, + 7044, + 7045, + 7046, + 7047, + 7048, + 7049, + 7050, + 7051, + 7052, + 7053, + 7054, + 7055, + 7056, + 7057, + 7058, + 7059, + 7060, + 7061, + 7062, + 7063, + 7064, + 7065, + 7066, + 7067, + 7068, + 7069, + 7070, + 7071, + 7072, + 7073, + 7074, + 7075, + 7076, + 7077, + 7078, + 7079, + 7080, + 7081, + 7082, + 7083, + 7084, + 7085, + 7086, + 7087, + 7088, + 7089, + 7090, + 7091, + 7092, + 7093, + 7094, + 7095, + 7096, + 7097, + 7098, + 7099, + 7100, + 7101, + 7102, + 7103, + 7104, + 7105, + 7106, + 7107, + 7108, + 7109, + 7110, + 7111, + 7112, + 7113, + 7114, + 7115, + 7116, + 7117, + 7118, + 7119, + 7120, + 7121, + 7122, + 7123, + 7124, + 7125, + 7126, + 7127, + 7128, + 7129, + 7130, + 7131, + 7132, + 7133, + 7134, + 7135, + 7136, + 7137, + 7138, + 7139, + 7140, + 7141, + 7142, + 7143, + 7144, + 7145, + 7146, + 7147, + 7148, + 7149, + 7150, + 7151, + 7152, + 7153, + 7154, + 7155, + 7156, + 7157, + 7158, + 7159, + 7160, + 7161, + 7162, + 7163, + 7164, + 7165, + 7166, + 7167, + 7168, + 7169, + 7170, + 7171, + 7172, + 7173, + 7174, + 7175, + 7176, + 7177, + 7178, + 7179, + 7180, + 7181, + 7182, + 7183, + 7184, + 7185, + 7186, + 7187, + 7188, + 7189, + 7190, + 7191, + 7192, + 7193, + 7194, + 7195, + 7196, + 7197, + 7198, + 7199, + 7200, + 7201, + 7202, + 7203, + 7204, + 7205, + 7206, + 7207, + 7208, + 7209, + 7210, + 7211, + 7212, + 7213, + 7214, + 7215, + 7216, + 7217, + 7218, + 7219, + 7220, + 7221, + 7222, + 7223, + 7224, + 7225, + 7226, + 7227, + 7228, + 7229, + 7230, + 7231, + 7232, + 7233, + 7234, + 7235, + 7236, + 7237, + 7238, + 7239, + 7240, + 7241, + 7242, + 7243, + 7244, + 7245, + 7246, + 7247, + 7248, + 7249, + 7250, + 7251, + 7252, + 7253, + 7254, + 7255, + 7256, + 7257, + 7258, + 7259, + 7260, + 7261, + 7262, + 7263, + 7264, + 7265, + 7266, + 7267, + 7268, + 7269, + 7270, + 7271, + 7272, + 7273, + 7274, + 7275, + 7276, + 7277, + 7278, + 7279, + 7280, + 7281, + 7282, + 7283, + 7284, + 7285, + 7286, + 7287, + 7288, + 7289, + 7290, + 7291, + 7292, + 7293, + 7294, + 7295, + 7296, + 7297, + 7298, + 7299, + 7300, + 7301, + 7302, + 7303, + 7304, + 7305, + 7306, + 7307, + 7308, + 7309, + 7310, + 7311, + 7312, + 7313, + 7314, + 7315, + 7316, + 7317, + 7318, + 7319, + 7320, + 7321, + 7322, + 7323, + 7324, + 7325, + 7326, + 7327, + 7328, + 7329, + 7330, + 7331, + 7332, + 7333, + 7334, + 7335, + 7336, + 7337, + 7338, + 7339, + 7340, + 7341, + 7342, + 7343, + 7344, + 7345, + 7346, + 7347, + 7348, + 7349, + 7350, + 7351, + 7352, + 7353, + 7354, + 7355, + 7356, + 7357, + 7358, + 7359, + 7360, + 7361, + 7362, + 7363, + 7364, + 7365, + 7366, + 7367, + 7368, + 7369, + 7370, + 7371, + 7372, + 7373, + 7374, + 7375, + 7376, + 7377, + 7378, + 7379, + 7380, + 7381, + 7382, + 7383, + 7384, + 7385, + 7386, + 7387, + 7388, + 7389, + 7390, + 7391, + 7392, + 7393, + 7394, + 7395, + 7396, + 7397, + 7398, + 7399, + 7400, + 7401, + 7402, + 7403, + 7404, + 7405, + 7406, + 7407, + 7408, + 7409, + 7410, + 7411, + 7412, + 7413, + 7414, + 7415, + 7416, + 7417, + 7418, + 7419, + 7420, + 7421, + 7422, + 7423, + 7424, + 7425, + 7426, + 7427, + 7428, + 7429, + 7430, + 7431, + 7432, + 7433, + 7434, + 7435, + 7436, + 7437, + 7438, + 7439, + 7440, + 7441, + 7442, + 7443, + 7444, + 7445, + 7446, + 7447, + 7448, + 7449, + 7450, + 7451, + 7452, + 7453, + 7454, + 7455, + 7456, + 7457, + 7458, + 7459, + 7460, + 7461, + 7462, + 7463, + 7464, + 7465, + 7466, + 7467, + 7468, + 7469, + 7470, + 7471, + 7472, + 7473, + 7474, + 7475, + 7476, + 7477, + 7478, + 7479, + 7480, + 7481, + 7482, + 7483, + 7484, + 7485, + 7486, + 7487, + 7488, + 7489, + 7490, + 7491, + 7492, + 7493, + 7494, + 7495, + 7496, + 7497, + 7498, + 7499, + 7500, + 7501, + 7502, + 7503, + 7504, + 7505, + 7506, + 7507, + 7508, + 7509, + 7510, + 7511, + 7512, + 7513, + 7514, + 7515, + 7516, + 7517, + 7518, + 7519, + 7520, + 7521, + 7522, + 7523, + 7524, + 7525, + 7526, + 7527, + 7528, + 7529, + 7530, + 7531, + 7532, + 7533, + 7534, + 7535, + 7536, + 7537, + 7538, + 7539, + 7540, + 7541, + 7542, + 7543, + 7544, + 7545, + 7546, + 7547, + 7548, + 7549, + 7550, + 7551, + 7552, + 7553, + 7554, + 7555, + 7556, + 7557, + 7558, + 7559, + 7560, + 7561, + 7562, + 7563, + 7564, + 7565, + 7566, + 7567, + 7568, + 7569, + 7570, + 7571, + 7572, + 7573, + 7574, + 7575, + 7576, + 7577, + 7578, + 7579, + 7580, + 7581, + 7582, + 7583, + 7584, + 7585, + 7586, + 7587, + 7588, + 7589, + 7590, + 7591, + 7592, + 7593, + 7594, + 7595, + 7596, + 7597, + 7598, + 7599, + 7600, + 7601, + 7602, + 7603, + 7604, + 7605, + 7606, + 7607, + 7608, + 7609, + 7610, + 7611, + 7612, + 7613, + 7614, + 7615, + 7616, + 7617, + 7618, + 7619, + 7620, + 7621, + 7622, + 7623, + 7624, + 7625, + 7626, + 7627, + 7628, + 7629, + 7630, + 7631, + 7632, + 7633, + 7634, + 7635, + 7636, + 7637, + 7638, + 7639, + 7640, + 7641, + 7642, + 7643, + 7644, + 7645, + 7646, + 7647, + 7648, + 7649, + 7650, + 7651, + 7652, + 7653, + 7654, + 7655, + 7656, + 7657, + 7658, + 7659, + 7660, + 7661, + 7662, + 7663, + 7664, + 7665, + 7666, + 7667, + 7668, + 7669, + 7670, + 7671, + 7672, + 7673, + 7674, + 7675, + 7676, + 7677, + 7678, + 7679, + 7680, + 7681, + 7682, + 7683, + 7684, + 7685, + 7686, + 7687, + 7688, + 7689, + 7690, + 7691, + 7692, + 7693, + 7694, + 7695, + 7696, + 7697, + 7698, + 7699, + 7700, + 7701, + 7702, + 7703, + 7704, + 7705, + 7706, + 7707, + 7708, + 7709, + 7710, + 7711, + 7712, + 7713, + 7714, + 7715, + 7716, + 7717, + 7718, + 7719, + 7720, + 7721, + 7722, + 7723, + 7724, + 7725, + 7726, + 7727, + 7728, + 7729, + 7730, + 7731, + 7732, + 7733, + 7734, + 7735, + 7736, + 7737, + 7738, + 7739, + 7740, + 7741, + 7742, + 7743, + 7744, + 7745, + 7746, + 7747, + 7748, + 7749, + 7750, + 7751, + 7752, + 7753, + 7754, + 7755, + 7756, + 7757, + 7758, + 7759, + 7760, + 7761, + 7762, + 7763, + 7764, + 7765, + 7766, + 7767, + 7768, + 7769, + 7770, + 7771, + 7772, + 7773, + 7774, + 7775, + 7776, + 7777, + 7778, + 7779, + 7780, + 7781, + 7782, + 7783, + 7784, + 7785, + 7786, + 7787, + 7788, + 7789, + 7790, + 7791, + 7792, + 7793, + 7794, + 7795, + 7796, + 7797, + 7798, + 7799, + 7800, + 7801, + 7802, + 7803, + 7804, + 7805, + 7806, + 7807, + 7808, + 7809, + 7810, + 7811, + 7812, + 7813, + 7814, + 7815, + 7816, + 7817, + 7818, + 7819, + 7820, + 7821, + 7822, + 7823, + 7824, + 7825, + 7826, + 7827, + 7828, + 7829, + 7830, + 7831, + 7832, + 7833, + 7834, + 7835, + 7836, + 7837, + 7838, + 7839, + 7840, + 7841, + 7842, + 7843, + 7844, + 7845, + 7846, + 7847, + 7848, + 7849, + 7850, + 7851, + 7852, + 7853, + 7854, + 7855, + 7856, + 7857, + 7858, + 7859, + 7860, + 7861, + 7862, + 7863, + 7864, + 7865, + 7866, + 7867, + 7868, + 7869, + 7870, + 7871, + 7872, + 7873, + 7874, + 7875, + 7876, + 7877, + 7878, + 7879, + 7880, + 7881, + 7882, + 7883, + 7884, + 7885, + 7886, + 7887, + 7888, + 7889, + 7890, + 7891, + 7892, + 7893, + 7894, + 7895, + 7896, + 7897, + 7898, + 7899, + 7900, + 7901, + 7902, + 7903, + 7904, + 7905, + 7906, + 7907, + 7908, + 7909, + 7910, + 7911, + 7912, + 7913, + 7914, + 7915, + 7916, + 7917, + 7918, + 7919, + 7920, + 7921, + 7922, + 7923, + 7924, + 7925, + 7926, + 7927, + 7928, + 7929, + 7930, + 7931, + 7932, + 7933, + 7934, + 7935, + 7936, + 7937, + 7938, + 7939, + 7940, + 7941, + 7942, + 7943, + 7944, + 7945, + 7946, + 7947, + 7948, + 7949, + 7950, + 7951, + 7952, + 7953, + 7954, + 7955, + 7956, + 7957, + 7958, + 7959, + 7960, + 7961, + 7962, + 7963, + 7964, + 7965, + 7966, + 7967, + 7968, + 7969, + 7970, + 7971, + 7972, + 7973, + 7974, + 7975, + 7976, + 7977, + 7978, + 7979, + 7980, + 7981, + 7982, + 7983, + 7984, + 7985, + 7986, + 7987, + 7988, + 7989, + 7990, + 7991, + 7992, + 7993, + 7994, + 7995, + 7996, + 7997, + 7998, + 7999, + 8000, + 8001, + 8002, + 8003, + 8004, + 8005, + 8006, + 8007, + 8008, + 8009, + 8010, + 8011, + 8012, + 8013, + 8014, + 8015, + 8016, + 8017, + 8018, + 8019, + 8020, + 8021, + 8022, + 8023, + 8024, + 8025, + 8026, + 8027, + 8028, + 8029, + 8030, + 8031, + 8032, + 8033, + 8034, + 8035, + 8036, + 8037, + 8038, + 8039, + 8040, + 8041, + 8042, + 8043, + 8044, + 8045, + 8046, + 8047, + 8048, + 8049, + 8050, + 8051, + 8052, + 8053, + 8054, + 8055, + 8056, + 8057, + 8058, + 8059, + 8060, + 8061, + 8062, + 8063, + 8064, + 8065, + 8066, + 8067, + 8068, + 8069, + 8070, + 8071, + 8072, + 8073, + 8074, + 8075, + 8076, + 8077, + 8078, + 8079, + 8080, + 8081, + 8082, + 8083, + 8084, + 8085, + 8086, + 8087, + 8088, + 8089, + 8090, + 8091, + 8092, + 8093, + 8094, + 8095, + 8096, + 8097, + 8098, + 8099, + 8100, + 8101, + 8102, + 8103, + 8104, + 8105, + 8106, + 8107, + 8108, + 8109, + 8110, + 8111, + 8112, + 8113, + 8114, + 8115, + 8116, + 8117, + 8118, + 8119, + 8120, + 8121, + 8122, + 8123, + 8124, + 8125, + 8126, + 8127, + 8128, + 8129, + 8130, + 8131, + 8132, + 8133, + 8134, + 8135, + 8136, + 8137, + 8138, + 8139, + 8140, + 8141, + 8142, + 8143, + 8144, + 8145, + 8146, + 8147, + 8148, + 8149, + 8150, + 8151, + 8152, + 8153, + 8154, + 8155, + 8156, + 8157, + 8158, + 8159, + 8160, + 8161, + 8162, + 8163, + 8164, + 8165, + 8166, + 8167, + 8168, + 8169, + 8170, + 8171, + 8172, + 8173, + 8174, + 8175, + 8176, + 8177, + 8178, + 8179, + 8180, + 8181, + 8182, + 8183, + 8184, + 8185, + 8186, + 8187, + 8188, + 8189, + 8190, + 8191, + 8192, + 8193, + 8194, + 8195, + 8196, + 8197, + 8198, + 8199, + 8200, + 8201, + 8202, + 8203, + 8204, + 8205, + 8206, + 8207, + 8208, + 8209, + 8210, + 8211, + 8212, + 8213, + 8214, + 8215, + 8216, + 8217, + 8218, + 8219, + 8220, + 8221, + 8222, + 8223, + 8224, + 8225, + 8226, + 8227, + 8228, + 8229, + 8230, + 8231, + 8232, + 8233, + 8234, + 8235, + 8236, + 8237, + 8238, + 8239, + 8240, + 8241, + 8242, + 8243, + 8244, + 8245, + 8246, + 8247, + 8248, + 8249, + 8250, + 8251, + 8252, + 8253, + 8254, + 8255, + 8256, + 8257, + 8258, + 8259, + 8260, + 8261, + 8262, + 8263, + 8264, + 8265, + 8266, + 8267, + 8268, + 8269, + 8270, + 8271, + 8272, + 8273, + 8274, + 8275, + 8276, + 8277, + 8278, + 8279, + 8280, + 8281, + 8282, + 8283, + 8284, + 8285, + 8286, + 8287, + 8288, + 8289, + 8290, + 8291, + 8292, + 8293, + 8294, + 8295, + 8296, + 8297, + 8298, + 8299, + 8300, + 8301, + 8302, + 8303, + 8304, + 8305, + 8306, + 8307, + 8308, + 8309, + 8310, + 8311, + 8312, + 8313, + 8314, + 8315, + 8316, + 8317, + 8318, + 8319, + 8320, + 8321, + 8322, + 8323, + 8324, + 8325, + 8326, + 8327, + 8328, + 8329, + 8330, + 8331, + 8332, + 8333, + 8334, + 8335, + 8336, + 8337, + 8338, + 8339, + 8340, + 8341, + 8342, + 8343, + 8344, + 8345, + 8346, + 8347, + 8348, + 8349, + 8350, + 8351, + 8352, + 8353, + 8354, + 8355, + 8356, + 8357, + 8358, + 8359, + 8360, + 8361, + 8362, + 8363, + 8364, + 8365, + 8366, + 8367, + 8368, + 8369, + 8370, + 8371, + 8372, + 8373, + 8374, + 8375, + 8376, + 8377, + 8378, + 8379, + 8380, + 8381, + 8382, + 8383, + 8384, + 8385, + 8386, + 8387, + 8388, + 8389, + 8390, + 8391, + 8392, + 8393, + 8394, + 8395, + 8396, + 8397, + 8398, + 8399, + 8400, + 8401, + 8402, + 8403, + 8404, + 8405, + 8406, + 8407, + 8408, + 8409, + 8410, + 8411, + 8412, + 8413, + 8414, + 8415, + 8416, + 8417, + 8418, + 8419, + 8420, + 8421, + 8422, + 8423, + 8424, + 8425, + 8426, + 8427, + 8428, + 8429, + 8430, + 8431, + 8432, + 8433, + 8434, + 8435, + 8436, + 8437, + 8438, + 8439, + 8440, + 8441, + 8442, + 8443, + 8444, + 8445, + 8446, + 8447, + 8448, + 8449, + 8450, + 8451, + 8452, + 8453, + 8454, + 8455, + 8456, + 8457, + 8458, + 8459, + 8460, + 8461, + 8462, + 8463, + 8464, + 8465, + 8466, + 8467, + 8468, + 8469, + 8470, + 8471, + 8472, + 8473, + 8474, + 8475, + 8476, + 8477, + 8478, + 8479, + 8480, + 8481, + 8482, + 8483, + 8484, + 8485, + 8486, + 8487, + 8488, + 8489, + 8490, + 8491, + 8492, + 8493, + 8494, + 8495, + 8496, + 8497, + 8498, + 8499, + 8500, + 8501, + 8502, + 8503, + 8504, + 8505, + 8506, + 8507, + 8508, + 8509, + 8510, + 8511, + 8512, + 8513, + 8514, + 8515, + 8516, + 8517, + 8518, + 8519, + 8520, + 8521, + 8522, + 8523, + 8524, + 8525, + 8526, + 8527, + 8528, + 8529, + 8530, + 8531, + 8532, + 8533, + 8534, + 8535, + 8536, + 8537, + 8538, + 8539, + 8540, + 8541, + 8542, + 8543, + 8544, + 8545, + 8546, + 8547, + 8548, + 8549, + 8550, + 8551, + 8552, + 8553, + 8554, + 8555, + 8556, + 8557, + 8558, + 8559, + 8560, + 8561, + 8562, + 8563, + 8564, + 8565, + 8566, + 8567, + 8568, + 8569, + 8570, + 8571, + 8572, + 8573, + 8574, + 8575, + 8576, + 8577, + 8578, + 8579, + 8580, + 8581, + 8582, + 8583, + 8584, + 8585, + 8586, + 8587, + 8588, + 8589, + 8590, + 8591, + 8592, + 8593, + 8594, + 8595, + 8596, + 8597, + 8598, + 8599, + 8600, + 8601, + 8602, + 8603, + 8604, + 8605, + 8606, + 8607, + 8608, + 8609, + 8610, + 8611, + 8612, + 8613, + 8614, + 8615, + 8616, + 8617, + 8618, + 8619, + 8620, + 8621, + 8622, + 8623, + 8624, + 8625, + 8626, + 8627, + 8628, + 8629, + 8630, + 8631, + 8632, + 8633, + 8634, + 8635, + 8636, + 8637, + 8638, + 8639, + 8640, + 8641, + 8642, + 8643, + 8644, + 8645, + 8646, + 8647, + 8648, + 8649, + 8650, + 8651, + 8652, + 8653, + 8654, + 8655, + 8656, + 8657, + 8658, + 8659, + 8660, + 8661, + 8662, + 8663, + 8664, + 8665, + 8666, + 8667, + 8668, + 8669, + 8670, + 8671, + 8672, + 8673, + 8674, + 8675, + 8676, + 8677, + 8678, + 8679, + 8680, + 8681, + 8682, + 8683, + 8684, + 8685, + 8686, + 8687, + 8688, + 8689, + 8690, + 8691, + 8692, + 8693, + 8694, + 8695, + 8696, + 8697, + 8698, + 8699, + 8700, + 8701, + 8702, + 8703, + 8704, + 8705, + 8706, + 8707, + 8708, + 8709, + 8710, + 8711, + 8712, + 8713, + 8714, + 8715, + 8716, + 8717, + 8718, + 8719, + 8720, + 8721, + 8722, + 8723, + 8724, + 8725, + 8726, + 8727, + 8728, + 8729, + 8730, + 8731, + 8732, + 8733, + 8734, + 8735, + 8736, + 8737, + 8738, + 8739, + 8740, + 8741, + 8742, + 8743, + 8744, + 8745, + 8746, + 8747, + 8748, + 8749, + 8750, + 8751, + 8752, + 8753, + 8754, + 8755, + 8756, + 8757, + 8758, + 8759, + 8760, + 8761, + 8762, + 8763, + 8764, + 8765, + 8766, + 8767, + 8768, + 8769, + 8770, + 8771, + 8772, + 8773, + 8774, + 8775, + 8776, + 8777, + 8778, + 8779, + 8780, + 8781, + 8782, + 8783, + 8784, + 8785, + 8786, + 8787, + 8788, + 8789, + 8790, + 8791, + 8792, + 8793, + 8794, + 8795, + 8796, + 8797, + 8798, + 8799, + 8800, + 8801, + 8802, + 8803, + 8804, + 8805, + 8806, + 8807, + 8808, + 8809, + 8810, + 8811, + 8812, + 8813, + 8814, + 8815, + 8816, + 8817, + 8818, + 8819, + 8820, + 8821, + 8822, + 8823, + 8824, + 8825, + 8826, + 8827, + 8828, + 8829, + 8830, + 8831, + 8832, + 8833, + 8834, + 8835, + 8836, + 8837, + 8838, + 8839, + 8840, + 8841, + 8842, + 8843, + 8844, + 8845, + 8846, + 8847, + 8848, + 8849, + 8850, + 8851, + 8852, + 8853, + 8854, + 8855, + 8856, + 8857, + 8858, + 8859, + 8860, + 8861, + 8862, + 8863, + 8864, + 8865, + 8866, + 8867, + 8868, + 8869, + 8870, + 8871, + 8872, + 8873, + 8874, + 8875, + 8876, + 8877, + 8878, + 8879, + 8880, + 8881, + 8882, + 8883, + 8884, + 8885, + 8886, + 8887, + 8888, + 8889, + 8890, + 8891, + 8892, + 8893, + 8894, + 8895, + 8896, + 8897, + 8898, + 8899, + 8900, + 8901, + 8902, + 8903, + 8904, + 8905, + 8906, + 8907, + 8908, + 8909, + 8910, + 8911, + 8912, + 8913, + 8914, + 8915, + 8916, + 8917, + 8918, + 8919, + 8920, + 8921, + 8922, + 8923, + 8924, + 8925, + 8926, + 8927, + 8928, + 8929, + 8930, + 8931, + 8932, + 8933, + 8934, + 8935, + 8936, + 8937, + 8938, + 8939, + 8940, + 8941, + 8942, + 8943, + 8944, + 8945, + 8946, + 8947, + 8948, + 8949, + 8950, + 8951, + 8952, + 8953, + 8954, + 8955, + 8956, + 8957, + 8958, + 8959, + 8960, + 8961, + 8962, + 8963, + 8964, + 8965, + 8966, + 8967, + 8968, + 8969, + 8970, + 8971, + 8972, + 8973, + 8974, + 8975, + 8976, + 8977, + 8978, + 8979, + 8980, + 8981, + 8982, + 8983, + 8984, + 8985, + 8986, + 8987, + 8988, + 8989, + 8990, + 8991, + 8992, + 8993, + 8994, + 8995, + 8996, + 8997, + 8998, + 8999, + 9000, + 9001, + 9002, + 9003, + 9004, + 9005, + 9006, + 9007, + 9008, + 9009, + 9010, + 9011, + 9012, + 9013, + 9014, + 9015, + 9016, + 9017, + 9018, + 9019, + 9020, + 9021, + 9022, + 9023, + 9024, + 9025, + 9026, + 9027, + 9028, + 9029, + 9030, + 9031, + 9032, + 9033, + 9034, + 9035, + 9036, + 9037, + 9038, + 9039, + 9040, + 9041, + 9042, + 9043, + 9044, + 9045, + 9046, + 9047, + 9048, + 9049, + 9050, + 9051, + 9052, + 9053, + 9054, + 9055, + 9056, + 9057, + 9058, + 9059, + 9060, + 9061, + 9062, + 9063, + 9064, + 9065, + 9066, + 9067, + 9068, + 9069, + 9070, + 9071, + 9072, + 9073, + 9074, + 9075, + 9076, + 9077, + 9078, + 9079, + 9080, + 9081, + 9082, + 9083, + 9084, + 9085, + 9086, + 9087, + 9088, + 9089, + 9090, + 9091, + 9092, + 9093, + 9094, + 9095, + 9096, + 9097, + 9098, + 9099, + 9100, + 9101, + 9102, + 9103, + 9104, + 9105, + 9106, + 9107, + 9108, + 9109, + 9110, + 9111, + 9112, + 9113, + 9114, + 9115, + 9116, + 9117, + 9118, + 9119, + 9120, + 9121, + 9122, + 9123, + 9124, + 9125, + 9126, + 9127, + 9128, + 9129, + 9130, + 9131, + 9132, + 9133, + 9134, + 9135, + 9136, + 9137, + 9138, + 9139, + 9140, + 9141, + 9142, + 9143, + 9144, + 9145, + 9146, + 9147, + 9148, + 9149, + 9150, + 9151, + 9152, + 9153, + 9154, + 9155, + 9156, + 9157, + 9158, + 9159, + 9160, + 9161, + 9162, + 9163, + 9164, + 9165, + 9166, + 9167, + 9168, + 9169, + 9170, + 9171, + 9172, + 9173, + 9174, + 9175, + 9176, + 9177, + 9178, + 9179, + 9180, + 9181, + 9182, + 9183, + 9184, + 9185, + 9186, + 9187, + 9188, + 9189, + 9190, + 9191, + 9192, + 9193, + 9194, + 9195, + 9196, + 9197, + 9198, + 9199, + 9200, + 9201, + 9202, + 9203, + 9204, + 9205, + 9206, + 9207, + 9208, + 9209, + 9210, + 9211, + 9212, + 9213, + 9214, + 9215, + 9216, + 9217, + 9218, + 9219, + 9220, + 9221, + 9222, + 9223, + 9224, + 9225, + 9226, + 9227, + 9228, + 9229, + 9230, + 9231, + 9232, + 9233, + 9234, + 9235, + 9236, + 9237, + 9238, + 9239, + 9240, + 9241, + 9242, + 9243, + 9244, + 9245, + 9246, + 9247, + 9248, + 9249, + 9250, + 9251, + 9252, + 9253, + 9254, + 9255, + 9256, + 9257, + 9258, + 9259, + 9260, + 9261, + 9262, + 9263, + 9264, + 9265, + 9266, + 9267, + 9268, + 9269, + 9270, + 9271, + 9272, + 9273, + 9274, + 9275, + 9276, + 9277, + 9278, + 9279, + 9280, + 9281, + 9282, + 9283, + 9284, + 9285, + 9286, + 9287, + 9288, + 9289, + 9290, + 9291, + 9292, + 9293, + 9294, + 9295, + 9296, + 9297, + 9298, + 9299, + 9300, + 9301, + 9302, + 9303, + 9304, + 9305, + 9306, + 9307, + 9308, + 9309, + 9310, + 9311, + 9312, + 9313, + 9314, + 9315, + 9316, + 9317, + 9318, + 9319, + 9320, + 9321, + 9322, + 9323, + 9324, + 9325, + 9326, + 9327, + 9328, + 9329, + 9330, + 9331, + 9332, + 9333, + 9334, + 9335, + 9336, + 9337, + 9338, + 9339, + 9340, + 9341, + 9342, + 9343, + 9344, + 9345, + 9346, + 9347, + 9348, + 9349, + 9350, + 9351, + 9352, + 9353, + 9354, + 9355, + 9356, + 9357, + 9358, + 9359, + 9360, + 9361, + 9362, + 9363, + 9364, + 9365, + 9366, + 9367, + 9368, + 9369, + 9370, + 9371, + 9372, + 9373, + 9374, + 9375, + 9376, + 9377, + 9378, + 9379, + 9380, + 9381, + 9382, + 9383, + 9384, + 9385, + 9386, + 9387, + 9388, + 9389, + 9390, + 9391, + 9392, + 9393, + 9394, + 9395, + 9396, + 9397, + 9398, + 9399, + 9400, + 9401, + 9402, + 9403, + 9404, + 9405, + 9406, + 9407, + 9408, + 9409, + 9410, + 9411, + 9412, + 9413, + 9414, + 9415, + 9416, + 9417, + 9418, + 9419, + 9420, + 9421, + 9422, + 9423, + 9424, + 9425, + 9426, + 9427, + 9428, + 9429, + 9430, + 9431, + 9432, + 9433, + 9434, + 9435, + 9436, + 9437, + 9438, + 9439, + 9440, + 9441, + 9442, + 9443, + 9444, + 9445, + 9446, + 9447, + 9448, + 9449, + 9450, + 9451, + 9452, + 9453, + 9454, + 9455, + 9456, + 9457, + 9458, + 9459, + 9460, + 9461, + 9462, + 9463, + 9464, + 9465, + 9466, + 9467, + 9468, + 9469, + 9470, + 9471, + 9472, + 9473, + 9474, + 9475, + 9476, + 9477, + 9478, + 9479, + 9480, + 9481, + 9482, + 9483, + 9484, + 9485, + 9486, + 9487, + 9488, + 9489, + 9490, + 9491, + 9492, + 9493, + 9494, + 9495, + 9496, + 9497, + 9498, + 9499, + 9500, + 9501, + 9502, + 9503, + 9504, + 9505, + 9506, + 9507, + 9508, + 9509, + 9510, + 9511, + 9512, + 9513, + 9514, + 9515, + 9516, + 9517, + 9518, + 9519, + 9520, + 9521, + 9522, + 9523, + 9524, + 9525, + 9526, + 9527, + 9528, + 9529, + 9530, + 9531, + 9532, + 9533, + 9534, + 9535, + 9536, + 9537, + 9538, + 9539, + 9540, + 9541, + 9542, + 9543, + 9544, + 9545, + 9546, + 9547, + 9548, + 9549, + 9550, + 9551, + 9552, + 9553, + 9554, + 9555, + 9556, + 9557, + 9558, + 9559, + 9560, + 9561, + 9562, + 9563, + 9564, + 9565, + 9566, + 9567, + 9568, + 9569, + 9570, + 9571, + 9572, + 9573, + 9574, + 9575, + 9576, + 9577, + 9578, + 9579, + 9580, + 9581, + 9582, + 9583, + 9584, + 9585, + 9586, + 9587, + 9588, + 9589, + 9590, + 9591, + 9592, + 9593, + 9594, + 9595, + 9596, + 9597, + 9598, + 9599, + 9600, + 9601, + 9602, + 9603, + 9604, + 9605, + 9606, + 9607, + 9608, + 9609, + 9610, + 9611, + 9612, + 9613, + 9614, + 9615, + 9616, + 9617, + 9618, + 9619, + 9620, + 9621, + 9622, + 9623, + 9624, + 9625, + 9626, + 9627, + 9628, + 9629, + 9630, + 9631, + 9632, + 9633, + 9634, + 9635, + 9636, + 9637, + 9638, + 9639, + 9640, + 9641, + 9642, + 9643, + 9644, + 9645, + 9646, + 9647, + 9648, + 9649, + 9650, + 9651, + 9652, + 9653, + 9654, + 9655, + 9656, + 9657, + 9658, + 9659, + 9660, + 9661, + 9662, + 9663, + 9664, + 9665, + 9666, + 9667, + 9668, + 9669, + 9670, + 9671, + 9672, + 9673, + 9674, + 9675, + 9676, + 9677, + 9678, + 9679, + 9680, + 9681, + 9682, + 9683, + 9684, + 9685, + 9686, + 9687, + 9688, + 9689, + 9690, + 9691, + 9692, + 9693, + 9694, + 9695, + 9696, + 9697, + 9698, + 9699, + 9700, + 9701, + 9702, + 9703, + 9704, + 9705, + 9706, + 9707, + 9708, + 9709, + 9710, + 9711, + 9712, + 9713, + 9714, + 9715, + 9716, + 9717, + 9718, + 9719, + 9720, + 9721, + 9722, + 9723, + 9724, + 9725, + 9726, + 9727, + 9728, + 9729, + 9730, + 9731, + 9732, + 9733, + 9734, + 9735, + 9736, + 9737, + 9738, + 9739, + 9740, + 9741, + 9742, + 9743, + 9744, + 9745, + 9746, + 9747, + 9748, + 9749, + 9750, + 9751, + 9752, + 9753, + 9754, + 9755, + 9756, + 9757, + 9758, + 9759, + 9760, + 9761, + 9762, + 9763, + 9764, + 9765, + 9766, + 9767, + 9768, + 9769, + 9770, + 9771, + 9772, + 9773, + 9774, + 9775, + 9776, + 9777, + 9778, + 9779, + 9780, + 9781, + 9782, + 9783, + 9784, + 9785, + 9786, + 9787, + 9788, + 9789, + 9790, + 9791, + 9792, + 9793, + 9794, + 9795, + 9796, + 9797, + 9798, + 9799, + 9800, + 9801, + 9802, + 9803, + 9804, + 9805, + 9806, + 9807, + 9808, + 9809, + 9810, + 9811, + 9812, + 9813, + 9814, + 9815, + 9816, + 9817, + 9818, + 9819, + 9820, + 9821, + 9822, + 9823, + 9824, + 9825, + 9826, + 9827, + 9828, + 9829, + 9830, + 9831, + 9832, + 9833, + 9834, + 9835, + 9836, + 9837, + 9838, + 9839, + 9840, + 9841, + 9842, + 9843, + 9844, + 9845, + 9846, + 9847, + 9848, + 9849, + 9850, + 9851, + 9852, + 9853, + 9854, + 9855, + 9856, + 9857, + 9858, + 9859, + 9860, + 9861, + 9862, + 9863, + 9864, + 9865, + 9866, + 9867, + 9868, + 9869, + 9870, + 9871, + 9872, + 9873, + 9874, + 9875, + 9876, + 9877, + 9878, + 9879, + 9880, + 9881, + 9882, + 9883, + 9884, + 9885, + 9886, + 9887, + 9888, + 9889, + 9890, + 9891, + 9892, + 9893, + 9894, + 9895, + 9896, + 9897, + 9898, + 9899, + 9900, + 9901, + 9902, + 9903, + 9904, + 9905, + 9906, + 9907, + 9908, + 9909, + 9910, + 9911, + 9912, + 9913, + 9914, + 9915, + 9916, + 9917, + 9918, + 9919, + 9920, + 9921, + 9922, + 9923, + 9924, + 9925, + 9926, + 9927, + 9928, + 9929, + 9930, + 9931, + 9932, + 9933, + 9934, + 9935, + 9936, + 9937, + 9938, + 9939, + 9940, + 9941, + 9942, + 9943, + 9944, + 9945, + 9946, + 9947, + 9948, + 9949, + 9950, + 9951, + 9952, + 9953, + 9954, + 9955, + 9956, + 9957, + 9958, + 9959, + 9960, + 9961, + 9962, + 9963, + 9964, + 9965, + 9966, + 9967, + 9968, + 9969, + 9970, + 9971, + 9972, + 9973, + 9974, + 9975, + 9976, + 9977, + 9978, + 9979, + 9980, + 9981, + 9982, + 9983, + 9984, + 9985, + 9986, + 9987, + 9988, + 9989, + 9990, + 9991, + 9992, + 9993, + 9994, + 9995, + 9996, + 9997, + 9998, + 9999, + 10000, + 10001, + 10002, + 10003, + 10004, + 10005, + 10006, + 10007, + 10008, + 10009, + 10010, + 10011, + 10012, + 10013, + 10014, + 10015, + 10016, + 10017, + 10018, + 10019, + 10020, + 10021, + 10022, + 10023, + 10024, + 10025, + 10026, + 10027, + 10028, + 10029, + 10030, + 10031, + 10032, + 10033, + 10034, + 10035, + 10036, + 10037, + 10038, + 10039, + 10040, + 10041, + 10042, + 10043, + 10044, + 10045, + 10046, + 10047, + 10048, + 10049, + 10050, + 10051, + 10052, + 10053, + 10054, + 10055, + 10056, + 10057, + 10058, + 10059, + 10060, + 10061, + 10062, + 10063, + 10064, + 10065, + 10066, + 10067, + 10068, + 10069, + 10070, + 10071, + 10072, + 10073, + 10074, + 10075, + 10076, + 10077, + 10078, + 10079, + 10080, + 10081, + 10082, + 10083, + 10084, + 10085, + 10086, + 10087, + 10088, + 10089, + 10090, + 10091, + 10092, + 10093, + 10094, + 10095, + 10096, + 10097, + 10098, + 10099, + 10100, + 10101, + 10102, + 10103, + 10104, + 10105, + 10106, + 10107, + 10108, + 10109, + 10110, + 10111, + 10112, + 10113, + 10114, + 10115, + 10116, + 10117, + 10118, + 10119, + 10120, + 10121, + 10122, + 10123, + 10124, + 10125, + 10126, + 10127, + 10128, + 10129, + 10130, + 10131, + 10132, + 10133, + 10134, + 10135, + 10136, + 10137, + 10138, + 10139, + 10140, + 10141, + 10142, + 10143, + 10144, + 10145, + 10146, + 10147, + 10148, + 10149, + 10150, + 10151, + 10152, + 10153, + 10154, + 10155, + 10156, + 10157, + 10158, + 10159, + 10160, + 10161, + 10162, + 10163, + 10164, + 10165, + 10166, + 10167, + 10168, + 10169, + 10170, + 10171, + 10172, + 10173, + 10174, + 10175, + 10176, + 10177, + 10178, + 10179, + 10180, + 10181, + 10182, + 10183, + 10184, + 10185, + 10186, + 10187, + 10188, + 10189, + 10190, + 10191, + 10192, + 10193, + 10194, + 10195, + 10196, + 10197, + 10198, + 10199, + 10200, + 10201, + 10202, + 10203, + 10204, + 10205, + 10206, + 10207, + 10208, + 10209, + 10210, + 10211, + 10212, + 10213, + 10214, + 10215, + 10216, + 10217, + 10218, + 10219, + 10220, + 10221, + 10222, + 10223, + 10224, + 10225, + 10226, + 10227, + 10228, + 10229, + 10230, + 10231, + 10232, + 10233, + 10234, + 10235, + 10236, + 10237, + 10238, + 10239, + 10240, + 10241, + 10242, + 10243, + 10244, + 10245, + 10246, + 10247, + 10248, + 10249, + 10250, + 10251, + 10252, + 10253, + 10254, + 10255, + 10256, + 10257, + 10258, + 10259, + 10260, + 10261, + 10262, + 10263, + 10264, + 10265, + 10266, + 10267, + 10268, + 10269, + 10270, + 10271, + 10272, + 10273, + 10274, + 10275, + 10276, + 10277, + 10278, + 10279, + 10280, + 10281, + 10282, + 10283, + 10284, + 10285, + 10286, + 10287, + 10288, + 10289, + 10290, + 10291, + 10292, + 10293, + 10294, + 10295, + 10296, + 10297, + 10298, + 10299, + 10300, + 10301, + 10302, + 10303, + 10304, + 10305, + 10306, + 10307, + 10308, + 10309, + 10310, + 10311, + 10312, + 10313, + 10314, + 10315, + 10316, + 10317, + 10318, + 10319, + 10320, + 10321, + 10322, + 10323, + 10324, + 10325, + 10326, + 10327, + 10328, + 10329, + 10330, + 10331, + 10332, + 10333, + 10334, + 10335, + 10336, + 10337, + 10338, + 10339, + 10340, + 10341, + 10342, + 10343, + 10344, + 10345, + 10346, + 10347, + 10348, + 10349, + 10350, + 10351, + 10352, + 10353, + 10354, + 10355, + 10356, + 10357, + 10358, + 10359, + 10360, + 10361, + 10362, + 10363, + 10364, + 10365, + 10366, + 10367, + 10368, + 10369, + 10370, + 10371, + 10372, + 10373, + 10374, + 10375, + 10376, + 10377, + 10378, + 10379, + 10380, + 10381, + 10382, + 10383, + 10384, + 10385, + 10386, + 10387, + 10388, + 10389, + 10390, + 10391, + 10392, + 10393, + 10394, + 10395, + 10396, + 10397, + 10398, + 10399, + 10400, + 10401, + 10402, + 10403, + 10404, + 10405, + 10406, + 10407, + 10408, + 10409, + 10410, + 10411, + 10412, + 10413, + 10414, + 10415, + 10416, + 10417, + 10418, + 10419, + 10420, + 10421, + 10422, + 10423, + 10424, + 10425, + 10426, + 10427, + 10428, + 10429, + 10430, + 10431, + 10432, + 10433, + 10434, + 10435, + 10436, + 10437, + 10438, + 10439, + 10440, + 10441, + 10442, + 10443, + 10444, + 10445, + 10446, + 10447, + 10448, + 10449, + 10450, + 10451, + 10452, + 10453, + 10454, + 10455, + 10456, + 10457, + 10458, + 10459, + 10460, + 10461, + 10462, + 10463, + 10464, + 10465, + 10466, + 10467, + 10468, + 10469, + 10470, + 10471, + 10472, + 10473, + 10474, + 10475, + 10476, + 10477, + 10478, + 10479, + 10480, + 10481, + 10482, + 10483, + 10484, + 10485, + 10486, + 10487, + 10488, + 10489, + 10490, + 10491, + 10492, + 10493, + 10494, + 10495, + 10496, + 10497, + 10498, + 10499, + 10500, + 10501, + 10502, + 10503, + 10504, + 10505, + 10506, + 10507, + 10508, + 10509, + 10510, + 10511, + 10512, + 10513, + 10514, + 10515, + 10516, + 10517, + 10518, + 10519, + 10520, + 10521, + 10522, + 10523, + 10524, + 10525, + 10526, + 10527, + 10528, + 10529, + 10530, + 10531, + 10532, + 10533, + 10534, + 10535, + 10536, + 10537, + 10538, + 10539, + 10540, + 10541, + 10542, + 10543, + 10544, + 10545, + 10546, + 10547, + 10548, + 10549, + 10550, + 10551, + 10552, + 10553, + 10554, + 10555, + 10556, + 10557, + 10558, + 10559, + 10560, + 10561, + 10562, + 10563, + 10564, + 10565, + 10566, + 10567, + 10568, + 10569, + 10570, + 10571, + 10572, + 10573, + 10574, + 10575, + 10576, + 10577, + 10578, + 10579, + 10580, + 10581, + 10582, + 10583, + 10584, + 10585, + 10586, + 10587, + 10588, + 10589, + 10590, + 10591, + 10592, + 10593, + 10594, + 10595, + 10596, + 10597, + 10598, + 10599, + 10600, + 10601, + 10602, + 10603, + 10604, + 10605, + 10606, + 10607, + 10608, + 10609, + 10610, + 10611, + 10612, + 10613, + 10614, + 10615, + 10616, + 10617, + 10618, + 10619, + 10620, + 10621, + 10622, + 10623, + 10624, + 10625, + 10626, + 10627, + 10628, + 10629, + 10630, + 10631, + 10632, + 10633, + 10634, + 10635, + 10636, + 10637, + 10638, + 10639, + 10640, + 10641, + 10642, + 10643, + 10644, + 10645, + 10646, + 10647, + 10648, + 10649, + 10650, + 10651, + 10652, + 10653, + 10654, + 10655, + 10656, + 10657, + 10658, + 10659, + 10660, + 10661, + 10662, + 10663, + 10664, + 10665, + 10666, + 10667, + 10668, + 10669, + 10670, + 10671, + 10672, + 10673, + 10674, + 10675, + 10676, + 10677, + 10678, + 10679, + 10680, + 10681, + 10682, + 10683, + 10684, + 10685, + 10686, + 10687, + 10688, + 10689, + 10690, + 10691, + 10692, + 10693, + 10694, + 10695, + 10696, + 10697, + 10698, + 10699, + 10700, + 10701, + 10702, + 10703, + 10704, + 10705, + 10706, + 10707, + 10708, + 10709, + 10710, + 10711, + 10712, + 10713, + 10714, + 10715, + 10716, + 10717, + 10718, + 10719, + 10720, + 10721, + 10722, + 10723, + 10724, + 10725, + 10726, + 10727, + 10728, + 10729, + 10730, + 10731, + 10732, + 10733, + 10734, + 10735, + 10736, + 10737, + 10738, + 10739, + 10740, + 10741, + 10742, + 10743, + 10744, + 10745, + 10746, + 10747, + 10748, + 10749, + 10750, + 10751, + 10752, + 10753, + 10754, + 10755, + 10756, + 10757, + 10758, + 10759, + 10760, + 10761, + 10762, + 10763, + 10764, + 10765, + 10766, + 10767, + 10768, + 10769, + 10770, + 10771, + 10772, + 10773, + 10774, + 10775, + 10776, + 10777, + 10778, + 10779, + 10780, + 10781, + 10782, + 10783, + 10784, + 10785, + 10786, + 10787, + 10788, + 10789, + 10790, + 10791, + 10792, + 10793, + 10794, + 10795, + 10796, + 10797, + 10798, + 10799, + 10800, + 10801, + 10802, + 10803, + 10804, + 10805, + 10806, + 10807, + 10808, + 10809, + 10810, + 10811, + 10812, + 10813, + 10814, + 10815, + 10816, + 10817, + 10818, + 10819, + 10820, + 10821, + 10822, + 10823, + 10824, + 10825, + 10826, + 10827, + 10828, + 10829, + 10830, + 10831, + 10832, + 10833, + 10834, + 10835, + 10836, + 10837, + 10838, + 10839, + 10840, + 10841, + 10842, + 10843, + 10844, + 10845, + 10846, + 10847, + 10848, + 10849, + 10850, + 10851, + 10852, + 10853, + 10854, + 10855, + 10856, + 10857, + 10858, + 10859, + 10860, + 10861, + 10862, + 10863, + 10864, + 10865, + 10866, + 10867, + 10868, + 10869, + 10870, + 10871, + 10872, + 10873, + 10874, + 10875, + 10876, + 10877, + 10878, + 10879, + 10880, + 10881, + 10882, + 10883, + 10884, + 10885, + 10886, + 10887, + 10888, + 10889, + 10890, + 10891, + 10892, + 10893, + 10894, + 10895, + 10896, + 10897, + 10898, + 10899, + 10900, + 10901, + 10902, + 10903, + 10904, + 10905, + 10906, + 10907, + 10908, + 10909, + 10910, + 10911, + 10912, + 10913, + 10914, + 10915, + 10916, + 10917, + 10918, + 10919, + 10920, + 10921, + 10922, + 10923, + 10924, + 10925, + 10926, + 10927, + 10928, + 10929, + 10930, + 10931, + 10932, + 10933, + 10934, + 10935, + 10936, + 10937, + 10938, + 10939, + 10940, + 10941, + 10942, + 10943, + 10944, + 10945, + 10946, + 10947, + 10948, + 10949, + 10950, + 10951, + 10952, + 10953, + 10954, + 10955, + 10956, + 10957, + 10958, + 10959, + 10960, + 10961, + 10962, + 10963, + 10964, + 10965, + 10966, + 10967, + 10968, + 10969, + 10970, + 10971, + 10972, + 10973, + 10974, + 10975, + 10976, + 10977, + 10978, + 10979, + 10980, + 10981, + 10982, + 10983, + 10984, + 10985, + 10986, + 10987, + 10988, + 10989, + 10990, + 10991, + 10992, + 10993, + 10994, + 10995, + 10996, + 10997, + 10998, + 10999, + 11000, + 11001, + 11002, + 11003, + 11004, + 11005, + 11006, + 11007, + 11008, + 11009, + 11010, + 11011, + 11012, + 11013, + 11014, + 11015, + 11016, + 11017, + 11018, + 11019, + 11020, + 11021, + 11022, + 11023, + 11024, + 11025, + 11026, + 11027, + 11028, + 11029, + 11030, + 11031, + 11032, + 11033, + 11034, + 11035, + 11036, + 11037, + 11038, + 11039, + 11040, + 11041, + 11042, + 11043, + 11044, + 11045, + 11046, + 11047, + 11048, + 11049, + 11050, + 11051, + 11052, + 11053, + 11054, + 11055, + 11056, + 11057, + 11058, + 11059, + 11060, + 11061, + 11062, + 11063, + 11064, + 11065, + 11066, + 11067, + 11068, + 11069, + 11070, + 11071, + 11072, + 11073, + 11074, + 11075, + 11076, + 11077, + 11078, + 11079, + 11080, + 11081, + 11082, + 11083, + 11084, + 11085, + 11086, + 11087, + 11088, + 11089, + 11090, + 11091, + 11092, + 11093, + 11094, + 11095, + 11096, + 11097, + 11098, + 11099, + 11100, + 11101, + 11102, + 11103, + 11104, + 11105, + 11106, + 11107, + 11108, + 11109, + 11110, + 11111, + 11112, + 11113, + 11114, + 11115, + 11116, + 11117, + 11118, + 11119, + 11120, + 11121, + 11122, + 11123, + 11124, + 11125, + 11126, + 11127, + 11128, + 11129, + 11130, + 11131, + 11132, + 11133, + 11134, + 11135, + 11136, + 11137, + 11138, + 11139, + 11140, + 11141, + 11142, + 11143, + 11144, + 11145, + 11146, + 11147, + 11148, + 11149, + 11150, + 11151, + 11152, + 11153, + 11154, + 11155, + 11156, + 11157, + 11158, + 11159, + 11160, + 11161, + 11162, + 11163, + 11164, + 11165, + 11166, + 11167, + 11168, + 11169, + 11170, + 11171, + 11172, + 11173, + 11174, + 11175, + 11176, + 11177, + 11178, + 11179, + 11180, + 11181, + 11182, + 11183, + 11184, + 11185, + 11186, + 11187, + 11188, + 11189, + 11190, + 11191, + 11192, + 11193, + 11194, + 11195, + 11196, + 11197, + 11198, + 11199, + 11200, + 11201, + 11202, + 11203, + 11204, + 11205, + 11206, + 11207, + 11208, + 11209, + 11210, + 11211, + 11212, + 11213, + 11214, + 11215, + 11216, + 11217, + 11218, + 11219, + 11220, + 11221, + 11222, + 11223, + 11224, + 11225, + 11226, + 11227, + 11228, + 11229, + 11230, + 11231, + 11232, + 11233, + 11234, + 11235, + 11236, + 11237, + 11238, + 11239, + 11240, + 11241, + 11242, + 11243, + 11244, + 11245, + 11246, + 11247, + 11248, + 11249, + 11250, + 11251, + 11252, + 11253, + 11254, + 11255, + 11256, + 11257, + 11258, + 11259, + 11260, + 11261, + 11262, + 11263, + 11264, + 11265, + 11266, + 11267, + 11268, + 11269, + 11270, + 11271, + 11272, + 11273, + 11274, + 11275, + 11276, + 11277, + 11278, + 11279, + 11280, + 11281, + 11282, + 11283, + 11284, + 11285, + 11286, + 11287, + 11288, + 11289, + 11290, + 11291, + 11292, + 11293, + 11294, + 11295, + 11296, + 11297, + 11298, + 11299, + 11300, + 11301, + 11302, + 11303, + 11304, + 11305, + 11306, + 11307, + 11308, + 11309, + 11310, + 11311, + 11312, + 11313, + 11314, + 11315, + 11316, + 11317, + 11318, + 11319, + 11320, + 11321, + 11322, + 11323, + 11324, + 11325, + 11326, + 11327, + 11328, + 11329, + 11330, + 11331, + 11332, + 11333, + 11334, + 11335, + 11336, + 11337, + 11338, + 11339, + 11340, + 11341, + 11342, + 11343, + 11344, + 11345, + 11346, + 11347, + 11348, + 11349, + 11350, + 11351, + 11352, + 11353, + 11354, + 11355, + 11356, + 11357, + 11358, + 11359, + 11360, + 11361, + 11362, + 11363, + 11364, + 11365, + 11366, + 11367, + 11368, + 11369, + 11370, + 11371, + 11372, + 11373, + 11374, + 11375, + 11376, + 11377, + 11378, + 11379, + 11380, + 11381, + 11382, + 11383, + 11384, + 11385, + 11386, + 11387, + 11388, + 11389, + 11390, + 11391, + 11392, + 11393, + 11394, + 11395, + 11396, + 11397, + 11398, + 11399, + 11400, + 11401, + 11402, + 11403, + 11404, + 11405, + 11406, + 11407, + 11408, + 11409, + 11410, + 11411, + 11412, + 11413, + 11414, + 11415, + 11416, + 11417, + 11418, + 11419, + 11420, + 11421, + 11422, + 11423, + 11424, + 11425, + 11426, + 11427, + 11428, + 11429, + 11430, + 11431, + 11432, + 11433, + 11434, + 11435, + 11436, + 11437, + 11438, + 11439, + 11440, + 11441, + 11442, + 11443, + 11444, + 11445, + 11446, + 11447, + 11448, + 11449, + 11450, + 11451, + 11452, + 11453, + 11454, + 11455, + 11456, + 11457, + 11458, + 11459, + 11460, + 11461, + 11462, + 11463, + 11464, + 11465, + 11466, + 11467, + 11468, + 11469, + 11470, + 11471, + 11472, + 11473, + 11474, + 11475, + 11476, + 11477, + 11478, + 11479, + 11480, + 11481, + 11482, + 11483, + 11484, + 11485, + 11486, + 11487, + 11488, + 11489, + 11490, + 11491, + 11492, + 11493, + 11494, + 11495, + 11496, + 11497, + 11498, + 11499, + 11500, + 11501, + 11502, + 11503, + 11504, + 11505, + 11506, + 11507, + 11508, + 11509, + 11510, + 11511, + 11512, + 11513, + 11514, + 11515, + 11516, + 11517, + 11518, + 11519, + 11520, + 11521, + 11522, + 11523, + 11524, + 11525, + 11526, + 11527, + 11528, + 11529, + 11530, + 11531, + 11532, + 11533, + 11534, + 11535, + 11536, + 11537, + 11538, + 11539, + 11540, + 11541, + 11542, + 11543, + 11544, + 11545, + 11546, + 11547, + 11548, + 11549, + 11550, + 11551, + 11552, + 11553, + 11554, + 11555, + 11556, + 11557, + 11558, + 11559, + 11560, + 11561, + 11562, + 11563, + 11564, + 11565, + 11566, + 11567, + 11568, + 11569, + 11570, + 11571, + 11572, + 11573, + 11574, + 11575, + 11576, + 11577, + 11578, + 11579, + 11580, + 11581, + 11582, + 11583, + 11584, + 11585, + 11586, + 11587, + 11588, + 11589, + 11590, + 11591, + 11592, + 11593, + 11594, + 11595, + 11596, + 11597, + 11598, + 11599, + 11600, + 11601, + 11602, + 11603, + 11604, + 11605, + 11606, + 11607, + 11608, + 11609, + 11610, + 11611, + 11612, + 11613, + 11614, + 11615, + 11616, + 11617, + 11618, + 11619, + 11620, + 11621, + 11622, + 11623, + 11624, + 11625, + 11626, + 11627, + 11628, + 11629, + 11630, + 11631, + 11632, + 11633, + 11634, + 11635, + 11636, + 11637, + 11638, + 11639, + 11640, + 11641, + 11642, + 11643, + 11644, + 11645, + 11646, + 11647, + 11648, + 11649, + 11650, + 11651, + 11652, + 11653, + 11654, + 11655, + 11656, + 11657, + 11658, + 11659, + 11660, + 11661, + 11662, + 11663, + 11664, + 11665, + 11666, + 11667, + 11668, + 11669, + 11670, + 11671, + 11672, + 11673, + 11674, + 11675, + 11676, + 11677, + 11678, + 11679, + 11680, + 11681, + 11682, + 11683, + 11684, + 11685, + 11686, + 11687, + 11688, + 11689, + 11690, + 11691, + 11692, + 11693, + 11694, + 11695, + 11696, + 11697, + 11698, + 11699, + 11700, + 11701, + 11702, + 11703, + 11704, + 11705, + 11706, + 11707, + 11708, + 11709, + 11710, + 11711, + 11712, + 11713, + 11714, + 11715, + 11716, + 11717, + 11718, + 11719, + 11720, + 11721, + 11722, + 11723, + 11724, + 11725, + 11726, + 11727, + 11728, + 11729, + 11730, + 11731, + 11732, + 11733, + 11734, + 11735, + 11736, + 11737, + 11738, + 11739, + 11740, + 11741, + 11742, + 11743, + 11744, + 11745, + 11746, + 11747, + 11748, + 11749, + 11750, + 11751, + 11752, + 11753, + 11754, + 11755, + 11756, + 11757, + 11758, + 11759, + 11760, + 11761, + 11762, + 11763, + 11764, + 11765, + 11766, + 11767, + 11768, + 11769, + 11770, + 11771, + 11772, + 11773, + 11774, + 11775, + 11776, + 11777, + 11778, + 11779, + 11780, + 11781, + 11782, + 11783, + 11784, + 11785, + 11786, + 11787, + 11788, + 11789, + 11790, + 11791, + 11792, + 11793, + 11794, + 11795, + 11796, + 11797, + 11798, + 11799, + 11800, + 11801, + 11802, + 11803, + 11804, + 11805, + 11806, + 11807, + 11808, + 11809, + 11810, + 11811, + 11812, + 11813, + 11814, + 11815, + 11816, + 11817, + 11818, + 11819, + 11820, + 11821, + 11822, + 11823, + 11824, + 11825, + 11826, + 11827, + 11828, + 11829, + 11830, + 11831, + 11832, + 11833, + 11834, + 11835, + 11836, + 11837, + 11838, + 11839, + 11840, + 11841, + 11842, + 11843, + 11844, + 11845, + 11846, + 11847, + 11848, + 11849, + 11850, + 11851, + 11852, + 11853, + 11854, + 11855, + 11856, + 11857, + 11858, + 11859, + 11860, + 11861, + 11862, + 11863, + 11864, + 11865, + 11866, + 11867, + 11868, + 11869, + 11870, + 11871, + 11872, + 11873, + 11874, + 11875, + 11876, + 11877, + 11878, + 11879, + 11880, + 11881, + 11882, + 11883, + 11884, + 11885, + 11886, + 11887, + 11888, + 11889, + 11890, + 11891, + 11892, + 11893, + 11894, + 11895, + 11896, + 11897, + 11898, + 11899, + 11900, + 11901, + 11902, + 11903, + 11904, + 11905, + 11906, + 11907, + 11908, + 11909, + 11910, + 11911, + 11912, + 11913, + 11914, + 11915, + 11916, + 11917, + 11918, + 11919, + 11920, + 11921, + 11922, + 11923, + 11924, + 11925, + 11926, + 11927, + 11928, + 11929, + 11930, + 11931, + 11932, + 11933, + 11934, + 11935, + 11936, + 11937, + 11938, + 11939, + 11940, + 11941, + 11942, + 11943, + 11944, + 11945, + 11946, + 11947, + 11948, + 11949, + 11950, + 11951, + 11952, + 11953, + 11954, + 11955, + 11956, + 11957, + 11958, + 11959, + 11960, + 11961, + 11962, + 11963, + 11964, + 11965, + 11966, + 11967, + 11968, + 11969, + 11970, + 11971, + 11972, + 11973, + 11974, + 11975, + 11976, + 11977, + 11978, + 11979, + 11980, + 11981, + 11982, + 11983, + 11984, + 11985, + 11986, + 11987, + 11988, + 11989, + 11990, + 11991, + 11992, + 11993, + 11994, + 11995, + 11996, + 11997, + 11998, + 11999, + 12000, + 12001, + 12002, + 12003, + 12004, + 12005, + 12006, + 12007, + 12008, + 12009, + 12010, + 12011, + 12012, + 12013, + 12014, + 12015, + 12016, + 12017, + 12018, + 12019, + 12020, + 12021, + 12022, + 12023, + 12024, + 12025, + 12026, + 12027, + 12028, + 12029, + 12030, + 12031, + 12032, + 12033, + 12034, + 12035, + 12036, + 12037, + 12038, + 12039, + 12040, + 12041, + 12042, + 12043, + 12044, + 12045, + 12046, + 12047, + 12048, + 12049, + 12050, + 12051, + 12052, + 12053, + 12054, + 12055, + 12056, + 12057, + 12058, + 12059, + 12060, + 12061, + 12062, + 12063, + 12064, + 12065, + 12066, + 12067, + 12068, + 12069, + 12070, + 12071, + 12072, + 12073, + 12074, + 12075, + 12076, + 12077, + 12078, + 12079, + 12080, + 12081, + 12082, + 12083, + 12084, + 12085, + 12086, + 12087, + 12088, + 12089, + 12090, + 12091, + 12092, + 12093, + 12094, + 12095, + 12096, + 12097, + 12098, + 12099, + 12100, + 12101, + 12102, + 12103, + 12104, + 12105, + 12106, + 12107, + 12108, + 12109, + 12110, + 12111, + 12112, + 12113, + 12114, + 12115, + 12116, + 12117, + 12118, + 12119, + 12120, + 12121, + 12122, + 12123, + 12124, + 12125, + 12126, + 12127, + 12128, + 12129, + 12130, + 12131, + 12132, + 12133, + 12134, + 12135, + 12136, + 12137, + 12138, + 12139, + 12140, + 12141, + 12142, + 12143, + 12144, + 12145, + 12146, + 12147, + 12148, + 12149, + 12150, + 12151, + 12152, + 12153, + 12154, + 12155, + 12156, + 12157, + 12158, + 12159, + 12160, + 12161, + 12162, + 12163, + 12164, + 12165, + 12166, + 12167, + 12168, + 12169, + 12170, + 12171, + 12172, + 12173, + 12174, + 12175, + 12176, + 12177, + 12178, + 12179, + 12180, + 12181, + 12182, + 12183, + 12184, + 12185, + 12186, + 12187, + 12188, + 12189, + 12190, + 12191, + 12192, + 12193, + 12194, + 12195, + 12196, + 12197, + 12198, + 12199, + 12200, + 12201, + 12202, + 12203, + 12204, + 12205, + 12206, + 12207, + 12208, + 12209, + 12210, + 12211, + 12212, + 12213, + 12214, + 12215, + 12216, + 12217, + 12218, + 12219, + 12220, + 12221, + 12222, + 12223, + 12224, + 12225, + 12226, + 12227, + 12228, + 12229, + 12230, + 12231, + 12232, + 12233, + 12234, + 12235, + 12236, + 12237, + 12238, + 12239, + 12240, + 12241, + 12242, + 12243, + 12244, + 12245, + 12246, + 12247, + 12248, + 12249, + 12250, + 12251, + 12252, + 12253, + 12254, + 12255, + 12256, + 12257, + 12258, + 12259, + 12260, + 12261, + 12262, + 12263, + 12264, + 12265, + 12266, + 12267, + 12268, + 12269, + 12270, + 12271, + 12272, + 12273, + 12274, + 12275, + 12276, + 12277, + 12278, + 12279, + 12280, + 12281, + 12282, + 12283, + 12284, + 12285, + 12286, + 12287, + 12288, + 12289, + 12290, + 12291, + 12292, + 12293, + 12294, + 12295, + 12296, + 12297, + 12298, + 12299, + 12300, + 12301, + 12302, + 12303, + 12304, + 12305, + 12306, + 12307, + 12308, + 12309, + 12310, + 12311, + 12312, + 12313, + 12314, + 12315, + 12316, + 12317, + 12318, + 12319, + 12320, + 12321, + 12322, + 12323, + 12324, + 12325, + 12326, + 12327, + 12328, + 12329, + 12330, + 12331, + 12332, + 12333, + 12334, + 12335, + 12336, + 12337, + 12338, + 12339, + 12340, + 12341, + 12342, + 12343, + 12344, + 12345, + 12346, + 12347, + 12348, + 12349, + 12350, + 12351, + 12352, + 12353, + 12354, + 12355, + 12356, + 12357, + 12358, + 12359, + 12360, + 12361, + 12362, + 12363, + 12364, + 12365, + 12366, + 12367, + 12368, + 12369, + 12370, + 12371, + 12372, + 12373, + 12374, + 12375, + 12376, + 12377, + 12378, + 12379, + 12380, + 12381, + 12382, + 12383, + 12384, + 12385, + 12386, + 12387, + 12388, + 12389, + 12390, + 12391, + 12392, + 12393, + 12394, + 12395, + 12396, + 12397, + 12398, + 12399, + 12400, + 12401, + 12402, + 12403, + 12404, + 12405, + 12406, + 12407, + 12408, + 12409, + 12410, + 12411, + 12412, + 12413, + 12414, + 12415, + 12416, + 12417, + 12418, + 12419, + 12420, + 12421, + 12422, + 12423, + 12424, + 12425, + 12426, + 12427, + 12428, + 12429, + 12430, + 12431, + 12432, + 12433, + 12434, + 12435, + 12436, + 12437, + 12438, + 12439, + 12440, + 12441, + 12442, + 12443, + 12444, + 12445, + 12446, + 12447, + 12448, + 12449, + 12450, + 12451, + 12452, + 12453, + 12454, + 12455, + 12456, + 12457, + 12458, + 12459, + 12460, + 12461, + 12462, + 12463, + 12464, + 12465, + 12466, + 12467, + 12468, + 12469, + 12470, + 12471, + 12472, + 12473, + 12474, + 12475, + 12476, + 12477, + 12478, + 12479, + 12480, + 12481, + 12482, + 12483, + 12484, + 12485, + 12486, + 12487, + 12488, + 12489, + 12490, + 12491, + 12492, + 12493, + 12494, + 12495, + 12496, + 12497, + 12498, + 12499, + 12500, + 12501, + 12502, + 12503, + 12504, + 12505, + 12506, + 12507, + 12508, + 12509, + 12510, + 12511, + 12512, + 12513, + 12514, + 12515, + 12516, + 12517, + 12518, + 12519, + 12520, + 12521, + 12522, + 12523, + 12524, + 12525, + 12526, + 12527, + 12528, + 12529, + 12530, + 12531, + 12532, + 12533, + 12534, + 12535, + 12536, + 12537, + 12538, + 12539, + 12540, + 12541, + 12542, + 12543, + 12544, + 12545, + 12546, + 12547, + 12548, + 12549, + 12550, + 12551, + 12552, + 12553, + 12554, + 12555, + 12556, + 12557, + 12558, + 12559, + 12560, + 12561, + 12562, + 12563, + 12564, + 12565, + 12566, + 12567, + 12568, + 12569, + 12570, + 12571, + 12572, + 12573, + 12574, + 12575, + 12576, + 12577, + 12578, + 12579, + 12580, + 12581, + 12582, + 12583, + 12584, + 12585, + 12586, + 12587, + 12588, + 12589, + 12590, + 12591, + 12592, + 12593, + 12594, + 12595, + 12596, + 12597, + 12598, + 12599, + 12600, + 12601, + 12602, + 12603, + 12604, + 12605, + 12606, + 12607, + 12608, + 12609, + 12610, + 12611, + 12612, + 12613, + 12614, + 12615, + 12616, + 12617, + 12618, + 12619, + 12620, + 12621, + 12622, + 12623, + 12624, + 12625, + 12626, + 12627, + 12628, + 12629, + 12630, + 12631, + 12632, + 12633, + 12634, + 12635, + 12636, + 12637, + 12638, + 12639, + 12640, + 12641, + 12642, + 12643, + 12644, + 12645, + 12646, + 12647, + 12648, + 12649, + 12650, + 12651, + 12652, + 12653, + 12654, + 12655, + 12656, + 12657, + 12658, + 12659, + 12660, + 12661, + 12662, + 12663, + 12664, + 12665, + 12666, + 12667, + 12668, + 12669, + 12670, + 12671, + 12672, + 12673, + 12674, + 12675, + 12676, + 12677, + 12678, + 12679, + 12680, + 12681, + 12682, + 12683, + 12684, + 12685, + 12686, + 12687, + 12688, + 12689, + 12690, + 12691, + 12692, + 12693, + 12694, + 12695, + 12696, + 12697, + 12698, + 12699, + 12700, + 12701, + 12702, + 12703, + 12704, + 12705, + 12706, + 12707, + 12708, + 12709, + 12710, + 12711, + 12712, + 12713, + 12714, + 12715, + 12716, + 12717, + 12718, + 12719, + 12720, + 12721, + 12722, + 12723, + 12724, + 12725, + 12726, + 12727, + 12728, + 12729, + 12730, + 12731, + 12732, + 12733, + 12734, + 12735, + 12736, + 12737, + 12738, + 12739, + 12740, + 12741, + 12742, + 12743, + 12744, + 12745, + 12746, + 12747, + 12748, + 12749, + 12750, + 12751, + 12752, + 12753, + 12754, + 12755, + 12756, + 12757, + 12758, + 12759, + 12760, + 12761, + 12762, + 12763, + 12764, + 12765, + 12766, + 12767, + 12768, + 12769, + 12770, + 12771, + 12772, + 12773, + 12774, + 12775, + 12776, + 12777, + 12778, + 12779, + 12780, + 12781, + 12782, + 12783, + 12784, + 12785, + 12786, + 12787, + 12788, + 12789, + 12790, + 12791, + 12792, + 12793, + 12794, + 12795, + 12796, + 12797, + 12798, + 12799, + 12800, + 12801, + 12802, + 12803, + 12804, + 12805, + 12806, + 12807, + 12808, + 12809, + 12810, + 12811, + 12812, + 12813, + 12814, + 12815, + 12816, + 12817, + 12818, + 12819, + 12820, + 12821, + 12822, + 12823, + 12824, + 12825, + 12826, + 12827, + 12828, + 12829, + 12830, + 12831, + 12832, + 12833, + 12834, + 12835, + 12836, + 12837, + 12838, + 12839, + 12840, + 12841, + 12842, + 12843, + 12844, + 12845, + 12846, + 12847, + 12848, + 12849, + 12850, + 12851, + 12852, + 12853, + 12854, + 12855, + 12856, + 12857, + 12858, + 12859, + 12860, + 12861, + 12862, + 12863, + 12864, + 12865, + 12866, + 12867, + 12868, + 12869, + 12870, + 12871, + 12872, + 12873, + 12874, + 12875, + 12876, + 12877, + 12878, + 12879, + 12880, + 12881, + 12882, + 12883, + 12884, + 12885, + 12886, + 12887, + 12888, + 12889, + 12890, + 12891, + 12892, + 12893, + 12894, + 12895, + 12896, + 12897, + 12898, + 12899, + 12900, + 12901, + 12902, + 12903, + 12904, + 12905, + 12906, + 12907, + 12908, + 12909, + 12910, + 12911, + 12912, + 12913, + 12914, + 12915, + 12916, + 12917, + 12918, + 12919, + 12920, + 12921, + 12922, + 12923, + 12924, + 12925, + 12926, + 12927, + 12928, + 12929, + 12930, + 12931, + 12932, + 12933, + 12934, + 12935, + 12936, + 12937, + 12938, + 12939, + 12940, + 12941, + 12942, + 12943, + 12944, + 12945, + 12946, + 12947, + 12948, + 12949, + 12950, + 12951, + 12952, + 12953, + 12954, + 12955, + 12956, + 12957, + 12958, + 12959, + 12960, + 12961, + 12962, + 12963, + 12964, + 12965, + 12966, + 12967, + 12968, + 12969, + 12970, + 12971, + 12972, + 12973, + 12974, + 12975, + 12976, + 12977, + 12978, + 12979, + 12980, + 12981, + 12982, + 12983, + 12984, + 12985, + 12986, + 12987, + 12988, + 12989, + 12990, + 12991, + 12992, + 12993, + 12994, + 12995, + 12996, + 12997, + 12998, + 12999, + 13000, + 13001, + 13002, + 13003, + 13004, + 13005, + 13006, + 13007, + 13008, + 13009, + 13010, + 13011, + 13012, + 13013, + 13014, + 13015, + 13016, + 13017, + 13018, + 13019, + 13020, + 13021, + 13022, + 13023, + 13024, + 13025, + 13026, + 13027, + 13028, + 13029, + 13030, + 13031, + 13032, + 13033, + 13034, + 13035, + 13036, + 13037, + 13038, + 13039, + 13040, + 13041, + 13042, + 13043, + 13044, + 13045, + 13046, + 13047, + 13048, + 13049, + 13050, + 13051, + 13052, + 13053, + 13054, + 13055, + 13056, + 13057, + 13058, + 13059, + 13060, + 13061, + 13062, + 13063, + 13064, + 13065, + 13066, + 13067, + 13068, + 13069, + 13070, + 13071, + 13072, + 13073, + 13074, + 13075, + 13076, + 13077, + 13078, + 13079, + 13080, + 13081, + 13082, + 13083, + 13084, + 13085, + 13086, + 13087, + 13088, + 13089, + 13090, + 13091, + 13092, + 13093, + 13094, + 13095, + 13096, + 13097, + 13098, + 13099, + 13100, + 13101, + 13102, + 13103, + 13104, + 13105, + 13106, + 13107, + 13108, + 13109, + 13110, + 13111, + 13112, + 13113, + 13114, + 13115, + 13116, + 13117, + 13118, + 13119, + 13120, + 13121, + 13122, + 13123, + 13124, + 13125, + 13126, + 13127, + 13128, + 13129, + 13130, + 13131, + 13132, + 13133, + 13134, + 13135, + 13136, + 13137, + 13138, + 13139, + 13140, + 13141, + 13142, + 13143, + 13144, + 13145, + 13146, + 13147, + 13148, + 13149, + 13150, + 13151, + 13152, + 13153, + 13154, + 13155, + 13156, + 13157, + 13158, + 13159, + 13160, + 13161, + 13162, + 13163, + 13164, + 13165, + 13166, + 13167, + 13168, + 13169, + 13170, + 13171, + 13172, + 13173, + 13174, + 13175, + 13176, + 13177, + 13178, + 13179, + 13180, + 13181, + 13182, + 13183, + 13184, + 13185, + 13186, + 13187, + 13188, + 13189, + 13190, + 13191, + 13192, + 13193, + 13194, + 13195, + 13196, + 13197, + 13198, + 13199, + 13200, + 13201, + 13202, + 13203, + 13204, + 13205, + 13206, + 13207, + 13208, + 13209, + 13210, + 13211, + 13212, + 13213, + 13214, + 13215, + 13216, + 13217, + 13218, + 13219, + 13220, + 13221, + 13222, + 13223, + 13224, + 13225, + 13226, + 13227, + 13228, + 13229, + 13230, + 13231, + 13232, + 13233, + 13234, + 13235, + 13236, + 13237, + 13238, + 13239, + 13240, + 13241, + 13242, + 13243, + 13244, + 13245, + 13246, + 13247, + 13248, + 13249, + 13250, + 13251, + 13252, + 13253, + 13254, + 13255, + 13256, + 13257, + 13258, + 13259, + 13260, + 13261, + 13262, + 13263, + 13264, + 13265, + 13266, + 13267, + 13268, + 13269, + 13270, + 13271, + 13272, + 13273, + 13274, + 13275, + 13276, + 13277, + 13278, + 13279, + 13280, + 13281, + 13282, + 13283, + 13284, + 13285, + 13286, + 13287, + 13288, + 13289, + 13290, + 13291, + 13292, + 13293, + 13294, + 13295, + 13296, + 13297, + 13298, + 13299, + 13300, + 13301, + 13302, + 13303, + 13304, + 13305, + 13306, + 13307, + 13308, + 13309, + 13310, + 13311, + 13312, + 13313, + 13314, + 13315, + 13316, + 13317, + 13318, + 13319, + 13320, + 13321, + 13322, + 13323, + 13324, + 13325, + 13326, + 13327, + 13328, + 13329, + 13330, + 13331, + 13332, + 13333, + 13334, + 13335, + 13336, + 13337, + 13338, + 13339, + 13340, + 13341, + 13342, + 13343, + 13344, + 13345, + 13346, + 13347, + 13348, + 13349, + 13350, + 13351, + 13352, + 13353, + 13354, + 13355, + 13356, + 13357, + 13358, + 13359, + 13360, + 13361, + 13362, + 13363, + 13364, + 13365, + 13366, + 13367, + 13368, + 13369, + 13370, + 13371, + 13372, + 13373, + 13374, + 13375, + 13376, + 13377, + 13378, + 13379, + 13380, + 13381, + 13382, + 13383, + 13384, + 13385, + 13386, + 13387, + 13388, + 13389, + 13390, + 13391, + 13392, + 13393, + 13394, + 13395, + 13396, + 13397, + 13398, + 13399, + 13400, + 13401, + 13402, + 13403, + 13404, + 13405, + 13406, + 13407, + 13408, + 13409, + 13410, + 13411, + 13412, + 13413, + 13414, + 13415, + 13416, + 13417, + 13418, + 13419, + 13420, + 13421, + 13422, + 13423, + 13424, + 13425, + 13426, + 13427, + 13428, + 13429, + 13430, + 13431, + 13432, + 13433, + 13434, + 13435, + 13436, + 13437, + 13438, + 13439, + 13440, + 13441, + 13442, + 13443, + 13444, + 13445, + 13446, + 13447, + 13448, + 13449, + 13450, + 13451, + 13452, + 13453, + 13454, + 13455, + 13456, + 13457, + 13458, + 13459, + 13460, + 13461, + 13462, + 13463, + 13464, + 13465, + 13466, + 13467, + 13468, + 13469, + 13470, + 13471, + 13472, + 13473, + 13474, + 13475, + 13476, + 13477, + 13478, + 13479, + 13480, + 13481, + 13482, + 13483, + 13484, + 13485, + 13486, + 13487, + 13488, + 13489, + 13490, + 13491, + 13492, + 13493, + 13494, + 13495, + 13496, + 13497, + 13498, + 13499, + 13500, + 13501, + 13502, + 13503, + 13504, + 13505, + 13506, + 13507, + 13508, + 13509, + 13510, + 13511, + 13512, + 13513, + 13514, + 13515, + 13516, + 13517, + 13518, + 13519, + 13520, + 13521, + 13522, + 13523, + 13524, + 13525, + 13526, + 13527, + 13528, + 13529, + 13530, + 13531, + 13532, + 13533, + 13534, + 13535, + 13536, + 13537, + 13538, + 13539, + 13540, + 13541, + 13542, + 13543, + 13544, + 13545, + 13546, + 13547, + 13548, + 13549, + 13550, + 13551, + 13552, + 13553, + 13554, + 13555, + 13556, + 13557, + 13558, + 13559, + 13560, + 13561, + 13562, + 13563, + 13564, + 13565, + 13566, + 13567, + 13568, + 13569, + 13570, + 13571, + 13572, + 13573, + 13574, + 13575, + 13576, + 13577, + 13578, + 13579, + 13580, + 13581, + 13582, + 13583, + 13584, + 13585, + 13586, + 13587, + 13588, + 13589, + 13590, + 13591, + 13592, + 13593, + 13594, + 13595, + 13596, + 13597, + 13598, + 13599, + 13600, + 13601, + 13602, + 13603, + 13604, + 13605, + 13606, + 13607, + 13608, + 13609, + 13610, + 13611, + 13612, + 13613, + 13614, + 13615, + 13616, + 13617, + 13618, + 13619, + 13620, + 13621, + 13622, + 13623, + 13624, + 13625, + 13626, + 13627, + 13628, + 13629, + 13630, + 13631, + 13632, + 13633, + 13634, + 13635, + 13636, + 13637, + 13638, + 13639, + 13640, + 13641, + 13642, + 13643, + 13644, + 13645, + 13646, + 13647, + 13648, + 13649, + 13650, + 13651, + 13652, + 13653, + 13654, + 13655, + 13656, + 13657, + 13658, + 13659, + 13660, + 13661, + 13662, + 13663, + 13664, + 13665, + 13666, + 13667, + 13668, + 13669, + 13670, + 13671, + 13672, + 13673, + 13674, + 13675, + 13676, + 13677, + 13678, + 13679, + 13680, + 13681, + 13682, + 13683, + 13684, + 13685, + 13686, + 13687, + 13688, + 13689, + 13690, + 13691, + 13692, + 13693, + 13694, + 13695, + 13696, + 13697, + 13698, + 13699, + 13700, + 13701, + 13702, + 13703, + 13704, + 13705, + 13706, + 13707, + 13708, + 13709, + 13710, + 13711, + 13712, + 13713, + 13714, + 13715, + 13716, + 13717, + 13718, + 13719, + 13720, + 13721, + 13722, + 13723, + 13724, + 13725, + 13726, + 13727, + 13728, + 13729, + 13730, + 13731, + 13732, + 13733, + 13734, + 13735, + 13736, + 13737, + 13738, + 13739, + 13740, + 13741, + 13742, + 13743, + 13744, + 13745, + 13746, + 13747, + 13748, + 13749, + 13750, + 13751, + 13752, + 13753, + 13754, + 13755, + 13756, + 13757, + 13758, + 13759, + 13760, + 13761, + 13762, + 13763, + 13764, + 13765, + 13766, + 13767, + 13768, + 13769, + 13770, + 13771, + 13772, + 13773, + 13774, + 13775, + 13776, + 13777, + 13778, + 13779, + 13780, + 13781, + 13782, + 13783, + 13784, + 13785, + 13786, + 13787, + 13788, + 13789, + 13790, + 13791, + 13792, + 13793, + 13794, + 13795, + 13796, + 13797, + 13798, + 13799, + 13800, + 13801, + 13802, + 13803, + 13804, + 13805, + 13806, + 13807, + 13808, + 13809, + 13810, + 13811, + 13812, + 13813, + 13814, + 13815, + 13816, + 13817, + 13818, + 13819, + 13820, + 13821, + 13822, + 13823, + 13824, + 13825, + 13826, + 13827, + 13828, + 13829, + 13830, + 13831, + 13832, + 13833, + 13834, + 13835, + 13836, + 13837, + 13838, + 13839, + 13840, + 13841, + 13842, + 13843, + 13844, + 13845, + 13846, + 13847, + 13848, + 13849, + 13850, + 13851, + 13852, + 13853, + 13854, + 13855, + 13856, + 13857, + 13858, + 13859, + 13860, + 13861, + 13862, + 13863, + 13864, + 13865, + 13866, + 13867, + 13868, + 13869, + 13870, + 13871, + 13872, + 13873, + 13874, + 13875, + 13876, + 13877, + 13878, + 13879, + 13880, + 13881, + 13882, + 13883, + 13884, + 13885, + 13886, + 13887, + 13888, + 13889, + 13890, + 13891, + 13892, + 13893, + 13894, + 13895, + 13896, + 13897, + 13898, + 13899, + 13900, + 13901, + 13902, + 13903, + 13904, + 13905, + 13906, + 13907, + 13908, + 13909, + 13910, + 13911, + 13912, + 13913, + 13914, + 13915, + 13916, + 13917, + 13918, + 13919, + 13920, + 13921, + 13922, + 13923, + 13924, + 13925, + 13926, + 13927, + 13928, + 13929, + 13930, + 13931, + 13932, + 13933, + 13934, + 13935, + 13936, + 13937, + 13938, + 13939, + 13940, + 13941, + 13942, + 13943, + 13944, + 13945, + 13946, + 13947, + 13948, + 13949, + 13950, + 13951, + 13952, + 13953, + 13954, + 13955, + 13956, + 13957, + 13958, + 13959, + 13960, + 13961, + 13962, + 13963, + 13964, + 13965, + 13966, + 13967, + 13968, + 13969, + 13970, + 13971, + 13972, + 13973, + 13974, + 13975, + 13976, + 13977, + 13978, + 13979, + 13980, + 13981, + 13982, + 13983, + 13984, + 13985, + 13986, + 13987, + 13988, + 13989, + 13990, + 13991, + 13992, + 13993, + 13994, + 13995, + 13996, + 13997, + 13998, + 13999, + 14000, + 14001, + 14002, + 14003, + 14004, + 14005, + 14006, + 14007, + 14008, + 14009, + 14010, + 14011, + 14012, + 14013, + 14014, + 14015, + 14016, + 14017, + 14018, + 14019, + 14020, + 14021, + 14022, + 14023, + 14024, + 14025, + 14026, + 14027, + 14028, + 14029, + 14030, + 14031, + 14032, + 14033, + 14034, + 14035, + 14036, + 14037, + 14038, + 14039, + 14040, + 14041, + 14042, + 14043, + 14044, + 14045, + 14046, + 14047, + 14048, + 14049, + 14050, + 14051, + 14052, + 14053, + 14054, + 14055, + 14056, + 14057, + 14058, + 14059, + 14060, + 14061, + 14062, + 14063, + 14064, + 14065, + 14066, + 14067, + 14068, + 14069, + 14070, + 14071, + 14072, + 14073, + 14074, + 14075, + 14076, + 14077, + 14078, + 14079, + 14080, + 14081, + 14082, + 14083, + 14084, + 14085, + 14086, + 14087, + 14088, + 14089, + 14090, + 14091, + 14092, + 14093, + 14094, + 14095, + 14096, + 14097, + 14098, + 14099, + 14100, + 14101, + 14102, + 14103, + 14104, + 14105, + 14106, + 14107, + 14108, + 14109, + 14110, + 14111, + 14112, + 14113, + 14114, + 14115, + 14116, + 14117, + 14118, + 14119, + 14120, + 14121, + 14122, + 14123, + 14124, + 14125, + 14126, + 14127, + 14128, + 14129, + 14130, + 14131, + 14132, + 14133, + 14134, + 14135, + 14136, + 14137, + 14138, + 14139, + 14140, + 14141, + 14142, + 14143, + 14144, + 14145, + 14146, + 14147, + 14148, + 14149, + 14150, + 14151, + 14152, + 14153, + 14154, + 14155, + 14156, + 14157, + 14158, + 14159, + 14160, + 14161, + 14162, + 14163, + 14164, + 14165, + 14166, + 14167, + 14168, + 14169, + 14170, + 14171, + 14172, + 14173, + 14174, + 14175, + 14176, + 14177, + 14178, + 14179, + 14180, + 14181, + 14182, + 14183, + 14184, + 14185, + 14186, + 14187, + 14188, + 14189, + 14190, + 14191, + 14192, + 14193, + 14194, + 14195, + 14196, + 14197, + 14198, + 14199, + 14200, + 14201, + 14202, + 14203, + 14204, + 14205, + 14206, + 14207, + 14208, + 14209, + 14210, + 14211, + 14212, + 14213, + 14214, + 14215, + 14216, + 14217, + 14218, + 14219, + 14220, + 14221, + 14222, + 14223, + 14224, + 14225, + 14226, + 14227, + 14228, + 14229, + 14230, + 14231, + 14232, + 14233, + 14234, + 14235, + 14236, + 14237, + 14238, + 14239, + 14240, + 14241, + 14242, + 14243, + 14244, + 14245, + 14246, + 14247, + 14248, + 14249, + 14250, + 14251, + 14252, + 14253, + 14254, + 14255, + 14256, + 14257, + 14258, + 14259, + 14260, + 14261, + 14262, + 14263, + 14264, + 14265, + 14266, + 14267, + 14268, + 14269, + 14270, + 14271, + 14272, + 14273, + 14274, + 14275, + 14276, + 14277, + 14278, + 14279, + 14280, + 14281, + 14282, + 14283, + 14284, + 14285, + 14286, + 14287, + 14288, + 14289, + 14290, + 14291, + 14292, + 14293, + 14294, + 14295, + 14296, + 14297, + 14298, + 14299, + 14300, + 14301, + 14302, + 14303, + 14304, + 14305, + 14306, + 14307, + 14308, + 14309, + 14310, + 14311, + 14312, + 14313, + 14314, + 14315, + 14316, + 14317, + 14318, + 14319, + 14320, + 14321, + 14322, + 14323, + 14324, + 14325, + 14326, + 14327, + 14328, + 14329, + 14330, + 14331, + 14332, + 14333, + 14334, + 14335, + 14336, + 14337, + 14338, + 14339, + 14340, + 14341, + 14342, + 14343, + 14344, + 14345, + 14346, + 14347, + 14348, + 14349, + 14350, + 14351, + 14352, + 14353, + 14354, + 14355, + 14356, + 14357, + 14358, + 14359, + 14360, + 14361, + 14362, + 14363, + 14364, + 14365, + 14366, + 14367, + 14368, + 14369, + 14370, + 14371, + 14372, + 14373, + 14374, + 14375, + 14376, + 14377, + 14378, + 14379, + 14380, + 14381, + 14382, + 14383, + 14384, + 14385, + 14386, + 14387, + 14388, + 14389, + 14390, + 14391, + 14392, + 14393, + 14394, + 14395, + 14396, + 14397, + 14398, + 14399, + 14400, + 14401, + 14402, + 14403, + 14404, + 14405, + 14406, + 14407, + 14408, + 14409, + 14410, + 14411, + 14412, + 14413, + 14414, + 14415, + 14416, + 14417, + 14418, + 14419, + 14420, + 14421, + 14422, + 14423, + 14424, + 14425, + 14426, + 14427, + 14428, + 14429, + 14430, + 14431, + 14432, + 14433, + 14434, + 14435, + 14436, + 14437, + 14438, + 14439, + 14440, + 14441, + 14442, + 14443, + 14444, + 14445, + 14446, + 14447, + 14448, + 14449, + 14450, + 14451, + 14452, + 14453, + 14454, + 14455, + 14456, + 14457, + 14458, + 14459, + 14460, + 14461, + 14462, + 14463, + 14464, + 14465, + 14466, + 14467, + 14468, + 14469, + 14470, + 14471, + 14472, + 14473, + 14474, + 14475, + 14476, + 14477, + 14478, + 14479, + 14480, + 14481, + 14482, + 14483, + 14484, + 14485, + 14486, + 14487, + 14488, + 14489, + 14490, + 14491, + 14492, + 14493, + 14494, + 14495, + 14496, + 14497, + 14498, + 14499, + 14500, + 14501, + 14502, + 14503, + 14504, + 14505, + 14506, + 14507, + 14508, + 14509, + 14510, + 14511, + 14512, + 14513, + 14514, + 14515, + 14516, + 14517, + 14518, + 14519, + 14520, + 14521, + 14522, + 14523, + 14524, + 14525, + 14526, + 14527, + 14528, + 14529, + 14530, + 14531, + 14532, + 14533, + 14534, + 14535, + 14536, + 14537, + 14538, + 14539, + 14540, + 14541, + 14542, + 14543, + 14544, + 14545, + 14546, + 14547, + 14548, + 14549, + 14550, + 14551, + 14552, + 14553, + 14554, + 14555, + 14556, + 14557, + 14558, + 14559, + 14560, + 14561, + 14562, + 14563, + 14564, + 14565, + 14566, + 14567, + 14568, + 14569, + 14570, + 14571, + 14572, + 14573, + 14574, + 14575, + 14576, + 14577, + 14578, + 14579, + 14580, + 14581, + 14582, + 14583, + 14584, + 14585, + 14586, + 14587, + 14588, + 14589, + 14590, + 14591, + 14592, + 14593, + 14594, + 14595, + 14596, + 14597, + 14598, + 14599, + 14600, + 14601, + 14602, + 14603, + 14604, + 14605, + 14606, + 14607, + 14608, + 14609, + 14610, + 14611, + 14612, + 14613, + 14614, + 14615, + 14616, + 14617, + 14618, + 14619, + 14620, + 14621, + 14622, + 14623, + 14624, + 14625, + 14626, + 14627, + 14628, + 14629, + 14630, + 14631, + 14632, + 14633, + 14634, + 14635, + 14636, + 14637, + 14638, + 14639, + 14640, + 14641, + 14642, + 14643, + 14644, + 14645, + 14646, + 14647, + 14648, + 14649, + 14650, + 14651, + 14652, + 14653, + 14654, + 14655, + 14656, + 14657, + 14658, + 14659, + 14660, + 14661, + 14662, + 14663, + 14664, + 14665, + 14666, + 14667, + 14668, + 14669, + 14670, + 14671, + 14672, + 14673, + 14674, + 14675, + 14676, + 14677, + 14678, + 14679, + 14680, + 14681, + 14682, + 14683, + 14684, + 14685, + 14686, + 14687, + 14688, + 14689, + 14690, + 14691, + 14692, + 14693, + 14694, + 14695, + 14696, + 14697, + 14698, + 14699, + 14700, + 14701, + 14702, + 14703, + 14704, + 14705, + 14706, + 14707, + 14708, + 14709, + 14710, + 14711, + 14712, + 14713, + 14714, + 14715, + 14716, + 14717, + 14718, + 14719, + 14720, + 14721, + 14722, + 14723, + 14724, + 14725, + 14726, + 14727, + 14728, + 14729, + 14730, + 14731, + 14732, + 14733, + 14734, + 14735, + 14736, + 14737, + 14738, + 14739, + 14740, + 14741, + 14742, + 14743, + 14744, + 14745, + 14746, + 14747, + 14748, + 14749, + 14750, + 14751, + 14752, + 14753, + 14754, + 14755, + 14756, + 14757, + 14758, + 14759, + 14760, + 14761, + 14762, + 14763, + 14764, + 14765, + 14766, + 14767, + 14768, + 14769, + 14770, + 14771, + 14772, + 14773, + 14774, + 14775, + 14776, + 14777, + 14778, + 14779, + 14780, + 14781, + 14782, + 14783, + 14784, + 14785, + 14786, + 14787, + 14788, + 14789, + 14790, + 14791, + 14792, + 14793, + 14794, + 14795, + 14796, + 14797, + 14798, + 14799, + 14800, + 14801, + 14802, + 14803, + 14804, + 14805, + 14806, + 14807, + 14808, + 14809, + 14810, + 14811, + 14812, + 14813, + 14814, + 14815, + 14816, + 14817, + 14818, + 14819, + 14820, + 14821, + 14822, + 14823, + 14824, + 14825, + 14826, + 14827, + 14828, + 14829, + 14830, + 14831, + 14832, + 14833, + 14834, + 14835, + 14836, + 14837, + 14838, + 14839, + 14840, + 14841, + 14842, + 14843, + 14844, + 14845, + 14846, + 14847, + 14848, + 14849, + 14850, + 14851, + 14852, + 14853, + 14854, + 14855, + 14856, + 14857, + 14858, + 14859, + 14860, + 14861, + 14862, + 14863, + 14864, + 14865, + 14866, + 14867, + 14868, + 14869, + 14870, + 14871, + 14872, + 14873, + 14874, + 14875, + 14876, + 14877, + 14878, + 14879, + 14880, + 14881, + 14882, + 14883, + 14884, + 14885, + 14886, + 14887, + 14888, + 14889, + 14890, + 14891, + 14892, + 14893, + 14894, + 14895, + 14896, + 14897, + 14898, + 14899, + 14900, + 14901, + 14902, + 14903, + 14904, + 14905, + 14906, + 14907, + 14908, + 14909, + 14910, + 14911, + 14912, + 14913, + 14914, + 14915, + 14916, + 14917, + 14918, + 14919, + 14920, + 14921, + 14922, + 14923, + 14924, + 14925, + 14926, + 14927, + 14928, + 14929, + 14930, + 14931, + 14932, + 14933, + 14934, + 14935, + 14936, + 14937, + 14938, + 14939, + 14940, + 14941, + 14942, + 14943, + 14944, + 14945, + 14946, + 14947, + 14948, + 14949, + 14950, + 14951, + 14952, + 14953, + 14954, + 14955, + 14956, + 14957, + 14958, + 14959, + 14960, + 14961, + 14962, + 14963, + 14964, + 14965, + 14966, + 14967, + 14968, + 14969, + 14970, + 14971, + 14972, + 14973, + 14974, + 14975, + 14976, + 14977, + 14978, + 14979, + 14980, + 14981, + 14982, + 14983, + 14984, + 14985, + 14986, + 14987, + 14988, + 14989, + 14990, + 14991, + 14992, + 14993, + 14994, + 14995, + 14996, + 14997, + 14998, + 14999, + 15000, + 15001, + 15002, + 15003, + 15004, + 15005, + 15006, + 15007, + 15008, + 15009, + 15010, + 15011, + 15012, + 15013, + 15014, + 15015, + 15016, + 15017, + 15018, + 15019, + 15020, + 15021, + 15022, + 15023, + 15024, + 15025, + 15026, + 15027, + 15028, + 15029, + 15030, + 15031, + 15032, + 15033, + 15034, + 15035, + 15036, + 15037, + 15038, + 15039, + 15040, + 15041, + 15042, + 15043, + 15044, + 15045, + 15046, + 15047, + 15048, + 15049, + 15050, + 15051, + 15052, + 15053, + 15054, + 15055, + 15056, + 15057, + 15058, + 15059, + 15060, + 15061, + 15062, + 15063, + 15064, + 15065, + 15066, + 15067, + 15068, + 15069, + 15070, + 15071, + 15072, + 15073, + 15074, + 15075, + 15076, + 15077, + 15078, + 15079, + 15080, + 15081, + 15082, + 15083, + 15084, + 15085, + 15086, + 15087, + 15088, + 15089, + 15090, + 15091, + 15092, + 15093, + 15094, + 15095, + 15096, + 15097, + 15098, + 15099, + 15100, + 15101, + 15102, + 15103, + 15104, + 15105, + 15106, + 15107, + 15108, + 15109, + 15110, + 15111, + 15112, + 15113, + 15114, + 15115, + 15116, + 15117, + 15118, + 15119, + 15120, + 15121, + 15122, + 15123, + 15124, + 15125, + 15126, + 15127, + 15128, + 15129, + 15130, + 15131, + 15132, + 15133, + 15134, + 15135, + 15136, + 15137, + 15138, + 15139, + 15140, + 15141, + 15142, + 15143, + 15144, + 15145, + 15146, + 15147, + 15148, + 15149, + 15150, + 15151, + 15152, + 15153, + 15154, + 15155, + 15156, + 15157, + 15158, + 15159, + 15160, + 15161, + 15162, + 15163, + 15164, + 15165, + 15166, + 15167, + 15168, + 15169, + 15170, + 15171, + 15172, + 15173, + 15174, + 15175, + 15176, + 15177, + 15178, + 15179, + 15180, + 15181, + 15182, + 15183, + 15184, + 15185, + 15186, + 15187, + 15188, + 15189, + 15190, + 15191, + 15192, + 15193, + 15194, + 15195, + 15196, + 15197, + 15198, + 15199, + 15200, + 15201, + 15202, + 15203, + 15204, + 15205, + 15206, + 15207, + 15208, + 15209, + 15210, + 15211, + 15212, + 15213, + 15214, + 15215, + 15216, + 15217, + 15218, + 15219, + 15220, + 15221, + 15222, + 15223, + 15224, + 15225, + 15226, + 15227, + 15228, + 15229, + 15230, + 15231, + 15232, + 15233, + 15234, + 15235, + 15236, + 15237, + 15238, + 15239, + 15240, + 15241, + 15242, + 15243, + 15244, + 15245, + 15246, + 15247, + 15248, + 15249, + 15250, + 15251, + 15252, + 15253, + 15254, + 15255, + 15256, + 15257, + 15258, + 15259, + 15260, + 15261, + 15262, + 15263, + 15264, + 15265, + 15266, + 15267, + 15268, + 15269, + 15270, + 15271, + 15272, + 15273, + 15274, + 15275, + 15276, + 15277, + 15278, + 15279, + 15280, + 15281, + 15282, + 15283, + 15284, + 15285, + 15286, + 15287, + 15288, + 15289, + 15290, + 15291, + 15292, + 15293, + 15294, + 15295, + 15296, + 15297, + 15298, + 15299, + 15300, + 15301, + 15302, + 15303, + 15304, + 15305, + 15306, + 15307, + 15308, + 15309, + 15310, + 15311, + 15312, + 15313, + 15314, + 15315, + 15316, + 15317, + 15318, + 15319, + 15320, + 15321, + 15322, + 15323, + 15324, + 15325, + 15326, + 15327, + 15328, + 15329, + 15330, + 15331, + 15332, + 15333, + 15334, + 15335, + 15336, + 15337, + 15338, + 15339, + 15340, + 15341, + 15342, + 15343, + 15344, + 15345, + 15346, + 15347, + 15348, + 15349, + 15350, + 15351, + 15352, + 15353, + 15354, + 15355, + 15356, + 15357, + 15358, + 15359, + 15360, + 15361, + 15362, + 15363, + 15364, + 15365, + 15366, + 15367, + 15368, + 15369, + 15370, + 15371, + 15372, + 15373, + 15374, + 15375, + 15376, + 15377, + 15378, + 15379, + 15380, + 15381, + 15382, + 15383, + 15384, + 15385, + 15386, + 15387, + 15388, + 15389, + 15390, + 15391, + 15392, + 15393, + 15394, + 15395, + 15396, + 15397, + 15398, + 15399, + 15400, + 15401, + 15402, + 15403, + 15404, + 15405, + 15406, + 15407, + 15408, + 15409, + 15410, + 15411, + 15412, + 15413, + 15414, + 15415, + 15416, + 15417, + 15418, + 15419, + 15420, + 15421, + 15422, + 15423, + 15424, + 15425, + 15426, + 15427, + 15428, + 15429, + 15430, + 15431, + 15432, + 15433, + 15434, + 15435, + 15436, + 15437, + 15438, + 15439, + 15440, + 15441, + 15442, + 15443, + 15444, + 15445, + 15446, + 15447, + 15448, + 15449, + 15450, + 15451, + 15452, + 15453, + 15454, + 15455, + 15456, + 15457, + 15458, + 15459, + 15460, + 15461, + 15462, + 15463, + 15464, + 15465, + 15466, + 15467, + 15468, + 15469, + 15470, + 15471, + 15472, + 15473, + 15474, + 15475, + 15476, + 15477, + 15478, + 15479, + 15480, + 15481, + 15482, + 15483, + 15484, + 15485, + 15486, + 15487, + 15488, + 15489, + 15490, + 15491, + 15492, + 15493, + 15494, + 15495, + 15496, + 15497, + 15498, + 15499, + 15500, + 15501, + 15502, + 15503, + 15504, + 15505, + 15506, + 15507, + 15508, + 15509, + 15510, + 15511, + 15512, + 15513, + 15514, + 15515, + 15516, + 15517, + 15518, + 15519, + 15520, + 15521, + 15522, + 15523, + 15524, + 15525, + 15526, + 15527, + 15528, + 15529, + 15530, + 15531, + 15532, + 15533, + 15534, + 15535, + 15536, + 15537, + 15538, + 15539, + 15540, + 15541, + 15542, + 15543, + 15544, + 15545, + 15546, + 15547, + 15548, + 15549, + 15550, + 15551, + 15552, + 15553, + 15554, + 15555, + 15556, + 15557, + 15558, + 15559, + 15560, + 15561, + 15562, + 15563, + 15564, + 15565, + 15566, + 15567, + 15568, + 15569, + 15570, + 15571, + 15572, + 15573, + 15574, + 15575, + 15576, + 15577, + 15578, + 15579, + 15580, + 15581, + 15582, + 15583, + 15584, + 15585, + 15586, + 15587, + 15588, + 15589, + 15590, + 15591, + 15592, + 15593, + 15594, + 15595, + 15596, + 15597, + 15598, + 15599, + 15600, + 15601, + 15602, + 15603, + 15604, + 15605, + 15606, + 15607, + 15608, + 15609, + 15610, + 15611, + 15612, + 15613, + 15614, + 15615, + 15616, + 15617, + 15618, + 15619, + 15620, + 15621, + 15622, + 15623, + 15624, + 15625, + 15626, + 15627, + 15628, + 15629, + 15630, + 15631, + 15632, + 15633, + 15634, + 15635, + 15636, + 15637, + 15638, + 15639, + 15640, + 15641, + 15642, + 15643, + 15644, + 15645, + 15646, + 15647, + 15648, + 15649, + 15650, + 15651, + 15652, + 15653, + 15654, + 15655, + 15656, + 15657, + 15658, + 15659, + 15660, + 15661, + 15662, + 15663, + 15664, + 15665, + 15666, + 15667, + 15668, + 15669, + 15670, + 15671, + 15672, + 15673, + 15674, + 15675, + 15676, + 15677, + 15678, + 15679, + 15680, + 15681, + 15682, + 15683, + 15684, + 15685, + 15686, + 15687, + 15688, + 15689, + 15690, + 15691, + 15692, + 15693, + 15694, + 15695, + 15696, + 15697, + 15698, + 15699, + 15700, + 15701, + 15702, + 15703, + 15704, + 15705, + 15706, + 15707, + 15708, + 15709, + 15710, + 15711, + 15712, + 15713, + 15714, + 15715, + 15716, + 15717, + 15718, + 15719, + 15720, + 15721, + 15722, + 15723, + 15724, + 15725, + 15726, + 15727, + 15728, + 15729, + 15730, + 15731, + 15732, + 15733, + 15734, + 15735, + 15736, + 15737, + 15738, + 15739, + 15740, + 15741, + 15742, + 15743, + 15744, + 15745, + 15746, + 15747, + 15748, + 15749, + 15750, + 15751, + 15752, + 15753, + 15754, + 15755, + 15756, + 15757, + 15758, + 15759, + 15760, + 15761, + 15762, + 15763, + 15764, + 15765, + 15766, + 15767, + 15768, + 15769, + 15770, + 15771, + 15772, + 15773, + 15774, + 15775, + 15776, + 15777, + 15778, + 15779, + 15780, + 15781, + 15782, + 15783, + 15784, + 15785, + 15786, + 15787, + 15788, + 15789, + 15790, + 15791, + 15792, + 15793, + 15794, + 15795, + 15796, + 15797, + 15798, + 15799, + 15800, + 15801, + 15802, + 15803, + 15804, + 15805, + 15806, + 15807, + 15808, + 15809, + 15810, + 15811, + 15812, + 15813, + 15814, + 15815, + 15816, + 15817, + 15818, + 15819, + 15820, + 15821, + 15822, + 15823, + 15824, + 15825, + 15826, + 15827, + 15828, + 15829, + 15830, + 15831, + 15832, + 15833, + 15834, + 15835, + 15836, + 15837, + 15838, + 15839, + 15840, + 15841, + 15842, + 15843, + 15844, + 15845, + 15846, + 15847, + 15848, + 15849, + 15850, + 15851, + 15852, + 15853, + 15854, + 15855, + 15856, + 15857, + 15858, + 15859, + 15860, + 15861, + 15862, + 15863, + 15864, + 15865, + 15866, + 15867, + 15868, + 15869, + 15870, + 15871, + 15872, + 15873, + 15874, + 15875, + 15876, + 15877, + 15878, + 15879, + 15880, + 15881, + 15882, + 15883, + 15884, + 15885, + 15886, + 15887, + 15888, + 15889, + 15890, + 15891, + 15892, + 15893, + 15894, + 15895, + 15896, + 15897, + 15898, + 15899, + 15900, + 15901, + 15902, + 15903, + 15904, + 15905, + 15906, + 15907, + 15908, + 15909, + 15910, + 15911, + 15912, + 15913, + 15914, + 15915, + 15916, + 15917, + 15918, + 15919, + 15920, + 15921, + 15922, + 15923, + 15924, + 15925, + 15926, + 15927, + 15928, + 15929, + 15930, + 15931, + 15932, + 15933, + 15934, + 15935, + 15936, + 15937, + 15938, + 15939, + 15940, + 15941, + 15942, + 15943, + 15944, + 15945, + 15946, + 15947, + 15948, + 15949, + 15950, + 15951, + 15952, + 15953, + 15954, + 15955, + 15956, + 15957, + 15958, + 15959, + 15960, + 15961, + 15962, + 15963, + 15964, + 15965, + 15966, + 15967, + 15968, + 15969, + 15970, + 15971, + 15972, + 15973, + 15974, + 15975, + 15976, + 15977, + 15978, + 15979, + 15980, + 15981, + 15982, + 15983, + 15984, + 15985, + 15986, + 15987, + 15988, + 15989, + 15990, + 15991, + 15992, + 15993, + 15994, + 15995, + 15996, + 15997, + 15998, + 15999, + 16000, + 16001, + 16002, + 16003, + 16004, + 16005, + 16006, + 16007, + 16008, + 16009, + 16010, + 16011, + 16012, + 16013, + 16014, + 16015, + 16016, + 16017, + 16018, + 16019, + 16020, + 16021, + 16022, + 16023, + 16024, + 16025, + 16026, + 16027, + 16028, + 16029, + 16030, + 16031, + 16032, + 16033, + 16034, + 16035, + 16036, + 16037, + 16038, + 16039, + 16040, + 16041, + 16042, + 16043, + 16044, + 16045, + 16046, + 16047, + 16048, + 16049, + 16050, + 16051, + 16052, + 16053, + 16054, + 16055, + 16056, + 16057, + 16058, + 16059, + 16060, + 16061, + 16062, + 16063, + 16064, + 16065, + 16066, + 16067, + 16068, + 16069, + 16070, + 16071, + 16072, + 16073, + 16074, + 16075, + 16076, + 16077, + 16078, + 16079, + 16080, + 16081, + 16082, + 16083, + 16084, + 16085, + 16086, + 16087, + 16088, + 16089, + 16090, + 16091, + 16092, + 16093, + 16094, + 16095, + 16096, + 16097, + 16098, + 16099, + 16100, + 16101, + 16102, + 16103, + 16104, + 16105, + 16106, + 16107, + 16108, + 16109, + 16110, + 16111, + 16112, + 16113, + 16114, + 16115, + 16116, + 16117, + 16118, + 16119, + 16120, + 16121, + 16122, + 16123, + 16124, + 16125, + 16126, + 16127, + 16128, + 16129, + 16130, + 16131, + 16132, + 16133, + 16134, + 16135, + 16136, + 16137, + 16138, + 16139, + 16140, + 16141, + 16142, + 16143, + 16144, + 16145, + 16146, + 16147, + 16148, + 16149, + 16150, + 16151, + 16152, + 16153, + 16154, + 16155, + 16156, + 16157, + 16158, + 16159, + 16160, + 16161, + 16162, + 16163, + 16164, + 16165, + 16166, + 16167, + 16168, + 16169, + 16170, + 16171, + 16172, + 16173, + 16174, + 16175, + 16176, + 16177, + 16178, + 16179, + 16180, + 16181, + 16182, + 16183, + 16184, + 16185, + 16186, + 16187, + 16188, + 16189, + 16190, + 16191, + 16192, + 16193, + 16194, + 16195, + 16196, + 16197, + 16198, + 16199, + 16200, + 16201, + 16202, + 16203, + 16204, + 16205, + 16206, + 16207, + 16208, + 16209, + 16210, + 16211, + 16212, + 16213, + 16214, + 16215, + 16216, + 16217, + 16218, + 16219, + 16220, + 16221, + 16222, + 16223, + 16224, + 16225, + 16226, + 16227, + 16228, + 16229, + 16230, + 16231, + 16232, + 16233, + 16234, + 16235, + 16236, + 16237, + 16238, + 16239, + 16240, + 16241, + 16242, + 16243, + 16244, + 16245, + 16246, + 16247, + 16248, + 16249, + 16250, + 16251, + 16252, + 16253, + 16254, + 16255, + 16256, + 16257, + 16258, + 16259, + 16260, + 16261, + 16262, + 16263, + 16264, + 16265, + 16266, + 16267, + 16268, + 16269, + 16270, + 16271, + 16272, + 16273, + 16274, + 16275, + 16276, + 16277, + 16278, + 16279, + 16280, + 16281, + 16282, + 16283, + 16284, + 16285, + 16286, + 16287, + 16288, + 16289, + 16290, + 16291, + 16292, + 16293, + 16294, + 16295, + 16296, + 16297, + 16298, + 16299, + 16300, + 16301, + 16302, + 16303, + 16304, + 16305, + 16306, + 16307, + 16308, + 16309, + 16310, + 16311, + 16312, + 16313, + 16314, + 16315, + 16316, + 16317, + 16318, + 16319, + 16320, + 16321, + 16322, + 16323, + 16324, + 16325, + 16326, + 16327, + 16328, + 16329, + 16330, + 16331, + 16332, + 16333, + 16334, + 16335, + 16336, + 16337, + 16338, + 16339, + 16340, + 16341, + 16342, + 16343, + 16344, + 16345, + 16346, + 16347, + 16348, + 16349, + 16350, + 16351, + 16352, + 16353, + 16354, + 16355, + 16356, + 16357, + 16358, + 16359, + 16360, + 16361, + 16362, + 16363, + 16364, + 16365, + 16366, + 16367, + 16368, + 16369, + 16370, + 16371, + 16372, + 16373, + 16374, + 16375, + 16376, + 16377, + 16378, + 16379, + 16380, + 16381, + 16382, + 16383, + 16384, + 16385, + 16386, + 16387, + 16388, + 16389, + 16390, + 16391, + 16392, + 16393, + 16394, + 16395, + 16396, + 16397, + 16398, + 16399, + 16400, + 16401, + 16402, + 16403, + 16404, + 16405, + 16406, + 16407, + 16408, + 16409, + 16410, + 16411, + 16412, + 16413, + 16414, + 16415, + 16416, + 16417, + 16418, + 16419, + 16420, + 16421, + 16422, + 16423, + 16424, + 16425, + 16426, + 16427, + 16428, + 16429, + 16430, + 16431, + 16432, + 16433, + 16434, + 16435, + 16436, + 16437, + 16438, + 16439, + 16440, + 16441, + 16442, + 16443, + 16444, + 16445, + 16446, + 16447, + 16448, + 16449, + 16450, + 16451, + 16452, + 16453, + 16454, + 16455, + 16456, + 16457, + 16458, + 16459, + 16460, + 16461, + 16462, + 16463, + 16464, + 16465, + 16466, + 16467, + 16468, + 16469, + 16470, + 16471, + 16472, + 16473, + 16474, + 16475, + 16476, + 16477, + 16478, + 16479, + 16480, + 16481, + 16482, + 16483, + 16484, + 16485, + 16486, + 16487, + 16488, + 16489, + 16490, + 16491, + 16492, + 16493, + 16494, + 16495, + 16496, + 16497, + 16498, + 16499, + 16500, + 16501, + 16502, + 16503, + 16504, + 16505, + 16506, + 16507, + 16508, + 16509, + 16510, + 16511, + 16512, + 16513, + 16514, + 16515, + 16516, + 16517, + 16518, + 16519, + 16520, + 16521, + 16522, + 16523, + 16524, + 16525, + 16526, + 16527, + 16528, + 16529, + 16530, + 16531, + 16532, + 16533, + 16534, + 16535, + 16536, + 16537, + 16538, + 16539, + 16540, + 16541, + 16542, + 16543, + 16544, + 16545, + 16546, + 16547, + 16548, + 16549, + 16550, + 16551, + 16552, + 16553, + 16554, + 16555, + 16556, + 16557, + 16558, + 16559, + 16560, + 16561, + 16562, + 16563, + 16564, + 16565, + 16566, + 16567, + 16568, + 16569, + 16570, + 16571, + 16572, + 16573, + 16574, + 16575, + 16576, + 16577, + 16578, + 16579, + 16580, + 16581, + 16582, + 16583, + 16584, + 16585, + 16586, + 16587, + 16588, + 16589, + 16590, + 16591, + 16592, + 16593, + 16594, + 16595, + 16596, + 16597, + 16598, + 16599, + 16600, + 16601, + 16602, + 16603, + 16604, + 16605, + 16606, + 16607, + 16608, + 16609, + 16610, + 16611, + 16612, + 16613, + 16614, + 16615, + 16616, + 16617, + 16618, + 16619, + 16620, + 16621, + 16622, + 16623, + 16624, + 16625, + 16626, + 16627, + 16628, + 16629, + 16630, + 16631, + 16632, + 16633, + 16634, + 16635, + 16636, + 16637, + 16638, + 16639, + 16640, + 16641, + 16642, + 16643, + 16644, + 16645, + 16646, + 16647, + 16648, + 16649, + 16650, + 16651, + 16652, + 16653, + 16654, + 16655, + 16656, + 16657, + 16658, + 16659, + 16660, + 16661, + 16662, + 16663, + 16664, + 16665, + 16666, + 16667, + 16668, + 16669, + 16670, + 16671, + 16672, + 16673, + 16674, + 16675, + 16676, + 16677, + 16678, + 16679, + 16680, + 16681, + 16682, + 16683, + 16684, + 16685, + 16686, + 16687, + 16688, + 16689, + 16690, + 16691, + 16692, + 16693, + 16694, + 16695, + 16696, + 16697, + 16698, + 16699, + 16700, + 16701, + 16702, + 16703, + 16704, + 16705, + 16706, + 16707, + 16708, + 16709, + 16710, + 16711, + 16712, + 16713, + 16714, + 16715, + 16716, + 16717, + 16718, + 16719, + 16720, + 16721, + 16722, + 16723, + 16724, + 16725, + 16726, + 16727, + 16728, + 16729, + 16730, + 16731, + 16732, + 16733, + 16734, + 16735, + 16736, + 16737, + 16738, + 16739, + 16740, + 16741, + 16742, + 16743, + 16744, + 16745, + 16746, + 16747, + 16748, + 16749, + 16750, + 16751, + 16752, + 16753, + 16754, + 16755, + 16756, + 16757, + 16758, + 16759, + 16760, + 16761, + 16762, + 16763, + 16764, + 16765, + 16766, + 16767, + 16768, + 16769, + 16770, + 16771, + 16772, + 16773, + 16774, + 16775, + 16776, + 16777, + 16778, + 16779, + 16780, + 16781, + 16782, + 16783, + 16784, + 16785, + 16786, + 16787, + 16788, + 16789, + 16790, + 16791, + 16792, + 16793, + 16794, + 16795, + 16796, + 16797, + 16798, + 16799, + 16800, + 16801, + 16802, + 16803, + 16804, + 16805, + 16806, + 16807, + 16808, + 16809, + 16810, + 16811, + 16812, + 16813, + 16814, + 16815, + 16816, + 16817, + 16818, + 16819, + 16820, + 16821, + 16822, + 16823, + 16824, + 16825, + 16826, + 16827, + 16828, + 16829, + 16830, + 16831, + 16832, + 16833, + 16834, + 16835, + 16836, + 16837, + 16838, + 16839, + 16840, + 16841, + 16842, + 16843, + 16844, + 16845, + 16846, + 16847, + 16848, + 16849, + 16850, + 16851, + 16852, + 16853, + 16854, + 16855, + 16856, + 16857, + 16858, + 16859, + 16860, + 16861, + 16862, + 16863, + 16864, + 16865, + 16866, + 16867, + 16868, + 16869, + 16870, + 16871, + 16872, + 16873, + 16874, + 16875, + 16876, + 16877, + 16878, + 16879, + 16880, + 16881, + 16882, + 16883, + 16884, + 16885, + 16886, + 16887, + 16888, + 16889, + 16890, + 16891, + 16892, + 16893, + 16894, + 16895, + 16896, + 16897, + 16898, + 16899, + 16900, + 16901, + 16902, + 16903, + 16904, + 16905, + 16906, + 16907, + 16908, + 16909, + 16910, + 16911, + 16912, + 16913, + 16914, + 16915, + 16916, + 16917, + 16918, + 16919, + 16920, + 16921, + 16922, + 16923, + 16924, + 16925, + 16926, + 16927, + 16928, + 16929, + 16930, + 16931, + 16932, + 16933, + 16934, + 16935, + 16936, + 16937, + 16938, + 16939, + 16940, + 16941, + 16942, + 16943, + 16944, + 16945, + 16946, + 16947, + 16948, + 16949, + 16950, + 16951, + 16952, + 16953, + 16954, + 16955, + 16956, + 16957, + 16958, + 16959, + 16960, + 16961, + 16962, + 16963, + 16964, + 16965, + 16966, + 16967, + 16968, + 16969, + 16970, + 16971, + 16972, + 16973, + 16974, + 16975, + 16976, + 16977, + 16978, + 16979, + 16980, + 16981, + 16982, + 16983, + 16984, + 16985, + 16986, + 16987, + 16988, + 16989, + 16990, + 16991, + 16992, + 16993, + 16994, + 16995, + 16996, + 16997, + 16998, + 16999, + 17000, + 17001, + 17002, + 17003, + 17004, + 17005, + 17006, + 17007, + 17008, + 17009, + 17010, + 17011, + 17012, + 17013, + 17014, + 17015, + 17016, + 17017, + 17018, + 17019, + 17020, + 17021, + 17022, + 17023, + 17024, + 17025, + 17026, + 17027, + 17028, + 17029, + 17030, + 17031, + 17032, + 17033, + 17034, + 17035, + 17036, + 17037, + 17038, + 17039, + 17040, + 17041, + 17042, + 17043, + 17044, + 17045, + 17046, + 17047, + 17048, + 17049, + 17050, + 17051, + 17052, + 17053, + 17054, + 17055, + 17056, + 17057, + 17058, + 17059, + 17060, + 17061, + 17062, + 17063, + 17064, + 17065, + 17066, + 17067, + 17068, + 17069, + 17070, + 17071, + 17072, + 17073, + 17074, + 17075, + 17076, + 17077, + 17078, + 17079, + 17080, + 17081, + 17082, + 17083, + 17084, + 17085, + 17086, + 17087, + 17088, + 17089, + 17090, + 17091, + 17092, + 17093, + 17094, + 17095, + 17096, + 17097, + 17098, + 17099, + 17100, + 17101, + 17102, + 17103, + 17104, + 17105, + 17106, + 17107, + 17108, + 17109, + 17110, + 17111, + 17112, + 17113, + 17114, + 17115, + 17116, + 17117, + 17118, + 17119, + 17120, + 17121, + 17122, + 17123, + 17124, + 17125, + 17126, + 17127, + 17128, + 17129, + 17130, + 17131, + 17132, + 17133, + 17134, + 17135, + 17136, + 17137, + 17138, + 17139, + 17140, + 17141, + 17142, + 17143, + 17144, + 17145, + 17146, + 17147, + 17148, + 17149, + 17150, + 17151, + 17152, + 17153, + 17154, + 17155, + 17156, + 17157, + 17158, + 17159, + 17160, + 17161, + 17162, + 17163, + 17164, + 17165, + 17166, + 17167, + 17168, + 17169, + 17170, + 17171, + 17172, + 17173, + 17174, + 17175, + 17176, + 17177, + 17178, + 17179, + 17180, + 17181, + 17182, + 17183, + 17184, + 17185, + 17186, + 17187, + 17188, + 17189, + 17190, + 17191, + 17192, + 17193, + 17194, + 17195, + 17196, + 17197, + 17198, + 17199, + 17200, + 17201, + 17202, + 17203, + 17204, + 17205, + 17206, + 17207, + 17208, + 17209, + 17210, + 17211, + 17212, + 17213, + 17214, + 17215, + 17216, + 17217, + 17218, + 17219, + 17220, + 17221, + 17222, + 17223, + 17224, + 17225, + 17226, + 17227, + 17228, + 17229, + 17230, + 17231, + 17232, + 17233, + 17234, + 17235, + 17236, + 17237, + 17238, + 17239, + 17240, + 17241, + 17242, + 17243, + 17244, + 17245, + 17246, + 17247, + 17248, + 17249, + 17250, + 17251, + 17252, + 17253, + 17254, + 17255, + 17256, + 17257, + 17258, + 17259, + 17260, + 17261, + 17262, + 17263, + 17264, + 17265, + 17266, + 17267, + 17268, + 17269, + 17270, + 17271, + 17272, + 17273, + 17274, + 17275, + 17276, + 17277, + 17278, + 17279, + 17280, + 17281, + 17282, + 17283, + 17284, + 17285, + 17286, + 17287, + 17288, + 17289, + 17290, + 17291, + 17292, + 17293, + 17294, + 17295, + 17296, + 17297, + 17298, + 17299, + 17300, + 17301, + 17302, + 17303, + 17304, + 17305, + 17306, + 17307, + 17308, + 17309, + 17310, + 17311, + 17312, + 17313, + 17314, + 17315, + 17316, + 17317, + 17318, + 17319, + 17320, + 17321, + 17322, + 17323, + 17324, + 17325, + 17326, + 17327, + 17328, + 17329, + 17330, + 17331, + 17332, + 17333, + 17334, + 17335, + 17336, + 17337, + 17338, + 17339, + 17340, + 17341, + 17342, + 17343, + 17344, + 17345, + 17346, + 17347, + 17348, + 17349, + 17350, + 17351, + 17352, + 17353, + 17354, + 17355, + 17356, + 17357, + 17358, + 17359, + 17360, + 17361, + 17362, + 17363, + 17364, + 17365, + 17366, + 17367, + 17368, + 17369, + 17370, + 17371, + 17372, + 17373, + 17374, + 17375, + 17376, + 17377, + 17378, + 17379, + 17380, + 17381, + 17382, + 17383, + 17384, + 17385, + 17386, + 17387, + 17388, + 17389, + 17390, + 17391, + 17392, + 17393, + 17394, + 17395, + 17396, + 17397, + 17398, + 17399, + 17400, + 17401, + 17402, + 17403, + 17404, + 17405, + 17406, + 17407, + 17408, + 17409, + 17410, + 17411, + 17412, + 17413, + 17414, + 17415, + 17416, + 17417, + 17418, + 17419, + 17420, + 17421, + 17422, + 17423, + 17424, + 17425, + 17426, + 17427, + 17428, + 17429, + 17430, + 17431, + 17432, + 17433, + 17434, + 17435, + 17436, + 17437, + 17438, + 17439, + 17440, + 17441, + 17442, + 17443, + 17444, + 17445, + 17446, + 17447, + 17448, + 17449, + 17450, + 17451, + 17452, + 17453, + 17454, + 17455, + 17456, + 17457, + 17458, + 17459, + 17460, + 17461, + 17462, + 17463, + 17464, + 17465, + 17466, + 17467, + 17468, + 17469, + 17470, + 17471, + 17472, + 17473, + 17474, + 17475, + 17476, + 17477, + 17478, + 17479, + 17480, + 17481, + 17482, + 17483, + 17484, + 17485, + 17486, + 17487, + 17488, + 17489, + 17490, + 17491, + 17492, + 17493, + 17494, + 17495, + 17496, + 17497, + 17498, + 17499, + 17500, + 17501, + 17502, + 17503, + 17504, + 17505, + 17506, + 17507, + 17508, + 17509, + 17510, + 17511, + 17512, + 17513, + 17514, + 17515, + 17516, + 17517, + 17518, + 17519, + 17520, + 17521, + 17522, + 17523, + 17524, + 17525, + 17526, + 17527, + 17528, + 17529, + 17530, + 17531, + 17532, + 17533, + 17534, + 17535, + 17536, + 17537, + 17538, + 17539, + 17540, + 17541, + 17542, + 17543, + 17544, + 17545, + 17546, + 17547, + 17548, + 17549, + 17550, + 17551, + 17552, + 17553, + 17554, + 17555, + 17556, + 17557, + 17558, + 17559, + 17560, + 17561, + 17562, + 17563, + 17564, + 17565, + 17566, + 17567, + 17568, + 17569, + 17570, + 17571, + 17572, + 17573, + 17574, + 17575, + 17576, + 17577, + 17578, + 17579, + 17580, + 17581, + 17582, + 17583, + 17584, + 17585, + 17586, + 17587, + 17588, + 17589, + 17590, + 17591, + 17592, + 17593, + 17594, + 17595, + 17596, + 17597, + 17598, + 17599, + 17600, + 17601, + 17602, + 17603, + 17604, + 17605, + 17606, + 17607, + 17608, + 17609, + 17610, + 17611, + 17612, + 17613, + 17614, + 17615, + 17616, + 17617, + 17618, + 17619, + 17620, + 17621, + 17622, + 17623, + 17624, + 17625, + 17626, + 17627, + 17628, + 17629, + 17630, + 17631, + 17632, + 17633, + 17634, + 17635, + 17636, + 17637, + 17638, + 17639, + 17640, + 17641, + 17642, + 17643, + 17644, + 17645, + 17646, + 17647, + 17648, + 17649, + 17650, + 17651, + 17652, + 17653, + 17654, + 17655, + 17656, + 17657, + 17658, + 17659, + 17660, + 17661, + 17662, + 17663, + 17664, + 17665, + 17666, + 17667, + 17668, + 17669, + 17670, + 17671, + 17672, + 17673, + 17674, + 17675, + 17676, + 17677, + 17678, + 17679, + 17680, + 17681, + 17682, + 17683, + 17684, + 17685, + 17686, + 17687, + 17688, + 17689, + 17690, + 17691, + 17692, + 17693, + 17694, + 17695, + 17696, + 17697, + 17698, + 17699, + 17700, + 17701, + 17702, + 17703, + 17704, + 17705, + 17706, + 17707, + 17708, + 17709, + 17710, + 17711, + 17712, + 17713, + 17714, + 17715, + 17716, + 17717, + 17718, + 17719, + 17720, + 17721, + 17722, + 17723, + 17724, + 17725, + 17726, + 17727, + 17728, + 17729, + 17730, + 17731, + 17732, + 17733, + 17734, + 17735, + 17736, + 17737, + 17738, + 17739, + 17740, + 17741, + 17742, + 17743, + 17744, + 17745, + 17746, + 17747, + 17748, + 17749, + 17750, + 17751, + 17752, + 17753, + 17754, + 17755, + 17756, + 17757, + 17758, + 17759, + 17760, + 17761, + 17762, + 17763, + 17764, + 17765, + 17766, + 17767, + 17768, + 17769, + 17770, + 17771, + 17772, + 17773, + 17774, + 17775, + 17776, + 17777, + 17778, + 17779, + 17780, + 17781, + 17782, + 17783, + 17784, + 17785, + 17786, + 17787, + 17788, + 17789, + 17790, + 17791, + 17792, + 17793, + 17794, + 17795, + 17796, + 17797, + 17798, + 17799, + 17800, + 17801, + 17802, + 17803, + 17804, + 17805, + 17806, + 17807, + 17808, + 17809, + 17810, + 17811, + 17812, + 17813, + 17814, + 17815, + 17816, + 17817, + 17818, + 17819, + 17820, + 17821, + 17822, + 17823, + 17824, + 17825, + 17826, + 17827, + 17828, + 17829, + 17830, + 17831, + 17832, + 17833, + 17834, + 17835, + 17836, + 17837, + 17838, + 17839, + 17840, + 17841, + 17842, + 17843, + 17844, + 17845, + 17846, + 17847, + 17848, + 17849, + 17850, + 17851, + 17852, + 17853, + 17854, + 17855, + 17856, + 17857, + 17858, + 17859, + 17860, + 17861, + 17862, + 17863, + 17864, + 17865, + 17866, + 17867, + 17868, + 17869, + 17870, + 17871, + 17872, + 17873, + 17874, + 17875, + 17876, + 17877, + 17878, + 17879, + 17880, + 17881, + 17882, + 17883, + 17884, + 17885, + 17886, + 17887, + 17888, + 17889, + 17890, + 17891, + 17892, + 17893, + 17894, + 17895, + 17896, + 17897, + 17898, + 17899, + 17900, + 17901, + 17902, + 17903, + 17904, + 17905, + 17906, + 17907, + 17908, + 17909, + 17910, + 17911, + 17912, + 17913, + 17914, + 17915, + 17916, + 17917, + 17918, + 17919, + 17920, + 17921, + 17922, + 17923, + 17924, + 17925, + 17926, + 17927, + 17928, + 17929, + 17930, + 17931, + 17932, + 17933, + 17934, + 17935, + 17936, + 17937, + 17938, + 17939, + 17940, + 17941, + 17942, + 17943, + 17944, + 17945, + 17946, + 17947, + 17948, + 17949, + 17950, + 17951, + 17952, + 17953, + 17954, + 17955, + 17956, + 17957, + 17958, + 17959, + 17960, + 17961, + 17962, + 17963, + 17964, + 17965, + 17966, + 17967, + 17968, + 17969, + 17970, + 17971, + 17972, + 17973, + 17974, + 17975, + 17976, + 17977, + 17978, + 17979, + 17980, + 17981, + 17982, + 17983, + 17984, + 17985, + 17986, + 17987, + 17988, + 17989, + 17990, + 17991, + 17992, + 17993, + 17994, + 17995, + 17996, + 17997, + 17998, + 17999, + 18000, + 18001, + 18002, + 18003, + 18004, + 18005, + 18006, + 18007, + 18008, + 18009, + 18010, + 18011, + 18012, + 18013, + 18014, + 18015, + 18016, + 18017, + 18018, + 18019, + 18020, + 18021, + 18022, + 18023, + 18024, + 18025, + 18026, + 18027, + 18028, + 18029, + 18030, + 18031, + 18032, + 18033, + 18034, + 18035, + 18036, + 18037, + 18038, + 18039, + 18040, + 18041, + 18042, + 18043, + 18044, + 18045, + 18046, + 18047, + 18048, + 18049, + 18050, + 18051, + 18052, + 18053, + 18054, + 18055, + 18056, + 18057, + 18058, + 18059, + 18060, + 18061, + 18062, + 18063, + 18064, + 18065, + 18066, + 18067, + 18068, + 18069, + 18070, + 18071, + 18072, + 18073, + 18074, + 18075, + 18076, + 18077, + 18078, + 18079, + 18080, + 18081, + 18082, + 18083, + 18084, + 18085, + 18086, + 18087, + 18088, + 18089, + 18090, + 18091, + 18092, + 18093, + 18094, + 18095, + 18096, + 18097, + 18098, + 18099, + 18100, + 18101, + 18102, + 18103, + 18104, + 18105, + 18106, + 18107, + 18108, + 18109, + 18110, + 18111, + 18112, + 18113, + 18114, + 18115, + 18116, + 18117, + 18118, + 18119, + 18120, + 18121, + 18122, + 18123, + 18124, + 18125, + 18126, + 18127, + 18128, + 18129, + 18130, + 18131, + 18132, + 18133, + 18134, + 18135, + 18136, + 18137, + 18138, + 18139, + 18140, + 18141, + 18142, + 18143, + 18144, + 18145, + 18146, + 18147, + 18148, + 18149, + 18150, + 18151, + 18152, + 18153, + 18154, + 18155, + 18156, + 18157, + 18158, + 18159, + 18160, + 18161, + 18162, + 18163, + 18164, + 18165, + 18166, + 18167, + 18168, + 18169, + 18170, + 18171, + 18172, + 18173, + 18174, + 18175, + 18176, + 18177, + 18178, + 18179, + 18180, + 18181, + 18182, + 18183, + 18184, + 18185, + 18186, + 18187, + 18188, + 18189, + 18190, + 18191, + 18192, + 18193, + 18194, + 18195, + 18196, + 18197, + 18198, + 18199, + 18200, + 18201, + 18202, + 18203, + 18204, + 18205, + 18206, + 18207, + 18208, + 18209, + 18210, + 18211, + 18212, + 18213, + 18214, + 18215, + 18216, + 18217, + 18218, + 18219, + 18220, + 18221, + 18222, + 18223, + 18224, + 18225, + 18226, + 18227, + 18228, + 18229, + 18230, + 18231, + 18232, + 18233, + 18234, + 18235, + 18236, + 18237, + 18238, + 18239, + 18240, + 18241, + 18242, + 18243, + 18244, + 18245, + 18246, + 18247, + 18248, + 18249, + 18250, + 18251, + 18252, + 18253, + 18254, + 18255, + 18256, + 18257, + 18258, + 18259, + 18260, + 18261, + 18262, + 18263, + 18264, + 18265, + 18266, + 18267, + 18268, + 18269, + 18270, + 18271, + 18272, + 18273, + 18274, + 18275, + 18276, + 18277, + 18278, + 18279, + 18280, + 18281, + 18282, + 18283, + 18284, + 18285, + 18286, + 18287, + 18288, + 18289, + 18290, + 18291, + 18292, + 18293, + 18294, + 18295, + 18296, + 18297, + 18298, + 18299, + 18300, + 18301, + 18302, + 18303, + 18304, + 18305, + 18306, + 18307, + 18308, + 18309, + 18310, + 18311, + 18312, + 18313, + 18314, + 18315, + 18316, + 18317, + 18318, + 18319, + 18320, + 18321, + 18322, + 18323, + 18324, + 18325, + 18326, + 18327, + 18328, + 18329, + 18330, + 18331, + 18332, + 18333, + 18334, + 18335, + 18336, + 18337, + 18338, + 18339, + 18340, + 18341, + 18342, + 18343, + 18344, + 18345, + 18346, + 18347, + 18348, + 18349, + 18350, + 18351, + 18352, + 18353, + 18354, + 18355, + 18356, + 18357, + 18358, + 18359, + 18360, + 18361, + 18362, + 18363, + 18364, + 18365, + 18366, + 18367, + 18368, + 18369, + 18370, + 18371, + 18372, + 18373, + 18374, + 18375, + 18376, + 18377, + 18378, + 18379, + 18380, + 18381, + 18382, + 18383, + 18384, + 18385, + 18386, + 18387, + 18388, + 18389, + 18390, + 18391, + 18392, + 18393, + 18394, + 18395, + 18396, + 18397, + 18398, + 18399, + 18400, + 18401, + 18402, + 18403, + 18404, + 18405, + 18406, + 18407, + 18408, + 18409, + 18410, + 18411, + 18412, + 18413, + 18414, + 18415, + 18416, + 18417, + 18418, + 18419, + 18420, + 18421, + 18422, + 18423, + 18424, + 18425, + 18426, + 18427, + 18428, + 18429, + 18430, + 18431, + 18432, + 18433, + 18434, + 18435, + 18436, + 18437, + 18438, + 18439, + 18440, + 18441, + 18442, + 18443, + 18444, + 18445, + 18446, + 18447, + 18448, + 18449, + 18450, + 18451, + 18452, + 18453, + 18454, + 18455, + 18456, + 18457, + 18458, + 18459, + 18460, + 18461, + 18462, + 18463, + 18464, + 18465, + 18466, + 18467, + 18468, + 18469, + 18470, + 18471, + 18472, + 18473, + 18474, + 18475, + 18476, + 18477, + 18478, + 18479, + 18480, + 18481, + 18482, + 18483, + 18484, + 18485, + 18486, + 18487, + 18488, + 18489, + 18490, + 18491, + 18492, + 18493, + 18494, + 18495, + 18496, + 18497, + 18498, + 18499, + 18500, + 18501, + 18502, + 18503, + 18504, + 18505, + 18506, + 18507, + 18508, + 18509, + 18510, + 18511, + 18512, + 18513, + 18514, + 18515, + 18516, + 18517, + 18518, + 18519, + 18520, + 18521, + 18522, + 18523, + 18524, + 18525, + 18526, + 18527, + 18528, + 18529, + 18530, + 18531, + 18532, + 18533, + 18534, + 18535, + 18536, + 18537, + 18538, + 18539, + 18540, + 18541, + 18542, + 18543, + 18544, + 18545, + 18546, + 18547, + 18548, + 18549, + 18550, + 18551, + 18552, + 18553, + 18554, + 18555, + 18556, + 18557, + 18558, + 18559, + 18560, + 18561, + 18562, + 18563, + 18564, + 18565, + 18566, + 18567, + 18568, + 18569, + 18570, + 18571, + 18572, + 18573, + 18574, + 18575, + 18576, + 18577, + 18578, + 18579, + 18580, + 18581, + 18582, + 18583, + 18584, + 18585, + 18586, + 18587, + 18588, + 18589, + 18590, + 18591, + 18592, + 18593, + 18594, + 18595, + 18596, + 18597, + 18598, + 18599, + 18600, + 18601, + 18602, + 18603, + 18604, + 18605, + 18606, + 18607, + 18608, + 18609, + 18610, + 18611, + 18612, + 18613, + 18614, + 18615, + 18616, + 18617, + 18618, + 18619, + 18620, + 18621, + 18622, + 18623, + 18624, + 18625, + 18626, + 18627, + 18628, + 18629, + 18630, + 18631, + 18632, + 18633, + 18634, + 18635, + 18636, + 18637, + 18638, + 18639, + 18640, + 18641, + 18642, + 18643, + 18644, + 18645, + 18646, + 18647, + 18648, + 18649, + 18650, + 18651, + 18652, + 18653, + 18654, + 18655, + 18656, + 18657, + 18658, + 18659, + 18660, + 18661, + 18662, + 18663, + 18664, + 18665, + 18666, + 18667, + 18668, + 18669, + 18670, + 18671, + 18672, + 18673, + 18674, + 18675, + 18676, + 18677, + 18678, + 18679, + 18680, + 18681, + 18682, + 18683, + 18684, + 18685, + 18686, + 18687, + 18688, + 18689, + 18690, + 18691, + 18692, + 18693, + 18694, + 18695, + 18696, + 18697, + 18698, + 18699, + 18700, + 18701, + 18702, + 18703, + 18704, + 18705, + 18706, + 18707, + 18708, + 18709, + 18710, + 18711, + 18712, + 18713, + 18714, + 18715, + 18716, + 18717, + 18718, + 18719, + 18720, + 18721, + 18722, + 18723, + 18724, + 18725, + 18726, + 18727, + 18728, + 18729, + 18730, + 18731, + 18732, + 18733, + 18734, + 18735, + 18736, + 18737, + 18738, + 18739, + 18740, + 18741, + 18742, + 18743, + 18744, + 18745, + 18746, + 18747, + 18748, + 18749, + 18750, + 18751, + 18752, + 18753, + 18754, + 18755, + 18756, + 18757, + 18758, + 18759, + 18760, + 18761, + 18762, + 18763, + 18764, + 18765, + 18766, + 18767, + 18768, + 18769, + 18770, + 18771, + 18772, + 18773, + 18774, + 18775, + 18776, + 18777, + 18778, + 18779, + 18780, + 18781, + 18782, + 18783, + 18784, + 18785, + 18786, + 18787, + 18788, + 18789, + 18790, + 18791, + 18792, + 18793, + 18794, + 18795, + 18796, + 18797, + 18798, + 18799, + 18800, + 18801, + 18802, + 18803, + 18804, + 18805, + 18806, + 18807, + 18808, + 18809, + 18810, + 18811, + 18812, + 18813, + 18814, + 18815, + 18816, + 18817, + 18818, + 18819, + 18820, + 18821, + 18822, + 18823, + 18824, + 18825, + 18826, + 18827, + 18828, + 18829, + 18830, + 18831, + 18832, + 18833, + 18834, + 18835, + 18836, + 18837, + 18838, + 18839, + 18840, + 18841, + 18842, + 18843, + 18844, + 18845, + 18846, + 18847, + 18848, + 18849, + 18850, + 18851, + 18852, + 18853, + 18854, + 18855, + 18856, + 18857, + 18858, + 18859, + 18860, + 18861, + 18862, + 18863, + 18864, + 18865, + 18866, + 18867, + 18868, + 18869, + 18870, + 18871, + 18872, + 18873, + 18874, + 18875, + 18876, + 18877, + 18878, + 18879, + 18880, + 18881, + 18882, + 18883, + 18884, + 18885, + 18886, + 18887, + 18888, + 18889, + 18890, + 18891, + 18892, + 18893, + 18894, + 18895, + 18896, + 18897, + 18898, + 18899, + 18900, + 18901, + 18902, + 18903, + 18904, + 18905, + 18906, + 18907, + 18908, + 18909, + 18910, + 18911, + 18912, + 18913, + 18914, + 18915, + 18916, + 18917, + 18918, + 18919, + 18920, + 18921, + 18922, + 18923, + 18924, + 18925, + 18926, + 18927, + 18928, + 18929, + 18930, + 18931, + 18932, + 18933, + 18934, + 18935, + 18936, + 18937, + 18938, + 18939, + 18940, + 18941, + 18942, + 18943, + 18944, + 18945, + 18946, + 18947, + 18948, + 18949, + 18950, + 18951, + 18952, + 18953, + 18954, + 18955, + 18956, + 18957, + 18958, + 18959, + 18960, + 18961, + 18962, + 18963, + 18964, + 18965, + 18966, + 18967, + 18968, + 18969, + 18970, + 18971, + 18972, + 18973, + 18974, + 18975, + 18976, + 18977, + 18978, + 18979, + 18980, + 18981, + 18982, + 18983, + 18984, + 18985, + 18986, + 18987, + 18988, + 18989, + 18990, + 18991, + 18992, + 18993, + 18994, + 18995, + 18996, + 18997, + 18998, + 18999, + 19000, + 19001, + 19002, + 19003, + 19004, + 19005, + 19006, + 19007, + 19008, + 19009, + 19010, + 19011, + 19012, + 19013, + 19014, + 19015, + 19016, + 19017, + 19018, + 19019, + 19020, + 19021, + 19022, + 19023, + 19024, + 19025, + 19026, + 19027, + 19028, + 19029, + 19030, + 19031, + 19032, + 19033, + 19034, + 19035, + 19036, + 19037, + 19038, + 19039, + 19040, + 19041, + 19042, + 19043, + 19044, + 19045, + 19046, + 19047, + 19048, + 19049, + 19050, + 19051, + 19052, + 19053, + 19054, + 19055, + 19056, + 19057, + 19058, + 19059, + 19060, + 19061, + 19062, + 19063, + 19064, + 19065, + 19066, + 19067, + 19068, + 19069, + 19070, + 19071, + 19072, + 19073, + 19074, + 19075, + 19076, + 19077, + 19078, + 19079, + 19080, + 19081, + 19082, + 19083, + 19084, + 19085, + 19086, + 19087, + 19088, + 19089, + 19090, + 19091, + 19092, + 19093, + 19094, + 19095, + 19096, + 19097, + 19098, + 19099, + 19100, + 19101, + 19102, + 19103, + 19104, + 19105, + 19106, + 19107, + 19108, + 19109, + 19110, + 19111, + 19112, + 19113, + 19114, + 19115, + 19116, + 19117, + 19118, + 19119, + 19120, + 19121, + 19122, + 19123, + 19124, + 19125, + 19126, + 19127, + 19128, + 19129, + 19130, + 19131, + 19132, + 19133, + 19134, + 19135, + 19136, + 19137, + 19138, + 19139, + 19140, + 19141, + 19142, + 19143, + 19144, + 19145, + 19146, + 19147, + 19148, + 19149, + 19150, + 19151, + 19152, + 19153, + 19154, + 19155, + 19156, + 19157, + 19158, + 19159, + 19160, + 19161, + 19162, + 19163, + 19164, + 19165, + 19166, + 19167, + 19168, + 19169, + 19170, + 19171, + 19172, + 19173, + 19174, + 19175, + 19176, + 19177, + 19178, + 19179, + 19180, + 19181, + 19182, + 19183, + 19184, + 19185, + 19186, + 19187, + 19188, + 19189, + 19190, + 19191, + 19192, + 19193, + 19194, + 19195, + 19196, + 19197, + 19198, + 19199, + 19200, + 19201, + 19202, + 19203, + 19204, + 19205, + 19206, + 19207, + 19208, + 19209, + 19210, + 19211, + 19212, + 19213, + 19214, + 19215, + 19216, + 19217, + 19218, + 19219, + 19220, + 19221, + 19222, + 19223, + 19224, + 19225, + 19226, + 19227, + 19228, + 19229, + 19230, + 19231, + 19232, + 19233, + 19234, + 19235, + 19236, + 19237, + 19238, + 19239, + 19240, + 19241, + 19242, + 19243, + 19244, + 19245, + 19246, + 19247, + 19248, + 19249, + 19250, + 19251, + 19252, + 19253, + 19254, + 19255, + 19256, + 19257, + 19258, + 19259, + 19260, + 19261, + 19262, + 19263, + 19264, + 19265, + 19266, + 19267, + 19268, + 19269, + 19270, + 19271, + 19272, + 19273, + 19274, + 19275, + 19276, + 19277, + 19278, + 19279, + 19280, + 19281, + 19282, + 19283, + 19284, + 19285, + 19286, + 19287, + 19288, + 19289, + 19290, + 19291, + 19292, + 19293, + 19294, + 19295, + 19296, + 19297, + 19298, + 19299, + 19300, + 19301, + 19302, + 19303, + 19304, + 19305, + 19306, + 19307, + 19308, + 19309, + 19310, + 19311, + 19312, + 19313, + 19314, + 19315, + 19316, + 19317, + 19318, + 19319, + 19320, + 19321, + 19322, + 19323, + 19324, + 19325, + 19326, + 19327, + 19328, + 19329, + 19330, + 19331, + 19332, + 19333, + 19334, + 19335, + 19336, + 19337, + 19338, + 19339, + 19340, + 19341, + 19342, + 19343, + 19344, + 19345, + 19346, + 19347, + 19348, + 19349, + 19350, + 19351, + 19352, + 19353, + 19354, + 19355, + 19356, + 19357, + 19358, + 19359, + 19360, + 19361, + 19362, + 19363, + 19364, + 19365, + 19366, + 19367, + 19368, + 19369, + 19370, + 19371, + 19372, + 19373, + 19374, + 19375, + 19376, + 19377, + 19378, + 19379, + 19380, + 19381, + 19382, + 19383, + 19384, + 19385, + 19386, + 19387, + 19388, + 19389, + 19390, + 19391, + 19392, + 19393, + 19394, + 19395, + 19396, + 19397, + 19398, + 19399, + 19400, + 19401, + 19402, + 19403, + 19404, + 19405, + 19406, + 19407, + 19408, + 19409, + 19410, + 19411, + 19412, + 19413, + 19414, + 19415, + 19416, + 19417, + 19418, + 19419, + 19420, + 19421, + 19422, + 19423, + 19424, + 19425, + 19426, + 19427, + 19428, + 19429, + 19430, + 19431, + 19432, + 19433, + 19434, + 19435, + 19436, + 19437, + 19438, + 19439 + ], + "rate_pass_wall_s": 463.1438640999986 + }, + "routes": { + "b_s3_pdip": { + "label": "S3 PDIP (source-only)", + "status": "ok", + "solver": "library", + "ms": 38.84176079991448, + "log_likelihood": 28622.39485118912 + }, + "d_s3_certified_fallback": { + "label": "S3 certified active set, budget 11, PDIP fallback", + "status": "ok", + "solver": "harness-injected certified active set", + "pass_budget": 11, + "fallback": true, + "injected_solver_calls_jax": 1, + "injected_solver_calls_numpy": 0, + "ms": 30.16178959987883, + "log_likelihood": 28622.394851189252 + } + }, + "equivalence_pins": [ + { + "pin": "route d (certified, fallback) == route b (library PDIP)", + "route": "d_s3_certified_fallback", + "reference": "b_s3_pdip", + "expectation": "the certified active set returns the library's own positive solution", + "rtol": 1e-09, + "got": 28622.394851189252, + "reference_value": 28622.39485118912, + "rel_diff": 4.575691088611358e-15, + "status": "PASS" + } + ], + "reference": { + "log_evidence_s3_library": 28622.39485119987 + }, + "library_revisions": { + "PyAutoNerves": { + "head": "1fa613aa8d89a79613009fb66f5b4e2d21deb57a", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoNerves", + "module_file": "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/__init__.py" + }, + "PyAutoFit": { + "head": "dd9fbe0aab60c4a57702b1444ca031b317c91331", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoFit", + "module_file": "/mnt/ral/jnightin/PyAuto/PyAutoFit/autofit/__init__.py" + }, + "PyAutoArray": { + "head": "3de624b5b91a4efa130dc3cb0a3a0f06f85025a3", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoArray", + "module_file": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/__init__.py" + }, + "PyAutoGalaxy": { + "head": "70a61e26cd715cefe7012a38285698091246a8a4", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy", + "module_file": "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/__init__.py" + }, + "PyAutoLens": { + "head": "86054bbc19baa2f710a12e04a94fa27ab37cc354", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoLens", + "module_file": "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/__init__.py" + } + }, + "timer": { + "dataset_load": 0.08077386200238834, + "mask_and_oversample": 0.014964603000407806, + "adapt_image_build": 0.0021606340014841408, + "model_build": 0.5996503549977206, + "instance_from_vector": 0.012149335998401511, + "register_pytrees": 0.0006950919996597804, + "fit_imaging_eager": 4.608514666000701, + "s3_system_build": 3.16071174100216, + "b_s3_pdip_library_likelihood_jit_lower": 1.2771769870014396, + "b_s3_pdip_library_likelihood_jit_compile": 3.4845504840013746, + "b_s3_pdip_library_likelihood_jit_first_call": 0.10179993399651721, + "b_s3_pdip_library_likelihood_jit_steady_x10": 0.3884176079991448, + "d_s3_certified_fallback_library_likelihood_jit_lower": 0.47585309200076154, + "d_s3_certified_fallback_library_likelihood_jit_compile": 3.855429679999361, + "d_s3_certified_fallback_library_likelihood_jit_first_call": 0.03992304699931992, + "d_s3_certified_fallback_library_likelihood_jit_steady_x10": 0.3016178959987883, + "captured_rate_pass": 448.3410356539971, + "captured_rate_uncertified_pdip_recheck": 14.79279280999981 + }, + "note": "Phase C1 (#304) rate pass: untimed. No millisecond here is a result. The rate is the fraction of captured lanes whose certificate failed under the named certified_fallback; the phase-C2 verdict takes it together with the timed pass." +} \ No newline at end of file diff --git a/results/breakdown/imaging/fixed_light_trace_rectangular_captured_rate_libcertified_fboff_b16_pix2_hpc_a100_fp64_fixed_light_trace.json b/results/breakdown/imaging/fixed_light_trace_rectangular_captured_rate_libcertified_fboff_b16_pix2_hpc_a100_fp64_fixed_light_trace.json new file mode 100644 index 000000000..22b4a72eb --- /dev/null +++ b/results/breakdown/imaging/fixed_light_trace_rectangular_captured_rate_libcertified_fboff_b16_pix2_hpc_a100_fp64_fixed_light_trace.json @@ -0,0 +1,9736 @@ +{ + "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": null, + "cpu_count": 124, + "jax_compilation_cache_dir": "/mnt/ral/jnightin/autolens_profiling_wt/certified-solver-phase-c1-lane-rate/output/jax_cache/fixed_light_lanerate_rectangular_pix2_rate_20_certified_off_350768_7", + "autotune_cache_entries_at_start": 0, + "cache_fresh": true, + "nvidia_smi": "NVIDIA A100 80GB PCIe, 4721 MiB, 81920 MiB" + }, + "machine": { + "cpu_model": "AMD EPYC 7702 64-Core Processor", + "cpu_count_os": 124, + "nproc": 4, + "nproc_all": 124, + "nproc_note": "GNU nproc honours OMP_NUM_THREADS, so `nproc` can print 1 on a multi-core host; `nproc_all` is the core count.", + "ram_total": "928298200 kB", + "kernel": "5.14.0-687.50.1.el9_8.x86_64", + "platform": "Linux-5.14.0-687.50.1.el9_8.x86_64-x86_64-with-glibc2.34", + "python": "3.12.4", + "jax_thread_env": { + "NPROC": null + }, + "blas_thread_env": { + "OMP_NUM_THREADS": null, + "OPENBLAS_NUM_THREADS": null, + "MKL_NUM_THREADS": null, + "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" + }, + "precision": "fp64", + "configuration": { + "mesh": "rectangular", + "source_pixels": 1521, + "dataset": "hst", + "dataset_sha256": { + "data.fits": "e4e833a28e9c6f6fb023cd85c0d3dde74068720256bc77a240633500e5b04fac", + "noise_map.fits": "315c6266a0acd3ac9c8da82fcd2b45a08697362481fd7a35072bab1658530ba3", + "psf.fits": "8389ba0e8bf4a09b4a561cfc246181a2fb944ed396754cd0ff76fdd22910d303" + }, + "cell_source_sha256": "06a162fcdae6b329384ec33322f443df07215d86e56f0505ac15b3d3473eb432", + "border_relocator_mode": "cell", + "border_relocator": true, + "regularization": { + "scheme": "constant", + "coefficient": 1.0 + }, + "vmap_batch": 20, + "lanes": "captured", + "captured_pass": "rate", + "batch_sample": null, + "solver_source": "library", + "solver": "certified", + "certified_fallback": "none", + "certified_pass_budget": 16, + "certified_tau_rel": 1e-09, + "use_mixed_precision": false, + "thread_env": { + "n_threads": null, + "vars": [ + "OPENBLAS_NUM_THREADS", + "MKL_NUM_THREADS", + "OMP_NUM_THREADS", + "VECLIB_MAXIMUM_THREADS", + "NUMEXPR_NUM_THREADS" + ], + "set_to": null, + "preexisting": {}, + "overridden": {}, + "note": "Not pinned (legacy variant): recorded as found." + } + }, + "captured": { + "batches_path": "/mnt/ral/jnightin/autolens_profiling_wt/certified-solver-phase-c1-lane-rate/results/breakdown/imaging/nautilus_batches_rectangular_pix2.npz", + "batches_sha256": "77f052c40d028d2e54ab6efb1c3f1d7bdf1922da01e74916f7b206db0259df03", + "schema_version": 2, + "n_calls": 142, + "n_lanes": 2840, + "call_sizes_seen": [ + 20 + ], + "calls_by_phase": { + "prior": 8, + "exploration": 134 + }, + "parameter_paths": [ + "galaxies.source.pixelization.regularization.inner_coefficient", + "galaxies.source.pixelization.regularization.outer_coefficient", + "galaxies.source.pixelization.regularization.signal_scale" + ], + "stage": "pix2", + "regularization": { + "class": "Adapt", + "free": true, + "priors": { + "inner_coefficient": [ + "LogUniform", + 1e-06, + 1000000.0 + ], + "outer_coefficient": [ + "LogUniform", + 1e-06, + 1000000.0 + ], + "signal_scale": [ + "Uniform", + 0.0, + 1.0 + ] + }, + "priors_source": "PyAutoGalaxy packaged config/priors/regularization (adapt_split.yaml / adapt.yaml / constant.yaml); adapt_split.yaml and adapt.yaml are identical to euclid_strong_lens_modeling_pipeline/config/priors/regularization/'s copies" + }, + "nautilus": { + "departures_from_production": [ + "mass/shear fixed at the S3 fiducial, not at a source_pix_1 result", + "no positions likelihood", + "the cell's mesh (39x39 RectangularBilinearAdaptImage, weight_power 1, weight_floor 0) fixed in both stages; source_pix_1 uses RectangularBilinearAdaptDensity, source_pix_2 frees weight_power / weight_floor", + "seeded (production passes no seed)", + "quick updates disabled (iterations_per_quick_update=1e12; render-only)", + "NullPaths: no output directory, so no checkpoint and one Sampler.run call", + "post-fit perform_update skipped (samples / latent variables never built)" + ], + "n_batch": 20, + "n_like_max": 40000, + "n_live": 75, + "number_of_cores": 1, + "production_reference": "euclid_strong_lens_modeling_pipeline/scripts/full_model.py source_pix_1 (n_live=150) / source_pix_2 (n_live=75): af.Nautilus(n_batch=20, **SettingsSearch.search_dict) with use_jax_vmap=True and number_of_cores=1 (SettingsSearch defaults)", + "production_stage": "source_pix_2", + "seed": 1, + "stage": "pix2", + "use_jax_vmap": true, + "version": "1.0.5" + }, + "capture_fit_status": "sampling complete (n_like_max or convergence); post-fit result skipped", + "capture_library_revisions": { + "PyAutoArray": { + "head": "3de624b5b91a4efa130dc3cb0a3a0f06f85025a3", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoArray" + }, + "PyAutoFit": { + "head": "dd9fbe0aab60c4a57702b1444ca031b317c91331", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoFit" + }, + "PyAutoGalaxy": { + "head": "70a61e26cd715cefe7012a38285698091246a8a4", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy" + }, + "PyAutoLens": { + "head": "86054bbc19baa2f710a12e04a94fa27ab37cc354", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoLens" + }, + "PyAutoNerves": { + "head": "1fa613aa8d89a79613009fb66f5b4e2d21deb57a", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoNerves" + } + }, + "fingerprint_check": { + "fields": [ + "mesh", + "source_pixels", + "dataset_sha256", + "regularization_class", + "regularization_s0_fiducial", + "border_relocator", + "use_mixed_precision", + "log_evidence_s3_library" + ], + "not_identity": "the regularization coefficients: free per lane since the capture frees them", + "log_evidence_s3_library_rel_diff": 0.0, + "passed": true + } + }, + "rate": { + "pass": "rate", + "solver": "certified", + "certified_fallback": "none", + "certified_pass_budget": 16, + "certified_pass_budget_basis": "config default (Settings().certified_pass_budget)", + "composition": "jax.jit(jax.vmap(fn)) \u2014 the current Fitness._vmap composition", + "chunk_size": 20, + "chunk_rule": "the replayed lanes in capture order, split into chunks of --vmap-batch; the last chunk is padded by repeating its final lane and the padded rows are dropped. At --vmap-batch == n_batch every chunk is exactly one captured Nautilus batch.", + "batch_sample": null, + "stage": "pix2", + "regularization_range": { + "galaxies.source.pixelization.regularization.inner_coefficient": { + "min": 1.0220949689817867e-06, + "max": 973443.1376694659 + }, + "galaxies.source.pixelization.regularization.outer_coefficient": { + "min": 1.0695469208569066e-06, + "max": 722149.0007485969 + }, + "galaxies.source.pixelization.regularization.signal_scale": { + "min": 0.00205684306461984, + "max": 0.9978261744153061 + } + }, + "calls_replayed": 142, + "calls_rule": "all captured calls", + "report_source": "library solve observed through its stats= out-dict (PyAutoArray #566) and jax.debug.callback(..., ordered=True); untimed; one row per lane checked per chunk", + "traced_solver_kwargs_jax": [ + "certified" + ], + "overall": { + "n_lanes": 2840, + "n_uncertified": 70, + "uncertified_rate": 0.02464788732394366, + "max_passes": 16, + "mean_passes": 6.216549295774648, + "n_at_budget": 71, + "budget": 16, + "passes_histogram": { + "1": 4, + "2": 36, + "3": 87, + "4": 90, + "5": 588, + "6": 1285, + "7": 336, + "8": 323, + "9": 3, + "10": 4, + "11": 2, + "12": 2, + "13": 3, + "14": 6, + "16": 71 + } + }, + "by_nautilus_phase": { + "prior": { + "n_lanes": 160, + "n_uncertified": 32, + "uncertified_rate": 0.2, + "max_passes": 16, + "mean_passes": 6.225, + "n_at_budget": 32, + "budget": 16, + "passes_histogram": { + "1": 2, + "2": 25, + "3": 59, + "4": 15, + "5": 9, + "6": 1, + "7": 11, + "8": 1, + "9": 1, + "10": 1, + "13": 2, + "14": 1, + "16": 32 + } + }, + "exploration": { + "n_lanes": 2680, + "n_uncertified": 38, + "uncertified_rate": 0.014179104477611941, + "max_passes": 16, + "mean_passes": 6.216044776119403, + "n_at_budget": 39, + "budget": 16, + "passes_histogram": { + "1": 2, + "2": 11, + "3": 28, + "4": 75, + "5": 579, + "6": 1284, + "7": 325, + "8": 322, + "9": 2, + "10": 3, + "11": 2, + "12": 2, + "13": 1, + "14": 5, + "16": 39 + } + } + }, + "by_call_half": { + "early": { + "n_lanes": 1420, + "n_uncertified": 70, + "uncertified_rate": 0.04929577464788732, + "max_passes": 16, + "mean_passes": 6.707746478873239, + "n_at_budget": 71, + "budget": 16, + "passes_histogram": { + "1": 4, + "2": 36, + "3": 87, + "4": 90, + "5": 162, + "6": 327, + "7": 300, + "8": 323, + "9": 3, + "10": 4, + "11": 2, + "12": 2, + "13": 3, + "14": 6, + "16": 71 + } + }, + "late": { + "n_lanes": 1420, + "n_uncertified": 0, + "uncertified_rate": 0.0, + "max_passes": 7, + "mean_passes": 5.725352112676056, + "n_at_budget": 0, + "budget": 16, + "passes_histogram": { + "5": 426, + "6": 958, + "7": 36 + } + } + }, + "phase_rule": "by_nautilus_phase: the sampler state when the batch was requested (nautilus_batches.phase_of) \u2014 prior = only the unit-cube bound (prior draws), exploration = more bounds and Sampler.explored False, sampling = explored True. by_call_half: early = call index below the median replayed call index, late = the rest.", + "vs_capture_pdip": { + "reference": "the capture's own figure of merit for the lane: library PDIP through Fitness.call_wrap's jax.jit(jax.vmap(call)) over parameter vectors", + "n_compared": 2789, + "n_excluded_resampled_or_nonfinite": 51, + "max_rel_diff": 0.00022536838731692863, + "median_rel_diff": 1.7077709485178465e-11, + "max_abs_diff_nats": 4.328075358156639, + "n_above_lane_rtol": 130, + "n_above_lane_rtol_uncertified": 69, + "lane_rtol": 1e-09, + "gated": false, + "note": "RECORDED, NOT GATED: a cross-composition comparison (Fitness over vectors vs this cell over trees) and, for certified lanes, certified vs PDIP. The gated 1e-9 pin is the timed pass's (same composition, same lanes). It still shows whether a certified_fallback=none lane that FAILED its certificate returned a wrong answer." + }, + "uncertified_pdip_recheck": { + "n_uncertified": 70, + "n_rechecked": 70, + "cap": 256, + "max_rel_diff": 0.00022536836062276628, + "rows": [ + { + "lane_row": 6, + "call_index": 0, + "lane_in_call": 6, + "phase": "prior", + "passes": 16, + "log_likelihood_certified_none": 19205.84104165168, + "log_likelihood_scalar_library_pdip": 19205.179150282085, + "rel_diff": 3.4464212201157125e-05, + "abs_diff_nats": 0.6618913695965603 + }, + { + "lane_row": 9, + "call_index": 0, + "lane_in_call": 9, + "phase": "prior", + "passes": 16, + "log_likelihood_certified_none": 19207.092118287117, + "log_likelihood_scalar_library_pdip": 19204.201596201332, + "rel_diff": 0.00015051508761274447, + "abs_diff_nats": 2.890522085785051 + }, + { + "lane_row": 18, + "call_index": 0, + "lane_in_call": 18, + "phase": "prior", + "passes": 16, + "log_likelihood_certified_none": 19207.043772287267, + "log_likelihood_scalar_library_pdip": 19204.15324051091, + "rel_diff": 0.00015051597121496467, + "abs_diff_nats": 2.890531776356511 + }, + { + "lane_row": 20, + "call_index": 1, + "lane_in_call": 0, + "phase": "prior", + "passes": 16, + "log_likelihood_certified_none": 19207.13005629916, + "log_likelihood_scalar_library_pdip": 19204.23954364181, + "rel_diff": 0.00015051429924017954, + "abs_diff_nats": 2.890512657351792 + }, + { + "lane_row": 29, + "call_index": 1, + "lane_in_call": 9, + "phase": "prior", + "passes": 16, + "log_likelihood_certified_none": 21606.387750079986, + "log_likelihood_scalar_library_pdip": 21605.739032935722, + "rel_diff": 3.0025223542466216e-05, + "abs_diff_nats": 0.6487171442640829 + }, + { + "lane_row": 31, + "call_index": 1, + "lane_in_call": 11, + "phase": "prior", + "passes": 16, + "log_likelihood_certified_none": 19207.521321412067, + "log_likelihood_scalar_library_pdip": 19204.63098066728, + "rel_diff": 0.00015050227977286167, + "abs_diff_nats": 2.890340744786954 + }, + { + "lane_row": 37, + "call_index": 1, + "lane_in_call": 17, + "phase": "prior", + "passes": 16, + "log_likelihood_certified_none": 19207.6133940777, + "log_likelihood_scalar_library_pdip": 19204.723016167987, + "rel_diff": 0.00015050349371242472, + "abs_diff_nats": 2.890377909712697 + }, + { + "lane_row": 42, + "call_index": 2, + "lane_in_call": 2, + "phase": "prior", + "passes": 16, + "log_likelihood_certified_none": 19207.044185845523, + "log_likelihood_scalar_library_pdip": 19204.153654303205, + "rel_diff": 0.00015051595578492765, + "abs_diff_nats": 2.890531542318058 + }, + { + "lane_row": 43, + "call_index": 2, + "lane_in_call": 3, + "phase": "prior", + "passes": 16, + "log_likelihood_certified_none": 19533.767399050426, + "log_likelihood_scalar_library_pdip": 19535.84932465154, + "rel_diff": 0.00010656949521440266, + "abs_diff_nats": 2.0819256011127436 + }, + { + "lane_row": 52, + "call_index": 2, + "lane_in_call": 12, + "phase": "prior", + "passes": 16, + "log_likelihood_certified_none": 22259.45059017099, + "log_likelihood_scalar_library_pdip": 22259.084767122837, + "rel_diff": 1.643477492357222e-05, + "abs_diff_nats": 0.36582304815237876 + }, + { + "lane_row": 66, + "call_index": 3, + "lane_in_call": 6, + "phase": "prior", + "passes": 16, + "log_likelihood_certified_none": 19207.052627910143, + "log_likelihood_scalar_library_pdip": 19204.162099018766, + "rel_diff": 0.0001505157515581043, + "abs_diff_nats": 2.890528891377471 + }, + { + "lane_row": 72, + "call_index": 3, + "lane_in_call": 12, + "phase": "prior", + "passes": 16, + "log_likelihood_certified_none": 19207.043965654444, + "log_likelihood_scalar_library_pdip": 19204.15343379073, + "rel_diff": 0.00015051597424905235, + "abs_diff_nats": 2.890531863715296 + }, + { + "lane_row": 76, + "call_index": 3, + "lane_in_call": 16, + "phase": "prior", + "passes": 16, + "log_likelihood_certified_none": 19207.043775334005, + "log_likelihood_scalar_library_pdip": 19204.15324339158, + "rel_diff": 0.00015051597983981095, + "abs_diff_nats": 2.8905319424229674 + }, + { + "lane_row": 80, + "call_index": 4, + "lane_in_call": 0, + "phase": "prior", + "passes": 16, + "log_likelihood_certified_none": 19640.372297955015, + "log_likelihood_scalar_library_pdip": 19640.673172191488, + "rel_diff": 1.5318937076898853e-05, + "abs_diff_nats": 0.3008742364727368 + }, + { + "lane_row": 82, + "call_index": 4, + "lane_in_call": 2, + "phase": "prior", + "passes": 16, + "log_likelihood_certified_none": 19200.119405868212, + "log_likelihood_scalar_library_pdip": 19204.447480713607, + "rel_diff": 0.00022536836062276628, + "abs_diff_nats": 4.32807484539444 + }, + { + "lane_row": 85, + "call_index": 4, + "lane_in_call": 5, + "phase": "prior", + "passes": 16, + "log_likelihood_certified_none": 22933.53165119885, + "log_likelihood_scalar_library_pdip": 22932.784710015432, + "rel_diff": 3.257088892004507e-05, + "abs_diff_nats": 0.7469411834172206 + }, + { + "lane_row": 90, + "call_index": 4, + "lane_in_call": 10, + "phase": "prior", + "passes": 16, + "log_likelihood_certified_none": 22391.303993414902, + "log_likelihood_scalar_library_pdip": 22391.233773346055, + "rel_diff": 3.1360517940787323e-06, + "abs_diff_nats": 0.0702200688465382 + }, + { + "lane_row": 97, + "call_index": 4, + "lane_in_call": 17, + "phase": "prior", + "passes": 16, + "log_likelihood_certified_none": 19207.04376686656, + "log_likelihood_scalar_library_pdip": 19204.15323514836, + "rel_diff": 0.00015051596822884282, + "abs_diff_nats": 2.8905317182034196 + }, + { + "lane_row": 103, + "call_index": 5, + "lane_in_call": 3, + "phase": "prior", + "passes": 16, + "log_likelihood_certified_none": 22834.42841744977, + "log_likelihood_scalar_library_pdip": 22834.387068890937, + "rel_diff": 1.8108022215638482e-06, + "abs_diff_nats": 0.04134855883239652 + }, + { + "lane_row": 106, + "call_index": 5, + "lane_in_call": 6, + "phase": "prior", + "passes": 16, + "log_likelihood_certified_none": 19207.04376670997, + "log_likelihood_scalar_library_pdip": 19204.153234761987, + "rel_diff": 0.00015051598019690681, + "abs_diff_nats": 2.890531947981799 + }, + { + "lane_row": 108, + "call_index": 5, + "lane_in_call": 8, + "phase": "prior", + "passes": 16, + "log_likelihood_certified_none": 19708.21457454742, + "log_likelihood_scalar_library_pdip": 19711.120607597084, + "rel_diff": 0.00014743114344016226, + "abs_diff_nats": 2.906033049664984 + }, + { + "lane_row": 109, + "call_index": 5, + "lane_in_call": 9, + "phase": "prior", + "passes": 16, + "log_likelihood_certified_none": 19207.043766950883, + "log_likelihood_scalar_library_pdip": 19204.153235186277, + "rel_diff": 0.00015051597064481565, + "abs_diff_nats": 2.8905317646058393 + }, + { + "lane_row": 111, + "call_index": 5, + "lane_in_call": 11, + "phase": "prior", + "passes": 16, + "log_likelihood_certified_none": 19218.144471184984, + "log_likelihood_scalar_library_pdip": 19217.924861088974, + "rel_diff": 1.1427357407076315e-05, + "abs_diff_nats": 0.21961009601000114 + }, + { + "lane_row": 114, + "call_index": 5, + "lane_in_call": 14, + "phase": "prior", + "passes": 16, + "log_likelihood_certified_none": 19207.138868544585, + "log_likelihood_scalar_library_pdip": 19204.248366739477, + "rel_diff": 0.00015051366499270954, + "abs_diff_nats": 2.890501805108215 + }, + { + "lane_row": 124, + "call_index": 6, + "lane_in_call": 4, + "phase": "prior", + "passes": 16, + "log_likelihood_certified_none": 20873.23656697244, + "log_likelihood_scalar_library_pdip": 20871.469781385927, + "rel_diff": 8.465075076249782e-05, + "abs_diff_nats": 1.766785586511105 + }, + { + "lane_row": 135, + "call_index": 6, + "lane_in_call": 15, + "phase": "prior", + "passes": 16, + "log_likelihood_certified_none": 19521.395471261458, + "log_likelihood_scalar_library_pdip": 19523.857004700254, + "rel_diff": 0.0001260782353714086, + "abs_diff_nats": 2.461533438796323 + }, + { + "lane_row": 136, + "call_index": 6, + "lane_in_call": 16, + "phase": "prior", + "passes": 16, + "log_likelihood_certified_none": 22018.625178058533, + "log_likelihood_scalar_library_pdip": 22017.271590531145, + "rel_diff": 6.14784407696742e-05, + "abs_diff_nats": 1.3535875273882993 + }, + { + "lane_row": 138, + "call_index": 6, + "lane_in_call": 18, + "phase": "prior", + "passes": 16, + "log_likelihood_certified_none": 19207.047370930166, + "log_likelihood_scalar_library_pdip": 19204.156839850817, + "rel_diff": 0.00015051590670987926, + "abs_diff_nats": 2.890531079348875 + }, + { + "lane_row": 142, + "call_index": 7, + "lane_in_call": 2, + "phase": "prior", + "passes": 16, + "log_likelihood_certified_none": 23169.1271742074, + "log_likelihood_scalar_library_pdip": 23169.588056051783, + "rel_diff": 1.9891671930890356e-05, + "abs_diff_nats": 0.4608818443848577 + }, + { + "lane_row": 143, + "call_index": 7, + "lane_in_call": 3, + "phase": "prior", + "passes": 16, + "log_likelihood_certified_none": 19207.065093745183, + "log_likelihood_scalar_library_pdip": 19206.403225960297, + "rel_diff": 3.4460787743481914e-05, + "abs_diff_nats": 0.6618677848855441 + }, + { + "lane_row": 146, + "call_index": 7, + "lane_in_call": 6, + "phase": "prior", + "passes": 16, + "log_likelihood_certified_none": 21546.336347133234, + "log_likelihood_scalar_library_pdip": 21545.84434473102, + "rel_diff": 2.2835141400912518e-05, + "abs_diff_nats": 0.49200240221398417 + }, + { + "lane_row": 159, + "call_index": 7, + "lane_in_call": 19, + "phase": "prior", + "passes": 16, + "log_likelihood_certified_none": 22080.75388078803, + "log_likelihood_scalar_library_pdip": 22080.006614730104, + "rel_diff": 3.384356132518127e-05, + "abs_diff_nats": 0.7472660579260264 + }, + { + "lane_row": 163, + "call_index": 8, + "lane_in_call": 3, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 21669.460653390866, + "log_likelihood_scalar_library_pdip": 21671.259367019993, + "rel_diff": 8.299995854712821e-05, + "abs_diff_nats": 1.7987136291267234 + }, + { + "lane_row": 164, + "call_index": 8, + "lane_in_call": 4, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 19207.043786251175, + "log_likelihood_scalar_library_pdip": 19204.15325448881, + "rel_diff": 0.00015051597037683538, + "abs_diff_nats": 2.8905317623648443 + }, + { + "lane_row": 165, + "call_index": 8, + "lane_in_call": 5, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 19342.80344895851, + "log_likelihood_scalar_library_pdip": 19342.255876845524, + "rel_diff": 2.8309630297225633e-05, + "abs_diff_nats": 0.5475721129878366 + }, + { + "lane_row": 170, + "call_index": 8, + "lane_in_call": 10, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 19207.043768078816, + "log_likelihood_scalar_library_pdip": 19204.15323634958, + "rel_diff": 0.00015051596879399074, + "abs_diff_nats": 2.8905317292374093 + }, + { + "lane_row": 171, + "call_index": 8, + "lane_in_call": 11, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 21293.073383208954, + "log_likelihood_scalar_library_pdip": 21293.017831633693, + "rel_diff": 2.6089103808383e-06, + "abs_diff_nats": 0.05555157526032417 + }, + { + "lane_row": 172, + "call_index": 8, + "lane_in_call": 12, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 19207.10066644192, + "log_likelihood_scalar_library_pdip": 19204.21014710055, + "rel_diff": 0.00015051487768701638, + "abs_diff_nats": 2.8905193413665984 + }, + { + "lane_row": 186, + "call_index": 9, + "lane_in_call": 6, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 20398.45427662246, + "log_likelihood_scalar_library_pdip": 20398.27836577077, + "rel_diff": 8.62380876143717e-06, + "abs_diff_nats": 0.17591085168896825 + }, + { + "lane_row": 188, + "call_index": 9, + "lane_in_call": 8, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 19228.2487085822, + "log_likelihood_scalar_library_pdip": 19225.582637838932, + "rel_diff": 0.00013867307917213607, + "abs_diff_nats": 2.6660707432674826 + }, + { + "lane_row": 194, + "call_index": 9, + "lane_in_call": 14, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 20744.16939059612, + "log_likelihood_scalar_library_pdip": 20745.57065524473, + "rel_diff": 6.754524480903733e-05, + "abs_diff_nats": 1.4012646486116864 + }, + { + "lane_row": 195, + "call_index": 9, + "lane_in_call": 15, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 19207.043766853094, + "log_likelihood_scalar_library_pdip": 19204.153234855607, + "rel_diff": 0.0001505159827740329, + "abs_diff_nats": 2.8905319974874146 + }, + { + "lane_row": 197, + "call_index": 9, + "lane_in_call": 17, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 19207.04376972432, + "log_likelihood_scalar_library_pdip": 19204.15323755559, + "rel_diff": 0.0001505159916698643, + "abs_diff_nats": 2.890532168730715 + }, + { + "lane_row": 199, + "call_index": 9, + "lane_in_call": 19, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 19207.043766779818, + "log_likelihood_scalar_library_pdip": 19204.153234612586, + "rel_diff": 0.00015051599161488256, + "abs_diff_nats": 2.890532167231868 + }, + { + "lane_row": 200, + "call_index": 10, + "lane_in_call": 0, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 19212.151052677797, + "log_likelihood_scalar_library_pdip": 19208.93546834715, + "rel_diff": 0.00016740044423310603, + "abs_diff_nats": 3.2155843306463794 + }, + { + "lane_row": 211, + "call_index": 10, + "lane_in_call": 11, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 19201.19225270581, + "log_likelihood_scalar_library_pdip": 19204.345805154717, + "rel_diff": 0.00016421035534892837, + "abs_diff_nats": 3.153552448908158 + }, + { + "lane_row": 213, + "call_index": 10, + "lane_in_call": 13, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 19200.834830543048, + "log_likelihood_scalar_library_pdip": 19204.3412315879, + "rel_diff": 0.00018258377116752824, + "abs_diff_nats": 3.5064010448513727 + }, + { + "lane_row": 214, + "call_index": 10, + "lane_in_call": 14, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 19383.414355751793, + "log_likelihood_scalar_library_pdip": 19381.45433518121, + "rel_diff": 0.0001011286633441654, + "abs_diff_nats": 1.9600205705828557 + }, + { + "lane_row": 217, + "call_index": 10, + "lane_in_call": 17, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 19212.023850097878, + "log_likelihood_scalar_library_pdip": 19208.852138124137, + "rel_diff": 0.00016511720486647437, + "abs_diff_nats": 3.1717119737404573 + }, + { + "lane_row": 222, + "call_index": 11, + "lane_in_call": 2, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 19487.67677281184, + "log_likelihood_scalar_library_pdip": 19490.486464100482, + "rel_diff": 0.00014415706318147826, + "abs_diff_nats": 2.80969128864308 + }, + { + "lane_row": 225, + "call_index": 11, + "lane_in_call": 5, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 19511.624603786946, + "log_likelihood_scalar_library_pdip": 19513.24374561435, + "rel_diff": 8.297655933124054e-05, + "abs_diff_nats": 1.6191418274029274 + }, + { + "lane_row": 227, + "call_index": 11, + "lane_in_call": 7, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 19207.043766990337, + "log_likelihood_scalar_library_pdip": 19204.153235667967, + "rel_diff": 0.00015051594761287884, + "abs_diff_nats": 2.8905313223694975 + }, + { + "lane_row": 228, + "call_index": 11, + "lane_in_call": 8, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 19207.043991805192, + "log_likelihood_scalar_library_pdip": 19204.153460373193, + "rel_diff": 0.0001505159515603984, + "abs_diff_nats": 2.890531431999989 + }, + { + "lane_row": 229, + "call_index": 11, + "lane_in_call": 9, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 19207.043779773172, + "log_likelihood_scalar_library_pdip": 19204.153248232033, + "rel_diff": 0.00015051595890620487, + "abs_diff_nats": 2.890531541139353 + }, + { + "lane_row": 236, + "call_index": 11, + "lane_in_call": 16, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 19803.70761489194, + "log_likelihood_scalar_library_pdip": 19802.715765393776, + "rel_diff": 5.008653913510777e-05, + "abs_diff_nats": 0.9918494981648109 + }, + { + "lane_row": 237, + "call_index": 11, + "lane_in_call": 17, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 24228.640239757988, + "log_likelihood_scalar_library_pdip": 24228.640549836724, + "rel_diff": 1.279802453555779e-08, + "abs_diff_nats": 0.0003100787362200208 + }, + { + "lane_row": 249, + "call_index": 12, + "lane_in_call": 9, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 20842.915288926157, + "log_likelihood_scalar_library_pdip": 20844.54171672531, + "rel_diff": 7.80265558848447e-05, + "abs_diff_nats": 1.626427799154044 + }, + { + "lane_row": 250, + "call_index": 12, + "lane_in_call": 10, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 22680.592020968885, + "log_likelihood_scalar_library_pdip": 22680.344012524274, + "rel_diff": 1.0934950742971644e-05, + "abs_diff_nats": 0.24800844461060478 + }, + { + "lane_row": 251, + "call_index": 12, + "lane_in_call": 11, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 20450.469898248237, + "log_likelihood_scalar_library_pdip": 20451.414547350458, + "rel_diff": 4.6189915129525694e-05, + "abs_diff_nats": 0.9446491022208647 + }, + { + "lane_row": 254, + "call_index": 12, + "lane_in_call": 14, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 22223.885501093122, + "log_likelihood_scalar_library_pdip": 22223.885501091405, + "rel_diff": 7.726488677522035e-14, + "abs_diff_nats": 1.7171259969472885e-09 + }, + { + "lane_row": 278, + "call_index": 13, + "lane_in_call": 18, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 21003.043441592446, + "log_likelihood_scalar_library_pdip": 21005.374499363683, + "rel_diff": 0.00011097434950788375, + "abs_diff_nats": 2.331057771236374 + }, + { + "lane_row": 282, + "call_index": 14, + "lane_in_call": 2, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 21740.168688325233, + "log_likelihood_scalar_library_pdip": 21739.556993180726, + "rel_diff": 2.8137424543622047e-05, + "abs_diff_nats": 0.6116951445073937 + }, + { + "lane_row": 285, + "call_index": 14, + "lane_in_call": 5, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 22118.710361499758, + "log_likelihood_scalar_library_pdip": 22118.2723846192, + "rel_diff": 1.9801586351014223e-05, + "abs_diff_nats": 0.4379768805592903 + }, + { + "lane_row": 293, + "call_index": 14, + "lane_in_call": 13, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 21302.16793677996, + "log_likelihood_scalar_library_pdip": 21301.632480411863, + "rel_diff": 2.5136870077359087e-05, + "abs_diff_nats": 0.5354563680957654 + }, + { + "lane_row": 295, + "call_index": 14, + "lane_in_call": 15, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 23647.040603728943, + "log_likelihood_scalar_library_pdip": 23646.9724039978, + "rel_diff": 2.8840787724879017e-06, + "abs_diff_nats": 0.06819973114397726 + }, + { + "lane_row": 313, + "call_index": 15, + "lane_in_call": 13, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 22360.246134529996, + "log_likelihood_scalar_library_pdip": 22360.202565376385, + "rel_diff": 1.948513368066709e-06, + "abs_diff_nats": 0.043569153611315414 + }, + { + "lane_row": 327, + "call_index": 16, + "lane_in_call": 7, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 20864.4975820342, + "log_likelihood_scalar_library_pdip": 20864.026989488342, + "rel_diff": 2.2555211709392117e-05, + "abs_diff_nats": 0.4705925458583806 + }, + { + "lane_row": 330, + "call_index": 16, + "lane_in_call": 10, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 22454.812951569376, + "log_likelihood_scalar_library_pdip": 22452.198200609673, + "rel_diff": 0.00011645857284620292, + "abs_diff_nats": 2.6147509597030876 + }, + { + "lane_row": 335, + "call_index": 16, + "lane_in_call": 15, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 23195.008368198207, + "log_likelihood_scalar_library_pdip": 23194.665930408144, + "rel_diff": 1.47636439813473e-05, + "abs_diff_nats": 0.3424377900628315 + }, + { + "lane_row": 338, + "call_index": 16, + "lane_in_call": 18, + "phase": "exploration", + "passes": 16, + "log_likelihood_certified_none": 20527.96295829589, + "log_likelihood_scalar_library_pdip": 20529.268963055292, + "rel_diff": 6.361672019355011e-05, + "abs_diff_nats": 1.306004759400821 + } + ], + "gated": false + }, + "lane_certified": [ + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ], + "lane_passes": [ + 3, + 4, + 4, + 3, + 3, + 7, + 16, + 7, + 5, + 16, + 5, + 3, + 7, + 3, + 5, + 8, + 3, + 2, + 16, + 3, + 16, + 3, + 3, + 4, + 5, + 3, + 3, + 3, + 2, + 16, + 2, + 16, + 3, + 3, + 5, + 6, + 3, + 16, + 2, + 3, + 3, + 7, + 16, + 16, + 5, + 2, + 2, + 4, + 3, + 3, + 4, + 2, + 16, + 2, + 3, + 13, + 3, + 3, + 9, + 3, + 3, + 4, + 3, + 3, + 2, + 7, + 16, + 3, + 4, + 3, + 3, + 2, + 16, + 4, + 7, + 3, + 16, + 7, + 4, + 2, + 16, + 3, + 16, + 2, + 3, + 16, + 13, + 2, + 2, + 4, + 16, + 2, + 3, + 10, + 2, + 3, + 3, + 16, + 3, + 3, + 3, + 5, + 3, + 16, + 4, + 5, + 16, + 2, + 16, + 16, + 2, + 16, + 2, + 3, + 16, + 7, + 3, + 4, + 7, + 2, + 2, + 3, + 7, + 4, + 16, + 14, + 3, + 3, + 7, + 1, + 3, + 4, + 3, + 3, + 5, + 16, + 16, + 3, + 16, + 3, + 2, + 1, + 16, + 16, + 3, + 3, + 16, + 3, + 2, + 3, + 3, + 4, + 2, + 3, + 3, + 3, + 3, + 2, + 3, + 16, + 10, + 5, + 2, + 16, + 16, + 16, + 8, + 5, + 8, + 8, + 16, + 16, + 16, + 2, + 3, + 4, + 2, + 4, + 2, + 13, + 7, + 7, + 4, + 5, + 3, + 8, + 16, + 5, + 16, + 6, + 4, + 4, + 8, + 1, + 16, + 16, + 2, + 16, + 7, + 16, + 16, + 8, + 7, + 3, + 5, + 7, + 4, + 9, + 3, + 10, + 6, + 16, + 6, + 16, + 16, + 9, + 5, + 16, + 5, + 3, + 4, + 4, + 16, + 7, + 11, + 16, + 1, + 16, + 16, + 16, + 2, + 5, + 7, + 3, + 4, + 6, + 16, + 16, + 5, + 3, + 4, + 4, + 5, + 4, + 3, + 14, + 5, + 5, + 3, + 16, + 16, + 16, + 14, + 14, + 16, + 8, + 2, + 5, + 7, + 8, + 7, + 7, + 5, + 3, + 4, + 7, + 4, + 4, + 4, + 4, + 4, + 7, + 7, + 5, + 5, + 8, + 2, + 7, + 16, + 3, + 7, + 5, + 16, + 5, + 12, + 16, + 4, + 7, + 2, + 5, + 4, + 14, + 7, + 16, + 6, + 16, + 8, + 10, + 5, + 4, + 6, + 2, + 3, + 7, + 6, + 5, + 4, + 7, + 5, + 4, + 11, + 16, + 5, + 16, + 7, + 5, + 6, + 4, + 7, + 12, + 7, + 8, + 3, + 6, + 7, + 5, + 3, + 16, + 7, + 5, + 16, + 2, + 4, + 4, + 7, + 16, + 7, + 7, + 16, + 7, + 4, + 5, + 5, + 4, + 4, + 8, + 5, + 7, + 7, + 5, + 5, + 5, + 4, + 8, + 6, + 7, + 5, + 7, + 7, + 6, + 7, + 4, + 7, + 7, + 5, + 3, + 7, + 5, + 7, + 7, + 4, + 7, + 5, + 8, + 8, + 4, + 4, + 5, + 5, + 3, + 7, + 5, + 7, + 4, + 8, + 7, + 5, + 7, + 5, + 5, + 7, + 4, + 8, + 7, + 8, + 8, + 5, + 3, + 7, + 8, + 7, + 5, + 7, + 4, + 14, + 7, + 5, + 5, + 7, + 8, + 6, + 5, + 7, + 7, + 3, + 5, + 5, + 7, + 7, + 5, + 7, + 8, + 7, + 4, + 5, + 7, + 4, + 7, + 4, + 5, + 6, + 4, + 8, + 5, + 4, + 5, + 5, + 7, + 4, + 7, + 7, + 7, + 8, + 8, + 7, + 7, + 7, + 7, + 4, + 7, + 3, + 8, + 4, + 7, + 5, + 7, + 7, + 7, + 5, + 5, + 7, + 6, + 7, + 8, + 7, + 7, + 7, + 7, + 7, + 8, + 8, + 7, + 4, + 8, + 7, + 4, + 8, + 6, + 5, + 4, + 4, + 7, + 5, + 4, + 4, + 4, + 4, + 5, + 5, + 7, + 8, + 7, + 8, + 7, + 4, + 8, + 7, + 8, + 8, + 7, + 4, + 5, + 4, + 5, + 4, + 7, + 7, + 4, + 4, + 6, + 7, + 7, + 4, + 7, + 7, + 4, + 7, + 5, + 5, + 4, + 6, + 3, + 7, + 4, + 8, + 4, + 5, + 4, + 4, + 5, + 8, + 3, + 8, + 7, + 7, + 8, + 3, + 4, + 4, + 4, + 7, + 6, + 8, + 8, + 8, + 7, + 5, + 7, + 7, + 8, + 8, + 7, + 7, + 8, + 7, + 8, + 5, + 7, + 7, + 7, + 8, + 8, + 8, + 7, + 7, + 8, + 4, + 7, + 7, + 7, + 8, + 7, + 5, + 5, + 7, + 8, + 8, + 8, + 7, + 7, + 8, + 8, + 7, + 8, + 8, + 7, + 5, + 7, + 7, + 6, + 7, + 7, + 6, + 8, + 7, + 8, + 7, + 7, + 7, + 7, + 7, + 8, + 5, + 7, + 7, + 6, + 8, + 7, + 7, + 7, + 6, + 7, + 8, + 7, + 7, + 8, + 7, + 4, + 7, + 5, + 5, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 8, + 7, + 8, + 7, + 7, + 4, + 4, + 7, + 7, + 7, + 7, + 4, + 8, + 8, + 5, + 8, + 8, + 8, + 7, + 8, + 7, + 7, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 7, + 8, + 8, + 6, + 8, + 7, + 8, + 5, + 7, + 8, + 7, + 8, + 8, + 7, + 8, + 5, + 8, + 7, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 7, + 8, + 6, + 7, + 5, + 7, + 8, + 7, + 8, + 7, + 8, + 8, + 8, + 7, + 8, + 7, + 7, + 8, + 8, + 7, + 7, + 7, + 8, + 7, + 8, + 8, + 8, + 7, + 5, + 7, + 8, + 5, + 7, + 6, + 8, + 7, + 7, + 7, + 7, + 5, + 8, + 8, + 8, + 6, + 8, + 5, + 8, + 8, + 7, + 8, + 8, + 7, + 8, + 7, + 8, + 8, + 8, + 5, + 7, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 7, + 8, + 8, + 7, + 8, + 3, + 8, + 8, + 3, + 8, + 6, + 5, + 8, + 7, + 7, + 7, + 8, + 8, + 7, + 8, + 8, + 7, + 8, + 8, + 8, + 7, + 6, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 7, + 8, + 8, + 8, + 3, + 8, + 8, + 8, + 8, + 8, + 8, + 3, + 7, + 8, + 7, + 8, + 8, + 7, + 8, + 8, + 8, + 8, + 8, + 8, + 6, + 8, + 8, + 6, + 8, + 8, + 5, + 8, + 7, + 7, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 3, + 8, + 8, + 8, + 8, + 8, + 7, + 8, + 8, + 8, + 7, + 8, + 3, + 8, + 8, + 7, + 8, + 8, + 8, + 8, + 8, + 5, + 6, + 7, + 5, + 8, + 6, + 8, + 7, + 8, + 8, + 8, + 8, + 6, + 8, + 6, + 7, + 8, + 8, + 8, + 7, + 8, + 8, + 8, + 8, + 7, + 8, + 8, + 8, + 8, + 8, + 7, + 8, + 8, + 6, + 8, + 8, + 8, + 8, + 7, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 6, + 7, + 6, + 8, + 6, + 6, + 8, + 8, + 8, + 8, + 6, + 8, + 8, + 6, + 7, + 8, + 7, + 8, + 8, + 6, + 8, + 8, + 8, + 8, + 7, + 8, + 8, + 6, + 8, + 8, + 7, + 8, + 8, + 8, + 8, + 6, + 7, + 6, + 7, + 7, + 6, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 7, + 8, + 8, + 8, + 7, + 8, + 8, + 8, + 8, + 5, + 8, + 8, + 8, + 7, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 5, + 6, + 4, + 6, + 7, + 6, + 5, + 7, + 7, + 6, + 6, + 6, + 6, + 5, + 7, + 6, + 8, + 7, + 7, + 8, + 8, + 8, + 6, + 6, + 8, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 8, + 5, + 6, + 7, + 7, + 6, + 6, + 6, + 7, + 7, + 8, + 6, + 8, + 8, + 8, + 8, + 6, + 8, + 7, + 6, + 8, + 6, + 6, + 6, + 6, + 7, + 6, + 7, + 8, + 7, + 7, + 8, + 8, + 6, + 7, + 8, + 7, + 7, + 5, + 8, + 7, + 6, + 7, + 6, + 7, + 8, + 6, + 6, + 8, + 8, + 6, + 6, + 7, + 8, + 8, + 7, + 7, + 8, + 7, + 6, + 8, + 7, + 8, + 5, + 5, + 7, + 7, + 7, + 6, + 6, + 6, + 5, + 5, + 6, + 5, + 5, + 6, + 7, + 7, + 7, + 7, + 6, + 6, + 6, + 5, + 6, + 6, + 6, + 6, + 6, + 6, + 7, + 5, + 6, + 7, + 6, + 7, + 5, + 7, + 6, + 6, + 6, + 7, + 6, + 6, + 7, + 5, + 6, + 6, + 6, + 6, + 7, + 6, + 6, + 5, + 5, + 6, + 7, + 6, + 6, + 6, + 5, + 5, + 6, + 7, + 5, + 7, + 6, + 6, + 7, + 6, + 6, + 6, + 7, + 5, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 5, + 7, + 6, + 6, + 7, + 6, + 6, + 6, + 6, + 5, + 6, + 5, + 6, + 6, + 7, + 7, + 6, + 7, + 6, + 6, + 6, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 6, + 6, + 6, + 6, + 6, + 6, + 5, + 6, + 7, + 6, + 6, + 6, + 7, + 5, + 7, + 7, + 7, + 6, + 5, + 6, + 6, + 6, + 6, + 6, + 7, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 5, + 7, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 7, + 6, + 5, + 7, + 6, + 7, + 6, + 5, + 7, + 7, + 6, + 6, + 5, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 7, + 6, + 6, + 6, + 5, + 6, + 6, + 5, + 5, + 5, + 6, + 5, + 5, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 5, + 5, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 7, + 6, + 6, + 6, + 6, + 7, + 6, + 7, + 6, + 6, + 6, + 7, + 6, + 5, + 6, + 6, + 6, + 6, + 6, + 6, + 5, + 6, + 6, + 6, + 5, + 6, + 6, + 5, + 6, + 5, + 6, + 6, + 6, + 6, + 6, + 5, + 6, + 5, + 6, + 6, + 6, + 6, + 6, + 6, + 7, + 5, + 6, + 6, + 6, + 5, + 6, + 6, + 5, + 5, + 6, + 6, + 6, + 6, + 6, + 5, + 6, + 6, + 6, + 6, + 6, + 6, + 5, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 5, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 7, + 6, + 5, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 5, + 6, + 7, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 7, + 6, + 6, + 6, + 6, + 6, + 7, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 7, + 6, + 6, + 6, + 6, + 6, + 5, + 5, + 6, + 6, + 7, + 6, + 6, + 6, + 6, + 7, + 5, + 6, + 5, + 6, + 6, + 6, + 6, + 6, + 6, + 5, + 6, + 6, + 6, + 6, + 6, + 7, + 6, + 6, + 5, + 5, + 6, + 6, + 6, + 6, + 6, + 6, + 5, + 6, + 5, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 5, + 7, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 5, + 6, + 6, + 5, + 6, + 6, + 7, + 6, + 6, + 7, + 5, + 6, + 6, + 7, + 5, + 6, + 6, + 7, + 5, + 6, + 6, + 5, + 6, + 5, + 6, + 7, + 7, + 6, + 6, + 6, + 6, + 6, + 6, + 5, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 5, + 5, + 5, + 6, + 7, + 6, + 5, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 7, + 5, + 6, + 6, + 7, + 5, + 7, + 6, + 6, + 6, + 6, + 6, + 5, + 6, + 7, + 6, + 6, + 6, + 6, + 6, + 5, + 7, + 7, + 6, + 6, + 6, + 6, + 5, + 6, + 6, + 6, + 6, + 5, + 6, + 6, + 6, + 6, + 6, + 7, + 6, + 6, + 6, + 6, + 6, + 6, + 7, + 6, + 5, + 5, + 6, + 7, + 6, + 6, + 6, + 6, + 6, + 7, + 7, + 5, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 5, + 6, + 5, + 6, + 6, + 6, + 6, + 5, + 5, + 6, + 7, + 6, + 6, + 6, + 5, + 6, + 6, + 6, + 6, + 6, + 5, + 7, + 5, + 6, + 6, + 6, + 6, + 5, + 6, + 5, + 6, + 5, + 6, + 6, + 6, + 6, + 7, + 6, + 6, + 6, + 6, + 6, + 6, + 5, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 5, + 6, + 6, + 6, + 6, + 5, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 7, + 6, + 5, + 6, + 6, + 6, + 6, + 6, + 6, + 7, + 7, + 6, + 6, + 6, + 6, + 7, + 6, + 6, + 6, + 5, + 6, + 6, + 6, + 6, + 7, + 6, + 6, + 6, + 6, + 6, + 7, + 5, + 6, + 5, + 6, + 6, + 5, + 6, + 5, + 7, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 5, + 6, + 5, + 6, + 5, + 6, + 5, + 6, + 6, + 6, + 5, + 6, + 5, + 5, + 5, + 6, + 6, + 5, + 6, + 5, + 5, + 5, + 6, + 5, + 5, + 6, + 6, + 5, + 6, + 5, + 6, + 6, + 5, + 6, + 6, + 6, + 5, + 5, + 6, + 6, + 5, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 5, + 6, + 6, + 6, + 6, + 6, + 6, + 5, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 5, + 6, + 6, + 6, + 6, + 6, + 5, + 6, + 6, + 6, + 6, + 6, + 5, + 6, + 5, + 6, + 6, + 6, + 6, + 5, + 6, + 6, + 6, + 6, + 5, + 5, + 5, + 6, + 6, + 6, + 6, + 6, + 5, + 6, + 6, + 6, + 6, + 6, + 5, + 5, + 6, + 6, + 5, + 6, + 6, + 6, + 6, + 7, + 5, + 5, + 6, + 6, + 5, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 5, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 5, + 6, + 5, + 6, + 6, + 5, + 6, + 6, + 6, + 6, + 6, + 6, + 5, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 5, + 6, + 6, + 6, + 5, + 6, + 5, + 5, + 6, + 6, + 6, + 5, + 6, + 6, + 6, + 6, + 6, + 6, + 5, + 6, + 6, + 6, + 6, + 6, + 5, + 6, + 5, + 6, + 6, + 6, + 5, + 6, + 6, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 5, + 6, + 6, + 5, + 6, + 5, + 6, + 5, + 5, + 6, + 6, + 6, + 6, + 5, + 6, + 6, + 6, + 5, + 5, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 5, + 6, + 6, + 5, + 5, + 5, + 6, + 6, + 6, + 6, + 5, + 6, + 5, + 5, + 5, + 6, + 6, + 6, + 5, + 6, + 6, + 5, + 6, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 6, + 5, + 6, + 6, + 5, + 6, + 6, + 6, + 6, + 6, + 5, + 5, + 6, + 6, + 5, + 5, + 5, + 5, + 6, + 6, + 6, + 5, + 6, + 6, + 5, + 6, + 6, + 5, + 6, + 6, + 6, + 5, + 5, + 6, + 6, + 6, + 5, + 6, + 5, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 5, + 6, + 6, + 6, + 6, + 5, + 6, + 6, + 6, + 6, + 6, + 5, + 6, + 6, + 6, + 6, + 6, + 6, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 6, + 6, + 5, + 6, + 6, + 6, + 6, + 5, + 5, + 6, + 6, + 6, + 5, + 5, + 6, + 5, + 6, + 6, + 6, + 5, + 6, + 6, + 5, + 6, + 6, + 5, + 6, + 6, + 6, + 6, + 6, + 5, + 6, + 6, + 5, + 5, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 5, + 6, + 5, + 6, + 6, + 6, + 6, + 5, + 6, + 6, + 6, + 5, + 5, + 5, + 6, + 5, + 6, + 6, + 5, + 6, + 5, + 5, + 5, + 6, + 6, + 5, + 6, + 6, + 5, + 6, + 5, + 6, + 6, + 6, + 6, + 6, + 5, + 5, + 6, + 6, + 6, + 5, + 5, + 6, + 6, + 5, + 6, + 6, + 6, + 5, + 6, + 5, + 6, + 5, + 6, + 5, + 6, + 5, + 6, + 5, + 6, + 5, + 6, + 5, + 5, + 5, + 6, + 6, + 6, + 6, + 5, + 6, + 6, + 6, + 6, + 6, + 5, + 5, + 5, + 6, + 6, + 6, + 6, + 6, + 6, + 5, + 6, + 6, + 6, + 6, + 5, + 6, + 5, + 5, + 6, + 6, + 6, + 5, + 6, + 6, + 5, + 6, + 6, + 6, + 5, + 6, + 6, + 5, + 6, + 6, + 6, + 5, + 6, + 6, + 6, + 6, + 6, + 6, + 5, + 6, + 6, + 6, + 5, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 5, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 5, + 6, + 6, + 6, + 6, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 6, + 6, + 5, + 6, + 6, + 6, + 5, + 5, + 6, + 6, + 6, + 5, + 6, + 5, + 6, + 6, + 5, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 5, + 5, + 6, + 6, + 6, + 5, + 6, + 6, + 5, + 5, + 5, + 6, + 5, + 6, + 6, + 6, + 6, + 5, + 5, + 5, + 5, + 5, + 6, + 5, + 6, + 6, + 6, + 6, + 5, + 6, + 5, + 5, + 6, + 6, + 6, + 6, + 6, + 5, + 6, + 6, + 6, + 5, + 6, + 6, + 5, + 5, + 5, + 5, + 6, + 5, + 5, + 5, + 6, + 6, + 5, + 5, + 5, + 5, + 6, + 6, + 5, + 6, + 6, + 5, + 6, + 5, + 6, + 6, + 5, + 5, + 6, + 6, + 6, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 5, + 5, + 6, + 5, + 6, + 6, + 5, + 6, + 5, + 6, + 6, + 6, + 5, + 6, + 6, + 6, + 5, + 5, + 6, + 6, + 6, + 6, + 5, + 5, + 5, + 6, + 5, + 6, + 6, + 6, + 6, + 6, + 6, + 5, + 6, + 6, + 5, + 6, + 6, + 6, + 5, + 6, + 5, + 6, + 6, + 5, + 6, + 6, + 6, + 6, + 6, + 5, + 6, + 5, + 6, + 6, + 6, + 6, + 6, + 6, + 5, + 6, + 5, + 5, + 5, + 6, + 6, + 5, + 6, + 6, + 6, + 5, + 5, + 6, + 6, + 6, + 5, + 5, + 5, + 6, + 6, + 6, + 6, + 6, + 6, + 5, + 6, + 6, + 6, + 6, + 6, + 6, + 5, + 5, + 6, + 5, + 5, + 6, + 6, + 5, + 6, + 6, + 6, + 6, + 5, + 5, + 5, + 6, + 5, + 6, + 6, + 5, + 6, + 6, + 6, + 5, + 6, + 5, + 6, + 6, + 6, + 6, + 6, + 5, + 6, + 6, + 5, + 5, + 6, + 6, + 5, + 5, + 6, + 6, + 6, + 6, + 6, + 6, + 5, + 5, + 5, + 6, + 6, + 5, + 6, + 6, + 6, + 5, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 5, + 6, + 6, + 6, + 5, + 5, + 6, + 6, + 6, + 6, + 6, + 6, + 5, + 6, + 6, + 5, + 6, + 6, + 6, + 5, + 6, + 6, + 6, + 6, + 6, + 5, + 5, + 6, + 6, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 6, + 6, + 5, + 6, + 6, + 5, + 6, + 6, + 6, + 5, + 6, + 6, + 5, + 5, + 5, + 5, + 6, + 6, + 6, + 5, + 5, + 6, + 6, + 6, + 6, + 5, + 6, + 5, + 5, + 6, + 5, + 5, + 5, + 6, + 5, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 6, + 6, + 6, + 5, + 6, + 6, + 6, + 6, + 6, + 6, + 5, + 6, + 6, + 6, + 6, + 6, + 5, + 5, + 6, + 6, + 6, + 6, + 5, + 6, + 6, + 6, + 5, + 5, + 6, + 6, + 5, + 5, + 6, + 5, + 5, + 6, + 6, + 5, + 6, + 5, + 6, + 6, + 6, + 5, + 6, + 6, + 6, + 5, + 6, + 6, + 6, + 6, + 5, + 6, + 6, + 6, + 6, + 5, + 5, + 6, + 5, + 6, + 6, + 6, + 5, + 5, + 6, + 6, + 6, + 6, + 6, + 5, + 6, + 6, + 5, + 5, + 5, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 5, + 5, + 5, + 6, + 5, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 5, + 6, + 5, + 5, + 6, + 6, + 5, + 6, + 6, + 5, + 5, + 6, + 6, + 6, + 5, + 5, + 6, + 6, + 6, + 5, + 6, + 6, + 6, + 5, + 5, + 6, + 5, + 6, + 6, + 5, + 5, + 6, + 6, + 6, + 6, + 5, + 6, + 5, + 6, + 6, + 5, + 6, + 6, + 6, + 6, + 5, + 6, + 6, + 5, + 6, + 6, + 5, + 6, + 6, + 6, + 6, + 6, + 6, + 5, + 5, + 6, + 5, + 5, + 5, + 5, + 6, + 6, + 6, + 5, + 6, + 6, + 6, + 6, + 6, + 6, + 5, + 6, + 6, + 6, + 5, + 6, + 6, + 5, + 5, + 5 + ], + "lane_rows": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 57, + 58, + 59, + 60, + 61, + 62, + 63, + 64, + 65, + 66, + 67, + 68, + 69, + 70, + 71, + 72, + 73, + 74, + 75, + 76, + 77, + 78, + 79, + 80, + 81, + 82, + 83, + 84, + 85, + 86, + 87, + 88, + 89, + 90, + 91, + 92, + 93, + 94, + 95, + 96, + 97, + 98, + 99, + 100, + 101, + 102, + 103, + 104, + 105, + 106, + 107, + 108, + 109, + 110, + 111, + 112, + 113, + 114, + 115, + 116, + 117, + 118, + 119, + 120, + 121, + 122, + 123, + 124, + 125, + 126, + 127, + 128, + 129, + 130, + 131, + 132, + 133, + 134, + 135, + 136, + 137, + 138, + 139, + 140, + 141, + 142, + 143, + 144, + 145, + 146, + 147, + 148, + 149, + 150, + 151, + 152, + 153, + 154, + 155, + 156, + 157, + 158, + 159, + 160, + 161, + 162, + 163, + 164, + 165, + 166, + 167, + 168, + 169, + 170, + 171, + 172, + 173, + 174, + 175, + 176, + 177, + 178, + 179, + 180, + 181, + 182, + 183, + 184, + 185, + 186, + 187, + 188, + 189, + 190, + 191, + 192, + 193, + 194, + 195, + 196, + 197, + 198, + 199, + 200, + 201, + 202, + 203, + 204, + 205, + 206, + 207, + 208, + 209, + 210, + 211, + 212, + 213, + 214, + 215, + 216, + 217, + 218, + 219, + 220, + 221, + 222, + 223, + 224, + 225, + 226, + 227, + 228, + 229, + 230, + 231, + 232, + 233, + 234, + 235, + 236, + 237, + 238, + 239, + 240, + 241, + 242, + 243, + 244, + 245, + 246, + 247, + 248, + 249, + 250, + 251, + 252, + 253, + 254, + 255, + 256, + 257, + 258, + 259, + 260, + 261, + 262, + 263, + 264, + 265, + 266, + 267, + 268, + 269, + 270, + 271, + 272, + 273, + 274, + 275, + 276, + 277, + 278, + 279, + 280, + 281, + 282, + 283, + 284, + 285, + 286, + 287, + 288, + 289, + 290, + 291, + 292, + 293, + 294, + 295, + 296, + 297, + 298, + 299, + 300, + 301, + 302, + 303, + 304, + 305, + 306, + 307, + 308, + 309, + 310, + 311, + 312, + 313, + 314, + 315, + 316, + 317, + 318, + 319, + 320, + 321, + 322, + 323, + 324, + 325, + 326, + 327, + 328, + 329, + 330, + 331, + 332, + 333, + 334, + 335, + 336, + 337, + 338, + 339, + 340, + 341, + 342, + 343, + 344, + 345, + 346, + 347, + 348, + 349, + 350, + 351, + 352, + 353, + 354, + 355, + 356, + 357, + 358, + 359, + 360, + 361, + 362, + 363, + 364, + 365, + 366, + 367, + 368, + 369, + 370, + 371, + 372, + 373, + 374, + 375, + 376, + 377, + 378, + 379, + 380, + 381, + 382, + 383, + 384, + 385, + 386, + 387, + 388, + 389, + 390, + 391, + 392, + 393, + 394, + 395, + 396, + 397, + 398, + 399, + 400, + 401, + 402, + 403, + 404, + 405, + 406, + 407, + 408, + 409, + 410, + 411, + 412, + 413, + 414, + 415, + 416, + 417, + 418, + 419, + 420, + 421, + 422, + 423, + 424, + 425, + 426, + 427, + 428, + 429, + 430, + 431, + 432, + 433, + 434, + 435, + 436, + 437, + 438, + 439, + 440, + 441, + 442, + 443, + 444, + 445, + 446, + 447, + 448, + 449, + 450, + 451, + 452, + 453, + 454, + 455, + 456, + 457, + 458, + 459, + 460, + 461, + 462, + 463, + 464, + 465, + 466, + 467, + 468, + 469, + 470, + 471, + 472, + 473, + 474, + 475, + 476, + 477, + 478, + 479, + 480, + 481, + 482, + 483, + 484, + 485, + 486, + 487, + 488, + 489, + 490, + 491, + 492, + 493, + 494, + 495, + 496, + 497, + 498, + 499, + 500, + 501, + 502, + 503, + 504, + 505, + 506, + 507, + 508, + 509, + 510, + 511, + 512, + 513, + 514, + 515, + 516, + 517, + 518, + 519, + 520, + 521, + 522, + 523, + 524, + 525, + 526, + 527, + 528, + 529, + 530, + 531, + 532, + 533, + 534, + 535, + 536, + 537, + 538, + 539, + 540, + 541, + 542, + 543, + 544, + 545, + 546, + 547, + 548, + 549, + 550, + 551, + 552, + 553, + 554, + 555, + 556, + 557, + 558, + 559, + 560, + 561, + 562, + 563, + 564, + 565, + 566, + 567, + 568, + 569, + 570, + 571, + 572, + 573, + 574, + 575, + 576, + 577, + 578, + 579, + 580, + 581, + 582, + 583, + 584, + 585, + 586, + 587, + 588, + 589, + 590, + 591, + 592, + 593, + 594, + 595, + 596, + 597, + 598, + 599, + 600, + 601, + 602, + 603, + 604, + 605, + 606, + 607, + 608, + 609, + 610, + 611, + 612, + 613, + 614, + 615, + 616, + 617, + 618, + 619, + 620, + 621, + 622, + 623, + 624, + 625, + 626, + 627, + 628, + 629, + 630, + 631, + 632, + 633, + 634, + 635, + 636, + 637, + 638, + 639, + 640, + 641, + 642, + 643, + 644, + 645, + 646, + 647, + 648, + 649, + 650, + 651, + 652, + 653, + 654, + 655, + 656, + 657, + 658, + 659, + 660, + 661, + 662, + 663, + 664, + 665, + 666, + 667, + 668, + 669, + 670, + 671, + 672, + 673, + 674, + 675, + 676, + 677, + 678, + 679, + 680, + 681, + 682, + 683, + 684, + 685, + 686, + 687, + 688, + 689, + 690, + 691, + 692, + 693, + 694, + 695, + 696, + 697, + 698, + 699, + 700, + 701, + 702, + 703, + 704, + 705, + 706, + 707, + 708, + 709, + 710, + 711, + 712, + 713, + 714, + 715, + 716, + 717, + 718, + 719, + 720, + 721, + 722, + 723, + 724, + 725, + 726, + 727, + 728, + 729, + 730, + 731, + 732, + 733, + 734, + 735, + 736, + 737, + 738, + 739, + 740, + 741, + 742, + 743, + 744, + 745, + 746, + 747, + 748, + 749, + 750, + 751, + 752, + 753, + 754, + 755, + 756, + 757, + 758, + 759, + 760, + 761, + 762, + 763, + 764, + 765, + 766, + 767, + 768, + 769, + 770, + 771, + 772, + 773, + 774, + 775, + 776, + 777, + 778, + 779, + 780, + 781, + 782, + 783, + 784, + 785, + 786, + 787, + 788, + 789, + 790, + 791, + 792, + 793, + 794, + 795, + 796, + 797, + 798, + 799, + 800, + 801, + 802, + 803, + 804, + 805, + 806, + 807, + 808, + 809, + 810, + 811, + 812, + 813, + 814, + 815, + 816, + 817, + 818, + 819, + 820, + 821, + 822, + 823, + 824, + 825, + 826, + 827, + 828, + 829, + 830, + 831, + 832, + 833, + 834, + 835, + 836, + 837, + 838, + 839, + 840, + 841, + 842, + 843, + 844, + 845, + 846, + 847, + 848, + 849, + 850, + 851, + 852, + 853, + 854, + 855, + 856, + 857, + 858, + 859, + 860, + 861, + 862, + 863, + 864, + 865, + 866, + 867, + 868, + 869, + 870, + 871, + 872, + 873, + 874, + 875, + 876, + 877, + 878, + 879, + 880, + 881, + 882, + 883, + 884, + 885, + 886, + 887, + 888, + 889, + 890, + 891, + 892, + 893, + 894, + 895, + 896, + 897, + 898, + 899, + 900, + 901, + 902, + 903, + 904, + 905, + 906, + 907, + 908, + 909, + 910, + 911, + 912, + 913, + 914, + 915, + 916, + 917, + 918, + 919, + 920, + 921, + 922, + 923, + 924, + 925, + 926, + 927, + 928, + 929, + 930, + 931, + 932, + 933, + 934, + 935, + 936, + 937, + 938, + 939, + 940, + 941, + 942, + 943, + 944, + 945, + 946, + 947, + 948, + 949, + 950, + 951, + 952, + 953, + 954, + 955, + 956, + 957, + 958, + 959, + 960, + 961, + 962, + 963, + 964, + 965, + 966, + 967, + 968, + 969, + 970, + 971, + 972, + 973, + 974, + 975, + 976, + 977, + 978, + 979, + 980, + 981, + 982, + 983, + 984, + 985, + 986, + 987, + 988, + 989, + 990, + 991, + 992, + 993, + 994, + 995, + 996, + 997, + 998, + 999, + 1000, + 1001, + 1002, + 1003, + 1004, + 1005, + 1006, + 1007, + 1008, + 1009, + 1010, + 1011, + 1012, + 1013, + 1014, + 1015, + 1016, + 1017, + 1018, + 1019, + 1020, + 1021, + 1022, + 1023, + 1024, + 1025, + 1026, + 1027, + 1028, + 1029, + 1030, + 1031, + 1032, + 1033, + 1034, + 1035, + 1036, + 1037, + 1038, + 1039, + 1040, + 1041, + 1042, + 1043, + 1044, + 1045, + 1046, + 1047, + 1048, + 1049, + 1050, + 1051, + 1052, + 1053, + 1054, + 1055, + 1056, + 1057, + 1058, + 1059, + 1060, + 1061, + 1062, + 1063, + 1064, + 1065, + 1066, + 1067, + 1068, + 1069, + 1070, + 1071, + 1072, + 1073, + 1074, + 1075, + 1076, + 1077, + 1078, + 1079, + 1080, + 1081, + 1082, + 1083, + 1084, + 1085, + 1086, + 1087, + 1088, + 1089, + 1090, + 1091, + 1092, + 1093, + 1094, + 1095, + 1096, + 1097, + 1098, + 1099, + 1100, + 1101, + 1102, + 1103, + 1104, + 1105, + 1106, + 1107, + 1108, + 1109, + 1110, + 1111, + 1112, + 1113, + 1114, + 1115, + 1116, + 1117, + 1118, + 1119, + 1120, + 1121, + 1122, + 1123, + 1124, + 1125, + 1126, + 1127, + 1128, + 1129, + 1130, + 1131, + 1132, + 1133, + 1134, + 1135, + 1136, + 1137, + 1138, + 1139, + 1140, + 1141, + 1142, + 1143, + 1144, + 1145, + 1146, + 1147, + 1148, + 1149, + 1150, + 1151, + 1152, + 1153, + 1154, + 1155, + 1156, + 1157, + 1158, + 1159, + 1160, + 1161, + 1162, + 1163, + 1164, + 1165, + 1166, + 1167, + 1168, + 1169, + 1170, + 1171, + 1172, + 1173, + 1174, + 1175, + 1176, + 1177, + 1178, + 1179, + 1180, + 1181, + 1182, + 1183, + 1184, + 1185, + 1186, + 1187, + 1188, + 1189, + 1190, + 1191, + 1192, + 1193, + 1194, + 1195, + 1196, + 1197, + 1198, + 1199, + 1200, + 1201, + 1202, + 1203, + 1204, + 1205, + 1206, + 1207, + 1208, + 1209, + 1210, + 1211, + 1212, + 1213, + 1214, + 1215, + 1216, + 1217, + 1218, + 1219, + 1220, + 1221, + 1222, + 1223, + 1224, + 1225, + 1226, + 1227, + 1228, + 1229, + 1230, + 1231, + 1232, + 1233, + 1234, + 1235, + 1236, + 1237, + 1238, + 1239, + 1240, + 1241, + 1242, + 1243, + 1244, + 1245, + 1246, + 1247, + 1248, + 1249, + 1250, + 1251, + 1252, + 1253, + 1254, + 1255, + 1256, + 1257, + 1258, + 1259, + 1260, + 1261, + 1262, + 1263, + 1264, + 1265, + 1266, + 1267, + 1268, + 1269, + 1270, + 1271, + 1272, + 1273, + 1274, + 1275, + 1276, + 1277, + 1278, + 1279, + 1280, + 1281, + 1282, + 1283, + 1284, + 1285, + 1286, + 1287, + 1288, + 1289, + 1290, + 1291, + 1292, + 1293, + 1294, + 1295, + 1296, + 1297, + 1298, + 1299, + 1300, + 1301, + 1302, + 1303, + 1304, + 1305, + 1306, + 1307, + 1308, + 1309, + 1310, + 1311, + 1312, + 1313, + 1314, + 1315, + 1316, + 1317, + 1318, + 1319, + 1320, + 1321, + 1322, + 1323, + 1324, + 1325, + 1326, + 1327, + 1328, + 1329, + 1330, + 1331, + 1332, + 1333, + 1334, + 1335, + 1336, + 1337, + 1338, + 1339, + 1340, + 1341, + 1342, + 1343, + 1344, + 1345, + 1346, + 1347, + 1348, + 1349, + 1350, + 1351, + 1352, + 1353, + 1354, + 1355, + 1356, + 1357, + 1358, + 1359, + 1360, + 1361, + 1362, + 1363, + 1364, + 1365, + 1366, + 1367, + 1368, + 1369, + 1370, + 1371, + 1372, + 1373, + 1374, + 1375, + 1376, + 1377, + 1378, + 1379, + 1380, + 1381, + 1382, + 1383, + 1384, + 1385, + 1386, + 1387, + 1388, + 1389, + 1390, + 1391, + 1392, + 1393, + 1394, + 1395, + 1396, + 1397, + 1398, + 1399, + 1400, + 1401, + 1402, + 1403, + 1404, + 1405, + 1406, + 1407, + 1408, + 1409, + 1410, + 1411, + 1412, + 1413, + 1414, + 1415, + 1416, + 1417, + 1418, + 1419, + 1420, + 1421, + 1422, + 1423, + 1424, + 1425, + 1426, + 1427, + 1428, + 1429, + 1430, + 1431, + 1432, + 1433, + 1434, + 1435, + 1436, + 1437, + 1438, + 1439, + 1440, + 1441, + 1442, + 1443, + 1444, + 1445, + 1446, + 1447, + 1448, + 1449, + 1450, + 1451, + 1452, + 1453, + 1454, + 1455, + 1456, + 1457, + 1458, + 1459, + 1460, + 1461, + 1462, + 1463, + 1464, + 1465, + 1466, + 1467, + 1468, + 1469, + 1470, + 1471, + 1472, + 1473, + 1474, + 1475, + 1476, + 1477, + 1478, + 1479, + 1480, + 1481, + 1482, + 1483, + 1484, + 1485, + 1486, + 1487, + 1488, + 1489, + 1490, + 1491, + 1492, + 1493, + 1494, + 1495, + 1496, + 1497, + 1498, + 1499, + 1500, + 1501, + 1502, + 1503, + 1504, + 1505, + 1506, + 1507, + 1508, + 1509, + 1510, + 1511, + 1512, + 1513, + 1514, + 1515, + 1516, + 1517, + 1518, + 1519, + 1520, + 1521, + 1522, + 1523, + 1524, + 1525, + 1526, + 1527, + 1528, + 1529, + 1530, + 1531, + 1532, + 1533, + 1534, + 1535, + 1536, + 1537, + 1538, + 1539, + 1540, + 1541, + 1542, + 1543, + 1544, + 1545, + 1546, + 1547, + 1548, + 1549, + 1550, + 1551, + 1552, + 1553, + 1554, + 1555, + 1556, + 1557, + 1558, + 1559, + 1560, + 1561, + 1562, + 1563, + 1564, + 1565, + 1566, + 1567, + 1568, + 1569, + 1570, + 1571, + 1572, + 1573, + 1574, + 1575, + 1576, + 1577, + 1578, + 1579, + 1580, + 1581, + 1582, + 1583, + 1584, + 1585, + 1586, + 1587, + 1588, + 1589, + 1590, + 1591, + 1592, + 1593, + 1594, + 1595, + 1596, + 1597, + 1598, + 1599, + 1600, + 1601, + 1602, + 1603, + 1604, + 1605, + 1606, + 1607, + 1608, + 1609, + 1610, + 1611, + 1612, + 1613, + 1614, + 1615, + 1616, + 1617, + 1618, + 1619, + 1620, + 1621, + 1622, + 1623, + 1624, + 1625, + 1626, + 1627, + 1628, + 1629, + 1630, + 1631, + 1632, + 1633, + 1634, + 1635, + 1636, + 1637, + 1638, + 1639, + 1640, + 1641, + 1642, + 1643, + 1644, + 1645, + 1646, + 1647, + 1648, + 1649, + 1650, + 1651, + 1652, + 1653, + 1654, + 1655, + 1656, + 1657, + 1658, + 1659, + 1660, + 1661, + 1662, + 1663, + 1664, + 1665, + 1666, + 1667, + 1668, + 1669, + 1670, + 1671, + 1672, + 1673, + 1674, + 1675, + 1676, + 1677, + 1678, + 1679, + 1680, + 1681, + 1682, + 1683, + 1684, + 1685, + 1686, + 1687, + 1688, + 1689, + 1690, + 1691, + 1692, + 1693, + 1694, + 1695, + 1696, + 1697, + 1698, + 1699, + 1700, + 1701, + 1702, + 1703, + 1704, + 1705, + 1706, + 1707, + 1708, + 1709, + 1710, + 1711, + 1712, + 1713, + 1714, + 1715, + 1716, + 1717, + 1718, + 1719, + 1720, + 1721, + 1722, + 1723, + 1724, + 1725, + 1726, + 1727, + 1728, + 1729, + 1730, + 1731, + 1732, + 1733, + 1734, + 1735, + 1736, + 1737, + 1738, + 1739, + 1740, + 1741, + 1742, + 1743, + 1744, + 1745, + 1746, + 1747, + 1748, + 1749, + 1750, + 1751, + 1752, + 1753, + 1754, + 1755, + 1756, + 1757, + 1758, + 1759, + 1760, + 1761, + 1762, + 1763, + 1764, + 1765, + 1766, + 1767, + 1768, + 1769, + 1770, + 1771, + 1772, + 1773, + 1774, + 1775, + 1776, + 1777, + 1778, + 1779, + 1780, + 1781, + 1782, + 1783, + 1784, + 1785, + 1786, + 1787, + 1788, + 1789, + 1790, + 1791, + 1792, + 1793, + 1794, + 1795, + 1796, + 1797, + 1798, + 1799, + 1800, + 1801, + 1802, + 1803, + 1804, + 1805, + 1806, + 1807, + 1808, + 1809, + 1810, + 1811, + 1812, + 1813, + 1814, + 1815, + 1816, + 1817, + 1818, + 1819, + 1820, + 1821, + 1822, + 1823, + 1824, + 1825, + 1826, + 1827, + 1828, + 1829, + 1830, + 1831, + 1832, + 1833, + 1834, + 1835, + 1836, + 1837, + 1838, + 1839, + 1840, + 1841, + 1842, + 1843, + 1844, + 1845, + 1846, + 1847, + 1848, + 1849, + 1850, + 1851, + 1852, + 1853, + 1854, + 1855, + 1856, + 1857, + 1858, + 1859, + 1860, + 1861, + 1862, + 1863, + 1864, + 1865, + 1866, + 1867, + 1868, + 1869, + 1870, + 1871, + 1872, + 1873, + 1874, + 1875, + 1876, + 1877, + 1878, + 1879, + 1880, + 1881, + 1882, + 1883, + 1884, + 1885, + 1886, + 1887, + 1888, + 1889, + 1890, + 1891, + 1892, + 1893, + 1894, + 1895, + 1896, + 1897, + 1898, + 1899, + 1900, + 1901, + 1902, + 1903, + 1904, + 1905, + 1906, + 1907, + 1908, + 1909, + 1910, + 1911, + 1912, + 1913, + 1914, + 1915, + 1916, + 1917, + 1918, + 1919, + 1920, + 1921, + 1922, + 1923, + 1924, + 1925, + 1926, + 1927, + 1928, + 1929, + 1930, + 1931, + 1932, + 1933, + 1934, + 1935, + 1936, + 1937, + 1938, + 1939, + 1940, + 1941, + 1942, + 1943, + 1944, + 1945, + 1946, + 1947, + 1948, + 1949, + 1950, + 1951, + 1952, + 1953, + 1954, + 1955, + 1956, + 1957, + 1958, + 1959, + 1960, + 1961, + 1962, + 1963, + 1964, + 1965, + 1966, + 1967, + 1968, + 1969, + 1970, + 1971, + 1972, + 1973, + 1974, + 1975, + 1976, + 1977, + 1978, + 1979, + 1980, + 1981, + 1982, + 1983, + 1984, + 1985, + 1986, + 1987, + 1988, + 1989, + 1990, + 1991, + 1992, + 1993, + 1994, + 1995, + 1996, + 1997, + 1998, + 1999, + 2000, + 2001, + 2002, + 2003, + 2004, + 2005, + 2006, + 2007, + 2008, + 2009, + 2010, + 2011, + 2012, + 2013, + 2014, + 2015, + 2016, + 2017, + 2018, + 2019, + 2020, + 2021, + 2022, + 2023, + 2024, + 2025, + 2026, + 2027, + 2028, + 2029, + 2030, + 2031, + 2032, + 2033, + 2034, + 2035, + 2036, + 2037, + 2038, + 2039, + 2040, + 2041, + 2042, + 2043, + 2044, + 2045, + 2046, + 2047, + 2048, + 2049, + 2050, + 2051, + 2052, + 2053, + 2054, + 2055, + 2056, + 2057, + 2058, + 2059, + 2060, + 2061, + 2062, + 2063, + 2064, + 2065, + 2066, + 2067, + 2068, + 2069, + 2070, + 2071, + 2072, + 2073, + 2074, + 2075, + 2076, + 2077, + 2078, + 2079, + 2080, + 2081, + 2082, + 2083, + 2084, + 2085, + 2086, + 2087, + 2088, + 2089, + 2090, + 2091, + 2092, + 2093, + 2094, + 2095, + 2096, + 2097, + 2098, + 2099, + 2100, + 2101, + 2102, + 2103, + 2104, + 2105, + 2106, + 2107, + 2108, + 2109, + 2110, + 2111, + 2112, + 2113, + 2114, + 2115, + 2116, + 2117, + 2118, + 2119, + 2120, + 2121, + 2122, + 2123, + 2124, + 2125, + 2126, + 2127, + 2128, + 2129, + 2130, + 2131, + 2132, + 2133, + 2134, + 2135, + 2136, + 2137, + 2138, + 2139, + 2140, + 2141, + 2142, + 2143, + 2144, + 2145, + 2146, + 2147, + 2148, + 2149, + 2150, + 2151, + 2152, + 2153, + 2154, + 2155, + 2156, + 2157, + 2158, + 2159, + 2160, + 2161, + 2162, + 2163, + 2164, + 2165, + 2166, + 2167, + 2168, + 2169, + 2170, + 2171, + 2172, + 2173, + 2174, + 2175, + 2176, + 2177, + 2178, + 2179, + 2180, + 2181, + 2182, + 2183, + 2184, + 2185, + 2186, + 2187, + 2188, + 2189, + 2190, + 2191, + 2192, + 2193, + 2194, + 2195, + 2196, + 2197, + 2198, + 2199, + 2200, + 2201, + 2202, + 2203, + 2204, + 2205, + 2206, + 2207, + 2208, + 2209, + 2210, + 2211, + 2212, + 2213, + 2214, + 2215, + 2216, + 2217, + 2218, + 2219, + 2220, + 2221, + 2222, + 2223, + 2224, + 2225, + 2226, + 2227, + 2228, + 2229, + 2230, + 2231, + 2232, + 2233, + 2234, + 2235, + 2236, + 2237, + 2238, + 2239, + 2240, + 2241, + 2242, + 2243, + 2244, + 2245, + 2246, + 2247, + 2248, + 2249, + 2250, + 2251, + 2252, + 2253, + 2254, + 2255, + 2256, + 2257, + 2258, + 2259, + 2260, + 2261, + 2262, + 2263, + 2264, + 2265, + 2266, + 2267, + 2268, + 2269, + 2270, + 2271, + 2272, + 2273, + 2274, + 2275, + 2276, + 2277, + 2278, + 2279, + 2280, + 2281, + 2282, + 2283, + 2284, + 2285, + 2286, + 2287, + 2288, + 2289, + 2290, + 2291, + 2292, + 2293, + 2294, + 2295, + 2296, + 2297, + 2298, + 2299, + 2300, + 2301, + 2302, + 2303, + 2304, + 2305, + 2306, + 2307, + 2308, + 2309, + 2310, + 2311, + 2312, + 2313, + 2314, + 2315, + 2316, + 2317, + 2318, + 2319, + 2320, + 2321, + 2322, + 2323, + 2324, + 2325, + 2326, + 2327, + 2328, + 2329, + 2330, + 2331, + 2332, + 2333, + 2334, + 2335, + 2336, + 2337, + 2338, + 2339, + 2340, + 2341, + 2342, + 2343, + 2344, + 2345, + 2346, + 2347, + 2348, + 2349, + 2350, + 2351, + 2352, + 2353, + 2354, + 2355, + 2356, + 2357, + 2358, + 2359, + 2360, + 2361, + 2362, + 2363, + 2364, + 2365, + 2366, + 2367, + 2368, + 2369, + 2370, + 2371, + 2372, + 2373, + 2374, + 2375, + 2376, + 2377, + 2378, + 2379, + 2380, + 2381, + 2382, + 2383, + 2384, + 2385, + 2386, + 2387, + 2388, + 2389, + 2390, + 2391, + 2392, + 2393, + 2394, + 2395, + 2396, + 2397, + 2398, + 2399, + 2400, + 2401, + 2402, + 2403, + 2404, + 2405, + 2406, + 2407, + 2408, + 2409, + 2410, + 2411, + 2412, + 2413, + 2414, + 2415, + 2416, + 2417, + 2418, + 2419, + 2420, + 2421, + 2422, + 2423, + 2424, + 2425, + 2426, + 2427, + 2428, + 2429, + 2430, + 2431, + 2432, + 2433, + 2434, + 2435, + 2436, + 2437, + 2438, + 2439, + 2440, + 2441, + 2442, + 2443, + 2444, + 2445, + 2446, + 2447, + 2448, + 2449, + 2450, + 2451, + 2452, + 2453, + 2454, + 2455, + 2456, + 2457, + 2458, + 2459, + 2460, + 2461, + 2462, + 2463, + 2464, + 2465, + 2466, + 2467, + 2468, + 2469, + 2470, + 2471, + 2472, + 2473, + 2474, + 2475, + 2476, + 2477, + 2478, + 2479, + 2480, + 2481, + 2482, + 2483, + 2484, + 2485, + 2486, + 2487, + 2488, + 2489, + 2490, + 2491, + 2492, + 2493, + 2494, + 2495, + 2496, + 2497, + 2498, + 2499, + 2500, + 2501, + 2502, + 2503, + 2504, + 2505, + 2506, + 2507, + 2508, + 2509, + 2510, + 2511, + 2512, + 2513, + 2514, + 2515, + 2516, + 2517, + 2518, + 2519, + 2520, + 2521, + 2522, + 2523, + 2524, + 2525, + 2526, + 2527, + 2528, + 2529, + 2530, + 2531, + 2532, + 2533, + 2534, + 2535, + 2536, + 2537, + 2538, + 2539, + 2540, + 2541, + 2542, + 2543, + 2544, + 2545, + 2546, + 2547, + 2548, + 2549, + 2550, + 2551, + 2552, + 2553, + 2554, + 2555, + 2556, + 2557, + 2558, + 2559, + 2560, + 2561, + 2562, + 2563, + 2564, + 2565, + 2566, + 2567, + 2568, + 2569, + 2570, + 2571, + 2572, + 2573, + 2574, + 2575, + 2576, + 2577, + 2578, + 2579, + 2580, + 2581, + 2582, + 2583, + 2584, + 2585, + 2586, + 2587, + 2588, + 2589, + 2590, + 2591, + 2592, + 2593, + 2594, + 2595, + 2596, + 2597, + 2598, + 2599, + 2600, + 2601, + 2602, + 2603, + 2604, + 2605, + 2606, + 2607, + 2608, + 2609, + 2610, + 2611, + 2612, + 2613, + 2614, + 2615, + 2616, + 2617, + 2618, + 2619, + 2620, + 2621, + 2622, + 2623, + 2624, + 2625, + 2626, + 2627, + 2628, + 2629, + 2630, + 2631, + 2632, + 2633, + 2634, + 2635, + 2636, + 2637, + 2638, + 2639, + 2640, + 2641, + 2642, + 2643, + 2644, + 2645, + 2646, + 2647, + 2648, + 2649, + 2650, + 2651, + 2652, + 2653, + 2654, + 2655, + 2656, + 2657, + 2658, + 2659, + 2660, + 2661, + 2662, + 2663, + 2664, + 2665, + 2666, + 2667, + 2668, + 2669, + 2670, + 2671, + 2672, + 2673, + 2674, + 2675, + 2676, + 2677, + 2678, + 2679, + 2680, + 2681, + 2682, + 2683, + 2684, + 2685, + 2686, + 2687, + 2688, + 2689, + 2690, + 2691, + 2692, + 2693, + 2694, + 2695, + 2696, + 2697, + 2698, + 2699, + 2700, + 2701, + 2702, + 2703, + 2704, + 2705, + 2706, + 2707, + 2708, + 2709, + 2710, + 2711, + 2712, + 2713, + 2714, + 2715, + 2716, + 2717, + 2718, + 2719, + 2720, + 2721, + 2722, + 2723, + 2724, + 2725, + 2726, + 2727, + 2728, + 2729, + 2730, + 2731, + 2732, + 2733, + 2734, + 2735, + 2736, + 2737, + 2738, + 2739, + 2740, + 2741, + 2742, + 2743, + 2744, + 2745, + 2746, + 2747, + 2748, + 2749, + 2750, + 2751, + 2752, + 2753, + 2754, + 2755, + 2756, + 2757, + 2758, + 2759, + 2760, + 2761, + 2762, + 2763, + 2764, + 2765, + 2766, + 2767, + 2768, + 2769, + 2770, + 2771, + 2772, + 2773, + 2774, + 2775, + 2776, + 2777, + 2778, + 2779, + 2780, + 2781, + 2782, + 2783, + 2784, + 2785, + 2786, + 2787, + 2788, + 2789, + 2790, + 2791, + 2792, + 2793, + 2794, + 2795, + 2796, + 2797, + 2798, + 2799, + 2800, + 2801, + 2802, + 2803, + 2804, + 2805, + 2806, + 2807, + 2808, + 2809, + 2810, + 2811, + 2812, + 2813, + 2814, + 2815, + 2816, + 2817, + 2818, + 2819, + 2820, + 2821, + 2822, + 2823, + 2824, + 2825, + 2826, + 2827, + 2828, + 2829, + 2830, + 2831, + 2832, + 2833, + 2834, + 2835, + 2836, + 2837, + 2838, + 2839 + ], + "rate_pass_wall_s": 32.792798049998964 + }, + "routes": { + "b_s3_pdip": { + "label": "S3 PDIP (source-only)", + "status": "ok", + "solver": "library", + "ms": 38.91333489991666, + "log_likelihood": 28622.39485118912 + }, + "d_s3_certified_fallback": { + "label": "S3 certified active set, budget 11, PDIP fallback", + "status": "ok", + "solver": "harness-injected certified active set", + "pass_budget": 11, + "fallback": true, + "injected_solver_calls_jax": 1, + "injected_solver_calls_numpy": 0, + "ms": 30.169564400057425, + "log_likelihood": 28622.394851189252 + } + }, + "equivalence_pins": [ + { + "pin": "route d (certified, fallback) == route b (library PDIP)", + "route": "d_s3_certified_fallback", + "reference": "b_s3_pdip", + "expectation": "the certified active set returns the library's own positive solution", + "rtol": 1e-09, + "got": 28622.394851189252, + "reference_value": 28622.39485118912, + "rel_diff": 4.575691088611358e-15, + "status": "PASS" + } + ], + "reference": { + "log_evidence_s3_library": 28622.39485119987 + }, + "library_revisions": { + "PyAutoNerves": { + "head": "1fa613aa8d89a79613009fb66f5b4e2d21deb57a", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoNerves", + "module_file": "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/__init__.py" + }, + "PyAutoFit": { + "head": "dd9fbe0aab60c4a57702b1444ca031b317c91331", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoFit", + "module_file": "/mnt/ral/jnightin/PyAuto/PyAutoFit/autofit/__init__.py" + }, + "PyAutoArray": { + "head": "3de624b5b91a4efa130dc3cb0a3a0f06f85025a3", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoArray", + "module_file": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/__init__.py" + }, + "PyAutoGalaxy": { + "head": "70a61e26cd715cefe7012a38285698091246a8a4", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy", + "module_file": "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/__init__.py" + }, + "PyAutoLens": { + "head": "86054bbc19baa2f710a12e04a94fa27ab37cc354", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoLens", + "module_file": "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/__init__.py" + } + }, + "timer": { + "dataset_load": 0.0750712310000381, + "mask_and_oversample": 0.014334589999634773, + "adapt_image_build": 0.0022064340009819716, + "model_build": 0.5941284500004258, + "instance_from_vector": 0.01247954300197307, + "register_pytrees": 0.0007429010001942515, + "fit_imaging_eager": 4.552093195001362, + "s3_system_build": 3.152841222999996, + "b_s3_pdip_library_likelihood_jit_lower": 1.276441406000231, + "b_s3_pdip_library_likelihood_jit_compile": 3.437178715998016, + "b_s3_pdip_library_likelihood_jit_first_call": 0.10070659700068063, + "b_s3_pdip_library_likelihood_jit_steady_x10": 0.38913334899916663, + "d_s3_certified_fallback_library_likelihood_jit_lower": 0.4725338110001758, + "d_s3_certified_fallback_library_likelihood_jit_compile": 3.8807399610013817, + "d_s3_certified_fallback_library_likelihood_jit_first_call": 0.04021514399937587, + "d_s3_certified_fallback_library_likelihood_jit_steady_x10": 0.30169564400057425, + "captured_rate_pass": 26.004200072999083, + "captured_rate_uncertified_pdip_recheck": 6.785607401998277 + }, + "note": "Phase C1 (#304) rate pass: untimed. No millisecond here is a result. The rate is the fraction of captured lanes whose certificate failed under the named certified_fallback; the phase-C2 verdict takes it together with the timed pass." +} \ No newline at end of file diff --git a/results/breakdown/imaging/fixed_light_trace_rectangular_jitvmap16_captured_pix1_libcertified_fboff_b16_hpc_a100_fp64_fixed_light_trace.json b/results/breakdown/imaging/fixed_light_trace_rectangular_jitvmap16_captured_pix1_libcertified_fboff_b16_hpc_a100_fp64_fixed_light_trace.json new file mode 100644 index 000000000..09dce99f2 --- /dev/null +++ b/results/breakdown/imaging/fixed_light_trace_rectangular_jitvmap16_captured_pix1_libcertified_fboff_b16_hpc_a100_fp64_fixed_light_trace.json @@ -0,0 +1,5042 @@ +{ + "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": null, + "cpu_count": 124, + "jax_compilation_cache_dir": "/mnt/ral/jnightin/autolens_profiling_wt/certified-solver-phase-c1-lane-rate/output/jax_cache/fixed_light_lanerate_rectangular_pix1_time_16_certified_off_350768_22", + "autotune_cache_entries_at_start": 0, + "cache_fresh": true, + "nvidia_smi": "NVIDIA A100 80GB PCIe, 35453 MiB, 81920 MiB" + }, + "machine": { + "cpu_model": "AMD EPYC 7702 64-Core Processor", + "cpu_count_os": 124, + "nproc": 4, + "nproc_all": 124, + "nproc_note": "GNU nproc honours OMP_NUM_THREADS, so `nproc` can print 1 on a multi-core host; `nproc_all` is the core count.", + "ram_total": "928298200 kB", + "kernel": "5.14.0-687.50.1.el9_8.x86_64", + "platform": "Linux-5.14.0-687.50.1.el9_8.x86_64-x86_64-with-glibc2.34", + "python": "3.12.4", + "jax_thread_env": { + "NPROC": null + }, + "blas_thread_env": { + "OMP_NUM_THREADS": null, + "OPENBLAS_NUM_THREADS": null, + "MKL_NUM_THREADS": null, + "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" + }, + "precision": "fp64", + "configuration": { + "pixel_scale_arcsec": 0.05, + "mask_radius_arcsec": 3.5, + "image_pixels_masked": 15361, + "over_sampled_pixels": 62752, + "mesh": "rectangular", + "mesh_shape": [ + 39, + 39 + ], + "source_pixels": 1521, + "source_pixels_requested": null, + "dataset": "hst", + "dataset_sha256": { + "data.fits": "e4e833a28e9c6f6fb023cd85c0d3dde74068720256bc77a240633500e5b04fac", + "noise_map.fits": "315c6266a0acd3ac9c8da82fcd2b45a08697362481fd7a35072bab1658530ba3", + "psf.fits": "8389ba0e8bf4a09b4a561cfc246181a2fb944ed396754cd0ff76fdd22910d303" + }, + "cell_source_sha256": "06a162fcdae6b329384ec33322f443df07215d86e56f0505ac15b3d3473eb432", + "inversion_path": "dense", + "pass_budget": 11, + "pass_budget_basis": "phase 3 (autolens_profiling#255): the smallest ZERO-fallback budget per mesh, the budget a production run fixes. NOT phase 0's certifying budget (2 for Delaunay), which falls back on 67.5 % of a graded draw set and is not a production cost.", + "border_relocator_mode": "cell", + "border_relocator": true, + "border_relocator_note": "'cell' is use_border_relocator=True, which every profiling cell in this family forces; 'library' passes None and takes the shipped config default, which is what production runs. The resolved boolean is what this leg actually ran.", + "routes_selected": [ + "b", + "d" + ], + "trace_calls": 10, + "command_buffers_traced": "off", + "use_mixed_precision": false, + "tau_rel": 1e-09, + "regularization": { + "scheme": "constant", + "coefficient": 1.0 + }, + "thread_env": { + "n_threads": null, + "vars": [ + "OPENBLAS_NUM_THREADS", + "MKL_NUM_THREADS", + "OMP_NUM_THREADS", + "VECLIB_MAXIMUM_THREADS", + "NUMEXPR_NUM_THREADS" + ], + "set_to": null, + "preexisting": {}, + "overridden": {}, + "note": "Not pinned (legacy variant): recorded as found." + }, + "over_sample_size_lp_rule": { + "sub_size_list": [ + 4, + 2, + 2 + ], + "radial_list": [ + 0.3, + 0.6 + ], + "centre": [ + 0.0, + 0.0 + ] + }, + "vmap_batch": 16, + "lanes": "captured", + "arms": [ + "vmap", + "scalar" + ], + "fallback": "off", + "draw_seed": 0, + "vmap_composition": "jax.jit(jax.vmap(fn))", + "lane_rtol": 1e-09, + "vmap_flags_note": "Strict ProfileCLI.parse_cell_args rejects unknown flags. These keys record the exact batching program and prevent historical vmap(jit) artifacts from being mistaken for current jit(vmap) measurements.", + "solver_source": "library", + "solver": "certified", + "certified_fallback": "none", + "certified_pass_budget": 16, + "captured_pass": "time", + "batches": "/mnt/ral/jnightin/autolens_profiling_wt/certified-solver-phase-c1-lane-rate/results/breakdown/imaging/nautilus_batches_rectangular_pix1.npz" + }, + "solver_injection": { + "patched": null, + "part_v": "none \u2014 library mode selects the solver through al.Settings", + "part_b_route_d": { + "patched": "autoarray.inversion.inversion.inversion_util.reconstruction_positive_only_from", + "pass_budget": 11, + "fallback": true + }, + "note": "Library mode (phase B, #300): PART V's arms and references run the library's own positive-only solve, selected by Settings(positive_only_solver, certified_fallback, certified_pass_budget); nothing is injected. PART B's single-call route d (the fiducial d == b pin) still uses the phase-1 harness injection at the phase-3 budget and is not a phase-B row. The untimed certification report observes the library solve (library_solver_observed) without changing it." + }, + "routes": { + "b_s3_pdip": { + "label": "S3 PDIP (source-only)", + "status": "ok", + "solver": "library", + "ms": 38.94080659993051, + "log_likelihood": 28622.39485118912 + }, + "d_s3_certified_fallback": { + "label": "S3 certified active set, budget 11, PDIP fallback", + "status": "ok", + "solver": "harness-injected certified active set", + "pass_budget": 11, + "fallback": true, + "injected_solver_calls_jax": 1, + "injected_solver_calls_numpy": 0, + "ms": 30.230409800060443, + "log_likelihood": 28622.394851189252 + } + }, + "equivalence_pins": [ + { + "pin": "route d (certified, fallback) == route b (library PDIP)", + "route": "d_s3_certified_fallback", + "reference": "b_s3_pdip", + "expectation": "the certified active set returns the library's own positive solution", + "rtol": 1e-09, + "got": 28622.394851189252, + "reference_value": 28622.39485118912, + "rel_diff": 4.575691088611358e-15, + "status": "PASS" + } + ], + "equivalence_rtol": 1e-09, + "reference": { + "log_evidence_s0_library": 28622.394851199875, + "log_evidence_s3_library": 28622.39485119987, + "s3": { + "n_params": 1521, + "n_mapper": 1521, + "n_funcs": 0, + "edge_zeroed_pixels": 152, + "subtracted_light_flux": 5253.476646922047 + } + }, + "command_buffers": { + "wall_on_ms": 492.7899731999787, + "wall_off_ms": 495.960514699982, + "command_buffer_delta_ms": 3.17054150000331, + "command_buffer_delta_pct": 0.6433859600298066, + "traced": "off", + "compiler_option": "xla_gpu_enable_command_buffer", + "probe": { + "note": "Not taken in --vmap-batch mode: the CUPTI-inside-a-CUDA-graph probe is a phase-1 diagnostic about the JOIN, and this mode already compiles and times both the command-buffers ON and OFF executable of every arm." + }, + "note": "ONE lowering, TWO compilations, one process. wall_on_ms is the PRODUCTION program (CUDA graphs as XLA ships them) and is the number comparable to phase 5's row; wall_off_ms is the graph-less program the stage rows attribute. The delta is the launch overhead the graphs remove \u2014 it lands in device_idle and host_outside_span, not in any stage. Reconciliation is computed against wall_off_ms." + }, + "trace": { + "parser": "ProfileData.from_file(xplane) + as_text() + stack_frame_index(proto field 17)", + "stage_audit": { + "mesh_construction": [ + { + "instruction": "fusion.2", + "ms": 0.14846999999999982, + "opcode": "fusion", + "shape": "(f64[15361,2]{1,0}, s64[15361,2]{1,0}, s32[15361,2]{1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:227", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:227 (create_transforms_rank)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:396 (_transforms_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:561 (adaptive_rectangular_mappings_weights_via_interpolation_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:693 (InterpolatorRectangular._mappings_sizes_weights)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "loop_select_fusion", + "ms": 0.039597549999999926, + "opcode": "fusion", + "shape": "(u32[2,15361]{1,0}, u32[2,15361]{1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:69", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:69 (forward_interp)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:573 (adaptive_rectangular_mappings_weights_via_interpolation_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:693 (InterpolatorRectangular._mappings_sizes_weights)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/abstract.py:36 (AbstractInterpolator.mappings)" + ] + }, + { + "instruction": "loop_select_fusion.3", + "ms": 0.03488783749999943, + "opcode": "fusion", + "shape": "(u32[15361]{0}, u32[15361]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:245", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:245 (create_transforms_rank)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:396 (_transforms_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:561 (adaptive_rectangular_mappings_weights_via_interpolation_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:693 (InterpolatorRectangular._mappings_sizes_weights)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "loop_select_fusion.1", + "ms": 0.03473039374999958, + "opcode": "fusion", + "shape": "(u32[15361]{0}, u32[15361]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:245", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:245 (create_transforms_rank)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:396 (_transforms_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:561 (adaptive_rectangular_mappings_weights_via_interpolation_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:693 (InterpolatorRectangular._mappings_sizes_weights)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "loop_add_fusion", + "ms": 0.021229881249999475, + "opcode": "fusion", + "shape": "s64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:69", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:69 (forward_interp)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:573 (adaptive_rectangular_mappings_weights_via_interpolation_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:693 (InterpolatorRectangular._mappings_sizes_weights)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/abstract.py:36 (AbstractInterpolator.mappings)" + ] + }, + { + "instruction": "loop_add_fusion.3", + "ms": 0.021092224999999503, + "opcode": "fusion", + "shape": "s64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:245", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:245 (create_transforms_rank)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:396 (_transforms_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:561 (adaptive_rectangular_mappings_weights_via_interpolation_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:693 (InterpolatorRectangular._mappings_sizes_weights)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "mixed_fusion": [ + { + "instruction": "loop_divide_gather_fusion", + "ms": 0.7003358249999999, + "opcode": "fusion", + "shape": "(f64[15361,1,1,1521]{3,2,1,0}, f64[15361,1,1,1521]{3,2,1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:133", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:133 (curvature_matrix_via_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:93 (InversionImagingMapping.curvature_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:389 (AbstractInversion.curvature_reg_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "loop_broadcast_fusion.3", + "ms": 0.23251897500000013, + "opcode": "fusion", + "shape": "f64[1521,180,180]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "input_multiply_transpose_fusion", + "ms": 0.1855460125, + "opcode": "fusion", + "shape": "(f64[1369,1369]{1,0}, f64[1369,1369]{1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:237 (active_set_search)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:293 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:274 (_certified_positive_only_from)" + ] + }, + { + "instruction": "loop_broadcast_fusion", + "ms": 0.13649223125000007, + "opcode": "fusion", + "shape": "f64[15361,1521]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:342", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:342 (mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/abstract.py:283 (Mapper.mapping_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:91 (AbstractInversionImaging._mapping_matrix_for_convolution_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:137 (AbstractInversionImaging.operated_mapping_matrix_list)" + ] + }, + { + "instruction": "input_reduce_fusion.3", + "ms": 0.11361058749999996, + "opcode": "fusion", + "shape": "f64[92,1521]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/inversion_imaging_util.py:123", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/inversion_imaging_util.py:123 (data_vector_via_blurred_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:67 (InversionImagingMapping.data_vector)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:699 (AbstractInversion.reconstruction)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "input_reduce_fusion.6", + "ms": 0.11175777499999999, + "opcode": "fusion", + "shape": "f64[15361]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:163", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:163 (mapped_reconstructed_data_via_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:120 (InversionImagingMapping._mapped_reconstructed_data_dict_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:196 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + } + ], + "border_relocator": [ + { + "instruction": "eigh.0", + "ms": 0.07437944374999991, + "opcode": "custom-call", + "shape": "(f64[2,2]{0,1}, f64[2]{0}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:245", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:245 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:415 (BorderRelocator.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:83 (AbstractMesh.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/rectangular_rtu_adapt_density.py:267 (RectangularRTUAdaptDensity.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "custom-call.2", + "ms": 0.007910456250000001, + "opcode": "custom-call", + "shape": "(f64[2,2]{1,0}, s8[4194304]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:242", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:242 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:415 (BorderRelocator.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:83 (AbstractMesh.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/rectangular_rtu_adapt_density.py:267 (RectangularRTUAdaptDensity.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "input_reduce_fusion.7", + "ms": 0.005284137500000001, + "opcode": "fusion", + "shape": "(f64[], f64[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:270", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:270 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:415 (BorderRelocator.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:83 (AbstractMesh.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/rectangular_rtu_adapt_density.py:267 (RectangularRTUAdaptDensity.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "loop_add_fusion.5", + "ms": 0.003600881249999995, + "opcode": "fusion", + "shape": "f64[15361]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:308", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:308 (relocated_grid_via_ellipse_border_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:423 (BorderRelocator.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:83 (AbstractMesh.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/rectangular_rtu_adapt_density.py:267 (RectangularRTUAdaptDensity.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "input_concatenate_fusion.4", + "ms": 0.0023745499999999996, + "opcode": "fusion", + "shape": "f64[392,2]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:238", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:238 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:415 (BorderRelocator.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:83 (AbstractMesh.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/rectangular_rtu_adapt_density.py:267 (RectangularRTUAdaptDensity.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "input_reduce_fusion.14", + "ms": 0.001610337499999999, + "opcode": "fusion", + "shape": "f64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:256", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:256 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:415 (BorderRelocator.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:83 (AbstractMesh.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/rectangular_rtu_adapt_density.py:267 (RectangularRTUAdaptDensity.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + } + ], + "other": [ + { + "instruction": "copy.41", + "ms": 0.0303602312499998, + "opcode": "copy", + "shape": "u32[2,15361]{1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "copy.42", + "ms": 0.030067275000000313, + "opcode": "copy", + "shape": "u32[2,15361]{1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "copy.59", + "ms": 0.028573787500000766, + "opcode": "copy", + "shape": "u32[15361]{0}", + "source": "", + "stack": [] + }, + { + "instruction": "copy.51", + "ms": 0.028510237500000833, + "opcode": "copy", + "shape": "u32[15361]{0}", + "source": "", + "stack": [] + }, + { + "instruction": "copy.50", + "ms": 0.028448731250000973, + "opcode": "copy", + "shape": "u32[15361]{0}", + "source": "", + "stack": [] + }, + { + "instruction": "copy.60", + "ms": 0.02844560625000095, + "opcode": "copy", + "shape": "u32[15361]{0}", + "source": "", + "stack": [] + } + ], + "pdip_solve": [ + { + "instruction": "cholesky.40", + "ms": 8.861813318750002, + "opcode": "custom-call", + "shape": "(f64[1369,1369]{0,1}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:252 (active_set_search..body_fun)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:262 (active_set_search)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:293 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)" + ] + }, + { + "instruction": "triangular-solve.1", + "ms": 1.5525129624999907, + "opcode": "custom-call", + "shape": "(f64[1369,1]{0,1}, s8[0]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:154", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:154 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:252 (active_set_search..body_fun)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:262 (active_set_search)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:293 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)" + ] + }, + { + "instruction": "triangular-solve", + "ms": 1.3149034812500089, + "opcode": "custom-call", + "shape": "(f64[1369,1]{0,1}, s8[0]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:154", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:154 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:252 (active_set_search..body_fun)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:262 (active_set_search)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:293 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)" + ] + }, + { + "instruction": "cholesky.60", + "ms": 0.8453678250000011, + "opcode": "custom-call", + "shape": "(f64[1369,1369]{0,1}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:237 (active_set_search)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:293 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:274 (_certified_positive_only_from)" + ] + }, + { + "instruction": "cholesky.70", + "ms": 0.838412799999998, + "opcode": "custom-call", + "shape": "(f64[1369,1369]{0,1}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:297 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:274 (_certified_positive_only_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:496 (reconstruction_positive_only_from)" + ] + }, + { + "instruction": "input_transpose_fusion.1", + "ms": 0.3112221062500004, + "opcode": "fusion", + "shape": "f64[1369,1369]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:252 (active_set_search..body_fun)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:262 (active_set_search)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:293 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)" + ] + } + ], + "mapping_matrix": [ + { + "instruction": "input_reduce_fusion.20", + "ms": 0.0028111124999999995, + "opcode": "fusion", + "shape": "f64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:93", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:93 (adaptive_pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/abstract.py:507 (Mapper.pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt.py:339 (Adapt.regularization_weights_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt.py:362 (Adapt.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)" + ] + } + ], + "regularization_H": [ + { + "instruction": "input_scatter_fusion.8", + "ms": 0.002840362499999999, + "opcode": "fusion", + "shape": "f64[1521,1521]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt.py:123", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt.py:123 (weighted_regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt.py:366 (Adapt.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:332 (AbstractInversion.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "psf_convolution_mapping_matrix": [ + { + "instruction": "fft.19.0", + "ms": 1.7862128062499991, + "opcode": "fft", + "shape": "f64[1521,180,180]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "input_scatter_fusion", + "ms": 1.4272017124999998, + "opcode": "fusion", + "shape": "f64[1521,180,180]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "fft.15.0", + "ms": 1.3883661874999982, + "opcode": "fft", + "shape": "c128[1521,180,91]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "fft.17.0", + "ms": 0.9928161124999997, + "opcode": "fft", + "shape": "c128[1521,91,180]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "input_transpose_fusion.2", + "ms": 0.5221779874999999, + "opcode": "fusion", + "shape": "c128[1521,91,180]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "wrapped_transpose.2", + "ms": 0.50538510625, + "opcode": "fusion", + "shape": "c128[1521,180,91]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + } + ], + "curvature_matrix_F": [ + { + "instruction": "cublas-lt-matmul.2", + "ms": 4.349770500000001, + "opcode": "custom-call", + "shape": "(f64[1521,1521]{1,0}, s8[4194304]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:134", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:134 (curvature_matrix_via_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:93 (InversionImagingMapping.curvature_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:389 (AbstractInversion.curvature_reg_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "inversion_other": [ + { + "instruction": "cholesky.80", + "ms": 0.9205718187500017, + "opcode": "custom-call", + "shape": "(f64[1521,1521]{0,1}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986 (AbstractInversion._log_det_symmetric_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:1078 (AbstractInversion.log_det_curvature_reg_matrix_term)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:347 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/model/analysis.py:135 (AnalysisImaging.log_likelihood_function)" + ] + }, + { + "instruction": "cholesky.90", + "ms": 0.9019525062500009, + "opcode": "custom-call", + "shape": "(f64[1521,1521]{0,1}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986 (AbstractInversion._log_det_symmetric_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:1157 (AbstractInversion.log_det_regularization_matrix_term)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:348 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/model/analysis.py:135 (AnalysisImaging.log_likelihood_function)" + ] + }, + { + "instruction": "loop_reduce_window_fusion.3", + "ms": 0.005837662500000002, + "opcode": "fusion", + "shape": "s64[6,16]{1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "loop_reduce_window_fusion.2", + "ms": 0.0030367124999999932, + "opcode": "fusion", + "shape": "s64[86,16]{1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "input_scatter_fusion.9", + "ms": 0.0025597687499999953, + "opcode": "fusion", + "shape": "s64[1369]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:527", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:527 (AbstractInversion.zeroed_ids_to_keep)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:567 (AbstractInversion.solve_ids_to_keep)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:684 (AbstractInversion.reconstruction)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "loop_broadcast_fusion.4", + "ms": 0.001910556249999998, + "opcode": "fusion", + "shape": "(s64[1369]{0}, s64[1369]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:527", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:527 (AbstractInversion.zeroed_ids_to_keep)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:567 (AbstractInversion.solve_ids_to_keep)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:684 (AbstractInversion.reconstruction)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "chi_squared_evidence": [ + { + "instruction": "loop_multiply_fusion", + "ms": 0.002975749999999999, + "opcode": "fusion", + "shape": "f64[15361]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/abstract_ndarray.py:300", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/abstract_ndarray.py:300 (AbstractNDArray.__pow__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/abstract_ndarray.py:60 (unwrap_array..wrapper)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/abstract_ndarray.py:35 (to_new_array..wrapper)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_util.py:78 (chi_squared_map_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:78 (AbstractFit.chi_squared_map)" + ] + } + ] + }, + "stage_audit_note": "The HLO instructions that contributed most of each stage's milliseconds, with their full source stack. A stage row is only as good as the rules that built it; this is how a reader checks a row against the HLO instead of trusting it.", + "untraced_wall_ms": 30.995313312496364, + "reconciliation_vs_untraced_pct": 6.608653897451632, + "wall_basis": "wall_ms is the TRACED run's wall, the run these kernel durations came from. untraced_wall_ms is the same executable without the profiler; the difference is the profiler's overhead and belongs in neither the stages nor the idle row.", + "calls": 160, + "call_split": "per-call (first-instruction recurrence)", + "call_blocks": 160, + "events": 89090, + "streams": [ + "Stream #14(Memset,MemcpyD2H,Compute,MemcpyH2D,MemcpyD2D)" + ], + "per_stage_ms": { + "border_relocator": { + "median_ms": 0.0966555, + "min_ms": 0.09599800000000003, + "max_ms": 0.09759799999999999 + }, + "chi_squared_evidence": { + "median_ms": 0.0029595000000000003, + "min_ms": 0.002815, + "max_ms": 0.003296 + }, + "curvature_matrix_F": { + "median_ms": 4.327062, + "min_ms": 4.305276, + "max_ms": 4.522166 + }, + "inversion_other": { + "median_ms": 1.838941, + "min_ms": 1.823593, + "max_ms": 1.862181 + }, + "mapping_matrix": { + "median_ms": 0.002816, + "min_ms": 0.002783, + "max_ms": 0.002849 + }, + "memset": { + "median_ms": 0.040222999999999995, + "min_ms": 0.014975999999999998, + "max_ms": 0.05491200000000002 + }, + "mesh_construction": { + "median_ms": 0.3445290000000001, + "min_ms": 0.3419430000000003, + "max_ms": 0.3463909999999999 + }, + "mixed_fusion": { + "median_ms": 1.8530155000000004, + "min_ms": 1.8474620000000004, + "max_ms": 1.858663 + }, + "other": { + "median_ms": 0.18080299999999977, + "min_ms": 0.18034199999999972, + "max_ms": 0.18120699999999973 + }, + "pdip_solve": { + "median_ms": 16.078145999999997, + "min_ms": 4.668055, + "max_ms": 21.500268000000016 + }, + "psf_convolution_mapping_matrix": { + "median_ms": 6.6214715, + "min_ms": 6.607412999999999, + "max_ms": 6.6393819999999995 + }, + "regularization_H": { + "median_ms": 0.002816, + "min_ms": 0.002432, + "max_ms": 0.0032 + } + }, + "stage_order": [ + "border_relocator", + "mesh_construction", + "mapping_matrix", + "psf_convolution_mapping_matrix", + "curvature_matrix_F", + "regularization_H", + "pdip_solve", + "chi_squared_evidence", + "inversion_other", + "mixed_fusion", + "other", + "memset" + ], + "mixed_fusion": { + "ms": 1.8530155000000004, + "constituent_stage_sets": { + "curvature_matrix_F + psf_convolution_mapping_matrix": 0.7003358249999999, + "pdip_solve + psf_convolution_mapping_matrix": 0.23251897500000013, + "inversion_other + mapped_reconstruction + pdip_solve + reconstruction_scatter": 0.1855460125, + "mapping_matrix + pdip_solve": 0.13883138125000027, + "data_vector_D + pdip_solve": 0.11732490625000003, + "mapped_reconstruction + pdip_solve": 0.11175777499999999, + "border_relocator + pdip_solve": 0.07066861875000008, + "mesh_construction + pdip_solve": 0.03856215000000002, + "inversion_other + regularization_H": 0.03077855624999999, + "inversion_other + pdip_solve": 0.030346618749999933, + "border_relocator + mesh_construction + pdip_solve": 0.02686664375000001, + "curvature_reg_reduce_gather + inversion_other": 0.025528625, + "border_relocator + inversion_other + mapping_matrix + mesh_construction + pdip_solve": 0.020533562500000012, + "pdip_solve + regularization_H": 0.019172987499999985, + "inversion_other + mapping_matrix + pdip_solve + regularization_H": 0.015526856249999997, + "inversion_other + mapping_matrix + mesh_construction": 0.012942187500000008, + "pdip_solve + ray_trace_data_grid": 0.012830974999999996, + "grids_and_structures + mass_profile_deflections + pdip_solve": 0.009855012500000006, + "inversion_other + mapped_reconstruction + reconstruction_scatter": 0.009664968750000004, + "inversion_other + mapped_reconstruction + pdip_solve": 0.009102518749999993, + "chi_squared_evidence + pdip_solve": 0.0076110499999999925, + "inversion_other + mesh_construction + pdip_solve": 0.005480099999999985, + "grids_and_structures + mass_profile_deflections + ray_trace_data_grid": 0.005286868749999997, + "inversion_other + pdip_solve + ray_trace_data_grid": 0.004893300000000005, + "border_relocator + mesh_construction": 0.003445131250000003, + "border_relocator + inversion_other": 0.003382518750000002, + "border_relocator + inversion_other + mesh_construction + pdip_solve": 0.0024909624999999995, + "chi_squared_evidence + inversion_other": 0.001795793750000001 + }, + "example_kernels": { + "curvature_matrix_F + psf_convolution_mapping_matrix": [ + "loop_divide_gather_fusion" + ], + "pdip_solve + psf_convolution_mapping_matrix": [ + "loop_broadcast_fusion.3" + ], + "inversion_other + mapped_reconstruction + pdip_solve + reconstruction_scatter": [ + "input_multiply_transpose_fusion" + ], + "mapping_matrix + pdip_solve": [ + "loop_divide_fusion.1", + "loop_broadcast_fusion" + ], + "data_vector_D + pdip_solve": [ + "input_reduce_fusion.3", + "input_reduce_fusion.18" + ], + "mapped_reconstruction + pdip_solve": [ + "input_reduce_fusion.6" + ], + "border_relocator + pdip_solve": [ + "input_reduce_fusion.8", + "loop_select_sine_fusion", + "input_concatenate_fusion.1", + "input_transpose_fusion.6" + ], + "mesh_construction + pdip_solve": [ + "loop_multiply_fusion.2", + "loop_pad_fusion", + "loop_reduce_fusion", + "triton_softmax.1" + ], + "inversion_other + regularization_H": [ + "input_transpose_fusion.4" + ], + "inversion_other + pdip_solve": [ + "input_scatter_fusion.11", + "input_reduce_fusion.9", + "input_reduce_fusion.16", + "input_reduce_fusion.4" + ] + }, + "prorated_estimate_ms": { + "psf_convolution_mapping_matrix": 0.46642740000000005, + "pdip_solve": 0.46354291406250014, + "curvature_matrix_F": 0.35016791249999996, + "inversion_other": 0.11494141822916662, + "mapped_reconstruction": 0.10852121979166665, + "mapping_matrix": 0.08171817968750014, + "data_vector_D": 0.058662453125000014, + "border_relocator": 0.052433135416666714, + "reconstruction_scatter": 0.049608159375, + "mesh_construction": 0.04082940416666668, + "regularization_H": 0.02885748593749999, + "curvature_reg_reduce_gather": 0.0127643125, + "ray_trace_data_grid": 0.009808877083333334, + "grids_and_structures": 0.005047293750000001, + "mass_profile_deflections": 0.005047293750000001, + "chi_squared_evidence": 0.004703421874999997 + }, + "prorated_note": "ESTIMATE ONLY \u2014 a mixed fusion's time split equally across the stages its constituents span. Never summed into the measured table, never reconciled." + }, + "other_sources_ms": { + "copy.41": 0.0303602312499998, + "copy.42": 0.030067275000000313, + "copy.59": 0.028573787500000766, + "copy.51": 0.028510237500000833, + "copy.50": 0.028448731250000973, + "copy.60": 0.02844560625000095, + "copy.96": 0.001685175000000001, + "copy.95": 0.0016329874999999993, + "copy.52": 0.0015435812499999988, + "copy.34": 0.001537562499999998 + }, + "device_span_ms": 31.929734237500004, + "device_busy_ms": 30.27548594375, + "device_idle_ms": 1.6542482937500047, + "largest_idle_gaps": [ + { + "gap_ms": 0.052286, + "after": "input_concatenate_fusion.4", + "before": "custom-call.2" + }, + { + "gap_ms": 0.033983, + "after": "loop_multiply_fusion.1", + "before": "eigh.0" + }, + { + "gap_ms": 0.031711, + "after": "while.26", + "before": "input_transpose_fusion" + }, + { + "gap_ms": 0.026815, + "after": "while.26", + "before": "input_transpose_fusion" + }, + { + "gap_ms": 0.025087, + "after": "loop_add_fusion.3", + "before": "loop_select_fusion.3" + }, + { + "gap_ms": 0.023615, + "after": "loop_broadcast_fusion.6", + "before": "loop_broadcast_fusion.8" + }, + { + "gap_ms": 0.020256, + "after": "eigh.0", + "before": "eigh.0" + }, + { + "gap_ms": 0.019296, + "after": "copy.50", + "before": "copy.51" + } + ], + "kernel_ms": 31.389438, + "sum_ms": 33.04368629375, + "wall_ms": 31.936779850002498, + "host_outside_span_ms": 0.007045612502494691, + "reconciliation_pct": 3.4659300309746626, + "unjoined_ms": 0.0, + "unjoined_pct": 0.0, + "other_ms": 0.18080299999999977, + "other_pct": 0.5661278339556379, + "note": "Stage rows attribute the command-buffers-OFF program (see the module docstring): kernel times are the same, the launch overhead the CUDA graphs remove is not. sum_ms = kernel rows + device_idle_ms; the residual against wall_ms is host_outside_span_ms (dispatch before the first kernel, teardown after the last).", + "per_stage_ms_per_lane": { + "border_relocator": 0.0966555, + "chi_squared_evidence": 0.0029595000000000003, + "curvature_matrix_F": 4.327062, + "inversion_other": 1.838941, + "mapping_matrix": 0.002816, + "memset": 0.040222999999999995, + "mesh_construction": 0.3445290000000001, + "mixed_fusion": 1.8530155000000004, + "other": 0.18080299999999977, + "pdip_solve": 16.078145999999997, + "psf_convolution_mapping_matrix": 6.6214715, + "regularization_H": 0.002816 + }, + "per_lane_divisor": 1, + "host_callback": { + "pure_callback_span_ms": 0, + "qhull_ms": 0.0, + "callback_body_ms_note": "the OUTERMOST matching body event, not a sum: under the probe the body appears twice (the wrapper and the timed re-implementation it calls) and summing them would count the same work twice", + "events_by_name": { + "ThenExecuteCallback:GetEventForComputeStreamSyncPoint": { + "count": 160, + "ms": 0.2977295000000001 + } + }, + "note": "HOST milliseconds per traced BATCH (the whole invocation), aggregated by name because the events nest. Not a row of the device table: the device pays for them as the idle gaps largest_idle_gaps names." + }, + "host_callback_ms": 0 + }, + "hlo_census": { + "status": "excluded", + "reason": "The legacy census anchors PyAutoArray source line numbers that moved after the phase-1 run. No batched attribution is published from unsupported anchors; the device-event table and wall reconciliation remain valid." + }, + "stage_map_provenance": [ + { + "label": "log_det_curvature_reg", + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 850, + 882 + ], + "requires": { + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 884, + 896 + ] + }, + "function": null + }, + { + "label": "log_det_regularization", + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 850, + 882 + ], + "requires": { + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 897, + 943 + ] + }, + "function": null + }, + { + "label": "curvature_reg_add", + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 359, + 372 + ], + "requires": null, + "function": null + }, + { + "label": "curvature_reg_reduce_gather", + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 374, + 398 + ], + "requires": null, + "function": null + }, + { + "label": "edge_subset_gather", + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 606, + 614 + ], + "requires": null, + "function": null + }, + { + "label": "regularization_term", + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 786, + 849 + ], + "requires": null, + "function": null + }, + { + "label": "mapped_reconstruction", + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 722, + 785 + ], + "requires": null, + "function": null + }, + { + "label": "reconstruction_scatter", + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 583, + 605 + ], + "requires": null, + "function": null + }, + { + "label": "reconstruction_scatter", + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 615, + 721 + ], + "requires": null, + "function": null + }, + { + "label": "certified_active_set_solve", + "path": "likelihood_breakdown/active_set_steps.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "certified_active_set_solve", + "path": "likelihood_breakdown/library_solver_injection.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "pdip_solve", + "path": "PyAutoArray/autoarray/util/jax_nnls.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "pdip_solve", + "path": "PyAutoArray/autoarray/inversion/inversion/inversion_util.py", + "lines": [ + 256, + 488 + ], + "requires": null, + "function": null + }, + { + "label": "mapped_reconstruction", + "path": "PyAutoArray/autoarray/inversion/inversion/inversion_util.py", + "lines": [ + 156, + 200 + ], + "requires": null, + "function": null + }, + { + "label": "curvature_matrix_F", + "path": "PyAutoArray/autoarray/inversion/inversion/inversion_util.py", + "lines": [ + 12, + 155 + ], + "requires": null, + "function": null + }, + { + "label": "reconstruction_scatter", + "path": "PyAutoArray/autoarray/inversion/inversion/inversion_util.py", + "lines": [ + 201, + 255 + ], + "requires": null, + "function": null + }, + { + "label": "data_vector_D", + "path": "PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py", + "lines": [ + 54, + 73 + ], + "requires": null, + "function": null + }, + { + "label": "curvature_matrix_F", + "path": "PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py", + "lines": [ + 74, + 110 + ], + "requires": null, + "function": null + }, + { + "label": "data_vector_D", + "path": "PyAutoArray/autoarray/inversion/inversion/imaging/inversion_imaging_util.py", + "lines": null, + "requires": null, + "function": "data_vector_via_blurred_mapping_matrix_from" + }, + { + "label": "curvature_matrix_F", + "path": "PyAutoArray/autoarray/inversion/inversion/imaging/inversion_imaging_util.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "psf_convolution_mapping_matrix", + "path": "likelihood_breakdown/psf_cube_injection.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "psf_convolution_mapping_matrix", + "path": "PyAutoArray/autoarray/operators/convolver.py", + "lines": [ + 1086, + 1300 + ], + "requires": null, + "function": null + }, + { + "label": "psf_convolution_mapping_matrix", + "path": "PyAutoArray/autoarray/operators/convolver.py", + "lines": [ + 632, + 642 + ], + "requires": null, + "function": null + }, + { + "label": "psf_convolution_mapping_matrix", + "path": "PyAutoArray/autoarray/operators/convolver.py", + "lines": [ + 670, + 691 + ], + "requires": null, + "function": null + }, + { + "label": "psf_convolution_mapping_matrix", + "path": "PyAutoArray/autoarray/operators/convolver.py", + "lines": null, + "requires": { + "path": "PyAutoArray/autoarray/operators/convolver.py", + "lines": [ + 1086, + 1300 + ] + }, + "function": null + }, + { + "label": "psf_convolution_mapping_matrix", + "path": "PyAutoArray/autoarray/operators/convolver.py", + "lines": null, + "requires": { + "path": "PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py", + "lines": [ + 119, + 150 + ] + }, + "function": null + }, + { + "label": "psf_convolution_image", + "path": "PyAutoArray/autoarray/operators/convolver.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "psf_convolution_mapping_matrix", + "path": "PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py", + "lines": [ + 119, + 150 + ], + "requires": null, + "function": null + }, + { + "label": "mesh_qhull_callback", + "path": "PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py", + "lines": [ + 139, + 172 + ], + "requires": null, + "function": null + }, + { + "label": "mesh_seed_argmin", + "path": "PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py", + "lines": [ + 173, + 207 + ], + "requires": null, + "function": null + }, + { + "label": "mesh_locate_walk", + "path": "PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py", + "lines": [ + 208, + 372 + ], + "requires": null, + "function": null + }, + { + "label": "mesh_dual_areas", + "path": "PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py", + "lines": [ + 373, + 396 + ], + "requires": null, + "function": null + }, + { + "label": "mesh_dual_areas", + "path": "PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py", + "lines": [ + 437, + 494 + ], + "requires": null, + "function": null + }, + { + "label": "mesh_dual_areas", + "path": "PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py", + "lines": [ + 605, + 615 + ], + "requires": null, + "function": null + }, + { + "label": "mesh_interpolation_weights", + "path": "PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py", + "lines": [ + 616, + 695 + ], + "requires": null, + "function": null + }, + { + "label": "mesh_interpolation_weights", + "path": "PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py", + "lines": [ + 896, + 1000 + ], + "requires": null, + "function": null + }, + { + "label": "mesh_construction", + "path": "PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "border_relocator", + "path": "PyAutoArray/autoarray/inversion/mesh/border_relocator.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "mesh_construction", + "path": "PyAutoArray/autoarray/inversion/mesh/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "mapping_matrix", + "path": "PyAutoArray/autoarray/inversion/mappers/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "mapping_matrix", + "path": "PyAutoArray/autoarray/inversion/mappings/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "mapping_matrix", + "path": "PyAutoArray/autoarray/inversion/linear_obj/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "regularization_H", + "path": "PyAutoArray/autoarray/inversion/regularization/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "chi_squared_evidence", + "path": "PyAutoArray/autoarray/fit/fit_util.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "chi_squared_evidence", + "path": "PyAutoArray/autoarray/fit/fit_dataset.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "ray_trace_mesh_grid", + "path": "PyAutoLens/autolens/lens/to_inversion.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "ray_trace_mesh_grid", + "path": "PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "mass_profile_deflections", + "path": "PyAutoGalaxy/autogalaxy/profiles/mass/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "light_profile_image", + "path": "PyAutoGalaxy/autogalaxy/profiles/light/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "light_profile_image", + "path": "PyAutoGalaxy/autogalaxy/operate/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "ray_trace_data_grid", + "path": "PyAutoLens/autolens/lens/tracer.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "ray_trace_data_grid", + "path": "PyAutoLens/autolens/lens/tracer_util.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "grids_and_structures", + "path": "PyAutoArray/autoarray/structures/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "grids_and_structures", + "path": "PyAutoArray/autoarray/operators/over_sampling/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "grids_and_structures", + "path": "PyAutoArray/autoarray/geometry/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "inversion_other", + "path": "PyAutoArray/autoarray/inversion/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "fit_imaging_other", + "path": "PyAutoLens/autolens/imaging/fit_imaging.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "fit_imaging_other", + "path": "PyAutoGalaxy/autogalaxy/imaging/fit_imaging.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "fit_imaging_other", + "path": "PyAutoArray/autoarray/fit/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "analysis_other", + "path": "PyAutoLens/autolens/analysis/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "analysis_other", + "path": "PyAutoGalaxy/autogalaxy/analysis/", + "lines": null, + "requires": null, + "function": null + } + ], + "trace_timing": { + "traced_wall_ms": 31.936779850002498, + "untraced_wall_ms": 30.995313312496364, + "profiler_overhead_ms": 0.941466537506134, + "profiler_overhead_pct": 3.0374480425934696 + }, + "jit_phases": { + "b_s3_pdip_library_likelihood_jit": { + "lower_s": 1.2775583429975086, + "compile_s": 3.3500151180014655, + "first_call_s": 0.11060720900059096, + "steady_per_call_s": 0.03894080659993051 + }, + "d_s3_certified_fallback_library_likelihood_jit": { + "lower_s": 0.4704094159969827, + "compile_s": 3.8768692949997785, + "first_call_s": 0.04782125299971085, + "steady_per_call_s": 0.03023040980006044 + } + }, + "peak_bytes": { + "after_setup": 85616640, + "after_routes": 1197479168, + "after_all": 19155302656, + "note": "jax.devices()[0].memory_stats()['peak_bytes_in_use']; None on a backend that does not report it (CPU). Process-wide high-water marks." + }, + "note": "Every stage row is a MEASURED sum of GPU kernel durations joined to library source through the optimized HLO of ONE program \u2014 not arithmetic across compilations. The rows attribute the command-buffers-OFF program: kernel time is the same as production, the launch overhead the CUDA graphs remove is not, and command_buffers.* carries both walls and their delta. sum_ms = kernel rows + measured device_idle_ms; the residual against the wall is host_outside_span_ms and is reported, not absorbed. mixed_fusion.prorated_estimate_ms is an ESTIMATE and is never part of the table. No row may be quoted if reconciliation_pct is outside 5 % or unjoined_ms is non-zero.", + "vmap": { + "batch": 16, + "lanes_mode": "captured", + "arms": [ + "vmap", + "scalar" + ], + "draw_seed": 0, + "fallback": false, + "composition": "jax.jit(jax.vmap(fn))", + "composition_provenance": "Current Fitness._vmap after PyAutoFit#1638. Array 343376 used the retired jax.vmap(jax.jit(fn)) composition and is historical evidence only.", + "headline_arm": "scalar", + "lane_rtol": 1e-09, + "lanes": [ + { + "lane": 0, + "draw_name": "call00015_lane00", + "draw_kind": "captured", + "offsets": { + "centre_0": 0.0017002711605432041, + "centre_1": -0.009377257327484623, + "ell_comps_0": -0.002548851608736212, + "ell_comps_1": -0.004262475027349674, + "einstein_radius": -0.0230617600435421 + }, + "log_likelihood_vmap": 18463.288067231657, + "log_likelihood_scalar": 18463.28806683203, + "log_likelihood_library_pdip": 18463.07897110663, + "log_likelihood_library_pdip_scalar": 18463.078970707007, + "rel_diff_vmap_vs_library_pdip": 1.1325095091253122e-05, + "rel_diff_scalar_vs_library_pdip_scalar": 1.1325095091301208e-05, + "abs_diff_nats": 3.996283339802176e-07, + "rel_diff": 2.1644483503353945e-11, + "rel_diff_scalar_vs_library_pdip": 1.1325073446524493e-05, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 3.996246960014105e-07, + "rel_diff_library_pdip_vmap_vs_scalar": 2.1644531588444352e-11, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "FAIL", + "certified": false, + "passes": 16, + "pdip_iter": null + }, + { + "lane": 1, + "draw_name": "call00015_lane01", + "draw_kind": "captured", + "offsets": { + "centre_0": 0.00044835385344320865, + "centre_1": -0.003464237160596487, + "ell_comps_0": -0.0010036884316776545, + "ell_comps_1": 0.0020035511501456356, + "einstein_radius": -0.05761540720338343 + }, + "log_likelihood_vmap": 15734.704790642201, + "log_likelihood_scalar": 15734.7047905047, + "log_likelihood_library_pdip": 15734.21749647698, + "log_likelihood_library_pdip_scalar": 15734.21749633948, + "rel_diff_vmap_vs_library_pdip": 3.0970346337859525e-05, + "rel_diff_scalar_vs_library_pdip_scalar": 3.0970346338130175e-05, + "abs_diff_nats": 1.3750104699283838e-07, + "rel_diff": 8.738711582044747e-12, + "rel_diff_scalar_vs_library_pdip": 3.09703375988773e-05, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 1.3750104699283838e-07, + "rel_diff_library_pdip_vmap_vs_scalar": 8.738982222968992e-12, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "FAIL", + "certified": false, + "passes": 16, + "pdip_iter": null + }, + { + "lane": 2, + "draw_name": "call00015_lane02", + "draw_kind": "captured", + "offsets": { + "centre_0": 0.0017572218110215735, + "centre_1": 0.0022774942133795186, + "ell_comps_0": 0.0023932647815035485, + "ell_comps_1": -0.011727950927316913, + "einstein_radius": -0.027234805142873908 + }, + "log_likelihood_vmap": 18704.474460443005, + "log_likelihood_scalar": 18704.474460339556, + "log_likelihood_library_pdip": 18706.165986625834, + "log_likelihood_library_pdip_scalar": 18706.16598652238, + "rel_diff_vmap_vs_library_pdip": 9.042612922596431e-05, + "rel_diff_scalar_vs_library_pdip_scalar": 9.042612922626992e-05, + "abs_diff_nats": 1.0344956535845995e-07, + "rel_diff": 5.530738945796713e-12, + "rel_diff_scalar_vs_library_pdip": 9.042613475620314e-05, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 1.0345320333726704e-07, + "rel_diff_library_pdip_vmap_vs_scalar": 5.530433302676995e-12, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "FAIL", + "certified": false, + "passes": 16, + "pdip_iter": null + }, + { + "lane": 3, + "draw_name": "call00015_lane03", + "draw_kind": "captured", + "offsets": { + "centre_0": -0.002862791114730316, + "centre_1": 0.0038524808804676603, + "ell_comps_0": 0.006111415425061918, + "ell_comps_1": -0.022191169695991525, + "einstein_radius": -0.03531000166767062 + }, + "log_likelihood_vmap": -22166.22174524019, + "log_likelihood_scalar": -22166.221751478894, + "log_likelihood_library_pdip": -22166.22174065224, + "log_likelihood_library_pdip_scalar": -22166.221751014193, + "rel_diff_vmap_vs_library_pdip": 2.0697932713801966e-10, + "rel_diff_scalar_vs_library_pdip_scalar": 2.0964369396034086e-11, + "abs_diff_nats": 6.238704372663051e-06, + "rel_diff": 2.81450959148995e-10, + "rel_diff_scalar_vs_library_pdip": 4.884302864244839e-10, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 1.0361953172832727e-05, + "rel_diff_library_pdip_vmap_vs_scalar": 4.674659168001253e-10, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": true, + "passes": 4, + "pdip_iter": null + }, + { + "lane": 4, + "draw_name": "call00015_lane04", + "draw_kind": "captured", + "offsets": { + "centre_0": 0.0017545152650242774, + "centre_1": 0.005096768299803747, + "ell_comps_0": 0.00015519416981613077, + "ell_comps_1": 0.007279341501820333, + "einstein_radius": -0.03249658545615719 + }, + "log_likelihood_vmap": -194383.645694929, + "log_likelihood_scalar": NaN, + "log_likelihood_library_pdip": -194384.27721637877, + "log_likelihood_library_pdip_scalar": NaN, + "rel_diff_vmap_vs_library_pdip": 3.24882988900689e-06, + "rel_diff_scalar_vs_library_pdip_scalar": NaN, + "abs_diff_nats": NaN, + "rel_diff": NaN, + "rel_diff_scalar_vs_library_pdip": NaN, + "abs_diff_library_pdip_vmap_vs_scalar_nats": NaN, + "rel_diff_library_pdip_vmap_vs_scalar": NaN, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "FAIL", + "certified": true, + "passes": 2, + "pdip_iter": null + }, + { + "lane": 5, + "draw_name": "call00015_lane05", + "draw_kind": "captured", + "offsets": { + "centre_0": -0.0009851407640018856, + "centre_1": 0.002274591191563648, + "ell_comps_0": 0.006006903437417319, + "ell_comps_1": 0.008497457839948512, + "einstein_radius": -0.07242218866013372 + }, + "log_likelihood_vmap": 14761.660929765763, + "log_likelihood_scalar": 14761.660929765752, + "log_likelihood_library_pdip": 14761.660929764937, + "log_likelihood_library_pdip_scalar": 14761.660929764927, + "rel_diff_vmap_vs_library_pdip": 5.594364977891205e-14, + "rel_diff_scalar_vs_library_pdip_scalar": 5.594364977891209e-14, + "abs_diff_nats": 1.0913936421275139e-11, + "rel_diff": 7.393433891485766e-16, + "rel_diff_scalar_vs_library_pdip": 5.520430638976343e-14, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 1.0913936421275139e-11, + "rel_diff_library_pdip_vmap_vs_scalar": 7.393433891486179e-16, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": true, + "passes": 14, + "pdip_iter": null + }, + { + "lane": 6, + "draw_name": "call00015_lane06", + "draw_kind": "captured", + "offsets": { + "centre_0": -0.002713857824416392, + "centre_1": 0.00891817739575143, + "ell_comps_0": 0.001298959041684998, + "ell_comps_1": -0.0098959428603974, + "einstein_radius": 0.04379561090121875 + }, + "log_likelihood_vmap": 21597.12687121904, + "log_likelihood_scalar": 21597.126871231176, + "log_likelihood_library_pdip": 21597.126871219363, + "log_likelihood_library_pdip_scalar": 21597.126871231252, + "rel_diff_vmap_vs_library_pdip": 1.4991814224263155e-14, + "rel_diff_scalar_vs_library_pdip_scalar": 3.5373943675208197e-15, + "abs_diff_nats": 1.2136297300457954e-08, + "rel_diff": 5.619403623833093e-13, + "rel_diff_scalar_vs_library_pdip": 5.469485481593535e-13, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 1.1888914741575718e-08, + "rel_diff_library_pdip_vmap_vs_scalar": 5.504859425265732e-13, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": true, + "passes": 6, + "pdip_iter": null + }, + { + "lane": 7, + "draw_name": "call00015_lane07", + "draw_kind": "captured", + "offsets": { + "centre_0": 0.01063269420288399, + "centre_1": -0.0015469073410711704, + "ell_comps_0": -0.012689283848227026, + "ell_comps_1": 0.0004952469855790744, + "einstein_radius": 0.02732727396499479 + }, + "log_likelihood_vmap": 7413.159094942479, + "log_likelihood_scalar": 7413.159096774973, + "log_likelihood_library_pdip": 7413.159095297509, + "log_likelihood_library_pdip_scalar": 7413.159096700954, + "rel_diff_vmap_vs_library_pdip": 4.7891910482440813e-11, + "rel_diff_scalar_vs_library_pdip_scalar": 9.984719853379113e-12, + "abs_diff_nats": 1.832493580877781e-06, + "rel_diff": 2.4719469216234556e-10, + "rel_diff_scalar_vs_library_pdip": 1.993027817291713e-10, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 1.4034449122846127e-06, + "rel_diff_library_pdip_vmap_vs_scalar": 1.8931806183806058e-10, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": true, + "passes": 6, + "pdip_iter": null + }, + { + "lane": 8, + "draw_name": "call00015_lane08", + "draw_kind": "captured", + "offsets": { + "centre_0": -0.003586333218755102, + "centre_1": 0.0002442650473125539, + "ell_comps_0": -0.0025095685188555317, + "ell_comps_1": 0.008402687166147546, + "einstein_radius": 0.003809182535237543 + }, + "log_likelihood_vmap": 19066.421358553263, + "log_likelihood_scalar": 19066.42135821115, + "log_likelihood_library_pdip": 19060.202679471302, + "log_likelihood_library_pdip_scalar": 19060.20267912919, + "rel_diff_vmap_vs_library_pdip": 0.0003262651078028279, + "rel_diff_scalar_vs_library_pdip_scalar": 0.0003262651078086841, + "abs_diff_nats": 3.421118890400976e-07, + "rel_diff": 1.7943162097000628e-11, + "rel_diff_scalar_vs_library_pdip": 0.00032626508985381163, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 3.421118890400976e-07, + "rel_diff_library_pdip_vmap_vs_scalar": 1.7949016324716636e-11, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "FAIL", + "certified": false, + "passes": 16, + "pdip_iter": null + }, + { + "lane": 9, + "draw_name": "call00015_lane09", + "draw_kind": "captured", + "offsets": { + "centre_0": -0.004569070502203608, + "centre_1": -0.0008437281377326854, + "ell_comps_0": 0.016330335737132294, + "ell_comps_1": 0.007271610957481866, + "einstein_radius": -0.0644363448871137 + }, + "log_likelihood_vmap": 12781.02635455443, + "log_likelihood_scalar": 12781.026354229361, + "log_likelihood_library_pdip": 12782.703321755558, + "log_likelihood_library_pdip_scalar": 12782.70332143049, + "rel_diff_vmap_vs_library_pdip": 0.00013119034048725823, + "rel_diff_scalar_vs_library_pdip_scalar": 0.00013119034049059443, + "abs_diff_nats": 3.250679583288729e-07, + "rel_diff": 2.54336349303673e-11, + "rel_diff_scalar_vs_library_pdip": 0.0001311903659175565, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 3.250679583288729e-07, + "rel_diff_library_pdip_vmap_vs_scalar": 2.543029828314087e-11, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "FAIL", + "certified": false, + "passes": 16, + "pdip_iter": null + }, + { + "lane": 10, + "draw_name": "call00015_lane10", + "draw_kind": "captured", + "offsets": { + "centre_0": 0.00041413552102611065, + "centre_1": -0.004015077828810355, + "ell_comps_0": 0.005329766760357603, + "ell_comps_1": 0.01667480963359283, + "einstein_radius": 0.011021193939315443 + }, + "log_likelihood_vmap": 25442.23680048243, + "log_likelihood_scalar": 25442.23680048246, + "log_likelihood_library_pdip": 25442.236800481296, + "log_likelihood_library_pdip_scalar": 25442.23680048131, + "rel_diff_vmap_vs_library_pdip": 4.4612798658926975e-14, + "rel_diff_scalar_vs_library_pdip_scalar": 4.518475761609268e-14, + "abs_diff_nats": 2.9103830456733704e-11, + "rel_diff": 1.1439179143314085e-15, + "rel_diff_scalar_vs_library_pdip": 4.575671657325843e-14, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 1.4551915228366852e-11, + "rel_diff_library_pdip_vmap_vs_scalar": 5.719589571657301e-16, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": true, + "passes": 6, + "pdip_iter": null + }, + { + "lane": 11, + "draw_name": "call00015_lane11", + "draw_kind": "captured", + "offsets": { + "centre_0": -0.00234856906735493, + "centre_1": -0.0005637310462631455, + "ell_comps_0": 0.002190699592912508, + "ell_comps_1": -0.01675931647125419, + "einstein_radius": -0.1186639473801736 + }, + "log_likelihood_vmap": -3234.471614889735, + "log_likelihood_scalar": -3234.4716141754543, + "log_likelihood_library_pdip": -3234.481431636159, + "log_likelihood_library_pdip_scalar": -3234.481430921878, + "rel_diff_vmap_vs_library_pdip": 3.035029457234597e-06, + "rel_diff_scalar_vs_library_pdip_scalar": 3.035029457904832e-06, + "abs_diff_nats": 7.142807589843869e-07, + "rel_diff": 2.2083383136026517e-10, + "rel_diff_scalar_vs_library_pdip": 3.0352502903956714e-06, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 7.142807589843869e-07, + "rel_diff_library_pdip_vmap_vs_scalar": 2.208331611230817e-10, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "FAIL", + "certified": false, + "passes": 16, + "pdip_iter": null + }, + { + "lane": 12, + "draw_name": "call00015_lane12", + "draw_kind": "captured", + "offsets": { + "centre_0": -9.326736988388313e-05, + "centre_1": -0.0013488200741109593, + "ell_comps_0": 0.00997667014421897, + "ell_comps_1": -0.014348588092779897, + "einstein_radius": -0.02126731799195114 + }, + "log_likelihood_vmap": 18887.307347644703, + "log_likelihood_scalar": 18887.3073475926, + "log_likelihood_library_pdip": 18883.933556142838, + "log_likelihood_library_pdip_scalar": 18883.93355609074, + "rel_diff_vmap_vs_library_pdip": 0.00017865936097657688, + "rel_diff_scalar_vs_library_pdip_scalar": 0.00017865936097687714, + "abs_diff_nats": 5.210313247516751e-08, + "rel_diff": 2.758632107599427e-12, + "rel_diff_scalar_vs_library_pdip": 0.00017865935821745192, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 5.209949449636042e-08, + "rel_diff_library_pdip_vmap_vs_scalar": 2.7589323136310487e-12, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "FAIL", + "certified": false, + "passes": 16, + "pdip_iter": null + }, + { + "lane": 13, + "draw_name": "call00015_lane13", + "draw_kind": "captured", + "offsets": { + "centre_0": -0.007013568613743564, + "centre_1": 0.004528745612839986, + "ell_comps_0": -0.018496405934026655, + "ell_comps_1": 0.0014830576999261711, + "einstein_radius": -0.04673040108359361 + }, + "log_likelihood_vmap": 23869.488067817772, + "log_likelihood_scalar": 23869.488067817765, + "log_likelihood_library_pdip": 23869.488067815804, + "log_likelihood_library_pdip_scalar": 23869.4880678158, + "rel_diff_vmap_vs_library_pdip": 8.245449290931163e-14, + "rel_diff_scalar_vs_library_pdip_scalar": 8.230208164700238e-14, + "abs_diff_nats": 7.275957614183426e-12, + "rel_diff": 3.048225246185022e-16, + "rel_diff_scalar_vs_library_pdip": 8.21496703846931e-14, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 3.637978807091713e-12, + "rel_diff_library_pdip_vmap_vs_scalar": 1.5241126230926365e-16, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": true, + "passes": 9, + "pdip_iter": null + }, + { + "lane": 14, + "draw_name": "call00015_lane14", + "draw_kind": "captured", + "offsets": { + "centre_0": 0.005108692197125562, + "centre_1": -0.010240010499870703, + "ell_comps_0": -0.00684600823433492, + "ell_comps_1": -0.002573928604858717, + "einstein_radius": -0.0214638151942923 + }, + "log_likelihood_vmap": -177848.2317124089, + "log_likelihood_scalar": NaN, + "log_likelihood_library_pdip": -177847.95788399922, + "log_likelihood_library_pdip_scalar": NaN, + "rel_diff_vmap_vs_library_pdip": 1.53967699673555e-06, + "rel_diff_scalar_vs_library_pdip_scalar": NaN, + "abs_diff_nats": NaN, + "rel_diff": NaN, + "rel_diff_scalar_vs_library_pdip": NaN, + "abs_diff_library_pdip_vmap_vs_scalar_nats": NaN, + "rel_diff_library_pdip_vmap_vs_scalar": NaN, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "FAIL", + "certified": true, + "passes": 2, + "pdip_iter": null + }, + { + "lane": 15, + "draw_name": "call00015_lane15", + "draw_kind": "captured", + "offsets": { + "centre_0": 0.0015375882948530809, + "centre_1": 0.00010861850037634777, + "ell_comps_0": 0.010624594413718456, + "ell_comps_1": -0.00030576693661378264, + "einstein_radius": 0.018140577124415858 + }, + "log_likelihood_vmap": 25794.98543958666, + "log_likelihood_scalar": 25794.98543952393, + "log_likelihood_library_pdip": 25794.985439584038, + "log_likelihood_library_pdip_scalar": 25794.9854395183, + "rel_diff_vmap_vs_library_pdip": 1.016857608257453e-13, + "rel_diff_scalar_vs_library_pdip_scalar": 2.1832116193988196e-13, + "abs_diff_nats": 6.27296685706824e-08, + "rel_diff": 2.4318551649409318e-12, + "rel_diff_scalar_vs_library_pdip": 2.33016940410952e-12, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 6.573827704414725e-08, + "rel_diff_library_pdip_vmap_vs_scalar": 2.5484905660553403e-12, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": true, + "passes": 8, + "pdip_iter": null + } + ], + "lane_pins": [ + { + "pin": "lane 0: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 18463.288067231657, + "reference_value": 18463.07897110663, + "rel_diff": 1.1325095091253122e-05, + "abs_diff_nats": 0.20909612502509844, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 0: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 18463.28806683203, + "reference_value": 18463.078970707007, + "rel_diff": 1.1325095091301208e-05, + "abs_diff_nats": 0.20909612502146047, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 0: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 18463.288067231657, + "reference_value": 18463.28806683203, + "rel_diff": 2.1644483503353945e-11, + "abs_diff_nats": 3.996283339802176e-07, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 0: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 18463.07897110663, + "reference_value": 18463.078970707007, + "rel_diff": 2.1644531588444352e-11, + "abs_diff_nats": 3.996246960014105e-07, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 1: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 15734.704790642201, + "reference_value": 15734.21749647698, + "rel_diff": 3.0970346337859525e-05, + "abs_diff_nats": 0.48729416522110114, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 1: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 15734.7047905047, + "reference_value": 15734.21749633948, + "rel_diff": 3.0970346338130175e-05, + "abs_diff_nats": 0.48729416522110114, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 1: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 15734.704790642201, + "reference_value": 15734.7047905047, + "rel_diff": 8.738711582044747e-12, + "abs_diff_nats": 1.3750104699283838e-07, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 1: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 15734.21749647698, + "reference_value": 15734.21749633948, + "rel_diff": 8.738982222968992e-12, + "abs_diff_nats": 1.3750104699283838e-07, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 2: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 18704.474460443005, + "reference_value": 18706.165986625834, + "rel_diff": 9.042612922596431e-05, + "abs_diff_nats": 1.6915261828289658, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 2: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 18704.474460339556, + "reference_value": 18706.16598652238, + "rel_diff": 9.042612922626992e-05, + "abs_diff_nats": 1.6915261828253279, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 2: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 18704.474460443005, + "reference_value": 18704.474460339556, + "rel_diff": 5.530738945796713e-12, + "abs_diff_nats": 1.0344956535845995e-07, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 2: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 18706.165986625834, + "reference_value": 18706.16598652238, + "rel_diff": 5.530433302676995e-12, + "abs_diff_nats": 1.0345320333726704e-07, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 3: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -22166.22174524019, + "reference_value": -22166.22174065224, + "rel_diff": 2.0697932713801966e-10, + "abs_diff_nats": 4.587949661072344e-06, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 3: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -22166.221751478894, + "reference_value": -22166.221751014193, + "rel_diff": 2.0964369396034086e-11, + "abs_diff_nats": 4.6470086090266705e-07, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 3: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -22166.22174524019, + "reference_value": -22166.221751478894, + "rel_diff": 2.81450959148995e-10, + "abs_diff_nats": 6.238704372663051e-06, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 3: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -22166.22174065224, + "reference_value": -22166.221751014193, + "rel_diff": 4.674659168001253e-10, + "abs_diff_nats": 1.0361953172832727e-05, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 4: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -194383.645694929, + "reference_value": -194384.27721637877, + "rel_diff": 3.24882988900689e-06, + "abs_diff_nats": 0.6315214497735724, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 4: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": NaN, + "reference_value": NaN, + "rel_diff": NaN, + "abs_diff_nats": NaN, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 4: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -194383.645694929, + "reference_value": NaN, + "rel_diff": NaN, + "abs_diff_nats": NaN, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 4: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -194384.27721637877, + "reference_value": NaN, + "rel_diff": NaN, + "abs_diff_nats": NaN, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 5: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 14761.660929765763, + "reference_value": 14761.660929764937, + "rel_diff": 5.594364977891205e-14, + "abs_diff_nats": 8.258211892098188e-10, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 5: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 14761.660929765752, + "reference_value": 14761.660929764927, + "rel_diff": 5.594364977891209e-14, + "abs_diff_nats": 8.258211892098188e-10, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 5: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 14761.660929765763, + "reference_value": 14761.660929765752, + "rel_diff": 7.393433891485766e-16, + "abs_diff_nats": 1.0913936421275139e-11, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 5: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 14761.660929764937, + "reference_value": 14761.660929764927, + "rel_diff": 7.393433891486179e-16, + "abs_diff_nats": 1.0913936421275139e-11, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 6: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 21597.12687121904, + "reference_value": 21597.126871219363, + "rel_diff": 1.4991814224263155e-14, + "abs_diff_nats": 3.2378011383116245e-10, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 6: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 21597.126871231176, + "reference_value": 21597.126871231252, + "rel_diff": 3.5373943675208197e-15, + "abs_diff_nats": 7.639755494892597e-11, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 6: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 21597.12687121904, + "reference_value": 21597.126871231176, + "rel_diff": 5.619403623833093e-13, + "abs_diff_nats": 1.2136297300457954e-08, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 6: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 21597.126871219363, + "reference_value": 21597.126871231252, + "rel_diff": 5.504859425265732e-13, + "abs_diff_nats": 1.1888914741575718e-08, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 7: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 7413.159094942479, + "reference_value": 7413.159095297509, + "rel_diff": 4.7891910482440813e-11, + "abs_diff_nats": 3.5503035178408027e-07, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 7: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 7413.159096774973, + "reference_value": 7413.159096700954, + "rel_diff": 9.984719853379113e-12, + "abs_diff_nats": 7.401831680908799e-08, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 7: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 7413.159094942479, + "reference_value": 7413.159096774973, + "rel_diff": 2.4719469216234556e-10, + "abs_diff_nats": 1.832493580877781e-06, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 7: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 7413.159095297509, + "reference_value": 7413.159096700954, + "rel_diff": 1.8931806183806058e-10, + "abs_diff_nats": 1.4034449122846127e-06, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 8: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 19066.421358553263, + "reference_value": 19060.202679471302, + "rel_diff": 0.0003262651078028279, + "abs_diff_nats": 6.218679081961454, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 8: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 19066.42135821115, + "reference_value": 19060.20267912919, + "rel_diff": 0.0003262651078086841, + "abs_diff_nats": 6.218679081961454, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 8: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 19066.421358553263, + "reference_value": 19066.42135821115, + "rel_diff": 1.7943162097000628e-11, + "abs_diff_nats": 3.421118890400976e-07, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 8: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 19060.202679471302, + "reference_value": 19060.20267912919, + "rel_diff": 1.7949016324716636e-11, + "abs_diff_nats": 3.421118890400976e-07, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 9: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 12781.02635455443, + "reference_value": 12782.703321755558, + "rel_diff": 0.00013119034048725823, + "abs_diff_nats": 1.6769672011287184, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 9: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 12781.026354229361, + "reference_value": 12782.70332143049, + "rel_diff": 0.00013119034049059443, + "abs_diff_nats": 1.6769672011287184, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 9: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 12781.02635455443, + "reference_value": 12781.026354229361, + "rel_diff": 2.54336349303673e-11, + "abs_diff_nats": 3.250679583288729e-07, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 9: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 12782.703321755558, + "reference_value": 12782.70332143049, + "rel_diff": 2.543029828314087e-11, + "abs_diff_nats": 3.250679583288729e-07, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 10: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 25442.23680048243, + "reference_value": 25442.236800481296, + "rel_diff": 4.4612798658926975e-14, + "abs_diff_nats": 1.1350493878126144e-09, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 10: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 25442.23680048246, + "reference_value": 25442.23680048131, + "rel_diff": 4.518475761609268e-14, + "abs_diff_nats": 1.1496013030409813e-09, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 10: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 25442.23680048243, + "reference_value": 25442.23680048246, + "rel_diff": 1.1439179143314085e-15, + "abs_diff_nats": 2.9103830456733704e-11, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 10: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 25442.236800481296, + "reference_value": 25442.23680048131, + "rel_diff": 5.719589571657301e-16, + "abs_diff_nats": 1.4551915228366852e-11, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 11: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -3234.471614889735, + "reference_value": -3234.481431636159, + "rel_diff": 3.035029457234597e-06, + "abs_diff_nats": 0.009816746423894074, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 11: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -3234.4716141754543, + "reference_value": -3234.481430921878, + "rel_diff": 3.035029457904832e-06, + "abs_diff_nats": 0.009816746423894074, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 11: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -3234.471614889735, + "reference_value": -3234.4716141754543, + "rel_diff": 2.2083383136026517e-10, + "abs_diff_nats": 7.142807589843869e-07, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 11: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -3234.481431636159, + "reference_value": -3234.481430921878, + "rel_diff": 2.208331611230817e-10, + "abs_diff_nats": 7.142807589843869e-07, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 12: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 18887.307347644703, + "reference_value": 18883.933556142838, + "rel_diff": 0.00017865936097657688, + "abs_diff_nats": 3.3737915018646163, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 12: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 18887.3073475926, + "reference_value": 18883.93355609074, + "rel_diff": 0.00017865936097687714, + "abs_diff_nats": 3.3737915018609783, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 12: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 18887.307347644703, + "reference_value": 18887.3073475926, + "rel_diff": 2.758632107599427e-12, + "abs_diff_nats": 5.210313247516751e-08, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 12: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 18883.933556142838, + "reference_value": 18883.93355609074, + "rel_diff": 2.7589323136310487e-12, + "abs_diff_nats": 5.209949449636042e-08, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 13: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 23869.488067817772, + "reference_value": 23869.488067815804, + "rel_diff": 8.245449290931163e-14, + "abs_diff_nats": 1.9681465346366167e-09, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 13: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 23869.488067817765, + "reference_value": 23869.4880678158, + "rel_diff": 8.230208164700238e-14, + "abs_diff_nats": 1.964508555829525e-09, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 13: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 23869.488067817772, + "reference_value": 23869.488067817765, + "rel_diff": 3.048225246185022e-16, + "abs_diff_nats": 7.275957614183426e-12, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 13: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 23869.488067815804, + "reference_value": 23869.4880678158, + "rel_diff": 1.5241126230926365e-16, + "abs_diff_nats": 3.637978807091713e-12, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 14: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -177848.2317124089, + "reference_value": -177847.95788399922, + "rel_diff": 1.53967699673555e-06, + "abs_diff_nats": 0.27382840967038646, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 14: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": NaN, + "reference_value": NaN, + "rel_diff": NaN, + "abs_diff_nats": NaN, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 14: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -177848.2317124089, + "reference_value": NaN, + "rel_diff": NaN, + "abs_diff_nats": NaN, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 14: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -177847.95788399922, + "reference_value": NaN, + "rel_diff": NaN, + "abs_diff_nats": NaN, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 15: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 25794.98543958666, + "reference_value": 25794.985439584038, + "rel_diff": 1.016857608257453e-13, + "abs_diff_nats": 2.622982719913125e-09, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 15: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 25794.98543952393, + "reference_value": 25794.9854395183, + "rel_diff": 2.1832116193988196e-13, + "abs_diff_nats": 5.631591193377972e-09, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 15: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 25794.98543958666, + "reference_value": 25794.98543952393, + "rel_diff": 2.4318551649409318e-12, + "abs_diff_nats": 6.27296685706824e-08, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 15: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 25794.985439584038, + "reference_value": 25794.9854395183, + "rel_diff": 2.5484905660553403e-12, + "abs_diff_nats": 6.573827704414725e-08, + "within_rtol": true, + "status": "RECORDED" + } + ], + "lanes_failed": 9, + "arm_rows": { + "vmap": { + "arm": "vmap", + "program": "jax.jit(jax.vmap(fn))", + "stands_for": "Nautilus(use_jax_vmap=True) \u2014 Fitness._vmap", + "hlo_source": "jax.jit(jax.vmap(fn)).lower(batched_tree) \u2014 the exact current Fitness._vmap composition (PyAutoFit#1638)", + "batch_wall_ms": 446.7999532000249, + "wall_production_nesting_ms": 446.7999532000249, + "wall_aot_command_buffers_on_ms": 446.7157532002602, + "wall_aot_command_buffers_off_ms": 447.2237981000944, + "command_buffer_delta_ms": 0.5080448998342035, + "production_nesting_vs_aot_on_delta_ms": 0.08419999976467807, + "production_nesting_vs_aot_on_delta_pct": 0.0188486748366207, + "wall_per_lane_ms": 27.924997075001556, + "wall_per_lane_command_buffers_off_ms": 27.9514873812559, + "traced_batch_wall_ms": 453.5386453000683, + "untraced_batch_wall_ms": 448.2074265000847, + "traced_wall_per_lane_ms": 28.34616533125427, + "callback_count_per_call": 0.0, + "callback_count_per_lane": 0.0, + "callback_expectation": "0 \u2014 the rectangular mesh has no qhull host callback (asserted)", + "host_qhull_ms": 0.0, + "host_tables_ms": 0.0, + "host_qhull_ms_per_lane": 0.0, + "host_tables_ms_per_lane": 0.0, + "host_callback_probe": { + "calls": 0, + "qhull_ms_total": 0.0, + "tables_ms_total": 0.0, + "total_ms_total": 0.0, + "qhull_ms_mean": 0.0, + "tables_ms_mean": 0.0, + "total_ms_mean": 0.0, + "non_finite_calls": 0, + "n_points": [] + }, + "host_callback_records_first": [], + "device_idle_ms": 12.226573500000029, + "device_idle_ms_per_lane": 0.7641608437500018, + "trace": { + "parser": "ProfileData.from_file(xplane) + as_text() + stack_frame_index(proto field 17)", + "stage_audit": { + "mixed_fusion": [ + { + "instruction": "loop_divide_gather_fusion", + "ms": 16.820930199999996, + "opcode": "fusion", + "shape": "(f64[15361,16,1,1,1521]{4,3,2,1,0}, f64[15361,16,1,1,1521]{4,3,2,1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:133", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:133 (curvature_matrix_via_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:93 (InversionImagingMapping.curvature_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:389 (AbstractInversion.curvature_reg_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "input_multiply_transpose_fusion", + "ms": 4.952832099999999, + "opcode": "fusion", + "shape": "(f64[16,1369,1369]{2,1,0}, f64[16,1369,1369]{2,1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:237 (active_set_search)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:293 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:274 (_certified_positive_only_from)" + ] + }, + { + "instruction": "loop_broadcast_fusion", + "ms": 4.0774168, + "opcode": "fusion", + "shape": "f64[16,1521,180,180]{3,2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "input_reduce_fusion.3", + "ms": 2.0882291, + "opcode": "fusion", + "shape": "f64[92,16,1521]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/inversion_imaging_util.py:123", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/inversion_imaging_util.py:123 (data_vector_via_blurred_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:67 (InversionImagingMapping.data_vector)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:699 (AbstractInversion.reconstruction)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "input_reduce_fusion.6", + "ms": 1.7723984, + "opcode": "fusion", + "shape": "f64[15361,16]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:163", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:163 (mapped_reconstructed_data_via_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:120 (InversionImagingMapping._mapped_reconstructed_data_dict_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:196 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "loop_broadcast_fusion.1", + "ms": 1.7182655, + "opcode": "fusion", + "shape": "f64[15361,16,1521]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:353", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:353 (mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/abstract.py:283 (Mapper.mapping_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:91 (AbstractInversionImaging._mapping_matrix_for_convolution_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:137 (AbstractInversionImaging.operated_mapping_matrix_list)" + ] + } + ], + "other": [ + { + "instruction": "copy.60", + "ms": 0.08004939999999997, + "opcode": "copy", + "shape": "u32[16,2,15361]{2,1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "copy.61", + "ms": 0.07916309999999999, + "opcode": "copy", + "shape": "u32[16,2,15361]{2,1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "copy.79", + "ms": 0.0388731, + "opcode": "copy", + "shape": "u32[16,15361]{1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "copy.70", + "ms": 0.038450600000000036, + "opcode": "copy", + "shape": "u32[16,15361]{1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "copy.69", + "ms": 0.038386300000000054, + "opcode": "copy", + "shape": "u32[16,15361]{1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "copy.78", + "ms": 0.03811430000000006, + "opcode": "copy", + "shape": "u32[16,15361]{1,0}", + "source": "", + "stack": [] + } + ], + "mesh_construction": [ + { + "instruction": "fusion.6", + "ms": 0.4728285999999999, + "opcode": "fusion", + "shape": "(f64[16,15361,2]{2,1,0}, s64[16,15361,2]{2,1,0}, s32[16,15361,2]{2,1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:227", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:227 (create_transforms_rank)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:396 (_transforms_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:561 (adaptive_rectangular_mappings_weights_via_interpolation_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:693 (InterpolatorRectangular._mappings_sizes_weights)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "loop_select_fusion", + "ms": 0.17209260000000007, + "opcode": "fusion", + "shape": "(u32[16,2,15361]{2,1,0}, u32[16,2,15361]{2,1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:69", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:69 (forward_interp)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:573 (adaptive_rectangular_mappings_weights_via_interpolation_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:693 (InterpolatorRectangular._mappings_sizes_weights)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/abstract.py:36 (AbstractInterpolator.mappings)" + ] + }, + { + "instruction": "loop_select_fusion.1", + "ms": 0.08476619999999996, + "opcode": "fusion", + "shape": "(u32[16,15361]{1,0}, u32[16,15361]{1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:245", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:245 (create_transforms_rank)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:396 (_transforms_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:561 (adaptive_rectangular_mappings_weights_via_interpolation_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:693 (InterpolatorRectangular._mappings_sizes_weights)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "loop_select_fusion.2", + "ms": 0.08117289999999996, + "opcode": "fusion", + "shape": "(u32[16,15361]{1,0}, u32[16,15361]{1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:245", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:245 (create_transforms_rank)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:396 (_transforms_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:561 (adaptive_rectangular_mappings_weights_via_interpolation_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:693 (InterpolatorRectangular._mappings_sizes_weights)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "loop_subtract_transpose_fusion", + "ms": 0.041135099999999994, + "opcode": "fusion", + "shape": "(f64[16,15361,2]{2,1,0}, f64[491552,1,1,1]{3,2,1,0}, f64[491552,1,1,1]{3,2,1,0}, f64[16,15361,2]{2,1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:69", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:69 (forward_interp)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:573 (adaptive_rectangular_mappings_weights_via_interpolation_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:693 (InterpolatorRectangular._mappings_sizes_weights)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/abstract.py:36 (AbstractInterpolator.mappings)" + ] + }, + { + "instruction": "loop_add_fusion", + "ms": 0.021490799999999977, + "opcode": "fusion", + "shape": "s64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:69", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:69 (forward_interp)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:573 (adaptive_rectangular_mappings_weights_via_interpolation_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:693 (InterpolatorRectangular._mappings_sizes_weights)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/abstract.py:36 (AbstractInterpolator.mappings)" + ] + } + ], + "border_relocator": [ + { + "instruction": "custom-call.2", + "ms": 0.042335000000000005, + "opcode": "custom-call", + "shape": "(f64[16,2,2]{2,1,0}, s8[4194304]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:242", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:242 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:415 (BorderRelocator.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:83 (AbstractMesh.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/rectangular_rtu_adapt_density.py:267 (RectangularRTUAdaptDensity.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "eigh.0", + "ms": 0.0148895, + "opcode": "custom-call", + "shape": "(f64[16,2,2]{1,2,0}, f64[16,2]{1,0}, s32[16]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:245", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:245 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:415 (BorderRelocator.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:83 (AbstractMesh.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/rectangular_rtu_adapt_density.py:267 (RectangularRTUAdaptDensity.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "loop_add_rsqrt_fusion", + "ms": 0.0125822, + "opcode": "fusion", + "shape": "(f64[16,15361]{1,0}, f64[16,15361]{1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:311", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:311 (relocated_grid_via_ellipse_border_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:423 (BorderRelocator.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:83 (AbstractMesh.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/rectangular_rtu_adapt_density.py:267 (RectangularRTUAdaptDensity.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "loop_abs_fusion", + "ms": 0.003299, + "opcode": "fusion", + "shape": "(f64[16,392,1]{2,1,0}, f64[16,392,1]{2,1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:269", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:269 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:415 (BorderRelocator.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:83 (AbstractMesh.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/rectangular_rtu_adapt_density.py:267 (RectangularRTUAdaptDensity.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "input_reduce_fusion.8", + "ms": 0.0031295000000000003, + "opcode": "fusion", + "shape": "f64[16]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:269", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:269 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:415 (BorderRelocator.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:83 (AbstractMesh.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/rectangular_rtu_adapt_density.py:267 (RectangularRTUAdaptDensity.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "input_reduce_fusion.7", + "ms": 0.0031007, + "opcode": "fusion", + "shape": "f64[16]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:270", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:270 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:415 (BorderRelocator.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:83 (AbstractMesh.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/rectangular_rtu_adapt_density.py:267 (RectangularRTUAdaptDensity.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + } + ], + "pdip_solve": [ + { + "instruction": "cholesky.40", + "ms": 86.78110500000298, + "opcode": "custom-call", + "shape": "(f64[16,1369,1369]{1,2,0}, s32[16]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:252 (active_set_search..body_fun)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:262 (active_set_search)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:293 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)" + ] + }, + { + "instruction": "triangular-solve", + "ms": 26.52049580000069, + "opcode": "custom-call", + "shape": "(f64[16,1369,1]{1,2,0}, s8[256]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:154", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:154 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:252 (active_set_search..body_fun)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:262 (active_set_search)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:293 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)" + ] + }, + { + "instruction": "triangular-solve.1", + "ms": 23.90866470000078, + "opcode": "custom-call", + "shape": "(f64[16,1369,1]{1,2,0}, s8[256]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:154", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:154 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:252 (active_set_search..body_fun)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:262 (active_set_search)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:293 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)" + ] + }, + { + "instruction": "input_transpose_fusion", + "ms": 10.404165299999994, + "opcode": "fusion", + "shape": "f64[16,1369,1369]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:252 (active_set_search..body_fun)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:262 (active_set_search)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:293 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)" + ] + }, + { + "instruction": "cholesky.60", + "ms": 6.2176203999999915, + "opcode": "custom-call", + "shape": "(f64[16,1369,1369]{1,2,0}, s32[16]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:237 (active_set_search)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:293 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:274 (_certified_positive_only_from)" + ] + }, + { + "instruction": "input_transpose_fusion.1", + "ms": 6.055252299999999, + "opcode": "fusion", + "shape": "f64[16,1369,1369]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:252 (active_set_search..body_fun)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:262 (active_set_search)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:293 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)" + ] + } + ], + "psf_convolution_mapping_matrix": [ + { + "instruction": "input_scatter_fusion", + "ms": 32.7720154, + "opcode": "fusion", + "shape": "f64[16,1521,180,180]{3,2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "fft.29.0", + "ms": 28.475934799999994, + "opcode": "fft", + "shape": "f64[16,1521,180,180]{3,2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "fft.25.0", + "ms": 21.899580699999998, + "opcode": "fft", + "shape": "c128[16,1521,180,91]{3,2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "fft.27.0", + "ms": 15.7336374, + "opcode": "fft", + "shape": "c128[16,1521,91,180]{3,2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "input_transpose_fusion.3", + "ms": 8.5564765, + "opcode": "fusion", + "shape": "c128[16,1521,91,180]{3,2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "wrapped_transpose.2", + "ms": 7.9908945, + "opcode": "fusion", + "shape": "c128[16,1521,180,91]{3,2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + } + ], + "regularization_H": [ + { + "instruction": "wrapped_broadcast", + "ms": 0.48366059999999994, + "opcode": "fusion", + "shape": "f64[16,1521,1521]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt.py:124", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt.py:124 (weighted_regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt.py:366 (Adapt.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:332 (AbstractInversion.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "input_scatter_fusion.7", + "ms": 0.0026942999999999997, + "opcode": "fusion", + "shape": "f64[1521,1521]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt.py:123", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt.py:123 (weighted_regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt.py:366 (Adapt.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:332 (AbstractInversion.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "mapping_matrix": [ + { + "instruction": "input_scatter_fusion.5", + "ms": 0.0637012, + "opcode": "fusion", + "shape": "f64[16,1521]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:71", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:71 (adaptive_pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/abstract.py:507 (Mapper.pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt.py:339 (Adapt.regularization_weights_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt.py:362 (Adapt.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)" + ] + }, + { + "instruction": "input_reduce_fusion.20", + "ms": 0.003696, + "opcode": "fusion", + "shape": "f64[16]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:93", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:93 (adaptive_pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/abstract.py:507 (Mapper.pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt.py:339 (Adapt.regularization_weights_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt.py:362 (Adapt.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)" + ] + } + ], + "curvature_matrix_F": [ + { + "instruction": "cublas-lt-matmul.2", + "ms": 98.311615, + "opcode": "custom-call", + "shape": "(f64[16,1521,1521]{2,1,0}, s8[4194304]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:134", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:134 (curvature_matrix_via_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:93 (InversionImagingMapping.curvature_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:389 (AbstractInversion.curvature_reg_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "inversion_other": [ + { + "instruction": "cholesky.80", + "ms": 8.229948899999979, + "opcode": "custom-call", + "shape": "(f64[16,1521,1521]{1,2,0}, s32[16]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986 (AbstractInversion._log_det_symmetric_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:1078 (AbstractInversion.log_det_curvature_reg_matrix_term)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:347 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/model/analysis.py:135 (AnalysisImaging.log_likelihood_function)" + ] + }, + { + "instruction": "cholesky.90", + "ms": 8.066884199999977, + "opcode": "custom-call", + "shape": "(f64[16,1521,1521]{1,2,0}, s32[16]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986 (AbstractInversion._log_det_symmetric_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:1157 (AbstractInversion.log_det_regularization_matrix_term)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:348 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/model/analysis.py:135 (AnalysisImaging.log_likelihood_function)" + ] + }, + { + "instruction": "loop_reduce_window_fusion.3", + "ms": 0.0076766000000000004, + "opcode": "fusion", + "shape": "s64[6,16]{1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "loop_reduce_window_fusion.2", + "ms": 0.0036608000000000005, + "opcode": "fusion", + "shape": "s64[86,16]{1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "input_scatter_fusion.9", + "ms": 0.0028064000000000006, + "opcode": "fusion", + "shape": "s64[1369]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:527", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:527 (AbstractInversion.zeroed_ids_to_keep)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:567 (AbstractInversion.solve_ids_to_keep)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:684 (AbstractInversion.reconstruction)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "loop_broadcast_fusion.5", + "ms": 0.0021344, + "opcode": "fusion", + "shape": "(s64[1369]{0}, s64[1369]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:527", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:527 (AbstractInversion.zeroed_ids_to_keep)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:567 (AbstractInversion.solve_ids_to_keep)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:684 (AbstractInversion.reconstruction)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ] + }, + "stage_audit_note": "The HLO instructions that contributed most of each stage's milliseconds, with their full source stack. A stage row is only as good as the rules that built it; this is how a reader checks a row against the HLO instead of trusting it.", + "untraced_wall_ms": 448.2074265000847, + "reconciliation_vs_untraced_pct": 1.0077102102451647, + "wall_basis": "wall_ms is the TRACED run's wall, the run these kernel durations came from. untraced_wall_ms is the same executable without the profiler; the difference is the profiler's overhead and belongs in neither the stages nor the idle row.", + "calls": 10, + "call_split": "per-call (first-instruction recurrence)", + "call_blocks": 10, + "events": 89110, + "streams": [ + "Stream #14(MemcpyD2H,Compute,MemcpyD2D)" + ], + "per_stage_ms": { + "border_relocator": { + "median_ms": 0.086398, + "min_ms": 0.08576099999999998, + "max_ms": 0.086686 + }, + "curvature_matrix_F": { + "median_ms": 98.1538145, + "min_ms": 97.123263, + "max_ms": 99.064656 + }, + "inversion_other": { + "median_ms": 16.300854499999993, + "min_ms": 15.977066000000002, + "max_ms": 16.553269000000014 + }, + "mapping_matrix": { + "median_ms": 0.06760000000000001, + "min_ms": 0.065343, + "max_ms": 0.069054 + }, + "mesh_construction": { + "median_ms": 1.026503499999999, + "min_ms": 1.0210619999999992, + "max_ms": 1.0304719999999985 + }, + "mixed_fusion": { + "median_ms": 34.459796, + "min_ms": 33.969133, + "max_ms": 34.84329100000001 + }, + "other": { + "median_ms": 0.4001825000000001, + "min_ms": 0.39728600000000014, + "max_ms": 0.4023260000000001 + }, + "pdip_solve": { + "median_ms": 174.09903700000314, + "min_ms": 173.19914900000367, + "max_ms": 179.887651000003 + }, + "psf_convolution_mapping_matrix": { + "median_ms": 115.417574, + "min_ms": 115.18890800000001, + "max_ms": 115.855132 + }, + "regularization_H": { + "median_ms": 0.48572499999999996, + "min_ms": 0.479636, + "max_ms": 0.495316 + } + }, + "stage_order": [ + "border_relocator", + "mesh_construction", + "mapping_matrix", + "psf_convolution_mapping_matrix", + "curvature_matrix_F", + "regularization_H", + "pdip_solve", + "inversion_other", + "mixed_fusion", + "other" + ], + "mixed_fusion": { + "ms": 34.459796, + "constituent_stage_sets": { + "curvature_matrix_F + psf_convolution_mapping_matrix": 16.820930199999996, + "inversion_other + mapped_reconstruction + pdip_solve + reconstruction_scatter": 4.952832099999999, + "pdip_solve + psf_convolution_mapping_matrix": 4.0774168, + "data_vector_D + pdip_solve": 2.1052879, + "mapped_reconstruction + pdip_solve": 1.7723984, + "mapping_matrix + pdip_solve": 1.7212126, + "border_relocator + pdip_solve": 1.3526783, + "inversion_other + regularization_H": 0.47869079999999997, + "curvature_reg_reduce_gather + inversion_other": 0.47478709999999996, + "inversion_other + pdip_solve": 0.20442839999999998, + "border_relocator + inversion_other + mapping_matrix + mesh_construction + pdip_solve": 0.0903627, + "inversion_other + mapping_matrix + mesh_construction + pdip_solve": 0.07112160000000001, + "mesh_construction + pdip_solve": 0.03542630000000001, + "grids_and_structures + mass_profile_deflections + ray_trace_data_grid": 0.028738399999999997, + "inversion_other + mesh_construction + pdip_solve": 0.0280316, + "inversion_other + pdip_solve + regularization_H": 0.0253404, + "border_relocator + mesh_construction": 0.0235292, + "inversion_other + mapped_reconstruction + reconstruction_scatter": 0.021826599999999998, + "chi_squared_evidence + pdip_solve": 0.0215324, + "grids_and_structures + mass_profile_deflections + pdip_solve + ray_trace_data_grid": 0.0172318, + "pdip_solve + regularization_H": 0.0156378, + "pdip_solve + ray_trace_data_grid": 0.013036599999999992, + "inversion_other + mapping_matrix": 0.011541900000000003, + "inversion_other + mapped_reconstruction": 0.009830199999999999, + "border_relocator + inversion_other + pdip_solve": 0.0074206, + "border_relocator + inversion_other + mesh_construction + pdip_solve": 0.006028599999999999, + "inversion_other + pdip_solve + ray_trace_data_grid": 0.0048479, + "grids_and_structures + mass_profile_deflections + pdip_solve": 0.0041983, + "mapping_matrix + pdip_solve + regularization_H": 0.0040352, + "border_relocator + inversion_other + mapping_matrix + mesh_construction": 0.002832, + "chi_squared_evidence + inversion_other": 0.0023296 + }, + "example_kernels": { + "curvature_matrix_F + psf_convolution_mapping_matrix": [ + "loop_divide_gather_fusion" + ], + "inversion_other + mapped_reconstruction + pdip_solve + reconstruction_scatter": [ + "input_multiply_transpose_fusion" + ], + "pdip_solve + psf_convolution_mapping_matrix": [ + "loop_broadcast_fusion" + ], + "data_vector_D + pdip_solve": [ + "input_reduce_fusion.3", + "input_reduce_fusion.18" + ], + "mapped_reconstruction + pdip_solve": [ + "input_reduce_fusion.6" + ], + "mapping_matrix + pdip_solve": [ + "loop_broadcast_fusion.1", + "loop_divide_fusion" + ], + "border_relocator + pdip_solve": [ + "input_reduce_fusion.9", + "loop_select_sine_fusion", + "input_concatenate_fusion.4", + "input_transpose_fusion.8" + ], + "inversion_other + regularization_H": [ + "input_transpose_fusion.5" + ], + "curvature_reg_reduce_gather + inversion_other": [ + "input_transpose_fusion.4" + ], + "inversion_other + pdip_solve": [ + "input_reduce_fusion.4", + "input_reduce_fusion.5", + "input_scatter_fusion.11", + "input_transpose_fusion.2" + ] + }, + "prorated_estimate_ms": { + "psf_convolution_mapping_matrix": 10.449173499999997, + "curvature_matrix_F": 8.410465099999998, + "pdip_solve": 6.964028481666667, + "mapped_reconstruction": 2.1365978583333334, + "inversion_other": 1.8962358149999998, + "reconstruction_scatter": 1.2454835583333332, + "data_vector_D": 1.05264395, + "mapping_matrix": 0.9042832566666669, + "border_relocator": 0.7108649733333334, + "regularization_H": 0.25695616666666665, + "curvature_reg_reduce_gather": 0.23739354999999998, + "mesh_construction": 0.07688970666666667, + "ray_trace_data_grid": 0.022021683333333326, + "grids_and_structures": 0.01528685, + "mass_profile_deflections": 0.01528685, + "chi_squared_evidence": 0.011931 + }, + "prorated_note": "ESTIMATE ONLY \u2014 a mixed fusion's time split equally across the stages its constituents span. Never summed into the measured table, never reconciled." + }, + "other_sources_ms": { + "copy.60": 0.08004939999999997, + "copy.61": 0.07916309999999999, + "copy.79": 0.0388731, + "copy.70": 0.038450600000000036, + "copy.69": 0.038386300000000054, + "copy.78": 0.03811430000000006, + "copy.100": 0.0336503, + "copy.98": 0.02345249999999999, + "copy.99": 0.02343939999999999, + "copy.113": 0.0024383, + "copy.53": 0.0021311999999999998, + "copy.62": 0.0017504000000000003 + }, + "device_span_ms": 453.407828, + "device_busy_ms": 441.18125449999997, + "device_idle_ms": 12.226573500000029, + "largest_idle_gaps": [ + { + "gap_ms": 0.111966, + "after": "cholesky.40", + "before": "cholesky.40" + }, + { + "gap_ms": 0.052415, + "after": "cholesky.40", + "before": "cholesky.40" + }, + { + "gap_ms": 0.052222, + "after": "input_reduce_fusion.17", + "before": "loop_broadcast_fusion" + }, + { + "gap_ms": 0.031487, + "after": "loop_select_fusion.3", + "before": "input_transpose_fusion.1" + }, + { + "gap_ms": 0.02336, + "after": "while.42", + "before": "copy.99" + }, + { + "gap_ms": 0.020287, + "after": "while.42", + "before": "copy.99" + }, + { + "gap_ms": 0.019583, + "after": "while.42", + "before": "copy.99" + }, + { + "gap_ms": 0.019296, + "after": "while.42", + "before": "copy.99" + } + ], + "kernel_ms": 440.4974850000031, + "sum_ms": 452.72405850000314, + "wall_ms": 453.5386453000683, + "host_outside_span_ms": 0.1308173000683155, + "reconciliation_pct": -0.17960692181505905, + "unjoined_ms": 0.0, + "unjoined_pct": 0.0, + "other_ms": 0.4001825000000001, + "other_pct": 0.08823559009734067, + "note": "Stage rows attribute the command-buffers-OFF program (see the module docstring): kernel times are the same, the launch overhead the CUDA graphs remove is not. sum_ms = kernel rows + device_idle_ms; the residual against wall_ms is host_outside_span_ms (dispatch before the first kernel, teardown after the last).", + "per_stage_ms_per_lane": { + "border_relocator": 0.005399875, + "curvature_matrix_F": 6.13461340625, + "inversion_other": 1.0188034062499995, + "mapping_matrix": 0.0042250000000000005, + "mesh_construction": 0.06415646874999993, + "mixed_fusion": 2.15373725, + "other": 0.025011406250000007, + "pdip_solve": 10.881189812500196, + "psf_convolution_mapping_matrix": 7.213598375, + "regularization_H": 0.030357812499999998 + }, + "per_lane_divisor": 16, + "host_callback": { + "pure_callback_span_ms": 0, + "qhull_ms": 0.0, + "callback_body_ms_note": "the OUTERMOST matching body event, not a sum: under the probe the body appears twice (the wrapper and the timed re-implementation it calls) and summing them would count the same work twice", + "events_by_name": { + "ThenExecuteCallback:GetEventForComputeStreamSyncPoint": { + "count": 10, + "ms": 0.0300968 + } + }, + "note": "HOST milliseconds per traced BATCH (the whole invocation), aggregated by name because the events nest. Not a row of the device table: the device pays for them as the idle gaps largest_idle_gaps names." + }, + "host_callback_ms": 0 + }, + "hlo_census": { + "status": "excluded", + "reason": "The legacy census anchors PyAutoArray source line numbers that moved after the phase-1 run. No batched attribution is published from unsupported anchors; the device-event table and wall reconciliation remain valid." + }, + "trace_split": { + "expected_calls": 10, + "executions_per_invocation": 1, + "method": "per-call (first-instruction recurrence)", + "note": "DECIDED IN CODE: the scalar arm's trace is split by trace_calls * B, so every lane's execution is its own block and the per-stage median is taken over all of them. The vmap arm's is split by trace_calls, one block per batched execution, and per_stage_ms_per_lane divides those rows by B." + } + }, + "scalar": { + "arm": "scalar", + "program": "jax.jit(fn), called B times", + "stands_for": "Nautilus(use_jax_vmap=False, use_jax_jit=True). Plain use_jax_vmap=False is UNJITTED and is NOT this arm", + "hlo_source": "jax.jit(fn).lower(lane_trees[0]) \u2014 the same program phase 1 traced", + "batch_wall_ms": 492.7870002997224, + "wall_production_nesting_ms": 492.7870002997224, + "wall_aot_command_buffers_on_ms": 492.7899731999787, + "wall_aot_command_buffers_off_ms": 495.960514699982, + "command_buffer_delta_ms": 3.17054150000331, + "production_nesting_vs_aot_on_delta_ms": -0.0029729002562817186, + "production_nesting_vs_aot_on_delta_pct": -0.0006032793721383792, + "wall_per_lane_ms": 30.79918751873265, + "wall_per_lane_command_buffers_off_ms": 30.997532168748876, + "traced_batch_wall_ms": 510.98847760003997, + "untraced_batch_wall_ms": 495.9250129999418, + "traced_wall_per_lane_ms": 31.936779850002498, + "callback_count_per_call": 0.0, + "callback_count_per_lane": 0.0, + "callback_expectation": "0 \u2014 the rectangular mesh has no qhull host callback (asserted)", + "host_qhull_ms": 0.0, + "host_tables_ms": 0.0, + "host_qhull_ms_per_lane": 0.0, + "host_tables_ms_per_lane": 0.0, + "host_callback_probe": { + "calls": 0, + "qhull_ms_total": 0.0, + "tables_ms_total": 0.0, + "total_ms_total": 0.0, + "qhull_ms_mean": 0.0, + "tables_ms_mean": 0.0, + "total_ms_mean": 0.0, + "non_finite_calls": 0, + "n_points": [] + }, + "host_callback_records_first": [], + "device_idle_ms": 1.6542482937500047, + "device_idle_ms_per_lane": 1.6542482937500047, + "trace": { + "parser": "ProfileData.from_file(xplane) + as_text() + stack_frame_index(proto field 17)", + "stage_audit": { + "mesh_construction": [ + { + "instruction": "fusion.2", + "ms": 0.14846999999999982, + "opcode": "fusion", + "shape": "(f64[15361,2]{1,0}, s64[15361,2]{1,0}, s32[15361,2]{1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:227", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:227 (create_transforms_rank)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:396 (_transforms_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:561 (adaptive_rectangular_mappings_weights_via_interpolation_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:693 (InterpolatorRectangular._mappings_sizes_weights)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "loop_select_fusion", + "ms": 0.039597549999999926, + "opcode": "fusion", + "shape": "(u32[2,15361]{1,0}, u32[2,15361]{1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:69", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:69 (forward_interp)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:573 (adaptive_rectangular_mappings_weights_via_interpolation_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:693 (InterpolatorRectangular._mappings_sizes_weights)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/abstract.py:36 (AbstractInterpolator.mappings)" + ] + }, + { + "instruction": "loop_select_fusion.3", + "ms": 0.03488783749999943, + "opcode": "fusion", + "shape": "(u32[15361]{0}, u32[15361]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:245", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:245 (create_transforms_rank)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:396 (_transforms_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:561 (adaptive_rectangular_mappings_weights_via_interpolation_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:693 (InterpolatorRectangular._mappings_sizes_weights)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "loop_select_fusion.1", + "ms": 0.03473039374999958, + "opcode": "fusion", + "shape": "(u32[15361]{0}, u32[15361]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:245", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:245 (create_transforms_rank)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:396 (_transforms_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:561 (adaptive_rectangular_mappings_weights_via_interpolation_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:693 (InterpolatorRectangular._mappings_sizes_weights)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "loop_add_fusion", + "ms": 0.021229881249999475, + "opcode": "fusion", + "shape": "s64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:69", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:69 (forward_interp)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:573 (adaptive_rectangular_mappings_weights_via_interpolation_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:693 (InterpolatorRectangular._mappings_sizes_weights)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/abstract.py:36 (AbstractInterpolator.mappings)" + ] + }, + { + "instruction": "loop_add_fusion.3", + "ms": 0.021092224999999503, + "opcode": "fusion", + "shape": "s64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:245", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:245 (create_transforms_rank)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:396 (_transforms_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:561 (adaptive_rectangular_mappings_weights_via_interpolation_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:693 (InterpolatorRectangular._mappings_sizes_weights)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "mixed_fusion": [ + { + "instruction": "loop_divide_gather_fusion", + "ms": 0.7003358249999999, + "opcode": "fusion", + "shape": "(f64[15361,1,1,1521]{3,2,1,0}, f64[15361,1,1,1521]{3,2,1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:133", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:133 (curvature_matrix_via_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:93 (InversionImagingMapping.curvature_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:389 (AbstractInversion.curvature_reg_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "loop_broadcast_fusion.3", + "ms": 0.23251897500000013, + "opcode": "fusion", + "shape": "f64[1521,180,180]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "input_multiply_transpose_fusion", + "ms": 0.1855460125, + "opcode": "fusion", + "shape": "(f64[1369,1369]{1,0}, f64[1369,1369]{1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:237 (active_set_search)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:293 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:274 (_certified_positive_only_from)" + ] + }, + { + "instruction": "loop_broadcast_fusion", + "ms": 0.13649223125000007, + "opcode": "fusion", + "shape": "f64[15361,1521]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:342", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:342 (mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/abstract.py:283 (Mapper.mapping_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:91 (AbstractInversionImaging._mapping_matrix_for_convolution_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:137 (AbstractInversionImaging.operated_mapping_matrix_list)" + ] + }, + { + "instruction": "input_reduce_fusion.3", + "ms": 0.11361058749999996, + "opcode": "fusion", + "shape": "f64[92,1521]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/inversion_imaging_util.py:123", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/inversion_imaging_util.py:123 (data_vector_via_blurred_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:67 (InversionImagingMapping.data_vector)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:699 (AbstractInversion.reconstruction)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "input_reduce_fusion.6", + "ms": 0.11175777499999999, + "opcode": "fusion", + "shape": "f64[15361]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:163", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:163 (mapped_reconstructed_data_via_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:120 (InversionImagingMapping._mapped_reconstructed_data_dict_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:196 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + } + ], + "border_relocator": [ + { + "instruction": "eigh.0", + "ms": 0.07437944374999991, + "opcode": "custom-call", + "shape": "(f64[2,2]{0,1}, f64[2]{0}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:245", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:245 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:415 (BorderRelocator.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:83 (AbstractMesh.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/rectangular_rtu_adapt_density.py:267 (RectangularRTUAdaptDensity.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "custom-call.2", + "ms": 0.007910456250000001, + "opcode": "custom-call", + "shape": "(f64[2,2]{1,0}, s8[4194304]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:242", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:242 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:415 (BorderRelocator.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:83 (AbstractMesh.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/rectangular_rtu_adapt_density.py:267 (RectangularRTUAdaptDensity.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "input_reduce_fusion.7", + "ms": 0.005284137500000001, + "opcode": "fusion", + "shape": "(f64[], f64[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:270", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:270 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:415 (BorderRelocator.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:83 (AbstractMesh.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/rectangular_rtu_adapt_density.py:267 (RectangularRTUAdaptDensity.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "loop_add_fusion.5", + "ms": 0.003600881249999995, + "opcode": "fusion", + "shape": "f64[15361]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:308", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:308 (relocated_grid_via_ellipse_border_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:423 (BorderRelocator.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:83 (AbstractMesh.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/rectangular_rtu_adapt_density.py:267 (RectangularRTUAdaptDensity.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "input_concatenate_fusion.4", + "ms": 0.0023745499999999996, + "opcode": "fusion", + "shape": "f64[392,2]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:238", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:238 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:415 (BorderRelocator.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:83 (AbstractMesh.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/rectangular_rtu_adapt_density.py:267 (RectangularRTUAdaptDensity.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "input_reduce_fusion.14", + "ms": 0.001610337499999999, + "opcode": "fusion", + "shape": "f64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:256", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:256 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:415 (BorderRelocator.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:83 (AbstractMesh.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/rectangular_rtu_adapt_density.py:267 (RectangularRTUAdaptDensity.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + } + ], + "other": [ + { + "instruction": "copy.41", + "ms": 0.0303602312499998, + "opcode": "copy", + "shape": "u32[2,15361]{1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "copy.42", + "ms": 0.030067275000000313, + "opcode": "copy", + "shape": "u32[2,15361]{1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "copy.59", + "ms": 0.028573787500000766, + "opcode": "copy", + "shape": "u32[15361]{0}", + "source": "", + "stack": [] + }, + { + "instruction": "copy.51", + "ms": 0.028510237500000833, + "opcode": "copy", + "shape": "u32[15361]{0}", + "source": "", + "stack": [] + }, + { + "instruction": "copy.50", + "ms": 0.028448731250000973, + "opcode": "copy", + "shape": "u32[15361]{0}", + "source": "", + "stack": [] + }, + { + "instruction": "copy.60", + "ms": 0.02844560625000095, + "opcode": "copy", + "shape": "u32[15361]{0}", + "source": "", + "stack": [] + } + ], + "pdip_solve": [ + { + "instruction": "cholesky.40", + "ms": 8.861813318750002, + "opcode": "custom-call", + "shape": "(f64[1369,1369]{0,1}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:252 (active_set_search..body_fun)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:262 (active_set_search)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:293 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)" + ] + }, + { + "instruction": "triangular-solve.1", + "ms": 1.5525129624999907, + "opcode": "custom-call", + "shape": "(f64[1369,1]{0,1}, s8[0]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:154", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:154 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:252 (active_set_search..body_fun)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:262 (active_set_search)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:293 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)" + ] + }, + { + "instruction": "triangular-solve", + "ms": 1.3149034812500089, + "opcode": "custom-call", + "shape": "(f64[1369,1]{0,1}, s8[0]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:154", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:154 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:252 (active_set_search..body_fun)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:262 (active_set_search)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:293 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)" + ] + }, + { + "instruction": "cholesky.60", + "ms": 0.8453678250000011, + "opcode": "custom-call", + "shape": "(f64[1369,1369]{0,1}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:237 (active_set_search)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:293 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:274 (_certified_positive_only_from)" + ] + }, + { + "instruction": "cholesky.70", + "ms": 0.838412799999998, + "opcode": "custom-call", + "shape": "(f64[1369,1369]{0,1}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:297 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:274 (_certified_positive_only_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:496 (reconstruction_positive_only_from)" + ] + }, + { + "instruction": "input_transpose_fusion.1", + "ms": 0.3112221062500004, + "opcode": "fusion", + "shape": "f64[1369,1369]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:252 (active_set_search..body_fun)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:262 (active_set_search)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:293 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)" + ] + } + ], + "mapping_matrix": [ + { + "instruction": "input_reduce_fusion.20", + "ms": 0.0028111124999999995, + "opcode": "fusion", + "shape": "f64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:93", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:93 (adaptive_pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/abstract.py:507 (Mapper.pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt.py:339 (Adapt.regularization_weights_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt.py:362 (Adapt.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)" + ] + } + ], + "regularization_H": [ + { + "instruction": "input_scatter_fusion.8", + "ms": 0.002840362499999999, + "opcode": "fusion", + "shape": "f64[1521,1521]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt.py:123", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt.py:123 (weighted_regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt.py:366 (Adapt.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:332 (AbstractInversion.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "psf_convolution_mapping_matrix": [ + { + "instruction": "fft.19.0", + "ms": 1.7862128062499991, + "opcode": "fft", + "shape": "f64[1521,180,180]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "input_scatter_fusion", + "ms": 1.4272017124999998, + "opcode": "fusion", + "shape": "f64[1521,180,180]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "fft.15.0", + "ms": 1.3883661874999982, + "opcode": "fft", + "shape": "c128[1521,180,91]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "fft.17.0", + "ms": 0.9928161124999997, + "opcode": "fft", + "shape": "c128[1521,91,180]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "input_transpose_fusion.2", + "ms": 0.5221779874999999, + "opcode": "fusion", + "shape": "c128[1521,91,180]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "wrapped_transpose.2", + "ms": 0.50538510625, + "opcode": "fusion", + "shape": "c128[1521,180,91]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + } + ], + "curvature_matrix_F": [ + { + "instruction": "cublas-lt-matmul.2", + "ms": 4.349770500000001, + "opcode": "custom-call", + "shape": "(f64[1521,1521]{1,0}, s8[4194304]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:134", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:134 (curvature_matrix_via_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:93 (InversionImagingMapping.curvature_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:389 (AbstractInversion.curvature_reg_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "inversion_other": [ + { + "instruction": "cholesky.80", + "ms": 0.9205718187500017, + "opcode": "custom-call", + "shape": "(f64[1521,1521]{0,1}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986 (AbstractInversion._log_det_symmetric_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:1078 (AbstractInversion.log_det_curvature_reg_matrix_term)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:347 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/model/analysis.py:135 (AnalysisImaging.log_likelihood_function)" + ] + }, + { + "instruction": "cholesky.90", + "ms": 0.9019525062500009, + "opcode": "custom-call", + "shape": "(f64[1521,1521]{0,1}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986 (AbstractInversion._log_det_symmetric_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:1157 (AbstractInversion.log_det_regularization_matrix_term)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:348 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/model/analysis.py:135 (AnalysisImaging.log_likelihood_function)" + ] + }, + { + "instruction": "loop_reduce_window_fusion.3", + "ms": 0.005837662500000002, + "opcode": "fusion", + "shape": "s64[6,16]{1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "loop_reduce_window_fusion.2", + "ms": 0.0030367124999999932, + "opcode": "fusion", + "shape": "s64[86,16]{1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "input_scatter_fusion.9", + "ms": 0.0025597687499999953, + "opcode": "fusion", + "shape": "s64[1369]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:527", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:527 (AbstractInversion.zeroed_ids_to_keep)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:567 (AbstractInversion.solve_ids_to_keep)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:684 (AbstractInversion.reconstruction)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "loop_broadcast_fusion.4", + "ms": 0.001910556249999998, + "opcode": "fusion", + "shape": "(s64[1369]{0}, s64[1369]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:527", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:527 (AbstractInversion.zeroed_ids_to_keep)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:567 (AbstractInversion.solve_ids_to_keep)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:684 (AbstractInversion.reconstruction)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "chi_squared_evidence": [ + { + "instruction": "loop_multiply_fusion", + "ms": 0.002975749999999999, + "opcode": "fusion", + "shape": "f64[15361]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/abstract_ndarray.py:300", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/abstract_ndarray.py:300 (AbstractNDArray.__pow__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/abstract_ndarray.py:60 (unwrap_array..wrapper)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/abstract_ndarray.py:35 (to_new_array..wrapper)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_util.py:78 (chi_squared_map_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:78 (AbstractFit.chi_squared_map)" + ] + } + ] + }, + "stage_audit_note": "The HLO instructions that contributed most of each stage's milliseconds, with their full source stack. A stage row is only as good as the rules that built it; this is how a reader checks a row against the HLO instead of trusting it.", + "untraced_wall_ms": 30.995313312496364, + "reconciliation_vs_untraced_pct": 6.608653897451632, + "wall_basis": "wall_ms is the TRACED run's wall, the run these kernel durations came from. untraced_wall_ms is the same executable without the profiler; the difference is the profiler's overhead and belongs in neither the stages nor the idle row.", + "calls": 160, + "call_split": "per-call (first-instruction recurrence)", + "call_blocks": 160, + "events": 89090, + "streams": [ + "Stream #14(Memset,MemcpyD2H,Compute,MemcpyH2D,MemcpyD2D)" + ], + "per_stage_ms": { + "border_relocator": { + "median_ms": 0.0966555, + "min_ms": 0.09599800000000003, + "max_ms": 0.09759799999999999 + }, + "chi_squared_evidence": { + "median_ms": 0.0029595000000000003, + "min_ms": 0.002815, + "max_ms": 0.003296 + }, + "curvature_matrix_F": { + "median_ms": 4.327062, + "min_ms": 4.305276, + "max_ms": 4.522166 + }, + "inversion_other": { + "median_ms": 1.838941, + "min_ms": 1.823593, + "max_ms": 1.862181 + }, + "mapping_matrix": { + "median_ms": 0.002816, + "min_ms": 0.002783, + "max_ms": 0.002849 + }, + "memset": { + "median_ms": 0.040222999999999995, + "min_ms": 0.014975999999999998, + "max_ms": 0.05491200000000002 + }, + "mesh_construction": { + "median_ms": 0.3445290000000001, + "min_ms": 0.3419430000000003, + "max_ms": 0.3463909999999999 + }, + "mixed_fusion": { + "median_ms": 1.8530155000000004, + "min_ms": 1.8474620000000004, + "max_ms": 1.858663 + }, + "other": { + "median_ms": 0.18080299999999977, + "min_ms": 0.18034199999999972, + "max_ms": 0.18120699999999973 + }, + "pdip_solve": { + "median_ms": 16.078145999999997, + "min_ms": 4.668055, + "max_ms": 21.500268000000016 + }, + "psf_convolution_mapping_matrix": { + "median_ms": 6.6214715, + "min_ms": 6.607412999999999, + "max_ms": 6.6393819999999995 + }, + "regularization_H": { + "median_ms": 0.002816, + "min_ms": 0.002432, + "max_ms": 0.0032 + } + }, + "stage_order": [ + "border_relocator", + "mesh_construction", + "mapping_matrix", + "psf_convolution_mapping_matrix", + "curvature_matrix_F", + "regularization_H", + "pdip_solve", + "chi_squared_evidence", + "inversion_other", + "mixed_fusion", + "other", + "memset" + ], + "mixed_fusion": { + "ms": 1.8530155000000004, + "constituent_stage_sets": { + "curvature_matrix_F + psf_convolution_mapping_matrix": 0.7003358249999999, + "pdip_solve + psf_convolution_mapping_matrix": 0.23251897500000013, + "inversion_other + mapped_reconstruction + pdip_solve + reconstruction_scatter": 0.1855460125, + "mapping_matrix + pdip_solve": 0.13883138125000027, + "data_vector_D + pdip_solve": 0.11732490625000003, + "mapped_reconstruction + pdip_solve": 0.11175777499999999, + "border_relocator + pdip_solve": 0.07066861875000008, + "mesh_construction + pdip_solve": 0.03856215000000002, + "inversion_other + regularization_H": 0.03077855624999999, + "inversion_other + pdip_solve": 0.030346618749999933, + "border_relocator + mesh_construction + pdip_solve": 0.02686664375000001, + "curvature_reg_reduce_gather + inversion_other": 0.025528625, + "border_relocator + inversion_other + mapping_matrix + mesh_construction + pdip_solve": 0.020533562500000012, + "pdip_solve + regularization_H": 0.019172987499999985, + "inversion_other + mapping_matrix + pdip_solve + regularization_H": 0.015526856249999997, + "inversion_other + mapping_matrix + mesh_construction": 0.012942187500000008, + "pdip_solve + ray_trace_data_grid": 0.012830974999999996, + "grids_and_structures + mass_profile_deflections + pdip_solve": 0.009855012500000006, + "inversion_other + mapped_reconstruction + reconstruction_scatter": 0.009664968750000004, + "inversion_other + mapped_reconstruction + pdip_solve": 0.009102518749999993, + "chi_squared_evidence + pdip_solve": 0.0076110499999999925, + "inversion_other + mesh_construction + pdip_solve": 0.005480099999999985, + "grids_and_structures + mass_profile_deflections + ray_trace_data_grid": 0.005286868749999997, + "inversion_other + pdip_solve + ray_trace_data_grid": 0.004893300000000005, + "border_relocator + mesh_construction": 0.003445131250000003, + "border_relocator + inversion_other": 0.003382518750000002, + "border_relocator + inversion_other + mesh_construction + pdip_solve": 0.0024909624999999995, + "chi_squared_evidence + inversion_other": 0.001795793750000001 + }, + "example_kernels": { + "curvature_matrix_F + psf_convolution_mapping_matrix": [ + "loop_divide_gather_fusion" + ], + "pdip_solve + psf_convolution_mapping_matrix": [ + "loop_broadcast_fusion.3" + ], + "inversion_other + mapped_reconstruction + pdip_solve + reconstruction_scatter": [ + "input_multiply_transpose_fusion" + ], + "mapping_matrix + pdip_solve": [ + "loop_divide_fusion.1", + "loop_broadcast_fusion" + ], + "data_vector_D + pdip_solve": [ + "input_reduce_fusion.3", + "input_reduce_fusion.18" + ], + "mapped_reconstruction + pdip_solve": [ + "input_reduce_fusion.6" + ], + "border_relocator + pdip_solve": [ + "input_reduce_fusion.8", + "loop_select_sine_fusion", + "input_concatenate_fusion.1", + "input_transpose_fusion.6" + ], + "mesh_construction + pdip_solve": [ + "loop_multiply_fusion.2", + "loop_pad_fusion", + "loop_reduce_fusion", + "triton_softmax.1" + ], + "inversion_other + regularization_H": [ + "input_transpose_fusion.4" + ], + "inversion_other + pdip_solve": [ + "input_scatter_fusion.11", + "input_reduce_fusion.9", + "input_reduce_fusion.16", + "input_reduce_fusion.4" + ] + }, + "prorated_estimate_ms": { + "psf_convolution_mapping_matrix": 0.46642740000000005, + "pdip_solve": 0.46354291406250014, + "curvature_matrix_F": 0.35016791249999996, + "inversion_other": 0.11494141822916662, + "mapped_reconstruction": 0.10852121979166665, + "mapping_matrix": 0.08171817968750014, + "data_vector_D": 0.058662453125000014, + "border_relocator": 0.052433135416666714, + "reconstruction_scatter": 0.049608159375, + "mesh_construction": 0.04082940416666668, + "regularization_H": 0.02885748593749999, + "curvature_reg_reduce_gather": 0.0127643125, + "ray_trace_data_grid": 0.009808877083333334, + "grids_and_structures": 0.005047293750000001, + "mass_profile_deflections": 0.005047293750000001, + "chi_squared_evidence": 0.004703421874999997 + }, + "prorated_note": "ESTIMATE ONLY \u2014 a mixed fusion's time split equally across the stages its constituents span. Never summed into the measured table, never reconciled." + }, + "other_sources_ms": { + "copy.41": 0.0303602312499998, + "copy.42": 0.030067275000000313, + "copy.59": 0.028573787500000766, + "copy.51": 0.028510237500000833, + "copy.50": 0.028448731250000973, + "copy.60": 0.02844560625000095, + "copy.96": 0.001685175000000001, + "copy.95": 0.0016329874999999993, + "copy.52": 0.0015435812499999988, + "copy.34": 0.001537562499999998 + }, + "device_span_ms": 31.929734237500004, + "device_busy_ms": 30.27548594375, + "device_idle_ms": 1.6542482937500047, + "largest_idle_gaps": [ + { + "gap_ms": 0.052286, + "after": "input_concatenate_fusion.4", + "before": "custom-call.2" + }, + { + "gap_ms": 0.033983, + "after": "loop_multiply_fusion.1", + "before": "eigh.0" + }, + { + "gap_ms": 0.031711, + "after": "while.26", + "before": "input_transpose_fusion" + }, + { + "gap_ms": 0.026815, + "after": "while.26", + "before": "input_transpose_fusion" + }, + { + "gap_ms": 0.025087, + "after": "loop_add_fusion.3", + "before": "loop_select_fusion.3" + }, + { + "gap_ms": 0.023615, + "after": "loop_broadcast_fusion.6", + "before": "loop_broadcast_fusion.8" + }, + { + "gap_ms": 0.020256, + "after": "eigh.0", + "before": "eigh.0" + }, + { + "gap_ms": 0.019296, + "after": "copy.50", + "before": "copy.51" + } + ], + "kernel_ms": 31.389438, + "sum_ms": 33.04368629375, + "wall_ms": 31.936779850002498, + "host_outside_span_ms": 0.007045612502494691, + "reconciliation_pct": 3.4659300309746626, + "unjoined_ms": 0.0, + "unjoined_pct": 0.0, + "other_ms": 0.18080299999999977, + "other_pct": 0.5661278339556379, + "note": "Stage rows attribute the command-buffers-OFF program (see the module docstring): kernel times are the same, the launch overhead the CUDA graphs remove is not. sum_ms = kernel rows + device_idle_ms; the residual against wall_ms is host_outside_span_ms (dispatch before the first kernel, teardown after the last).", + "per_stage_ms_per_lane": { + "border_relocator": 0.0966555, + "chi_squared_evidence": 0.0029595000000000003, + "curvature_matrix_F": 4.327062, + "inversion_other": 1.838941, + "mapping_matrix": 0.002816, + "memset": 0.040222999999999995, + "mesh_construction": 0.3445290000000001, + "mixed_fusion": 1.8530155000000004, + "other": 0.18080299999999977, + "pdip_solve": 16.078145999999997, + "psf_convolution_mapping_matrix": 6.6214715, + "regularization_H": 0.002816 + }, + "per_lane_divisor": 1, + "host_callback": { + "pure_callback_span_ms": 0, + "qhull_ms": 0.0, + "callback_body_ms_note": "the OUTERMOST matching body event, not a sum: under the probe the body appears twice (the wrapper and the timed re-implementation it calls) and summing them would count the same work twice", + "events_by_name": { + "ThenExecuteCallback:GetEventForComputeStreamSyncPoint": { + "count": 160, + "ms": 0.2977295000000001 + } + }, + "note": "HOST milliseconds per traced BATCH (the whole invocation), aggregated by name because the events nest. Not a row of the device table: the device pays for them as the idle gaps largest_idle_gaps names." + }, + "host_callback_ms": 0 + }, + "hlo_census": { + "status": "excluded", + "reason": "The legacy census anchors PyAutoArray source line numbers that moved after the phase-1 run. No batched attribution is published from unsupported anchors; the device-event table and wall reconciliation remain valid." + }, + "trace_split": { + "expected_calls": 160, + "executions_per_invocation": 16, + "method": "per-call (first-instruction recurrence)", + "note": "DECIDED IN CODE: the scalar arm's trace is split by trace_calls * B, so every lane's execution is its own block and the per-stage median is taken over all of them. The vmap arm's is split by trace_calls, one block per batched execution, and per_stage_ms_per_lane divides those rows by B." + } + } + }, + "certification_report": { + "source": "vmap arm, library solve observed through its stats= out-dict (PyAutoArray #566) and jax.debug.callback(..., ordered=True); ordered because the unordered batching rule returns the lanes permuted. Untimed, separately compiled; max rel diff of its log likelihoods vs the timed arm's: 2.209e-06", + "rows": 16, + "pdip_iter": "NOT AVAILABLE per lane without changing library numerics. The fallback branch calls the library's own reconstruction_positive_only_from, which returns the solution alone \u2014 jax_nnls.solve_nnls' iteration count is discarded inside the library's custom_vjp primal. The PDIP while_loop's cost is in the pdip_solve stage row of each arm's device table instead, which is a max-over-lanes quantity under vmap because every lane runs the same fixed kernel sequence.", + "passes_semantics": "library `passes`: restricted active-set passes run (jax_active_set.solve_certified)" + }, + "lane_construction": { + "draws_sha256": "6bdc2dd94a49d4d0c9095b0fbaa94aad0f0243aedd8fc4dad1391ab796f19d33", + "lane_rows": [ + 300, + 301, + 302, + 303, + 304, + 305, + 306, + 307, + 308, + 309, + 310, + 311, + 312, + 313, + 314, + 315 + ], + "calls": [ + 15 + ], + "stage": "pix1", + "regularization_range": { + "galaxies.source.pixelization.regularization.inner_coefficient": { + "min": 1.5395402868893563e-06, + "max": 631.3270846999916 + }, + "galaxies.source.pixelization.regularization.outer_coefficient": { + "min": 1.585514819488347e-06, + "max": 4.102561528173602 + }, + "galaxies.source.pixelization.regularization.signal_scale": { + "min": 0.06623313471893155, + "max": 0.9779334025364208 + } + }, + "phases": [ + "exploration" + ], + "window_rule": "nautilus_batches.timed_window: consecutive captured calls, in call order, from the FIRST call that is not a prior batch, concatenated and truncated to B; at B == n_batch exactly one real Nautilus batch. Falls back to the latest B lanes if the post-prior lanes run out; never repeats a lane.", + "note": "Lane k is captured lane lane_rows[k]: the mass AND shear of a real Nautilus proposal (nautilus_batch_capture.py), lens light fixed at S3, the S3 light-subtracted dataset shared by every lane. `offsets` in the lane table are the mass offsets from the fiducial; the shear is in the capture file." + }, + "captured": { + "batches_path": "/mnt/ral/jnightin/autolens_profiling_wt/certified-solver-phase-c1-lane-rate/results/breakdown/imaging/nautilus_batches_rectangular_pix1.npz", + "batches_sha256": "c0b62fba544cb62c8a273c19837cf364127f5af7fdaa110f3a2c8a973e0b6cc0", + "schema_version": 2, + "n_calls": 972, + "n_lanes": 19440, + "call_sizes_seen": [ + 20 + ], + "calls_by_phase": { + "prior": 15, + "exploration": 957 + }, + "parameter_paths": [ + "galaxies.source.pixelization.regularization.inner_coefficient", + "galaxies.source.pixelization.regularization.outer_coefficient", + "galaxies.source.pixelization.regularization.signal_scale", + "galaxies.lens.mass.centre.centre_0", + "galaxies.lens.mass.centre.centre_1", + "galaxies.lens.mass.einstein_radius", + "galaxies.lens.mass.ell_comps.ell_comps_0", + "galaxies.lens.mass.ell_comps.ell_comps_1", + "galaxies.lens.shear.gamma_1", + "galaxies.lens.shear.gamma_2" + ], + "stage": "pix1", + "regularization": { + "class": "Adapt", + "free": true, + "priors": { + "inner_coefficient": [ + "LogUniform", + 1e-06, + 1000000.0 + ], + "outer_coefficient": [ + "LogUniform", + 1e-06, + 1000000.0 + ], + "signal_scale": [ + "Uniform", + 0.0, + 1.0 + ] + }, + "priors_source": "PyAutoGalaxy packaged config/priors/regularization (adapt_split.yaml / adapt.yaml / constant.yaml); adapt_split.yaml and adapt.yaml are identical to euclid_strong_lens_modeling_pipeline/config/priors/regularization/'s copies" + }, + "nautilus": { + "departures_from_production": [ + "mass/shear priors are the phase-B cell's Gaussians, not chained from source_lp", + "no positions likelihood", + "the cell's mesh (39x39 RectangularBilinearAdaptImage, weight_power 1, weight_floor 0) fixed in both stages; source_pix_1 uses RectangularBilinearAdaptDensity, source_pix_2 frees weight_power / weight_floor", + "seeded (production passes no seed)", + "quick updates disabled (iterations_per_quick_update=1e12; render-only)", + "NullPaths: no output directory, so no checkpoint and one Sampler.run call", + "post-fit perform_update skipped (samples / latent variables never built)" + ], + "n_batch": 20, + "n_like_max": 40000, + "n_live": 150, + "number_of_cores": 1, + "production_reference": "euclid_strong_lens_modeling_pipeline/scripts/full_model.py source_pix_1 (n_live=150) / source_pix_2 (n_live=75): af.Nautilus(n_batch=20, **SettingsSearch.search_dict) with use_jax_vmap=True and number_of_cores=1 (SettingsSearch defaults)", + "production_stage": "source_pix_1", + "seed": 1, + "stage": "pix1", + "use_jax_vmap": true, + "version": "1.0.5" + }, + "capture_fit_status": "sampling complete (n_like_max or convergence); post-fit result skipped", + "capture_library_revisions": { + "PyAutoArray": { + "head": "3de624b5b91a4efa130dc3cb0a3a0f06f85025a3", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoArray" + }, + "PyAutoFit": { + "head": "dd9fbe0aab60c4a57702b1444ca031b317c91331", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoFit" + }, + "PyAutoGalaxy": { + "head": "70a61e26cd715cefe7012a38285698091246a8a4", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy" + }, + "PyAutoLens": { + "head": "86054bbc19baa2f710a12e04a94fa27ab37cc354", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoLens" + }, + "PyAutoNerves": { + "head": "1fa613aa8d89a79613009fb66f5b4e2d21deb57a", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoNerves" + } + }, + "fingerprint_check": { + "fields": [ + "mesh", + "source_pixels", + "dataset_sha256", + "regularization_class", + "regularization_s0_fiducial", + "border_relocator", + "use_mixed_precision", + "log_evidence_s3_library" + ], + "not_identity": "the regularization coefficients: free per lane since the capture frees them", + "log_evidence_s3_library_rel_diff": 0.0, + "passed": true + }, + "timed_window_vs_capture_pdip": { + "reference": "the capture's own figure of merit (library PDIP, Fitness.call_wrap jax.jit(jax.vmap(call)) over parameter vectors) for the same lanes", + "compared_against": "this cell's jit(vmap) library-PDIP reference", + "n_compared": 16, + "max_rel_diff": 3.7082866944510103e-06, + "max_abs_diff_nats": 0.7208299557678401, + "gated": false, + "note": "RECORDED, NOT GATED: proves the lane trees rebuilt here are the models the sampler evaluated (a wrong parameter mapping shows up as nats, not 1e-10)." + } + }, + "matched": { + "vmap_wall_per_lane_ms": 27.924997075001556, + "scalar_wall_per_lane_ms": 30.79918751873265, + "speedup_vmap_over_scalar": 1.1029253623916784, + "note": "Both walls are the PRODUCTION nesting of their arm, measured in one process on the same B lanes with the SAME library Settings (no injection). A speedup below 1 means the batch is slower per lane than B sequential jitted calls." + }, + "solver_source": "library", + "solver": "certified", + "certified_fallback": "none", + "certified_pass_budget": 16, + "certified_pass_budget_basis": "config default (Settings().certified_pass_budget)", + "certified_tau_rel": 1e-09, + "solver_used": "certified", + "solver_check": { + "solver_used": "certified", + "solver_used_source": "AbstractInversion.positive_only_solver_used on the fiducial S3 inversion, built eagerly on the JAX backend (AnalysisImaging(use_jax=True).fit_from) with the arms' Settings", + "reference_solver_used": "pdip", + "traced_solver_kwargs_jax": [ + "certified" + ], + "observed_calls_jax": 1, + "report_rows": 16, + "report_vs_timed_arm_max_rel_diff": 2.2088446615713593e-06 + }, + "lanes_certified": [ + false, + false, + false, + true, + true, + true, + true, + true, + false, + false, + true, + false, + false, + true, + true, + true + ], + "lanes_passes": [ + 16, + 16, + 16, + 4, + 2, + 14, + 6, + 6, + 16, + 16, + 6, + 16, + 16, + 9, + 2, + 8 + ], + "uncertified_lanes": 7, + "per_lane_certification_note": "certified / passes come from the library's own solve through its stats= out-dict (PyAutoArray #566): passes is the number of restricted active-set passes the library ran (0 when the unconstrained solve was already non-negative), certified is its KKT certificate. With certified_fallback=pdip a False lane returned the PDIP solution; with none it returned the last uncertified iterate. null for a library-PDIP row (no certificate).", + "gate": { + "pre_registered": true, + "gated": [ + "per lane: jit(vmap) arm vs jit(vmap) library PDIP <= lane_rtol relative", + "per lane: scalar jit arm vs scalar jit library PDIP <= lane_rtol relative" + ], + "recorded_not_gated": [ + "per lane: jit(vmap) arm vs scalar jit arm (rel_diff, abs_diff_nats)", + "per lane: jit(vmap) library PDIP vs scalar jit library PDIP", + "uncertified_lanes (certified_fallback=none rows)" + ], + "lanes_failed": 9, + "passed": false, + "policy_eligible": false, + "note": "Pre-registered before submission (module docstring; submit header). Phase 3 (results/notes/hst_gpu_residue_phase3_psf_2026_09.md) placed phase 2's ~2.5e-9 certified-vs-PDIP residual BETWEEN the jit(vmap) and scalar-jit compositions, not in the solver \u2014 so each arm is gated against the library-PDIP reference of its OWN composition, and the cross-composition difference is recorded with its nats. A certified_fallback=none row is policy-eligible only if every lane certifies AND passes the gate. Timing is never gated." + }, + "library_revisions": { + "PyAutoArray": { + "head": "3de624b5b91a4efa130dc3cb0a3a0f06f85025a3", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoArray", + "module_file": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/__init__.py" + }, + "PyAutoFit": { + "head": "dd9fbe0aab60c4a57702b1444ca031b317c91331", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoFit", + "module_file": "/mnt/ral/jnightin/PyAuto/PyAutoFit/autofit/__init__.py" + }, + "PyAutoGalaxy": { + "head": "70a61e26cd715cefe7012a38285698091246a8a4", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy", + "module_file": "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/__init__.py" + }, + "PyAutoLens": { + "head": "86054bbc19baa2f710a12e04a94fa27ab37cc354", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoLens", + "module_file": "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/__init__.py" + }, + "autoarray_file": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/__init__.py" + } + }, + "headline_arm_note": "`trace`, `hlo_census`, `command_buffers` and `trace_timing` above describe the scalar arm \u2014 the program phase 1 traced. Both arms' full blocks, the lane table and the matched comparison are under `vmap`." +} \ No newline at end of file diff --git a/results/breakdown/imaging/fixed_light_trace_rectangular_jitvmap16_captured_pix1_libcertified_fboff_b16_hpc_a100_fp64_fixed_light_trace.png b/results/breakdown/imaging/fixed_light_trace_rectangular_jitvmap16_captured_pix1_libcertified_fboff_b16_hpc_a100_fp64_fixed_light_trace.png new file mode 100644 index 0000000000000000000000000000000000000000..a8c7eb3123e9276e011092ec671ef09928d4b29a GIT binary patch literal 127665 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

    CNPXqbfJ^?Xhog+ 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 literal 0 HcmV?d00001 diff --git a/results/breakdown/imaging/fixed_light_trace_rectangular_jitvmap16_captured_pix1_libcertified_fbon_b16_hpc_a100_fp64_fixed_light_trace.json b/results/breakdown/imaging/fixed_light_trace_rectangular_jitvmap16_captured_pix1_libcertified_fbon_b16_hpc_a100_fp64_fixed_light_trace.json new file mode 100644 index 000000000..946b07a0c --- /dev/null +++ b/results/breakdown/imaging/fixed_light_trace_rectangular_jitvmap16_captured_pix1_libcertified_fbon_b16_hpc_a100_fp64_fixed_light_trace.json @@ -0,0 +1,5046 @@ +{ + "device": { + "backend": "gpu", + "device": "cuda:0", + "hostname": "euclid-ral-gpu-2", + "xla_flags": "--xla_disable_hlo_passes=constant_folding --xla_gpu_autotune_level=0 --xla_gpu_enable_triton_gemm=false", + "omp_num_threads": null, + "cpu_count": 124, + "jax_compilation_cache_dir": "/mnt/ral/jnightin/autolens_profiling_wt/certified-solver-phase-c1-lane-rate/output/jax_cache/fixed_light_lanerate_rectangular_pix1_time_16_certified_on_350768_21", + "autotune_cache_entries_at_start": 0, + "cache_fresh": true, + "nvidia_smi": "NVIDIA A100 80GB PCIe, 35455 MiB, 81920 MiB" + }, + "machine": { + "cpu_model": "AMD EPYC 7702 64-Core Processor", + "cpu_count_os": 124, + "nproc": 4, + "nproc_all": 124, + "nproc_note": "GNU nproc honours OMP_NUM_THREADS, so `nproc` can print 1 on a multi-core host; `nproc_all` is the core count.", + "ram_total": "928298204 kB", + "kernel": "5.14.0-687.50.1.el9_8.x86_64", + "platform": "Linux-5.14.0-687.50.1.el9_8.x86_64-x86_64-with-glibc2.34", + "python": "3.12.4", + "jax_thread_env": { + "NPROC": null + }, + "blas_thread_env": { + "OMP_NUM_THREADS": null, + "OPENBLAS_NUM_THREADS": null, + "MKL_NUM_THREADS": null, + "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" + }, + "precision": "fp64", + "configuration": { + "pixel_scale_arcsec": 0.05, + "mask_radius_arcsec": 3.5, + "image_pixels_masked": 15361, + "over_sampled_pixels": 62752, + "mesh": "rectangular", + "mesh_shape": [ + 39, + 39 + ], + "source_pixels": 1521, + "source_pixels_requested": null, + "dataset": "hst", + "dataset_sha256": { + "data.fits": "e4e833a28e9c6f6fb023cd85c0d3dde74068720256bc77a240633500e5b04fac", + "noise_map.fits": "315c6266a0acd3ac9c8da82fcd2b45a08697362481fd7a35072bab1658530ba3", + "psf.fits": "8389ba0e8bf4a09b4a561cfc246181a2fb944ed396754cd0ff76fdd22910d303" + }, + "cell_source_sha256": "06a162fcdae6b329384ec33322f443df07215d86e56f0505ac15b3d3473eb432", + "inversion_path": "dense", + "pass_budget": 11, + "pass_budget_basis": "phase 3 (autolens_profiling#255): the smallest ZERO-fallback budget per mesh, the budget a production run fixes. NOT phase 0's certifying budget (2 for Delaunay), which falls back on 67.5 % of a graded draw set and is not a production cost.", + "border_relocator_mode": "cell", + "border_relocator": true, + "border_relocator_note": "'cell' is use_border_relocator=True, which every profiling cell in this family forces; 'library' passes None and takes the shipped config default, which is what production runs. The resolved boolean is what this leg actually ran.", + "routes_selected": [ + "b", + "d" + ], + "trace_calls": 10, + "command_buffers_traced": "off", + "use_mixed_precision": false, + "tau_rel": 1e-09, + "regularization": { + "scheme": "constant", + "coefficient": 1.0 + }, + "thread_env": { + "n_threads": null, + "vars": [ + "OPENBLAS_NUM_THREADS", + "MKL_NUM_THREADS", + "OMP_NUM_THREADS", + "VECLIB_MAXIMUM_THREADS", + "NUMEXPR_NUM_THREADS" + ], + "set_to": null, + "preexisting": {}, + "overridden": {}, + "note": "Not pinned (legacy variant): recorded as found." + }, + "over_sample_size_lp_rule": { + "sub_size_list": [ + 4, + 2, + 2 + ], + "radial_list": [ + 0.3, + 0.6 + ], + "centre": [ + 0.0, + 0.0 + ] + }, + "vmap_batch": 16, + "lanes": "captured", + "arms": [ + "vmap", + "scalar" + ], + "fallback": "on", + "draw_seed": 0, + "vmap_composition": "jax.jit(jax.vmap(fn))", + "lane_rtol": 1e-09, + "vmap_flags_note": "Strict ProfileCLI.parse_cell_args rejects unknown flags. These keys record the exact batching program and prevent historical vmap(jit) artifacts from being mistaken for current jit(vmap) measurements.", + "solver_source": "library", + "solver": "certified", + "certified_fallback": "pdip", + "certified_pass_budget": 16, + "captured_pass": "time", + "batches": "/mnt/ral/jnightin/autolens_profiling_wt/certified-solver-phase-c1-lane-rate/results/breakdown/imaging/nautilus_batches_rectangular_pix1.npz" + }, + "solver_injection": { + "patched": null, + "part_v": "none \u2014 library mode selects the solver through al.Settings", + "part_b_route_d": { + "patched": "autoarray.inversion.inversion.inversion_util.reconstruction_positive_only_from", + "pass_budget": 11, + "fallback": true + }, + "note": "Library mode (phase B, #300): PART V's arms and references run the library's own positive-only solve, selected by Settings(positive_only_solver, certified_fallback, certified_pass_budget); nothing is injected. PART B's single-call route d (the fiducial d == b pin) still uses the phase-1 harness injection at the phase-3 budget and is not a phase-B row. The untimed certification report observes the library solve (library_solver_observed) without changing it." + }, + "routes": { + "b_s3_pdip": { + "label": "S3 PDIP (source-only)", + "status": "ok", + "solver": "library", + "ms": 38.95759799997904, + "log_likelihood": 28622.39485118912 + }, + "d_s3_certified_fallback": { + "label": "S3 certified active set, budget 11, PDIP fallback", + "status": "ok", + "solver": "harness-injected certified active set", + "pass_budget": 11, + "fallback": true, + "injected_solver_calls_jax": 1, + "injected_solver_calls_numpy": 0, + "ms": 30.214900400096667, + "log_likelihood": 28622.394851189252 + } + }, + "equivalence_pins": [ + { + "pin": "route d (certified, fallback) == route b (library PDIP)", + "route": "d_s3_certified_fallback", + "reference": "b_s3_pdip", + "expectation": "the certified active set returns the library's own positive solution", + "rtol": 1e-09, + "got": 28622.394851189252, + "reference_value": 28622.39485118912, + "rel_diff": 4.575691088611358e-15, + "status": "PASS" + } + ], + "equivalence_rtol": 1e-09, + "reference": { + "log_evidence_s0_library": 28622.394851199875, + "log_evidence_s3_library": 28622.39485119987, + "s3": { + "n_params": 1521, + "n_mapper": 1521, + "n_funcs": 0, + "edge_zeroed_pixels": 152, + "subtracted_light_flux": 5253.476646922047 + } + }, + "command_buffers": { + "wall_on_ms": 677.3452973000531, + "wall_off_ms": 682.2297303999221, + "command_buffer_delta_ms": 4.884433099869057, + "command_buffer_delta_pct": 0.7211141967529349, + "traced": "off", + "compiler_option": "xla_gpu_enable_command_buffer", + "probe": { + "note": "Not taken in --vmap-batch mode: the CUPTI-inside-a-CUDA-graph probe is a phase-1 diagnostic about the JOIN, and this mode already compiles and times both the command-buffers ON and OFF executable of every arm." + }, + "note": "ONE lowering, TWO compilations, one process. wall_on_ms is the PRODUCTION program (CUDA graphs as XLA ships them) and is the number comparable to phase 5's row; wall_off_ms is the graph-less program the stage rows attribute. The delta is the launch overhead the graphs remove \u2014 it lands in device_idle and host_outside_span, not in any stage. Reconciliation is computed against wall_off_ms." + }, + "trace": { + "parser": "ProfileData.from_file(xplane) + as_text() + stack_frame_index(proto field 17)", + "stage_audit": { + "mesh_construction": [ + { + "instruction": "fusion.2", + "ms": 0.1481451625000001, + "opcode": "fusion", + "shape": "(f64[15361,2]{1,0}, s64[15361,2]{1,0}, s32[15361,2]{1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:227", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:227 (create_transforms_rank)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:396 (_transforms_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:561 (adaptive_rectangular_mappings_weights_via_interpolation_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:693 (InterpolatorRectangular._mappings_sizes_weights)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "loop_select_fusion", + "ms": 0.039184324999999694, + "opcode": "fusion", + "shape": "(u32[2,15361]{1,0}, u32[2,15361]{1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:69", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:69 (forward_interp)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:573 (adaptive_rectangular_mappings_weights_via_interpolation_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:693 (InterpolatorRectangular._mappings_sizes_weights)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/abstract.py:36 (AbstractInterpolator.mappings)" + ] + }, + { + "instruction": "loop_select_fusion.6", + "ms": 0.034532712499999764, + "opcode": "fusion", + "shape": "(u32[15361]{0}, u32[15361]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:245", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:245 (create_transforms_rank)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:396 (_transforms_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:561 (adaptive_rectangular_mappings_weights_via_interpolation_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:693 (InterpolatorRectangular._mappings_sizes_weights)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "loop_select_fusion.1", + "ms": 0.03433358750000023, + "opcode": "fusion", + "shape": "(u32[15361]{0}, u32[15361]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:245", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:245 (create_transforms_rank)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:396 (_transforms_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:561 (adaptive_rectangular_mappings_weights_via_interpolation_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:693 (InterpolatorRectangular._mappings_sizes_weights)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "loop_add_fusion.7", + "ms": 0.02104513124999953, + "opcode": "fusion", + "shape": "s64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:245", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:245 (create_transforms_rank)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:396 (_transforms_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:561 (adaptive_rectangular_mappings_weights_via_interpolation_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:693 (InterpolatorRectangular._mappings_sizes_weights)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "loop_add_fusion", + "ms": 0.020980193749999553, + "opcode": "fusion", + "shape": "s64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:69", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:69 (forward_interp)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:573 (adaptive_rectangular_mappings_weights_via_interpolation_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:693 (InterpolatorRectangular._mappings_sizes_weights)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/abstract.py:36 (AbstractInterpolator.mappings)" + ] + } + ], + "mixed_fusion": [ + { + "instruction": "loop_divide_gather_fusion", + "ms": 0.6957160187499998, + "opcode": "fusion", + "shape": "(f64[15361,1,1,1521]{3,2,1,0}, f64[15361,1,1,1521]{3,2,1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:133", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:133 (curvature_matrix_via_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:93 (InversionImagingMapping.curvature_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:389 (AbstractInversion.curvature_reg_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "loop_broadcast_fusion.3", + "ms": 0.23337609374999993, + "opcode": "fusion", + "shape": "f64[1521,180,180]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "input_multiply_transpose_fusion", + "ms": 0.18472471875000007, + "opcode": "fusion", + "shape": "(f64[1369,1369]{1,0}, f64[1369,1369]{1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:237 (active_set_search)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:293 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:274 (_certified_positive_only_from)" + ] + }, + { + "instruction": "loop_broadcast_fusion", + "ms": 0.13639111875, + "opcode": "fusion", + "shape": "f64[15361,1521]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:342", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:342 (mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/abstract.py:283 (Mapper.mapping_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:91 (AbstractInversionImaging._mapping_matrix_for_convolution_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:137 (AbstractInversionImaging.operated_mapping_matrix_list)" + ] + }, + { + "instruction": "input_reduce_fusion.11", + "ms": 0.11359529375, + "opcode": "fusion", + "shape": "f64[92,1521]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/inversion_imaging_util.py:123", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/inversion_imaging_util.py:123 (data_vector_via_blurred_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:67 (InversionImagingMapping.data_vector)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:699 (AbstractInversion.reconstruction)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "input_reduce_fusion.14", + "ms": 0.11179722500000007, + "opcode": "fusion", + "shape": "f64[15361]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:163", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:163 (mapped_reconstructed_data_via_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:120 (InversionImagingMapping._mapped_reconstructed_data_dict_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:196 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + } + ], + "border_relocator": [ + { + "instruction": "eigh.0", + "ms": 0.0740736062499999, + "opcode": "custom-call", + "shape": "(f64[2,2]{0,1}, f64[2]{0}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:245", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:245 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:415 (BorderRelocator.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:83 (AbstractMesh.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/rectangular_rtu_adapt_density.py:267 (RectangularRTUAdaptDensity.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "custom-call.2", + "ms": 0.007912006250000006, + "opcode": "custom-call", + "shape": "(f64[2,2]{1,0}, s8[4194304]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:242", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:242 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:415 (BorderRelocator.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:83 (AbstractMesh.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/rectangular_rtu_adapt_density.py:267 (RectangularRTUAdaptDensity.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "input_reduce_fusion.15", + "ms": 0.005312068749999999, + "opcode": "fusion", + "shape": "(f64[], f64[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:270", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:270 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:415 (BorderRelocator.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:83 (AbstractMesh.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/rectangular_rtu_adapt_density.py:267 (RectangularRTUAdaptDensity.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "loop_add_fusion.9", + "ms": 0.0036249499999999996, + "opcode": "fusion", + "shape": "f64[15361]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:308", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:308 (relocated_grid_via_ellipse_border_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:423 (BorderRelocator.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:83 (AbstractMesh.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/rectangular_rtu_adapt_density.py:267 (RectangularRTUAdaptDensity.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "input_concatenate_fusion.4", + "ms": 0.0023793437500000017, + "opcode": "fusion", + "shape": "f64[392,2]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:238", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:238 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:415 (BorderRelocator.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:83 (AbstractMesh.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/rectangular_rtu_adapt_density.py:267 (RectangularRTUAdaptDensity.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "input_reduce_fusion.22", + "ms": 0.001590556250000001, + "opcode": "fusion", + "shape": "f64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:256", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:256 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:415 (BorderRelocator.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:83 (AbstractMesh.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/rectangular_rtu_adapt_density.py:267 (RectangularRTUAdaptDensity.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + } + ], + "other": [ + { + "instruction": "copy.63", + "ms": 0.03012568125000019, + "opcode": "copy", + "shape": "u32[2,15361]{1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "copy.64", + "ms": 0.02982254375000077, + "opcode": "copy", + "shape": "u32[2,15361]{1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "copy.81", + "ms": 0.02858591250000069, + "opcode": "copy", + "shape": "u32[15361]{0}", + "source": "", + "stack": [] + }, + { + "instruction": "copy.73", + "ms": 0.028505462500000876, + "opcode": "copy", + "shape": "u32[15361]{0}", + "source": "", + "stack": [] + }, + { + "instruction": "copy.82", + "ms": 0.0283477500000011, + "opcode": "copy", + "shape": "u32[15361]{0}", + "source": "", + "stack": [] + }, + { + "instruction": "copy.72", + "ms": 0.028247775000001137, + "opcode": "copy", + "shape": "u32[15361]{0}", + "source": "", + "stack": [] + } + ], + "pdip_solve": [ + { + "instruction": "cholesky.40", + "ms": 8.834679812500003, + "opcode": "custom-call", + "shape": "(f64[1369,1369]{0,1}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:252 (active_set_search..body_fun)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:262 (active_set_search)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:293 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)" + ] + }, + { + "instruction": "cholesky.60", + "ms": 6.379414124999969, + "opcode": "custom-call", + "shape": "(f64[1369,1369]{0,1}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:106", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:106 (factorize_kkt)", + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:212 (pdip_pc_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:83 (solve_nnls)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:129 (_solve_nnls_primal_with..primal)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:164 (solve_nnls_primal_with_status)" + ] + }, + { + "instruction": "triangular-solve.7", + "ms": 1.5466199374999623, + "opcode": "custom-call", + "shape": "(f64[1369,1]{0,1}, s8[0]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:154", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:154 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:252 (active_set_search..body_fun)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:262 (active_set_search)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:293 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)" + ] + }, + { + "instruction": "triangular-solve.6", + "ms": 1.3093116687500153, + "opcode": "custom-call", + "shape": "(f64[1369,1]{0,1}, s8[0]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:154", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:154 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:252 (active_set_search..body_fun)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:262 (active_set_search)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:293 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)" + ] + }, + { + "instruction": "triangular-solve", + "ms": 0.9732707624999928, + "opcode": "custom-call", + "shape": "(f64[1369,1]{0,1}, s8[0]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146 (solve_kkt_rhs)", + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:213 (pdip_pc_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:83 (solve_nnls)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:129 (_solve_nnls_primal_with..primal)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:164 (solve_nnls_primal_with_status)" + ] + }, + { + "instruction": "triangular-solve.2", + "ms": 0.9302861625000245, + "opcode": "custom-call", + "shape": "(f64[1369,1]{0,1}, s8[0]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146 (solve_kkt_rhs)", + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:217 (pdip_pc_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:83 (solve_nnls)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:129 (_solve_nnls_primal_with..primal)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:164 (solve_nnls_primal_with_status)" + ] + } + ], + "mapping_matrix": [ + { + "instruction": "input_reduce_fusion.28", + "ms": 0.0028161437500000006, + "opcode": "fusion", + "shape": "f64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:93", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:93 (adaptive_pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/abstract.py:507 (Mapper.pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt.py:339 (Adapt.regularization_weights_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt.py:362 (Adapt.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)" + ] + } + ], + "regularization_H": [ + { + "instruction": "input_scatter_fusion.8", + "ms": 0.0027709187500000016, + "opcode": "fusion", + "shape": "f64[1521,1521]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt.py:123", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt.py:123 (weighted_regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt.py:366 (Adapt.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:332 (AbstractInversion.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "psf_convolution_mapping_matrix": [ + { + "instruction": "fft.19.0", + "ms": 1.7800044812499995, + "opcode": "fft", + "shape": "f64[1521,180,180]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "input_scatter_fusion", + "ms": 1.4214474374999992, + "opcode": "fusion", + "shape": "f64[1521,180,180]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "fft.15.0", + "ms": 1.3830779874999992, + "opcode": "fft", + "shape": "c128[1521,180,91]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "fft.17.0", + "ms": 0.9921816250000004, + "opcode": "fft", + "shape": "c128[1521,91,180]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "input_transpose_fusion.4", + "ms": 0.5221223125, + "opcode": "fusion", + "shape": "c128[1521,91,180]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "wrapped_transpose.2", + "ms": 0.50774696875, + "opcode": "fusion", + "shape": "c128[1521,180,91]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + } + ], + "curvature_matrix_F": [ + { + "instruction": "cublas-lt-matmul.2", + "ms": 4.366860325000003, + "opcode": "custom-call", + "shape": "(f64[1521,1521]{1,0}, s8[4194304]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:134", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:134 (curvature_matrix_via_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:93 (InversionImagingMapping.curvature_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:389 (AbstractInversion.curvature_reg_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "inversion_other": [ + { + "instruction": "cholesky.120", + "ms": 0.9176413500000014, + "opcode": "custom-call", + "shape": "(f64[1521,1521]{0,1}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986 (AbstractInversion._log_det_symmetric_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:1078 (AbstractInversion.log_det_curvature_reg_matrix_term)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:347 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/model/analysis.py:135 (AnalysisImaging.log_likelihood_function)" + ] + }, + { + "instruction": "cholesky.130", + "ms": 0.9006329875000011, + "opcode": "custom-call", + "shape": "(f64[1521,1521]{0,1}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986 (AbstractInversion._log_det_symmetric_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:1157 (AbstractInversion.log_det_regularization_matrix_term)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:348 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/model/analysis.py:135 (AnalysisImaging.log_likelihood_function)" + ] + }, + { + "instruction": "loop_reduce_window_fusion.3", + "ms": 0.00579086249999999, + "opcode": "fusion", + "shape": "s64[6,16]{1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "loop_reduce_window_fusion.2", + "ms": 0.003018343749999991, + "opcode": "fusion", + "shape": "s64[86,16]{1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "input_scatter_fusion.9", + "ms": 0.0025459437499999954, + "opcode": "fusion", + "shape": "s64[1369]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:527", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:527 (AbstractInversion.zeroed_ids_to_keep)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:567 (AbstractInversion.solve_ids_to_keep)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:684 (AbstractInversion.reconstruction)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "loop_broadcast_fusion.4", + "ms": 0.0019107624999999977, + "opcode": "fusion", + "shape": "(s64[1369]{0}, s64[1369]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:527", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:527 (AbstractInversion.zeroed_ids_to_keep)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:567 (AbstractInversion.solve_ids_to_keep)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:684 (AbstractInversion.reconstruction)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "chi_squared_evidence": [ + { + "instruction": "loop_multiply_fusion.2", + "ms": 0.0029798937499999974, + "opcode": "fusion", + "shape": "f64[15361]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/abstract_ndarray.py:300", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/abstract_ndarray.py:300 (AbstractNDArray.__pow__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/abstract_ndarray.py:60 (unwrap_array..wrapper)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/abstract_ndarray.py:35 (to_new_array..wrapper)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_util.py:78 (chi_squared_map_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:78 (AbstractFit.chi_squared_map)" + ] + } + ] + }, + "stage_audit_note": "The HLO instructions that contributed most of each stage's milliseconds, with their full source stack. A stage row is only as good as the rules that built it; this is how a reader checks a row against the HLO instead of trusting it.", + "untraced_wall_ms": 42.650429012496716, + "reconciliation_vs_untraced_pct": -21.452712330433613, + "wall_basis": "wall_ms is the TRACED run's wall, the run these kernel durations came from. untraced_wall_ms is the same executable without the profiler; the difference is the profiler's overhead and belongs in neither the stages nor the idle row.", + "calls": 160, + "call_split": "per-call (first-instruction recurrence)", + "call_blocks": 160, + "events": 134500, + "streams": [ + "Stream #14(MemcpyH2D,Compute,MemcpyD2H,Memset,MemcpyD2D)" + ], + "per_stage_ms": { + "border_relocator": { + "median_ms": 0.09642900000000004, + "min_ms": 0.09564500000000001, + "max_ms": 0.09740000000000001 + }, + "chi_squared_evidence": { + "median_ms": 0.002975, + "min_ms": 0.002847, + "max_ms": 0.003328 + }, + "curvature_matrix_F": { + "median_ms": 4.3388975, + "min_ms": 4.308712, + "max_ms": 4.521694 + }, + "inversion_other": { + "median_ms": 1.8344719999999999, + "min_ms": 1.822318, + "max_ms": 1.854093 + }, + "mapping_matrix": { + "median_ms": 0.002816, + "min_ms": 0.002783, + "max_ms": 0.002848 + }, + "memset": { + "median_ms": 0.03918350000000001, + "min_ms": 0.014751999999999998, + "max_ms": 0.10527399999999994 + }, + "mesh_construction": { + "median_ms": 0.34237549999999983, + "min_ms": 0.3399209999999998, + "max_ms": 0.3439689999999998 + }, + "mixed_fusion": { + "median_ms": 1.8487105000000001, + "min_ms": 1.8430510000000002, + "max_ms": 1.8544769999999997 + }, + "other": { + "median_ms": 0.18028849999999969, + "min_ms": 0.17941699999999977, + "max_ms": 0.18363699999999977 + }, + "pdip_solve": { + "median_ms": 16.03756299999999, + "min_ms": 4.649876999999999, + "max_ms": 48.07878999999992 + }, + "psf_convolution_mapping_matrix": { + "median_ms": 6.606725500000001, + "min_ms": 6.584301, + "max_ms": 6.6237569999999995 + }, + "regularization_H": { + "median_ms": 0.002752, + "min_ms": 0.002432, + "max_ms": 0.003232 + } + }, + "stage_order": [ + "border_relocator", + "mesh_construction", + "mapping_matrix", + "psf_convolution_mapping_matrix", + "curvature_matrix_F", + "regularization_H", + "pdip_solve", + "chi_squared_evidence", + "inversion_other", + "mixed_fusion", + "other", + "memset" + ], + "mixed_fusion": { + "ms": 1.8487105000000001, + "constituent_stage_sets": { + "curvature_matrix_F + psf_convolution_mapping_matrix": 0.6957160187499998, + "pdip_solve + psf_convolution_mapping_matrix": 0.23337609374999993, + "inversion_other + mapped_reconstruction + pdip_solve + reconstruction_scatter": 0.18472471875000007, + "mapping_matrix + pdip_solve": 0.1387286625000001, + "data_vector_D + pdip_solve": 0.11731176875000013, + "mapped_reconstruction + pdip_solve": 0.11179722500000007, + "border_relocator + pdip_solve": 0.07092946875000007, + "mesh_construction + pdip_solve": 0.038702762500000105, + "inversion_other + regularization_H": 0.031007618749999986, + "inversion_other + pdip_solve": 0.030165462499999924, + "border_relocator + mesh_construction + pdip_solve": 0.027064900000000017, + "curvature_reg_reduce_gather + inversion_other": 0.025772318750000012, + "border_relocator + inversion_other + mapping_matrix + mesh_construction + pdip_solve": 0.020572025000000015, + "pdip_solve + regularization_H": 0.019315131249999996, + "inversion_other + mapping_matrix + pdip_solve + regularization_H": 0.015423406249999983, + "inversion_other + mapping_matrix + mesh_construction": 0.012941031250000002, + "pdip_solve + ray_trace_data_grid": 0.012810718750000059, + "grids_and_structures + mass_profile_deflections + pdip_solve": 0.009774931249999995, + "inversion_other + mapped_reconstruction + reconstruction_scatter": 0.009560143749999995, + "inversion_other + mapped_reconstruction": 0.008867768750000001, + "chi_squared_evidence + pdip_solve": 0.007603593749999994, + "inversion_other + mesh_construction + pdip_solve": 0.005450837499999997, + "grids_and_structures + mass_profile_deflections + ray_trace_data_grid": 0.005214674999999999, + "inversion_other + pdip_solve + ray_trace_data_grid": 0.004812693749999996, + "border_relocator + mesh_construction": 0.00342489375, + "border_relocator + inversion_other": 0.0033499062500000018, + "border_relocator + inversion_other + mesh_construction + pdip_solve": 0.0024591437500000035, + "chi_squared_evidence + inversion_other": 0.0017915624999999993 + }, + "example_kernels": { + "curvature_matrix_F + psf_convolution_mapping_matrix": [ + "loop_divide_gather_fusion" + ], + "pdip_solve + psf_convolution_mapping_matrix": [ + "loop_broadcast_fusion.3" + ], + "inversion_other + mapped_reconstruction + pdip_solve + reconstruction_scatter": [ + "input_multiply_transpose_fusion" + ], + "mapping_matrix + pdip_solve": [ + "loop_divide_fusion.1", + "loop_broadcast_fusion" + ], + "data_vector_D + pdip_solve": [ + "input_reduce_fusion.11", + "input_reduce_fusion.26" + ], + "mapped_reconstruction + pdip_solve": [ + "input_reduce_fusion.14" + ], + "border_relocator + pdip_solve": [ + "input_reduce_fusion.16", + "loop_select_sine_fusion", + "input_concatenate_fusion.1", + "input_transpose_fusion.8" + ], + "mesh_construction + pdip_solve": [ + "loop_multiply_fusion.4", + "loop_pad_fusion", + "loop_reduce_fusion", + "triton_softmax.1" + ], + "inversion_other + regularization_H": [ + "input_transpose_fusion.6" + ], + "inversion_other + pdip_solve": [ + "input_scatter_fusion.11", + "input_reduce_fusion.17", + "input_reduce_fusion.24", + "input_reduce_fusion.12" + ] + }, + "prorated_estimate_ms": { + "psf_convolution_mapping_matrix": 0.46454605624999984, + "pdip_solve": 0.4608377867708336, + "curvature_matrix_F": 0.3478580093749999, + "inversion_other": 0.11616510968749999, + "mapped_reconstruction": 0.10970039114583338, + "mapping_matrix": 0.08164826489583339, + "data_vector_D": 0.058655884375000064, + "border_relocator": 0.052602958645833385, + "reconstruction_scatter": 0.04936789427083335, + "mesh_construction": 0.04094527531250006, + "regularization_H": 0.029017226562499988, + "curvature_reg_reduce_gather": 0.012886159375000006, + "ray_trace_data_grid": 0.009747815625000027, + "grids_and_structures": 0.004996535416666665, + "mass_profile_deflections": 0.004996535416666665, + "chi_squared_evidence": 0.0046975781249999965 + }, + "prorated_note": "ESTIMATE ONLY \u2014 a mixed fusion's time split equally across the stages its constituents span. Never summed into the measured table, never reconciled." + }, + "other_sources_ms": { + "copy.63": 0.03012568125000019, + "copy.64": 0.02982254375000077, + "copy.81": 0.02858591250000069, + "copy.73": 0.028505462500000876, + "copy.82": 0.0283477500000011, + "copy.72": 0.028247775000001137, + "copy.122": 0.0016843500000000007, + "copy.121": 0.0016307500000000003, + "copy.74": 0.0015381624999999983, + "copy.56": 0.0015323374999999973, + "copy.120": 0.0007351687500000007, + "copy.43": 0.0006679875000000006 + }, + "device_span_ms": 43.704272200000005, + "device_busy_ms": 41.53670503125, + "device_idle_ms": 2.167567168750004, + "largest_idle_gaps": [ + { + "gap_ms": 0.041981, + "after": "while.33", + "before": "input_scatter_fusion.1" + }, + { + "gap_ms": 0.041726, + "after": "input_concatenate_fusion.4", + "before": "custom-call.2" + }, + { + "gap_ms": 0.032478, + "after": "loop_multiply_fusion.3", + "before": "eigh.0" + }, + { + "gap_ms": 0.029471, + "after": "fusion.2", + "before": "fusion.2" + }, + { + "gap_ms": 0.027423, + "after": "while.33", + "before": "input_reduce_fusion" + }, + { + "gap_ms": 0.026655, + "after": "loop_add_fusion.7", + "before": "loop_select_fusion.6" + }, + { + "gap_ms": 0.02595, + "after": "copy.72", + "before": "copy.73" + }, + { + "gap_ms": 0.024255, + "after": "while.40", + "before": "input_transpose_fusion.2" + } + ], + "kernel_ms": 31.333187999999993, + "sum_ms": 33.50075516875, + "wall_ms": 43.70916029374712, + "host_outside_span_ms": 0.004888093747112521, + "reconciliation_pct": -23.355299109824127, + "unjoined_ms": 0.0, + "unjoined_pct": 0.0, + "other_ms": 0.18028849999999969, + "other_pct": 0.41247303491618703, + "note": "Stage rows attribute the command-buffers-OFF program (see the module docstring): kernel times are the same, the launch overhead the CUDA graphs remove is not. sum_ms = kernel rows + device_idle_ms; the residual against wall_ms is host_outside_span_ms (dispatch before the first kernel, teardown after the last).", + "per_stage_ms_per_lane": { + "border_relocator": 0.09642900000000004, + "chi_squared_evidence": 0.002975, + "curvature_matrix_F": 4.3388975, + "inversion_other": 1.8344719999999999, + "mapping_matrix": 0.002816, + "memset": 0.03918350000000001, + "mesh_construction": 0.34237549999999983, + "mixed_fusion": 1.8487105000000001, + "other": 0.18028849999999969, + "pdip_solve": 16.03756299999999, + "psf_convolution_mapping_matrix": 6.606725500000001, + "regularization_H": 0.002752 + }, + "per_lane_divisor": 1, + "host_callback": { + "pure_callback_span_ms": 0, + "qhull_ms": 0.0, + "callback_body_ms_note": "the OUTERMOST matching body event, not a sum: under the probe the body appears twice (the wrapper and the timed re-implementation it calls) and summing them would count the same work twice", + "events_by_name": { + "ThenExecuteCallback:GetEventForComputeStreamSyncPoint": { + "count": 160, + "ms": 0.3133482000000001 + } + }, + "note": "HOST milliseconds per traced BATCH (the whole invocation), aggregated by name because the events nest. Not a row of the device table: the device pays for them as the idle gaps largest_idle_gaps names." + }, + "host_callback_ms": 0 + }, + "hlo_census": { + "status": "excluded", + "reason": "The legacy census anchors PyAutoArray source line numbers that moved after the phase-1 run. No batched attribution is published from unsupported anchors; the device-event table and wall reconciliation remain valid." + }, + "stage_map_provenance": [ + { + "label": "log_det_curvature_reg", + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 850, + 882 + ], + "requires": { + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 884, + 896 + ] + }, + "function": null + }, + { + "label": "log_det_regularization", + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 850, + 882 + ], + "requires": { + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 897, + 943 + ] + }, + "function": null + }, + { + "label": "curvature_reg_add", + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 359, + 372 + ], + "requires": null, + "function": null + }, + { + "label": "curvature_reg_reduce_gather", + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 374, + 398 + ], + "requires": null, + "function": null + }, + { + "label": "edge_subset_gather", + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 606, + 614 + ], + "requires": null, + "function": null + }, + { + "label": "regularization_term", + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 786, + 849 + ], + "requires": null, + "function": null + }, + { + "label": "mapped_reconstruction", + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 722, + 785 + ], + "requires": null, + "function": null + }, + { + "label": "reconstruction_scatter", + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 583, + 605 + ], + "requires": null, + "function": null + }, + { + "label": "reconstruction_scatter", + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 615, + 721 + ], + "requires": null, + "function": null + }, + { + "label": "certified_active_set_solve", + "path": "likelihood_breakdown/active_set_steps.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "certified_active_set_solve", + "path": "likelihood_breakdown/library_solver_injection.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "pdip_solve", + "path": "PyAutoArray/autoarray/util/jax_nnls.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "pdip_solve", + "path": "PyAutoArray/autoarray/inversion/inversion/inversion_util.py", + "lines": [ + 256, + 488 + ], + "requires": null, + "function": null + }, + { + "label": "mapped_reconstruction", + "path": "PyAutoArray/autoarray/inversion/inversion/inversion_util.py", + "lines": [ + 156, + 200 + ], + "requires": null, + "function": null + }, + { + "label": "curvature_matrix_F", + "path": "PyAutoArray/autoarray/inversion/inversion/inversion_util.py", + "lines": [ + 12, + 155 + ], + "requires": null, + "function": null + }, + { + "label": "reconstruction_scatter", + "path": "PyAutoArray/autoarray/inversion/inversion/inversion_util.py", + "lines": [ + 201, + 255 + ], + "requires": null, + "function": null + }, + { + "label": "data_vector_D", + "path": "PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py", + "lines": [ + 54, + 73 + ], + "requires": null, + "function": null + }, + { + "label": "curvature_matrix_F", + "path": "PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py", + "lines": [ + 74, + 110 + ], + "requires": null, + "function": null + }, + { + "label": "data_vector_D", + "path": "PyAutoArray/autoarray/inversion/inversion/imaging/inversion_imaging_util.py", + "lines": null, + "requires": null, + "function": "data_vector_via_blurred_mapping_matrix_from" + }, + { + "label": "curvature_matrix_F", + "path": "PyAutoArray/autoarray/inversion/inversion/imaging/inversion_imaging_util.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "psf_convolution_mapping_matrix", + "path": "likelihood_breakdown/psf_cube_injection.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "psf_convolution_mapping_matrix", + "path": "PyAutoArray/autoarray/operators/convolver.py", + "lines": [ + 1086, + 1300 + ], + "requires": null, + "function": null + }, + { + "label": "psf_convolution_mapping_matrix", + "path": "PyAutoArray/autoarray/operators/convolver.py", + "lines": [ + 632, + 642 + ], + "requires": null, + "function": null + }, + { + "label": "psf_convolution_mapping_matrix", + "path": "PyAutoArray/autoarray/operators/convolver.py", + "lines": [ + 670, + 691 + ], + "requires": null, + "function": null + }, + { + "label": "psf_convolution_mapping_matrix", + "path": "PyAutoArray/autoarray/operators/convolver.py", + "lines": null, + "requires": { + "path": "PyAutoArray/autoarray/operators/convolver.py", + "lines": [ + 1086, + 1300 + ] + }, + "function": null + }, + { + "label": "psf_convolution_mapping_matrix", + "path": "PyAutoArray/autoarray/operators/convolver.py", + "lines": null, + "requires": { + "path": "PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py", + "lines": [ + 119, + 150 + ] + }, + "function": null + }, + { + "label": "psf_convolution_image", + "path": "PyAutoArray/autoarray/operators/convolver.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "psf_convolution_mapping_matrix", + "path": "PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py", + "lines": [ + 119, + 150 + ], + "requires": null, + "function": null + }, + { + "label": "mesh_qhull_callback", + "path": "PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py", + "lines": [ + 139, + 172 + ], + "requires": null, + "function": null + }, + { + "label": "mesh_seed_argmin", + "path": "PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py", + "lines": [ + 173, + 207 + ], + "requires": null, + "function": null + }, + { + "label": "mesh_locate_walk", + "path": "PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py", + "lines": [ + 208, + 372 + ], + "requires": null, + "function": null + }, + { + "label": "mesh_dual_areas", + "path": "PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py", + "lines": [ + 373, + 396 + ], + "requires": null, + "function": null + }, + { + "label": "mesh_dual_areas", + "path": "PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py", + "lines": [ + 437, + 494 + ], + "requires": null, + "function": null + }, + { + "label": "mesh_dual_areas", + "path": "PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py", + "lines": [ + 605, + 615 + ], + "requires": null, + "function": null + }, + { + "label": "mesh_interpolation_weights", + "path": "PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py", + "lines": [ + 616, + 695 + ], + "requires": null, + "function": null + }, + { + "label": "mesh_interpolation_weights", + "path": "PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py", + "lines": [ + 896, + 1000 + ], + "requires": null, + "function": null + }, + { + "label": "mesh_construction", + "path": "PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "border_relocator", + "path": "PyAutoArray/autoarray/inversion/mesh/border_relocator.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "mesh_construction", + "path": "PyAutoArray/autoarray/inversion/mesh/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "mapping_matrix", + "path": "PyAutoArray/autoarray/inversion/mappers/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "mapping_matrix", + "path": "PyAutoArray/autoarray/inversion/mappings/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "mapping_matrix", + "path": "PyAutoArray/autoarray/inversion/linear_obj/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "regularization_H", + "path": "PyAutoArray/autoarray/inversion/regularization/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "chi_squared_evidence", + "path": "PyAutoArray/autoarray/fit/fit_util.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "chi_squared_evidence", + "path": "PyAutoArray/autoarray/fit/fit_dataset.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "ray_trace_mesh_grid", + "path": "PyAutoLens/autolens/lens/to_inversion.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "ray_trace_mesh_grid", + "path": "PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "mass_profile_deflections", + "path": "PyAutoGalaxy/autogalaxy/profiles/mass/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "light_profile_image", + "path": "PyAutoGalaxy/autogalaxy/profiles/light/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "light_profile_image", + "path": "PyAutoGalaxy/autogalaxy/operate/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "ray_trace_data_grid", + "path": "PyAutoLens/autolens/lens/tracer.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "ray_trace_data_grid", + "path": "PyAutoLens/autolens/lens/tracer_util.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "grids_and_structures", + "path": "PyAutoArray/autoarray/structures/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "grids_and_structures", + "path": "PyAutoArray/autoarray/operators/over_sampling/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "grids_and_structures", + "path": "PyAutoArray/autoarray/geometry/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "inversion_other", + "path": "PyAutoArray/autoarray/inversion/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "fit_imaging_other", + "path": "PyAutoLens/autolens/imaging/fit_imaging.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "fit_imaging_other", + "path": "PyAutoGalaxy/autogalaxy/imaging/fit_imaging.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "fit_imaging_other", + "path": "PyAutoArray/autoarray/fit/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "analysis_other", + "path": "PyAutoLens/autolens/analysis/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "analysis_other", + "path": "PyAutoGalaxy/autogalaxy/analysis/", + "lines": null, + "requires": null, + "function": null + } + ], + "trace_timing": { + "traced_wall_ms": 43.70916029374712, + "untraced_wall_ms": 42.650429012496716, + "profiler_overhead_ms": 1.0587312812504024, + "profiler_overhead_pct": 2.482346146952451 + }, + "jit_phases": { + "b_s3_pdip_library_likelihood_jit": { + "lower_s": 1.281587307999871, + "compile_s": 3.514000808001583, + "first_call_s": 0.1016554689995246, + "steady_per_call_s": 0.03895759799997904 + }, + "d_s3_certified_fallback_library_likelihood_jit": { + "lower_s": 0.47250380200057407, + "compile_s": 3.657232142999419, + "first_call_s": 0.03978114699930302, + "steady_per_call_s": 0.030214900400096667 + } + }, + "peak_bytes": { + "after_setup": 85616640, + "after_routes": 1197479168, + "after_all": 19155306752, + "note": "jax.devices()[0].memory_stats()['peak_bytes_in_use']; None on a backend that does not report it (CPU). Process-wide high-water marks." + }, + "note": "Every stage row is a MEASURED sum of GPU kernel durations joined to library source through the optimized HLO of ONE program \u2014 not arithmetic across compilations. The rows attribute the command-buffers-OFF program: kernel time is the same as production, the launch overhead the CUDA graphs remove is not, and command_buffers.* carries both walls and their delta. sum_ms = kernel rows + measured device_idle_ms; the residual against the wall is host_outside_span_ms and is reported, not absorbed. mixed_fusion.prorated_estimate_ms is an ESTIMATE and is never part of the table. No row may be quoted if reconciliation_pct is outside 5 % or unjoined_ms is non-zero.", + "vmap": { + "batch": 16, + "lanes_mode": "captured", + "arms": [ + "vmap", + "scalar" + ], + "draw_seed": 0, + "fallback": true, + "composition": "jax.jit(jax.vmap(fn))", + "composition_provenance": "Current Fitness._vmap after PyAutoFit#1638. Array 343376 used the retired jax.vmap(jax.jit(fn)) composition and is historical evidence only.", + "headline_arm": "scalar", + "lane_rtol": 1e-09, + "lanes": [ + { + "lane": 0, + "draw_name": "call00015_lane00", + "draw_kind": "captured", + "offsets": { + "centre_0": 0.0017002711605432041, + "centre_1": -0.009377257327484623, + "ell_comps_0": -0.002548851608736212, + "ell_comps_1": -0.004262475027349674, + "einstein_radius": -0.0230617600435421 + }, + "log_likelihood_vmap": 18463.07897110663, + "log_likelihood_scalar": 18463.078970707007, + "log_likelihood_library_pdip": 18463.07897110663, + "log_likelihood_library_pdip_scalar": 18463.078970707007, + "rel_diff_vmap_vs_library_pdip": 0.0, + "rel_diff_scalar_vs_library_pdip_scalar": 0.0, + "abs_diff_nats": 3.996246960014105e-07, + "rel_diff": 2.1644531588444352e-11, + "rel_diff_scalar_vs_library_pdip": 2.1644531587975868e-11, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 3.996246960014105e-07, + "rel_diff_library_pdip_vmap_vs_scalar": 2.1644531588444352e-11, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": false, + "passes": 16, + "pdip_iter": null + }, + { + "lane": 1, + "draw_name": "call00015_lane01", + "draw_kind": "captured", + "offsets": { + "centre_0": 0.00044835385344320865, + "centre_1": -0.003464237160596487, + "ell_comps_0": -0.0010036884316776545, + "ell_comps_1": 0.0020035511501456356, + "einstein_radius": -0.05761540720338343 + }, + "log_likelihood_vmap": 15734.21749647698, + "log_likelihood_scalar": 15734.21749633948, + "log_likelihood_library_pdip": 15734.21749647698, + "log_likelihood_library_pdip_scalar": 15734.21749633948, + "rel_diff_vmap_vs_library_pdip": 0.0, + "rel_diff_scalar_vs_library_pdip_scalar": 0.0, + "abs_diff_nats": 1.3750104699283838e-07, + "rel_diff": 8.738982222968992e-12, + "rel_diff_scalar_vs_library_pdip": 8.738982222892622e-12, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 1.3750104699283838e-07, + "rel_diff_library_pdip_vmap_vs_scalar": 8.738982222968992e-12, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": false, + "passes": 16, + "pdip_iter": null + }, + { + "lane": 2, + "draw_name": "call00015_lane02", + "draw_kind": "captured", + "offsets": { + "centre_0": 0.0017572218110215735, + "centre_1": 0.0022774942133795186, + "ell_comps_0": 0.0023932647815035485, + "ell_comps_1": -0.011727950927316913, + "einstein_radius": -0.027234805142873908 + }, + "log_likelihood_vmap": 18706.165986625834, + "log_likelihood_scalar": 18706.16598652238, + "log_likelihood_library_pdip": 18706.165986625834, + "log_likelihood_library_pdip_scalar": 18706.16598652238, + "rel_diff_vmap_vs_library_pdip": 0.0, + "rel_diff_scalar_vs_library_pdip_scalar": 0.0, + "abs_diff_nats": 1.0345320333726704e-07, + "rel_diff": 5.530433302676995e-12, + "rel_diff_scalar_vs_library_pdip": 5.530433302646409e-12, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 1.0345320333726704e-07, + "rel_diff_library_pdip_vmap_vs_scalar": 5.530433302676995e-12, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": false, + "passes": 16, + "pdip_iter": null + }, + { + "lane": 3, + "draw_name": "call00015_lane03", + "draw_kind": "captured", + "offsets": { + "centre_0": -0.002862791114730316, + "centre_1": 0.0038524808804676603, + "ell_comps_0": 0.006111415425061918, + "ell_comps_1": -0.022191169695991525, + "einstein_radius": -0.03531000166767062 + }, + "log_likelihood_vmap": -22166.22174361447, + "log_likelihood_scalar": -22166.221755103128, + "log_likelihood_library_pdip": -22166.221752550147, + "log_likelihood_library_pdip_scalar": -22166.22175331667, + "rel_diff_vmap_vs_library_pdip": 4.031213079661079e-10, + "rel_diff_scalar_vs_library_pdip_scalar": 8.059373477961076e-11, + "abs_diff_nats": 1.1488657037261873e-05, + "rel_diff": 5.182956826919294e-10, + "rel_diff_scalar_vs_library_pdip": 1.1517437478551592e-10, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 7.665221346542239e-07, + "rel_diff_library_pdip_vmap_vs_scalar": 3.4580640001922354e-11, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": true, + "passes": 4, + "pdip_iter": null + }, + { + "lane": 4, + "draw_name": "call00015_lane04", + "draw_kind": "captured", + "offsets": { + "centre_0": 0.0017545152650242774, + "centre_1": 0.005096768299803747, + "ell_comps_0": 0.00015519416981613077, + "ell_comps_1": 0.007279341501820333, + "einstein_radius": -0.03249658545615719 + }, + "log_likelihood_vmap": -194384.10737004073, + "log_likelihood_scalar": NaN, + "log_likelihood_library_pdip": NaN, + "log_likelihood_library_pdip_scalar": NaN, + "rel_diff_vmap_vs_library_pdip": NaN, + "rel_diff_scalar_vs_library_pdip_scalar": NaN, + "abs_diff_nats": NaN, + "rel_diff": NaN, + "rel_diff_scalar_vs_library_pdip": NaN, + "abs_diff_library_pdip_vmap_vs_scalar_nats": NaN, + "rel_diff_library_pdip_vmap_vs_scalar": NaN, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "FAIL", + "certified": true, + "passes": 2, + "pdip_iter": null + }, + { + "lane": 5, + "draw_name": "call00015_lane05", + "draw_kind": "captured", + "offsets": { + "centre_0": -0.0009851407640018856, + "centre_1": 0.002274591191563648, + "ell_comps_0": 0.006006903437417319, + "ell_comps_1": 0.008497457839948512, + "einstein_radius": -0.07242218866013372 + }, + "log_likelihood_vmap": 14761.660929765763, + "log_likelihood_scalar": 14761.660929765752, + "log_likelihood_library_pdip": 14761.660929764941, + "log_likelihood_library_pdip_scalar": 14761.66092976493, + "rel_diff_vmap_vs_library_pdip": 5.569720198252916e-14, + "rel_diff_scalar_vs_library_pdip_scalar": 5.56972019825292e-14, + "abs_diff_nats": 1.0913936421275139e-11, + "rel_diff": 7.393433891485766e-16, + "rel_diff_scalar_vs_library_pdip": 5.495785859338054e-14, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 1.0913936421275139e-11, + "rel_diff_library_pdip_vmap_vs_scalar": 7.393433891486177e-16, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": true, + "passes": 14, + "pdip_iter": null + }, + { + "lane": 6, + "draw_name": "call00015_lane06", + "draw_kind": "captured", + "offsets": { + "centre_0": -0.002713857824416392, + "centre_1": 0.00891817739575143, + "ell_comps_0": 0.001298959041684998, + "ell_comps_1": -0.0098959428603974, + "einstein_radius": 0.04379561090121875 + }, + "log_likelihood_vmap": 21597.126871218283, + "log_likelihood_scalar": 21597.12687123079, + "log_likelihood_library_pdip": 21597.126871219538, + "log_likelihood_library_pdip_scalar": 21597.126871230867, + "rel_diff_vmap_vs_library_pdip": 5.811433603787356e-14, + "rel_diff_scalar_vs_library_pdip_scalar": 3.537394367520883e-15, + "abs_diff_nats": 1.2507371138781309e-08, + "rel_diff": 5.791219921684209e-13, + "rel_diff_scalar_vs_library_pdip": 5.21007656130849e-13, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 1.1328666005283594e-08, + "rel_diff_library_pdip_vmap_vs_scalar": 5.245450504980966e-13, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": true, + "passes": 6, + "pdip_iter": null + }, + { + "lane": 7, + "draw_name": "call00015_lane07", + "draw_kind": "captured", + "offsets": { + "centre_0": 0.01063269420288399, + "centre_1": -0.0015469073410711704, + "ell_comps_0": -0.012689283848227026, + "ell_comps_1": 0.0004952469855790744, + "einstein_radius": 0.02732727396499479 + }, + "log_likelihood_vmap": 7413.159095196606, + "log_likelihood_scalar": 7413.159096848976, + "log_likelihood_library_pdip": 7413.159095095707, + "log_likelihood_library_pdip_scalar": 7413.159096808238, + "rel_diff_vmap_vs_library_pdip": 1.3610842681285529e-11, + "rel_diff_scalar_vs_library_pdip_scalar": 5.495374664136499e-12, + "abs_diff_nats": 1.652369974181056e-06, + "rel_diff": 2.2289687198045019e-10, + "rel_diff_scalar_vs_library_pdip": 2.3650771471445255e-10, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 1.7125312297139317e-06, + "rel_diff_library_pdip_vmap_vs_scalar": 2.3101233999567986e-10, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": true, + "passes": 6, + "pdip_iter": null + }, + { + "lane": 8, + "draw_name": "call00015_lane08", + "draw_kind": "captured", + "offsets": { + "centre_0": -0.003586333218755102, + "centre_1": 0.0002442650473125539, + "ell_comps_0": -0.0025095685188555317, + "ell_comps_1": 0.008402687166147546, + "einstein_radius": 0.003809182535237543 + }, + "log_likelihood_vmap": 19060.202679471302, + "log_likelihood_scalar": 19060.20267912919, + "log_likelihood_library_pdip": 19060.202679471302, + "log_likelihood_library_pdip_scalar": 19060.20267912919, + "rel_diff_vmap_vs_library_pdip": 0.0, + "rel_diff_scalar_vs_library_pdip_scalar": 0.0, + "abs_diff_nats": 3.421118890400976e-07, + "rel_diff": 1.7949016324716636e-11, + "rel_diff_scalar_vs_library_pdip": 1.7949016324394468e-11, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 3.421118890400976e-07, + "rel_diff_library_pdip_vmap_vs_scalar": 1.7949016324716636e-11, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": false, + "passes": 16, + "pdip_iter": null + }, + { + "lane": 9, + "draw_name": "call00015_lane09", + "draw_kind": "captured", + "offsets": { + "centre_0": -0.004569070502203608, + "centre_1": -0.0008437281377326854, + "ell_comps_0": 0.016330335737132294, + "ell_comps_1": 0.007271610957481866, + "einstein_radius": -0.0644363448871137 + }, + "log_likelihood_vmap": 12782.703321755558, + "log_likelihood_scalar": 12782.70332143049, + "log_likelihood_library_pdip": 12782.703321755558, + "log_likelihood_library_pdip_scalar": 12782.70332143049, + "rel_diff_vmap_vs_library_pdip": 0.0, + "rel_diff_scalar_vs_library_pdip_scalar": 0.0, + "abs_diff_nats": 3.250679583288729e-07, + "rel_diff": 2.543029828314087e-11, + "rel_diff_scalar_vs_library_pdip": 2.543029828249417e-11, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 3.250679583288729e-07, + "rel_diff_library_pdip_vmap_vs_scalar": 2.543029828314087e-11, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": false, + "passes": 16, + "pdip_iter": null + }, + { + "lane": 10, + "draw_name": "call00015_lane10", + "draw_kind": "captured", + "offsets": { + "centre_0": 0.00041413552102611065, + "centre_1": -0.004015077828810355, + "ell_comps_0": 0.005329766760357603, + "ell_comps_1": 0.01667480963359283, + "einstein_radius": 0.011021193939315443 + }, + "log_likelihood_vmap": 25442.23680048243, + "log_likelihood_scalar": 25442.23680048246, + "log_likelihood_library_pdip": 25442.236800481296, + "log_likelihood_library_pdip_scalar": 25442.23680048131, + "rel_diff_vmap_vs_library_pdip": 4.4612798658926975e-14, + "rel_diff_scalar_vs_library_pdip_scalar": 4.518475761609268e-14, + "abs_diff_nats": 2.9103830456733704e-11, + "rel_diff": 1.1439179143314085e-15, + "rel_diff_scalar_vs_library_pdip": 4.575671657325843e-14, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 1.4551915228366852e-11, + "rel_diff_library_pdip_vmap_vs_scalar": 5.719589571657301e-16, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": true, + "passes": 6, + "pdip_iter": null + }, + { + "lane": 11, + "draw_name": "call00015_lane11", + "draw_kind": "captured", + "offsets": { + "centre_0": -0.00234856906735493, + "centre_1": -0.0005637310462631455, + "ell_comps_0": 0.002190699592912508, + "ell_comps_1": -0.01675931647125419, + "einstein_radius": -0.1186639473801736 + }, + "log_likelihood_vmap": -3234.481431636159, + "log_likelihood_scalar": -3234.481430921878, + "log_likelihood_library_pdip": -3234.481431636159, + "log_likelihood_library_pdip_scalar": -3234.481430921878, + "rel_diff_vmap_vs_library_pdip": 0.0, + "rel_diff_scalar_vs_library_pdip_scalar": 0.0, + "abs_diff_nats": 7.142807589843869e-07, + "rel_diff": 2.208331611230817e-10, + "rel_diff_scalar_vs_library_pdip": 2.208331610743144e-10, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 7.142807589843869e-07, + "rel_diff_library_pdip_vmap_vs_scalar": 2.208331611230817e-10, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": false, + "passes": 16, + "pdip_iter": null + }, + { + "lane": 12, + "draw_name": "call00015_lane12", + "draw_kind": "captured", + "offsets": { + "centre_0": -9.326736988388313e-05, + "centre_1": -0.0013488200741109593, + "ell_comps_0": 0.00997667014421897, + "ell_comps_1": -0.014348588092779897, + "einstein_radius": -0.02126731799195114 + }, + "log_likelihood_vmap": 18883.933556142838, + "log_likelihood_scalar": 18883.93355609074, + "log_likelihood_library_pdip": 18883.933556142838, + "log_likelihood_library_pdip_scalar": 18883.93355609074, + "rel_diff_vmap_vs_library_pdip": 0.0, + "rel_diff_scalar_vs_library_pdip_scalar": 0.0, + "abs_diff_nats": 5.209949449636042e-08, + "rel_diff": 2.7589323136310487e-12, + "rel_diff_scalar_vs_library_pdip": 2.7589323136234372e-12, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 5.209949449636042e-08, + "rel_diff_library_pdip_vmap_vs_scalar": 2.7589323136310487e-12, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": false, + "passes": 16, + "pdip_iter": null + }, + { + "lane": 13, + "draw_name": "call00015_lane13", + "draw_kind": "captured", + "offsets": { + "centre_0": -0.007013568613743564, + "centre_1": 0.004528745612839986, + "ell_comps_0": -0.018496405934026655, + "ell_comps_1": 0.0014830576999261711, + "einstein_radius": -0.04673040108359361 + }, + "log_likelihood_vmap": 23869.488067817772, + "log_likelihood_scalar": 23869.488067817765, + "log_likelihood_library_pdip": 23869.488067815804, + "log_likelihood_library_pdip_scalar": 23869.4880678158, + "rel_diff_vmap_vs_library_pdip": 8.245449290931163e-14, + "rel_diff_scalar_vs_library_pdip_scalar": 8.230208164700238e-14, + "abs_diff_nats": 7.275957614183426e-12, + "rel_diff": 3.048225246185022e-16, + "rel_diff_scalar_vs_library_pdip": 8.21496703846931e-14, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 3.637978807091713e-12, + "rel_diff_library_pdip_vmap_vs_scalar": 1.5241126230926365e-16, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": true, + "passes": 9, + "pdip_iter": null + }, + { + "lane": 14, + "draw_name": "call00015_lane14", + "draw_kind": "captured", + "offsets": { + "centre_0": 0.005108692197125562, + "centre_1": -0.010240010499870703, + "ell_comps_0": -0.00684600823433492, + "ell_comps_1": -0.002573928604858717, + "einstein_radius": -0.0214638151942923 + }, + "log_likelihood_vmap": -177848.1574694459, + "log_likelihood_scalar": NaN, + "log_likelihood_library_pdip": -177848.13779112743, + "log_likelihood_library_pdip_scalar": NaN, + "rel_diff_vmap_vs_library_pdip": 1.1064675014312083e-07, + "rel_diff_scalar_vs_library_pdip_scalar": NaN, + "abs_diff_nats": NaN, + "rel_diff": NaN, + "rel_diff_scalar_vs_library_pdip": NaN, + "abs_diff_library_pdip_vmap_vs_scalar_nats": NaN, + "rel_diff_library_pdip_vmap_vs_scalar": NaN, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "FAIL", + "certified": true, + "passes": 2, + "pdip_iter": null + }, + { + "lane": 15, + "draw_name": "call00015_lane15", + "draw_kind": "captured", + "offsets": { + "centre_0": 0.0015375882948530809, + "centre_1": 0.00010861850037634777, + "ell_comps_0": 0.010624594413718456, + "ell_comps_1": -0.00030576693661378264, + "einstein_radius": 0.018140577124415858 + }, + "log_likelihood_vmap": 25794.9854395939, + "log_likelihood_scalar": 25794.985439519525, + "log_likelihood_library_pdip": 25794.985439583575, + "log_likelihood_library_pdip_scalar": 25794.985439519085, + "rel_diff_vmap_vs_library_pdip": 4.002554635554374e-13, + "rel_diff_scalar_vs_library_pdip_scalar": 1.706515542294891e-14, + "abs_diff_nats": 7.437483873218298e-08, + "rel_diff": 2.8833060947666245e-12, + "rel_diff_scalar_vs_library_pdip": 2.4830506312040274e-12, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 6.44904503133148e-08, + "rel_diff_library_pdip_vmap_vs_scalar": 2.5001157866331842e-12, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": true, + "passes": 8, + "pdip_iter": null + } + ], + "lane_pins": [ + { + "pin": "lane 0: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 18463.07897110663, + "reference_value": 18463.07897110663, + "rel_diff": 0.0, + "abs_diff_nats": 0.0, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 0: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 18463.078970707007, + "reference_value": 18463.078970707007, + "rel_diff": 0.0, + "abs_diff_nats": 0.0, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 0: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 18463.07897110663, + "reference_value": 18463.078970707007, + "rel_diff": 2.1644531588444352e-11, + "abs_diff_nats": 3.996246960014105e-07, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 0: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 18463.07897110663, + "reference_value": 18463.078970707007, + "rel_diff": 2.1644531588444352e-11, + "abs_diff_nats": 3.996246960014105e-07, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 1: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 15734.21749647698, + "reference_value": 15734.21749647698, + "rel_diff": 0.0, + "abs_diff_nats": 0.0, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 1: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 15734.21749633948, + "reference_value": 15734.21749633948, + "rel_diff": 0.0, + "abs_diff_nats": 0.0, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 1: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 15734.21749647698, + "reference_value": 15734.21749633948, + "rel_diff": 8.738982222968992e-12, + "abs_diff_nats": 1.3750104699283838e-07, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 1: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 15734.21749647698, + "reference_value": 15734.21749633948, + "rel_diff": 8.738982222968992e-12, + "abs_diff_nats": 1.3750104699283838e-07, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 2: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 18706.165986625834, + "reference_value": 18706.165986625834, + "rel_diff": 0.0, + "abs_diff_nats": 0.0, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 2: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 18706.16598652238, + "reference_value": 18706.16598652238, + "rel_diff": 0.0, + "abs_diff_nats": 0.0, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 2: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 18706.165986625834, + "reference_value": 18706.16598652238, + "rel_diff": 5.530433302676995e-12, + "abs_diff_nats": 1.0345320333726704e-07, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 2: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 18706.165986625834, + "reference_value": 18706.16598652238, + "rel_diff": 5.530433302676995e-12, + "abs_diff_nats": 1.0345320333726704e-07, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 3: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -22166.22174361447, + "reference_value": -22166.221752550147, + "rel_diff": 4.031213079661079e-10, + "abs_diff_nats": 8.935676305554807e-06, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 3: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -22166.221755103128, + "reference_value": -22166.22175331667, + "rel_diff": 8.059373477961076e-11, + "abs_diff_nats": 1.7864585970528424e-06, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 3: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -22166.22174361447, + "reference_value": -22166.221755103128, + "rel_diff": 5.182956826919294e-10, + "abs_diff_nats": 1.1488657037261873e-05, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 3: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -22166.221752550147, + "reference_value": -22166.22175331667, + "rel_diff": 3.4580640001922354e-11, + "abs_diff_nats": 7.665221346542239e-07, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 4: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -194384.10737004073, + "reference_value": NaN, + "rel_diff": NaN, + "abs_diff_nats": NaN, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 4: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": NaN, + "reference_value": NaN, + "rel_diff": NaN, + "abs_diff_nats": NaN, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 4: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -194384.10737004073, + "reference_value": NaN, + "rel_diff": NaN, + "abs_diff_nats": NaN, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 4: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": NaN, + "reference_value": NaN, + "rel_diff": NaN, + "abs_diff_nats": NaN, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 5: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 14761.660929765763, + "reference_value": 14761.660929764941, + "rel_diff": 5.569720198252916e-14, + "abs_diff_nats": 8.221832104027271e-10, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 5: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 14761.660929765752, + "reference_value": 14761.66092976493, + "rel_diff": 5.56972019825292e-14, + "abs_diff_nats": 8.221832104027271e-10, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 5: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 14761.660929765763, + "reference_value": 14761.660929765752, + "rel_diff": 7.393433891485766e-16, + "abs_diff_nats": 1.0913936421275139e-11, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 5: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 14761.660929764941, + "reference_value": 14761.66092976493, + "rel_diff": 7.393433891486177e-16, + "abs_diff_nats": 1.0913936421275139e-11, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 6: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 21597.126871218283, + "reference_value": 21597.126871219538, + "rel_diff": 5.811433603787356e-14, + "abs_diff_nats": 1.255102688446641e-09, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 6: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 21597.12687123079, + "reference_value": 21597.126871230867, + "rel_diff": 3.537394367520883e-15, + "abs_diff_nats": 7.639755494892597e-11, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 6: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 21597.126871218283, + "reference_value": 21597.12687123079, + "rel_diff": 5.791219921684209e-13, + "abs_diff_nats": 1.2507371138781309e-08, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 6: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 21597.126871219538, + "reference_value": 21597.126871230867, + "rel_diff": 5.245450504980966e-13, + "abs_diff_nats": 1.1328666005283594e-08, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 7: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 7413.159095196606, + "reference_value": 7413.159095095707, + "rel_diff": 1.3610842681285529e-11, + "abs_diff_nats": 1.0089934221468866e-07, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 7: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 7413.159096848976, + "reference_value": 7413.159096808238, + "rel_diff": 5.495374664136499e-12, + "abs_diff_nats": 4.0738086681813e-08, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 7: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 7413.159095196606, + "reference_value": 7413.159096848976, + "rel_diff": 2.2289687198045019e-10, + "abs_diff_nats": 1.652369974181056e-06, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 7: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 7413.159095095707, + "reference_value": 7413.159096808238, + "rel_diff": 2.3101233999567986e-10, + "abs_diff_nats": 1.7125312297139317e-06, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 8: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 19060.202679471302, + "reference_value": 19060.202679471302, + "rel_diff": 0.0, + "abs_diff_nats": 0.0, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 8: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 19060.20267912919, + "reference_value": 19060.20267912919, + "rel_diff": 0.0, + "abs_diff_nats": 0.0, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 8: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 19060.202679471302, + "reference_value": 19060.20267912919, + "rel_diff": 1.7949016324716636e-11, + "abs_diff_nats": 3.421118890400976e-07, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 8: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 19060.202679471302, + "reference_value": 19060.20267912919, + "rel_diff": 1.7949016324716636e-11, + "abs_diff_nats": 3.421118890400976e-07, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 9: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 12782.703321755558, + "reference_value": 12782.703321755558, + "rel_diff": 0.0, + "abs_diff_nats": 0.0, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 9: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 12782.70332143049, + "reference_value": 12782.70332143049, + "rel_diff": 0.0, + "abs_diff_nats": 0.0, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 9: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 12782.703321755558, + "reference_value": 12782.70332143049, + "rel_diff": 2.543029828314087e-11, + "abs_diff_nats": 3.250679583288729e-07, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 9: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 12782.703321755558, + "reference_value": 12782.70332143049, + "rel_diff": 2.543029828314087e-11, + "abs_diff_nats": 3.250679583288729e-07, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 10: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 25442.23680048243, + "reference_value": 25442.236800481296, + "rel_diff": 4.4612798658926975e-14, + "abs_diff_nats": 1.1350493878126144e-09, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 10: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 25442.23680048246, + "reference_value": 25442.23680048131, + "rel_diff": 4.518475761609268e-14, + "abs_diff_nats": 1.1496013030409813e-09, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 10: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 25442.23680048243, + "reference_value": 25442.23680048246, + "rel_diff": 1.1439179143314085e-15, + "abs_diff_nats": 2.9103830456733704e-11, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 10: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 25442.236800481296, + "reference_value": 25442.23680048131, + "rel_diff": 5.719589571657301e-16, + "abs_diff_nats": 1.4551915228366852e-11, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 11: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -3234.481431636159, + "reference_value": -3234.481431636159, + "rel_diff": 0.0, + "abs_diff_nats": 0.0, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 11: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -3234.481430921878, + "reference_value": -3234.481430921878, + "rel_diff": 0.0, + "abs_diff_nats": 0.0, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 11: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -3234.481431636159, + "reference_value": -3234.481430921878, + "rel_diff": 2.208331611230817e-10, + "abs_diff_nats": 7.142807589843869e-07, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 11: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -3234.481431636159, + "reference_value": -3234.481430921878, + "rel_diff": 2.208331611230817e-10, + "abs_diff_nats": 7.142807589843869e-07, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 12: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 18883.933556142838, + "reference_value": 18883.933556142838, + "rel_diff": 0.0, + "abs_diff_nats": 0.0, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 12: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 18883.93355609074, + "reference_value": 18883.93355609074, + "rel_diff": 0.0, + "abs_diff_nats": 0.0, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 12: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 18883.933556142838, + "reference_value": 18883.93355609074, + "rel_diff": 2.7589323136310487e-12, + "abs_diff_nats": 5.209949449636042e-08, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 12: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 18883.933556142838, + "reference_value": 18883.93355609074, + "rel_diff": 2.7589323136310487e-12, + "abs_diff_nats": 5.209949449636042e-08, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 13: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 23869.488067817772, + "reference_value": 23869.488067815804, + "rel_diff": 8.245449290931163e-14, + "abs_diff_nats": 1.9681465346366167e-09, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 13: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 23869.488067817765, + "reference_value": 23869.4880678158, + "rel_diff": 8.230208164700238e-14, + "abs_diff_nats": 1.964508555829525e-09, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 13: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 23869.488067817772, + "reference_value": 23869.488067817765, + "rel_diff": 3.048225246185022e-16, + "abs_diff_nats": 7.275957614183426e-12, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 13: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 23869.488067815804, + "reference_value": 23869.4880678158, + "rel_diff": 1.5241126230926365e-16, + "abs_diff_nats": 3.637978807091713e-12, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 14: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -177848.1574694459, + "reference_value": -177848.13779112743, + "rel_diff": 1.1064675014312083e-07, + "abs_diff_nats": 0.019678318465594202, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 14: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": NaN, + "reference_value": NaN, + "rel_diff": NaN, + "abs_diff_nats": NaN, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 14: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -177848.1574694459, + "reference_value": NaN, + "rel_diff": NaN, + "abs_diff_nats": NaN, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 14: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -177848.13779112743, + "reference_value": NaN, + "rel_diff": NaN, + "abs_diff_nats": NaN, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 15: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 25794.9854395939, + "reference_value": 25794.985439583575, + "rel_diff": 4.002554635554374e-13, + "abs_diff_nats": 1.0324583854526281e-08, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 15: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 25794.985439519525, + "reference_value": 25794.985439519085, + "rel_diff": 1.706515542294891e-14, + "abs_diff_nats": 4.4019543565809727e-10, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 15: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 25794.9854395939, + "reference_value": 25794.985439519525, + "rel_diff": 2.8833060947666245e-12, + "abs_diff_nats": 7.437483873218298e-08, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 15: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 25794.985439583575, + "reference_value": 25794.985439519085, + "rel_diff": 2.5001157866331842e-12, + "abs_diff_nats": 6.44904503133148e-08, + "within_rtol": true, + "status": "RECORDED" + } + ], + "lanes_failed": 2, + "arm_rows": { + "vmap": { + "arm": "vmap", + "program": "jax.jit(jax.vmap(fn))", + "stands_for": "Nautilus(use_jax_vmap=True) \u2014 Fitness._vmap", + "hlo_source": "jax.jit(jax.vmap(fn)).lower(batched_tree) \u2014 the exact current Fitness._vmap composition (PyAutoFit#1638)", + "batch_wall_ms": 710.3779523000412, + "wall_production_nesting_ms": 710.3779523000412, + "wall_aot_command_buffers_on_ms": 712.3177015000692, + "wall_aot_command_buffers_off_ms": 712.1087406998413, + "command_buffer_delta_ms": -0.20896080022794195, + "production_nesting_vs_aot_on_delta_ms": -1.939749200028018, + "production_nesting_vs_aot_on_delta_pct": -0.27231517565028945, + "wall_per_lane_ms": 44.398622018752576, + "wall_per_lane_command_buffers_off_ms": 44.50679629374008, + "traced_batch_wall_ms": 722.839157099952, + "untraced_batch_wall_ms": 712.3232884998288, + "traced_wall_per_lane_ms": 45.177447318747, + "callback_count_per_call": 0.0, + "callback_count_per_lane": 0.0, + "callback_expectation": "0 \u2014 the rectangular mesh has no qhull host callback (asserted)", + "host_qhull_ms": 0.0, + "host_tables_ms": 0.0, + "host_qhull_ms_per_lane": 0.0, + "host_tables_ms_per_lane": 0.0, + "host_callback_probe": { + "calls": 0, + "qhull_ms_total": 0.0, + "tables_ms_total": 0.0, + "total_ms_total": 0.0, + "qhull_ms_mean": 0.0, + "tables_ms_mean": 0.0, + "total_ms_mean": 0.0, + "non_finite_calls": 0, + "n_points": [] + }, + "host_callback_records_first": [], + "device_idle_ms": 28.007573999999977, + "device_idle_ms_per_lane": 1.7504733749999986, + "trace": { + "parser": "ProfileData.from_file(xplane) + as_text() + stack_frame_index(proto field 17)", + "stage_audit": { + "mixed_fusion": [ + { + "instruction": "loop_divide_gather_fusion", + "ms": 16.9626333, + "opcode": "fusion", + "shape": "(f64[15361,16,1,1,1521]{4,3,2,1,0}, f64[15361,16,1,1,1521]{4,3,2,1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:133", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:133 (curvature_matrix_via_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:93 (InversionImagingMapping.curvature_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:389 (AbstractInversion.curvature_reg_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "input_add_multiply_transpose_fusion", + "ms": 5.1413752, + "opcode": "fusion", + "shape": "(f64[16,1369,1369]{2,1,0}, f64[16,1369,1369]{2,1,0}, f64[16,1369,1369]{2,1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:237 (active_set_search)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:293 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:274 (_certified_positive_only_from)" + ] + }, + { + "instruction": "loop_broadcast_fusion", + "ms": 4.0831873000000005, + "opcode": "fusion", + "shape": "f64[16,1521,180,180]{3,2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:303 (AbstractInversion.operated_mapping_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:68 (InversionImagingMapping.data_vector)" + ] + }, + { + "instruction": "input_reduce_fusion.15", + "ms": 2.0864852000000003, + "opcode": "fusion", + "shape": "f64[92,16,1521]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/inversion_imaging_util.py:123", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/inversion_imaging_util.py:123 (data_vector_via_blurred_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:67 (InversionImagingMapping.data_vector)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:699 (AbstractInversion.reconstruction)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "input_reduce_fusion.18", + "ms": 1.7732183, + "opcode": "fusion", + "shape": "f64[15361,16]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:163", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:163 (mapped_reconstructed_data_via_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:120 (InversionImagingMapping._mapped_reconstructed_data_dict_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:196 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "loop_broadcast_fusion.1", + "ms": 1.7268508999999999, + "opcode": "fusion", + "shape": "f64[15361,16,1521]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:353", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:353 (mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/abstract.py:283 (Mapper.mapping_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:91 (AbstractInversionImaging._mapping_matrix_for_convolution_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:137 (AbstractInversionImaging.operated_mapping_matrix_list)" + ] + } + ], + "other": [ + { + "instruction": "copy.69", + "ms": 0.07926109999999997, + "opcode": "copy", + "shape": "u32[16,2,15361]{2,1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "copy.68", + "ms": 0.07882310000000001, + "opcode": "copy", + "shape": "u32[16,2,15361]{2,1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "copy.87", + "ms": 0.0391316, + "opcode": "copy", + "shape": "u32[16,15361]{1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "copy.77", + "ms": 0.03885950000000004, + "opcode": "copy", + "shape": "u32[16,15361]{1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "copy.78", + "ms": 0.03870310000000004, + "opcode": "copy", + "shape": "u32[16,15361]{1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "copy.86", + "ms": 0.038408600000000064, + "opcode": "copy", + "shape": "u32[16,15361]{1,0}", + "source": "", + "stack": [] + } + ], + "mesh_construction": [ + { + "instruction": "fusion.6", + "ms": 0.47413930000000004, + "opcode": "fusion", + "shape": "(f64[16,15361,2]{2,1,0}, s64[16,15361,2]{2,1,0}, s32[16,15361,2]{2,1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:227", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:227 (create_transforms_rank)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:396 (_transforms_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:561 (adaptive_rectangular_mappings_weights_via_interpolation_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:693 (InterpolatorRectangular._mappings_sizes_weights)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "loop_select_fusion", + "ms": 0.1734701, + "opcode": "fusion", + "shape": "(u32[16,2,15361]{2,1,0}, u32[16,2,15361]{2,1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:69", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:69 (forward_interp)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:573 (adaptive_rectangular_mappings_weights_via_interpolation_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:693 (InterpolatorRectangular._mappings_sizes_weights)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/abstract.py:36 (AbstractInterpolator.mappings)" + ] + }, + { + "instruction": "loop_select_fusion.1", + "ms": 0.08413530000000001, + "opcode": "fusion", + "shape": "(u32[16,15361]{1,0}, u32[16,15361]{1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:245", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:245 (create_transforms_rank)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:396 (_transforms_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:561 (adaptive_rectangular_mappings_weights_via_interpolation_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:693 (InterpolatorRectangular._mappings_sizes_weights)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "loop_select_fusion.4", + "ms": 0.08088339999999994, + "opcode": "fusion", + "shape": "(u32[16,15361]{1,0}, u32[16,15361]{1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:245", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:245 (create_transforms_rank)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:396 (_transforms_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:561 (adaptive_rectangular_mappings_weights_via_interpolation_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:693 (InterpolatorRectangular._mappings_sizes_weights)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "loop_subtract_transpose_fusion", + "ms": 0.043793700000000005, + "opcode": "fusion", + "shape": "(f64[16,15361,2]{2,1,0}, f64[491552,1,1,1]{3,2,1,0}, f64[491552,1,1,1]{3,2,1,0}, f64[16,15361,2]{2,1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:69", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:69 (forward_interp)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:573 (adaptive_rectangular_mappings_weights_via_interpolation_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:693 (InterpolatorRectangular._mappings_sizes_weights)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/abstract.py:36 (AbstractInterpolator.mappings)" + ] + }, + { + "instruction": "loop_add_fusion", + "ms": 0.02133079999999997, + "opcode": "fusion", + "shape": "s64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:69", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:69 (forward_interp)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:573 (adaptive_rectangular_mappings_weights_via_interpolation_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:693 (InterpolatorRectangular._mappings_sizes_weights)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/abstract.py:36 (AbstractInterpolator.mappings)" + ] + } + ], + "border_relocator": [ + { + "instruction": "custom-call.2", + "ms": 0.042164900000000005, + "opcode": "custom-call", + "shape": "(f64[16,2,2]{2,1,0}, s8[4194304]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:242", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:242 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:415 (BorderRelocator.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:83 (AbstractMesh.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/rectangular_rtu_adapt_density.py:267 (RectangularRTUAdaptDensity.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "eigh.0", + "ms": 0.014559500000000003, + "opcode": "custom-call", + "shape": "(f64[16,2,2]{1,2,0}, f64[16,2]{1,0}, s32[16]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:245", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:245 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:415 (BorderRelocator.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:83 (AbstractMesh.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/rectangular_rtu_adapt_density.py:267 (RectangularRTUAdaptDensity.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "loop_add_rsqrt_fusion", + "ms": 0.0130203, + "opcode": "fusion", + "shape": "(f64[16,15361]{1,0}, f64[16,15361]{1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:311", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:311 (relocated_grid_via_ellipse_border_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:423 (BorderRelocator.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:83 (AbstractMesh.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/rectangular_rtu_adapt_density.py:267 (RectangularRTUAdaptDensity.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "loop_abs_fusion", + "ms": 0.0033629999999999997, + "opcode": "fusion", + "shape": "(f64[16,392,1]{2,1,0}, f64[16,392,1]{2,1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:269", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:269 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:415 (BorderRelocator.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:83 (AbstractMesh.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/rectangular_rtu_adapt_density.py:267 (RectangularRTUAdaptDensity.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "input_reduce_fusion.20", + "ms": 0.0031231999999999996, + "opcode": "fusion", + "shape": "f64[16]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:269", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:269 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:415 (BorderRelocator.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:83 (AbstractMesh.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/rectangular_rtu_adapt_density.py:267 (RectangularRTUAdaptDensity.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "input_reduce_fusion.19", + "ms": 0.003103700000000001, + "opcode": "fusion", + "shape": "f64[16]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:270", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:270 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:415 (BorderRelocator.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:83 (AbstractMesh.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/rectangular_rtu_adapt_density.py:267 (RectangularRTUAdaptDensity.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + } + ], + "pdip_solve": [ + { + "instruction": "cholesky.60", + "ms": 107.53748739998578, + "opcode": "custom-call", + "shape": "(f64[16,1369,1369]{1,2,0}, s32[16]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:106", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:106 (factorize_kkt)", + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:212 (pdip_pc_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:83 (solve_nnls)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:129 (_solve_nnls_primal_with..primal)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:164 (solve_nnls_primal_with_status)" + ] + }, + { + "instruction": "cholesky.40", + "ms": 84.35081819999033, + "opcode": "custom-call", + "shape": "(f64[16,1369,1369]{1,2,0}, s32[16]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:252 (active_set_search..body_fun)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:262 (active_set_search)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:293 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)" + ] + }, + { + "instruction": "triangular-solve", + "ms": 33.000130900000194, + "opcode": "custom-call", + "shape": "(f64[16,1369,1]{1,2,0}, s8[256]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146 (solve_kkt_rhs)", + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:213 (pdip_pc_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:83 (solve_nnls)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:129 (_solve_nnls_primal_with..primal)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:164 (solve_nnls_primal_with_status)" + ] + }, + { + "instruction": "triangular-solve.2", + "ms": 30.10419869999944, + "opcode": "custom-call", + "shape": "(f64[16,1369,1]{1,2,0}, s8[256]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146 (solve_kkt_rhs)", + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:217 (pdip_pc_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:83 (solve_nnls)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:129 (_solve_nnls_primal_with..primal)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:164 (solve_nnls_primal_with_status)" + ] + }, + { + "instruction": "triangular-solve.3", + "ms": 29.53390920000027, + "opcode": "custom-call", + "shape": "(f64[16,1369,1]{1,2,0}, s8[256]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146 (solve_kkt_rhs)", + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:217 (pdip_pc_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:83 (solve_nnls)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:129 (_solve_nnls_primal_with..primal)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:164 (solve_nnls_primal_with_status)" + ] + }, + { + "instruction": "triangular-solve.1", + "ms": 29.154225900000164, + "opcode": "custom-call", + "shape": "(f64[16,1369,1]{1,2,0}, s8[256]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146 (solve_kkt_rhs)", + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:213 (pdip_pc_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:83 (solve_nnls)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:129 (_solve_nnls_primal_with..primal)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:164 (solve_nnls_primal_with_status)" + ] + } + ], + "psf_convolution_mapping_matrix": [ + { + "instruction": "input_scatter_fusion", + "ms": 32.666079999999994, + "opcode": "fusion", + "shape": "f64[16,1521,180,180]{3,2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:303 (AbstractInversion.operated_mapping_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:68 (InversionImagingMapping.data_vector)" + ] + }, + { + "instruction": "fft.24.0", + "ms": 28.5886365, + "opcode": "fft", + "shape": "f64[16,1521,180,180]{3,2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:303 (AbstractInversion.operated_mapping_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:68 (InversionImagingMapping.data_vector)" + ] + }, + { + "instruction": "fft.20.0", + "ms": 21.8496246, + "opcode": "fft", + "shape": "c128[16,1521,180,91]{3,2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:303 (AbstractInversion.operated_mapping_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:68 (InversionImagingMapping.data_vector)" + ] + }, + { + "instruction": "fft.22.0", + "ms": 15.7263929, + "opcode": "fft", + "shape": "c128[16,1521,91,180]{3,2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:303 (AbstractInversion.operated_mapping_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:68 (InversionImagingMapping.data_vector)" + ] + }, + { + "instruction": "input_transpose_fusion.4", + "ms": 8.5532752, + "opcode": "fusion", + "shape": "c128[16,1521,91,180]{3,2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:303 (AbstractInversion.operated_mapping_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:68 (InversionImagingMapping.data_vector)" + ] + }, + { + "instruction": "wrapped_transpose.2", + "ms": 8.0248365, + "opcode": "fusion", + "shape": "c128[16,1521,180,91]{3,2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:303 (AbstractInversion.operated_mapping_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:68 (InversionImagingMapping.data_vector)" + ] + } + ], + "regularization_H": [ + { + "instruction": "wrapped_broadcast", + "ms": 0.4932269, + "opcode": "fusion", + "shape": "f64[16,1521,1521]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt.py:124", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt.py:124 (weighted_regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt.py:366 (Adapt.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:332 (AbstractInversion.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "input_scatter_fusion.7", + "ms": 0.0026432, + "opcode": "fusion", + "shape": "f64[1521,1521]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt.py:123", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt.py:123 (weighted_regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt.py:366 (Adapt.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:332 (AbstractInversion.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "mapping_matrix": [ + { + "instruction": "input_scatter_fusion.5", + "ms": 0.06358209999999999, + "opcode": "fusion", + "shape": "f64[16,1521]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:71", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:71 (adaptive_pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/abstract.py:507 (Mapper.pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt.py:339 (Adapt.regularization_weights_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt.py:362 (Adapt.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)" + ] + }, + { + "instruction": "input_reduce_fusion.33", + "ms": 0.0037278, + "opcode": "fusion", + "shape": "f64[16]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:93", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:93 (adaptive_pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/abstract.py:507 (Mapper.pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt.py:339 (Adapt.regularization_weights_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt.py:362 (Adapt.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)" + ] + } + ], + "curvature_matrix_F": [ + { + "instruction": "cublas-lt-matmul.2", + "ms": 98.97958690000002, + "opcode": "custom-call", + "shape": "(f64[16,1521,1521]{2,1,0}, s8[4194304]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:134", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:134 (curvature_matrix_via_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:93 (InversionImagingMapping.curvature_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:389 (AbstractInversion.curvature_reg_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "inversion_other": [ + { + "instruction": "cholesky.120", + "ms": 8.312794699999996, + "opcode": "custom-call", + "shape": "(f64[16,1521,1521]{1,2,0}, s32[16]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986 (AbstractInversion._log_det_symmetric_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:1078 (AbstractInversion.log_det_curvature_reg_matrix_term)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:347 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/model/analysis.py:135 (AnalysisImaging.log_likelihood_function)" + ] + }, + { + "instruction": "cholesky.130", + "ms": 8.189485999999981, + "opcode": "custom-call", + "shape": "(f64[16,1521,1521]{1,2,0}, s32[16]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986 (AbstractInversion._log_det_symmetric_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:1157 (AbstractInversion.log_det_regularization_matrix_term)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:348 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/model/analysis.py:135 (AnalysisImaging.log_likelihood_function)" + ] + }, + { + "instruction": "loop_reduce_window_fusion.3", + "ms": 0.007970799999999998, + "opcode": "fusion", + "shape": "s64[6,16]{1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "loop_reduce_window_fusion.2", + "ms": 0.0037280000000000004, + "opcode": "fusion", + "shape": "s64[86,16]{1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "input_scatter_fusion.9", + "ms": 0.0028832000000000007, + "opcode": "fusion", + "shape": "s64[1369]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:527", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:527 (AbstractInversion.zeroed_ids_to_keep)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:567 (AbstractInversion.solve_ids_to_keep)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:684 (AbstractInversion.reconstruction)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "loop_broadcast_fusion.5", + "ms": 0.002195, + "opcode": "fusion", + "shape": "(s64[1369]{0}, s64[1369]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:527", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:527 (AbstractInversion.zeroed_ids_to_keep)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:567 (AbstractInversion.solve_ids_to_keep)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:684 (AbstractInversion.reconstruction)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ] + }, + "stage_audit_note": "The HLO instructions that contributed most of each stage's milliseconds, with their full source stack. A stage row is only as good as the rules that built it; this is how a reader checks a row against the HLO instead of trusting it.", + "untraced_wall_ms": 712.3232884998288, + "reconciliation_vs_untraced_pct": 1.4811973257814912, + "wall_basis": "wall_ms is the TRACED run's wall, the run these kernel durations came from. untraced_wall_ms is the same executable without the profiler; the difference is the profiler's overhead and belongs in neither the stages nor the idle row.", + "calls": 10, + "call_split": "per-call (first-instruction recurrence)", + "call_blocks": 10, + "events": 220740, + "streams": [ + "Stream #14(MemcpyD2D,Compute,MemcpyD2H)" + ], + "per_stage_ms": { + "border_relocator": { + "median_ms": 0.0862405, + "min_ms": 0.08600999999999999, + "max_ms": 0.08674599999999999 + }, + "curvature_matrix_F": { + "median_ms": 99.0439775, + "min_ms": 98.265563, + "max_ms": 99.419582 + }, + "inversion_other": { + "median_ms": 16.522588000000027, + "min_ms": 16.279988999999997, + "max_ms": 16.688795000000006 + }, + "mapping_matrix": { + "median_ms": 0.0673265, + "min_ms": 0.06575700000000001, + "max_ms": 0.068928 + }, + "mesh_construction": { + "median_ms": 1.0305189999999982, + "min_ms": 1.0276869999999991, + "max_ms": 1.033543999999999 + }, + "mixed_fusion": { + "median_ms": 35.057405, + "min_ms": 34.526121, + "max_ms": 35.460657 + }, + "other": { + "median_ms": 0.3980254999999999, + "min_ms": 0.39587499999999987, + "max_ms": 0.39975099999999975 + }, + "pdip_solve": { + "median_ms": 426.78749900000696, + "min_ms": 425.9816720000059, + "max_ms": 427.587065000008 + }, + "psf_convolution_mapping_matrix": { + "median_ms": 115.37742700000001, + "min_ms": 115.14095699999999, + "max_ms": 115.62937199999999 + }, + "regularization_H": { + "median_ms": 0.49562, + "min_ms": 0.48791, + "max_ms": 0.506627 + } + }, + "stage_order": [ + "border_relocator", + "mesh_construction", + "mapping_matrix", + "psf_convolution_mapping_matrix", + "curvature_matrix_F", + "regularization_H", + "pdip_solve", + "inversion_other", + "mixed_fusion", + "other" + ], + "mixed_fusion": { + "ms": 35.057405, + "constituent_stage_sets": { + "curvature_matrix_F + psf_convolution_mapping_matrix": 16.9626333, + "inversion_other + pdip_solve + reconstruction_scatter": 5.1413752, + "pdip_solve + psf_convolution_mapping_matrix": 4.0831873000000005, + "data_vector_D + pdip_solve": 2.1037838000000004, + "mapped_reconstruction + pdip_solve": 1.7732183, + "mapping_matrix + pdip_solve": 1.7299004999999998, + "border_relocator + pdip_solve": 1.6056786, + "inversion_other + regularization_H": 0.48432490000000006, + "curvature_reg_reduce_gather + inversion_other": 0.4806735, + "inversion_other + pdip_solve": 0.2060462, + "border_relocator + inversion_other + mapping_matrix + mesh_construction + pdip_solve": 0.0906153, + "inversion_other + mapping_matrix + mesh_construction + pdip_solve": 0.0736008, + "mesh_construction + pdip_solve": 0.03543570000000001, + "grids_and_structures + mass_profile_deflections + ray_trace_data_grid": 0.028946199999999995, + "inversion_other + mesh_construction + pdip_solve": 0.0284438, + "inversion_other + pdip_solve + regularization_H": 0.025650600000000006, + "border_relocator + mesh_construction": 0.0235771, + "inversion_other + reconstruction_scatter": 0.0217913, + "chi_squared_evidence + pdip_solve": 0.0212222, + "grids_and_structures + mass_profile_deflections + pdip_solve + ray_trace_data_grid": 0.0172698, + "pdip_solve + regularization_H": 0.015769, + "pdip_solve + ray_trace_data_grid": 0.012975799999999994, + "inversion_other + mapping_matrix": 0.0118557, + "inversion_other + mapped_reconstruction + reconstruction_scatter": 0.009964599999999999, + "border_relocator + inversion_other + pdip_solve": 0.0075423999999999995, + "border_relocator + inversion_other + mesh_construction + pdip_solve": 0.0060317999999999995, + "inversion_other + pdip_solve + ray_trace_data_grid": 0.004793499999999999, + "grids_and_structures + mass_profile_deflections + pdip_solve": 0.0042239, + "mapping_matrix + pdip_solve + regularization_H": 0.0040575, + "border_relocator + inversion_other + mapping_matrix + mesh_construction": 0.0028767000000000003, + "chi_squared_evidence + inversion_other": 0.0023264 + }, + "example_kernels": { + "curvature_matrix_F + psf_convolution_mapping_matrix": [ + "loop_divide_gather_fusion" + ], + "inversion_other + pdip_solve + reconstruction_scatter": [ + "input_add_multiply_transpose_fusion" + ], + "pdip_solve + psf_convolution_mapping_matrix": [ + "loop_broadcast_fusion" + ], + "data_vector_D + pdip_solve": [ + "input_reduce_fusion.15", + "input_reduce_fusion.31" + ], + "mapped_reconstruction + pdip_solve": [ + "input_reduce_fusion.18" + ], + "mapping_matrix + pdip_solve": [ + "loop_broadcast_fusion.1", + "loop_divide_fusion" + ], + "border_relocator + pdip_solve": [ + "input_reduce_fusion.21", + "loop_select_sine_fusion", + "input_concatenate_fusion.5", + "input_transpose_fusion.5" + ], + "inversion_other + regularization_H": [ + "input_transpose_fusion.7" + ], + "curvature_reg_reduce_gather + inversion_other": [ + "input_transpose_fusion.6" + ], + "inversion_other + pdip_solve": [ + "input_reduce_fusion.16", + "input_reduce_fusion.17", + "input_scatter_fusion.11", + "input_transpose_fusion.3" + ] + }, + "prorated_estimate_ms": { + "psf_convolution_mapping_matrix": 10.5229103, + "curvature_matrix_F": 8.48131665, + "pdip_solve": 7.574652993333333, + "inversion_other": 2.381516085, + "reconstruction_scatter": 1.7280089166666666, + "data_vector_D": 1.0518919000000002, + "mapping_matrix": 0.9094730349999998, + "mapped_reconstruction": 0.8899306833333333, + "border_relocator": 0.8374921683333333, + "regularization_H": 0.25994965000000003, + "curvature_reg_reduce_gather": 0.24033675, + "mesh_construction": 0.07773805166666667, + "ray_trace_data_grid": 0.022051916666666664, + "grids_and_structures": 0.015374149999999996, + "mass_profile_deflections": 0.015374149999999996, + "chi_squared_evidence": 0.0117743 + }, + "prorated_note": "ESTIMATE ONLY \u2014 a mixed fusion's time split equally across the stages its constituents span. Never summed into the measured table, never reconciled." + }, + "other_sources_ms": { + "copy.69": 0.07926109999999997, + "copy.68": 0.07882310000000001, + "copy.87": 0.0391316, + "copy.77": 0.03885950000000004, + "copy.78": 0.03870310000000004, + "copy.86": 0.038408600000000064, + "copy.124": 0.03229049999999999, + "copy.123": 0.023346599999999978, + "copy.122": 0.022690300000000024, + "copy.138": 0.0023967999999999997, + "copy.61": 0.0021376, + "copy.70": 0.0017536000000000001 + }, + "device_span_ms": 722.7507141, + "device_busy_ms": 694.7431401, + "device_idle_ms": 28.007573999999977, + "largest_idle_gaps": [ + { + "gap_ms": 0.080444, + "after": "triangular-solve", + "before": "triangular-solve" + }, + { + "gap_ms": 0.048926, + "after": "input_reduce_fusion.30", + "before": "loop_broadcast_fusion" + }, + { + "gap_ms": 0.034718, + "after": "while.73", + "before": "copy.123" + }, + { + "gap_ms": 0.032415, + "after": "loop_select_fusion.6", + "before": "loop_select_fusion.5" + }, + { + "gap_ms": 0.025631, + "after": "while.78", + "before": "input_reduce_fusion" + }, + { + "gap_ms": 0.025407, + "after": "while.78", + "before": "cholesky.80" + }, + { + "gap_ms": 0.024446, + "after": "while.73", + "before": "copy.123" + }, + { + "gap_ms": 0.022911, + "after": "while.73", + "before": "loop_select_fusion.10" + } + ], + "kernel_ms": 694.866628000007, + "sum_ms": 722.874202000007, + "wall_ms": 722.839157099952, + "host_outside_span_ms": 0.088442999952008, + "reconciliation_pct": 0.004848229334396881, + "unjoined_ms": 0.0, + "unjoined_pct": 0.0, + "other_ms": 0.3980254999999999, + "other_pct": 0.05506418628410886, + "note": "Stage rows attribute the command-buffers-OFF program (see the module docstring): kernel times are the same, the launch overhead the CUDA graphs remove is not. sum_ms = kernel rows + device_idle_ms; the residual against wall_ms is host_outside_span_ms (dispatch before the first kernel, teardown after the last).", + "per_stage_ms_per_lane": { + "border_relocator": 0.00539003125, + "curvature_matrix_F": 6.19024859375, + "inversion_other": 1.0326617500000017, + "mapping_matrix": 0.00420790625, + "mesh_construction": 0.06440743749999989, + "mixed_fusion": 2.1910878125, + "other": 0.024876593749999995, + "pdip_solve": 26.674218687500435, + "psf_convolution_mapping_matrix": 7.211089187500001, + "regularization_H": 0.03097625 + }, + "per_lane_divisor": 16, + "host_callback": { + "pure_callback_span_ms": 0, + "qhull_ms": 0.0, + "callback_body_ms_note": "the OUTERMOST matching body event, not a sum: under the probe the body appears twice (the wrapper and the timed re-implementation it calls) and summing them would count the same work twice", + "events_by_name": { + "ThenExecuteCallback:GetEventForComputeStreamSyncPoint": { + "count": 10, + "ms": 0.0295897 + } + }, + "note": "HOST milliseconds per traced BATCH (the whole invocation), aggregated by name because the events nest. Not a row of the device table: the device pays for them as the idle gaps largest_idle_gaps names." + }, + "host_callback_ms": 0 + }, + "hlo_census": { + "status": "excluded", + "reason": "The legacy census anchors PyAutoArray source line numbers that moved after the phase-1 run. No batched attribution is published from unsupported anchors; the device-event table and wall reconciliation remain valid." + }, + "trace_split": { + "expected_calls": 10, + "executions_per_invocation": 1, + "method": "per-call (first-instruction recurrence)", + "note": "DECIDED IN CODE: the scalar arm's trace is split by trace_calls * B, so every lane's execution is its own block and the per-stage median is taken over all of them. The vmap arm's is split by trace_calls, one block per batched execution, and per_stage_ms_per_lane divides those rows by B." + } + }, + "scalar": { + "arm": "scalar", + "program": "jax.jit(fn), called B times", + "stands_for": "Nautilus(use_jax_vmap=False, use_jax_jit=True). Plain use_jax_vmap=False is UNJITTED and is NOT this arm", + "hlo_source": "jax.jit(fn).lower(lane_trees[0]) \u2014 the same program phase 1 traced", + "batch_wall_ms": 677.531935099978, + "wall_production_nesting_ms": 677.531935099978, + "wall_aot_command_buffers_on_ms": 677.3452973000531, + "wall_aot_command_buffers_off_ms": 682.2297303999221, + "command_buffer_delta_ms": 4.884433099869057, + "production_nesting_vs_aot_on_delta_ms": 0.186637799924938, + "production_nesting_vs_aot_on_delta_pct": 0.02755430659500991, + "wall_per_lane_ms": 42.345745943748625, + "wall_per_lane_command_buffers_off_ms": 42.63935814999513, + "traced_batch_wall_ms": 699.3465646999539, + "untraced_batch_wall_ms": 682.4068641999474, + "traced_wall_per_lane_ms": 43.70916029374712, + "callback_count_per_call": 0.0, + "callback_count_per_lane": 0.0, + "callback_expectation": "0 \u2014 the rectangular mesh has no qhull host callback (asserted)", + "host_qhull_ms": 0.0, + "host_tables_ms": 0.0, + "host_qhull_ms_per_lane": 0.0, + "host_tables_ms_per_lane": 0.0, + "host_callback_probe": { + "calls": 0, + "qhull_ms_total": 0.0, + "tables_ms_total": 0.0, + "total_ms_total": 0.0, + "qhull_ms_mean": 0.0, + "tables_ms_mean": 0.0, + "total_ms_mean": 0.0, + "non_finite_calls": 0, + "n_points": [] + }, + "host_callback_records_first": [], + "device_idle_ms": 2.167567168750004, + "device_idle_ms_per_lane": 2.167567168750004, + "trace": { + "parser": "ProfileData.from_file(xplane) + as_text() + stack_frame_index(proto field 17)", + "stage_audit": { + "mesh_construction": [ + { + "instruction": "fusion.2", + "ms": 0.1481451625000001, + "opcode": "fusion", + "shape": "(f64[15361,2]{1,0}, s64[15361,2]{1,0}, s32[15361,2]{1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:227", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:227 (create_transforms_rank)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:396 (_transforms_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:561 (adaptive_rectangular_mappings_weights_via_interpolation_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:693 (InterpolatorRectangular._mappings_sizes_weights)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "loop_select_fusion", + "ms": 0.039184324999999694, + "opcode": "fusion", + "shape": "(u32[2,15361]{1,0}, u32[2,15361]{1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:69", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:69 (forward_interp)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:573 (adaptive_rectangular_mappings_weights_via_interpolation_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:693 (InterpolatorRectangular._mappings_sizes_weights)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/abstract.py:36 (AbstractInterpolator.mappings)" + ] + }, + { + "instruction": "loop_select_fusion.6", + "ms": 0.034532712499999764, + "opcode": "fusion", + "shape": "(u32[15361]{0}, u32[15361]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:245", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:245 (create_transforms_rank)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:396 (_transforms_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:561 (adaptive_rectangular_mappings_weights_via_interpolation_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:693 (InterpolatorRectangular._mappings_sizes_weights)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "loop_select_fusion.1", + "ms": 0.03433358750000023, + "opcode": "fusion", + "shape": "(u32[15361]{0}, u32[15361]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:245", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:245 (create_transforms_rank)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:396 (_transforms_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:561 (adaptive_rectangular_mappings_weights_via_interpolation_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:693 (InterpolatorRectangular._mappings_sizes_weights)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "loop_add_fusion.7", + "ms": 0.02104513124999953, + "opcode": "fusion", + "shape": "s64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:245", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:245 (create_transforms_rank)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:396 (_transforms_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:561 (adaptive_rectangular_mappings_weights_via_interpolation_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:693 (InterpolatorRectangular._mappings_sizes_weights)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "loop_add_fusion", + "ms": 0.020980193749999553, + "opcode": "fusion", + "shape": "s64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:69", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:69 (forward_interp)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:573 (adaptive_rectangular_mappings_weights_via_interpolation_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:693 (InterpolatorRectangular._mappings_sizes_weights)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/abstract.py:36 (AbstractInterpolator.mappings)" + ] + } + ], + "mixed_fusion": [ + { + "instruction": "loop_divide_gather_fusion", + "ms": 0.6957160187499998, + "opcode": "fusion", + "shape": "(f64[15361,1,1,1521]{3,2,1,0}, f64[15361,1,1,1521]{3,2,1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:133", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:133 (curvature_matrix_via_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:93 (InversionImagingMapping.curvature_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:389 (AbstractInversion.curvature_reg_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "loop_broadcast_fusion.3", + "ms": 0.23337609374999993, + "opcode": "fusion", + "shape": "f64[1521,180,180]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "input_multiply_transpose_fusion", + "ms": 0.18472471875000007, + "opcode": "fusion", + "shape": "(f64[1369,1369]{1,0}, f64[1369,1369]{1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:237 (active_set_search)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:293 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:274 (_certified_positive_only_from)" + ] + }, + { + "instruction": "loop_broadcast_fusion", + "ms": 0.13639111875, + "opcode": "fusion", + "shape": "f64[15361,1521]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:342", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:342 (mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/abstract.py:283 (Mapper.mapping_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:91 (AbstractInversionImaging._mapping_matrix_for_convolution_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:137 (AbstractInversionImaging.operated_mapping_matrix_list)" + ] + }, + { + "instruction": "input_reduce_fusion.11", + "ms": 0.11359529375, + "opcode": "fusion", + "shape": "f64[92,1521]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/inversion_imaging_util.py:123", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/inversion_imaging_util.py:123 (data_vector_via_blurred_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:67 (InversionImagingMapping.data_vector)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:699 (AbstractInversion.reconstruction)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "input_reduce_fusion.14", + "ms": 0.11179722500000007, + "opcode": "fusion", + "shape": "f64[15361]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:163", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:163 (mapped_reconstructed_data_via_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:120 (InversionImagingMapping._mapped_reconstructed_data_dict_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:196 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + } + ], + "border_relocator": [ + { + "instruction": "eigh.0", + "ms": 0.0740736062499999, + "opcode": "custom-call", + "shape": "(f64[2,2]{0,1}, f64[2]{0}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:245", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:245 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:415 (BorderRelocator.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:83 (AbstractMesh.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/rectangular_rtu_adapt_density.py:267 (RectangularRTUAdaptDensity.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "custom-call.2", + "ms": 0.007912006250000006, + "opcode": "custom-call", + "shape": "(f64[2,2]{1,0}, s8[4194304]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:242", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:242 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:415 (BorderRelocator.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:83 (AbstractMesh.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/rectangular_rtu_adapt_density.py:267 (RectangularRTUAdaptDensity.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "input_reduce_fusion.15", + "ms": 0.005312068749999999, + "opcode": "fusion", + "shape": "(f64[], f64[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:270", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:270 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:415 (BorderRelocator.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:83 (AbstractMesh.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/rectangular_rtu_adapt_density.py:267 (RectangularRTUAdaptDensity.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "loop_add_fusion.9", + "ms": 0.0036249499999999996, + "opcode": "fusion", + "shape": "f64[15361]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:308", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:308 (relocated_grid_via_ellipse_border_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:423 (BorderRelocator.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:83 (AbstractMesh.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/rectangular_rtu_adapt_density.py:267 (RectangularRTUAdaptDensity.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "input_concatenate_fusion.4", + "ms": 0.0023793437500000017, + "opcode": "fusion", + "shape": "f64[392,2]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:238", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:238 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:415 (BorderRelocator.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:83 (AbstractMesh.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/rectangular_rtu_adapt_density.py:267 (RectangularRTUAdaptDensity.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "input_reduce_fusion.22", + "ms": 0.001590556250000001, + "opcode": "fusion", + "shape": "f64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:256", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:256 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:415 (BorderRelocator.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:83 (AbstractMesh.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/rectangular_rtu_adapt_density.py:267 (RectangularRTUAdaptDensity.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + } + ], + "other": [ + { + "instruction": "copy.63", + "ms": 0.03012568125000019, + "opcode": "copy", + "shape": "u32[2,15361]{1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "copy.64", + "ms": 0.02982254375000077, + "opcode": "copy", + "shape": "u32[2,15361]{1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "copy.81", + "ms": 0.02858591250000069, + "opcode": "copy", + "shape": "u32[15361]{0}", + "source": "", + "stack": [] + }, + { + "instruction": "copy.73", + "ms": 0.028505462500000876, + "opcode": "copy", + "shape": "u32[15361]{0}", + "source": "", + "stack": [] + }, + { + "instruction": "copy.82", + "ms": 0.0283477500000011, + "opcode": "copy", + "shape": "u32[15361]{0}", + "source": "", + "stack": [] + }, + { + "instruction": "copy.72", + "ms": 0.028247775000001137, + "opcode": "copy", + "shape": "u32[15361]{0}", + "source": "", + "stack": [] + } + ], + "pdip_solve": [ + { + "instruction": "cholesky.40", + "ms": 8.834679812500003, + "opcode": "custom-call", + "shape": "(f64[1369,1369]{0,1}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:252 (active_set_search..body_fun)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:262 (active_set_search)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:293 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)" + ] + }, + { + "instruction": "cholesky.60", + "ms": 6.379414124999969, + "opcode": "custom-call", + "shape": "(f64[1369,1369]{0,1}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:106", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:106 (factorize_kkt)", + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:212 (pdip_pc_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:83 (solve_nnls)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:129 (_solve_nnls_primal_with..primal)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:164 (solve_nnls_primal_with_status)" + ] + }, + { + "instruction": "triangular-solve.7", + "ms": 1.5466199374999623, + "opcode": "custom-call", + "shape": "(f64[1369,1]{0,1}, s8[0]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:154", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:154 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:252 (active_set_search..body_fun)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:262 (active_set_search)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:293 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)" + ] + }, + { + "instruction": "triangular-solve.6", + "ms": 1.3093116687500153, + "opcode": "custom-call", + "shape": "(f64[1369,1]{0,1}, s8[0]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:154", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:154 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:252 (active_set_search..body_fun)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:262 (active_set_search)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:293 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)" + ] + }, + { + "instruction": "triangular-solve", + "ms": 0.9732707624999928, + "opcode": "custom-call", + "shape": "(f64[1369,1]{0,1}, s8[0]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146 (solve_kkt_rhs)", + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:213 (pdip_pc_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:83 (solve_nnls)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:129 (_solve_nnls_primal_with..primal)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:164 (solve_nnls_primal_with_status)" + ] + }, + { + "instruction": "triangular-solve.2", + "ms": 0.9302861625000245, + "opcode": "custom-call", + "shape": "(f64[1369,1]{0,1}, s8[0]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146 (solve_kkt_rhs)", + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:217 (pdip_pc_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:83 (solve_nnls)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:129 (_solve_nnls_primal_with..primal)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:164 (solve_nnls_primal_with_status)" + ] + } + ], + "mapping_matrix": [ + { + "instruction": "input_reduce_fusion.28", + "ms": 0.0028161437500000006, + "opcode": "fusion", + "shape": "f64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:93", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:93 (adaptive_pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/abstract.py:507 (Mapper.pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt.py:339 (Adapt.regularization_weights_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt.py:362 (Adapt.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)" + ] + } + ], + "regularization_H": [ + { + "instruction": "input_scatter_fusion.8", + "ms": 0.0027709187500000016, + "opcode": "fusion", + "shape": "f64[1521,1521]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt.py:123", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt.py:123 (weighted_regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt.py:366 (Adapt.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:332 (AbstractInversion.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "psf_convolution_mapping_matrix": [ + { + "instruction": "fft.19.0", + "ms": 1.7800044812499995, + "opcode": "fft", + "shape": "f64[1521,180,180]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "input_scatter_fusion", + "ms": 1.4214474374999992, + "opcode": "fusion", + "shape": "f64[1521,180,180]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "fft.15.0", + "ms": 1.3830779874999992, + "opcode": "fft", + "shape": "c128[1521,180,91]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "fft.17.0", + "ms": 0.9921816250000004, + "opcode": "fft", + "shape": "c128[1521,91,180]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "input_transpose_fusion.4", + "ms": 0.5221223125, + "opcode": "fusion", + "shape": "c128[1521,91,180]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "wrapped_transpose.2", + "ms": 0.50774696875, + "opcode": "fusion", + "shape": "c128[1521,180,91]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + } + ], + "curvature_matrix_F": [ + { + "instruction": "cublas-lt-matmul.2", + "ms": 4.366860325000003, + "opcode": "custom-call", + "shape": "(f64[1521,1521]{1,0}, s8[4194304]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:134", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:134 (curvature_matrix_via_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:93 (InversionImagingMapping.curvature_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:389 (AbstractInversion.curvature_reg_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "inversion_other": [ + { + "instruction": "cholesky.120", + "ms": 0.9176413500000014, + "opcode": "custom-call", + "shape": "(f64[1521,1521]{0,1}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986 (AbstractInversion._log_det_symmetric_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:1078 (AbstractInversion.log_det_curvature_reg_matrix_term)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:347 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/model/analysis.py:135 (AnalysisImaging.log_likelihood_function)" + ] + }, + { + "instruction": "cholesky.130", + "ms": 0.9006329875000011, + "opcode": "custom-call", + "shape": "(f64[1521,1521]{0,1}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986 (AbstractInversion._log_det_symmetric_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:1157 (AbstractInversion.log_det_regularization_matrix_term)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:348 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/model/analysis.py:135 (AnalysisImaging.log_likelihood_function)" + ] + }, + { + "instruction": "loop_reduce_window_fusion.3", + "ms": 0.00579086249999999, + "opcode": "fusion", + "shape": "s64[6,16]{1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "loop_reduce_window_fusion.2", + "ms": 0.003018343749999991, + "opcode": "fusion", + "shape": "s64[86,16]{1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "input_scatter_fusion.9", + "ms": 0.0025459437499999954, + "opcode": "fusion", + "shape": "s64[1369]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:527", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:527 (AbstractInversion.zeroed_ids_to_keep)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:567 (AbstractInversion.solve_ids_to_keep)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:684 (AbstractInversion.reconstruction)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "loop_broadcast_fusion.4", + "ms": 0.0019107624999999977, + "opcode": "fusion", + "shape": "(s64[1369]{0}, s64[1369]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:527", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:527 (AbstractInversion.zeroed_ids_to_keep)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:567 (AbstractInversion.solve_ids_to_keep)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:684 (AbstractInversion.reconstruction)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "chi_squared_evidence": [ + { + "instruction": "loop_multiply_fusion.2", + "ms": 0.0029798937499999974, + "opcode": "fusion", + "shape": "f64[15361]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/abstract_ndarray.py:300", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/abstract_ndarray.py:300 (AbstractNDArray.__pow__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/abstract_ndarray.py:60 (unwrap_array..wrapper)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/abstract_ndarray.py:35 (to_new_array..wrapper)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_util.py:78 (chi_squared_map_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:78 (AbstractFit.chi_squared_map)" + ] + } + ] + }, + "stage_audit_note": "The HLO instructions that contributed most of each stage's milliseconds, with their full source stack. A stage row is only as good as the rules that built it; this is how a reader checks a row against the HLO instead of trusting it.", + "untraced_wall_ms": 42.650429012496716, + "reconciliation_vs_untraced_pct": -21.452712330433613, + "wall_basis": "wall_ms is the TRACED run's wall, the run these kernel durations came from. untraced_wall_ms is the same executable without the profiler; the difference is the profiler's overhead and belongs in neither the stages nor the idle row.", + "calls": 160, + "call_split": "per-call (first-instruction recurrence)", + "call_blocks": 160, + "events": 134500, + "streams": [ + "Stream #14(MemcpyH2D,Compute,MemcpyD2H,Memset,MemcpyD2D)" + ], + "per_stage_ms": { + "border_relocator": { + "median_ms": 0.09642900000000004, + "min_ms": 0.09564500000000001, + "max_ms": 0.09740000000000001 + }, + "chi_squared_evidence": { + "median_ms": 0.002975, + "min_ms": 0.002847, + "max_ms": 0.003328 + }, + "curvature_matrix_F": { + "median_ms": 4.3388975, + "min_ms": 4.308712, + "max_ms": 4.521694 + }, + "inversion_other": { + "median_ms": 1.8344719999999999, + "min_ms": 1.822318, + "max_ms": 1.854093 + }, + "mapping_matrix": { + "median_ms": 0.002816, + "min_ms": 0.002783, + "max_ms": 0.002848 + }, + "memset": { + "median_ms": 0.03918350000000001, + "min_ms": 0.014751999999999998, + "max_ms": 0.10527399999999994 + }, + "mesh_construction": { + "median_ms": 0.34237549999999983, + "min_ms": 0.3399209999999998, + "max_ms": 0.3439689999999998 + }, + "mixed_fusion": { + "median_ms": 1.8487105000000001, + "min_ms": 1.8430510000000002, + "max_ms": 1.8544769999999997 + }, + "other": { + "median_ms": 0.18028849999999969, + "min_ms": 0.17941699999999977, + "max_ms": 0.18363699999999977 + }, + "pdip_solve": { + "median_ms": 16.03756299999999, + "min_ms": 4.649876999999999, + "max_ms": 48.07878999999992 + }, + "psf_convolution_mapping_matrix": { + "median_ms": 6.606725500000001, + "min_ms": 6.584301, + "max_ms": 6.6237569999999995 + }, + "regularization_H": { + "median_ms": 0.002752, + "min_ms": 0.002432, + "max_ms": 0.003232 + } + }, + "stage_order": [ + "border_relocator", + "mesh_construction", + "mapping_matrix", + "psf_convolution_mapping_matrix", + "curvature_matrix_F", + "regularization_H", + "pdip_solve", + "chi_squared_evidence", + "inversion_other", + "mixed_fusion", + "other", + "memset" + ], + "mixed_fusion": { + "ms": 1.8487105000000001, + "constituent_stage_sets": { + "curvature_matrix_F + psf_convolution_mapping_matrix": 0.6957160187499998, + "pdip_solve + psf_convolution_mapping_matrix": 0.23337609374999993, + "inversion_other + mapped_reconstruction + pdip_solve + reconstruction_scatter": 0.18472471875000007, + "mapping_matrix + pdip_solve": 0.1387286625000001, + "data_vector_D + pdip_solve": 0.11731176875000013, + "mapped_reconstruction + pdip_solve": 0.11179722500000007, + "border_relocator + pdip_solve": 0.07092946875000007, + "mesh_construction + pdip_solve": 0.038702762500000105, + "inversion_other + regularization_H": 0.031007618749999986, + "inversion_other + pdip_solve": 0.030165462499999924, + "border_relocator + mesh_construction + pdip_solve": 0.027064900000000017, + "curvature_reg_reduce_gather + inversion_other": 0.025772318750000012, + "border_relocator + inversion_other + mapping_matrix + mesh_construction + pdip_solve": 0.020572025000000015, + "pdip_solve + regularization_H": 0.019315131249999996, + "inversion_other + mapping_matrix + pdip_solve + regularization_H": 0.015423406249999983, + "inversion_other + mapping_matrix + mesh_construction": 0.012941031250000002, + "pdip_solve + ray_trace_data_grid": 0.012810718750000059, + "grids_and_structures + mass_profile_deflections + pdip_solve": 0.009774931249999995, + "inversion_other + mapped_reconstruction + reconstruction_scatter": 0.009560143749999995, + "inversion_other + mapped_reconstruction": 0.008867768750000001, + "chi_squared_evidence + pdip_solve": 0.007603593749999994, + "inversion_other + mesh_construction + pdip_solve": 0.005450837499999997, + "grids_and_structures + mass_profile_deflections + ray_trace_data_grid": 0.005214674999999999, + "inversion_other + pdip_solve + ray_trace_data_grid": 0.004812693749999996, + "border_relocator + mesh_construction": 0.00342489375, + "border_relocator + inversion_other": 0.0033499062500000018, + "border_relocator + inversion_other + mesh_construction + pdip_solve": 0.0024591437500000035, + "chi_squared_evidence + inversion_other": 0.0017915624999999993 + }, + "example_kernels": { + "curvature_matrix_F + psf_convolution_mapping_matrix": [ + "loop_divide_gather_fusion" + ], + "pdip_solve + psf_convolution_mapping_matrix": [ + "loop_broadcast_fusion.3" + ], + "inversion_other + mapped_reconstruction + pdip_solve + reconstruction_scatter": [ + "input_multiply_transpose_fusion" + ], + "mapping_matrix + pdip_solve": [ + "loop_divide_fusion.1", + "loop_broadcast_fusion" + ], + "data_vector_D + pdip_solve": [ + "input_reduce_fusion.11", + "input_reduce_fusion.26" + ], + "mapped_reconstruction + pdip_solve": [ + "input_reduce_fusion.14" + ], + "border_relocator + pdip_solve": [ + "input_reduce_fusion.16", + "loop_select_sine_fusion", + "input_concatenate_fusion.1", + "input_transpose_fusion.8" + ], + "mesh_construction + pdip_solve": [ + "loop_multiply_fusion.4", + "loop_pad_fusion", + "loop_reduce_fusion", + "triton_softmax.1" + ], + "inversion_other + regularization_H": [ + "input_transpose_fusion.6" + ], + "inversion_other + pdip_solve": [ + "input_scatter_fusion.11", + "input_reduce_fusion.17", + "input_reduce_fusion.24", + "input_reduce_fusion.12" + ] + }, + "prorated_estimate_ms": { + "psf_convolution_mapping_matrix": 0.46454605624999984, + "pdip_solve": 0.4608377867708336, + "curvature_matrix_F": 0.3478580093749999, + "inversion_other": 0.11616510968749999, + "mapped_reconstruction": 0.10970039114583338, + "mapping_matrix": 0.08164826489583339, + "data_vector_D": 0.058655884375000064, + "border_relocator": 0.052602958645833385, + "reconstruction_scatter": 0.04936789427083335, + "mesh_construction": 0.04094527531250006, + "regularization_H": 0.029017226562499988, + "curvature_reg_reduce_gather": 0.012886159375000006, + "ray_trace_data_grid": 0.009747815625000027, + "grids_and_structures": 0.004996535416666665, + "mass_profile_deflections": 0.004996535416666665, + "chi_squared_evidence": 0.0046975781249999965 + }, + "prorated_note": "ESTIMATE ONLY \u2014 a mixed fusion's time split equally across the stages its constituents span. Never summed into the measured table, never reconciled." + }, + "other_sources_ms": { + "copy.63": 0.03012568125000019, + "copy.64": 0.02982254375000077, + "copy.81": 0.02858591250000069, + "copy.73": 0.028505462500000876, + "copy.82": 0.0283477500000011, + "copy.72": 0.028247775000001137, + "copy.122": 0.0016843500000000007, + "copy.121": 0.0016307500000000003, + "copy.74": 0.0015381624999999983, + "copy.56": 0.0015323374999999973, + "copy.120": 0.0007351687500000007, + "copy.43": 0.0006679875000000006 + }, + "device_span_ms": 43.704272200000005, + "device_busy_ms": 41.53670503125, + "device_idle_ms": 2.167567168750004, + "largest_idle_gaps": [ + { + "gap_ms": 0.041981, + "after": "while.33", + "before": "input_scatter_fusion.1" + }, + { + "gap_ms": 0.041726, + "after": "input_concatenate_fusion.4", + "before": "custom-call.2" + }, + { + "gap_ms": 0.032478, + "after": "loop_multiply_fusion.3", + "before": "eigh.0" + }, + { + "gap_ms": 0.029471, + "after": "fusion.2", + "before": "fusion.2" + }, + { + "gap_ms": 0.027423, + "after": "while.33", + "before": "input_reduce_fusion" + }, + { + "gap_ms": 0.026655, + "after": "loop_add_fusion.7", + "before": "loop_select_fusion.6" + }, + { + "gap_ms": 0.02595, + "after": "copy.72", + "before": "copy.73" + }, + { + "gap_ms": 0.024255, + "after": "while.40", + "before": "input_transpose_fusion.2" + } + ], + "kernel_ms": 31.333187999999993, + "sum_ms": 33.50075516875, + "wall_ms": 43.70916029374712, + "host_outside_span_ms": 0.004888093747112521, + "reconciliation_pct": -23.355299109824127, + "unjoined_ms": 0.0, + "unjoined_pct": 0.0, + "other_ms": 0.18028849999999969, + "other_pct": 0.41247303491618703, + "note": "Stage rows attribute the command-buffers-OFF program (see the module docstring): kernel times are the same, the launch overhead the CUDA graphs remove is not. sum_ms = kernel rows + device_idle_ms; the residual against wall_ms is host_outside_span_ms (dispatch before the first kernel, teardown after the last).", + "per_stage_ms_per_lane": { + "border_relocator": 0.09642900000000004, + "chi_squared_evidence": 0.002975, + "curvature_matrix_F": 4.3388975, + "inversion_other": 1.8344719999999999, + "mapping_matrix": 0.002816, + "memset": 0.03918350000000001, + "mesh_construction": 0.34237549999999983, + "mixed_fusion": 1.8487105000000001, + "other": 0.18028849999999969, + "pdip_solve": 16.03756299999999, + "psf_convolution_mapping_matrix": 6.606725500000001, + "regularization_H": 0.002752 + }, + "per_lane_divisor": 1, + "host_callback": { + "pure_callback_span_ms": 0, + "qhull_ms": 0.0, + "callback_body_ms_note": "the OUTERMOST matching body event, not a sum: under the probe the body appears twice (the wrapper and the timed re-implementation it calls) and summing them would count the same work twice", + "events_by_name": { + "ThenExecuteCallback:GetEventForComputeStreamSyncPoint": { + "count": 160, + "ms": 0.3133482000000001 + } + }, + "note": "HOST milliseconds per traced BATCH (the whole invocation), aggregated by name because the events nest. Not a row of the device table: the device pays for them as the idle gaps largest_idle_gaps names." + }, + "host_callback_ms": 0 + }, + "hlo_census": { + "status": "excluded", + "reason": "The legacy census anchors PyAutoArray source line numbers that moved after the phase-1 run. No batched attribution is published from unsupported anchors; the device-event table and wall reconciliation remain valid." + }, + "trace_split": { + "expected_calls": 160, + "executions_per_invocation": 16, + "method": "per-call (first-instruction recurrence)", + "note": "DECIDED IN CODE: the scalar arm's trace is split by trace_calls * B, so every lane's execution is its own block and the per-stage median is taken over all of them. The vmap arm's is split by trace_calls, one block per batched execution, and per_stage_ms_per_lane divides those rows by B." + } + } + }, + "certification_report": { + "source": "vmap arm, library solve observed through its stats= out-dict (PyAutoArray #566) and jax.debug.callback(..., ordered=True); ordered because the unordered batching rule returns the lanes permuted. Untimed, separately compiled; max rel diff of its log likelihoods vs the timed arm's: 7.769e-07", + "rows": 16, + "pdip_iter": "NOT AVAILABLE per lane without changing library numerics. The fallback branch calls the library's own reconstruction_positive_only_from, which returns the solution alone \u2014 jax_nnls.solve_nnls' iteration count is discarded inside the library's custom_vjp primal. The PDIP while_loop's cost is in the pdip_solve stage row of each arm's device table instead, which is a max-over-lanes quantity under vmap because every lane runs the same fixed kernel sequence.", + "passes_semantics": "library `passes`: restricted active-set passes run (jax_active_set.solve_certified)" + }, + "lane_construction": { + "draws_sha256": "6bdc2dd94a49d4d0c9095b0fbaa94aad0f0243aedd8fc4dad1391ab796f19d33", + "lane_rows": [ + 300, + 301, + 302, + 303, + 304, + 305, + 306, + 307, + 308, + 309, + 310, + 311, + 312, + 313, + 314, + 315 + ], + "calls": [ + 15 + ], + "stage": "pix1", + "regularization_range": { + "galaxies.source.pixelization.regularization.inner_coefficient": { + "min": 1.5395402868893563e-06, + "max": 631.3270846999916 + }, + "galaxies.source.pixelization.regularization.outer_coefficient": { + "min": 1.585514819488347e-06, + "max": 4.102561528173602 + }, + "galaxies.source.pixelization.regularization.signal_scale": { + "min": 0.06623313471893155, + "max": 0.9779334025364208 + } + }, + "phases": [ + "exploration" + ], + "window_rule": "nautilus_batches.timed_window: consecutive captured calls, in call order, from the FIRST call that is not a prior batch, concatenated and truncated to B; at B == n_batch exactly one real Nautilus batch. Falls back to the latest B lanes if the post-prior lanes run out; never repeats a lane.", + "note": "Lane k is captured lane lane_rows[k]: the mass AND shear of a real Nautilus proposal (nautilus_batch_capture.py), lens light fixed at S3, the S3 light-subtracted dataset shared by every lane. `offsets` in the lane table are the mass offsets from the fiducial; the shear is in the capture file." + }, + "captured": { + "batches_path": "/mnt/ral/jnightin/autolens_profiling_wt/certified-solver-phase-c1-lane-rate/results/breakdown/imaging/nautilus_batches_rectangular_pix1.npz", + "batches_sha256": "c0b62fba544cb62c8a273c19837cf364127f5af7fdaa110f3a2c8a973e0b6cc0", + "schema_version": 2, + "n_calls": 972, + "n_lanes": 19440, + "call_sizes_seen": [ + 20 + ], + "calls_by_phase": { + "prior": 15, + "exploration": 957 + }, + "parameter_paths": [ + "galaxies.source.pixelization.regularization.inner_coefficient", + "galaxies.source.pixelization.regularization.outer_coefficient", + "galaxies.source.pixelization.regularization.signal_scale", + "galaxies.lens.mass.centre.centre_0", + "galaxies.lens.mass.centre.centre_1", + "galaxies.lens.mass.einstein_radius", + "galaxies.lens.mass.ell_comps.ell_comps_0", + "galaxies.lens.mass.ell_comps.ell_comps_1", + "galaxies.lens.shear.gamma_1", + "galaxies.lens.shear.gamma_2" + ], + "stage": "pix1", + "regularization": { + "class": "Adapt", + "free": true, + "priors": { + "inner_coefficient": [ + "LogUniform", + 1e-06, + 1000000.0 + ], + "outer_coefficient": [ + "LogUniform", + 1e-06, + 1000000.0 + ], + "signal_scale": [ + "Uniform", + 0.0, + 1.0 + ] + }, + "priors_source": "PyAutoGalaxy packaged config/priors/regularization (adapt_split.yaml / adapt.yaml / constant.yaml); adapt_split.yaml and adapt.yaml are identical to euclid_strong_lens_modeling_pipeline/config/priors/regularization/'s copies" + }, + "nautilus": { + "departures_from_production": [ + "mass/shear priors are the phase-B cell's Gaussians, not chained from source_lp", + "no positions likelihood", + "the cell's mesh (39x39 RectangularBilinearAdaptImage, weight_power 1, weight_floor 0) fixed in both stages; source_pix_1 uses RectangularBilinearAdaptDensity, source_pix_2 frees weight_power / weight_floor", + "seeded (production passes no seed)", + "quick updates disabled (iterations_per_quick_update=1e12; render-only)", + "NullPaths: no output directory, so no checkpoint and one Sampler.run call", + "post-fit perform_update skipped (samples / latent variables never built)" + ], + "n_batch": 20, + "n_like_max": 40000, + "n_live": 150, + "number_of_cores": 1, + "production_reference": "euclid_strong_lens_modeling_pipeline/scripts/full_model.py source_pix_1 (n_live=150) / source_pix_2 (n_live=75): af.Nautilus(n_batch=20, **SettingsSearch.search_dict) with use_jax_vmap=True and number_of_cores=1 (SettingsSearch defaults)", + "production_stage": "source_pix_1", + "seed": 1, + "stage": "pix1", + "use_jax_vmap": true, + "version": "1.0.5" + }, + "capture_fit_status": "sampling complete (n_like_max or convergence); post-fit result skipped", + "capture_library_revisions": { + "PyAutoArray": { + "head": "3de624b5b91a4efa130dc3cb0a3a0f06f85025a3", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoArray" + }, + "PyAutoFit": { + "head": "dd9fbe0aab60c4a57702b1444ca031b317c91331", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoFit" + }, + "PyAutoGalaxy": { + "head": "70a61e26cd715cefe7012a38285698091246a8a4", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy" + }, + "PyAutoLens": { + "head": "86054bbc19baa2f710a12e04a94fa27ab37cc354", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoLens" + }, + "PyAutoNerves": { + "head": "1fa613aa8d89a79613009fb66f5b4e2d21deb57a", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoNerves" + } + }, + "fingerprint_check": { + "fields": [ + "mesh", + "source_pixels", + "dataset_sha256", + "regularization_class", + "regularization_s0_fiducial", + "border_relocator", + "use_mixed_precision", + "log_evidence_s3_library" + ], + "not_identity": "the regularization coefficients: free per lane since the capture frees them", + "log_evidence_s3_library_rel_diff": 0.0, + "passed": true + }, + "timed_window_vs_capture_pdip": { + "reference": "the capture's own figure of merit (library PDIP, Fitness.call_wrap jax.jit(jax.vmap(call)) over parameter vectors) for the same lanes", + "compared_against": "this cell's jit(vmap) library-PDIP reference", + "n_compared": 16, + "max_rel_diff": NaN, + "max_abs_diff_nats": NaN, + "gated": false, + "note": "RECORDED, NOT GATED: proves the lane trees rebuilt here are the models the sampler evaluated (a wrong parameter mapping shows up as nats, not 1e-10)." + } + }, + "matched": { + "vmap_wall_per_lane_ms": 44.398622018752576, + "scalar_wall_per_lane_ms": 42.345745943748625, + "speedup_vmap_over_scalar": 0.9537626173592306, + "note": "Both walls are the PRODUCTION nesting of their arm, measured in one process on the same B lanes with the SAME library Settings (no injection). A speedup below 1 means the batch is slower per lane than B sequential jitted calls." + }, + "solver_source": "library", + "solver": "certified", + "certified_fallback": "pdip", + "certified_pass_budget": 16, + "certified_pass_budget_basis": "config default (Settings().certified_pass_budget)", + "certified_tau_rel": 1e-09, + "solver_used": "certified", + "solver_check": { + "solver_used": "certified", + "solver_used_source": "AbstractInversion.positive_only_solver_used on the fiducial S3 inversion, built eagerly on the JAX backend (AnalysisImaging(use_jax=True).fit_from) with the arms' Settings", + "reference_solver_used": "pdip", + "traced_solver_kwargs_jax": [ + "certified" + ], + "observed_calls_jax": 1, + "report_rows": 16, + "report_vs_timed_arm_max_rel_diff": 7.768789745578647e-07 + }, + "lanes_certified": [ + false, + false, + false, + true, + true, + true, + true, + true, + false, + false, + true, + false, + false, + true, + true, + true + ], + "lanes_passes": [ + 16, + 16, + 16, + 4, + 2, + 14, + 6, + 6, + 16, + 16, + 6, + 16, + 16, + 9, + 2, + 8 + ], + "uncertified_lanes": 7, + "per_lane_certification_note": "certified / passes come from the library's own solve through its stats= out-dict (PyAutoArray #566): passes is the number of restricted active-set passes the library ran (0 when the unconstrained solve was already non-negative), certified is its KKT certificate. With certified_fallback=pdip a False lane returned the PDIP solution; with none it returned the last uncertified iterate. null for a library-PDIP row (no certificate).", + "gate": { + "pre_registered": true, + "gated": [ + "per lane: jit(vmap) arm vs jit(vmap) library PDIP <= lane_rtol relative", + "per lane: scalar jit arm vs scalar jit library PDIP <= lane_rtol relative" + ], + "recorded_not_gated": [ + "per lane: jit(vmap) arm vs scalar jit arm (rel_diff, abs_diff_nats)", + "per lane: jit(vmap) library PDIP vs scalar jit library PDIP", + "uncertified_lanes (certified_fallback=none rows)" + ], + "lanes_failed": 2, + "passed": false, + "policy_eligible": false, + "note": "Pre-registered before submission (module docstring; submit header). Phase 3 (results/notes/hst_gpu_residue_phase3_psf_2026_09.md) placed phase 2's ~2.5e-9 certified-vs-PDIP residual BETWEEN the jit(vmap) and scalar-jit compositions, not in the solver \u2014 so each arm is gated against the library-PDIP reference of its OWN composition, and the cross-composition difference is recorded with its nats. A certified_fallback=none row is policy-eligible only if every lane certifies AND passes the gate. Timing is never gated." + }, + "library_revisions": { + "PyAutoArray": { + "head": "3de624b5b91a4efa130dc3cb0a3a0f06f85025a3", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoArray", + "module_file": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/__init__.py" + }, + "PyAutoFit": { + "head": "dd9fbe0aab60c4a57702b1444ca031b317c91331", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoFit", + "module_file": "/mnt/ral/jnightin/PyAuto/PyAutoFit/autofit/__init__.py" + }, + "PyAutoGalaxy": { + "head": "70a61e26cd715cefe7012a38285698091246a8a4", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy", + "module_file": "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/__init__.py" + }, + "PyAutoLens": { + "head": "86054bbc19baa2f710a12e04a94fa27ab37cc354", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoLens", + "module_file": "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/__init__.py" + }, + "autoarray_file": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/__init__.py" + } + }, + "headline_arm_note": "`trace`, `hlo_census`, `command_buffers` and `trace_timing` above describe the scalar arm \u2014 the program phase 1 traced. Both arms' full blocks, the lane table and the matched comparison are under `vmap`." +} \ No newline at end of file diff --git a/results/breakdown/imaging/fixed_light_trace_rectangular_jitvmap16_captured_pix1_libcertified_fbon_b16_hpc_a100_fp64_fixed_light_trace.png b/results/breakdown/imaging/fixed_light_trace_rectangular_jitvmap16_captured_pix1_libcertified_fbon_b16_hpc_a100_fp64_fixed_light_trace.png new file mode 100644 index 0000000000000000000000000000000000000000..d6299eb11761d4926c4b738eab14875df7d739ac GIT binary patch literal 126023 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

    V&&h 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 C%>H@+ literal 0 HcmV?d00001 diff --git a/results/breakdown/imaging/fixed_light_trace_rectangular_jitvmap16_captured_pix1_libpdip_fbon_b16_hpc_a100_fp64_fixed_light_trace.json b/results/breakdown/imaging/fixed_light_trace_rectangular_jitvmap16_captured_pix1_libpdip_fbon_b16_hpc_a100_fp64_fixed_light_trace.json new file mode 100644 index 000000000..e30e03cc7 --- /dev/null +++ b/results/breakdown/imaging/fixed_light_trace_rectangular_jitvmap16_captured_pix1_libpdip_fbon_b16_hpc_a100_fp64_fixed_light_trace.json @@ -0,0 +1,5663 @@ +{ + "device": { + "backend": "gpu", + "device": "cuda:0", + "hostname": "euclid-ral-gpu-2", + "xla_flags": "--xla_disable_hlo_passes=constant_folding --xla_gpu_autotune_level=0 --xla_gpu_enable_triton_gemm=false", + "omp_num_threads": null, + "cpu_count": 124, + "jax_compilation_cache_dir": "/mnt/ral/jnightin/autolens_profiling_wt/certified-solver-phase-c1-lane-rate/output/jax_cache/fixed_light_lanerate_rectangular_pix1_time_16_pdip_on_350768_20", + "autotune_cache_entries_at_start": 0, + "cache_fresh": true, + "nvidia_smi": "NVIDIA A100 80GB PCIe, 35453 MiB, 81920 MiB" + }, + "machine": { + "cpu_model": "AMD EPYC 7702 64-Core Processor", + "cpu_count_os": 124, + "nproc": 4, + "nproc_all": 124, + "nproc_note": "GNU nproc honours OMP_NUM_THREADS, so `nproc` can print 1 on a multi-core host; `nproc_all` is the core count.", + "ram_total": "928298204 kB", + "kernel": "5.14.0-687.50.1.el9_8.x86_64", + "platform": "Linux-5.14.0-687.50.1.el9_8.x86_64-x86_64-with-glibc2.34", + "python": "3.12.4", + "jax_thread_env": { + "NPROC": null + }, + "blas_thread_env": { + "OMP_NUM_THREADS": null, + "OPENBLAS_NUM_THREADS": null, + "MKL_NUM_THREADS": null, + "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" + }, + "precision": "fp64", + "configuration": { + "pixel_scale_arcsec": 0.05, + "mask_radius_arcsec": 3.5, + "image_pixels_masked": 15361, + "over_sampled_pixels": 62752, + "mesh": "rectangular", + "mesh_shape": [ + 39, + 39 + ], + "source_pixels": 1521, + "source_pixels_requested": null, + "dataset": "hst", + "dataset_sha256": { + "data.fits": "e4e833a28e9c6f6fb023cd85c0d3dde74068720256bc77a240633500e5b04fac", + "noise_map.fits": "315c6266a0acd3ac9c8da82fcd2b45a08697362481fd7a35072bab1658530ba3", + "psf.fits": "8389ba0e8bf4a09b4a561cfc246181a2fb944ed396754cd0ff76fdd22910d303" + }, + "cell_source_sha256": "06a162fcdae6b329384ec33322f443df07215d86e56f0505ac15b3d3473eb432", + "inversion_path": "dense", + "pass_budget": 11, + "pass_budget_basis": "phase 3 (autolens_profiling#255): the smallest ZERO-fallback budget per mesh, the budget a production run fixes. NOT phase 0's certifying budget (2 for Delaunay), which falls back on 67.5 % of a graded draw set and is not a production cost.", + "border_relocator_mode": "cell", + "border_relocator": true, + "border_relocator_note": "'cell' is use_border_relocator=True, which every profiling cell in this family forces; 'library' passes None and takes the shipped config default, which is what production runs. The resolved boolean is what this leg actually ran.", + "routes_selected": [ + "b", + "d" + ], + "trace_calls": 10, + "command_buffers_traced": "off", + "use_mixed_precision": false, + "tau_rel": 1e-09, + "regularization": { + "scheme": "constant", + "coefficient": 1.0 + }, + "thread_env": { + "n_threads": null, + "vars": [ + "OPENBLAS_NUM_THREADS", + "MKL_NUM_THREADS", + "OMP_NUM_THREADS", + "VECLIB_MAXIMUM_THREADS", + "NUMEXPR_NUM_THREADS" + ], + "set_to": null, + "preexisting": {}, + "overridden": {}, + "note": "Not pinned (legacy variant): recorded as found." + }, + "over_sample_size_lp_rule": { + "sub_size_list": [ + 4, + 2, + 2 + ], + "radial_list": [ + 0.3, + 0.6 + ], + "centre": [ + 0.0, + 0.0 + ] + }, + "vmap_batch": 16, + "lanes": "captured", + "arms": [ + "vmap", + "scalar" + ], + "fallback": "on", + "draw_seed": 0, + "vmap_composition": "jax.jit(jax.vmap(fn))", + "lane_rtol": 1e-09, + "vmap_flags_note": "Strict ProfileCLI.parse_cell_args rejects unknown flags. These keys record the exact batching program and prevent historical vmap(jit) artifacts from being mistaken for current jit(vmap) measurements.", + "solver_source": "library", + "solver": "pdip", + "certified_fallback": "pdip", + "certified_pass_budget": 16, + "captured_pass": "time", + "batches": "/mnt/ral/jnightin/autolens_profiling_wt/certified-solver-phase-c1-lane-rate/results/breakdown/imaging/nautilus_batches_rectangular_pix1.npz" + }, + "solver_injection": { + "patched": null, + "part_v": "none \u2014 library mode selects the solver through al.Settings", + "part_b_route_d": { + "patched": "autoarray.inversion.inversion.inversion_util.reconstruction_positive_only_from", + "pass_budget": 11, + "fallback": true + }, + "note": "Library mode (phase B, #300): PART V's arms and references run the library's own positive-only solve, selected by Settings(positive_only_solver, certified_fallback, certified_pass_budget); nothing is injected. PART B's single-call route d (the fiducial d == b pin) still uses the phase-1 harness injection at the phase-3 budget and is not a phase-B row. The untimed certification report observes the library solve (library_solver_observed) without changing it." + }, + "routes": { + "b_s3_pdip": { + "label": "S3 PDIP (source-only)", + "status": "ok", + "solver": "library", + "ms": 38.99015970018809, + "log_likelihood": 28622.39485118912 + }, + "d_s3_certified_fallback": { + "label": "S3 certified active set, budget 11, PDIP fallback", + "status": "ok", + "solver": "harness-injected certified active set", + "pass_budget": 11, + "fallback": true, + "injected_solver_calls_jax": 1, + "injected_solver_calls_numpy": 0, + "ms": 30.333011699985946, + "log_likelihood": 28622.394851189252 + } + }, + "equivalence_pins": [ + { + "pin": "route d (certified, fallback) == route b (library PDIP)", + "route": "d_s3_certified_fallback", + "reference": "b_s3_pdip", + "expectation": "the certified active set returns the library's own positive solution", + "rtol": 1e-09, + "got": 28622.394851189252, + "reference_value": 28622.39485118912, + "rel_diff": 4.575691088611358e-15, + "status": "PASS" + } + ], + "equivalence_rtol": 1e-09, + "reference": { + "log_evidence_s0_library": 28622.394851199875, + "log_evidence_s3_library": 28622.39485119987, + "s3": { + "n_params": 1521, + "n_mapper": 1521, + "n_funcs": 0, + "edge_zeroed_pixels": 152, + "subtracted_light_flux": 5253.476646922047 + } + }, + "command_buffers": { + "wall_on_ms": 661.7818452999927, + "wall_off_ms": 667.6247766001325, + "command_buffer_delta_ms": 5.842931300139753, + "command_buffer_delta_pct": 0.8829089739521474, + "traced": "off", + "compiler_option": "xla_gpu_enable_command_buffer", + "probe": { + "note": "Not taken in --vmap-batch mode: the CUPTI-inside-a-CUDA-graph probe is a phase-1 diagnostic about the JOIN, and this mode already compiles and times both the command-buffers ON and OFF executable of every arm." + }, + "note": "ONE lowering, TWO compilations, one process. wall_on_ms is the PRODUCTION program (CUDA graphs as XLA ships them) and is the number comparable to phase 5's row; wall_off_ms is the graph-less program the stage rows attribute. The delta is the launch overhead the graphs remove \u2014 it lands in device_idle and host_outside_span, not in any stage. Reconciliation is computed against wall_off_ms." + }, + "trace": { + "parser": "ProfileData.from_file(xplane) + as_text() + stack_frame_index(proto field 17)", + "stage_audit": { + "mesh_construction": [ + { + "instruction": "fusion.2", + "ms": 0.14868716250000005, + "opcode": "fusion", + "shape": "(f64[15361,2]{1,0}, s64[15361,2]{1,0}, s32[15361,2]{1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:227", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:227 (create_transforms_rank)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:396 (_transforms_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:561 (adaptive_rectangular_mappings_weights_via_interpolation_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:693 (InterpolatorRectangular._mappings_sizes_weights)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "loop_select_fusion", + "ms": 0.039655062499999845, + "opcode": "fusion", + "shape": "(u32[2,15361]{1,0}, u32[2,15361]{1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:69", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:69 (forward_interp)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:573 (adaptive_rectangular_mappings_weights_via_interpolation_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:693 (InterpolatorRectangular._mappings_sizes_weights)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/abstract.py:36 (AbstractInterpolator.mappings)" + ] + }, + { + "instruction": "loop_select_fusion.1", + "ms": 0.03491270624999978, + "opcode": "fusion", + "shape": "(u32[15361]{0}, u32[15361]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:245", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:245 (create_transforms_rank)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:396 (_transforms_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:561 (adaptive_rectangular_mappings_weights_via_interpolation_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:693 (InterpolatorRectangular._mappings_sizes_weights)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "loop_select_fusion.4", + "ms": 0.034876706249999403, + "opcode": "fusion", + "shape": "(u32[15361]{0}, u32[15361]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:245", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:245 (create_transforms_rank)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:396 (_transforms_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:561 (adaptive_rectangular_mappings_weights_via_interpolation_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:693 (InterpolatorRectangular._mappings_sizes_weights)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "loop_add_fusion", + "ms": 0.020992356249999514, + "opcode": "fusion", + "shape": "s64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:69", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:69 (forward_interp)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:573 (adaptive_rectangular_mappings_weights_via_interpolation_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:693 (InterpolatorRectangular._mappings_sizes_weights)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/abstract.py:36 (AbstractInterpolator.mappings)" + ] + }, + { + "instruction": "loop_add_fusion.1", + "ms": 0.02043442499999958, + "opcode": "fusion", + "shape": "s64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:245", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:245 (create_transforms_rank)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:396 (_transforms_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:561 (adaptive_rectangular_mappings_weights_via_interpolation_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:693 (InterpolatorRectangular._mappings_sizes_weights)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "mixed_fusion": [ + { + "instruction": "loop_divide_gather_fusion", + "ms": 0.69834855, + "opcode": "fusion", + "shape": "(f64[15361,1,1,1521]{3,2,1,0}, f64[15361,1,1,1521]{3,2,1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:133", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:133 (curvature_matrix_via_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:93 (InversionImagingMapping.curvature_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:389 (AbstractInversion.curvature_reg_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "loop_add_multiply_fusion", + "ms": 0.08985887499999999, + "opcode": "fusion", + "shape": "(f64[1369,1369]{1,0}, f64[1369,1369]{1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:61", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:61 (initialize)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:72 (solve_nnls)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:129 (_solve_nnls_primal_with..primal)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:164 (solve_nnls_primal_with_status)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:508 (reconstruction_positive_only_from)" + ] + }, + { + "instruction": "input_transpose_fusion.3", + "ms": 0.03090203125, + "opcode": "fusion", + "shape": "f64[1521,1521]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986 (AbstractInversion._log_det_symmetric_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:1157 (AbstractInversion.log_det_regularization_matrix_term)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:348 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/model/analysis.py:135 (AnalysisImaging.log_likelihood_function)" + ] + }, + { + "instruction": "loop_reduce_fusion.1", + "ms": 0.02713931875000001, + "opcode": "fusion", + "shape": "f64[92,2]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:556", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:556 (adaptive_rectangular_mappings_weights_via_interpolation_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:693 (InterpolatorRectangular._mappings_sizes_weights)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/abstract.py:36 (AbstractInterpolator.mappings)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/abstract.py:167 (Mapper.pix_indexes_for_sub_slim_index)" + ] + }, + { + "instruction": "input_transpose_fusion.2", + "ms": 0.02566110000000001, + "opcode": "fusion", + "shape": "f64[1521,1521]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986 (AbstractInversion._log_det_symmetric_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:1078 (AbstractInversion.log_det_curvature_reg_matrix_term)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:347 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/model/analysis.py:135 (AnalysisImaging.log_likelihood_function)" + ] + }, + { + "instruction": "input_transpose_fusion.4", + "ms": 0.016269693750000005, + "opcode": "fusion", + "shape": "f64[1369,1369]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:62", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:62 (initialize)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:72 (solve_nnls)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:129 (_solve_nnls_primal_with..primal)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:164 (solve_nnls_primal_with_status)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:508 (reconstruction_positive_only_from)" + ] + } + ], + "ray_trace_data_grid": [ + { + "instruction": "input_reduce_fusion.16", + "ms": 0.0028033562499999998, + "opcode": "fusion", + "shape": "f64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:506", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:506 (FlatLambdaCDM._simpson_1d)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:644 (FlatLambdaCDM.angular_diameter_distance_kpc_z1z2)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:151 (LensingCosmology.angular_diameter_distance_between_redshifts_in_kpc_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:355 (LensingCosmology.scaling_factor_between_redshifts_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/lens/tracer_util.py:252 (traced_grid_2d_list_from)" + ] + }, + { + "instruction": "input_reduce_fusion.14", + "ms": 0.0027743375, + "opcode": "fusion", + "shape": "f64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:506", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:506 (FlatLambdaCDM._simpson_1d)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:644 (FlatLambdaCDM.angular_diameter_distance_kpc_z1z2)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:133 (LensingCosmology.angular_diameter_distance_to_earth_in_kpc_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:362 (LensingCosmology.scaling_factor_between_redshifts_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/lens/tracer_util.py:252 (traced_grid_2d_list_from)" + ] + }, + { + "instruction": "input_reduce_fusion.15", + "ms": 0.0026159812500000054, + "opcode": "fusion", + "shape": "f64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:503", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:503 (FlatLambdaCDM._simpson_1d)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:644 (FlatLambdaCDM.angular_diameter_distance_kpc_z1z2)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:133 (LensingCosmology.angular_diameter_distance_to_earth_in_kpc_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:362 (LensingCosmology.scaling_factor_between_redshifts_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/lens/tracer_util.py:252 (traced_grid_2d_list_from)" + ] + }, + { + "instruction": "input_reduce_fusion.17", + "ms": 0.00257735, + "opcode": "fusion", + "shape": "f64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:503", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:503 (FlatLambdaCDM._simpson_1d)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:644 (FlatLambdaCDM.angular_diameter_distance_kpc_z1z2)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:151 (LensingCosmology.angular_diameter_distance_between_redshifts_in_kpc_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:355 (LensingCosmology.scaling_factor_between_redshifts_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/lens/tracer_util.py:252 (traced_grid_2d_list_from)" + ] + }, + { + "instruction": "loop_divide_fusion.2", + "ms": 0.002070731250000002, + "opcode": "fusion", + "shape": "f64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:380", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:380 (LensingCosmology.scaling_factor_between_redshifts_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/lens/tracer_util.py:252 (traced_grid_2d_list_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/lens/tracer.py:632 (Tracer.traced_grid_2d_list_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/structures/decorators/abstract.py:93 (AbstractMaker.evaluate_func)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/structures/decorators/abstract.py:110 (AbstractMaker.result)" + ] + } + ], + "border_relocator": [ + { + "instruction": "eigh.0", + "ms": 0.07508699374999986, + "opcode": "custom-call", + "shape": "(f64[2,2]{0,1}, f64[2]{0}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:245", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:245 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:415 (BorderRelocator.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:83 (AbstractMesh.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/rectangular_rtu_adapt_density.py:267 (RectangularRTUAdaptDensity.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "custom-call.2", + "ms": 0.007893050000000006, + "opcode": "custom-call", + "shape": "(f64[2,2]{1,0}, s8[4194304]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:242", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:242 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:415 (BorderRelocator.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:83 (AbstractMesh.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/rectangular_rtu_adapt_density.py:267 (RectangularRTUAdaptDensity.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "input_reduce_fusion.11", + "ms": 0.005195931249999998, + "opcode": "fusion", + "shape": "(f64[], f64[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:270", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:270 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:415 (BorderRelocator.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:83 (AbstractMesh.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/rectangular_rtu_adapt_density.py:267 (RectangularRTUAdaptDensity.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "loop_add_fusion.7", + "ms": 0.00361134374999999, + "opcode": "fusion", + "shape": "f64[15361]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:308", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:308 (relocated_grid_via_ellipse_border_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:423 (BorderRelocator.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:83 (AbstractMesh.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/rectangular_rtu_adapt_density.py:267 (RectangularRTUAdaptDensity.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "input_concatenate_fusion.1", + "ms": 0.0035696999999999973, + "opcode": "fusion", + "shape": "f64[15361,2]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:323", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:323 (relocated_grid_via_ellipse_border_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:423 (BorderRelocator.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:83 (AbstractMesh.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/rectangular_rtu_adapt_density.py:267 (RectangularRTUAdaptDensity.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "loop_select_sine_fusion", + "ms": 0.0033085562499999993, + "opcode": "fusion", + "shape": "(f64[], f64[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:301", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:301 (relocated_grid_via_ellipse_border_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:423 (BorderRelocator.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:83 (AbstractMesh.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/rectangular_rtu_adapt_density.py:267 (RectangularRTUAdaptDensity.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + } + ], + "other": [ + { + "instruction": "copy.31", + "ms": 0.030478974999999475, + "opcode": "copy", + "shape": "u32[2,15361]{1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "copy.32", + "ms": 0.0303792312499996, + "opcode": "copy", + "shape": "u32[2,15361]{1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "copy.49", + "ms": 0.02871175000000049, + "opcode": "copy", + "shape": "u32[15361]{0}", + "source": "", + "stack": [] + }, + { + "instruction": "copy.41", + "ms": 0.02867093750000055, + "opcode": "copy", + "shape": "u32[15361]{0}", + "source": "", + "stack": [] + }, + { + "instruction": "copy.50", + "ms": 0.028484112500000856, + "opcode": "copy", + "shape": "u32[15361]{0}", + "source": "", + "stack": [] + }, + { + "instruction": "copy.40", + "ms": 0.028408175000000962, + "opcode": "copy", + "shape": "u32[15361]{0}", + "source": "", + "stack": [] + } + ], + "mapping_matrix": [ + { + "instruction": "loop_broadcast_fusion.1", + "ms": 0.13644355, + "opcode": "fusion", + "shape": "f64[15361,1521]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:342", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:342 (mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/abstract.py:283 (Mapper.mapping_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:91 (AbstractInversionImaging._mapping_matrix_for_convolution_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:137 (AbstractInversionImaging.operated_mapping_matrix_list)" + ] + }, + { + "instruction": "input_reduce_fusion.25", + "ms": 0.0028621500000000004, + "opcode": "fusion", + "shape": "f64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:93", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:93 (adaptive_pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/abstract.py:507 (Mapper.pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt.py:339 (Adapt.regularization_weights_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt.py:362 (Adapt.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)" + ] + }, + { + "instruction": "loop_divide_fusion.1", + "ms": 0.002349793750000001, + "opcode": "fusion", + "shape": "f64[1521]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:92", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:92 (adaptive_pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/abstract.py:507 (Mapper.pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt.py:339 (Adapt.regularization_weights_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt.py:362 (Adapt.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)" + ] + } + ], + "regularization_H": [ + { + "instruction": "loop_broadcast_fusion.2", + "ms": 0.019296431249999992, + "opcode": "fusion", + "shape": "(f64[1521,1521]{1,0}, f64[1521,1521]{1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt.py:111", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt.py:111 (weighted_regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt.py:366 (Adapt.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:332 (AbstractInversion.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "input_scatter_fusion.8", + "ms": 0.0028075500000000024, + "opcode": "fusion", + "shape": "f64[1521,1521]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt.py:123", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt.py:123 (weighted_regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt.py:366 (Adapt.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:332 (AbstractInversion.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "psf_convolution_mapping_matrix": [ + { + "instruction": "fft.19.0", + "ms": 1.78361086875, + "opcode": "fft", + "shape": "f64[1521,180,180]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "input_scatter_fusion", + "ms": 1.5050567187499995, + "opcode": "fusion", + "shape": "f64[1521,180,180]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "fft.15.0", + "ms": 1.3871463687500003, + "opcode": "fft", + "shape": "c128[1521,180,91]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "fft.17.0", + "ms": 0.9924331812499999, + "opcode": "fft", + "shape": "c128[1521,91,180]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "input_transpose_fusion.1", + "ms": 0.5220780812500002, + "opcode": "fusion", + "shape": "c128[1521,91,180]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "wrapped_transpose.2", + "ms": 0.5072184624999998, + "opcode": "fusion", + "shape": "c128[1521,180,91]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + } + ], + "curvature_matrix_F": [ + { + "instruction": "cublas-lt-matmul.2", + "ms": 4.378591162499999, + "opcode": "custom-call", + "shape": "(f64[1521,1521]{1,0}, s8[4194304]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:134", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:134 (curvature_matrix_via_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:93 (InversionImagingMapping.curvature_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:389 (AbstractInversion.curvature_reg_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "data_vector_D": [ + { + "instruction": "input_reduce_fusion.7", + "ms": 0.1137388000000001, + "opcode": "fusion", + "shape": "f64[92,1521]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/inversion_imaging_util.py:123", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/inversion_imaging_util.py:123 (data_vector_via_blurred_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:67 (InversionImagingMapping.data_vector)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:699 (AbstractInversion.reconstruction)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "input_reduce_fusion.23", + "ms": 0.003733112499999998, + "opcode": "fusion", + "shape": "f64[1521]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/inversion_imaging_util.py:123", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/inversion_imaging_util.py:123 (data_vector_via_blurred_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:67 (InversionImagingMapping.data_vector)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:699 (AbstractInversion.reconstruction)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "inversion_other": [ + { + "instruction": "cholesky.60", + "ms": 0.9182304375000017, + "opcode": "custom-call", + "shape": "(f64[1521,1521]{0,1}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986 (AbstractInversion._log_det_symmetric_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:1078 (AbstractInversion.log_det_curvature_reg_matrix_term)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:347 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/model/analysis.py:135 (AnalysisImaging.log_likelihood_function)" + ] + }, + { + "instruction": "cholesky.70", + "ms": 0.900068837500001, + "opcode": "custom-call", + "shape": "(f64[1521,1521]{0,1}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986 (AbstractInversion._log_det_symmetric_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:1157 (AbstractInversion.log_det_regularization_matrix_term)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:348 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/model/analysis.py:135 (AnalysisImaging.log_likelihood_function)" + ] + }, + { + "instruction": "input_reduce_fusion.13", + "ms": 0.018974237499999998, + "opcode": "fusion", + "shape": "f64[1521]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:946", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:946 (AbstractInversion.regularization_term)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:346 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/model/analysis.py:135 (AnalysisImaging.log_likelihood_function)", + "/mnt/ral/jnightin/autolens_profiling_wt/certified-solver-phase-c1-lane-rate/scripts/imaging/likelihood_breakdown/fixed_light_trace.py:1195 (_captured_likelihood_fn.._likelihood)" + ] + }, + { + "instruction": "loop_reduce_window_fusion.3", + "ms": 0.0057904937499999925, + "opcode": "fusion", + "shape": "s64[6,16]{1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "input_scatter_fusion.11", + "ms": 0.003821343750000001, + "opcode": "fusion", + "shape": "pred[1521]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:526", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:526 (AbstractInversion.zeroed_ids_to_keep)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:567 (AbstractInversion.solve_ids_to_keep)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:684 (AbstractInversion.reconstruction)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "loop_reduce_window_fusion.2", + "ms": 0.003105518750000003, + "opcode": "fusion", + "shape": "s64[86,16]{1,0}", + "source": "", + "stack": [] + } + ], + "pdip_solve": [ + { + "instruction": "cholesky.20", + "ms": 14.245732850000072, + "opcode": "custom-call", + "shape": "(f64[1369,1369]{0,1}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:106", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:106 (factorize_kkt)", + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:212 (pdip_pc_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:83 (solve_nnls)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:129 (_solve_nnls_primal_with..primal)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:164 (solve_nnls_primal_with_status)" + ] + }, + { + "instruction": "triangular-solve", + "ms": 2.1669083187500173, + "opcode": "custom-call", + "shape": "(f64[1369,1]{0,1}, s8[0]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146 (solve_kkt_rhs)", + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:213 (pdip_pc_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:83 (solve_nnls)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:129 (_solve_nnls_primal_with..primal)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:164 (solve_nnls_primal_with_status)" + ] + }, + { + "instruction": "triangular-solve.2", + "ms": 2.078144474999935, + "opcode": "custom-call", + "shape": "(f64[1369,1]{0,1}, s8[0]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146 (solve_kkt_rhs)", + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:217 (pdip_pc_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:83 (solve_nnls)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:129 (_solve_nnls_primal_with..primal)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:164 (solve_nnls_primal_with_status)" + ] + }, + { + "instruction": "triangular-solve.3", + "ms": 2.0590597437499127, + "opcode": "custom-call", + "shape": "(f64[1369,1]{0,1}, s8[0]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146 (solve_kkt_rhs)", + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:217 (pdip_pc_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:83 (solve_nnls)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:129 (_solve_nnls_primal_with..primal)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:164 (solve_nnls_primal_with_status)" + ] + }, + { + "instruction": "triangular-solve.1", + "ms": 2.004522081249921, + "opcode": "custom-call", + "shape": "(f64[1369,1]{0,1}, s8[0]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146 (solve_kkt_rhs)", + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:213 (pdip_pc_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:83 (solve_nnls)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:129 (_solve_nnls_primal_with..primal)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:164 (solve_nnls_primal_with_status)" + ] + }, + { + "instruction": "cholesky.40", + "ms": 0.8455922750000019, + "opcode": "custom-call", + "shape": "(f64[1369,1369]{0,1}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:62", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:62 (initialize)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:72 (solve_nnls)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:129 (_solve_nnls_primal_with..primal)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:164 (solve_nnls_primal_with_status)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:508 (reconstruction_positive_only_from)" + ] + } + ], + "mapped_reconstruction": [ + { + "instruction": "input_reduce_fusion.10", + "ms": 0.11175244374999993, + "opcode": "fusion", + "shape": "f64[15361]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:163", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:163 (mapped_reconstructed_data_via_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:120 (InversionImagingMapping._mapped_reconstructed_data_dict_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:196 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + } + ], + "chi_squared_evidence": [ + { + "instruction": "input_reduce_fusion.22", + "ms": 0.0038462874999999975, + "opcode": "fusion", + "shape": "f64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_util.py:104", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_util.py:104 (noise_normalization_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:98 (AbstractFit.noise_normalization)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:306 (FitDataset.noise_normalization)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:349 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)" + ] + }, + { + "instruction": "input_reduce_fusion.24", + "ms": 0.003808350000000001, + "opcode": "fusion", + "shape": "f64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_util.py:90", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_util.py:90 (chi_squared_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:87 (AbstractFit.chi_squared)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:293 (FitDataset.chi_squared)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:345 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)" + ] + }, + { + "instruction": "loop_multiply_fusion.2", + "ms": 0.0029753624999999955, + "opcode": "fusion", + "shape": "f64[15361]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/abstract_ndarray.py:300", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/abstract_ndarray.py:300 (AbstractNDArray.__pow__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/abstract_ndarray.py:60 (unwrap_array..wrapper)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/abstract_ndarray.py:35 (to_new_array..wrapper)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_util.py:78 (chi_squared_map_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:78 (AbstractFit.chi_squared_map)" + ] + } + ] + }, + "stage_audit_note": "The HLO instructions that contributed most of each stage's milliseconds, with their full source stack. A stage row is only as good as the rules that built it; this is how a reader checks a row against the HLO instead of trusting it.", + "untraced_wall_ms": 41.72168969375889, + "reconciliation_vs_untraced_pct": 2.5323308038244132, + "wall_basis": "wall_ms is the TRACED run's wall, the run these kernel durations came from. untraced_wall_ms is the same executable without the profiler; the difference is the profiler's overhead and belongs in neither the stages nor the idle row.", + "calls": 160, + "call_split": "per-call (first-instruction recurrence)", + "call_blocks": 160, + "events": 149920, + "streams": [ + "Stream #14(MemcpyD2H,Compute,MemcpyH2D,Memset,MemcpyD2D)" + ], + "per_stage_ms": { + "border_relocator": { + "median_ms": 0.10588700000000002, + "min_ms": 0.10514500000000002, + "max_ms": 0.26473800000000003 + }, + "chi_squared_evidence": { + "median_ms": 0.010608, + "min_ms": 0.010303, + "max_ms": 0.011040000000000001 + }, + "curvature_matrix_F": { + "median_ms": 4.3614075, + "min_ms": 4.336079, + "max_ms": 4.532242 + }, + "data_vector_D": { + "median_ms": 0.11744149999999999, + "min_ms": 0.11657200000000001, + "max_ms": 0.118588 + }, + "inversion_other": { + "median_ms": 1.8648995000000002, + "min_ms": 1.8517009999999998, + "max_ms": 1.8848850000000001 + }, + "mapped_reconstruction": { + "median_ms": 0.1117135, + "min_ms": 0.111073, + "max_ms": 0.112604 + }, + "mapping_matrix": { + "median_ms": 0.141658, + "min_ms": 0.141593, + "max_ms": 0.141786 + }, + "memset": { + "median_ms": 0.05356750000000002, + "min_ms": 0.038175, + "max_ms": 0.06268900000000001 + }, + "mesh_construction": { + "median_ms": 0.38247850000000005, + "min_ms": 0.37994000000000033, + "max_ms": 0.38427200000000006 + }, + "mixed_fusion": { + "median_ms": 0.9923545000000001, + "min_ms": 0.989497, + "max_ms": 0.9949700000000001 + }, + "other": { + "median_ms": 0.19586199999999968, + "min_ms": 0.19480499999999976, + "max_ms": 0.1963349999999997 + }, + "pdip_solve": { + "median_ms": 25.223602499999984, + "min_ms": 18.133828999999995, + "max_ms": 29.62129000000002 + }, + "psf_convolution_mapping_matrix": { + "median_ms": 6.9307155, + "min_ms": 6.907947, + "max_ms": 6.949066999999999 + }, + "ray_trace_data_grid": { + "median_ms": 0.012832000000000001, + "min_ms": 0.012735, + "max_ms": 0.013056000000000002 + }, + "regularization_H": { + "median_ms": 0.0220635, + "min_ms": 0.021505, + "max_ms": 0.023230999999999998 + } + }, + "stage_order": [ + "ray_trace_data_grid", + "border_relocator", + "mesh_construction", + "mapping_matrix", + "psf_convolution_mapping_matrix", + "data_vector_D", + "curvature_matrix_F", + "regularization_H", + "pdip_solve", + "mapped_reconstruction", + "chi_squared_evidence", + "inversion_other", + "mixed_fusion", + "other", + "memset" + ], + "mixed_fusion": { + "ms": 0.9923545000000001, + "constituent_stage_sets": { + "curvature_matrix_F + psf_convolution_mapping_matrix": 0.69834855, + "inversion_other + mapped_reconstruction + pdip_solve + reconstruction_scatter": 0.08985887499999999, + "inversion_other + regularization_H": 0.03090203125, + "border_relocator + mesh_construction": 0.030603243750000016, + "curvature_reg_reduce_gather + inversion_other": 0.02566110000000001, + "border_relocator + inversion_other + mapping_matrix + mesh_construction": 0.02049218125000001, + "border_relocator + pdip_solve": 0.016269693750000005, + "inversion_other + mapping_matrix + regularization_H": 0.015486306249999976, + "inversion_other + mapping_matrix + mesh_construction": 0.012841743749999999, + "grids_and_structures + mass_profile_deflections": 0.010084231249999995, + "inversion_other + mapped_reconstruction + reconstruction_scatter": 0.009653781250000002, + "inversion_other + mapped_reconstruction": 0.00894964375, + "inversion_other + mesh_construction": 0.005592074999999995, + "grids_and_structures + mass_profile_deflections + ray_trace_data_grid": 0.005271243749999998, + "inversion_other + ray_trace_data_grid": 0.004773912499999996, + "border_relocator + inversion_other": 0.0033671562500000017, + "border_relocator + inversion_other + mesh_construction": 0.0024583437500000044, + "chi_squared_evidence + inversion_other": 0.0017903500000000007 + }, + "example_kernels": { + "curvature_matrix_F + psf_convolution_mapping_matrix": [ + "loop_divide_gather_fusion" + ], + "inversion_other + mapped_reconstruction + pdip_solve + reconstruction_scatter": [ + "loop_add_multiply_fusion" + ], + "inversion_other + regularization_H": [ + "input_transpose_fusion.3" + ], + "border_relocator + mesh_construction": [ + "loop_reduce_fusion.1", + "loop_select_fusion.5" + ], + "curvature_reg_reduce_gather + inversion_other": [ + "input_transpose_fusion.2" + ], + "border_relocator + inversion_other + mapping_matrix + mesh_construction": [ + "input_scatter_fusion.6", + "input_scatter_fusion.10" + ], + "border_relocator + pdip_solve": [ + "input_transpose_fusion.4" + ], + "inversion_other + mapping_matrix + regularization_H": [ + "input_scatter_fusion.4", + "input_scatter_fusion.5", + "input_scatter_fusion.2", + "input_scatter_fusion.3" + ], + "inversion_other + mapping_matrix + mesh_construction": [ + "input_scatter_fusion.7" + ], + "grids_and_structures + mass_profile_deflections": [ + "loop_divide_minimum_multiply_sine_sqrt_fusion", + "loop_slice_fusion" + ] + }, + "prorated_estimate_ms": { + "curvature_matrix_F": 0.349174275, + "psf_convolution_mapping_matrix": 0.349174275, + "inversion_other": 0.08158595677083331, + "border_relocator": 0.031062540104166682, + "pdip_solve": 0.030599565625, + "mapped_reconstruction": 0.03015746770833333, + "mesh_construction": 0.028320733854166672, + "reconstruction_scatter": 0.02568264583333333, + "regularization_H": 0.020613117708333326, + "mapping_matrix": 0.014565728645833328, + "curvature_reg_reduce_gather": 0.012830550000000005, + "grids_and_structures": 0.006799196874999997, + "mass_profile_deflections": 0.006799196874999997, + "ray_trace_data_grid": 0.004144037499999998, + "chi_squared_evidence": 0.0008951750000000003 + }, + "prorated_note": "ESTIMATE ONLY \u2014 a mixed fusion's time split equally across the stages its constituents span. Never summed into the measured table, never reconciled." + }, + "other_sources_ms": { + "copy.31": 0.030478974999999475, + "copy.32": 0.0303792312499996, + "copy.49": 0.02871175000000049, + "copy.41": 0.02867093750000055, + "copy.50": 0.028484112500000856, + "copy.40": 0.028408175000000962, + "loop_reduce_window_fusion": 0.006472906250000008, + "loop_reduce_window_fusion.1": 0.004344731249999991, + "copy.69": 0.0017843499999999992, + "loop_broadcast_fusion.3": 0.001777775, + "copy.90": 0.0016805625000000017, + "copy.33": 0.0015455687499999983, + "copy.42": 0.0015387749999999985, + "copy.24": 0.001530781249999998 + }, + "device_span_ms": 42.78826123125, + "device_busy_ms": 40.5371313375, + "device_idle_ms": 2.2511298937499973, + "largest_idle_gaps": [ + { + "gap_ms": 0.052894, + "after": "while.28", + "before": "input_scatter_fusion.1" + }, + { + "gap_ms": 0.04707, + "after": "input_concatenate_fusion.4", + "before": "custom-call.2" + }, + { + "gap_ms": 0.036286, + "after": "loop_multiply_fusion.3", + "before": "eigh.0" + }, + { + "gap_ms": 0.033407, + "after": "loop_add_fusion.5", + "before": "loop_select_fusion.4" + }, + { + "gap_ms": 0.032767, + "after": "eigh.0", + "before": "eigh.0" + }, + { + "gap_ms": 0.025247, + "after": "eigh.0", + "before": "eigh.0" + }, + { + "gap_ms": 0.022911, + "after": "loop_add_fusion.1", + "before": "loop_select_fusion.1" + }, + { + "gap_ms": 0.020639, + "after": "loop_broadcast_fusion.6", + "before": "loop_broadcast_fusion.8" + } + ], + "kernel_ms": 40.527090999999984, + "sum_ms": 42.77822089374998, + "wall_ms": 42.793087456243484, + "host_outside_span_ms": 0.004826224993486505, + "reconciliation_pct": -0.034740569978044485, + "unjoined_ms": 0.0, + "unjoined_pct": 0.0, + "other_ms": 0.19586199999999968, + "other_pct": 0.457695416812987, + "note": "Stage rows attribute the command-buffers-OFF program (see the module docstring): kernel times are the same, the launch overhead the CUDA graphs remove is not. sum_ms = kernel rows + device_idle_ms; the residual against wall_ms is host_outside_span_ms (dispatch before the first kernel, teardown after the last).", + "per_stage_ms_per_lane": { + "border_relocator": 0.10588700000000002, + "chi_squared_evidence": 0.010608, + "curvature_matrix_F": 4.3614075, + "data_vector_D": 0.11744149999999999, + "inversion_other": 1.8648995000000002, + "mapped_reconstruction": 0.1117135, + "mapping_matrix": 0.141658, + "memset": 0.05356750000000002, + "mesh_construction": 0.38247850000000005, + "mixed_fusion": 0.9923545000000001, + "other": 0.19586199999999968, + "pdip_solve": 25.223602499999984, + "psf_convolution_mapping_matrix": 6.9307155, + "ray_trace_data_grid": 0.012832000000000001, + "regularization_H": 0.0220635 + }, + "per_lane_divisor": 1, + "host_callback": { + "pure_callback_span_ms": 0, + "qhull_ms": 0.0, + "callback_body_ms_note": "the OUTERMOST matching body event, not a sum: under the probe the body appears twice (the wrapper and the timed re-implementation it calls) and summing them would count the same work twice", + "events_by_name": { + "ThenExecuteCallback:GetEventForComputeStreamSyncPoint": { + "count": 160, + "ms": 0.2949737000000001 + } + }, + "note": "HOST milliseconds per traced BATCH (the whole invocation), aggregated by name because the events nest. Not a row of the device table: the device pays for them as the idle gaps largest_idle_gaps names." + }, + "host_callback_ms": 0 + }, + "hlo_census": { + "status": "excluded", + "reason": "The legacy census anchors PyAutoArray source line numbers that moved after the phase-1 run. No batched attribution is published from unsupported anchors; the device-event table and wall reconciliation remain valid." + }, + "stage_map_provenance": [ + { + "label": "log_det_curvature_reg", + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 850, + 882 + ], + "requires": { + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 884, + 896 + ] + }, + "function": null + }, + { + "label": "log_det_regularization", + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 850, + 882 + ], + "requires": { + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 897, + 943 + ] + }, + "function": null + }, + { + "label": "curvature_reg_add", + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 359, + 372 + ], + "requires": null, + "function": null + }, + { + "label": "curvature_reg_reduce_gather", + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 374, + 398 + ], + "requires": null, + "function": null + }, + { + "label": "edge_subset_gather", + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 606, + 614 + ], + "requires": null, + "function": null + }, + { + "label": "regularization_term", + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 786, + 849 + ], + "requires": null, + "function": null + }, + { + "label": "mapped_reconstruction", + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 722, + 785 + ], + "requires": null, + "function": null + }, + { + "label": "reconstruction_scatter", + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 583, + 605 + ], + "requires": null, + "function": null + }, + { + "label": "reconstruction_scatter", + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 615, + 721 + ], + "requires": null, + "function": null + }, + { + "label": "certified_active_set_solve", + "path": "likelihood_breakdown/active_set_steps.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "certified_active_set_solve", + "path": "likelihood_breakdown/library_solver_injection.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "pdip_solve", + "path": "PyAutoArray/autoarray/util/jax_nnls.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "pdip_solve", + "path": "PyAutoArray/autoarray/inversion/inversion/inversion_util.py", + "lines": [ + 256, + 488 + ], + "requires": null, + "function": null + }, + { + "label": "mapped_reconstruction", + "path": "PyAutoArray/autoarray/inversion/inversion/inversion_util.py", + "lines": [ + 156, + 200 + ], + "requires": null, + "function": null + }, + { + "label": "curvature_matrix_F", + "path": "PyAutoArray/autoarray/inversion/inversion/inversion_util.py", + "lines": [ + 12, + 155 + ], + "requires": null, + "function": null + }, + { + "label": "reconstruction_scatter", + "path": "PyAutoArray/autoarray/inversion/inversion/inversion_util.py", + "lines": [ + 201, + 255 + ], + "requires": null, + "function": null + }, + { + "label": "data_vector_D", + "path": "PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py", + "lines": [ + 54, + 73 + ], + "requires": null, + "function": null + }, + { + "label": "curvature_matrix_F", + "path": "PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py", + "lines": [ + 74, + 110 + ], + "requires": null, + "function": null + }, + { + "label": "data_vector_D", + "path": "PyAutoArray/autoarray/inversion/inversion/imaging/inversion_imaging_util.py", + "lines": null, + "requires": null, + "function": "data_vector_via_blurred_mapping_matrix_from" + }, + { + "label": "curvature_matrix_F", + "path": "PyAutoArray/autoarray/inversion/inversion/imaging/inversion_imaging_util.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "psf_convolution_mapping_matrix", + "path": "likelihood_breakdown/psf_cube_injection.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "psf_convolution_mapping_matrix", + "path": "PyAutoArray/autoarray/operators/convolver.py", + "lines": [ + 1086, + 1300 + ], + "requires": null, + "function": null + }, + { + "label": "psf_convolution_mapping_matrix", + "path": "PyAutoArray/autoarray/operators/convolver.py", + "lines": [ + 632, + 642 + ], + "requires": null, + "function": null + }, + { + "label": "psf_convolution_mapping_matrix", + "path": "PyAutoArray/autoarray/operators/convolver.py", + "lines": [ + 670, + 691 + ], + "requires": null, + "function": null + }, + { + "label": "psf_convolution_mapping_matrix", + "path": "PyAutoArray/autoarray/operators/convolver.py", + "lines": null, + "requires": { + "path": "PyAutoArray/autoarray/operators/convolver.py", + "lines": [ + 1086, + 1300 + ] + }, + "function": null + }, + { + "label": "psf_convolution_mapping_matrix", + "path": "PyAutoArray/autoarray/operators/convolver.py", + "lines": null, + "requires": { + "path": "PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py", + "lines": [ + 119, + 150 + ] + }, + "function": null + }, + { + "label": "psf_convolution_image", + "path": "PyAutoArray/autoarray/operators/convolver.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "psf_convolution_mapping_matrix", + "path": "PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py", + "lines": [ + 119, + 150 + ], + "requires": null, + "function": null + }, + { + "label": "mesh_qhull_callback", + "path": "PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py", + "lines": [ + 139, + 172 + ], + "requires": null, + "function": null + }, + { + "label": "mesh_seed_argmin", + "path": "PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py", + "lines": [ + 173, + 207 + ], + "requires": null, + "function": null + }, + { + "label": "mesh_locate_walk", + "path": "PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py", + "lines": [ + 208, + 372 + ], + "requires": null, + "function": null + }, + { + "label": "mesh_dual_areas", + "path": "PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py", + "lines": [ + 373, + 396 + ], + "requires": null, + "function": null + }, + { + "label": "mesh_dual_areas", + "path": "PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py", + "lines": [ + 437, + 494 + ], + "requires": null, + "function": null + }, + { + "label": "mesh_dual_areas", + "path": "PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py", + "lines": [ + 605, + 615 + ], + "requires": null, + "function": null + }, + { + "label": "mesh_interpolation_weights", + "path": "PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py", + "lines": [ + 616, + 695 + ], + "requires": null, + "function": null + }, + { + "label": "mesh_interpolation_weights", + "path": "PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py", + "lines": [ + 896, + 1000 + ], + "requires": null, + "function": null + }, + { + "label": "mesh_construction", + "path": "PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "border_relocator", + "path": "PyAutoArray/autoarray/inversion/mesh/border_relocator.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "mesh_construction", + "path": "PyAutoArray/autoarray/inversion/mesh/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "mapping_matrix", + "path": "PyAutoArray/autoarray/inversion/mappers/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "mapping_matrix", + "path": "PyAutoArray/autoarray/inversion/mappings/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "mapping_matrix", + "path": "PyAutoArray/autoarray/inversion/linear_obj/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "regularization_H", + "path": "PyAutoArray/autoarray/inversion/regularization/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "chi_squared_evidence", + "path": "PyAutoArray/autoarray/fit/fit_util.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "chi_squared_evidence", + "path": "PyAutoArray/autoarray/fit/fit_dataset.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "ray_trace_mesh_grid", + "path": "PyAutoLens/autolens/lens/to_inversion.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "ray_trace_mesh_grid", + "path": "PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "mass_profile_deflections", + "path": "PyAutoGalaxy/autogalaxy/profiles/mass/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "light_profile_image", + "path": "PyAutoGalaxy/autogalaxy/profiles/light/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "light_profile_image", + "path": "PyAutoGalaxy/autogalaxy/operate/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "ray_trace_data_grid", + "path": "PyAutoLens/autolens/lens/tracer.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "ray_trace_data_grid", + "path": "PyAutoLens/autolens/lens/tracer_util.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "grids_and_structures", + "path": "PyAutoArray/autoarray/structures/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "grids_and_structures", + "path": "PyAutoArray/autoarray/operators/over_sampling/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "grids_and_structures", + "path": "PyAutoArray/autoarray/geometry/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "inversion_other", + "path": "PyAutoArray/autoarray/inversion/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "fit_imaging_other", + "path": "PyAutoLens/autolens/imaging/fit_imaging.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "fit_imaging_other", + "path": "PyAutoGalaxy/autogalaxy/imaging/fit_imaging.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "fit_imaging_other", + "path": "PyAutoArray/autoarray/fit/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "analysis_other", + "path": "PyAutoLens/autolens/analysis/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "analysis_other", + "path": "PyAutoGalaxy/autogalaxy/analysis/", + "lines": null, + "requires": null, + "function": null + } + ], + "trace_timing": { + "traced_wall_ms": 42.793087456243484, + "untraced_wall_ms": 41.72168969375889, + "profiler_overhead_ms": 1.0713977624845938, + "profiler_overhead_pct": 2.567963498958824 + }, + "jit_phases": { + "b_s3_pdip_library_likelihood_jit": { + "lower_s": 1.2723002359998645, + "compile_s": 3.444784950999747, + "first_call_s": 0.10170477900101105, + "steady_per_call_s": 0.038990159700188085 + }, + "d_s3_certified_fallback_library_likelihood_jit": { + "lower_s": 0.47242535400073393, + "compile_s": 3.68565623899849, + "first_call_s": 0.040132984999218024, + "steady_per_call_s": 0.030333011699985944 + } + }, + "peak_bytes": { + "after_setup": 85616640, + "after_routes": 1197479168, + "after_all": 19155302144, + "note": "jax.devices()[0].memory_stats()['peak_bytes_in_use']; None on a backend that does not report it (CPU). Process-wide high-water marks." + }, + "note": "Every stage row is a MEASURED sum of GPU kernel durations joined to library source through the optimized HLO of ONE program \u2014 not arithmetic across compilations. The rows attribute the command-buffers-OFF program: kernel time is the same as production, the launch overhead the CUDA graphs remove is not, and command_buffers.* carries both walls and their delta. sum_ms = kernel rows + measured device_idle_ms; the residual against the wall is host_outside_span_ms and is reported, not absorbed. mixed_fusion.prorated_estimate_ms is an ESTIMATE and is never part of the table. No row may be quoted if reconciliation_pct is outside 5 % or unjoined_ms is non-zero.", + "vmap": { + "batch": 16, + "lanes_mode": "captured", + "arms": [ + "vmap", + "scalar" + ], + "draw_seed": 0, + "fallback": true, + "composition": "jax.jit(jax.vmap(fn))", + "composition_provenance": "Current Fitness._vmap after PyAutoFit#1638. Array 343376 used the retired jax.vmap(jax.jit(fn)) composition and is historical evidence only.", + "headline_arm": "scalar", + "lane_rtol": 1e-09, + "lanes": [ + { + "lane": 0, + "draw_name": "call00015_lane00", + "draw_kind": "captured", + "offsets": { + "centre_0": 0.0017002711605432041, + "centre_1": -0.009377257327484623, + "ell_comps_0": -0.002548851608736212, + "ell_comps_1": -0.004262475027349674, + "einstein_radius": -0.0230617600435421 + }, + "log_likelihood_vmap": 18463.07897110663, + "log_likelihood_scalar": 18463.078970707007, + "log_likelihood_library_pdip": 18463.07897110663, + "log_likelihood_library_pdip_scalar": 18463.078970707007, + "rel_diff_vmap_vs_library_pdip": 0.0, + "rel_diff_scalar_vs_library_pdip_scalar": 0.0, + "abs_diff_nats": 3.996246960014105e-07, + "rel_diff": 2.1644531588444352e-11, + "rel_diff_scalar_vs_library_pdip": 2.1644531587975868e-11, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 3.996246960014105e-07, + "rel_diff_library_pdip_vmap_vs_scalar": 2.1644531588444352e-11, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": null, + "passes": null, + "pdip_iter": null + }, + { + "lane": 1, + "draw_name": "call00015_lane01", + "draw_kind": "captured", + "offsets": { + "centre_0": 0.00044835385344320865, + "centre_1": -0.003464237160596487, + "ell_comps_0": -0.0010036884316776545, + "ell_comps_1": 0.0020035511501456356, + "einstein_radius": -0.05761540720338343 + }, + "log_likelihood_vmap": 15734.21749647698, + "log_likelihood_scalar": 15734.21749633948, + "log_likelihood_library_pdip": 15734.21749647698, + "log_likelihood_library_pdip_scalar": 15734.21749633948, + "rel_diff_vmap_vs_library_pdip": 0.0, + "rel_diff_scalar_vs_library_pdip_scalar": 0.0, + "abs_diff_nats": 1.3750104699283838e-07, + "rel_diff": 8.738982222968992e-12, + "rel_diff_scalar_vs_library_pdip": 8.738982222892622e-12, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 1.3750104699283838e-07, + "rel_diff_library_pdip_vmap_vs_scalar": 8.738982222968992e-12, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": null, + "passes": null, + "pdip_iter": null + }, + { + "lane": 2, + "draw_name": "call00015_lane02", + "draw_kind": "captured", + "offsets": { + "centre_0": 0.0017572218110215735, + "centre_1": 0.0022774942133795186, + "ell_comps_0": 0.0023932647815035485, + "ell_comps_1": -0.011727950927316913, + "einstein_radius": -0.027234805142873908 + }, + "log_likelihood_vmap": 18706.165986625834, + "log_likelihood_scalar": 18706.16598652238, + "log_likelihood_library_pdip": 18706.165986625834, + "log_likelihood_library_pdip_scalar": 18706.16598652238, + "rel_diff_vmap_vs_library_pdip": 0.0, + "rel_diff_scalar_vs_library_pdip_scalar": 0.0, + "abs_diff_nats": 1.0345320333726704e-07, + "rel_diff": 5.530433302676995e-12, + "rel_diff_scalar_vs_library_pdip": 5.530433302646409e-12, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 1.0345320333726704e-07, + "rel_diff_library_pdip_vmap_vs_scalar": 5.530433302676995e-12, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": null, + "passes": null, + "pdip_iter": null + }, + { + "lane": 3, + "draw_name": "call00015_lane03", + "draw_kind": "captured", + "offsets": { + "centre_0": -0.002862791114730316, + "centre_1": 0.0038524808804676603, + "ell_comps_0": 0.006111415425061918, + "ell_comps_1": -0.022191169695991525, + "einstein_radius": -0.03531000166767062 + }, + "log_likelihood_vmap": -22166.221752036443, + "log_likelihood_scalar": -22166.22175077076, + "log_likelihood_library_pdip": -22166.22174580778, + "log_likelihood_library_pdip_scalar": -22166.221750479657, + "rel_diff_vmap_vs_library_pdip": 2.8099798073767275e-10, + "rel_diff_scalar_vs_library_pdip_scalar": 1.3132765315747392e-11, + "abs_diff_nats": 1.2656819308176637e-06, + "rel_diff": 5.7099579037354596e-11, + "rel_diff_scalar_vs_library_pdip": 2.2389840168753368e-10, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 4.671877832151949e-06, + "rel_diff_library_pdip_vmap_vs_scalar": 2.107656363245962e-10, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": null, + "passes": null, + "pdip_iter": null + }, + { + "lane": 4, + "draw_name": "call00015_lane04", + "draw_kind": "captured", + "offsets": { + "centre_0": 0.0017545152650242774, + "centre_1": 0.005096768299803747, + "ell_comps_0": 0.00015519416981613077, + "ell_comps_1": 0.007279341501820333, + "einstein_radius": -0.03249658545615719 + }, + "log_likelihood_vmap": -194383.53464290412, + "log_likelihood_scalar": NaN, + "log_likelihood_library_pdip": -194383.71431936364, + "log_likelihood_library_pdip_scalar": NaN, + "rel_diff_vmap_vs_library_pdip": 9.243390586977035e-07, + "rel_diff_scalar_vs_library_pdip_scalar": NaN, + "abs_diff_nats": NaN, + "rel_diff": NaN, + "rel_diff_scalar_vs_library_pdip": NaN, + "abs_diff_library_pdip_vmap_vs_scalar_nats": NaN, + "rel_diff_library_pdip_vmap_vs_scalar": NaN, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "FAIL", + "certified": null, + "passes": null, + "pdip_iter": null + }, + { + "lane": 5, + "draw_name": "call00015_lane05", + "draw_kind": "captured", + "offsets": { + "centre_0": -0.0009851407640018856, + "centre_1": 0.002274591191563648, + "ell_comps_0": 0.006006903437417319, + "ell_comps_1": 0.008497457839948512, + "einstein_radius": -0.07242218866013372 + }, + "log_likelihood_vmap": 14761.660929764937, + "log_likelihood_scalar": 14761.660929764934, + "log_likelihood_library_pdip": 14761.660929764941, + "log_likelihood_library_pdip_scalar": 14761.66092976493, + "rel_diff_vmap_vs_library_pdip": 2.4644779638287237e-16, + "rel_diff_scalar_vs_library_pdip_scalar": 2.4644779638287257e-16, + "abs_diff_nats": 3.637978807091713e-12, + "rel_diff": 2.464477963828725e-16, + "rel_diff_scalar_vs_library_pdip": 4.928955927657447e-16, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 1.0913936421275139e-11, + "rel_diff_library_pdip_vmap_vs_scalar": 7.393433891486177e-16, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": null, + "passes": null, + "pdip_iter": null + }, + { + "lane": 6, + "draw_name": "call00015_lane06", + "draw_kind": "captured", + "offsets": { + "centre_0": -0.002713857824416392, + "centre_1": 0.00891817739575143, + "ell_comps_0": 0.001298959041684998, + "ell_comps_1": -0.0098959428603974, + "einstein_radius": 0.04379561090121875 + }, + "log_likelihood_vmap": 21597.12687122062, + "log_likelihood_scalar": 21597.126871230066, + "log_likelihood_library_pdip": 21597.126871220295, + "log_likelihood_library_pdip_scalar": 21597.126871229542, + "rel_diff_vmap_vs_library_pdip": 1.4991814224262508e-14, + "rel_diff_scalar_vs_library_pdip_scalar": 2.4256418520144683e-14, + "abs_diff_nats": 9.447830962017179e-09, + "rel_diff": 4.3745777011676537e-13, + "rel_diff_scalar_vs_library_pdip": 4.524495843412258e-13, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 9.247742127627134e-09, + "rel_diff_library_pdip_vmap_vs_scalar": 4.281931658208874e-13, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": null, + "passes": null, + "pdip_iter": null + }, + { + "lane": 7, + "draw_name": "call00015_lane07", + "draw_kind": "captured", + "offsets": { + "centre_0": 0.01063269420288399, + "centre_1": -0.0015469073410711704, + "ell_comps_0": -0.012689283848227026, + "ell_comps_1": 0.0004952469855790744, + "einstein_radius": 0.02732727396499479 + }, + "log_likelihood_vmap": 7413.159095230236, + "log_likelihood_scalar": 7413.159096650659, + "log_likelihood_library_pdip": 7413.159095181654, + "log_likelihood_library_pdip_scalar": 7413.159096744621, + "rel_diff_vmap_vs_library_pdip": 6.55342322566359e-12, + "rel_diff_scalar_vs_library_pdip_scalar": 1.267498989342164e-11, + "abs_diff_nats": 1.4204233593773097e-06, + "rel_diff": 1.9160837381988354e-10, + "rel_diff_scalar_vs_library_pdip": 1.981617970835166e-10, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 1.5629666449967772e-06, + "rel_diff_library_pdip_vmap_vs_scalar": 2.1083678693515843e-10, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": null, + "passes": null, + "pdip_iter": null + }, + { + "lane": 8, + "draw_name": "call00015_lane08", + "draw_kind": "captured", + "offsets": { + "centre_0": -0.003586333218755102, + "centre_1": 0.0002442650473125539, + "ell_comps_0": -0.0025095685188555317, + "ell_comps_1": 0.008402687166147546, + "einstein_radius": 0.003809182535237543 + }, + "log_likelihood_vmap": 19060.202679471302, + "log_likelihood_scalar": 19060.20267912919, + "log_likelihood_library_pdip": 19060.202679471302, + "log_likelihood_library_pdip_scalar": 19060.20267912919, + "rel_diff_vmap_vs_library_pdip": 0.0, + "rel_diff_scalar_vs_library_pdip_scalar": 0.0, + "abs_diff_nats": 3.421118890400976e-07, + "rel_diff": 1.7949016324716636e-11, + "rel_diff_scalar_vs_library_pdip": 1.7949016324394468e-11, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 3.421118890400976e-07, + "rel_diff_library_pdip_vmap_vs_scalar": 1.7949016324716636e-11, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": null, + "passes": null, + "pdip_iter": null + }, + { + "lane": 9, + "draw_name": "call00015_lane09", + "draw_kind": "captured", + "offsets": { + "centre_0": -0.004569070502203608, + "centre_1": -0.0008437281377326854, + "ell_comps_0": 0.016330335737132294, + "ell_comps_1": 0.007271610957481866, + "einstein_radius": -0.0644363448871137 + }, + "log_likelihood_vmap": 12782.703321755558, + "log_likelihood_scalar": 12782.70332143049, + "log_likelihood_library_pdip": 12782.703321755558, + "log_likelihood_library_pdip_scalar": 12782.70332143049, + "rel_diff_vmap_vs_library_pdip": 0.0, + "rel_diff_scalar_vs_library_pdip_scalar": 0.0, + "abs_diff_nats": 3.250679583288729e-07, + "rel_diff": 2.543029828314087e-11, + "rel_diff_scalar_vs_library_pdip": 2.543029828249417e-11, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 3.250679583288729e-07, + "rel_diff_library_pdip_vmap_vs_scalar": 2.543029828314087e-11, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": null, + "passes": null, + "pdip_iter": null + }, + { + "lane": 10, + "draw_name": "call00015_lane10", + "draw_kind": "captured", + "offsets": { + "centre_0": 0.00041413552102611065, + "centre_1": -0.004015077828810355, + "ell_comps_0": 0.005329766760357603, + "ell_comps_1": 0.01667480963359283, + "einstein_radius": 0.011021193939315443 + }, + "log_likelihood_vmap": 25442.236800481285, + "log_likelihood_scalar": 25442.23680048131, + "log_likelihood_library_pdip": 25442.236800481292, + "log_likelihood_library_pdip_scalar": 25442.23680048131, + "rel_diff_vmap_vs_library_pdip": 2.8597947858286523e-16, + "rel_diff_scalar_vs_library_pdip_scalar": 0.0, + "abs_diff_nats": 2.546585164964199e-11, + "rel_diff": 1.0009281750400276e-15, + "rel_diff_scalar_vs_library_pdip": 7.149486964571631e-16, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 1.8189894035458565e-11, + "rel_diff_library_pdip_vmap_vs_scalar": 7.149486964571626e-16, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": null, + "passes": null, + "pdip_iter": null + }, + { + "lane": 11, + "draw_name": "call00015_lane11", + "draw_kind": "captured", + "offsets": { + "centre_0": -0.00234856906735493, + "centre_1": -0.0005637310462631455, + "ell_comps_0": 0.002190699592912508, + "ell_comps_1": -0.01675931647125419, + "einstein_radius": -0.1186639473801736 + }, + "log_likelihood_vmap": -3234.481431636159, + "log_likelihood_scalar": -3234.481430921878, + "log_likelihood_library_pdip": -3234.481431636159, + "log_likelihood_library_pdip_scalar": -3234.481430921878, + "rel_diff_vmap_vs_library_pdip": 0.0, + "rel_diff_scalar_vs_library_pdip_scalar": 0.0, + "abs_diff_nats": 7.142807589843869e-07, + "rel_diff": 2.208331611230817e-10, + "rel_diff_scalar_vs_library_pdip": 2.208331610743144e-10, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 7.142807589843869e-07, + "rel_diff_library_pdip_vmap_vs_scalar": 2.208331611230817e-10, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": null, + "passes": null, + "pdip_iter": null + }, + { + "lane": 12, + "draw_name": "call00015_lane12", + "draw_kind": "captured", + "offsets": { + "centre_0": -9.326736988388313e-05, + "centre_1": -0.0013488200741109593, + "ell_comps_0": 0.00997667014421897, + "ell_comps_1": -0.014348588092779897, + "einstein_radius": -0.02126731799195114 + }, + "log_likelihood_vmap": 18883.933556142838, + "log_likelihood_scalar": 18883.93355609074, + "log_likelihood_library_pdip": 18883.933556142838, + "log_likelihood_library_pdip_scalar": 18883.93355609074, + "rel_diff_vmap_vs_library_pdip": 0.0, + "rel_diff_scalar_vs_library_pdip_scalar": 0.0, + "abs_diff_nats": 5.209949449636042e-08, + "rel_diff": 2.7589323136310487e-12, + "rel_diff_scalar_vs_library_pdip": 2.7589323136234372e-12, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 5.209949449636042e-08, + "rel_diff_library_pdip_vmap_vs_scalar": 2.7589323136310487e-12, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": null, + "passes": null, + "pdip_iter": null + }, + { + "lane": 13, + "draw_name": "call00015_lane13", + "draw_kind": "captured", + "offsets": { + "centre_0": -0.007013568613743564, + "centre_1": 0.004528745612839986, + "ell_comps_0": -0.018496405934026655, + "ell_comps_1": 0.0014830576999261711, + "einstein_radius": -0.04673040108359361 + }, + "log_likelihood_vmap": 23869.4880678158, + "log_likelihood_scalar": 23869.4880678158, + "log_likelihood_library_pdip": 23869.488067815804, + "log_likelihood_library_pdip_scalar": 23869.4880678158, + "rel_diff_vmap_vs_library_pdip": 1.5241126230926363e-16, + "rel_diff_scalar_vs_library_pdip_scalar": 0.0, + "abs_diff_nats": 0.0, + "rel_diff": 0.0, + "rel_diff_scalar_vs_library_pdip": 1.5241126230926363e-16, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 3.637978807091713e-12, + "rel_diff_library_pdip_vmap_vs_scalar": 1.5241126230926365e-16, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": null, + "passes": null, + "pdip_iter": null + }, + { + "lane": 14, + "draw_name": "call00015_lane14", + "draw_kind": "captured", + "offsets": { + "centre_0": 0.005108692197125562, + "centre_1": -0.010240010499870703, + "ell_comps_0": -0.00684600823433492, + "ell_comps_1": -0.002573928604858717, + "einstein_radius": -0.0214638151942923 + }, + "log_likelihood_vmap": -177847.9771108784, + "log_likelihood_scalar": -177848.6863012489, + "log_likelihood_library_pdip": -177847.87433380686, + "log_likelihood_library_pdip_scalar": NaN, + "rel_diff_vmap_vs_library_pdip": 5.778931680515601e-07, + "rel_diff_scalar_vs_library_pdip_scalar": NaN, + "abs_diff_nats": 0.7091903705149889, + "rel_diff": 3.9876053361098615e-06, + "rel_diff_scalar_vs_library_pdip": 4.565516709640215e-06, + "abs_diff_library_pdip_vmap_vs_scalar_nats": NaN, + "rel_diff_library_pdip_vmap_vs_scalar": NaN, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "FAIL", + "certified": null, + "passes": null, + "pdip_iter": null + }, + { + "lane": 15, + "draw_name": "call00015_lane15", + "draw_kind": "captured", + "offsets": { + "centre_0": 0.0015375882948530809, + "centre_1": 0.00010861850037634777, + "ell_comps_0": 0.010624594413718456, + "ell_comps_1": -0.00030576693661378264, + "einstein_radius": 0.018140577124415858 + }, + "log_likelihood_vmap": 25794.985439570028, + "log_likelihood_scalar": 25794.98543952388, + "log_likelihood_library_pdip": 25794.985439582873, + "log_likelihood_library_pdip_scalar": 25794.98543952388, + "rel_diff_vmap_vs_library_pdip": 4.979922627957322e-13, + "rel_diff_scalar_vs_library_pdip_scalar": 0.0, + "abs_diff_nats": 4.614776116795838e-08, + "rel_diff": 1.7890206325625344e-12, + "rel_diff_scalar_vs_library_pdip": 2.2870128953541753e-12, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 5.899346433579922e-08, + "rel_diff_library_pdip_vmap_vs_scalar": 2.2870128953594057e-12, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": null, + "passes": null, + "pdip_iter": null + } + ], + "lane_pins": [ + { + "pin": "lane 0: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 18463.07897110663, + "reference_value": 18463.07897110663, + "rel_diff": 0.0, + "abs_diff_nats": 0.0, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 0: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 18463.078970707007, + "reference_value": 18463.078970707007, + "rel_diff": 0.0, + "abs_diff_nats": 0.0, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 0: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 18463.07897110663, + "reference_value": 18463.078970707007, + "rel_diff": 2.1644531588444352e-11, + "abs_diff_nats": 3.996246960014105e-07, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 0: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 18463.07897110663, + "reference_value": 18463.078970707007, + "rel_diff": 2.1644531588444352e-11, + "abs_diff_nats": 3.996246960014105e-07, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 1: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 15734.21749647698, + "reference_value": 15734.21749647698, + "rel_diff": 0.0, + "abs_diff_nats": 0.0, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 1: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 15734.21749633948, + "reference_value": 15734.21749633948, + "rel_diff": 0.0, + "abs_diff_nats": 0.0, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 1: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 15734.21749647698, + "reference_value": 15734.21749633948, + "rel_diff": 8.738982222968992e-12, + "abs_diff_nats": 1.3750104699283838e-07, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 1: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 15734.21749647698, + "reference_value": 15734.21749633948, + "rel_diff": 8.738982222968992e-12, + "abs_diff_nats": 1.3750104699283838e-07, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 2: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 18706.165986625834, + "reference_value": 18706.165986625834, + "rel_diff": 0.0, + "abs_diff_nats": 0.0, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 2: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 18706.16598652238, + "reference_value": 18706.16598652238, + "rel_diff": 0.0, + "abs_diff_nats": 0.0, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 2: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 18706.165986625834, + "reference_value": 18706.16598652238, + "rel_diff": 5.530433302676995e-12, + "abs_diff_nats": 1.0345320333726704e-07, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 2: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 18706.165986625834, + "reference_value": 18706.16598652238, + "rel_diff": 5.530433302676995e-12, + "abs_diff_nats": 1.0345320333726704e-07, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 3: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -22166.221752036443, + "reference_value": -22166.22174580778, + "rel_diff": 2.8099798073767275e-10, + "abs_diff_nats": 6.228663551155478e-06, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 3: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -22166.22175077076, + "reference_value": -22166.221750479657, + "rel_diff": 1.3132765315747392e-11, + "abs_diff_nats": 2.911037881858647e-07, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 3: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -22166.221752036443, + "reference_value": -22166.22175077076, + "rel_diff": 5.7099579037354596e-11, + "abs_diff_nats": 1.2656819308176637e-06, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 3: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -22166.22174580778, + "reference_value": -22166.221750479657, + "rel_diff": 2.107656363245962e-10, + "abs_diff_nats": 4.671877832151949e-06, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 4: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -194383.53464290412, + "reference_value": -194383.71431936364, + "rel_diff": 9.243390586977035e-07, + "abs_diff_nats": 0.1796764595201239, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 4: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": NaN, + "reference_value": NaN, + "rel_diff": NaN, + "abs_diff_nats": NaN, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 4: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -194383.53464290412, + "reference_value": NaN, + "rel_diff": NaN, + "abs_diff_nats": NaN, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 4: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -194383.71431936364, + "reference_value": NaN, + "rel_diff": NaN, + "abs_diff_nats": NaN, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 5: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 14761.660929764937, + "reference_value": 14761.660929764941, + "rel_diff": 2.4644779638287237e-16, + "abs_diff_nats": 3.637978807091713e-12, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 5: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 14761.660929764934, + "reference_value": 14761.66092976493, + "rel_diff": 2.4644779638287257e-16, + "abs_diff_nats": 3.637978807091713e-12, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 5: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 14761.660929764937, + "reference_value": 14761.660929764934, + "rel_diff": 2.464477963828725e-16, + "abs_diff_nats": 3.637978807091713e-12, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 5: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 14761.660929764941, + "reference_value": 14761.66092976493, + "rel_diff": 7.393433891486177e-16, + "abs_diff_nats": 1.0913936421275139e-11, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 6: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 21597.12687122062, + "reference_value": 21597.126871220295, + "rel_diff": 1.4991814224262508e-14, + "abs_diff_nats": 3.2378011383116245e-10, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 6: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 21597.126871230066, + "reference_value": 21597.126871229542, + "rel_diff": 2.4256418520144683e-14, + "abs_diff_nats": 5.238689482212067e-10, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 6: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 21597.12687122062, + "reference_value": 21597.126871230066, + "rel_diff": 4.3745777011676537e-13, + "abs_diff_nats": 9.447830962017179e-09, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 6: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 21597.126871220295, + "reference_value": 21597.126871229542, + "rel_diff": 4.281931658208874e-13, + "abs_diff_nats": 9.247742127627134e-09, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 7: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 7413.159095230236, + "reference_value": 7413.159095181654, + "rel_diff": 6.55342322566359e-12, + "abs_diff_nats": 4.8581568989902735e-08, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 7: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 7413.159096650659, + "reference_value": 7413.159096744621, + "rel_diff": 1.267498989342164e-11, + "abs_diff_nats": 9.396171662956476e-08, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 7: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 7413.159095230236, + "reference_value": 7413.159096650659, + "rel_diff": 1.9160837381988354e-10, + "abs_diff_nats": 1.4204233593773097e-06, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 7: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 7413.159095181654, + "reference_value": 7413.159096744621, + "rel_diff": 2.1083678693515843e-10, + "abs_diff_nats": 1.5629666449967772e-06, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 8: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 19060.202679471302, + "reference_value": 19060.202679471302, + "rel_diff": 0.0, + "abs_diff_nats": 0.0, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 8: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 19060.20267912919, + "reference_value": 19060.20267912919, + "rel_diff": 0.0, + "abs_diff_nats": 0.0, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 8: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 19060.202679471302, + "reference_value": 19060.20267912919, + "rel_diff": 1.7949016324716636e-11, + "abs_diff_nats": 3.421118890400976e-07, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 8: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 19060.202679471302, + "reference_value": 19060.20267912919, + "rel_diff": 1.7949016324716636e-11, + "abs_diff_nats": 3.421118890400976e-07, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 9: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 12782.703321755558, + "reference_value": 12782.703321755558, + "rel_diff": 0.0, + "abs_diff_nats": 0.0, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 9: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 12782.70332143049, + "reference_value": 12782.70332143049, + "rel_diff": 0.0, + "abs_diff_nats": 0.0, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 9: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 12782.703321755558, + "reference_value": 12782.70332143049, + "rel_diff": 2.543029828314087e-11, + "abs_diff_nats": 3.250679583288729e-07, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 9: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 12782.703321755558, + "reference_value": 12782.70332143049, + "rel_diff": 2.543029828314087e-11, + "abs_diff_nats": 3.250679583288729e-07, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 10: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 25442.236800481285, + "reference_value": 25442.236800481292, + "rel_diff": 2.8597947858286523e-16, + "abs_diff_nats": 7.275957614183426e-12, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 10: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 25442.23680048131, + "reference_value": 25442.23680048131, + "rel_diff": 0.0, + "abs_diff_nats": 0.0, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 10: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 25442.236800481285, + "reference_value": 25442.23680048131, + "rel_diff": 1.0009281750400276e-15, + "abs_diff_nats": 2.546585164964199e-11, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 10: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 25442.236800481292, + "reference_value": 25442.23680048131, + "rel_diff": 7.149486964571626e-16, + "abs_diff_nats": 1.8189894035458565e-11, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 11: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -3234.481431636159, + "reference_value": -3234.481431636159, + "rel_diff": 0.0, + "abs_diff_nats": 0.0, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 11: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -3234.481430921878, + "reference_value": -3234.481430921878, + "rel_diff": 0.0, + "abs_diff_nats": 0.0, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 11: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -3234.481431636159, + "reference_value": -3234.481430921878, + "rel_diff": 2.208331611230817e-10, + "abs_diff_nats": 7.142807589843869e-07, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 11: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -3234.481431636159, + "reference_value": -3234.481430921878, + "rel_diff": 2.208331611230817e-10, + "abs_diff_nats": 7.142807589843869e-07, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 12: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 18883.933556142838, + "reference_value": 18883.933556142838, + "rel_diff": 0.0, + "abs_diff_nats": 0.0, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 12: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 18883.93355609074, + "reference_value": 18883.93355609074, + "rel_diff": 0.0, + "abs_diff_nats": 0.0, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 12: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 18883.933556142838, + "reference_value": 18883.93355609074, + "rel_diff": 2.7589323136310487e-12, + "abs_diff_nats": 5.209949449636042e-08, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 12: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 18883.933556142838, + "reference_value": 18883.93355609074, + "rel_diff": 2.7589323136310487e-12, + "abs_diff_nats": 5.209949449636042e-08, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 13: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 23869.4880678158, + "reference_value": 23869.488067815804, + "rel_diff": 1.5241126230926363e-16, + "abs_diff_nats": 3.637978807091713e-12, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 13: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 23869.4880678158, + "reference_value": 23869.4880678158, + "rel_diff": 0.0, + "abs_diff_nats": 0.0, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 13: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 23869.4880678158, + "reference_value": 23869.4880678158, + "rel_diff": 0.0, + "abs_diff_nats": 0.0, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 13: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 23869.488067815804, + "reference_value": 23869.4880678158, + "rel_diff": 1.5241126230926365e-16, + "abs_diff_nats": 3.637978807091713e-12, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 14: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -177847.9771108784, + "reference_value": -177847.87433380686, + "rel_diff": 5.778931680515601e-07, + "abs_diff_nats": 0.10277707152999938, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 14: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -177848.6863012489, + "reference_value": NaN, + "rel_diff": NaN, + "abs_diff_nats": NaN, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 14: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -177847.9771108784, + "reference_value": -177848.6863012489, + "rel_diff": 3.9876053361098615e-06, + "abs_diff_nats": 0.7091903705149889, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 14: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -177847.87433380686, + "reference_value": NaN, + "rel_diff": NaN, + "abs_diff_nats": NaN, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 15: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 25794.985439570028, + "reference_value": 25794.985439582873, + "rel_diff": 4.979922627957322e-13, + "abs_diff_nats": 1.2845703167840838e-08, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 15: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 25794.98543952388, + "reference_value": 25794.98543952388, + "rel_diff": 0.0, + "abs_diff_nats": 0.0, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 15: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 25794.985439570028, + "reference_value": 25794.98543952388, + "rel_diff": 1.7890206325625344e-12, + "abs_diff_nats": 4.614776116795838e-08, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 15: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 25794.985439582873, + "reference_value": 25794.98543952388, + "rel_diff": 2.2870128953594057e-12, + "abs_diff_nats": 5.899346433579922e-08, + "within_rtol": true, + "status": "RECORDED" + } + ], + "lanes_failed": 2, + "arm_rows": { + "vmap": { + "arm": "vmap", + "program": "jax.jit(jax.vmap(fn))", + "stands_for": "Nautilus(use_jax_vmap=True) \u2014 Fitness._vmap", + "hlo_source": "jax.jit(jax.vmap(fn)).lower(batched_tree) \u2014 the exact current Fitness._vmap composition (PyAutoFit#1638)", + "batch_wall_ms": 531.6486784999142, + "wall_production_nesting_ms": 531.6486784999142, + "wall_aot_command_buffers_on_ms": 533.3338642001763, + "wall_aot_command_buffers_off_ms": 533.112578500004, + "command_buffer_delta_ms": -0.2212857001723023, + "production_nesting_vs_aot_on_delta_ms": -1.6851857002620818, + "production_nesting_vs_aot_on_delta_pct": -0.3159720042884021, + "wall_per_lane_ms": 33.22804240624464, + "wall_per_lane_command_buffers_off_ms": 33.31953615625025, + "traced_batch_wall_ms": 540.5738279001525, + "untraced_batch_wall_ms": 533.3607218999532, + "traced_wall_per_lane_ms": 33.785864243759534, + "callback_count_per_call": 0.0, + "callback_count_per_lane": 0.0, + "callback_expectation": "0 \u2014 the rectangular mesh has no qhull host callback (asserted)", + "host_qhull_ms": 0.0, + "host_tables_ms": 0.0, + "host_qhull_ms_per_lane": 0.0, + "host_tables_ms_per_lane": 0.0, + "host_callback_probe": { + "calls": 0, + "qhull_ms_total": 0.0, + "tables_ms_total": 0.0, + "total_ms_total": 0.0, + "qhull_ms_mean": 0.0, + "tables_ms_mean": 0.0, + "total_ms_mean": 0.0, + "non_finite_calls": 0, + "n_points": [] + }, + "host_callback_records_first": [], + "device_idle_ms": 17.97893190000002, + "device_idle_ms_per_lane": 1.1236832437500013, + "trace": { + "parser": "ProfileData.from_file(xplane) + as_text() + stack_frame_index(proto field 17)", + "stage_audit": { + "mesh_construction": [ + { + "instruction": "fusion.4", + "ms": 0.4744844, + "opcode": "fusion", + "shape": "(f64[16,15361,2]{2,1,0}, s64[16,15361,2]{2,1,0}, s32[16,15361,2]{2,1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:227", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:227 (create_transforms_rank)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:396 (_transforms_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:561 (adaptive_rectangular_mappings_weights_via_interpolation_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:693 (InterpolatorRectangular._mappings_sizes_weights)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "loop_select_fusion", + "ms": 0.1759209, + "opcode": "fusion", + "shape": "(u32[16,2,15361]{2,1,0}, u32[16,2,15361]{2,1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:69", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:69 (forward_interp)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:573 (adaptive_rectangular_mappings_weights_via_interpolation_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:693 (InterpolatorRectangular._mappings_sizes_weights)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/abstract.py:36 (AbstractInterpolator.mappings)" + ] + }, + { + "instruction": "loop_select_fusion.1", + "ms": 0.08313360000000002, + "opcode": "fusion", + "shape": "(u32[16,15361]{1,0}, u32[16,15361]{1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:245", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:245 (create_transforms_rank)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:396 (_transforms_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:561 (adaptive_rectangular_mappings_weights_via_interpolation_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:693 (InterpolatorRectangular._mappings_sizes_weights)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "loop_select_fusion.4", + "ms": 0.0811367, + "opcode": "fusion", + "shape": "(u32[16,15361]{1,0}, u32[16,15361]{1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:245", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:245 (create_transforms_rank)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:396 (_transforms_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:561 (adaptive_rectangular_mappings_weights_via_interpolation_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:693 (InterpolatorRectangular._mappings_sizes_weights)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "loop_subtract_transpose_fusion", + "ms": 0.0432785, + "opcode": "fusion", + "shape": "(f64[16,15361,2]{2,1,0}, f64[491552,1,1,1]{3,2,1,0}, f64[491552,1,1,1]{3,2,1,0}, f64[16,15361,2]{2,1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:69", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:69 (forward_interp)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:573 (adaptive_rectangular_mappings_weights_via_interpolation_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:693 (InterpolatorRectangular._mappings_sizes_weights)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/abstract.py:36 (AbstractInterpolator.mappings)" + ] + }, + { + "instruction": "loop_add_fusion", + "ms": 0.02118979999999999, + "opcode": "fusion", + "shape": "s64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:69", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:69 (forward_interp)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:573 (adaptive_rectangular_mappings_weights_via_interpolation_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:693 (InterpolatorRectangular._mappings_sizes_weights)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/abstract.py:36 (AbstractInterpolator.mappings)" + ] + } + ], + "mixed_fusion": [ + { + "instruction": "loop_divide_gather_fusion", + "ms": 17.1636349, + "opcode": "fusion", + "shape": "(f64[15361,16,1,1,1521]{4,3,2,1,0}, f64[15361,16,1,1,1521]{4,3,2,1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:133", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:133 (curvature_matrix_via_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:93 (InversionImagingMapping.curvature_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:389 (AbstractInversion.curvature_reg_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "loop_add_multiply_fusion", + "ms": 2.0419973, + "opcode": "fusion", + "shape": "(f64[16,1369,1369]{2,1,0}, f64[16,1369,1369]{2,1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:61", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:61 (initialize)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:72 (solve_nnls)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:129 (_solve_nnls_primal_with..primal)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:164 (solve_nnls_primal_with_status)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:508 (reconstruction_positive_only_from)" + ] + }, + { + "instruction": "input_transpose_fusion.3", + "ms": 0.4832191, + "opcode": "fusion", + "shape": "f64[16,1521,1521]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986 (AbstractInversion._log_det_symmetric_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:1078 (AbstractInversion.log_det_curvature_reg_matrix_term)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:347 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/model/analysis.py:135 (AnalysisImaging.log_likelihood_function)" + ] + }, + { + "instruction": "input_transpose_fusion.4", + "ms": 0.4601513, + "opcode": "fusion", + "shape": "f64[16,1521,1521]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986 (AbstractInversion._log_det_symmetric_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:1157 (AbstractInversion.log_det_regularization_matrix_term)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:348 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/model/analysis.py:135 (AnalysisImaging.log_likelihood_function)" + ] + }, + { + "instruction": "input_transpose_fusion.5", + "ms": 0.3088397, + "opcode": "fusion", + "shape": "f64[16,1369,1369]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:62", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:62 (initialize)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:72 (solve_nnls)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:129 (_solve_nnls_primal_with..primal)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:164 (solve_nnls_primal_with_status)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:508 (reconstruction_positive_only_from)" + ] + }, + { + "instruction": "input_scatter_fusion.10", + "ms": 0.09576979999999999, + "opcode": "fusion", + "shape": "f64[15361,16,1521]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:353", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:353 (mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/abstract.py:283 (Mapper.mapping_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:91 (AbstractInversionImaging._mapping_matrix_for_convolution_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:137 (AbstractInversionImaging.operated_mapping_matrix_list)" + ] + } + ], + "ray_trace_data_grid": [ + { + "instruction": "input_reduce_fusion.21", + "ms": 0.0027487, + "opcode": "fusion", + "shape": "f64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:506", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:506 (FlatLambdaCDM._simpson_1d)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:644 (FlatLambdaCDM.angular_diameter_distance_kpc_z1z2)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:133 (LensingCosmology.angular_diameter_distance_to_earth_in_kpc_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:362 (LensingCosmology.scaling_factor_between_redshifts_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/lens/tracer_util.py:252 (traced_grid_2d_list_from)" + ] + }, + { + "instruction": "input_reduce_fusion.23", + "ms": 0.0027134000000000004, + "opcode": "fusion", + "shape": "f64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:506", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:506 (FlatLambdaCDM._simpson_1d)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:644 (FlatLambdaCDM.angular_diameter_distance_kpc_z1z2)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:151 (LensingCosmology.angular_diameter_distance_between_redshifts_in_kpc_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:355 (LensingCosmology.scaling_factor_between_redshifts_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/lens/tracer_util.py:252 (traced_grid_2d_list_from)" + ] + }, + { + "instruction": "input_reduce_fusion.24", + "ms": 0.0025888000000000005, + "opcode": "fusion", + "shape": "f64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:503", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:503 (FlatLambdaCDM._simpson_1d)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:644 (FlatLambdaCDM.angular_diameter_distance_kpc_z1z2)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:151 (LensingCosmology.angular_diameter_distance_between_redshifts_in_kpc_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:355 (LensingCosmology.scaling_factor_between_redshifts_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/lens/tracer_util.py:252 (traced_grid_2d_list_from)" + ] + }, + { + "instruction": "input_reduce_fusion.22", + "ms": 0.0025792000000000002, + "opcode": "fusion", + "shape": "f64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:503", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:503 (FlatLambdaCDM._simpson_1d)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:644 (FlatLambdaCDM.angular_diameter_distance_kpc_z1z2)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:133 (LensingCosmology.angular_diameter_distance_to_earth_in_kpc_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:362 (LensingCosmology.scaling_factor_between_redshifts_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/lens/tracer_util.py:252 (traced_grid_2d_list_from)" + ] + }, + { + "instruction": "loop_divide_fusion.1", + "ms": 0.0021920000000000004, + "opcode": "fusion", + "shape": "f64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:380", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:380 (LensingCosmology.scaling_factor_between_redshifts_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/lens/tracer_util.py:252 (traced_grid_2d_list_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/lens/tracer.py:632 (Tracer.traced_grid_2d_list_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/structures/decorators/abstract.py:93 (AbstractMaker.evaluate_func)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/structures/decorators/abstract.py:110 (AbstractMaker.result)" + ] + } + ], + "border_relocator": [ + { + "instruction": "custom-call.2", + "ms": 0.042398700000000004, + "opcode": "custom-call", + "shape": "(f64[16,2,2]{2,1,0}, s8[4194304]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:242", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:242 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:415 (BorderRelocator.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:83 (AbstractMesh.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/rectangular_rtu_adapt_density.py:267 (RectangularRTUAdaptDensity.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "eigh.0", + "ms": 0.014581900000000002, + "opcode": "custom-call", + "shape": "(f64[16,2,2]{1,2,0}, f64[16,2]{1,0}, s32[16]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:245", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:245 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:415 (BorderRelocator.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:83 (AbstractMesh.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/rectangular_rtu_adapt_density.py:267 (RectangularRTUAdaptDensity.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "loop_add_rsqrt_fusion", + "ms": 0.012953200000000002, + "opcode": "fusion", + "shape": "(f64[16,15361]{1,0}, f64[16,15361]{1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:311", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:311 (relocated_grid_via_ellipse_border_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:423 (BorderRelocator.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:83 (AbstractMesh.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/rectangular_rtu_adapt_density.py:267 (RectangularRTUAdaptDensity.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "input_concatenate_fusion.5", + "ms": 0.007647899999999999, + "opcode": "fusion", + "shape": "f64[16,2,15361]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:323", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:323 (relocated_grid_via_ellipse_border_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:423 (BorderRelocator.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:83 (AbstractMesh.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/rectangular_rtu_adapt_density.py:267 (RectangularRTUAdaptDensity.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "loop_select_sine_fusion", + "ms": 0.0034046, + "opcode": "fusion", + "shape": "(f64[16]{0}, f64[16]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:301", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:301 (relocated_grid_via_ellipse_border_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:423 (BorderRelocator.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:83 (AbstractMesh.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/rectangular_rtu_adapt_density.py:267 (RectangularRTUAdaptDensity.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "loop_abs_fusion", + "ms": 0.0032224999999999997, + "opcode": "fusion", + "shape": "(f64[16,392,1]{2,1,0}, f64[16,392,1]{2,1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:269", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:269 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:415 (BorderRelocator.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:83 (AbstractMesh.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/rectangular_rtu_adapt_density.py:267 (RectangularRTUAdaptDensity.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + } + ], + "other": [ + { + "instruction": "copy.52", + "ms": 0.0805931, + "opcode": "copy", + "shape": "u32[16,2,15361]{2,1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "copy.53", + "ms": 0.08042639999999997, + "opcode": "copy", + "shape": "u32[16,2,15361]{2,1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "copy.71", + "ms": 0.03930800000000001, + "opcode": "copy", + "shape": "u32[16,15361]{1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "copy.61", + "ms": 0.03908030000000002, + "opcode": "copy", + "shape": "u32[16,15361]{1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "copy.70", + "ms": 0.03852670000000006, + "opcode": "copy", + "shape": "u32[16,15361]{1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "copy.62", + "ms": 0.03852050000000004, + "opcode": "copy", + "shape": "u32[16,15361]{1,0}", + "source": "", + "stack": [] + } + ], + "mapping_matrix": [ + { + "instruction": "loop_broadcast_fusion", + "ms": 1.7234397, + "opcode": "fusion", + "shape": "f64[15361,16,1521]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:353", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:353 (mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/abstract.py:283 (Mapper.mapping_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:91 (AbstractInversionImaging._mapping_matrix_for_convolution_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:137 (AbstractInversionImaging.operated_mapping_matrix_list)" + ] + }, + { + "instruction": "input_scatter_fusion.5", + "ms": 0.0578963, + "opcode": "fusion", + "shape": "f64[16,1521]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:71", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:71 (adaptive_pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/abstract.py:507 (Mapper.pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt.py:339 (Adapt.regularization_weights_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt.py:362 (Adapt.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)" + ] + }, + { + "instruction": "input_reduce_fusion.31", + "ms": 0.0038015, + "opcode": "fusion", + "shape": "f64[16]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:93", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:93 (adaptive_pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/abstract.py:507 (Mapper.pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt.py:339 (Adapt.regularization_weights_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt.py:362 (Adapt.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)" + ] + }, + { + "instruction": "loop_divide_fusion", + "ms": 0.0027806000000000007, + "opcode": "fusion", + "shape": "f64[16,1521]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:92", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:92 (adaptive_pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/abstract.py:507 (Mapper.pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt.py:339 (Adapt.regularization_weights_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt.py:362 (Adapt.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)" + ] + } + ], + "psf_convolution_mapping_matrix": [ + { + "instruction": "input_scatter_fusion", + "ms": 32.7325887, + "opcode": "fusion", + "shape": "f64[16,1521,180,180]{3,2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "fft.29.0", + "ms": 28.659025499999995, + "opcode": "fft", + "shape": "f64[16,1521,180,180]{3,2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "fft.25.0", + "ms": 21.865845500000006, + "opcode": "fft", + "shape": "c128[16,1521,180,91]{3,2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "fft.27.0", + "ms": 15.735210499999999, + "opcode": "fft", + "shape": "c128[16,1521,91,180]{3,2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "input_transpose_fusion.2", + "ms": 8.554638299999999, + "opcode": "fusion", + "shape": "c128[16,1521,91,180]{3,2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "wrapped_transpose.2", + "ms": 8.0239261, + "opcode": "fusion", + "shape": "c128[16,1521,180,91]{3,2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + } + ], + "regularization_H": [ + { + "instruction": "wrapped_broadcast", + "ms": 0.49583639999999995, + "opcode": "fusion", + "shape": "f64[16,1521,1521]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt.py:124", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt.py:124 (weighted_regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt.py:366 (Adapt.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:332 (AbstractInversion.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "loop_broadcast_fusion.3", + "ms": 0.015420600000000001, + "opcode": "fusion", + "shape": "f64[1521,1521]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt.py:111", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt.py:111 (weighted_regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt.py:366 (Adapt.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:332 (AbstractInversion.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "input_scatter_fusion.7", + "ms": 0.0026271000000000003, + "opcode": "fusion", + "shape": "f64[1521,1521]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt.py:123", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt.py:123 (weighted_regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt.py:366 (Adapt.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:332 (AbstractInversion.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "curvature_matrix_F": [ + { + "instruction": "cublas-lt-matmul.2", + "ms": 99.3760245, + "opcode": "custom-call", + "shape": "(f64[16,1521,1521]{2,1,0}, s8[4194304]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:134", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:134 (curvature_matrix_via_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:93 (InversionImagingMapping.curvature_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:389 (AbstractInversion.curvature_reg_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "inversion_other": [ + { + "instruction": "cholesky.60", + "ms": 6.672817899999994, + "opcode": "custom-call", + "shape": "(f64[16,1521,1521]{1,2,0}, s32[16]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986 (AbstractInversion._log_det_symmetric_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:1078 (AbstractInversion.log_det_curvature_reg_matrix_term)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:347 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/model/analysis.py:135 (AnalysisImaging.log_likelihood_function)" + ] + }, + { + "instruction": "cholesky.70", + "ms": 6.62534989999999, + "opcode": "custom-call", + "shape": "(f64[16,1521,1521]{1,2,0}, s32[16]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986 (AbstractInversion._log_det_symmetric_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:1157 (AbstractInversion.log_det_regularization_matrix_term)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:348 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/model/analysis.py:135 (AnalysisImaging.log_likelihood_function)" + ] + }, + { + "instruction": "input_reduce_fusion.20", + "ms": 0.16793799999999998, + "opcode": "fusion", + "shape": "f64[16,1521]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:946", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:946 (AbstractInversion.regularization_term)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:346 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/model/analysis.py:135 (AnalysisImaging.log_likelihood_function)", + "/mnt/ral/jnightin/autolens_profiling_wt/certified-solver-phase-c1-lane-rate/scripts/imaging/likelihood_breakdown/fixed_light_trace.py:1195 (_captured_likelihood_fn.._likelihood)" + ] + }, + { + "instruction": "loop_reduce_window_fusion.3", + "ms": 0.0082655, + "opcode": "fusion", + "shape": "s64[6,16]{1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "input_reduce_fusion.14", + "ms": 0.0073471000000000005, + "opcode": "fusion", + "shape": "f64[16]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:985", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:985 (AbstractInversion._log_det_symmetric_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:1157 (AbstractInversion.log_det_regularization_matrix_term)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:348 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/model/analysis.py:135 (AnalysisImaging.log_likelihood_function)" + ] + }, + { + "instruction": "input_reduce_fusion.15", + "ms": 0.007279700000000001, + "opcode": "fusion", + "shape": "f64[16]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:985", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:985 (AbstractInversion._log_det_symmetric_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:1078 (AbstractInversion.log_det_curvature_reg_matrix_term)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:347 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/model/analysis.py:135 (AnalysisImaging.log_likelihood_function)" + ] + } + ], + "data_vector_D": [ + { + "instruction": "input_reduce_fusion.13", + "ms": 2.1221712999999998, + "opcode": "fusion", + "shape": "f64[92,16,1521]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/inversion_imaging_util.py:123", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/inversion_imaging_util.py:123 (data_vector_via_blurred_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:67 (InversionImagingMapping.data_vector)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:699 (AbstractInversion.reconstruction)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "input_reduce_fusion.29", + "ms": 0.0179035, + "opcode": "fusion", + "shape": "f64[16,1521]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/inversion_imaging_util.py:123", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/inversion_imaging_util.py:123 (data_vector_via_blurred_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:67 (InversionImagingMapping.data_vector)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:699 (AbstractInversion.reconstruction)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "pdip_solve": [ + { + "instruction": "cholesky.20", + "ms": 109.16174559999308, + "opcode": "custom-call", + "shape": "(f64[16,1369,1369]{1,2,0}, s32[16]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:106", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:106 (factorize_kkt)", + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:212 (pdip_pc_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:83 (solve_nnls)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:129 (_solve_nnls_primal_with..primal)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:164 (solve_nnls_primal_with_status)" + ] + }, + { + "instruction": "triangular-solve", + "ms": 33.435170099999944, + "opcode": "custom-call", + "shape": "(f64[16,1369,1]{1,2,0}, s8[256]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146 (solve_kkt_rhs)", + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:213 (pdip_pc_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:83 (solve_nnls)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:129 (_solve_nnls_primal_with..primal)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:164 (solve_nnls_primal_with_status)" + ] + }, + { + "instruction": "triangular-solve.2", + "ms": 30.40919329999942, + "opcode": "custom-call", + "shape": "(f64[16,1369,1]{1,2,0}, s8[256]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146 (solve_kkt_rhs)", + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:217 (pdip_pc_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:83 (solve_nnls)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:129 (_solve_nnls_primal_with..primal)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:164 (solve_nnls_primal_with_status)" + ] + }, + { + "instruction": "triangular-solve.3", + "ms": 29.96966349999982, + "opcode": "custom-call", + "shape": "(f64[16,1369,1]{1,2,0}, s8[256]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146 (solve_kkt_rhs)", + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:217 (pdip_pc_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:83 (solve_nnls)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:129 (_solve_nnls_primal_with..primal)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:164 (solve_nnls_primal_with_status)" + ] + }, + { + "instruction": "triangular-solve.1", + "ms": 29.51333449999955, + "opcode": "custom-call", + "shape": "(f64[16,1369,1]{1,2,0}, s8[256]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146 (solve_kkt_rhs)", + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:213 (pdip_pc_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:83 (solve_nnls)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:129 (_solve_nnls_primal_with..primal)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:164 (solve_nnls_primal_with_status)" + ] + }, + { + "instruction": "loop_add_fusion.2", + "ms": 8.285839300000001, + "opcode": "fusion", + "shape": "f64[16,1369,1369]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:107", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:107 (factorize_kkt)", + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:212 (pdip_pc_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:83 (solve_nnls)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:129 (_solve_nnls_primal_with..primal)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:164 (solve_nnls_primal_with_status)" + ] + } + ], + "mapped_reconstruction": [ + { + "instruction": "input_reduce_fusion.16", + "ms": 1.7848587, + "opcode": "fusion", + "shape": "f64[15361,16]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:163", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:163 (mapped_reconstructed_data_via_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:120 (InversionImagingMapping._mapped_reconstructed_data_dict_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:196 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + } + ], + "chi_squared_evidence": [ + { + "instruction": "input_reduce_fusion.12", + "ms": 0.0152602, + "opcode": "fusion", + "shape": "f64[92,16]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_util.py:90", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_util.py:90 (chi_squared_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:87 (AbstractFit.chi_squared)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:293 (FitDataset.chi_squared)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:345 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)" + ] + }, + { + "instruction": "input_reduce_fusion.28", + "ms": 0.003903899999999999, + "opcode": "fusion", + "shape": "f64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_util.py:104", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_util.py:104 (noise_normalization_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:98 (AbstractFit.noise_normalization)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:306 (FitDataset.noise_normalization)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:349 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)" + ] + }, + { + "instruction": "input_reduce_fusion.30", + "ms": 0.0022431999999999994, + "opcode": "fusion", + "shape": "f64[16]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_util.py:90", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_util.py:90 (chi_squared_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:87 (AbstractFit.chi_squared)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:293 (FitDataset.chi_squared)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:345 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)" + ] + } + ] + }, + "stage_audit_note": "The HLO instructions that contributed most of each stage's milliseconds, with their full source stack. A stage row is only as good as the rules that built it; this is how a reader checks a row against the HLO instead of trusting it.", + "untraced_wall_ms": 533.3607218999532, + "reconciliation_vs_untraced_pct": 1.3271837818952847, + "wall_basis": "wall_ms is the TRACED run's wall, the run these kernel durations came from. untraced_wall_ms is the same executable without the profiler; the difference is the profiler's overhead and belongs in neither the stages nor the idle row.", + "calls": 10, + "call_split": "per-call (first-instruction recurrence)", + "call_blocks": 10, + "events": 140270, + "streams": [ + "Stream #14(MemcpyD2D,Compute,MemcpyD2H)" + ], + "per_stage_ms": { + "border_relocator": { + "median_ms": 0.09941999999999998, + "min_ms": 0.09871500000000001, + "max_ms": 0.099867 + }, + "chi_squared_evidence": { + "median_ms": 0.021376, + "min_ms": 0.021246, + "max_ms": 0.021632000000000002 + }, + "curvature_matrix_F": { + "median_ms": 99.41883949999999, + "min_ms": 98.499862, + "max_ms": 100.429725 + }, + "data_vector_D": { + "median_ms": 2.141598, + "min_ms": 2.126055, + "max_ms": 2.1504689999999997 + }, + "inversion_other": { + "median_ms": 13.503869500000015, + "min_ms": 13.476041000000013, + "max_ms": 13.565612999999997 + }, + "mapped_reconstruction": { + "median_ms": 1.784821, + "min_ms": 1.777043, + "max_ms": 1.790773 + }, + "mapping_matrix": { + "median_ms": 1.7850305, + "min_ms": 1.7835690000000002, + "max_ms": 1.799668 + }, + "mesh_construction": { + "median_ms": 1.0651349999999993, + "min_ms": 1.0590299999999995, + "max_ms": 1.0711849999999992 + }, + "mixed_fusion": { + "median_ms": 20.785621999999996, + "min_ms": 20.508640999999997, + "max_ms": 21.250945 + }, + "other": { + "median_ms": 0.3382115000000001, + "min_ms": 0.3360700000000001, + "max_ms": 0.3393160000000001 + }, + "pdip_solve": { + "median_ms": 261.39406800000893, + "min_ms": 260.38383400000833, + "max_ms": 262.5424380000079 + }, + "psf_convolution_mapping_matrix": { + "median_ms": 119.59696199999999, + "min_ms": 119.223334, + "max_ms": 120.15577399999998 + }, + "ray_trace_data_grid": { + "median_ms": 0.012815500000000002, + "min_ms": 0.012768000000000002, + "max_ms": 0.012928 + }, + "regularization_H": { + "median_ms": 0.5126985, + "min_ms": 0.508714, + "max_ms": 0.523115 + } + }, + "stage_order": [ + "ray_trace_data_grid", + "border_relocator", + "mesh_construction", + "mapping_matrix", + "psf_convolution_mapping_matrix", + "data_vector_D", + "curvature_matrix_F", + "regularization_H", + "pdip_solve", + "mapped_reconstruction", + "chi_squared_evidence", + "inversion_other", + "mixed_fusion", + "other" + ], + "mixed_fusion": { + "ms": 20.785621999999996, + "constituent_stage_sets": { + "curvature_matrix_F + psf_convolution_mapping_matrix": 17.1636349, + "inversion_other + mapped_reconstruction + pdip_solve + reconstruction_scatter": 2.0419973, + "inversion_other + regularization_H": 0.4881729999999999, + "curvature_reg_reduce_gather + inversion_other": 0.4832191, + "border_relocator + pdip_solve": 0.3108269, + "border_relocator + inversion_other + mapping_matrix + mesh_construction": 0.0986817, + "inversion_other + mapping_matrix + mesh_construction": 0.063816, + "grids_and_structures + mass_profile_deflections + ray_trace_data_grid": 0.0456147, + "inversion_other + mesh_construction": 0.028533600000000003, + "inversion_other + mapped_reconstruction + reconstruction_scatter": 0.022831500000000005, + "border_relocator + mesh_construction": 0.022808799999999997, + "inversion_other + mapping_matrix": 0.011378899999999999, + "inversion_other + mapped_reconstruction": 0.009654000000000001, + "border_relocator + inversion_other": 0.0086716, + "border_relocator + inversion_other + mesh_construction": 0.006118300000000001, + "inversion_other + ray_trace_data_grid": 0.004780799999999999, + "grids_and_structures + mass_profile_deflections": 0.0042303, + "mapping_matrix + regularization_H": 0.0040414, + "chi_squared_evidence + inversion_other": 0.0019550999999999995 + }, + "example_kernels": { + "curvature_matrix_F + psf_convolution_mapping_matrix": [ + "loop_divide_gather_fusion" + ], + "inversion_other + mapped_reconstruction + pdip_solve + reconstruction_scatter": [ + "loop_add_multiply_fusion" + ], + "inversion_other + regularization_H": [ + "input_scatter_fusion.3", + "input_scatter_fusion.4", + "input_scatter_fusion.1", + "input_scatter_fusion.2" + ], + "curvature_reg_reduce_gather + inversion_other": [ + "input_transpose_fusion.3" + ], + "border_relocator + pdip_solve": [ + "loop_compare_fusion.4", + "input_transpose_fusion.5" + ], + "border_relocator + inversion_other + mapping_matrix + mesh_construction": [ + "input_scatter_fusion.10", + "loop_select_fusion.6" + ], + "inversion_other + mapping_matrix + mesh_construction": [ + "input_scatter_fusion.6" + ], + "grids_and_structures + mass_profile_deflections + ray_trace_data_grid": [ + "loop_sqrt_fusion", + "loop_slice_fusion", + "loop_subtract_fusion.1" + ], + "inversion_other + mesh_construction": [ + "loop_add_fusion.4", + "input_concatenate_fusion.4" + ], + "inversion_other + mapped_reconstruction + reconstruction_scatter": [ + "loop_rsqrt_fusion", + "loop_multiply_fusion.2" + ] + }, + "prorated_estimate_ms": { + "curvature_matrix_F": 8.58181745, + "psf_convolution_mapping_matrix": 8.58181745, + "inversion_other": 1.0842747333333334, + "pdip_solve": 0.665912775, + "mapped_reconstruction": 0.5229368249999999, + "reconstruction_scatter": 0.5181098249999999, + "regularization_H": 0.24610719999999994, + "curvature_reg_reduce_gather": 0.24160955, + "border_relocator": 0.19786350833333333, + "mesh_construction": 0.07365305833333333, + "mapping_matrix": 0.053652574999999994, + "ray_trace_data_grid": 0.0175953, + "grids_and_structures": 0.01732005, + "mass_profile_deflections": 0.01732005, + "chi_squared_evidence": 0.0009775499999999998 + }, + "prorated_note": "ESTIMATE ONLY \u2014 a mixed fusion's time split equally across the stages its constituents span. Never summed into the measured table, never reconciled." + }, + "other_sources_ms": { + "copy.52": 0.0805931, + "copy.53": 0.08042639999999997, + "copy.71": 0.03930800000000001, + "copy.61": 0.03908030000000002, + "copy.70": 0.03852670000000006, + "copy.62": 0.03852050000000004, + "loop_reduce_window_fusion.1": 0.005942199999999999, + "loop_slice_fusion.1": 0.0049053000000000005, + "loop_reduce_window_fusion": 0.0033921, + "loop_broadcast_fusion.1": 0.0022528, + "copy.109": 0.0017919999999999998, + "copy.63": 0.0015488000000000001, + "copy.54": 0.0015488 + }, + "device_span_ms": 540.5016544, + "device_busy_ms": 522.5227225, + "device_idle_ms": 17.97893190000002, + "largest_idle_gaps": [ + { + "gap_ms": 0.065341, + "after": "input_concatenate_fusion.8", + "before": "custom-call.2" + }, + { + "gap_ms": 0.057086, + "after": "loop_broadcast_fusion.7", + "before": "loop_broadcast_fusion.9" + }, + { + "gap_ms": 0.030334, + "after": "loop_multiply_fusion.3", + "before": "eigh.0" + }, + { + "gap_ms": 0.025887, + "after": "while.52", + "before": "input_reduce_fusion.1" + }, + { + "gap_ms": 0.023423, + "after": "while.52", + "before": "input_transpose_fusion.1" + }, + { + "gap_ms": 0.020543, + "after": "while.52", + "before": "input_reduce_fusion.1" + }, + { + "gap_ms": 0.019935, + "after": "while.52", + "before": "input_reduce_fusion.1" + }, + { + "gap_ms": 0.018463, + "after": "fusion.431", + "before": "fusion.4" + } + ], + "kernel_ms": 522.460467000009, + "sum_ms": 540.439398900009, + "wall_ms": 540.5738279001525, + "host_outside_span_ms": 0.07217350015253032, + "reconciliation_pct": -0.024867833625191894, + "unjoined_ms": 0.0, + "unjoined_pct": 0.0, + "other_ms": 0.3382115000000001, + "other_pct": 0.06256527462932777, + "note": "Stage rows attribute the command-buffers-OFF program (see the module docstring): kernel times are the same, the launch overhead the CUDA graphs remove is not. sum_ms = kernel rows + device_idle_ms; the residual against wall_ms is host_outside_span_ms (dispatch before the first kernel, teardown after the last).", + "per_stage_ms_per_lane": { + "border_relocator": 0.006213749999999999, + "chi_squared_evidence": 0.001336, + "curvature_matrix_F": 6.213677468749999, + "data_vector_D": 0.133849875, + "inversion_other": 0.8439918437500009, + "mapped_reconstruction": 0.1115513125, + "mapping_matrix": 0.11156440625, + "mesh_construction": 0.06657093749999995, + "mixed_fusion": 1.2991013749999998, + "other": 0.021138218750000007, + "pdip_solve": 16.337129250000558, + "psf_convolution_mapping_matrix": 7.474810124999999, + "ray_trace_data_grid": 0.0008009687500000001, + "regularization_H": 0.03204365625 + }, + "per_lane_divisor": 16, + "host_callback": { + "pure_callback_span_ms": 0, + "qhull_ms": 0.0, + "callback_body_ms_note": "the OUTERMOST matching body event, not a sum: under the probe the body appears twice (the wrapper and the timed re-implementation it calls) and summing them would count the same work twice", + "events_by_name": { + "ThenExecuteCallback:GetEventForComputeStreamSyncPoint": { + "count": 10, + "ms": 0.02179 + } + }, + "note": "HOST milliseconds per traced BATCH (the whole invocation), aggregated by name because the events nest. Not a row of the device table: the device pays for them as the idle gaps largest_idle_gaps names." + }, + "host_callback_ms": 0 + }, + "hlo_census": { + "status": "excluded", + "reason": "The legacy census anchors PyAutoArray source line numbers that moved after the phase-1 run. No batched attribution is published from unsupported anchors; the device-event table and wall reconciliation remain valid." + }, + "trace_split": { + "expected_calls": 10, + "executions_per_invocation": 1, + "method": "per-call (first-instruction recurrence)", + "note": "DECIDED IN CODE: the scalar arm's trace is split by trace_calls * B, so every lane's execution is its own block and the per-stage median is taken over all of them. The vmap arm's is split by trace_calls, one block per batched execution, and per_stage_ms_per_lane divides those rows by B." + } + }, + "scalar": { + "arm": "scalar", + "program": "jax.jit(fn), called B times", + "stands_for": "Nautilus(use_jax_vmap=False, use_jax_jit=True). Plain use_jax_vmap=False is UNJITTED and is NOT this arm", + "hlo_source": "jax.jit(fn).lower(lane_trees[0]) \u2014 the same program phase 1 traced", + "batch_wall_ms": 661.9231335000222, + "wall_production_nesting_ms": 661.9231335000222, + "wall_aot_command_buffers_on_ms": 661.7818452999927, + "wall_aot_command_buffers_off_ms": 667.6247766001325, + "command_buffer_delta_ms": 5.842931300139753, + "production_nesting_vs_aot_on_delta_ms": 0.14128820002952125, + "production_nesting_vs_aot_on_delta_pct": 0.021349663946352865, + "wall_per_lane_ms": 41.37019584375139, + "wall_per_lane_command_buffers_off_ms": 41.72654853750828, + "traced_batch_wall_ms": 684.6893992998957, + "untraced_batch_wall_ms": 667.5470351001422, + "traced_wall_per_lane_ms": 42.793087456243484, + "callback_count_per_call": 0.0, + "callback_count_per_lane": 0.0, + "callback_expectation": "0 \u2014 the rectangular mesh has no qhull host callback (asserted)", + "host_qhull_ms": 0.0, + "host_tables_ms": 0.0, + "host_qhull_ms_per_lane": 0.0, + "host_tables_ms_per_lane": 0.0, + "host_callback_probe": { + "calls": 0, + "qhull_ms_total": 0.0, + "tables_ms_total": 0.0, + "total_ms_total": 0.0, + "qhull_ms_mean": 0.0, + "tables_ms_mean": 0.0, + "total_ms_mean": 0.0, + "non_finite_calls": 0, + "n_points": [] + }, + "host_callback_records_first": [], + "device_idle_ms": 2.2511298937499973, + "device_idle_ms_per_lane": 2.2511298937499973, + "trace": { + "parser": "ProfileData.from_file(xplane) + as_text() + stack_frame_index(proto field 17)", + "stage_audit": { + "mesh_construction": [ + { + "instruction": "fusion.2", + "ms": 0.14868716250000005, + "opcode": "fusion", + "shape": "(f64[15361,2]{1,0}, s64[15361,2]{1,0}, s32[15361,2]{1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:227", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:227 (create_transforms_rank)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:396 (_transforms_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:561 (adaptive_rectangular_mappings_weights_via_interpolation_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:693 (InterpolatorRectangular._mappings_sizes_weights)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "loop_select_fusion", + "ms": 0.039655062499999845, + "opcode": "fusion", + "shape": "(u32[2,15361]{1,0}, u32[2,15361]{1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:69", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:69 (forward_interp)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:573 (adaptive_rectangular_mappings_weights_via_interpolation_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:693 (InterpolatorRectangular._mappings_sizes_weights)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/abstract.py:36 (AbstractInterpolator.mappings)" + ] + }, + { + "instruction": "loop_select_fusion.1", + "ms": 0.03491270624999978, + "opcode": "fusion", + "shape": "(u32[15361]{0}, u32[15361]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:245", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:245 (create_transforms_rank)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:396 (_transforms_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:561 (adaptive_rectangular_mappings_weights_via_interpolation_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:693 (InterpolatorRectangular._mappings_sizes_weights)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "loop_select_fusion.4", + "ms": 0.034876706249999403, + "opcode": "fusion", + "shape": "(u32[15361]{0}, u32[15361]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:245", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:245 (create_transforms_rank)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:396 (_transforms_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:561 (adaptive_rectangular_mappings_weights_via_interpolation_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:693 (InterpolatorRectangular._mappings_sizes_weights)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "loop_add_fusion", + "ms": 0.020992356249999514, + "opcode": "fusion", + "shape": "s64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:69", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:69 (forward_interp)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:573 (adaptive_rectangular_mappings_weights_via_interpolation_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:693 (InterpolatorRectangular._mappings_sizes_weights)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/abstract.py:36 (AbstractInterpolator.mappings)" + ] + }, + { + "instruction": "loop_add_fusion.1", + "ms": 0.02043442499999958, + "opcode": "fusion", + "shape": "s64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:245", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:245 (create_transforms_rank)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:396 (_transforms_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:561 (adaptive_rectangular_mappings_weights_via_interpolation_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:693 (InterpolatorRectangular._mappings_sizes_weights)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "mixed_fusion": [ + { + "instruction": "loop_divide_gather_fusion", + "ms": 0.69834855, + "opcode": "fusion", + "shape": "(f64[15361,1,1,1521]{3,2,1,0}, f64[15361,1,1,1521]{3,2,1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:133", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:133 (curvature_matrix_via_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:93 (InversionImagingMapping.curvature_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:389 (AbstractInversion.curvature_reg_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "loop_add_multiply_fusion", + "ms": 0.08985887499999999, + "opcode": "fusion", + "shape": "(f64[1369,1369]{1,0}, f64[1369,1369]{1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:61", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:61 (initialize)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:72 (solve_nnls)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:129 (_solve_nnls_primal_with..primal)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:164 (solve_nnls_primal_with_status)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:508 (reconstruction_positive_only_from)" + ] + }, + { + "instruction": "input_transpose_fusion.3", + "ms": 0.03090203125, + "opcode": "fusion", + "shape": "f64[1521,1521]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986 (AbstractInversion._log_det_symmetric_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:1157 (AbstractInversion.log_det_regularization_matrix_term)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:348 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/model/analysis.py:135 (AnalysisImaging.log_likelihood_function)" + ] + }, + { + "instruction": "loop_reduce_fusion.1", + "ms": 0.02713931875000001, + "opcode": "fusion", + "shape": "f64[92,2]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:556", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:556 (adaptive_rectangular_mappings_weights_via_interpolation_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:693 (InterpolatorRectangular._mappings_sizes_weights)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/abstract.py:36 (AbstractInterpolator.mappings)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/abstract.py:167 (Mapper.pix_indexes_for_sub_slim_index)" + ] + }, + { + "instruction": "input_transpose_fusion.2", + "ms": 0.02566110000000001, + "opcode": "fusion", + "shape": "f64[1521,1521]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986 (AbstractInversion._log_det_symmetric_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:1078 (AbstractInversion.log_det_curvature_reg_matrix_term)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:347 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/model/analysis.py:135 (AnalysisImaging.log_likelihood_function)" + ] + }, + { + "instruction": "input_transpose_fusion.4", + "ms": 0.016269693750000005, + "opcode": "fusion", + "shape": "f64[1369,1369]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:62", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:62 (initialize)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:72 (solve_nnls)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:129 (_solve_nnls_primal_with..primal)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:164 (solve_nnls_primal_with_status)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:508 (reconstruction_positive_only_from)" + ] + } + ], + "ray_trace_data_grid": [ + { + "instruction": "input_reduce_fusion.16", + "ms": 0.0028033562499999998, + "opcode": "fusion", + "shape": "f64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:506", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:506 (FlatLambdaCDM._simpson_1d)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:644 (FlatLambdaCDM.angular_diameter_distance_kpc_z1z2)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:151 (LensingCosmology.angular_diameter_distance_between_redshifts_in_kpc_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:355 (LensingCosmology.scaling_factor_between_redshifts_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/lens/tracer_util.py:252 (traced_grid_2d_list_from)" + ] + }, + { + "instruction": "input_reduce_fusion.14", + "ms": 0.0027743375, + "opcode": "fusion", + "shape": "f64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:506", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:506 (FlatLambdaCDM._simpson_1d)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:644 (FlatLambdaCDM.angular_diameter_distance_kpc_z1z2)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:133 (LensingCosmology.angular_diameter_distance_to_earth_in_kpc_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:362 (LensingCosmology.scaling_factor_between_redshifts_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/lens/tracer_util.py:252 (traced_grid_2d_list_from)" + ] + }, + { + "instruction": "input_reduce_fusion.15", + "ms": 0.0026159812500000054, + "opcode": "fusion", + "shape": "f64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:503", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:503 (FlatLambdaCDM._simpson_1d)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:644 (FlatLambdaCDM.angular_diameter_distance_kpc_z1z2)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:133 (LensingCosmology.angular_diameter_distance_to_earth_in_kpc_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:362 (LensingCosmology.scaling_factor_between_redshifts_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/lens/tracer_util.py:252 (traced_grid_2d_list_from)" + ] + }, + { + "instruction": "input_reduce_fusion.17", + "ms": 0.00257735, + "opcode": "fusion", + "shape": "f64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:503", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:503 (FlatLambdaCDM._simpson_1d)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:644 (FlatLambdaCDM.angular_diameter_distance_kpc_z1z2)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:151 (LensingCosmology.angular_diameter_distance_between_redshifts_in_kpc_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:355 (LensingCosmology.scaling_factor_between_redshifts_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/lens/tracer_util.py:252 (traced_grid_2d_list_from)" + ] + }, + { + "instruction": "loop_divide_fusion.2", + "ms": 0.002070731250000002, + "opcode": "fusion", + "shape": "f64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:380", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:380 (LensingCosmology.scaling_factor_between_redshifts_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/lens/tracer_util.py:252 (traced_grid_2d_list_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/lens/tracer.py:632 (Tracer.traced_grid_2d_list_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/structures/decorators/abstract.py:93 (AbstractMaker.evaluate_func)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/structures/decorators/abstract.py:110 (AbstractMaker.result)" + ] + } + ], + "border_relocator": [ + { + "instruction": "eigh.0", + "ms": 0.07508699374999986, + "opcode": "custom-call", + "shape": "(f64[2,2]{0,1}, f64[2]{0}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:245", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:245 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:415 (BorderRelocator.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:83 (AbstractMesh.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/rectangular_rtu_adapt_density.py:267 (RectangularRTUAdaptDensity.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "custom-call.2", + "ms": 0.007893050000000006, + "opcode": "custom-call", + "shape": "(f64[2,2]{1,0}, s8[4194304]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:242", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:242 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:415 (BorderRelocator.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:83 (AbstractMesh.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/rectangular_rtu_adapt_density.py:267 (RectangularRTUAdaptDensity.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "input_reduce_fusion.11", + "ms": 0.005195931249999998, + "opcode": "fusion", + "shape": "(f64[], f64[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:270", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:270 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:415 (BorderRelocator.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:83 (AbstractMesh.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/rectangular_rtu_adapt_density.py:267 (RectangularRTUAdaptDensity.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "loop_add_fusion.7", + "ms": 0.00361134374999999, + "opcode": "fusion", + "shape": "f64[15361]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:308", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:308 (relocated_grid_via_ellipse_border_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:423 (BorderRelocator.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:83 (AbstractMesh.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/rectangular_rtu_adapt_density.py:267 (RectangularRTUAdaptDensity.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "input_concatenate_fusion.1", + "ms": 0.0035696999999999973, + "opcode": "fusion", + "shape": "f64[15361,2]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:323", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:323 (relocated_grid_via_ellipse_border_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:423 (BorderRelocator.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:83 (AbstractMesh.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/rectangular_rtu_adapt_density.py:267 (RectangularRTUAdaptDensity.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "loop_select_sine_fusion", + "ms": 0.0033085562499999993, + "opcode": "fusion", + "shape": "(f64[], f64[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:301", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:301 (relocated_grid_via_ellipse_border_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:423 (BorderRelocator.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:83 (AbstractMesh.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/rectangular_rtu_adapt_density.py:267 (RectangularRTUAdaptDensity.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + } + ], + "other": [ + { + "instruction": "copy.31", + "ms": 0.030478974999999475, + "opcode": "copy", + "shape": "u32[2,15361]{1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "copy.32", + "ms": 0.0303792312499996, + "opcode": "copy", + "shape": "u32[2,15361]{1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "copy.49", + "ms": 0.02871175000000049, + "opcode": "copy", + "shape": "u32[15361]{0}", + "source": "", + "stack": [] + }, + { + "instruction": "copy.41", + "ms": 0.02867093750000055, + "opcode": "copy", + "shape": "u32[15361]{0}", + "source": "", + "stack": [] + }, + { + "instruction": "copy.50", + "ms": 0.028484112500000856, + "opcode": "copy", + "shape": "u32[15361]{0}", + "source": "", + "stack": [] + }, + { + "instruction": "copy.40", + "ms": 0.028408175000000962, + "opcode": "copy", + "shape": "u32[15361]{0}", + "source": "", + "stack": [] + } + ], + "mapping_matrix": [ + { + "instruction": "loop_broadcast_fusion.1", + "ms": 0.13644355, + "opcode": "fusion", + "shape": "f64[15361,1521]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:342", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:342 (mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/abstract.py:283 (Mapper.mapping_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:91 (AbstractInversionImaging._mapping_matrix_for_convolution_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:137 (AbstractInversionImaging.operated_mapping_matrix_list)" + ] + }, + { + "instruction": "input_reduce_fusion.25", + "ms": 0.0028621500000000004, + "opcode": "fusion", + "shape": "f64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:93", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:93 (adaptive_pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/abstract.py:507 (Mapper.pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt.py:339 (Adapt.regularization_weights_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt.py:362 (Adapt.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)" + ] + }, + { + "instruction": "loop_divide_fusion.1", + "ms": 0.002349793750000001, + "opcode": "fusion", + "shape": "f64[1521]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:92", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:92 (adaptive_pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/abstract.py:507 (Mapper.pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt.py:339 (Adapt.regularization_weights_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt.py:362 (Adapt.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)" + ] + } + ], + "regularization_H": [ + { + "instruction": "loop_broadcast_fusion.2", + "ms": 0.019296431249999992, + "opcode": "fusion", + "shape": "(f64[1521,1521]{1,0}, f64[1521,1521]{1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt.py:111", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt.py:111 (weighted_regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt.py:366 (Adapt.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:332 (AbstractInversion.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "input_scatter_fusion.8", + "ms": 0.0028075500000000024, + "opcode": "fusion", + "shape": "f64[1521,1521]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt.py:123", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt.py:123 (weighted_regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt.py:366 (Adapt.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:332 (AbstractInversion.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "psf_convolution_mapping_matrix": [ + { + "instruction": "fft.19.0", + "ms": 1.78361086875, + "opcode": "fft", + "shape": "f64[1521,180,180]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "input_scatter_fusion", + "ms": 1.5050567187499995, + "opcode": "fusion", + "shape": "f64[1521,180,180]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "fft.15.0", + "ms": 1.3871463687500003, + "opcode": "fft", + "shape": "c128[1521,180,91]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "fft.17.0", + "ms": 0.9924331812499999, + "opcode": "fft", + "shape": "c128[1521,91,180]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "input_transpose_fusion.1", + "ms": 0.5220780812500002, + "opcode": "fusion", + "shape": "c128[1521,91,180]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "wrapped_transpose.2", + "ms": 0.5072184624999998, + "opcode": "fusion", + "shape": "c128[1521,180,91]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + } + ], + "curvature_matrix_F": [ + { + "instruction": "cublas-lt-matmul.2", + "ms": 4.378591162499999, + "opcode": "custom-call", + "shape": "(f64[1521,1521]{1,0}, s8[4194304]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:134", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:134 (curvature_matrix_via_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:93 (InversionImagingMapping.curvature_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:389 (AbstractInversion.curvature_reg_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "data_vector_D": [ + { + "instruction": "input_reduce_fusion.7", + "ms": 0.1137388000000001, + "opcode": "fusion", + "shape": "f64[92,1521]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/inversion_imaging_util.py:123", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/inversion_imaging_util.py:123 (data_vector_via_blurred_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:67 (InversionImagingMapping.data_vector)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:699 (AbstractInversion.reconstruction)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "input_reduce_fusion.23", + "ms": 0.003733112499999998, + "opcode": "fusion", + "shape": "f64[1521]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/inversion_imaging_util.py:123", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/inversion_imaging_util.py:123 (data_vector_via_blurred_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:67 (InversionImagingMapping.data_vector)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:699 (AbstractInversion.reconstruction)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "inversion_other": [ + { + "instruction": "cholesky.60", + "ms": 0.9182304375000017, + "opcode": "custom-call", + "shape": "(f64[1521,1521]{0,1}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986 (AbstractInversion._log_det_symmetric_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:1078 (AbstractInversion.log_det_curvature_reg_matrix_term)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:347 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/model/analysis.py:135 (AnalysisImaging.log_likelihood_function)" + ] + }, + { + "instruction": "cholesky.70", + "ms": 0.900068837500001, + "opcode": "custom-call", + "shape": "(f64[1521,1521]{0,1}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986 (AbstractInversion._log_det_symmetric_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:1157 (AbstractInversion.log_det_regularization_matrix_term)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:348 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/model/analysis.py:135 (AnalysisImaging.log_likelihood_function)" + ] + }, + { + "instruction": "input_reduce_fusion.13", + "ms": 0.018974237499999998, + "opcode": "fusion", + "shape": "f64[1521]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:946", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:946 (AbstractInversion.regularization_term)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:346 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/model/analysis.py:135 (AnalysisImaging.log_likelihood_function)", + "/mnt/ral/jnightin/autolens_profiling_wt/certified-solver-phase-c1-lane-rate/scripts/imaging/likelihood_breakdown/fixed_light_trace.py:1195 (_captured_likelihood_fn.._likelihood)" + ] + }, + { + "instruction": "loop_reduce_window_fusion.3", + "ms": 0.0057904937499999925, + "opcode": "fusion", + "shape": "s64[6,16]{1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "input_scatter_fusion.11", + "ms": 0.003821343750000001, + "opcode": "fusion", + "shape": "pred[1521]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:526", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:526 (AbstractInversion.zeroed_ids_to_keep)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:567 (AbstractInversion.solve_ids_to_keep)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:684 (AbstractInversion.reconstruction)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "loop_reduce_window_fusion.2", + "ms": 0.003105518750000003, + "opcode": "fusion", + "shape": "s64[86,16]{1,0}", + "source": "", + "stack": [] + } + ], + "pdip_solve": [ + { + "instruction": "cholesky.20", + "ms": 14.245732850000072, + "opcode": "custom-call", + "shape": "(f64[1369,1369]{0,1}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:106", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:106 (factorize_kkt)", + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:212 (pdip_pc_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:83 (solve_nnls)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:129 (_solve_nnls_primal_with..primal)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:164 (solve_nnls_primal_with_status)" + ] + }, + { + "instruction": "triangular-solve", + "ms": 2.1669083187500173, + "opcode": "custom-call", + "shape": "(f64[1369,1]{0,1}, s8[0]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146 (solve_kkt_rhs)", + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:213 (pdip_pc_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:83 (solve_nnls)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:129 (_solve_nnls_primal_with..primal)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:164 (solve_nnls_primal_with_status)" + ] + }, + { + "instruction": "triangular-solve.2", + "ms": 2.078144474999935, + "opcode": "custom-call", + "shape": "(f64[1369,1]{0,1}, s8[0]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146 (solve_kkt_rhs)", + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:217 (pdip_pc_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:83 (solve_nnls)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:129 (_solve_nnls_primal_with..primal)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:164 (solve_nnls_primal_with_status)" + ] + }, + { + "instruction": "triangular-solve.3", + "ms": 2.0590597437499127, + "opcode": "custom-call", + "shape": "(f64[1369,1]{0,1}, s8[0]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146 (solve_kkt_rhs)", + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:217 (pdip_pc_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:83 (solve_nnls)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:129 (_solve_nnls_primal_with..primal)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:164 (solve_nnls_primal_with_status)" + ] + }, + { + "instruction": "triangular-solve.1", + "ms": 2.004522081249921, + "opcode": "custom-call", + "shape": "(f64[1369,1]{0,1}, s8[0]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146 (solve_kkt_rhs)", + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:213 (pdip_pc_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:83 (solve_nnls)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:129 (_solve_nnls_primal_with..primal)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:164 (solve_nnls_primal_with_status)" + ] + }, + { + "instruction": "cholesky.40", + "ms": 0.8455922750000019, + "opcode": "custom-call", + "shape": "(f64[1369,1369]{0,1}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:62", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:62 (initialize)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:72 (solve_nnls)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:129 (_solve_nnls_primal_with..primal)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:164 (solve_nnls_primal_with_status)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:508 (reconstruction_positive_only_from)" + ] + } + ], + "mapped_reconstruction": [ + { + "instruction": "input_reduce_fusion.10", + "ms": 0.11175244374999993, + "opcode": "fusion", + "shape": "f64[15361]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:163", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:163 (mapped_reconstructed_data_via_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:120 (InversionImagingMapping._mapped_reconstructed_data_dict_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:196 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + } + ], + "chi_squared_evidence": [ + { + "instruction": "input_reduce_fusion.22", + "ms": 0.0038462874999999975, + "opcode": "fusion", + "shape": "f64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_util.py:104", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_util.py:104 (noise_normalization_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:98 (AbstractFit.noise_normalization)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:306 (FitDataset.noise_normalization)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:349 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)" + ] + }, + { + "instruction": "input_reduce_fusion.24", + "ms": 0.003808350000000001, + "opcode": "fusion", + "shape": "f64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_util.py:90", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_util.py:90 (chi_squared_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:87 (AbstractFit.chi_squared)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:293 (FitDataset.chi_squared)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:345 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)" + ] + }, + { + "instruction": "loop_multiply_fusion.2", + "ms": 0.0029753624999999955, + "opcode": "fusion", + "shape": "f64[15361]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/abstract_ndarray.py:300", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/abstract_ndarray.py:300 (AbstractNDArray.__pow__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/abstract_ndarray.py:60 (unwrap_array..wrapper)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/abstract_ndarray.py:35 (to_new_array..wrapper)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_util.py:78 (chi_squared_map_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:78 (AbstractFit.chi_squared_map)" + ] + } + ] + }, + "stage_audit_note": "The HLO instructions that contributed most of each stage's milliseconds, with their full source stack. A stage row is only as good as the rules that built it; this is how a reader checks a row against the HLO instead of trusting it.", + "untraced_wall_ms": 41.72168969375889, + "reconciliation_vs_untraced_pct": 2.5323308038244132, + "wall_basis": "wall_ms is the TRACED run's wall, the run these kernel durations came from. untraced_wall_ms is the same executable without the profiler; the difference is the profiler's overhead and belongs in neither the stages nor the idle row.", + "calls": 160, + "call_split": "per-call (first-instruction recurrence)", + "call_blocks": 160, + "events": 149920, + "streams": [ + "Stream #14(MemcpyD2H,Compute,MemcpyH2D,Memset,MemcpyD2D)" + ], + "per_stage_ms": { + "border_relocator": { + "median_ms": 0.10588700000000002, + "min_ms": 0.10514500000000002, + "max_ms": 0.26473800000000003 + }, + "chi_squared_evidence": { + "median_ms": 0.010608, + "min_ms": 0.010303, + "max_ms": 0.011040000000000001 + }, + "curvature_matrix_F": { + "median_ms": 4.3614075, + "min_ms": 4.336079, + "max_ms": 4.532242 + }, + "data_vector_D": { + "median_ms": 0.11744149999999999, + "min_ms": 0.11657200000000001, + "max_ms": 0.118588 + }, + "inversion_other": { + "median_ms": 1.8648995000000002, + "min_ms": 1.8517009999999998, + "max_ms": 1.8848850000000001 + }, + "mapped_reconstruction": { + "median_ms": 0.1117135, + "min_ms": 0.111073, + "max_ms": 0.112604 + }, + "mapping_matrix": { + "median_ms": 0.141658, + "min_ms": 0.141593, + "max_ms": 0.141786 + }, + "memset": { + "median_ms": 0.05356750000000002, + "min_ms": 0.038175, + "max_ms": 0.06268900000000001 + }, + "mesh_construction": { + "median_ms": 0.38247850000000005, + "min_ms": 0.37994000000000033, + "max_ms": 0.38427200000000006 + }, + "mixed_fusion": { + "median_ms": 0.9923545000000001, + "min_ms": 0.989497, + "max_ms": 0.9949700000000001 + }, + "other": { + "median_ms": 0.19586199999999968, + "min_ms": 0.19480499999999976, + "max_ms": 0.1963349999999997 + }, + "pdip_solve": { + "median_ms": 25.223602499999984, + "min_ms": 18.133828999999995, + "max_ms": 29.62129000000002 + }, + "psf_convolution_mapping_matrix": { + "median_ms": 6.9307155, + "min_ms": 6.907947, + "max_ms": 6.949066999999999 + }, + "ray_trace_data_grid": { + "median_ms": 0.012832000000000001, + "min_ms": 0.012735, + "max_ms": 0.013056000000000002 + }, + "regularization_H": { + "median_ms": 0.0220635, + "min_ms": 0.021505, + "max_ms": 0.023230999999999998 + } + }, + "stage_order": [ + "ray_trace_data_grid", + "border_relocator", + "mesh_construction", + "mapping_matrix", + "psf_convolution_mapping_matrix", + "data_vector_D", + "curvature_matrix_F", + "regularization_H", + "pdip_solve", + "mapped_reconstruction", + "chi_squared_evidence", + "inversion_other", + "mixed_fusion", + "other", + "memset" + ], + "mixed_fusion": { + "ms": 0.9923545000000001, + "constituent_stage_sets": { + "curvature_matrix_F + psf_convolution_mapping_matrix": 0.69834855, + "inversion_other + mapped_reconstruction + pdip_solve + reconstruction_scatter": 0.08985887499999999, + "inversion_other + regularization_H": 0.03090203125, + "border_relocator + mesh_construction": 0.030603243750000016, + "curvature_reg_reduce_gather + inversion_other": 0.02566110000000001, + "border_relocator + inversion_other + mapping_matrix + mesh_construction": 0.02049218125000001, + "border_relocator + pdip_solve": 0.016269693750000005, + "inversion_other + mapping_matrix + regularization_H": 0.015486306249999976, + "inversion_other + mapping_matrix + mesh_construction": 0.012841743749999999, + "grids_and_structures + mass_profile_deflections": 0.010084231249999995, + "inversion_other + mapped_reconstruction + reconstruction_scatter": 0.009653781250000002, + "inversion_other + mapped_reconstruction": 0.00894964375, + "inversion_other + mesh_construction": 0.005592074999999995, + "grids_and_structures + mass_profile_deflections + ray_trace_data_grid": 0.005271243749999998, + "inversion_other + ray_trace_data_grid": 0.004773912499999996, + "border_relocator + inversion_other": 0.0033671562500000017, + "border_relocator + inversion_other + mesh_construction": 0.0024583437500000044, + "chi_squared_evidence + inversion_other": 0.0017903500000000007 + }, + "example_kernels": { + "curvature_matrix_F + psf_convolution_mapping_matrix": [ + "loop_divide_gather_fusion" + ], + "inversion_other + mapped_reconstruction + pdip_solve + reconstruction_scatter": [ + "loop_add_multiply_fusion" + ], + "inversion_other + regularization_H": [ + "input_transpose_fusion.3" + ], + "border_relocator + mesh_construction": [ + "loop_reduce_fusion.1", + "loop_select_fusion.5" + ], + "curvature_reg_reduce_gather + inversion_other": [ + "input_transpose_fusion.2" + ], + "border_relocator + inversion_other + mapping_matrix + mesh_construction": [ + "input_scatter_fusion.6", + "input_scatter_fusion.10" + ], + "border_relocator + pdip_solve": [ + "input_transpose_fusion.4" + ], + "inversion_other + mapping_matrix + regularization_H": [ + "input_scatter_fusion.4", + "input_scatter_fusion.5", + "input_scatter_fusion.2", + "input_scatter_fusion.3" + ], + "inversion_other + mapping_matrix + mesh_construction": [ + "input_scatter_fusion.7" + ], + "grids_and_structures + mass_profile_deflections": [ + "loop_divide_minimum_multiply_sine_sqrt_fusion", + "loop_slice_fusion" + ] + }, + "prorated_estimate_ms": { + "curvature_matrix_F": 0.349174275, + "psf_convolution_mapping_matrix": 0.349174275, + "inversion_other": 0.08158595677083331, + "border_relocator": 0.031062540104166682, + "pdip_solve": 0.030599565625, + "mapped_reconstruction": 0.03015746770833333, + "mesh_construction": 0.028320733854166672, + "reconstruction_scatter": 0.02568264583333333, + "regularization_H": 0.020613117708333326, + "mapping_matrix": 0.014565728645833328, + "curvature_reg_reduce_gather": 0.012830550000000005, + "grids_and_structures": 0.006799196874999997, + "mass_profile_deflections": 0.006799196874999997, + "ray_trace_data_grid": 0.004144037499999998, + "chi_squared_evidence": 0.0008951750000000003 + }, + "prorated_note": "ESTIMATE ONLY \u2014 a mixed fusion's time split equally across the stages its constituents span. Never summed into the measured table, never reconciled." + }, + "other_sources_ms": { + "copy.31": 0.030478974999999475, + "copy.32": 0.0303792312499996, + "copy.49": 0.02871175000000049, + "copy.41": 0.02867093750000055, + "copy.50": 0.028484112500000856, + "copy.40": 0.028408175000000962, + "loop_reduce_window_fusion": 0.006472906250000008, + "loop_reduce_window_fusion.1": 0.004344731249999991, + "copy.69": 0.0017843499999999992, + "loop_broadcast_fusion.3": 0.001777775, + "copy.90": 0.0016805625000000017, + "copy.33": 0.0015455687499999983, + "copy.42": 0.0015387749999999985, + "copy.24": 0.001530781249999998 + }, + "device_span_ms": 42.78826123125, + "device_busy_ms": 40.5371313375, + "device_idle_ms": 2.2511298937499973, + "largest_idle_gaps": [ + { + "gap_ms": 0.052894, + "after": "while.28", + "before": "input_scatter_fusion.1" + }, + { + "gap_ms": 0.04707, + "after": "input_concatenate_fusion.4", + "before": "custom-call.2" + }, + { + "gap_ms": 0.036286, + "after": "loop_multiply_fusion.3", + "before": "eigh.0" + }, + { + "gap_ms": 0.033407, + "after": "loop_add_fusion.5", + "before": "loop_select_fusion.4" + }, + { + "gap_ms": 0.032767, + "after": "eigh.0", + "before": "eigh.0" + }, + { + "gap_ms": 0.025247, + "after": "eigh.0", + "before": "eigh.0" + }, + { + "gap_ms": 0.022911, + "after": "loop_add_fusion.1", + "before": "loop_select_fusion.1" + }, + { + "gap_ms": 0.020639, + "after": "loop_broadcast_fusion.6", + "before": "loop_broadcast_fusion.8" + } + ], + "kernel_ms": 40.527090999999984, + "sum_ms": 42.77822089374998, + "wall_ms": 42.793087456243484, + "host_outside_span_ms": 0.004826224993486505, + "reconciliation_pct": -0.034740569978044485, + "unjoined_ms": 0.0, + "unjoined_pct": 0.0, + "other_ms": 0.19586199999999968, + "other_pct": 0.457695416812987, + "note": "Stage rows attribute the command-buffers-OFF program (see the module docstring): kernel times are the same, the launch overhead the CUDA graphs remove is not. sum_ms = kernel rows + device_idle_ms; the residual against wall_ms is host_outside_span_ms (dispatch before the first kernel, teardown after the last).", + "per_stage_ms_per_lane": { + "border_relocator": 0.10588700000000002, + "chi_squared_evidence": 0.010608, + "curvature_matrix_F": 4.3614075, + "data_vector_D": 0.11744149999999999, + "inversion_other": 1.8648995000000002, + "mapped_reconstruction": 0.1117135, + "mapping_matrix": 0.141658, + "memset": 0.05356750000000002, + "mesh_construction": 0.38247850000000005, + "mixed_fusion": 0.9923545000000001, + "other": 0.19586199999999968, + "pdip_solve": 25.223602499999984, + "psf_convolution_mapping_matrix": 6.9307155, + "ray_trace_data_grid": 0.012832000000000001, + "regularization_H": 0.0220635 + }, + "per_lane_divisor": 1, + "host_callback": { + "pure_callback_span_ms": 0, + "qhull_ms": 0.0, + "callback_body_ms_note": "the OUTERMOST matching body event, not a sum: under the probe the body appears twice (the wrapper and the timed re-implementation it calls) and summing them would count the same work twice", + "events_by_name": { + "ThenExecuteCallback:GetEventForComputeStreamSyncPoint": { + "count": 160, + "ms": 0.2949737000000001 + } + }, + "note": "HOST milliseconds per traced BATCH (the whole invocation), aggregated by name because the events nest. Not a row of the device table: the device pays for them as the idle gaps largest_idle_gaps names." + }, + "host_callback_ms": 0 + }, + "hlo_census": { + "status": "excluded", + "reason": "The legacy census anchors PyAutoArray source line numbers that moved after the phase-1 run. No batched attribution is published from unsupported anchors; the device-event table and wall reconciliation remain valid." + }, + "trace_split": { + "expected_calls": 160, + "executions_per_invocation": 16, + "method": "per-call (first-instruction recurrence)", + "note": "DECIDED IN CODE: the scalar arm's trace is split by trace_calls * B, so every lane's execution is its own block and the per-stage median is taken over all of them. The vmap arm's is split by trace_calls, one block per batched execution, and per_stage_ms_per_lane divides those rows by B." + } + } + }, + "certification_report": { + "source": "vmap arm, library solve observed through its stats= out-dict (PyAutoArray #566) and jax.debug.callback(..., ordered=True); ordered because the unordered batching rule returns the lanes permuted. Untimed, separately compiled; max rel diff of its log likelihoods vs the timed arm's: 7.085e-07", + "rows": 0, + "pdip_iter": "NOT AVAILABLE per lane without changing library numerics. The fallback branch calls the library's own reconstruction_positive_only_from, which returns the solution alone \u2014 jax_nnls.solve_nnls' iteration count is discarded inside the library's custom_vjp primal. The PDIP while_loop's cost is in the pdip_solve stage row of each arm's device table instead, which is a max-over-lanes quantity under vmap because every lane runs the same fixed kernel sequence.", + "passes_semantics": "library `passes`: restricted active-set passes run (jax_active_set.solve_certified)" + }, + "lane_construction": { + "draws_sha256": "6bdc2dd94a49d4d0c9095b0fbaa94aad0f0243aedd8fc4dad1391ab796f19d33", + "lane_rows": [ + 300, + 301, + 302, + 303, + 304, + 305, + 306, + 307, + 308, + 309, + 310, + 311, + 312, + 313, + 314, + 315 + ], + "calls": [ + 15 + ], + "stage": "pix1", + "regularization_range": { + "galaxies.source.pixelization.regularization.inner_coefficient": { + "min": 1.5395402868893563e-06, + "max": 631.3270846999916 + }, + "galaxies.source.pixelization.regularization.outer_coefficient": { + "min": 1.585514819488347e-06, + "max": 4.102561528173602 + }, + "galaxies.source.pixelization.regularization.signal_scale": { + "min": 0.06623313471893155, + "max": 0.9779334025364208 + } + }, + "phases": [ + "exploration" + ], + "window_rule": "nautilus_batches.timed_window: consecutive captured calls, in call order, from the FIRST call that is not a prior batch, concatenated and truncated to B; at B == n_batch exactly one real Nautilus batch. Falls back to the latest B lanes if the post-prior lanes run out; never repeats a lane.", + "note": "Lane k is captured lane lane_rows[k]: the mass AND shear of a real Nautilus proposal (nautilus_batch_capture.py), lens light fixed at S3, the S3 light-subtracted dataset shared by every lane. `offsets` in the lane table are the mass offsets from the fiducial; the shear is in the capture file." + }, + "captured": { + "batches_path": "/mnt/ral/jnightin/autolens_profiling_wt/certified-solver-phase-c1-lane-rate/results/breakdown/imaging/nautilus_batches_rectangular_pix1.npz", + "batches_sha256": "c0b62fba544cb62c8a273c19837cf364127f5af7fdaa110f3a2c8a973e0b6cc0", + "schema_version": 2, + "n_calls": 972, + "n_lanes": 19440, + "call_sizes_seen": [ + 20 + ], + "calls_by_phase": { + "prior": 15, + "exploration": 957 + }, + "parameter_paths": [ + "galaxies.source.pixelization.regularization.inner_coefficient", + "galaxies.source.pixelization.regularization.outer_coefficient", + "galaxies.source.pixelization.regularization.signal_scale", + "galaxies.lens.mass.centre.centre_0", + "galaxies.lens.mass.centre.centre_1", + "galaxies.lens.mass.einstein_radius", + "galaxies.lens.mass.ell_comps.ell_comps_0", + "galaxies.lens.mass.ell_comps.ell_comps_1", + "galaxies.lens.shear.gamma_1", + "galaxies.lens.shear.gamma_2" + ], + "stage": "pix1", + "regularization": { + "class": "Adapt", + "free": true, + "priors": { + "inner_coefficient": [ + "LogUniform", + 1e-06, + 1000000.0 + ], + "outer_coefficient": [ + "LogUniform", + 1e-06, + 1000000.0 + ], + "signal_scale": [ + "Uniform", + 0.0, + 1.0 + ] + }, + "priors_source": "PyAutoGalaxy packaged config/priors/regularization (adapt_split.yaml / adapt.yaml / constant.yaml); adapt_split.yaml and adapt.yaml are identical to euclid_strong_lens_modeling_pipeline/config/priors/regularization/'s copies" + }, + "nautilus": { + "departures_from_production": [ + "mass/shear priors are the phase-B cell's Gaussians, not chained from source_lp", + "no positions likelihood", + "the cell's mesh (39x39 RectangularBilinearAdaptImage, weight_power 1, weight_floor 0) fixed in both stages; source_pix_1 uses RectangularBilinearAdaptDensity, source_pix_2 frees weight_power / weight_floor", + "seeded (production passes no seed)", + "quick updates disabled (iterations_per_quick_update=1e12; render-only)", + "NullPaths: no output directory, so no checkpoint and one Sampler.run call", + "post-fit perform_update skipped (samples / latent variables never built)" + ], + "n_batch": 20, + "n_like_max": 40000, + "n_live": 150, + "number_of_cores": 1, + "production_reference": "euclid_strong_lens_modeling_pipeline/scripts/full_model.py source_pix_1 (n_live=150) / source_pix_2 (n_live=75): af.Nautilus(n_batch=20, **SettingsSearch.search_dict) with use_jax_vmap=True and number_of_cores=1 (SettingsSearch defaults)", + "production_stage": "source_pix_1", + "seed": 1, + "stage": "pix1", + "use_jax_vmap": true, + "version": "1.0.5" + }, + "capture_fit_status": "sampling complete (n_like_max or convergence); post-fit result skipped", + "capture_library_revisions": { + "PyAutoArray": { + "head": "3de624b5b91a4efa130dc3cb0a3a0f06f85025a3", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoArray" + }, + "PyAutoFit": { + "head": "dd9fbe0aab60c4a57702b1444ca031b317c91331", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoFit" + }, + "PyAutoGalaxy": { + "head": "70a61e26cd715cefe7012a38285698091246a8a4", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy" + }, + "PyAutoLens": { + "head": "86054bbc19baa2f710a12e04a94fa27ab37cc354", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoLens" + }, + "PyAutoNerves": { + "head": "1fa613aa8d89a79613009fb66f5b4e2d21deb57a", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoNerves" + } + }, + "fingerprint_check": { + "fields": [ + "mesh", + "source_pixels", + "dataset_sha256", + "regularization_class", + "regularization_s0_fiducial", + "border_relocator", + "use_mixed_precision", + "log_evidence_s3_library" + ], + "not_identity": "the regularization coefficients: free per lane since the capture frees them", + "log_evidence_s3_library_rel_diff": 0.0, + "passed": true + }, + "timed_window_vs_capture_pdip": { + "reference": "the capture's own figure of merit (library PDIP, Fitness.call_wrap jax.jit(jax.vmap(call)) over parameter vectors) for the same lanes", + "compared_against": "this cell's jit(vmap) library-PDIP reference", + "n_compared": 16, + "max_rel_diff": 8.124809709918645e-07, + "max_abs_diff_nats": 0.1579329406376928, + "gated": false, + "note": "RECORDED, NOT GATED: proves the lane trees rebuilt here are the models the sampler evaluated (a wrong parameter mapping shows up as nats, not 1e-10)." + } + }, + "matched": { + "vmap_wall_per_lane_ms": 33.22804240624464, + "scalar_wall_per_lane_ms": 41.37019584375139, + "speedup_vmap_over_scalar": 1.2450386134085518, + "note": "Both walls are the PRODUCTION nesting of their arm, measured in one process on the same B lanes with the SAME library Settings (no injection). A speedup below 1 means the batch is slower per lane than B sequential jitted calls." + }, + "solver_source": "library", + "solver": "pdip", + "certified_fallback": "pdip", + "certified_pass_budget": 16, + "certified_pass_budget_basis": "config default (Settings().certified_pass_budget)", + "certified_tau_rel": 1e-09, + "solver_used": "pdip", + "solver_check": { + "solver_used": "pdip", + "solver_used_source": "AbstractInversion.positive_only_solver_used on the fiducial S3 inversion, built eagerly on the JAX backend (AnalysisImaging(use_jax=True).fit_from) with the arms' Settings", + "reference_solver_used": "pdip", + "traced_solver_kwargs_jax": [ + "pdip" + ], + "observed_calls_jax": 1, + "report_rows": 0, + "report_vs_timed_arm_max_rel_diff": 7.085220240320927e-07 + }, + "lanes_certified": [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null + ], + "lanes_passes": [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null + ], + "uncertified_lanes": null, + "per_lane_certification_note": "Not applicable: a library-PDIP row has no certificate or pass count.", + "gate": { + "pre_registered": true, + "gated": [ + "per lane: jit(vmap) arm vs jit(vmap) library PDIP <= lane_rtol relative", + "per lane: scalar jit arm vs scalar jit library PDIP <= lane_rtol relative" + ], + "recorded_not_gated": [ + "per lane: jit(vmap) arm vs scalar jit arm (rel_diff, abs_diff_nats)", + "per lane: jit(vmap) library PDIP vs scalar jit library PDIP", + "uncertified_lanes (certified_fallback=none rows)" + ], + "lanes_failed": 2, + "passed": false, + "policy_eligible": false, + "note": "Pre-registered before submission (module docstring; submit header). Phase 3 (results/notes/hst_gpu_residue_phase3_psf_2026_09.md) placed phase 2's ~2.5e-9 certified-vs-PDIP residual BETWEEN the jit(vmap) and scalar-jit compositions, not in the solver \u2014 so each arm is gated against the library-PDIP reference of its OWN composition, and the cross-composition difference is recorded with its nats. A certified_fallback=none row is policy-eligible only if every lane certifies AND passes the gate. Timing is never gated." + }, + "library_revisions": { + "PyAutoArray": { + "head": "3de624b5b91a4efa130dc3cb0a3a0f06f85025a3", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoArray", + "module_file": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/__init__.py" + }, + "PyAutoFit": { + "head": "dd9fbe0aab60c4a57702b1444ca031b317c91331", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoFit", + "module_file": "/mnt/ral/jnightin/PyAuto/PyAutoFit/autofit/__init__.py" + }, + "PyAutoGalaxy": { + "head": "70a61e26cd715cefe7012a38285698091246a8a4", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy", + "module_file": "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/__init__.py" + }, + "PyAutoLens": { + "head": "86054bbc19baa2f710a12e04a94fa27ab37cc354", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoLens", + "module_file": "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/__init__.py" + }, + "autoarray_file": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/__init__.py" + } + }, + "headline_arm_note": "`trace`, `hlo_census`, `command_buffers` and `trace_timing` above describe the scalar arm \u2014 the program phase 1 traced. Both arms' full blocks, the lane table and the matched comparison are under `vmap`." +} \ No newline at end of file diff --git a/results/breakdown/imaging/fixed_light_trace_rectangular_jitvmap16_captured_pix1_libpdip_fbon_b16_hpc_a100_fp64_fixed_light_trace.png b/results/breakdown/imaging/fixed_light_trace_rectangular_jitvmap16_captured_pix1_libpdip_fbon_b16_hpc_a100_fp64_fixed_light_trace.png new file mode 100644 index 0000000000000000000000000000000000000000..4a5cb1a782265e6f02f41e7e0edb5df827649d82 GIT binary patch literal 145475 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 literal 0 HcmV?d00001 diff --git a/results/breakdown/imaging/fixed_light_trace_rectangular_jitvmap20_captured_pix1_libcertified_fboff_b16_hpc_a100_fp64_fixed_light_trace.json b/results/breakdown/imaging/fixed_light_trace_rectangular_jitvmap20_captured_pix1_libcertified_fboff_b16_hpc_a100_fp64_fixed_light_trace.json new file mode 100644 index 000000000..ae3cdac7e --- /dev/null +++ b/results/breakdown/imaging/fixed_light_trace_rectangular_jitvmap20_captured_pix1_libcertified_fboff_b16_hpc_a100_fp64_fixed_light_trace.json @@ -0,0 +1,5391 @@ +{ + "device": { + "backend": "gpu", + "device": "cuda:0", + "hostname": "euclid-ral-gpu-2", + "xla_flags": "--xla_disable_hlo_passes=constant_folding --xla_gpu_autotune_level=0 --xla_gpu_enable_triton_gemm=false", + "omp_num_threads": null, + "cpu_count": 124, + "jax_compilation_cache_dir": "/mnt/ral/jnightin/autolens_profiling_wt/certified-solver-phase-c1-lane-rate/output/jax_cache/fixed_light_lanerate_rectangular_pix1_time_20_certified_off_350768_25", + "autotune_cache_entries_at_start": 0, + "cache_fresh": true, + "nvidia_smi": "NVIDIA A100 80GB PCIe, 35453 MiB, 81920 MiB" + }, + "machine": { + "cpu_model": "AMD EPYC 7702 64-Core Processor", + "cpu_count_os": 124, + "nproc": 4, + "nproc_all": 124, + "nproc_note": "GNU nproc honours OMP_NUM_THREADS, so `nproc` can print 1 on a multi-core host; `nproc_all` is the core count.", + "ram_total": "928298204 kB", + "kernel": "5.14.0-687.50.1.el9_8.x86_64", + "platform": "Linux-5.14.0-687.50.1.el9_8.x86_64-x86_64-with-glibc2.34", + "python": "3.12.4", + "jax_thread_env": { + "NPROC": null + }, + "blas_thread_env": { + "OMP_NUM_THREADS": null, + "OPENBLAS_NUM_THREADS": null, + "MKL_NUM_THREADS": null, + "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" + }, + "precision": "fp64", + "configuration": { + "pixel_scale_arcsec": 0.05, + "mask_radius_arcsec": 3.5, + "image_pixels_masked": 15361, + "over_sampled_pixels": 62752, + "mesh": "rectangular", + "mesh_shape": [ + 39, + 39 + ], + "source_pixels": 1521, + "source_pixels_requested": null, + "dataset": "hst", + "dataset_sha256": { + "data.fits": "e4e833a28e9c6f6fb023cd85c0d3dde74068720256bc77a240633500e5b04fac", + "noise_map.fits": "315c6266a0acd3ac9c8da82fcd2b45a08697362481fd7a35072bab1658530ba3", + "psf.fits": "8389ba0e8bf4a09b4a561cfc246181a2fb944ed396754cd0ff76fdd22910d303" + }, + "cell_source_sha256": "06a162fcdae6b329384ec33322f443df07215d86e56f0505ac15b3d3473eb432", + "inversion_path": "dense", + "pass_budget": 11, + "pass_budget_basis": "phase 3 (autolens_profiling#255): the smallest ZERO-fallback budget per mesh, the budget a production run fixes. NOT phase 0's certifying budget (2 for Delaunay), which falls back on 67.5 % of a graded draw set and is not a production cost.", + "border_relocator_mode": "cell", + "border_relocator": true, + "border_relocator_note": "'cell' is use_border_relocator=True, which every profiling cell in this family forces; 'library' passes None and takes the shipped config default, which is what production runs. The resolved boolean is what this leg actually ran.", + "routes_selected": [ + "b", + "d" + ], + "trace_calls": 10, + "command_buffers_traced": "off", + "use_mixed_precision": false, + "tau_rel": 1e-09, + "regularization": { + "scheme": "constant", + "coefficient": 1.0 + }, + "thread_env": { + "n_threads": null, + "vars": [ + "OPENBLAS_NUM_THREADS", + "MKL_NUM_THREADS", + "OMP_NUM_THREADS", + "VECLIB_MAXIMUM_THREADS", + "NUMEXPR_NUM_THREADS" + ], + "set_to": null, + "preexisting": {}, + "overridden": {}, + "note": "Not pinned (legacy variant): recorded as found." + }, + "over_sample_size_lp_rule": { + "sub_size_list": [ + 4, + 2, + 2 + ], + "radial_list": [ + 0.3, + 0.6 + ], + "centre": [ + 0.0, + 0.0 + ] + }, + "vmap_batch": 20, + "lanes": "captured", + "arms": [ + "vmap", + "scalar" + ], + "fallback": "off", + "draw_seed": 0, + "vmap_composition": "jax.jit(jax.vmap(fn))", + "lane_rtol": 1e-09, + "vmap_flags_note": "Strict ProfileCLI.parse_cell_args rejects unknown flags. These keys record the exact batching program and prevent historical vmap(jit) artifacts from being mistaken for current jit(vmap) measurements.", + "solver_source": "library", + "solver": "certified", + "certified_fallback": "none", + "certified_pass_budget": 16, + "captured_pass": "time", + "batches": "/mnt/ral/jnightin/autolens_profiling_wt/certified-solver-phase-c1-lane-rate/results/breakdown/imaging/nautilus_batches_rectangular_pix1.npz" + }, + "solver_injection": { + "patched": null, + "part_v": "none \u2014 library mode selects the solver through al.Settings", + "part_b_route_d": { + "patched": "autoarray.inversion.inversion.inversion_util.reconstruction_positive_only_from", + "pass_budget": 11, + "fallback": true + }, + "note": "Library mode (phase B, #300): PART V's arms and references run the library's own positive-only solve, selected by Settings(positive_only_solver, certified_fallback, certified_pass_budget); nothing is injected. PART B's single-call route d (the fiducial d == b pin) still uses the phase-1 harness injection at the phase-3 budget and is not a phase-B row. The untimed certification report observes the library solve (library_solver_observed) without changing it." + }, + "routes": { + "b_s3_pdip": { + "label": "S3 PDIP (source-only)", + "status": "ok", + "solver": "library", + "ms": 38.844548699853476, + "log_likelihood": 28622.39485118912 + }, + "d_s3_certified_fallback": { + "label": "S3 certified active set, budget 11, PDIP fallback", + "status": "ok", + "solver": "harness-injected certified active set", + "pass_budget": 11, + "fallback": true, + "injected_solver_calls_jax": 1, + "injected_solver_calls_numpy": 0, + "ms": 30.167572700156597, + "log_likelihood": 28622.394851189252 + } + }, + "equivalence_pins": [ + { + "pin": "route d (certified, fallback) == route b (library PDIP)", + "route": "d_s3_certified_fallback", + "reference": "b_s3_pdip", + "expectation": "the certified active set returns the library's own positive solution", + "rtol": 1e-09, + "got": 28622.394851189252, + "reference_value": 28622.39485118912, + "rel_diff": 4.575691088611358e-15, + "status": "PASS" + } + ], + "equivalence_rtol": 1e-09, + "reference": { + "log_evidence_s0_library": 28622.394851199875, + "log_evidence_s3_library": 28622.39485119987, + "s3": { + "n_params": 1521, + "n_mapper": 1521, + "n_funcs": 0, + "edge_zeroed_pixels": 152, + "subtracted_light_flux": 5253.476646922047 + } + }, + "command_buffers": { + "wall_on_ms": 625.4916029996821, + "wall_off_ms": 629.4270720001805, + "command_buffer_delta_ms": 3.935469000498415, + "command_buffer_delta_pct": 0.6291801491219084, + "traced": "off", + "compiler_option": "xla_gpu_enable_command_buffer", + "probe": { + "note": "Not taken in --vmap-batch mode: the CUPTI-inside-a-CUDA-graph probe is a phase-1 diagnostic about the JOIN, and this mode already compiles and times both the command-buffers ON and OFF executable of every arm." + }, + "note": "ONE lowering, TWO compilations, one process. wall_on_ms is the PRODUCTION program (CUDA graphs as XLA ships them) and is the number comparable to phase 5's row; wall_off_ms is the graph-less program the stage rows attribute. The delta is the launch overhead the graphs remove \u2014 it lands in device_idle and host_outside_span, not in any stage. Reconciliation is computed against wall_off_ms." + }, + "trace": { + "parser": "ProfileData.from_file(xplane) + as_text() + stack_frame_index(proto field 17)", + "stage_audit": { + "mesh_construction": [ + { + "instruction": "fusion.2", + "ms": 0.14791941999999886, + "opcode": "fusion", + "shape": "(f64[15361,2]{1,0}, s64[15361,2]{1,0}, s32[15361,2]{1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:227", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:227 (create_transforms_rank)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:396 (_transforms_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:561 (adaptive_rectangular_mappings_weights_via_interpolation_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:693 (InterpolatorRectangular._mappings_sizes_weights)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "loop_select_fusion", + "ms": 0.03917319999999952, + "opcode": "fusion", + "shape": "(u32[2,15361]{1,0}, u32[2,15361]{1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:69", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:69 (forward_interp)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:573 (adaptive_rectangular_mappings_weights_via_interpolation_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:693 (InterpolatorRectangular._mappings_sizes_weights)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/abstract.py:36 (AbstractInterpolator.mappings)" + ] + }, + { + "instruction": "loop_select_fusion.3", + "ms": 0.03453038500000075, + "opcode": "fusion", + "shape": "(u32[15361]{0}, u32[15361]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:245", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:245 (create_transforms_rank)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:396 (_transforms_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:561 (adaptive_rectangular_mappings_weights_via_interpolation_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:693 (InterpolatorRectangular._mappings_sizes_weights)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "loop_select_fusion.1", + "ms": 0.034339810000000706, + "opcode": "fusion", + "shape": "(u32[15361]{0}, u32[15361]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:245", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:245 (create_transforms_rank)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:396 (_transforms_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:561 (adaptive_rectangular_mappings_weights_via_interpolation_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:693 (InterpolatorRectangular._mappings_sizes_weights)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "loop_add_fusion", + "ms": 0.020984455000000447, + "opcode": "fusion", + "shape": "s64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:69", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:69 (forward_interp)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:573 (adaptive_rectangular_mappings_weights_via_interpolation_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:693 (InterpolatorRectangular._mappings_sizes_weights)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/abstract.py:36 (AbstractInterpolator.mappings)" + ] + }, + { + "instruction": "loop_add_fusion.3", + "ms": 0.020345205000000262, + "opcode": "fusion", + "shape": "s64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:245", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:245 (create_transforms_rank)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:396 (_transforms_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:561 (adaptive_rectangular_mappings_weights_via_interpolation_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:693 (InterpolatorRectangular._mappings_sizes_weights)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "mixed_fusion": [ + { + "instruction": "loop_divide_gather_fusion", + "ms": 0.6957924149999994, + "opcode": "fusion", + "shape": "(f64[15361,1,1,1521]{3,2,1,0}, f64[15361,1,1,1521]{3,2,1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:133", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:133 (curvature_matrix_via_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:93 (InversionImagingMapping.curvature_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:389 (AbstractInversion.curvature_reg_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "loop_broadcast_fusion.3", + "ms": 0.23343745999999976, + "opcode": "fusion", + "shape": "f64[1521,180,180]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "input_multiply_transpose_fusion", + "ms": 0.18456236000000004, + "opcode": "fusion", + "shape": "(f64[1369,1369]{1,0}, f64[1369,1369]{1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:237 (active_set_search)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:293 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:274 (_certified_positive_only_from)" + ] + }, + { + "instruction": "loop_broadcast_fusion", + "ms": 0.1363833950000001, + "opcode": "fusion", + "shape": "f64[15361,1521]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:342", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:342 (mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/abstract.py:283 (Mapper.mapping_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:91 (AbstractInversionImaging._mapping_matrix_for_convolution_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:137 (AbstractInversionImaging.operated_mapping_matrix_list)" + ] + }, + { + "instruction": "input_reduce_fusion.3", + "ms": 0.11353913499999997, + "opcode": "fusion", + "shape": "f64[92,1521]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/inversion_imaging_util.py:123", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/inversion_imaging_util.py:123 (data_vector_via_blurred_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:67 (InversionImagingMapping.data_vector)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:699 (AbstractInversion.reconstruction)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "input_reduce_fusion.6", + "ms": 0.11184050999999992, + "opcode": "fusion", + "shape": "f64[15361]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:163", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:163 (mapped_reconstructed_data_via_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:120 (InversionImagingMapping._mapped_reconstructed_data_dict_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:196 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + } + ], + "border_relocator": [ + { + "instruction": "eigh.0", + "ms": 0.07397104999999984, + "opcode": "custom-call", + "shape": "(f64[2,2]{0,1}, f64[2]{0}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:245", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:245 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:415 (BorderRelocator.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:83 (AbstractMesh.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/rectangular_rtu_adapt_density.py:267 (RectangularRTUAdaptDensity.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "custom-call.2", + "ms": 0.007906175, + "opcode": "custom-call", + "shape": "(f64[2,2]{1,0}, s8[4194304]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:242", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:242 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:415 (BorderRelocator.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:83 (AbstractMesh.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/rectangular_rtu_adapt_density.py:267 (RectangularRTUAdaptDensity.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "input_reduce_fusion.7", + "ms": 0.005313780000000003, + "opcode": "fusion", + "shape": "(f64[], f64[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:270", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:270 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:415 (BorderRelocator.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:83 (AbstractMesh.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/rectangular_rtu_adapt_density.py:267 (RectangularRTUAdaptDensity.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "loop_add_fusion.5", + "ms": 0.0035868199999999923, + "opcode": "fusion", + "shape": "f64[15361]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:308", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:308 (relocated_grid_via_ellipse_border_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:423 (BorderRelocator.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:83 (AbstractMesh.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/rectangular_rtu_adapt_density.py:267 (RectangularRTUAdaptDensity.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "input_concatenate_fusion.4", + "ms": 0.0023776849999999966, + "opcode": "fusion", + "shape": "f64[392,2]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:238", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:238 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:415 (BorderRelocator.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:83 (AbstractMesh.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/rectangular_rtu_adapt_density.py:267 (RectangularRTUAdaptDensity.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "loop_multiply_fusion.1", + "ms": 0.0015503599999999982, + "opcode": "fusion", + "shape": "f64[2,2]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:245", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:245 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:415 (BorderRelocator.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:83 (AbstractMesh.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/rectangular_rtu_adapt_density.py:267 (RectangularRTUAdaptDensity.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + } + ], + "other": [ + { + "instruction": "copy.41", + "ms": 0.030097644999999295, + "opcode": "copy", + "shape": "u32[2,15361]{1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "copy.42", + "ms": 0.02979979499999904, + "opcode": "copy", + "shape": "u32[2,15361]{1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "copy.59", + "ms": 0.028553500000001345, + "opcode": "copy", + "shape": "u32[15361]{0}", + "source": "", + "stack": [] + }, + { + "instruction": "copy.51", + "ms": 0.028486760000000933, + "opcode": "copy", + "shape": "u32[15361]{0}", + "source": "", + "stack": [] + }, + { + "instruction": "copy.60", + "ms": 0.028346345000000193, + "opcode": "copy", + "shape": "u32[15361]{0}", + "source": "", + "stack": [] + }, + { + "instruction": "copy.50", + "ms": 0.02822736499999981, + "opcode": "copy", + "shape": "u32[15361]{0}", + "source": "", + "stack": [] + } + ], + "pdip_solve": [ + { + "instruction": "cholesky.40", + "ms": 9.184048324999997, + "opcode": "custom-call", + "shape": "(f64[1369,1369]{0,1}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:252 (active_set_search..body_fun)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:262 (active_set_search)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:293 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)" + ] + }, + { + "instruction": "triangular-solve.1", + "ms": 1.6106283850000624, + "opcode": "custom-call", + "shape": "(f64[1369,1]{0,1}, s8[0]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:154", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:154 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:252 (active_set_search..body_fun)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:262 (active_set_search)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:293 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)" + ] + }, + { + "instruction": "triangular-solve", + "ms": 1.3639690900000043, + "opcode": "custom-call", + "shape": "(f64[1369,1]{0,1}, s8[0]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:154", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:154 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:252 (active_set_search..body_fun)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:262 (active_set_search)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:293 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)" + ] + }, + { + "instruction": "cholesky.60", + "ms": 0.8410301000000001, + "opcode": "custom-call", + "shape": "(f64[1369,1369]{0,1}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:237 (active_set_search)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:293 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:274 (_certified_positive_only_from)" + ] + }, + { + "instruction": "cholesky.70", + "ms": 0.8337424149999996, + "opcode": "custom-call", + "shape": "(f64[1369,1369]{0,1}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:297 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:274 (_certified_positive_only_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:496 (reconstruction_positive_only_from)" + ] + }, + { + "instruction": "input_transpose_fusion.1", + "ms": 0.32416548500000025, + "opcode": "fusion", + "shape": "f64[1369,1369]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:252 (active_set_search..body_fun)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:262 (active_set_search)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:293 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)" + ] + } + ], + "mapping_matrix": [ + { + "instruction": "input_reduce_fusion.20", + "ms": 0.0028160800000000077, + "opcode": "fusion", + "shape": "f64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:93", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:93 (adaptive_pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/abstract.py:507 (Mapper.pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt.py:339 (Adapt.regularization_weights_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt.py:362 (Adapt.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)" + ] + } + ], + "regularization_H": [ + { + "instruction": "input_scatter_fusion.8", + "ms": 0.002785044999999994, + "opcode": "fusion", + "shape": "f64[1521,1521]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt.py:123", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt.py:123 (weighted_regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt.py:366 (Adapt.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:332 (AbstractInversion.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "psf_convolution_mapping_matrix": [ + { + "instruction": "fft.19.0", + "ms": 1.7801854650000009, + "opcode": "fft", + "shape": "f64[1521,180,180]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "input_scatter_fusion", + "ms": 1.4222081299999996, + "opcode": "fusion", + "shape": "f64[1521,180,180]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "fft.15.0", + "ms": 1.383124279999999, + "opcode": "fft", + "shape": "c128[1521,180,91]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "fft.17.0", + "ms": 0.9921843850000003, + "opcode": "fft", + "shape": "c128[1521,91,180]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "input_transpose_fusion.2", + "ms": 0.522208855, + "opcode": "fusion", + "shape": "c128[1521,91,180]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "wrapped_transpose.2", + "ms": 0.5077285800000001, + "opcode": "fusion", + "shape": "c128[1521,180,91]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + } + ], + "curvature_matrix_F": [ + { + "instruction": "cublas-lt-matmul.2", + "ms": 4.364650199999999, + "opcode": "custom-call", + "shape": "(f64[1521,1521]{1,0}, s8[4194304]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:134", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:134 (curvature_matrix_via_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:93 (InversionImagingMapping.curvature_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:389 (AbstractInversion.curvature_reg_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "inversion_other": [ + { + "instruction": "cholesky.80", + "ms": 0.9170773750000003, + "opcode": "custom-call", + "shape": "(f64[1521,1521]{0,1}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986 (AbstractInversion._log_det_symmetric_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:1078 (AbstractInversion.log_det_curvature_reg_matrix_term)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:347 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/model/analysis.py:135 (AnalysisImaging.log_likelihood_function)" + ] + }, + { + "instruction": "cholesky.90", + "ms": 0.9005514800000001, + "opcode": "custom-call", + "shape": "(f64[1521,1521]{0,1}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986 (AbstractInversion._log_det_symmetric_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:1157 (AbstractInversion.log_det_regularization_matrix_term)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:348 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/model/analysis.py:135 (AnalysisImaging.log_likelihood_function)" + ] + }, + { + "instruction": "loop_reduce_window_fusion.3", + "ms": 0.0057904199999999845, + "opcode": "fusion", + "shape": "s64[6,16]{1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "loop_reduce_window_fusion.2", + "ms": 0.003016255, + "opcode": "fusion", + "shape": "s64[86,16]{1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "input_scatter_fusion.9", + "ms": 0.002541684999999997, + "opcode": "fusion", + "shape": "s64[1369]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:527", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:527 (AbstractInversion.zeroed_ids_to_keep)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:567 (AbstractInversion.solve_ids_to_keep)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:684 (AbstractInversion.reconstruction)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "loop_broadcast_fusion.4", + "ms": 0.001903655000000006, + "opcode": "fusion", + "shape": "(s64[1369]{0}, s64[1369]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:527", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:527 (AbstractInversion.zeroed_ids_to_keep)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:567 (AbstractInversion.solve_ids_to_keep)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:684 (AbstractInversion.reconstruction)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "chi_squared_evidence": [ + { + "instruction": "loop_multiply_fusion", + "ms": 0.002980560000000002, + "opcode": "fusion", + "shape": "f64[15361]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/abstract_ndarray.py:300", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/abstract_ndarray.py:300 (AbstractNDArray.__pow__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/abstract_ndarray.py:60 (unwrap_array..wrapper)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/abstract_ndarray.py:35 (to_new_array..wrapper)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_util.py:78 (chi_squared_map_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:78 (AbstractFit.chi_squared_map)" + ] + } + ] + }, + "stage_audit_note": "The HLO instructions that contributed most of each stage's milliseconds, with their full source stack. A stage row is only as good as the rules that built it; this is how a reader checks a row against the HLO instead of trusting it.", + "untraced_wall_ms": 31.47432227999161, + "reconciliation_vs_untraced_pct": 18.350516569120963, + "wall_basis": "wall_ms is the TRACED run's wall, the run these kernel durations came from. untraced_wall_ms is the same executable without the profiler; the difference is the profiler's overhead and belongs in neither the stages nor the idle row.", + "calls": 200, + "call_split": "per-call (first-instruction recurrence)", + "call_blocks": 200, + "events": 113200, + "streams": [ + "Stream #14(Memset,MemcpyH2D,Compute,MemcpyD2H,MemcpyD2D)" + ], + "per_stage_ms": { + "border_relocator": { + "median_ms": 0.0962385, + "min_ms": 0.09548400000000003, + "max_ms": 0.09789 + }, + "chi_squared_evidence": { + "median_ms": 0.002944, + "min_ms": 0.002848, + "max_ms": 0.003296 + }, + "curvature_matrix_F": { + "median_ms": 4.34344, + "min_ms": 4.319585, + "max_ms": 4.52188 + }, + "inversion_other": { + "median_ms": 1.8337585, + "min_ms": 1.8192139999999999, + "max_ms": 1.859725 + }, + "mapping_matrix": { + "median_ms": 0.002816, + "min_ms": 0.002783, + "max_ms": 0.002848 + }, + "memset": { + "median_ms": 0.04875100000000002, + "min_ms": 0.014592, + "max_ms": 0.055646 + }, + "mesh_construction": { + "median_ms": 0.34155349999999973, + "min_ms": 0.33909100000000003, + "max_ms": 0.3460510000000002 + }, + "mixed_fusion": { + "median_ms": 1.8479525000000003, + "min_ms": 1.8414889999999997, + "max_ms": 1.8674680000000003 + }, + "other": { + "median_ms": 0.17961899999999983, + "min_ms": 0.17915699999999982, + "max_ms": 0.1817609999999997 + }, + "pdip_solve": { + "median_ms": 20.248789000000006, + "min_ms": 4.648289, + "max_ms": 21.445342000000025 + }, + "psf_convolution_mapping_matrix": { + "median_ms": 6.6073010000000005, + "min_ms": 6.584796, + "max_ms": 6.641968 + }, + "regularization_H": { + "median_ms": 0.002752, + "min_ms": 0.002432, + "max_ms": 0.003104 + } + }, + "stage_order": [ + "border_relocator", + "mesh_construction", + "mapping_matrix", + "psf_convolution_mapping_matrix", + "curvature_matrix_F", + "regularization_H", + "pdip_solve", + "chi_squared_evidence", + "inversion_other", + "mixed_fusion", + "other", + "memset" + ], + "mixed_fusion": { + "ms": 1.8479525000000003, + "constituent_stage_sets": { + "curvature_matrix_F + psf_convolution_mapping_matrix": 0.6957924149999994, + "pdip_solve + psf_convolution_mapping_matrix": 0.23343745999999976, + "inversion_other + mapped_reconstruction + pdip_solve + reconstruction_scatter": 0.18456236000000004, + "mapping_matrix + pdip_solve": 0.1387204599999999, + "data_vector_D + pdip_solve": 0.11724944500000006, + "mapped_reconstruction + pdip_solve": 0.11184050999999992, + "border_relocator + pdip_solve": 0.0706898250000001, + "mesh_construction + pdip_solve": 0.038459690000000005, + "inversion_other + regularization_H": 0.030986109999999997, + "inversion_other + pdip_solve": 0.030264850000000027, + "border_relocator + mesh_construction + pdip_solve": 0.02706815499999997, + "curvature_reg_reduce_gather + inversion_other": 0.02572516500000001, + "border_relocator + inversion_other + mapping_matrix + mesh_construction + pdip_solve": 0.020582390000000002, + "pdip_solve + regularization_H": 0.019288659999999985, + "inversion_other + mapping_matrix + pdip_solve + regularization_H": 0.015457549999999943, + "inversion_other + mapping_matrix + mesh_construction": 0.012928505000000003, + "pdip_solve + ray_trace_data_grid": 0.012831525000000012, + "grids_and_structures + mass_profile_deflections + pdip_solve": 0.009833185000000001, + "inversion_other + mapped_reconstruction + reconstruction_scatter": 0.00966247, + "inversion_other + mapped_reconstruction + pdip_solve": 0.00884491, + "chi_squared_evidence + pdip_solve": 0.0076077999999999806, + "inversion_other + mesh_construction + pdip_solve": 0.005448964999999991, + "grids_and_structures + mass_profile_deflections + ray_trace_data_grid": 0.005233799999999997, + "inversion_other + pdip_solve + ray_trace_data_grid": 0.004809619999999999, + "border_relocator + mesh_construction": 0.0034309399999999973, + "border_relocator + inversion_other": 0.0033405599999999994, + "border_relocator + inversion_other + mesh_construction + pdip_solve": 0.0024160699999999976, + "chi_squared_evidence + inversion_other": 0.0017815449999999979 + }, + "example_kernels": { + "curvature_matrix_F + psf_convolution_mapping_matrix": [ + "loop_divide_gather_fusion" + ], + "pdip_solve + psf_convolution_mapping_matrix": [ + "loop_broadcast_fusion.3" + ], + "inversion_other + mapped_reconstruction + pdip_solve + reconstruction_scatter": [ + "input_multiply_transpose_fusion" + ], + "mapping_matrix + pdip_solve": [ + "loop_divide_fusion.1", + "loop_broadcast_fusion" + ], + "data_vector_D + pdip_solve": [ + "input_reduce_fusion.3", + "input_reduce_fusion.18" + ], + "mapped_reconstruction + pdip_solve": [ + "input_reduce_fusion.6" + ], + "border_relocator + pdip_solve": [ + "input_reduce_fusion.8", + "loop_select_sine_fusion", + "input_concatenate_fusion.1", + "input_transpose_fusion.6" + ], + "mesh_construction + pdip_solve": [ + "loop_multiply_fusion.2", + "loop_pad_fusion", + "loop_reduce_fusion", + "triton_softmax.1" + ], + "inversion_other + regularization_H": [ + "input_transpose_fusion.4" + ], + "inversion_other + pdip_solve": [ + "input_scatter_fusion.11", + "input_reduce_fusion.9", + "input_reduce_fusion.16", + "input_reduce_fusion.4" + ] + }, + "prorated_estimate_ms": { + "psf_convolution_mapping_matrix": 0.4646149374999996, + "pdip_solve": 0.46358886383333325, + "curvature_matrix_F": 0.3478962074999997, + "inversion_other": 0.11467274466666669, + "mapped_reconstruction": 0.10822997166666663, + "mapping_matrix": 0.0816505971666666, + "data_vector_D": 0.05862472250000003, + "border_relocator": 0.052473876333333364, + "reconstruction_scatter": 0.04936141333333334, + "mesh_construction": 0.04081435216666666, + "regularization_H": 0.029001772499999978, + "curvature_reg_reduce_gather": 0.012862582500000006, + "ray_trace_data_grid": 0.009763569166666672, + "grids_and_structures": 0.005022328333333333, + "mass_profile_deflections": 0.005022328333333333, + "chi_squared_evidence": 0.004694672499999989 + }, + "prorated_note": "ESTIMATE ONLY \u2014 a mixed fusion's time split equally across the stages its constituents span. Never summed into the measured table, never reconciled." + }, + "other_sources_ms": { + "copy.41": 0.030097644999999295, + "copy.42": 0.02979979499999904, + "copy.59": 0.028553500000001345, + "copy.51": 0.028486760000000933, + "copy.60": 0.028346345000000193, + "copy.50": 0.02822736499999981, + "copy.96": 0.0016406200000000004, + "copy.95": 0.0016316450000000008, + "copy.34": 0.00146092, + "copy.52": 0.0014163049999999986 + }, + "device_span_ms": 32.41873322, + "device_busy_ms": 30.724625215, + "device_idle_ms": 1.6941080050000004, + "largest_idle_gaps": [ + { + "gap_ms": 0.052638, + "after": "input_concatenate_fusion.4", + "before": "custom-call.2" + }, + { + "gap_ms": 0.038142, + "after": "loop_add_fusion.3", + "before": "loop_select_fusion.3" + }, + { + "gap_ms": 0.035487, + "after": "loop_multiply_fusion.1", + "before": "eigh.0" + }, + { + "gap_ms": 0.027423, + "after": "loop_divide_minimum_multiply_sine_sqrt_fusion", + "before": "loop_slice_fusion" + }, + { + "gap_ms": 0.023263, + "after": "loop_add_fusion.3", + "before": "loop_select_fusion.3" + }, + { + "gap_ms": 0.022655, + "after": "loop_select_fusion", + "before": "copy.41" + }, + { + "gap_ms": 0.020159, + "after": "eigh.0", + "before": "eigh.0" + }, + { + "gap_ms": 0.020063, + "after": "loop_broadcast_fusion.6", + "before": "loop_broadcast_fusion.8" + } + ], + "kernel_ms": 35.555915000000006, + "sum_ms": 37.250023005, + "wall_ms": 32.42277608498625, + "host_outside_span_ms": 0.004042864986253392, + "reconciliation_pct": 14.888444183066307, + "unjoined_ms": 0.0, + "unjoined_pct": 0.0, + "other_ms": 0.17961899999999983, + "other_pct": 0.5539901935885574, + "note": "Stage rows attribute the command-buffers-OFF program (see the module docstring): kernel times are the same, the launch overhead the CUDA graphs remove is not. sum_ms = kernel rows + device_idle_ms; the residual against wall_ms is host_outside_span_ms (dispatch before the first kernel, teardown after the last).", + "per_stage_ms_per_lane": { + "border_relocator": 0.0962385, + "chi_squared_evidence": 0.002944, + "curvature_matrix_F": 4.34344, + "inversion_other": 1.8337585, + "mapping_matrix": 0.002816, + "memset": 0.04875100000000002, + "mesh_construction": 0.34155349999999973, + "mixed_fusion": 1.8479525000000003, + "other": 0.17961899999999983, + "pdip_solve": 20.248789000000006, + "psf_convolution_mapping_matrix": 6.6073010000000005, + "regularization_H": 0.002752 + }, + "per_lane_divisor": 1, + "host_callback": { + "pure_callback_span_ms": 0, + "qhull_ms": 0.0, + "callback_body_ms_note": "the OUTERMOST matching body event, not a sum: under the probe the body appears twice (the wrapper and the timed re-implementation it calls) and summing them would count the same work twice", + "events_by_name": { + "ThenExecuteCallback:GetEventForComputeStreamSyncPoint": { + "count": 200, + "ms": 0.36591979999999985 + } + }, + "note": "HOST milliseconds per traced BATCH (the whole invocation), aggregated by name because the events nest. Not a row of the device table: the device pays for them as the idle gaps largest_idle_gaps names." + }, + "host_callback_ms": 0 + }, + "hlo_census": { + "status": "excluded", + "reason": "The legacy census anchors PyAutoArray source line numbers that moved after the phase-1 run. No batched attribution is published from unsupported anchors; the device-event table and wall reconciliation remain valid." + }, + "stage_map_provenance": [ + { + "label": "log_det_curvature_reg", + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 850, + 882 + ], + "requires": { + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 884, + 896 + ] + }, + "function": null + }, + { + "label": "log_det_regularization", + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 850, + 882 + ], + "requires": { + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 897, + 943 + ] + }, + "function": null + }, + { + "label": "curvature_reg_add", + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 359, + 372 + ], + "requires": null, + "function": null + }, + { + "label": "curvature_reg_reduce_gather", + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 374, + 398 + ], + "requires": null, + "function": null + }, + { + "label": "edge_subset_gather", + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 606, + 614 + ], + "requires": null, + "function": null + }, + { + "label": "regularization_term", + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 786, + 849 + ], + "requires": null, + "function": null + }, + { + "label": "mapped_reconstruction", + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 722, + 785 + ], + "requires": null, + "function": null + }, + { + "label": "reconstruction_scatter", + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 583, + 605 + ], + "requires": null, + "function": null + }, + { + "label": "reconstruction_scatter", + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 615, + 721 + ], + "requires": null, + "function": null + }, + { + "label": "certified_active_set_solve", + "path": "likelihood_breakdown/active_set_steps.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "certified_active_set_solve", + "path": "likelihood_breakdown/library_solver_injection.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "pdip_solve", + "path": "PyAutoArray/autoarray/util/jax_nnls.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "pdip_solve", + "path": "PyAutoArray/autoarray/inversion/inversion/inversion_util.py", + "lines": [ + 256, + 488 + ], + "requires": null, + "function": null + }, + { + "label": "mapped_reconstruction", + "path": "PyAutoArray/autoarray/inversion/inversion/inversion_util.py", + "lines": [ + 156, + 200 + ], + "requires": null, + "function": null + }, + { + "label": "curvature_matrix_F", + "path": "PyAutoArray/autoarray/inversion/inversion/inversion_util.py", + "lines": [ + 12, + 155 + ], + "requires": null, + "function": null + }, + { + "label": "reconstruction_scatter", + "path": "PyAutoArray/autoarray/inversion/inversion/inversion_util.py", + "lines": [ + 201, + 255 + ], + "requires": null, + "function": null + }, + { + "label": "data_vector_D", + "path": "PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py", + "lines": [ + 54, + 73 + ], + "requires": null, + "function": null + }, + { + "label": "curvature_matrix_F", + "path": "PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py", + "lines": [ + 74, + 110 + ], + "requires": null, + "function": null + }, + { + "label": "data_vector_D", + "path": "PyAutoArray/autoarray/inversion/inversion/imaging/inversion_imaging_util.py", + "lines": null, + "requires": null, + "function": "data_vector_via_blurred_mapping_matrix_from" + }, + { + "label": "curvature_matrix_F", + "path": "PyAutoArray/autoarray/inversion/inversion/imaging/inversion_imaging_util.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "psf_convolution_mapping_matrix", + "path": "likelihood_breakdown/psf_cube_injection.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "psf_convolution_mapping_matrix", + "path": "PyAutoArray/autoarray/operators/convolver.py", + "lines": [ + 1086, + 1300 + ], + "requires": null, + "function": null + }, + { + "label": "psf_convolution_mapping_matrix", + "path": "PyAutoArray/autoarray/operators/convolver.py", + "lines": [ + 632, + 642 + ], + "requires": null, + "function": null + }, + { + "label": "psf_convolution_mapping_matrix", + "path": "PyAutoArray/autoarray/operators/convolver.py", + "lines": [ + 670, + 691 + ], + "requires": null, + "function": null + }, + { + "label": "psf_convolution_mapping_matrix", + "path": "PyAutoArray/autoarray/operators/convolver.py", + "lines": null, + "requires": { + "path": "PyAutoArray/autoarray/operators/convolver.py", + "lines": [ + 1086, + 1300 + ] + }, + "function": null + }, + { + "label": "psf_convolution_mapping_matrix", + "path": "PyAutoArray/autoarray/operators/convolver.py", + "lines": null, + "requires": { + "path": "PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py", + "lines": [ + 119, + 150 + ] + }, + "function": null + }, + { + "label": "psf_convolution_image", + "path": "PyAutoArray/autoarray/operators/convolver.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "psf_convolution_mapping_matrix", + "path": "PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py", + "lines": [ + 119, + 150 + ], + "requires": null, + "function": null + }, + { + "label": "mesh_qhull_callback", + "path": "PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py", + "lines": [ + 139, + 172 + ], + "requires": null, + "function": null + }, + { + "label": "mesh_seed_argmin", + "path": "PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py", + "lines": [ + 173, + 207 + ], + "requires": null, + "function": null + }, + { + "label": "mesh_locate_walk", + "path": "PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py", + "lines": [ + 208, + 372 + ], + "requires": null, + "function": null + }, + { + "label": "mesh_dual_areas", + "path": "PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py", + "lines": [ + 373, + 396 + ], + "requires": null, + "function": null + }, + { + "label": "mesh_dual_areas", + "path": "PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py", + "lines": [ + 437, + 494 + ], + "requires": null, + "function": null + }, + { + "label": "mesh_dual_areas", + "path": "PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py", + "lines": [ + 605, + 615 + ], + "requires": null, + "function": null + }, + { + "label": "mesh_interpolation_weights", + "path": "PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py", + "lines": [ + 616, + 695 + ], + "requires": null, + "function": null + }, + { + "label": "mesh_interpolation_weights", + "path": "PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py", + "lines": [ + 896, + 1000 + ], + "requires": null, + "function": null + }, + { + "label": "mesh_construction", + "path": "PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "border_relocator", + "path": "PyAutoArray/autoarray/inversion/mesh/border_relocator.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "mesh_construction", + "path": "PyAutoArray/autoarray/inversion/mesh/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "mapping_matrix", + "path": "PyAutoArray/autoarray/inversion/mappers/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "mapping_matrix", + "path": "PyAutoArray/autoarray/inversion/mappings/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "mapping_matrix", + "path": "PyAutoArray/autoarray/inversion/linear_obj/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "regularization_H", + "path": "PyAutoArray/autoarray/inversion/regularization/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "chi_squared_evidence", + "path": "PyAutoArray/autoarray/fit/fit_util.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "chi_squared_evidence", + "path": "PyAutoArray/autoarray/fit/fit_dataset.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "ray_trace_mesh_grid", + "path": "PyAutoLens/autolens/lens/to_inversion.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "ray_trace_mesh_grid", + "path": "PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "mass_profile_deflections", + "path": "PyAutoGalaxy/autogalaxy/profiles/mass/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "light_profile_image", + "path": "PyAutoGalaxy/autogalaxy/profiles/light/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "light_profile_image", + "path": "PyAutoGalaxy/autogalaxy/operate/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "ray_trace_data_grid", + "path": "PyAutoLens/autolens/lens/tracer.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "ray_trace_data_grid", + "path": "PyAutoLens/autolens/lens/tracer_util.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "grids_and_structures", + "path": "PyAutoArray/autoarray/structures/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "grids_and_structures", + "path": "PyAutoArray/autoarray/operators/over_sampling/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "grids_and_structures", + "path": "PyAutoArray/autoarray/geometry/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "inversion_other", + "path": "PyAutoArray/autoarray/inversion/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "fit_imaging_other", + "path": "PyAutoLens/autolens/imaging/fit_imaging.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "fit_imaging_other", + "path": "PyAutoGalaxy/autogalaxy/imaging/fit_imaging.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "fit_imaging_other", + "path": "PyAutoArray/autoarray/fit/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "analysis_other", + "path": "PyAutoLens/autolens/analysis/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "analysis_other", + "path": "PyAutoGalaxy/autogalaxy/analysis/", + "lines": null, + "requires": null, + "function": null + } + ], + "trace_timing": { + "traced_wall_ms": 32.42277608498625, + "untraced_wall_ms": 31.47432227999161, + "profiler_overhead_ms": 0.9484538049946423, + "profiler_overhead_pct": 3.013420897699771 + }, + "jit_phases": { + "b_s3_pdip_library_likelihood_jit": { + "lower_s": 1.2749184700005571, + "compile_s": 3.3846504880020802, + "first_call_s": 0.11273022199748084, + "steady_per_call_s": 0.03884454869985347 + }, + "d_s3_certified_fallback_library_likelihood_jit": { + "lower_s": 0.4719663750001928, + "compile_s": 3.7857160179992206, + "first_call_s": 0.04785819799872115, + "steady_per_call_s": 0.030167572700156596 + } + }, + "peak_bytes": { + "after_setup": 85616640, + "after_routes": 1197479168, + "after_all": 23941737984, + "note": "jax.devices()[0].memory_stats()['peak_bytes_in_use']; None on a backend that does not report it (CPU). Process-wide high-water marks." + }, + "note": "Every stage row is a MEASURED sum of GPU kernel durations joined to library source through the optimized HLO of ONE program \u2014 not arithmetic across compilations. The rows attribute the command-buffers-OFF program: kernel time is the same as production, the launch overhead the CUDA graphs remove is not, and command_buffers.* carries both walls and their delta. sum_ms = kernel rows + measured device_idle_ms; the residual against the wall is host_outside_span_ms and is reported, not absorbed. mixed_fusion.prorated_estimate_ms is an ESTIMATE and is never part of the table. No row may be quoted if reconciliation_pct is outside 5 % or unjoined_ms is non-zero.", + "vmap": { + "batch": 20, + "lanes_mode": "captured", + "arms": [ + "vmap", + "scalar" + ], + "draw_seed": 0, + "fallback": false, + "composition": "jax.jit(jax.vmap(fn))", + "composition_provenance": "Current Fitness._vmap after PyAutoFit#1638. Array 343376 used the retired jax.vmap(jax.jit(fn)) composition and is historical evidence only.", + "headline_arm": "scalar", + "lane_rtol": 1e-09, + "lanes": [ + { + "lane": 0, + "draw_name": "call00015_lane00", + "draw_kind": "captured", + "offsets": { + "centre_0": 0.0017002711605432041, + "centre_1": -0.009377257327484623, + "ell_comps_0": -0.002548851608736212, + "ell_comps_1": -0.004262475027349674, + "einstein_radius": -0.0230617600435421 + }, + "log_likelihood_vmap": 18463.288067231657, + "log_likelihood_scalar": 18463.28806683203, + "log_likelihood_library_pdip": 18463.07897110663, + "log_likelihood_library_pdip_scalar": 18463.078970707007, + "rel_diff_vmap_vs_library_pdip": 1.1325095091253122e-05, + "rel_diff_scalar_vs_library_pdip_scalar": 1.1325095091301208e-05, + "abs_diff_nats": 3.996283339802176e-07, + "rel_diff": 2.1644483503353945e-11, + "rel_diff_scalar_vs_library_pdip": 1.1325073446524493e-05, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 3.996246960014105e-07, + "rel_diff_library_pdip_vmap_vs_scalar": 2.1644531588444352e-11, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "FAIL", + "certified": false, + "passes": 16, + "pdip_iter": null + }, + { + "lane": 1, + "draw_name": "call00015_lane01", + "draw_kind": "captured", + "offsets": { + "centre_0": 0.00044835385344320865, + "centre_1": -0.003464237160596487, + "ell_comps_0": -0.0010036884316776545, + "ell_comps_1": 0.0020035511501456356, + "einstein_radius": -0.05761540720338343 + }, + "log_likelihood_vmap": 15734.704790642205, + "log_likelihood_scalar": 15734.7047905047, + "log_likelihood_library_pdip": 15734.21749647698, + "log_likelihood_library_pdip_scalar": 15734.21749633948, + "rel_diff_vmap_vs_library_pdip": 3.0970346338090744e-05, + "rel_diff_scalar_vs_library_pdip_scalar": 3.0970346338130175e-05, + "abs_diff_nats": 1.3750468497164547e-07, + "rel_diff": 8.738942789357215e-12, + "rel_diff_scalar_vs_library_pdip": 3.09703375988773e-05, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 1.3750104699283838e-07, + "rel_diff_library_pdip_vmap_vs_scalar": 8.738982222968992e-12, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "FAIL", + "certified": false, + "passes": 16, + "pdip_iter": null + }, + { + "lane": 2, + "draw_name": "call00015_lane02", + "draw_kind": "captured", + "offsets": { + "centre_0": 0.0017572218110215735, + "centre_1": 0.0022774942133795186, + "ell_comps_0": 0.0023932647815035485, + "ell_comps_1": -0.011727950927316913, + "einstein_radius": -0.027234805142873908 + }, + "log_likelihood_vmap": 18704.474460443, + "log_likelihood_scalar": 18704.474460339556, + "log_likelihood_library_pdip": 18706.16598662583, + "log_likelihood_library_pdip_scalar": 18706.16598652238, + "rel_diff_vmap_vs_library_pdip": 9.042612922596433e-05, + "rel_diff_scalar_vs_library_pdip_scalar": 9.042612922626992e-05, + "abs_diff_nats": 1.0344592737965286e-07, + "rel_diff": 5.530544448014121e-12, + "rel_diff_scalar_vs_library_pdip": 9.042613475600867e-05, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 1.0344956535845995e-07, + "rel_diff_library_pdip_vmap_vs_scalar": 5.530238822482085e-12, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "FAIL", + "certified": false, + "passes": 16, + "pdip_iter": null + }, + { + "lane": 3, + "draw_name": "call00015_lane03", + "draw_kind": "captured", + "offsets": { + "centre_0": -0.002862791114730316, + "centre_1": 0.0038524808804676603, + "ell_comps_0": 0.006111415425061918, + "ell_comps_1": -0.022191169695991525, + "einstein_radius": -0.03531000166767062 + }, + "log_likelihood_vmap": -22166.22174406823, + "log_likelihood_scalar": -22166.221751749792, + "log_likelihood_library_pdip": -22166.221743469505, + "log_likelihood_library_pdip_scalar": -22166.221751660152, + "rel_diff_vmap_vs_library_pdip": 2.701064742043008e-11, + "rel_diff_scalar_vs_library_pdip_scalar": 4.043981821125027e-12, + "abs_diff_nats": 7.681563147343695e-06, + "rel_diff": 3.465436389373537e-10, + "rel_diff_scalar_vs_library_pdip": 3.735542864872366e-10, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 8.190647349692881e-06, + "rel_diff_library_pdip_vmap_vs_scalar": 3.695103045280794e-10, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": true, + "passes": 4, + "pdip_iter": null + }, + { + "lane": 4, + "draw_name": "call00015_lane04", + "draw_kind": "captured", + "offsets": { + "centre_0": 0.0017545152650242774, + "centre_1": 0.005096768299803747, + "ell_comps_0": 0.00015519416981613077, + "ell_comps_1": 0.007279341501820333, + "einstein_radius": -0.03249658545615719 + }, + "log_likelihood_vmap": -194384.1644596323, + "log_likelihood_scalar": NaN, + "log_likelihood_library_pdip": -194384.86841303803, + "log_likelihood_library_pdip_scalar": NaN, + "rel_diff_vmap_vs_library_pdip": 3.621441377988212e-06, + "rel_diff_scalar_vs_library_pdip_scalar": NaN, + "abs_diff_nats": NaN, + "rel_diff": NaN, + "rel_diff_scalar_vs_library_pdip": NaN, + "abs_diff_library_pdip_vmap_vs_scalar_nats": NaN, + "rel_diff_library_pdip_vmap_vs_scalar": NaN, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "FAIL", + "certified": true, + "passes": 2, + "pdip_iter": null + }, + { + "lane": 5, + "draw_name": "call00015_lane05", + "draw_kind": "captured", + "offsets": { + "centre_0": -0.0009851407640018856, + "centre_1": 0.002274591191563648, + "ell_comps_0": 0.006006903437417319, + "ell_comps_1": 0.008497457839948512, + "einstein_radius": -0.07242218866013372 + }, + "log_likelihood_vmap": 14761.660929765763, + "log_likelihood_scalar": 14761.660929765752, + "log_likelihood_library_pdip": 14761.660929764937, + "log_likelihood_library_pdip_scalar": 14761.66092976493, + "rel_diff_vmap_vs_library_pdip": 5.594364977891205e-14, + "rel_diff_scalar_vs_library_pdip_scalar": 5.56972019825292e-14, + "abs_diff_nats": 1.0913936421275139e-11, + "rel_diff": 7.393433891485766e-16, + "rel_diff_scalar_vs_library_pdip": 5.520430638976343e-14, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 7.275957614183426e-12, + "rel_diff_library_pdip_vmap_vs_scalar": 4.928955927657451e-16, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": true, + "passes": 14, + "pdip_iter": null + }, + { + "lane": 6, + "draw_name": "call00015_lane06", + "draw_kind": "captured", + "offsets": { + "centre_0": -0.002713857824416392, + "centre_1": 0.00891817739575143, + "ell_comps_0": 0.001298959041684998, + "ell_comps_1": -0.0098959428603974, + "einstein_radius": 0.04379561090121875 + }, + "log_likelihood_vmap": 21597.126871220386, + "log_likelihood_scalar": 21597.12687123053, + "log_likelihood_library_pdip": 21597.126871221408, + "log_likelihood_library_pdip_scalar": 21597.126871230605, + "rel_diff_vmap_vs_library_pdip": 4.733370558446683e-14, + "rel_diff_scalar_vs_library_pdip_scalar": 3.5373943675209258e-15, + "abs_diff_nats": 1.0142684914171696e-08, + "rel_diff": 4.696312141261132e-13, + "rel_diff_scalar_vs_library_pdip": 4.222975085418446e-13, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 9.19681042432785e-09, + "rel_diff_library_pdip_vmap_vs_scalar": 4.258349029091857e-13, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": true, + "passes": 6, + "pdip_iter": null + }, + { + "lane": 7, + "draw_name": "call00015_lane07", + "draw_kind": "captured", + "offsets": { + "centre_0": 0.01063269420288399, + "centre_1": -0.0015469073410711704, + "ell_comps_0": -0.012689283848227026, + "ell_comps_1": 0.0004952469855790744, + "einstein_radius": 0.02732727396499479 + }, + "log_likelihood_vmap": 7413.159095088224, + "log_likelihood_scalar": 7413.159096700969, + "log_likelihood_library_pdip": 7413.1590952377155, + "log_likelihood_library_pdip_scalar": 7413.159096788277, + "rel_diff_vmap_vs_library_pdip": 2.016573814489529e-11, + "rel_diff_scalar_vs_library_pdip_scalar": 1.1777415303176189e-11, + "abs_diff_nats": 1.612745109014213e-06, + "rel_diff": 2.1755166562281428e-10, + "rel_diff_scalar_vs_library_pdip": 1.9738592752086062e-10, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 1.5505611372645944e-06, + "rel_diff_library_pdip_vmap_vs_scalar": 2.0916334278275091e-10, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": true, + "passes": 6, + "pdip_iter": null + }, + { + "lane": 8, + "draw_name": "call00015_lane08", + "draw_kind": "captured", + "offsets": { + "centre_0": -0.003586333218755102, + "centre_1": 0.0002442650473125539, + "ell_comps_0": -0.0025095685188555317, + "ell_comps_1": 0.008402687166147546, + "einstein_radius": 0.003809182535237543 + }, + "log_likelihood_vmap": 19066.421358553263, + "log_likelihood_scalar": 19066.42135821115, + "log_likelihood_library_pdip": 19060.202679471306, + "log_likelihood_library_pdip_scalar": 19060.20267912919, + "rel_diff_vmap_vs_library_pdip": 0.000326265107802637, + "rel_diff_scalar_vs_library_pdip_scalar": 0.0003262651078086841, + "abs_diff_nats": 3.421118890400976e-07, + "rel_diff": 1.7943162097000628e-11, + "rel_diff_scalar_vs_library_pdip": 0.0003262650898536207, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 3.421155270189047e-07, + "rel_diff_library_pdip_vmap_vs_scalar": 1.7949207192508986e-11, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "FAIL", + "certified": false, + "passes": 16, + "pdip_iter": null + }, + { + "lane": 9, + "draw_name": "call00015_lane09", + "draw_kind": "captured", + "offsets": { + "centre_0": -0.004569070502203608, + "centre_1": -0.0008437281377326854, + "ell_comps_0": 0.016330335737132294, + "ell_comps_1": 0.007271610957481866, + "einstein_radius": -0.0644363448871137 + }, + "log_likelihood_vmap": 12781.02635455443, + "log_likelihood_scalar": 12781.026354229361, + "log_likelihood_library_pdip": 12782.703321755558, + "log_likelihood_library_pdip_scalar": 12782.70332143049, + "rel_diff_vmap_vs_library_pdip": 0.00013119034048725823, + "rel_diff_scalar_vs_library_pdip_scalar": 0.00013119034049059443, + "abs_diff_nats": 3.250679583288729e-07, + "rel_diff": 2.54336349303673e-11, + "rel_diff_scalar_vs_library_pdip": 0.0001311903659175565, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 3.250679583288729e-07, + "rel_diff_library_pdip_vmap_vs_scalar": 2.543029828314087e-11, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "FAIL", + "certified": false, + "passes": 16, + "pdip_iter": null + }, + { + "lane": 10, + "draw_name": "call00015_lane10", + "draw_kind": "captured", + "offsets": { + "centre_0": 0.00041413552102611065, + "centre_1": -0.004015077828810355, + "ell_comps_0": 0.005329766760357603, + "ell_comps_1": 0.01667480963359283, + "einstein_radius": 0.011021193939315443 + }, + "log_likelihood_vmap": 25442.23680048245, + "log_likelihood_scalar": 25442.236800482457, + "log_likelihood_library_pdip": 25442.23680048129, + "log_likelihood_library_pdip_scalar": 25442.236800481307, + "rel_diff_vmap_vs_library_pdip": 4.561372683396701e-14, + "rel_diff_scalar_vs_library_pdip_scalar": 4.5184757616092685e-14, + "abs_diff_nats": 7.275957614183426e-12, + "rel_diff": 2.8597947858285217e-16, + "rel_diff_scalar_vs_library_pdip": 4.589970631254988e-14, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 1.8189894035458565e-11, + "rel_diff_library_pdip_vmap_vs_scalar": 7.149486964571627e-16, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": true, + "passes": 6, + "pdip_iter": null + }, + { + "lane": 11, + "draw_name": "call00015_lane11", + "draw_kind": "captured", + "offsets": { + "centre_0": -0.00234856906735493, + "centre_1": -0.0005637310462631455, + "ell_comps_0": 0.002190699592912508, + "ell_comps_1": -0.01675931647125419, + "einstein_radius": -0.1186639473801736 + }, + "log_likelihood_vmap": -3234.471614889735, + "log_likelihood_scalar": -3234.4716141754543, + "log_likelihood_library_pdip": -3234.481431636159, + "log_likelihood_library_pdip_scalar": -3234.481430921878, + "rel_diff_vmap_vs_library_pdip": 3.035029457234597e-06, + "rel_diff_scalar_vs_library_pdip_scalar": 3.035029457904832e-06, + "abs_diff_nats": 7.142807589843869e-07, + "rel_diff": 2.2083383136026517e-10, + "rel_diff_scalar_vs_library_pdip": 3.0352502903956714e-06, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 7.142807589843869e-07, + "rel_diff_library_pdip_vmap_vs_scalar": 2.208331611230817e-10, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "FAIL", + "certified": false, + "passes": 16, + "pdip_iter": null + }, + { + "lane": 12, + "draw_name": "call00015_lane12", + "draw_kind": "captured", + "offsets": { + "centre_0": -9.326736988388313e-05, + "centre_1": -0.0013488200741109593, + "ell_comps_0": 0.00997667014421897, + "ell_comps_1": -0.014348588092779897, + "einstein_radius": -0.02126731799195114 + }, + "log_likelihood_vmap": 18887.307347644703, + "log_likelihood_scalar": 18887.3073475926, + "log_likelihood_library_pdip": 18883.933556142838, + "log_likelihood_library_pdip_scalar": 18883.93355609074, + "rel_diff_vmap_vs_library_pdip": 0.00017865936097657688, + "rel_diff_scalar_vs_library_pdip_scalar": 0.00017865936097687714, + "abs_diff_nats": 5.210313247516751e-08, + "rel_diff": 2.758632107599427e-12, + "rel_diff_scalar_vs_library_pdip": 0.00017865935821745192, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 5.209949449636042e-08, + "rel_diff_library_pdip_vmap_vs_scalar": 2.7589323136310487e-12, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "FAIL", + "certified": false, + "passes": 16, + "pdip_iter": null + }, + { + "lane": 13, + "draw_name": "call00015_lane13", + "draw_kind": "captured", + "offsets": { + "centre_0": -0.007013568613743564, + "centre_1": 0.004528745612839986, + "ell_comps_0": -0.018496405934026655, + "ell_comps_1": 0.0014830576999261711, + "einstein_radius": -0.04673040108359361 + }, + "log_likelihood_vmap": 23869.488067817772, + "log_likelihood_scalar": 23869.488067817765, + "log_likelihood_library_pdip": 23869.488067815808, + "log_likelihood_library_pdip_scalar": 23869.4880678158, + "rel_diff_vmap_vs_library_pdip": 8.230208164700236e-14, + "rel_diff_scalar_vs_library_pdip_scalar": 8.230208164700238e-14, + "abs_diff_nats": 7.275957614183426e-12, + "rel_diff": 3.048225246185022e-16, + "rel_diff_scalar_vs_library_pdip": 8.199725912238383e-14, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 7.275957614183426e-12, + "rel_diff_library_pdip_vmap_vs_scalar": 3.048225246185273e-16, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": true, + "passes": 9, + "pdip_iter": null + }, + { + "lane": 14, + "draw_name": "call00015_lane14", + "draw_kind": "captured", + "offsets": { + "centre_0": 0.005108692197125562, + "centre_1": -0.010240010499870703, + "ell_comps_0": -0.00684600823433492, + "ell_comps_1": -0.002573928604858717, + "einstein_radius": -0.0214638151942923 + }, + "log_likelihood_vmap": -177847.93751601427, + "log_likelihood_scalar": NaN, + "log_likelihood_library_pdip": -177848.23960593628, + "log_likelihood_library_pdip_scalar": NaN, + "rel_diff_vmap_vs_library_pdip": 1.6985825818857827e-06, + "rel_diff_scalar_vs_library_pdip_scalar": NaN, + "abs_diff_nats": NaN, + "rel_diff": NaN, + "rel_diff_scalar_vs_library_pdip": NaN, + "abs_diff_library_pdip_vmap_vs_scalar_nats": NaN, + "rel_diff_library_pdip_vmap_vs_scalar": NaN, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "FAIL", + "certified": true, + "passes": 2, + "pdip_iter": null + }, + { + "lane": 15, + "draw_name": "call00015_lane15", + "draw_kind": "captured", + "offsets": { + "centre_0": 0.0015375882948530809, + "centre_1": 0.00010861850037634777, + "ell_comps_0": 0.010624594413718456, + "ell_comps_1": -0.00030576693661378264, + "einstein_radius": 0.018140577124415858 + }, + "log_likelihood_vmap": 25794.9854395605, + "log_likelihood_scalar": 25794.985439518343, + "log_likelihood_library_pdip": 25794.98543959175, + "log_likelihood_library_pdip_scalar": 25794.985439519085, + "rel_diff_vmap_vs_library_pdip": 1.2114850006836214e-12, + "rel_diff_scalar_vs_library_pdip_scalar": 2.877100583703783e-14, + "abs_diff_nats": 4.215689841657877e-08, + "rel_diff": 1.6343059590176666e-12, + "rel_diff_scalar_vs_library_pdip": 2.845790959696637e-12, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 7.266498869284987e-08, + "rel_diff_library_pdip_vmap_vs_scalar": 2.817019953867616e-12, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": true, + "passes": 8, + "pdip_iter": null + }, + { + "lane": 16, + "draw_name": "call00015_lane16", + "draw_kind": "captured", + "offsets": { + "centre_0": 0.001227759218702405, + "centre_1": 0.016003430753678986, + "ell_comps_0": 0.012636219938870381, + "ell_comps_1": -0.00698902153230205, + "einstein_radius": -0.05127757912787545 + }, + "log_likelihood_vmap": 16093.515739414663, + "log_likelihood_scalar": 16093.515739269482, + "log_likelihood_library_pdip": 16088.259041843845, + "log_likelihood_library_pdip_scalar": 16088.259041698664, + "rel_diff_vmap_vs_library_pdip": 0.0003267412314250826, + "rel_diff_scalar_vs_library_pdip_scalar": 0.00032674123142803117, + "abs_diff_nats": 1.45180820254609e-07, + "rel_diff": 9.021075481994033e-12, + "rel_diff_scalar_vs_library_pdip": 0.0003267412224010596, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 1.45180820254609e-07, + "rel_diff_library_pdip_vmap_vs_scalar": 9.024023039305824e-12, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "FAIL", + "certified": false, + "passes": 16, + "pdip_iter": null + }, + { + "lane": 17, + "draw_name": "call00015_lane17", + "draw_kind": "captured", + "offsets": { + "centre_0": -0.005083750984013619, + "centre_1": 0.0010204202759534836, + "ell_comps_0": -0.00849477917205129, + "ell_comps_1": 0.011231146696452643, + "einstein_radius": 0.01601143147676365 + }, + "log_likelihood_vmap": NaN, + "log_likelihood_scalar": NaN, + "log_likelihood_library_pdip": NaN, + "log_likelihood_library_pdip_scalar": NaN, + "rel_diff_vmap_vs_library_pdip": NaN, + "rel_diff_scalar_vs_library_pdip_scalar": NaN, + "abs_diff_nats": NaN, + "rel_diff": NaN, + "rel_diff_scalar_vs_library_pdip": NaN, + "abs_diff_library_pdip_vmap_vs_scalar_nats": NaN, + "rel_diff_library_pdip_vmap_vs_scalar": NaN, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "FAIL", + "certified": true, + "passes": 3, + "pdip_iter": null + }, + { + "lane": 18, + "draw_name": "call00015_lane18", + "draw_kind": "captured", + "offsets": { + "centre_0": -0.0024988577690690035, + "centre_1": -0.001222125045613948, + "ell_comps_0": -0.01895695410631662, + "ell_comps_1": -0.0031279904204321676, + "einstein_radius": 0.01799244839027403 + }, + "log_likelihood_vmap": 18622.433656659538, + "log_likelihood_scalar": 18622.43365615711, + "log_likelihood_library_pdip": 18620.968710658402, + "log_likelihood_library_pdip_scalar": 18620.968710155976, + "rel_diff_vmap_vs_library_pdip": 7.867184698595126e-05, + "rel_diff_scalar_vs_library_pdip_scalar": 7.867184698807396e-05, + "abs_diff_nats": 5.024267011322081e-07, + "rel_diff": 2.6979647795179092e-11, + "rel_diff_scalar_vs_library_pdip": 7.867182000418092e-05, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 5.024267011322081e-07, + "rel_diff_library_pdip_vmap_vs_scalar": 2.6981770333902228e-11, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "FAIL", + "certified": false, + "passes": 16, + "pdip_iter": null + }, + { + "lane": 19, + "draw_name": "call00015_lane19", + "draw_kind": "captured", + "offsets": { + "centre_0": 0.010541543200940506, + "centre_1": -0.008441200101276233, + "ell_comps_0": 0.007996538161425107, + "ell_comps_1": 0.0034133978687523603, + "einstein_radius": -0.09425697178670522 + }, + "log_likelihood_vmap": 7274.769367446595, + "log_likelihood_scalar": 7274.7693668941465, + "log_likelihood_library_pdip": 7217.440786725896, + "log_likelihood_library_pdip_scalar": 7217.440786173451, + "rel_diff_vmap_vs_library_pdip": 0.007943062148308363, + "rel_diff_scalar_vs_library_pdip_scalar": 0.007943062148915846, + "abs_diff_nats": 5.524489097297192e-07, + "rel_diff": 7.594040193821002e-11, + "rel_diff_scalar_vs_library_pdip": 0.007943062071764762, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 5.524452717509121e-07, + "rel_diff_library_pdip_vmap_vs_scalar": 7.654309721657004e-11, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "FAIL", + "certified": false, + "passes": 16, + "pdip_iter": null + } + ], + "lane_pins": [ + { + "pin": "lane 0: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 18463.288067231657, + "reference_value": 18463.07897110663, + "rel_diff": 1.1325095091253122e-05, + "abs_diff_nats": 0.20909612502509844, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 0: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 18463.28806683203, + "reference_value": 18463.078970707007, + "rel_diff": 1.1325095091301208e-05, + "abs_diff_nats": 0.20909612502146047, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 0: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 18463.288067231657, + "reference_value": 18463.28806683203, + "rel_diff": 2.1644483503353945e-11, + "abs_diff_nats": 3.996283339802176e-07, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 0: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 18463.07897110663, + "reference_value": 18463.078970707007, + "rel_diff": 2.1644531588444352e-11, + "abs_diff_nats": 3.996246960014105e-07, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 1: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 15734.704790642205, + "reference_value": 15734.21749647698, + "rel_diff": 3.0970346338090744e-05, + "abs_diff_nats": 0.4872941652247391, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 1: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 15734.7047905047, + "reference_value": 15734.21749633948, + "rel_diff": 3.0970346338130175e-05, + "abs_diff_nats": 0.48729416522110114, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 1: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 15734.704790642205, + "reference_value": 15734.7047905047, + "rel_diff": 8.738942789357215e-12, + "abs_diff_nats": 1.3750468497164547e-07, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 1: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 15734.21749647698, + "reference_value": 15734.21749633948, + "rel_diff": 8.738982222968992e-12, + "abs_diff_nats": 1.3750104699283838e-07, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 2: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 18704.474460443, + "reference_value": 18706.16598662583, + "rel_diff": 9.042612922596433e-05, + "abs_diff_nats": 1.6915261828289658, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 2: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 18704.474460339556, + "reference_value": 18706.16598652238, + "rel_diff": 9.042612922626992e-05, + "abs_diff_nats": 1.6915261828253279, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 2: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 18704.474460443, + "reference_value": 18704.474460339556, + "rel_diff": 5.530544448014121e-12, + "abs_diff_nats": 1.0344592737965286e-07, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 2: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 18706.16598662583, + "reference_value": 18706.16598652238, + "rel_diff": 5.530238822482085e-12, + "abs_diff_nats": 1.0344956535845995e-07, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 3: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -22166.22174406823, + "reference_value": -22166.221743469505, + "rel_diff": 2.701064742043008e-11, + "abs_diff_nats": 5.987240001559258e-07, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 3: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -22166.221751749792, + "reference_value": -22166.221751660152, + "rel_diff": 4.043981821125027e-12, + "abs_diff_nats": 8.963979780673981e-08, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 3: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -22166.22174406823, + "reference_value": -22166.221751749792, + "rel_diff": 3.465436389373537e-10, + "abs_diff_nats": 7.681563147343695e-06, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 3: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -22166.221743469505, + "reference_value": -22166.221751660152, + "rel_diff": 3.695103045280794e-10, + "abs_diff_nats": 8.190647349692881e-06, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 4: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -194384.1644596323, + "reference_value": -194384.86841303803, + "rel_diff": 3.621441377988212e-06, + "abs_diff_nats": 0.7039534057257697, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 4: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": NaN, + "reference_value": NaN, + "rel_diff": NaN, + "abs_diff_nats": NaN, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 4: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -194384.1644596323, + "reference_value": NaN, + "rel_diff": NaN, + "abs_diff_nats": NaN, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 4: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -194384.86841303803, + "reference_value": NaN, + "rel_diff": NaN, + "abs_diff_nats": NaN, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 5: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 14761.660929765763, + "reference_value": 14761.660929764937, + "rel_diff": 5.594364977891205e-14, + "abs_diff_nats": 8.258211892098188e-10, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 5: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 14761.660929765752, + "reference_value": 14761.66092976493, + "rel_diff": 5.56972019825292e-14, + "abs_diff_nats": 8.221832104027271e-10, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 5: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 14761.660929765763, + "reference_value": 14761.660929765752, + "rel_diff": 7.393433891485766e-16, + "abs_diff_nats": 1.0913936421275139e-11, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 5: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 14761.660929764937, + "reference_value": 14761.66092976493, + "rel_diff": 4.928955927657451e-16, + "abs_diff_nats": 7.275957614183426e-12, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 6: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 21597.126871220386, + "reference_value": 21597.126871221408, + "rel_diff": 4.733370558446683e-14, + "abs_diff_nats": 1.0222720447927713e-09, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 6: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 21597.12687123053, + "reference_value": 21597.126871230605, + "rel_diff": 3.5373943675209258e-15, + "abs_diff_nats": 7.639755494892597e-11, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 6: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 21597.126871220386, + "reference_value": 21597.12687123053, + "rel_diff": 4.696312141261132e-13, + "abs_diff_nats": 1.0142684914171696e-08, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 6: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 21597.126871221408, + "reference_value": 21597.126871230605, + "rel_diff": 4.258349029091857e-13, + "abs_diff_nats": 9.19681042432785e-09, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 7: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 7413.159095088224, + "reference_value": 7413.1590952377155, + "rel_diff": 2.016573814489529e-11, + "abs_diff_nats": 1.4949182514101267e-07, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 7: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 7413.159096700969, + "reference_value": 7413.159096788277, + "rel_diff": 1.1777415303176189e-11, + "abs_diff_nats": 8.730785339139402e-08, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 7: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 7413.159095088224, + "reference_value": 7413.159096700969, + "rel_diff": 2.1755166562281428e-10, + "abs_diff_nats": 1.612745109014213e-06, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 7: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 7413.1590952377155, + "reference_value": 7413.159096788277, + "rel_diff": 2.0916334278275091e-10, + "abs_diff_nats": 1.5505611372645944e-06, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 8: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 19066.421358553263, + "reference_value": 19060.202679471306, + "rel_diff": 0.000326265107802637, + "abs_diff_nats": 6.218679081957816, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 8: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 19066.42135821115, + "reference_value": 19060.20267912919, + "rel_diff": 0.0003262651078086841, + "abs_diff_nats": 6.218679081961454, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 8: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 19066.421358553263, + "reference_value": 19066.42135821115, + "rel_diff": 1.7943162097000628e-11, + "abs_diff_nats": 3.421118890400976e-07, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 8: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 19060.202679471306, + "reference_value": 19060.20267912919, + "rel_diff": 1.7949207192508986e-11, + "abs_diff_nats": 3.421155270189047e-07, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 9: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 12781.02635455443, + "reference_value": 12782.703321755558, + "rel_diff": 0.00013119034048725823, + "abs_diff_nats": 1.6769672011287184, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 9: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 12781.026354229361, + "reference_value": 12782.70332143049, + "rel_diff": 0.00013119034049059443, + "abs_diff_nats": 1.6769672011287184, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 9: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 12781.02635455443, + "reference_value": 12781.026354229361, + "rel_diff": 2.54336349303673e-11, + "abs_diff_nats": 3.250679583288729e-07, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 9: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 12782.703321755558, + "reference_value": 12782.70332143049, + "rel_diff": 2.543029828314087e-11, + "abs_diff_nats": 3.250679583288729e-07, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 10: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 25442.23680048245, + "reference_value": 25442.23680048129, + "rel_diff": 4.561372683396701e-14, + "abs_diff_nats": 1.1605152394622564e-09, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 10: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 25442.236800482457, + "reference_value": 25442.236800481307, + "rel_diff": 4.5184757616092685e-14, + "abs_diff_nats": 1.1496013030409813e-09, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 10: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 25442.23680048245, + "reference_value": 25442.236800482457, + "rel_diff": 2.8597947858285217e-16, + "abs_diff_nats": 7.275957614183426e-12, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 10: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 25442.23680048129, + "reference_value": 25442.236800481307, + "rel_diff": 7.149486964571627e-16, + "abs_diff_nats": 1.8189894035458565e-11, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 11: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -3234.471614889735, + "reference_value": -3234.481431636159, + "rel_diff": 3.035029457234597e-06, + "abs_diff_nats": 0.009816746423894074, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 11: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -3234.4716141754543, + "reference_value": -3234.481430921878, + "rel_diff": 3.035029457904832e-06, + "abs_diff_nats": 0.009816746423894074, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 11: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -3234.471614889735, + "reference_value": -3234.4716141754543, + "rel_diff": 2.2083383136026517e-10, + "abs_diff_nats": 7.142807589843869e-07, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 11: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -3234.481431636159, + "reference_value": -3234.481430921878, + "rel_diff": 2.208331611230817e-10, + "abs_diff_nats": 7.142807589843869e-07, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 12: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 18887.307347644703, + "reference_value": 18883.933556142838, + "rel_diff": 0.00017865936097657688, + "abs_diff_nats": 3.3737915018646163, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 12: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 18887.3073475926, + "reference_value": 18883.93355609074, + "rel_diff": 0.00017865936097687714, + "abs_diff_nats": 3.3737915018609783, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 12: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 18887.307347644703, + "reference_value": 18887.3073475926, + "rel_diff": 2.758632107599427e-12, + "abs_diff_nats": 5.210313247516751e-08, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 12: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 18883.933556142838, + "reference_value": 18883.93355609074, + "rel_diff": 2.7589323136310487e-12, + "abs_diff_nats": 5.209949449636042e-08, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 13: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 23869.488067817772, + "reference_value": 23869.488067815808, + "rel_diff": 8.230208164700236e-14, + "abs_diff_nats": 1.964508555829525e-09, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 13: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 23869.488067817765, + "reference_value": 23869.4880678158, + "rel_diff": 8.230208164700238e-14, + "abs_diff_nats": 1.964508555829525e-09, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 13: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 23869.488067817772, + "reference_value": 23869.488067817765, + "rel_diff": 3.048225246185022e-16, + "abs_diff_nats": 7.275957614183426e-12, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 13: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 23869.488067815808, + "reference_value": 23869.4880678158, + "rel_diff": 3.048225246185273e-16, + "abs_diff_nats": 7.275957614183426e-12, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 14: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -177847.93751601427, + "reference_value": -177848.23960593628, + "rel_diff": 1.6985825818857827e-06, + "abs_diff_nats": 0.30208992201369256, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 14: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": NaN, + "reference_value": NaN, + "rel_diff": NaN, + "abs_diff_nats": NaN, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 14: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -177847.93751601427, + "reference_value": NaN, + "rel_diff": NaN, + "abs_diff_nats": NaN, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 14: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -177848.23960593628, + "reference_value": NaN, + "rel_diff": NaN, + "abs_diff_nats": NaN, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 15: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 25794.9854395605, + "reference_value": 25794.98543959175, + "rel_diff": 1.2114850006836214e-12, + "abs_diff_nats": 3.1250237952917814e-08, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 15: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 25794.985439518343, + "reference_value": 25794.985439519085, + "rel_diff": 2.877100583703783e-14, + "abs_diff_nats": 7.421476766467094e-10, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 15: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 25794.9854395605, + "reference_value": 25794.985439518343, + "rel_diff": 1.6343059590176666e-12, + "abs_diff_nats": 4.215689841657877e-08, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 15: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 25794.98543959175, + "reference_value": 25794.985439519085, + "rel_diff": 2.817019953867616e-12, + "abs_diff_nats": 7.266498869284987e-08, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 16: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 16093.515739414663, + "reference_value": 16088.259041843845, + "rel_diff": 0.0003267412314250826, + "abs_diff_nats": 5.256697570817778, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 16: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 16093.515739269482, + "reference_value": 16088.259041698664, + "rel_diff": 0.00032674123142803117, + "abs_diff_nats": 5.256697570817778, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 16: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 16093.515739414663, + "reference_value": 16093.515739269482, + "rel_diff": 9.021075481994033e-12, + "abs_diff_nats": 1.45180820254609e-07, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 16: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 16088.259041843845, + "reference_value": 16088.259041698664, + "rel_diff": 9.024023039305824e-12, + "abs_diff_nats": 1.45180820254609e-07, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 17: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": NaN, + "reference_value": NaN, + "rel_diff": NaN, + "abs_diff_nats": NaN, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 17: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": NaN, + "reference_value": NaN, + "rel_diff": NaN, + "abs_diff_nats": NaN, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 17: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": NaN, + "reference_value": NaN, + "rel_diff": NaN, + "abs_diff_nats": NaN, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 17: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": NaN, + "reference_value": NaN, + "rel_diff": NaN, + "abs_diff_nats": NaN, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 18: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 18622.433656659538, + "reference_value": 18620.968710658402, + "rel_diff": 7.867184698595126e-05, + "abs_diff_nats": 1.4649460011351039, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 18: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 18622.43365615711, + "reference_value": 18620.968710155976, + "rel_diff": 7.867184698807396e-05, + "abs_diff_nats": 1.4649460011351039, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 18: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 18622.433656659538, + "reference_value": 18622.43365615711, + "rel_diff": 2.6979647795179092e-11, + "abs_diff_nats": 5.024267011322081e-07, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 18: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 18620.968710658402, + "reference_value": 18620.968710155976, + "rel_diff": 2.6981770333902228e-11, + "abs_diff_nats": 5.024267011322081e-07, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 19: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 7274.769367446595, + "reference_value": 7217.440786725896, + "rel_diff": 0.007943062148308363, + "abs_diff_nats": 57.32858072069939, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 19: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 7274.7693668941465, + "reference_value": 7217.440786173451, + "rel_diff": 0.007943062148915846, + "abs_diff_nats": 57.328580720695754, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 19: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 7274.769367446595, + "reference_value": 7274.7693668941465, + "rel_diff": 7.594040193821002e-11, + "abs_diff_nats": 5.524489097297192e-07, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 19: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 7217.440786725896, + "reference_value": 7217.440786173451, + "rel_diff": 7.654309721657004e-11, + "abs_diff_nats": 5.524452717509121e-07, + "within_rtol": true, + "status": "RECORDED" + } + ], + "lanes_failed": 13, + "arm_rows": { + "vmap": { + "arm": "vmap", + "program": "jax.jit(jax.vmap(fn))", + "stands_for": "Nautilus(use_jax_vmap=True) \u2014 Fitness._vmap", + "hlo_source": "jax.jit(jax.vmap(fn)).lower(batched_tree) \u2014 the exact current Fitness._vmap composition (PyAutoFit#1638)", + "batch_wall_ms": 529.6629085001769, + "wall_production_nesting_ms": 529.6629085001769, + "wall_aot_command_buffers_on_ms": 530.0135853998654, + "wall_aot_command_buffers_off_ms": 531.1663243999647, + "command_buffer_delta_ms": 1.1527390000992455, + "production_nesting_vs_aot_on_delta_ms": -0.3506768996885512, + "production_nesting_vs_aot_on_delta_pct": -0.06616375680709867, + "wall_per_lane_ms": 26.483145425008843, + "wall_per_lane_command_buffers_off_ms": 26.558316219998233, + "traced_batch_wall_ms": 535.6660600002215, + "untraced_batch_wall_ms": 532.3608561000583, + "traced_wall_per_lane_ms": 26.783303000011074, + "callback_count_per_call": 0.0, + "callback_count_per_lane": 0.0, + "callback_expectation": "0 \u2014 the rectangular mesh has no qhull host callback (asserted)", + "host_qhull_ms": 0.0, + "host_tables_ms": 0.0, + "host_qhull_ms_per_lane": 0.0, + "host_tables_ms_per_lane": 0.0, + "host_callback_probe": { + "calls": 0, + "qhull_ms_total": 0.0, + "tables_ms_total": 0.0, + "total_ms_total": 0.0, + "qhull_ms_mean": 0.0, + "tables_ms_mean": 0.0, + "total_ms_mean": 0.0, + "non_finite_calls": 0, + "n_points": [] + }, + "host_callback_records_first": [], + "device_idle_ms": 11.87105680000002, + "device_idle_ms_per_lane": 0.593552840000001, + "trace": { + "parser": "ProfileData.from_file(xplane) + as_text() + stack_frame_index(proto field 17)", + "stage_audit": { + "mixed_fusion": [ + { + "instruction": "loop_divide_gather_fusion", + "ms": 21.329011, + "opcode": "fusion", + "shape": "(f64[15361,20,1,1,1521]{4,3,2,1,0}, f64[15361,20,1,1,1521]{4,3,2,1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:133", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:133 (curvature_matrix_via_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:93 (InversionImagingMapping.curvature_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:389 (AbstractInversion.curvature_reg_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "input_multiply_transpose_fusion", + "ms": 6.1979612, + "opcode": "fusion", + "shape": "(f64[20,1369,1369]{2,1,0}, f64[20,1369,1369]{2,1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:237 (active_set_search)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:293 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:274 (_certified_positive_only_from)" + ] + }, + { + "instruction": "loop_broadcast_fusion", + "ms": 5.009775500000001, + "opcode": "fusion", + "shape": "f64[20,1521,180,180]{3,2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "input_reduce_fusion.2", + "ms": 2.5756107000000004, + "opcode": "fusion", + "shape": "f64[92,20,1521]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/inversion_imaging_util.py:123", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/inversion_imaging_util.py:123 (data_vector_via_blurred_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:67 (InversionImagingMapping.data_vector)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:699 (AbstractInversion.reconstruction)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "input_reduce_fusion.5", + "ms": 2.2242192000000003, + "opcode": "fusion", + "shape": "f64[15361,20]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:163", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:163 (mapped_reconstructed_data_via_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:120 (InversionImagingMapping._mapped_reconstructed_data_dict_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:196 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "loop_broadcast_fusion.1", + "ms": 2.1761362, + "opcode": "fusion", + "shape": "f64[15361,20,1521]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:353", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:353 (mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/abstract.py:283 (Mapper.mapping_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:91 (AbstractInversionImaging._mapping_matrix_for_convolution_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:137 (AbstractInversionImaging.operated_mapping_matrix_list)" + ] + } + ], + "other": [ + { + "instruction": "copy.60", + "ms": 0.08474270000000002, + "opcode": "copy", + "shape": "u32[20,2,15361]{2,1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "copy.61", + "ms": 0.0836168, + "opcode": "copy", + "shape": "u32[20,2,15361]{2,1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "copy.78", + "ms": 0.07697590000000003, + "opcode": "copy", + "shape": "u32[20,15361]{1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "copy.69", + "ms": 0.07673700000000006, + "opcode": "copy", + "shape": "u32[20,15361]{1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "copy.70", + "ms": 0.07649060000000002, + "opcode": "copy", + "shape": "u32[20,15361]{1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "copy.79", + "ms": 0.07336190000000002, + "opcode": "copy", + "shape": "u32[20,15361]{1,0}", + "source": "", + "stack": [] + } + ], + "mesh_construction": [ + { + "instruction": "fusion.6", + "ms": 0.5154830999999999, + "opcode": "fusion", + "shape": "(f64[20,15361,2]{2,1,0}, s64[20,15361,2]{2,1,0}, s32[20,15361,2]{2,1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:227", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:227 (create_transforms_rank)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:396 (_transforms_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:561 (adaptive_rectangular_mappings_weights_via_interpolation_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:693 (InterpolatorRectangular._mappings_sizes_weights)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "loop_select_fusion", + "ms": 0.21916030000000003, + "opcode": "fusion", + "shape": "(u32[20,2,15361]{2,1,0}, u32[20,2,15361]{2,1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:69", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:69 (forward_interp)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:573 (adaptive_rectangular_mappings_weights_via_interpolation_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:693 (InterpolatorRectangular._mappings_sizes_weights)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/abstract.py:36 (AbstractInterpolator.mappings)" + ] + }, + { + "instruction": "loop_select_fusion.2", + "ms": 0.0923672999999999, + "opcode": "fusion", + "shape": "(u32[20,15361]{1,0}, u32[20,15361]{1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:245", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:245 (create_transforms_rank)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:396 (_transforms_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:561 (adaptive_rectangular_mappings_weights_via_interpolation_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:693 (InterpolatorRectangular._mappings_sizes_weights)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "loop_select_fusion.1", + "ms": 0.08906190000000004, + "opcode": "fusion", + "shape": "(u32[20,15361]{1,0}, u32[20,15361]{1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:245", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:245 (create_transforms_rank)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:396 (_transforms_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:561 (adaptive_rectangular_mappings_weights_via_interpolation_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:693 (InterpolatorRectangular._mappings_sizes_weights)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "loop_subtract_transpose_fusion", + "ms": 0.061060500000000004, + "opcode": "fusion", + "shape": "(f64[20,15361,2]{2,1,0}, f64[614440,1,1,1]{3,2,1,0}, f64[614440,1,1,1]{3,2,1,0}, f64[20,15361,2]{2,1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:69", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:69 (forward_interp)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:573 (adaptive_rectangular_mappings_weights_via_interpolation_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:693 (InterpolatorRectangular._mappings_sizes_weights)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/abstract.py:36 (AbstractInterpolator.mappings)" + ] + }, + { + "instruction": "loop_gather_fusion", + "ms": 0.0303158, + "opcode": "fusion", + "shape": "(f64[614440,1,1,1]{3,2,1,0}, f64[614440,1,1,1]{3,2,1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:69", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:69 (forward_interp)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:573 (adaptive_rectangular_mappings_weights_via_interpolation_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:693 (InterpolatorRectangular._mappings_sizes_weights)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/abstract.py:36 (AbstractInterpolator.mappings)" + ] + } + ], + "border_relocator": [ + { + "instruction": "custom-call.2", + "ms": 0.0421811, + "opcode": "custom-call", + "shape": "(f64[20,2,2]{2,1,0}, s8[4194304]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:242", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:242 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:415 (BorderRelocator.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:83 (AbstractMesh.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/rectangular_rtu_adapt_density.py:267 (RectangularRTUAdaptDensity.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "loop_add_rsqrt_fusion", + "ms": 0.015240800000000002, + "opcode": "fusion", + "shape": "(f64[20,15361]{1,0}, f64[20,15361]{1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:311", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:311 (relocated_grid_via_ellipse_border_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:423 (BorderRelocator.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:83 (AbstractMesh.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/rectangular_rtu_adapt_density.py:267 (RectangularRTUAdaptDensity.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "eigh.0", + "ms": 0.014728999999999997, + "opcode": "custom-call", + "shape": "(f64[20,2,2]{1,2,0}, f64[20,2]{1,0}, s32[20]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:245", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:245 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:415 (BorderRelocator.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:83 (AbstractMesh.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/rectangular_rtu_adapt_density.py:267 (RectangularRTUAdaptDensity.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "loop_abs_fusion", + "ms": 0.003343899999999999, + "opcode": "fusion", + "shape": "(f64[20,392,1]{2,1,0}, f64[20,392,1]{2,1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:269", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:269 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:415 (BorderRelocator.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:83 (AbstractMesh.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/rectangular_rtu_adapt_density.py:267 (RectangularRTUAdaptDensity.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "input_reduce_fusion.7", + "ms": 0.003334399999999999, + "opcode": "fusion", + "shape": "f64[20]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:269", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:269 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:415 (BorderRelocator.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:83 (AbstractMesh.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/rectangular_rtu_adapt_density.py:267 (RectangularRTUAdaptDensity.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "input_reduce_fusion.6", + "ms": 0.0033213999999999995, + "opcode": "fusion", + "shape": "f64[20]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:270", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:270 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:415 (BorderRelocator.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:83 (AbstractMesh.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/rectangular_rtu_adapt_density.py:267 (RectangularRTUAdaptDensity.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + } + ], + "pdip_solve": [ + { + "instruction": "cholesky.40", + "ms": 95.47643780000352, + "opcode": "custom-call", + "shape": "(f64[20,1369,1369]{1,2,0}, s32[20]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:252 (active_set_search..body_fun)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:262 (active_set_search)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:293 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)" + ] + }, + { + "instruction": "triangular-solve", + "ms": 26.60249389999963, + "opcode": "custom-call", + "shape": "(f64[20,1369,1]{1,2,0}, s8[320]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:154", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:154 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:252 (active_set_search..body_fun)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:262 (active_set_search)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:293 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)" + ] + }, + { + "instruction": "triangular-solve.1", + "ms": 24.434630899999586, + "opcode": "custom-call", + "shape": "(f64[20,1369,1]{1,2,0}, s8[320]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:154", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:154 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:252 (active_set_search..body_fun)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:262 (active_set_search)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:293 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)" + ] + }, + { + "instruction": "input_transpose_fusion", + "ms": 13.135902099999997, + "opcode": "fusion", + "shape": "f64[20,1369,1369]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:252 (active_set_search..body_fun)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:262 (active_set_search)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:293 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)" + ] + }, + { + "instruction": "input_transpose_fusion.1", + "ms": 7.746636000000003, + "opcode": "fusion", + "shape": "f64[20,1369,1369]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:252 (active_set_search..body_fun)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:262 (active_set_search)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:293 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)" + ] + }, + { + "instruction": "cholesky.60", + "ms": 6.7328743999999565, + "opcode": "custom-call", + "shape": "(f64[20,1369,1369]{1,2,0}, s32[20]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:237 (active_set_search)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:293 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:274 (_certified_positive_only_from)" + ] + } + ], + "psf_convolution_mapping_matrix": [ + { + "instruction": "input_scatter_fusion", + "ms": 40.861657199999996, + "opcode": "fusion", + "shape": "f64[20,1521,180,180]{3,2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "fft.29.0", + "ms": 35.73501790000001, + "opcode": "fft", + "shape": "f64[20,1521,180,180]{3,2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "fft.25.0", + "ms": 27.2992325, + "opcode": "fft", + "shape": "c128[20,1521,180,91]{3,2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "fft.27.0", + "ms": 19.6710225, + "opcode": "fft", + "shape": "c128[20,1521,91,180]{3,2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "input_transpose_fusion.3", + "ms": 10.6949234, + "opcode": "fusion", + "shape": "c128[20,1521,91,180]{3,2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "wrapped_transpose.2", + "ms": 10.026044099999998, + "opcode": "fusion", + "shape": "c128[20,1521,180,91]{3,2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + } + ], + "regularization_H": [ + { + "instruction": "wrapped_broadcast", + "ms": 0.6165773, + "opcode": "fusion", + "shape": "f64[20,1521,1521]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt.py:124", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt.py:124 (weighted_regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt.py:366 (Adapt.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:332 (AbstractInversion.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "input_scatter_fusion.7", + "ms": 0.0027135, + "opcode": "fusion", + "shape": "f64[1521,1521]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt.py:123", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt.py:123 (weighted_regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt.py:366 (Adapt.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:332 (AbstractInversion.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "mapping_matrix": [ + { + "instruction": "input_scatter_fusion.5", + "ms": 0.0702343, + "opcode": "fusion", + "shape": "f64[20,1521]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:71", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:71 (adaptive_pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/abstract.py:507 (Mapper.pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt.py:339 (Adapt.regularization_weights_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt.py:362 (Adapt.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)" + ] + }, + { + "instruction": "input_reduce_fusion.19", + "ms": 0.0037470999999999997, + "opcode": "fusion", + "shape": "f64[20]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:93", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:93 (adaptive_pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/abstract.py:507 (Mapper.pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt.py:339 (Adapt.regularization_weights_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt.py:362 (Adapt.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)" + ] + }, + { + "instruction": "loop_compare_fusion.4", + "ms": 0.0018110000000000001, + "opcode": "fusion", + "shape": "pred[4]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:54", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:54 (adaptive_pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/abstract.py:507 (Mapper.pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt.py:339 (Adapt.regularization_weights_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt.py:362 (Adapt.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)" + ] + } + ], + "curvature_matrix_F": [ + { + "instruction": "cublas-lt-matmul.2", + "ms": 125.12156979999999, + "opcode": "custom-call", + "shape": "(f64[20,1521,1521]{2,1,0}, s8[4194304]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:134", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:134 (curvature_matrix_via_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:93 (InversionImagingMapping.curvature_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:389 (AbstractInversion.curvature_reg_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "inversion_other": [ + { + "instruction": "cholesky.80", + "ms": 9.312193400000025, + "opcode": "custom-call", + "shape": "(f64[20,1521,1521]{1,2,0}, s32[20]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986 (AbstractInversion._log_det_symmetric_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:1078 (AbstractInversion.log_det_curvature_reg_matrix_term)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:347 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/model/analysis.py:135 (AnalysisImaging.log_likelihood_function)" + ] + }, + { + "instruction": "cholesky.90", + "ms": 9.081469100000024, + "opcode": "custom-call", + "shape": "(f64[20,1521,1521]{1,2,0}, s32[20]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986 (AbstractInversion._log_det_symmetric_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:1157 (AbstractInversion.log_det_regularization_matrix_term)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:348 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/model/analysis.py:135 (AnalysisImaging.log_likelihood_function)" + ] + }, + { + "instruction": "loop_reduce_window_fusion.3", + "ms": 0.0077918, + "opcode": "fusion", + "shape": "s64[6,16]{1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "loop_reduce_window_fusion.2", + "ms": 0.0036927, + "opcode": "fusion", + "shape": "s64[86,16]{1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "input_scatter_fusion.9", + "ms": 0.0031359, + "opcode": "fusion", + "shape": "s64[1369]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:527", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:527 (AbstractInversion.zeroed_ids_to_keep)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:567 (AbstractInversion.solve_ids_to_keep)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:684 (AbstractInversion.reconstruction)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "loop_broadcast_fusion.5", + "ms": 0.0021855, + "opcode": "fusion", + "shape": "(s64[1369]{0}, s64[1369]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:527", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:527 (AbstractInversion.zeroed_ids_to_keep)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:567 (AbstractInversion.solve_ids_to_keep)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:684 (AbstractInversion.reconstruction)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "chi_squared_evidence": [ + { + "instruction": "loop_divide_fusion", + "ms": 0.0050558999999999995, + "opcode": "fusion", + "shape": "f64[15361,20]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/abstract_ndarray.py:352", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/abstract_ndarray.py:352 (AbstractNDArray.__truediv__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/abstract_ndarray.py:57 (unwrap_array..wrapper)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/abstract_ndarray.py:35 (to_new_array..wrapper)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_util.py:78 (chi_squared_map_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:78 (AbstractFit.chi_squared_map)" + ] + } + ] + }, + "stage_audit_note": "The HLO instructions that contributed most of each stage's milliseconds, with their full source stack. A stage row is only as good as the rules that built it; this is how a reader checks a row against the HLO instead of trusting it.", + "untraced_wall_ms": 532.3608561000583, + "reconciliation_vs_untraced_pct": 0.6276938211465525, + "wall_basis": "wall_ms is the TRACED run's wall, the run these kernel durations came from. untraced_wall_ms is the same executable without the profiler; the difference is the profiler's overhead and belongs in neither the stages nor the idle row.", + "calls": 10, + "call_split": "per-call (first-instruction recurrence)", + "call_blocks": 10, + "events": 89130, + "streams": [ + "Stream #14(MemcpyD2D,Compute,MemcpyD2H)" + ], + "per_stage_ms": { + "border_relocator": { + "median_ms": 0.0894835, + "min_ms": 0.08924300000000002, + "max_ms": 0.090139 + }, + "chi_squared_evidence": { + "median_ms": 0.005039999999999999, + "min_ms": 0.004959, + "max_ms": 0.005216 + }, + "curvature_matrix_F": { + "median_ms": 125.113493, + "min_ms": 123.884782, + "max_ms": 126.093803 + }, + "inversion_other": { + "median_ms": 18.42137300000001, + "min_ms": 18.26282199999998, + "max_ms": 18.551284 + }, + "mapping_matrix": { + "median_ms": 0.075549, + "min_ms": 0.074621, + "max_ms": 0.077564 + }, + "mesh_construction": { + "median_ms": 1.1783134999999996, + "min_ms": 1.1696789999999995, + "max_ms": 1.1819579999999996 + }, + "mixed_fusion": { + "median_ms": 43.30739149999999, + "min_ms": 42.71875999999999, + "max_ms": 43.50806599999999 + }, + "other": { + "median_ms": 0.5600315000000002, + "min_ms": 0.5590400000000005, + "max_ms": 0.5609800000000001 + }, + "pdip_solve": { + "median_ms": 190.1846805000013, + "min_ms": 189.838493000001, + "max_ms": 190.51357500000134 + }, + "psf_convolution_mapping_matrix": { + "median_ms": 144.277123, + "min_ms": 144.022279, + "max_ms": 144.610223 + }, + "regularization_H": { + "median_ms": 0.6189169999999999, + "min_ms": 0.6170279999999999, + "max_ms": 0.623172 + } + }, + "stage_order": [ + "border_relocator", + "mesh_construction", + "mapping_matrix", + "psf_convolution_mapping_matrix", + "curvature_matrix_F", + "regularization_H", + "pdip_solve", + "chi_squared_evidence", + "inversion_other", + "mixed_fusion", + "other" + ], + "mixed_fusion": { + "ms": 43.30739149999999, + "constituent_stage_sets": { + "curvature_matrix_F + psf_convolution_mapping_matrix": 21.329011, + "inversion_other + mapped_reconstruction + pdip_solve + reconstruction_scatter": 6.1979612, + "pdip_solve + psf_convolution_mapping_matrix": 5.009775500000001, + "data_vector_D + pdip_solve": 2.5944678, + "mapped_reconstruction + pdip_solve": 2.2242192000000003, + "mapping_matrix + pdip_solve": 2.1792176000000003, + "border_relocator + pdip_solve": 1.7020013999999999, + "inversion_other + regularization_H": 0.6038575, + "curvature_reg_reduce_gather + inversion_other": 0.6020079999999999, + "inversion_other + pdip_solve": 0.2445138, + "border_relocator + inversion_other + mapping_matrix + mesh_construction + pdip_solve": 0.1165399, + "inversion_other + mapping_matrix + mesh_construction + pdip_solve": 0.0856547, + "mesh_construction + pdip_solve": 0.0371634, + "inversion_other + mesh_construction + pdip_solve": 0.036165199999999995, + "grids_and_structures + mass_profile_deflections + ray_trace_data_grid": 0.03495219999999999, + "inversion_other + pdip_solve + regularization_H": 0.0333492, + "border_relocator + mesh_construction": 0.0277908, + "inversion_other + mapped_reconstruction + reconstruction_scatter": 0.0222392, + "grids_and_structures + mass_profile_deflections + pdip_solve + ray_trace_data_grid": 0.019250400000000004, + "pdip_solve + regularization_H": 0.0158013, + "inversion_other + mapping_matrix": 0.013743700000000001, + "pdip_solve + ray_trace_data_grid": 0.013180199999999994, + "inversion_other + mapped_reconstruction": 0.010105499999999998, + "chi_squared_evidence + pdip_solve": 0.0096893, + "border_relocator + inversion_other + pdip_solve": 0.0087135, + "border_relocator + inversion_other + mesh_construction + pdip_solve": 0.006169300000000002, + "inversion_other + pdip_solve + ray_trace_data_grid": 0.0047903999999999985, + "mapping_matrix + pdip_solve + regularization_H": 0.0043487000000000005, + "grids_and_structures + mass_profile_deflections + pdip_solve": 0.0043135000000000005, + "border_relocator + inversion_other + mapping_matrix + mesh_construction": 0.0029086, + "chi_squared_evidence + inversion_other": 0.0023326999999999996 + }, + "example_kernels": { + "curvature_matrix_F + psf_convolution_mapping_matrix": [ + "loop_divide_gather_fusion" + ], + "inversion_other + mapped_reconstruction + pdip_solve + reconstruction_scatter": [ + "input_multiply_transpose_fusion" + ], + "pdip_solve + psf_convolution_mapping_matrix": [ + "loop_broadcast_fusion" + ], + "data_vector_D + pdip_solve": [ + "input_reduce_fusion.2", + "input_reduce_fusion.17" + ], + "mapped_reconstruction + pdip_solve": [ + "input_reduce_fusion.5" + ], + "mapping_matrix + pdip_solve": [ + "loop_broadcast_fusion.1", + "loop_divide_fusion.1" + ], + "border_relocator + pdip_solve": [ + "input_reduce_fusion.8", + "loop_select_sine_fusion", + "input_concatenate_fusion.4", + "input_transpose_fusion.8" + ], + "inversion_other + regularization_H": [ + "input_transpose_fusion.5" + ], + "curvature_reg_reduce_gather + inversion_other": [ + "input_transpose_fusion.4" + ], + "inversion_other + pdip_solve": [ + "input_reduce_fusion.3", + "input_reduce_fusion.4", + "input_scatter_fusion.11", + "input_transpose_fusion.2" + ] + }, + "prorated_estimate_ms": { + "psf_convolution_mapping_matrix": 13.16939325, + "curvature_matrix_F": 10.6645055, + "pdip_solve": 8.646141796666667, + "mapped_reconstruction": 2.674065716666667, + "inversion_other": 2.3698478633333333, + "reconstruction_scatter": 1.5569033666666667, + "data_vector_D": 1.2972339, + "mapping_matrix": 1.1433790216666668, + "border_relocator": 0.8933780549999999, + "regularization_H": 0.3223953666666667, + "curvature_reg_reduce_gather": 0.30100399999999994, + "mesh_construction": 0.09152329666666667, + "ray_trace_data_grid": 0.024650233333333327, + "grids_and_structures": 0.017901166666666662, + "mass_profile_deflections": 0.017901166666666662, + "chi_squared_evidence": 0.006011 + }, + "prorated_note": "ESTIMATE ONLY \u2014 a mixed fusion's time split equally across the stages its constituents span. Never summed into the measured table, never reconciled." + }, + "other_sources_ms": { + "copy.60": 0.08474270000000002, + "copy.61": 0.0836168, + "copy.78": 0.07697590000000003, + "copy.69": 0.07673700000000006, + "copy.70": 0.07649060000000002, + "copy.79": 0.07336190000000002, + "copy.100": 0.03362160000000002, + "copy.99": 0.02541349999999998, + "copy.98": 0.02301719999999999, + "copy.113": 0.0023807, + "copy.53": 0.0019998999999999998, + "copy.62": 0.0016351000000000002 + }, + "device_span_ms": 535.5851436, + "device_busy_ms": 523.7140868, + "device_idle_ms": 11.87105680000002, + "largest_idle_gaps": [ + { + "gap_ms": 0.12969, + "after": "cholesky.40", + "before": "cholesky.40" + }, + { + "gap_ms": 0.091548, + "after": "cholesky.40", + "before": "cholesky.40" + }, + { + "gap_ms": 0.052894, + "after": "input_reduce_fusion.16", + "before": "loop_broadcast_fusion" + }, + { + "gap_ms": 0.04259, + "after": "while.42", + "before": "loop_not_select_fusion" + }, + { + "gap_ms": 0.023967, + "after": "while.42", + "before": "loop_not_select_fusion" + }, + { + "gap_ms": 0.023391, + "after": "while.42", + "before": "loop_not_select_fusion.1" + }, + { + "gap_ms": 0.022847, + "after": "while.42", + "before": "loop_not_select_fusion" + }, + { + "gap_ms": 0.021151, + "after": "while.42", + "before": "loop_not_select_fusion" + } + ], + "kernel_ms": 523.8313955000012, + "sum_ms": 535.7024523000013, + "wall_ms": 535.6660600002215, + "host_outside_span_ms": 0.0809164002214402, + "reconciliation_pct": 0.006793840882836997, + "unjoined_ms": 0.0, + "unjoined_pct": 0.0, + "other_ms": 0.5600315000000002, + "other_pct": 0.10454862493990541, + "note": "Stage rows attribute the command-buffers-OFF program (see the module docstring): kernel times are the same, the launch overhead the CUDA graphs remove is not. sum_ms = kernel rows + device_idle_ms; the residual against wall_ms is host_outside_span_ms (dispatch before the first kernel, teardown after the last).", + "per_stage_ms_per_lane": { + "border_relocator": 0.0044741749999999995, + "chi_squared_evidence": 0.00025199999999999995, + "curvature_matrix_F": 6.2556746500000004, + "inversion_other": 0.9210686500000005, + "mapping_matrix": 0.0037774500000000003, + "mesh_construction": 0.05891567499999998, + "mixed_fusion": 2.1653695749999993, + "other": 0.02800157500000001, + "pdip_solve": 9.509234025000065, + "psf_convolution_mapping_matrix": 7.21385615, + "regularization_H": 0.030945849999999997 + }, + "per_lane_divisor": 20, + "host_callback": { + "pure_callback_span_ms": 0, + "qhull_ms": 0.0, + "callback_body_ms_note": "the OUTERMOST matching body event, not a sum: under the probe the body appears twice (the wrapper and the timed re-implementation it calls) and summing them would count the same work twice", + "events_by_name": { + "ThenExecuteCallback:GetEventForComputeStreamSyncPoint": { + "count": 10, + "ms": 0.0200187 + } + }, + "note": "HOST milliseconds per traced BATCH (the whole invocation), aggregated by name because the events nest. Not a row of the device table: the device pays for them as the idle gaps largest_idle_gaps names." + }, + "host_callback_ms": 0 + }, + "hlo_census": { + "status": "excluded", + "reason": "The legacy census anchors PyAutoArray source line numbers that moved after the phase-1 run. No batched attribution is published from unsupported anchors; the device-event table and wall reconciliation remain valid." + }, + "trace_split": { + "expected_calls": 10, + "executions_per_invocation": 1, + "method": "per-call (first-instruction recurrence)", + "note": "DECIDED IN CODE: the scalar arm's trace is split by trace_calls * B, so every lane's execution is its own block and the per-stage median is taken over all of them. The vmap arm's is split by trace_calls, one block per batched execution, and per_stage_ms_per_lane divides those rows by B." + } + }, + "scalar": { + "arm": "scalar", + "program": "jax.jit(fn), called B times", + "stands_for": "Nautilus(use_jax_vmap=False, use_jax_jit=True). Plain use_jax_vmap=False is UNJITTED and is NOT this arm", + "hlo_source": "jax.jit(fn).lower(lane_trees[0]) \u2014 the same program phase 1 traced", + "batch_wall_ms": 625.857872800043, + "wall_production_nesting_ms": 625.857872800043, + "wall_aot_command_buffers_on_ms": 625.4916029996821, + "wall_aot_command_buffers_off_ms": 629.4270720001805, + "command_buffer_delta_ms": 3.935469000498415, + "production_nesting_vs_aot_on_delta_ms": 0.3662698003608966, + "production_nesting_vs_aot_on_delta_pct": 0.05855710909696781, + "wall_per_lane_ms": 31.29289364000215, + "wall_per_lane_command_buffers_off_ms": 31.471353600009024, + "traced_batch_wall_ms": 648.4555216997251, + "untraced_batch_wall_ms": 629.4864455998322, + "traced_wall_per_lane_ms": 32.42277608498625, + "callback_count_per_call": 0.0, + "callback_count_per_lane": 0.0, + "callback_expectation": "0 \u2014 the rectangular mesh has no qhull host callback (asserted)", + "host_qhull_ms": 0.0, + "host_tables_ms": 0.0, + "host_qhull_ms_per_lane": 0.0, + "host_tables_ms_per_lane": 0.0, + "host_callback_probe": { + "calls": 0, + "qhull_ms_total": 0.0, + "tables_ms_total": 0.0, + "total_ms_total": 0.0, + "qhull_ms_mean": 0.0, + "tables_ms_mean": 0.0, + "total_ms_mean": 0.0, + "non_finite_calls": 0, + "n_points": [] + }, + "host_callback_records_first": [], + "device_idle_ms": 1.6941080050000004, + "device_idle_ms_per_lane": 1.6941080050000004, + "trace": { + "parser": "ProfileData.from_file(xplane) + as_text() + stack_frame_index(proto field 17)", + "stage_audit": { + "mesh_construction": [ + { + "instruction": "fusion.2", + "ms": 0.14791941999999886, + "opcode": "fusion", + "shape": "(f64[15361,2]{1,0}, s64[15361,2]{1,0}, s32[15361,2]{1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:227", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:227 (create_transforms_rank)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:396 (_transforms_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:561 (adaptive_rectangular_mappings_weights_via_interpolation_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:693 (InterpolatorRectangular._mappings_sizes_weights)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "loop_select_fusion", + "ms": 0.03917319999999952, + "opcode": "fusion", + "shape": "(u32[2,15361]{1,0}, u32[2,15361]{1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:69", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:69 (forward_interp)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:573 (adaptive_rectangular_mappings_weights_via_interpolation_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:693 (InterpolatorRectangular._mappings_sizes_weights)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/abstract.py:36 (AbstractInterpolator.mappings)" + ] + }, + { + "instruction": "loop_select_fusion.3", + "ms": 0.03453038500000075, + "opcode": "fusion", + "shape": "(u32[15361]{0}, u32[15361]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:245", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:245 (create_transforms_rank)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:396 (_transforms_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:561 (adaptive_rectangular_mappings_weights_via_interpolation_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:693 (InterpolatorRectangular._mappings_sizes_weights)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "loop_select_fusion.1", + "ms": 0.034339810000000706, + "opcode": "fusion", + "shape": "(u32[15361]{0}, u32[15361]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:245", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:245 (create_transforms_rank)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:396 (_transforms_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:561 (adaptive_rectangular_mappings_weights_via_interpolation_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:693 (InterpolatorRectangular._mappings_sizes_weights)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "loop_add_fusion", + "ms": 0.020984455000000447, + "opcode": "fusion", + "shape": "s64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:69", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:69 (forward_interp)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:573 (adaptive_rectangular_mappings_weights_via_interpolation_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:693 (InterpolatorRectangular._mappings_sizes_weights)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/abstract.py:36 (AbstractInterpolator.mappings)" + ] + }, + { + "instruction": "loop_add_fusion.3", + "ms": 0.020345205000000262, + "opcode": "fusion", + "shape": "s64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:245", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:245 (create_transforms_rank)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:396 (_transforms_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:561 (adaptive_rectangular_mappings_weights_via_interpolation_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/rectangular.py:693 (InterpolatorRectangular._mappings_sizes_weights)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "mixed_fusion": [ + { + "instruction": "loop_divide_gather_fusion", + "ms": 0.6957924149999994, + "opcode": "fusion", + "shape": "(f64[15361,1,1,1521]{3,2,1,0}, f64[15361,1,1,1521]{3,2,1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:133", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:133 (curvature_matrix_via_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:93 (InversionImagingMapping.curvature_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:389 (AbstractInversion.curvature_reg_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "loop_broadcast_fusion.3", + "ms": 0.23343745999999976, + "opcode": "fusion", + "shape": "f64[1521,180,180]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "input_multiply_transpose_fusion", + "ms": 0.18456236000000004, + "opcode": "fusion", + "shape": "(f64[1369,1369]{1,0}, f64[1369,1369]{1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:237 (active_set_search)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:293 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:274 (_certified_positive_only_from)" + ] + }, + { + "instruction": "loop_broadcast_fusion", + "ms": 0.1363833950000001, + "opcode": "fusion", + "shape": "f64[15361,1521]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:342", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:342 (mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/abstract.py:283 (Mapper.mapping_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:91 (AbstractInversionImaging._mapping_matrix_for_convolution_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:137 (AbstractInversionImaging.operated_mapping_matrix_list)" + ] + }, + { + "instruction": "input_reduce_fusion.3", + "ms": 0.11353913499999997, + "opcode": "fusion", + "shape": "f64[92,1521]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/inversion_imaging_util.py:123", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/inversion_imaging_util.py:123 (data_vector_via_blurred_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:67 (InversionImagingMapping.data_vector)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:699 (AbstractInversion.reconstruction)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "input_reduce_fusion.6", + "ms": 0.11184050999999992, + "opcode": "fusion", + "shape": "f64[15361]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:163", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:163 (mapped_reconstructed_data_via_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:120 (InversionImagingMapping._mapped_reconstructed_data_dict_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:196 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + } + ], + "border_relocator": [ + { + "instruction": "eigh.0", + "ms": 0.07397104999999984, + "opcode": "custom-call", + "shape": "(f64[2,2]{0,1}, f64[2]{0}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:245", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:245 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:415 (BorderRelocator.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:83 (AbstractMesh.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/rectangular_rtu_adapt_density.py:267 (RectangularRTUAdaptDensity.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "custom-call.2", + "ms": 0.007906175, + "opcode": "custom-call", + "shape": "(f64[2,2]{1,0}, s8[4194304]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:242", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:242 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:415 (BorderRelocator.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:83 (AbstractMesh.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/rectangular_rtu_adapt_density.py:267 (RectangularRTUAdaptDensity.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "input_reduce_fusion.7", + "ms": 0.005313780000000003, + "opcode": "fusion", + "shape": "(f64[], f64[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:270", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:270 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:415 (BorderRelocator.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:83 (AbstractMesh.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/rectangular_rtu_adapt_density.py:267 (RectangularRTUAdaptDensity.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "loop_add_fusion.5", + "ms": 0.0035868199999999923, + "opcode": "fusion", + "shape": "f64[15361]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:308", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:308 (relocated_grid_via_ellipse_border_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:423 (BorderRelocator.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:83 (AbstractMesh.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/rectangular_rtu_adapt_density.py:267 (RectangularRTUAdaptDensity.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "input_concatenate_fusion.4", + "ms": 0.0023776849999999966, + "opcode": "fusion", + "shape": "f64[392,2]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:238", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:238 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:415 (BorderRelocator.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:83 (AbstractMesh.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/rectangular_rtu_adapt_density.py:267 (RectangularRTUAdaptDensity.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "loop_multiply_fusion.1", + "ms": 0.0015503599999999982, + "opcode": "fusion", + "shape": "f64[2,2]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:245", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:245 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:415 (BorderRelocator.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:83 (AbstractMesh.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/rectangular_rtu_adapt_density.py:267 (RectangularRTUAdaptDensity.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + } + ], + "other": [ + { + "instruction": "copy.41", + "ms": 0.030097644999999295, + "opcode": "copy", + "shape": "u32[2,15361]{1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "copy.42", + "ms": 0.02979979499999904, + "opcode": "copy", + "shape": "u32[2,15361]{1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "copy.59", + "ms": 0.028553500000001345, + "opcode": "copy", + "shape": "u32[15361]{0}", + "source": "", + "stack": [] + }, + { + "instruction": "copy.51", + "ms": 0.028486760000000933, + "opcode": "copy", + "shape": "u32[15361]{0}", + "source": "", + "stack": [] + }, + { + "instruction": "copy.60", + "ms": 0.028346345000000193, + "opcode": "copy", + "shape": "u32[15361]{0}", + "source": "", + "stack": [] + }, + { + "instruction": "copy.50", + "ms": 0.02822736499999981, + "opcode": "copy", + "shape": "u32[15361]{0}", + "source": "", + "stack": [] + } + ], + "pdip_solve": [ + { + "instruction": "cholesky.40", + "ms": 9.184048324999997, + "opcode": "custom-call", + "shape": "(f64[1369,1369]{0,1}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:252 (active_set_search..body_fun)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:262 (active_set_search)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:293 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)" + ] + }, + { + "instruction": "triangular-solve.1", + "ms": 1.6106283850000624, + "opcode": "custom-call", + "shape": "(f64[1369,1]{0,1}, s8[0]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:154", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:154 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:252 (active_set_search..body_fun)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:262 (active_set_search)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:293 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)" + ] + }, + { + "instruction": "triangular-solve", + "ms": 1.3639690900000043, + "opcode": "custom-call", + "shape": "(f64[1369,1]{0,1}, s8[0]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:154", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:154 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:252 (active_set_search..body_fun)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:262 (active_set_search)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:293 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)" + ] + }, + { + "instruction": "cholesky.60", + "ms": 0.8410301000000001, + "opcode": "custom-call", + "shape": "(f64[1369,1369]{0,1}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:237 (active_set_search)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:293 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:274 (_certified_positive_only_from)" + ] + }, + { + "instruction": "cholesky.70", + "ms": 0.8337424149999996, + "opcode": "custom-call", + "shape": "(f64[1369,1369]{0,1}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:297 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:274 (_certified_positive_only_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:496 (reconstruction_positive_only_from)" + ] + }, + { + "instruction": "input_transpose_fusion.1", + "ms": 0.32416548500000025, + "opcode": "fusion", + "shape": "f64[1369,1369]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:252 (active_set_search..body_fun)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:262 (active_set_search)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:293 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)" + ] + } + ], + "mapping_matrix": [ + { + "instruction": "input_reduce_fusion.20", + "ms": 0.0028160800000000077, + "opcode": "fusion", + "shape": "f64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:93", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:93 (adaptive_pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/abstract.py:507 (Mapper.pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt.py:339 (Adapt.regularization_weights_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt.py:362 (Adapt.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)" + ] + } + ], + "regularization_H": [ + { + "instruction": "input_scatter_fusion.8", + "ms": 0.002785044999999994, + "opcode": "fusion", + "shape": "f64[1521,1521]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt.py:123", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt.py:123 (weighted_regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt.py:366 (Adapt.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:332 (AbstractInversion.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "psf_convolution_mapping_matrix": [ + { + "instruction": "fft.19.0", + "ms": 1.7801854650000009, + "opcode": "fft", + "shape": "f64[1521,180,180]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "input_scatter_fusion", + "ms": 1.4222081299999996, + "opcode": "fusion", + "shape": "f64[1521,180,180]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "fft.15.0", + "ms": 1.383124279999999, + "opcode": "fft", + "shape": "c128[1521,180,91]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "fft.17.0", + "ms": 0.9921843850000003, + "opcode": "fft", + "shape": "c128[1521,91,180]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "input_transpose_fusion.2", + "ms": 0.522208855, + "opcode": "fusion", + "shape": "c128[1521,91,180]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "wrapped_transpose.2", + "ms": 0.5077285800000001, + "opcode": "fusion", + "shape": "c128[1521,180,91]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + } + ], + "curvature_matrix_F": [ + { + "instruction": "cublas-lt-matmul.2", + "ms": 4.364650199999999, + "opcode": "custom-call", + "shape": "(f64[1521,1521]{1,0}, s8[4194304]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:134", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:134 (curvature_matrix_via_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:93 (InversionImagingMapping.curvature_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:389 (AbstractInversion.curvature_reg_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "inversion_other": [ + { + "instruction": "cholesky.80", + "ms": 0.9170773750000003, + "opcode": "custom-call", + "shape": "(f64[1521,1521]{0,1}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986 (AbstractInversion._log_det_symmetric_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:1078 (AbstractInversion.log_det_curvature_reg_matrix_term)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:347 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/model/analysis.py:135 (AnalysisImaging.log_likelihood_function)" + ] + }, + { + "instruction": "cholesky.90", + "ms": 0.9005514800000001, + "opcode": "custom-call", + "shape": "(f64[1521,1521]{0,1}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986 (AbstractInversion._log_det_symmetric_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:1157 (AbstractInversion.log_det_regularization_matrix_term)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:348 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/model/analysis.py:135 (AnalysisImaging.log_likelihood_function)" + ] + }, + { + "instruction": "loop_reduce_window_fusion.3", + "ms": 0.0057904199999999845, + "opcode": "fusion", + "shape": "s64[6,16]{1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "loop_reduce_window_fusion.2", + "ms": 0.003016255, + "opcode": "fusion", + "shape": "s64[86,16]{1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "input_scatter_fusion.9", + "ms": 0.002541684999999997, + "opcode": "fusion", + "shape": "s64[1369]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:527", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:527 (AbstractInversion.zeroed_ids_to_keep)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:567 (AbstractInversion.solve_ids_to_keep)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:684 (AbstractInversion.reconstruction)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "loop_broadcast_fusion.4", + "ms": 0.001903655000000006, + "opcode": "fusion", + "shape": "(s64[1369]{0}, s64[1369]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:527", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:527 (AbstractInversion.zeroed_ids_to_keep)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:567 (AbstractInversion.solve_ids_to_keep)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:684 (AbstractInversion.reconstruction)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "chi_squared_evidence": [ + { + "instruction": "loop_multiply_fusion", + "ms": 0.002980560000000002, + "opcode": "fusion", + "shape": "f64[15361]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/abstract_ndarray.py:300", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/abstract_ndarray.py:300 (AbstractNDArray.__pow__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/abstract_ndarray.py:60 (unwrap_array..wrapper)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/abstract_ndarray.py:35 (to_new_array..wrapper)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_util.py:78 (chi_squared_map_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:78 (AbstractFit.chi_squared_map)" + ] + } + ] + }, + "stage_audit_note": "The HLO instructions that contributed most of each stage's milliseconds, with their full source stack. A stage row is only as good as the rules that built it; this is how a reader checks a row against the HLO instead of trusting it.", + "untraced_wall_ms": 31.47432227999161, + "reconciliation_vs_untraced_pct": 18.350516569120963, + "wall_basis": "wall_ms is the TRACED run's wall, the run these kernel durations came from. untraced_wall_ms is the same executable without the profiler; the difference is the profiler's overhead and belongs in neither the stages nor the idle row.", + "calls": 200, + "call_split": "per-call (first-instruction recurrence)", + "call_blocks": 200, + "events": 113200, + "streams": [ + "Stream #14(Memset,MemcpyH2D,Compute,MemcpyD2H,MemcpyD2D)" + ], + "per_stage_ms": { + "border_relocator": { + "median_ms": 0.0962385, + "min_ms": 0.09548400000000003, + "max_ms": 0.09789 + }, + "chi_squared_evidence": { + "median_ms": 0.002944, + "min_ms": 0.002848, + "max_ms": 0.003296 + }, + "curvature_matrix_F": { + "median_ms": 4.34344, + "min_ms": 4.319585, + "max_ms": 4.52188 + }, + "inversion_other": { + "median_ms": 1.8337585, + "min_ms": 1.8192139999999999, + "max_ms": 1.859725 + }, + "mapping_matrix": { + "median_ms": 0.002816, + "min_ms": 0.002783, + "max_ms": 0.002848 + }, + "memset": { + "median_ms": 0.04875100000000002, + "min_ms": 0.014592, + "max_ms": 0.055646 + }, + "mesh_construction": { + "median_ms": 0.34155349999999973, + "min_ms": 0.33909100000000003, + "max_ms": 0.3460510000000002 + }, + "mixed_fusion": { + "median_ms": 1.8479525000000003, + "min_ms": 1.8414889999999997, + "max_ms": 1.8674680000000003 + }, + "other": { + "median_ms": 0.17961899999999983, + "min_ms": 0.17915699999999982, + "max_ms": 0.1817609999999997 + }, + "pdip_solve": { + "median_ms": 20.248789000000006, + "min_ms": 4.648289, + "max_ms": 21.445342000000025 + }, + "psf_convolution_mapping_matrix": { + "median_ms": 6.6073010000000005, + "min_ms": 6.584796, + "max_ms": 6.641968 + }, + "regularization_H": { + "median_ms": 0.002752, + "min_ms": 0.002432, + "max_ms": 0.003104 + } + }, + "stage_order": [ + "border_relocator", + "mesh_construction", + "mapping_matrix", + "psf_convolution_mapping_matrix", + "curvature_matrix_F", + "regularization_H", + "pdip_solve", + "chi_squared_evidence", + "inversion_other", + "mixed_fusion", + "other", + "memset" + ], + "mixed_fusion": { + "ms": 1.8479525000000003, + "constituent_stage_sets": { + "curvature_matrix_F + psf_convolution_mapping_matrix": 0.6957924149999994, + "pdip_solve + psf_convolution_mapping_matrix": 0.23343745999999976, + "inversion_other + mapped_reconstruction + pdip_solve + reconstruction_scatter": 0.18456236000000004, + "mapping_matrix + pdip_solve": 0.1387204599999999, + "data_vector_D + pdip_solve": 0.11724944500000006, + "mapped_reconstruction + pdip_solve": 0.11184050999999992, + "border_relocator + pdip_solve": 0.0706898250000001, + "mesh_construction + pdip_solve": 0.038459690000000005, + "inversion_other + regularization_H": 0.030986109999999997, + "inversion_other + pdip_solve": 0.030264850000000027, + "border_relocator + mesh_construction + pdip_solve": 0.02706815499999997, + "curvature_reg_reduce_gather + inversion_other": 0.02572516500000001, + "border_relocator + inversion_other + mapping_matrix + mesh_construction + pdip_solve": 0.020582390000000002, + "pdip_solve + regularization_H": 0.019288659999999985, + "inversion_other + mapping_matrix + pdip_solve + regularization_H": 0.015457549999999943, + "inversion_other + mapping_matrix + mesh_construction": 0.012928505000000003, + "pdip_solve + ray_trace_data_grid": 0.012831525000000012, + "grids_and_structures + mass_profile_deflections + pdip_solve": 0.009833185000000001, + "inversion_other + mapped_reconstruction + reconstruction_scatter": 0.00966247, + "inversion_other + mapped_reconstruction + pdip_solve": 0.00884491, + "chi_squared_evidence + pdip_solve": 0.0076077999999999806, + "inversion_other + mesh_construction + pdip_solve": 0.005448964999999991, + "grids_and_structures + mass_profile_deflections + ray_trace_data_grid": 0.005233799999999997, + "inversion_other + pdip_solve + ray_trace_data_grid": 0.004809619999999999, + "border_relocator + mesh_construction": 0.0034309399999999973, + "border_relocator + inversion_other": 0.0033405599999999994, + "border_relocator + inversion_other + mesh_construction + pdip_solve": 0.0024160699999999976, + "chi_squared_evidence + inversion_other": 0.0017815449999999979 + }, + "example_kernels": { + "curvature_matrix_F + psf_convolution_mapping_matrix": [ + "loop_divide_gather_fusion" + ], + "pdip_solve + psf_convolution_mapping_matrix": [ + "loop_broadcast_fusion.3" + ], + "inversion_other + mapped_reconstruction + pdip_solve + reconstruction_scatter": [ + "input_multiply_transpose_fusion" + ], + "mapping_matrix + pdip_solve": [ + "loop_divide_fusion.1", + "loop_broadcast_fusion" + ], + "data_vector_D + pdip_solve": [ + "input_reduce_fusion.3", + "input_reduce_fusion.18" + ], + "mapped_reconstruction + pdip_solve": [ + "input_reduce_fusion.6" + ], + "border_relocator + pdip_solve": [ + "input_reduce_fusion.8", + "loop_select_sine_fusion", + "input_concatenate_fusion.1", + "input_transpose_fusion.6" + ], + "mesh_construction + pdip_solve": [ + "loop_multiply_fusion.2", + "loop_pad_fusion", + "loop_reduce_fusion", + "triton_softmax.1" + ], + "inversion_other + regularization_H": [ + "input_transpose_fusion.4" + ], + "inversion_other + pdip_solve": [ + "input_scatter_fusion.11", + "input_reduce_fusion.9", + "input_reduce_fusion.16", + "input_reduce_fusion.4" + ] + }, + "prorated_estimate_ms": { + "psf_convolution_mapping_matrix": 0.4646149374999996, + "pdip_solve": 0.46358886383333325, + "curvature_matrix_F": 0.3478962074999997, + "inversion_other": 0.11467274466666669, + "mapped_reconstruction": 0.10822997166666663, + "mapping_matrix": 0.0816505971666666, + "data_vector_D": 0.05862472250000003, + "border_relocator": 0.052473876333333364, + "reconstruction_scatter": 0.04936141333333334, + "mesh_construction": 0.04081435216666666, + "regularization_H": 0.029001772499999978, + "curvature_reg_reduce_gather": 0.012862582500000006, + "ray_trace_data_grid": 0.009763569166666672, + "grids_and_structures": 0.005022328333333333, + "mass_profile_deflections": 0.005022328333333333, + "chi_squared_evidence": 0.004694672499999989 + }, + "prorated_note": "ESTIMATE ONLY \u2014 a mixed fusion's time split equally across the stages its constituents span. Never summed into the measured table, never reconciled." + }, + "other_sources_ms": { + "copy.41": 0.030097644999999295, + "copy.42": 0.02979979499999904, + "copy.59": 0.028553500000001345, + "copy.51": 0.028486760000000933, + "copy.60": 0.028346345000000193, + "copy.50": 0.02822736499999981, + "copy.96": 0.0016406200000000004, + "copy.95": 0.0016316450000000008, + "copy.34": 0.00146092, + "copy.52": 0.0014163049999999986 + }, + "device_span_ms": 32.41873322, + "device_busy_ms": 30.724625215, + "device_idle_ms": 1.6941080050000004, + "largest_idle_gaps": [ + { + "gap_ms": 0.052638, + "after": "input_concatenate_fusion.4", + "before": "custom-call.2" + }, + { + "gap_ms": 0.038142, + "after": "loop_add_fusion.3", + "before": "loop_select_fusion.3" + }, + { + "gap_ms": 0.035487, + "after": "loop_multiply_fusion.1", + "before": "eigh.0" + }, + { + "gap_ms": 0.027423, + "after": "loop_divide_minimum_multiply_sine_sqrt_fusion", + "before": "loop_slice_fusion" + }, + { + "gap_ms": 0.023263, + "after": "loop_add_fusion.3", + "before": "loop_select_fusion.3" + }, + { + "gap_ms": 0.022655, + "after": "loop_select_fusion", + "before": "copy.41" + }, + { + "gap_ms": 0.020159, + "after": "eigh.0", + "before": "eigh.0" + }, + { + "gap_ms": 0.020063, + "after": "loop_broadcast_fusion.6", + "before": "loop_broadcast_fusion.8" + } + ], + "kernel_ms": 35.555915000000006, + "sum_ms": 37.250023005, + "wall_ms": 32.42277608498625, + "host_outside_span_ms": 0.004042864986253392, + "reconciliation_pct": 14.888444183066307, + "unjoined_ms": 0.0, + "unjoined_pct": 0.0, + "other_ms": 0.17961899999999983, + "other_pct": 0.5539901935885574, + "note": "Stage rows attribute the command-buffers-OFF program (see the module docstring): kernel times are the same, the launch overhead the CUDA graphs remove is not. sum_ms = kernel rows + device_idle_ms; the residual against wall_ms is host_outside_span_ms (dispatch before the first kernel, teardown after the last).", + "per_stage_ms_per_lane": { + "border_relocator": 0.0962385, + "chi_squared_evidence": 0.002944, + "curvature_matrix_F": 4.34344, + "inversion_other": 1.8337585, + "mapping_matrix": 0.002816, + "memset": 0.04875100000000002, + "mesh_construction": 0.34155349999999973, + "mixed_fusion": 1.8479525000000003, + "other": 0.17961899999999983, + "pdip_solve": 20.248789000000006, + "psf_convolution_mapping_matrix": 6.6073010000000005, + "regularization_H": 0.002752 + }, + "per_lane_divisor": 1, + "host_callback": { + "pure_callback_span_ms": 0, + "qhull_ms": 0.0, + "callback_body_ms_note": "the OUTERMOST matching body event, not a sum: under the probe the body appears twice (the wrapper and the timed re-implementation it calls) and summing them would count the same work twice", + "events_by_name": { + "ThenExecuteCallback:GetEventForComputeStreamSyncPoint": { + "count": 200, + "ms": 0.36591979999999985 + } + }, + "note": "HOST milliseconds per traced BATCH (the whole invocation), aggregated by name because the events nest. Not a row of the device table: the device pays for them as the idle gaps largest_idle_gaps names." + }, + "host_callback_ms": 0 + }, + "hlo_census": { + "status": "excluded", + "reason": "The legacy census anchors PyAutoArray source line numbers that moved after the phase-1 run. No batched attribution is published from unsupported anchors; the device-event table and wall reconciliation remain valid." + }, + "trace_split": { + "expected_calls": 200, + "executions_per_invocation": 20, + "method": "per-call (first-instruction recurrence)", + "note": "DECIDED IN CODE: the scalar arm's trace is split by trace_calls * B, so every lane's execution is its own block and the per-stage median is taken over all of them. The vmap arm's is split by trace_calls, one block per batched execution, and per_stage_ms_per_lane divides those rows by B." + } + } + }, + "certification_report": { + "source": "vmap arm, library solve observed through its stats= out-dict (PyAutoArray #566) and jax.debug.callback(..., ordered=True); ordered because the unordered batching rule returns the lanes permuted. Untimed, separately compiled; max rel diff of its log likelihoods vs the timed arm's: nan", + "rows": 20, + "pdip_iter": "NOT AVAILABLE per lane without changing library numerics. The fallback branch calls the library's own reconstruction_positive_only_from, which returns the solution alone \u2014 jax_nnls.solve_nnls' iteration count is discarded inside the library's custom_vjp primal. The PDIP while_loop's cost is in the pdip_solve stage row of each arm's device table instead, which is a max-over-lanes quantity under vmap because every lane runs the same fixed kernel sequence.", + "passes_semantics": "library `passes`: restricted active-set passes run (jax_active_set.solve_certified)" + }, + "lane_construction": { + "draws_sha256": "414c4581d327cf9f25278928cfce122a44af7f32110c4d2260c4622bb6110fbb", + "lane_rows": [ + 300, + 301, + 302, + 303, + 304, + 305, + 306, + 307, + 308, + 309, + 310, + 311, + 312, + 313, + 314, + 315, + 316, + 317, + 318, + 319 + ], + "calls": [ + 15 + ], + "stage": "pix1", + "regularization_range": { + "galaxies.source.pixelization.regularization.inner_coefficient": { + "min": 1.5395402868893563e-06, + "max": 631.3270846999916 + }, + "galaxies.source.pixelization.regularization.outer_coefficient": { + "min": 1.585514819488347e-06, + "max": 1082.4533276985048 + }, + "galaxies.source.pixelization.regularization.signal_scale": { + "min": 0.06623313471893155, + "max": 0.9779334025364208 + } + }, + "phases": [ + "exploration" + ], + "window_rule": "nautilus_batches.timed_window: consecutive captured calls, in call order, from the FIRST call that is not a prior batch, concatenated and truncated to B; at B == n_batch exactly one real Nautilus batch. Falls back to the latest B lanes if the post-prior lanes run out; never repeats a lane.", + "note": "Lane k is captured lane lane_rows[k]: the mass AND shear of a real Nautilus proposal (nautilus_batch_capture.py), lens light fixed at S3, the S3 light-subtracted dataset shared by every lane. `offsets` in the lane table are the mass offsets from the fiducial; the shear is in the capture file." + }, + "captured": { + "batches_path": "/mnt/ral/jnightin/autolens_profiling_wt/certified-solver-phase-c1-lane-rate/results/breakdown/imaging/nautilus_batches_rectangular_pix1.npz", + "batches_sha256": "c0b62fba544cb62c8a273c19837cf364127f5af7fdaa110f3a2c8a973e0b6cc0", + "schema_version": 2, + "n_calls": 972, + "n_lanes": 19440, + "call_sizes_seen": [ + 20 + ], + "calls_by_phase": { + "prior": 15, + "exploration": 957 + }, + "parameter_paths": [ + "galaxies.source.pixelization.regularization.inner_coefficient", + "galaxies.source.pixelization.regularization.outer_coefficient", + "galaxies.source.pixelization.regularization.signal_scale", + "galaxies.lens.mass.centre.centre_0", + "galaxies.lens.mass.centre.centre_1", + "galaxies.lens.mass.einstein_radius", + "galaxies.lens.mass.ell_comps.ell_comps_0", + "galaxies.lens.mass.ell_comps.ell_comps_1", + "galaxies.lens.shear.gamma_1", + "galaxies.lens.shear.gamma_2" + ], + "stage": "pix1", + "regularization": { + "class": "Adapt", + "free": true, + "priors": { + "inner_coefficient": [ + "LogUniform", + 1e-06, + 1000000.0 + ], + "outer_coefficient": [ + "LogUniform", + 1e-06, + 1000000.0 + ], + "signal_scale": [ + "Uniform", + 0.0, + 1.0 + ] + }, + "priors_source": "PyAutoGalaxy packaged config/priors/regularization (adapt_split.yaml / adapt.yaml / constant.yaml); adapt_split.yaml and adapt.yaml are identical to euclid_strong_lens_modeling_pipeline/config/priors/regularization/'s copies" + }, + "nautilus": { + "departures_from_production": [ + "mass/shear priors are the phase-B cell's Gaussians, not chained from source_lp", + "no positions likelihood", + "the cell's mesh (39x39 RectangularBilinearAdaptImage, weight_power 1, weight_floor 0) fixed in both stages; source_pix_1 uses RectangularBilinearAdaptDensity, source_pix_2 frees weight_power / weight_floor", + "seeded (production passes no seed)", + "quick updates disabled (iterations_per_quick_update=1e12; render-only)", + "NullPaths: no output directory, so no checkpoint and one Sampler.run call", + "post-fit perform_update skipped (samples / latent variables never built)" + ], + "n_batch": 20, + "n_like_max": 40000, + "n_live": 150, + "number_of_cores": 1, + "production_reference": "euclid_strong_lens_modeling_pipeline/scripts/full_model.py source_pix_1 (n_live=150) / source_pix_2 (n_live=75): af.Nautilus(n_batch=20, **SettingsSearch.search_dict) with use_jax_vmap=True and number_of_cores=1 (SettingsSearch defaults)", + "production_stage": "source_pix_1", + "seed": 1, + "stage": "pix1", + "use_jax_vmap": true, + "version": "1.0.5" + }, + "capture_fit_status": "sampling complete (n_like_max or convergence); post-fit result skipped", + "capture_library_revisions": { + "PyAutoArray": { + "head": "3de624b5b91a4efa130dc3cb0a3a0f06f85025a3", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoArray" + }, + "PyAutoFit": { + "head": "dd9fbe0aab60c4a57702b1444ca031b317c91331", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoFit" + }, + "PyAutoGalaxy": { + "head": "70a61e26cd715cefe7012a38285698091246a8a4", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy" + }, + "PyAutoLens": { + "head": "86054bbc19baa2f710a12e04a94fa27ab37cc354", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoLens" + }, + "PyAutoNerves": { + "head": "1fa613aa8d89a79613009fb66f5b4e2d21deb57a", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoNerves" + } + }, + "fingerprint_check": { + "fields": [ + "mesh", + "source_pixels", + "dataset_sha256", + "regularization_class", + "regularization_s0_fiducial", + "border_relocator", + "use_mixed_precision", + "log_evidence_s3_library" + ], + "not_identity": "the regularization coefficients: free per lane since the capture frees them", + "log_evidence_s3_library_rel_diff": 0.0, + "passed": true + }, + "timed_window_vs_capture_pdip": { + "reference": "the capture's own figure of merit (library PDIP, Fitness.call_wrap jax.jit(jax.vmap(call)) over parameter vectors) for the same lanes", + "compared_against": "this cell's jit(vmap) library-PDIP reference", + "n_compared": 19, + "max_rel_diff": 6.749679033619074e-06, + "max_abs_diff_nats": 1.3120266150217503, + "gated": false, + "note": "RECORDED, NOT GATED: proves the lane trees rebuilt here are the models the sampler evaluated (a wrong parameter mapping shows up as nats, not 1e-10)." + } + }, + "matched": { + "vmap_wall_per_lane_ms": 26.483145425008843, + "scalar_wall_per_lane_ms": 31.29289364000215, + "speedup_vmap_over_scalar": 1.1816154440042954, + "note": "Both walls are the PRODUCTION nesting of their arm, measured in one process on the same B lanes with the SAME library Settings (no injection). A speedup below 1 means the batch is slower per lane than B sequential jitted calls." + }, + "solver_source": "library", + "solver": "certified", + "certified_fallback": "none", + "certified_pass_budget": 16, + "certified_pass_budget_basis": "config default (Settings().certified_pass_budget)", + "certified_tau_rel": 1e-09, + "solver_used": "certified", + "solver_check": { + "solver_used": "certified", + "solver_used_source": "AbstractInversion.positive_only_solver_used on the fiducial S3 inversion, built eagerly on the JAX backend (AnalysisImaging(use_jax=True).fit_from) with the arms' Settings", + "reference_solver_used": "pdip", + "traced_solver_kwargs_jax": [ + "certified" + ], + "observed_calls_jax": 1, + "report_rows": 20, + "report_vs_timed_arm_max_rel_diff": NaN + }, + "lanes_certified": [ + false, + false, + false, + true, + true, + true, + true, + true, + false, + false, + true, + false, + false, + true, + true, + true, + false, + true, + false, + false + ], + "lanes_passes": [ + 16, + 16, + 16, + 4, + 2, + 14, + 6, + 6, + 16, + 16, + 6, + 16, + 16, + 9, + 2, + 8, + 16, + 3, + 16, + 16 + ], + "uncertified_lanes": 10, + "per_lane_certification_note": "certified / passes come from the library's own solve through its stats= out-dict (PyAutoArray #566): passes is the number of restricted active-set passes the library ran (0 when the unconstrained solve was already non-negative), certified is its KKT certificate. With certified_fallback=pdip a False lane returned the PDIP solution; with none it returned the last uncertified iterate. null for a library-PDIP row (no certificate).", + "gate": { + "pre_registered": true, + "gated": [ + "per lane: jit(vmap) arm vs jit(vmap) library PDIP <= lane_rtol relative", + "per lane: scalar jit arm vs scalar jit library PDIP <= lane_rtol relative" + ], + "recorded_not_gated": [ + "per lane: jit(vmap) arm vs scalar jit arm (rel_diff, abs_diff_nats)", + "per lane: jit(vmap) library PDIP vs scalar jit library PDIP", + "uncertified_lanes (certified_fallback=none rows)" + ], + "lanes_failed": 13, + "passed": false, + "policy_eligible": false, + "note": "Pre-registered before submission (module docstring; submit header). Phase 3 (results/notes/hst_gpu_residue_phase3_psf_2026_09.md) placed phase 2's ~2.5e-9 certified-vs-PDIP residual BETWEEN the jit(vmap) and scalar-jit compositions, not in the solver \u2014 so each arm is gated against the library-PDIP reference of its OWN composition, and the cross-composition difference is recorded with its nats. A certified_fallback=none row is policy-eligible only if every lane certifies AND passes the gate. Timing is never gated." + }, + "library_revisions": { + "PyAutoArray": { + "head": "3de624b5b91a4efa130dc3cb0a3a0f06f85025a3", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoArray", + "module_file": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/__init__.py" + }, + "PyAutoFit": { + "head": "dd9fbe0aab60c4a57702b1444ca031b317c91331", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoFit", + "module_file": "/mnt/ral/jnightin/PyAuto/PyAutoFit/autofit/__init__.py" + }, + "PyAutoGalaxy": { + "head": "70a61e26cd715cefe7012a38285698091246a8a4", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy", + "module_file": "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/__init__.py" + }, + "PyAutoLens": { + "head": "86054bbc19baa2f710a12e04a94fa27ab37cc354", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoLens", + "module_file": "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/__init__.py" + }, + "autoarray_file": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/__init__.py" + } + }, + "headline_arm_note": "`trace`, `hlo_census`, `command_buffers` and `trace_timing` above describe the scalar arm \u2014 the program phase 1 traced. Both arms' full blocks, the lane table and the matched comparison are under `vmap`." +} \ No newline at end of file diff --git a/results/breakdown/imaging/fixed_light_trace_rectangular_jitvmap20_captured_pix1_libcertified_fboff_b16_hpc_a100_fp64_fixed_light_trace.png b/results/breakdown/imaging/fixed_light_trace_rectangular_jitvmap20_captured_pix1_libcertified_fboff_b16_hpc_a100_fp64_fixed_light_trace.png new file mode 100644 index 0000000000000000000000000000000000000000..c459ba333d3e2ca8e3fb99659324b6429f11c7bc GIT binary patch literal 128188 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 literal 0 HcmV?d00001 diff --git a/results/breakdown/imaging/fixed_light_trace_delaunay_jitvmap20_captured_pix1_libpdip_fbon_b16_hpc_a100_fp64_fixed_light_trace.json b/results/breakdown/imaging/fixed_light_trace_delaunay_jitvmap20_captured_pix1_libpdip_fbon_b16_hpc_a100_fp64_fixed_light_trace.json new file mode 100644 index 000000000..389b5d359 --- /dev/null +++ b/results/breakdown/imaging/fixed_light_trace_delaunay_jitvmap20_captured_pix1_libpdip_fbon_b16_hpc_a100_fp64_fixed_light_trace.json @@ -0,0 +1,6726 @@ +{ + "device": { + "backend": "gpu", + "device": "cuda:0", + "hostname": "euclid-ral-gpu-2", + "xla_flags": "--xla_disable_hlo_passes=constant_folding --xla_gpu_autotune_level=0 --xla_gpu_enable_triton_gemm=false", + "omp_num_threads": null, + "cpu_count": 124, + "jax_compilation_cache_dir": "/mnt/ral/jnightin/autolens_profiling_wt/certified-solver-phase-c1-lane-rate/output/jax_cache/fixed_light_lanerate_delaunay_pix1_time_20_pdip_on_350768_11", + "autotune_cache_entries_at_start": 0, + "cache_fresh": true, + "nvidia_smi": "NVIDIA A100 80GB PCIe, 35457 MiB, 81920 MiB" + }, + "machine": { + "cpu_model": "AMD EPYC 7702 64-Core Processor", + "cpu_count_os": 124, + "nproc": 4, + "nproc_all": 124, + "nproc_note": "GNU nproc honours OMP_NUM_THREADS, so `nproc` can print 1 on a multi-core host; `nproc_all` is the core count.", + "ram_total": "928298204 kB", + "kernel": "5.14.0-687.50.1.el9_8.x86_64", + "platform": "Linux-5.14.0-687.50.1.el9_8.x86_64-x86_64-with-glibc2.34", + "python": "3.12.4", + "jax_thread_env": { + "NPROC": null + }, + "blas_thread_env": { + "OMP_NUM_THREADS": null, + "OPENBLAS_NUM_THREADS": null, + "MKL_NUM_THREADS": null, + "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" + }, + "precision": "fp64", + "configuration": { + "pixel_scale_arcsec": 0.05, + "mask_radius_arcsec": 3.5, + "image_pixels_masked": 15361, + "over_sampled_pixels": 62752, + "mesh": "delaunay", + "mesh_shape": null, + "source_pixels": 1500, + "source_pixels_requested": null, + "dataset": "hst", + "dataset_sha256": { + "data.fits": "e4e833a28e9c6f6fb023cd85c0d3dde74068720256bc77a240633500e5b04fac", + "noise_map.fits": "315c6266a0acd3ac9c8da82fcd2b45a08697362481fd7a35072bab1658530ba3", + "psf.fits": "8389ba0e8bf4a09b4a561cfc246181a2fb944ed396754cd0ff76fdd22910d303" + }, + "cell_source_sha256": "06a162fcdae6b329384ec33322f443df07215d86e56f0505ac15b3d3473eb432", + "inversion_path": "dense", + "pass_budget": 7, + "pass_budget_basis": "phase 3 (autolens_profiling#255): the smallest ZERO-fallback budget per mesh, the budget a production run fixes. NOT phase 0's certifying budget (2 for Delaunay), which falls back on 67.5 % of a graded draw set and is not a production cost.", + "border_relocator_mode": "cell", + "border_relocator": true, + "border_relocator_note": "'cell' is use_border_relocator=True, which every profiling cell in this family forces; 'library' passes None and takes the shipped config default, which is what production runs. The resolved boolean is what this leg actually ran.", + "routes_selected": [ + "b", + "d" + ], + "trace_calls": 10, + "command_buffers_traced": "off", + "use_mixed_precision": false, + "tau_rel": 1e-09, + "regularization": { + "scheme": "adapt_split", + "inner_coefficient": 0.1, + "outer_coefficient": 10.0, + "signal_scale": 0.1 + }, + "thread_env": { + "n_threads": null, + "vars": [ + "OPENBLAS_NUM_THREADS", + "MKL_NUM_THREADS", + "OMP_NUM_THREADS", + "VECLIB_MAXIMUM_THREADS", + "NUMEXPR_NUM_THREADS" + ], + "set_to": null, + "preexisting": {}, + "overridden": {}, + "note": "Not pinned (legacy variant): recorded as found." + }, + "over_sample_size_lp_rule": { + "sub_size_list": [ + 4, + 2, + 2 + ], + "radial_list": [ + 0.3, + 0.6 + ], + "centre": [ + 0.0, + 0.0 + ] + }, + "vmap_batch": 20, + "lanes": "captured", + "arms": [ + "vmap", + "scalar" + ], + "fallback": "on", + "draw_seed": 0, + "vmap_composition": "jax.jit(jax.vmap(fn))", + "lane_rtol": 1e-09, + "vmap_flags_note": "Strict ProfileCLI.parse_cell_args rejects unknown flags. These keys record the exact batching program and prevent historical vmap(jit) artifacts from being mistaken for current jit(vmap) measurements.", + "solver_source": "library", + "solver": "pdip", + "certified_fallback": "pdip", + "certified_pass_budget": 16, + "captured_pass": "time", + "batches": "/mnt/ral/jnightin/autolens_profiling_wt/certified-solver-phase-c1-lane-rate/results/breakdown/imaging/nautilus_batches_delaunay_pix1.npz" + }, + "solver_injection": { + "patched": null, + "part_v": "none \u2014 library mode selects the solver through al.Settings", + "part_b_route_d": { + "patched": "autoarray.inversion.inversion.inversion_util.reconstruction_positive_only_from", + "pass_budget": 7, + "fallback": true + }, + "note": "Library mode (phase B, #300): PART V's arms and references run the library's own positive-only solve, selected by Settings(positive_only_solver, certified_fallback, certified_pass_budget); nothing is injected. PART B's single-call route d (the fiducial d == b pin) still uses the phase-1 harness injection at the phase-3 budget and is not a phase-B row. The untimed certification report observes the library solve (library_solver_observed) without changing it." + }, + "routes": { + "b_s3_pdip": { + "label": "S3 PDIP (source-only)", + "status": "ok", + "solver": "library", + "ms": 50.63946449990908, + "log_likelihood": 29155.000174367866 + }, + "d_s3_certified_fallback": { + "label": "S3 certified active set, budget 7, PDIP fallback", + "status": "ok", + "solver": "harness-injected certified active set", + "pass_budget": 7, + "fallback": true, + "injected_solver_calls_jax": 1, + "injected_solver_calls_numpy": 0, + "ms": 31.515598400073937, + "log_likelihood": 29155.000175525754 + } + }, + "equivalence_pins": [ + { + "pin": "route d (certified, fallback) == route b (library PDIP)", + "route": "d_s3_certified_fallback", + "reference": "b_s3_pdip", + "expectation": "the certified active set returns the library's own positive solution", + "rtol": 1e-09, + "got": 29155.000175525754, + "reference_value": 29155.000174367866, + "rel_diff": 3.9714924089814085e-11, + "status": "PASS" + } + ], + "equivalence_rtol": 1e-09, + "reference": { + "log_evidence_s0_library": 29155.00017433923, + "log_evidence_s3_library": 29155.000174339304, + "s3": { + "n_params": 1500, + "n_mapper": 1500, + "n_funcs": 0, + "edge_zeroed_pixels": 0, + "subtracted_light_flux": 5105.448603818575 + } + }, + "command_buffers": { + "wall_on_ms": 1002.0908607999446, + "wall_off_ms": 1012.0101273001638, + "command_buffer_delta_ms": 9.919266500219237, + "command_buffer_delta_pct": 0.9898569968297016, + "traced": "off", + "compiler_option": "xla_gpu_enable_command_buffer", + "probe": { + "note": "Not taken in --vmap-batch mode: the CUPTI-inside-a-CUDA-graph probe is a phase-1 diagnostic about the JOIN, and this mode already compiles and times both the command-buffers ON and OFF executable of every arm." + }, + "note": "ONE lowering, TWO compilations, one process. wall_on_ms is the PRODUCTION program (CUDA graphs as XLA ships them) and is the number comparable to phase 5's row; wall_off_ms is the graph-less program the stage rows attribute. The delta is the launch overhead the graphs remove \u2014 it lands in device_idle and host_outside_span, not in any stage. Reconciliation is computed against wall_off_ms." + }, + "trace": { + "parser": "ProfileData.from_file(xplane) + as_text() + stack_frame_index(proto field 17)", + "stage_audit": { + "chi_squared_evidence": [ + { + "instruction": "input_reduce_fusion.26", + "ms": 0.003904265000000002, + "opcode": "fusion", + "shape": "f64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_util.py:104", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_util.py:104 (noise_normalization_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:98 (AbstractFit.noise_normalization)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:306 (FitDataset.noise_normalization)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:349 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)" + ] + }, + { + "instruction": "input_reduce_fusion.28", + "ms": 0.003783660000000004, + "opcode": "fusion", + "shape": "f64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_util.py:90", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_util.py:90 (chi_squared_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:87 (AbstractFit.chi_squared)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:293 (FitDataset.chi_squared)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:345 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)" + ] + }, + { + "instruction": "loop_multiply_fusion.2", + "ms": 0.003006375000000002, + "opcode": "fusion", + "shape": "f64[15361]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/abstract_ndarray.py:300", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/abstract_ndarray.py:300 (AbstractNDArray.__pow__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/abstract_ndarray.py:60 (unwrap_array..wrapper)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/abstract_ndarray.py:35 (to_new_array..wrapper)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_util.py:78 (chi_squared_map_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:78 (AbstractFit.chi_squared_map)" + ] + } + ], + "psf_convolution_mapping_matrix": [ + { + "instruction": "input_scatter_fusion", + "ms": 1.9795207949999998, + "opcode": "fusion", + "shape": "f64[1500,180,180]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "fft.19.0", + "ms": 1.7554150700000009, + "opcode": "fft", + "shape": "f64[1500,180,180]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "fft.15.0", + "ms": 1.3649168499999986, + "opcode": "fft", + "shape": "c128[1500,180,91]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "fft.17.0", + "ms": 0.9788598, + "opcode": "fft", + "shape": "c128[1500,91,180]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "input_transpose_fusion.1", + "ms": 0.5139107350000001, + "opcode": "fusion", + "shape": "c128[1500,91,180]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "wrapped_transpose", + "ms": 0.5001258199999999, + "opcode": "fusion", + "shape": "c128[1500,180,91]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + } + ], + "mapping_matrix": [ + { + "instruction": "loop_broadcast_fusion.2", + "ms": 0.11094477499999997, + "opcode": "fusion", + "shape": "f64[15361,1500]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:342", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:342 (mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/abstract.py:283 (Mapper.mapping_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:91 (AbstractInversionImaging._mapping_matrix_for_convolution_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:137 (AbstractInversionImaging.operated_mapping_matrix_list)" + ] + }, + { + "instruction": "input_reduce_fusion.29", + "ms": 0.0028802999999999906, + "opcode": "fusion", + "shape": "f64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:93", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:93 (adaptive_pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/abstract.py:507 (Mapper.pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt.py:339 (Adapt.regularization_weights_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt_split.py:120 (AdaptSplit.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)" + ] + }, + { + "instruction": "loop_divide_fusion", + "ms": 0.0023528000000000025, + "opcode": "fusion", + "shape": "f64[1500]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:92", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:92 (adaptive_pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/abstract.py:507 (Mapper.pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt.py:339 (Adapt.regularization_weights_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt_split.py:120 (AdaptSplit.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)" + ] + } + ], + "mixed_fusion": [ + { + "instruction": "loop_divide_gather_fusion", + "ms": 1.0144249650000003, + "opcode": "fusion", + "shape": "(f64[15361,1,1,1500]{3,2,1,0}, f64[15361,1,1,1500]{3,2,1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:133", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:133 (curvature_matrix_via_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:93 (InversionImagingMapping.curvature_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:389 (AbstractInversion.curvature_reg_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "input_add_multiply_transpose_fusion", + "ms": 0.060890715000000005, + "opcode": "fusion", + "shape": "(f64[1500,1500]{1,0}, f64[1500,1500]{1,0}, f64[1500,1500]{1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:61", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:61 (initialize)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:72 (solve_nnls)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:129 (_solve_nnls_primal_with..primal)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:164 (solve_nnls_primal_with_status)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:508 (reconstruction_positive_only_from)" + ] + }, + { + "instruction": "input_transpose_fusion.3", + "ms": 0.02419367500000001, + "opcode": "fusion", + "shape": "f64[1500,1500]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986 (AbstractInversion._log_det_symmetric_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:1157 (AbstractInversion.log_det_regularization_matrix_term)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:348 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/model/analysis.py:135 (AnalysisImaging.log_likelihood_function)" + ] + }, + { + "instruction": "input_scatter_fusion.2", + "ms": 0.01633987, + "opcode": "fusion", + "shape": "f64[1500,1500]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:579", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:579 (pixel_splitted_regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt_split.py:137 (AdaptSplit.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:332 (AbstractInversion.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "loop_abs_fusion", + "ms": 0.014803945000000004, + "opcode": "fusion", + "shape": "(f64[6000,1]{1,0}, f64[6000,1]{1,0}, f64[6000,1]{1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:613", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:613 (triangle_area_xp)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:657 (pixel_weights_delaunay_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:982 (InterpolatorDelaunay._mappings_sizes_weights_split)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt_split.py:124 (AdaptSplit.regularization_matrix_from)" + ] + }, + { + "instruction": "input_scatter_fusion.3", + "ms": 0.014678229999999999, + "opcode": "fusion", + "shape": "f64[1500]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:70", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:70 (adaptive_pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/abstract.py:507 (Mapper.pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt.py:339 (Adapt.regularization_weights_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt_split.py:120 (AdaptSplit.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)" + ] + } + ], + "ray_trace_data_grid": [ + { + "instruction": "input_reduce_fusion.18", + "ms": 0.003235509999999996, + "opcode": "fusion", + "shape": "f64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:506", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:506 (FlatLambdaCDM._simpson_1d)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:644 (FlatLambdaCDM.angular_diameter_distance_kpc_z1z2)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:133 (LensingCosmology.angular_diameter_distance_to_earth_in_kpc_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:362 (LensingCosmology.scaling_factor_between_redshifts_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/lens/tracer_util.py:252 (traced_grid_2d_list_from)" + ] + }, + { + "instruction": "input_reduce_fusion.20", + "ms": 0.0027401349999999908, + "opcode": "fusion", + "shape": "f64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:506", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:506 (FlatLambdaCDM._simpson_1d)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:644 (FlatLambdaCDM.angular_diameter_distance_kpc_z1z2)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:151 (LensingCosmology.angular_diameter_distance_between_redshifts_in_kpc_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:355 (LensingCosmology.scaling_factor_between_redshifts_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/lens/tracer_util.py:252 (traced_grid_2d_list_from)" + ] + }, + { + "instruction": "input_reduce_fusion.19", + "ms": 0.0026057449999999966, + "opcode": "fusion", + "shape": "f64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:503", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:503 (FlatLambdaCDM._simpson_1d)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:644 (FlatLambdaCDM.angular_diameter_distance_kpc_z1z2)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:133 (LensingCosmology.angular_diameter_distance_to_earth_in_kpc_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:362 (LensingCosmology.scaling_factor_between_redshifts_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/lens/tracer_util.py:252 (traced_grid_2d_list_from)" + ] + }, + { + "instruction": "input_reduce_fusion.21", + "ms": 0.002587044999999994, + "opcode": "fusion", + "shape": "f64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:503", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:503 (FlatLambdaCDM._simpson_1d)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:644 (FlatLambdaCDM.angular_diameter_distance_kpc_z1z2)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:151 (LensingCosmology.angular_diameter_distance_between_redshifts_in_kpc_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:355 (LensingCosmology.scaling_factor_between_redshifts_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/lens/tracer_util.py:252 (traced_grid_2d_list_from)" + ] + }, + { + "instruction": "loop_divide_fusion.1", + "ms": 0.002514860000000003, + "opcode": "fusion", + "shape": "f64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:380", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:380 (LensingCosmology.scaling_factor_between_redshifts_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/lens/tracer_util.py:252 (traced_grid_2d_list_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/lens/tracer.py:632 (Tracer.traced_grid_2d_list_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/structures/decorators/abstract.py:93 (AbstractMaker.evaluate_func)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/structures/decorators/abstract.py:110 (AbstractMaker.result)" + ] + } + ], + "border_relocator": [ + { + "instruction": "eigh.45", + "ms": 0.07459175499999986, + "opcode": "custom-call", + "shape": "(f64[2,2]{0,1}, f64[2]{0}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:245", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:245 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:454 (BorderRelocator.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:176 (AbstractMesh.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:214 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "custom-call.2", + "ms": 0.007952110000000021, + "opcode": "custom-call", + "shape": "(f64[2,2]{1,0}, s8[4194304]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:242", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:242 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:454 (BorderRelocator.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:176 (AbstractMesh.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:214 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "input_reduce_fusion.15", + "ms": 0.005806534999999992, + "opcode": "fusion", + "shape": "(f64[], f64[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:269", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:269 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:454 (BorderRelocator.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:176 (AbstractMesh.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:214 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "loop_select_sine_fusion", + "ms": 0.003668455000000008, + "opcode": "fusion", + "shape": "(f64[], f64[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:301", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:301 (relocated_grid_via_ellipse_border_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:458 (BorderRelocator.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:176 (AbstractMesh.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:214 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "input_concatenate_fusion.3", + "ms": 0.0036586900000000087, + "opcode": "fusion", + "shape": "f64[15361,2]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:323", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:323 (relocated_grid_via_ellipse_border_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:423 (BorderRelocator.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:83 (AbstractMesh.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:208 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "loop_add_fusion.5", + "ms": 0.0035801449999999994, + "opcode": "fusion", + "shape": "f64[15361]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:308", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:308 (relocated_grid_via_ellipse_border_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:423 (BorderRelocator.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:83 (AbstractMesh.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:208 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + } + ], + "mesh_construction": [ + { + "instruction": "input_concatenate_fusion.7", + "ms": 0.0020396799999999925, + "opcode": "fusion", + "shape": "f64[1500,2]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:820", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:820 (InterpolatorDelaunay.mesh_grid_xy)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:847 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + } + ], + "mesh_qhull_callback": [ + { + "instruction": "pure_callback.4", + "ms": 0.010656254999999965, + "opcode": "custom-call", + "shape": "(s32[3000,3]{1,0}, s32[3000,3]{1,0}, s32[1500]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:161", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:161 (_jax_delaunay_tables)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:405 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + } + ], + "other": [ + { + "instruction": "copy.72", + "ms": 0.04182004999999856, + "opcode": "copy", + "shape": "f64[1,1024,2]{2,1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "copy.35", + "ms": 0.017098710000000218, + "opcode": "copy", + "shape": "s32[21361]{0}", + "source": "", + "stack": [] + }, + { + "instruction": "copy.40", + "ms": 0.002001399999999998, + "opcode": "copy", + "shape": "s64[1500]{0}", + "source": "", + "stack": [] + }, + { + "instruction": "loop_broadcast_fusion.1", + "ms": 0.001965755000000001, + "opcode": "fusion", + "shape": "(pred[21361]{0}, pred[21361]{0})", + "source": "", + "stack": [] + }, + { + "instruction": "copy.71", + "ms": 0.001792784999999997, + "opcode": "copy", + "shape": "s32[]", + "source": "", + "stack": [] + }, + { + "instruction": "loop_broadcast_fusion.4", + "ms": 0.0017787099999999967, + "opcode": "fusion", + "shape": "(f64[1500]{0}, f64[1500]{0}, f64[1500]{0}, f64[1500]{0})", + "source": "", + "stack": [] + } + ], + "mesh_seed_argmin": [ + { + "instruction": "input_reduce_fusion", + "ms": 0.14760173499999826, + "opcode": "fusion", + "shape": "(f64[1024]{0}, s64[1024]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:191", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:191 (_nearest_vertex_seed_from..argmin_chunk)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204 (_nearest_vertex_seed_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:351 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)" + ] + }, + { + "instruction": "loop_dynamic_update_slice_fusion", + "ms": 0.04108403499999848, + "opcode": "fusion", + "shape": "s32[21,1024]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204 (_nearest_vertex_seed_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:351 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "loop_add_fusion", + "ms": 0.03194550499999987, + "opcode": "fusion", + "shape": "s64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204 (_nearest_vertex_seed_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:351 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "loop_broadcast_fusion", + "ms": 0.0019494299999999966, + "opcode": "fusion", + "shape": "s32[21,1024]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204 (_nearest_vertex_seed_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:351 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "regularization_H": [ + { + "instruction": "loop_select_fusion.3", + "ms": 0.019947874999999997, + "opcode": "fusion", + "shape": "f64[1500,1500]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:549", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:549 (pixel_splitted_regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt_split.py:137 (AdaptSplit.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:332 (AbstractInversion.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "input_scatter_fusion.10", + "ms": 0.002060314999999996, + "opcode": "fusion", + "shape": "f64[1500,1500]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:615", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:615 (pixel_splitted_regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt_split.py:137 (AdaptSplit.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:332 (AbstractInversion.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "input_concatenate_fusion.8", + "ms": 0.0018707049999999975, + "opcode": "fusion", + "shape": "pred[3]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:93", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:93 (split_points_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:410 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + }, + { + "instruction": "input_concatenate_fusion.9", + "ms": 0.0018577599999999995, + "opcode": "fusion", + "shape": "pred[3]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:91", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:91 (split_points_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:410 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + }, + { + "instruction": "input_concatenate_fusion.10", + "ms": 0.0018564550000000006, + "opcode": "fusion", + "shape": "pred[3]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:90", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:90 (split_points_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:410 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + }, + { + "instruction": "input_concatenate_fusion", + "ms": 0.0017591799999999993, + "opcode": "fusion", + "shape": "s32[1500,2]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:615", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:615 (pixel_splitted_regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt_split.py:137 (AdaptSplit.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:332 (AbstractInversion.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "mesh_locate_walk": [ + { + "instruction": "input_reduce_fusion.1", + "ms": 0.025403025000000697, + "opcode": "fusion", + "shape": "pred[196]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:288", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:288 (_walk_from_seed..cond)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:353 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)" + ] + }, + { + "instruction": "loop_reduce_fusion", + "ms": 0.02537004500000037, + "opcode": "fusion", + "shape": "(f64[21361]{0}, s64[21361]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:264", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:264 (_walk_from_seed..walk_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:292 (_walk_from_seed..body)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:264 (_walk_from_seed..walk_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:292 (_walk_from_seed..body)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)" + ] + }, + { + "instruction": "loop_or_select_fusion", + "ms": 0.02246211500000033, + "opcode": "fusion", + "shape": "(s32[21361]{0}, pred[21361]{0}, pred[21361]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:270", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:270 (_walk_from_seed..walk_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:292 (_walk_from_seed..body)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:353 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)" + ] + }, + { + "instruction": "loop_select_fusion", + "ms": 0.020142059999999896, + "opcode": "fusion", + "shape": "s32[21361]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:242", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:242 (_walk_from_seed..weights_of)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:262 (_walk_from_seed..walk_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:292 (_walk_from_seed..body)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:353 (pix_indexes_delaunay_walk_from)" + ] + }, + { + "instruction": "input_reduce_fusion.2", + "ms": 0.01643097499999993, + "opcode": "fusion", + "shape": "pred[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:288", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:288 (_walk_from_seed..cond)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:353 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)" + ] + }, + { + "instruction": "while.22", + "ms": 0.014684064999999785, + "opcode": "while", + "shape": "(s32[], s32[21361]{0}, pred[21361]{0}, pred[21361]{0}, s32[3000,3]{1,0}, /*index=5*/f64[1500,2]{1,0}, f64[21361,2]{1,0}, s32[3000,3]{1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:353 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "data_vector_D": [ + { + "instruction": "input_reduce_fusion.10", + "ms": 0.12202000499999993, + "opcode": "fusion", + "shape": "f64[92,1500]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/inversion_imaging_util.py:123", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/inversion_imaging_util.py:123 (data_vector_via_blurred_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:67 (InversionImagingMapping.data_vector)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:699 (AbstractInversion.reconstruction)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "input_reduce_fusion.27", + "ms": 0.0036915050000000038, + "opcode": "fusion", + "shape": "f64[1500]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/inversion_imaging_util.py:123", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/inversion_imaging_util.py:123 (data_vector_via_blurred_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:67 (InversionImagingMapping.data_vector)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:699 (AbstractInversion.reconstruction)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "inversion_other": [ + { + "instruction": "cholesky.60", + "ms": 0.8941022749999998, + "opcode": "custom-call", + "shape": "(f64[1500,1500]{0,1}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986 (AbstractInversion._log_det_symmetric_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:1078 (AbstractInversion.log_det_curvature_reg_matrix_term)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:347 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/model/analysis.py:135 (AnalysisImaging.log_likelihood_function)" + ] + }, + { + "instruction": "cholesky.70", + "ms": 0.8915859899999999, + "opcode": "custom-call", + "shape": "(f64[1500,1500]{0,1}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986 (AbstractInversion._log_det_symmetric_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:1157 (AbstractInversion.log_det_regularization_matrix_term)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:348 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/model/analysis.py:135 (AnalysisImaging.log_likelihood_function)" + ] + }, + { + "instruction": "input_reduce_fusion.17", + "ms": 0.013030834999999982, + "opcode": "fusion", + "shape": "f64[1500]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:946", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:946 (AbstractInversion.regularization_term)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:346 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/model/analysis.py:135 (AnalysisImaging.log_likelihood_function)", + "/mnt/ral/jnightin/autolens_profiling_wt/certified-solver-phase-c1-lane-rate/scripts/imaging/likelihood_breakdown/fixed_light_trace.py:1195 (_captured_likelihood_fn.._likelihood)" + ] + }, + { + "instruction": "loop_reduce_window_fusion.1", + "ms": 0.002771350000000001, + "opcode": "fusion", + "shape": "s64[94,16]{1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "loop_reduce_window_fusion", + "ms": 0.0026658950000000028, + "opcode": "fusion", + "shape": "s64[6,16]{1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "input_reduce_fusion.25", + "ms": 0.002657260000000006, + "opcode": "fusion", + "shape": "f64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:944", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:944 (AbstractInversion.regularization_term)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:346 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/model/analysis.py:135 (AnalysisImaging.log_likelihood_function)", + "/mnt/ral/jnightin/autolens_profiling_wt/certified-solver-phase-c1-lane-rate/scripts/imaging/likelihood_breakdown/fixed_light_trace.py:1195 (_captured_likelihood_fn.._likelihood)" + ] + } + ], + "curvature_matrix_F": [ + { + "instruction": "cublas-lt-matmul.2", + "ms": 4.218645815000001, + "opcode": "custom-call", + "shape": "(f64[1500,1500]{1,0}, s8[4194304]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:134", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:134 (curvature_matrix_via_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:93 (InversionImagingMapping.curvature_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:389 (AbstractInversion.curvature_reg_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "pdip_solve": [ + { + "instruction": "cholesky.20", + "ms": 15.983820379999766, + "opcode": "custom-call", + "shape": "(f64[1500,1500]{0,1}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:106", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:106 (factorize_kkt)", + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:212 (pdip_pc_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:83 (solve_nnls)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:129 (_solve_nnls_primal_with..primal)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:164 (solve_nnls_primal_with_status)" + ] + }, + { + "instruction": "triangular-solve", + "ms": 2.540545144999988, + "opcode": "custom-call", + "shape": "(f64[1500,1]{0,1}, s8[0]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146 (solve_kkt_rhs)", + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:213 (pdip_pc_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:83 (solve_nnls)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:129 (_solve_nnls_primal_with..primal)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:164 (solve_nnls_primal_with_status)" + ] + }, + { + "instruction": "triangular-solve.2", + "ms": 2.517701315000026, + "opcode": "custom-call", + "shape": "(f64[1500,1]{0,1}, s8[0]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146 (solve_kkt_rhs)", + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:217 (pdip_pc_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:83 (solve_nnls)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:129 (_solve_nnls_primal_with..primal)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:164 (solve_nnls_primal_with_status)" + ] + }, + { + "instruction": "triangular-solve.3", + "ms": 2.3762399700001886, + "opcode": "custom-call", + "shape": "(f64[1500,1]{0,1}, s8[0]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146 (solve_kkt_rhs)", + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:217 (pdip_pc_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:83 (solve_nnls)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:129 (_solve_nnls_primal_with..primal)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:164 (solve_nnls_primal_with_status)" + ] + }, + { + "instruction": "triangular-solve.1", + "ms": 2.297555920000129, + "opcode": "custom-call", + "shape": "(f64[1500,1]{0,1}, s8[0]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146 (solve_kkt_rhs)", + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:213 (pdip_pc_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:83 (solve_nnls)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:129 (_solve_nnls_primal_with..primal)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:164 (solve_nnls_primal_with_status)" + ] + }, + { + "instruction": "cholesky.40", + "ms": 0.8650376099999995, + "opcode": "custom-call", + "shape": "(f64[1500,1500]{0,1}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:62", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:62 (initialize)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:72 (solve_nnls)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:129 (_solve_nnls_primal_with..primal)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:164 (solve_nnls_primal_with_status)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:508 (reconstruction_positive_only_from)" + ] + } + ], + "mapped_reconstruction": [ + { + "instruction": "input_reduce_fusion.14", + "ms": 0.11445830500000001, + "opcode": "fusion", + "shape": "f64[15361]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:163", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:163 (mapped_reconstructed_data_via_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:120 (InversionImagingMapping._mapped_reconstructed_data_dict_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:196 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + } + ] + }, + "stage_audit_note": "The HLO instructions that contributed most of each stage's milliseconds, with their full source stack. A stage row is only as good as the rules that built it; this is how a reader checks a row against the HLO instead of trusting it.", + "untraced_wall_ms": 50.753544429990136, + "reconciliation_vs_untraced_pct": -0.43295179175760246, + "wall_basis": "wall_ms is the TRACED run's wall, the run these kernel durations came from. untraced_wall_ms is the same executable without the profiler; the difference is the profiler's overhead and belongs in neither the stages nor the idle row.", + "calls": 200, + "call_split": "per-call (first-instruction recurrence)", + "call_blocks": 200, + "events": 191310, + "streams": [ + "Stream #14(MemcpyD2D,MemcpyH2D,Compute,MemcpyD2H,Memset)" + ], + "per_stage_ms": { + "border_relocator": { + "median_ms": 0.11491299999999999, + "min_ms": 0.11401599999999998, + "max_ms": 0.11606 + }, + "chi_squared_evidence": { + "median_ms": 0.010688, + "min_ms": 0.010304, + "max_ms": 0.011424 + }, + "curvature_matrix_F": { + "median_ms": 4.218025000000001, + "min_ms": 4.205913, + "max_ms": 4.265434 + }, + "data_vector_D": { + "median_ms": 0.125696, + "min_ms": 0.124924, + "max_ms": 0.126593 + }, + "inversion_other": { + "median_ms": 1.8166664999999997, + "min_ms": 1.80033, + "max_ms": 1.8335469999999998 + }, + "mapped_reconstruction": { + "median_ms": 0.1144465, + "min_ms": 0.113825, + "max_ms": 0.115553 + }, + "mapping_matrix": { + "median_ms": 0.1161285, + "min_ms": 0.11510000000000001, + "max_ms": 0.11724899999999999 + }, + "memset": { + "median_ms": 0.05091200000000001, + "min_ms": 0.04210800000000001, + "max_ms": 0.08470300000000001 + }, + "mesh_construction": { + "median_ms": 0.002048, + "min_ms": 0.002016, + "max_ms": 0.002049 + }, + "mesh_locate_walk": { + "median_ms": 0.14832250000000002, + "min_ms": 0.13049700000000006, + "max_ms": 0.184216 + }, + "mesh_qhull_callback": { + "median_ms": 0.010624, + "min_ms": 0.010464000000000001, + "max_ms": 0.01104 + }, + "mesh_seed_argmin": { + "median_ms": 0.22256200000000015, + "min_ms": 0.2221690000000002, + "max_ms": 0.22293900000000008 + }, + "mixed_fusion": { + "median_ms": 1.2544275, + "min_ms": 1.2487959999999994, + "max_ms": 1.2580559999999994 + }, + "other": { + "median_ms": 0.0711995, + "min_ms": 0.06870099999999998, + "max_ms": 0.07558200000000001 + }, + "pdip_solve": { + "median_ms": 27.262917500000007, + "min_ms": 22.713710000000027, + "max_ms": 47.29580200000003 + }, + "psf_convolution_mapping_matrix": { + "median_ms": 7.320093, + "min_ms": 7.3059970000000005, + "max_ms": 7.335915 + }, + "ray_trace_data_grid": { + "median_ms": 0.013633000000000001, + "min_ms": 0.013535000000000002, + "max_ms": 0.014079999999999999 + }, + "regularization_H": { + "median_ms": 0.03088, + "min_ms": 0.030365999999999997, + "max_ms": 0.031584 + } + }, + "stage_order": [ + "ray_trace_data_grid", + "border_relocator", + "mesh_qhull_callback", + "mesh_seed_argmin", + "mesh_locate_walk", + "mesh_construction", + "mapping_matrix", + "psf_convolution_mapping_matrix", + "data_vector_D", + "curvature_matrix_F", + "regularization_H", + "pdip_solve", + "mapped_reconstruction", + "chi_squared_evidence", + "inversion_other", + "mixed_fusion", + "other", + "memset" + ], + "mixed_fusion": { + "ms": 1.2544275, + "constituent_stage_sets": { + "curvature_matrix_F + psf_convolution_mapping_matrix": 1.0144249650000003, + "curvature_reg_reduce_gather + inversion_other + mapped_reconstruction + pdip_solve + reconstruction_scatter + regularization_H": 0.060890715000000005, + "inversion_other + regularization_H": 0.029447410000000094, + "inversion_other + mesh_construction + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin + regularization_H": 0.021490085000000013, + "inversion_other + mapping_matrix + mesh_construction + mesh_dual_areas + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin": 0.021122015000000004, + "inversion_other + mesh_construction + mesh_dual_areas + mesh_interpolation_weights + regularization_H": 0.014803945000000004, + "grids_and_structures + mass_profile_deflections + ray_trace_data_grid": 0.01451463499999999, + "inversion_other + mapping_matrix + mesh_construction + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin": 0.011625870000000002, + "grids_and_structures + mass_profile_deflections": 0.010162915000000007, + "inversion_other + mesh_dual_areas + mesh_locate_walk": 0.00926599500000005, + "inversion_other + mesh_construction + mesh_seed_argmin + regularization_H": 0.007246359999999995, + "inversion_other + mesh_construction + regularization_H": 0.0065065099999999845, + "inversion_other + ray_trace_data_grid": 0.005272445000000013, + "inversion_other + mapped_reconstruction + pdip_solve + reconstruction_scatter": 0.004812449999999998, + "inversion_other + mapped_reconstruction": 0.0037050900000000016, + "mapping_matrix + regularization_H": 0.003474344999999993, + "inversion_other + mesh_construction + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin": 0.003105385000000001, + "inversion_other + mesh_construction + mesh_dual_areas + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin": 0.0029794900000000056, + "inversion_other + pdip_solve": 0.0028225499999999983, + "inversion_other + mesh_locate_walk + mesh_seed_argmin": 0.002481235000000002, + "inversion_other + mesh_interpolation_weights": 0.002146065000000007, + "chi_squared_evidence + inversion_other": 0.0017820649999999991 + }, + "example_kernels": { + "curvature_matrix_F + psf_convolution_mapping_matrix": [ + "loop_divide_gather_fusion" + ], + "curvature_reg_reduce_gather + inversion_other + mapped_reconstruction + pdip_solve + reconstruction_scatter + regularization_H": [ + "input_add_multiply_transpose_fusion" + ], + "inversion_other + regularization_H": [ + "loop_reduce_slice_fusion", + "loop_reduce_fusion.1", + "loop_reduce_fusion.2", + "input_transpose_fusion.3" + ], + "inversion_other + mesh_construction + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin + regularization_H": [ + "input_reduce_fusion.24", + "loop_select_fusion.4", + "input_scatter_fusion.2" + ], + "inversion_other + mapping_matrix + mesh_construction + mesh_dual_areas + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin": [ + "input_scatter_fusion.6", + "input_scatter_fusion.3" + ], + "inversion_other + mesh_construction + mesh_dual_areas + mesh_interpolation_weights + regularization_H": [ + "loop_abs_fusion" + ], + "grids_and_structures + mass_profile_deflections + ray_trace_data_grid": [ + "loop_subtract_fusion.2", + "loop_subtract_fusion.1" + ], + "inversion_other + mapping_matrix + mesh_construction + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin": [ + "input_scatter_fusion.4" + ], + "grids_and_structures + mass_profile_deflections": [ + "loop_divide_minimum_multiply_sine_sqrt_fusion", + "loop_slice_fusion" + ], + "inversion_other + mesh_dual_areas + mesh_locate_walk": [ + "loop_select_fusion.6", + "input_scatter_fusion.9", + "input_scatter_fusion.8", + "input_scatter_fusion.7" + ] + }, + "prorated_estimate_ms": { + "curvature_matrix_F": 0.5072124825000002, + "psf_convolution_mapping_matrix": 0.5072124825000002, + "inversion_other": 0.054450751714285796, + "regularization_H": 0.03713222650000004, + "mesh_construction": 0.016595630880952377, + "mesh_interpolation_weights": 0.013688236714285722, + "mesh_locate_walk": 0.013570158547619067, + "mapped_reconstruction": 0.01320411, + "pdip_solve": 0.012762839999999998, + "mesh_seed_argmin": 0.01229308354761905, + "reconstruction_scatter": 0.011351565, + "curvature_reg_reduce_gather": 0.0101484525, + "grids_and_structures": 0.009919669166666666, + "mass_profile_deflections": 0.009919669166666666, + "mesh_dual_areas": 0.009563466380952401, + "ray_trace_data_grid": 0.0074744341666666695, + "mapping_matrix": 0.006692248214285712, + "chi_squared_evidence": 0.0008910324999999996 + }, + "prorated_note": "ESTIMATE ONLY \u2014 a mixed fusion's time split equally across the stages its constituents span. Never summed into the measured table, never reconciled." + }, + "other_sources_ms": { + "copy.72": 0.04182004999999856, + "copy.35": 0.017098710000000218, + "copy.40": 0.002001399999999998, + "loop_broadcast_fusion.1": 0.001965755000000001, + "copy.71": 0.001792784999999997, + "loop_broadcast_fusion.4": 0.0017787099999999967, + "copy.70": 0.0017457400000000039, + "copy.20": 0.001658219999999997, + "copy.52": 0.0016358150000000016 + }, + "device_span_ms": 52.023427334999994, + "device_busy_ms": 44.393803785, + "device_idle_ms": 7.629623549999991, + "largest_idle_gaps": [ + { + "gap_ms": 5.577245, + "after": "pure_callback.4", + "before": "pure_callback.4" + }, + { + "gap_ms": 0.037183, + "after": "pure_callback.4", + "before": "copy.71" + }, + { + "gap_ms": 0.030879, + "after": "input_concatenate_fusion.7", + "before": "pure_callback.4" + }, + { + "gap_ms": 0.0304, + "after": "copy.35", + "before": "input_reduce_fusion.1" + }, + { + "gap_ms": 0.020352, + "after": "eigh.45", + "before": "eigh.45" + }, + { + "gap_ms": 0.020032, + "after": "input_reduce_fusion.3", + "before": "input_divide_reduce_subtract_fusion" + }, + { + "gap_ms": 0.02, + "after": "while.28", + "before": "input_reduce_fusion.3" + }, + { + "gap_ms": 0.019168, + "after": "input_reduce_fusion.26", + "before": "loop_broadcast_fusion.3" + } + ], + "kernel_ms": 42.90418250000001, + "sum_ms": 50.53380605, + "wall_ms": 52.02925144500114, + "host_outside_span_ms": 0.0058241100011429126, + "reconciliation_pct": -2.8742396891524247, + "unjoined_ms": 0.0, + "unjoined_pct": 0.0, + "other_ms": 0.0711995, + "other_pct": 0.13684513619278815, + "note": "Stage rows attribute the command-buffers-OFF program (see the module docstring): kernel times are the same, the launch overhead the CUDA graphs remove is not. sum_ms = kernel rows + device_idle_ms; the residual against wall_ms is host_outside_span_ms (dispatch before the first kernel, teardown after the last).", + "per_stage_ms_per_lane": { + "border_relocator": 0.11491299999999999, + "chi_squared_evidence": 0.010688, + "curvature_matrix_F": 4.218025000000001, + "data_vector_D": 0.125696, + "inversion_other": 1.8166664999999997, + "mapped_reconstruction": 0.1144465, + "mapping_matrix": 0.1161285, + "memset": 0.05091200000000001, + "mesh_construction": 0.002048, + "mesh_locate_walk": 0.14832250000000002, + "mesh_qhull_callback": 0.010624, + "mesh_seed_argmin": 0.22256200000000015, + "mixed_fusion": 1.2544275, + "other": 0.0711995, + "pdip_solve": 27.262917500000007, + "psf_convolution_mapping_matrix": 7.320093, + "ray_trace_data_grid": 0.013633000000000001, + "regularization_H": 0.03088 + }, + "per_lane_divisor": 1, + "host_callback": { + "pure_callback_span_ms": 101.39265520000001, + "qhull_ms": 94.61371190000001, + "callback_body_ms_note": "the OUTERMOST matching body event, not a sum: under the probe the body appears twice (the wrapper and the timed re-implementation it calls) and summing them would count the same work twice", + "events_by_name": { + "pure_callback.4": { + "count": 200, + "ms": 101.39265520000001 + }, + "$callback.py:815 _wrapped_callback": { + "count": 200, + "ms": 99.64069369999996 + }, + "$callback.py:224 _callback": { + "count": 200, + "ms": 99.16375899999997 + }, + "$callback.py:74 pure_callback_impl": { + "count": 200, + "ms": 98.97832679999995 + }, + "$callback.py:69 __call__": { + "count": 200, + "ms": 94.92798070000003 + }, + "$delaunay.py:162 ": { + "count": 200, + "ms": 94.7946648 + }, + "$host_callback_probe.py:225 wrapped": { + "count": 200, + "ms": 94.61371190000001 + }, + "$host_callback_probe.py:160 _timed_tri_only": { + "count": 200, + "ms": 94.44655579999997 + }, + "ThenExecuteCallback:GetEventForComputeStreamSyncPoint": { + "count": 200, + "ms": 0.3492051999999998 + }, + "$callback.py:822 ": { + "count": 800, + "ms": 0.2878111999999995 + }, + "$__init__.py:132 _xla_gc_callback": { + "count": 2, + "ms": 0.000338 + } + }, + "note": "HOST milliseconds per traced BATCH (the whole invocation), aggregated by name because the events nest. Not a row of the device table: the device pays for them as the idle gaps largest_idle_gaps names." + }, + "host_callback_ms": 101.39265520000001 + }, + "hlo_census": { + "status": "excluded", + "reason": "The legacy census anchors PyAutoArray source line numbers that moved after the phase-1 run. No batched attribution is published from unsupported anchors; the device-event table and wall reconciliation remain valid." + }, + "stage_map_provenance": [ + { + "label": "log_det_curvature_reg", + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 850, + 882 + ], + "requires": { + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 884, + 896 + ] + }, + "function": null + }, + { + "label": "log_det_regularization", + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 850, + 882 + ], + "requires": { + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 897, + 943 + ] + }, + "function": null + }, + { + "label": "curvature_reg_add", + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 359, + 372 + ], + "requires": null, + "function": null + }, + { + "label": "curvature_reg_reduce_gather", + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 374, + 398 + ], + "requires": null, + "function": null + }, + { + "label": "edge_subset_gather", + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 606, + 614 + ], + "requires": null, + "function": null + }, + { + "label": "regularization_term", + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 786, + 849 + ], + "requires": null, + "function": null + }, + { + "label": "mapped_reconstruction", + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 722, + 785 + ], + "requires": null, + "function": null + }, + { + "label": "reconstruction_scatter", + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 583, + 605 + ], + "requires": null, + "function": null + }, + { + "label": "reconstruction_scatter", + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 615, + 721 + ], + "requires": null, + "function": null + }, + { + "label": "certified_active_set_solve", + "path": "likelihood_breakdown/active_set_steps.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "certified_active_set_solve", + "path": "likelihood_breakdown/library_solver_injection.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "pdip_solve", + "path": "PyAutoArray/autoarray/util/jax_nnls.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "pdip_solve", + "path": "PyAutoArray/autoarray/inversion/inversion/inversion_util.py", + "lines": [ + 256, + 488 + ], + "requires": null, + "function": null + }, + { + "label": "mapped_reconstruction", + "path": "PyAutoArray/autoarray/inversion/inversion/inversion_util.py", + "lines": [ + 156, + 200 + ], + "requires": null, + "function": null + }, + { + "label": "curvature_matrix_F", + "path": "PyAutoArray/autoarray/inversion/inversion/inversion_util.py", + "lines": [ + 12, + 155 + ], + "requires": null, + "function": null + }, + { + "label": "reconstruction_scatter", + "path": "PyAutoArray/autoarray/inversion/inversion/inversion_util.py", + "lines": [ + 201, + 255 + ], + "requires": null, + "function": null + }, + { + "label": "data_vector_D", + "path": "PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py", + "lines": [ + 54, + 73 + ], + "requires": null, + "function": null + }, + { + "label": "curvature_matrix_F", + "path": "PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py", + "lines": [ + 74, + 110 + ], + "requires": null, + "function": null + }, + { + "label": "data_vector_D", + "path": "PyAutoArray/autoarray/inversion/inversion/imaging/inversion_imaging_util.py", + "lines": null, + "requires": null, + "function": "data_vector_via_blurred_mapping_matrix_from" + }, + { + "label": "curvature_matrix_F", + "path": "PyAutoArray/autoarray/inversion/inversion/imaging/inversion_imaging_util.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "psf_convolution_mapping_matrix", + "path": "likelihood_breakdown/psf_cube_injection.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "psf_convolution_mapping_matrix", + "path": "PyAutoArray/autoarray/operators/convolver.py", + "lines": [ + 1086, + 1300 + ], + "requires": null, + "function": null + }, + { + "label": "psf_convolution_mapping_matrix", + "path": "PyAutoArray/autoarray/operators/convolver.py", + "lines": [ + 632, + 642 + ], + "requires": null, + "function": null + }, + { + "label": "psf_convolution_mapping_matrix", + "path": "PyAutoArray/autoarray/operators/convolver.py", + "lines": [ + 670, + 691 + ], + "requires": null, + "function": null + }, + { + "label": "psf_convolution_mapping_matrix", + "path": "PyAutoArray/autoarray/operators/convolver.py", + "lines": null, + "requires": { + "path": "PyAutoArray/autoarray/operators/convolver.py", + "lines": [ + 1086, + 1300 + ] + }, + "function": null + }, + { + "label": "psf_convolution_mapping_matrix", + "path": "PyAutoArray/autoarray/operators/convolver.py", + "lines": null, + "requires": { + "path": "PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py", + "lines": [ + 119, + 150 + ] + }, + "function": null + }, + { + "label": "psf_convolution_image", + "path": "PyAutoArray/autoarray/operators/convolver.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "psf_convolution_mapping_matrix", + "path": "PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py", + "lines": [ + 119, + 150 + ], + "requires": null, + "function": null + }, + { + "label": "mesh_qhull_callback", + "path": "PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py", + "lines": [ + 139, + 172 + ], + "requires": null, + "function": null + }, + { + "label": "mesh_seed_argmin", + "path": "PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py", + "lines": [ + 173, + 207 + ], + "requires": null, + "function": null + }, + { + "label": "mesh_locate_walk", + "path": "PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py", + "lines": [ + 208, + 372 + ], + "requires": null, + "function": null + }, + { + "label": "mesh_dual_areas", + "path": "PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py", + "lines": [ + 373, + 396 + ], + "requires": null, + "function": null + }, + { + "label": "mesh_dual_areas", + "path": "PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py", + "lines": [ + 437, + 494 + ], + "requires": null, + "function": null + }, + { + "label": "mesh_dual_areas", + "path": "PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py", + "lines": [ + 605, + 615 + ], + "requires": null, + "function": null + }, + { + "label": "mesh_interpolation_weights", + "path": "PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py", + "lines": [ + 616, + 695 + ], + "requires": null, + "function": null + }, + { + "label": "mesh_interpolation_weights", + "path": "PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py", + "lines": [ + 896, + 1000 + ], + "requires": null, + "function": null + }, + { + "label": "mesh_construction", + "path": "PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "border_relocator", + "path": "PyAutoArray/autoarray/inversion/mesh/border_relocator.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "mesh_construction", + "path": "PyAutoArray/autoarray/inversion/mesh/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "mapping_matrix", + "path": "PyAutoArray/autoarray/inversion/mappers/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "mapping_matrix", + "path": "PyAutoArray/autoarray/inversion/mappings/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "mapping_matrix", + "path": "PyAutoArray/autoarray/inversion/linear_obj/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "regularization_H", + "path": "PyAutoArray/autoarray/inversion/regularization/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "chi_squared_evidence", + "path": "PyAutoArray/autoarray/fit/fit_util.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "chi_squared_evidence", + "path": "PyAutoArray/autoarray/fit/fit_dataset.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "ray_trace_mesh_grid", + "path": "PyAutoLens/autolens/lens/to_inversion.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "ray_trace_mesh_grid", + "path": "PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "mass_profile_deflections", + "path": "PyAutoGalaxy/autogalaxy/profiles/mass/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "light_profile_image", + "path": "PyAutoGalaxy/autogalaxy/profiles/light/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "light_profile_image", + "path": "PyAutoGalaxy/autogalaxy/operate/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "ray_trace_data_grid", + "path": "PyAutoLens/autolens/lens/tracer.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "ray_trace_data_grid", + "path": "PyAutoLens/autolens/lens/tracer_util.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "grids_and_structures", + "path": "PyAutoArray/autoarray/structures/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "grids_and_structures", + "path": "PyAutoArray/autoarray/operators/over_sampling/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "grids_and_structures", + "path": "PyAutoArray/autoarray/geometry/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "inversion_other", + "path": "PyAutoArray/autoarray/inversion/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "fit_imaging_other", + "path": "PyAutoLens/autolens/imaging/fit_imaging.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "fit_imaging_other", + "path": "PyAutoGalaxy/autogalaxy/imaging/fit_imaging.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "fit_imaging_other", + "path": "PyAutoArray/autoarray/fit/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "analysis_other", + "path": "PyAutoLens/autolens/analysis/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "analysis_other", + "path": "PyAutoGalaxy/autogalaxy/analysis/", + "lines": null, + "requires": null, + "function": null + } + ], + "trace_timing": { + "traced_wall_ms": 52.02925144500114, + "untraced_wall_ms": 50.753544429990136, + "profiler_overhead_ms": 1.275707015011001, + "profiler_overhead_pct": 2.5135328563519774 + }, + "jit_phases": { + "b_s3_pdip_library_likelihood_jit": { + "lower_s": 1.688098591999733, + "compile_s": 4.548470540998096, + "first_call_s": 1.9206595620016742, + "steady_per_call_s": 0.05063946449990908 + }, + "d_s3_certified_fallback_library_likelihood_jit": { + "lower_s": 0.47995273700144025, + "compile_s": 4.393066720000206, + "first_call_s": 0.04469520799830207, + "steady_per_call_s": 0.03151559840007394 + } + }, + "peak_bytes": { + "after_setup": 85108992, + "after_routes": 1181653248, + "after_all": 23614574336, + "note": "jax.devices()[0].memory_stats()['peak_bytes_in_use']; None on a backend that does not report it (CPU). Process-wide high-water marks." + }, + "note": "Every stage row is a MEASURED sum of GPU kernel durations joined to library source through the optimized HLO of ONE program \u2014 not arithmetic across compilations. The rows attribute the command-buffers-OFF program: kernel time is the same as production, the launch overhead the CUDA graphs remove is not, and command_buffers.* carries both walls and their delta. sum_ms = kernel rows + measured device_idle_ms; the residual against the wall is host_outside_span_ms and is reported, not absorbed. mixed_fusion.prorated_estimate_ms is an ESTIMATE and is never part of the table. No row may be quoted if reconciliation_pct is outside 5 % or unjoined_ms is non-zero.", + "vmap": { + "batch": 20, + "lanes_mode": "captured", + "arms": [ + "vmap", + "scalar" + ], + "draw_seed": 0, + "fallback": true, + "composition": "jax.jit(jax.vmap(fn))", + "composition_provenance": "Current Fitness._vmap after PyAutoFit#1638. Array 343376 used the retired jax.vmap(jax.jit(fn)) composition and is historical evidence only.", + "headline_arm": "scalar", + "lane_rtol": 1e-09, + "lanes": [ + { + "lane": 0, + "draw_name": "call00015_lane00", + "draw_kind": "captured", + "offsets": { + "centre_0": -0.0033655095107821688, + "centre_1": 0.004631951955766499, + "ell_comps_0": 0.000564301988937442, + "ell_comps_1": -0.00879076787683888, + "einstein_radius": 0.018337010967920175 + }, + "log_likelihood_vmap": 24758.506194309146, + "log_likelihood_scalar": 24758.506194309135, + "log_likelihood_library_pdip": 24758.506194309142, + "log_likelihood_library_pdip_scalar": 24758.50619430913, + "rel_diff_vmap_vs_library_pdip": 1.469385421939519e-16, + "rel_diff_scalar_vs_library_pdip_scalar": 1.4693854219395194e-16, + "abs_diff_nats": 1.0913936421275139e-11, + "rel_diff": 4.4081562658185577e-16, + "rel_diff_scalar_vs_library_pdip": 2.938770843879038e-16, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 1.0913936421275139e-11, + "rel_diff_library_pdip_vmap_vs_scalar": 4.408156265818558e-16, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": null, + "passes": null, + "pdip_iter": null + }, + { + "lane": 1, + "draw_name": "call00015_lane01", + "draw_kind": "captured", + "offsets": { + "centre_0": -0.004311760382151672, + "centre_1": 0.0027192789928108052, + "ell_comps_0": 0.0061667694809026535, + "ell_comps_1": 0.003465536775180321, + "einstein_radius": -0.05732579988501185 + }, + "log_likelihood_vmap": 20551.00488777266, + "log_likelihood_scalar": 20551.00488777356, + "log_likelihood_library_pdip": 20551.004887772666, + "log_likelihood_library_pdip_scalar": 20551.00488777308, + "rel_diff_vmap_vs_library_pdip": 3.540438851490147e-16, + "rel_diff_scalar_vs_library_pdip_scalar": 2.33668964198345e-14, + "abs_diff_nats": 9.022187441587448e-10, + "rel_diff": 4.3901441758475915e-14, + "rel_diff_scalar_vs_library_pdip": 4.354739787332881e-14, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 4.147295840084553e-10, + "rel_diff_library_pdip_vmap_vs_scalar": 2.018050145349343e-14, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": null, + "passes": null, + "pdip_iter": null + }, + { + "lane": 2, + "draw_name": "call00015_lane02", + "draw_kind": "captured", + "offsets": { + "centre_0": 0.0002796502552123051, + "centre_1": 0.0016003321376979894, + "ell_comps_0": -0.002094430657472772, + "ell_comps_1": 0.006146479068253558, + "einstein_radius": -0.025968910196758177 + }, + "log_likelihood_vmap": -189709.9713791528, + "log_likelihood_scalar": -189709.05842409882, + "log_likelihood_library_pdip": -189709.70530157938, + "log_likelihood_library_pdip_scalar": -189709.060063124, + "rel_diff_vmap_vs_library_pdip": 1.4025511925612143e-06, + "rel_diff_scalar_vs_library_pdip_scalar": 8.639677877689878e-09, + "abs_diff_nats": 0.9129550539655611, + "rel_diff": 4.812395683945833e-06, + "rel_diff_scalar_vs_library_pdip": 3.4098280819426745e-06, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 0.6452384553849697, + "rel_diff_library_pdip_vmap_vs_scalar": 3.4012000015722623e-06, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "FAIL", + "certified": null, + "passes": null, + "pdip_iter": null + }, + { + "lane": 3, + "draw_name": "call00015_lane03", + "draw_kind": "captured", + "offsets": { + "centre_0": 0.004594602299816973, + "centre_1": 0.004924922434755804, + "ell_comps_0": 0.028601845732661953, + "ell_comps_1": 0.003760187047606014, + "einstein_radius": -0.03088526730480501 + }, + "log_likelihood_vmap": -141741.9790338971, + "log_likelihood_scalar": -141741.96576941968, + "log_likelihood_library_pdip": -141741.98123707197, + "log_likelihood_library_pdip_scalar": -141741.9668731601, + "rel_diff_vmap_vs_library_pdip": 1.5543559131228685e-08, + "rel_diff_scalar_vs_library_pdip_scalar": 7.786969820431048e-09, + "abs_diff_nats": 0.013264477427583188, + "rel_diff": 9.358186445051372e-08, + "rel_diff_scalar_vs_library_pdip": 1.0912541336958276e-07, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 0.014363911875989288, + "rel_diff_library_pdip_vmap_vs_scalar": 1.0133845460775246e-07, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "FAIL", + "certified": null, + "passes": null, + "pdip_iter": null + }, + { + "lane": 4, + "draw_name": "call00015_lane04", + "draw_kind": "captured", + "offsets": { + "centre_0": -0.0060950290987001, + "centre_1": -0.0006121094560707545, + "ell_comps_0": 0.009637314264800585, + "ell_comps_1": 0.006641580028105454, + "einstein_radius": -0.03125810931551931 + }, + "log_likelihood_vmap": 24880.545932988694, + "log_likelihood_scalar": 24880.54593298874, + "log_likelihood_library_pdip": 24880.545932988694, + "log_likelihood_library_pdip_scalar": 24880.545932988738, + "rel_diff_vmap_vs_library_pdip": 0.0, + "rel_diff_scalar_vs_library_pdip_scalar": 1.4621780474150176e-16, + "abs_diff_nats": 4.729372449219227e-11, + "rel_diff": 1.9008314616395227e-15, + "rel_diff_scalar_vs_library_pdip": 1.9008314616395262e-15, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 4.3655745685100555e-11, + "rel_diff_library_pdip_vmap_vs_scalar": 1.754613656898021e-15, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": null, + "passes": null, + "pdip_iter": null + }, + { + "lane": 5, + "draw_name": "call00015_lane05", + "draw_kind": "captured", + "offsets": { + "centre_0": -0.008435952123169364, + "centre_1": -0.007849511137408794, + "ell_comps_0": -0.01598149485178925, + "ell_comps_1": 0.01654417876136871, + "einstein_radius": 0.014294380855379263 + }, + "log_likelihood_vmap": 25472.519186598707, + "log_likelihood_scalar": 25472.519186795194, + "log_likelihood_library_pdip": 25472.51918660555, + "log_likelihood_library_pdip_scalar": 25472.519186807505, + "rel_diff_vmap_vs_library_pdip": 2.6864394864163455e-13, + "rel_diff_scalar_vs_library_pdip_scalar": 4.833020320021711e-13, + "abs_diff_nats": 1.9648723537102342e-07, + "rel_diff": 7.713694665617574e-12, + "rel_diff_scalar_vs_library_pdip": 7.44505071703337e-12, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 2.0195511751808226e-07, + "rel_diff_library_pdip_vmap_vs_scalar": 7.928352748976514e-12, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": null, + "passes": null, + "pdip_iter": null + }, + { + "lane": 6, + "draw_name": "call00015_lane06", + "draw_kind": "captured", + "offsets": { + "centre_0": 0.0031698313356290646, + "centre_1": -0.0038584140676992847, + "ell_comps_0": 0.01810147576636289, + "ell_comps_1": -0.011577480306416508, + "einstein_radius": 0.016136835525067283 + }, + "log_likelihood_vmap": -83383.91630614897, + "log_likelihood_scalar": -83383.91550142097, + "log_likelihood_library_pdip": -83383.91624192083, + "log_likelihood_library_pdip_scalar": -83383.91543133747, + "rel_diff_vmap_vs_library_pdip": 7.702700998483194e-10, + "rel_diff_scalar_vs_library_pdip_scalar": 8.404917557626939e-10, + "abs_diff_nats": 0.0008047279989114031, + "rel_diff": 9.650878038914946e-09, + "rel_diff_scalar_vs_library_pdip": 8.880607853360962e-09, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 0.0008105833549052477, + "rel_diff_library_pdip_vmap_vs_scalar": 9.72109969545293e-09, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": null, + "passes": null, + "pdip_iter": null + }, + { + "lane": 7, + "draw_name": "call00015_lane07", + "draw_kind": "captured", + "offsets": { + "centre_0": 0.006158729760195174, + "centre_1": 0.004883559265258847, + "ell_comps_0": 0.007613883677130215, + "ell_comps_1": -0.005800175617006949, + "einstein_radius": 0.0662922007765554 + }, + "log_likelihood_vmap": -11960.284433087865, + "log_likelihood_scalar": -11960.284429855652, + "log_likelihood_library_pdip": -11960.284433124725, + "log_likelihood_library_pdip_scalar": -11960.284429733794, + "rel_diff_vmap_vs_library_pdip": 3.0818666127510523e-12, + "rel_diff_scalar_vs_library_pdip_scalar": 1.0188531789377876e-11, + "abs_diff_nats": 3.2322132028639317e-06, + "rel_diff": 2.702455131247193e-10, + "rel_diff_scalar_vs_library_pdip": 2.7332737966360486e-10, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 3.390930942259729e-06, + "rel_diff_library_pdip_vmap_vs_scalar": 2.835159115304754e-10, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": null, + "passes": null, + "pdip_iter": null + }, + { + "lane": 8, + "draw_name": "call00015_lane08", + "draw_kind": "captured", + "offsets": { + "centre_0": 0.0030335293924908615, + "centre_1": 0.0012117081273721316, + "ell_comps_0": 0.0008852687687036301, + "ell_comps_1": -0.0027113633212058814, + "einstein_radius": -0.03873713959923952 + }, + "log_likelihood_vmap": 23223.550391413824, + "log_likelihood_scalar": 23223.55039149861, + "log_likelihood_library_pdip": 23223.550391418405, + "log_likelihood_library_pdip_scalar": 23223.55039149858, + "rel_diff_vmap_vs_library_pdip": 1.9722287251224745e-13, + "rel_diff_scalar_vs_library_pdip_scalar": 1.409853735189912e-15, + "abs_diff_nats": 8.478673407807946e-08, + "rel_diff": 3.650894572481783e-12, + "rel_diff_scalar_vs_library_pdip": 3.4536716999821445e-12, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 8.017377695068717e-08, + "rel_diff_library_pdip_vmap_vs_scalar": 3.4522618462350316e-12, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": null, + "passes": null, + "pdip_iter": null + }, + { + "lane": 9, + "draw_name": "call00015_lane09", + "draw_kind": "captured", + "offsets": { + "centre_0": -0.0008035510098975272, + "centre_1": 0.005559773241319952, + "ell_comps_0": -0.003701655436278317, + "ell_comps_1": -0.012378591445614512, + "einstein_radius": 0.032284336889985665 + }, + "log_likelihood_vmap": NaN, + "log_likelihood_scalar": -177117.6541844139, + "log_likelihood_library_pdip": -177118.70764270367, + "log_likelihood_library_pdip_scalar": -177117.7614297063, + "rel_diff_vmap_vs_library_pdip": NaN, + "rel_diff_scalar_vs_library_pdip_scalar": 6.055027543960367e-07, + "abs_diff_nats": NaN, + "rel_diff": NaN, + "rel_diff_scalar_vs_library_pdip": 5.947752802556916e-06, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 0.9462129973690026, + "rel_diff_library_pdip_vmap_vs_scalar": 5.342281822732562e-06, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "FAIL", + "certified": null, + "passes": null, + "pdip_iter": null + }, + { + "lane": 10, + "draw_name": "call00015_lane10", + "draw_kind": "captured", + "offsets": { + "centre_0": -0.008473569241265282, + "centre_1": -0.0051993251621340235, + "ell_comps_0": -0.0031466996514049606, + "ell_comps_1": -0.0076036423480284636, + "einstein_radius": 0.08283321334626792 + }, + "log_likelihood_vmap": -101745.38558917546, + "log_likelihood_scalar": -101745.38333517434, + "log_likelihood_library_pdip": -101745.38578021828, + "log_likelihood_library_pdip_scalar": -101745.3833970182, + "rel_diff_vmap_vs_library_pdip": 1.8776557722626077e-09, + "rel_diff_scalar_vs_library_pdip_scalar": 6.078296854568999e-10, + "abs_diff_nats": 0.0022540011268574744, + "rel_diff": 2.2153350382810392e-08, + "rel_diff_scalar_vs_library_pdip": 2.403100562270571e-08, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 0.002383200073381886, + "rel_diff_library_pdip_vmap_vs_scalar": 2.34231765001313e-08, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "FAIL", + "certified": null, + "passes": null, + "pdip_iter": null + }, + { + "lane": 11, + "draw_name": "call00015_lane11", + "draw_kind": "captured", + "offsets": { + "centre_0": 0.001017060353322001, + "centre_1": 0.003035861051809724, + "ell_comps_0": 0.0014054844842678396, + "ell_comps_1": -0.00019678252877009805, + "einstein_radius": -0.04179610309843307 + }, + "log_likelihood_vmap": 18957.528349914093, + "log_likelihood_scalar": 18957.52834977374, + "log_likelihood_library_pdip": 18957.52834991384, + "log_likelihood_library_pdip_scalar": 18957.52834977224, + "rel_diff_vmap_vs_library_pdip": 1.3433107512540121e-14, + "rel_diff_scalar_vs_library_pdip_scalar": 7.906343278868383e-14, + "abs_diff_nats": 1.4035322237759829e-07, + "rel_diff": 7.403561254823254e-12, + "rel_diff_scalar_vs_library_pdip": 7.390128147256e-12, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 1.4159741112962365e-07, + "rel_diff_library_pdip_vmap_vs_scalar": 7.469191580099882e-12, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": null, + "passes": null, + "pdip_iter": null + }, + { + "lane": 12, + "draw_name": "call00015_lane12", + "draw_kind": "captured", + "offsets": { + "centre_0": -0.0012508260776529923, + "centre_1": -0.0075763258203543175, + "ell_comps_0": -0.0003476568325791879, + "ell_comps_1": 0.0070528223693464365, + "einstein_radius": -0.005182936058341969 + }, + "log_likelihood_vmap": 24810.049660194898, + "log_likelihood_scalar": 24810.049660194898, + "log_likelihood_library_pdip": 24810.049660194898, + "log_likelihood_library_pdip_scalar": 24810.049660194905, + "rel_diff_vmap_vs_library_pdip": 0.0, + "rel_diff_scalar_vs_library_pdip_scalar": 2.93266547783535e-16, + "abs_diff_nats": 0.0, + "rel_diff": 0.0, + "rel_diff_scalar_vs_library_pdip": 0.0, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 7.275957614183426e-12, + "rel_diff_library_pdip_vmap_vs_scalar": 2.93266547783535e-16, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": null, + "passes": null, + "pdip_iter": null + }, + { + "lane": 13, + "draw_name": "call00015_lane13", + "draw_kind": "captured", + "offsets": { + "centre_0": 0.0039046265841316857, + "centre_1": 0.008586063066835778, + "ell_comps_0": 0.01612319103606081, + "ell_comps_1": -0.006478405394829051, + "einstein_radius": -0.06420305523683667 + }, + "log_likelihood_vmap": -3605.7062166617106, + "log_likelihood_scalar": -3605.7062159682246, + "log_likelihood_library_pdip": -3605.7062169277124, + "log_likelihood_library_pdip_scalar": -3605.7062158656845, + "rel_diff_vmap_vs_library_pdip": 7.377243691350484e-11, + "rel_diff_scalar_vs_library_pdip_scalar": 2.8438276586565567e-11, + "abs_diff_nats": 6.934860721230507e-07, + "rel_diff": 1.9233016518425141e-10, + "rel_diff_scalar_vs_library_pdip": 2.661026020465767e-10, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 1.0620278771966696e-06, + "rel_diff_library_pdip_vmap_vs_scalar": 2.9454087871152034e-10, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": null, + "passes": null, + "pdip_iter": null + }, + { + "lane": 14, + "draw_name": "call00015_lane14", + "draw_kind": "captured", + "offsets": { + "centre_0": 0.007195835212073937, + "centre_1": -0.0022675171274400335, + "ell_comps_0": 0.004220685262914858, + "ell_comps_1": 0.006581974817750368, + "einstein_radius": 0.08589577997501685 + }, + "log_likelihood_vmap": 11126.92147574079, + "log_likelihood_scalar": 11126.921475785763, + "log_likelihood_library_pdip": 11126.92147574079, + "log_likelihood_library_pdip_scalar": 11126.921475785763, + "rel_diff_vmap_vs_library_pdip": 0.0, + "rel_diff_scalar_vs_library_pdip_scalar": 0.0, + "abs_diff_nats": 4.4972694013267756e-08, + "rel_diff": 4.041791263750414e-12, + "rel_diff_scalar_vs_library_pdip": 4.04179126376675e-12, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 4.4972694013267756e-08, + "rel_diff_library_pdip_vmap_vs_scalar": 4.041791263750414e-12, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": null, + "passes": null, + "pdip_iter": null + }, + { + "lane": 15, + "draw_name": "call00015_lane15", + "draw_kind": "captured", + "offsets": { + "centre_0": 0.0024446743118905125, + "centre_1": 0.0028324231769206983, + "ell_comps_0": -0.017159158004659933, + "ell_comps_1": 0.008265799441903459, + "einstein_radius": -0.03860302877433641 + }, + "log_likelihood_vmap": 20410.343973734118, + "log_likelihood_scalar": 20410.3439737228, + "log_likelihood_library_pdip": 20410.34397373382, + "log_likelihood_library_pdip_scalar": 20410.343973724375, + "rel_diff_vmap_vs_library_pdip": 1.4615837075819138e-14, + "rel_diff_scalar_vs_library_pdip_scalar": 7.717874943698311e-14, + "abs_diff_nats": 1.1317752068862319e-08, + "rel_diff": 5.545105993036327e-13, + "rel_diff_scalar_vs_library_pdip": 5.398947622275142e-13, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 9.444192983210087e-09, + "rel_diff_library_pdip_vmap_vs_scalar": 4.627160127907809e-13, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": null, + "passes": null, + "pdip_iter": null + }, + { + "lane": 16, + "draw_name": "call00015_lane16", + "draw_kind": "captured", + "offsets": { + "centre_0": 0.00546338030193603, + "centre_1": 0.0029217319844296002, + "ell_comps_0": 0.018887239108742314, + "ell_comps_1": 0.01610145140759906, + "einstein_radius": 0.09308737119031596 + }, + "log_likelihood_vmap": 9734.862241683652, + "log_likelihood_scalar": 9734.862241683608, + "log_likelihood_library_pdip": 9734.862241683906, + "log_likelihood_library_pdip_scalar": 9734.862241680137, + "rel_diff_vmap_vs_library_pdip": 2.615943710081406e-14, + "rel_diff_scalar_vs_library_pdip_scalar": 3.565157570598039e-13, + "abs_diff_nats": 4.3655745685100555e-11, + "rel_diff": 4.484474931568262e-15, + "rel_diff_scalar_vs_library_pdip": 3.0643912032382183e-14, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 3.768946044147015e-09, + "rel_diff_library_pdip_vmap_vs_scalar": 3.8715966909219796e-13, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": null, + "passes": null, + "pdip_iter": null + }, + { + "lane": 17, + "draw_name": "call00015_lane17", + "draw_kind": "captured", + "offsets": { + "centre_0": -0.0033403521024317102, + "centre_1": -0.004078467297591464, + "ell_comps_0": -0.01076606265657356, + "ell_comps_1": 0.014404445881011321, + "einstein_radius": -0.016103243806114165 + }, + "log_likelihood_vmap": 19481.557219621747, + "log_likelihood_scalar": 19481.557217641563, + "log_likelihood_library_pdip": 19481.557219621747, + "log_likelihood_library_pdip_scalar": 19481.557217641563, + "rel_diff_vmap_vs_library_pdip": 0.0, + "rel_diff_scalar_vs_library_pdip_scalar": 0.0, + "abs_diff_nats": 1.980184606509283e-06, + "rel_diff": 1.0164406183691123e-10, + "rel_diff_scalar_vs_library_pdip": 1.0164406182657971e-10, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 1.980184606509283e-06, + "rel_diff_library_pdip_vmap_vs_scalar": 1.0164406183691123e-10, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": null, + "passes": null, + "pdip_iter": null + }, + { + "lane": 18, + "draw_name": "call00015_lane18", + "draw_kind": "captured", + "offsets": { + "centre_0": -0.0036504937209151113, + "centre_1": -0.0003963555596475738, + "ell_comps_0": -0.008227000946306733, + "ell_comps_1": -0.02487475830854786, + "einstein_radius": -0.0327871904693704 + }, + "log_likelihood_vmap": 18812.94686042335, + "log_likelihood_scalar": 18812.946857997056, + "log_likelihood_library_pdip": 18812.94686042335, + "log_likelihood_library_pdip_scalar": 18812.946857997056, + "rel_diff_vmap_vs_library_pdip": 0.0, + "rel_diff_scalar_vs_library_pdip_scalar": 0.0, + "abs_diff_nats": 2.4262953957077116e-06, + "rel_diff": 1.2896944928520519e-10, + "rel_diff_scalar_vs_library_pdip": 1.2896944926857206e-10, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 2.4262953957077116e-06, + "rel_diff_library_pdip_vmap_vs_scalar": 1.2896944928520519e-10, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": null, + "passes": null, + "pdip_iter": null + }, + { + "lane": 19, + "draw_name": "call00015_lane19", + "draw_kind": "captured", + "offsets": { + "centre_0": 0.00840275144875603, + "centre_1": -0.003628185056462521, + "ell_comps_0": 0.005265994929748281, + "ell_comps_1": 0.009958068668923414, + "einstein_radius": -0.06501253116347949 + }, + "log_likelihood_vmap": 16927.63254956939, + "log_likelihood_scalar": 16927.632549568436, + "log_likelihood_library_pdip": 16927.632549569375, + "log_likelihood_library_pdip_scalar": 16927.632549568527, + "rel_diff_vmap_vs_library_pdip": 8.596544842141579e-16, + "rel_diff_scalar_vs_library_pdip_scalar": 5.372840526338756e-15, + "abs_diff_nats": 9.531504474580288e-10, + "rel_diff": 5.630736871603047e-14, + "rel_diff_scalar_vs_library_pdip": 5.5447714231813184e-14, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 8.476490620523691e-10, + "rel_diff_library_pdip_vmap_vs_scalar": 5.0074873705477204e-14, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": null, + "passes": null, + "pdip_iter": null + } + ], + "lane_pins": [ + { + "pin": "lane 0: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 24758.506194309146, + "reference_value": 24758.506194309142, + "rel_diff": 1.469385421939519e-16, + "abs_diff_nats": 3.637978807091713e-12, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 0: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 24758.506194309135, + "reference_value": 24758.50619430913, + "rel_diff": 1.4693854219395194e-16, + "abs_diff_nats": 3.637978807091713e-12, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 0: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 24758.506194309146, + "reference_value": 24758.506194309135, + "rel_diff": 4.4081562658185577e-16, + "abs_diff_nats": 1.0913936421275139e-11, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 0: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 24758.506194309142, + "reference_value": 24758.50619430913, + "rel_diff": 4.408156265818558e-16, + "abs_diff_nats": 1.0913936421275139e-11, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 1: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 20551.00488777266, + "reference_value": 20551.004887772666, + "rel_diff": 3.540438851490147e-16, + "abs_diff_nats": 7.275957614183426e-12, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 1: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 20551.00488777356, + "reference_value": 20551.00488777308, + "rel_diff": 2.33668964198345e-14, + "abs_diff_nats": 4.802132025361061e-10, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 1: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 20551.00488777266, + "reference_value": 20551.00488777356, + "rel_diff": 4.3901441758475915e-14, + "abs_diff_nats": 9.022187441587448e-10, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 1: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 20551.004887772666, + "reference_value": 20551.00488777308, + "rel_diff": 2.018050145349343e-14, + "abs_diff_nats": 4.147295840084553e-10, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 2: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -189709.9713791528, + "reference_value": -189709.70530157938, + "rel_diff": 1.4025511925612143e-06, + "abs_diff_nats": 0.26607757341116667, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 2: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -189709.05842409882, + "reference_value": -189709.060063124, + "rel_diff": 8.639677877689878e-09, + "abs_diff_nats": 0.0016390251694247127, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 2: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -189709.9713791528, + "reference_value": -189709.05842409882, + "rel_diff": 4.812395683945833e-06, + "abs_diff_nats": 0.9129550539655611, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 2: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -189709.70530157938, + "reference_value": -189709.060063124, + "rel_diff": 3.4012000015722623e-06, + "abs_diff_nats": 0.6452384553849697, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 3: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -141741.9790338971, + "reference_value": -141741.98123707197, + "rel_diff": 1.5543559131228685e-08, + "abs_diff_nats": 0.002203174866735935, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 3: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -141741.96576941968, + "reference_value": -141741.9668731601, + "rel_diff": 7.786969820431048e-09, + "abs_diff_nats": 0.001103740418329835, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 3: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -141741.9790338971, + "reference_value": -141741.96576941968, + "rel_diff": 9.358186445051372e-08, + "abs_diff_nats": 0.013264477427583188, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 3: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -141741.98123707197, + "reference_value": -141741.9668731601, + "rel_diff": 1.0133845460775246e-07, + "abs_diff_nats": 0.014363911875989288, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 4: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 24880.545932988694, + "reference_value": 24880.545932988694, + "rel_diff": 0.0, + "abs_diff_nats": 0.0, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 4: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 24880.54593298874, + "reference_value": 24880.545932988738, + "rel_diff": 1.4621780474150176e-16, + "abs_diff_nats": 3.637978807091713e-12, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 4: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 24880.545932988694, + "reference_value": 24880.54593298874, + "rel_diff": 1.9008314616395227e-15, + "abs_diff_nats": 4.729372449219227e-11, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 4: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 24880.545932988694, + "reference_value": 24880.545932988738, + "rel_diff": 1.754613656898021e-15, + "abs_diff_nats": 4.3655745685100555e-11, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 5: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 25472.519186598707, + "reference_value": 25472.51918660555, + "rel_diff": 2.6864394864163455e-13, + "abs_diff_nats": 6.843038136139512e-09, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 5: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 25472.519186795194, + "reference_value": 25472.519186807505, + "rel_diff": 4.833020320021711e-13, + "abs_diff_nats": 1.2310920283198357e-08, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 5: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 25472.519186598707, + "reference_value": 25472.519186795194, + "rel_diff": 7.713694665617574e-12, + "abs_diff_nats": 1.9648723537102342e-07, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 5: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 25472.51918660555, + "reference_value": 25472.519186807505, + "rel_diff": 7.928352748976514e-12, + "abs_diff_nats": 2.0195511751808226e-07, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 6: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -83383.91630614897, + "reference_value": -83383.91624192083, + "rel_diff": 7.702700998483194e-10, + "abs_diff_nats": 6.422813748940825e-05, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 6: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -83383.91550142097, + "reference_value": -83383.91543133747, + "rel_diff": 8.404917557626939e-10, + "abs_diff_nats": 7.008349348325282e-05, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 6: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -83383.91630614897, + "reference_value": -83383.91550142097, + "rel_diff": 9.650878038914946e-09, + "abs_diff_nats": 0.0008047279989114031, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 6: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -83383.91624192083, + "reference_value": -83383.91543133747, + "rel_diff": 9.72109969545293e-09, + "abs_diff_nats": 0.0008105833549052477, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 7: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -11960.284433087865, + "reference_value": -11960.284433124725, + "rel_diff": 3.0818666127510523e-12, + "abs_diff_nats": 3.6860001273453236e-08, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 7: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -11960.284429855652, + "reference_value": -11960.284429733794, + "rel_diff": 1.0188531789377876e-11, + "abs_diff_nats": 1.2185773812234402e-07, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 7: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -11960.284433087865, + "reference_value": -11960.284429855652, + "rel_diff": 2.702455131247193e-10, + "abs_diff_nats": 3.2322132028639317e-06, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 7: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -11960.284433124725, + "reference_value": -11960.284429733794, + "rel_diff": 2.835159115304754e-10, + "abs_diff_nats": 3.390930942259729e-06, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 8: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 23223.550391413824, + "reference_value": 23223.550391418405, + "rel_diff": 1.9722287251224745e-13, + "abs_diff_nats": 4.580215318128467e-09, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 8: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 23223.55039149861, + "reference_value": 23223.55039149858, + "rel_diff": 1.409853735189912e-15, + "abs_diff_nats": 3.2741809263825417e-11, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 8: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 23223.550391413824, + "reference_value": 23223.55039149861, + "rel_diff": 3.650894572481783e-12, + "abs_diff_nats": 8.478673407807946e-08, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 8: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 23223.550391418405, + "reference_value": 23223.55039149858, + "rel_diff": 3.4522618462350316e-12, + "abs_diff_nats": 8.017377695068717e-08, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 9: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": NaN, + "reference_value": -177118.70764270367, + "rel_diff": NaN, + "abs_diff_nats": NaN, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 9: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -177117.6541844139, + "reference_value": -177117.7614297063, + "rel_diff": 6.055027543960367e-07, + "abs_diff_nats": 0.10724529239814728, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 9: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": NaN, + "reference_value": -177117.6541844139, + "rel_diff": NaN, + "abs_diff_nats": NaN, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 9: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -177118.70764270367, + "reference_value": -177117.7614297063, + "rel_diff": 5.342281822732562e-06, + "abs_diff_nats": 0.9462129973690026, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 10: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -101745.38558917546, + "reference_value": -101745.38578021828, + "rel_diff": 1.8776557722626077e-09, + "abs_diff_nats": 0.0001910428109113127, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 10: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -101745.38333517434, + "reference_value": -101745.3833970182, + "rel_diff": 6.078296854568999e-10, + "abs_diff_nats": 6.184386438690126e-05, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 10: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -101745.38558917546, + "reference_value": -101745.38333517434, + "rel_diff": 2.2153350382810392e-08, + "abs_diff_nats": 0.0022540011268574744, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 10: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -101745.38578021828, + "reference_value": -101745.3833970182, + "rel_diff": 2.34231765001313e-08, + "abs_diff_nats": 0.002383200073381886, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 11: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 18957.528349914093, + "reference_value": 18957.52834991384, + "rel_diff": 1.3433107512540121e-14, + "abs_diff_nats": 2.546585164964199e-10, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 11: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 18957.52834977374, + "reference_value": 18957.52834977224, + "rel_diff": 7.906343278868383e-14, + "abs_diff_nats": 1.4988472685217857e-09, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 11: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 18957.528349914093, + "reference_value": 18957.52834977374, + "rel_diff": 7.403561254823254e-12, + "abs_diff_nats": 1.4035322237759829e-07, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 11: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 18957.52834991384, + "reference_value": 18957.52834977224, + "rel_diff": 7.469191580099882e-12, + "abs_diff_nats": 1.4159741112962365e-07, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 12: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 24810.049660194898, + "reference_value": 24810.049660194898, + "rel_diff": 0.0, + "abs_diff_nats": 0.0, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 12: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 24810.049660194898, + "reference_value": 24810.049660194905, + "rel_diff": 2.93266547783535e-16, + "abs_diff_nats": 7.275957614183426e-12, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 12: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 24810.049660194898, + "reference_value": 24810.049660194898, + "rel_diff": 0.0, + "abs_diff_nats": 0.0, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 12: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 24810.049660194898, + "reference_value": 24810.049660194905, + "rel_diff": 2.93266547783535e-16, + "abs_diff_nats": 7.275957614183426e-12, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 13: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -3605.7062166617106, + "reference_value": -3605.7062169277124, + "rel_diff": 7.377243691350484e-11, + "abs_diff_nats": 2.6600173441693187e-07, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 13: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -3605.7062159682246, + "reference_value": -3605.7062158656845, + "rel_diff": 2.8438276586565567e-11, + "abs_diff_nats": 1.0254007065668702e-07, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 13: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -3605.7062166617106, + "reference_value": -3605.7062159682246, + "rel_diff": 1.9233016518425141e-10, + "abs_diff_nats": 6.934860721230507e-07, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 13: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -3605.7062169277124, + "reference_value": -3605.7062158656845, + "rel_diff": 2.9454087871152034e-10, + "abs_diff_nats": 1.0620278771966696e-06, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 14: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 11126.92147574079, + "reference_value": 11126.92147574079, + "rel_diff": 0.0, + "abs_diff_nats": 0.0, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 14: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 11126.921475785763, + "reference_value": 11126.921475785763, + "rel_diff": 0.0, + "abs_diff_nats": 0.0, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 14: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 11126.92147574079, + "reference_value": 11126.921475785763, + "rel_diff": 4.041791263750414e-12, + "abs_diff_nats": 4.4972694013267756e-08, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 14: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 11126.92147574079, + "reference_value": 11126.921475785763, + "rel_diff": 4.041791263750414e-12, + "abs_diff_nats": 4.4972694013267756e-08, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 15: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 20410.343973734118, + "reference_value": 20410.34397373382, + "rel_diff": 1.4615837075819138e-14, + "abs_diff_nats": 2.9831426218152046e-10, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 15: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 20410.3439737228, + "reference_value": 20410.343973724375, + "rel_diff": 7.717874943698311e-14, + "abs_diff_nats": 1.5752448234707117e-09, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 15: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 20410.343973734118, + "reference_value": 20410.3439737228, + "rel_diff": 5.545105993036327e-13, + "abs_diff_nats": 1.1317752068862319e-08, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 15: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 20410.34397373382, + "reference_value": 20410.343973724375, + "rel_diff": 4.627160127907809e-13, + "abs_diff_nats": 9.444192983210087e-09, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 16: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 9734.862241683652, + "reference_value": 9734.862241683906, + "rel_diff": 2.615943710081406e-14, + "abs_diff_nats": 2.546585164964199e-10, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 16: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 9734.862241683608, + "reference_value": 9734.862241680137, + "rel_diff": 3.565157570598039e-13, + "abs_diff_nats": 3.470631781965494e-09, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 16: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 9734.862241683652, + "reference_value": 9734.862241683608, + "rel_diff": 4.484474931568262e-15, + "abs_diff_nats": 4.3655745685100555e-11, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 16: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 9734.862241683906, + "reference_value": 9734.862241680137, + "rel_diff": 3.8715966909219796e-13, + "abs_diff_nats": 3.768946044147015e-09, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 17: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 19481.557219621747, + "reference_value": 19481.557219621747, + "rel_diff": 0.0, + "abs_diff_nats": 0.0, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 17: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 19481.557217641563, + "reference_value": 19481.557217641563, + "rel_diff": 0.0, + "abs_diff_nats": 0.0, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 17: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 19481.557219621747, + "reference_value": 19481.557217641563, + "rel_diff": 1.0164406183691123e-10, + "abs_diff_nats": 1.980184606509283e-06, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 17: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 19481.557219621747, + "reference_value": 19481.557217641563, + "rel_diff": 1.0164406183691123e-10, + "abs_diff_nats": 1.980184606509283e-06, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 18: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 18812.94686042335, + "reference_value": 18812.94686042335, + "rel_diff": 0.0, + "abs_diff_nats": 0.0, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 18: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 18812.946857997056, + "reference_value": 18812.946857997056, + "rel_diff": 0.0, + "abs_diff_nats": 0.0, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 18: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 18812.94686042335, + "reference_value": 18812.946857997056, + "rel_diff": 1.2896944928520519e-10, + "abs_diff_nats": 2.4262953957077116e-06, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 18: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 18812.94686042335, + "reference_value": 18812.946857997056, + "rel_diff": 1.2896944928520519e-10, + "abs_diff_nats": 2.4262953957077116e-06, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 19: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 16927.63254956939, + "reference_value": 16927.632549569375, + "rel_diff": 8.596544842141579e-16, + "abs_diff_nats": 1.4551915228366852e-11, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 19: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 16927.632549568436, + "reference_value": 16927.632549568527, + "rel_diff": 5.372840526338756e-15, + "abs_diff_nats": 9.094947017729282e-11, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 19: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 16927.63254956939, + "reference_value": 16927.632549568436, + "rel_diff": 5.630736871603047e-14, + "abs_diff_nats": 9.531504474580288e-10, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 19: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 16927.632549569375, + "reference_value": 16927.632549568527, + "rel_diff": 5.0074873705477204e-14, + "abs_diff_nats": 8.476490620523691e-10, + "within_rtol": true, + "status": "RECORDED" + } + ], + "lanes_failed": 4, + "arm_rows": { + "vmap": { + "arm": "vmap", + "program": "jax.jit(jax.vmap(fn))", + "stands_for": "Nautilus(use_jax_vmap=True) \u2014 Fitness._vmap", + "hlo_source": "jax.jit(jax.vmap(fn)).lower(batched_tree) \u2014 the exact current Fitness._vmap composition (PyAutoFit#1638)", + "batch_wall_ms": 860.2807180999662, + "wall_production_nesting_ms": 860.2807180999662, + "wall_aot_command_buffers_on_ms": 859.7858360997634, + "wall_aot_command_buffers_off_ms": 861.0063706997607, + "command_buffer_delta_ms": 1.220534599997336, + "production_nesting_vs_aot_on_delta_ms": 0.4948820002027787, + "production_nesting_vs_aot_on_delta_pct": 0.05755875235718074, + "wall_per_lane_ms": 43.01403590499831, + "wall_per_lane_command_buffers_off_ms": 43.05031853498804, + "traced_batch_wall_ms": 874.5379600000888, + "untraced_batch_wall_ms": 861.7021375001059, + "traced_wall_per_lane_ms": 43.72689800000444, + "callback_count_per_call": 20.0, + "callback_count_per_lane": 1.0, + "callback_expectation": "B per batched call \u2014 the qhull pure_callback is vmap_method='sequential'", + "host_qhull_ms": 89.25898770030471, + "host_tables_ms": 2.283171498493175, + "host_qhull_ms_per_lane": 4.462949385015236, + "host_tables_ms_per_lane": 0.11415857492465875, + "host_callback_probe": { + "calls": 200, + "qhull_ms_total": 892.5898770030471, + "tables_ms_total": 22.83171498493175, + "total_ms_total": 915.4215919879789, + "qhull_ms_mean": 4.462949385015236, + "tables_ms_mean": 0.11415857492465875, + "total_ms_mean": 4.5771079599398945, + "non_finite_calls": 0, + "n_points": [ + 1500 + ] + }, + "host_callback_records_first": [ + { + "n_points": 1500, + "qhull_ms": 4.688020999310538, + "tables_ms": 0.1740180014166981, + "total_ms": 4.862039000727236, + "finite": true + }, + { + "n_points": 1500, + "qhull_ms": 4.441242999746464, + "tables_ms": 0.10936900071101263, + "total_ms": 4.550612000457477, + "finite": true + }, + { + "n_points": 1500, + "qhull_ms": 4.439071999513544, + "tables_ms": 0.10838000162038952, + "total_ms": 4.547452001133934, + "finite": true + }, + { + "n_points": 1500, + "qhull_ms": 4.512621999310795, + "tables_ms": 0.10914100130321458, + "total_ms": 4.62176300061401, + "finite": true + } + ], + "device_idle_ms": 126.61401669999998, + "device_idle_ms_per_lane": 6.330700834999999, + "trace": { + "parser": "ProfileData.from_file(xplane) + as_text() + stack_frame_index(proto field 17)", + "stage_audit": { + "chi_squared_evidence": [ + { + "instruction": "loop_divide_fusion", + "ms": 0.005107199999999999, + "opcode": "fusion", + "shape": "f64[15361,20]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/abstract_ndarray.py:352", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/abstract_ndarray.py:352 (AbstractNDArray.__truediv__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/abstract_ndarray.py:57 (unwrap_array..wrapper)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/abstract_ndarray.py:35 (to_new_array..wrapper)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_util.py:78 (chi_squared_map_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:78 (AbstractFit.chi_squared_map)" + ] + }, + { + "instruction": "input_reduce_fusion.42", + "ms": 0.003955200000000001, + "opcode": "fusion", + "shape": "f64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_util.py:104", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_util.py:104 (noise_normalization_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:98 (AbstractFit.noise_normalization)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:306 (FitDataset.noise_normalization)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:349 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)" + ] + }, + { + "instruction": "input_reduce_fusion.16", + "ms": 0.0035072000000000002, + "opcode": "fusion", + "shape": "f64[92,20]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_util.py:90", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_util.py:90 (chi_squared_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:87 (AbstractFit.chi_squared)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:293 (FitDataset.chi_squared)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:345 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)" + ] + }, + { + "instruction": "input_reduce_fusion.44", + "ms": 0.0021664, + "opcode": "fusion", + "shape": "f64[20]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_util.py:90", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_util.py:90 (chi_squared_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:87 (AbstractFit.chi_squared)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:293 (FitDataset.chi_squared)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:345 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)" + ] + } + ], + "psf_convolution_mapping_matrix": [ + { + "instruction": "input_scatter_fusion", + "ms": 40.255740200000005, + "opcode": "fusion", + "shape": "f64[20,1500,180,180]{3,2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "fft.29.0", + "ms": 35.26522589999999, + "opcode": "fft", + "shape": "f64[20,1500,180,180]{3,2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "fft.25.0", + "ms": 26.872518, + "opcode": "fft", + "shape": "c128[20,1500,180,91]{3,2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "fft.27.0", + "ms": 19.394286, + "opcode": "fft", + "shape": "c128[20,1500,91,180]{3,2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "input_transpose_fusion.2", + "ms": 10.5452666, + "opcode": "fusion", + "shape": "c128[20,1500,91,180]{3,2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "wrapped_transpose", + "ms": 9.8953514, + "opcode": "fusion", + "shape": "c128[20,1500,180,91]{3,2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + } + ], + "mapping_matrix": [ + { + "instruction": "loop_broadcast_fusion.7", + "ms": 2.1304465999999995, + "opcode": "fusion", + "shape": "f64[15361,20,1500]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:353", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:353 (mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/abstract.py:283 (Mapper.mapping_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:91 (AbstractInversionImaging._mapping_matrix_for_convolution_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:137 (AbstractInversionImaging.operated_mapping_matrix_list)" + ] + }, + { + "instruction": "input_scatter_fusion.3", + "ms": 0.0576963, + "opcode": "fusion", + "shape": "f64[20,1500]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:71", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:71 (adaptive_pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/abstract.py:507 (Mapper.pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt.py:339 (Adapt.regularization_weights_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt_split.py:120 (AdaptSplit.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)" + ] + }, + { + "instruction": "input_reduce_fusion.45", + "ms": 0.0037568000000000002, + "opcode": "fusion", + "shape": "f64[20]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:93", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:93 (adaptive_pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/abstract.py:507 (Mapper.pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt.py:339 (Adapt.regularization_weights_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt_split.py:120 (AdaptSplit.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)" + ] + }, + { + "instruction": "loop_divide_fusion.1", + "ms": 0.0031488, + "opcode": "fusion", + "shape": "f64[20,1500]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:92", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:92 (adaptive_pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/abstract.py:507 (Mapper.pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt.py:339 (Adapt.regularization_weights_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt_split.py:120 (AdaptSplit.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)" + ] + } + ], + "other": [ + { + "instruction": "copy.105", + "ms": 0.04816039999999986, + "opcode": "copy", + "shape": "f64[1,20,1024,2]{3,2,1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "copy.107", + "ms": 0.04019840000000011, + "opcode": "copy", + "shape": "s32[1,3000,3]{2,1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "copy.108", + "ms": 0.03985300000000014, + "opcode": "copy", + "shape": "s32[1,3000,3]{2,1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "copy.109", + "ms": 0.03983050000000011, + "opcode": "copy", + "shape": "f64[1,1500,2]{2,1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "copy.106", + "ms": 0.039318400000000024, + "opcode": "copy", + "shape": "s32[1,1500]{1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "loop_broadcast_fusion.6", + "ms": 0.0034624000000000005, + "opcode": "fusion", + "shape": "(pred[20,21361]{1,0}, pred[20,21361]{1,0})", + "source": "", + "stack": [] + } + ], + "mesh_qhull_callback": [ + { + "instruction": "pure_callback.0", + "ms": 0.21496360000000034, + "opcode": "custom-call", + "shape": "(s32[3000,3]{1,0}, s32[3000,3]{1,0}, s32[1500]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:161", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:161 (_jax_delaunay_tables)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:405 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + }, + { + "instruction": "loop_add_fusion.1", + "ms": 0.030284799999999893, + "opcode": "fusion", + "shape": "s64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:161", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:161 (_jax_delaunay_tables)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:405 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + }, + { + "instruction": "loop_broadcast_fusion.3", + "ms": 0.0020127999999999995, + "opcode": "fusion", + "shape": "s32[20,1500]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:161", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:161 (_jax_delaunay_tables)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:405 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + } + ], + "mixed_fusion": [ + { + "instruction": "loop_divide_gather_fusion", + "ms": 21.386163000000003, + "opcode": "fusion", + "shape": "(f64[15361,20,1,1,1500]{4,3,2,1,0}, f64[15361,20,1,1,1500]{4,3,2,1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:133", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:133 (curvature_matrix_via_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:93 (InversionImagingMapping.curvature_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:389 (AbstractInversion.curvature_reg_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "input_add_multiply_transpose_fusion", + "ms": 1.9976687000000002, + "opcode": "fusion", + "shape": "(f64[20,1500,1500]{2,1,0}, f64[20,1500,1500]{2,1,0}, f64[20,1500,1500]{2,1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:61", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:61 (initialize)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:72 (solve_nnls)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:129 (_solve_nnls_primal_with..primal)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:164 (solve_nnls_primal_with_status)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:508 (reconstruction_positive_only_from)" + ] + }, + { + "instruction": "input_transpose_fusion.3", + "ms": 0.5446319, + "opcode": "fusion", + "shape": "f64[20,1500,1500]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986 (AbstractInversion._log_det_symmetric_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:1157 (AbstractInversion.log_det_regularization_matrix_term)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:348 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/model/analysis.py:135 (AnalysisImaging.log_likelihood_function)" + ] + }, + { + "instruction": "input_scatter_fusion.1", + "ms": 0.1771909, + "opcode": "fusion", + "shape": "f64[20,1500,1500]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:579", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:579 (pixel_splitted_regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt_split.py:137 (AdaptSplit.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:332 (AbstractInversion.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "input_scatter_fusion.6", + "ms": 0.0780739, + "opcode": "fusion", + "shape": "f64[15361,20,1500]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:353", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:353 (mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/abstract.py:283 (Mapper.mapping_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:91 (AbstractInversionImaging._mapping_matrix_for_convolution_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:137 (AbstractInversionImaging.operated_mapping_matrix_list)" + ] + }, + { + "instruction": "input_scatter_fusion.2", + "ms": 0.0721697, + "opcode": "fusion", + "shape": "f64[20,1500]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:70", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:70 (adaptive_pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/abstract.py:507 (Mapper.pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt.py:339 (Adapt.regularization_weights_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt_split.py:120 (AdaptSplit.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)" + ] + } + ], + "ray_trace_data_grid": [ + { + "instruction": "input_reduce_fusion.29", + "ms": 0.0027648000000000004, + "opcode": "fusion", + "shape": "f64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:506", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:506 (FlatLambdaCDM._simpson_1d)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:644 (FlatLambdaCDM.angular_diameter_distance_kpc_z1z2)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:151 (LensingCosmology.angular_diameter_distance_between_redshifts_in_kpc_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:355 (LensingCosmology.scaling_factor_between_redshifts_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/lens/tracer_util.py:252 (traced_grid_2d_list_from)" + ] + }, + { + "instruction": "input_reduce_fusion.27", + "ms": 0.0027424000000000003, + "opcode": "fusion", + "shape": "f64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:506", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:506 (FlatLambdaCDM._simpson_1d)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:644 (FlatLambdaCDM.angular_diameter_distance_kpc_z1z2)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:133 (LensingCosmology.angular_diameter_distance_to_earth_in_kpc_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:362 (LensingCosmology.scaling_factor_between_redshifts_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/lens/tracer_util.py:252 (traced_grid_2d_list_from)" + ] + }, + { + "instruction": "input_reduce_fusion.28", + "ms": 0.0025760000000000006, + "opcode": "fusion", + "shape": "f64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:503", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:503 (FlatLambdaCDM._simpson_1d)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:644 (FlatLambdaCDM.angular_diameter_distance_kpc_z1z2)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:133 (LensingCosmology.angular_diameter_distance_to_earth_in_kpc_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:362 (LensingCosmology.scaling_factor_between_redshifts_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/lens/tracer_util.py:252 (traced_grid_2d_list_from)" + ] + }, + { + "instruction": "input_reduce_fusion.30", + "ms": 0.0025472000000000008, + "opcode": "fusion", + "shape": "f64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:503", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:503 (FlatLambdaCDM._simpson_1d)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:644 (FlatLambdaCDM.angular_diameter_distance_kpc_z1z2)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:151 (LensingCosmology.angular_diameter_distance_between_redshifts_in_kpc_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:355 (LensingCosmology.scaling_factor_between_redshifts_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/lens/tracer_util.py:252 (traced_grid_2d_list_from)" + ] + }, + { + "instruction": "loop_divide_fusion.2", + "ms": 0.0024928, + "opcode": "fusion", + "shape": "f64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:380", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:380 (LensingCosmology.scaling_factor_between_redshifts_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/lens/tracer_util.py:252 (traced_grid_2d_list_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/lens/tracer.py:632 (Tracer.traced_grid_2d_list_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/structures/decorators/abstract.py:93 (AbstractMaker.evaluate_func)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/structures/decorators/abstract.py:110 (AbstractMaker.result)" + ] + } + ], + "border_relocator": [ + { + "instruction": "custom-call.2", + "ms": 0.042156900000000004, + "opcode": "custom-call", + "shape": "(f64[20,2,2]{2,1,0}, s8[4194304]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:242", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:242 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:454 (BorderRelocator.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:176 (AbstractMesh.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:214 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "loop_add_rsqrt_fusion", + "ms": 0.015168100000000002, + "opcode": "fusion", + "shape": "(f64[20,15361]{1,0}, f64[20,15361]{1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:311", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:311 (relocated_grid_via_ellipse_border_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:423 (BorderRelocator.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:83 (AbstractMesh.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:208 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "eigh.34", + "ms": 0.014604799999999998, + "opcode": "custom-call", + "shape": "(f64[20,2,2]{1,2,0}, f64[20,2]{1,0}, s32[20]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:245", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:245 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:454 (BorderRelocator.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:176 (AbstractMesh.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:214 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "input_concatenate_fusion.7", + "ms": 0.009929499999999999, + "opcode": "fusion", + "shape": "f64[20,15361,2]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:323", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:323 (relocated_grid_via_ellipse_border_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:423 (BorderRelocator.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:83 (AbstractMesh.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:208 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "loop_add_fusion.4", + "ms": 0.0039521, + "opcode": "fusion", + "shape": "f64[20,1500]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:308", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:308 (relocated_grid_via_ellipse_border_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:458 (BorderRelocator.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:176 (AbstractMesh.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:214 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "input_concatenate_fusion.9", + "ms": 0.0039104, + "opcode": "fusion", + "shape": "f64[20,1500,2]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:323", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:323 (relocated_grid_via_ellipse_border_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:458 (BorderRelocator.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:176 (AbstractMesh.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:214 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + } + ], + "mesh_construction": [ + { + "instruction": "loop_compare_fusion.4", + "ms": 0.004796799999999999, + "opcode": "fusion", + "shape": "pred[20,6000,3]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:736", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:736 (DelaunayInterface.splitted_sizes)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:997 (InterpolatorDelaunay._mappings_sizes_weights_split)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt_split.py:124 (AdaptSplit.regularization_matrix_from)" + ] + }, + { + "instruction": "loop_transpose_fusion.1", + "ms": 0.0025024, + "opcode": "fusion", + "shape": "f64[20,1500,2]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:820", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:820 (InterpolatorDelaunay.mesh_grid_xy)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:847 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + }, + { + "instruction": "loop_multiply_fusion.4", + "ms": 0.0024064000000000004, + "opcode": "fusion", + "shape": "f64[20,1500]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:412", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:412 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "mesh_seed_argmin": [ + { + "instruction": "input_reduce_fusion", + "ms": 1.6113093999999986, + "opcode": "fusion", + "shape": "(f64[20,1024]{1,0}, s64[20,1024]{1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:191", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:191 (_nearest_vertex_seed_from..argmin_chunk)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204 (_nearest_vertex_seed_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:351 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)" + ] + }, + { + "instruction": "loop_dynamic_update_slice_fusion", + "ms": 0.04755209999999993, + "opcode": "fusion", + "shape": "s32[21,20,1024]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204 (_nearest_vertex_seed_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:351 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "loop_add_fusion", + "ms": 0.031497599999999897, + "opcode": "fusion", + "shape": "s64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204 (_nearest_vertex_seed_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:351 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "loop_broadcast_fusion.4", + "ms": 0.0026912, + "opcode": "fusion", + "shape": "s32[21,20,1024]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204 (_nearest_vertex_seed_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:351 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "mesh_dual_areas": [ + { + "instruction": "input_scatter_fusion.9", + "ms": 0.0032704000000000006, + "opcode": "fusion", + "shape": "f64[20,1500]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:393", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:393 (_dual_areas_padded_jnp)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:408 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + }, + { + "instruction": "input_scatter_fusion.7", + "ms": 0.0032448000000000004, + "opcode": "fusion", + "shape": "f64[20,1500]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:393", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:393 (_dual_areas_padded_jnp)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:408 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + } + ], + "mesh_locate_walk": [ + { + "instruction": "loop_slice_subtract_fusion", + "ms": 0.36520679999999994, + "opcode": "fusion", + "shape": "(f64[20,21361,1]{2,1,0}, f64[20,21361,1]{2,1,0}, f64[20,21361,1]{2,1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:236", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:236 (_walk_from_seed..cross)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:250 (_walk_from_seed..weights_of)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:262 (_walk_from_seed..walk_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:292 (_walk_from_seed..body)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)" + ] + }, + { + "instruction": "loop_reduce_fusion", + "ms": 0.1510532, + "opcode": "fusion", + "shape": "(f64[20,21361]{1,0}, s64[20,21361]{1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:264", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:264 (_walk_from_seed..walk_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:292 (_walk_from_seed..body)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:264 (_walk_from_seed..walk_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:292 (_walk_from_seed..body)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)" + ] + }, + { + "instruction": "loop_select_fusion", + "ms": 0.12782750000000004, + "opcode": "fusion", + "shape": "(pred[20,21361]{1,0}, pred[20,21361]{1,0}, s32[20,21361]{1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:353 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "loop_gather_fusion.1", + "ms": 0.08276500000000005, + "opcode": "fusion", + "shape": "s32[427220,1,1,3]{3,2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:239", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:239 (_walk_from_seed..weights_of)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:262 (_walk_from_seed..walk_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:292 (_walk_from_seed..body)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:353 (pix_indexes_delaunay_walk_from)" + ] + }, + { + "instruction": "loop_gather_fusion", + "ms": 0.06227250000000001, + "opcode": "fusion", + "shape": "s32[427220,1,1,1]{3,2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:267", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:267 (_walk_from_seed..walk_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:292 (_walk_from_seed..body)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:353 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)" + ] + }, + { + "instruction": "input_concatenate_fusion.1", + "ms": 0.04550440000000001, + "opcode": "fusion", + "shape": "s32[20,21361,2]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:244", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:244 (_walk_from_seed..weights_of)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:262 (_walk_from_seed..walk_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:292 (_walk_from_seed..body)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:353 (pix_indexes_delaunay_walk_from)" + ] + } + ], + "regularization_H": [ + { + "instruction": "loop_broadcast_fusion", + "ms": 0.3577576, + "opcode": "fusion", + "shape": "f64[20,1500,1500]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:579", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:579 (pixel_splitted_regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt_split.py:137 (AdaptSplit.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:332 (AbstractInversion.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "input_scatter_fusion.10", + "ms": 0.0035776000000000002, + "opcode": "fusion", + "shape": "f64[20,1500,1500]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:615", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:615 (pixel_splitted_regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt_split.py:137 (AdaptSplit.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:332 (AbstractInversion.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "curvature_matrix_F": [ + { + "instruction": "cublas-lt-matmul.2", + "ms": 81.6426088, + "opcode": "custom-call", + "shape": "(f64[20,1500,1500]{2,1,0}, s8[4194304]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:134", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:134 (curvature_matrix_via_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:93 (InversionImagingMapping.curvature_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:389 (AbstractInversion.curvature_reg_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "inversion_other": [ + { + "instruction": "cholesky.60", + "ms": 7.856779799999939, + "opcode": "custom-call", + "shape": "(f64[20,1500,1500]{1,2,0}, s32[20]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986 (AbstractInversion._log_det_symmetric_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:1078 (AbstractInversion.log_det_curvature_reg_matrix_term)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:347 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/model/analysis.py:135 (AnalysisImaging.log_likelihood_function)" + ] + }, + { + "instruction": "cholesky.70", + "ms": 7.794712899999928, + "opcode": "custom-call", + "shape": "(f64[20,1500,1500]{1,2,0}, s32[20]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986 (AbstractInversion._log_det_symmetric_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:1157 (AbstractInversion.log_det_regularization_matrix_term)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:348 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/model/analysis.py:135 (AnalysisImaging.log_likelihood_function)" + ] + }, + { + "instruction": "input_reduce_fusion.25", + "ms": 0.21310460000000003, + "opcode": "fusion", + "shape": "f64[20,1500]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:946", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:946 (AbstractInversion.regularization_term)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:346 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/model/analysis.py:135 (AnalysisImaging.log_likelihood_function)", + "/mnt/ral/jnightin/autolens_profiling_wt/certified-solver-phase-c1-lane-rate/scripts/imaging/likelihood_breakdown/fixed_light_trace.py:1195 (_captured_likelihood_fn.._likelihood)" + ] + }, + { + "instruction": "input_reduce_fusion.20", + "ms": 0.005599999999999999, + "opcode": "fusion", + "shape": "f64[20]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:985", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:985 (AbstractInversion._log_det_symmetric_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:1078 (AbstractInversion.log_det_curvature_reg_matrix_term)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:347 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/model/analysis.py:135 (AnalysisImaging.log_likelihood_function)" + ] + }, + { + "instruction": "input_reduce_fusion.19", + "ms": 0.0055072, + "opcode": "fusion", + "shape": "f64[20]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:985", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:985 (AbstractInversion._log_det_symmetric_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:1157 (AbstractInversion.log_det_regularization_matrix_term)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:348 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/model/analysis.py:135 (AnalysisImaging.log_likelihood_function)" + ] + }, + { + "instruction": "input_reduce_fusion.41", + "ms": 0.0053504, + "opcode": "fusion", + "shape": "f64[20]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:944", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:944 (AbstractInversion.regularization_term)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:346 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/model/analysis.py:135 (AnalysisImaging.log_likelihood_function)", + "/mnt/ral/jnightin/autolens_profiling_wt/certified-solver-phase-c1-lane-rate/scripts/imaging/likelihood_breakdown/fixed_light_trace.py:1195 (_captured_likelihood_fn.._likelihood)" + ] + } + ], + "pdip_solve": [ + { + "instruction": "cholesky.20", + "ms": 214.2975830999601, + "opcode": "custom-call", + "shape": "(f64[20,1500,1500]{1,2,0}, s32[20]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:106", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:106 (factorize_kkt)", + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:212 (pdip_pc_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:83 (solve_nnls)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:129 (_solve_nnls_primal_with..primal)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:164 (solve_nnls_primal_with_status)" + ] + }, + { + "instruction": "triangular-solve", + "ms": 55.00485000000313, + "opcode": "custom-call", + "shape": "(f64[20,1500,1]{1,2,0}, s8[320]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146 (solve_kkt_rhs)", + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:213 (pdip_pc_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:83 (solve_nnls)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:129 (_solve_nnls_primal_with..primal)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:164 (solve_nnls_primal_with_status)" + ] + }, + { + "instruction": "triangular-solve.2", + "ms": 51.31713090000183, + "opcode": "custom-call", + "shape": "(f64[20,1500,1]{1,2,0}, s8[320]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146 (solve_kkt_rhs)", + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:217 (pdip_pc_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:83 (solve_nnls)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:129 (_solve_nnls_primal_with..primal)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:164 (solve_nnls_primal_with_status)" + ] + }, + { + "instruction": "triangular-solve.3", + "ms": 49.98408970000196, + "opcode": "custom-call", + "shape": "(f64[20,1500,1]{1,2,0}, s8[320]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146 (solve_kkt_rhs)", + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:217 (pdip_pc_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:83 (solve_nnls)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:129 (_solve_nnls_primal_with..primal)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:164 (solve_nnls_primal_with_status)" + ] + }, + { + "instruction": "triangular-solve.1", + "ms": 49.95325070000221, + "opcode": "custom-call", + "shape": "(f64[20,1500,1]{1,2,0}, s8[320]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146 (solve_kkt_rhs)", + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:213 (pdip_pc_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:83 (solve_nnls)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:129 (_solve_nnls_primal_with..primal)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:164 (solve_nnls_primal_with_status)" + ] + }, + { + "instruction": "input_transpose_fusion", + "ms": 13.584215600000006, + "opcode": "fusion", + "shape": "f64[20,1500,1500]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:106", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:106 (factorize_kkt)", + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:212 (pdip_pc_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:83 (solve_nnls)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:129 (_solve_nnls_primal_with..primal)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:164 (solve_nnls_primal_with_status)" + ] + } + ], + "data_vector_D": [ + { + "instruction": "input_reduce_fusion.17", + "ms": 2.6289981, + "opcode": "fusion", + "shape": "f64[92,20,1500]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/inversion_imaging_util.py:123", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/inversion_imaging_util.py:123 (data_vector_via_blurred_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:67 (InversionImagingMapping.data_vector)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:699 (AbstractInversion.reconstruction)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "input_reduce_fusion.43", + "ms": 0.0208513, + "opcode": "fusion", + "shape": "f64[20,1500]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/inversion_imaging_util.py:123", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/inversion_imaging_util.py:123 (data_vector_via_blurred_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:67 (InversionImagingMapping.data_vector)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:699 (AbstractInversion.reconstruction)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "mapped_reconstruction": [ + { + "instruction": "input_reduce_fusion.21", + "ms": 2.1906368000000005, + "opcode": "fusion", + "shape": "f64[15361,20]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:163", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:163 (mapped_reconstructed_data_via_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:120 (InversionImagingMapping._mapped_reconstructed_data_dict_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:196 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + } + ] + }, + "stage_audit_note": "The HLO instructions that contributed most of each stage's milliseconds, with their full source stack. A stage row is only as good as the rules that built it; this is how a reader checks a row against the HLO instead of trusting it.", + "untraced_wall_ms": 861.7021375001059, + "reconciliation_vs_untraced_pct": 1.369145228548512, + "wall_basis": "wall_ms is the TRACED run's wall, the run these kernel durations came from. untraced_wall_ms is the same executable without the profiler; the difference is the profiler's overhead and belongs in neither the stages nor the idle row.", + "calls": 10, + "call_split": "per-call (first-instruction recurrence)", + "call_blocks": 10, + "events": 223360, + "streams": [ + "Stream #14(MemcpyH2D,MemcpyD2D,Compute,MemcpyD2H)" + ], + "per_stage_ms": { + "border_relocator": { + "median_ms": 0.11204899999999998, + "min_ms": 0.111648, + "max_ms": 0.112832 + }, + "chi_squared_evidence": { + "median_ms": 0.014784000000000002, + "min_ms": 0.0144, + "max_ms": 0.015104 + }, + "curvature_matrix_F": { + "median_ms": 81.64039249999999, + "min_ms": 80.682708, + "max_ms": 82.619787 + }, + "data_vector_D": { + "median_ms": 2.646662, + "min_ms": 2.627743, + "max_ms": 2.6833099999999996 + }, + "inversion_other": { + "median_ms": 15.899046000000018, + "min_ms": 15.62062099999996, + "max_ms": 16.167036000000017 + }, + "mapped_reconstruction": { + "median_ms": 2.190389, + "min_ms": 2.185451, + "max_ms": 2.194539 + }, + "mapping_matrix": { + "median_ms": 2.1959565, + "min_ms": 2.1882230000000003, + "max_ms": 2.198988 + }, + "mesh_construction": { + "median_ms": 0.009728, + "min_ms": 0.009503999999999999, + "max_ms": 0.009856 + }, + "mesh_dual_areas": { + "median_ms": 0.006528, + "min_ms": 0.006496, + "max_ms": 0.006528 + }, + "mesh_locate_walk": { + "median_ms": 1.0412659999999998, + "min_ms": 1.0392719999999995, + "max_ms": 1.0442549999999997 + }, + "mesh_qhull_callback": { + "median_ms": 0.24710400000000005, + "min_ms": 0.2460790000000001, + "max_ms": 0.248577 + }, + "mesh_seed_argmin": { + "median_ms": 1.6920950000000006, + "min_ms": 1.6915830000000007, + "max_ms": 1.6974479999999994 + }, + "mixed_fusion": { + "median_ms": 24.4829395, + "min_ms": 24.255803000000004, + "max_ms": 24.889499 + }, + "other": { + "median_ms": 0.22395400000000013, + "min_ms": 0.22355200000000022, + "max_ms": 0.22508900000000004 + }, + "pdip_solve": { + "median_ms": 466.90222299998914, + "min_ms": 466.756562999986, + "max_ms": 471.90234899998467 + }, + "psf_convolution_mapping_matrix": { + "median_ms": 147.20783799999998, + "min_ms": 147.04764400000002, + "max_ms": 147.55634799999999 + }, + "ray_trace_data_grid": { + "median_ms": 0.013104000000000001, + "min_ms": 0.013056000000000002, + "max_ms": 0.013312000000000001 + }, + "regularization_H": { + "median_ms": 0.360016, + "min_ms": 0.359488, + "max_ms": 0.363842 + } + }, + "stage_order": [ + "ray_trace_data_grid", + "border_relocator", + "mesh_qhull_callback", + "mesh_seed_argmin", + "mesh_locate_walk", + "mesh_dual_areas", + "mesh_construction", + "mapping_matrix", + "psf_convolution_mapping_matrix", + "data_vector_D", + "curvature_matrix_F", + "regularization_H", + "pdip_solve", + "mapped_reconstruction", + "chi_squared_evidence", + "inversion_other", + "mixed_fusion", + "other" + ], + "mixed_fusion": { + "ms": 24.4829395, + "constituent_stage_sets": { + "curvature_matrix_F + psf_convolution_mapping_matrix": 21.386163000000003, + "curvature_reg_reduce_gather + inversion_other + mapped_reconstruction + pdip_solve + reconstruction_scatter + regularization_H": 1.9976687000000002, + "inversion_other + regularization_H": 0.7382899999999999, + "inversion_other + mapping_matrix + mesh_construction + mesh_interpolation_weights": 0.0944003, + "mapping_matrix + mesh_interpolation_weights": 0.0721697, + "grids_and_structures + mass_profile_deflections + ray_trace_data_grid": 0.05911689999999999, + "inversion_other + mesh_construction + mesh_dual_areas + mesh_interpolation_weights": 0.026246500000000002, + "inversion_other + mesh_construction + mesh_interpolation_weights": 0.025251299999999997, + "inversion_other + mesh_construction + mesh_dual_areas + mesh_interpolation_weights + regularization_H": 0.024569600000000007, + "mesh_construction + regularization_H": 0.012208000000000002, + "inversion_other + mesh_dual_areas + mesh_locate_walk": 0.012079999999999999, + "mesh_dual_areas + mesh_interpolation_weights": 0.0112032, + "mesh_seed_argmin + regularization_H": 0.010704, + "inversion_other + mapped_reconstruction": 0.0095968, + "inversion_other + mapped_reconstruction + reconstruction_scatter + regularization_H": 0.0093761, + "inversion_other + mapped_reconstruction + reconstruction_scatter": 0.0089569, + "mesh_locate_walk + mesh_seed_argmin": 0.008688000000000001, + "inversion_other + pdip_solve + regularization_H": 0.008365000000000001, + "mesh_dual_areas + mesh_interpolation_weights + regularization_H": 0.0066656, + "inversion_other + ray_trace_data_grid": 0.0046688, + "grids_and_structures + mass_profile_deflections": 0.004419299999999999, + "mapping_matrix + regularization_H": 0.0042944, + "inversion_other + mesh_locate_walk + mesh_seed_argmin": 0.0038688, + "inversion_other + mesh_interpolation_weights": 0.0036960000000000005, + "inversion_other + mesh_construction + mesh_interpolation_weights + regularization_H": 0.0033247999999999993, + "inversion_other + mesh_construction + regularization_H": 0.0028352, + "chi_squared_evidence + inversion_other": 0.0023103999999999998, + "inversion_other + mapping_matrix": 0.0021248 + }, + "example_kernels": { + "curvature_matrix_F + psf_convolution_mapping_matrix": [ + "loop_divide_gather_fusion" + ], + "curvature_reg_reduce_gather + inversion_other + mapped_reconstruction + pdip_solve + reconstruction_scatter + regularization_H": [ + "input_add_multiply_transpose_fusion" + ], + "inversion_other + regularization_H": [ + "input_reduce_fusion.40", + "input_reduce_fusion.33", + "input_reduce_fusion.34", + "input_reduce_fusion.35" + ], + "inversion_other + mapping_matrix + mesh_construction + mesh_interpolation_weights": [ + "loop_compare_fusion.3", + "input_scatter_fusion.6", + "input_concatenate_fusion.3" + ], + "mapping_matrix + mesh_interpolation_weights": [ + "input_scatter_fusion.2" + ], + "grids_and_structures + mass_profile_deflections + ray_trace_data_grid": [ + "loop_sqrt_fusion", + "loop_slice_fusion.3", + "loop_subtract_fusion.2", + "loop_sqrt_fusion.1" + ], + "inversion_other + mesh_construction + mesh_dual_areas + mesh_interpolation_weights": [ + "loop_abs_add_fusion" + ], + "inversion_other + mesh_construction + mesh_interpolation_weights": [ + "loop_slice_fusion.1", + "loop_slice_fusion" + ], + "inversion_other + mesh_construction + mesh_dual_areas + mesh_interpolation_weights + regularization_H": [ + "loop_abs_fusion", + "loop_convert_select_fusion" + ], + "mesh_construction + regularization_H": [ + "input_concatenate_fusion.4" + ] + }, + "prorated_estimate_ms": { + "curvature_matrix_F": 10.693081500000002, + "psf_convolution_mapping_matrix": 10.693081500000002, + "inversion_other": 0.7719914283333335, + "regularization_H": 0.729737395, + "mapped_reconstruction": 0.34307284166666674, + "reconstruction_scatter": 0.33827444166666676, + "pdip_solve": 0.3357331166666667, + "curvature_reg_reduce_gather": 0.3329447833333334, + "mesh_interpolation_weights": 0.09008023666666667, + "mapping_matrix": 0.062894525, + "mesh_construction": 0.05137298666666667, + "mesh_dual_areas": 0.023325678333333332, + "ray_trace_data_grid": 0.02204003333333333, + "grids_and_structures": 0.02191528333333333, + "mass_profile_deflections": 0.02191528333333333, + "mesh_seed_argmin": 0.010985600000000002, + "mesh_locate_walk": 0.009660266666666667, + "chi_squared_evidence": 0.0011551999999999999 + }, + "prorated_note": "ESTIMATE ONLY \u2014 a mixed fusion's time split equally across the stages its constituents span. Never summed into the measured table, never reconciled." + }, + "other_sources_ms": { + "copy.105": 0.04816039999999986, + "copy.107": 0.04019840000000011, + "copy.108": 0.03985300000000014, + "copy.109": 0.03983050000000011, + "copy.106": 0.039318400000000024, + "loop_broadcast_fusion.6": 0.0034624000000000005, + "loop_broadcast_fusion.2": 0.0028097, + "loop_broadcast_fusion.9": 0.0023552, + "copy.104": 0.0023455999999999998, + "copy.76": 0.0022752, + "copy.37": 0.0021504, + "loop_broadcast_fusion.5": 0.001392 + }, + "device_span_ms": 874.4342653, + "device_busy_ms": 747.8202486, + "device_idle_ms": 126.61401669999998, + "largest_idle_gaps": [ + { + "gap_ms": 5.402783, + "after": "pure_callback.0", + "before": "pure_callback.0" + }, + { + "gap_ms": 5.054174, + "after": "pure_callback.0", + "before": "pure_callback.0" + }, + { + "gap_ms": 4.914911, + "after": "pure_callback.0", + "before": "pure_callback.0" + }, + { + "gap_ms": 4.897791, + "after": "pure_callback.0", + "before": "pure_callback.0" + }, + { + "gap_ms": 4.855902, + "after": "pure_callback.0", + "before": "pure_callback.0" + }, + { + "gap_ms": 4.855135, + "after": "pure_callback.0", + "before": "pure_callback.0" + }, + { + "gap_ms": 4.838975, + "after": "pure_callback.0", + "before": "pure_callback.0" + }, + { + "gap_ms": 4.836831, + "after": "pure_callback.0", + "before": "pure_callback.0" + } + ], + "kernel_ms": 746.8860744999891, + "sum_ms": 873.5000911999891, + "wall_ms": 874.5379600000888, + "host_outside_span_ms": 0.10369470008879489, + "reconciliation_pct": -0.11867624363607425, + "unjoined_ms": 0.0, + "unjoined_pct": 0.0, + "other_ms": 0.22395400000000013, + "other_pct": 0.02560826519182511, + "note": "Stage rows attribute the command-buffers-OFF program (see the module docstring): kernel times are the same, the launch overhead the CUDA graphs remove is not. sum_ms = kernel rows + device_idle_ms; the residual against wall_ms is host_outside_span_ms (dispatch before the first kernel, teardown after the last).", + "per_stage_ms_per_lane": { + "border_relocator": 0.005602449999999999, + "chi_squared_evidence": 0.0007392000000000001, + "curvature_matrix_F": 4.082019624999999, + "data_vector_D": 0.1323331, + "inversion_other": 0.7949523000000009, + "mapped_reconstruction": 0.10951945, + "mapping_matrix": 0.10979782499999999, + "mesh_construction": 0.0004864, + "mesh_dual_areas": 0.0003264, + "mesh_locate_walk": 0.05206329999999999, + "mesh_qhull_callback": 0.012355200000000002, + "mesh_seed_argmin": 0.08460475000000003, + "mixed_fusion": 1.224146975, + "other": 0.011197700000000007, + "pdip_solve": 23.345111149999457, + "psf_convolution_mapping_matrix": 7.360391899999999, + "ray_trace_data_grid": 0.0006552000000000001, + "regularization_H": 0.0180008 + }, + "per_lane_divisor": 20, + "host_callback": { + "pure_callback_span_ms": 104.96422020000001, + "qhull_ms": 91.71131120000005, + "callback_body_ms_note": "the OUTERMOST matching body event, not a sum: under the probe the body appears twice (the wrapper and the timed re-implementation it calls) and summing them would count the same work twice", + "events_by_name": { + "pure_callback.0": { + "count": 200, + "ms": 104.96422020000001 + }, + "$callback.py:815 _wrapped_callback": { + "count": 200, + "ms": 96.38551020000003 + }, + "$callback.py:224 _callback": { + "count": 200, + "ms": 95.92031260000005 + }, + "$callback.py:74 pure_callback_impl": { + "count": 200, + "ms": 95.75172049999996 + }, + "$callback.py:69 __call__": { + "count": 200, + "ms": 92.01689449999996 + }, + "$delaunay.py:162 ": { + "count": 200, + "ms": 91.88535639999998 + }, + "$host_callback_probe.py:225 wrapped": { + "count": 200, + "ms": 91.71131120000005 + }, + "$host_callback_probe.py:160 _timed_tri_only": { + "count": 200, + "ms": 91.56750510000002 + }, + "$callback.py:822 ": { + "count": 800, + "ms": 0.28596919999999953 + }, + "ThenExecuteCallback:GetEventForComputeStreamSyncPoint": { + "count": 10, + "ms": 0.027870899999999997 + }, + "$__init__.py:132 _xla_gc_callback": { + "count": 2, + "ms": 0.000486 + } + }, + "note": "HOST milliseconds per traced BATCH (the whole invocation), aggregated by name because the events nest. Not a row of the device table: the device pays for them as the idle gaps largest_idle_gaps names." + }, + "host_callback_ms": 104.96422020000001 + }, + "hlo_census": { + "status": "excluded", + "reason": "The legacy census anchors PyAutoArray source line numbers that moved after the phase-1 run. No batched attribution is published from unsupported anchors; the device-event table and wall reconciliation remain valid." + }, + "trace_split": { + "expected_calls": 10, + "executions_per_invocation": 1, + "method": "per-call (first-instruction recurrence)", + "note": "DECIDED IN CODE: the scalar arm's trace is split by trace_calls * B, so every lane's execution is its own block and the per-stage median is taken over all of them. The vmap arm's is split by trace_calls, one block per batched execution, and per_stage_ms_per_lane divides those rows by B." + } + }, + "scalar": { + "arm": "scalar", + "program": "jax.jit(fn), called B times", + "stands_for": "Nautilus(use_jax_vmap=False, use_jax_jit=True). Plain use_jax_vmap=False is UNJITTED and is NOT this arm", + "hlo_source": "jax.jit(fn).lower(lane_trees[0]) \u2014 the same program phase 1 traced", + "batch_wall_ms": 1000.3317177997815, + "wall_production_nesting_ms": 1000.3317177997815, + "wall_aot_command_buffers_on_ms": 1002.0908607999446, + "wall_aot_command_buffers_off_ms": 1012.0101273001638, + "command_buffer_delta_ms": 9.919266500219237, + "production_nesting_vs_aot_on_delta_ms": -1.7591430001631352, + "production_nesting_vs_aot_on_delta_pct": -0.17554725514199923, + "wall_per_lane_ms": 50.016585889989074, + "wall_per_lane_command_buffers_off_ms": 50.600506365008194, + "traced_batch_wall_ms": 1040.5850289000227, + "untraced_batch_wall_ms": 1015.0708885998027, + "traced_wall_per_lane_ms": 52.02925144500114, + "callback_count_per_call": 20.0, + "callback_count_per_lane": 1.0, + "callback_expectation": "1 per likelihood evaluation, B per batch", + "host_qhull_ms": 91.94159770195256, + "host_tables_ms": 2.480280199961271, + "host_qhull_ms_per_lane": 4.597079885097628, + "host_tables_ms_per_lane": 0.12401400999806356, + "host_callback_probe": { + "calls": 200, + "qhull_ms_total": 919.4159770195256, + "tables_ms_total": 24.80280199961271, + "total_ms_total": 944.2187790191383, + "qhull_ms_mean": 4.597079885097628, + "tables_ms_mean": 0.12401400999806356, + "total_ms_mean": 4.7210938950956916, + "non_finite_calls": 0, + "n_points": [ + 1500 + ] + }, + "host_callback_records_first": [ + { + "n_points": 1500, + "qhull_ms": 4.84138100000564, + "tables_ms": 0.1848089996201452, + "total_ms": 5.026189999625785, + "finite": true + }, + { + "n_points": 1500, + "qhull_ms": 4.577702002279693, + "tables_ms": 0.12029899880872108, + "total_ms": 4.698001001088414, + "finite": true + }, + { + "n_points": 1500, + "qhull_ms": 4.575381997710792, + "tables_ms": 0.1305800033151172, + "total_ms": 4.70596200102591, + "finite": true + }, + { + "n_points": 1500, + "qhull_ms": 4.61512099718675, + "tables_ms": 0.1310800034843851, + "total_ms": 4.746201000671135, + "finite": true + } + ], + "device_idle_ms": 7.629623549999991, + "device_idle_ms_per_lane": 7.629623549999991, + "trace": { + "parser": "ProfileData.from_file(xplane) + as_text() + stack_frame_index(proto field 17)", + "stage_audit": { + "chi_squared_evidence": [ + { + "instruction": "input_reduce_fusion.26", + "ms": 0.003904265000000002, + "opcode": "fusion", + "shape": "f64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_util.py:104", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_util.py:104 (noise_normalization_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:98 (AbstractFit.noise_normalization)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:306 (FitDataset.noise_normalization)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:349 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)" + ] + }, + { + "instruction": "input_reduce_fusion.28", + "ms": 0.003783660000000004, + "opcode": "fusion", + "shape": "f64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_util.py:90", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_util.py:90 (chi_squared_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:87 (AbstractFit.chi_squared)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:293 (FitDataset.chi_squared)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:345 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)" + ] + }, + { + "instruction": "loop_multiply_fusion.2", + "ms": 0.003006375000000002, + "opcode": "fusion", + "shape": "f64[15361]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/abstract_ndarray.py:300", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/abstract_ndarray.py:300 (AbstractNDArray.__pow__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/abstract_ndarray.py:60 (unwrap_array..wrapper)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/abstract_ndarray.py:35 (to_new_array..wrapper)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_util.py:78 (chi_squared_map_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:78 (AbstractFit.chi_squared_map)" + ] + } + ], + "psf_convolution_mapping_matrix": [ + { + "instruction": "input_scatter_fusion", + "ms": 1.9795207949999998, + "opcode": "fusion", + "shape": "f64[1500,180,180]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "fft.19.0", + "ms": 1.7554150700000009, + "opcode": "fft", + "shape": "f64[1500,180,180]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "fft.15.0", + "ms": 1.3649168499999986, + "opcode": "fft", + "shape": "c128[1500,180,91]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "fft.17.0", + "ms": 0.9788598, + "opcode": "fft", + "shape": "c128[1500,91,180]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "input_transpose_fusion.1", + "ms": 0.5139107350000001, + "opcode": "fusion", + "shape": "c128[1500,91,180]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "wrapped_transpose", + "ms": 0.5001258199999999, + "opcode": "fusion", + "shape": "c128[1500,180,91]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + } + ], + "mapping_matrix": [ + { + "instruction": "loop_broadcast_fusion.2", + "ms": 0.11094477499999997, + "opcode": "fusion", + "shape": "f64[15361,1500]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:342", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:342 (mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/abstract.py:283 (Mapper.mapping_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:91 (AbstractInversionImaging._mapping_matrix_for_convolution_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:137 (AbstractInversionImaging.operated_mapping_matrix_list)" + ] + }, + { + "instruction": "input_reduce_fusion.29", + "ms": 0.0028802999999999906, + "opcode": "fusion", + "shape": "f64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:93", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:93 (adaptive_pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/abstract.py:507 (Mapper.pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt.py:339 (Adapt.regularization_weights_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt_split.py:120 (AdaptSplit.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)" + ] + }, + { + "instruction": "loop_divide_fusion", + "ms": 0.0023528000000000025, + "opcode": "fusion", + "shape": "f64[1500]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:92", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:92 (adaptive_pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/abstract.py:507 (Mapper.pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt.py:339 (Adapt.regularization_weights_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt_split.py:120 (AdaptSplit.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)" + ] + } + ], + "mixed_fusion": [ + { + "instruction": "loop_divide_gather_fusion", + "ms": 1.0144249650000003, + "opcode": "fusion", + "shape": "(f64[15361,1,1,1500]{3,2,1,0}, f64[15361,1,1,1500]{3,2,1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:133", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:133 (curvature_matrix_via_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:93 (InversionImagingMapping.curvature_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:389 (AbstractInversion.curvature_reg_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "input_add_multiply_transpose_fusion", + "ms": 0.060890715000000005, + "opcode": "fusion", + "shape": "(f64[1500,1500]{1,0}, f64[1500,1500]{1,0}, f64[1500,1500]{1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:61", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:61 (initialize)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:72 (solve_nnls)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:129 (_solve_nnls_primal_with..primal)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:164 (solve_nnls_primal_with_status)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:508 (reconstruction_positive_only_from)" + ] + }, + { + "instruction": "input_transpose_fusion.3", + "ms": 0.02419367500000001, + "opcode": "fusion", + "shape": "f64[1500,1500]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986 (AbstractInversion._log_det_symmetric_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:1157 (AbstractInversion.log_det_regularization_matrix_term)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:348 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/model/analysis.py:135 (AnalysisImaging.log_likelihood_function)" + ] + }, + { + "instruction": "input_scatter_fusion.2", + "ms": 0.01633987, + "opcode": "fusion", + "shape": "f64[1500,1500]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:579", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:579 (pixel_splitted_regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt_split.py:137 (AdaptSplit.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:332 (AbstractInversion.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "loop_abs_fusion", + "ms": 0.014803945000000004, + "opcode": "fusion", + "shape": "(f64[6000,1]{1,0}, f64[6000,1]{1,0}, f64[6000,1]{1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:613", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:613 (triangle_area_xp)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:657 (pixel_weights_delaunay_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:982 (InterpolatorDelaunay._mappings_sizes_weights_split)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt_split.py:124 (AdaptSplit.regularization_matrix_from)" + ] + }, + { + "instruction": "input_scatter_fusion.3", + "ms": 0.014678229999999999, + "opcode": "fusion", + "shape": "f64[1500]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:70", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:70 (adaptive_pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/abstract.py:507 (Mapper.pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt.py:339 (Adapt.regularization_weights_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt_split.py:120 (AdaptSplit.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)" + ] + } + ], + "ray_trace_data_grid": [ + { + "instruction": "input_reduce_fusion.18", + "ms": 0.003235509999999996, + "opcode": "fusion", + "shape": "f64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:506", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:506 (FlatLambdaCDM._simpson_1d)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:644 (FlatLambdaCDM.angular_diameter_distance_kpc_z1z2)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:133 (LensingCosmology.angular_diameter_distance_to_earth_in_kpc_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:362 (LensingCosmology.scaling_factor_between_redshifts_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/lens/tracer_util.py:252 (traced_grid_2d_list_from)" + ] + }, + { + "instruction": "input_reduce_fusion.20", + "ms": 0.0027401349999999908, + "opcode": "fusion", + "shape": "f64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:506", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:506 (FlatLambdaCDM._simpson_1d)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:644 (FlatLambdaCDM.angular_diameter_distance_kpc_z1z2)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:151 (LensingCosmology.angular_diameter_distance_between_redshifts_in_kpc_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:355 (LensingCosmology.scaling_factor_between_redshifts_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/lens/tracer_util.py:252 (traced_grid_2d_list_from)" + ] + }, + { + "instruction": "input_reduce_fusion.19", + "ms": 0.0026057449999999966, + "opcode": "fusion", + "shape": "f64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:503", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:503 (FlatLambdaCDM._simpson_1d)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:644 (FlatLambdaCDM.angular_diameter_distance_kpc_z1z2)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:133 (LensingCosmology.angular_diameter_distance_to_earth_in_kpc_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:362 (LensingCosmology.scaling_factor_between_redshifts_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/lens/tracer_util.py:252 (traced_grid_2d_list_from)" + ] + }, + { + "instruction": "input_reduce_fusion.21", + "ms": 0.002587044999999994, + "opcode": "fusion", + "shape": "f64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:503", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:503 (FlatLambdaCDM._simpson_1d)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:644 (FlatLambdaCDM.angular_diameter_distance_kpc_z1z2)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:151 (LensingCosmology.angular_diameter_distance_between_redshifts_in_kpc_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:355 (LensingCosmology.scaling_factor_between_redshifts_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/lens/tracer_util.py:252 (traced_grid_2d_list_from)" + ] + }, + { + "instruction": "loop_divide_fusion.1", + "ms": 0.002514860000000003, + "opcode": "fusion", + "shape": "f64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:380", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:380 (LensingCosmology.scaling_factor_between_redshifts_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/lens/tracer_util.py:252 (traced_grid_2d_list_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/lens/tracer.py:632 (Tracer.traced_grid_2d_list_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/structures/decorators/abstract.py:93 (AbstractMaker.evaluate_func)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/structures/decorators/abstract.py:110 (AbstractMaker.result)" + ] + } + ], + "border_relocator": [ + { + "instruction": "eigh.45", + "ms": 0.07459175499999986, + "opcode": "custom-call", + "shape": "(f64[2,2]{0,1}, f64[2]{0}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:245", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:245 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:454 (BorderRelocator.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:176 (AbstractMesh.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:214 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "custom-call.2", + "ms": 0.007952110000000021, + "opcode": "custom-call", + "shape": "(f64[2,2]{1,0}, s8[4194304]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:242", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:242 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:454 (BorderRelocator.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:176 (AbstractMesh.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:214 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "input_reduce_fusion.15", + "ms": 0.005806534999999992, + "opcode": "fusion", + "shape": "(f64[], f64[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:269", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:269 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:454 (BorderRelocator.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:176 (AbstractMesh.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:214 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "loop_select_sine_fusion", + "ms": 0.003668455000000008, + "opcode": "fusion", + "shape": "(f64[], f64[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:301", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:301 (relocated_grid_via_ellipse_border_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:458 (BorderRelocator.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:176 (AbstractMesh.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:214 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "input_concatenate_fusion.3", + "ms": 0.0036586900000000087, + "opcode": "fusion", + "shape": "f64[15361,2]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:323", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:323 (relocated_grid_via_ellipse_border_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:423 (BorderRelocator.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:83 (AbstractMesh.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:208 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "loop_add_fusion.5", + "ms": 0.0035801449999999994, + "opcode": "fusion", + "shape": "f64[15361]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:308", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:308 (relocated_grid_via_ellipse_border_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:423 (BorderRelocator.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:83 (AbstractMesh.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:208 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + } + ], + "mesh_construction": [ + { + "instruction": "input_concatenate_fusion.7", + "ms": 0.0020396799999999925, + "opcode": "fusion", + "shape": "f64[1500,2]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:820", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:820 (InterpolatorDelaunay.mesh_grid_xy)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:847 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + } + ], + "mesh_qhull_callback": [ + { + "instruction": "pure_callback.4", + "ms": 0.010656254999999965, + "opcode": "custom-call", + "shape": "(s32[3000,3]{1,0}, s32[3000,3]{1,0}, s32[1500]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:161", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:161 (_jax_delaunay_tables)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:405 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + } + ], + "other": [ + { + "instruction": "copy.72", + "ms": 0.04182004999999856, + "opcode": "copy", + "shape": "f64[1,1024,2]{2,1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "copy.35", + "ms": 0.017098710000000218, + "opcode": "copy", + "shape": "s32[21361]{0}", + "source": "", + "stack": [] + }, + { + "instruction": "copy.40", + "ms": 0.002001399999999998, + "opcode": "copy", + "shape": "s64[1500]{0}", + "source": "", + "stack": [] + }, + { + "instruction": "loop_broadcast_fusion.1", + "ms": 0.001965755000000001, + "opcode": "fusion", + "shape": "(pred[21361]{0}, pred[21361]{0})", + "source": "", + "stack": [] + }, + { + "instruction": "copy.71", + "ms": 0.001792784999999997, + "opcode": "copy", + "shape": "s32[]", + "source": "", + "stack": [] + }, + { + "instruction": "loop_broadcast_fusion.4", + "ms": 0.0017787099999999967, + "opcode": "fusion", + "shape": "(f64[1500]{0}, f64[1500]{0}, f64[1500]{0}, f64[1500]{0})", + "source": "", + "stack": [] + } + ], + "mesh_seed_argmin": [ + { + "instruction": "input_reduce_fusion", + "ms": 0.14760173499999826, + "opcode": "fusion", + "shape": "(f64[1024]{0}, s64[1024]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:191", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:191 (_nearest_vertex_seed_from..argmin_chunk)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204 (_nearest_vertex_seed_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:351 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)" + ] + }, + { + "instruction": "loop_dynamic_update_slice_fusion", + "ms": 0.04108403499999848, + "opcode": "fusion", + "shape": "s32[21,1024]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204 (_nearest_vertex_seed_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:351 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "loop_add_fusion", + "ms": 0.03194550499999987, + "opcode": "fusion", + "shape": "s64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204 (_nearest_vertex_seed_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:351 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "loop_broadcast_fusion", + "ms": 0.0019494299999999966, + "opcode": "fusion", + "shape": "s32[21,1024]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204 (_nearest_vertex_seed_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:351 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "regularization_H": [ + { + "instruction": "loop_select_fusion.3", + "ms": 0.019947874999999997, + "opcode": "fusion", + "shape": "f64[1500,1500]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:549", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:549 (pixel_splitted_regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt_split.py:137 (AdaptSplit.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:332 (AbstractInversion.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "input_scatter_fusion.10", + "ms": 0.002060314999999996, + "opcode": "fusion", + "shape": "f64[1500,1500]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:615", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:615 (pixel_splitted_regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt_split.py:137 (AdaptSplit.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:332 (AbstractInversion.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "input_concatenate_fusion.8", + "ms": 0.0018707049999999975, + "opcode": "fusion", + "shape": "pred[3]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:93", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:93 (split_points_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:410 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + }, + { + "instruction": "input_concatenate_fusion.9", + "ms": 0.0018577599999999995, + "opcode": "fusion", + "shape": "pred[3]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:91", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:91 (split_points_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:410 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + }, + { + "instruction": "input_concatenate_fusion.10", + "ms": 0.0018564550000000006, + "opcode": "fusion", + "shape": "pred[3]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:90", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:90 (split_points_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:410 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + }, + { + "instruction": "input_concatenate_fusion", + "ms": 0.0017591799999999993, + "opcode": "fusion", + "shape": "s32[1500,2]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:615", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:615 (pixel_splitted_regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt_split.py:137 (AdaptSplit.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:332 (AbstractInversion.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "mesh_locate_walk": [ + { + "instruction": "input_reduce_fusion.1", + "ms": 0.025403025000000697, + "opcode": "fusion", + "shape": "pred[196]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:288", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:288 (_walk_from_seed..cond)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:353 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)" + ] + }, + { + "instruction": "loop_reduce_fusion", + "ms": 0.02537004500000037, + "opcode": "fusion", + "shape": "(f64[21361]{0}, s64[21361]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:264", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:264 (_walk_from_seed..walk_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:292 (_walk_from_seed..body)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:264 (_walk_from_seed..walk_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:292 (_walk_from_seed..body)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)" + ] + }, + { + "instruction": "loop_or_select_fusion", + "ms": 0.02246211500000033, + "opcode": "fusion", + "shape": "(s32[21361]{0}, pred[21361]{0}, pred[21361]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:270", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:270 (_walk_from_seed..walk_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:292 (_walk_from_seed..body)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:353 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)" + ] + }, + { + "instruction": "loop_select_fusion", + "ms": 0.020142059999999896, + "opcode": "fusion", + "shape": "s32[21361]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:242", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:242 (_walk_from_seed..weights_of)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:262 (_walk_from_seed..walk_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:292 (_walk_from_seed..body)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:353 (pix_indexes_delaunay_walk_from)" + ] + }, + { + "instruction": "input_reduce_fusion.2", + "ms": 0.01643097499999993, + "opcode": "fusion", + "shape": "pred[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:288", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:288 (_walk_from_seed..cond)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:353 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)" + ] + }, + { + "instruction": "while.22", + "ms": 0.014684064999999785, + "opcode": "while", + "shape": "(s32[], s32[21361]{0}, pred[21361]{0}, pred[21361]{0}, s32[3000,3]{1,0}, /*index=5*/f64[1500,2]{1,0}, f64[21361,2]{1,0}, s32[3000,3]{1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:353 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "data_vector_D": [ + { + "instruction": "input_reduce_fusion.10", + "ms": 0.12202000499999993, + "opcode": "fusion", + "shape": "f64[92,1500]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/inversion_imaging_util.py:123", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/inversion_imaging_util.py:123 (data_vector_via_blurred_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:67 (InversionImagingMapping.data_vector)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:699 (AbstractInversion.reconstruction)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "input_reduce_fusion.27", + "ms": 0.0036915050000000038, + "opcode": "fusion", + "shape": "f64[1500]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/inversion_imaging_util.py:123", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/inversion_imaging_util.py:123 (data_vector_via_blurred_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:67 (InversionImagingMapping.data_vector)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:699 (AbstractInversion.reconstruction)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "inversion_other": [ + { + "instruction": "cholesky.60", + "ms": 0.8941022749999998, + "opcode": "custom-call", + "shape": "(f64[1500,1500]{0,1}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986 (AbstractInversion._log_det_symmetric_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:1078 (AbstractInversion.log_det_curvature_reg_matrix_term)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:347 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/model/analysis.py:135 (AnalysisImaging.log_likelihood_function)" + ] + }, + { + "instruction": "cholesky.70", + "ms": 0.8915859899999999, + "opcode": "custom-call", + "shape": "(f64[1500,1500]{0,1}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986 (AbstractInversion._log_det_symmetric_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:1157 (AbstractInversion.log_det_regularization_matrix_term)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:348 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/model/analysis.py:135 (AnalysisImaging.log_likelihood_function)" + ] + }, + { + "instruction": "input_reduce_fusion.17", + "ms": 0.013030834999999982, + "opcode": "fusion", + "shape": "f64[1500]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:946", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:946 (AbstractInversion.regularization_term)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:346 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/model/analysis.py:135 (AnalysisImaging.log_likelihood_function)", + "/mnt/ral/jnightin/autolens_profiling_wt/certified-solver-phase-c1-lane-rate/scripts/imaging/likelihood_breakdown/fixed_light_trace.py:1195 (_captured_likelihood_fn.._likelihood)" + ] + }, + { + "instruction": "loop_reduce_window_fusion.1", + "ms": 0.002771350000000001, + "opcode": "fusion", + "shape": "s64[94,16]{1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "loop_reduce_window_fusion", + "ms": 0.0026658950000000028, + "opcode": "fusion", + "shape": "s64[6,16]{1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "input_reduce_fusion.25", + "ms": 0.002657260000000006, + "opcode": "fusion", + "shape": "f64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:944", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:944 (AbstractInversion.regularization_term)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:346 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/model/analysis.py:135 (AnalysisImaging.log_likelihood_function)", + "/mnt/ral/jnightin/autolens_profiling_wt/certified-solver-phase-c1-lane-rate/scripts/imaging/likelihood_breakdown/fixed_light_trace.py:1195 (_captured_likelihood_fn.._likelihood)" + ] + } + ], + "curvature_matrix_F": [ + { + "instruction": "cublas-lt-matmul.2", + "ms": 4.218645815000001, + "opcode": "custom-call", + "shape": "(f64[1500,1500]{1,0}, s8[4194304]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:134", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:134 (curvature_matrix_via_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:93 (InversionImagingMapping.curvature_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:389 (AbstractInversion.curvature_reg_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "pdip_solve": [ + { + "instruction": "cholesky.20", + "ms": 15.983820379999766, + "opcode": "custom-call", + "shape": "(f64[1500,1500]{0,1}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:106", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:106 (factorize_kkt)", + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:212 (pdip_pc_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:83 (solve_nnls)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:129 (_solve_nnls_primal_with..primal)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:164 (solve_nnls_primal_with_status)" + ] + }, + { + "instruction": "triangular-solve", + "ms": 2.540545144999988, + "opcode": "custom-call", + "shape": "(f64[1500,1]{0,1}, s8[0]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146 (solve_kkt_rhs)", + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:213 (pdip_pc_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:83 (solve_nnls)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:129 (_solve_nnls_primal_with..primal)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:164 (solve_nnls_primal_with_status)" + ] + }, + { + "instruction": "triangular-solve.2", + "ms": 2.517701315000026, + "opcode": "custom-call", + "shape": "(f64[1500,1]{0,1}, s8[0]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146 (solve_kkt_rhs)", + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:217 (pdip_pc_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:83 (solve_nnls)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:129 (_solve_nnls_primal_with..primal)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:164 (solve_nnls_primal_with_status)" + ] + }, + { + "instruction": "triangular-solve.3", + "ms": 2.3762399700001886, + "opcode": "custom-call", + "shape": "(f64[1500,1]{0,1}, s8[0]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146 (solve_kkt_rhs)", + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:217 (pdip_pc_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:83 (solve_nnls)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:129 (_solve_nnls_primal_with..primal)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:164 (solve_nnls_primal_with_status)" + ] + }, + { + "instruction": "triangular-solve.1", + "ms": 2.297555920000129, + "opcode": "custom-call", + "shape": "(f64[1500,1]{0,1}, s8[0]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146 (solve_kkt_rhs)", + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:213 (pdip_pc_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:83 (solve_nnls)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:129 (_solve_nnls_primal_with..primal)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:164 (solve_nnls_primal_with_status)" + ] + }, + { + "instruction": "cholesky.40", + "ms": 0.8650376099999995, + "opcode": "custom-call", + "shape": "(f64[1500,1500]{0,1}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:62", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:62 (initialize)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:72 (solve_nnls)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:129 (_solve_nnls_primal_with..primal)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:164 (solve_nnls_primal_with_status)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:508 (reconstruction_positive_only_from)" + ] + } + ], + "mapped_reconstruction": [ + { + "instruction": "input_reduce_fusion.14", + "ms": 0.11445830500000001, + "opcode": "fusion", + "shape": "f64[15361]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:163", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:163 (mapped_reconstructed_data_via_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:120 (InversionImagingMapping._mapped_reconstructed_data_dict_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:196 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + } + ] + }, + "stage_audit_note": "The HLO instructions that contributed most of each stage's milliseconds, with their full source stack. A stage row is only as good as the rules that built it; this is how a reader checks a row against the HLO instead of trusting it.", + "untraced_wall_ms": 50.753544429990136, + "reconciliation_vs_untraced_pct": -0.43295179175760246, + "wall_basis": "wall_ms is the TRACED run's wall, the run these kernel durations came from. untraced_wall_ms is the same executable without the profiler; the difference is the profiler's overhead and belongs in neither the stages nor the idle row.", + "calls": 200, + "call_split": "per-call (first-instruction recurrence)", + "call_blocks": 200, + "events": 191310, + "streams": [ + "Stream #14(MemcpyD2D,MemcpyH2D,Compute,MemcpyD2H,Memset)" + ], + "per_stage_ms": { + "border_relocator": { + "median_ms": 0.11491299999999999, + "min_ms": 0.11401599999999998, + "max_ms": 0.11606 + }, + "chi_squared_evidence": { + "median_ms": 0.010688, + "min_ms": 0.010304, + "max_ms": 0.011424 + }, + "curvature_matrix_F": { + "median_ms": 4.218025000000001, + "min_ms": 4.205913, + "max_ms": 4.265434 + }, + "data_vector_D": { + "median_ms": 0.125696, + "min_ms": 0.124924, + "max_ms": 0.126593 + }, + "inversion_other": { + "median_ms": 1.8166664999999997, + "min_ms": 1.80033, + "max_ms": 1.8335469999999998 + }, + "mapped_reconstruction": { + "median_ms": 0.1144465, + "min_ms": 0.113825, + "max_ms": 0.115553 + }, + "mapping_matrix": { + "median_ms": 0.1161285, + "min_ms": 0.11510000000000001, + "max_ms": 0.11724899999999999 + }, + "memset": { + "median_ms": 0.05091200000000001, + "min_ms": 0.04210800000000001, + "max_ms": 0.08470300000000001 + }, + "mesh_construction": { + "median_ms": 0.002048, + "min_ms": 0.002016, + "max_ms": 0.002049 + }, + "mesh_locate_walk": { + "median_ms": 0.14832250000000002, + "min_ms": 0.13049700000000006, + "max_ms": 0.184216 + }, + "mesh_qhull_callback": { + "median_ms": 0.010624, + "min_ms": 0.010464000000000001, + "max_ms": 0.01104 + }, + "mesh_seed_argmin": { + "median_ms": 0.22256200000000015, + "min_ms": 0.2221690000000002, + "max_ms": 0.22293900000000008 + }, + "mixed_fusion": { + "median_ms": 1.2544275, + "min_ms": 1.2487959999999994, + "max_ms": 1.2580559999999994 + }, + "other": { + "median_ms": 0.0711995, + "min_ms": 0.06870099999999998, + "max_ms": 0.07558200000000001 + }, + "pdip_solve": { + "median_ms": 27.262917500000007, + "min_ms": 22.713710000000027, + "max_ms": 47.29580200000003 + }, + "psf_convolution_mapping_matrix": { + "median_ms": 7.320093, + "min_ms": 7.3059970000000005, + "max_ms": 7.335915 + }, + "ray_trace_data_grid": { + "median_ms": 0.013633000000000001, + "min_ms": 0.013535000000000002, + "max_ms": 0.014079999999999999 + }, + "regularization_H": { + "median_ms": 0.03088, + "min_ms": 0.030365999999999997, + "max_ms": 0.031584 + } + }, + "stage_order": [ + "ray_trace_data_grid", + "border_relocator", + "mesh_qhull_callback", + "mesh_seed_argmin", + "mesh_locate_walk", + "mesh_construction", + "mapping_matrix", + "psf_convolution_mapping_matrix", + "data_vector_D", + "curvature_matrix_F", + "regularization_H", + "pdip_solve", + "mapped_reconstruction", + "chi_squared_evidence", + "inversion_other", + "mixed_fusion", + "other", + "memset" + ], + "mixed_fusion": { + "ms": 1.2544275, + "constituent_stage_sets": { + "curvature_matrix_F + psf_convolution_mapping_matrix": 1.0144249650000003, + "curvature_reg_reduce_gather + inversion_other + mapped_reconstruction + pdip_solve + reconstruction_scatter + regularization_H": 0.060890715000000005, + "inversion_other + regularization_H": 0.029447410000000094, + "inversion_other + mesh_construction + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin + regularization_H": 0.021490085000000013, + "inversion_other + mapping_matrix + mesh_construction + mesh_dual_areas + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin": 0.021122015000000004, + "inversion_other + mesh_construction + mesh_dual_areas + mesh_interpolation_weights + regularization_H": 0.014803945000000004, + "grids_and_structures + mass_profile_deflections + ray_trace_data_grid": 0.01451463499999999, + "inversion_other + mapping_matrix + mesh_construction + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin": 0.011625870000000002, + "grids_and_structures + mass_profile_deflections": 0.010162915000000007, + "inversion_other + mesh_dual_areas + mesh_locate_walk": 0.00926599500000005, + "inversion_other + mesh_construction + mesh_seed_argmin + regularization_H": 0.007246359999999995, + "inversion_other + mesh_construction + regularization_H": 0.0065065099999999845, + "inversion_other + ray_trace_data_grid": 0.005272445000000013, + "inversion_other + mapped_reconstruction + pdip_solve + reconstruction_scatter": 0.004812449999999998, + "inversion_other + mapped_reconstruction": 0.0037050900000000016, + "mapping_matrix + regularization_H": 0.003474344999999993, + "inversion_other + mesh_construction + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin": 0.003105385000000001, + "inversion_other + mesh_construction + mesh_dual_areas + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin": 0.0029794900000000056, + "inversion_other + pdip_solve": 0.0028225499999999983, + "inversion_other + mesh_locate_walk + mesh_seed_argmin": 0.002481235000000002, + "inversion_other + mesh_interpolation_weights": 0.002146065000000007, + "chi_squared_evidence + inversion_other": 0.0017820649999999991 + }, + "example_kernels": { + "curvature_matrix_F + psf_convolution_mapping_matrix": [ + "loop_divide_gather_fusion" + ], + "curvature_reg_reduce_gather + inversion_other + mapped_reconstruction + pdip_solve + reconstruction_scatter + regularization_H": [ + "input_add_multiply_transpose_fusion" + ], + "inversion_other + regularization_H": [ + "loop_reduce_slice_fusion", + "loop_reduce_fusion.1", + "loop_reduce_fusion.2", + "input_transpose_fusion.3" + ], + "inversion_other + mesh_construction + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin + regularization_H": [ + "input_reduce_fusion.24", + "loop_select_fusion.4", + "input_scatter_fusion.2" + ], + "inversion_other + mapping_matrix + mesh_construction + mesh_dual_areas + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin": [ + "input_scatter_fusion.6", + "input_scatter_fusion.3" + ], + "inversion_other + mesh_construction + mesh_dual_areas + mesh_interpolation_weights + regularization_H": [ + "loop_abs_fusion" + ], + "grids_and_structures + mass_profile_deflections + ray_trace_data_grid": [ + "loop_subtract_fusion.2", + "loop_subtract_fusion.1" + ], + "inversion_other + mapping_matrix + mesh_construction + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin": [ + "input_scatter_fusion.4" + ], + "grids_and_structures + mass_profile_deflections": [ + "loop_divide_minimum_multiply_sine_sqrt_fusion", + "loop_slice_fusion" + ], + "inversion_other + mesh_dual_areas + mesh_locate_walk": [ + "loop_select_fusion.6", + "input_scatter_fusion.9", + "input_scatter_fusion.8", + "input_scatter_fusion.7" + ] + }, + "prorated_estimate_ms": { + "curvature_matrix_F": 0.5072124825000002, + "psf_convolution_mapping_matrix": 0.5072124825000002, + "inversion_other": 0.054450751714285796, + "regularization_H": 0.03713222650000004, + "mesh_construction": 0.016595630880952377, + "mesh_interpolation_weights": 0.013688236714285722, + "mesh_locate_walk": 0.013570158547619067, + "mapped_reconstruction": 0.01320411, + "pdip_solve": 0.012762839999999998, + "mesh_seed_argmin": 0.01229308354761905, + "reconstruction_scatter": 0.011351565, + "curvature_reg_reduce_gather": 0.0101484525, + "grids_and_structures": 0.009919669166666666, + "mass_profile_deflections": 0.009919669166666666, + "mesh_dual_areas": 0.009563466380952401, + "ray_trace_data_grid": 0.0074744341666666695, + "mapping_matrix": 0.006692248214285712, + "chi_squared_evidence": 0.0008910324999999996 + }, + "prorated_note": "ESTIMATE ONLY \u2014 a mixed fusion's time split equally across the stages its constituents span. Never summed into the measured table, never reconciled." + }, + "other_sources_ms": { + "copy.72": 0.04182004999999856, + "copy.35": 0.017098710000000218, + "copy.40": 0.002001399999999998, + "loop_broadcast_fusion.1": 0.001965755000000001, + "copy.71": 0.001792784999999997, + "loop_broadcast_fusion.4": 0.0017787099999999967, + "copy.70": 0.0017457400000000039, + "copy.20": 0.001658219999999997, + "copy.52": 0.0016358150000000016 + }, + "device_span_ms": 52.023427334999994, + "device_busy_ms": 44.393803785, + "device_idle_ms": 7.629623549999991, + "largest_idle_gaps": [ + { + "gap_ms": 5.577245, + "after": "pure_callback.4", + "before": "pure_callback.4" + }, + { + "gap_ms": 0.037183, + "after": "pure_callback.4", + "before": "copy.71" + }, + { + "gap_ms": 0.030879, + "after": "input_concatenate_fusion.7", + "before": "pure_callback.4" + }, + { + "gap_ms": 0.0304, + "after": "copy.35", + "before": "input_reduce_fusion.1" + }, + { + "gap_ms": 0.020352, + "after": "eigh.45", + "before": "eigh.45" + }, + { + "gap_ms": 0.020032, + "after": "input_reduce_fusion.3", + "before": "input_divide_reduce_subtract_fusion" + }, + { + "gap_ms": 0.02, + "after": "while.28", + "before": "input_reduce_fusion.3" + }, + { + "gap_ms": 0.019168, + "after": "input_reduce_fusion.26", + "before": "loop_broadcast_fusion.3" + } + ], + "kernel_ms": 42.90418250000001, + "sum_ms": 50.53380605, + "wall_ms": 52.02925144500114, + "host_outside_span_ms": 0.0058241100011429126, + "reconciliation_pct": -2.8742396891524247, + "unjoined_ms": 0.0, + "unjoined_pct": 0.0, + "other_ms": 0.0711995, + "other_pct": 0.13684513619278815, + "note": "Stage rows attribute the command-buffers-OFF program (see the module docstring): kernel times are the same, the launch overhead the CUDA graphs remove is not. sum_ms = kernel rows + device_idle_ms; the residual against wall_ms is host_outside_span_ms (dispatch before the first kernel, teardown after the last).", + "per_stage_ms_per_lane": { + "border_relocator": 0.11491299999999999, + "chi_squared_evidence": 0.010688, + "curvature_matrix_F": 4.218025000000001, + "data_vector_D": 0.125696, + "inversion_other": 1.8166664999999997, + "mapped_reconstruction": 0.1144465, + "mapping_matrix": 0.1161285, + "memset": 0.05091200000000001, + "mesh_construction": 0.002048, + "mesh_locate_walk": 0.14832250000000002, + "mesh_qhull_callback": 0.010624, + "mesh_seed_argmin": 0.22256200000000015, + "mixed_fusion": 1.2544275, + "other": 0.0711995, + "pdip_solve": 27.262917500000007, + "psf_convolution_mapping_matrix": 7.320093, + "ray_trace_data_grid": 0.013633000000000001, + "regularization_H": 0.03088 + }, + "per_lane_divisor": 1, + "host_callback": { + "pure_callback_span_ms": 101.39265520000001, + "qhull_ms": 94.61371190000001, + "callback_body_ms_note": "the OUTERMOST matching body event, not a sum: under the probe the body appears twice (the wrapper and the timed re-implementation it calls) and summing them would count the same work twice", + "events_by_name": { + "pure_callback.4": { + "count": 200, + "ms": 101.39265520000001 + }, + "$callback.py:815 _wrapped_callback": { + "count": 200, + "ms": 99.64069369999996 + }, + "$callback.py:224 _callback": { + "count": 200, + "ms": 99.16375899999997 + }, + "$callback.py:74 pure_callback_impl": { + "count": 200, + "ms": 98.97832679999995 + }, + "$callback.py:69 __call__": { + "count": 200, + "ms": 94.92798070000003 + }, + "$delaunay.py:162 ": { + "count": 200, + "ms": 94.7946648 + }, + "$host_callback_probe.py:225 wrapped": { + "count": 200, + "ms": 94.61371190000001 + }, + "$host_callback_probe.py:160 _timed_tri_only": { + "count": 200, + "ms": 94.44655579999997 + }, + "ThenExecuteCallback:GetEventForComputeStreamSyncPoint": { + "count": 200, + "ms": 0.3492051999999998 + }, + "$callback.py:822 ": { + "count": 800, + "ms": 0.2878111999999995 + }, + "$__init__.py:132 _xla_gc_callback": { + "count": 2, + "ms": 0.000338 + } + }, + "note": "HOST milliseconds per traced BATCH (the whole invocation), aggregated by name because the events nest. Not a row of the device table: the device pays for them as the idle gaps largest_idle_gaps names." + }, + "host_callback_ms": 101.39265520000001 + }, + "hlo_census": { + "status": "excluded", + "reason": "The legacy census anchors PyAutoArray source line numbers that moved after the phase-1 run. No batched attribution is published from unsupported anchors; the device-event table and wall reconciliation remain valid." + }, + "trace_split": { + "expected_calls": 200, + "executions_per_invocation": 20, + "method": "per-call (first-instruction recurrence)", + "note": "DECIDED IN CODE: the scalar arm's trace is split by trace_calls * B, so every lane's execution is its own block and the per-stage median is taken over all of them. The vmap arm's is split by trace_calls, one block per batched execution, and per_stage_ms_per_lane divides those rows by B." + } + } + }, + "certification_report": { + "source": "vmap arm, library solve observed through its stats= out-dict (PyAutoArray #566) and jax.debug.callback(..., ordered=True); ordered because the unordered batching rule returns the lanes permuted. Untimed, separately compiled; max rel diff of its log likelihoods vs the timed arm's: nan", + "rows": 0, + "pdip_iter": "NOT AVAILABLE per lane without changing library numerics. The fallback branch calls the library's own reconstruction_positive_only_from, which returns the solution alone \u2014 jax_nnls.solve_nnls' iteration count is discarded inside the library's custom_vjp primal. The PDIP while_loop's cost is in the pdip_solve stage row of each arm's device table instead, which is a max-over-lanes quantity under vmap because every lane runs the same fixed kernel sequence.", + "passes_semantics": "library `passes`: restricted active-set passes run (jax_active_set.solve_certified)" + }, + "lane_construction": { + "draws_sha256": "2ef9de62dd3cb04c203df7c6177baeafe26acbe41f5db2137c5891526b265fcf", + "lane_rows": [ + 300, + 301, + 302, + 303, + 304, + 305, + 306, + 307, + 308, + 309, + 310, + 311, + 312, + 313, + 314, + 315, + 316, + 317, + 318, + 319 + ], + "calls": [ + 15 + ], + "stage": "pix1", + "regularization_range": { + "galaxies.source.pixelization.regularization.inner_coefficient": { + "min": 2.161360256524811e-06, + "max": 609.7498208301598 + }, + "galaxies.source.pixelization.regularization.outer_coefficient": { + "min": 3.4330906156470037e-06, + "max": 159.11676392313697 + }, + "galaxies.source.pixelization.regularization.signal_scale": { + "min": 0.12452271846719754, + "max": 0.9404155018121758 + } + }, + "phases": [ + "exploration" + ], + "window_rule": "nautilus_batches.timed_window: consecutive captured calls, in call order, from the FIRST call that is not a prior batch, concatenated and truncated to B; at B == n_batch exactly one real Nautilus batch. Falls back to the latest B lanes if the post-prior lanes run out; never repeats a lane.", + "note": "Lane k is captured lane lane_rows[k]: the mass AND shear of a real Nautilus proposal (nautilus_batch_capture.py), lens light fixed at S3, the S3 light-subtracted dataset shared by every lane. `offsets` in the lane table are the mass offsets from the fiducial; the shear is in the capture file." + }, + "captured": { + "batches_path": "/mnt/ral/jnightin/autolens_profiling_wt/certified-solver-phase-c1-lane-rate/results/breakdown/imaging/nautilus_batches_delaunay_pix1.npz", + "batches_sha256": "e71a5e23026b342d1ff4359b8fb914a87980d8aea0060659d2334dcfa3215c00", + "schema_version": 2, + "n_calls": 932, + "n_lanes": 18640, + "call_sizes_seen": [ + 20 + ], + "calls_by_phase": { + "prior": 15, + "exploration": 917 + }, + "parameter_paths": [ + "galaxies.source.pixelization.regularization.inner_coefficient", + "galaxies.source.pixelization.regularization.outer_coefficient", + "galaxies.source.pixelization.regularization.signal_scale", + "galaxies.lens.mass.centre.centre_0", + "galaxies.lens.mass.centre.centre_1", + "galaxies.lens.mass.einstein_radius", + "galaxies.lens.mass.ell_comps.ell_comps_0", + "galaxies.lens.mass.ell_comps.ell_comps_1", + "galaxies.lens.shear.gamma_1", + "galaxies.lens.shear.gamma_2" + ], + "stage": "pix1", + "regularization": { + "class": "AdaptSplit", + "free": true, + "priors": { + "inner_coefficient": [ + "LogUniform", + 1e-06, + 1000000.0 + ], + "outer_coefficient": [ + "LogUniform", + 1e-06, + 1000000.0 + ], + "signal_scale": [ + "Uniform", + 0.0, + 1.0 + ] + }, + "priors_source": "PyAutoGalaxy packaged config/priors/regularization (adapt_split.yaml / constant.yaml); adapt_split.yaml is identical to euclid_strong_lens_modeling_pipeline/config/priors/regularization/adapt_split.yaml" + }, + "nautilus": { + "departures_from_production": [ + "mass/shear priors are the phase-B cell's Gaussians, not chained from source_lp", + "no positions likelihood", + "the cell's mesh (Hilbert 1500, weight_power 1) in both stages; source_pix_2 redraws a 500-vertex Hilbert grid at weight_power 3.5", + "seeded (production passes no seed)", + "quick updates disabled (iterations_per_quick_update=1e12; render-only)", + "NullPaths: no output directory, so no checkpoint and one Sampler.run call", + "post-fit perform_update skipped (samples / latent variables never built)" + ], + "n_batch": 20, + "n_like_max": 40000, + "n_live": 150, + "number_of_cores": 1, + "production_reference": "euclid_strong_lens_modeling_pipeline/scripts/full_model.py source_pix_1 (n_live=150) / source_pix_2 (n_live=75): af.Nautilus(n_batch=20, **SettingsSearch.search_dict) with use_jax_vmap=True and number_of_cores=1 (SettingsSearch defaults)", + "production_stage": "source_pix_1", + "seed": 1, + "stage": "pix1", + "use_jax_vmap": true, + "version": "1.0.5" + }, + "capture_fit_status": "sampling complete (n_like_max or convergence); post-fit result skipped", + "capture_library_revisions": { + "PyAutoArray": { + "head": "7fa8d2714f7da43fec2b23c31bff580764831670", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoArray" + }, + "PyAutoFit": { + "head": "a736840127be7a3c21e15a5c945e94d8f1082983", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoFit" + }, + "PyAutoGalaxy": { + "head": "70a61e26cd715cefe7012a38285698091246a8a4", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy" + }, + "PyAutoLens": { + "head": "86054bbc19baa2f710a12e04a94fa27ab37cc354", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoLens" + }, + "PyAutoNerves": { + "head": "1fa613aa8d89a79613009fb66f5b4e2d21deb57a", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoNerves" + } + }, + "fingerprint_check": { + "fields": [ + "mesh", + "source_pixels", + "dataset_sha256", + "regularization_class", + "regularization_s0_fiducial", + "border_relocator", + "use_mixed_precision", + "log_evidence_s3_library" + ], + "not_identity": "the regularization coefficients: free per lane since the capture frees them", + "log_evidence_s3_library_rel_diff": 0.0, + "passed": true + }, + "timed_window_vs_capture_pdip": { + "reference": "the capture's own figure of merit (library PDIP, Fitness.call_wrap jax.jit(jax.vmap(call)) over parameter vectors) for the same lanes", + "compared_against": "this cell's jit(vmap) library-PDIP reference", + "n_compared": 20, + "max_rel_diff": 2.158793976551511e-06, + "max_abs_diff_nats": 0.3823636246379465, + "gated": false, + "note": "RECORDED, NOT GATED: proves the lane trees rebuilt here are the models the sampler evaluated (a wrong parameter mapping shows up as nats, not 1e-10)." + } + }, + "matched": { + "vmap_wall_per_lane_ms": 43.01403590499831, + "scalar_wall_per_lane_ms": 50.016585889989074, + "speedup_vmap_over_scalar": 1.162796860086711, + "note": "Both walls are the PRODUCTION nesting of their arm, measured in one process on the same B lanes with the SAME library Settings (no injection). A speedup below 1 means the batch is slower per lane than B sequential jitted calls." + }, + "solver_source": "library", + "solver": "pdip", + "certified_fallback": "pdip", + "certified_pass_budget": 16, + "certified_pass_budget_basis": "config default (Settings().certified_pass_budget)", + "certified_tau_rel": 1e-09, + "solver_used": "pdip", + "solver_check": { + "solver_used": "pdip", + "solver_used_source": "AbstractInversion.positive_only_solver_used on the fiducial S3 inversion, built eagerly on the JAX backend (AnalysisImaging(use_jax=True).fit_from) with the arms' Settings", + "reference_solver_used": "pdip", + "traced_solver_kwargs_jax": [ + "pdip" + ], + "observed_calls_jax": 1, + "report_rows": 0, + "report_vs_timed_arm_max_rel_diff": NaN + }, + "lanes_certified": [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null + ], + "lanes_passes": [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null + ], + "uncertified_lanes": null, + "per_lane_certification_note": "Not applicable: a library-PDIP row has no certificate or pass count.", + "gate": { + "pre_registered": true, + "gated": [ + "per lane: jit(vmap) arm vs jit(vmap) library PDIP <= lane_rtol relative", + "per lane: scalar jit arm vs scalar jit library PDIP <= lane_rtol relative" + ], + "recorded_not_gated": [ + "per lane: jit(vmap) arm vs scalar jit arm (rel_diff, abs_diff_nats)", + "per lane: jit(vmap) library PDIP vs scalar jit library PDIP", + "uncertified_lanes (certified_fallback=none rows)" + ], + "lanes_failed": 4, + "passed": false, + "policy_eligible": false, + "note": "Pre-registered before submission (module docstring; submit header). Phase 3 (results/notes/hst_gpu_residue_phase3_psf_2026_09.md) placed phase 2's ~2.5e-9 certified-vs-PDIP residual BETWEEN the jit(vmap) and scalar-jit compositions, not in the solver \u2014 so each arm is gated against the library-PDIP reference of its OWN composition, and the cross-composition difference is recorded with its nats. A certified_fallback=none row is policy-eligible only if every lane certifies AND passes the gate. Timing is never gated." + }, + "library_revisions": { + "PyAutoArray": { + "head": "3de624b5b91a4efa130dc3cb0a3a0f06f85025a3", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoArray", + "module_file": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/__init__.py" + }, + "PyAutoFit": { + "head": "dd9fbe0aab60c4a57702b1444ca031b317c91331", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoFit", + "module_file": "/mnt/ral/jnightin/PyAuto/PyAutoFit/autofit/__init__.py" + }, + "PyAutoGalaxy": { + "head": "70a61e26cd715cefe7012a38285698091246a8a4", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy", + "module_file": "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/__init__.py" + }, + "PyAutoLens": { + "head": "86054bbc19baa2f710a12e04a94fa27ab37cc354", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoLens", + "module_file": "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/__init__.py" + }, + "autoarray_file": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/__init__.py" + } + }, + "headline_arm_note": "`trace`, `hlo_census`, `command_buffers` and `trace_timing` above describe the scalar arm \u2014 the program phase 1 traced. Both arms' full blocks, the lane table and the matched comparison are under `vmap`." +} \ No newline at end of file diff --git a/results/breakdown/imaging/fixed_light_trace_delaunay_jitvmap20_captured_pix1_libpdip_fbon_b16_hpc_a100_fp64_fixed_light_trace.png b/results/breakdown/imaging/fixed_light_trace_delaunay_jitvmap20_captured_pix1_libpdip_fbon_b16_hpc_a100_fp64_fixed_light_trace.png new file mode 100644 index 0000000000000000000000000000000000000000..e1036147ff90322f9ad9122c1f4f9bf3e57c435a GIT binary patch literal 169083 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%0DU{!tdc2MHM!bV@|kKC0hdT-fH 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 G*Z&XY8SoJR literal 0 HcmV?d00001 diff --git a/results/breakdown/imaging/fixed_light_trace_delaunay_jitvmap20_captured_pix2_libcertified_fboff_b16_hpc_a100_fp64_fixed_light_trace.json b/results/breakdown/imaging/fixed_light_trace_delaunay_jitvmap20_captured_pix2_libcertified_fboff_b16_hpc_a100_fp64_fixed_light_trace.json new file mode 100644 index 000000000..af7f07f91 --- /dev/null +++ b/results/breakdown/imaging/fixed_light_trace_delaunay_jitvmap20_captured_pix2_libcertified_fboff_b16_hpc_a100_fp64_fixed_light_trace.json @@ -0,0 +1,6009 @@ +{ + "device": { + "backend": "gpu", + "device": "cuda:0", + "hostname": "euclid-ral-gpu-2", + "xla_flags": "--xla_disable_hlo_passes=constant_folding --xla_gpu_autotune_level=0 --xla_gpu_enable_triton_gemm=false", + "omp_num_threads": null, + "cpu_count": 124, + "jax_compilation_cache_dir": "/mnt/ral/jnightin/autolens_profiling_wt/certified-solver-phase-c1-lane-rate/output/jax_cache/fixed_light_lanerate_delaunay_pix2_time_20_certified_off_350768_34", + "autotune_cache_entries_at_start": 0, + "cache_fresh": true, + "nvidia_smi": "NVIDIA A100 80GB PCIe, 4737 MiB, 81920 MiB" + }, + "machine": { + "cpu_model": "AMD EPYC 7702 64-Core Processor", + "cpu_count_os": 124, + "nproc": 4, + "nproc_all": 124, + "nproc_note": "GNU nproc honours OMP_NUM_THREADS, so `nproc` can print 1 on a multi-core host; `nproc_all` is the core count.", + "ram_total": "928298204 kB", + "kernel": "5.14.0-687.50.1.el9_8.x86_64", + "platform": "Linux-5.14.0-687.50.1.el9_8.x86_64-x86_64-with-glibc2.34", + "python": "3.12.4", + "jax_thread_env": { + "NPROC": null + }, + "blas_thread_env": { + "OMP_NUM_THREADS": null, + "OPENBLAS_NUM_THREADS": null, + "MKL_NUM_THREADS": null, + "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" + }, + "precision": "fp64", + "configuration": { + "pixel_scale_arcsec": 0.05, + "mask_radius_arcsec": 3.5, + "image_pixels_masked": 15361, + "over_sampled_pixels": 62752, + "mesh": "delaunay", + "mesh_shape": null, + "source_pixels": 1500, + "source_pixels_requested": null, + "dataset": "hst", + "dataset_sha256": { + "data.fits": "e4e833a28e9c6f6fb023cd85c0d3dde74068720256bc77a240633500e5b04fac", + "noise_map.fits": "315c6266a0acd3ac9c8da82fcd2b45a08697362481fd7a35072bab1658530ba3", + "psf.fits": "8389ba0e8bf4a09b4a561cfc246181a2fb944ed396754cd0ff76fdd22910d303" + }, + "cell_source_sha256": "06a162fcdae6b329384ec33322f443df07215d86e56f0505ac15b3d3473eb432", + "inversion_path": "dense", + "pass_budget": 7, + "pass_budget_basis": "phase 3 (autolens_profiling#255): the smallest ZERO-fallback budget per mesh, the budget a production run fixes. NOT phase 0's certifying budget (2 for Delaunay), which falls back on 67.5 % of a graded draw set and is not a production cost.", + "border_relocator_mode": "cell", + "border_relocator": true, + "border_relocator_note": "'cell' is use_border_relocator=True, which every profiling cell in this family forces; 'library' passes None and takes the shipped config default, which is what production runs. The resolved boolean is what this leg actually ran.", + "routes_selected": [ + "b", + "d" + ], + "trace_calls": 10, + "command_buffers_traced": "off", + "use_mixed_precision": false, + "tau_rel": 1e-09, + "regularization": { + "scheme": "adapt_split", + "inner_coefficient": 0.1, + "outer_coefficient": 10.0, + "signal_scale": 0.1 + }, + "thread_env": { + "n_threads": null, + "vars": [ + "OPENBLAS_NUM_THREADS", + "MKL_NUM_THREADS", + "OMP_NUM_THREADS", + "VECLIB_MAXIMUM_THREADS", + "NUMEXPR_NUM_THREADS" + ], + "set_to": null, + "preexisting": {}, + "overridden": {}, + "note": "Not pinned (legacy variant): recorded as found." + }, + "over_sample_size_lp_rule": { + "sub_size_list": [ + 4, + 2, + 2 + ], + "radial_list": [ + 0.3, + 0.6 + ], + "centre": [ + 0.0, + 0.0 + ] + }, + "vmap_batch": 20, + "lanes": "captured", + "arms": [ + "vmap", + "scalar" + ], + "fallback": "off", + "draw_seed": 0, + "vmap_composition": "jax.jit(jax.vmap(fn))", + "lane_rtol": 1e-09, + "vmap_flags_note": "Strict ProfileCLI.parse_cell_args rejects unknown flags. These keys record the exact batching program and prevent historical vmap(jit) artifacts from being mistaken for current jit(vmap) measurements.", + "solver_source": "library", + "solver": "certified", + "certified_fallback": "none", + "certified_pass_budget": 16, + "captured_pass": "time", + "batches": "/mnt/ral/jnightin/autolens_profiling_wt/certified-solver-phase-c1-lane-rate/results/breakdown/imaging/nautilus_batches_delaunay_pix2.npz" + }, + "solver_injection": { + "patched": null, + "part_v": "none \u2014 library mode selects the solver through al.Settings", + "part_b_route_d": { + "patched": "autoarray.inversion.inversion.inversion_util.reconstruction_positive_only_from", + "pass_budget": 7, + "fallback": true + }, + "note": "Library mode (phase B, #300): PART V's arms and references run the library's own positive-only solve, selected by Settings(positive_only_solver, certified_fallback, certified_pass_budget); nothing is injected. PART B's single-call route d (the fiducial d == b pin) still uses the phase-1 harness injection at the phase-3 budget and is not a phase-B row. The untimed certification report observes the library solve (library_solver_observed) without changing it." + }, + "routes": { + "b_s3_pdip": { + "label": "S3 PDIP (source-only)", + "status": "ok", + "solver": "library", + "ms": 50.90835499977402, + "log_likelihood": 29155.000175203175 + }, + "d_s3_certified_fallback": { + "label": "S3 certified active set, budget 7, PDIP fallback", + "status": "ok", + "solver": "harness-injected certified active set", + "pass_budget": 7, + "fallback": true, + "injected_solver_calls_jax": 1, + "injected_solver_calls_numpy": 0, + "ms": 31.573666099939146, + "log_likelihood": 29155.00017574728 + } + }, + "equivalence_pins": [ + { + "pin": "route d (certified, fallback) == route b (library PDIP)", + "route": "d_s3_certified_fallback", + "reference": "b_s3_pdip", + "expectation": "the certified active set returns the library's own positive solution", + "rtol": 1e-09, + "got": 29155.00017574728, + "reference_value": 29155.000175203175, + "rel_diff": 1.8662438109296258e-11, + "status": "PASS" + } + ], + "equivalence_rtol": 1e-09, + "reference": { + "log_evidence_s0_library": 29155.00017433923, + "log_evidence_s3_library": 29155.000174339304, + "s3": { + "n_params": 1500, + "n_mapper": 1500, + "n_funcs": 0, + "edge_zeroed_pixels": 0, + "subtracted_light_flux": 5105.448603818575 + } + }, + "command_buffers": { + "wall_on_ms": 663.5241425999993, + "wall_off_ms": 668.1186625999544, + "command_buffer_delta_ms": 4.594519999955082, + "command_buffer_delta_pct": 0.6924420235790659, + "traced": "off", + "compiler_option": "xla_gpu_enable_command_buffer", + "probe": { + "note": "Not taken in --vmap-batch mode: the CUPTI-inside-a-CUDA-graph probe is a phase-1 diagnostic about the JOIN, and this mode already compiles and times both the command-buffers ON and OFF executable of every arm." + }, + "note": "ONE lowering, TWO compilations, one process. wall_on_ms is the PRODUCTION program (CUDA graphs as XLA ships them) and is the number comparable to phase 5's row; wall_off_ms is the graph-less program the stage rows attribute. The delta is the launch overhead the graphs remove \u2014 it lands in device_idle and host_outside_span, not in any stage. Reconciliation is computed against wall_off_ms." + }, + "trace": { + "parser": "ProfileData.from_file(xplane) + as_text() + stack_frame_index(proto field 17)", + "stage_audit": { + "mixed_fusion": [ + { + "instruction": "loop_divide_gather_fusion", + "ms": 1.0171146450000002, + "opcode": "fusion", + "shape": "(f64[15361,1,1,1500]{3,2,1,0}, f64[15361,1,1,1500]{3,2,1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:133", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:133 (curvature_matrix_via_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:93 (InversionImagingMapping.curvature_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:389 (AbstractInversion.curvature_reg_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "loop_broadcast_fusion.2", + "ms": 0.22679108500000003, + "opcode": "fusion", + "shape": "f64[1500,180,180]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "input_reduce_fusion.5", + "ms": 0.12210502000000002, + "opcode": "fusion", + "shape": "f64[92,1500]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/inversion_imaging_util.py:123", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/inversion_imaging_util.py:123 (data_vector_via_blurred_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:67 (InversionImagingMapping.data_vector)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:699 (AbstractInversion.reconstruction)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "input_reduce_fusion.9", + "ms": 0.11475695499999994, + "opcode": "fusion", + "shape": "f64[15361]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:163", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:163 (mapped_reconstructed_data_via_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:120 (InversionImagingMapping._mapped_reconstructed_data_dict_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:196 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "loop_broadcast_fusion.3", + "ms": 0.110802515, + "opcode": "fusion", + "shape": "f64[15361,1500]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:342", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:342 (mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/abstract.py:283 (Mapper.mapping_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:91 (AbstractInversionImaging._mapping_matrix_for_convolution_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:137 (AbstractInversionImaging.operated_mapping_matrix_list)" + ] + }, + { + "instruction": "input_multiply_transpose_fusion", + "ms": 0.10967575499999999, + "opcode": "fusion", + "shape": "(f64[1500,1500]{1,0}, f64[1500,1500]{1,0}, f64[1500,1500]{1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:237 (active_set_search)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:293 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:274 (_certified_positive_only_from)" + ] + } + ], + "grids_and_structures": [ + { + "instruction": "loop_multiply_sine_fusion", + "ms": 0.0013459050000000012, + "opcode": "fusion", + "shape": "(f64[], f64[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/geometry/geometry_util.py:527", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/geometry/geometry_util.py:527 (transform_grid_2d_to_reference_frame)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/profiles/geometry_profiles.py:418 (EllProfile.transformed_to_reference_frame_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/structures/decorators/abstract.py:93 (AbstractMaker.evaluate_func)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/structures/decorators/abstract.py:112 (AbstractMaker.result)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/structures/decorators/to_grid.py:70 (to_grid..wrapper)" + ] + } + ], + "border_relocator": [ + { + "instruction": "eigh.45", + "ms": 0.07452502000000018, + "opcode": "custom-call", + "shape": "(f64[2,2]{0,1}, f64[2]{0}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:245", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:245 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:454 (BorderRelocator.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:176 (AbstractMesh.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:214 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "custom-call.2", + "ms": 0.007958630000000019, + "opcode": "custom-call", + "shape": "(f64[2,2]{1,0}, s8[4194304]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:242", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:242 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:454 (BorderRelocator.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:176 (AbstractMesh.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:214 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "loop_add_fusion.5", + "ms": 0.0033700850000000027, + "opcode": "fusion", + "shape": "f64[1500]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:308", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:308 (relocated_grid_via_ellipse_border_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:458 (BorderRelocator.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:176 (AbstractMesh.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:214 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "input_reduce_fusion.17", + "ms": 0.0019246300000000038, + "opcode": "fusion", + "shape": "f64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:256", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:256 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:454 (BorderRelocator.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:176 (AbstractMesh.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:214 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "loop_multiply_fusion.2", + "ms": 0.001547344999999998, + "opcode": "fusion", + "shape": "f64[2,2]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:245", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:245 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:454 (BorderRelocator.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:176 (AbstractMesh.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:214 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + } + ], + "mesh_construction": [ + { + "instruction": "input_concatenate_fusion.7", + "ms": 0.0020690949999999982, + "opcode": "fusion", + "shape": "f64[1500,2]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:820", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:820 (InterpolatorDelaunay.mesh_grid_xy)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:847 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + } + ], + "mesh_qhull_callback": [ + { + "instruction": "pure_callback.4", + "ms": 0.01063330499999998, + "opcode": "custom-call", + "shape": "(s32[3000,3]{1,0}, s32[3000,3]{1,0}, s32[1500]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:161", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:161 (_jax_delaunay_tables)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:405 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + } + ], + "other": [ + { + "instruction": "copy.80", + "ms": 0.04202898499999959, + "opcode": "copy", + "shape": "f64[1,1024,2]{2,1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "copy.48", + "ms": 0.014758169999999984, + "opcode": "copy", + "shape": "s32[21361]{0}", + "source": "", + "stack": [] + }, + { + "instruction": "copy.53", + "ms": 0.001986385000000001, + "opcode": "copy", + "shape": "s64[1500]{0}", + "source": "", + "stack": [] + }, + { + "instruction": "copy.78", + "ms": 0.0016490849999999948, + "opcode": "copy", + "shape": "s64[]", + "source": "", + "stack": [] + }, + { + "instruction": "copy.79", + "ms": 0.001626270000000001, + "opcode": "copy", + "shape": "s32[]", + "source": "", + "stack": [] + }, + { + "instruction": "copy.39", + "ms": 0.0016023799999999964, + "opcode": "copy", + "shape": "s32[]", + "source": "", + "stack": [] + } + ], + "mesh_seed_argmin": [ + { + "instruction": "input_reduce_fusion", + "ms": 0.1460623799999981, + "opcode": "fusion", + "shape": "(f64[1024]{0}, s64[1024]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:191", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:191 (_nearest_vertex_seed_from..argmin_chunk)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204 (_nearest_vertex_seed_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:351 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)" + ] + }, + { + "instruction": "loop_dynamic_update_slice_fusion", + "ms": 0.04125969999999815, + "opcode": "fusion", + "shape": "s32[21,1024]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204 (_nearest_vertex_seed_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:351 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "loop_add_fusion", + "ms": 0.03194319999999978, + "opcode": "fusion", + "shape": "s64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204 (_nearest_vertex_seed_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:351 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "loop_broadcast_fusion", + "ms": 0.0019674850000000006, + "opcode": "fusion", + "shape": "s32[21,1024]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204 (_nearest_vertex_seed_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:351 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "pdip_solve": [ + { + "instruction": "cholesky.50", + "ms": 6.764367869999967, + "opcode": "custom-call", + "shape": "(f64[1500,1500]{0,1}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:252 (active_set_search..body_fun)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:262 (active_set_search)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:293 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)" + ] + }, + { + "instruction": "triangular-solve.1", + "ms": 1.2165340000000164, + "opcode": "custom-call", + "shape": "(f64[1500,1]{0,1}, s8[0]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:154", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:154 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:252 (active_set_search..body_fun)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:262 (active_set_search)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:293 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)" + ] + }, + { + "instruction": "triangular-solve", + "ms": 1.0496069599999889, + "opcode": "custom-call", + "shape": "(f64[1500,1]{0,1}, s8[0]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:154", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:154 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:252 (active_set_search..body_fun)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:262 (active_set_search)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:293 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)" + ] + }, + { + "instruction": "cholesky.70", + "ms": 0.890877969999999, + "opcode": "custom-call", + "shape": "(f64[1500,1500]{0,1}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:297 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:274 (_certified_positive_only_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:496 (reconstruction_positive_only_from)" + ] + }, + { + "instruction": "cholesky.60", + "ms": 0.8628572700000018, + "opcode": "custom-call", + "shape": "(f64[1500,1500]{0,1}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:237 (active_set_search)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:293 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:274 (_certified_positive_only_from)" + ] + }, + { + "instruction": "input_transpose_fusion", + "ms": 0.2675752200000003, + "opcode": "fusion", + "shape": "f64[1500,1500]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:252 (active_set_search..body_fun)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:262 (active_set_search)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:293 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)" + ] + } + ], + "regularization_H": [ + { + "instruction": "input_scatter_fusion.10", + "ms": 0.0020737399999999997, + "opcode": "fusion", + "shape": "f64[1500,1500]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:615", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:615 (pixel_splitted_regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt_split.py:137 (AdaptSplit.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:332 (AbstractInversion.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "input_concatenate_fusion.9", + "ms": 0.0018556500000000014, + "opcode": "fusion", + "shape": "pred[3]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:91", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:91 (split_points_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:410 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + }, + { + "instruction": "input_concatenate_fusion.8", + "ms": 0.001854400000000002, + "opcode": "fusion", + "shape": "pred[3]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:93", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:93 (split_points_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:410 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + }, + { + "instruction": "input_concatenate_fusion.10", + "ms": 0.0018524550000000024, + "opcode": "fusion", + "shape": "pred[3]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:90", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:90 (split_points_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:410 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + }, + { + "instruction": "input_concatenate_fusion", + "ms": 0.0017614349999999991, + "opcode": "fusion", + "shape": "s32[1500,2]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:615", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:615 (pixel_splitted_regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt_split.py:137 (AdaptSplit.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:332 (AbstractInversion.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "input_concatenate_fusion.11", + "ms": 0.0014899199999999974, + "opcode": "fusion", + "shape": "pred[3]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:88", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:88 (split_points_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:410 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + } + ], + "mesh_locate_walk": [ + { + "instruction": "loop_reduce_fusion", + "ms": 0.02256263499999989, + "opcode": "fusion", + "shape": "(f64[21361]{0}, s64[21361]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:264", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:264 (_walk_from_seed..walk_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:292 (_walk_from_seed..body)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:264 (_walk_from_seed..walk_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:292 (_walk_from_seed..body)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)" + ] + }, + { + "instruction": "input_reduce_fusion.1", + "ms": 0.020915064999999518, + "opcode": "fusion", + "shape": "pred[196]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:288", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:288 (_walk_from_seed..cond)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:353 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)" + ] + }, + { + "instruction": "loop_or_select_fusion", + "ms": 0.019592430000000067, + "opcode": "fusion", + "shape": "(s32[21361]{0}, pred[21361]{0}, pred[21361]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:270", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:270 (_walk_from_seed..walk_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:292 (_walk_from_seed..body)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:353 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)" + ] + }, + { + "instruction": "loop_select_fusion", + "ms": 0.017461094999999923, + "opcode": "fusion", + "shape": "s32[21361]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:242", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:242 (_walk_from_seed..weights_of)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:262 (_walk_from_seed..walk_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:292 (_walk_from_seed..body)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:353 (pix_indexes_delaunay_walk_from)" + ] + }, + { + "instruction": "input_reduce_fusion.2", + "ms": 0.014385254999999984, + "opcode": "fusion", + "shape": "pred[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:288", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:288 (_walk_from_seed..cond)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:353 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)" + ] + }, + { + "instruction": "while.20", + "ms": 0.012820884999999917, + "opcode": "while", + "shape": "(s32[], s32[21361]{0}, pred[21361]{0}, pred[21361]{0}, s32[3000,3]{1,0}, /*index=5*/f64[1500,2]{1,0}, f64[21361,2]{1,0}, s32[3000,3]{1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:353 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "psf_convolution_mapping_matrix": [ + { + "instruction": "input_scatter_fusion", + "ms": 1.9828163449999996, + "opcode": "fusion", + "shape": "f64[1500,180,180]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "fft.19.0", + "ms": 1.7580253299999993, + "opcode": "fft", + "shape": "f64[1500,180,180]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "fft.15.0", + "ms": 1.3677472200000003, + "opcode": "fft", + "shape": "c128[1500,180,91]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "fft.17.0", + "ms": 0.979285875, + "opcode": "fft", + "shape": "c128[1500,91,180]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "input_transpose_fusion.2", + "ms": 0.5135930400000001, + "opcode": "fusion", + "shape": "c128[1500,91,180]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "wrapped_transpose", + "ms": 0.49977109499999994, + "opcode": "fusion", + "shape": "c128[1500,180,91]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + } + ], + "inversion_other": [ + { + "instruction": "cholesky.80", + "ms": 0.8955378100000003, + "opcode": "custom-call", + "shape": "(f64[1500,1500]{0,1}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986 (AbstractInversion._log_det_symmetric_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:1078 (AbstractInversion.log_det_curvature_reg_matrix_term)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:347 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/model/analysis.py:135 (AnalysisImaging.log_likelihood_function)" + ] + }, + { + "instruction": "cholesky.90", + "ms": 0.8903301400000003, + "opcode": "custom-call", + "shape": "(f64[1500,1500]{0,1}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986 (AbstractInversion._log_det_symmetric_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:1157 (AbstractInversion.log_det_regularization_matrix_term)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:348 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/model/analysis.py:135 (AnalysisImaging.log_likelihood_function)" + ] + }, + { + "instruction": "loop_reduce_window_fusion", + "ms": 0.0028718299999999967, + "opcode": "fusion", + "shape": "s64[6,16]{1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "loop_reduce_window_fusion.1", + "ms": 0.0027892500000000053, + "opcode": "fusion", + "shape": "s64[94,16]{1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "loop_broadcast_convert_fusion", + "ms": 0.0021918099999999967, + "opcode": "fusion", + "shape": "(s32[1500]{0}, s64[1500]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:527", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:527 (AbstractInversion.zeroed_ids_to_keep)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:567 (AbstractInversion.solve_ids_to_keep)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:684 (AbstractInversion.reconstruction)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "input_scatter_fusion.5", + "ms": 0.001951324999999996, + "opcode": "fusion", + "shape": "s64[1500]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:527", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:527 (AbstractInversion.zeroed_ids_to_keep)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:567 (AbstractInversion.solve_ids_to_keep)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:684 (AbstractInversion.reconstruction)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "mapping_matrix": [ + { + "instruction": "input_reduce_fusion.23", + "ms": 0.0028889349999999922, + "opcode": "fusion", + "shape": "f64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:93", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:93 (adaptive_pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/abstract.py:507 (Mapper.pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt.py:339 (Adapt.regularization_weights_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt_split.py:120 (AdaptSplit.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)" + ] + } + ], + "curvature_matrix_F": [ + { + "instruction": "cublas-lt-matmul.2", + "ms": 4.20931259, + "opcode": "custom-call", + "shape": "(f64[1500,1500]{1,0}, s8[4194304]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:134", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:134 (curvature_matrix_via_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:93 (InversionImagingMapping.curvature_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:389 (AbstractInversion.curvature_reg_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "chi_squared_evidence": [ + { + "instruction": "loop_multiply_fusion", + "ms": 0.0029892350000000007, + "opcode": "fusion", + "shape": "f64[15361]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/abstract_ndarray.py:300", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/abstract_ndarray.py:300 (AbstractNDArray.__pow__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/abstract_ndarray.py:60 (unwrap_array..wrapper)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/abstract_ndarray.py:35 (to_new_array..wrapper)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_util.py:78 (chi_squared_map_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:78 (AbstractFit.chi_squared_map)" + ] + } + ] + }, + "stage_audit_note": "The HLO instructions that contributed most of each stage's milliseconds, with their full source stack. A stage row is only as good as the rules that built it; this is how a reader checks a row against the HLO instead of trusting it.", + "untraced_wall_ms": 33.41252448501109, + "reconciliation_vs_untraced_pct": -11.077245589962654, + "wall_basis": "wall_ms is the TRACED run's wall, the run these kernel durations came from. untraced_wall_ms is the same executable without the profiler; the difference is the profiler's overhead and belongs in neither the stages nor the idle row.", + "calls": 200, + "call_split": "per-call (first-instruction recurrence)", + "call_blocks": 200, + "events": 93720, + "streams": [ + "Stream #14(MemcpyD2D,MemcpyD2H,Compute,MemcpyH2D,Memset)" + ], + "per_stage_ms": { + "border_relocator": { + "median_ms": 0.089342, + "min_ms": 0.08876700000000001, + "max_ms": 0.090048 + }, + "chi_squared_evidence": { + "median_ms": 0.002976, + "min_ms": 0.002848, + "max_ms": 0.003424 + }, + "curvature_matrix_F": { + "median_ms": 4.2077935, + "min_ms": 4.197525, + "max_ms": 4.283758 + }, + "grids_and_structures": { + "median_ms": 0.001312, + "min_ms": 0.001279, + "max_ms": 0.001408 + }, + "inversion_other": { + "median_ms": 1.7971385, + "min_ms": 1.783251, + "max_ms": 1.8153160000000002 + }, + "mapping_matrix": { + "median_ms": 0.00288, + "min_ms": 0.002879, + "max_ms": 0.002912 + }, + "memset": { + "median_ms": 0.021167999999999996, + "min_ms": 0.010048000000000001, + "max_ms": 0.05571100000000001 + }, + "mesh_construction": { + "median_ms": 0.00208, + "min_ms": 0.002047, + "max_ms": 0.002112 + }, + "mesh_locate_walk": { + "median_ms": 0.13025399999999995, + "min_ms": 0.12953799999999996, + "max_ms": 0.131037 + }, + "mesh_qhull_callback": { + "median_ms": 0.010591999999999999, + "min_ms": 0.010432, + "max_ms": 0.0112 + }, + "mesh_seed_argmin": { + "median_ms": 0.22123950000000026, + "min_ms": 0.2209210000000002, + "max_ms": 0.22160300000000024 + }, + "mixed_fusion": { + "median_ms": 1.9846054999999998, + "min_ms": 1.9805250000000005, + "max_ms": 1.9978459999999993 + }, + "other": { + "median_ms": 0.063648, + "min_ms": 0.0632, + "max_ms": 0.06412899999999998 + }, + "pdip_solve": { + "median_ms": 7.6036825000000015, + "min_ms": 2.432922, + "max_ms": 23.139356999999997 + }, + "psf_convolution_mapping_matrix": { + "median_ms": 7.100987999999999, + "min_ms": 7.088909, + "max_ms": 7.1149580000000014 + }, + "regularization_H": { + "median_ms": 0.01088, + "min_ms": 0.010719, + "max_ms": 0.011231000000000001 + } + }, + "stage_order": [ + "border_relocator", + "mesh_qhull_callback", + "mesh_seed_argmin", + "mesh_locate_walk", + "mesh_construction", + "mapping_matrix", + "psf_convolution_mapping_matrix", + "curvature_matrix_F", + "regularization_H", + "pdip_solve", + "chi_squared_evidence", + "grids_and_structures", + "inversion_other", + "mixed_fusion", + "other", + "memset" + ], + "mixed_fusion": { + "ms": 1.9846054999999998, + "constituent_stage_sets": { + "curvature_matrix_F + psf_convolution_mapping_matrix": 1.0171146450000002, + "pdip_solve + psf_convolution_mapping_matrix": 0.22679108500000003, + "data_vector_D + pdip_solve": 0.12580931000000017, + "mapped_reconstruction + pdip_solve": 0.11475695499999994, + "mapping_matrix + pdip_solve": 0.11315047499999997, + "curvature_reg_reduce_gather + inversion_other + mapped_reconstruction + pdip_solve + reconstruction_scatter": 0.10967575499999999, + "pdip_solve + regularization_H": 0.04405461000000002, + "inversion_other + pdip_solve + regularization_H": 0.024096890000000003, + "inversion_other + pdip_solve": 0.022986635000000033, + "inversion_other + mapping_matrix + mesh_construction + mesh_dual_areas + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin + pdip_solve": 0.021017250000000015, + "inversion_other + mesh_construction + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin + pdip_solve + regularization_H": 0.01916010500000003, + "inversion_other + mesh_construction + mesh_dual_areas + mesh_interpolation_weights + pdip_solve + regularization_H": 0.014659999999999998, + "pdip_solve + ray_trace_data_grid": 0.013721134999999936, + "border_relocator + ray_trace_data_grid": 0.012399254999999996, + "inversion_other + mapping_matrix + mesh_construction + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin": 0.011660539999999997, + "grids_and_structures + mass_profile_deflections + pdip_solve + ray_trace_data_grid": 0.009410924999999997, + "border_relocator + pdip_solve + ray_trace_data_grid": 0.00867048499999998, + "chi_squared_evidence + pdip_solve": 0.007627724999999989, + "inversion_other + mesh_construction + mesh_seed_argmin + pdip_solve + regularization_H": 0.007248719999999993, + "border_relocator + pdip_solve": 0.006865055000000029, + "inversion_other + mesh_dual_areas + mesh_locate_walk": 0.0067850600000000615, + "inversion_other + mesh_construction + pdip_solve + regularization_H": 0.006344695000000006, + "inversion_other + pdip_solve + ray_trace_data_grid": 0.005274520000000025, + "inversion_other + regularization_H": 0.004843810000000002, + "inversion_other + mapped_reconstruction + pdip_solve + reconstruction_scatter": 0.004793240000000001, + "inversion_other + mapped_reconstruction + pdip_solve": 0.003802355000000001, + "mapping_matrix + pdip_solve + regularization_H": 0.003430859999999997, + "inversion_other + mesh_construction + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin": 0.0031577149999999993, + "inversion_other + mesh_construction + mesh_dual_areas + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin": 0.0029710200000000004, + "inversion_other + mesh_construction + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin + regularization_H": 0.002703179999999992, + "inversion_other + mesh_dual_areas + mesh_locate_walk + pdip_solve": 0.0026049199999999954, + "inversion_other + mesh_locate_walk + mesh_seed_argmin": 0.002504130000000003, + "inversion_other + mesh_interpolation_weights": 0.0021409050000000054, + "chi_squared_evidence + inversion_other": 0.0019523150000000026, + "grids_and_structures + mass_profile_deflections + pdip_solve": 0.0013377399999999987 + }, + "example_kernels": { + "curvature_matrix_F + psf_convolution_mapping_matrix": [ + "loop_divide_gather_fusion" + ], + "pdip_solve + psf_convolution_mapping_matrix": [ + "loop_broadcast_fusion.2" + ], + "data_vector_D + pdip_solve": [ + "input_reduce_fusion.5", + "input_reduce_fusion.21" + ], + "mapped_reconstruction + pdip_solve": [ + "input_reduce_fusion.9" + ], + "mapping_matrix + pdip_solve": [ + "loop_broadcast_fusion.3", + "loop_divide_fusion" + ], + "curvature_reg_reduce_gather + inversion_other + mapped_reconstruction + pdip_solve + reconstruction_scatter": [ + "input_multiply_transpose_fusion" + ], + "pdip_solve + regularization_H": [ + "loop_select_fusion.2", + "input_transpose_fusion.3" + ], + "inversion_other + pdip_solve + regularization_H": [ + "input_transpose_fusion.4" + ], + "inversion_other + pdip_solve": [ + "input_reduce_fusion.7", + "loop_log_fusion", + "input_reduce_fusion.8", + "input_reduce_fusion.12" + ], + "inversion_other + mapping_matrix + mesh_construction + mesh_dual_areas + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin + pdip_solve": [ + "input_scatter_fusion.6", + "input_scatter_fusion.3" + ] + }, + "prorated_estimate_ms": { + "psf_convolution_mapping_matrix": 0.6219528650000001, + "curvature_matrix_F": 0.5085573225000001, + "pdip_solve": 0.39040009660714287, + "mapped_reconstruction": 0.08177939016666663, + "inversion_other": 0.06826507335714291, + "data_vector_D": 0.06290465500000009, + "mapping_matrix": 0.062289437083333316, + "regularization_H": 0.04229206560714287, + "reconstruction_scatter": 0.023133460999999998, + "curvature_reg_reduce_gather": 0.021935150999999996, + "ray_trace_data_grid": 0.020061261249999966, + "mesh_construction": 0.014364231523809527, + "mesh_locate_walk": 0.012632607107142884, + "border_relocator": 0.012522316666666672, + "mesh_interpolation_weights": 0.012398766273809531, + "mesh_seed_argmin": 0.011169434440476194, + "mesh_dual_areas": 0.008478576250000022, + "chi_squared_evidence": 0.0047900199999999955, + "grids_and_structures": 0.002798644583333332, + "mass_profile_deflections": 0.002798644583333332 + }, + "prorated_note": "ESTIMATE ONLY \u2014 a mixed fusion's time split equally across the stages its constituents span. Never summed into the measured table, never reconciled." + }, + "other_sources_ms": { + "copy.80": 0.04202898499999959, + "copy.48": 0.014758169999999984, + "copy.53": 0.001986385000000001, + "copy.78": 0.0016490849999999948, + "copy.79": 0.001626270000000001, + "copy.39": 0.0016023799999999964 + }, + "device_span_ms": 34.338307730000004, + "device_busy_ms": 27.877550139999997, + "device_idle_ms": 6.460757590000007, + "largest_idle_gaps": [ + { + "gap_ms": 5.386263, + "after": "pure_callback.4", + "before": "pure_callback.4" + }, + { + "gap_ms": 0.054718, + "after": "input_concatenate_fusion.7", + "before": "pure_callback.4" + }, + { + "gap_ms": 0.034976, + "after": "input_reduce_fusion.1", + "before": "input_reduce_fusion.2" + }, + { + "gap_ms": 0.034687, + "after": "pure_callback.4", + "before": "copy.79" + }, + { + "gap_ms": 0.024704, + "after": "while.26", + "before": "input_reduce_select_fusion" + }, + { + "gap_ms": 0.0216, + "after": "while.26", + "before": "input_reduce_select_fusion" + }, + { + "gap_ms": 0.020735, + "after": "while.26", + "before": "input_reduce_select_fusion" + }, + { + "gap_ms": 0.020607, + "after": "loop_dynamic_update_slice_fusion", + "before": "loop_add_fusion" + } + ], + "kernel_ms": 23.2505795, + "sum_ms": 29.711337090000008, + "wall_ms": 34.34299495498635, + "host_outside_span_ms": 0.004687224986348326, + "reconciliation_pct": -13.486470446322743, + "unjoined_ms": 0.0, + "unjoined_pct": 0.0, + "other_ms": 0.063648, + "other_pct": 0.18533037110893782, + "note": "Stage rows attribute the command-buffers-OFF program (see the module docstring): kernel times are the same, the launch overhead the CUDA graphs remove is not. sum_ms = kernel rows + device_idle_ms; the residual against wall_ms is host_outside_span_ms (dispatch before the first kernel, teardown after the last).", + "per_stage_ms_per_lane": { + "border_relocator": 0.089342, + "chi_squared_evidence": 0.002976, + "curvature_matrix_F": 4.2077935, + "grids_and_structures": 0.001312, + "inversion_other": 1.7971385, + "mapping_matrix": 0.00288, + "memset": 0.021167999999999996, + "mesh_construction": 0.00208, + "mesh_locate_walk": 0.13025399999999995, + "mesh_qhull_callback": 0.010591999999999999, + "mesh_seed_argmin": 0.22123950000000026, + "mixed_fusion": 1.9846054999999998, + "other": 0.063648, + "pdip_solve": 7.6036825000000015, + "psf_convolution_mapping_matrix": 7.100987999999999, + "regularization_H": 0.01088 + }, + "per_lane_divisor": 1, + "host_callback": { + "pure_callback_span_ms": 99.06805499999997, + "qhull_ms": 92.29713190000005, + "callback_body_ms_note": "the OUTERMOST matching body event, not a sum: under the probe the body appears twice (the wrapper and the timed re-implementation it calls) and summing them would count the same work twice", + "events_by_name": { + "pure_callback.4": { + "count": 200, + "ms": 99.06805499999997 + }, + "$callback.py:815 _wrapped_callback": { + "count": 200, + "ms": 97.33393749999995 + }, + "$callback.py:224 _callback": { + "count": 200, + "ms": 96.86582529999997 + }, + "$callback.py:74 pure_callback_impl": { + "count": 200, + "ms": 96.69217809999999 + }, + "$callback.py:69 __call__": { + "count": 200, + "ms": 92.60040819999999 + }, + "$delaunay.py:162 ": { + "count": 200, + "ms": 92.47195890000008 + }, + "$host_callback_probe.py:225 wrapped": { + "count": 200, + "ms": 92.29713190000005 + }, + "$host_callback_probe.py:160 _timed_tri_only": { + "count": 200, + "ms": 92.14158769999999 + }, + "ThenExecuteCallback:GetEventForComputeStreamSyncPoint": { + "count": 200, + "ms": 0.3772671000000001 + }, + "$callback.py:822 ": { + "count": 800, + "ms": 0.28150809999999954 + }, + "$__init__.py:132 _xla_gc_callback": { + "count": 2, + "ms": 0.000368 + } + }, + "note": "HOST milliseconds per traced BATCH (the whole invocation), aggregated by name because the events nest. Not a row of the device table: the device pays for them as the idle gaps largest_idle_gaps names." + }, + "host_callback_ms": 99.06805499999997 + }, + "hlo_census": { + "status": "excluded", + "reason": "The legacy census anchors PyAutoArray source line numbers that moved after the phase-1 run. No batched attribution is published from unsupported anchors; the device-event table and wall reconciliation remain valid." + }, + "stage_map_provenance": [ + { + "label": "log_det_curvature_reg", + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 850, + 882 + ], + "requires": { + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 884, + 896 + ] + }, + "function": null + }, + { + "label": "log_det_regularization", + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 850, + 882 + ], + "requires": { + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 897, + 943 + ] + }, + "function": null + }, + { + "label": "curvature_reg_add", + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 359, + 372 + ], + "requires": null, + "function": null + }, + { + "label": "curvature_reg_reduce_gather", + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 374, + 398 + ], + "requires": null, + "function": null + }, + { + "label": "edge_subset_gather", + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 606, + 614 + ], + "requires": null, + "function": null + }, + { + "label": "regularization_term", + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 786, + 849 + ], + "requires": null, + "function": null + }, + { + "label": "mapped_reconstruction", + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 722, + 785 + ], + "requires": null, + "function": null + }, + { + "label": "reconstruction_scatter", + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 583, + 605 + ], + "requires": null, + "function": null + }, + { + "label": "reconstruction_scatter", + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 615, + 721 + ], + "requires": null, + "function": null + }, + { + "label": "certified_active_set_solve", + "path": "likelihood_breakdown/active_set_steps.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "certified_active_set_solve", + "path": "likelihood_breakdown/library_solver_injection.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "pdip_solve", + "path": "PyAutoArray/autoarray/util/jax_nnls.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "pdip_solve", + "path": "PyAutoArray/autoarray/inversion/inversion/inversion_util.py", + "lines": [ + 256, + 488 + ], + "requires": null, + "function": null + }, + { + "label": "mapped_reconstruction", + "path": "PyAutoArray/autoarray/inversion/inversion/inversion_util.py", + "lines": [ + 156, + 200 + ], + "requires": null, + "function": null + }, + { + "label": "curvature_matrix_F", + "path": "PyAutoArray/autoarray/inversion/inversion/inversion_util.py", + "lines": [ + 12, + 155 + ], + "requires": null, + "function": null + }, + { + "label": "reconstruction_scatter", + "path": "PyAutoArray/autoarray/inversion/inversion/inversion_util.py", + "lines": [ + 201, + 255 + ], + "requires": null, + "function": null + }, + { + "label": "data_vector_D", + "path": "PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py", + "lines": [ + 54, + 73 + ], + "requires": null, + "function": null + }, + { + "label": "curvature_matrix_F", + "path": "PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py", + "lines": [ + 74, + 110 + ], + "requires": null, + "function": null + }, + { + "label": "data_vector_D", + "path": "PyAutoArray/autoarray/inversion/inversion/imaging/inversion_imaging_util.py", + "lines": null, + "requires": null, + "function": "data_vector_via_blurred_mapping_matrix_from" + }, + { + "label": "curvature_matrix_F", + "path": "PyAutoArray/autoarray/inversion/inversion/imaging/inversion_imaging_util.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "psf_convolution_mapping_matrix", + "path": "likelihood_breakdown/psf_cube_injection.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "psf_convolution_mapping_matrix", + "path": "PyAutoArray/autoarray/operators/convolver.py", + "lines": [ + 1086, + 1300 + ], + "requires": null, + "function": null + }, + { + "label": "psf_convolution_mapping_matrix", + "path": "PyAutoArray/autoarray/operators/convolver.py", + "lines": [ + 632, + 642 + ], + "requires": null, + "function": null + }, + { + "label": "psf_convolution_mapping_matrix", + "path": "PyAutoArray/autoarray/operators/convolver.py", + "lines": [ + 670, + 691 + ], + "requires": null, + "function": null + }, + { + "label": "psf_convolution_mapping_matrix", + "path": "PyAutoArray/autoarray/operators/convolver.py", + "lines": null, + "requires": { + "path": "PyAutoArray/autoarray/operators/convolver.py", + "lines": [ + 1086, + 1300 + ] + }, + "function": null + }, + { + "label": "psf_convolution_mapping_matrix", + "path": "PyAutoArray/autoarray/operators/convolver.py", + "lines": null, + "requires": { + "path": "PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py", + "lines": [ + 119, + 150 + ] + }, + "function": null + }, + { + "label": "psf_convolution_image", + "path": "PyAutoArray/autoarray/operators/convolver.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "psf_convolution_mapping_matrix", + "path": "PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py", + "lines": [ + 119, + 150 + ], + "requires": null, + "function": null + }, + { + "label": "mesh_qhull_callback", + "path": "PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py", + "lines": [ + 139, + 172 + ], + "requires": null, + "function": null + }, + { + "label": "mesh_seed_argmin", + "path": "PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py", + "lines": [ + 173, + 207 + ], + "requires": null, + "function": null + }, + { + "label": "mesh_locate_walk", + "path": "PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py", + "lines": [ + 208, + 372 + ], + "requires": null, + "function": null + }, + { + "label": "mesh_dual_areas", + "path": "PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py", + "lines": [ + 373, + 396 + ], + "requires": null, + "function": null + }, + { + "label": "mesh_dual_areas", + "path": "PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py", + "lines": [ + 437, + 494 + ], + "requires": null, + "function": null + }, + { + "label": "mesh_dual_areas", + "path": "PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py", + "lines": [ + 605, + 615 + ], + "requires": null, + "function": null + }, + { + "label": "mesh_interpolation_weights", + "path": "PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py", + "lines": [ + 616, + 695 + ], + "requires": null, + "function": null + }, + { + "label": "mesh_interpolation_weights", + "path": "PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py", + "lines": [ + 896, + 1000 + ], + "requires": null, + "function": null + }, + { + "label": "mesh_construction", + "path": "PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "border_relocator", + "path": "PyAutoArray/autoarray/inversion/mesh/border_relocator.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "mesh_construction", + "path": "PyAutoArray/autoarray/inversion/mesh/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "mapping_matrix", + "path": "PyAutoArray/autoarray/inversion/mappers/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "mapping_matrix", + "path": "PyAutoArray/autoarray/inversion/mappings/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "mapping_matrix", + "path": "PyAutoArray/autoarray/inversion/linear_obj/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "regularization_H", + "path": "PyAutoArray/autoarray/inversion/regularization/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "chi_squared_evidence", + "path": "PyAutoArray/autoarray/fit/fit_util.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "chi_squared_evidence", + "path": "PyAutoArray/autoarray/fit/fit_dataset.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "ray_trace_mesh_grid", + "path": "PyAutoLens/autolens/lens/to_inversion.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "ray_trace_mesh_grid", + "path": "PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "mass_profile_deflections", + "path": "PyAutoGalaxy/autogalaxy/profiles/mass/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "light_profile_image", + "path": "PyAutoGalaxy/autogalaxy/profiles/light/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "light_profile_image", + "path": "PyAutoGalaxy/autogalaxy/operate/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "ray_trace_data_grid", + "path": "PyAutoLens/autolens/lens/tracer.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "ray_trace_data_grid", + "path": "PyAutoLens/autolens/lens/tracer_util.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "grids_and_structures", + "path": "PyAutoArray/autoarray/structures/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "grids_and_structures", + "path": "PyAutoArray/autoarray/operators/over_sampling/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "grids_and_structures", + "path": "PyAutoArray/autoarray/geometry/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "inversion_other", + "path": "PyAutoArray/autoarray/inversion/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "fit_imaging_other", + "path": "PyAutoLens/autolens/imaging/fit_imaging.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "fit_imaging_other", + "path": "PyAutoGalaxy/autogalaxy/imaging/fit_imaging.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "fit_imaging_other", + "path": "PyAutoArray/autoarray/fit/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "analysis_other", + "path": "PyAutoLens/autolens/analysis/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "analysis_other", + "path": "PyAutoGalaxy/autogalaxy/analysis/", + "lines": null, + "requires": null, + "function": null + } + ], + "trace_timing": { + "traced_wall_ms": 34.34299495498635, + "untraced_wall_ms": 33.41252448501109, + "profiler_overhead_ms": 0.930470469975262, + "profiler_overhead_pct": 2.7847954750999806 + }, + "jit_phases": { + "b_s3_pdip_library_likelihood_jit": { + "lower_s": 1.532768313998531, + "compile_s": 4.60332732200186, + "first_call_s": 0.12092058099733549, + "steady_per_call_s": 0.050908354999774016 + }, + "d_s3_certified_fallback_library_likelihood_jit": { + "lower_s": 0.49471232699943357, + "compile_s": 4.309052829998109, + "first_call_s": 0.05113923599856207, + "steady_per_call_s": 0.03157366609993915 + } + }, + "peak_bytes": { + "after_setup": 85108992, + "after_routes": 1181653248, + "after_all": 2399160064, + "note": "jax.devices()[0].memory_stats()['peak_bytes_in_use']; None on a backend that does not report it (CPU). Process-wide high-water marks." + }, + "note": "Every stage row is a MEASURED sum of GPU kernel durations joined to library source through the optimized HLO of ONE program \u2014 not arithmetic across compilations. The rows attribute the command-buffers-OFF program: kernel time is the same as production, the launch overhead the CUDA graphs remove is not, and command_buffers.* carries both walls and their delta. sum_ms = kernel rows + measured device_idle_ms; the residual against the wall is host_outside_span_ms and is reported, not absorbed. mixed_fusion.prorated_estimate_ms is an ESTIMATE and is never part of the table. No row may be quoted if reconciliation_pct is outside 5 % or unjoined_ms is non-zero.", + "vmap": { + "batch": 20, + "lanes_mode": "captured", + "arms": [ + "vmap", + "scalar" + ], + "draw_seed": 0, + "fallback": false, + "composition": "jax.jit(jax.vmap(fn))", + "composition_provenance": "Current Fitness._vmap after PyAutoFit#1638. Array 343376 used the retired jax.vmap(jax.jit(fn)) composition and is historical evidence only.", + "headline_arm": "scalar", + "lane_rtol": 1e-09, + "lanes": [ + { + "lane": 0, + "draw_name": "call00008_lane00", + "draw_kind": "captured", + "offsets": {}, + "log_likelihood_vmap": 19852.25135590449, + "log_likelihood_scalar": 19852.251354046493, + "log_likelihood_library_pdip": 19851.594186484792, + "log_likelihood_library_pdip_scalar": 19851.594184287453, + "rel_diff_vmap_vs_library_pdip": 3.31041131268299e-05, + "rel_diff_scalar_vs_library_pdip_scalar": 3.310413022450603e-05, + "abs_diff_nats": 1.8579958123154938e-06, + "rel_diff": 9.359118918957158e-11, + "rel_diff_scalar_vs_library_pdip": 3.310401953254246e-05, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 2.1973391994833946e-06, + "rel_diff_library_pdip_vmap_vs_scalar": 1.1068829934185285e-10, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "FAIL", + "certified": false, + "passes": 16, + "pdip_iter": null + }, + { + "lane": 1, + "draw_name": "call00008_lane01", + "draw_kind": "captured", + "offsets": {}, + "log_likelihood_vmap": -10958.375795077343, + "log_likelihood_scalar": -10958.37431027089, + "log_likelihood_library_pdip": -10958.375982893973, + "log_likelihood_library_pdip_scalar": -10958.374399828957, + "rel_diff_vmap_vs_library_pdip": 1.713909339946838e-08, + "rel_diff_scalar_vs_library_pdip_scalar": 8.172568640861326e-09, + "abs_diff_nats": 0.0014848064529360272, + "rel_diff": 1.35495139232867e-07, + "rel_diff_scalar_vs_library_pdip": 1.526342119511416e-07, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 0.0015830650154384784, + "rel_diff_library_pdip_vmap_vs_scalar": 1.4446166536007272e-07, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "FAIL", + "certified": true, + "passes": 0, + "pdip_iter": null + }, + { + "lane": 2, + "draw_name": "call00008_lane02", + "draw_kind": "captured", + "offsets": {}, + "log_likelihood_vmap": 25613.440564826713, + "log_likelihood_scalar": 25613.440570642913, + "log_likelihood_library_pdip": 25613.440564330856, + "log_likelihood_library_pdip_scalar": 25613.440570722487, + "rel_diff_vmap_vs_library_pdip": 1.9359230953811324e-11, + "rel_diff_scalar_vs_library_pdip_scalar": 3.1067091602864846e-12, + "abs_diff_nats": 5.816200427943841e-06, + "rel_diff": 2.2707610919753334e-10, + "rel_diff_scalar_vs_library_pdip": 2.4643534020730423e-10, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 6.391630449797958e-06, + "rel_diff_library_pdip_vmap_vs_scalar": 2.4954204930609476e-10, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": true, + "passes": 2, + "pdip_iter": null + }, + { + "lane": 3, + "draw_name": "call00008_lane03", + "draw_kind": "captured", + "offsets": {}, + "log_likelihood_vmap": 27440.97784675171, + "log_likelihood_scalar": 27440.977846751804, + "log_likelihood_library_pdip": 27440.97784675171, + "log_likelihood_library_pdip_scalar": 27440.9778467518, + "rel_diff_vmap_vs_library_pdip": 0.0, + "rel_diff_scalar_vs_library_pdip_scalar": 1.3257467818415742e-16, + "abs_diff_nats": 9.458744898438454e-11, + "rel_diff": 3.4469416327880925e-15, + "rel_diff_scalar_vs_library_pdip": 3.4469416327881043e-15, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 9.094947017729282e-11, + "rel_diff_library_pdip_vmap_vs_scalar": 3.3143669546039354e-15, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": true, + "passes": 4, + "pdip_iter": null + }, + { + "lane": 4, + "draw_name": "call00008_lane04", + "draw_kind": "captured", + "offsets": {}, + "log_likelihood_vmap": 19664.90800009171, + "log_likelihood_scalar": 19664.907997955226, + "log_likelihood_library_pdip": 19664.888364316696, + "log_likelihood_library_pdip_scalar": 19664.888362180216, + "rel_diff_vmap_vs_library_pdip": 9.985195262725188e-07, + "rel_diff_scalar_vs_library_pdip_scalar": 9.985195261960038e-07, + "abs_diff_nats": 2.1364830899983644e-06, + "rel_diff": 1.0864444879276922e-10, + "rel_diff_scalar_vs_library_pdip": 9.984108817152543e-07, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 2.1364794520195574e-06, + "rel_diff_library_pdip_vmap_vs_scalar": 1.086443722776715e-10, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "FAIL", + "certified": false, + "passes": 16, + "pdip_iter": null + }, + { + "lane": 5, + "draw_name": "call00008_lane05", + "draw_kind": "captured", + "offsets": {}, + "log_likelihood_vmap": 19661.61183973046, + "log_likelihood_scalar": 19661.61183717844, + "log_likelihood_library_pdip": 19661.77570330541, + "log_likelihood_library_pdip_scalar": 19661.775700753395, + "rel_diff_vmap_vs_library_pdip": 8.33411882141676e-06, + "rel_diff_scalar_vs_library_pdip_scalar": 8.334118822683521e-06, + "abs_diff_nats": 2.552020305301994e-06, + "rel_diff": 1.2979710546804408e-10, + "rel_diff_scalar_vs_library_pdip": 8.334248617440466e-06, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 2.552016667323187e-06, + "rel_diff_library_pdip_vmap_vs_scalar": 1.2979583869555583e-10, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "FAIL", + "certified": false, + "passes": 16, + "pdip_iter": null + }, + { + "lane": 6, + "draw_name": "call00008_lane06", + "draw_kind": "captured", + "offsets": {}, + "log_likelihood_vmap": 19673.735940325118, + "log_likelihood_scalar": 19673.735939245904, + "log_likelihood_library_pdip": 19673.099043038375, + "log_likelihood_library_pdip_scalar": 19673.099041959198, + "rel_diff_vmap_vs_library_pdip": 3.23740192304651e-05, + "rel_diff_scalar_vs_library_pdip_scalar": 3.237401923039178e-05, + "abs_diff_nats": 1.0792136890813708e-06, + "rel_diff": 5.485555424826634e-11, + "rel_diff_scalar_vs_library_pdip": 3.237396437313496e-05, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 1.0791773092933e-06, + "rel_diff_library_pdip_vmap_vs_scalar": 5.485548092812464e-11, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "FAIL", + "certified": false, + "passes": 16, + "pdip_iter": null + }, + { + "lane": 7, + "draw_name": "call00008_lane07", + "draw_kind": "captured", + "offsets": {}, + "log_likelihood_vmap": -138594.97140857653, + "log_likelihood_scalar": -138594.48732518905, + "log_likelihood_library_pdip": -138595.14906317642, + "log_likelihood_library_pdip_scalar": -138594.4617615121, + "rel_diff_vmap_vs_library_pdip": 1.2818240832248599e-06, + "rel_diff_scalar_vs_library_pdip_scalar": 1.8444948400579902e-07, + "abs_diff_nats": 0.48408338747685775, + "rel_diff": 3.4928040560591425e-06, + "rel_diff_scalar_vs_library_pdip": 4.77461146250172e-06, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 0.687301664322149, + "rel_diff_library_pdip_vmap_vs_scalar": 4.959084624209809e-06, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "FAIL", + "certified": true, + "passes": 1, + "pdip_iter": null + }, + { + "lane": 8, + "draw_name": "call00008_lane08", + "draw_kind": "captured", + "offsets": {}, + "log_likelihood_vmap": 29346.07130081181, + "log_likelihood_scalar": 29346.07130093639, + "log_likelihood_library_pdip": 29346.071300805423, + "log_likelihood_library_pdip_scalar": 29346.07130092734, + "rel_diff_vmap_vs_library_pdip": 2.1768810958616178e-13, + "rel_diff_scalar_vs_library_pdip_scalar": 3.0843281130302986e-13, + "abs_diff_nats": 1.2457894627004862e-07, + "rel_diff": 4.245166073254701e-12, + "rel_diff_scalar_vs_library_pdip": 4.4628541828598085e-12, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 1.2191594578325748e-07, + "rel_diff_library_pdip_vmap_vs_scalar": 4.154421371538238e-12, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": true, + "passes": 2, + "pdip_iter": null + }, + { + "lane": 9, + "draw_name": "call00008_lane09", + "draw_kind": "captured", + "offsets": {}, + "log_likelihood_vmap": 19678.02975001747, + "log_likelihood_scalar": 19678.029748169214, + "log_likelihood_library_pdip": 19677.044941109525, + "log_likelihood_library_pdip_scalar": 19677.04493926127, + "rel_diff_vmap_vs_library_pdip": 5.004861811788185e-05, + "rel_diff_scalar_vs_library_pdip_scalar": 5.0048618122398006e-05, + "abs_diff_nats": 1.8482569430489093e-06, + "rel_diff": 9.392489831055702e-11, + "rel_diff_scalar_vs_library_pdip": 5.004852418828274e-05, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 1.8482533050701022e-06, + "rel_diff_library_pdip_vmap_vs_scalar": 9.392941423751663e-11, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "FAIL", + "certified": false, + "passes": 16, + "pdip_iter": null + }, + { + "lane": 10, + "draw_name": "call00008_lane10", + "draw_kind": "captured", + "offsets": {}, + "log_likelihood_vmap": 28165.25603001419, + "log_likelihood_scalar": 28165.256030015546, + "log_likelihood_library_pdip": 28165.25603001418, + "log_likelihood_library_pdip_scalar": 28165.256030015516, + "rel_diff_vmap_vs_library_pdip": 2.58330959478225e-16, + "rel_diff_scalar_vs_library_pdip_scalar": 1.033323837912851e-15, + "abs_diff_nats": 1.356966095045209e-09, + "rel_diff": 4.817872394268663e-14, + "rel_diff_scalar_vs_library_pdip": 4.843705490216719e-14, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 1.3351382222026587e-09, + "rel_diff_library_pdip_vmap_vs_scalar": 4.740373106425204e-14, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": true, + "passes": 4, + "pdip_iter": null + }, + { + "lane": 11, + "draw_name": "call00008_lane11", + "draw_kind": "captured", + "offsets": {}, + "log_likelihood_vmap": 19840.56831757005, + "log_likelihood_scalar": 19840.568316419573, + "log_likelihood_library_pdip": 19843.379608087962, + "log_likelihood_library_pdip_scalar": 19843.379606936483, + "rel_diff_vmap_vs_library_pdip": 0.00014167397759026634, + "rel_diff_scalar_vs_library_pdip_scalar": 0.00014167397754807044, + "abs_diff_nats": 1.1504780559334904e-06, + "rel_diff": 5.7986144226593684e-11, + "rel_diff_scalar_vs_library_pdip": 0.00014167403556819544, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 1.1514785001054406e-06, + "rel_diff_library_pdip_vmap_vs_scalar": 5.8028346124212026e-11, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "FAIL", + "certified": false, + "passes": 16, + "pdip_iter": null + }, + { + "lane": 12, + "draw_name": "call00008_lane12", + "draw_kind": "captured", + "offsets": {}, + "log_likelihood_vmap": 27027.609847821266, + "log_likelihood_scalar": 27027.609847821306, + "log_likelihood_library_pdip": 27027.609847821266, + "log_likelihood_library_pdip_scalar": 27027.609847821303, + "rel_diff_vmap_vs_library_pdip": 0.0, + "rel_diff_scalar_vs_library_pdip_scalar": 1.3460231324838998e-16, + "abs_diff_nats": 4.001776687800884e-11, + "rel_diff": 1.4806254457322897e-15, + "rel_diff_scalar_vs_library_pdip": 1.4806254457322919e-15, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 3.637978807091713e-11, + "rel_diff_library_pdip_vmap_vs_scalar": 1.3460231324838999e-15, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": true, + "passes": 5, + "pdip_iter": null + }, + { + "lane": 13, + "draw_name": "call00008_lane13", + "draw_kind": "captured", + "offsets": {}, + "log_likelihood_vmap": 19663.530670551172, + "log_likelihood_scalar": 19663.530668672454, + "log_likelihood_library_pdip": 19663.70492707598, + "log_likelihood_library_pdip_scalar": 19663.704925197264, + "rel_diff_vmap_vs_library_pdip": 8.861835826760407e-06, + "rel_diff_scalar_vs_library_pdip_scalar": 8.861835827607088e-06, + "abs_diff_nats": 1.8787177396006882e-06, + "rel_diff": 9.554325574876662e-11, + "rel_diff_scalar_vs_library_pdip": 8.861931369169458e-06, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 1.8787177396006882e-06, + "rel_diff_library_pdip_vmap_vs_scalar": 9.554240906011973e-11, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "FAIL", + "certified": false, + "passes": 16, + "pdip_iter": null + }, + { + "lane": 14, + "draw_name": "call00008_lane14", + "draw_kind": "captured", + "offsets": {}, + "log_likelihood_vmap": 29194.371369654586, + "log_likelihood_scalar": 29194.371404864632, + "log_likelihood_library_pdip": 29194.371374830112, + "log_likelihood_library_pdip_scalar": 29194.371403214776, + "rel_diff_vmap_vs_library_pdip": 1.7727824407363037e-10, + "rel_diff_scalar_vs_library_pdip_scalar": 5.651281570815666e-11, + "abs_diff_nats": 3.521004691720009e-05, + "rel_diff": 1.2060560040464878e-09, + "rel_diff_scalar_vs_library_pdip": 1.0287777612136212e-09, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 2.8384663892211393e-05, + "rel_diff_library_pdip_vmap_vs_scalar": 9.7226494450522e-10, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": true, + "passes": 2, + "pdip_iter": null + }, + { + "lane": 15, + "draw_name": "call00008_lane15", + "draw_kind": "captured", + "offsets": {}, + "log_likelihood_vmap": -101907.25054610982, + "log_likelihood_scalar": -101907.2231845403, + "log_likelihood_library_pdip": -101907.25177512052, + "log_likelihood_library_pdip_scalar": -101907.22167418922, + "rel_diff_vmap_vs_library_pdip": 1.2060090676379144e-08, + "rel_diff_scalar_vs_library_pdip_scalar": 1.4820844456024411e-08, + "abs_diff_nats": 0.027361569518689066, + "rel_diff": 2.684948982383804e-07, + "rel_diff_scalar_vs_library_pdip": 2.805549135871966e-07, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 0.030100931297056377, + "rel_diff_library_pdip_vmap_vs_scalar": 2.953758409123645e-07, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "FAIL", + "certified": true, + "passes": 1, + "pdip_iter": null + }, + { + "lane": 16, + "draw_name": "call00008_lane16", + "draw_kind": "captured", + "offsets": {}, + "log_likelihood_vmap": -31483.763498118482, + "log_likelihood_scalar": -31483.760786620915, + "log_likelihood_library_pdip": -31483.763218991982, + "log_likelihood_library_pdip_scalar": -31483.760507525396, + "rel_diff_vmap_vs_library_pdip": 8.865728589101107e-09, + "rel_diff_scalar_vs_library_pdip_scalar": 8.864745320651108e-09, + "abs_diff_nats": 0.0027114975673612207, + "rel_diff": 8.612368724747384e-08, + "rel_diff_scalar_vs_library_pdip": 7.725795200463305e-08, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 0.0027114665863336995, + "rel_diff_library_pdip_vmap_vs_scalar": 8.612270397894788e-08, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "FAIL", + "certified": true, + "passes": 2, + "pdip_iter": null + }, + { + "lane": 17, + "draw_name": "call00008_lane17", + "draw_kind": "captured", + "offsets": {}, + "log_likelihood_vmap": -171697.76617092814, + "log_likelihood_scalar": -171697.72996317444, + "log_likelihood_library_pdip": -171697.77004656236, + "log_likelihood_library_pdip_scalar": -171697.73109022458, + "rel_diff_vmap_vs_library_pdip": 2.257242027371709e-08, + "rel_diff_scalar_vs_library_pdip_scalar": 6.564152797171631e-09, + "abs_diff_nats": 0.03620775369927287, + "rel_diff": 2.1088079444637198e-07, + "rel_diff_scalar_vs_library_pdip": 2.3345316548930005e-07, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 0.03895633778301999, + "rel_diff_library_pdip_vmap_vs_scalar": 2.26889065660099e-07, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "FAIL", + "certified": true, + "passes": 0, + "pdip_iter": null + }, + { + "lane": 18, + "draw_name": "call00008_lane18", + "draw_kind": "captured", + "offsets": {}, + "log_likelihood_vmap": 21885.39202787087, + "log_likelihood_scalar": 21885.392027844493, + "log_likelihood_library_pdip": 21885.392028055794, + "log_likelihood_library_pdip_scalar": 21885.392028030154, + "rel_diff_vmap_vs_library_pdip": 8.44973389030555e-12, + "rel_diff_scalar_vs_library_pdip_scalar": 8.483312074251625e-12, + "abs_diff_nats": 2.637534635141492e-08, + "rel_diff": 1.2051575917789325e-12, + "rel_diff_scalar_vs_library_pdip": 9.654891482072847e-12, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 2.5640474632382393e-08, + "rel_diff_library_pdip_vmap_vs_scalar": 1.1715794078325324e-12, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": false, + "passes": 16, + "pdip_iter": null + }, + { + "lane": 19, + "draw_name": "call00008_lane19", + "draw_kind": "captured", + "offsets": {}, + "log_likelihood_vmap": 17967.171624424118, + "log_likelihood_scalar": 17967.171648665033, + "log_likelihood_library_pdip": 17967.171622452668, + "log_likelihood_library_pdip_scalar": 17967.171650215292, + "rel_diff_vmap_vs_library_pdip": 1.0972510647863099e-10, + "rel_diff_scalar_vs_library_pdip_scalar": 8.628287274168886e-11, + "abs_diff_nats": 2.4240915081463754e-05, + "rel_diff": 1.3491781319551686e-09, + "rel_diff_scalar_vs_library_pdip": 1.4589032404021197e-09, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 2.7762624085880816e-05, + "rel_diff_library_pdip_vmap_vs_scalar": 1.5451861108895316e-09, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": true, + "passes": 1, + "pdip_iter": null + } + ], + "lane_pins": [ + { + "pin": "lane 0: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 19852.25135590449, + "reference_value": 19851.594186484792, + "rel_diff": 3.31041131268299e-05, + "abs_diff_nats": 0.6571694196973112, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 0: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 19852.251354046493, + "reference_value": 19851.594184287453, + "rel_diff": 3.310413022450603e-05, + "abs_diff_nats": 0.6571697590406984, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 0: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 19852.25135590449, + "reference_value": 19852.251354046493, + "rel_diff": 9.359118918957158e-11, + "abs_diff_nats": 1.8579958123154938e-06, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 0: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 19851.594186484792, + "reference_value": 19851.594184287453, + "rel_diff": 1.1068829934185285e-10, + "abs_diff_nats": 2.1973391994833946e-06, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 1: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -10958.375795077343, + "reference_value": -10958.375982893973, + "rel_diff": 1.713909339946838e-08, + "abs_diff_nats": 0.00018781662947731093, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 1: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -10958.37431027089, + "reference_value": -10958.374399828957, + "rel_diff": 8.172568640861326e-09, + "abs_diff_nats": 8.955806697485968e-05, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 1: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -10958.375795077343, + "reference_value": -10958.37431027089, + "rel_diff": 1.35495139232867e-07, + "abs_diff_nats": 0.0014848064529360272, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 1: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -10958.375982893973, + "reference_value": -10958.374399828957, + "rel_diff": 1.4446166536007272e-07, + "abs_diff_nats": 0.0015830650154384784, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 2: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 25613.440564826713, + "reference_value": 25613.440564330856, + "rel_diff": 1.9359230953811324e-11, + "abs_diff_nats": 4.958565114066005e-07, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 2: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 25613.440570642913, + "reference_value": 25613.440570722487, + "rel_diff": 3.1067091602864846e-12, + "abs_diff_nats": 7.957351044751704e-08, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 2: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 25613.440564826713, + "reference_value": 25613.440570642913, + "rel_diff": 2.2707610919753334e-10, + "abs_diff_nats": 5.816200427943841e-06, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 2: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 25613.440564330856, + "reference_value": 25613.440570722487, + "rel_diff": 2.4954204930609476e-10, + "abs_diff_nats": 6.391630449797958e-06, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 3: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 27440.97784675171, + "reference_value": 27440.97784675171, + "rel_diff": 0.0, + "abs_diff_nats": 0.0, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 3: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 27440.977846751804, + "reference_value": 27440.9778467518, + "rel_diff": 1.3257467818415742e-16, + "abs_diff_nats": 3.637978807091713e-12, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 3: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 27440.97784675171, + "reference_value": 27440.977846751804, + "rel_diff": 3.4469416327880925e-15, + "abs_diff_nats": 9.458744898438454e-11, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 3: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 27440.97784675171, + "reference_value": 27440.9778467518, + "rel_diff": 3.3143669546039354e-15, + "abs_diff_nats": 9.094947017729282e-11, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 4: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 19664.90800009171, + "reference_value": 19664.888364316696, + "rel_diff": 9.985195262725188e-07, + "abs_diff_nats": 0.019635775013739476, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 4: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 19664.907997955226, + "reference_value": 19664.888362180216, + "rel_diff": 9.985195261960038e-07, + "abs_diff_nats": 0.019635775010101497, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 4: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 19664.90800009171, + "reference_value": 19664.907997955226, + "rel_diff": 1.0864444879276922e-10, + "abs_diff_nats": 2.1364830899983644e-06, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 4: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 19664.888364316696, + "reference_value": 19664.888362180216, + "rel_diff": 1.086443722776715e-10, + "abs_diff_nats": 2.1364794520195574e-06, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 5: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 19661.61183973046, + "reference_value": 19661.77570330541, + "rel_diff": 8.33411882141676e-06, + "abs_diff_nats": 0.16386357495139237, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 5: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 19661.61183717844, + "reference_value": 19661.775700753395, + "rel_diff": 8.334118822683521e-06, + "abs_diff_nats": 0.16386357495503034, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 5: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 19661.61183973046, + "reference_value": 19661.61183717844, + "rel_diff": 1.2979710546804408e-10, + "abs_diff_nats": 2.552020305301994e-06, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 5: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 19661.77570330541, + "reference_value": 19661.775700753395, + "rel_diff": 1.2979583869555583e-10, + "abs_diff_nats": 2.552016667323187e-06, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 6: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 19673.735940325118, + "reference_value": 19673.099043038375, + "rel_diff": 3.23740192304651e-05, + "abs_diff_nats": 0.6368972867421689, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 6: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 19673.735939245904, + "reference_value": 19673.099041959198, + "rel_diff": 3.237401923039178e-05, + "abs_diff_nats": 0.6368972867057892, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 6: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 19673.735940325118, + "reference_value": 19673.735939245904, + "rel_diff": 5.485555424826634e-11, + "abs_diff_nats": 1.0792136890813708e-06, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 6: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 19673.099043038375, + "reference_value": 19673.099041959198, + "rel_diff": 5.485548092812464e-11, + "abs_diff_nats": 1.0791773092933e-06, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 7: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -138594.97140857653, + "reference_value": -138595.14906317642, + "rel_diff": 1.2818240832248599e-06, + "abs_diff_nats": 0.1776545998873189, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 7: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -138594.48732518905, + "reference_value": -138594.4617615121, + "rel_diff": 1.8444948400579902e-07, + "abs_diff_nats": 0.025563676957972348, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 7: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -138594.97140857653, + "reference_value": -138594.48732518905, + "rel_diff": 3.4928040560591425e-06, + "abs_diff_nats": 0.48408338747685775, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 7: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -138595.14906317642, + "reference_value": -138594.4617615121, + "rel_diff": 4.959084624209809e-06, + "abs_diff_nats": 0.687301664322149, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 8: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 29346.07130081181, + "reference_value": 29346.071300805423, + "rel_diff": 2.1768810958616178e-13, + "abs_diff_nats": 6.388290785253048e-09, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 8: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 29346.07130093639, + "reference_value": 29346.07130092734, + "rel_diff": 3.0843281130302986e-13, + "abs_diff_nats": 9.051291272044182e-09, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 8: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 29346.07130081181, + "reference_value": 29346.07130093639, + "rel_diff": 4.245166073254701e-12, + "abs_diff_nats": 1.2457894627004862e-07, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 8: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 29346.071300805423, + "reference_value": 29346.07130092734, + "rel_diff": 4.154421371538238e-12, + "abs_diff_nats": 1.2191594578325748e-07, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 9: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 19678.02975001747, + "reference_value": 19677.044941109525, + "rel_diff": 5.004861811788185e-05, + "abs_diff_nats": 0.9848089079459896, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 9: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 19678.029748169214, + "reference_value": 19677.04493926127, + "rel_diff": 5.0048618122398006e-05, + "abs_diff_nats": 0.9848089079423517, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 9: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 19678.02975001747, + "reference_value": 19678.029748169214, + "rel_diff": 9.392489831055702e-11, + "abs_diff_nats": 1.8482569430489093e-06, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 9: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 19677.044941109525, + "reference_value": 19677.04493926127, + "rel_diff": 9.392941423751663e-11, + "abs_diff_nats": 1.8482533050701022e-06, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 10: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 28165.25603001419, + "reference_value": 28165.25603001418, + "rel_diff": 2.58330959478225e-16, + "abs_diff_nats": 7.275957614183426e-12, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 10: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 28165.256030015546, + "reference_value": 28165.256030015516, + "rel_diff": 1.033323837912851e-15, + "abs_diff_nats": 2.9103830456733704e-11, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 10: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 28165.25603001419, + "reference_value": 28165.256030015546, + "rel_diff": 4.817872394268663e-14, + "abs_diff_nats": 1.356966095045209e-09, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 10: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 28165.25603001418, + "reference_value": 28165.256030015516, + "rel_diff": 4.740373106425204e-14, + "abs_diff_nats": 1.3351382222026587e-09, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 11: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 19840.56831757005, + "reference_value": 19843.379608087962, + "rel_diff": 0.00014167397759026634, + "abs_diff_nats": 2.8112905179114023, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 11: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 19840.568316419573, + "reference_value": 19843.379606936483, + "rel_diff": 0.00014167397754807044, + "abs_diff_nats": 2.811290516910958, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 11: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 19840.56831757005, + "reference_value": 19840.568316419573, + "rel_diff": 5.7986144226593684e-11, + "abs_diff_nats": 1.1504780559334904e-06, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 11: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 19843.379608087962, + "reference_value": 19843.379606936483, + "rel_diff": 5.8028346124212026e-11, + "abs_diff_nats": 1.1514785001054406e-06, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 12: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 27027.609847821266, + "reference_value": 27027.609847821266, + "rel_diff": 0.0, + "abs_diff_nats": 0.0, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 12: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 27027.609847821306, + "reference_value": 27027.609847821303, + "rel_diff": 1.3460231324838998e-16, + "abs_diff_nats": 3.637978807091713e-12, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 12: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 27027.609847821266, + "reference_value": 27027.609847821306, + "rel_diff": 1.4806254457322897e-15, + "abs_diff_nats": 4.001776687800884e-11, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 12: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 27027.609847821266, + "reference_value": 27027.609847821303, + "rel_diff": 1.3460231324838999e-15, + "abs_diff_nats": 3.637978807091713e-11, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 13: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 19663.530670551172, + "reference_value": 19663.70492707598, + "rel_diff": 8.861835826760407e-06, + "abs_diff_nats": 0.17425652480960707, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 13: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 19663.530668672454, + "reference_value": 19663.704925197264, + "rel_diff": 8.861835827607088e-06, + "abs_diff_nats": 0.17425652480960707, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 13: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 19663.530670551172, + "reference_value": 19663.530668672454, + "rel_diff": 9.554325574876662e-11, + "abs_diff_nats": 1.8787177396006882e-06, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 13: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 19663.70492707598, + "reference_value": 19663.704925197264, + "rel_diff": 9.554240906011973e-11, + "abs_diff_nats": 1.8787177396006882e-06, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 14: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 29194.371369654586, + "reference_value": 29194.371374830112, + "rel_diff": 1.7727824407363037e-10, + "abs_diff_nats": 5.17552689416334e-06, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 14: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 29194.371404864632, + "reference_value": 29194.371403214776, + "rel_diff": 5.651281570815666e-11, + "abs_diff_nats": 1.6498561308253556e-06, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 14: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 29194.371369654586, + "reference_value": 29194.371404864632, + "rel_diff": 1.2060560040464878e-09, + "abs_diff_nats": 3.521004691720009e-05, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 14: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 29194.371374830112, + "reference_value": 29194.371403214776, + "rel_diff": 9.7226494450522e-10, + "abs_diff_nats": 2.8384663892211393e-05, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 15: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -101907.25054610982, + "reference_value": -101907.25177512052, + "rel_diff": 1.2060090676379144e-08, + "abs_diff_nats": 0.0012290106969885528, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 15: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -101907.2231845403, + "reference_value": -101907.22167418922, + "rel_diff": 1.4820844456024411e-08, + "abs_diff_nats": 0.001510351081378758, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 15: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -101907.25054610982, + "reference_value": -101907.2231845403, + "rel_diff": 2.684948982383804e-07, + "abs_diff_nats": 0.027361569518689066, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 15: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -101907.25177512052, + "reference_value": -101907.22167418922, + "rel_diff": 2.953758409123645e-07, + "abs_diff_nats": 0.030100931297056377, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 16: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -31483.763498118482, + "reference_value": -31483.763218991982, + "rel_diff": 8.865728589101107e-09, + "abs_diff_nats": 0.0002791264996631071, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 16: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -31483.760786620915, + "reference_value": -31483.760507525396, + "rel_diff": 8.864745320651108e-09, + "abs_diff_nats": 0.0002790955186355859, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 16: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -31483.763498118482, + "reference_value": -31483.760786620915, + "rel_diff": 8.612368724747384e-08, + "abs_diff_nats": 0.0027114975673612207, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 16: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -31483.763218991982, + "reference_value": -31483.760507525396, + "rel_diff": 8.612270397894788e-08, + "abs_diff_nats": 0.0027114665863336995, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 17: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -171697.76617092814, + "reference_value": -171697.77004656236, + "rel_diff": 2.257242027371709e-08, + "abs_diff_nats": 0.003875634225551039, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 17: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -171697.72996317444, + "reference_value": -171697.73109022458, + "rel_diff": 6.564152797171631e-09, + "abs_diff_nats": 0.0011270501418039203, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 17: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -171697.76617092814, + "reference_value": -171697.72996317444, + "rel_diff": 2.1088079444637198e-07, + "abs_diff_nats": 0.03620775369927287, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 17: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -171697.77004656236, + "reference_value": -171697.73109022458, + "rel_diff": 2.26889065660099e-07, + "abs_diff_nats": 0.03895633778301999, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 18: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 21885.39202787087, + "reference_value": 21885.392028055794, + "rel_diff": 8.44973389030555e-12, + "abs_diff_nats": 1.8492573872208595e-07, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 18: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 21885.392027844493, + "reference_value": 21885.392028030154, + "rel_diff": 8.483312074251625e-12, + "abs_diff_nats": 1.8566061044111848e-07, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 18: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 21885.39202787087, + "reference_value": 21885.392027844493, + "rel_diff": 1.2051575917789325e-12, + "abs_diff_nats": 2.637534635141492e-08, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 18: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 21885.392028055794, + "reference_value": 21885.392028030154, + "rel_diff": 1.1715794078325324e-12, + "abs_diff_nats": 2.5640474632382393e-08, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 19: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 17967.171624424118, + "reference_value": 17967.171622452668, + "rel_diff": 1.0972510647863099e-10, + "abs_diff_nats": 1.971449819393456e-06, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 19: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 17967.171648665033, + "reference_value": 17967.171650215292, + "rel_diff": 8.628287274168886e-11, + "abs_diff_nats": 1.5502591850236058e-06, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 19: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 17967.171624424118, + "reference_value": 17967.171648665033, + "rel_diff": 1.3491781319551686e-09, + "abs_diff_nats": 2.4240915081463754e-05, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 19: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 17967.171622452668, + "reference_value": 17967.171650215292, + "rel_diff": 1.5451861108895316e-09, + "abs_diff_nats": 2.7762624085880816e-05, + "within_rtol": false, + "status": "RECORDED" + } + ], + "lanes_failed": 12, + "arm_rows": { + "vmap": { + "arm": "vmap", + "program": "jax.jit(jax.vmap(fn))", + "stands_for": "Nautilus(use_jax_vmap=True) \u2014 Fitness._vmap", + "hlo_source": "jax.jit(jax.vmap(fn)).lower(batched_tree) \u2014 the exact current Fitness._vmap composition (PyAutoFit#1638)", + "batch_wall_ms": 264.23781140001665, + "wall_production_nesting_ms": 264.23781140001665, + "wall_aot_command_buffers_on_ms": 264.33929079976224, + "wall_aot_command_buffers_off_ms": 264.37640950025525, + "command_buffer_delta_ms": 0.03711870049301069, + "production_nesting_vs_aot_on_delta_ms": -0.1014793997455854, + "production_nesting_vs_aot_on_delta_pct": -0.0383898282538922, + "wall_per_lane_ms": 13.211890570000833, + "wall_per_lane_command_buffers_off_ms": 13.218820475012762, + "traced_batch_wall_ms": 269.8956337997515, + "untraced_batch_wall_ms": 264.49379679979756, + "traced_wall_per_lane_ms": 13.494781689987576, + "callback_count_per_call": 1.0, + "callback_count_per_lane": 0.05, + "callback_expectation": "B per batched call \u2014 the qhull pure_callback is vmap_method='sequential'", + "host_qhull_ms": 4.8631183002726175, + "host_tables_ms": 0.1748994993249653, + "host_qhull_ms_per_lane": 0.24315591501363087, + "host_tables_ms_per_lane": 0.008744974966248265, + "host_callback_probe": { + "calls": 10, + "qhull_ms_total": 48.631183002726175, + "tables_ms_total": 1.748994993249653, + "total_ms_total": 50.38017799597583, + "qhull_ms_mean": 4.8631183002726175, + "tables_ms_mean": 0.1748994993249653, + "total_ms_mean": 5.038017799597583, + "non_finite_calls": 0, + "n_points": [ + 1500 + ] + }, + "host_callback_records_first": [ + { + "n_points": 1500, + "qhull_ms": 4.685350999352522, + "tables_ms": 0.1956590022018645, + "total_ms": 4.881010001554387, + "finite": true + }, + { + "n_points": 1500, + "qhull_ms": 4.587711999192834, + "tables_ms": 0.17454800035920925, + "total_ms": 4.762259999552043, + "finite": true + }, + { + "n_points": 1500, + "qhull_ms": 4.908710001473082, + "tables_ms": 0.17608899725019, + "total_ms": 5.084798998723272, + "finite": true + }, + { + "n_points": 1500, + "qhull_ms": 4.993530001229374, + "tables_ms": 0.18240799909108318, + "total_ms": 5.175938000320457, + "finite": true + } + ], + "device_idle_ms": 17.68949599999999, + "device_idle_ms_per_lane": 0.8844747999999996, + "trace": { + "parser": "ProfileData.from_file(xplane) + as_text() + stack_frame_index(proto field 17)", + "stage_audit": { + "mixed_fusion": [ + { + "instruction": "input_multiply_transpose_fusion", + "ms": 1.6239525, + "opcode": "fusion", + "shape": "(f64[20,1500,1500]{2,1,0}, f64[20,1500,1500]{2,1,0}, f64[20,1500,1500]{2,1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986 (AbstractInversion._log_det_symmetric_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:1078 (AbstractInversion.log_det_curvature_reg_matrix_term)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:347 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/model/analysis.py:135 (AnalysisImaging.log_likelihood_function)" + ] + }, + { + "instruction": "loop_divide_gather_fusion", + "ms": 1.0188186000000001, + "opcode": "fusion", + "shape": "(f64[15361,1500]{1,0}, f64[15361,1,1,1500]{3,2,1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:133", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:133 (curvature_matrix_via_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:93 (InversionImagingMapping.curvature_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:389 (AbstractInversion.curvature_reg_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "input_transpose_fusion.4", + "ms": 0.5908464, + "opcode": "fusion", + "shape": "f64[20,1500,1500]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:297 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:274 (_certified_positive_only_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:496 (reconstruction_positive_only_from)" + ] + }, + { + "instruction": "loop_broadcast_fusion", + "ms": 0.34363069999999996, + "opcode": "fusion", + "shape": "f64[20,1500,1500]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:579", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:579 (pixel_splitted_regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt_split.py:137 (AdaptSplit.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:332 (AbstractInversion.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "loop_broadcast_fusion.4", + "ms": 0.2298658, + "opcode": "fusion", + "shape": "f64[1500,180,180]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:303 (AbstractInversion.operated_mapping_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:68 (InversionImagingMapping.data_vector)" + ] + }, + { + "instruction": "input_reduce_fusion.10", + "ms": 0.2058885, + "opcode": "fusion", + "shape": "f64[20,1500]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:946", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:946 (AbstractInversion.regularization_term)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:346 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/model/analysis.py:135 (AnalysisImaging.log_likelihood_function)", + "/mnt/ral/jnightin/autolens_profiling_wt/certified-solver-phase-c1-lane-rate/scripts/imaging/likelihood_breakdown/fixed_light_trace.py:1195 (_captured_likelihood_fn.._likelihood)" + ] + } + ], + "pdip_solve": [ + { + "instruction": "cholesky.50", + "ms": 113.18424869999059, + "opcode": "custom-call", + "shape": "(f64[20,1500,1500]{1,2,0}, s32[20]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:252 (active_set_search..body_fun)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:262 (active_set_search)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:293 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)" + ] + }, + { + "instruction": "triangular-solve", + "ms": 29.062185600000326, + "opcode": "custom-call", + "shape": "(f64[20,1500,1]{1,2,0}, s8[320]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:154", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:154 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:252 (active_set_search..body_fun)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:262 (active_set_search)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:293 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)" + ] + }, + { + "instruction": "triangular-solve.1", + "ms": 27.35376440000053, + "opcode": "custom-call", + "shape": "(f64[20,1500,1]{1,2,0}, s8[320]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:154", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:154 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:252 (active_set_search..body_fun)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:262 (active_set_search)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:293 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)" + ] + }, + { + "instruction": "input_transpose_fusion", + "ms": 14.266777999999997, + "opcode": "fusion", + "shape": "f64[20,1500,1500]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:252 (active_set_search..body_fun)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:262 (active_set_search)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:293 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)" + ] + }, + { + "instruction": "input_transpose_fusion.1", + "ms": 9.470944499999996, + "opcode": "fusion", + "shape": "f64[20,1500,1500]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:252 (active_set_search..body_fun)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:262 (active_set_search)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:293 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)" + ] + }, + { + "instruction": "cholesky.60", + "ms": 7.099412499999965, + "opcode": "custom-call", + "shape": "(f64[20,1500,1500]{1,2,0}, s32[20]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:237 (active_set_search)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:293 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:274 (_certified_positive_only_from)" + ] + } + ], + "other": [ + { + "instruction": "copy.82", + "ms": 0.04195490000000013, + "opcode": "copy", + "shape": "f64[1,1024,2]{2,1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "copy.68", + "ms": 0.035717900000000025, + "opcode": "copy", + "shape": "s32[20]{0}", + "source": "", + "stack": [] + }, + { + "instruction": "copy.69", + "ms": 0.034546699999999986, + "opcode": "copy", + "shape": "pred[20,1500]{1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "copy.67", + "ms": 0.0323582, + "opcode": "copy", + "shape": "pred[20]{0}", + "source": "", + "stack": [] + }, + { + "instruction": "copy.50", + "ms": 0.014662099999999994, + "opcode": "copy", + "shape": "s32[21361]{0}", + "source": "", + "stack": [] + }, + { + "instruction": "copy.80", + "ms": 0.0021151, + "opcode": "copy", + "shape": "s64[]", + "source": "", + "stack": [] + } + ], + "mesh_seed_argmin": [ + { + "instruction": "input_reduce_fusion", + "ms": 0.14568060000000024, + "opcode": "fusion", + "shape": "(f64[1024]{0}, s64[1024]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:191", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:191 (_nearest_vertex_seed_from..argmin_chunk)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204 (_nearest_vertex_seed_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:351 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)" + ] + }, + { + "instruction": "loop_dynamic_update_slice_fusion", + "ms": 0.038537099999999984, + "opcode": "fusion", + "shape": "s32[21,1024]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204 (_nearest_vertex_seed_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:351 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "loop_add_fusion", + "ms": 0.03182649999999993, + "opcode": "fusion", + "shape": "s64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204 (_nearest_vertex_seed_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:351 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "loop_broadcast_fusion.1", + "ms": 0.001968, + "opcode": "fusion", + "shape": "s32[21,1024]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204 (_nearest_vertex_seed_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:351 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "border_relocator": [ + { + "instruction": "eigh.45", + "ms": 0.07446929999999999, + "opcode": "custom-call", + "shape": "(f64[2,2]{0,1}, f64[2]{0}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:245", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:245 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:454 (BorderRelocator.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:176 (AbstractMesh.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:214 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "custom-call.3", + "ms": 0.007999899999999999, + "opcode": "custom-call", + "shape": "(f64[2,2]{1,0}, s8[4194304]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:242", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:242 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:454 (BorderRelocator.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:176 (AbstractMesh.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:214 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "loop_add_fusion.4", + "ms": 0.003232, + "opcode": "fusion", + "shape": "f64[1500]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:308", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:308 (relocated_grid_via_ellipse_border_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:458 (BorderRelocator.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:176 (AbstractMesh.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:214 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "input_reduce_fusion.17", + "ms": 0.0016064, + "opcode": "fusion", + "shape": "f64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:256", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:256 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:454 (BorderRelocator.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:176 (AbstractMesh.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:214 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "loop_multiply_fusion.2", + "ms": 0.001552, + "opcode": "fusion", + "shape": "f64[2,2]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:245", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:245 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:454 (BorderRelocator.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:176 (AbstractMesh.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:214 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + } + ], + "regularization_H": [ + { + "instruction": "input_scatter_fusion.10", + "ms": 0.0036256000000000005, + "opcode": "fusion", + "shape": "f64[20,1500,1500]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:615", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:615 (pixel_splitted_regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt_split.py:137 (AdaptSplit.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:332 (AbstractInversion.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "input_concatenate_fusion.7", + "ms": 0.0017472, + "opcode": "fusion", + "shape": "pred[3]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:94", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:94 (split_points_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:410 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + }, + { + "instruction": "wrapped_slice", + "ms": 0.0016127999999999997, + "opcode": "fusion", + "shape": "s32[1]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:94", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:94 (split_points_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:410 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + }, + { + "instruction": "wrapped_slice.1", + "ms": 0.0015680000000000002, + "opcode": "fusion", + "shape": "s32[1]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:90", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:90 (split_points_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:410 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + }, + { + "instruction": "loop_slice_fusion", + "ms": 0.0014719, + "opcode": "fusion", + "shape": "s32[1,1]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:94", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:94 (split_points_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:410 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + }, + { + "instruction": "loop_slice_fusion.1", + "ms": 0.0014688, + "opcode": "fusion", + "shape": "s32[1,1]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:90", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:90 (split_points_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:410 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + } + ], + "grids_and_structures": [ + { + "instruction": "loop_multiply_sine_fusion", + "ms": 0.0013312000000000003, + "opcode": "fusion", + "shape": "(f64[], f64[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/geometry/geometry_util.py:527", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/geometry/geometry_util.py:527 (transform_grid_2d_to_reference_frame)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/profiles/geometry_profiles.py:418 (EllProfile.transformed_to_reference_frame_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/structures/decorators/abstract.py:93 (AbstractMaker.evaluate_func)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/structures/decorators/abstract.py:112 (AbstractMaker.result)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/structures/decorators/to_grid.py:70 (to_grid..wrapper)" + ] + } + ], + "mesh_construction": [ + { + "instruction": "input_concatenate_fusion.6", + "ms": 0.0020543999999999996, + "opcode": "fusion", + "shape": "f64[1500,2]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:820", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:820 (InterpolatorDelaunay.mesh_grid_xy)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:847 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + } + ], + "mesh_qhull_callback": [ + { + "instruction": "pure_callback.4", + "ms": 0.010774299999999997, + "opcode": "custom-call", + "shape": "(s32[3000,3]{1,0}, s32[3000,3]{1,0}, s32[1500]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:161", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:161 (_jax_delaunay_tables)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:405 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + } + ], + "mesh_locate_walk": [ + { + "instruction": "loop_reduce_fusion", + "ms": 0.023209199999999992, + "opcode": "fusion", + "shape": "(f64[21361]{0}, s64[21361]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:264", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:264 (_walk_from_seed..walk_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:292 (_walk_from_seed..body)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:264 (_walk_from_seed..walk_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:292 (_walk_from_seed..body)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)" + ] + }, + { + "instruction": "input_reduce_fusion.1", + "ms": 0.021452699999999998, + "opcode": "fusion", + "shape": "pred[196]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:288", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:288 (_walk_from_seed..cond)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:353 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)" + ] + }, + { + "instruction": "loop_or_select_fusion", + "ms": 0.019353299999999997, + "opcode": "fusion", + "shape": "(s32[21361]{0}, pred[21361]{0}, pred[21361]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:270", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:270 (_walk_from_seed..walk_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:292 (_walk_from_seed..body)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:353 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)" + ] + }, + { + "instruction": "loop_select_fusion", + "ms": 0.017551699999999983, + "opcode": "fusion", + "shape": "s32[21361]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:242", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:242 (_walk_from_seed..weights_of)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:262 (_walk_from_seed..walk_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:292 (_walk_from_seed..body)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:353 (pix_indexes_delaunay_walk_from)" + ] + }, + { + "instruction": "input_reduce_fusion.2", + "ms": 0.014121500000000018, + "opcode": "fusion", + "shape": "pred[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:288", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:288 (_walk_from_seed..cond)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:353 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)" + ] + }, + { + "instruction": "while.36", + "ms": 0.012806400000000022, + "opcode": "while", + "shape": "(s32[], s32[21361]{0}, pred[21361]{0}, pred[21361]{0}, s32[3000,3]{1,0}, /*index=5*/f64[1500,2]{1,0}, f64[21361,2]{1,0}, s32[3000,3]{1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:353 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "mapping_matrix": [ + { + "instruction": "input_reduce_fusion.21", + "ms": 0.0028415999999999997, + "opcode": "fusion", + "shape": "f64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:93", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:93 (adaptive_pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/abstract.py:507 (Mapper.pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt.py:339 (Adapt.regularization_weights_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt_split.py:120 (AdaptSplit.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)" + ] + } + ], + "psf_convolution_mapping_matrix": [ + { + "instruction": "input_scatter_fusion", + "ms": 1.9846547, + "opcode": "fusion", + "shape": "f64[1500,180,180]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:303 (AbstractInversion.operated_mapping_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:68 (InversionImagingMapping.data_vector)" + ] + }, + { + "instruction": "fft.14.0", + "ms": 1.7616402000000002, + "opcode": "fft", + "shape": "f64[1500,180,180]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:303 (AbstractInversion.operated_mapping_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:68 (InversionImagingMapping.data_vector)" + ] + }, + { + "instruction": "fft.10.0", + "ms": 1.3667979000000001, + "opcode": "fft", + "shape": "c128[1500,180,91]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:303 (AbstractInversion.operated_mapping_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:68 (InversionImagingMapping.data_vector)" + ] + }, + { + "instruction": "fft.12.0", + "ms": 0.9807644999999998, + "opcode": "fft", + "shape": "c128[1500,91,180]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:303 (AbstractInversion.operated_mapping_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:68 (InversionImagingMapping.data_vector)" + ] + }, + { + "instruction": "input_transpose_fusion.5", + "ms": 0.5136603, + "opcode": "fusion", + "shape": "c128[1500,91,180]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:303 (AbstractInversion.operated_mapping_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:68 (InversionImagingMapping.data_vector)" + ] + }, + { + "instruction": "wrapped_transpose", + "ms": 0.5003963, + "opcode": "fusion", + "shape": "c128[1500,180,91]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:303 (AbstractInversion.operated_mapping_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:68 (InversionImagingMapping.data_vector)" + ] + } + ], + "curvature_matrix_F": [ + { + "instruction": "custom-call.4", + "ms": 4.207507799999999, + "opcode": "custom-call", + "shape": "(f64[1500,1500]{1,0}, s8[4194304]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:134", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:134 (curvature_matrix_via_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:93 (InversionImagingMapping.curvature_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:389 (AbstractInversion.curvature_reg_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "inversion_other": [ + { + "instruction": "cholesky.80", + "ms": 7.097033899999952, + "opcode": "custom-call", + "shape": "(f64[20,1500,1500]{1,2,0}, s32[20]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986 (AbstractInversion._log_det_symmetric_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:1078 (AbstractInversion.log_det_curvature_reg_matrix_term)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:347 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/model/analysis.py:135 (AnalysisImaging.log_likelihood_function)" + ] + }, + { + "instruction": "cholesky.90", + "ms": 7.071148899999997, + "opcode": "custom-call", + "shape": "(f64[20,1500,1500]{1,2,0}, s32[20]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986 (AbstractInversion._log_det_symmetric_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:1157 (AbstractInversion.log_det_regularization_matrix_term)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:348 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/model/analysis.py:135 (AnalysisImaging.log_likelihood_function)" + ] + }, + { + "instruction": "loop_reduce_window_fusion", + "ms": 0.0027808, + "opcode": "fusion", + "shape": "s64[6,16]{1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "loop_reduce_window_fusion.1", + "ms": 0.0025856000000000004, + "opcode": "fusion", + "shape": "s64[94,16]{1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "loop_broadcast_convert_fusion", + "ms": 0.0023424, + "opcode": "fusion", + "shape": "(s32[1500]{0}, s64[1500]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:527", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:527 (AbstractInversion.zeroed_ids_to_keep)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:567 (AbstractInversion.solve_ids_to_keep)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:684 (AbstractInversion.reconstruction)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "input_scatter_fusion.9", + "ms": 0.0019456, + "opcode": "fusion", + "shape": "s64[1500]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:527", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:527 (AbstractInversion.zeroed_ids_to_keep)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:567 (AbstractInversion.solve_ids_to_keep)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:684 (AbstractInversion.reconstruction)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "fit_imaging_other": [ + { + "instruction": "custom-call.5", + "ms": 0.1991013, + "opcode": "custom-call", + "shape": "(f64[20,15361]{1,0}, s8[4194304]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/abstract_ndarray.py:305", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/abstract_ndarray.py:305 (AbstractNDArray.__add__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/abstract_ndarray.py:57 (unwrap_array..wrapper)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/abstract_ndarray.py:35 (to_new_array..wrapper)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:58 (AbstractFit.residual_map)" + ] + } + ], + "chi_squared_evidence": [ + { + "instruction": "loop_divide_fusion", + "ms": 0.0100926, + "opcode": "fusion", + "shape": "f64[20,15361]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/abstract_ndarray.py:352", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/abstract_ndarray.py:352 (AbstractNDArray.__truediv__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/abstract_ndarray.py:57 (unwrap_array..wrapper)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/abstract_ndarray.py:35 (to_new_array..wrapper)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_util.py:78 (chi_squared_map_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:78 (AbstractFit.chi_squared_map)" + ] + } + ] + }, + "stage_audit_note": "The HLO instructions that contributed most of each stage's milliseconds, with their full source stack. A stage row is only as good as the rules that built it; this is how a reader checks a row against the HLO instead of trusting it.", + "untraced_wall_ms": 264.49379679979756, + "reconciliation_vs_untraced_pct": 1.9923600341322207, + "wall_basis": "wall_ms is the TRACED run's wall, the run these kernel durations came from. untraced_wall_ms is the same executable without the profiler; the difference is the profiler's overhead and belongs in neither the stages nor the idle row.", + "calls": 10, + "call_split": "per-call (first-instruction recurrence)", + "call_blocks": 10, + "events": 96180, + "streams": [ + "Stream #14(MemcpyH2D,MemcpyD2D,Compute,MemcpyD2H)" + ], + "per_stage_ms": { + "border_relocator": { + "median_ms": 0.08878250000000003, + "min_ms": 0.08854300000000002, + "max_ms": 0.08934100000000002 + }, + "chi_squared_evidence": { + "median_ms": 0.01008, + "min_ms": 0.00992, + "max_ms": 0.010272 + }, + "curvature_matrix_F": { + "median_ms": 4.198583, + "min_ms": 4.189575, + "max_ms": 4.248743 + }, + "fit_imaging_other": { + "median_ms": 0.198845, + "min_ms": 0.198429, + "max_ms": 0.200573 + }, + "grids_and_structures": { + "median_ms": 0.001312, + "min_ms": 0.00128, + "max_ms": 0.001408 + }, + "inversion_other": { + "median_ms": 14.1783035, + "min_ms": 14.163237999999998, + "max_ms": 14.192514000000015 + }, + "mapping_matrix": { + "median_ms": 0.002848, + "min_ms": 0.002816, + "max_ms": 0.002848 + }, + "mesh_construction": { + "median_ms": 0.002048, + "min_ms": 0.002048, + "max_ms": 0.00208 + }, + "mesh_locate_walk": { + "median_ms": 0.1333415, + "min_ms": 0.13305399999999998, + "max_ms": 0.133664 + }, + "mesh_qhull_callback": { + "median_ms": 0.0106875, + "min_ms": 0.01056, + "max_ms": 0.011392000000000001 + }, + "mesh_seed_argmin": { + "median_ms": 0.21802700000000014, + "min_ms": 0.21769200000000008, + "max_ms": 0.2182390000000001 + }, + "mixed_fusion": { + "median_ms": 4.54693, + "min_ms": 4.539423999999999, + "max_ms": 4.556482999999999 + }, + "other": { + "median_ms": 0.16678300000000001, + "min_ms": 0.1654670000000001, + "max_ms": 0.16780700000000004 + }, + "pdip_solve": { + "median_ms": 221.19712649999565, + "min_ms": 221.12503399999545, + "max_ms": 221.30660799999552 + }, + "psf_convolution_mapping_matrix": { + "median_ms": 7.106288, + "min_ms": 7.100065, + "max_ms": 7.124704000000001 + }, + "regularization_H": { + "median_ms": 0.013984, + "min_ms": 0.013887000000000002, + "max_ms": 0.01456 + } + }, + "stage_order": [ + "border_relocator", + "mesh_qhull_callback", + "mesh_seed_argmin", + "mesh_locate_walk", + "mesh_construction", + "mapping_matrix", + "psf_convolution_mapping_matrix", + "curvature_matrix_F", + "regularization_H", + "pdip_solve", + "chi_squared_evidence", + "grids_and_structures", + "inversion_other", + "fit_imaging_other", + "mixed_fusion", + "other" + ], + "mixed_fusion": { + "ms": 4.54693, + "constituent_stage_sets": { + "curvature_reg_reduce_gather + inversion_other + mapped_reconstruction + pdip_solve + reconstruction_scatter + regularization_H": 1.6239525, + "curvature_matrix_F + psf_convolution_mapping_matrix": 1.0188186000000001, + "pdip_solve + regularization_H": 0.9344771000000001, + "pdip_solve + psf_convolution_mapping_matrix": 0.2298658, + "inversion_other + pdip_solve": 0.22410910000000003, + "data_vector_D + pdip_solve + psf_convolution_mapping_matrix": 0.12079529999999998, + "mapping_matrix + pdip_solve": 0.110974, + "inversion_other + mesh_construction + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin + regularization_H": 0.07265830000000001, + "inversion_other + mapping_matrix + mesh_construction + mesh_dual_areas + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin + pdip_solve": 0.0218494, + "inversion_other + regularization_H": 0.0188511, + "inversion_other + mesh_construction + mesh_dual_areas + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin + pdip_solve + regularization_H": 0.017344000000000002, + "pdip_solve + ray_trace_data_grid": 0.013110299999999995, + "border_relocator + ray_trace_data_grid": 0.012505399999999998, + "inversion_other + mapping_matrix + mesh_construction + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin": 0.010847299999999999, + "grids_and_structures + mass_profile_deflections + pdip_solve + ray_trace_data_grid": 0.0092126, + "border_relocator + pdip_solve + ray_trace_data_grid": 0.0085501, + "chi_squared_evidence + pdip_solve": 0.008371100000000001, + "inversion_other + mesh_construction + pdip_solve + regularization_H": 0.0082495, + "inversion_other + pdip_solve + regularization_H": 0.0081534, + "inversion_other + mesh_construction + mesh_dual_areas + mesh_interpolation_weights + pdip_solve + regularization_H": 0.007001499999999999, + "inversion_other + mesh_dual_areas + mesh_locate_walk": 0.006790400000000003, + "border_relocator + pdip_solve": 0.006691100000000001, + "inversion_other + mesh_construction + mesh_seed_argmin + pdip_solve + regularization_H": 0.005433500000000001, + "curvature_reg_reduce_gather + inversion_other + mapped_reconstruction + reconstruction_scatter + regularization_H": 0.005427199999999999, + "inversion_other + mapped_reconstruction": 0.0049440000000000005, + "inversion_other + pdip_solve + ray_trace_data_grid": 0.004905399999999999, + "inversion_other + mapped_reconstruction + reconstruction_scatter": 0.0039807, + "mapping_matrix + pdip_solve + regularization_H": 0.00376, + "data_vector_D + pdip_solve": 0.0037277999999999994, + "inversion_other + mesh_construction + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin + pdip_solve + regularization_H": 0.0030173, + "inversion_other + mesh_construction + mesh_dual_areas + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin": 0.0028928000000000005, + "inversion_other + mesh_construction + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin": 0.0026367999999999995, + "inversion_other + mesh_dual_areas + mesh_locate_walk + pdip_solve": 0.0025984000000000007, + "inversion_other + mesh_locate_walk + mesh_seed_argmin": 0.0024895, + "inversion_other + mesh_construction + mesh_locate_walk + mesh_seed_argmin": 0.0024384000000000003, + "chi_squared_evidence + inversion_other": 0.0024159999999999997, + "inversion_other + mesh_interpolation_weights": 0.0021632, + "grids_and_structures + mass_profile_deflections + pdip_solve": 0.001328 + }, + "example_kernels": { + "curvature_reg_reduce_gather + inversion_other + mapped_reconstruction + pdip_solve + reconstruction_scatter + regularization_H": [ + "input_multiply_transpose_fusion" + ], + "curvature_matrix_F + psf_convolution_mapping_matrix": [ + "loop_divide_gather_fusion" + ], + "pdip_solve + regularization_H": [ + "loop_broadcast_fusion", + "input_transpose_fusion.4" + ], + "pdip_solve + psf_convolution_mapping_matrix": [ + "loop_broadcast_fusion.4" + ], + "inversion_other + pdip_solve": [ + "input_reduce_fusion.6", + "input_reduce_fusion.7", + "input_transpose_fusion.2", + "input_reduce_fusion.10" + ], + "data_vector_D + pdip_solve + psf_convolution_mapping_matrix": [ + "input_reduce_fusion.4" + ], + "mapping_matrix + pdip_solve": [ + "loop_divide_fusion.2", + "loop_divide_fusion.1", + "loop_broadcast_fusion.3" + ], + "inversion_other + mesh_construction + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin + regularization_H": [ + "input_scatter_fusion.3" + ], + "inversion_other + mapping_matrix + mesh_construction + mesh_dual_areas + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin + pdip_solve": [ + "input_scatter_fusion.1", + "input_scatter_fusion.4" + ], + "inversion_other + regularization_H": [ + "loop_reduce_slice_fusion.2", + "loop_reduce_slice_fusion.1", + "loop_reduce_slice_fusion", + "loop_reduce_fusion.3" + ] + }, + "prorated_estimate_ms": { + "pdip_solve": 1.0980849261904762, + "regularization_H": 0.7714041745238095, + "psf_convolution_mapping_matrix": 0.6646073, + "curvature_matrix_F": 0.5094093000000001, + "inversion_other": 0.4325915261904762, + "mapped_reconstruction": 0.27554309, + "reconstruction_scatter": 0.27307109, + "curvature_reg_reduce_gather": 0.27174419, + "mapping_matrix": 0.06127939166666667, + "data_vector_D": 0.04212899999999999, + "mesh_construction": 0.025182902857142857, + "mesh_locate_walk": 0.024609811190476193, + "mesh_seed_argmin": 0.022783444523809527, + "mesh_interpolation_weights": 0.022505827857142856, + "ray_trace_data_grid": 0.019596166666666665, + "border_relocator": 0.012448283333333332, + "mesh_dual_areas": 0.009461291666666668, + "chi_squared_evidence": 0.00539355, + "grids_and_structures": 0.0027458166666666666, + "mass_profile_deflections": 0.0027458166666666666 + }, + "prorated_note": "ESTIMATE ONLY \u2014 a mixed fusion's time split equally across the stages its constituents span. Never summed into the measured table, never reconciled." + }, + "other_sources_ms": { + "copy.82": 0.04195490000000013, + "copy.68": 0.035717900000000025, + "copy.69": 0.034546699999999986, + "copy.67": 0.0323582, + "copy.50": 0.014662099999999994, + "copy.80": 0.0021151, + "copy.59": 0.0020223999999999997, + "copy.65": 0.0016736, + "copy.81": 0.0016511000000000002 + }, + "device_span_ms": 269.7817207, + "device_busy_ms": 252.0922247, + "device_idle_ms": 17.68949599999999, + "largest_idle_gaps": [ + { + "gap_ms": 5.473302, + "after": "pure_callback.4", + "before": "pure_callback.4" + }, + { + "gap_ms": 0.052895, + "after": "input_reduce_fusion.19", + "before": "loop_broadcast_fusion" + }, + { + "gap_ms": 0.037088, + "after": "while.42", + "before": "loop_not_select_fusion.1" + }, + { + "gap_ms": 0.032895, + "after": "loop_reduce_fusion", + "before": "loop_or_select_fusion" + }, + { + "gap_ms": 0.028736, + "after": "input_concatenate_fusion.6", + "before": "pure_callback.4" + }, + { + "gap_ms": 0.028512, + "after": "while.42", + "before": "loop_not_select_fusion" + }, + { + "gap_ms": 0.026208, + "after": "pure_callback.4", + "before": "loop_select_fusion.4" + }, + { + "gap_ms": 0.02496, + "after": "while.36", + "before": "loop_add_fusion.1" + } + ], + "kernel_ms": 252.07396949999566, + "sum_ms": 269.7634654999956, + "wall_ms": 269.8956337997515, + "host_outside_span_ms": 0.11391309975152808, + "reconciliation_pct": -0.048970151126626116, + "unjoined_ms": 0.0, + "unjoined_pct": 0.0, + "other_ms": 0.16678300000000001, + "other_pct": 0.06179536795461622, + "note": "Stage rows attribute the command-buffers-OFF program (see the module docstring): kernel times are the same, the launch overhead the CUDA graphs remove is not. sum_ms = kernel rows + device_idle_ms; the residual against wall_ms is host_outside_span_ms (dispatch before the first kernel, teardown after the last).", + "per_stage_ms_per_lane": { + "border_relocator": 0.004439125000000001, + "chi_squared_evidence": 0.000504, + "curvature_matrix_F": 0.20992915, + "fit_imaging_other": 0.00994225, + "grids_and_structures": 6.56e-05, + "inversion_other": 0.708915175, + "mapping_matrix": 0.0001424, + "mesh_construction": 0.0001024, + "mesh_locate_walk": 0.006667075, + "mesh_qhull_callback": 0.000534375, + "mesh_seed_argmin": 0.010901350000000008, + "mixed_fusion": 0.22734649999999998, + "other": 0.00833915, + "pdip_solve": 11.059856324999782, + "psf_convolution_mapping_matrix": 0.35531440000000003, + "regularization_H": 0.0006992 + }, + "per_lane_divisor": 20, + "host_callback": { + "pure_callback_span_ms": 5.4927965, + "qhull_ms": 5.050177700000001, + "callback_body_ms_note": "the OUTERMOST matching body event, not a sum: under the probe the body appears twice (the wrapper and the timed re-implementation it calls) and summing them would count the same work twice", + "events_by_name": { + "pure_callback.4": { + "count": 10, + "ms": 5.4927965 + }, + "$callback.py:815 _wrapped_callback": { + "count": 10, + "ms": 5.3925152 + }, + "$callback.py:224 _callback": { + "count": 10, + "ms": 5.3665582999999994 + }, + "$callback.py:74 pure_callback_impl": { + "count": 10, + "ms": 5.355929300000001 + }, + "$callback.py:69 __call__": { + "count": 10, + "ms": 5.070614700000001 + }, + "$delaunay.py:162 ": { + "count": 10, + "ms": 5.0631347 + }, + "$host_callback_probe.py:225 wrapped": { + "count": 10, + "ms": 5.050177700000001 + }, + "$host_callback_probe.py:160 _timed_tri_only": { + "count": 10, + "ms": 5.0397848 + }, + "ThenExecuteCallback:GetEventForComputeStreamSyncPoint": { + "count": 10, + "ms": 0.025372 + }, + "$callback.py:822 ": { + "count": 40, + "ms": 0.015303 + } + }, + "note": "HOST milliseconds per traced BATCH (the whole invocation), aggregated by name because the events nest. Not a row of the device table: the device pays for them as the idle gaps largest_idle_gaps names." + }, + "host_callback_ms": 5.4927965 + }, + "hlo_census": { + "status": "excluded", + "reason": "The legacy census anchors PyAutoArray source line numbers that moved after the phase-1 run. No batched attribution is published from unsupported anchors; the device-event table and wall reconciliation remain valid." + }, + "trace_split": { + "expected_calls": 10, + "executions_per_invocation": 1, + "method": "per-call (first-instruction recurrence)", + "note": "DECIDED IN CODE: the scalar arm's trace is split by trace_calls * B, so every lane's execution is its own block and the per-stage median is taken over all of them. The vmap arm's is split by trace_calls, one block per batched execution, and per_stage_ms_per_lane divides those rows by B." + } + }, + "scalar": { + "arm": "scalar", + "program": "jax.jit(fn), called B times", + "stands_for": "Nautilus(use_jax_vmap=False, use_jax_jit=True). Plain use_jax_vmap=False is UNJITTED and is NOT this arm", + "hlo_source": "jax.jit(fn).lower(lane_trees[0]) \u2014 the same program phase 1 traced", + "batch_wall_ms": 662.8212979998352, + "wall_production_nesting_ms": 662.8212979998352, + "wall_aot_command_buffers_on_ms": 663.5241425999993, + "wall_aot_command_buffers_off_ms": 668.1186625999544, + "command_buffer_delta_ms": 4.594519999955082, + "production_nesting_vs_aot_on_delta_ms": -0.7028446001640987, + "production_nesting_vs_aot_on_delta_pct": -0.1059260025430308, + "wall_per_lane_ms": 33.14106489999176, + "wall_per_lane_command_buffers_off_ms": 33.40593312999772, + "traced_batch_wall_ms": 686.859899099727, + "untraced_batch_wall_ms": 668.2504897002218, + "traced_wall_per_lane_ms": 34.34299495498635, + "callback_count_per_call": 20.0, + "callback_count_per_lane": 1.0, + "callback_expectation": "1 per likelihood evaluation, B per batch", + "host_qhull_ms": 89.79388419938914, + "host_tables_ms": 2.300742802253808, + "host_qhull_ms_per_lane": 4.489694209969457, + "host_tables_ms_per_lane": 0.1150371401126904, + "host_callback_probe": { + "calls": 200, + "qhull_ms_total": 897.9388419938914, + "tables_ms_total": 23.00742802253808, + "total_ms_total": 920.9462700164295, + "qhull_ms_mean": 4.489694209969457, + "tables_ms_mean": 0.1150371401126904, + "total_ms_mean": 4.604731350082147, + "non_finite_calls": 0, + "n_points": [ + 1500 + ] + }, + "host_callback_records_first": [ + { + "n_points": 1500, + "qhull_ms": 4.679141002270626, + "tables_ms": 0.17886899877339602, + "total_ms": 4.858010001044022, + "finite": true + }, + { + "n_points": 1500, + "qhull_ms": 4.487923000851879, + "tables_ms": 0.11339800039422698, + "total_ms": 4.601321001246106, + "finite": true + }, + { + "n_points": 1500, + "qhull_ms": 4.545391999272397, + "tables_ms": 0.12810900079784915, + "total_ms": 4.673501000070246, + "finite": true + }, + { + "n_points": 1500, + "qhull_ms": 4.477353002585005, + "tables_ms": 0.12131999756093137, + "total_ms": 4.598673000145936, + "finite": true + } + ], + "device_idle_ms": 6.460757590000007, + "device_idle_ms_per_lane": 6.460757590000007, + "trace": { + "parser": "ProfileData.from_file(xplane) + as_text() + stack_frame_index(proto field 17)", + "stage_audit": { + "mixed_fusion": [ + { + "instruction": "loop_divide_gather_fusion", + "ms": 1.0171146450000002, + "opcode": "fusion", + "shape": "(f64[15361,1,1,1500]{3,2,1,0}, f64[15361,1,1,1500]{3,2,1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:133", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:133 (curvature_matrix_via_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:93 (InversionImagingMapping.curvature_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:389 (AbstractInversion.curvature_reg_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "loop_broadcast_fusion.2", + "ms": 0.22679108500000003, + "opcode": "fusion", + "shape": "f64[1500,180,180]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "input_reduce_fusion.5", + "ms": 0.12210502000000002, + "opcode": "fusion", + "shape": "f64[92,1500]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/inversion_imaging_util.py:123", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/inversion_imaging_util.py:123 (data_vector_via_blurred_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:67 (InversionImagingMapping.data_vector)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:699 (AbstractInversion.reconstruction)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "input_reduce_fusion.9", + "ms": 0.11475695499999994, + "opcode": "fusion", + "shape": "f64[15361]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:163", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:163 (mapped_reconstructed_data_via_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:120 (InversionImagingMapping._mapped_reconstructed_data_dict_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:196 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "loop_broadcast_fusion.3", + "ms": 0.110802515, + "opcode": "fusion", + "shape": "f64[15361,1500]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:342", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:342 (mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/abstract.py:283 (Mapper.mapping_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:91 (AbstractInversionImaging._mapping_matrix_for_convolution_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:137 (AbstractInversionImaging.operated_mapping_matrix_list)" + ] + }, + { + "instruction": "input_multiply_transpose_fusion", + "ms": 0.10967575499999999, + "opcode": "fusion", + "shape": "(f64[1500,1500]{1,0}, f64[1500,1500]{1,0}, f64[1500,1500]{1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:237 (active_set_search)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:293 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:274 (_certified_positive_only_from)" + ] + } + ], + "grids_and_structures": [ + { + "instruction": "loop_multiply_sine_fusion", + "ms": 0.0013459050000000012, + "opcode": "fusion", + "shape": "(f64[], f64[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/geometry/geometry_util.py:527", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/geometry/geometry_util.py:527 (transform_grid_2d_to_reference_frame)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/profiles/geometry_profiles.py:418 (EllProfile.transformed_to_reference_frame_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/structures/decorators/abstract.py:93 (AbstractMaker.evaluate_func)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/structures/decorators/abstract.py:112 (AbstractMaker.result)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/structures/decorators/to_grid.py:70 (to_grid..wrapper)" + ] + } + ], + "border_relocator": [ + { + "instruction": "eigh.45", + "ms": 0.07452502000000018, + "opcode": "custom-call", + "shape": "(f64[2,2]{0,1}, f64[2]{0}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:245", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:245 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:454 (BorderRelocator.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:176 (AbstractMesh.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:214 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "custom-call.2", + "ms": 0.007958630000000019, + "opcode": "custom-call", + "shape": "(f64[2,2]{1,0}, s8[4194304]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:242", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:242 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:454 (BorderRelocator.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:176 (AbstractMesh.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:214 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "loop_add_fusion.5", + "ms": 0.0033700850000000027, + "opcode": "fusion", + "shape": "f64[1500]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:308", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:308 (relocated_grid_via_ellipse_border_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:458 (BorderRelocator.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:176 (AbstractMesh.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:214 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "input_reduce_fusion.17", + "ms": 0.0019246300000000038, + "opcode": "fusion", + "shape": "f64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:256", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:256 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:454 (BorderRelocator.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:176 (AbstractMesh.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:214 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "loop_multiply_fusion.2", + "ms": 0.001547344999999998, + "opcode": "fusion", + "shape": "f64[2,2]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:245", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:245 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:454 (BorderRelocator.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:176 (AbstractMesh.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:214 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + } + ], + "mesh_construction": [ + { + "instruction": "input_concatenate_fusion.7", + "ms": 0.0020690949999999982, + "opcode": "fusion", + "shape": "f64[1500,2]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:820", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:820 (InterpolatorDelaunay.mesh_grid_xy)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:847 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + } + ], + "mesh_qhull_callback": [ + { + "instruction": "pure_callback.4", + "ms": 0.01063330499999998, + "opcode": "custom-call", + "shape": "(s32[3000,3]{1,0}, s32[3000,3]{1,0}, s32[1500]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:161", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:161 (_jax_delaunay_tables)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:405 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + } + ], + "other": [ + { + "instruction": "copy.80", + "ms": 0.04202898499999959, + "opcode": "copy", + "shape": "f64[1,1024,2]{2,1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "copy.48", + "ms": 0.014758169999999984, + "opcode": "copy", + "shape": "s32[21361]{0}", + "source": "", + "stack": [] + }, + { + "instruction": "copy.53", + "ms": 0.001986385000000001, + "opcode": "copy", + "shape": "s64[1500]{0}", + "source": "", + "stack": [] + }, + { + "instruction": "copy.78", + "ms": 0.0016490849999999948, + "opcode": "copy", + "shape": "s64[]", + "source": "", + "stack": [] + }, + { + "instruction": "copy.79", + "ms": 0.001626270000000001, + "opcode": "copy", + "shape": "s32[]", + "source": "", + "stack": [] + }, + { + "instruction": "copy.39", + "ms": 0.0016023799999999964, + "opcode": "copy", + "shape": "s32[]", + "source": "", + "stack": [] + } + ], + "mesh_seed_argmin": [ + { + "instruction": "input_reduce_fusion", + "ms": 0.1460623799999981, + "opcode": "fusion", + "shape": "(f64[1024]{0}, s64[1024]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:191", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:191 (_nearest_vertex_seed_from..argmin_chunk)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204 (_nearest_vertex_seed_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:351 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)" + ] + }, + { + "instruction": "loop_dynamic_update_slice_fusion", + "ms": 0.04125969999999815, + "opcode": "fusion", + "shape": "s32[21,1024]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204 (_nearest_vertex_seed_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:351 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "loop_add_fusion", + "ms": 0.03194319999999978, + "opcode": "fusion", + "shape": "s64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204 (_nearest_vertex_seed_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:351 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "loop_broadcast_fusion", + "ms": 0.0019674850000000006, + "opcode": "fusion", + "shape": "s32[21,1024]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204 (_nearest_vertex_seed_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:351 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "pdip_solve": [ + { + "instruction": "cholesky.50", + "ms": 6.764367869999967, + "opcode": "custom-call", + "shape": "(f64[1500,1500]{0,1}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:252 (active_set_search..body_fun)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:262 (active_set_search)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:293 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)" + ] + }, + { + "instruction": "triangular-solve.1", + "ms": 1.2165340000000164, + "opcode": "custom-call", + "shape": "(f64[1500,1]{0,1}, s8[0]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:154", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:154 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:252 (active_set_search..body_fun)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:262 (active_set_search)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:293 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)" + ] + }, + { + "instruction": "triangular-solve", + "ms": 1.0496069599999889, + "opcode": "custom-call", + "shape": "(f64[1500,1]{0,1}, s8[0]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:154", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:154 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:252 (active_set_search..body_fun)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:262 (active_set_search)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:293 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)" + ] + }, + { + "instruction": "cholesky.70", + "ms": 0.890877969999999, + "opcode": "custom-call", + "shape": "(f64[1500,1500]{0,1}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:297 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:274 (_certified_positive_only_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:496 (reconstruction_positive_only_from)" + ] + }, + { + "instruction": "cholesky.60", + "ms": 0.8628572700000018, + "opcode": "custom-call", + "shape": "(f64[1500,1500]{0,1}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:237 (active_set_search)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:293 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:274 (_certified_positive_only_from)" + ] + }, + { + "instruction": "input_transpose_fusion", + "ms": 0.2675752200000003, + "opcode": "fusion", + "shape": "f64[1500,1500]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:252 (active_set_search..body_fun)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:262 (active_set_search)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:293 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)" + ] + } + ], + "regularization_H": [ + { + "instruction": "input_scatter_fusion.10", + "ms": 0.0020737399999999997, + "opcode": "fusion", + "shape": "f64[1500,1500]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:615", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:615 (pixel_splitted_regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt_split.py:137 (AdaptSplit.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:332 (AbstractInversion.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "input_concatenate_fusion.9", + "ms": 0.0018556500000000014, + "opcode": "fusion", + "shape": "pred[3]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:91", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:91 (split_points_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:410 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + }, + { + "instruction": "input_concatenate_fusion.8", + "ms": 0.001854400000000002, + "opcode": "fusion", + "shape": "pred[3]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:93", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:93 (split_points_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:410 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + }, + { + "instruction": "input_concatenate_fusion.10", + "ms": 0.0018524550000000024, + "opcode": "fusion", + "shape": "pred[3]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:90", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:90 (split_points_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:410 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + }, + { + "instruction": "input_concatenate_fusion", + "ms": 0.0017614349999999991, + "opcode": "fusion", + "shape": "s32[1500,2]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:615", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:615 (pixel_splitted_regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt_split.py:137 (AdaptSplit.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:332 (AbstractInversion.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "input_concatenate_fusion.11", + "ms": 0.0014899199999999974, + "opcode": "fusion", + "shape": "pred[3]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:88", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:88 (split_points_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:410 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + } + ], + "mesh_locate_walk": [ + { + "instruction": "loop_reduce_fusion", + "ms": 0.02256263499999989, + "opcode": "fusion", + "shape": "(f64[21361]{0}, s64[21361]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:264", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:264 (_walk_from_seed..walk_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:292 (_walk_from_seed..body)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:264 (_walk_from_seed..walk_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:292 (_walk_from_seed..body)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)" + ] + }, + { + "instruction": "input_reduce_fusion.1", + "ms": 0.020915064999999518, + "opcode": "fusion", + "shape": "pred[196]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:288", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:288 (_walk_from_seed..cond)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:353 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)" + ] + }, + { + "instruction": "loop_or_select_fusion", + "ms": 0.019592430000000067, + "opcode": "fusion", + "shape": "(s32[21361]{0}, pred[21361]{0}, pred[21361]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:270", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:270 (_walk_from_seed..walk_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:292 (_walk_from_seed..body)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:353 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)" + ] + }, + { + "instruction": "loop_select_fusion", + "ms": 0.017461094999999923, + "opcode": "fusion", + "shape": "s32[21361]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:242", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:242 (_walk_from_seed..weights_of)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:262 (_walk_from_seed..walk_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:292 (_walk_from_seed..body)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:353 (pix_indexes_delaunay_walk_from)" + ] + }, + { + "instruction": "input_reduce_fusion.2", + "ms": 0.014385254999999984, + "opcode": "fusion", + "shape": "pred[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:288", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:288 (_walk_from_seed..cond)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:353 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)" + ] + }, + { + "instruction": "while.20", + "ms": 0.012820884999999917, + "opcode": "while", + "shape": "(s32[], s32[21361]{0}, pred[21361]{0}, pred[21361]{0}, s32[3000,3]{1,0}, /*index=5*/f64[1500,2]{1,0}, f64[21361,2]{1,0}, s32[3000,3]{1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:353 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "psf_convolution_mapping_matrix": [ + { + "instruction": "input_scatter_fusion", + "ms": 1.9828163449999996, + "opcode": "fusion", + "shape": "f64[1500,180,180]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "fft.19.0", + "ms": 1.7580253299999993, + "opcode": "fft", + "shape": "f64[1500,180,180]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "fft.15.0", + "ms": 1.3677472200000003, + "opcode": "fft", + "shape": "c128[1500,180,91]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "fft.17.0", + "ms": 0.979285875, + "opcode": "fft", + "shape": "c128[1500,91,180]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "input_transpose_fusion.2", + "ms": 0.5135930400000001, + "opcode": "fusion", + "shape": "c128[1500,91,180]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "wrapped_transpose", + "ms": 0.49977109499999994, + "opcode": "fusion", + "shape": "c128[1500,180,91]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + } + ], + "inversion_other": [ + { + "instruction": "cholesky.80", + "ms": 0.8955378100000003, + "opcode": "custom-call", + "shape": "(f64[1500,1500]{0,1}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986 (AbstractInversion._log_det_symmetric_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:1078 (AbstractInversion.log_det_curvature_reg_matrix_term)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:347 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/model/analysis.py:135 (AnalysisImaging.log_likelihood_function)" + ] + }, + { + "instruction": "cholesky.90", + "ms": 0.8903301400000003, + "opcode": "custom-call", + "shape": "(f64[1500,1500]{0,1}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986 (AbstractInversion._log_det_symmetric_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:1157 (AbstractInversion.log_det_regularization_matrix_term)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:348 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/model/analysis.py:135 (AnalysisImaging.log_likelihood_function)" + ] + }, + { + "instruction": "loop_reduce_window_fusion", + "ms": 0.0028718299999999967, + "opcode": "fusion", + "shape": "s64[6,16]{1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "loop_reduce_window_fusion.1", + "ms": 0.0027892500000000053, + "opcode": "fusion", + "shape": "s64[94,16]{1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "loop_broadcast_convert_fusion", + "ms": 0.0021918099999999967, + "opcode": "fusion", + "shape": "(s32[1500]{0}, s64[1500]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:527", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:527 (AbstractInversion.zeroed_ids_to_keep)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:567 (AbstractInversion.solve_ids_to_keep)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:684 (AbstractInversion.reconstruction)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "input_scatter_fusion.5", + "ms": 0.001951324999999996, + "opcode": "fusion", + "shape": "s64[1500]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:527", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:527 (AbstractInversion.zeroed_ids_to_keep)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:567 (AbstractInversion.solve_ids_to_keep)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:684 (AbstractInversion.reconstruction)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "mapping_matrix": [ + { + "instruction": "input_reduce_fusion.23", + "ms": 0.0028889349999999922, + "opcode": "fusion", + "shape": "f64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:93", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:93 (adaptive_pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/abstract.py:507 (Mapper.pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt.py:339 (Adapt.regularization_weights_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt_split.py:120 (AdaptSplit.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)" + ] + } + ], + "curvature_matrix_F": [ + { + "instruction": "cublas-lt-matmul.2", + "ms": 4.20931259, + "opcode": "custom-call", + "shape": "(f64[1500,1500]{1,0}, s8[4194304]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:134", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:134 (curvature_matrix_via_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:93 (InversionImagingMapping.curvature_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:389 (AbstractInversion.curvature_reg_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "chi_squared_evidence": [ + { + "instruction": "loop_multiply_fusion", + "ms": 0.0029892350000000007, + "opcode": "fusion", + "shape": "f64[15361]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/abstract_ndarray.py:300", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/abstract_ndarray.py:300 (AbstractNDArray.__pow__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/abstract_ndarray.py:60 (unwrap_array..wrapper)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/abstract_ndarray.py:35 (to_new_array..wrapper)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_util.py:78 (chi_squared_map_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:78 (AbstractFit.chi_squared_map)" + ] + } + ] + }, + "stage_audit_note": "The HLO instructions that contributed most of each stage's milliseconds, with their full source stack. A stage row is only as good as the rules that built it; this is how a reader checks a row against the HLO instead of trusting it.", + "untraced_wall_ms": 33.41252448501109, + "reconciliation_vs_untraced_pct": -11.077245589962654, + "wall_basis": "wall_ms is the TRACED run's wall, the run these kernel durations came from. untraced_wall_ms is the same executable without the profiler; the difference is the profiler's overhead and belongs in neither the stages nor the idle row.", + "calls": 200, + "call_split": "per-call (first-instruction recurrence)", + "call_blocks": 200, + "events": 93720, + "streams": [ + "Stream #14(MemcpyD2D,MemcpyD2H,Compute,MemcpyH2D,Memset)" + ], + "per_stage_ms": { + "border_relocator": { + "median_ms": 0.089342, + "min_ms": 0.08876700000000001, + "max_ms": 0.090048 + }, + "chi_squared_evidence": { + "median_ms": 0.002976, + "min_ms": 0.002848, + "max_ms": 0.003424 + }, + "curvature_matrix_F": { + "median_ms": 4.2077935, + "min_ms": 4.197525, + "max_ms": 4.283758 + }, + "grids_and_structures": { + "median_ms": 0.001312, + "min_ms": 0.001279, + "max_ms": 0.001408 + }, + "inversion_other": { + "median_ms": 1.7971385, + "min_ms": 1.783251, + "max_ms": 1.8153160000000002 + }, + "mapping_matrix": { + "median_ms": 0.00288, + "min_ms": 0.002879, + "max_ms": 0.002912 + }, + "memset": { + "median_ms": 0.021167999999999996, + "min_ms": 0.010048000000000001, + "max_ms": 0.05571100000000001 + }, + "mesh_construction": { + "median_ms": 0.00208, + "min_ms": 0.002047, + "max_ms": 0.002112 + }, + "mesh_locate_walk": { + "median_ms": 0.13025399999999995, + "min_ms": 0.12953799999999996, + "max_ms": 0.131037 + }, + "mesh_qhull_callback": { + "median_ms": 0.010591999999999999, + "min_ms": 0.010432, + "max_ms": 0.0112 + }, + "mesh_seed_argmin": { + "median_ms": 0.22123950000000026, + "min_ms": 0.2209210000000002, + "max_ms": 0.22160300000000024 + }, + "mixed_fusion": { + "median_ms": 1.9846054999999998, + "min_ms": 1.9805250000000005, + "max_ms": 1.9978459999999993 + }, + "other": { + "median_ms": 0.063648, + "min_ms": 0.0632, + "max_ms": 0.06412899999999998 + }, + "pdip_solve": { + "median_ms": 7.6036825000000015, + "min_ms": 2.432922, + "max_ms": 23.139356999999997 + }, + "psf_convolution_mapping_matrix": { + "median_ms": 7.100987999999999, + "min_ms": 7.088909, + "max_ms": 7.1149580000000014 + }, + "regularization_H": { + "median_ms": 0.01088, + "min_ms": 0.010719, + "max_ms": 0.011231000000000001 + } + }, + "stage_order": [ + "border_relocator", + "mesh_qhull_callback", + "mesh_seed_argmin", + "mesh_locate_walk", + "mesh_construction", + "mapping_matrix", + "psf_convolution_mapping_matrix", + "curvature_matrix_F", + "regularization_H", + "pdip_solve", + "chi_squared_evidence", + "grids_and_structures", + "inversion_other", + "mixed_fusion", + "other", + "memset" + ], + "mixed_fusion": { + "ms": 1.9846054999999998, + "constituent_stage_sets": { + "curvature_matrix_F + psf_convolution_mapping_matrix": 1.0171146450000002, + "pdip_solve + psf_convolution_mapping_matrix": 0.22679108500000003, + "data_vector_D + pdip_solve": 0.12580931000000017, + "mapped_reconstruction + pdip_solve": 0.11475695499999994, + "mapping_matrix + pdip_solve": 0.11315047499999997, + "curvature_reg_reduce_gather + inversion_other + mapped_reconstruction + pdip_solve + reconstruction_scatter": 0.10967575499999999, + "pdip_solve + regularization_H": 0.04405461000000002, + "inversion_other + pdip_solve + regularization_H": 0.024096890000000003, + "inversion_other + pdip_solve": 0.022986635000000033, + "inversion_other + mapping_matrix + mesh_construction + mesh_dual_areas + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin + pdip_solve": 0.021017250000000015, + "inversion_other + mesh_construction + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin + pdip_solve + regularization_H": 0.01916010500000003, + "inversion_other + mesh_construction + mesh_dual_areas + mesh_interpolation_weights + pdip_solve + regularization_H": 0.014659999999999998, + "pdip_solve + ray_trace_data_grid": 0.013721134999999936, + "border_relocator + ray_trace_data_grid": 0.012399254999999996, + "inversion_other + mapping_matrix + mesh_construction + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin": 0.011660539999999997, + "grids_and_structures + mass_profile_deflections + pdip_solve + ray_trace_data_grid": 0.009410924999999997, + "border_relocator + pdip_solve + ray_trace_data_grid": 0.00867048499999998, + "chi_squared_evidence + pdip_solve": 0.007627724999999989, + "inversion_other + mesh_construction + mesh_seed_argmin + pdip_solve + regularization_H": 0.007248719999999993, + "border_relocator + pdip_solve": 0.006865055000000029, + "inversion_other + mesh_dual_areas + mesh_locate_walk": 0.0067850600000000615, + "inversion_other + mesh_construction + pdip_solve + regularization_H": 0.006344695000000006, + "inversion_other + pdip_solve + ray_trace_data_grid": 0.005274520000000025, + "inversion_other + regularization_H": 0.004843810000000002, + "inversion_other + mapped_reconstruction + pdip_solve + reconstruction_scatter": 0.004793240000000001, + "inversion_other + mapped_reconstruction + pdip_solve": 0.003802355000000001, + "mapping_matrix + pdip_solve + regularization_H": 0.003430859999999997, + "inversion_other + mesh_construction + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin": 0.0031577149999999993, + "inversion_other + mesh_construction + mesh_dual_areas + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin": 0.0029710200000000004, + "inversion_other + mesh_construction + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin + regularization_H": 0.002703179999999992, + "inversion_other + mesh_dual_areas + mesh_locate_walk + pdip_solve": 0.0026049199999999954, + "inversion_other + mesh_locate_walk + mesh_seed_argmin": 0.002504130000000003, + "inversion_other + mesh_interpolation_weights": 0.0021409050000000054, + "chi_squared_evidence + inversion_other": 0.0019523150000000026, + "grids_and_structures + mass_profile_deflections + pdip_solve": 0.0013377399999999987 + }, + "example_kernels": { + "curvature_matrix_F + psf_convolution_mapping_matrix": [ + "loop_divide_gather_fusion" + ], + "pdip_solve + psf_convolution_mapping_matrix": [ + "loop_broadcast_fusion.2" + ], + "data_vector_D + pdip_solve": [ + "input_reduce_fusion.5", + "input_reduce_fusion.21" + ], + "mapped_reconstruction + pdip_solve": [ + "input_reduce_fusion.9" + ], + "mapping_matrix + pdip_solve": [ + "loop_broadcast_fusion.3", + "loop_divide_fusion" + ], + "curvature_reg_reduce_gather + inversion_other + mapped_reconstruction + pdip_solve + reconstruction_scatter": [ + "input_multiply_transpose_fusion" + ], + "pdip_solve + regularization_H": [ + "loop_select_fusion.2", + "input_transpose_fusion.3" + ], + "inversion_other + pdip_solve + regularization_H": [ + "input_transpose_fusion.4" + ], + "inversion_other + pdip_solve": [ + "input_reduce_fusion.7", + "loop_log_fusion", + "input_reduce_fusion.8", + "input_reduce_fusion.12" + ], + "inversion_other + mapping_matrix + mesh_construction + mesh_dual_areas + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin + pdip_solve": [ + "input_scatter_fusion.6", + "input_scatter_fusion.3" + ] + }, + "prorated_estimate_ms": { + "psf_convolution_mapping_matrix": 0.6219528650000001, + "curvature_matrix_F": 0.5085573225000001, + "pdip_solve": 0.39040009660714287, + "mapped_reconstruction": 0.08177939016666663, + "inversion_other": 0.06826507335714291, + "data_vector_D": 0.06290465500000009, + "mapping_matrix": 0.062289437083333316, + "regularization_H": 0.04229206560714287, + "reconstruction_scatter": 0.023133460999999998, + "curvature_reg_reduce_gather": 0.021935150999999996, + "ray_trace_data_grid": 0.020061261249999966, + "mesh_construction": 0.014364231523809527, + "mesh_locate_walk": 0.012632607107142884, + "border_relocator": 0.012522316666666672, + "mesh_interpolation_weights": 0.012398766273809531, + "mesh_seed_argmin": 0.011169434440476194, + "mesh_dual_areas": 0.008478576250000022, + "chi_squared_evidence": 0.0047900199999999955, + "grids_and_structures": 0.002798644583333332, + "mass_profile_deflections": 0.002798644583333332 + }, + "prorated_note": "ESTIMATE ONLY \u2014 a mixed fusion's time split equally across the stages its constituents span. Never summed into the measured table, never reconciled." + }, + "other_sources_ms": { + "copy.80": 0.04202898499999959, + "copy.48": 0.014758169999999984, + "copy.53": 0.001986385000000001, + "copy.78": 0.0016490849999999948, + "copy.79": 0.001626270000000001, + "copy.39": 0.0016023799999999964 + }, + "device_span_ms": 34.338307730000004, + "device_busy_ms": 27.877550139999997, + "device_idle_ms": 6.460757590000007, + "largest_idle_gaps": [ + { + "gap_ms": 5.386263, + "after": "pure_callback.4", + "before": "pure_callback.4" + }, + { + "gap_ms": 0.054718, + "after": "input_concatenate_fusion.7", + "before": "pure_callback.4" + }, + { + "gap_ms": 0.034976, + "after": "input_reduce_fusion.1", + "before": "input_reduce_fusion.2" + }, + { + "gap_ms": 0.034687, + "after": "pure_callback.4", + "before": "copy.79" + }, + { + "gap_ms": 0.024704, + "after": "while.26", + "before": "input_reduce_select_fusion" + }, + { + "gap_ms": 0.0216, + "after": "while.26", + "before": "input_reduce_select_fusion" + }, + { + "gap_ms": 0.020735, + "after": "while.26", + "before": "input_reduce_select_fusion" + }, + { + "gap_ms": 0.020607, + "after": "loop_dynamic_update_slice_fusion", + "before": "loop_add_fusion" + } + ], + "kernel_ms": 23.2505795, + "sum_ms": 29.711337090000008, + "wall_ms": 34.34299495498635, + "host_outside_span_ms": 0.004687224986348326, + "reconciliation_pct": -13.486470446322743, + "unjoined_ms": 0.0, + "unjoined_pct": 0.0, + "other_ms": 0.063648, + "other_pct": 0.18533037110893782, + "note": "Stage rows attribute the command-buffers-OFF program (see the module docstring): kernel times are the same, the launch overhead the CUDA graphs remove is not. sum_ms = kernel rows + device_idle_ms; the residual against wall_ms is host_outside_span_ms (dispatch before the first kernel, teardown after the last).", + "per_stage_ms_per_lane": { + "border_relocator": 0.089342, + "chi_squared_evidence": 0.002976, + "curvature_matrix_F": 4.2077935, + "grids_and_structures": 0.001312, + "inversion_other": 1.7971385, + "mapping_matrix": 0.00288, + "memset": 0.021167999999999996, + "mesh_construction": 0.00208, + "mesh_locate_walk": 0.13025399999999995, + "mesh_qhull_callback": 0.010591999999999999, + "mesh_seed_argmin": 0.22123950000000026, + "mixed_fusion": 1.9846054999999998, + "other": 0.063648, + "pdip_solve": 7.6036825000000015, + "psf_convolution_mapping_matrix": 7.100987999999999, + "regularization_H": 0.01088 + }, + "per_lane_divisor": 1, + "host_callback": { + "pure_callback_span_ms": 99.06805499999997, + "qhull_ms": 92.29713190000005, + "callback_body_ms_note": "the OUTERMOST matching body event, not a sum: under the probe the body appears twice (the wrapper and the timed re-implementation it calls) and summing them would count the same work twice", + "events_by_name": { + "pure_callback.4": { + "count": 200, + "ms": 99.06805499999997 + }, + "$callback.py:815 _wrapped_callback": { + "count": 200, + "ms": 97.33393749999995 + }, + "$callback.py:224 _callback": { + "count": 200, + "ms": 96.86582529999997 + }, + "$callback.py:74 pure_callback_impl": { + "count": 200, + "ms": 96.69217809999999 + }, + "$callback.py:69 __call__": { + "count": 200, + "ms": 92.60040819999999 + }, + "$delaunay.py:162 ": { + "count": 200, + "ms": 92.47195890000008 + }, + "$host_callback_probe.py:225 wrapped": { + "count": 200, + "ms": 92.29713190000005 + }, + "$host_callback_probe.py:160 _timed_tri_only": { + "count": 200, + "ms": 92.14158769999999 + }, + "ThenExecuteCallback:GetEventForComputeStreamSyncPoint": { + "count": 200, + "ms": 0.3772671000000001 + }, + "$callback.py:822 ": { + "count": 800, + "ms": 0.28150809999999954 + }, + "$__init__.py:132 _xla_gc_callback": { + "count": 2, + "ms": 0.000368 + } + }, + "note": "HOST milliseconds per traced BATCH (the whole invocation), aggregated by name because the events nest. Not a row of the device table: the device pays for them as the idle gaps largest_idle_gaps names." + }, + "host_callback_ms": 99.06805499999997 + }, + "hlo_census": { + "status": "excluded", + "reason": "The legacy census anchors PyAutoArray source line numbers that moved after the phase-1 run. No batched attribution is published from unsupported anchors; the device-event table and wall reconciliation remain valid." + }, + "trace_split": { + "expected_calls": 200, + "executions_per_invocation": 20, + "method": "per-call (first-instruction recurrence)", + "note": "DECIDED IN CODE: the scalar arm's trace is split by trace_calls * B, so every lane's execution is its own block and the per-stage median is taken over all of them. The vmap arm's is split by trace_calls, one block per batched execution, and per_stage_ms_per_lane divides those rows by B." + } + } + }, + "certification_report": { + "source": "vmap arm, library solve observed through its stats= out-dict (PyAutoArray #566) and jax.debug.callback(..., ordered=True); ordered because the unordered batching rule returns the lanes permuted. Untimed, separately compiled; max rel diff of its log likelihoods vs the timed arm's: 1.924e-07", + "rows": 20, + "pdip_iter": "NOT AVAILABLE per lane without changing library numerics. The fallback branch calls the library's own reconstruction_positive_only_from, which returns the solution alone \u2014 jax_nnls.solve_nnls' iteration count is discarded inside the library's custom_vjp primal. The PDIP while_loop's cost is in the pdip_solve stage row of each arm's device table instead, which is a max-over-lanes quantity under vmap because every lane runs the same fixed kernel sequence.", + "passes_semantics": "library `passes`: restricted active-set passes run (jax_active_set.solve_certified)" + }, + "lane_construction": { + "draws_sha256": "8793f501adc86a80ee673986f87d36fdfb1b77bce5635352ee2c467783acb150", + "lane_rows": [ + 160, + 161, + 162, + 163, + 164, + 165, + 166, + 167, + 168, + 169, + 170, + 171, + 172, + 173, + 174, + 175, + 176, + 177, + 178, + 179 + ], + "calls": [ + 8 + ], + "stage": "pix2", + "regularization_range": { + "galaxies.source.pixelization.regularization.inner_coefficient": { + "min": 1.0566389768329418e-06, + "max": 229.37837836630266 + }, + "galaxies.source.pixelization.regularization.outer_coefficient": { + "min": 2.4574595034239785e-06, + "max": 30.026999055831187 + }, + "galaxies.source.pixelization.regularization.signal_scale": { + "min": 0.07341166691553269, + "max": 0.8809562507227594 + } + }, + "phases": [ + "exploration" + ], + "window_rule": "nautilus_batches.timed_window: consecutive captured calls, in call order, from the FIRST call that is not a prior batch, concatenated and truncated to B; at B == n_batch exactly one real Nautilus batch. Falls back to the latest B lanes if the post-prior lanes run out; never repeats a lane.", + "note": "Lane k is captured lane lane_rows[k]: the mass AND shear of a real Nautilus proposal (nautilus_batch_capture.py), lens light fixed at S3, the S3 light-subtracted dataset shared by every lane. `offsets` in the lane table are the mass offsets from the fiducial; the shear is in the capture file." + }, + "captured": { + "batches_path": "/mnt/ral/jnightin/autolens_profiling_wt/certified-solver-phase-c1-lane-rate/results/breakdown/imaging/nautilus_batches_delaunay_pix2.npz", + "batches_sha256": "90f4640a92f9b1c60ca3fceca7b484aa8215970489f8e7daf5430b8460d171d5", + "schema_version": 2, + "n_calls": 84, + "n_lanes": 1680, + "call_sizes_seen": [ + 20 + ], + "calls_by_phase": { + "prior": 8, + "exploration": 72, + "sampling": 4 + }, + "parameter_paths": [ + "galaxies.source.pixelization.regularization.inner_coefficient", + "galaxies.source.pixelization.regularization.outer_coefficient", + "galaxies.source.pixelization.regularization.signal_scale" + ], + "stage": "pix2", + "regularization": { + "class": "AdaptSplit", + "free": true, + "priors": { + "inner_coefficient": [ + "LogUniform", + 1e-06, + 1000000.0 + ], + "outer_coefficient": [ + "LogUniform", + 1e-06, + 1000000.0 + ], + "signal_scale": [ + "Uniform", + 0.0, + 1.0 + ] + }, + "priors_source": "PyAutoGalaxy packaged config/priors/regularization (adapt_split.yaml / constant.yaml); adapt_split.yaml is identical to euclid_strong_lens_modeling_pipeline/config/priors/regularization/adapt_split.yaml" + }, + "nautilus": { + "departures_from_production": [ + "mass/shear fixed at the S3 fiducial, not at a source_pix_1 result", + "no positions likelihood", + "the cell's mesh (Hilbert 1500, weight_power 1) in both stages; source_pix_2 redraws a 500-vertex Hilbert grid at weight_power 3.5", + "seeded (production passes no seed)", + "quick updates disabled (iterations_per_quick_update=1e12; render-only)", + "NullPaths: no output directory, so no checkpoint and one Sampler.run call", + "post-fit perform_update skipped (samples / latent variables never built)" + ], + "n_batch": 20, + "n_like_max": 40000, + "n_live": 75, + "number_of_cores": 1, + "production_reference": "euclid_strong_lens_modeling_pipeline/scripts/full_model.py source_pix_1 (n_live=150) / source_pix_2 (n_live=75): af.Nautilus(n_batch=20, **SettingsSearch.search_dict) with use_jax_vmap=True and number_of_cores=1 (SettingsSearch defaults)", + "production_stage": "source_pix_2", + "seed": 1, + "stage": "pix2", + "use_jax_vmap": true, + "version": "1.0.5" + }, + "capture_fit_status": "sampling complete (n_like_max or convergence); post-fit result skipped", + "capture_library_revisions": { + "PyAutoArray": { + "head": "7fa8d2714f7da43fec2b23c31bff580764831670", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoArray" + }, + "PyAutoFit": { + "head": "a736840127be7a3c21e15a5c945e94d8f1082983", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoFit" + }, + "PyAutoGalaxy": { + "head": "70a61e26cd715cefe7012a38285698091246a8a4", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy" + }, + "PyAutoLens": { + "head": "86054bbc19baa2f710a12e04a94fa27ab37cc354", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoLens" + }, + "PyAutoNerves": { + "head": "1fa613aa8d89a79613009fb66f5b4e2d21deb57a", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoNerves" + } + }, + "fingerprint_check": { + "fields": [ + "mesh", + "source_pixels", + "dataset_sha256", + "regularization_class", + "regularization_s0_fiducial", + "border_relocator", + "use_mixed_precision", + "log_evidence_s3_library" + ], + "not_identity": "the regularization coefficients: free per lane since the capture frees them", + "log_evidence_s3_library_rel_diff": 0.0, + "passed": true + }, + "timed_window_vs_capture_pdip": { + "reference": "the capture's own figure of merit (library PDIP, Fitness.call_wrap jax.jit(jax.vmap(call)) over parameter vectors) for the same lanes", + "compared_against": "this cell's jit(vmap) library-PDIP reference", + "n_compared": 20, + "max_rel_diff": 1.6296173197847013e-06, + "max_abs_diff_nats": 0.2258566872915253, + "gated": false, + "note": "RECORDED, NOT GATED: proves the lane trees rebuilt here are the models the sampler evaluated (a wrong parameter mapping shows up as nats, not 1e-10)." + } + }, + "matched": { + "vmap_wall_per_lane_ms": 13.211890570000833, + "scalar_wall_per_lane_ms": 33.14106489999176, + "speedup_vmap_over_scalar": 2.508427141778065, + "note": "Both walls are the PRODUCTION nesting of their arm, measured in one process on the same B lanes with the SAME library Settings (no injection). A speedup below 1 means the batch is slower per lane than B sequential jitted calls." + }, + "solver_source": "library", + "solver": "certified", + "certified_fallback": "none", + "certified_pass_budget": 16, + "certified_pass_budget_basis": "config default (Settings().certified_pass_budget)", + "certified_tau_rel": 1e-09, + "solver_used": "certified", + "solver_check": { + "solver_used": "certified", + "solver_used_source": "AbstractInversion.positive_only_solver_used on the fiducial S3 inversion, built eagerly on the JAX backend (AnalysisImaging(use_jax=True).fit_from) with the arms' Settings", + "reference_solver_used": "pdip", + "traced_solver_kwargs_jax": [ + "certified" + ], + "observed_calls_jax": 1, + "report_rows": 20, + "report_vs_timed_arm_max_rel_diff": 1.9237039733334527e-07 + }, + "lanes_certified": [ + false, + true, + true, + true, + false, + false, + false, + true, + true, + false, + true, + false, + true, + false, + true, + true, + true, + true, + false, + true + ], + "lanes_passes": [ + 16, + 0, + 2, + 4, + 16, + 16, + 16, + 1, + 2, + 16, + 4, + 16, + 5, + 16, + 2, + 1, + 2, + 0, + 16, + 1 + ], + "uncertified_lanes": 8, + "per_lane_certification_note": "certified / passes come from the library's own solve through its stats= out-dict (PyAutoArray #566): passes is the number of restricted active-set passes the library ran (0 when the unconstrained solve was already non-negative), certified is its KKT certificate. With certified_fallback=pdip a False lane returned the PDIP solution; with none it returned the last uncertified iterate. null for a library-PDIP row (no certificate).", + "gate": { + "pre_registered": true, + "gated": [ + "per lane: jit(vmap) arm vs jit(vmap) library PDIP <= lane_rtol relative", + "per lane: scalar jit arm vs scalar jit library PDIP <= lane_rtol relative" + ], + "recorded_not_gated": [ + "per lane: jit(vmap) arm vs scalar jit arm (rel_diff, abs_diff_nats)", + "per lane: jit(vmap) library PDIP vs scalar jit library PDIP", + "uncertified_lanes (certified_fallback=none rows)" + ], + "lanes_failed": 12, + "passed": false, + "policy_eligible": false, + "note": "Pre-registered before submission (module docstring; submit header). Phase 3 (results/notes/hst_gpu_residue_phase3_psf_2026_09.md) placed phase 2's ~2.5e-9 certified-vs-PDIP residual BETWEEN the jit(vmap) and scalar-jit compositions, not in the solver \u2014 so each arm is gated against the library-PDIP reference of its OWN composition, and the cross-composition difference is recorded with its nats. A certified_fallback=none row is policy-eligible only if every lane certifies AND passes the gate. Timing is never gated." + }, + "library_revisions": { + "PyAutoArray": { + "head": "3de624b5b91a4efa130dc3cb0a3a0f06f85025a3", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoArray", + "module_file": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/__init__.py" + }, + "PyAutoFit": { + "head": "dd9fbe0aab60c4a57702b1444ca031b317c91331", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoFit", + "module_file": "/mnt/ral/jnightin/PyAuto/PyAutoFit/autofit/__init__.py" + }, + "PyAutoGalaxy": { + "head": "70a61e26cd715cefe7012a38285698091246a8a4", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy", + "module_file": "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/__init__.py" + }, + "PyAutoLens": { + "head": "86054bbc19baa2f710a12e04a94fa27ab37cc354", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoLens", + "module_file": "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/__init__.py" + }, + "autoarray_file": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/__init__.py" + } + }, + "headline_arm_note": "`trace`, `hlo_census`, `command_buffers` and `trace_timing` above describe the scalar arm \u2014 the program phase 1 traced. Both arms' full blocks, the lane table and the matched comparison are under `vmap`." +} \ No newline at end of file diff --git a/results/breakdown/imaging/fixed_light_trace_delaunay_jitvmap20_captured_pix2_libcertified_fboff_b16_hpc_a100_fp64_fixed_light_trace.png b/results/breakdown/imaging/fixed_light_trace_delaunay_jitvmap20_captured_pix2_libcertified_fboff_b16_hpc_a100_fp64_fixed_light_trace.png new file mode 100644 index 0000000000000000000000000000000000000000..459e37445d4ebf531a4df668e9be6c52f1bd64e3 GIT binary patch literal 156826 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 z⁣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 bO`qz#ZzCqu`MAHn3UjgbXI5zz>x2FW^X=3r literal 0 HcmV?d00001 diff --git a/results/breakdown/imaging/fixed_light_trace_delaunay_jitvmap20_captured_pix2_libcertified_fbon_b16_hpc_a100_fp64_fixed_light_trace.json b/results/breakdown/imaging/fixed_light_trace_delaunay_jitvmap20_captured_pix2_libcertified_fbon_b16_hpc_a100_fp64_fixed_light_trace.json new file mode 100644 index 000000000..0fa994ac9 --- /dev/null +++ b/results/breakdown/imaging/fixed_light_trace_delaunay_jitvmap20_captured_pix2_libcertified_fbon_b16_hpc_a100_fp64_fixed_light_trace.json @@ -0,0 +1,6008 @@ +{ + "device": { + "backend": "gpu", + "device": "cuda:0", + "hostname": "euclid-ral-gpu-2", + "xla_flags": "--xla_disable_hlo_passes=constant_folding --xla_gpu_autotune_level=0 --xla_gpu_enable_triton_gemm=false", + "omp_num_threads": null, + "cpu_count": 124, + "jax_compilation_cache_dir": "/mnt/ral/jnightin/autolens_profiling_wt/certified-solver-phase-c1-lane-rate/output/jax_cache/fixed_light_lanerate_delaunay_pix2_time_20_certified_on_350768_33", + "autotune_cache_entries_at_start": 0, + "cache_fresh": true, + "nvidia_smi": "NVIDIA A100 80GB PCIe, 8833 MiB, 81920 MiB" + }, + "machine": { + "cpu_model": "AMD EPYC 7702 64-Core Processor", + "cpu_count_os": 124, + "nproc": 4, + "nproc_all": 124, + "nproc_note": "GNU nproc honours OMP_NUM_THREADS, so `nproc` can print 1 on a multi-core host; `nproc_all` is the core count.", + "ram_total": "928298204 kB", + "kernel": "5.14.0-687.50.1.el9_8.x86_64", + "platform": "Linux-5.14.0-687.50.1.el9_8.x86_64-x86_64-with-glibc2.34", + "python": "3.12.4", + "jax_thread_env": { + "NPROC": null + }, + "blas_thread_env": { + "OMP_NUM_THREADS": null, + "OPENBLAS_NUM_THREADS": null, + "MKL_NUM_THREADS": null, + "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" + }, + "precision": "fp64", + "configuration": { + "pixel_scale_arcsec": 0.05, + "mask_radius_arcsec": 3.5, + "image_pixels_masked": 15361, + "over_sampled_pixels": 62752, + "mesh": "delaunay", + "mesh_shape": null, + "source_pixels": 1500, + "source_pixels_requested": null, + "dataset": "hst", + "dataset_sha256": { + "data.fits": "e4e833a28e9c6f6fb023cd85c0d3dde74068720256bc77a240633500e5b04fac", + "noise_map.fits": "315c6266a0acd3ac9c8da82fcd2b45a08697362481fd7a35072bab1658530ba3", + "psf.fits": "8389ba0e8bf4a09b4a561cfc246181a2fb944ed396754cd0ff76fdd22910d303" + }, + "cell_source_sha256": "06a162fcdae6b329384ec33322f443df07215d86e56f0505ac15b3d3473eb432", + "inversion_path": "dense", + "pass_budget": 7, + "pass_budget_basis": "phase 3 (autolens_profiling#255): the smallest ZERO-fallback budget per mesh, the budget a production run fixes. NOT phase 0's certifying budget (2 for Delaunay), which falls back on 67.5 % of a graded draw set and is not a production cost.", + "border_relocator_mode": "cell", + "border_relocator": true, + "border_relocator_note": "'cell' is use_border_relocator=True, which every profiling cell in this family forces; 'library' passes None and takes the shipped config default, which is what production runs. The resolved boolean is what this leg actually ran.", + "routes_selected": [ + "b", + "d" + ], + "trace_calls": 10, + "command_buffers_traced": "off", + "use_mixed_precision": false, + "tau_rel": 1e-09, + "regularization": { + "scheme": "adapt_split", + "inner_coefficient": 0.1, + "outer_coefficient": 10.0, + "signal_scale": 0.1 + }, + "thread_env": { + "n_threads": null, + "vars": [ + "OPENBLAS_NUM_THREADS", + "MKL_NUM_THREADS", + "OMP_NUM_THREADS", + "VECLIB_MAXIMUM_THREADS", + "NUMEXPR_NUM_THREADS" + ], + "set_to": null, + "preexisting": {}, + "overridden": {}, + "note": "Not pinned (legacy variant): recorded as found." + }, + "over_sample_size_lp_rule": { + "sub_size_list": [ + 4, + 2, + 2 + ], + "radial_list": [ + 0.3, + 0.6 + ], + "centre": [ + 0.0, + 0.0 + ] + }, + "vmap_batch": 20, + "lanes": "captured", + "arms": [ + "vmap", + "scalar" + ], + "fallback": "on", + "draw_seed": 0, + "vmap_composition": "jax.jit(jax.vmap(fn))", + "lane_rtol": 1e-09, + "vmap_flags_note": "Strict ProfileCLI.parse_cell_args rejects unknown flags. These keys record the exact batching program and prevent historical vmap(jit) artifacts from being mistaken for current jit(vmap) measurements.", + "solver_source": "library", + "solver": "certified", + "certified_fallback": "pdip", + "certified_pass_budget": 16, + "captured_pass": "time", + "batches": "/mnt/ral/jnightin/autolens_profiling_wt/certified-solver-phase-c1-lane-rate/results/breakdown/imaging/nautilus_batches_delaunay_pix2.npz" + }, + "solver_injection": { + "patched": null, + "part_v": "none \u2014 library mode selects the solver through al.Settings", + "part_b_route_d": { + "patched": "autoarray.inversion.inversion.inversion_util.reconstruction_positive_only_from", + "pass_budget": 7, + "fallback": true + }, + "note": "Library mode (phase B, #300): PART V's arms and references run the library's own positive-only solve, selected by Settings(positive_only_solver, certified_fallback, certified_pass_budget); nothing is injected. PART B's single-call route d (the fiducial d == b pin) still uses the phase-1 harness injection at the phase-3 budget and is not a phase-B row. The untimed certification report observes the library solve (library_solver_observed) without changing it." + }, + "routes": { + "b_s3_pdip": { + "label": "S3 PDIP (source-only)", + "status": "ok", + "solver": "library", + "ms": 50.84114830024191, + "log_likelihood": 29155.000174925866 + }, + "d_s3_certified_fallback": { + "label": "S3 certified active set, budget 7, PDIP fallback", + "status": "ok", + "solver": "harness-injected certified active set", + "pass_budget": 7, + "fallback": true, + "injected_solver_calls_jax": 1, + "injected_solver_calls_numpy": 0, + "ms": 31.498834599915426, + "log_likelihood": 29155.000174536726 + } + }, + "equivalence_pins": [ + { + "pin": "route d (certified, fallback) == route b (library PDIP)", + "route": "d_s3_certified_fallback", + "reference": "b_s3_pdip", + "expectation": "the certified active set returns the library's own positive solution", + "rtol": 1e-09, + "got": 29155.000174536726, + "reference_value": 29155.000174925866, + "rel_diff": 1.3347283098768208e-11, + "status": "PASS" + } + ], + "equivalence_rtol": 1e-09, + "reference": { + "log_evidence_s0_library": 29155.00017433923, + "log_evidence_s3_library": 29155.000174339304, + "s3": { + "n_params": 1500, + "n_mapper": 1500, + "n_funcs": 0, + "edge_zeroed_pixels": 0, + "subtracted_light_flux": 5105.448603818575 + } + }, + "command_buffers": { + "wall_on_ms": 875.6381604998751, + "wall_off_ms": 882.5437281997438, + "command_buffer_delta_ms": 6.905567699868698, + "command_buffer_delta_pct": 0.788632566667323, + "traced": "off", + "compiler_option": "xla_gpu_enable_command_buffer", + "probe": { + "note": "Not taken in --vmap-batch mode: the CUPTI-inside-a-CUDA-graph probe is a phase-1 diagnostic about the JOIN, and this mode already compiles and times both the command-buffers ON and OFF executable of every arm." + }, + "note": "ONE lowering, TWO compilations, one process. wall_on_ms is the PRODUCTION program (CUDA graphs as XLA ships them) and is the number comparable to phase 5's row; wall_off_ms is the graph-less program the stage rows attribute. The delta is the launch overhead the graphs remove \u2014 it lands in device_idle and host_outside_span, not in any stage. Reconciliation is computed against wall_off_ms." + }, + "trace": { + "parser": "ProfileData.from_file(xplane) + as_text() + stack_frame_index(proto field 17)", + "stage_audit": { + "mixed_fusion": [ + { + "instruction": "loop_divide_gather_fusion", + "ms": 1.0147837900000003, + "opcode": "fusion", + "shape": "(f64[15361,1,1,1500]{3,2,1,0}, f64[15361,1,1,1500]{3,2,1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:133", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:133 (curvature_matrix_via_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:93 (InversionImagingMapping.curvature_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:389 (AbstractInversion.curvature_reg_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "loop_broadcast_fusion.2", + "ms": 0.22702425500000015, + "opcode": "fusion", + "shape": "f64[1500,180,180]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "input_reduce_fusion.13", + "ms": 0.12207924499999988, + "opcode": "fusion", + "shape": "f64[92,1500]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/inversion_imaging_util.py:123", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/inversion_imaging_util.py:123 (data_vector_via_blurred_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:67 (InversionImagingMapping.data_vector)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:699 (AbstractInversion.reconstruction)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "input_reduce_fusion.17", + "ms": 0.11460218000000005, + "opcode": "fusion", + "shape": "f64[15361]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:163", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:163 (mapped_reconstructed_data_via_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:120 (InversionImagingMapping._mapped_reconstructed_data_dict_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:196 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "loop_broadcast_fusion.3", + "ms": 0.11095099000000008, + "opcode": "fusion", + "shape": "f64[15361,1500]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:342", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:342 (mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/abstract.py:283 (Mapper.mapping_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:91 (AbstractInversionImaging._mapping_matrix_for_convolution_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:137 (AbstractInversionImaging.operated_mapping_matrix_list)" + ] + }, + { + "instruction": "input_multiply_transpose_fusion", + "ms": 0.10946254999999998, + "opcode": "fusion", + "shape": "(f64[1500,1500]{1,0}, f64[1500,1500]{1,0}, f64[1500,1500]{1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:237 (active_set_search)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:293 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:274 (_certified_positive_only_from)" + ] + } + ], + "grids_and_structures": [ + { + "instruction": "loop_multiply_sine_fusion", + "ms": 0.0013491050000000013, + "opcode": "fusion", + "shape": "(f64[], f64[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/geometry/geometry_util.py:527", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/geometry/geometry_util.py:527 (transform_grid_2d_to_reference_frame)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/profiles/geometry_profiles.py:418 (EllProfile.transformed_to_reference_frame_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/structures/decorators/abstract.py:93 (AbstractMaker.evaluate_func)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/structures/decorators/abstract.py:112 (AbstractMaker.result)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/structures/decorators/to_grid.py:70 (to_grid..wrapper)" + ] + } + ], + "border_relocator": [ + { + "instruction": "eigh.45", + "ms": 0.07454366500000005, + "opcode": "custom-call", + "shape": "(f64[2,2]{0,1}, f64[2]{0}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:245", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:245 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:454 (BorderRelocator.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:176 (AbstractMesh.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:214 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "custom-call.2", + "ms": 0.007953390000000022, + "opcode": "custom-call", + "shape": "(f64[2,2]{1,0}, s8[4194304]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:242", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:242 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:454 (BorderRelocator.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:176 (AbstractMesh.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:214 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "loop_add_fusion.9", + "ms": 0.003369750000000004, + "opcode": "fusion", + "shape": "f64[1500]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:308", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:308 (relocated_grid_via_ellipse_border_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:458 (BorderRelocator.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:176 (AbstractMesh.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:214 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "input_reduce_fusion.25", + "ms": 0.001925390000000003, + "opcode": "fusion", + "shape": "f64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:256", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:256 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:454 (BorderRelocator.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:176 (AbstractMesh.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:214 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "loop_multiply_fusion.4", + "ms": 0.0015465549999999976, + "opcode": "fusion", + "shape": "f64[2,2]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:245", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:245 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:454 (BorderRelocator.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:176 (AbstractMesh.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:214 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + } + ], + "mesh_construction": [ + { + "instruction": "input_concatenate_fusion.7", + "ms": 0.002044314999999992, + "opcode": "fusion", + "shape": "f64[1500,2]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:820", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:820 (InterpolatorDelaunay.mesh_grid_xy)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:847 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + } + ], + "mesh_qhull_callback": [ + { + "instruction": "pure_callback.4", + "ms": 0.010624294999999992, + "opcode": "custom-call", + "shape": "(s32[3000,3]{1,0}, s32[3000,3]{1,0}, s32[1500]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:161", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:161 (_jax_delaunay_tables)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:405 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + } + ], + "other": [ + { + "instruction": "copy.106", + "ms": 0.04187694999999879, + "opcode": "copy", + "shape": "f64[1,1024,2]{2,1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "copy.70", + "ms": 0.014690620000000149, + "opcode": "copy", + "shape": "s32[21361]{0}", + "source": "", + "stack": [] + }, + { + "instruction": "copy.75", + "ms": 0.001968135000000004, + "opcode": "copy", + "shape": "s64[1500]{0}", + "source": "", + "stack": [] + }, + { + "instruction": "copy.104", + "ms": 0.0016524649999999945, + "opcode": "copy", + "shape": "s64[]", + "source": "", + "stack": [] + }, + { + "instruction": "copy.105", + "ms": 0.001634235000000002, + "opcode": "copy", + "shape": "s32[]", + "source": "", + "stack": [] + }, + { + "instruction": "copy.61", + "ms": 0.0016041399999999959, + "opcode": "copy", + "shape": "s32[]", + "source": "", + "stack": [] + } + ], + "mesh_seed_argmin": [ + { + "instruction": "input_reduce_fusion", + "ms": 0.14478561999999937, + "opcode": "fusion", + "shape": "(f64[1024]{0}, s64[1024]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:191", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:191 (_nearest_vertex_seed_from..argmin_chunk)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204 (_nearest_vertex_seed_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:351 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)" + ] + }, + { + "instruction": "loop_dynamic_update_slice_fusion", + "ms": 0.04105780499999848, + "opcode": "fusion", + "shape": "s32[21,1024]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204 (_nearest_vertex_seed_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:351 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "loop_add_fusion", + "ms": 0.03196771499999974, + "opcode": "fusion", + "shape": "s64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204 (_nearest_vertex_seed_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:351 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "loop_broadcast_fusion", + "ms": 0.0019505399999999967, + "opcode": "fusion", + "shape": "s32[21,1024]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204 (_nearest_vertex_seed_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:351 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "pdip_solve": [ + { + "instruction": "cholesky.60", + "ms": 6.754088089999978, + "opcode": "custom-call", + "shape": "(f64[1500,1500]{0,1}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:252 (active_set_search..body_fun)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:262 (active_set_search)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:293 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)" + ] + }, + { + "instruction": "cholesky.80", + "ms": 5.67523822999999, + "opcode": "custom-call", + "shape": "(f64[1500,1500]{0,1}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:106", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:106 (factorize_kkt)", + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:212 (pdip_pc_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:83 (solve_nnls)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:129 (_solve_nnls_primal_with..primal)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:164 (solve_nnls_primal_with_status)" + ] + }, + { + "instruction": "triangular-solve.1", + "ms": 1.209065825000019, + "opcode": "custom-call", + "shape": "(f64[1500,1]{0,1}, s8[0]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:154", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:154 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:252 (active_set_search..body_fun)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:262 (active_set_search)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:293 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)" + ] + }, + { + "instruction": "triangular-solve", + "ms": 1.0477539799999835, + "opcode": "custom-call", + "shape": "(f64[1500,1]{0,1}, s8[0]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:154", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:154 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:252 (active_set_search..body_fun)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:262 (active_set_search)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:293 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)" + ] + }, + { + "instruction": "triangular-solve.2", + "ms": 0.90566888999999, + "opcode": "custom-call", + "shape": "(f64[1500,1]{0,1}, s8[0]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146 (solve_kkt_rhs)", + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:213 (pdip_pc_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:83 (solve_nnls)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:129 (_solve_nnls_primal_with..primal)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:164 (solve_nnls_primal_with_status)" + ] + }, + { + "instruction": "triangular-solve.4", + "ms": 0.8971959699999926, + "opcode": "custom-call", + "shape": "(f64[1500,1]{0,1}, s8[0]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146 (solve_kkt_rhs)", + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:217 (pdip_pc_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:83 (solve_nnls)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:129 (_solve_nnls_primal_with..primal)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:164 (solve_nnls_primal_with_status)" + ] + } + ], + "regularization_H": [ + { + "instruction": "input_scatter_fusion.10", + "ms": 0.0020577249999999946, + "opcode": "fusion", + "shape": "f64[1500,1500]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:615", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:615 (pixel_splitted_regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt_split.py:137 (AdaptSplit.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:332 (AbstractInversion.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "input_concatenate_fusion.10", + "ms": 0.0018569600000000008, + "opcode": "fusion", + "shape": "pred[3]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:90", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:90 (split_points_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:410 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + }, + { + "instruction": "input_concatenate_fusion.9", + "ms": 0.0018511900000000017, + "opcode": "fusion", + "shape": "pred[3]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:91", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:91 (split_points_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:410 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + }, + { + "instruction": "input_concatenate_fusion.8", + "ms": 0.0018500700000000016, + "opcode": "fusion", + "shape": "pred[3]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:93", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:93 (split_points_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:410 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + }, + { + "instruction": "input_concatenate_fusion", + "ms": 0.0017531150000000013, + "opcode": "fusion", + "shape": "s32[1500,2]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:615", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:615 (pixel_splitted_regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt_split.py:137 (AdaptSplit.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:332 (AbstractInversion.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "input_concatenate_fusion.11", + "ms": 0.0014912049999999974, + "opcode": "fusion", + "shape": "pred[3]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:88", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:88 (split_points_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:410 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + } + ], + "mesh_locate_walk": [ + { + "instruction": "input_reduce_fusion.1", + "ms": 0.022754409999999718, + "opcode": "fusion", + "shape": "pred[196]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:288", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:288 (_walk_from_seed..cond)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:353 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)" + ] + }, + { + "instruction": "loop_reduce_fusion", + "ms": 0.02235456499999971, + "opcode": "fusion", + "shape": "(f64[21361]{0}, s64[21361]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:264", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:264 (_walk_from_seed..walk_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:292 (_walk_from_seed..body)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:264 (_walk_from_seed..walk_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:292 (_walk_from_seed..body)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)" + ] + }, + { + "instruction": "loop_or_select_fusion", + "ms": 0.019306895000000247, + "opcode": "fusion", + "shape": "(s32[21361]{0}, pred[21361]{0}, pred[21361]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:270", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:270 (_walk_from_seed..walk_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:292 (_walk_from_seed..body)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:353 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)" + ] + }, + { + "instruction": "loop_select_fusion", + "ms": 0.01731259500000002, + "opcode": "fusion", + "shape": "s32[21361]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:242", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:242 (_walk_from_seed..weights_of)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:262 (_walk_from_seed..walk_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:292 (_walk_from_seed..body)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:353 (pix_indexes_delaunay_walk_from)" + ] + }, + { + "instruction": "input_reduce_fusion.2", + "ms": 0.014390094999999985, + "opcode": "fusion", + "shape": "pred[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:288", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:288 (_walk_from_seed..cond)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:353 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)" + ] + }, + { + "instruction": "while.34", + "ms": 0.012851719999999872, + "opcode": "while", + "shape": "(s32[], s32[21361]{0}, pred[21361]{0}, pred[21361]{0}, s32[3000,3]{1,0}, /*index=5*/f64[1500,2]{1,0}, f64[21361,2]{1,0}, s32[3000,3]{1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:353 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "psf_convolution_mapping_matrix": [ + { + "instruction": "input_scatter_fusion", + "ms": 1.9795794700000002, + "opcode": "fusion", + "shape": "f64[1500,180,180]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "fft.19.0", + "ms": 1.7556014649999998, + "opcode": "fft", + "shape": "f64[1500,180,180]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "fft.15.0", + "ms": 1.364779719999999, + "opcode": "fft", + "shape": "c128[1500,180,91]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "fft.17.0", + "ms": 0.979255055, + "opcode": "fft", + "shape": "c128[1500,91,180]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "input_transpose_fusion.4", + "ms": 0.513519525, + "opcode": "fusion", + "shape": "c128[1500,91,180]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "wrapped_transpose", + "ms": 0.5002328650000002, + "opcode": "fusion", + "shape": "c128[1500,180,91]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + } + ], + "inversion_other": [ + { + "instruction": "cholesky.120", + "ms": 0.8939710999999999, + "opcode": "custom-call", + "shape": "(f64[1500,1500]{0,1}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986 (AbstractInversion._log_det_symmetric_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:1078 (AbstractInversion.log_det_curvature_reg_matrix_term)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:347 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/model/analysis.py:135 (AnalysisImaging.log_likelihood_function)" + ] + }, + { + "instruction": "cholesky.130", + "ms": 0.8894467799999997, + "opcode": "custom-call", + "shape": "(f64[1500,1500]{0,1}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986 (AbstractInversion._log_det_symmetric_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:1157 (AbstractInversion.log_det_regularization_matrix_term)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:348 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/model/analysis.py:135 (AnalysisImaging.log_likelihood_function)" + ] + }, + { + "instruction": "loop_reduce_window_fusion.1", + "ms": 0.002773885000000001, + "opcode": "fusion", + "shape": "s64[94,16]{1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "loop_reduce_window_fusion", + "ms": 0.0026655950000000032, + "opcode": "fusion", + "shape": "s64[6,16]{1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "loop_broadcast_convert_fusion", + "ms": 0.00217664, + "opcode": "fusion", + "shape": "(s32[1500]{0}, s64[1500]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:527", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:527 (AbstractInversion.zeroed_ids_to_keep)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:567 (AbstractInversion.solve_ids_to_keep)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:684 (AbstractInversion.reconstruction)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "input_scatter_fusion.5", + "ms": 0.0019308600000000002, + "opcode": "fusion", + "shape": "s64[1500]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:527", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:527 (AbstractInversion.zeroed_ids_to_keep)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:567 (AbstractInversion.solve_ids_to_keep)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:684 (AbstractInversion.reconstruction)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "mapping_matrix": [ + { + "instruction": "input_reduce_fusion.31", + "ms": 0.002879989999999991, + "opcode": "fusion", + "shape": "f64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:93", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:93 (adaptive_pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/abstract.py:507 (Mapper.pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt.py:339 (Adapt.regularization_weights_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt_split.py:120 (AdaptSplit.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)" + ] + } + ], + "curvature_matrix_F": [ + { + "instruction": "cublas-lt-matmul.2", + "ms": 4.205149959999999, + "opcode": "custom-call", + "shape": "(f64[1500,1500]{1,0}, s8[4194304]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:134", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:134 (curvature_matrix_via_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:93 (InversionImagingMapping.curvature_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:389 (AbstractInversion.curvature_reg_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "chi_squared_evidence": [ + { + "instruction": "loop_multiply_fusion.2", + "ms": 0.003019990000000005, + "opcode": "fusion", + "shape": "f64[15361]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/abstract_ndarray.py:300", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/abstract_ndarray.py:300 (AbstractNDArray.__pow__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/abstract_ndarray.py:60 (unwrap_array..wrapper)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/abstract_ndarray.py:35 (to_new_array..wrapper)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_util.py:78 (chi_squared_map_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:78 (AbstractFit.chi_squared_map)" + ] + } + ] + }, + "stage_audit_note": "The HLO instructions that contributed most of each stage's milliseconds, with their full source stack. A stage row is only as good as the rules that built it; this is how a reader checks a row against the HLO instead of trusting it.", + "untraced_wall_ms": 44.026208385002974, + "reconciliation_vs_untraced_pct": -31.141085600896776, + "wall_basis": "wall_ms is the TRACED run's wall, the run these kernel durations came from. untraced_wall_ms is the same executable without the profiler; the difference is the profiler's overhead and belongs in neither the stages nor the idle row.", + "calls": 200, + "call_split": "per-call (first-instruction recurrence)", + "call_blocks": 200, + "events": 141520, + "streams": [ + "Stream #14(MemcpyD2H,Compute,MemcpyH2D,Memset,MemcpyD2D)" + ], + "per_stage_ms": { + "border_relocator": { + "median_ms": 0.08934100000000002, + "min_ms": 0.08876800000000001, + "max_ms": 0.09017100000000003 + }, + "chi_squared_evidence": { + "median_ms": 0.0029925, + "min_ms": 0.00288, + "max_ms": 0.003296 + }, + "curvature_matrix_F": { + "median_ms": 4.204302, + "min_ms": 4.188499, + "max_ms": 4.267967 + }, + "grids_and_structures": { + "median_ms": 0.001376, + "min_ms": 0.001279, + "max_ms": 0.001408 + }, + "inversion_other": { + "median_ms": 1.794877, + "min_ms": 1.778573, + "max_ms": 1.813453 + }, + "mapping_matrix": { + "median_ms": 0.00288, + "min_ms": 0.002848, + "max_ms": 0.002912 + }, + "memset": { + "median_ms": 0.021502499999999997, + "min_ms": 0.010048, + "max_ms": 0.096384 + }, + "mesh_construction": { + "median_ms": 0.002048, + "min_ms": 0.002015, + "max_ms": 0.00208 + }, + "mesh_locate_walk": { + "median_ms": 0.13138900000000003, + "min_ms": 0.13056200000000007, + "max_ms": 0.13273700000000005 + }, + "mesh_qhull_callback": { + "median_ms": 0.0105605, + "min_ms": 0.010400000000000001, + "max_ms": 0.011103 + }, + "mesh_seed_argmin": { + "median_ms": 0.2197770000000001, + "min_ms": 0.21939200000000011, + "max_ms": 0.22009800000000013 + }, + "mixed_fusion": { + "median_ms": 1.9815474999999996, + "min_ms": 1.9770350000000003, + "max_ms": 1.9940639999999994 + }, + "other": { + "median_ms": 0.063583, + "min_ms": 0.06304099999999999, + "max_ms": 0.067202 + }, + "pdip_solve": { + "median_ms": 7.581224, + "min_ms": 2.424595, + "max_ms": 48.89660700000005 + }, + "psf_convolution_mapping_matrix": { + "median_ms": 7.0925095, + "min_ms": 7.078738999999999, + "max_ms": 7.106948999999999 + }, + "regularization_H": { + "median_ms": 0.010848, + "min_ms": 0.010656, + "max_ms": 0.0112 + } + }, + "stage_order": [ + "border_relocator", + "mesh_qhull_callback", + "mesh_seed_argmin", + "mesh_locate_walk", + "mesh_construction", + "mapping_matrix", + "psf_convolution_mapping_matrix", + "curvature_matrix_F", + "regularization_H", + "pdip_solve", + "chi_squared_evidence", + "grids_and_structures", + "inversion_other", + "mixed_fusion", + "other", + "memset" + ], + "mixed_fusion": { + "ms": 1.9815474999999996, + "constituent_stage_sets": { + "curvature_matrix_F + psf_convolution_mapping_matrix": 1.0147837900000003, + "pdip_solve + psf_convolution_mapping_matrix": 0.22702425500000015, + "data_vector_D + pdip_solve": 0.125767375, + "mapped_reconstruction + pdip_solve": 0.11460218000000005, + "mapping_matrix + pdip_solve": 0.11328746500000009, + "curvature_reg_reduce_gather + inversion_other + mapped_reconstruction + pdip_solve + reconstruction_scatter": 0.10946254999999998, + "pdip_solve + regularization_H": 0.04431791999999995, + "inversion_other + pdip_solve + regularization_H": 0.024252115000000008, + "inversion_other + pdip_solve": 0.02287350499999999, + "inversion_other + mapping_matrix + mesh_construction + mesh_dual_areas + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin + pdip_solve": 0.020975820000000023, + "inversion_other + mesh_construction + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin + pdip_solve + regularization_H": 0.01878552, + "inversion_other + mesh_construction + mesh_dual_areas + mesh_interpolation_weights + pdip_solve + regularization_H": 0.01464035, + "pdip_solve + ray_trace_data_grid": 0.013579279999999994, + "border_relocator + ray_trace_data_grid": 0.012405385000000005, + "inversion_other + mapping_matrix + mesh_construction + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin": 0.011634304999999996, + "grids_and_structures + mass_profile_deflections + pdip_solve + ray_trace_data_grid": 0.009508225, + "border_relocator + pdip_solve + ray_trace_data_grid": 0.008618339999999995, + "chi_squared_evidence + pdip_solve": 0.00765336999999998, + "inversion_other + mesh_construction + mesh_seed_argmin + pdip_solve + regularization_H": 0.007190479999999996, + "inversion_other + mesh_dual_areas + mesh_locate_walk": 0.006666690000000056, + "border_relocator + pdip_solve": 0.006664104999999977, + "inversion_other + mesh_construction + pdip_solve + regularization_H": 0.006280445000000016, + "inversion_other + pdip_solve + ray_trace_data_grid": 0.0053433349999999925, + "inversion_other + regularization_H": 0.005017064999999995, + "inversion_other + mapped_reconstruction + pdip_solve + reconstruction_scatter": 0.004781205, + "inversion_other + mapped_reconstruction": 0.003705425000000002, + "mapping_matrix + pdip_solve + regularization_H": 0.003411649999999997, + "inversion_other + mesh_construction + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin": 0.0031199699999999993, + "inversion_other + mesh_construction + mesh_dual_areas + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin": 0.002990545000000002, + "inversion_other + mesh_construction + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin + regularization_H": 0.0026927449999999955, + "inversion_other + mesh_dual_areas + mesh_locate_walk + pdip_solve": 0.002580274999999995, + "inversion_other + mesh_locate_walk + mesh_seed_argmin": 0.0024767750000000027, + "inversion_other + mesh_interpolation_weights": 0.002146860000000007, + "chi_squared_evidence + inversion_other": 0.0019062150000000034, + "grids_and_structures + mass_profile_deflections + pdip_solve": 0.0013418999999999994 + }, + "example_kernels": { + "curvature_matrix_F + psf_convolution_mapping_matrix": [ + "loop_divide_gather_fusion" + ], + "pdip_solve + psf_convolution_mapping_matrix": [ + "loop_broadcast_fusion.2" + ], + "data_vector_D + pdip_solve": [ + "input_reduce_fusion.13", + "input_reduce_fusion.29" + ], + "mapped_reconstruction + pdip_solve": [ + "input_reduce_fusion.17" + ], + "mapping_matrix + pdip_solve": [ + "loop_broadcast_fusion.3", + "loop_divide_fusion" + ], + "curvature_reg_reduce_gather + inversion_other + mapped_reconstruction + pdip_solve + reconstruction_scatter": [ + "input_multiply_transpose_fusion" + ], + "pdip_solve + regularization_H": [ + "loop_select_fusion.5", + "input_transpose_fusion.5" + ], + "inversion_other + pdip_solve + regularization_H": [ + "input_transpose_fusion.6" + ], + "inversion_other + pdip_solve": [ + "input_reduce_fusion.15", + "loop_log_fusion", + "input_reduce_fusion.16", + "input_reduce_fusion.20" + ], + "inversion_other + mapping_matrix + mesh_construction + mesh_dual_areas + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin + pdip_solve": [ + "input_scatter_fusion.6", + "input_scatter_fusion.3" + ] + }, + "prorated_estimate_ms": { + "psf_convolution_mapping_matrix": 0.6209040225000002, + "curvature_matrix_F": 0.5073918950000001, + "pdip_solve": 0.3890709992142857, + "mapped_reconstruction": 0.08224161375000003, + "inversion_other": 0.06873453529761908, + "data_vector_D": 0.0628836875, + "mapping_matrix": 0.06234197750000004, + "regularization_H": 0.04246944963095235, + "reconstruction_scatter": 0.023087811249999996, + "curvature_reg_reduce_gather": 0.021892509999999997, + "ray_trace_data_grid": 0.020023280416666664, + "mesh_construction": 0.014264148630952385, + "mesh_locate_walk": 0.012508773464285734, + "border_relocator": 0.012407524999999989, + "mesh_interpolation_weights": 0.012329371380952386, + "mesh_seed_argmin": 0.011079570714285716, + "mesh_dual_areas": 0.008427758750000021, + "chi_squared_evidence": 0.004779792499999992, + "grids_and_structures": 0.00282435625, + "mass_profile_deflections": 0.00282435625 + }, + "prorated_note": "ESTIMATE ONLY \u2014 a mixed fusion's time split equally across the stages its constituents span. Never summed into the measured table, never reconciled." + }, + "other_sources_ms": { + "copy.106": 0.04187694999999879, + "copy.70": 0.014690620000000149, + "copy.75": 0.001968135000000004, + "copy.104": 0.0016524649999999945, + "copy.105": 0.001634235000000002, + "copy.61": 0.0016041399999999959, + "copy.103": 0.0007132700000000001, + "copy.40": 0.0006169449999999998 + }, + "device_span_ms": 45.249957665000004, + "device_busy_ms": 38.14474602, + "device_idle_ms": 7.105211645000004, + "largest_idle_gaps": [ + { + "gap_ms": 5.383379, + "after": "pure_callback.4", + "before": "pure_callback.4" + }, + { + "gap_ms": 0.073567, + "after": "input_reduce_fusion.3", + "before": "input_reduce_fusion.4" + }, + { + "gap_ms": 0.033919, + "after": "pure_callback.4", + "before": "copy.105" + }, + { + "gap_ms": 0.029472, + "after": "input_reduce_fusion.1", + "before": "input_reduce_fusion.2" + }, + { + "gap_ms": 0.027647, + "after": "while.40", + "before": "input_reduce_select_fusion" + }, + { + "gap_ms": 0.027584, + "after": "input_reduce_fusion.28", + "before": "loop_broadcast_fusion.2" + }, + { + "gap_ms": 0.027007, + "after": "input_concatenate_fusion.7", + "before": "pure_callback.4" + }, + { + "gap_ms": 0.024383, + "after": "copy.106", + "before": "input_reduce_fusion" + } + ], + "kernel_ms": 23.2107575, + "sum_ms": 30.315969145000004, + "wall_ms": 45.255061330008175, + "host_outside_span_ms": 0.0051036650081712764, + "reconciliation_pct": -33.01087601245214, + "unjoined_ms": 0.0, + "unjoined_pct": 0.0, + "other_ms": 0.063583, + "other_pct": 0.14049920192647877, + "note": "Stage rows attribute the command-buffers-OFF program (see the module docstring): kernel times are the same, the launch overhead the CUDA graphs remove is not. sum_ms = kernel rows + device_idle_ms; the residual against wall_ms is host_outside_span_ms (dispatch before the first kernel, teardown after the last).", + "per_stage_ms_per_lane": { + "border_relocator": 0.08934100000000002, + "chi_squared_evidence": 0.0029925, + "curvature_matrix_F": 4.204302, + "grids_and_structures": 0.001376, + "inversion_other": 1.794877, + "mapping_matrix": 0.00288, + "memset": 0.021502499999999997, + "mesh_construction": 0.002048, + "mesh_locate_walk": 0.13138900000000003, + "mesh_qhull_callback": 0.0105605, + "mesh_seed_argmin": 0.2197770000000001, + "mixed_fusion": 1.9815474999999996, + "other": 0.063583, + "pdip_solve": 7.581224, + "psf_convolution_mapping_matrix": 7.0925095, + "regularization_H": 0.010848 + }, + "per_lane_divisor": 1, + "host_callback": { + "pure_callback_span_ms": 99.45982540000001, + "qhull_ms": 92.7068144, + "callback_body_ms_note": "the OUTERMOST matching body event, not a sum: under the probe the body appears twice (the wrapper and the timed re-implementation it calls) and summing them would count the same work twice", + "events_by_name": { + "pure_callback.4": { + "count": 200, + "ms": 99.45982540000001 + }, + "$callback.py:815 _wrapped_callback": { + "count": 200, + "ms": 97.69207749999998 + }, + "$callback.py:224 _callback": { + "count": 200, + "ms": 97.22190960000005 + }, + "$callback.py:74 pure_callback_impl": { + "count": 200, + "ms": 97.04335109999998 + }, + "$callback.py:69 __call__": { + "count": 200, + "ms": 93.02880579999997 + }, + "$delaunay.py:162 ": { + "count": 200, + "ms": 92.89173760000001 + }, + "$host_callback_probe.py:225 wrapped": { + "count": 200, + "ms": 92.7068144 + }, + "$host_callback_probe.py:160 _timed_tri_only": { + "count": 200, + "ms": 92.54951359999995 + }, + "ThenExecuteCallback:GetEventForComputeStreamSyncPoint": { + "count": 200, + "ms": 0.3692834000000001 + }, + "$callback.py:822 ": { + "count": 800, + "ms": 0.2856913999999997 + }, + "$__init__.py:132 _xla_gc_callback": { + "count": 2, + "ms": 0.000327 + } + }, + "note": "HOST milliseconds per traced BATCH (the whole invocation), aggregated by name because the events nest. Not a row of the device table: the device pays for them as the idle gaps largest_idle_gaps names." + }, + "host_callback_ms": 99.45982540000001 + }, + "hlo_census": { + "status": "excluded", + "reason": "The legacy census anchors PyAutoArray source line numbers that moved after the phase-1 run. No batched attribution is published from unsupported anchors; the device-event table and wall reconciliation remain valid." + }, + "stage_map_provenance": [ + { + "label": "log_det_curvature_reg", + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 850, + 882 + ], + "requires": { + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 884, + 896 + ] + }, + "function": null + }, + { + "label": "log_det_regularization", + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 850, + 882 + ], + "requires": { + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 897, + 943 + ] + }, + "function": null + }, + { + "label": "curvature_reg_add", + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 359, + 372 + ], + "requires": null, + "function": null + }, + { + "label": "curvature_reg_reduce_gather", + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 374, + 398 + ], + "requires": null, + "function": null + }, + { + "label": "edge_subset_gather", + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 606, + 614 + ], + "requires": null, + "function": null + }, + { + "label": "regularization_term", + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 786, + 849 + ], + "requires": null, + "function": null + }, + { + "label": "mapped_reconstruction", + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 722, + 785 + ], + "requires": null, + "function": null + }, + { + "label": "reconstruction_scatter", + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 583, + 605 + ], + "requires": null, + "function": null + }, + { + "label": "reconstruction_scatter", + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 615, + 721 + ], + "requires": null, + "function": null + }, + { + "label": "certified_active_set_solve", + "path": "likelihood_breakdown/active_set_steps.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "certified_active_set_solve", + "path": "likelihood_breakdown/library_solver_injection.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "pdip_solve", + "path": "PyAutoArray/autoarray/util/jax_nnls.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "pdip_solve", + "path": "PyAutoArray/autoarray/inversion/inversion/inversion_util.py", + "lines": [ + 256, + 488 + ], + "requires": null, + "function": null + }, + { + "label": "mapped_reconstruction", + "path": "PyAutoArray/autoarray/inversion/inversion/inversion_util.py", + "lines": [ + 156, + 200 + ], + "requires": null, + "function": null + }, + { + "label": "curvature_matrix_F", + "path": "PyAutoArray/autoarray/inversion/inversion/inversion_util.py", + "lines": [ + 12, + 155 + ], + "requires": null, + "function": null + }, + { + "label": "reconstruction_scatter", + "path": "PyAutoArray/autoarray/inversion/inversion/inversion_util.py", + "lines": [ + 201, + 255 + ], + "requires": null, + "function": null + }, + { + "label": "data_vector_D", + "path": "PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py", + "lines": [ + 54, + 73 + ], + "requires": null, + "function": null + }, + { + "label": "curvature_matrix_F", + "path": "PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py", + "lines": [ + 74, + 110 + ], + "requires": null, + "function": null + }, + { + "label": "data_vector_D", + "path": "PyAutoArray/autoarray/inversion/inversion/imaging/inversion_imaging_util.py", + "lines": null, + "requires": null, + "function": "data_vector_via_blurred_mapping_matrix_from" + }, + { + "label": "curvature_matrix_F", + "path": "PyAutoArray/autoarray/inversion/inversion/imaging/inversion_imaging_util.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "psf_convolution_mapping_matrix", + "path": "likelihood_breakdown/psf_cube_injection.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "psf_convolution_mapping_matrix", + "path": "PyAutoArray/autoarray/operators/convolver.py", + "lines": [ + 1086, + 1300 + ], + "requires": null, + "function": null + }, + { + "label": "psf_convolution_mapping_matrix", + "path": "PyAutoArray/autoarray/operators/convolver.py", + "lines": [ + 632, + 642 + ], + "requires": null, + "function": null + }, + { + "label": "psf_convolution_mapping_matrix", + "path": "PyAutoArray/autoarray/operators/convolver.py", + "lines": [ + 670, + 691 + ], + "requires": null, + "function": null + }, + { + "label": "psf_convolution_mapping_matrix", + "path": "PyAutoArray/autoarray/operators/convolver.py", + "lines": null, + "requires": { + "path": "PyAutoArray/autoarray/operators/convolver.py", + "lines": [ + 1086, + 1300 + ] + }, + "function": null + }, + { + "label": "psf_convolution_mapping_matrix", + "path": "PyAutoArray/autoarray/operators/convolver.py", + "lines": null, + "requires": { + "path": "PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py", + "lines": [ + 119, + 150 + ] + }, + "function": null + }, + { + "label": "psf_convolution_image", + "path": "PyAutoArray/autoarray/operators/convolver.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "psf_convolution_mapping_matrix", + "path": "PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py", + "lines": [ + 119, + 150 + ], + "requires": null, + "function": null + }, + { + "label": "mesh_qhull_callback", + "path": "PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py", + "lines": [ + 139, + 172 + ], + "requires": null, + "function": null + }, + { + "label": "mesh_seed_argmin", + "path": "PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py", + "lines": [ + 173, + 207 + ], + "requires": null, + "function": null + }, + { + "label": "mesh_locate_walk", + "path": "PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py", + "lines": [ + 208, + 372 + ], + "requires": null, + "function": null + }, + { + "label": "mesh_dual_areas", + "path": "PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py", + "lines": [ + 373, + 396 + ], + "requires": null, + "function": null + }, + { + "label": "mesh_dual_areas", + "path": "PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py", + "lines": [ + 437, + 494 + ], + "requires": null, + "function": null + }, + { + "label": "mesh_dual_areas", + "path": "PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py", + "lines": [ + 605, + 615 + ], + "requires": null, + "function": null + }, + { + "label": "mesh_interpolation_weights", + "path": "PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py", + "lines": [ + 616, + 695 + ], + "requires": null, + "function": null + }, + { + "label": "mesh_interpolation_weights", + "path": "PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py", + "lines": [ + 896, + 1000 + ], + "requires": null, + "function": null + }, + { + "label": "mesh_construction", + "path": "PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "border_relocator", + "path": "PyAutoArray/autoarray/inversion/mesh/border_relocator.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "mesh_construction", + "path": "PyAutoArray/autoarray/inversion/mesh/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "mapping_matrix", + "path": "PyAutoArray/autoarray/inversion/mappers/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "mapping_matrix", + "path": "PyAutoArray/autoarray/inversion/mappings/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "mapping_matrix", + "path": "PyAutoArray/autoarray/inversion/linear_obj/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "regularization_H", + "path": "PyAutoArray/autoarray/inversion/regularization/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "chi_squared_evidence", + "path": "PyAutoArray/autoarray/fit/fit_util.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "chi_squared_evidence", + "path": "PyAutoArray/autoarray/fit/fit_dataset.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "ray_trace_mesh_grid", + "path": "PyAutoLens/autolens/lens/to_inversion.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "ray_trace_mesh_grid", + "path": "PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "mass_profile_deflections", + "path": "PyAutoGalaxy/autogalaxy/profiles/mass/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "light_profile_image", + "path": "PyAutoGalaxy/autogalaxy/profiles/light/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "light_profile_image", + "path": "PyAutoGalaxy/autogalaxy/operate/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "ray_trace_data_grid", + "path": "PyAutoLens/autolens/lens/tracer.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "ray_trace_data_grid", + "path": "PyAutoLens/autolens/lens/tracer_util.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "grids_and_structures", + "path": "PyAutoArray/autoarray/structures/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "grids_and_structures", + "path": "PyAutoArray/autoarray/operators/over_sampling/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "grids_and_structures", + "path": "PyAutoArray/autoarray/geometry/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "inversion_other", + "path": "PyAutoArray/autoarray/inversion/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "fit_imaging_other", + "path": "PyAutoLens/autolens/imaging/fit_imaging.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "fit_imaging_other", + "path": "PyAutoGalaxy/autogalaxy/imaging/fit_imaging.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "fit_imaging_other", + "path": "PyAutoArray/autoarray/fit/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "analysis_other", + "path": "PyAutoLens/autolens/analysis/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "analysis_other", + "path": "PyAutoGalaxy/autogalaxy/analysis/", + "lines": null, + "requires": null, + "function": null + } + ], + "trace_timing": { + "traced_wall_ms": 45.255061330008175, + "untraced_wall_ms": 44.026208385002974, + "profiler_overhead_ms": 1.228852945005201, + "profiler_overhead_pct": 2.791185046550127 + }, + "jit_phases": { + "b_s3_pdip_library_likelihood_jit": { + "lower_s": 1.5454883960010193, + "compile_s": 4.5070553999976255, + "first_call_s": 0.1545916059985757, + "steady_per_call_s": 0.05084114830024191 + }, + "d_s3_certified_fallback_library_likelihood_jit": { + "lower_s": 0.48696191500130226, + "compile_s": 4.264618340999732, + "first_call_s": 0.041661073999421205, + "steady_per_call_s": 0.031498834599915426 + } + }, + "peak_bytes": { + "after_setup": 85108992, + "after_routes": 1181653248, + "after_all": 2748252160, + "note": "jax.devices()[0].memory_stats()['peak_bytes_in_use']; None on a backend that does not report it (CPU). Process-wide high-water marks." + }, + "note": "Every stage row is a MEASURED sum of GPU kernel durations joined to library source through the optimized HLO of ONE program \u2014 not arithmetic across compilations. The rows attribute the command-buffers-OFF program: kernel time is the same as production, the launch overhead the CUDA graphs remove is not, and command_buffers.* carries both walls and their delta. sum_ms = kernel rows + measured device_idle_ms; the residual against the wall is host_outside_span_ms and is reported, not absorbed. mixed_fusion.prorated_estimate_ms is an ESTIMATE and is never part of the table. No row may be quoted if reconciliation_pct is outside 5 % or unjoined_ms is non-zero.", + "vmap": { + "batch": 20, + "lanes_mode": "captured", + "arms": [ + "vmap", + "scalar" + ], + "draw_seed": 0, + "fallback": true, + "composition": "jax.jit(jax.vmap(fn))", + "composition_provenance": "Current Fitness._vmap after PyAutoFit#1638. Array 343376 used the retired jax.vmap(jax.jit(fn)) composition and is historical evidence only.", + "headline_arm": "scalar", + "lane_rtol": 1e-09, + "lanes": [ + { + "lane": 0, + "draw_name": "call00008_lane00", + "draw_kind": "captured", + "offsets": {}, + "log_likelihood_vmap": 19851.594186486334, + "log_likelihood_scalar": 19851.594184618338, + "log_likelihood_library_pdip": 19851.59418648492, + "log_likelihood_library_pdip_scalar": 19851.59418458838, + "rel_diff_vmap_vs_library_pdip": 7.128766297883194e-14, + "rel_diff_scalar_vs_library_pdip_scalar": 1.5091360017654646e-12, + "abs_diff_nats": 1.867996616056189e-06, + "rel_diff": 9.409806581194237e-11, + "rel_diff_scalar_vs_library_pdip": 9.402677814011581e-11, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 1.8965401977766305e-06, + "rel_diff_library_pdip_vmap_vs_scalar": 9.55359141508642e-11, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": false, + "passes": 16, + "pdip_iter": null + }, + { + "lane": 1, + "draw_name": "call00008_lane01", + "draw_kind": "captured", + "offsets": {}, + "log_likelihood_vmap": -10958.375812184677, + "log_likelihood_scalar": -10958.374356418622, + "log_likelihood_library_pdip": -10958.375876322658, + "log_likelihood_library_pdip_scalar": -10958.37431769741, + "rel_diff_vmap_vs_library_pdip": 5.852872891245808e-09, + "rel_diff_scalar_vs_library_pdip_scalar": 3.5334815125361e-09, + "abs_diff_nats": 0.001455766054277774, + "rel_diff": 1.3284507418065085e-07, + "rel_diff_scalar_vs_library_pdip": 1.3869792864656004e-07, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 0.001558625248435419, + "rel_diff_library_pdip_vmap_vs_scalar": 1.4223142988630086e-07, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "FAIL", + "certified": true, + "passes": 0, + "pdip_iter": null + }, + { + "lane": 2, + "draw_name": "call00008_lane02", + "draw_kind": "captured", + "offsets": {}, + "log_likelihood_vmap": 25613.440565270328, + "log_likelihood_scalar": 25613.440570503117, + "log_likelihood_library_pdip": 25613.440565365403, + "log_likelihood_library_pdip_scalar": 25613.4405711944, + "rel_diff_vmap_vs_library_pdip": 3.711915933429714e-12, + "rel_diff_scalar_vs_library_pdip_scalar": 2.6989012079204534e-11, + "abs_diff_nats": 5.232788680586964e-06, + "rel_diff": 2.0429854654564192e-10, + "rel_diff_scalar_vs_library_pdip": 2.0058663065319176e-10, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 5.828995199408382e-06, + "rel_diff_library_pdip_vmap_vs_scalar": 2.2757564268674766e-10, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": true, + "passes": 2, + "pdip_iter": null + }, + { + "lane": 3, + "draw_name": "call00008_lane03", + "draw_kind": "captured", + "offsets": {}, + "log_likelihood_vmap": 27440.977846751717, + "log_likelihood_scalar": 27440.977846751804, + "log_likelihood_library_pdip": 27440.977846751717, + "log_likelihood_library_pdip_scalar": 27440.977846751797, + "rel_diff_vmap_vs_library_pdip": 0.0, + "rel_diff_scalar_vs_library_pdip_scalar": 2.651493563683149e-16, + "abs_diff_nats": 8.731149137020111e-11, + "rel_diff": 3.1817922764197776e-15, + "rel_diff_scalar_vs_library_pdip": 3.181792276419788e-15, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 8.003553375601768e-11, + "rel_diff_library_pdip_vmap_vs_scalar": 2.9166429200514636e-15, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": true, + "passes": 4, + "pdip_iter": null + }, + { + "lane": 4, + "draw_name": "call00008_lane04", + "draw_kind": "captured", + "offsets": {}, + "log_likelihood_vmap": 19664.888364316696, + "log_likelihood_scalar": 19664.888362180212, + "log_likelihood_library_pdip": 19664.888364316696, + "log_likelihood_library_pdip_scalar": 19664.888362180212, + "rel_diff_vmap_vs_library_pdip": 0.0, + "rel_diff_scalar_vs_library_pdip_scalar": 0.0, + "abs_diff_nats": 2.1364830899983644e-06, + "rel_diff": 1.0864455727637278e-10, + "rel_diff_scalar_vs_library_pdip": 1.0864455726456913e-10, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 2.1364830899983644e-06, + "rel_diff_library_pdip_vmap_vs_scalar": 1.0864455727637278e-10, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": false, + "passes": 16, + "pdip_iter": null + }, + { + "lane": 5, + "draw_name": "call00008_lane05", + "draw_kind": "captured", + "offsets": {}, + "log_likelihood_vmap": 19661.77570330541, + "log_likelihood_scalar": 19661.775700753395, + "log_likelihood_library_pdip": 19661.77570330541, + "log_likelihood_library_pdip_scalar": 19661.775700753395, + "rel_diff_vmap_vs_library_pdip": 0.0, + "rel_diff_scalar_vs_library_pdip_scalar": 0.0, + "abs_diff_nats": 2.552016667323187e-06, + "rel_diff": 1.2979583869555583e-10, + "rel_diff_scalar_vs_library_pdip": 1.2979583867870887e-10, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 2.552016667323187e-06, + "rel_diff_library_pdip_vmap_vs_scalar": 1.2979583869555583e-10, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": false, + "passes": 16, + "pdip_iter": null + }, + { + "lane": 6, + "draw_name": "call00008_lane06", + "draw_kind": "captured", + "offsets": {}, + "log_likelihood_vmap": 19673.09904303837, + "log_likelihood_scalar": 19673.0990419592, + "log_likelihood_library_pdip": 19673.09904303841, + "log_likelihood_library_pdip_scalar": 19673.099041959198, + "rel_diff_vmap_vs_library_pdip": 2.0341364006993936e-15, + "rel_diff_scalar_vs_library_pdip_scalar": 1.8492149098281647e-16, + "abs_diff_nats": 1.0791700333356857e-06, + "rel_diff": 5.4855111085142664e-11, + "rel_diff_scalar_vs_library_pdip": 5.485714521853417e-11, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 1.0792136890813708e-06, + "rel_diff_library_pdip_vmap_vs_scalar": 5.485733014303447e-11, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": false, + "passes": 16, + "pdip_iter": null + }, + { + "lane": 7, + "draw_name": "call00008_lane07", + "draw_kind": "captured", + "offsets": {}, + "log_likelihood_vmap": -138594.96847595746, + "log_likelihood_scalar": -138594.4868841463, + "log_likelihood_library_pdip": -138594.87238496228, + "log_likelihood_library_pdip_scalar": -138594.49976829393, + "rel_diff_vmap_vs_library_pdip": 6.933228735609044e-07, + "rel_diff_scalar_vs_library_pdip_scalar": 9.296290734042179e-08, + "abs_diff_nats": 0.4815918111708015, + "rel_diff": 3.474826611056853e-06, + "rel_diff_scalar_vs_library_pdip": 2.7814940722863277e-06, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 0.3726166683482006, + "rel_diff_library_pdip_vmap_vs_scalar": 2.6885386431002047e-06, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "FAIL", + "certified": true, + "passes": 1, + "pdip_iter": null + }, + { + "lane": 8, + "draw_name": "call00008_lane08", + "draw_kind": "captured", + "offsets": {}, + "log_likelihood_vmap": 29346.07130080086, + "log_likelihood_scalar": 29346.071300927597, + "log_likelihood_library_pdip": 29346.071300804884, + "log_likelihood_library_pdip_scalar": 29346.071300937972, + "rel_diff_vmap_vs_library_pdip": 1.3710879795119552e-13, + "rel_diff_scalar_vs_library_pdip_scalar": 3.535572258182968e-13, + "abs_diff_nats": 1.26736267702654e-07, + "rel_diff": 4.318679199101108e-12, + "rel_diff_scalar_vs_library_pdip": 4.1815704011679715e-12, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 1.3308817869983613e-07, + "rel_diff_library_pdip_vmap_vs_scalar": 4.535127626967304e-12, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": true, + "passes": 2, + "pdip_iter": null + }, + { + "lane": 9, + "draw_name": "call00008_lane09", + "draw_kind": "captured", + "offsets": {}, + "log_likelihood_vmap": 19677.044941109525, + "log_likelihood_scalar": 19677.04493926127, + "log_likelihood_library_pdip": 19677.044941109525, + "log_likelihood_library_pdip_scalar": 19677.044939261974, + "rel_diff_vmap_vs_library_pdip": 0.0, + "rel_diff_scalar_vs_library_pdip_scalar": 3.5682690766626634e-14, + "abs_diff_nats": 1.8482533050701022e-06, + "rel_diff": 9.392941423751663e-11, + "rel_diff_scalar_vs_library_pdip": 9.39294142286939e-11, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 1.8475511751603335e-06, + "rel_diff_library_pdip_vmap_vs_scalar": 9.389373154674665e-11, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": false, + "passes": 16, + "pdip_iter": null + }, + { + "lane": 10, + "draw_name": "call00008_lane10", + "draw_kind": "captured", + "offsets": {}, + "log_likelihood_vmap": 28165.25603001419, + "log_likelihood_scalar": 28165.256030015575, + "log_likelihood_library_pdip": 28165.25603001424, + "log_likelihood_library_pdip_scalar": 28165.256030015487, + "rel_diff_vmap_vs_library_pdip": 1.8083167163475712e-15, + "rel_diff_scalar_vs_library_pdip_scalar": 3.0999715137385565e-15, + "abs_diff_nats": 1.3860699255019426e-09, + "rel_diff": 4.9212047780599427e-14, + "rel_diff_scalar_vs_library_pdip": 4.740373106425419e-14, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 1.2478267308324575e-09, + "rel_diff_library_pdip_vmap_vs_scalar": 4.4303759550513534e-14, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": true, + "passes": 4, + "pdip_iter": null + }, + { + "lane": 11, + "draw_name": "call00008_lane11", + "draw_kind": "captured", + "offsets": {}, + "log_likelihood_vmap": 19843.379608088013, + "log_likelihood_scalar": 19843.379606979215, + "log_likelihood_library_pdip": 19843.379608088027, + "log_likelihood_library_pdip_scalar": 19843.37960675095, + "rel_diff_vmap_vs_library_pdip": 7.333385499733921e-16, + "rel_diff_scalar_vs_library_pdip_scalar": 1.1503331830295235e-11, + "abs_diff_nats": 1.1087977327406406e-06, + "rel_diff": 5.5877464156894916e-11, + "rel_diff_scalar_vs_library_pdip": 5.587819749232256e-11, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 1.3370772649068385e-06, + "rel_diff_library_pdip_vmap_vs_scalar": 6.738152932638296e-11, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": false, + "passes": 16, + "pdip_iter": null + }, + { + "lane": 12, + "draw_name": "call00008_lane12", + "draw_kind": "captured", + "offsets": {}, + "log_likelihood_vmap": 27027.609847821266, + "log_likelihood_scalar": 27027.609847821303, + "log_likelihood_library_pdip": 27027.60984782127, + "log_likelihood_library_pdip_scalar": 27027.609847821303, + "rel_diff_vmap_vs_library_pdip": 1.3460231324839016e-16, + "rel_diff_scalar_vs_library_pdip_scalar": 0.0, + "abs_diff_nats": 3.637978807091713e-11, + "rel_diff": 1.3460231324838999e-15, + "rel_diff_scalar_vs_library_pdip": 1.2114208192355113e-15, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 3.2741809263825417e-11, + "rel_diff_library_pdip_vmap_vs_scalar": 1.2114208192355099e-15, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": true, + "passes": 5, + "pdip_iter": null + }, + { + "lane": 13, + "draw_name": "call00008_lane13", + "draw_kind": "captured", + "offsets": {}, + "log_likelihood_vmap": 19663.70492707598, + "log_likelihood_scalar": 19663.704925197264, + "log_likelihood_library_pdip": 19663.70492707598, + "log_likelihood_library_pdip_scalar": 19663.704925197264, + "rel_diff_vmap_vs_library_pdip": 0.0, + "rel_diff_scalar_vs_library_pdip_scalar": 0.0, + "abs_diff_nats": 1.8787177396006882e-06, + "rel_diff": 9.554240906011973e-11, + "rel_diff_scalar_vs_library_pdip": 9.554240905099138e-11, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 1.8787177396006882e-06, + "rel_diff_library_pdip_vmap_vs_scalar": 9.554240906011973e-11, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": false, + "passes": 16, + "pdip_iter": null + }, + { + "lane": 14, + "draw_name": "call00008_lane14", + "draw_kind": "captured", + "offsets": {}, + "log_likelihood_vmap": 29194.371371494042, + "log_likelihood_scalar": 29194.371405171616, + "log_likelihood_library_pdip": 29194.371375409144, + "log_likelihood_library_pdip_scalar": 29194.371408436054, + "rel_diff_vmap_vs_library_pdip": 1.3410468039807402e-10, + "rel_diff_scalar_vs_library_pdip_scalar": 1.1181739019028348e-10, + "abs_diff_nats": 3.3677573810564354e-05, + "rel_diff": 1.1535639299498179e-09, + "rel_diff_scalar_vs_library_pdip": 1.0194592507277552e-09, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 3.302691038697958e-05, + "rel_diff_library_pdip_vmap_vs_scalar": 1.1312766397647481e-09, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": true, + "passes": 2, + "pdip_iter": null + }, + { + "lane": 15, + "draw_name": "call00008_lane15", + "draw_kind": "captured", + "offsets": {}, + "log_likelihood_vmap": -101907.24804153161, + "log_likelihood_scalar": -101907.22229733448, + "log_likelihood_library_pdip": -101907.247822813, + "log_likelihood_library_pdip_scalar": -101907.22432394432, + "rel_diff_vmap_vs_library_pdip": 2.146251698400429e-09, + "rel_diff_scalar_vs_library_pdip_scalar": 1.9886812314253562e-08, + "abs_diff_nats": 0.025744197133462876, + "rel_diff": 2.526238725097333e-07, + "rel_diff_scalar_vs_library_pdip": 2.504775575347223e-07, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 0.023498868686147034, + "rel_diff_library_pdip_vmap_vs_scalar": 2.305908029782899e-07, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "FAIL", + "certified": true, + "passes": 1, + "pdip_iter": null + }, + { + "lane": 16, + "draw_name": "call00008_lane16", + "draw_kind": "captured", + "offsets": {}, + "log_likelihood_vmap": -31483.763420418487, + "log_likelihood_scalar": -31483.76057136085, + "log_likelihood_library_pdip": -31483.763487254226, + "log_likelihood_library_pdip_scalar": -31483.760853352404, + "rel_diff_vmap_vs_library_pdip": 2.122863705985548e-09, + "rel_diff_scalar_vs_library_pdip_scalar": 8.956730258698351e-09, + "abs_diff_nats": 0.0028490576369222254, + "rel_diff": 9.049292667769383e-08, + "rel_diff_scalar_vs_library_pdip": 9.26157820026062e-08, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 0.0026339018222643062, + "rel_diff_library_pdip_vmap_vs_scalar": 8.365905949205707e-08, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "FAIL", + "certified": true, + "passes": 2, + "pdip_iter": null + }, + { + "lane": 17, + "draw_name": "call00008_lane17", + "draw_kind": "captured", + "offsets": {}, + "log_likelihood_vmap": -171697.7673404122, + "log_likelihood_scalar": -171697.7278754632, + "log_likelihood_library_pdip": -171697.76693512418, + "log_likelihood_library_pdip_scalar": -171697.7290058413, + "rel_diff_vmap_vs_library_pdip": 2.3604733923133895e-09, + "rel_diff_scalar_vs_library_pdip_scalar": 6.583535572392634e-09, + "abs_diff_nats": 0.03946494898991659, + "rel_diff": 2.2985131765134096e-07, + "rel_diff_scalar_vs_library_pdip": 2.274907919699693e-07, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 0.03792928287293762, + "rel_diff_library_pdip_vmap_vs_scalar": 2.209073066519548e-07, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "FAIL", + "certified": true, + "passes": 0, + "pdip_iter": null + }, + { + "lane": 18, + "draw_name": "call00008_lane18", + "draw_kind": "captured", + "offsets": {}, + "log_likelihood_vmap": 21885.39202805571, + "log_likelihood_scalar": 21885.392028027192, + "log_likelihood_library_pdip": 21885.392028055823, + "log_likelihood_library_pdip_scalar": 21885.39202803019, + "rel_diff_vmap_vs_library_pdip": 5.153087633763607e-15, + "rel_diff_scalar_vs_library_pdip_scalar": 1.3697239387826405e-13, + "abs_diff_nats": 2.8518115868791938e-08, + "rel_diff": 1.3030662568105084e-12, + "rel_diff_scalar_vs_library_pdip": 1.3082193444425675e-12, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 2.563319867476821e-08, + "rel_diff_library_pdip_vmap_vs_scalar": 1.1712469505658357e-12, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": false, + "passes": 16, + "pdip_iter": null + }, + { + "lane": 19, + "draw_name": "call00008_lane19", + "draw_kind": "captured", + "offsets": {}, + "log_likelihood_vmap": 17967.17162258647, + "log_likelihood_scalar": 17967.17164893869, + "log_likelihood_library_pdip": 17967.171622357222, + "log_likelihood_library_pdip_scalar": 17967.17165006061, + "rel_diff_vmap_vs_library_pdip": 1.2759227737526779e-11, + "rel_diff_scalar_vs_library_pdip_scalar": 6.244276751783778e-11, + "abs_diff_nats": 2.6352219720138237e-05, + "rel_diff": 1.4666871467048542e-09, + "rel_diff_scalar_vs_library_pdip": 1.479446376612266e-09, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 2.770338687696494e-05, + "rel_diff_library_pdip_vmap_vs_scalar": 1.5418891418489615e-09, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": true, + "passes": 1, + "pdip_iter": null + } + ], + "lane_pins": [ + { + "pin": "lane 0: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 19851.594186486334, + "reference_value": 19851.59418648492, + "rel_diff": 7.128766297883194e-14, + "abs_diff_nats": 1.4151737559586763e-09, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 0: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 19851.594184618338, + "reference_value": 19851.59418458838, + "rel_diff": 1.5091360017654646e-12, + "abs_diff_nats": 2.9958755476400256e-08, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 0: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 19851.594186486334, + "reference_value": 19851.594184618338, + "rel_diff": 9.409806581194237e-11, + "abs_diff_nats": 1.867996616056189e-06, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 0: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 19851.59418648492, + "reference_value": 19851.59418458838, + "rel_diff": 9.55359141508642e-11, + "abs_diff_nats": 1.8965401977766305e-06, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 1: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -10958.375812184677, + "reference_value": -10958.375876322658, + "rel_diff": 5.852872891245808e-09, + "abs_diff_nats": 6.413798109861091e-05, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 1: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -10958.374356418622, + "reference_value": -10958.37431769741, + "rel_diff": 3.5334815125361e-09, + "abs_diff_nats": 3.87212130590342e-05, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 1: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -10958.375812184677, + "reference_value": -10958.374356418622, + "rel_diff": 1.3284507418065085e-07, + "abs_diff_nats": 0.001455766054277774, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 1: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -10958.375876322658, + "reference_value": -10958.37431769741, + "rel_diff": 1.4223142988630086e-07, + "abs_diff_nats": 0.001558625248435419, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 2: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 25613.440565270328, + "reference_value": 25613.440565365403, + "rel_diff": 3.711915933429714e-12, + "abs_diff_nats": 9.507493814453483e-08, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 2: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 25613.440570503117, + "reference_value": 25613.4405711944, + "rel_diff": 2.6989012079204534e-11, + "abs_diff_nats": 6.912814569659531e-07, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 2: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 25613.440565270328, + "reference_value": 25613.440570503117, + "rel_diff": 2.0429854654564192e-10, + "abs_diff_nats": 5.232788680586964e-06, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 2: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 25613.440565365403, + "reference_value": 25613.4405711944, + "rel_diff": 2.2757564268674766e-10, + "abs_diff_nats": 5.828995199408382e-06, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 3: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 27440.977846751717, + "reference_value": 27440.977846751717, + "rel_diff": 0.0, + "abs_diff_nats": 0.0, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 3: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 27440.977846751804, + "reference_value": 27440.977846751797, + "rel_diff": 2.651493563683149e-16, + "abs_diff_nats": 7.275957614183426e-12, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 3: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 27440.977846751717, + "reference_value": 27440.977846751804, + "rel_diff": 3.1817922764197776e-15, + "abs_diff_nats": 8.731149137020111e-11, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 3: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 27440.977846751717, + "reference_value": 27440.977846751797, + "rel_diff": 2.9166429200514636e-15, + "abs_diff_nats": 8.003553375601768e-11, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 4: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 19664.888364316696, + "reference_value": 19664.888364316696, + "rel_diff": 0.0, + "abs_diff_nats": 0.0, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 4: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 19664.888362180212, + "reference_value": 19664.888362180212, + "rel_diff": 0.0, + "abs_diff_nats": 0.0, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 4: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 19664.888364316696, + "reference_value": 19664.888362180212, + "rel_diff": 1.0864455727637278e-10, + "abs_diff_nats": 2.1364830899983644e-06, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 4: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 19664.888364316696, + "reference_value": 19664.888362180212, + "rel_diff": 1.0864455727637278e-10, + "abs_diff_nats": 2.1364830899983644e-06, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 5: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 19661.77570330541, + "reference_value": 19661.77570330541, + "rel_diff": 0.0, + "abs_diff_nats": 0.0, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 5: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 19661.775700753395, + "reference_value": 19661.775700753395, + "rel_diff": 0.0, + "abs_diff_nats": 0.0, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 5: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 19661.77570330541, + "reference_value": 19661.775700753395, + "rel_diff": 1.2979583869555583e-10, + "abs_diff_nats": 2.552016667323187e-06, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 5: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 19661.77570330541, + "reference_value": 19661.775700753395, + "rel_diff": 1.2979583869555583e-10, + "abs_diff_nats": 2.552016667323187e-06, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 6: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 19673.09904303837, + "reference_value": 19673.09904303841, + "rel_diff": 2.0341364006993936e-15, + "abs_diff_nats": 4.001776687800884e-11, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 6: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 19673.0990419592, + "reference_value": 19673.099041959198, + "rel_diff": 1.8492149098281647e-16, + "abs_diff_nats": 3.637978807091713e-12, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 6: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 19673.09904303837, + "reference_value": 19673.0990419592, + "rel_diff": 5.4855111085142664e-11, + "abs_diff_nats": 1.0791700333356857e-06, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 6: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 19673.09904303841, + "reference_value": 19673.099041959198, + "rel_diff": 5.485733014303447e-11, + "abs_diff_nats": 1.0792136890813708e-06, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 7: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -138594.96847595746, + "reference_value": -138594.87238496228, + "rel_diff": 6.933228735609044e-07, + "abs_diff_nats": 0.09609099518274888, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 7: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -138594.4868841463, + "reference_value": -138594.49976829393, + "rel_diff": 9.296290734042179e-08, + "abs_diff_nats": 0.012884147639852017, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 7: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -138594.96847595746, + "reference_value": -138594.4868841463, + "rel_diff": 3.474826611056853e-06, + "abs_diff_nats": 0.4815918111708015, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 7: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -138594.87238496228, + "reference_value": -138594.49976829393, + "rel_diff": 2.6885386431002047e-06, + "abs_diff_nats": 0.3726166683482006, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 8: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 29346.07130080086, + "reference_value": 29346.071300804884, + "rel_diff": 1.3710879795119552e-13, + "abs_diff_nats": 4.0236045606434345e-09, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 8: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 29346.071300927597, + "reference_value": 29346.071300937972, + "rel_diff": 3.535572258182968e-13, + "abs_diff_nats": 1.0375515557825565e-08, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 8: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 29346.07130080086, + "reference_value": 29346.071300927597, + "rel_diff": 4.318679199101108e-12, + "abs_diff_nats": 1.26736267702654e-07, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 8: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 29346.071300804884, + "reference_value": 29346.071300937972, + "rel_diff": 4.535127626967304e-12, + "abs_diff_nats": 1.3308817869983613e-07, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 9: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 19677.044941109525, + "reference_value": 19677.044941109525, + "rel_diff": 0.0, + "abs_diff_nats": 0.0, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 9: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 19677.04493926127, + "reference_value": 19677.044939261974, + "rel_diff": 3.5682690766626634e-14, + "abs_diff_nats": 7.021299097687006e-10, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 9: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 19677.044941109525, + "reference_value": 19677.04493926127, + "rel_diff": 9.392941423751663e-11, + "abs_diff_nats": 1.8482533050701022e-06, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 9: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 19677.044941109525, + "reference_value": 19677.044939261974, + "rel_diff": 9.389373154674665e-11, + "abs_diff_nats": 1.8475511751603335e-06, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 10: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 28165.25603001419, + "reference_value": 28165.25603001424, + "rel_diff": 1.8083167163475712e-15, + "abs_diff_nats": 5.093170329928398e-11, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 10: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 28165.256030015575, + "reference_value": 28165.256030015487, + "rel_diff": 3.0999715137385565e-15, + "abs_diff_nats": 8.731149137020111e-11, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 10: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 28165.25603001419, + "reference_value": 28165.256030015575, + "rel_diff": 4.9212047780599427e-14, + "abs_diff_nats": 1.3860699255019426e-09, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 10: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 28165.25603001424, + "reference_value": 28165.256030015487, + "rel_diff": 4.4303759550513534e-14, + "abs_diff_nats": 1.2478267308324575e-09, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 11: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 19843.379608088013, + "reference_value": 19843.379608088027, + "rel_diff": 7.333385499733921e-16, + "abs_diff_nats": 1.4551915228366852e-11, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 11: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 19843.379606979215, + "reference_value": 19843.37960675095, + "rel_diff": 1.1503331830295235e-11, + "abs_diff_nats": 2.2826498025096953e-07, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 11: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 19843.379608088013, + "reference_value": 19843.379606979215, + "rel_diff": 5.5877464156894916e-11, + "abs_diff_nats": 1.1087977327406406e-06, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 11: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 19843.379608088027, + "reference_value": 19843.37960675095, + "rel_diff": 6.738152932638296e-11, + "abs_diff_nats": 1.3370772649068385e-06, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 12: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 27027.609847821266, + "reference_value": 27027.60984782127, + "rel_diff": 1.3460231324839016e-16, + "abs_diff_nats": 3.637978807091713e-12, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 12: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 27027.609847821303, + "reference_value": 27027.609847821303, + "rel_diff": 0.0, + "abs_diff_nats": 0.0, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 12: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 27027.609847821266, + "reference_value": 27027.609847821303, + "rel_diff": 1.3460231324838999e-15, + "abs_diff_nats": 3.637978807091713e-11, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 12: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 27027.60984782127, + "reference_value": 27027.609847821303, + "rel_diff": 1.2114208192355099e-15, + "abs_diff_nats": 3.2741809263825417e-11, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 13: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 19663.70492707598, + "reference_value": 19663.70492707598, + "rel_diff": 0.0, + "abs_diff_nats": 0.0, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 13: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 19663.704925197264, + "reference_value": 19663.704925197264, + "rel_diff": 0.0, + "abs_diff_nats": 0.0, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 13: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 19663.70492707598, + "reference_value": 19663.704925197264, + "rel_diff": 9.554240906011973e-11, + "abs_diff_nats": 1.8787177396006882e-06, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 13: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 19663.70492707598, + "reference_value": 19663.704925197264, + "rel_diff": 9.554240906011973e-11, + "abs_diff_nats": 1.8787177396006882e-06, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 14: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 29194.371371494042, + "reference_value": 29194.371375409144, + "rel_diff": 1.3410468039807402e-10, + "abs_diff_nats": 3.915101842721924e-06, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 14: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 29194.371405171616, + "reference_value": 29194.371408436054, + "rel_diff": 1.1181739019028348e-10, + "abs_diff_nats": 3.26443841913715e-06, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 14: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 29194.371371494042, + "reference_value": 29194.371405171616, + "rel_diff": 1.1535639299498179e-09, + "abs_diff_nats": 3.3677573810564354e-05, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 14: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 29194.371375409144, + "reference_value": 29194.371408436054, + "rel_diff": 1.1312766397647481e-09, + "abs_diff_nats": 3.302691038697958e-05, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 15: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -101907.24804153161, + "reference_value": -101907.247822813, + "rel_diff": 2.146251698400429e-09, + "abs_diff_nats": 0.00021871860371902585, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 15: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -101907.22229733448, + "reference_value": -101907.22432394432, + "rel_diff": 1.9886812314253562e-08, + "abs_diff_nats": 0.002026609843596816, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 15: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -101907.24804153161, + "reference_value": -101907.22229733448, + "rel_diff": 2.526238725097333e-07, + "abs_diff_nats": 0.025744197133462876, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 15: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -101907.247822813, + "reference_value": -101907.22432394432, + "rel_diff": 2.305908029782899e-07, + "abs_diff_nats": 0.023498868686147034, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 16: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -31483.763420418487, + "reference_value": -31483.763487254226, + "rel_diff": 2.122863705985548e-09, + "abs_diff_nats": 6.6835738834925e-05, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 16: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -31483.76057136085, + "reference_value": -31483.760853352404, + "rel_diff": 8.956730258698351e-09, + "abs_diff_nats": 0.0002819915534928441, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 16: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -31483.763420418487, + "reference_value": -31483.76057136085, + "rel_diff": 9.049292667769383e-08, + "abs_diff_nats": 0.0028490576369222254, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 16: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -31483.763487254226, + "reference_value": -31483.760853352404, + "rel_diff": 8.365905949205707e-08, + "abs_diff_nats": 0.0026339018222643062, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 17: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -171697.7673404122, + "reference_value": -171697.76693512418, + "rel_diff": 2.3604733923133895e-09, + "abs_diff_nats": 0.0004052880103699863, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 17: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -171697.7278754632, + "reference_value": -171697.7290058413, + "rel_diff": 6.583535572392634e-09, + "abs_diff_nats": 0.0011303781066089869, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 17: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -171697.7673404122, + "reference_value": -171697.7278754632, + "rel_diff": 2.2985131765134096e-07, + "abs_diff_nats": 0.03946494898991659, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 17: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -171697.76693512418, + "reference_value": -171697.7290058413, + "rel_diff": 2.209073066519548e-07, + "abs_diff_nats": 0.03792928287293762, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 18: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 21885.39202805571, + "reference_value": 21885.392028055823, + "rel_diff": 5.153087633763607e-15, + "abs_diff_nats": 1.127773430198431e-10, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 18: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 21885.392028027192, + "reference_value": 21885.39202803019, + "rel_diff": 1.3697239387826405e-13, + "abs_diff_nats": 2.9976945370435715e-09, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 18: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 21885.39202805571, + "reference_value": 21885.392028027192, + "rel_diff": 1.3030662568105084e-12, + "abs_diff_nats": 2.8518115868791938e-08, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 18: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 21885.392028055823, + "reference_value": 21885.39202803019, + "rel_diff": 1.1712469505658357e-12, + "abs_diff_nats": 2.563319867476821e-08, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 19: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 17967.17162258647, + "reference_value": 17967.171622357222, + "rel_diff": 1.2759227737526779e-11, + "abs_diff_nats": 2.292472345288843e-07, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 19: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 17967.17164893869, + "reference_value": 17967.17165006061, + "rel_diff": 6.244276751783778e-11, + "abs_diff_nats": 1.1219199222978204e-06, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 19: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 17967.17162258647, + "reference_value": 17967.17164893869, + "rel_diff": 1.4666871467048542e-09, + "abs_diff_nats": 2.6352219720138237e-05, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 19: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 17967.171622357222, + "reference_value": 17967.17165006061, + "rel_diff": 1.5418891418489615e-09, + "abs_diff_nats": 2.770338687696494e-05, + "within_rtol": false, + "status": "RECORDED" + } + ], + "lanes_failed": 5, + "arm_rows": { + "vmap": { + "arm": "vmap", + "program": "jax.jit(jax.vmap(fn))", + "stands_for": "Nautilus(use_jax_vmap=True) \u2014 Fitness._vmap", + "hlo_source": "jax.jit(jax.vmap(fn)).lower(batched_tree) \u2014 the exact current Fitness._vmap composition (PyAutoFit#1638)", + "batch_wall_ms": 681.3387948001036, + "wall_production_nesting_ms": 681.3387948001036, + "wall_aot_command_buffers_on_ms": 680.8388437999383, + "wall_aot_command_buffers_off_ms": 681.9248232000973, + "command_buffer_delta_ms": 1.0859794001589762, + "production_nesting_vs_aot_on_delta_ms": 0.4999510001653107, + "production_nesting_vs_aot_on_delta_pct": 0.07343162111241397, + "wall_per_lane_ms": 34.06693974000518, + "wall_per_lane_command_buffers_off_ms": 34.096241160004865, + "traced_batch_wall_ms": 694.4553516001179, + "untraced_batch_wall_ms": 682.3508086999936, + "traced_wall_per_lane_ms": 34.72276758000589, + "callback_count_per_call": 1.0, + "callback_count_per_lane": 0.05, + "callback_expectation": "B per batched call \u2014 the qhull pure_callback is vmap_method='sequential'", + "host_qhull_ms": 4.979791300866054, + "host_tables_ms": 0.19874719946528785, + "host_qhull_ms_per_lane": 0.24898956504330272, + "host_tables_ms_per_lane": 0.009937359973264392, + "host_callback_probe": { + "calls": 10, + "qhull_ms_total": 49.797913008660544, + "tables_ms_total": 1.9874719946528785, + "total_ms_total": 51.78538500331342, + "qhull_ms_mean": 4.979791300866054, + "tables_ms_mean": 0.19874719946528785, + "total_ms_mean": 5.178538500331342, + "non_finite_calls": 0, + "n_points": [ + 1500 + ] + }, + "host_callback_records_first": [ + { + "n_points": 1500, + "qhull_ms": 4.746190999867395, + "tables_ms": 0.1888879996840842, + "total_ms": 4.935078999551479, + "finite": true + }, + { + "n_points": 1500, + "qhull_ms": 5.062188000010792, + "tables_ms": 0.2048499991360586, + "total_ms": 5.267037999146851, + "finite": true + }, + { + "n_points": 1500, + "qhull_ms": 4.9739800015231594, + "tables_ms": 0.19955899915657938, + "total_ms": 5.173539000679739, + "finite": true + }, + { + "n_points": 1500, + "qhull_ms": 5.075878998468397, + "tables_ms": 0.2410790002613794, + "total_ms": 5.316957998729777, + "finite": true + } + ], + "device_idle_ms": 37.888499199999956, + "device_idle_ms_per_lane": 1.8944249599999978, + "trace": { + "parser": "ProfileData.from_file(xplane) + as_text() + stack_frame_index(proto field 17)", + "stage_audit": { + "mixed_fusion": [ + { + "instruction": "input_multiply_transpose_fusion", + "ms": 1.6149656000000001, + "opcode": "fusion", + "shape": "(f64[20,1500,1500]{2,1,0}, f64[20,1500,1500]{2,1,0}, f64[20,1500,1500]{2,1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986 (AbstractInversion._log_det_symmetric_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:1078 (AbstractInversion.log_det_curvature_reg_matrix_term)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:347 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/model/analysis.py:135 (AnalysisImaging.log_likelihood_function)" + ] + }, + { + "instruction": "input_add_transpose_fusion", + "ms": 1.3402835, + "opcode": "fusion", + "shape": "(f64[20,1500,1500]{2,1,0}, f64[20,1500,1500]{2,1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:237 (active_set_search)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:293 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:274 (_certified_positive_only_from)" + ] + }, + { + "instruction": "loop_divide_gather_fusion", + "ms": 1.0153548, + "opcode": "fusion", + "shape": "(f64[15361,1500]{1,0}, f64[15361,1,1,1500]{3,2,1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:133", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:133 (curvature_matrix_via_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:93 (InversionImagingMapping.curvature_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:389 (AbstractInversion.curvature_reg_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "input_transpose_fusion.6", + "ms": 0.5903727, + "opcode": "fusion", + "shape": "f64[20,1500,1500]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:297 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:274 (_certified_positive_only_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:496 (reconstruction_positive_only_from)" + ] + }, + { + "instruction": "loop_broadcast_fusion", + "ms": 0.34369320000000003, + "opcode": "fusion", + "shape": "f64[20,1500,1500]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:579", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:579 (pixel_splitted_regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt_split.py:137 (AdaptSplit.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:332 (AbstractInversion.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "loop_broadcast_fusion.6", + "ms": 0.23001630000000003, + "opcode": "fusion", + "shape": "f64[1500,180,180]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:303 (AbstractInversion.operated_mapping_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:68 (InversionImagingMapping.data_vector)" + ] + } + ], + "pdip_solve": [ + { + "instruction": "cholesky.80", + "ms": 184.57365099994976, + "opcode": "custom-call", + "shape": "(f64[20,1500,1500]{1,2,0}, s32[20]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:106", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:106 (factorize_kkt)", + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:212 (pdip_pc_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:83 (solve_nnls)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:129 (_solve_nnls_primal_with..primal)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:164 (solve_nnls_primal_with_status)" + ] + }, + { + "instruction": "cholesky.60", + "ms": 113.14958399997901, + "opcode": "custom-call", + "shape": "(f64[20,1500,1500]{1,2,0}, s32[20]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:252 (active_set_search..body_fun)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:262 (active_set_search)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:293 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)" + ] + }, + { + "instruction": "triangular-solve", + "ms": 47.45080380000236, + "opcode": "custom-call", + "shape": "(f64[20,1500,1]{1,2,0}, s8[320]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146 (solve_kkt_rhs)", + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:213 (pdip_pc_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:83 (solve_nnls)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:129 (_solve_nnls_primal_with..primal)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:164 (solve_nnls_primal_with_status)" + ] + }, + { + "instruction": "triangular-solve.2", + "ms": 44.236492400003094, + "opcode": "custom-call", + "shape": "(f64[20,1500,1]{1,2,0}, s8[320]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146 (solve_kkt_rhs)", + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:217 (pdip_pc_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:83 (solve_nnls)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:129 (_solve_nnls_primal_with..primal)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:164 (solve_nnls_primal_with_status)" + ] + }, + { + "instruction": "triangular-solve.3", + "ms": 43.190664000000254, + "opcode": "custom-call", + "shape": "(f64[20,1500,1]{1,2,0}, s8[320]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146 (solve_kkt_rhs)", + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:217 (pdip_pc_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:83 (solve_nnls)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:129 (_solve_nnls_primal_with..primal)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:164 (solve_nnls_primal_with_status)" + ] + }, + { + "instruction": "triangular-solve.1", + "ms": 43.065406500001316, + "opcode": "custom-call", + "shape": "(f64[20,1500,1]{1,2,0}, s8[320]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146 (solve_kkt_rhs)", + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:213 (pdip_pc_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:83 (solve_nnls)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:129 (_solve_nnls_primal_with..primal)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:164 (solve_nnls_primal_with_status)" + ] + } + ], + "other": [ + { + "instruction": "copy.107", + "ms": 0.04176340000000012, + "opcode": "copy", + "shape": "f64[1,1024,2]{2,1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "copy.92", + "ms": 0.037878699999999946, + "opcode": "copy", + "shape": "s32[20]{0}", + "source": "", + "stack": [] + }, + { + "instruction": "copy.91", + "ms": 0.034768100000000045, + "opcode": "copy", + "shape": "pred[20]{0}", + "source": "", + "stack": [] + }, + { + "instruction": "copy.93", + "ms": 0.033184200000000046, + "opcode": "copy", + "shape": "pred[20,1500]{1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "copy.58", + "ms": 0.014691099999999993, + "opcode": "copy", + "shape": "s32[21361]{0}", + "source": "", + "stack": [] + }, + { + "instruction": "copy.105", + "ms": 0.0020832000000000003, + "opcode": "copy", + "shape": "s64[]", + "source": "", + "stack": [] + } + ], + "mesh_seed_argmin": [ + { + "instruction": "input_reduce_fusion", + "ms": 0.14378880000000016, + "opcode": "fusion", + "shape": "(f64[1024]{0}, s64[1024]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:191", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:191 (_nearest_vertex_seed_from..argmin_chunk)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204 (_nearest_vertex_seed_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:351 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)" + ] + }, + { + "instruction": "loop_dynamic_update_slice_fusion", + "ms": 0.04071049999999997, + "opcode": "fusion", + "shape": "s32[21,1024]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204 (_nearest_vertex_seed_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:351 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "loop_add_fusion", + "ms": 0.03130249999999994, + "opcode": "fusion", + "shape": "s64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204 (_nearest_vertex_seed_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:351 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "loop_broadcast_fusion.2", + "ms": 0.0019456, + "opcode": "fusion", + "shape": "s32[21,1024]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204 (_nearest_vertex_seed_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:351 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "border_relocator": [ + { + "instruction": "eigh.45", + "ms": 0.07453439999999996, + "opcode": "custom-call", + "shape": "(f64[2,2]{0,1}, f64[2]{0}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:245", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:245 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:454 (BorderRelocator.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:176 (AbstractMesh.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:214 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "custom-call.3", + "ms": 0.0079328, + "opcode": "custom-call", + "shape": "(f64[2,2]{1,0}, s8[4194304]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:242", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:242 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:454 (BorderRelocator.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:176 (AbstractMesh.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:214 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "loop_add_fusion.5", + "ms": 0.0028094999999999995, + "opcode": "fusion", + "shape": "f64[1500]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:308", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:308 (relocated_grid_via_ellipse_border_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:458 (BorderRelocator.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:176 (AbstractMesh.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:214 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "input_reduce_fusion.29", + "ms": 0.0016032, + "opcode": "fusion", + "shape": "f64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:256", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:256 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:454 (BorderRelocator.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:176 (AbstractMesh.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:214 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "loop_multiply_fusion.4", + "ms": 0.0015456, + "opcode": "fusion", + "shape": "f64[2,2]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:245", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:245 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:454 (BorderRelocator.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:176 (AbstractMesh.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:214 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + } + ], + "regularization_H": [ + { + "instruction": "input_scatter_fusion.10", + "ms": 0.0036576000000000004, + "opcode": "fusion", + "shape": "f64[20,1500,1500]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:615", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:615 (pixel_splitted_regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt_split.py:137 (AdaptSplit.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:332 (AbstractInversion.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "input_concatenate_fusion.8", + "ms": 0.0017504000000000003, + "opcode": "fusion", + "shape": "pred[3]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:94", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:94 (split_points_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:410 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + }, + { + "instruction": "wrapped_slice", + "ms": 0.0016415999999999998, + "opcode": "fusion", + "shape": "s32[1]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:94", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:94 (split_points_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:410 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + }, + { + "instruction": "wrapped_slice.1", + "ms": 0.0016127999999999997, + "opcode": "fusion", + "shape": "s32[1]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:90", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:90 (split_points_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:410 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + }, + { + "instruction": "loop_slice_fusion", + "ms": 0.0014944000000000001, + "opcode": "fusion", + "shape": "s32[1,1]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:94", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:94 (split_points_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:410 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + }, + { + "instruction": "loop_slice_fusion.1", + "ms": 0.0014944000000000001, + "opcode": "fusion", + "shape": "s32[1,1]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:90", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:90 (split_points_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:410 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + } + ], + "grids_and_structures": [ + { + "instruction": "loop_multiply_sine_fusion", + "ms": 0.0013568, + "opcode": "fusion", + "shape": "(f64[], f64[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/geometry/geometry_util.py:527", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/geometry/geometry_util.py:527 (transform_grid_2d_to_reference_frame)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/profiles/geometry_profiles.py:418 (EllProfile.transformed_to_reference_frame_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/structures/decorators/abstract.py:93 (AbstractMaker.evaluate_func)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/structures/decorators/abstract.py:112 (AbstractMaker.result)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/structures/decorators/to_grid.py:70 (to_grid..wrapper)" + ] + } + ], + "mesh_construction": [ + { + "instruction": "input_concatenate_fusion.7", + "ms": 0.0020448, + "opcode": "fusion", + "shape": "f64[1500,2]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:820", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:820 (InterpolatorDelaunay.mesh_grid_xy)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:847 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + } + ], + "mesh_qhull_callback": [ + { + "instruction": "pure_callback.4", + "ms": 0.0107361, + "opcode": "custom-call", + "shape": "(s32[3000,3]{1,0}, s32[3000,3]{1,0}, s32[1500]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:161", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:161 (_jax_delaunay_tables)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:405 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + } + ], + "mesh_locate_walk": [ + { + "instruction": "loop_reduce_fusion", + "ms": 0.022582399999999985, + "opcode": "fusion", + "shape": "(f64[21361]{0}, s64[21361]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:264", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:264 (_walk_from_seed..walk_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:292 (_walk_from_seed..body)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:264 (_walk_from_seed..walk_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:292 (_walk_from_seed..body)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)" + ] + }, + { + "instruction": "input_reduce_fusion.1", + "ms": 0.02226550000000002, + "opcode": "fusion", + "shape": "pred[196]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:288", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:288 (_walk_from_seed..cond)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:353 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)" + ] + }, + { + "instruction": "loop_or_select_fusion", + "ms": 0.019187199999999998, + "opcode": "fusion", + "shape": "(s32[21361]{0}, pred[21361]{0}, pred[21361]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:270", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:270 (_walk_from_seed..walk_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:292 (_walk_from_seed..body)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:353 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)" + ] + }, + { + "instruction": "loop_select_fusion", + "ms": 0.017280000000000004, + "opcode": "fusion", + "shape": "s32[21361]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:242", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:242 (_walk_from_seed..weights_of)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:262 (_walk_from_seed..walk_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:292 (_walk_from_seed..body)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:353 (pix_indexes_delaunay_walk_from)" + ] + }, + { + "instruction": "input_reduce_fusion.2", + "ms": 0.014038600000000017, + "opcode": "fusion", + "shape": "pred[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:288", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:288 (_walk_from_seed..cond)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:353 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)" + ] + }, + { + "instruction": "while.67", + "ms": 0.01277440000000002, + "opcode": "while", + "shape": "(s32[], s32[21361]{0}, pred[21361]{0}, pred[21361]{0}, s32[3000,3]{1,0}, /*index=5*/f64[1500,2]{1,0}, f64[21361,2]{1,0}, s32[3000,3]{1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:353 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "mapping_matrix": [ + { + "instruction": "input_reduce_fusion.33", + "ms": 0.0028288, + "opcode": "fusion", + "shape": "f64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:93", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:93 (adaptive_pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/abstract.py:507 (Mapper.pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt.py:339 (Adapt.regularization_weights_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt_split.py:120 (AdaptSplit.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)" + ] + } + ], + "psf_convolution_mapping_matrix": [ + { + "instruction": "input_scatter_fusion", + "ms": 1.9807390000000002, + "opcode": "fusion", + "shape": "f64[1500,180,180]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:303 (AbstractInversion.operated_mapping_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:68 (InversionImagingMapping.data_vector)" + ] + }, + { + "instruction": "fft.14.0", + "ms": 1.7599258999999998, + "opcode": "fft", + "shape": "f64[1500,180,180]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:303 (AbstractInversion.operated_mapping_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:68 (InversionImagingMapping.data_vector)" + ] + }, + { + "instruction": "fft.10.0", + "ms": 1.3619858000000002, + "opcode": "fft", + "shape": "c128[1500,180,91]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:303 (AbstractInversion.operated_mapping_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:68 (InversionImagingMapping.data_vector)" + ] + }, + { + "instruction": "fft.12.0", + "ms": 0.9813963000000001, + "opcode": "fft", + "shape": "c128[1500,91,180]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:303 (AbstractInversion.operated_mapping_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:68 (InversionImagingMapping.data_vector)" + ] + }, + { + "instruction": "input_transpose_fusion.7", + "ms": 0.5144231, + "opcode": "fusion", + "shape": "c128[1500,91,180]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:303 (AbstractInversion.operated_mapping_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:68 (InversionImagingMapping.data_vector)" + ] + }, + { + "instruction": "wrapped_transpose", + "ms": 0.4998599, + "opcode": "fusion", + "shape": "c128[1500,180,91]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:303 (AbstractInversion.operated_mapping_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:68 (InversionImagingMapping.data_vector)" + ] + } + ], + "curvature_matrix_F": [ + { + "instruction": "custom-call.4", + "ms": 4.203084199999999, + "opcode": "custom-call", + "shape": "(f64[1500,1500]{1,0}, s8[4194304]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:134", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:134 (curvature_matrix_via_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:93 (InversionImagingMapping.curvature_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:389 (AbstractInversion.curvature_reg_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "inversion_other": [ + { + "instruction": "cholesky.120", + "ms": 7.094396699999969, + "opcode": "custom-call", + "shape": "(f64[20,1500,1500]{1,2,0}, s32[20]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986 (AbstractInversion._log_det_symmetric_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:1078 (AbstractInversion.log_det_curvature_reg_matrix_term)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:347 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/model/analysis.py:135 (AnalysisImaging.log_likelihood_function)" + ] + }, + { + "instruction": "cholesky.130", + "ms": 7.04603189999994, + "opcode": "custom-call", + "shape": "(f64[20,1500,1500]{1,2,0}, s32[20]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986 (AbstractInversion._log_det_symmetric_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:1157 (AbstractInversion.log_det_regularization_matrix_term)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:348 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/model/analysis.py:135 (AnalysisImaging.log_likelihood_function)" + ] + }, + { + "instruction": "loop_reduce_window_fusion", + "ms": 0.002803199999999999, + "opcode": "fusion", + "shape": "s64[6,16]{1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "loop_reduce_window_fusion.1", + "ms": 0.0025792000000000002, + "opcode": "fusion", + "shape": "s64[94,16]{1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "loop_broadcast_convert_fusion", + "ms": 0.0023137, + "opcode": "fusion", + "shape": "(s32[1500]{0}, s64[1500]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:527", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:527 (AbstractInversion.zeroed_ids_to_keep)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:567 (AbstractInversion.solve_ids_to_keep)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:684 (AbstractInversion.reconstruction)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "loop_reduce_window_fusion.2", + "ms": 0.0019424, + "opcode": "fusion", + "shape": "s64[6,16]{1,0}", + "source": "", + "stack": [] + } + ], + "fit_imaging_other": [ + { + "instruction": "custom-call.5", + "ms": 0.19922620000000002, + "opcode": "custom-call", + "shape": "(f64[20,15361]{1,0}, s8[4194304]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/abstract_ndarray.py:305", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/abstract_ndarray.py:305 (AbstractNDArray.__add__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/abstract_ndarray.py:57 (unwrap_array..wrapper)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/abstract_ndarray.py:35 (to_new_array..wrapper)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:58 (AbstractFit.residual_map)" + ] + } + ], + "chi_squared_evidence": [ + { + "instruction": "loop_divide_fusion", + "ms": 0.00992, + "opcode": "fusion", + "shape": "f64[20,15361]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/abstract_ndarray.py:352", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/abstract_ndarray.py:352 (AbstractNDArray.__truediv__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/abstract_ndarray.py:57 (unwrap_array..wrapper)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/abstract_ndarray.py:35 (to_new_array..wrapper)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_util.py:78 (chi_squared_map_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:78 (AbstractFit.chi_squared_map)" + ] + } + ] + }, + "stage_audit_note": "The HLO instructions that contributed most of each stage's milliseconds, with their full source stack. A stage row is only as good as the rules that built it; this is how a reader checks a row against the HLO instead of trusting it.", + "untraced_wall_ms": 682.3508086999936, + "reconciliation_vs_untraced_pct": 1.7533787382472545, + "wall_basis": "wall_ms is the TRACED run's wall, the run these kernel durations came from. untraced_wall_ms is the same executable without the profiler; the difference is the profiler's overhead and belongs in neither the stages nor the idle row.", + "calls": 10, + "call_split": "per-call (first-instruction recurrence)", + "call_blocks": 10, + "events": 280930, + "streams": [ + "Stream #14(MemcpyD2H,Compute,MemcpyD2D,MemcpyH2D)" + ], + "per_stage_ms": { + "border_relocator": { + "median_ms": 0.08843150000000002, + "min_ms": 0.088065, + "max_ms": 0.088864 + }, + "chi_squared_evidence": { + "median_ms": 0.009904, + "min_ms": 0.009664, + "max_ms": 0.010208 + }, + "curvature_matrix_F": { + "median_ms": 4.200502999999999, + "min_ms": 4.197623, + "max_ms": 4.227127 + }, + "fit_imaging_other": { + "median_ms": 0.19910450000000002, + "min_ms": 0.198817, + "max_ms": 0.200162 + }, + "grids_and_structures": { + "median_ms": 0.001376, + "min_ms": 0.00128, + "max_ms": 0.001408 + }, + "inversion_other": { + "median_ms": 14.152702500000013, + "min_ms": 14.145536000000016, + "max_ms": 14.165342000000019 + }, + "mapping_matrix": { + "median_ms": 0.002816, + "min_ms": 0.002816, + "max_ms": 0.002848 + }, + "mesh_construction": { + "median_ms": 0.002048, + "min_ms": 0.002016, + "max_ms": 0.002048 + }, + "mesh_locate_walk": { + "median_ms": 0.1327525, + "min_ms": 0.132544, + "max_ms": 0.13283199999999995 + }, + "mesh_qhull_callback": { + "median_ms": 0.010672000000000001, + "min_ms": 0.01056, + "max_ms": 0.011008 + }, + "mesh_seed_argmin": { + "median_ms": 0.21777550000000007, + "min_ms": 0.21753500000000003, + "max_ms": 0.21792 + }, + "mixed_fusion": { + "median_ms": 5.893502499999999, + "min_ms": 5.8766359999999995, + "max_ms": 5.903090999999998 + }, + "other": { + "median_ms": 0.16984099999999996, + "min_ms": 0.16873600000000002, + "max_ms": 0.17056399999999997 + }, + "pdip_solve": { + "median_ms": 624.2326104999976, + "min_ms": 624.1598589999986, + "max_ms": 624.3635449999997 + }, + "psf_convolution_mapping_matrix": { + "median_ms": 7.098000000000001, + "min_ms": 7.092017, + "max_ms": 7.106384 + }, + "regularization_H": { + "median_ms": 0.014464000000000001, + "min_ms": 0.013856, + "max_ms": 0.015008 + } + }, + "stage_order": [ + "border_relocator", + "mesh_qhull_callback", + "mesh_seed_argmin", + "mesh_locate_walk", + "mesh_construction", + "mapping_matrix", + "psf_convolution_mapping_matrix", + "curvature_matrix_F", + "regularization_H", + "pdip_solve", + "chi_squared_evidence", + "grids_and_structures", + "inversion_other", + "fit_imaging_other", + "mixed_fusion", + "other" + ], + "mixed_fusion": { + "ms": 5.893502499999999, + "constituent_stage_sets": { + "pdip_solve + regularization_H": 2.2743494, + "curvature_reg_reduce_gather + inversion_other + mapped_reconstruction + pdip_solve + reconstruction_scatter + regularization_H": 1.6149656000000001, + "curvature_matrix_F + psf_convolution_mapping_matrix": 1.0153548, + "pdip_solve + psf_convolution_mapping_matrix": 0.23001630000000003, + "inversion_other + pdip_solve": 0.22458929999999994, + "data_vector_D + pdip_solve + psf_convolution_mapping_matrix": 0.1386212, + "mapping_matrix + pdip_solve": 0.11091530000000002, + "inversion_other + mesh_construction + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin + regularization_H": 0.0736224, + "inversion_other + mapping_matrix + mesh_construction + mesh_dual_areas + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin + pdip_solve": 0.0211586, + "inversion_other + regularization_H": 0.019177800000000005, + "inversion_other + mesh_construction + mesh_dual_areas + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin + pdip_solve + regularization_H": 0.0172704, + "pdip_solve + ray_trace_data_grid": 0.013161699999999997, + "border_relocator + ray_trace_data_grid": 0.0123328, + "inversion_other + mapping_matrix + mesh_construction + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin": 0.010892800000000003, + "grids_and_structures + mass_profile_deflections + pdip_solve + ray_trace_data_grid": 0.0092384, + "border_relocator + pdip_solve + ray_trace_data_grid": 0.008454399999999999, + "inversion_other + mesh_construction + pdip_solve + regularization_H": 0.008252899999999999, + "inversion_other + pdip_solve + regularization_H": 0.0081601, + "chi_squared_evidence + pdip_solve": 0.0081153, + "inversion_other + mesh_construction + mesh_dual_areas + mesh_interpolation_weights + pdip_solve + regularization_H": 0.0069728, + "inversion_other + mesh_dual_areas + mesh_locate_walk": 0.006716800000000001, + "border_relocator + pdip_solve": 0.0067008000000000015, + "curvature_reg_reduce_gather + inversion_other + mapped_reconstruction + reconstruction_scatter + regularization_H": 0.005484899999999999, + "inversion_other + mesh_construction + mesh_seed_argmin + pdip_solve + regularization_H": 0.0053504, + "inversion_other + mapped_reconstruction": 0.00488, + "inversion_other + pdip_solve + ray_trace_data_grid": 0.004863999999999999, + "inversion_other + mapped_reconstruction + reconstruction_scatter": 0.0040160000000000005, + "data_vector_D + pdip_solve": 0.0037632000000000004, + "mapping_matrix + pdip_solve + regularization_H": 0.003619200000000001, + "inversion_other + mesh_construction + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin + pdip_solve + regularization_H": 0.0028896000000000004, + "inversion_other + mesh_construction + mesh_dual_areas + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin": 0.0028704000000000004, + "inversion_other + mesh_construction + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin": 0.0026591999999999996, + "inversion_other + mesh_dual_areas + mesh_locate_walk + pdip_solve": 0.0025824000000000003, + "inversion_other + mesh_locate_walk + mesh_seed_argmin": 0.0024576, + "inversion_other + mesh_construction + mesh_locate_walk + mesh_seed_argmin": 0.0023936, + "chi_squared_evidence + inversion_other": 0.0023584, + "inversion_other + mesh_interpolation_weights": 0.002128, + "grids_and_structures + mass_profile_deflections + pdip_solve": 0.0013440000000000001 + }, + "example_kernels": { + "pdip_solve + regularization_H": [ + "loop_broadcast_fusion", + "input_add_transpose_fusion", + "input_transpose_fusion.6" + ], + "curvature_reg_reduce_gather + inversion_other + mapped_reconstruction + pdip_solve + reconstruction_scatter + regularization_H": [ + "input_multiply_transpose_fusion" + ], + "curvature_matrix_F + psf_convolution_mapping_matrix": [ + "loop_divide_gather_fusion" + ], + "pdip_solve + psf_convolution_mapping_matrix": [ + "loop_broadcast_fusion.6" + ], + "inversion_other + pdip_solve": [ + "input_reduce_fusion.17", + "input_reduce_fusion.18", + "input_transpose_fusion.3", + "input_reduce_fusion.21" + ], + "data_vector_D + pdip_solve + psf_convolution_mapping_matrix": [ + "input_reduce_fusion.15" + ], + "mapping_matrix + pdip_solve": [ + "loop_divide_fusion.2", + "loop_divide_fusion.1", + "loop_broadcast_fusion.4" + ], + "inversion_other + mesh_construction + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin + regularization_H": [ + "input_scatter_fusion.3" + ], + "inversion_other + mapping_matrix + mesh_construction + mesh_dual_areas + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin + pdip_solve": [ + "input_scatter_fusion.1", + "input_scatter_fusion.4" + ], + "inversion_other + regularization_H": [ + "loop_reduce_slice_fusion.2", + "loop_reduce_slice_fusion.1", + "loop_reduce_slice_fusion", + "loop_reduce_fusion.4" + ] + }, + "prorated_estimate_ms": { + "pdip_solve": 1.772454613333333, + "regularization_H": 1.4400853850000002, + "psf_convolution_mapping_matrix": 0.6688926166666666, + "curvature_matrix_F": 0.5076774, + "inversion_other": 0.4314148, + "mapped_reconstruction": 0.27403658000000003, + "reconstruction_scatter": 0.27159658000000003, + "curvature_reg_reduce_gather": 0.2702579133333334, + "mapping_matrix": 0.06112434166666668, + "data_vector_D": 0.04808866666666666, + "mesh_construction": 0.025206370000000006, + "mesh_locate_walk": 0.024614665000000004, + "mesh_seed_argmin": 0.022800211666666667, + "mesh_interpolation_weights": 0.022538665, + "ray_trace_data_grid": 0.019496316666666666, + "border_relocator": 0.012334933333333332, + "mesh_dual_areas": 0.009328691666666666, + "chi_squared_evidence": 0.00523685, + "grids_and_structures": 0.0027576000000000002, + "mass_profile_deflections": 0.0027576000000000002 + }, + "prorated_note": "ESTIMATE ONLY \u2014 a mixed fusion's time split equally across the stages its constituents span. Never summed into the measured table, never reconciled." + }, + "other_sources_ms": { + "copy.107": 0.04176340000000012, + "copy.92": 0.037878699999999946, + "copy.91": 0.034768100000000045, + "copy.93": 0.033184200000000046, + "copy.58": 0.014691099999999993, + "copy.105": 0.0020832000000000003, + "copy.67": 0.0019456, + "copy.89": 0.00184, + "copy.106": 0.0016320000000000004 + }, + "device_span_ms": 694.3282391, + "device_busy_ms": 656.4397399000001, + "device_idle_ms": 37.888499199999956, + "largest_idle_gaps": [ + { + "gap_ms": 5.522836, + "after": "pure_callback.4", + "before": "pure_callback.4" + }, + { + "gap_ms": 0.177472, + "after": "triangular-solve", + "before": "triangular-solve" + }, + { + "gap_ms": 0.108127, + "after": "cholesky.100", + "before": "cholesky.100" + }, + { + "gap_ms": 0.105888, + "after": "cholesky.60", + "before": "cholesky.60" + }, + { + "gap_ms": 0.059776, + "after": "input_reduce_fusion.31", + "before": "loop_broadcast_fusion" + }, + { + "gap_ms": 0.040736, + "after": "loop_reduce_fusion", + "before": "loop_or_select_fusion" + }, + { + "gap_ms": 0.035136, + "after": "pure_callback.4", + "before": "loop_select_fusion.7" + }, + { + "gap_ms": 0.032064, + "after": "loop_select_fusion.6", + "before": "loop_add_fusion.4" + } + ], + "kernel_ms": 656.4265034999976, + "sum_ms": 694.3150026999975, + "wall_ms": 694.4553516001179, + "host_outside_span_ms": 0.12711250011784614, + "reconciliation_pct": -0.020209924194110843, + "unjoined_ms": 0.0, + "unjoined_pct": 0.0, + "other_ms": 0.16984099999999996, + "other_pct": 0.024456719875318642, + "note": "Stage rows attribute the command-buffers-OFF program (see the module docstring): kernel times are the same, the launch overhead the CUDA graphs remove is not. sum_ms = kernel rows + device_idle_ms; the residual against wall_ms is host_outside_span_ms (dispatch before the first kernel, teardown after the last).", + "per_stage_ms_per_lane": { + "border_relocator": 0.004421575000000001, + "chi_squared_evidence": 0.0004952, + "curvature_matrix_F": 0.21002514999999997, + "fit_imaging_other": 0.009955225000000002, + "grids_and_structures": 6.88e-05, + "inversion_other": 0.7076351250000006, + "mapping_matrix": 0.0001408, + "mesh_construction": 0.0001024, + "mesh_locate_walk": 0.006637624999999999, + "mesh_qhull_callback": 0.0005336000000000001, + "mesh_seed_argmin": 0.010888775000000003, + "mixed_fusion": 0.294675125, + "other": 0.008492049999999998, + "pdip_solve": 31.21163052499988, + "psf_convolution_mapping_matrix": 0.35490000000000005, + "regularization_H": 0.0007232 + }, + "per_lane_divisor": 20, + "host_callback": { + "pure_callback_span_ms": 5.717323400000001, + "qhull_ms": 5.1945813, + "callback_body_ms_note": "the OUTERMOST matching body event, not a sum: under the probe the body appears twice (the wrapper and the timed re-implementation it calls) and summing them would count the same work twice", + "events_by_name": { + "pure_callback.4": { + "count": 10, + "ms": 5.717323400000001 + }, + "$callback.py:815 _wrapped_callback": { + "count": 10, + "ms": 5.5959928 + }, + "$callback.py:224 _callback": { + "count": 10, + "ms": 5.568414000000001 + }, + "$callback.py:74 pure_callback_impl": { + "count": 10, + "ms": 5.553685199999999 + }, + "$callback.py:69 __call__": { + "count": 10, + "ms": 5.219663199999999 + }, + "$delaunay.py:162 ": { + "count": 10, + "ms": 5.2110232 + }, + "$host_callback_probe.py:225 wrapped": { + "count": 10, + "ms": 5.1945813 + }, + "$host_callback_probe.py:160 _timed_tri_only": { + "count": 10, + "ms": 5.180964299999999 + }, + "ThenExecuteCallback:GetEventForComputeStreamSyncPoint": { + "count": 10, + "ms": 0.023899899999999995 + }, + "$callback.py:822 ": { + "count": 40, + "ms": 0.014995899999999996 + } + }, + "note": "HOST milliseconds per traced BATCH (the whole invocation), aggregated by name because the events nest. Not a row of the device table: the device pays for them as the idle gaps largest_idle_gaps names." + }, + "host_callback_ms": 5.717323400000001 + }, + "hlo_census": { + "status": "excluded", + "reason": "The legacy census anchors PyAutoArray source line numbers that moved after the phase-1 run. No batched attribution is published from unsupported anchors; the device-event table and wall reconciliation remain valid." + }, + "trace_split": { + "expected_calls": 10, + "executions_per_invocation": 1, + "method": "per-call (first-instruction recurrence)", + "note": "DECIDED IN CODE: the scalar arm's trace is split by trace_calls * B, so every lane's execution is its own block and the per-stage median is taken over all of them. The vmap arm's is split by trace_calls, one block per batched execution, and per_stage_ms_per_lane divides those rows by B." + } + }, + "scalar": { + "arm": "scalar", + "program": "jax.jit(fn), called B times", + "stands_for": "Nautilus(use_jax_vmap=False, use_jax_jit=True). Plain use_jax_vmap=False is UNJITTED and is NOT this arm", + "hlo_source": "jax.jit(fn).lower(lane_trees[0]) \u2014 the same program phase 1 traced", + "batch_wall_ms": 872.4862178998592, + "wall_production_nesting_ms": 872.4862178998592, + "wall_aot_command_buffers_on_ms": 875.6381604998751, + "wall_aot_command_buffers_off_ms": 882.5437281997438, + "command_buffer_delta_ms": 6.905567699868698, + "production_nesting_vs_aot_on_delta_ms": -3.1519426000159, + "production_nesting_vs_aot_on_delta_pct": -0.35995948351731866, + "wall_per_lane_ms": 43.62431089499296, + "wall_per_lane_command_buffers_off_ms": 44.12718640998719, + "traced_batch_wall_ms": 905.1012266001635, + "untraced_batch_wall_ms": 880.5241677000595, + "traced_wall_per_lane_ms": 45.255061330008175, + "callback_count_per_call": 20.0, + "callback_count_per_lane": 1.0, + "callback_expectation": "1 per likelihood evaluation, B per batch", + "host_qhull_ms": 90.14050849982596, + "host_tables_ms": 2.3841064008593094, + "host_qhull_ms_per_lane": 4.507025424991298, + "host_tables_ms_per_lane": 0.11920532004296547, + "host_callback_probe": { + "calls": 200, + "qhull_ms_total": 901.4050849982596, + "tables_ms_total": 23.841064008593094, + "total_ms_total": 925.2461490068526, + "qhull_ms_mean": 4.507025424991298, + "tables_ms_mean": 0.11920532004296547, + "total_ms_mean": 4.626230745034263, + "non_finite_calls": 0, + "n_points": [ + 1500 + ] + }, + "host_callback_records_first": [ + { + "n_points": 1500, + "qhull_ms": 4.657461999158841, + "tables_ms": 0.1824790015234612, + "total_ms": 4.839941000682302, + "finite": true + }, + { + "n_points": 1500, + "qhull_ms": 4.528411998762749, + "tables_ms": 0.13876000230084173, + "total_ms": 4.667172001063591, + "finite": true + }, + { + "n_points": 1500, + "qhull_ms": 4.456402999494458, + "tables_ms": 0.12711799718090333, + "total_ms": 4.583520996675361, + "finite": true + }, + { + "n_points": 1500, + "qhull_ms": 4.520762002357515, + "tables_ms": 0.11695999637595378, + "total_ms": 4.637721998733468, + "finite": true + } + ], + "device_idle_ms": 7.105211645000004, + "device_idle_ms_per_lane": 7.105211645000004, + "trace": { + "parser": "ProfileData.from_file(xplane) + as_text() + stack_frame_index(proto field 17)", + "stage_audit": { + "mixed_fusion": [ + { + "instruction": "loop_divide_gather_fusion", + "ms": 1.0147837900000003, + "opcode": "fusion", + "shape": "(f64[15361,1,1,1500]{3,2,1,0}, f64[15361,1,1,1500]{3,2,1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:133", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:133 (curvature_matrix_via_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:93 (InversionImagingMapping.curvature_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:389 (AbstractInversion.curvature_reg_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "loop_broadcast_fusion.2", + "ms": 0.22702425500000015, + "opcode": "fusion", + "shape": "f64[1500,180,180]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "input_reduce_fusion.13", + "ms": 0.12207924499999988, + "opcode": "fusion", + "shape": "f64[92,1500]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/inversion_imaging_util.py:123", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/inversion_imaging_util.py:123 (data_vector_via_blurred_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:67 (InversionImagingMapping.data_vector)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:699 (AbstractInversion.reconstruction)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "input_reduce_fusion.17", + "ms": 0.11460218000000005, + "opcode": "fusion", + "shape": "f64[15361]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:163", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:163 (mapped_reconstructed_data_via_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:120 (InversionImagingMapping._mapped_reconstructed_data_dict_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:196 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "loop_broadcast_fusion.3", + "ms": 0.11095099000000008, + "opcode": "fusion", + "shape": "f64[15361,1500]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:342", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:342 (mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/abstract.py:283 (Mapper.mapping_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:91 (AbstractInversionImaging._mapping_matrix_for_convolution_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:137 (AbstractInversionImaging.operated_mapping_matrix_list)" + ] + }, + { + "instruction": "input_multiply_transpose_fusion", + "ms": 0.10946254999999998, + "opcode": "fusion", + "shape": "(f64[1500,1500]{1,0}, f64[1500,1500]{1,0}, f64[1500,1500]{1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:237 (active_set_search)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:293 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:274 (_certified_positive_only_from)" + ] + } + ], + "grids_and_structures": [ + { + "instruction": "loop_multiply_sine_fusion", + "ms": 0.0013491050000000013, + "opcode": "fusion", + "shape": "(f64[], f64[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/geometry/geometry_util.py:527", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/geometry/geometry_util.py:527 (transform_grid_2d_to_reference_frame)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/profiles/geometry_profiles.py:418 (EllProfile.transformed_to_reference_frame_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/structures/decorators/abstract.py:93 (AbstractMaker.evaluate_func)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/structures/decorators/abstract.py:112 (AbstractMaker.result)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/structures/decorators/to_grid.py:70 (to_grid..wrapper)" + ] + } + ], + "border_relocator": [ + { + "instruction": "eigh.45", + "ms": 0.07454366500000005, + "opcode": "custom-call", + "shape": "(f64[2,2]{0,1}, f64[2]{0}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:245", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:245 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:454 (BorderRelocator.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:176 (AbstractMesh.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:214 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "custom-call.2", + "ms": 0.007953390000000022, + "opcode": "custom-call", + "shape": "(f64[2,2]{1,0}, s8[4194304]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:242", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:242 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:454 (BorderRelocator.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:176 (AbstractMesh.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:214 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "loop_add_fusion.9", + "ms": 0.003369750000000004, + "opcode": "fusion", + "shape": "f64[1500]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:308", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:308 (relocated_grid_via_ellipse_border_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:458 (BorderRelocator.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:176 (AbstractMesh.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:214 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "input_reduce_fusion.25", + "ms": 0.001925390000000003, + "opcode": "fusion", + "shape": "f64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:256", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:256 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:454 (BorderRelocator.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:176 (AbstractMesh.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:214 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "loop_multiply_fusion.4", + "ms": 0.0015465549999999976, + "opcode": "fusion", + "shape": "f64[2,2]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:245", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:245 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:454 (BorderRelocator.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:176 (AbstractMesh.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:214 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + } + ], + "mesh_construction": [ + { + "instruction": "input_concatenate_fusion.7", + "ms": 0.002044314999999992, + "opcode": "fusion", + "shape": "f64[1500,2]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:820", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:820 (InterpolatorDelaunay.mesh_grid_xy)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:847 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + } + ], + "mesh_qhull_callback": [ + { + "instruction": "pure_callback.4", + "ms": 0.010624294999999992, + "opcode": "custom-call", + "shape": "(s32[3000,3]{1,0}, s32[3000,3]{1,0}, s32[1500]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:161", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:161 (_jax_delaunay_tables)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:405 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + } + ], + "other": [ + { + "instruction": "copy.106", + "ms": 0.04187694999999879, + "opcode": "copy", + "shape": "f64[1,1024,2]{2,1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "copy.70", + "ms": 0.014690620000000149, + "opcode": "copy", + "shape": "s32[21361]{0}", + "source": "", + "stack": [] + }, + { + "instruction": "copy.75", + "ms": 0.001968135000000004, + "opcode": "copy", + "shape": "s64[1500]{0}", + "source": "", + "stack": [] + }, + { + "instruction": "copy.104", + "ms": 0.0016524649999999945, + "opcode": "copy", + "shape": "s64[]", + "source": "", + "stack": [] + }, + { + "instruction": "copy.105", + "ms": 0.001634235000000002, + "opcode": "copy", + "shape": "s32[]", + "source": "", + "stack": [] + }, + { + "instruction": "copy.61", + "ms": 0.0016041399999999959, + "opcode": "copy", + "shape": "s32[]", + "source": "", + "stack": [] + } + ], + "mesh_seed_argmin": [ + { + "instruction": "input_reduce_fusion", + "ms": 0.14478561999999937, + "opcode": "fusion", + "shape": "(f64[1024]{0}, s64[1024]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:191", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:191 (_nearest_vertex_seed_from..argmin_chunk)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204 (_nearest_vertex_seed_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:351 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)" + ] + }, + { + "instruction": "loop_dynamic_update_slice_fusion", + "ms": 0.04105780499999848, + "opcode": "fusion", + "shape": "s32[21,1024]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204 (_nearest_vertex_seed_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:351 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "loop_add_fusion", + "ms": 0.03196771499999974, + "opcode": "fusion", + "shape": "s64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204 (_nearest_vertex_seed_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:351 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "loop_broadcast_fusion", + "ms": 0.0019505399999999967, + "opcode": "fusion", + "shape": "s32[21,1024]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204 (_nearest_vertex_seed_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:351 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "pdip_solve": [ + { + "instruction": "cholesky.60", + "ms": 6.754088089999978, + "opcode": "custom-call", + "shape": "(f64[1500,1500]{0,1}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:252 (active_set_search..body_fun)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:262 (active_set_search)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:293 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)" + ] + }, + { + "instruction": "cholesky.80", + "ms": 5.67523822999999, + "opcode": "custom-call", + "shape": "(f64[1500,1500]{0,1}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:106", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:106 (factorize_kkt)", + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:212 (pdip_pc_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:83 (solve_nnls)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:129 (_solve_nnls_primal_with..primal)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:164 (solve_nnls_primal_with_status)" + ] + }, + { + "instruction": "triangular-solve.1", + "ms": 1.209065825000019, + "opcode": "custom-call", + "shape": "(f64[1500,1]{0,1}, s8[0]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:154", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:154 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:252 (active_set_search..body_fun)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:262 (active_set_search)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:293 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)" + ] + }, + { + "instruction": "triangular-solve", + "ms": 1.0477539799999835, + "opcode": "custom-call", + "shape": "(f64[1500,1]{0,1}, s8[0]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:154", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:154 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:252 (active_set_search..body_fun)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:262 (active_set_search)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:293 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)" + ] + }, + { + "instruction": "triangular-solve.2", + "ms": 0.90566888999999, + "opcode": "custom-call", + "shape": "(f64[1500,1]{0,1}, s8[0]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146 (solve_kkt_rhs)", + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:213 (pdip_pc_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:83 (solve_nnls)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:129 (_solve_nnls_primal_with..primal)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:164 (solve_nnls_primal_with_status)" + ] + }, + { + "instruction": "triangular-solve.4", + "ms": 0.8971959699999926, + "opcode": "custom-call", + "shape": "(f64[1500,1]{0,1}, s8[0]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146 (solve_kkt_rhs)", + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:217 (pdip_pc_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:83 (solve_nnls)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:129 (_solve_nnls_primal_with..primal)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:164 (solve_nnls_primal_with_status)" + ] + } + ], + "regularization_H": [ + { + "instruction": "input_scatter_fusion.10", + "ms": 0.0020577249999999946, + "opcode": "fusion", + "shape": "f64[1500,1500]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:615", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:615 (pixel_splitted_regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt_split.py:137 (AdaptSplit.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:332 (AbstractInversion.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "input_concatenate_fusion.10", + "ms": 0.0018569600000000008, + "opcode": "fusion", + "shape": "pred[3]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:90", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:90 (split_points_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:410 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + }, + { + "instruction": "input_concatenate_fusion.9", + "ms": 0.0018511900000000017, + "opcode": "fusion", + "shape": "pred[3]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:91", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:91 (split_points_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:410 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + }, + { + "instruction": "input_concatenate_fusion.8", + "ms": 0.0018500700000000016, + "opcode": "fusion", + "shape": "pred[3]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:93", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:93 (split_points_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:410 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + }, + { + "instruction": "input_concatenate_fusion", + "ms": 0.0017531150000000013, + "opcode": "fusion", + "shape": "s32[1500,2]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:615", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:615 (pixel_splitted_regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt_split.py:137 (AdaptSplit.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:332 (AbstractInversion.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "input_concatenate_fusion.11", + "ms": 0.0014912049999999974, + "opcode": "fusion", + "shape": "pred[3]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:88", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:88 (split_points_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:410 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + } + ], + "mesh_locate_walk": [ + { + "instruction": "input_reduce_fusion.1", + "ms": 0.022754409999999718, + "opcode": "fusion", + "shape": "pred[196]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:288", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:288 (_walk_from_seed..cond)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:353 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)" + ] + }, + { + "instruction": "loop_reduce_fusion", + "ms": 0.02235456499999971, + "opcode": "fusion", + "shape": "(f64[21361]{0}, s64[21361]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:264", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:264 (_walk_from_seed..walk_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:292 (_walk_from_seed..body)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:264 (_walk_from_seed..walk_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:292 (_walk_from_seed..body)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)" + ] + }, + { + "instruction": "loop_or_select_fusion", + "ms": 0.019306895000000247, + "opcode": "fusion", + "shape": "(s32[21361]{0}, pred[21361]{0}, pred[21361]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:270", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:270 (_walk_from_seed..walk_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:292 (_walk_from_seed..body)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:353 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)" + ] + }, + { + "instruction": "loop_select_fusion", + "ms": 0.01731259500000002, + "opcode": "fusion", + "shape": "s32[21361]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:242", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:242 (_walk_from_seed..weights_of)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:262 (_walk_from_seed..walk_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:292 (_walk_from_seed..body)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:353 (pix_indexes_delaunay_walk_from)" + ] + }, + { + "instruction": "input_reduce_fusion.2", + "ms": 0.014390094999999985, + "opcode": "fusion", + "shape": "pred[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:288", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:288 (_walk_from_seed..cond)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:353 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)" + ] + }, + { + "instruction": "while.34", + "ms": 0.012851719999999872, + "opcode": "while", + "shape": "(s32[], s32[21361]{0}, pred[21361]{0}, pred[21361]{0}, s32[3000,3]{1,0}, /*index=5*/f64[1500,2]{1,0}, f64[21361,2]{1,0}, s32[3000,3]{1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:353 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "psf_convolution_mapping_matrix": [ + { + "instruction": "input_scatter_fusion", + "ms": 1.9795794700000002, + "opcode": "fusion", + "shape": "f64[1500,180,180]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "fft.19.0", + "ms": 1.7556014649999998, + "opcode": "fft", + "shape": "f64[1500,180,180]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "fft.15.0", + "ms": 1.364779719999999, + "opcode": "fft", + "shape": "c128[1500,180,91]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "fft.17.0", + "ms": 0.979255055, + "opcode": "fft", + "shape": "c128[1500,91,180]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "input_transpose_fusion.4", + "ms": 0.513519525, + "opcode": "fusion", + "shape": "c128[1500,91,180]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "wrapped_transpose", + "ms": 0.5002328650000002, + "opcode": "fusion", + "shape": "c128[1500,180,91]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + } + ], + "inversion_other": [ + { + "instruction": "cholesky.120", + "ms": 0.8939710999999999, + "opcode": "custom-call", + "shape": "(f64[1500,1500]{0,1}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986 (AbstractInversion._log_det_symmetric_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:1078 (AbstractInversion.log_det_curvature_reg_matrix_term)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:347 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/model/analysis.py:135 (AnalysisImaging.log_likelihood_function)" + ] + }, + { + "instruction": "cholesky.130", + "ms": 0.8894467799999997, + "opcode": "custom-call", + "shape": "(f64[1500,1500]{0,1}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986 (AbstractInversion._log_det_symmetric_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:1157 (AbstractInversion.log_det_regularization_matrix_term)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:348 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/model/analysis.py:135 (AnalysisImaging.log_likelihood_function)" + ] + }, + { + "instruction": "loop_reduce_window_fusion.1", + "ms": 0.002773885000000001, + "opcode": "fusion", + "shape": "s64[94,16]{1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "loop_reduce_window_fusion", + "ms": 0.0026655950000000032, + "opcode": "fusion", + "shape": "s64[6,16]{1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "loop_broadcast_convert_fusion", + "ms": 0.00217664, + "opcode": "fusion", + "shape": "(s32[1500]{0}, s64[1500]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:527", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:527 (AbstractInversion.zeroed_ids_to_keep)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:567 (AbstractInversion.solve_ids_to_keep)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:684 (AbstractInversion.reconstruction)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "input_scatter_fusion.5", + "ms": 0.0019308600000000002, + "opcode": "fusion", + "shape": "s64[1500]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:527", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:527 (AbstractInversion.zeroed_ids_to_keep)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:567 (AbstractInversion.solve_ids_to_keep)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:684 (AbstractInversion.reconstruction)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "mapping_matrix": [ + { + "instruction": "input_reduce_fusion.31", + "ms": 0.002879989999999991, + "opcode": "fusion", + "shape": "f64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:93", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:93 (adaptive_pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/abstract.py:507 (Mapper.pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt.py:339 (Adapt.regularization_weights_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt_split.py:120 (AdaptSplit.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)" + ] + } + ], + "curvature_matrix_F": [ + { + "instruction": "cublas-lt-matmul.2", + "ms": 4.205149959999999, + "opcode": "custom-call", + "shape": "(f64[1500,1500]{1,0}, s8[4194304]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:134", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:134 (curvature_matrix_via_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:93 (InversionImagingMapping.curvature_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:389 (AbstractInversion.curvature_reg_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "chi_squared_evidence": [ + { + "instruction": "loop_multiply_fusion.2", + "ms": 0.003019990000000005, + "opcode": "fusion", + "shape": "f64[15361]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/abstract_ndarray.py:300", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/abstract_ndarray.py:300 (AbstractNDArray.__pow__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/abstract_ndarray.py:60 (unwrap_array..wrapper)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/abstract_ndarray.py:35 (to_new_array..wrapper)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_util.py:78 (chi_squared_map_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:78 (AbstractFit.chi_squared_map)" + ] + } + ] + }, + "stage_audit_note": "The HLO instructions that contributed most of each stage's milliseconds, with their full source stack. A stage row is only as good as the rules that built it; this is how a reader checks a row against the HLO instead of trusting it.", + "untraced_wall_ms": 44.026208385002974, + "reconciliation_vs_untraced_pct": -31.141085600896776, + "wall_basis": "wall_ms is the TRACED run's wall, the run these kernel durations came from. untraced_wall_ms is the same executable without the profiler; the difference is the profiler's overhead and belongs in neither the stages nor the idle row.", + "calls": 200, + "call_split": "per-call (first-instruction recurrence)", + "call_blocks": 200, + "events": 141520, + "streams": [ + "Stream #14(MemcpyD2H,Compute,MemcpyH2D,Memset,MemcpyD2D)" + ], + "per_stage_ms": { + "border_relocator": { + "median_ms": 0.08934100000000002, + "min_ms": 0.08876800000000001, + "max_ms": 0.09017100000000003 + }, + "chi_squared_evidence": { + "median_ms": 0.0029925, + "min_ms": 0.00288, + "max_ms": 0.003296 + }, + "curvature_matrix_F": { + "median_ms": 4.204302, + "min_ms": 4.188499, + "max_ms": 4.267967 + }, + "grids_and_structures": { + "median_ms": 0.001376, + "min_ms": 0.001279, + "max_ms": 0.001408 + }, + "inversion_other": { + "median_ms": 1.794877, + "min_ms": 1.778573, + "max_ms": 1.813453 + }, + "mapping_matrix": { + "median_ms": 0.00288, + "min_ms": 0.002848, + "max_ms": 0.002912 + }, + "memset": { + "median_ms": 0.021502499999999997, + "min_ms": 0.010048, + "max_ms": 0.096384 + }, + "mesh_construction": { + "median_ms": 0.002048, + "min_ms": 0.002015, + "max_ms": 0.00208 + }, + "mesh_locate_walk": { + "median_ms": 0.13138900000000003, + "min_ms": 0.13056200000000007, + "max_ms": 0.13273700000000005 + }, + "mesh_qhull_callback": { + "median_ms": 0.0105605, + "min_ms": 0.010400000000000001, + "max_ms": 0.011103 + }, + "mesh_seed_argmin": { + "median_ms": 0.2197770000000001, + "min_ms": 0.21939200000000011, + "max_ms": 0.22009800000000013 + }, + "mixed_fusion": { + "median_ms": 1.9815474999999996, + "min_ms": 1.9770350000000003, + "max_ms": 1.9940639999999994 + }, + "other": { + "median_ms": 0.063583, + "min_ms": 0.06304099999999999, + "max_ms": 0.067202 + }, + "pdip_solve": { + "median_ms": 7.581224, + "min_ms": 2.424595, + "max_ms": 48.89660700000005 + }, + "psf_convolution_mapping_matrix": { + "median_ms": 7.0925095, + "min_ms": 7.078738999999999, + "max_ms": 7.106948999999999 + }, + "regularization_H": { + "median_ms": 0.010848, + "min_ms": 0.010656, + "max_ms": 0.0112 + } + }, + "stage_order": [ + "border_relocator", + "mesh_qhull_callback", + "mesh_seed_argmin", + "mesh_locate_walk", + "mesh_construction", + "mapping_matrix", + "psf_convolution_mapping_matrix", + "curvature_matrix_F", + "regularization_H", + "pdip_solve", + "chi_squared_evidence", + "grids_and_structures", + "inversion_other", + "mixed_fusion", + "other", + "memset" + ], + "mixed_fusion": { + "ms": 1.9815474999999996, + "constituent_stage_sets": { + "curvature_matrix_F + psf_convolution_mapping_matrix": 1.0147837900000003, + "pdip_solve + psf_convolution_mapping_matrix": 0.22702425500000015, + "data_vector_D + pdip_solve": 0.125767375, + "mapped_reconstruction + pdip_solve": 0.11460218000000005, + "mapping_matrix + pdip_solve": 0.11328746500000009, + "curvature_reg_reduce_gather + inversion_other + mapped_reconstruction + pdip_solve + reconstruction_scatter": 0.10946254999999998, + "pdip_solve + regularization_H": 0.04431791999999995, + "inversion_other + pdip_solve + regularization_H": 0.024252115000000008, + "inversion_other + pdip_solve": 0.02287350499999999, + "inversion_other + mapping_matrix + mesh_construction + mesh_dual_areas + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin + pdip_solve": 0.020975820000000023, + "inversion_other + mesh_construction + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin + pdip_solve + regularization_H": 0.01878552, + "inversion_other + mesh_construction + mesh_dual_areas + mesh_interpolation_weights + pdip_solve + regularization_H": 0.01464035, + "pdip_solve + ray_trace_data_grid": 0.013579279999999994, + "border_relocator + ray_trace_data_grid": 0.012405385000000005, + "inversion_other + mapping_matrix + mesh_construction + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin": 0.011634304999999996, + "grids_and_structures + mass_profile_deflections + pdip_solve + ray_trace_data_grid": 0.009508225, + "border_relocator + pdip_solve + ray_trace_data_grid": 0.008618339999999995, + "chi_squared_evidence + pdip_solve": 0.00765336999999998, + "inversion_other + mesh_construction + mesh_seed_argmin + pdip_solve + regularization_H": 0.007190479999999996, + "inversion_other + mesh_dual_areas + mesh_locate_walk": 0.006666690000000056, + "border_relocator + pdip_solve": 0.006664104999999977, + "inversion_other + mesh_construction + pdip_solve + regularization_H": 0.006280445000000016, + "inversion_other + pdip_solve + ray_trace_data_grid": 0.0053433349999999925, + "inversion_other + regularization_H": 0.005017064999999995, + "inversion_other + mapped_reconstruction + pdip_solve + reconstruction_scatter": 0.004781205, + "inversion_other + mapped_reconstruction": 0.003705425000000002, + "mapping_matrix + pdip_solve + regularization_H": 0.003411649999999997, + "inversion_other + mesh_construction + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin": 0.0031199699999999993, + "inversion_other + mesh_construction + mesh_dual_areas + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin": 0.002990545000000002, + "inversion_other + mesh_construction + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin + regularization_H": 0.0026927449999999955, + "inversion_other + mesh_dual_areas + mesh_locate_walk + pdip_solve": 0.002580274999999995, + "inversion_other + mesh_locate_walk + mesh_seed_argmin": 0.0024767750000000027, + "inversion_other + mesh_interpolation_weights": 0.002146860000000007, + "chi_squared_evidence + inversion_other": 0.0019062150000000034, + "grids_and_structures + mass_profile_deflections + pdip_solve": 0.0013418999999999994 + }, + "example_kernels": { + "curvature_matrix_F + psf_convolution_mapping_matrix": [ + "loop_divide_gather_fusion" + ], + "pdip_solve + psf_convolution_mapping_matrix": [ + "loop_broadcast_fusion.2" + ], + "data_vector_D + pdip_solve": [ + "input_reduce_fusion.13", + "input_reduce_fusion.29" + ], + "mapped_reconstruction + pdip_solve": [ + "input_reduce_fusion.17" + ], + "mapping_matrix + pdip_solve": [ + "loop_broadcast_fusion.3", + "loop_divide_fusion" + ], + "curvature_reg_reduce_gather + inversion_other + mapped_reconstruction + pdip_solve + reconstruction_scatter": [ + "input_multiply_transpose_fusion" + ], + "pdip_solve + regularization_H": [ + "loop_select_fusion.5", + "input_transpose_fusion.5" + ], + "inversion_other + pdip_solve + regularization_H": [ + "input_transpose_fusion.6" + ], + "inversion_other + pdip_solve": [ + "input_reduce_fusion.15", + "loop_log_fusion", + "input_reduce_fusion.16", + "input_reduce_fusion.20" + ], + "inversion_other + mapping_matrix + mesh_construction + mesh_dual_areas + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin + pdip_solve": [ + "input_scatter_fusion.6", + "input_scatter_fusion.3" + ] + }, + "prorated_estimate_ms": { + "psf_convolution_mapping_matrix": 0.6209040225000002, + "curvature_matrix_F": 0.5073918950000001, + "pdip_solve": 0.3890709992142857, + "mapped_reconstruction": 0.08224161375000003, + "inversion_other": 0.06873453529761908, + "data_vector_D": 0.0628836875, + "mapping_matrix": 0.06234197750000004, + "regularization_H": 0.04246944963095235, + "reconstruction_scatter": 0.023087811249999996, + "curvature_reg_reduce_gather": 0.021892509999999997, + "ray_trace_data_grid": 0.020023280416666664, + "mesh_construction": 0.014264148630952385, + "mesh_locate_walk": 0.012508773464285734, + "border_relocator": 0.012407524999999989, + "mesh_interpolation_weights": 0.012329371380952386, + "mesh_seed_argmin": 0.011079570714285716, + "mesh_dual_areas": 0.008427758750000021, + "chi_squared_evidence": 0.004779792499999992, + "grids_and_structures": 0.00282435625, + "mass_profile_deflections": 0.00282435625 + }, + "prorated_note": "ESTIMATE ONLY \u2014 a mixed fusion's time split equally across the stages its constituents span. Never summed into the measured table, never reconciled." + }, + "other_sources_ms": { + "copy.106": 0.04187694999999879, + "copy.70": 0.014690620000000149, + "copy.75": 0.001968135000000004, + "copy.104": 0.0016524649999999945, + "copy.105": 0.001634235000000002, + "copy.61": 0.0016041399999999959, + "copy.103": 0.0007132700000000001, + "copy.40": 0.0006169449999999998 + }, + "device_span_ms": 45.249957665000004, + "device_busy_ms": 38.14474602, + "device_idle_ms": 7.105211645000004, + "largest_idle_gaps": [ + { + "gap_ms": 5.383379, + "after": "pure_callback.4", + "before": "pure_callback.4" + }, + { + "gap_ms": 0.073567, + "after": "input_reduce_fusion.3", + "before": "input_reduce_fusion.4" + }, + { + "gap_ms": 0.033919, + "after": "pure_callback.4", + "before": "copy.105" + }, + { + "gap_ms": 0.029472, + "after": "input_reduce_fusion.1", + "before": "input_reduce_fusion.2" + }, + { + "gap_ms": 0.027647, + "after": "while.40", + "before": "input_reduce_select_fusion" + }, + { + "gap_ms": 0.027584, + "after": "input_reduce_fusion.28", + "before": "loop_broadcast_fusion.2" + }, + { + "gap_ms": 0.027007, + "after": "input_concatenate_fusion.7", + "before": "pure_callback.4" + }, + { + "gap_ms": 0.024383, + "after": "copy.106", + "before": "input_reduce_fusion" + } + ], + "kernel_ms": 23.2107575, + "sum_ms": 30.315969145000004, + "wall_ms": 45.255061330008175, + "host_outside_span_ms": 0.0051036650081712764, + "reconciliation_pct": -33.01087601245214, + "unjoined_ms": 0.0, + "unjoined_pct": 0.0, + "other_ms": 0.063583, + "other_pct": 0.14049920192647877, + "note": "Stage rows attribute the command-buffers-OFF program (see the module docstring): kernel times are the same, the launch overhead the CUDA graphs remove is not. sum_ms = kernel rows + device_idle_ms; the residual against wall_ms is host_outside_span_ms (dispatch before the first kernel, teardown after the last).", + "per_stage_ms_per_lane": { + "border_relocator": 0.08934100000000002, + "chi_squared_evidence": 0.0029925, + "curvature_matrix_F": 4.204302, + "grids_and_structures": 0.001376, + "inversion_other": 1.794877, + "mapping_matrix": 0.00288, + "memset": 0.021502499999999997, + "mesh_construction": 0.002048, + "mesh_locate_walk": 0.13138900000000003, + "mesh_qhull_callback": 0.0105605, + "mesh_seed_argmin": 0.2197770000000001, + "mixed_fusion": 1.9815474999999996, + "other": 0.063583, + "pdip_solve": 7.581224, + "psf_convolution_mapping_matrix": 7.0925095, + "regularization_H": 0.010848 + }, + "per_lane_divisor": 1, + "host_callback": { + "pure_callback_span_ms": 99.45982540000001, + "qhull_ms": 92.7068144, + "callback_body_ms_note": "the OUTERMOST matching body event, not a sum: under the probe the body appears twice (the wrapper and the timed re-implementation it calls) and summing them would count the same work twice", + "events_by_name": { + "pure_callback.4": { + "count": 200, + "ms": 99.45982540000001 + }, + "$callback.py:815 _wrapped_callback": { + "count": 200, + "ms": 97.69207749999998 + }, + "$callback.py:224 _callback": { + "count": 200, + "ms": 97.22190960000005 + }, + "$callback.py:74 pure_callback_impl": { + "count": 200, + "ms": 97.04335109999998 + }, + "$callback.py:69 __call__": { + "count": 200, + "ms": 93.02880579999997 + }, + "$delaunay.py:162 ": { + "count": 200, + "ms": 92.89173760000001 + }, + "$host_callback_probe.py:225 wrapped": { + "count": 200, + "ms": 92.7068144 + }, + "$host_callback_probe.py:160 _timed_tri_only": { + "count": 200, + "ms": 92.54951359999995 + }, + "ThenExecuteCallback:GetEventForComputeStreamSyncPoint": { + "count": 200, + "ms": 0.3692834000000001 + }, + "$callback.py:822 ": { + "count": 800, + "ms": 0.2856913999999997 + }, + "$__init__.py:132 _xla_gc_callback": { + "count": 2, + "ms": 0.000327 + } + }, + "note": "HOST milliseconds per traced BATCH (the whole invocation), aggregated by name because the events nest. Not a row of the device table: the device pays for them as the idle gaps largest_idle_gaps names." + }, + "host_callback_ms": 99.45982540000001 + }, + "hlo_census": { + "status": "excluded", + "reason": "The legacy census anchors PyAutoArray source line numbers that moved after the phase-1 run. No batched attribution is published from unsupported anchors; the device-event table and wall reconciliation remain valid." + }, + "trace_split": { + "expected_calls": 200, + "executions_per_invocation": 20, + "method": "per-call (first-instruction recurrence)", + "note": "DECIDED IN CODE: the scalar arm's trace is split by trace_calls * B, so every lane's execution is its own block and the per-stage median is taken over all of them. The vmap arm's is split by trace_calls, one block per batched execution, and per_stage_ms_per_lane divides those rows by B." + } + } + }, + "certification_report": { + "source": "vmap arm, library solve observed through its stats= out-dict (PyAutoArray #566) and jax.debug.callback(..., ordered=True); ordered because the unordered batching rule returns the lanes permuted. Untimed, separately compiled; max rel diff of its log likelihoods vs the timed arm's: 3.827e-07", + "rows": 20, + "pdip_iter": "NOT AVAILABLE per lane without changing library numerics. The fallback branch calls the library's own reconstruction_positive_only_from, which returns the solution alone \u2014 jax_nnls.solve_nnls' iteration count is discarded inside the library's custom_vjp primal. The PDIP while_loop's cost is in the pdip_solve stage row of each arm's device table instead, which is a max-over-lanes quantity under vmap because every lane runs the same fixed kernel sequence.", + "passes_semantics": "library `passes`: restricted active-set passes run (jax_active_set.solve_certified)" + }, + "lane_construction": { + "draws_sha256": "8793f501adc86a80ee673986f87d36fdfb1b77bce5635352ee2c467783acb150", + "lane_rows": [ + 160, + 161, + 162, + 163, + 164, + 165, + 166, + 167, + 168, + 169, + 170, + 171, + 172, + 173, + 174, + 175, + 176, + 177, + 178, + 179 + ], + "calls": [ + 8 + ], + "stage": "pix2", + "regularization_range": { + "galaxies.source.pixelization.regularization.inner_coefficient": { + "min": 1.0566389768329418e-06, + "max": 229.37837836630266 + }, + "galaxies.source.pixelization.regularization.outer_coefficient": { + "min": 2.4574595034239785e-06, + "max": 30.026999055831187 + }, + "galaxies.source.pixelization.regularization.signal_scale": { + "min": 0.07341166691553269, + "max": 0.8809562507227594 + } + }, + "phases": [ + "exploration" + ], + "window_rule": "nautilus_batches.timed_window: consecutive captured calls, in call order, from the FIRST call that is not a prior batch, concatenated and truncated to B; at B == n_batch exactly one real Nautilus batch. Falls back to the latest B lanes if the post-prior lanes run out; never repeats a lane.", + "note": "Lane k is captured lane lane_rows[k]: the mass AND shear of a real Nautilus proposal (nautilus_batch_capture.py), lens light fixed at S3, the S3 light-subtracted dataset shared by every lane. `offsets` in the lane table are the mass offsets from the fiducial; the shear is in the capture file." + }, + "captured": { + "batches_path": "/mnt/ral/jnightin/autolens_profiling_wt/certified-solver-phase-c1-lane-rate/results/breakdown/imaging/nautilus_batches_delaunay_pix2.npz", + "batches_sha256": "90f4640a92f9b1c60ca3fceca7b484aa8215970489f8e7daf5430b8460d171d5", + "schema_version": 2, + "n_calls": 84, + "n_lanes": 1680, + "call_sizes_seen": [ + 20 + ], + "calls_by_phase": { + "prior": 8, + "exploration": 72, + "sampling": 4 + }, + "parameter_paths": [ + "galaxies.source.pixelization.regularization.inner_coefficient", + "galaxies.source.pixelization.regularization.outer_coefficient", + "galaxies.source.pixelization.regularization.signal_scale" + ], + "stage": "pix2", + "regularization": { + "class": "AdaptSplit", + "free": true, + "priors": { + "inner_coefficient": [ + "LogUniform", + 1e-06, + 1000000.0 + ], + "outer_coefficient": [ + "LogUniform", + 1e-06, + 1000000.0 + ], + "signal_scale": [ + "Uniform", + 0.0, + 1.0 + ] + }, + "priors_source": "PyAutoGalaxy packaged config/priors/regularization (adapt_split.yaml / constant.yaml); adapt_split.yaml is identical to euclid_strong_lens_modeling_pipeline/config/priors/regularization/adapt_split.yaml" + }, + "nautilus": { + "departures_from_production": [ + "mass/shear fixed at the S3 fiducial, not at a source_pix_1 result", + "no positions likelihood", + "the cell's mesh (Hilbert 1500, weight_power 1) in both stages; source_pix_2 redraws a 500-vertex Hilbert grid at weight_power 3.5", + "seeded (production passes no seed)", + "quick updates disabled (iterations_per_quick_update=1e12; render-only)", + "NullPaths: no output directory, so no checkpoint and one Sampler.run call", + "post-fit perform_update skipped (samples / latent variables never built)" + ], + "n_batch": 20, + "n_like_max": 40000, + "n_live": 75, + "number_of_cores": 1, + "production_reference": "euclid_strong_lens_modeling_pipeline/scripts/full_model.py source_pix_1 (n_live=150) / source_pix_2 (n_live=75): af.Nautilus(n_batch=20, **SettingsSearch.search_dict) with use_jax_vmap=True and number_of_cores=1 (SettingsSearch defaults)", + "production_stage": "source_pix_2", + "seed": 1, + "stage": "pix2", + "use_jax_vmap": true, + "version": "1.0.5" + }, + "capture_fit_status": "sampling complete (n_like_max or convergence); post-fit result skipped", + "capture_library_revisions": { + "PyAutoArray": { + "head": "7fa8d2714f7da43fec2b23c31bff580764831670", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoArray" + }, + "PyAutoFit": { + "head": "a736840127be7a3c21e15a5c945e94d8f1082983", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoFit" + }, + "PyAutoGalaxy": { + "head": "70a61e26cd715cefe7012a38285698091246a8a4", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy" + }, + "PyAutoLens": { + "head": "86054bbc19baa2f710a12e04a94fa27ab37cc354", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoLens" + }, + "PyAutoNerves": { + "head": "1fa613aa8d89a79613009fb66f5b4e2d21deb57a", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoNerves" + } + }, + "fingerprint_check": { + "fields": [ + "mesh", + "source_pixels", + "dataset_sha256", + "regularization_class", + "regularization_s0_fiducial", + "border_relocator", + "use_mixed_precision", + "log_evidence_s3_library" + ], + "not_identity": "the regularization coefficients: free per lane since the capture frees them", + "log_evidence_s3_library_rel_diff": 0.0, + "passed": true + }, + "timed_window_vs_capture_pdip": { + "reference": "the capture's own figure of merit (library PDIP, Fitness.call_wrap jax.jit(jax.vmap(call)) over parameter vectors) for the same lanes", + "compared_against": "this cell's jit(vmap) library-PDIP reference", + "n_compared": 20, + "max_rel_diff": 3.6669111446065747e-07, + "max_abs_diff_nats": 0.050821526849176735, + "gated": false, + "note": "RECORDED, NOT GATED: proves the lane trees rebuilt here are the models the sampler evaluated (a wrong parameter mapping shows up as nats, not 1e-10)." + } + }, + "matched": { + "vmap_wall_per_lane_ms": 34.06693974000518, + "scalar_wall_per_lane_ms": 43.62431089499296, + "speedup_vmap_over_scalar": 1.2805468066086503, + "note": "Both walls are the PRODUCTION nesting of their arm, measured in one process on the same B lanes with the SAME library Settings (no injection). A speedup below 1 means the batch is slower per lane than B sequential jitted calls." + }, + "solver_source": "library", + "solver": "certified", + "certified_fallback": "pdip", + "certified_pass_budget": 16, + "certified_pass_budget_basis": "config default (Settings().certified_pass_budget)", + "certified_tau_rel": 1e-09, + "solver_used": "certified", + "solver_check": { + "solver_used": "certified", + "solver_used_source": "AbstractInversion.positive_only_solver_used on the fiducial S3 inversion, built eagerly on the JAX backend (AnalysisImaging(use_jax=True).fit_from) with the arms' Settings", + "reference_solver_used": "pdip", + "traced_solver_kwargs_jax": [ + "certified" + ], + "observed_calls_jax": 1, + "report_rows": 20, + "report_vs_timed_arm_max_rel_diff": 3.8272804531501017e-07 + }, + "lanes_certified": [ + false, + true, + true, + true, + false, + false, + false, + true, + true, + false, + true, + false, + true, + false, + true, + true, + true, + true, + false, + true + ], + "lanes_passes": [ + 16, + 0, + 2, + 4, + 16, + 16, + 16, + 1, + 2, + 16, + 4, + 16, + 5, + 16, + 2, + 1, + 2, + 0, + 16, + 1 + ], + "uncertified_lanes": 8, + "per_lane_certification_note": "certified / passes come from the library's own solve through its stats= out-dict (PyAutoArray #566): passes is the number of restricted active-set passes the library ran (0 when the unconstrained solve was already non-negative), certified is its KKT certificate. With certified_fallback=pdip a False lane returned the PDIP solution; with none it returned the last uncertified iterate. null for a library-PDIP row (no certificate).", + "gate": { + "pre_registered": true, + "gated": [ + "per lane: jit(vmap) arm vs jit(vmap) library PDIP <= lane_rtol relative", + "per lane: scalar jit arm vs scalar jit library PDIP <= lane_rtol relative" + ], + "recorded_not_gated": [ + "per lane: jit(vmap) arm vs scalar jit arm (rel_diff, abs_diff_nats)", + "per lane: jit(vmap) library PDIP vs scalar jit library PDIP", + "uncertified_lanes (certified_fallback=none rows)" + ], + "lanes_failed": 5, + "passed": false, + "policy_eligible": false, + "note": "Pre-registered before submission (module docstring; submit header). Phase 3 (results/notes/hst_gpu_residue_phase3_psf_2026_09.md) placed phase 2's ~2.5e-9 certified-vs-PDIP residual BETWEEN the jit(vmap) and scalar-jit compositions, not in the solver \u2014 so each arm is gated against the library-PDIP reference of its OWN composition, and the cross-composition difference is recorded with its nats. A certified_fallback=none row is policy-eligible only if every lane certifies AND passes the gate. Timing is never gated." + }, + "library_revisions": { + "PyAutoArray": { + "head": "3de624b5b91a4efa130dc3cb0a3a0f06f85025a3", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoArray", + "module_file": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/__init__.py" + }, + "PyAutoFit": { + "head": "dd9fbe0aab60c4a57702b1444ca031b317c91331", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoFit", + "module_file": "/mnt/ral/jnightin/PyAuto/PyAutoFit/autofit/__init__.py" + }, + "PyAutoGalaxy": { + "head": "70a61e26cd715cefe7012a38285698091246a8a4", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy", + "module_file": "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/__init__.py" + }, + "PyAutoLens": { + "head": "86054bbc19baa2f710a12e04a94fa27ab37cc354", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoLens", + "module_file": "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/__init__.py" + }, + "autoarray_file": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/__init__.py" + } + }, + "headline_arm_note": "`trace`, `hlo_census`, `command_buffers` and `trace_timing` above describe the scalar arm \u2014 the program phase 1 traced. Both arms' full blocks, the lane table and the matched comparison are under `vmap`." +} \ No newline at end of file diff --git a/results/breakdown/imaging/fixed_light_trace_delaunay_jitvmap20_captured_pix2_libcertified_fbon_b16_hpc_a100_fp64_fixed_light_trace.png b/results/breakdown/imaging/fixed_light_trace_delaunay_jitvmap20_captured_pix2_libcertified_fbon_b16_hpc_a100_fp64_fixed_light_trace.png new file mode 100644 index 0000000000000000000000000000000000000000..dee5ef1c8c86afc59cdfc016e5a534a4d2c9bbaf GIT binary patch literal 157323 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.wrapper)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/abstract_ndarray.py:35 (to_new_array..wrapper)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_util.py:78 (chi_squared_map_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:78 (AbstractFit.chi_squared_map)" + ] + } + ], + "psf_convolution_mapping_matrix": [ + { + "instruction": "input_scatter_fusion", + "ms": 1.9941307349999995, + "opcode": "fusion", + "shape": "f64[1500,180,180]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "fft.19.0", + "ms": 1.7626722300000008, + "opcode": "fft", + "shape": "f64[1500,180,180]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "fft.15.0", + "ms": 1.3705227500000015, + "opcode": "fft", + "shape": "c128[1500,180,91]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "fft.17.0", + "ms": 0.9792968950000001, + "opcode": "fft", + "shape": "c128[1500,91,180]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "input_transpose_fusion.1", + "ms": 0.5133277300000001, + "opcode": "fusion", + "shape": "c128[1500,91,180]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "wrapped_transpose", + "ms": 0.49952775499999985, + "opcode": "fusion", + "shape": "c128[1500,180,91]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + } + ], + "mapping_matrix": [ + { + "instruction": "loop_broadcast_fusion.3", + "ms": 0.11106406999999997, + "opcode": "fusion", + "shape": "f64[15361,1500]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:342", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:342 (mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/abstract.py:283 (Mapper.mapping_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:91 (AbstractInversionImaging._mapping_matrix_for_convolution_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:137 (AbstractInversionImaging.operated_mapping_matrix_list)" + ] + }, + { + "instruction": "input_reduce_fusion.29", + "ms": 0.0029031999999999925, + "opcode": "fusion", + "shape": "f64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:93", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:93 (adaptive_pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/abstract.py:507 (Mapper.pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt.py:339 (Adapt.regularization_weights_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt_split.py:120 (AdaptSplit.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)" + ] + }, + { + "instruction": "loop_divide_fusion", + "ms": 0.002351499999999999, + "opcode": "fusion", + "shape": "f64[1500]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:92", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:92 (adaptive_pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/abstract.py:507 (Mapper.pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt.py:339 (Adapt.regularization_weights_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt_split.py:120 (AdaptSplit.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)" + ] + } + ], + "mixed_fusion": [ + { + "instruction": "loop_divide_gather_fusion", + "ms": 1.0230453300000004, + "opcode": "fusion", + "shape": "(f64[15361,1,1,1500]{3,2,1,0}, f64[15361,1,1,1500]{3,2,1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:133", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:133 (curvature_matrix_via_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:93 (InversionImagingMapping.curvature_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:389 (AbstractInversion.curvature_reg_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "input_add_multiply_transpose_fusion", + "ms": 0.061123699999999996, + "opcode": "fusion", + "shape": "(f64[1500,1500]{1,0}, f64[1500,1500]{1,0}, f64[1500,1500]{1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:61", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:61 (initialize)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:72 (solve_nnls)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:129 (_solve_nnls_primal_with..primal)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:164 (solve_nnls_primal_with_status)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:508 (reconstruction_positive_only_from)" + ] + }, + { + "instruction": "input_transpose_fusion.3", + "ms": 0.024346675000000012, + "opcode": "fusion", + "shape": "f64[1500,1500]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986 (AbstractInversion._log_det_symmetric_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:1157 (AbstractInversion.log_det_regularization_matrix_term)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:348 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/model/analysis.py:135 (AnalysisImaging.log_likelihood_function)" + ] + }, + { + "instruction": "input_scatter_fusion.2", + "ms": 0.016429389999999995, + "opcode": "fusion", + "shape": "f64[1500,1500]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:579", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:579 (pixel_splitted_regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt_split.py:137 (AdaptSplit.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:332 (AbstractInversion.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "loop_abs_fusion", + "ms": 0.014725229999999997, + "opcode": "fusion", + "shape": "(f64[6000,1]{1,0}, f64[6000,1]{1,0}, f64[6000,1]{1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:613", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:613 (triangle_area_xp)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:657 (pixel_weights_delaunay_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:982 (InterpolatorDelaunay._mappings_sizes_weights_split)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt_split.py:124 (AdaptSplit.regularization_matrix_from)" + ] + }, + { + "instruction": "input_scatter_fusion.3", + "ms": 0.014606035000000003, + "opcode": "fusion", + "shape": "f64[1500]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:70", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:70 (adaptive_pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/abstract.py:507 (Mapper.pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt.py:339 (Adapt.regularization_weights_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt_split.py:120 (AdaptSplit.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)" + ] + } + ], + "ray_trace_data_grid": [ + { + "instruction": "input_reduce_fusion.18", + "ms": 0.0032377399999999946, + "opcode": "fusion", + "shape": "f64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:506", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:506 (FlatLambdaCDM._simpson_1d)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:644 (FlatLambdaCDM.angular_diameter_distance_kpc_z1z2)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:133 (LensingCosmology.angular_diameter_distance_to_earth_in_kpc_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:362 (LensingCosmology.scaling_factor_between_redshifts_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/lens/tracer_util.py:252 (traced_grid_2d_list_from)" + ] + }, + { + "instruction": "input_reduce_fusion.20", + "ms": 0.0027575949999999955, + "opcode": "fusion", + "shape": "f64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:506", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:506 (FlatLambdaCDM._simpson_1d)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:644 (FlatLambdaCDM.angular_diameter_distance_kpc_z1z2)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:151 (LensingCosmology.angular_diameter_distance_between_redshifts_in_kpc_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:355 (LensingCosmology.scaling_factor_between_redshifts_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/lens/tracer_util.py:252 (traced_grid_2d_list_from)" + ] + }, + { + "instruction": "input_reduce_fusion.19", + "ms": 0.002598389999999994, + "opcode": "fusion", + "shape": "f64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:503", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:503 (FlatLambdaCDM._simpson_1d)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:644 (FlatLambdaCDM.angular_diameter_distance_kpc_z1z2)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:133 (LensingCosmology.angular_diameter_distance_to_earth_in_kpc_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:362 (LensingCosmology.scaling_factor_between_redshifts_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/lens/tracer_util.py:252 (traced_grid_2d_list_from)" + ] + }, + { + "instruction": "input_reduce_fusion.21", + "ms": 0.002593764999999992, + "opcode": "fusion", + "shape": "f64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:503", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:503 (FlatLambdaCDM._simpson_1d)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:644 (FlatLambdaCDM.angular_diameter_distance_kpc_z1z2)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:151 (LensingCosmology.angular_diameter_distance_between_redshifts_in_kpc_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:355 (LensingCosmology.scaling_factor_between_redshifts_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/lens/tracer_util.py:252 (traced_grid_2d_list_from)" + ] + }, + { + "instruction": "loop_divide_fusion.1", + "ms": 0.0025345600000000012, + "opcode": "fusion", + "shape": "f64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:380", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:380 (LensingCosmology.scaling_factor_between_redshifts_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/lens/tracer_util.py:252 (traced_grid_2d_list_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/lens/tracer.py:632 (Tracer.traced_grid_2d_list_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/structures/decorators/abstract.py:93 (AbstractMaker.evaluate_func)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/structures/decorators/abstract.py:110 (AbstractMaker.result)" + ] + } + ], + "grids_and_structures": [ + { + "instruction": "loop_multiply_sine_fusion", + "ms": 0.001349450000000002, + "opcode": "fusion", + "shape": "(f64[], f64[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/geometry/geometry_util.py:527", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/geometry/geometry_util.py:527 (transform_grid_2d_to_reference_frame)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/profiles/geometry_profiles.py:418 (EllProfile.transformed_to_reference_frame_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/structures/decorators/abstract.py:93 (AbstractMaker.evaluate_func)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/structures/decorators/abstract.py:112 (AbstractMaker.result)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/structures/decorators/to_grid.py:70 (to_grid..wrapper)" + ] + } + ], + "border_relocator": [ + { + "instruction": "eigh.45", + "ms": 0.07476311500000012, + "opcode": "custom-call", + "shape": "(f64[2,2]{0,1}, f64[2]{0}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:245", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:245 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:454 (BorderRelocator.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:176 (AbstractMesh.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:214 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "custom-call.2", + "ms": 0.007968155000000018, + "opcode": "custom-call", + "shape": "(f64[2,2]{1,0}, s8[4194304]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:242", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:242 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:454 (BorderRelocator.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:176 (AbstractMesh.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:214 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "loop_select_sine_fusion", + "ms": 0.003661740000000002, + "opcode": "fusion", + "shape": "(f64[], f64[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:301", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:301 (relocated_grid_via_ellipse_border_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:458 (BorderRelocator.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:176 (AbstractMesh.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:214 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "loop_add_fusion.7", + "ms": 0.0036049499999999952, + "opcode": "fusion", + "shape": "f64[1500]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:308", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:308 (relocated_grid_via_ellipse_border_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:458 (BorderRelocator.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:176 (AbstractMesh.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:214 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "input_concatenate_fusion.6", + "ms": 0.0033672000000000016, + "opcode": "fusion", + "shape": "f64[1500,2]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:323", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:323 (relocated_grid_via_ellipse_border_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:458 (BorderRelocator.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:176 (AbstractMesh.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:214 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "input_reduce_fusion.23", + "ms": 0.0019169550000000043, + "opcode": "fusion", + "shape": "f64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:256", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:256 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:454 (BorderRelocator.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:176 (AbstractMesh.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:214 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + } + ], + "mesh_construction": [ + { + "instruction": "input_concatenate_fusion.7", + "ms": 0.0020686249999999975, + "opcode": "fusion", + "shape": "f64[1500,2]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:820", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:820 (InterpolatorDelaunay.mesh_grid_xy)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:847 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + } + ], + "mesh_qhull_callback": [ + { + "instruction": "pure_callback.4", + "ms": 0.010612789999999981, + "opcode": "custom-call", + "shape": "(s32[3000,3]{1,0}, s32[3000,3]{1,0}, s32[1500]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:161", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:161 (_jax_delaunay_tables)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:405 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + } + ], + "other": [ + { + "instruction": "copy.72", + "ms": 0.04222511500000095, + "opcode": "copy", + "shape": "f64[1,1024,2]{2,1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "copy.35", + "ms": 0.014779059999999924, + "opcode": "copy", + "shape": "s32[21361]{0}", + "source": "", + "stack": [] + }, + { + "instruction": "loop_broadcast_fusion.1", + "ms": 0.0019825650000000043, + "opcode": "fusion", + "shape": "(pred[21361]{0}, pred[21361]{0})", + "source": "", + "stack": [] + }, + { + "instruction": "copy.40", + "ms": 0.001971185000000003, + "opcode": "copy", + "shape": "s64[1500]{0}", + "source": "", + "stack": [] + }, + { + "instruction": "loop_broadcast_fusion.2", + "ms": 0.0017951949999999957, + "opcode": "fusion", + "shape": "(f64[1500]{0}, f64[1500]{0}, f64[1500]{0}, f64[1500]{0})", + "source": "", + "stack": [] + }, + { + "instruction": "copy.20", + "ms": 0.001671215, + "opcode": "copy", + "shape": "s64[]", + "source": "", + "stack": [] + } + ], + "mesh_seed_argmin": [ + { + "instruction": "input_reduce_fusion", + "ms": 0.14838911000000363, + "opcode": "fusion", + "shape": "(f64[1024]{0}, s64[1024]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:191", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:191 (_nearest_vertex_seed_from..argmin_chunk)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204 (_nearest_vertex_seed_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:351 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)" + ] + }, + { + "instruction": "loop_dynamic_update_slice_fusion", + "ms": 0.04136217499999794, + "opcode": "fusion", + "shape": "s32[21,1024]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204 (_nearest_vertex_seed_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:351 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "loop_add_fusion", + "ms": 0.031880524999999986, + "opcode": "fusion", + "shape": "s64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204 (_nearest_vertex_seed_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:351 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "loop_broadcast_fusion", + "ms": 0.0019715200000000013, + "opcode": "fusion", + "shape": "s32[21,1024]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204 (_nearest_vertex_seed_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:351 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "regularization_H": [ + { + "instruction": "loop_select_fusion.3", + "ms": 0.02005693000000001, + "opcode": "fusion", + "shape": "f64[1500,1500]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:549", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:549 (pixel_splitted_regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt_split.py:137 (AdaptSplit.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:332 (AbstractInversion.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "input_scatter_fusion.10", + "ms": 0.002080480000000001, + "opcode": "fusion", + "shape": "f64[1500,1500]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:615", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:615 (pixel_splitted_regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt_split.py:137 (AdaptSplit.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:332 (AbstractInversion.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "input_concatenate_fusion.9", + "ms": 0.0018708849999999981, + "opcode": "fusion", + "shape": "pred[3]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:91", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:91 (split_points_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:410 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + }, + { + "instruction": "input_concatenate_fusion.8", + "ms": 0.001867524999999998, + "opcode": "fusion", + "shape": "pred[3]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:93", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:93 (split_points_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:410 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + }, + { + "instruction": "input_concatenate_fusion.10", + "ms": 0.001867194999999998, + "opcode": "fusion", + "shape": "pred[3]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:90", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:90 (split_points_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:410 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + }, + { + "instruction": "input_concatenate_fusion", + "ms": 0.0017668799999999982, + "opcode": "fusion", + "shape": "s32[1500,2]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:615", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:615 (pixel_splitted_regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt_split.py:137 (AdaptSplit.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:332 (AbstractInversion.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "mesh_locate_walk": [ + { + "instruction": "loop_reduce_fusion", + "ms": 0.023632765000000222, + "opcode": "fusion", + "shape": "(f64[21361]{0}, s64[21361]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:264", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:264 (_walk_from_seed..walk_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:292 (_walk_from_seed..body)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:264 (_walk_from_seed..walk_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:292 (_walk_from_seed..body)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)" + ] + }, + { + "instruction": "input_reduce_fusion.1", + "ms": 0.022718959999999684, + "opcode": "fusion", + "shape": "pred[196]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:288", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:288 (_walk_from_seed..cond)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:353 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)" + ] + }, + { + "instruction": "loop_or_select_fusion", + "ms": 0.020374695000000012, + "opcode": "fusion", + "shape": "(s32[21361]{0}, pred[21361]{0}, pred[21361]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:270", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:270 (_walk_from_seed..walk_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:292 (_walk_from_seed..body)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:353 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)" + ] + }, + { + "instruction": "loop_select_fusion", + "ms": 0.017536129999999987, + "opcode": "fusion", + "shape": "s32[21361]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:242", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:242 (_walk_from_seed..weights_of)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:262 (_walk_from_seed..walk_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:292 (_walk_from_seed..body)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:353 (pix_indexes_delaunay_walk_from)" + ] + }, + { + "instruction": "input_reduce_fusion.2", + "ms": 0.014358279999999928, + "opcode": "fusion", + "shape": "pred[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:288", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:288 (_walk_from_seed..cond)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:353 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)" + ] + }, + { + "instruction": "while.22", + "ms": 0.012884814999999787, + "opcode": "while", + "shape": "(s32[], s32[21361]{0}, pred[21361]{0}, pred[21361]{0}, s32[3000,3]{1,0}, /*index=5*/f64[1500,2]{1,0}, f64[21361,2]{1,0}, s32[3000,3]{1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:353 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "data_vector_D": [ + { + "instruction": "input_reduce_fusion.10", + "ms": 0.12161861500000003, + "opcode": "fusion", + "shape": "f64[92,1500]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/inversion_imaging_util.py:123", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/inversion_imaging_util.py:123 (data_vector_via_blurred_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:67 (InversionImagingMapping.data_vector)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:699 (AbstractInversion.reconstruction)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "input_reduce_fusion.27", + "ms": 0.003683645000000003, + "opcode": "fusion", + "shape": "f64[1500]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/inversion_imaging_util.py:123", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/inversion_imaging_util.py:123 (data_vector_via_blurred_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:67 (InversionImagingMapping.data_vector)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:699 (AbstractInversion.reconstruction)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "inversion_other": [ + { + "instruction": "cholesky.60", + "ms": 0.8959521850000002, + "opcode": "custom-call", + "shape": "(f64[1500,1500]{0,1}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986 (AbstractInversion._log_det_symmetric_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:1078 (AbstractInversion.log_det_curvature_reg_matrix_term)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:347 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/model/analysis.py:135 (AnalysisImaging.log_likelihood_function)" + ] + }, + { + "instruction": "cholesky.70", + "ms": 0.8952552050000002, + "opcode": "custom-call", + "shape": "(f64[1500,1500]{0,1}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986 (AbstractInversion._log_det_symmetric_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:1157 (AbstractInversion.log_det_regularization_matrix_term)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:348 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/model/analysis.py:135 (AnalysisImaging.log_likelihood_function)" + ] + }, + { + "instruction": "input_reduce_fusion.17", + "ms": 0.013025704999999992, + "opcode": "fusion", + "shape": "f64[1500]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:946", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:946 (AbstractInversion.regularization_term)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:346 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/model/analysis.py:135 (AnalysisImaging.log_likelihood_function)", + "/mnt/ral/jnightin/autolens_profiling_wt/certified-solver-phase-c1-lane-rate/scripts/imaging/likelihood_breakdown/fixed_light_trace.py:1195 (_captured_likelihood_fn.._likelihood)" + ] + }, + { + "instruction": "loop_reduce_window_fusion", + "ms": 0.002881114999999994, + "opcode": "fusion", + "shape": "s64[6,16]{1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "loop_reduce_window_fusion.1", + "ms": 0.0027832000000000048, + "opcode": "fusion", + "shape": "s64[94,16]{1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "input_reduce_fusion.25", + "ms": 0.0026658900000000032, + "opcode": "fusion", + "shape": "f64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:944", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:944 (AbstractInversion.regularization_term)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:346 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/model/analysis.py:135 (AnalysisImaging.log_likelihood_function)", + "/mnt/ral/jnightin/autolens_profiling_wt/certified-solver-phase-c1-lane-rate/scripts/imaging/likelihood_breakdown/fixed_light_trace.py:1195 (_captured_likelihood_fn.._likelihood)" + ] + } + ], + "curvature_matrix_F": [ + { + "instruction": "cublas-lt-matmul.2", + "ms": 4.2290523050000015, + "opcode": "custom-call", + "shape": "(f64[1500,1500]{1,0}, s8[4194304]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:134", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:134 (curvature_matrix_via_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:93 (InversionImagingMapping.curvature_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:389 (AbstractInversion.curvature_reg_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "pdip_solve": [ + { + "instruction": "cholesky.20", + "ms": 15.643076489999782, + "opcode": "custom-call", + "shape": "(f64[1500,1500]{0,1}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:106", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:106 (factorize_kkt)", + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:212 (pdip_pc_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:83 (solve_nnls)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:129 (_solve_nnls_primal_with..primal)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:164 (solve_nnls_primal_with_status)" + ] + }, + { + "instruction": "triangular-solve", + "ms": 2.4862915699999815, + "opcode": "custom-call", + "shape": "(f64[1500,1]{0,1}, s8[0]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146 (solve_kkt_rhs)", + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:213 (pdip_pc_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:83 (solve_nnls)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:129 (_solve_nnls_primal_with..primal)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:164 (solve_nnls_primal_with_status)" + ] + }, + { + "instruction": "triangular-solve.2", + "ms": 2.435595480000113, + "opcode": "custom-call", + "shape": "(f64[1500,1]{0,1}, s8[0]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146 (solve_kkt_rhs)", + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:217 (pdip_pc_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:83 (solve_nnls)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:129 (_solve_nnls_primal_with..primal)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:164 (solve_nnls_primal_with_status)" + ] + }, + { + "instruction": "triangular-solve.3", + "ms": 2.362735340000195, + "opcode": "custom-call", + "shape": "(f64[1500,1]{0,1}, s8[0]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146 (solve_kkt_rhs)", + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:217 (pdip_pc_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:83 (solve_nnls)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:129 (_solve_nnls_primal_with..primal)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:164 (solve_nnls_primal_with_status)" + ] + }, + { + "instruction": "triangular-solve.1", + "ms": 2.261767130000196, + "opcode": "custom-call", + "shape": "(f64[1500,1]{0,1}, s8[0]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146 (solve_kkt_rhs)", + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:213 (pdip_pc_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:83 (solve_nnls)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:129 (_solve_nnls_primal_with..primal)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:164 (solve_nnls_primal_with_status)" + ] + }, + { + "instruction": "cholesky.40", + "ms": 0.8701936999999988, + "opcode": "custom-call", + "shape": "(f64[1500,1500]{0,1}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:62", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:62 (initialize)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:72 (solve_nnls)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:129 (_solve_nnls_primal_with..primal)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:164 (solve_nnls_primal_with_status)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:508 (reconstruction_positive_only_from)" + ] + } + ], + "mapped_reconstruction": [ + { + "instruction": "input_reduce_fusion.14", + "ms": 0.11521205500000002, + "opcode": "fusion", + "shape": "f64[15361]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:163", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:163 (mapped_reconstructed_data_via_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:120 (InversionImagingMapping._mapped_reconstructed_data_dict_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:196 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + } + ] + }, + "stage_audit_note": "The HLO instructions that contributed most of each stage's milliseconds, with their full source stack. A stage row is only as good as the rules that built it; this is how a reader checks a row against the HLO instead of trusting it.", + "untraced_wall_ms": 50.02341258999877, + "reconciliation_vs_untraced_pct": -1.9565279822480652, + "wall_basis": "wall_ms is the TRACED run's wall, the run these kernel durations came from. untraced_wall_ms is the same executable without the profiler; the difference is the profiler's overhead and belongs in neither the stages nor the idle row.", + "calls": 200, + "call_split": "per-call (first-instruction recurrence)", + "call_blocks": 200, + "events": 185800, + "streams": [ + "Stream #14(MemcpyH2D,Compute,MemcpyD2H,Memset,MemcpyD2D)" + ], + "per_stage_ms": { + "border_relocator": { + "median_ms": 0.09679900000000002, + "min_ms": 0.09615600000000003, + "max_ms": 0.097789 + }, + "chi_squared_evidence": { + "median_ms": 0.010624000000000001, + "min_ms": 0.010304, + "max_ms": 0.011232 + }, + "curvature_matrix_F": { + "median_ms": 4.2269015, + "min_ms": 4.214477, + "max_ms": 4.30875 + }, + "data_vector_D": { + "median_ms": 0.12531350000000002, + "min_ms": 0.124545, + "max_ms": 0.126145 + }, + "grids_and_structures": { + "median_ms": 0.001312, + "min_ms": 0.00128, + "max_ms": 0.00144 + }, + "inversion_other": { + "median_ms": 1.8232705, + "min_ms": 1.805524, + "max_ms": 1.837844 + }, + "mapped_reconstruction": { + "median_ms": 0.115197, + "min_ms": 0.114397, + "max_ms": 0.116061 + }, + "mapping_matrix": { + "median_ms": 0.11632100000000001, + "min_ms": 0.115329, + "max_ms": 0.11756899999999999 + }, + "memset": { + "median_ms": 0.04812800000000002, + "min_ms": 0.04000000000000001, + "max_ms": 0.07564800000000006 + }, + "mesh_construction": { + "median_ms": 0.00208, + "min_ms": 0.002047, + "max_ms": 0.002112 + }, + "mesh_locate_walk": { + "median_ms": 0.134049, + "min_ms": 0.133217, + "max_ms": 0.134912 + }, + "mesh_qhull_callback": { + "median_ms": 0.01056, + "min_ms": 0.010464000000000001, + "max_ms": 0.011168 + }, + "mesh_seed_argmin": { + "median_ms": 0.2235865000000001, + "min_ms": 0.2230990000000001, + "max_ms": 0.2240660000000001 + }, + "mixed_fusion": { + "median_ms": 1.2709775, + "min_ms": 1.2687489999999997, + "max_ms": 1.2747000000000004 + }, + "other": { + "median_ms": 0.0693135, + "min_ms": 0.06889499999999998, + "max_ms": 0.06976 + }, + "pdip_solve": { + "median_ms": 25.848196000000044, + "min_ms": 22.808241000000063, + "max_ms": 41.376746000000004 + }, + "psf_convolution_mapping_matrix": { + "median_ms": 7.3480195, + "min_ms": 7.3335490000000005, + "max_ms": 7.364046000000001 + }, + "ray_trace_data_grid": { + "median_ms": 0.013696, + "min_ms": 0.013568, + "max_ms": 0.014177000000000002 + }, + "regularization_H": { + "median_ms": 0.031008, + "min_ms": 0.030368, + "max_ms": 0.031679 + } + }, + "stage_order": [ + "ray_trace_data_grid", + "border_relocator", + "mesh_qhull_callback", + "mesh_seed_argmin", + "mesh_locate_walk", + "mesh_construction", + "mapping_matrix", + "psf_convolution_mapping_matrix", + "data_vector_D", + "curvature_matrix_F", + "regularization_H", + "pdip_solve", + "mapped_reconstruction", + "chi_squared_evidence", + "grids_and_structures", + "inversion_other", + "mixed_fusion", + "other", + "memset" + ], + "mixed_fusion": { + "ms": 1.2709775, + "constituent_stage_sets": { + "curvature_matrix_F + psf_convolution_mapping_matrix": 1.0230453300000004, + "curvature_reg_reduce_gather + inversion_other + mapped_reconstruction + pdip_solve + reconstruction_scatter + regularization_H": 0.061123699999999996, + "inversion_other + regularization_H": 0.029225715000000055, + "inversion_other + mesh_construction + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin + regularization_H": 0.021690225000000046, + "border_relocator + ray_trace_data_grid": 0.021213189999999996, + "inversion_other + mapping_matrix + mesh_construction + mesh_dual_areas + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin": 0.021144570000000022, + "inversion_other + mesh_construction + mesh_dual_areas + mesh_interpolation_weights + regularization_H": 0.014725229999999997, + "inversion_other + mapping_matrix + mesh_construction + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin": 0.01166553, + "grids_and_structures + mass_profile_deflections + ray_trace_data_grid": 0.009562199999999998, + "inversion_other + mesh_dual_areas + mesh_locate_walk": 0.00939052000000004, + "inversion_other + mesh_construction + mesh_seed_argmin + regularization_H": 0.007291344999999993, + "inversion_other + mesh_construction + regularization_H": 0.006517565000000003, + "inversion_other + ray_trace_data_grid": 0.0053705450000000165, + "inversion_other + mapped_reconstruction + pdip_solve + reconstruction_scatter": 0.004874084999999997, + "inversion_other + mapped_reconstruction": 0.0037905350000000007, + "mapping_matrix + regularization_H": 0.003419349999999996, + "inversion_other + mesh_construction + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin": 0.0031858950000000015, + "inversion_other + mesh_construction + mesh_dual_areas + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin": 0.0029827000000000065, + "inversion_other + pdip_solve": 0.0028899249999999976, + "inversion_other + mesh_locate_walk + mesh_seed_argmin": 0.002527329999999996, + "inversion_other + mesh_interpolation_weights": 0.0022097499999999934, + "chi_squared_evidence + inversion_other": 0.0019017450000000029, + "grids_and_structures + mass_profile_deflections": 0.0013417450000000018 + }, + "example_kernels": { + "curvature_matrix_F + psf_convolution_mapping_matrix": [ + "loop_divide_gather_fusion" + ], + "curvature_reg_reduce_gather + inversion_other + mapped_reconstruction + pdip_solve + reconstruction_scatter + regularization_H": [ + "input_add_multiply_transpose_fusion" + ], + "inversion_other + regularization_H": [ + "loop_reduce_slice_fusion", + "loop_reduce_fusion.1", + "loop_reduce_fusion.2", + "input_transpose_fusion.3" + ], + "inversion_other + mesh_construction + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin + regularization_H": [ + "input_reduce_fusion.24", + "loop_select_fusion.4", + "input_scatter_fusion.2" + ], + "border_relocator + ray_trace_data_grid": [ + "input_reduce_fusion.16", + "input_concatenate_fusion.12", + "input_reduce_fusion.15", + "loop_add_fusion.5" + ], + "inversion_other + mapping_matrix + mesh_construction + mesh_dual_areas + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin": [ + "input_scatter_fusion.6", + "input_scatter_fusion.3" + ], + "inversion_other + mesh_construction + mesh_dual_areas + mesh_interpolation_weights + regularization_H": [ + "loop_abs_fusion" + ], + "inversion_other + mapping_matrix + mesh_construction + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin": [ + "input_scatter_fusion.4" + ], + "grids_and_structures + mass_profile_deflections + ray_trace_data_grid": [ + "loop_subtract_fusion.1" + ], + "inversion_other + mesh_dual_areas + mesh_locate_walk": [ + "loop_select_fusion.6", + "input_scatter_fusion.9", + "input_scatter_fusion.8", + "input_scatter_fusion.7" + ] + }, + "prorated_estimate_ms": { + "curvature_matrix_F": 0.5115226650000002, + "psf_convolution_mapping_matrix": 0.5115226650000002, + "inversion_other": 0.05472717369047624, + "regularization_H": 0.03706525725000003, + "mesh_construction": 0.0166546449404762, + "ray_trace_data_grid": 0.016479267500000006, + "mesh_interpolation_weights": 0.013764162023809534, + "mesh_locate_walk": 0.013686857690476215, + "mapped_reconstruction": 0.013301072083333332, + "pdip_solve": 0.01285076708333333, + "mesh_seed_argmin": 0.012379520607142867, + "reconstruction_scatter": 0.011405804583333332, + "border_relocator": 0.010606594999999998, + "curvature_reg_reduce_gather": 0.010187283333333333, + "mesh_dual_areas": 0.009592988857142874, + "mapping_matrix": 0.0066745828571428585, + "grids_and_structures": 0.0038582725000000004, + "mass_profile_deflections": 0.0038582725000000004, + "chi_squared_evidence": 0.0009508725000000014 + }, + "prorated_note": "ESTIMATE ONLY \u2014 a mixed fusion's time split equally across the stages its constituents span. Never summed into the measured table, never reconciled." + }, + "other_sources_ms": { + "copy.72": 0.04222511500000095, + "copy.35": 0.014779059999999924, + "loop_broadcast_fusion.1": 0.0019825650000000043, + "copy.40": 0.001971185000000003, + "loop_broadcast_fusion.2": 0.0017951949999999957, + "copy.20": 0.001671215, + "copy.71": 0.0016487949999999991, + "copy.52": 0.001648469999999997, + "copy.70": 0.001609909999999998 + }, + "device_span_ms": 51.395114955, + "device_busy_ms": 43.86577693, + "device_idle_ms": 7.529338024999994, + "largest_idle_gaps": [ + { + "gap_ms": 5.342053, + "after": "pure_callback.4", + "before": "pure_callback.4" + }, + { + "gap_ms": 0.046111, + "after": "input_concatenate_fusion.7", + "before": "pure_callback.4" + }, + { + "gap_ms": 0.033919, + "after": "pure_callback.4", + "before": "copy.71" + }, + { + "gap_ms": 0.033567, + "after": "input_reduce_fusion.1", + "before": "input_reduce_fusion.2" + }, + { + "gap_ms": 0.024608, + "after": "loop_add_fusion", + "before": "copy.72" + }, + { + "gap_ms": 0.022879, + "after": "input_reduce_fusion.26", + "before": "loop_broadcast_fusion.4" + }, + { + "gap_ms": 0.02064, + "after": "eigh.45", + "before": "eigh.45" + }, + { + "gap_ms": 0.019999, + "after": "loop_reduce_fusion.1", + "before": "loop_reduce_fusion.2" + } + ], + "kernel_ms": 41.51535250000005, + "sum_ms": 49.04469052500004, + "wall_ms": 51.40007197500381, + "host_outside_span_ms": 0.004957020003814705, + "reconciliation_pct": -4.582447766122208, + "unjoined_ms": 0.0, + "unjoined_pct": 0.0, + "other_ms": 0.0693135, + "other_pct": 0.13485097848444183, + "note": "Stage rows attribute the command-buffers-OFF program (see the module docstring): kernel times are the same, the launch overhead the CUDA graphs remove is not. sum_ms = kernel rows + device_idle_ms; the residual against wall_ms is host_outside_span_ms (dispatch before the first kernel, teardown after the last).", + "per_stage_ms_per_lane": { + "border_relocator": 0.09679900000000002, + "chi_squared_evidence": 0.010624000000000001, + "curvature_matrix_F": 4.2269015, + "data_vector_D": 0.12531350000000002, + "grids_and_structures": 0.001312, + "inversion_other": 1.8232705, + "mapped_reconstruction": 0.115197, + "mapping_matrix": 0.11632100000000001, + "memset": 0.04812800000000002, + "mesh_construction": 0.00208, + "mesh_locate_walk": 0.134049, + "mesh_qhull_callback": 0.01056, + "mesh_seed_argmin": 0.2235865000000001, + "mixed_fusion": 1.2709775, + "other": 0.0693135, + "pdip_solve": 25.848196000000044, + "psf_convolution_mapping_matrix": 7.3480195, + "ray_trace_data_grid": 0.013696, + "regularization_H": 0.031008 + }, + "per_lane_divisor": 1, + "host_callback": { + "pure_callback_span_ms": 100.77607629999997, + "qhull_ms": 93.95979960000003, + "callback_body_ms_note": "the OUTERMOST matching body event, not a sum: under the probe the body appears twice (the wrapper and the timed re-implementation it calls) and summing them would count the same work twice", + "events_by_name": { + "pure_callback.4": { + "count": 200, + "ms": 100.77607629999997 + }, + "$callback.py:815 _wrapped_callback": { + "count": 200, + "ms": 99.01275000000007 + }, + "$callback.py:224 _callback": { + "count": 200, + "ms": 98.54368509999999 + }, + "$callback.py:74 pure_callback_impl": { + "count": 200, + "ms": 98.36677370000001 + }, + "$callback.py:69 __call__": { + "count": 200, + "ms": 94.27812700000001 + }, + "$delaunay.py:162 ": { + "count": 200, + "ms": 94.14547370000003 + }, + "$host_callback_probe.py:225 wrapped": { + "count": 200, + "ms": 93.95979960000003 + }, + "$host_callback_probe.py:160 _timed_tri_only": { + "count": 200, + "ms": 93.7995406 + }, + "ThenExecuteCallback:GetEventForComputeStreamSyncPoint": { + "count": 200, + "ms": 0.3638613000000001 + }, + "$callback.py:822 ": { + "count": 800, + "ms": 0.28749589999999947 + }, + "$__init__.py:132 _xla_gc_callback": { + "count": 2, + "ms": 0.000366 + } + }, + "note": "HOST milliseconds per traced BATCH (the whole invocation), aggregated by name because the events nest. Not a row of the device table: the device pays for them as the idle gaps largest_idle_gaps names." + }, + "host_callback_ms": 100.77607629999997 + }, + "hlo_census": { + "status": "excluded", + "reason": "The legacy census anchors PyAutoArray source line numbers that moved after the phase-1 run. No batched attribution is published from unsupported anchors; the device-event table and wall reconciliation remain valid." + }, + "stage_map_provenance": [ + { + "label": "log_det_curvature_reg", + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 850, + 882 + ], + "requires": { + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 884, + 896 + ] + }, + "function": null + }, + { + "label": "log_det_regularization", + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 850, + 882 + ], + "requires": { + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 897, + 943 + ] + }, + "function": null + }, + { + "label": "curvature_reg_add", + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 359, + 372 + ], + "requires": null, + "function": null + }, + { + "label": "curvature_reg_reduce_gather", + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 374, + 398 + ], + "requires": null, + "function": null + }, + { + "label": "edge_subset_gather", + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 606, + 614 + ], + "requires": null, + "function": null + }, + { + "label": "regularization_term", + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 786, + 849 + ], + "requires": null, + "function": null + }, + { + "label": "mapped_reconstruction", + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 722, + 785 + ], + "requires": null, + "function": null + }, + { + "label": "reconstruction_scatter", + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 583, + 605 + ], + "requires": null, + "function": null + }, + { + "label": "reconstruction_scatter", + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 615, + 721 + ], + "requires": null, + "function": null + }, + { + "label": "certified_active_set_solve", + "path": "likelihood_breakdown/active_set_steps.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "certified_active_set_solve", + "path": "likelihood_breakdown/library_solver_injection.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "pdip_solve", + "path": "PyAutoArray/autoarray/util/jax_nnls.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "pdip_solve", + "path": "PyAutoArray/autoarray/inversion/inversion/inversion_util.py", + "lines": [ + 256, + 488 + ], + "requires": null, + "function": null + }, + { + "label": "mapped_reconstruction", + "path": "PyAutoArray/autoarray/inversion/inversion/inversion_util.py", + "lines": [ + 156, + 200 + ], + "requires": null, + "function": null + }, + { + "label": "curvature_matrix_F", + "path": "PyAutoArray/autoarray/inversion/inversion/inversion_util.py", + "lines": [ + 12, + 155 + ], + "requires": null, + "function": null + }, + { + "label": "reconstruction_scatter", + "path": "PyAutoArray/autoarray/inversion/inversion/inversion_util.py", + "lines": [ + 201, + 255 + ], + "requires": null, + "function": null + }, + { + "label": "data_vector_D", + "path": "PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py", + "lines": [ + 54, + 73 + ], + "requires": null, + "function": null + }, + { + "label": "curvature_matrix_F", + "path": "PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py", + "lines": [ + 74, + 110 + ], + "requires": null, + "function": null + }, + { + "label": "data_vector_D", + "path": "PyAutoArray/autoarray/inversion/inversion/imaging/inversion_imaging_util.py", + "lines": null, + "requires": null, + "function": "data_vector_via_blurred_mapping_matrix_from" + }, + { + "label": "curvature_matrix_F", + "path": "PyAutoArray/autoarray/inversion/inversion/imaging/inversion_imaging_util.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "psf_convolution_mapping_matrix", + "path": "likelihood_breakdown/psf_cube_injection.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "psf_convolution_mapping_matrix", + "path": "PyAutoArray/autoarray/operators/convolver.py", + "lines": [ + 1086, + 1300 + ], + "requires": null, + "function": null + }, + { + "label": "psf_convolution_mapping_matrix", + "path": "PyAutoArray/autoarray/operators/convolver.py", + "lines": [ + 632, + 642 + ], + "requires": null, + "function": null + }, + { + "label": "psf_convolution_mapping_matrix", + "path": "PyAutoArray/autoarray/operators/convolver.py", + "lines": [ + 670, + 691 + ], + "requires": null, + "function": null + }, + { + "label": "psf_convolution_mapping_matrix", + "path": "PyAutoArray/autoarray/operators/convolver.py", + "lines": null, + "requires": { + "path": "PyAutoArray/autoarray/operators/convolver.py", + "lines": [ + 1086, + 1300 + ] + }, + "function": null + }, + { + "label": "psf_convolution_mapping_matrix", + "path": "PyAutoArray/autoarray/operators/convolver.py", + "lines": null, + "requires": { + "path": "PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py", + "lines": [ + 119, + 150 + ] + }, + "function": null + }, + { + "label": "psf_convolution_image", + "path": "PyAutoArray/autoarray/operators/convolver.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "psf_convolution_mapping_matrix", + "path": "PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py", + "lines": [ + 119, + 150 + ], + "requires": null, + "function": null + }, + { + "label": "mesh_qhull_callback", + "path": "PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py", + "lines": [ + 139, + 172 + ], + "requires": null, + "function": null + }, + { + "label": "mesh_seed_argmin", + "path": "PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py", + "lines": [ + 173, + 207 + ], + "requires": null, + "function": null + }, + { + "label": "mesh_locate_walk", + "path": "PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py", + "lines": [ + 208, + 372 + ], + "requires": null, + "function": null + }, + { + "label": "mesh_dual_areas", + "path": "PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py", + "lines": [ + 373, + 396 + ], + "requires": null, + "function": null + }, + { + "label": "mesh_dual_areas", + "path": "PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py", + "lines": [ + 437, + 494 + ], + "requires": null, + "function": null + }, + { + "label": "mesh_dual_areas", + "path": "PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py", + "lines": [ + 605, + 615 + ], + "requires": null, + "function": null + }, + { + "label": "mesh_interpolation_weights", + "path": "PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py", + "lines": [ + 616, + 695 + ], + "requires": null, + "function": null + }, + { + "label": "mesh_interpolation_weights", + "path": "PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py", + "lines": [ + 896, + 1000 + ], + "requires": null, + "function": null + }, + { + "label": "mesh_construction", + "path": "PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "border_relocator", + "path": "PyAutoArray/autoarray/inversion/mesh/border_relocator.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "mesh_construction", + "path": "PyAutoArray/autoarray/inversion/mesh/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "mapping_matrix", + "path": "PyAutoArray/autoarray/inversion/mappers/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "mapping_matrix", + "path": "PyAutoArray/autoarray/inversion/mappings/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "mapping_matrix", + "path": "PyAutoArray/autoarray/inversion/linear_obj/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "regularization_H", + "path": "PyAutoArray/autoarray/inversion/regularization/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "chi_squared_evidence", + "path": "PyAutoArray/autoarray/fit/fit_util.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "chi_squared_evidence", + "path": "PyAutoArray/autoarray/fit/fit_dataset.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "ray_trace_mesh_grid", + "path": "PyAutoLens/autolens/lens/to_inversion.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "ray_trace_mesh_grid", + "path": "PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "mass_profile_deflections", + "path": "PyAutoGalaxy/autogalaxy/profiles/mass/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "light_profile_image", + "path": "PyAutoGalaxy/autogalaxy/profiles/light/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "light_profile_image", + "path": "PyAutoGalaxy/autogalaxy/operate/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "ray_trace_data_grid", + "path": "PyAutoLens/autolens/lens/tracer.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "ray_trace_data_grid", + "path": "PyAutoLens/autolens/lens/tracer_util.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "grids_and_structures", + "path": "PyAutoArray/autoarray/structures/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "grids_and_structures", + "path": "PyAutoArray/autoarray/operators/over_sampling/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "grids_and_structures", + "path": "PyAutoArray/autoarray/geometry/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "inversion_other", + "path": "PyAutoArray/autoarray/inversion/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "fit_imaging_other", + "path": "PyAutoLens/autolens/imaging/fit_imaging.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "fit_imaging_other", + "path": "PyAutoGalaxy/autogalaxy/imaging/fit_imaging.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "fit_imaging_other", + "path": "PyAutoArray/autoarray/fit/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "analysis_other", + "path": "PyAutoLens/autolens/analysis/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "analysis_other", + "path": "PyAutoGalaxy/autogalaxy/analysis/", + "lines": null, + "requires": null, + "function": null + } + ], + "trace_timing": { + "traced_wall_ms": 51.40007197500381, + "untraced_wall_ms": 50.02341258999877, + "profiler_overhead_ms": 1.3766593850050413, + "profiler_overhead_pct": 2.7520301269495517 + }, + "jit_phases": { + "b_s3_pdip_library_likelihood_jit": { + "lower_s": 1.525716807002027, + "compile_s": 4.521228332996543, + "first_call_s": 0.1549838529972476, + "steady_per_call_s": 0.05095825749995129 + }, + "d_s3_certified_fallback_library_likelihood_jit": { + "lower_s": 0.4830860379988735, + "compile_s": 4.224105220000638, + "first_call_s": 0.045827450001524994, + "steady_per_call_s": 0.03163691369991284 + } + }, + "peak_bytes": { + "after_setup": 85108992, + "after_routes": 1181653248, + "after_all": 2405526272, + "note": "jax.devices()[0].memory_stats()['peak_bytes_in_use']; None on a backend that does not report it (CPU). Process-wide high-water marks." + }, + "note": "Every stage row is a MEASURED sum of GPU kernel durations joined to library source through the optimized HLO of ONE program \u2014 not arithmetic across compilations. The rows attribute the command-buffers-OFF program: kernel time is the same as production, the launch overhead the CUDA graphs remove is not, and command_buffers.* carries both walls and their delta. sum_ms = kernel rows + measured device_idle_ms; the residual against the wall is host_outside_span_ms and is reported, not absorbed. mixed_fusion.prorated_estimate_ms is an ESTIMATE and is never part of the table. No row may be quoted if reconciliation_pct is outside 5 % or unjoined_ms is non-zero.", + "vmap": { + "batch": 20, + "lanes_mode": "captured", + "arms": [ + "vmap", + "scalar" + ], + "draw_seed": 0, + "fallback": true, + "composition": "jax.jit(jax.vmap(fn))", + "composition_provenance": "Current Fitness._vmap after PyAutoFit#1638. Array 343376 used the retired jax.vmap(jax.jit(fn)) composition and is historical evidence only.", + "headline_arm": "scalar", + "lane_rtol": 1e-09, + "lanes": [ + { + "lane": 0, + "draw_name": "call00008_lane00", + "draw_kind": "captured", + "offsets": {}, + "log_likelihood_vmap": 19851.59418648651, + "log_likelihood_scalar": 19851.59418466133, + "log_likelihood_library_pdip": 19851.59418648637, + "log_likelihood_library_pdip_scalar": 19851.594184645834, + "rel_diff_vmap_vs_library_pdip": 6.963833401530631e-15, + "rel_diff_scalar_vs_library_pdip_scalar": 7.806823761387096e-13, + "abs_diff_nats": 1.8251776054967195e-06, + "rel_diff": 9.194111004480304e-11, + "rel_diff_scalar_vs_library_pdip": 9.193414620294898e-11, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 1.8405371520202607e-06, + "rel_diff_library_pdip_vmap_vs_scalar": 9.271482858761135e-11, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": null, + "passes": null, + "pdip_iter": null + }, + { + "lane": 1, + "draw_name": "call00008_lane01", + "draw_kind": "captured", + "offsets": {}, + "log_likelihood_vmap": -10958.375999864249, + "log_likelihood_scalar": -10958.374219917532, + "log_likelihood_library_pdip": -10958.375807264842, + "log_likelihood_library_pdip_scalar": -10958.374268026848, + "rel_diff_vmap_vs_library_pdip": 1.7575543204836497e-08, + "rel_diff_scalar_vs_library_pdip_scalar": 4.3901873132189576e-09, + "abs_diff_nats": 0.0017799467168515548, + "rel_diff": 1.624279917012133e-07, + "rel_diff_scalar_vs_library_pdip": 1.4485242496828834e-07, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 0.00153923799371114, + "rel_diff_library_pdip_vmap_vs_scalar": 1.4046225800136805e-07, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "FAIL", + "certified": null, + "passes": null, + "pdip_iter": null + }, + { + "lane": 2, + "draw_name": "call00008_lane02", + "draw_kind": "captured", + "offsets": {}, + "log_likelihood_vmap": 25613.44056437085, + "log_likelihood_scalar": 25613.440570535575, + "log_likelihood_library_pdip": 25613.440564410408, + "log_likelihood_library_pdip_scalar": 25613.440570363673, + "rel_diff_vmap_vs_library_pdip": 1.544477457014604e-12, + "rel_diff_scalar_vs_library_pdip_scalar": 6.711389441042082e-12, + "abs_diff_nats": 6.164726073620841e-06, + "rel_diff": 2.4068324818152055e-10, + "rel_diff_scalar_vs_library_pdip": 2.3913877078206263e-10, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 5.953264917479828e-06, + "rel_diff_library_pdip_vmap_vs_scalar": 2.3242738128543816e-10, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": null, + "passes": null, + "pdip_iter": null + }, + { + "lane": 3, + "draw_name": "call00008_lane03", + "draw_kind": "captured", + "offsets": {}, + "log_likelihood_vmap": 27440.977846751706, + "log_likelihood_scalar": 27440.977846751815, + "log_likelihood_library_pdip": 27440.977846751714, + "log_likelihood_library_pdip_scalar": 27440.977846751797, + "rel_diff_vmap_vs_library_pdip": 2.6514935636831567e-16, + "rel_diff_scalar_vs_library_pdip_scalar": 6.628733909207872e-16, + "abs_diff_nats": 1.0913936421275139e-10, + "rel_diff": 3.97724034552472e-15, + "rel_diff_scalar_vs_library_pdip": 3.7120909891564195e-15, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 8.36735125631094e-11, + "rel_diff_library_pdip_vmap_vs_scalar": 3.049217598235621e-15, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": null, + "passes": null, + "pdip_iter": null + }, + { + "lane": 4, + "draw_name": "call00008_lane04", + "draw_kind": "captured", + "offsets": {}, + "log_likelihood_vmap": 19664.8883643167, + "log_likelihood_scalar": 19664.888362180216, + "log_likelihood_library_pdip": 19664.8883643167, + "log_likelihood_library_pdip_scalar": 19664.888362180216, + "rel_diff_vmap_vs_library_pdip": 0.0, + "rel_diff_scalar_vs_library_pdip_scalar": 0.0, + "abs_diff_nats": 2.1364830899983644e-06, + "rel_diff": 1.0864455727637275e-10, + "rel_diff_scalar_vs_library_pdip": 1.0864455726456912e-10, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 2.1364830899983644e-06, + "rel_diff_library_pdip_vmap_vs_scalar": 1.0864455727637275e-10, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": null, + "passes": null, + "pdip_iter": null + }, + { + "lane": 5, + "draw_name": "call00008_lane05", + "draw_kind": "captured", + "offsets": {}, + "log_likelihood_vmap": 19661.77570330541, + "log_likelihood_scalar": 19661.775700753395, + "log_likelihood_library_pdip": 19661.77570330541, + "log_likelihood_library_pdip_scalar": 19661.775700753395, + "rel_diff_vmap_vs_library_pdip": 0.0, + "rel_diff_scalar_vs_library_pdip_scalar": 0.0, + "abs_diff_nats": 2.552016667323187e-06, + "rel_diff": 1.2979583869555583e-10, + "rel_diff_scalar_vs_library_pdip": 1.2979583867870887e-10, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 2.552016667323187e-06, + "rel_diff_library_pdip_vmap_vs_scalar": 1.2979583869555583e-10, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": null, + "passes": null, + "pdip_iter": null + }, + { + "lane": 6, + "draw_name": "call00008_lane06", + "draw_kind": "captured", + "offsets": {}, + "log_likelihood_vmap": 19673.099043038375, + "log_likelihood_scalar": 19673.099042001224, + "log_likelihood_library_pdip": 19673.09904303841, + "log_likelihood_library_pdip_scalar": 19673.099041959198, + "rel_diff_vmap_vs_library_pdip": 1.8492149097267215e-15, + "rel_diff_scalar_vs_library_pdip_scalar": 2.136213063833496e-12, + "abs_diff_nats": 1.0371513781137764e-06, + "rel_diff": 5.2719267864178524e-11, + "rel_diff_scalar_vs_library_pdip": 5.272111707630883e-11, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 1.0792136890813708e-06, + "rel_diff_library_pdip_vmap_vs_scalar": 5.485733014303447e-11, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": null, + "passes": null, + "pdip_iter": null + }, + { + "lane": 7, + "draw_name": "call00008_lane07", + "draw_kind": "captured", + "offsets": {}, + "log_likelihood_vmap": -138595.04792641063, + "log_likelihood_scalar": -138594.4615199691, + "log_likelihood_library_pdip": -138594.9751196262, + "log_likelihood_library_pdip_scalar": -138594.4581900122, + "rel_diff_vmap_vs_library_pdip": 5.253205201316868e-07, + "rel_diff_scalar_vs_library_pdip_scalar": 2.4026623773717825e-08, + "abs_diff_nats": 0.5864064415218309, + "rel_diff": 4.231095781827759e-06, + "rel_diff_scalar_vs_library_pdip": 3.7057595822723345e-06, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 0.5169296140084043, + "rel_diff_library_pdip_vmap_vs_scalar": 3.7298000277882455e-06, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "FAIL", + "certified": null, + "passes": null, + "pdip_iter": null + }, + { + "lane": 8, + "draw_name": "call00008_lane08", + "draw_kind": "captured", + "offsets": {}, + "log_likelihood_vmap": 29346.071300813812, + "log_likelihood_scalar": 29346.071300942538, + "log_likelihood_library_pdip": 29346.071300823063, + "log_likelihood_library_pdip_scalar": 29346.07130093671, + "rel_diff_vmap_vs_library_pdip": 3.1525106075015753e-13, + "rel_diff_scalar_vs_library_pdip_scalar": 1.9859701113637302e-13, + "abs_diff_nats": 1.2872624211013317e-07, + "rel_diff": 4.3864897890437126e-12, + "rel_diff_scalar_vs_library_pdip": 4.071238728311413e-12, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 1.1364681995473802e-07, + "rel_diff_library_pdip_vmap_vs_scalar": 3.872641717159274e-12, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": null, + "passes": null, + "pdip_iter": null + }, + { + "lane": 9, + "draw_name": "call00008_lane09", + "draw_kind": "captured", + "offsets": {}, + "log_likelihood_vmap": 19677.044941109525, + "log_likelihood_scalar": 19677.04493926127, + "log_likelihood_library_pdip": 19677.044941109525, + "log_likelihood_library_pdip_scalar": 19677.044939261974, + "rel_diff_vmap_vs_library_pdip": 0.0, + "rel_diff_scalar_vs_library_pdip_scalar": 3.5682690766626634e-14, + "abs_diff_nats": 1.8482533050701022e-06, + "rel_diff": 9.392941423751663e-11, + "rel_diff_scalar_vs_library_pdip": 9.39294142286939e-11, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 1.8475511751603335e-06, + "rel_diff_library_pdip_vmap_vs_scalar": 9.389373154674665e-11, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": null, + "passes": null, + "pdip_iter": null + }, + { + "lane": 10, + "draw_name": "call00008_lane10", + "draw_kind": "captured", + "offsets": {}, + "log_likelihood_vmap": 28165.25603001414, + "log_likelihood_scalar": 28165.256030015564, + "log_likelihood_library_pdip": 28165.25603001398, + "log_likelihood_library_pdip_scalar": 28165.256030015524, + "rel_diff_vmap_vs_library_pdip": 5.683281108520991e-15, + "rel_diff_scalar_vs_library_pdip_scalar": 1.4208202771301698e-15, + "abs_diff_nats": 1.4224497135728598e-09, + "rel_diff": 5.050370257799051e-14, + "rel_diff_scalar_vs_library_pdip": 5.6186983686514336e-14, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 1.5425030142068863e-09, + "rel_diff_library_pdip_vmap_vs_scalar": 5.476616340938109e-14, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": null, + "passes": null, + "pdip_iter": null + }, + { + "lane": 11, + "draw_name": "call00008_lane11", + "draw_kind": "captured", + "offsets": {}, + "log_likelihood_vmap": 19843.37960806598, + "log_likelihood_scalar": 19843.37960696008, + "log_likelihood_library_pdip": 19843.37960806599, + "log_likelihood_library_pdip_scalar": 19843.37960694627, + "rel_diff_vmap_vs_library_pdip": 3.666692749871033e-16, + "rel_diff_scalar_vs_library_pdip_scalar": 6.959382839647923e-13, + "abs_diff_nats": 1.1059019016101956e-06, + "rel_diff": 5.5731529785495804e-11, + "rel_diff_scalar_vs_library_pdip": 5.5731896451664764e-11, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 1.11971894511953e-06, + "rel_diff_library_pdip_vmap_vs_scalar": 5.642783473877439e-11, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": null, + "passes": null, + "pdip_iter": null + }, + { + "lane": 12, + "draw_name": "call00008_lane12", + "draw_kind": "captured", + "offsets": {}, + "log_likelihood_vmap": 27027.609847821266, + "log_likelihood_scalar": 27027.609847821303, + "log_likelihood_library_pdip": 27027.60984782127, + "log_likelihood_library_pdip_scalar": 27027.609847821303, + "rel_diff_vmap_vs_library_pdip": 1.3460231324839016e-16, + "rel_diff_scalar_vs_library_pdip_scalar": 0.0, + "abs_diff_nats": 3.637978807091713e-11, + "rel_diff": 1.3460231324838999e-15, + "rel_diff_scalar_vs_library_pdip": 1.2114208192355113e-15, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 3.2741809263825417e-11, + "rel_diff_library_pdip_vmap_vs_scalar": 1.2114208192355099e-15, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": null, + "passes": null, + "pdip_iter": null + }, + { + "lane": 13, + "draw_name": "call00008_lane13", + "draw_kind": "captured", + "offsets": {}, + "log_likelihood_vmap": 19663.70492707598, + "log_likelihood_scalar": 19663.704925197264, + "log_likelihood_library_pdip": 19663.70492707598, + "log_likelihood_library_pdip_scalar": 19663.704925197264, + "rel_diff_vmap_vs_library_pdip": 0.0, + "rel_diff_scalar_vs_library_pdip_scalar": 0.0, + "abs_diff_nats": 1.8787177396006882e-06, + "rel_diff": 9.554240906011973e-11, + "rel_diff_scalar_vs_library_pdip": 9.554240905099138e-11, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 1.8787177396006882e-06, + "rel_diff_library_pdip_vmap_vs_scalar": 9.554240906011973e-11, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": null, + "passes": null, + "pdip_iter": null + }, + { + "lane": 14, + "draw_name": "call00008_lane14", + "draw_kind": "captured", + "offsets": {}, + "log_likelihood_vmap": 29194.37137801729, + "log_likelihood_scalar": 29194.371408665826, + "log_likelihood_library_pdip": 29194.371379563207, + "log_likelihood_library_pdip_scalar": 29194.371408713305, + "rel_diff_vmap_vs_library_pdip": 5.2952516710468304e-11, + "rel_diff_scalar_vs_library_pdip_scalar": 1.6263155916822845e-12, + "abs_diff_nats": 3.064853444811888e-05, + "rel_diff": 1.0498097054085368e-09, + "rel_diff_scalar_vs_library_pdip": 9.96857189744579e-10, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 2.9150098271202296e-05, + "rel_diff_library_pdip_vmap_vs_scalar": 9.984835043409158e-10, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": null, + "passes": null, + "pdip_iter": null + }, + { + "lane": 15, + "draw_name": "call00008_lane15", + "draw_kind": "captured", + "offsets": {}, + "log_likelihood_vmap": -101907.25293605185, + "log_likelihood_scalar": -101907.22129750835, + "log_likelihood_library_pdip": -101907.24997742077, + "log_likelihood_library_pdip_scalar": -101907.22063772338, + "rel_diff_vmap_vs_library_pdip": 2.9032586841679788e-08, + "rel_diff_scalar_vs_library_pdip_scalar": 6.474369209312983e-09, + "abs_diff_nats": 0.0316385434998665, + "rel_diff": 3.104641957364416e-07, + "rel_diff_scalar_vs_library_pdip": 2.8143152152035083e-07, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 0.029339697386603802, + "rel_diff_library_pdip_vmap_vs_scalar": 2.8790597175547947e-07, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "FAIL", + "certified": null, + "passes": null, + "pdip_iter": null + }, + { + "lane": 16, + "draw_name": "call00008_lane16", + "draw_kind": "captured", + "offsets": {}, + "log_likelihood_vmap": -31483.76339345143, + "log_likelihood_scalar": -31483.760800406148, + "log_likelihood_library_pdip": -31483.763327336812, + "log_likelihood_library_pdip_scalar": -31483.76091200039, + "rel_diff_vmap_vs_library_pdip": 2.0999592071757534e-09, + "rel_diff_scalar_vs_library_pdip_scalar": 3.5445016724609613e-09, + "abs_diff_nats": 0.0025930452829925343, + "rel_diff": 8.236135763549199e-08, + "rel_diff_scalar_vs_library_pdip": 8.026139181787905e-08, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 0.0024153364211088046, + "rel_diff_library_pdip_vmap_vs_scalar": 7.671689630282295e-08, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "FAIL", + "certified": null, + "passes": null, + "pdip_iter": null + }, + { + "lane": 17, + "draw_name": "call00008_lane17", + "draw_kind": "captured", + "offsets": {}, + "log_likelihood_vmap": -171697.76784918527, + "log_likelihood_scalar": -171697.72893268924, + "log_likelihood_library_pdip": -171697.76874889416, + "log_likelihood_library_pdip_scalar": -171697.7293846475, + "rel_diff_vmap_vs_library_pdip": 5.240073267018571e-09, + "rel_diff_scalar_vs_library_pdip_scalar": 2.6322903292077353e-09, + "abs_diff_nats": 0.03891649603610858, + "rel_diff": 2.2665702265267027e-07, + "rel_diff_scalar_vs_library_pdip": 2.3189704335859542e-07, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 0.039364246651530266, + "rel_diff_library_pdip_vmap_vs_scalar": 2.292648061952184e-07, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "FAIL", + "certified": null, + "passes": null, + "pdip_iter": null + }, + { + "lane": 18, + "draw_name": "call00008_lane18", + "draw_kind": "captured", + "offsets": {}, + "log_likelihood_vmap": 21885.39202805558, + "log_likelihood_scalar": 21885.3920280233, + "log_likelihood_library_pdip": 21885.392028055707, + "log_likelihood_library_pdip_scalar": 21885.39202801959, + "rel_diff_vmap_vs_library_pdip": 5.818002167152491e-15, + "rel_diff_scalar_vs_library_pdip_scalar": 1.6955320601443813e-13, + "abs_diff_nats": 3.227978595532477e-08, + "rel_diff": 1.474946663692014e-12, + "rel_diff_scalar_vs_library_pdip": 1.4807646658569826e-12, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 3.6117853596806526e-08, + "rel_diff_library_pdip_vmap_vs_scalar": 1.6503178718738645e-12, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": null, + "passes": null, + "pdip_iter": null + }, + { + "lane": 19, + "draw_name": "call00008_lane19", + "draw_kind": "captured", + "offsets": {}, + "log_likelihood_vmap": 17967.17162052761, + "log_likelihood_scalar": 17967.171649948625, + "log_likelihood_library_pdip": 17967.171622644684, + "log_likelihood_library_pdip_scalar": 17967.17164785402, + "rel_diff_vmap_vs_library_pdip": 1.1783014697729628e-10, + "rel_diff_scalar_vs_library_pdip_scalar": 1.165796351814844e-10, + "abs_diff_nats": 2.942101491498761e-05, + "rel_diff": 1.6374872733556667e-09, + "rel_diff_scalar_vs_library_pdip": 1.5196571288667896e-09, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 2.5209334125975147e-05, + "rel_diff_library_pdip_vmap_vs_scalar": 1.4030774915531086e-09, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": null, + "passes": null, + "pdip_iter": null + } + ], + "lane_pins": [ + { + "pin": "lane 0: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 19851.59418648651, + "reference_value": 19851.59418648637, + "rel_diff": 6.963833401530631e-15, + "abs_diff_nats": 1.382431946694851e-10, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 0: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 19851.59418466133, + "reference_value": 19851.594184645834, + "rel_diff": 7.806823761387096e-13, + "abs_diff_nats": 1.5497789718210697e-08, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 0: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 19851.59418648651, + "reference_value": 19851.59418466133, + "rel_diff": 9.194111004480304e-11, + "abs_diff_nats": 1.8251776054967195e-06, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 0: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 19851.59418648637, + "reference_value": 19851.594184645834, + "rel_diff": 9.271482858761135e-11, + "abs_diff_nats": 1.8405371520202607e-06, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 1: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -10958.375999864249, + "reference_value": -10958.375807264842, + "rel_diff": 1.7575543204836497e-08, + "abs_diff_nats": 0.00019259940745541826, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 1: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -10958.374219917532, + "reference_value": -10958.374268026848, + "rel_diff": 4.3901873132189576e-09, + "abs_diff_nats": 4.8109315684996545e-05, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 1: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -10958.375999864249, + "reference_value": -10958.374219917532, + "rel_diff": 1.624279917012133e-07, + "abs_diff_nats": 0.0017799467168515548, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 1: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -10958.375807264842, + "reference_value": -10958.374268026848, + "rel_diff": 1.4046225800136805e-07, + "abs_diff_nats": 0.00153923799371114, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 2: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 25613.44056437085, + "reference_value": 25613.440564410408, + "rel_diff": 1.544477457014604e-12, + "abs_diff_nats": 3.9559381548315287e-08, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 2: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 25613.440570535575, + "reference_value": 25613.440570363673, + "rel_diff": 6.711389441042082e-12, + "abs_diff_nats": 1.7190177459269762e-07, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 2: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 25613.44056437085, + "reference_value": 25613.440570535575, + "rel_diff": 2.4068324818152055e-10, + "abs_diff_nats": 6.164726073620841e-06, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 2: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 25613.440564410408, + "reference_value": 25613.440570363673, + "rel_diff": 2.3242738128543816e-10, + "abs_diff_nats": 5.953264917479828e-06, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 3: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 27440.977846751706, + "reference_value": 27440.977846751714, + "rel_diff": 2.6514935636831567e-16, + "abs_diff_nats": 7.275957614183426e-12, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 3: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 27440.977846751815, + "reference_value": 27440.977846751797, + "rel_diff": 6.628733909207872e-16, + "abs_diff_nats": 1.8189894035458565e-11, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 3: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 27440.977846751706, + "reference_value": 27440.977846751815, + "rel_diff": 3.97724034552472e-15, + "abs_diff_nats": 1.0913936421275139e-10, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 3: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 27440.977846751714, + "reference_value": 27440.977846751797, + "rel_diff": 3.049217598235621e-15, + "abs_diff_nats": 8.36735125631094e-11, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 4: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 19664.8883643167, + "reference_value": 19664.8883643167, + "rel_diff": 0.0, + "abs_diff_nats": 0.0, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 4: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 19664.888362180216, + "reference_value": 19664.888362180216, + "rel_diff": 0.0, + "abs_diff_nats": 0.0, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 4: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 19664.8883643167, + "reference_value": 19664.888362180216, + "rel_diff": 1.0864455727637275e-10, + "abs_diff_nats": 2.1364830899983644e-06, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 4: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 19664.8883643167, + "reference_value": 19664.888362180216, + "rel_diff": 1.0864455727637275e-10, + "abs_diff_nats": 2.1364830899983644e-06, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 5: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 19661.77570330541, + "reference_value": 19661.77570330541, + "rel_diff": 0.0, + "abs_diff_nats": 0.0, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 5: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 19661.775700753395, + "reference_value": 19661.775700753395, + "rel_diff": 0.0, + "abs_diff_nats": 0.0, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 5: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 19661.77570330541, + "reference_value": 19661.775700753395, + "rel_diff": 1.2979583869555583e-10, + "abs_diff_nats": 2.552016667323187e-06, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 5: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 19661.77570330541, + "reference_value": 19661.775700753395, + "rel_diff": 1.2979583869555583e-10, + "abs_diff_nats": 2.552016667323187e-06, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 6: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 19673.099043038375, + "reference_value": 19673.09904303841, + "rel_diff": 1.8492149097267215e-15, + "abs_diff_nats": 3.637978807091713e-11, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 6: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 19673.099042001224, + "reference_value": 19673.099041959198, + "rel_diff": 2.136213063833496e-12, + "abs_diff_nats": 4.202593117952347e-08, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 6: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 19673.099043038375, + "reference_value": 19673.099042001224, + "rel_diff": 5.2719267864178524e-11, + "abs_diff_nats": 1.0371513781137764e-06, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 6: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 19673.09904303841, + "reference_value": 19673.099041959198, + "rel_diff": 5.485733014303447e-11, + "abs_diff_nats": 1.0792136890813708e-06, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 7: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -138595.04792641063, + "reference_value": -138594.9751196262, + "rel_diff": 5.253205201316868e-07, + "abs_diff_nats": 0.07280678441748023, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 7: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -138594.4615199691, + "reference_value": -138594.4581900122, + "rel_diff": 2.4026623773717825e-08, + "abs_diff_nats": 0.003329956904053688, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 7: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -138595.04792641063, + "reference_value": -138594.4615199691, + "rel_diff": 4.231095781827759e-06, + "abs_diff_nats": 0.5864064415218309, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 7: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -138594.9751196262, + "reference_value": -138594.4581900122, + "rel_diff": 3.7298000277882455e-06, + "abs_diff_nats": 0.5169296140084043, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 8: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 29346.071300813812, + "reference_value": 29346.071300823063, + "rel_diff": 3.1525106075015753e-13, + "abs_diff_nats": 9.251380106434226e-09, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 8: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 29346.071300942538, + "reference_value": 29346.07130093671, + "rel_diff": 1.9859701113637302e-13, + "abs_diff_nats": 5.828042048960924e-09, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 8: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 29346.071300813812, + "reference_value": 29346.071300942538, + "rel_diff": 4.3864897890437126e-12, + "abs_diff_nats": 1.2872624211013317e-07, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 8: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 29346.071300823063, + "reference_value": 29346.07130093671, + "rel_diff": 3.872641717159274e-12, + "abs_diff_nats": 1.1364681995473802e-07, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 9: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 19677.044941109525, + "reference_value": 19677.044941109525, + "rel_diff": 0.0, + "abs_diff_nats": 0.0, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 9: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 19677.04493926127, + "reference_value": 19677.044939261974, + "rel_diff": 3.5682690766626634e-14, + "abs_diff_nats": 7.021299097687006e-10, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 9: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 19677.044941109525, + "reference_value": 19677.04493926127, + "rel_diff": 9.392941423751663e-11, + "abs_diff_nats": 1.8482533050701022e-06, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 9: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 19677.044941109525, + "reference_value": 19677.044939261974, + "rel_diff": 9.389373154674665e-11, + "abs_diff_nats": 1.8475511751603335e-06, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 10: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 28165.25603001414, + "reference_value": 28165.25603001398, + "rel_diff": 5.683281108520991e-15, + "abs_diff_nats": 1.6007106751203537e-10, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 10: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 28165.256030015564, + "reference_value": 28165.256030015524, + "rel_diff": 1.4208202771301698e-15, + "abs_diff_nats": 4.001776687800884e-11, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 10: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 28165.25603001414, + "reference_value": 28165.256030015564, + "rel_diff": 5.050370257799051e-14, + "abs_diff_nats": 1.4224497135728598e-09, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 10: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 28165.25603001398, + "reference_value": 28165.256030015524, + "rel_diff": 5.476616340938109e-14, + "abs_diff_nats": 1.5425030142068863e-09, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 11: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 19843.37960806598, + "reference_value": 19843.37960806599, + "rel_diff": 3.666692749871033e-16, + "abs_diff_nats": 7.275957614183426e-12, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 11: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 19843.37960696008, + "reference_value": 19843.37960694627, + "rel_diff": 6.959382839647923e-13, + "abs_diff_nats": 1.3809767551720142e-08, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 11: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 19843.37960806598, + "reference_value": 19843.37960696008, + "rel_diff": 5.5731529785495804e-11, + "abs_diff_nats": 1.1059019016101956e-06, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 11: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 19843.37960806599, + "reference_value": 19843.37960694627, + "rel_diff": 5.642783473877439e-11, + "abs_diff_nats": 1.11971894511953e-06, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 12: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 27027.609847821266, + "reference_value": 27027.60984782127, + "rel_diff": 1.3460231324839016e-16, + "abs_diff_nats": 3.637978807091713e-12, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 12: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 27027.609847821303, + "reference_value": 27027.609847821303, + "rel_diff": 0.0, + "abs_diff_nats": 0.0, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 12: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 27027.609847821266, + "reference_value": 27027.609847821303, + "rel_diff": 1.3460231324838999e-15, + "abs_diff_nats": 3.637978807091713e-11, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 12: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 27027.60984782127, + "reference_value": 27027.609847821303, + "rel_diff": 1.2114208192355099e-15, + "abs_diff_nats": 3.2741809263825417e-11, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 13: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 19663.70492707598, + "reference_value": 19663.70492707598, + "rel_diff": 0.0, + "abs_diff_nats": 0.0, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 13: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 19663.704925197264, + "reference_value": 19663.704925197264, + "rel_diff": 0.0, + "abs_diff_nats": 0.0, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 13: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 19663.70492707598, + "reference_value": 19663.704925197264, + "rel_diff": 9.554240906011973e-11, + "abs_diff_nats": 1.8787177396006882e-06, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 13: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 19663.70492707598, + "reference_value": 19663.704925197264, + "rel_diff": 9.554240906011973e-11, + "abs_diff_nats": 1.8787177396006882e-06, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 14: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 29194.37137801729, + "reference_value": 29194.371379563207, + "rel_diff": 5.2952516710468304e-11, + "abs_diff_nats": 1.5459154383279383e-06, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 14: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 29194.371408665826, + "reference_value": 29194.371408713305, + "rel_diff": 1.6263155916822845e-12, + "abs_diff_nats": 4.7479261411353946e-08, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 14: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 29194.37137801729, + "reference_value": 29194.371408665826, + "rel_diff": 1.0498097054085368e-09, + "abs_diff_nats": 3.064853444811888e-05, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 14: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 29194.371379563207, + "reference_value": 29194.371408713305, + "rel_diff": 9.984835043409158e-10, + "abs_diff_nats": 2.9150098271202296e-05, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 15: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -101907.25293605185, + "reference_value": -101907.24997742077, + "rel_diff": 2.9032586841679788e-08, + "abs_diff_nats": 0.002958631084766239, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 15: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -101907.22129750835, + "reference_value": -101907.22063772338, + "rel_diff": 6.474369209312983e-09, + "abs_diff_nats": 0.0006597849715035409, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 15: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -101907.25293605185, + "reference_value": -101907.22129750835, + "rel_diff": 3.104641957364416e-07, + "abs_diff_nats": 0.0316385434998665, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 15: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -101907.24997742077, + "reference_value": -101907.22063772338, + "rel_diff": 2.8790597175547947e-07, + "abs_diff_nats": 0.029339697386603802, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 16: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -31483.76339345143, + "reference_value": -31483.763327336812, + "rel_diff": 2.0999592071757534e-09, + "abs_diff_nats": 6.611461867578328e-05, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 16: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -31483.760800406148, + "reference_value": -31483.76091200039, + "rel_diff": 3.5445016724609613e-09, + "abs_diff_nats": 0.00011159424320794642, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 16: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -31483.76339345143, + "reference_value": -31483.760800406148, + "rel_diff": 8.236135763549199e-08, + "abs_diff_nats": 0.0025930452829925343, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 16: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -31483.763327336812, + "reference_value": -31483.76091200039, + "rel_diff": 7.671689630282295e-08, + "abs_diff_nats": 0.0024153364211088046, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 17: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -171697.76784918527, + "reference_value": -171697.76874889416, + "rel_diff": 5.240073267018571e-09, + "abs_diff_nats": 0.000899708888027817, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 17: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -171697.72893268924, + "reference_value": -171697.7293846475, + "rel_diff": 2.6322903292077353e-09, + "abs_diff_nats": 0.0004519582726061344, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 17: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -171697.76784918527, + "reference_value": -171697.72893268924, + "rel_diff": 2.2665702265267027e-07, + "abs_diff_nats": 0.03891649603610858, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 17: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -171697.76874889416, + "reference_value": -171697.7293846475, + "rel_diff": 2.292648061952184e-07, + "abs_diff_nats": 0.039364246651530266, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 18: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 21885.39202805558, + "reference_value": 21885.392028055707, + "rel_diff": 5.818002167152491e-15, + "abs_diff_nats": 1.2732925824820995e-10, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 18: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 21885.3920280233, + "reference_value": 21885.39202801959, + "rel_diff": 1.6955320601443813e-13, + "abs_diff_nats": 3.7107383832335472e-09, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 18: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 21885.39202805558, + "reference_value": 21885.3920280233, + "rel_diff": 1.474946663692014e-12, + "abs_diff_nats": 3.227978595532477e-08, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 18: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 21885.392028055707, + "reference_value": 21885.39202801959, + "rel_diff": 1.6503178718738645e-12, + "abs_diff_nats": 3.6117853596806526e-08, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 19: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 17967.17162052761, + "reference_value": 17967.171622644684, + "rel_diff": 1.1783014697729628e-10, + "abs_diff_nats": 2.11707447306253e-06, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 19: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 17967.171649948625, + "reference_value": 17967.17164785402, + "rel_diff": 1.165796351814844e-10, + "abs_diff_nats": 2.0946063159499317e-06, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 19: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 17967.17162052761, + "reference_value": 17967.171649948625, + "rel_diff": 1.6374872733556667e-09, + "abs_diff_nats": 2.942101491498761e-05, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 19: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 17967.171622644684, + "reference_value": 17967.17164785402, + "rel_diff": 1.4030774915531086e-09, + "abs_diff_nats": 2.5209334125975147e-05, + "within_rtol": false, + "status": "RECORDED" + } + ], + "lanes_failed": 5, + "arm_rows": { + "vmap": { + "arm": "vmap", + "program": "jax.jit(jax.vmap(fn))", + "stands_for": "Nautilus(use_jax_vmap=True) \u2014 Fitness._vmap", + "hlo_source": "jax.jit(jax.vmap(fn)).lower(batched_tree) \u2014 the exact current Fitness._vmap composition (PyAutoFit#1638)", + "batch_wall_ms": 456.9589589002135, + "wall_production_nesting_ms": 456.9589589002135, + "wall_aot_command_buffers_on_ms": 457.0259953998175, + "wall_aot_command_buffers_off_ms": 457.87200029990345, + "command_buffer_delta_ms": 0.8460049000859726, + "production_nesting_vs_aot_on_delta_ms": -0.06703649960400071, + "production_nesting_vs_aot_on_delta_pct": -0.014667983939372102, + "wall_per_lane_ms": 22.847947945010674, + "wall_per_lane_command_buffers_off_ms": 22.893600014995172, + "traced_batch_wall_ms": 468.2964584997535, + "untraced_batch_wall_ms": 457.6081618997705, + "traced_wall_per_lane_ms": 23.414822924987675, + "callback_count_per_call": 1.0, + "callback_count_per_lane": 0.05, + "callback_expectation": "B per batched call \u2014 the qhull pure_callback is vmap_method='sequential'", + "host_qhull_ms": 4.964129900326952, + "host_tables_ms": 0.18269679894729052, + "host_qhull_ms_per_lane": 0.24820649501634762, + "host_tables_ms_per_lane": 0.009134839947364526, + "host_callback_probe": { + "calls": 10, + "qhull_ms_total": 49.64129900326952, + "tables_ms_total": 1.8269679894729052, + "total_ms_total": 51.46826699274243, + "qhull_ms_mean": 4.964129900326952, + "tables_ms_mean": 0.18269679894729052, + "total_ms_mean": 5.146826699274243, + "non_finite_calls": 0, + "n_points": [ + 1500 + ] + }, + "host_callback_records_first": [ + { + "n_points": 1500, + "qhull_ms": 4.643862001103116, + "tables_ms": 0.1812289992813021, + "total_ms": 4.825091000384418, + "finite": true + }, + { + "n_points": 1500, + "qhull_ms": 5.061488998762798, + "tables_ms": 0.19603900000220165, + "total_ms": 5.257527998764999, + "finite": true + }, + { + "n_points": 1500, + "qhull_ms": 5.01142999928561, + "tables_ms": 0.18250900029670447, + "total_ms": 5.193938999582315, + "finite": true + }, + { + "n_points": 1500, + "qhull_ms": 4.9827100010588765, + "tables_ms": 0.18054799875244498, + "total_ms": 5.1632579998113215, + "finite": true + } + ], + "device_idle_ms": 30.94267080000003, + "device_idle_ms_per_lane": 1.5471335400000015, + "trace": { + "parser": "ProfileData.from_file(xplane) + as_text() + stack_frame_index(proto field 17)", + "stage_audit": { + "chi_squared_evidence": [ + { + "instruction": "loop_divide_fusion", + "ms": 0.0101567, + "opcode": "fusion", + "shape": "f64[20,15361]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/abstract_ndarray.py:352", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/abstract_ndarray.py:352 (AbstractNDArray.__truediv__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/abstract_ndarray.py:57 (unwrap_array..wrapper)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/abstract_ndarray.py:35 (to_new_array..wrapper)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_util.py:78 (chi_squared_map_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:78 (AbstractFit.chi_squared_map)" + ] + }, + { + "instruction": "input_reduce_fusion.21", + "ms": 0.0044991, + "opcode": "fusion", + "shape": "f64[20]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_util.py:90", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_util.py:90 (chi_squared_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:87 (AbstractFit.chi_squared)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:293 (FitDataset.chi_squared)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:345 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)" + ] + }, + { + "instruction": "input_reduce_fusion.30", + "ms": 0.0039040000000000004, + "opcode": "fusion", + "shape": "f64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_util.py:104", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_util.py:104 (noise_normalization_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:98 (AbstractFit.noise_normalization)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:306 (FitDataset.noise_normalization)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:349 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)" + ] + } + ], + "regularization_H": [ + { + "instruction": "loop_broadcast_fusion", + "ms": 0.3445086, + "opcode": "fusion", + "shape": "f64[20,1500,1500]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:579", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:579 (pixel_splitted_regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt_split.py:137 (AdaptSplit.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:332 (AbstractInversion.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "input_scatter_fusion.10", + "ms": 0.0036351000000000005, + "opcode": "fusion", + "shape": "f64[20,1500,1500]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:615", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:615 (pixel_splitted_regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt_split.py:137 (AdaptSplit.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:332 (AbstractInversion.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "input_concatenate_fusion.8", + "ms": 0.0017439, + "opcode": "fusion", + "shape": "pred[3]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:94", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:94 (split_points_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:410 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + }, + { + "instruction": "wrapped_slice", + "ms": 0.0016351999999999996, + "opcode": "fusion", + "shape": "s32[1]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:94", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:94 (split_points_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:410 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + }, + { + "instruction": "wrapped_slice.1", + "ms": 0.0015935, + "opcode": "fusion", + "shape": "s32[1]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:90", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:90 (split_points_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:410 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + }, + { + "instruction": "loop_slice_fusion", + "ms": 0.0015071000000000001, + "opcode": "fusion", + "shape": "s32[1,1]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:94", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:94 (split_points_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:410 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + } + ], + "other": [ + { + "instruction": "copy.75", + "ms": 0.04220080000000013, + "opcode": "copy", + "shape": "f64[1,1024,2]{2,1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "copy.37", + "ms": 0.014700799999999993, + "opcode": "copy", + "shape": "s32[21361]{0}", + "source": "", + "stack": [] + }, + { + "instruction": "copy.73", + "ms": 0.0021024, + "opcode": "copy", + "shape": "s64[]", + "source": "", + "stack": [] + }, + { + "instruction": "loop_broadcast_fusion.5", + "ms": 0.0020895, + "opcode": "fusion", + "shape": "(f64[1500]{0}, f64[1500]{0}, f64[1500]{0}, f64[1500]{0})", + "source": "", + "stack": [] + }, + { + "instruction": "copy.46", + "ms": 0.0019968, + "opcode": "copy", + "shape": "s64[1500]{0}", + "source": "", + "stack": [] + }, + { + "instruction": "loop_broadcast_fusion.3", + "ms": 0.001987, + "opcode": "fusion", + "shape": "(pred[21361]{0}, pred[21361]{0})", + "source": "", + "stack": [] + } + ], + "mesh_seed_argmin": [ + { + "instruction": "input_reduce_fusion", + "ms": 0.14855710000000003, + "opcode": "fusion", + "shape": "(f64[1024]{0}, s64[1024]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:191", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:191 (_nearest_vertex_seed_from..argmin_chunk)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204 (_nearest_vertex_seed_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:351 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)" + ] + }, + { + "instruction": "loop_dynamic_update_slice_fusion", + "ms": 0.04096259999999995, + "opcode": "fusion", + "shape": "s32[21,1024]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204 (_nearest_vertex_seed_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:351 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "loop_add_fusion", + "ms": 0.03179479999999992, + "opcode": "fusion", + "shape": "s64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204 (_nearest_vertex_seed_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:351 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "loop_broadcast_fusion.2", + "ms": 0.0019712, + "opcode": "fusion", + "shape": "s32[21,1024]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204 (_nearest_vertex_seed_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:351 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "mixed_fusion": [ + { + "instruction": "input_add_multiply_transpose_fusion", + "ms": 1.8925751, + "opcode": "fusion", + "shape": "(f64[20,1500,1500]{2,1,0}, f64[20,1500,1500]{2,1,0}, f64[20,1500,1500]{2,1,0}, f64[20,1500,1500]{2,1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:61", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:61 (initialize)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:72 (solve_nnls)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:129 (_solve_nnls_primal_with..primal)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:164 (solve_nnls_primal_with_status)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:508 (reconstruction_positive_only_from)" + ] + }, + { + "instruction": "loop_divide_gather_fusion", + "ms": 1.0243259, + "opcode": "fusion", + "shape": "(f64[15361,1500]{1,0}, f64[15361,1,1,1500]{3,2,1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:133", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:133 (curvature_matrix_via_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:93 (InversionImagingMapping.curvature_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:389 (AbstractInversion.curvature_reg_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "input_reduce_fusion.14", + "ms": 0.1403654, + "opcode": "fusion", + "shape": "f64[92,1500]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/inversion_imaging_util.py:123", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/inversion_imaging_util.py:123 (data_vector_via_blurred_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:67 (InversionImagingMapping.data_vector)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:699 (AbstractInversion.reconstruction)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "input_scatter_fusion.3", + "ms": 0.0725873, + "opcode": "fusion", + "shape": "f64[20,1500,1500]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:579", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:579 (pixel_splitted_regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt_split.py:137 (AdaptSplit.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:332 (AbstractInversion.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "loop_select_fusion.4", + "ms": 0.0171037, + "opcode": "fusion", + "shape": "f64[6000,4]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:559", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:559 (pixel_splitted_regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt_split.py:137 (AdaptSplit.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:332 (AbstractInversion.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "input_scatter_fusion.1", + "ms": 0.012953399999999999, + "opcode": "fusion", + "shape": "f64[1500]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:70", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:70 (adaptive_pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/abstract.py:507 (Mapper.pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt.py:339 (Adapt.regularization_weights_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt_split.py:120 (AdaptSplit.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)" + ] + } + ], + "ray_trace_data_grid": [ + { + "instruction": "input_reduce_fusion.23", + "ms": 0.0027743999999999998, + "opcode": "fusion", + "shape": "f64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:506", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:506 (FlatLambdaCDM._simpson_1d)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:644 (FlatLambdaCDM.angular_diameter_distance_kpc_z1z2)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:133 (LensingCosmology.angular_diameter_distance_to_earth_in_kpc_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:362 (LensingCosmology.scaling_factor_between_redshifts_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/lens/tracer_util.py:252 (traced_grid_2d_list_from)" + ] + }, + { + "instruction": "input_reduce_fusion.25", + "ms": 0.0027456000000000004, + "opcode": "fusion", + "shape": "f64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:506", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:506 (FlatLambdaCDM._simpson_1d)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:644 (FlatLambdaCDM.angular_diameter_distance_kpc_z1z2)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:151 (LensingCosmology.angular_diameter_distance_between_redshifts_in_kpc_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:355 (LensingCosmology.scaling_factor_between_redshifts_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/lens/tracer_util.py:252 (traced_grid_2d_list_from)" + ] + }, + { + "instruction": "input_reduce_fusion.26", + "ms": 0.0026079999999999996, + "opcode": "fusion", + "shape": "f64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:503", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:503 (FlatLambdaCDM._simpson_1d)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:644 (FlatLambdaCDM.angular_diameter_distance_kpc_z1z2)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:151 (LensingCosmology.angular_diameter_distance_between_redshifts_in_kpc_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:355 (LensingCosmology.scaling_factor_between_redshifts_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/lens/tracer_util.py:252 (traced_grid_2d_list_from)" + ] + }, + { + "instruction": "input_reduce_fusion.24", + "ms": 0.0025886, + "opcode": "fusion", + "shape": "f64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:503", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:503 (FlatLambdaCDM._simpson_1d)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:644 (FlatLambdaCDM.angular_diameter_distance_kpc_z1z2)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:133 (LensingCosmology.angular_diameter_distance_to_earth_in_kpc_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:362 (LensingCosmology.scaling_factor_between_redshifts_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/lens/tracer_util.py:252 (traced_grid_2d_list_from)" + ] + }, + { + "instruction": "loop_divide_fusion.3", + "ms": 0.0024543, + "opcode": "fusion", + "shape": "f64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:380", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:380 (LensingCosmology.scaling_factor_between_redshifts_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/lens/tracer_util.py:252 (traced_grid_2d_list_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/lens/tracer.py:632 (Tracer.traced_grid_2d_list_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/structures/decorators/abstract.py:93 (AbstractMaker.evaluate_func)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/structures/decorators/abstract.py:110 (AbstractMaker.result)" + ] + } + ], + "border_relocator": [ + { + "instruction": "eigh.45", + "ms": 0.07495519999999997, + "opcode": "custom-call", + "shape": "(f64[2,2]{0,1}, f64[2]{0}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:245", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:245 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:454 (BorderRelocator.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:176 (AbstractMesh.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:214 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "custom-call.3", + "ms": 0.007967900000000002, + "opcode": "custom-call", + "shape": "(f64[2,2]{1,0}, s8[4194304]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:242", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:242 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:454 (BorderRelocator.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:176 (AbstractMesh.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:214 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "loop_select_sine_fusion", + "ms": 0.0034111999999999996, + "opcode": "fusion", + "shape": "(f64[], f64[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:301", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:301 (relocated_grid_via_ellipse_border_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:458 (BorderRelocator.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:176 (AbstractMesh.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:214 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "input_concatenate_fusion.6", + "ms": 0.003279700000000001, + "opcode": "fusion", + "shape": "f64[1500,2]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:323", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:323 (relocated_grid_via_ellipse_border_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:458 (BorderRelocator.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:176 (AbstractMesh.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:214 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "loop_add_fusion.5", + "ms": 0.0032576000000000003, + "opcode": "fusion", + "shape": "f64[1500]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:308", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:308 (relocated_grid_via_ellipse_border_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:458 (BorderRelocator.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:176 (AbstractMesh.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:214 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "input_reduce_fusion.28", + "ms": 0.0016223000000000001, + "opcode": "fusion", + "shape": "f64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:256", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:256 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:454 (BorderRelocator.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:176 (AbstractMesh.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:214 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + } + ], + "grids_and_structures": [ + { + "instruction": "loop_multiply_sine_fusion", + "ms": 0.0013567999999999998, + "opcode": "fusion", + "shape": "(f64[], f64[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/geometry/geometry_util.py:527", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/geometry/geometry_util.py:527 (transform_grid_2d_to_reference_frame)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/profiles/geometry_profiles.py:418 (EllProfile.transformed_to_reference_frame_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/structures/decorators/abstract.py:93 (AbstractMaker.evaluate_func)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/structures/decorators/abstract.py:112 (AbstractMaker.result)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/structures/decorators/to_grid.py:70 (to_grid..wrapper)" + ] + } + ], + "mesh_construction": [ + { + "instruction": "input_concatenate_fusion.7", + "ms": 0.0020704, + "opcode": "fusion", + "shape": "f64[1500,2]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:820", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:820 (InterpolatorDelaunay.mesh_grid_xy)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:847 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + } + ], + "mesh_qhull_callback": [ + { + "instruction": "pure_callback.4", + "ms": 0.010761199999999997, + "opcode": "custom-call", + "shape": "(s32[3000,3]{1,0}, s32[3000,3]{1,0}, s32[1500]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:161", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:161 (_jax_delaunay_tables)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:405 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + } + ], + "mesh_locate_walk": [ + { + "instruction": "loop_reduce_fusion", + "ms": 0.02458510000000001, + "opcode": "fusion", + "shape": "(f64[21361]{0}, s64[21361]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:264", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:264 (_walk_from_seed..walk_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:292 (_walk_from_seed..body)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:264 (_walk_from_seed..walk_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:292 (_walk_from_seed..body)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)" + ] + }, + { + "instruction": "input_reduce_fusion.1", + "ms": 0.022780100000000005, + "opcode": "fusion", + "shape": "pred[196]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:288", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:288 (_walk_from_seed..cond)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:353 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)" + ] + }, + { + "instruction": "loop_or_select_fusion", + "ms": 0.019926100000000002, + "opcode": "fusion", + "shape": "(s32[21361]{0}, pred[21361]{0}, pred[21361]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:270", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:270 (_walk_from_seed..walk_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:292 (_walk_from_seed..body)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:353 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)" + ] + }, + { + "instruction": "loop_select_fusion", + "ms": 0.017609199999999985, + "opcode": "fusion", + "shape": "s32[21361]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:242", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:242 (_walk_from_seed..weights_of)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:262 (_walk_from_seed..walk_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:292 (_walk_from_seed..body)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:353 (pix_indexes_delaunay_walk_from)" + ] + }, + { + "instruction": "input_reduce_fusion.2", + "ms": 0.014143700000000013, + "opcode": "fusion", + "shape": "pred[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:288", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:288 (_walk_from_seed..cond)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:353 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)" + ] + }, + { + "instruction": "while.46", + "ms": 0.012854100000000021, + "opcode": "while", + "shape": "(s32[], s32[21361]{0}, pred[21361]{0}, pred[21361]{0}, s32[3000,3]{1,0}, /*index=5*/f64[1500,2]{1,0}, f64[21361,2]{1,0}, s32[3000,3]{1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:353 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "mapping_matrix": [ + { + "instruction": "loop_broadcast_fusion.6", + "ms": 0.1065993, + "opcode": "fusion", + "shape": "f64[15361,1500]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:342", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:342 (mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/abstract.py:283 (Mapper.mapping_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:91 (AbstractInversionImaging._mapping_matrix_for_convolution_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:137 (AbstractInversionImaging.operated_mapping_matrix_list)" + ] + }, + { + "instruction": "input_reduce_fusion.32", + "ms": 0.0028543, + "opcode": "fusion", + "shape": "f64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:93", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:93 (adaptive_pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/abstract.py:507 (Mapper.pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt.py:339 (Adapt.regularization_weights_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt_split.py:120 (AdaptSplit.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)" + ] + }, + { + "instruction": "loop_divide_fusion.2", + "ms": 0.0023648, + "opcode": "fusion", + "shape": "f64[1500]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:92", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:92 (adaptive_pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/abstract.py:507 (Mapper.pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt.py:339 (Adapt.regularization_weights_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt_split.py:120 (AdaptSplit.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)" + ] + }, + { + "instruction": "loop_divide_fusion.1", + "ms": 0.0023136, + "opcode": "fusion", + "shape": "f64[1500]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:95", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:95 (adaptive_pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/abstract.py:507 (Mapper.pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt.py:339 (Adapt.regularization_weights_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt_split.py:120 (AdaptSplit.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)" + ] + } + ], + "psf_convolution_mapping_matrix": [ + { + "instruction": "input_scatter_fusion", + "ms": 1.9972222999999998, + "opcode": "fusion", + "shape": "f64[1500,180,180]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:303 (AbstractInversion.operated_mapping_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:68 (InversionImagingMapping.data_vector)" + ] + }, + { + "instruction": "fft.14.0", + "ms": 1.7663499000000003, + "opcode": "fft", + "shape": "f64[1500,180,180]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:303 (AbstractInversion.operated_mapping_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:68 (InversionImagingMapping.data_vector)" + ] + }, + { + "instruction": "fft.10.0", + "ms": 1.3701529000000001, + "opcode": "fft", + "shape": "c128[1500,180,91]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:303 (AbstractInversion.operated_mapping_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:68 (InversionImagingMapping.data_vector)" + ] + }, + { + "instruction": "fft.12.0", + "ms": 0.9804099000000001, + "opcode": "fft", + "shape": "c128[1500,91,180]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:303 (AbstractInversion.operated_mapping_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:68 (InversionImagingMapping.data_vector)" + ] + }, + { + "instruction": "input_transpose_fusion.3", + "ms": 0.5128414, + "opcode": "fusion", + "shape": "c128[1500,91,180]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:303 (AbstractInversion.operated_mapping_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:68 (InversionImagingMapping.data_vector)" + ] + }, + { + "instruction": "wrapped_transpose", + "ms": 0.4997279999999999, + "opcode": "fusion", + "shape": "c128[1500,180,91]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:303 (AbstractInversion.operated_mapping_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:68 (InversionImagingMapping.data_vector)" + ] + } + ], + "curvature_matrix_F": [ + { + "instruction": "custom-call.4", + "ms": 4.218162, + "opcode": "custom-call", + "shape": "(f64[1500,1500]{1,0}, s8[4194304]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:134", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:134 (curvature_matrix_via_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:93 (InversionImagingMapping.curvature_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:389 (AbstractInversion.curvature_reg_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "inversion_other": [ + { + "instruction": "cholesky.60", + "ms": 7.133968100000012, + "opcode": "custom-call", + "shape": "(f64[20,1500,1500]{1,2,0}, s32[20]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986 (AbstractInversion._log_det_symmetric_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:1078 (AbstractInversion.log_det_curvature_reg_matrix_term)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:347 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/model/analysis.py:135 (AnalysisImaging.log_likelihood_function)" + ] + }, + { + "instruction": "cholesky.70", + "ms": 7.094945799999994, + "opcode": "custom-call", + "shape": "(f64[20,1500,1500]{1,2,0}, s32[20]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986 (AbstractInversion._log_det_symmetric_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:1157 (AbstractInversion.log_det_regularization_matrix_term)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:348 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/model/analysis.py:135 (AnalysisImaging.log_likelihood_function)" + ] + }, + { + "instruction": "input_reduce_fusion.20", + "ms": 0.2055967, + "opcode": "fusion", + "shape": "f64[20,1500]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:946", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:946 (AbstractInversion.regularization_term)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:346 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/model/analysis.py:135 (AnalysisImaging.log_likelihood_function)", + "/mnt/ral/jnightin/autolens_profiling_wt/certified-solver-phase-c1-lane-rate/scripts/imaging/likelihood_breakdown/fixed_light_trace.py:1195 (_captured_likelihood_fn.._likelihood)" + ] + }, + { + "instruction": "input_reduce_fusion.29", + "ms": 0.005360000000000001, + "opcode": "fusion", + "shape": "f64[20]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:944", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:944 (AbstractInversion.regularization_term)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:346 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/model/analysis.py:135 (AnalysisImaging.log_likelihood_function)", + "/mnt/ral/jnightin/autolens_profiling_wt/certified-solver-phase-c1-lane-rate/scripts/imaging/likelihood_breakdown/fixed_light_trace.py:1195 (_captured_likelihood_fn.._likelihood)" + ] + }, + { + "instruction": "input_reduce_fusion.17", + "ms": 0.0049472, + "opcode": "fusion", + "shape": "f64[20]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:985", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:985 (AbstractInversion._log_det_symmetric_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:1078 (AbstractInversion.log_det_curvature_reg_matrix_term)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:347 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/model/analysis.py:135 (AnalysisImaging.log_likelihood_function)" + ] + }, + { + "instruction": "input_reduce_fusion.16", + "ms": 0.004947099999999999, + "opcode": "fusion", + "shape": "f64[20]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:985", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:985 (AbstractInversion._log_det_symmetric_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:1157 (AbstractInversion.log_det_regularization_matrix_term)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:348 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/model/analysis.py:135 (AnalysisImaging.log_likelihood_function)" + ] + } + ], + "pdip_solve": [ + { + "instruction": "cholesky.20", + "ms": 185.51906870000244, + "opcode": "custom-call", + "shape": "(f64[20,1500,1500]{1,2,0}, s32[20]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:106", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:106 (factorize_kkt)", + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:212 (pdip_pc_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:83 (solve_nnls)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:129 (_solve_nnls_primal_with..primal)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:164 (solve_nnls_primal_with_status)" + ] + }, + { + "instruction": "triangular-solve", + "ms": 47.73421590000046, + "opcode": "custom-call", + "shape": "(f64[20,1500,1]{1,2,0}, s8[320]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146 (solve_kkt_rhs)", + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:213 (pdip_pc_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:83 (solve_nnls)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:129 (_solve_nnls_primal_with..primal)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:164 (solve_nnls_primal_with_status)" + ] + }, + { + "instruction": "triangular-solve.2", + "ms": 44.627119600000256, + "opcode": "custom-call", + "shape": "(f64[20,1500,1]{1,2,0}, s8[320]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146 (solve_kkt_rhs)", + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:217 (pdip_pc_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:83 (solve_nnls)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:129 (_solve_nnls_primal_with..primal)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:164 (solve_nnls_primal_with_status)" + ] + }, + { + "instruction": "triangular-solve.3", + "ms": 43.51908830000189, + "opcode": "custom-call", + "shape": "(f64[20,1500,1]{1,2,0}, s8[320]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146 (solve_kkt_rhs)", + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:217 (pdip_pc_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:83 (solve_nnls)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:129 (_solve_nnls_primal_with..primal)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:164 (solve_nnls_primal_with_status)" + ] + }, + { + "instruction": "triangular-solve.1", + "ms": 43.42596809999965, + "opcode": "custom-call", + "shape": "(f64[20,1500,1]{1,2,0}, s8[320]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146 (solve_kkt_rhs)", + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:213 (pdip_pc_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:83 (solve_nnls)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:129 (_solve_nnls_primal_with..primal)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:164 (solve_nnls_primal_with_status)" + ] + }, + { + "instruction": "input_transpose_fusion", + "ms": 11.769293500000005, + "opcode": "fusion", + "shape": "f64[20,1500,1500]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:106", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:106 (factorize_kkt)", + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:212 (pdip_pc_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:83 (solve_nnls)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:129 (_solve_nnls_primal_with..primal)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:164 (solve_nnls_primal_with_status)" + ] + } + ], + "data_vector_D": [ + { + "instruction": "input_reduce_fusion.31", + "ms": 0.0037184, + "opcode": "fusion", + "shape": "f64[1500]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/inversion_imaging_util.py:123", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/inversion_imaging_util.py:123 (data_vector_via_blurred_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:67 (InversionImagingMapping.data_vector)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:699 (AbstractInversion.reconstruction)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "fit_imaging_other": [ + { + "instruction": "custom-call.5", + "ms": 0.2006528, + "opcode": "custom-call", + "shape": "(f64[20,15361]{1,0}, s8[4194304]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/abstract_ndarray.py:305", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/abstract_ndarray.py:305 (AbstractNDArray.__add__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/abstract_ndarray.py:57 (unwrap_array..wrapper)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/abstract_ndarray.py:35 (to_new_array..wrapper)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:58 (AbstractFit.residual_map)" + ] + } + ] + }, + "stage_audit_note": "The HLO instructions that contributed most of each stage's milliseconds, with their full source stack. A stage row is only as good as the rules that built it; this is how a reader checks a row against the HLO instead of trusting it.", + "untraced_wall_ms": 457.6081618997705, + "reconciliation_vs_untraced_pct": 2.3104936232647235, + "wall_basis": "wall_ms is the TRACED run's wall, the run these kernel durations came from. untraced_wall_ms is the same executable without the profiler; the difference is the profiler's overhead and belongs in neither the stages nor the idle row.", + "calls": 10, + "call_split": "per-call (first-instruction recurrence)", + "call_blocks": 10, + "events": 193250, + "streams": [ + "Stream #14(MemcpyH2D,MemcpyD2H,Compute,MemcpyD2D)" + ], + "per_stage_ms": { + "border_relocator": { + "median_ms": 0.09600000000000003, + "min_ms": 0.09577300000000002, + "max_ms": 0.096541 + }, + "chi_squared_evidence": { + "median_ms": 0.018544, + "min_ms": 0.018271000000000003, + "max_ms": 0.018944 + }, + "curvature_matrix_F": { + "median_ms": 4.218577, + "min_ms": 4.213729, + "max_ms": 4.222753 + }, + "data_vector_D": { + "median_ms": 0.003712, + "min_ms": 0.003616, + "max_ms": 0.003968 + }, + "fit_imaging_other": { + "median_ms": 0.2006865, + "min_ms": 0.198811, + "max_ms": 0.201531 + }, + "grids_and_structures": { + "median_ms": 0.0013440000000000001, + "min_ms": 0.001312, + "max_ms": 0.001408 + }, + "inversion_other": { + "median_ms": 14.461309499999988, + "min_ms": 14.454526999999972, + "max_ms": 14.480503999999996 + }, + "mapping_matrix": { + "median_ms": 0.114061, + "min_ms": 0.113601, + "max_ms": 0.114622 + }, + "mesh_construction": { + "median_ms": 0.00208, + "min_ms": 0.002048, + "max_ms": 0.00208 + }, + "mesh_locate_walk": { + "median_ms": 0.136832, + "min_ms": 0.13651100000000002, + "max_ms": 0.137084 + }, + "mesh_qhull_callback": { + "median_ms": 0.0107515, + "min_ms": 0.010623, + "max_ms": 0.010976000000000001 + }, + "mesh_seed_argmin": { + "median_ms": 0.2233235000000001, + "min_ms": 0.22303500000000007, + "max_ms": 0.22354500000000013 + }, + "mixed_fusion": { + "median_ms": 3.312404, + "min_ms": 3.302007, + "max_ms": 3.3181650000000005 + }, + "other": { + "median_ms": 0.0667035, + "min_ms": 0.066559, + "max_ms": 0.06700700000000001 + }, + "pdip_solve": { + "median_ms": 406.64256850000356, + "min_ms": 406.54606700000477, + "max_ms": 406.6777540000019 + }, + "psf_convolution_mapping_matrix": { + "median_ms": 7.3576105, + "min_ms": 7.350490999999999, + "max_ms": 7.366521 + }, + "ray_trace_data_grid": { + "median_ms": 0.013184, + "min_ms": 0.013056, + "max_ms": 0.013279000000000001 + }, + "regularization_H": { + "median_ms": 0.35880699999999993, + "min_ms": 0.358199, + "max_ms": 0.35941600000000007 + } + }, + "stage_order": [ + "ray_trace_data_grid", + "border_relocator", + "mesh_qhull_callback", + "mesh_seed_argmin", + "mesh_locate_walk", + "mesh_construction", + "mapping_matrix", + "psf_convolution_mapping_matrix", + "data_vector_D", + "curvature_matrix_F", + "regularization_H", + "pdip_solve", + "chi_squared_evidence", + "grids_and_structures", + "inversion_other", + "fit_imaging_other", + "mixed_fusion", + "other" + ], + "mixed_fusion": { + "ms": 3.312404, + "constituent_stage_sets": { + "curvature_reg_reduce_gather + inversion_other + mapped_reconstruction + pdip_solve + reconstruction_scatter + regularization_H": 1.8925751, + "curvature_matrix_F + psf_convolution_mapping_matrix": 1.0243259, + "data_vector_D + psf_convolution_mapping_matrix": 0.1403654, + "inversion_other + mesh_construction + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin + regularization_H": 0.07561110000000001, + "inversion_other + mapping_matrix + mesh_construction + mesh_dual_areas + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin": 0.021619000000000003, + "border_relocator + ray_trace_data_grid": 0.020908100000000006, + "inversion_other + regularization_H": 0.0190238, + "inversion_other + mesh_construction + mesh_dual_areas + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin + regularization_H": 0.0171037, + "inversion_other + mapping_matrix + mesh_construction + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin": 0.0109052, + "inversion_other + pdip_solve + regularization_H": 0.010016099999999998, + "inversion_other + mesh_dual_areas + mesh_locate_walk": 0.009523000000000005, + "grids_and_structures + mass_profile_deflections + ray_trace_data_grid": 0.0091615, + "inversion_other + mesh_construction + regularization_H": 0.0083263, + "inversion_other + mesh_construction + mesh_dual_areas + mesh_interpolation_weights + regularization_H": 0.0068288, + "curvature_reg_reduce_gather + inversion_other + mapped_reconstruction + reconstruction_scatter + regularization_H": 0.0054877, + "inversion_other + mesh_construction + mesh_seed_argmin + regularization_H": 0.0054717, + "inversion_other + ray_trace_data_grid": 0.0049791, + "inversion_other + mapped_reconstruction": 0.004770999999999999, + "inversion_other + mapped_reconstruction + reconstruction_scatter": 0.0040669, + "mapping_matrix + regularization_H": 0.0037760000000000003, + "inversion_other + mesh_construction + mesh_dual_areas + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin": 0.0029695999999999993, + "inversion_other + mesh_construction + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin": 0.0026015000000000005, + "inversion_other + mesh_locate_walk + mesh_seed_argmin": 0.0024703999999999998, + "inversion_other + mesh_construction + mesh_locate_walk + mesh_seed_argmin": 0.0024063, + "chi_squared_evidence + inversion_other": 0.002384, + "inversion_other + mesh_interpolation_weights": 0.0022688, + "grids_and_structures + mass_profile_deflections": 0.0013312000000000003 + }, + "example_kernels": { + "curvature_reg_reduce_gather + inversion_other + mapped_reconstruction + pdip_solve + reconstruction_scatter + regularization_H": [ + "input_add_multiply_transpose_fusion" + ], + "curvature_matrix_F + psf_convolution_mapping_matrix": [ + "loop_divide_gather_fusion" + ], + "data_vector_D + psf_convolution_mapping_matrix": [ + "input_reduce_fusion.14" + ], + "inversion_other + mesh_construction + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin + regularization_H": [ + "input_reduce_fusion.22", + "input_scatter_fusion.3" + ], + "inversion_other + mapping_matrix + mesh_construction + mesh_dual_areas + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin": [ + "input_scatter_fusion.1", + "input_scatter_fusion.4" + ], + "border_relocator + ray_trace_data_grid": [ + "input_reduce_fusion.19", + "input_concatenate_fusion.9", + "input_reduce_fusion.18", + "loop_add_fusion.3" + ], + "inversion_other + regularization_H": [ + "loop_reduce_slice_fusion.2", + "loop_reduce_slice_fusion.1", + "loop_reduce_slice_fusion", + "loop_reduce_fusion.3" + ], + "inversion_other + mesh_construction + mesh_dual_areas + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin + regularization_H": [ + "loop_select_fusion.4" + ], + "inversion_other + mapping_matrix + mesh_construction + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin": [ + "input_scatter_fusion.2" + ], + "inversion_other + pdip_solve + regularization_H": [ + "loop_log_fusion.1", + "loop_log_fusion" + ] + }, + "prorated_estimate_ms": { + "psf_convolution_mapping_matrix": 0.58234565, + "curvature_matrix_F": 0.51216295, + "inversion_other": 0.3690093309523809, + "regularization_H": 0.3518196773809523, + "mapped_reconstruction": 0.32026785666666663, + "pdip_solve": 0.3187678833333333, + "reconstruction_scatter": 0.31788235666666664, + "curvature_reg_reduce_gather": 0.3165267233333333, + "data_vector_D": 0.0701827, + "mesh_construction": 0.027077124285714287, + "mesh_locate_walk": 0.025565805952380956, + "mesh_seed_argmin": 0.02375939761904762, + "mesh_interpolation_weights": 0.023466590952380954, + "ray_trace_data_grid": 0.015997433333333335, + "mesh_dual_areas": 0.010566840952380953, + "border_relocator": 0.010454050000000003, + "mapping_matrix": 0.006793961904761905, + "grids_and_structures": 0.0037194333333333334, + "mass_profile_deflections": 0.0037194333333333334, + "chi_squared_evidence": 0.001192 + }, + "prorated_note": "ESTIMATE ONLY \u2014 a mixed fusion's time split equally across the stages its constituents span. Never summed into the measured table, never reconciled." + }, + "other_sources_ms": { + "copy.75": 0.04220080000000013, + "copy.37": 0.014700799999999993, + "copy.73": 0.0021024, + "loop_broadcast_fusion.5": 0.0020895, + "copy.46": 0.0019968, + "loop_broadcast_fusion.3": 0.001987, + "copy.74": 0.0016639000000000003 + }, + "device_span_ms": 468.1705037, + "device_busy_ms": 437.22783289999995, + "device_idle_ms": 30.94267080000003, + "largest_idle_gaps": [ + { + "gap_ms": 5.423782, + "after": "pure_callback.4", + "before": "pure_callback.4" + }, + { + "gap_ms": 0.128477, + "after": "cholesky.70", + "before": "cholesky.70" + }, + { + "gap_ms": 0.078174, + "after": "cholesky.20", + "before": "cholesky.20" + }, + { + "gap_ms": 0.054238, + "after": "input_reduce_fusion.30", + "before": "loop_broadcast_fusion" + }, + { + "gap_ms": 0.037215, + "after": "loop_reduce_fusion", + "before": "loop_or_select_fusion" + }, + { + "gap_ms": 0.026623, + "after": "pure_callback.4", + "before": "loop_select_fusion.6" + }, + { + "gap_ms": 0.026271, + "after": "input_concatenate_fusion.7", + "before": "pure_callback.4" + }, + { + "gap_ms": 0.025151, + "after": "while.52", + "before": "input_reduce_fusion.3" + } + ], + "kernel_ms": 437.2384985000036, + "sum_ms": 468.1811693000036, + "wall_ms": 468.2964584997535, + "host_outside_span_ms": 0.1259547997535151, + "reconciliation_pct": -0.024618849375722146, + "unjoined_ms": 0.0, + "unjoined_pct": 0.0, + "other_ms": 0.0667035, + "other_pct": 0.014243861722485162, + "note": "Stage rows attribute the command-buffers-OFF program (see the module docstring): kernel times are the same, the launch overhead the CUDA graphs remove is not. sum_ms = kernel rows + device_idle_ms; the residual against wall_ms is host_outside_span_ms (dispatch before the first kernel, teardown after the last).", + "per_stage_ms_per_lane": { + "border_relocator": 0.004800000000000001, + "chi_squared_evidence": 0.0009272000000000001, + "curvature_matrix_F": 0.21092885, + "data_vector_D": 0.0001856, + "fit_imaging_other": 0.010034325, + "grids_and_structures": 6.720000000000001e-05, + "inversion_other": 0.7230654749999994, + "mapping_matrix": 0.0057030499999999994, + "mesh_construction": 0.000104, + "mesh_locate_walk": 0.006841600000000001, + "mesh_qhull_callback": 0.000537575, + "mesh_seed_argmin": 0.011166175000000004, + "mixed_fusion": 0.1656202, + "other": 0.003335175, + "pdip_solve": 20.332128425000178, + "psf_convolution_mapping_matrix": 0.367880525, + "ray_trace_data_grid": 0.0006592, + "regularization_H": 0.017940349999999997 + }, + "per_lane_divisor": 20, + "host_callback": { + "pure_callback_span_ms": 5.6468074999999995, + "qhull_ms": 5.159133700000001, + "callback_body_ms_note": "the OUTERMOST matching body event, not a sum: under the probe the body appears twice (the wrapper and the timed re-implementation it calls) and summing them would count the same work twice", + "events_by_name": { + "pure_callback.4": { + "count": 10, + "ms": 5.6468074999999995 + }, + "$callback.py:815 _wrapped_callback": { + "count": 10, + "ms": 5.5343774 + }, + "$callback.py:224 _callback": { + "count": 10, + "ms": 5.5084296 + }, + "$callback.py:74 pure_callback_impl": { + "count": 10, + "ms": 5.4972187 + }, + "$callback.py:69 __call__": { + "count": 10, + "ms": 5.1836126 + }, + "$delaunay.py:162 ": { + "count": 10, + "ms": 5.1753546 + }, + "$host_callback_probe.py:225 wrapped": { + "count": 10, + "ms": 5.159133700000001 + }, + "$host_callback_probe.py:160 _timed_tri_only": { + "count": 10, + "ms": 5.1485837000000005 + }, + "ThenExecuteCallback:GetEventForComputeStreamSyncPoint": { + "count": 10, + "ms": 0.026345900000000002 + }, + "$callback.py:822 ": { + "count": 40, + "ms": 0.014651800000000001 + } + }, + "note": "HOST milliseconds per traced BATCH (the whole invocation), aggregated by name because the events nest. Not a row of the device table: the device pays for them as the idle gaps largest_idle_gaps names." + }, + "host_callback_ms": 5.6468074999999995 + }, + "hlo_census": { + "status": "excluded", + "reason": "The legacy census anchors PyAutoArray source line numbers that moved after the phase-1 run. No batched attribution is published from unsupported anchors; the device-event table and wall reconciliation remain valid." + }, + "trace_split": { + "expected_calls": 10, + "executions_per_invocation": 1, + "method": "per-call (first-instruction recurrence)", + "note": "DECIDED IN CODE: the scalar arm's trace is split by trace_calls * B, so every lane's execution is its own block and the per-stage median is taken over all of them. The vmap arm's is split by trace_calls, one block per batched execution, and per_stage_ms_per_lane divides those rows by B." + } + }, + "scalar": { + "arm": "scalar", + "program": "jax.jit(fn), called B times", + "stands_for": "Nautilus(use_jax_vmap=False, use_jax_jit=True). Plain use_jax_vmap=False is UNJITTED and is NOT this arm", + "hlo_source": "jax.jit(fn).lower(lane_trees[0]) \u2014 the same program phase 1 traced", + "batch_wall_ms": 990.2627962001134, + "wall_production_nesting_ms": 990.2627962001134, + "wall_aot_command_buffers_on_ms": 991.2252092999552, + "wall_aot_command_buffers_off_ms": 1000.7897528001195, + "command_buffer_delta_ms": 9.564543500164291, + "production_nesting_vs_aot_on_delta_ms": -0.9624130998417968, + "production_nesting_vs_aot_on_delta_pct": -0.09709328322284028, + "wall_per_lane_ms": 49.51313981000567, + "wall_per_lane_command_buffers_off_ms": 50.03948764000597, + "traced_batch_wall_ms": 1028.0014395000762, + "untraced_batch_wall_ms": 1000.4682517999754, + "traced_wall_per_lane_ms": 51.40007197500381, + "callback_count_per_call": 20.0, + "callback_count_per_lane": 1.0, + "callback_expectation": "1 per likelihood evaluation, B per batch", + "host_qhull_ms": 91.32654110289877, + "host_tables_ms": 2.4479295978380833, + "host_qhull_ms_per_lane": 4.566327055144939, + "host_tables_ms_per_lane": 0.12239647989190416, + "host_callback_probe": { + "calls": 200, + "qhull_ms_total": 913.2654110289877, + "tables_ms_total": 24.479295978380833, + "total_ms_total": 937.7447070073686, + "qhull_ms_mean": 4.566327055144939, + "tables_ms_mean": 0.12239647989190416, + "total_ms_mean": 4.688723535036843, + "non_finite_calls": 0, + "n_points": [ + 1500 + ] + }, + "host_callback_records_first": [ + { + "n_points": 1500, + "qhull_ms": 4.639250997570343, + "tables_ms": 0.1740990046528168, + "total_ms": 4.81335000222316, + "finite": true + }, + { + "n_points": 1500, + "qhull_ms": 4.4998730008956045, + "tables_ms": 0.13331899754120968, + "total_ms": 4.633191998436814, + "finite": true + }, + { + "n_points": 1500, + "qhull_ms": 4.4608630014408845, + "tables_ms": 0.12177800090285018, + "total_ms": 4.582641002343735, + "finite": true + }, + { + "n_points": 1500, + "qhull_ms": 4.495613000472076, + "tables_ms": 0.11922799967578612, + "total_ms": 4.614841000147862, + "finite": true + } + ], + "device_idle_ms": 7.529338024999994, + "device_idle_ms_per_lane": 7.529338024999994, + "trace": { + "parser": "ProfileData.from_file(xplane) + as_text() + stack_frame_index(proto field 17)", + "stage_audit": { + "chi_squared_evidence": [ + { + "instruction": "input_reduce_fusion.26", + "ms": 0.003884800000000003, + "opcode": "fusion", + "shape": "f64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_util.py:104", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_util.py:104 (noise_normalization_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:98 (AbstractFit.noise_normalization)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:306 (FitDataset.noise_normalization)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:349 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)" + ] + }, + { + "instruction": "input_reduce_fusion.28", + "ms": 0.0037803150000000002, + "opcode": "fusion", + "shape": "f64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_util.py:90", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_util.py:90 (chi_squared_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:87 (AbstractFit.chi_squared)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:293 (FitDataset.chi_squared)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:345 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)" + ] + }, + { + "instruction": "loop_multiply_fusion.2", + "ms": 0.002986895, + "opcode": "fusion", + "shape": "f64[15361]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/abstract_ndarray.py:300", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/abstract_ndarray.py:300 (AbstractNDArray.__pow__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/abstract_ndarray.py:60 (unwrap_array..wrapper)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/abstract_ndarray.py:35 (to_new_array..wrapper)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_util.py:78 (chi_squared_map_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:78 (AbstractFit.chi_squared_map)" + ] + } + ], + "psf_convolution_mapping_matrix": [ + { + "instruction": "input_scatter_fusion", + "ms": 1.9941307349999995, + "opcode": "fusion", + "shape": "f64[1500,180,180]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "fft.19.0", + "ms": 1.7626722300000008, + "opcode": "fft", + "shape": "f64[1500,180,180]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "fft.15.0", + "ms": 1.3705227500000015, + "opcode": "fft", + "shape": "c128[1500,180,91]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "fft.17.0", + "ms": 0.9792968950000001, + "opcode": "fft", + "shape": "c128[1500,91,180]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "input_transpose_fusion.1", + "ms": 0.5133277300000001, + "opcode": "fusion", + "shape": "c128[1500,91,180]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "wrapped_transpose", + "ms": 0.49952775499999985, + "opcode": "fusion", + "shape": "c128[1500,180,91]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + } + ], + "mapping_matrix": [ + { + "instruction": "loop_broadcast_fusion.3", + "ms": 0.11106406999999997, + "opcode": "fusion", + "shape": "f64[15361,1500]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:342", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:342 (mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/abstract.py:283 (Mapper.mapping_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:91 (AbstractInversionImaging._mapping_matrix_for_convolution_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:137 (AbstractInversionImaging.operated_mapping_matrix_list)" + ] + }, + { + "instruction": "input_reduce_fusion.29", + "ms": 0.0029031999999999925, + "opcode": "fusion", + "shape": "f64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:93", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:93 (adaptive_pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/abstract.py:507 (Mapper.pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt.py:339 (Adapt.regularization_weights_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt_split.py:120 (AdaptSplit.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)" + ] + }, + { + "instruction": "loop_divide_fusion", + "ms": 0.002351499999999999, + "opcode": "fusion", + "shape": "f64[1500]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:92", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:92 (adaptive_pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/abstract.py:507 (Mapper.pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt.py:339 (Adapt.regularization_weights_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt_split.py:120 (AdaptSplit.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)" + ] + } + ], + "mixed_fusion": [ + { + "instruction": "loop_divide_gather_fusion", + "ms": 1.0230453300000004, + "opcode": "fusion", + "shape": "(f64[15361,1,1,1500]{3,2,1,0}, f64[15361,1,1,1500]{3,2,1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:133", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:133 (curvature_matrix_via_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:93 (InversionImagingMapping.curvature_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:389 (AbstractInversion.curvature_reg_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "input_add_multiply_transpose_fusion", + "ms": 0.061123699999999996, + "opcode": "fusion", + "shape": "(f64[1500,1500]{1,0}, f64[1500,1500]{1,0}, f64[1500,1500]{1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:61", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:61 (initialize)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:72 (solve_nnls)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:129 (_solve_nnls_primal_with..primal)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:164 (solve_nnls_primal_with_status)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:508 (reconstruction_positive_only_from)" + ] + }, + { + "instruction": "input_transpose_fusion.3", + "ms": 0.024346675000000012, + "opcode": "fusion", + "shape": "f64[1500,1500]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986 (AbstractInversion._log_det_symmetric_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:1157 (AbstractInversion.log_det_regularization_matrix_term)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:348 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/model/analysis.py:135 (AnalysisImaging.log_likelihood_function)" + ] + }, + { + "instruction": "input_scatter_fusion.2", + "ms": 0.016429389999999995, + "opcode": "fusion", + "shape": "f64[1500,1500]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:579", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:579 (pixel_splitted_regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt_split.py:137 (AdaptSplit.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:332 (AbstractInversion.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "loop_abs_fusion", + "ms": 0.014725229999999997, + "opcode": "fusion", + "shape": "(f64[6000,1]{1,0}, f64[6000,1]{1,0}, f64[6000,1]{1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:613", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:613 (triangle_area_xp)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:657 (pixel_weights_delaunay_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:982 (InterpolatorDelaunay._mappings_sizes_weights_split)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt_split.py:124 (AdaptSplit.regularization_matrix_from)" + ] + }, + { + "instruction": "input_scatter_fusion.3", + "ms": 0.014606035000000003, + "opcode": "fusion", + "shape": "f64[1500]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:70", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:70 (adaptive_pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/abstract.py:507 (Mapper.pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt.py:339 (Adapt.regularization_weights_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt_split.py:120 (AdaptSplit.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)" + ] + } + ], + "ray_trace_data_grid": [ + { + "instruction": "input_reduce_fusion.18", + "ms": 0.0032377399999999946, + "opcode": "fusion", + "shape": "f64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:506", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:506 (FlatLambdaCDM._simpson_1d)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:644 (FlatLambdaCDM.angular_diameter_distance_kpc_z1z2)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:133 (LensingCosmology.angular_diameter_distance_to_earth_in_kpc_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:362 (LensingCosmology.scaling_factor_between_redshifts_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/lens/tracer_util.py:252 (traced_grid_2d_list_from)" + ] + }, + { + "instruction": "input_reduce_fusion.20", + "ms": 0.0027575949999999955, + "opcode": "fusion", + "shape": "f64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:506", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:506 (FlatLambdaCDM._simpson_1d)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:644 (FlatLambdaCDM.angular_diameter_distance_kpc_z1z2)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:151 (LensingCosmology.angular_diameter_distance_between_redshifts_in_kpc_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:355 (LensingCosmology.scaling_factor_between_redshifts_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/lens/tracer_util.py:252 (traced_grid_2d_list_from)" + ] + }, + { + "instruction": "input_reduce_fusion.19", + "ms": 0.002598389999999994, + "opcode": "fusion", + "shape": "f64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:503", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:503 (FlatLambdaCDM._simpson_1d)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:644 (FlatLambdaCDM.angular_diameter_distance_kpc_z1z2)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:133 (LensingCosmology.angular_diameter_distance_to_earth_in_kpc_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:362 (LensingCosmology.scaling_factor_between_redshifts_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/lens/tracer_util.py:252 (traced_grid_2d_list_from)" + ] + }, + { + "instruction": "input_reduce_fusion.21", + "ms": 0.002593764999999992, + "opcode": "fusion", + "shape": "f64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:503", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:503 (FlatLambdaCDM._simpson_1d)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:644 (FlatLambdaCDM.angular_diameter_distance_kpc_z1z2)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:151 (LensingCosmology.angular_diameter_distance_between_redshifts_in_kpc_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:355 (LensingCosmology.scaling_factor_between_redshifts_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/lens/tracer_util.py:252 (traced_grid_2d_list_from)" + ] + }, + { + "instruction": "loop_divide_fusion.1", + "ms": 0.0025345600000000012, + "opcode": "fusion", + "shape": "f64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:380", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/cosmology/model.py:380 (LensingCosmology.scaling_factor_between_redshifts_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/lens/tracer_util.py:252 (traced_grid_2d_list_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/lens/tracer.py:632 (Tracer.traced_grid_2d_list_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/structures/decorators/abstract.py:93 (AbstractMaker.evaluate_func)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/structures/decorators/abstract.py:110 (AbstractMaker.result)" + ] + } + ], + "grids_and_structures": [ + { + "instruction": "loop_multiply_sine_fusion", + "ms": 0.001349450000000002, + "opcode": "fusion", + "shape": "(f64[], f64[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/geometry/geometry_util.py:527", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/geometry/geometry_util.py:527 (transform_grid_2d_to_reference_frame)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/profiles/geometry_profiles.py:418 (EllProfile.transformed_to_reference_frame_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/structures/decorators/abstract.py:93 (AbstractMaker.evaluate_func)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/structures/decorators/abstract.py:112 (AbstractMaker.result)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/structures/decorators/to_grid.py:70 (to_grid..wrapper)" + ] + } + ], + "border_relocator": [ + { + "instruction": "eigh.45", + "ms": 0.07476311500000012, + "opcode": "custom-call", + "shape": "(f64[2,2]{0,1}, f64[2]{0}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:245", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:245 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:454 (BorderRelocator.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:176 (AbstractMesh.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:214 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "custom-call.2", + "ms": 0.007968155000000018, + "opcode": "custom-call", + "shape": "(f64[2,2]{1,0}, s8[4194304]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:242", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:242 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:454 (BorderRelocator.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:176 (AbstractMesh.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:214 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "loop_select_sine_fusion", + "ms": 0.003661740000000002, + "opcode": "fusion", + "shape": "(f64[], f64[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:301", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:301 (relocated_grid_via_ellipse_border_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:458 (BorderRelocator.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:176 (AbstractMesh.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:214 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "loop_add_fusion.7", + "ms": 0.0036049499999999952, + "opcode": "fusion", + "shape": "f64[1500]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:308", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:308 (relocated_grid_via_ellipse_border_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:458 (BorderRelocator.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:176 (AbstractMesh.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:214 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "input_concatenate_fusion.6", + "ms": 0.0033672000000000016, + "opcode": "fusion", + "shape": "f64[1500,2]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:323", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:323 (relocated_grid_via_ellipse_border_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:458 (BorderRelocator.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:176 (AbstractMesh.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:214 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "input_reduce_fusion.23", + "ms": 0.0019169550000000043, + "opcode": "fusion", + "shape": "f64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:256", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:256 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:454 (BorderRelocator.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:176 (AbstractMesh.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:214 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + } + ], + "mesh_construction": [ + { + "instruction": "input_concatenate_fusion.7", + "ms": 0.0020686249999999975, + "opcode": "fusion", + "shape": "f64[1500,2]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:820", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:820 (InterpolatorDelaunay.mesh_grid_xy)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:847 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + } + ], + "mesh_qhull_callback": [ + { + "instruction": "pure_callback.4", + "ms": 0.010612789999999981, + "opcode": "custom-call", + "shape": "(s32[3000,3]{1,0}, s32[3000,3]{1,0}, s32[1500]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:161", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:161 (_jax_delaunay_tables)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:405 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + } + ], + "other": [ + { + "instruction": "copy.72", + "ms": 0.04222511500000095, + "opcode": "copy", + "shape": "f64[1,1024,2]{2,1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "copy.35", + "ms": 0.014779059999999924, + "opcode": "copy", + "shape": "s32[21361]{0}", + "source": "", + "stack": [] + }, + { + "instruction": "loop_broadcast_fusion.1", + "ms": 0.0019825650000000043, + "opcode": "fusion", + "shape": "(pred[21361]{0}, pred[21361]{0})", + "source": "", + "stack": [] + }, + { + "instruction": "copy.40", + "ms": 0.001971185000000003, + "opcode": "copy", + "shape": "s64[1500]{0}", + "source": "", + "stack": [] + }, + { + "instruction": "loop_broadcast_fusion.2", + "ms": 0.0017951949999999957, + "opcode": "fusion", + "shape": "(f64[1500]{0}, f64[1500]{0}, f64[1500]{0}, f64[1500]{0})", + "source": "", + "stack": [] + }, + { + "instruction": "copy.20", + "ms": 0.001671215, + "opcode": "copy", + "shape": "s64[]", + "source": "", + "stack": [] + } + ], + "mesh_seed_argmin": [ + { + "instruction": "input_reduce_fusion", + "ms": 0.14838911000000363, + "opcode": "fusion", + "shape": "(f64[1024]{0}, s64[1024]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:191", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:191 (_nearest_vertex_seed_from..argmin_chunk)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204 (_nearest_vertex_seed_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:351 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)" + ] + }, + { + "instruction": "loop_dynamic_update_slice_fusion", + "ms": 0.04136217499999794, + "opcode": "fusion", + "shape": "s32[21,1024]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204 (_nearest_vertex_seed_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:351 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "loop_add_fusion", + "ms": 0.031880524999999986, + "opcode": "fusion", + "shape": "s64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204 (_nearest_vertex_seed_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:351 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "loop_broadcast_fusion", + "ms": 0.0019715200000000013, + "opcode": "fusion", + "shape": "s32[21,1024]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204 (_nearest_vertex_seed_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:351 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "regularization_H": [ + { + "instruction": "loop_select_fusion.3", + "ms": 0.02005693000000001, + "opcode": "fusion", + "shape": "f64[1500,1500]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:549", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:549 (pixel_splitted_regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt_split.py:137 (AdaptSplit.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:332 (AbstractInversion.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "input_scatter_fusion.10", + "ms": 0.002080480000000001, + "opcode": "fusion", + "shape": "f64[1500,1500]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:615", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:615 (pixel_splitted_regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt_split.py:137 (AdaptSplit.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:332 (AbstractInversion.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "input_concatenate_fusion.9", + "ms": 0.0018708849999999981, + "opcode": "fusion", + "shape": "pred[3]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:91", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:91 (split_points_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:410 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + }, + { + "instruction": "input_concatenate_fusion.8", + "ms": 0.001867524999999998, + "opcode": "fusion", + "shape": "pred[3]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:93", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:93 (split_points_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:410 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + }, + { + "instruction": "input_concatenate_fusion.10", + "ms": 0.001867194999999998, + "opcode": "fusion", + "shape": "pred[3]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:90", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:90 (split_points_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:410 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + }, + { + "instruction": "input_concatenate_fusion", + "ms": 0.0017668799999999982, + "opcode": "fusion", + "shape": "s32[1500,2]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:615", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:615 (pixel_splitted_regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt_split.py:137 (AdaptSplit.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:332 (AbstractInversion.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "mesh_locate_walk": [ + { + "instruction": "loop_reduce_fusion", + "ms": 0.023632765000000222, + "opcode": "fusion", + "shape": "(f64[21361]{0}, s64[21361]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:264", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:264 (_walk_from_seed..walk_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:292 (_walk_from_seed..body)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:264 (_walk_from_seed..walk_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:292 (_walk_from_seed..body)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)" + ] + }, + { + "instruction": "input_reduce_fusion.1", + "ms": 0.022718959999999684, + "opcode": "fusion", + "shape": "pred[196]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:288", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:288 (_walk_from_seed..cond)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:353 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)" + ] + }, + { + "instruction": "loop_or_select_fusion", + "ms": 0.020374695000000012, + "opcode": "fusion", + "shape": "(s32[21361]{0}, pred[21361]{0}, pred[21361]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:270", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:270 (_walk_from_seed..walk_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:292 (_walk_from_seed..body)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:353 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)" + ] + }, + { + "instruction": "loop_select_fusion", + "ms": 0.017536129999999987, + "opcode": "fusion", + "shape": "s32[21361]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:242", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:242 (_walk_from_seed..weights_of)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:262 (_walk_from_seed..walk_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:292 (_walk_from_seed..body)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:353 (pix_indexes_delaunay_walk_from)" + ] + }, + { + "instruction": "input_reduce_fusion.2", + "ms": 0.014358279999999928, + "opcode": "fusion", + "shape": "pred[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:288", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:288 (_walk_from_seed..cond)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:353 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)" + ] + }, + { + "instruction": "while.22", + "ms": 0.012884814999999787, + "opcode": "while", + "shape": "(s32[], s32[21361]{0}, pred[21361]{0}, pred[21361]{0}, s32[3000,3]{1,0}, /*index=5*/f64[1500,2]{1,0}, f64[21361,2]{1,0}, s32[3000,3]{1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:353 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "data_vector_D": [ + { + "instruction": "input_reduce_fusion.10", + "ms": 0.12161861500000003, + "opcode": "fusion", + "shape": "f64[92,1500]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/inversion_imaging_util.py:123", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/inversion_imaging_util.py:123 (data_vector_via_blurred_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:67 (InversionImagingMapping.data_vector)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:699 (AbstractInversion.reconstruction)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "input_reduce_fusion.27", + "ms": 0.003683645000000003, + "opcode": "fusion", + "shape": "f64[1500]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/inversion_imaging_util.py:123", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/inversion_imaging_util.py:123 (data_vector_via_blurred_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:67 (InversionImagingMapping.data_vector)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:699 (AbstractInversion.reconstruction)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "inversion_other": [ + { + "instruction": "cholesky.60", + "ms": 0.8959521850000002, + "opcode": "custom-call", + "shape": "(f64[1500,1500]{0,1}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986 (AbstractInversion._log_det_symmetric_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:1078 (AbstractInversion.log_det_curvature_reg_matrix_term)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:347 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/model/analysis.py:135 (AnalysisImaging.log_likelihood_function)" + ] + }, + { + "instruction": "cholesky.70", + "ms": 0.8952552050000002, + "opcode": "custom-call", + "shape": "(f64[1500,1500]{0,1}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986 (AbstractInversion._log_det_symmetric_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:1157 (AbstractInversion.log_det_regularization_matrix_term)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:348 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/model/analysis.py:135 (AnalysisImaging.log_likelihood_function)" + ] + }, + { + "instruction": "input_reduce_fusion.17", + "ms": 0.013025704999999992, + "opcode": "fusion", + "shape": "f64[1500]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:946", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:946 (AbstractInversion.regularization_term)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:346 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/model/analysis.py:135 (AnalysisImaging.log_likelihood_function)", + "/mnt/ral/jnightin/autolens_profiling_wt/certified-solver-phase-c1-lane-rate/scripts/imaging/likelihood_breakdown/fixed_light_trace.py:1195 (_captured_likelihood_fn.._likelihood)" + ] + }, + { + "instruction": "loop_reduce_window_fusion", + "ms": 0.002881114999999994, + "opcode": "fusion", + "shape": "s64[6,16]{1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "loop_reduce_window_fusion.1", + "ms": 0.0027832000000000048, + "opcode": "fusion", + "shape": "s64[94,16]{1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "input_reduce_fusion.25", + "ms": 0.0026658900000000032, + "opcode": "fusion", + "shape": "f64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:944", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:944 (AbstractInversion.regularization_term)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:346 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/model/analysis.py:135 (AnalysisImaging.log_likelihood_function)", + "/mnt/ral/jnightin/autolens_profiling_wt/certified-solver-phase-c1-lane-rate/scripts/imaging/likelihood_breakdown/fixed_light_trace.py:1195 (_captured_likelihood_fn.._likelihood)" + ] + } + ], + "curvature_matrix_F": [ + { + "instruction": "cublas-lt-matmul.2", + "ms": 4.2290523050000015, + "opcode": "custom-call", + "shape": "(f64[1500,1500]{1,0}, s8[4194304]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:134", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:134 (curvature_matrix_via_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:93 (InversionImagingMapping.curvature_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:389 (AbstractInversion.curvature_reg_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "pdip_solve": [ + { + "instruction": "cholesky.20", + "ms": 15.643076489999782, + "opcode": "custom-call", + "shape": "(f64[1500,1500]{0,1}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:106", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:106 (factorize_kkt)", + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:212 (pdip_pc_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:83 (solve_nnls)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:129 (_solve_nnls_primal_with..primal)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:164 (solve_nnls_primal_with_status)" + ] + }, + { + "instruction": "triangular-solve", + "ms": 2.4862915699999815, + "opcode": "custom-call", + "shape": "(f64[1500,1]{0,1}, s8[0]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146 (solve_kkt_rhs)", + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:213 (pdip_pc_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:83 (solve_nnls)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:129 (_solve_nnls_primal_with..primal)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:164 (solve_nnls_primal_with_status)" + ] + }, + { + "instruction": "triangular-solve.2", + "ms": 2.435595480000113, + "opcode": "custom-call", + "shape": "(f64[1500,1]{0,1}, s8[0]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146 (solve_kkt_rhs)", + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:217 (pdip_pc_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:83 (solve_nnls)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:129 (_solve_nnls_primal_with..primal)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:164 (solve_nnls_primal_with_status)" + ] + }, + { + "instruction": "triangular-solve.3", + "ms": 2.362735340000195, + "opcode": "custom-call", + "shape": "(f64[1500,1]{0,1}, s8[0]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146 (solve_kkt_rhs)", + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:217 (pdip_pc_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:83 (solve_nnls)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:129 (_solve_nnls_primal_with..primal)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:164 (solve_nnls_primal_with_status)" + ] + }, + { + "instruction": "triangular-solve.1", + "ms": 2.261767130000196, + "opcode": "custom-call", + "shape": "(f64[1500,1]{0,1}, s8[0]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:146 (solve_kkt_rhs)", + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:213 (pdip_pc_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:83 (solve_nnls)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:129 (_solve_nnls_primal_with..primal)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:164 (solve_nnls_primal_with_status)" + ] + }, + { + "instruction": "cholesky.40", + "ms": 0.8701936999999988, + "opcode": "custom-call", + "shape": "(f64[1500,1500]{0,1}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:62", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAuto/lib/python3.12/site-packages/jaxnnls/pdip.py:62 (initialize)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:72 (solve_nnls)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:129 (_solve_nnls_primal_with..primal)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_nnls.py:164 (solve_nnls_primal_with_status)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:508 (reconstruction_positive_only_from)" + ] + } + ], + "mapped_reconstruction": [ + { + "instruction": "input_reduce_fusion.14", + "ms": 0.11521205500000002, + "opcode": "fusion", + "shape": "f64[15361]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:163", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:163 (mapped_reconstructed_data_via_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:120 (InversionImagingMapping._mapped_reconstructed_data_dict_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:196 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + } + ] + }, + "stage_audit_note": "The HLO instructions that contributed most of each stage's milliseconds, with their full source stack. A stage row is only as good as the rules that built it; this is how a reader checks a row against the HLO instead of trusting it.", + "untraced_wall_ms": 50.02341258999877, + "reconciliation_vs_untraced_pct": -1.9565279822480652, + "wall_basis": "wall_ms is the TRACED run's wall, the run these kernel durations came from. untraced_wall_ms is the same executable without the profiler; the difference is the profiler's overhead and belongs in neither the stages nor the idle row.", + "calls": 200, + "call_split": "per-call (first-instruction recurrence)", + "call_blocks": 200, + "events": 185800, + "streams": [ + "Stream #14(MemcpyH2D,Compute,MemcpyD2H,Memset,MemcpyD2D)" + ], + "per_stage_ms": { + "border_relocator": { + "median_ms": 0.09679900000000002, + "min_ms": 0.09615600000000003, + "max_ms": 0.097789 + }, + "chi_squared_evidence": { + "median_ms": 0.010624000000000001, + "min_ms": 0.010304, + "max_ms": 0.011232 + }, + "curvature_matrix_F": { + "median_ms": 4.2269015, + "min_ms": 4.214477, + "max_ms": 4.30875 + }, + "data_vector_D": { + "median_ms": 0.12531350000000002, + "min_ms": 0.124545, + "max_ms": 0.126145 + }, + "grids_and_structures": { + "median_ms": 0.001312, + "min_ms": 0.00128, + "max_ms": 0.00144 + }, + "inversion_other": { + "median_ms": 1.8232705, + "min_ms": 1.805524, + "max_ms": 1.837844 + }, + "mapped_reconstruction": { + "median_ms": 0.115197, + "min_ms": 0.114397, + "max_ms": 0.116061 + }, + "mapping_matrix": { + "median_ms": 0.11632100000000001, + "min_ms": 0.115329, + "max_ms": 0.11756899999999999 + }, + "memset": { + "median_ms": 0.04812800000000002, + "min_ms": 0.04000000000000001, + "max_ms": 0.07564800000000006 + }, + "mesh_construction": { + "median_ms": 0.00208, + "min_ms": 0.002047, + "max_ms": 0.002112 + }, + "mesh_locate_walk": { + "median_ms": 0.134049, + "min_ms": 0.133217, + "max_ms": 0.134912 + }, + "mesh_qhull_callback": { + "median_ms": 0.01056, + "min_ms": 0.010464000000000001, + "max_ms": 0.011168 + }, + "mesh_seed_argmin": { + "median_ms": 0.2235865000000001, + "min_ms": 0.2230990000000001, + "max_ms": 0.2240660000000001 + }, + "mixed_fusion": { + "median_ms": 1.2709775, + "min_ms": 1.2687489999999997, + "max_ms": 1.2747000000000004 + }, + "other": { + "median_ms": 0.0693135, + "min_ms": 0.06889499999999998, + "max_ms": 0.06976 + }, + "pdip_solve": { + "median_ms": 25.848196000000044, + "min_ms": 22.808241000000063, + "max_ms": 41.376746000000004 + }, + "psf_convolution_mapping_matrix": { + "median_ms": 7.3480195, + "min_ms": 7.3335490000000005, + "max_ms": 7.364046000000001 + }, + "ray_trace_data_grid": { + "median_ms": 0.013696, + "min_ms": 0.013568, + "max_ms": 0.014177000000000002 + }, + "regularization_H": { + "median_ms": 0.031008, + "min_ms": 0.030368, + "max_ms": 0.031679 + } + }, + "stage_order": [ + "ray_trace_data_grid", + "border_relocator", + "mesh_qhull_callback", + "mesh_seed_argmin", + "mesh_locate_walk", + "mesh_construction", + "mapping_matrix", + "psf_convolution_mapping_matrix", + "data_vector_D", + "curvature_matrix_F", + "regularization_H", + "pdip_solve", + "mapped_reconstruction", + "chi_squared_evidence", + "grids_and_structures", + "inversion_other", + "mixed_fusion", + "other", + "memset" + ], + "mixed_fusion": { + "ms": 1.2709775, + "constituent_stage_sets": { + "curvature_matrix_F + psf_convolution_mapping_matrix": 1.0230453300000004, + "curvature_reg_reduce_gather + inversion_other + mapped_reconstruction + pdip_solve + reconstruction_scatter + regularization_H": 0.061123699999999996, + "inversion_other + regularization_H": 0.029225715000000055, + "inversion_other + mesh_construction + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin + regularization_H": 0.021690225000000046, + "border_relocator + ray_trace_data_grid": 0.021213189999999996, + "inversion_other + mapping_matrix + mesh_construction + mesh_dual_areas + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin": 0.021144570000000022, + "inversion_other + mesh_construction + mesh_dual_areas + mesh_interpolation_weights + regularization_H": 0.014725229999999997, + "inversion_other + mapping_matrix + mesh_construction + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin": 0.01166553, + "grids_and_structures + mass_profile_deflections + ray_trace_data_grid": 0.009562199999999998, + "inversion_other + mesh_dual_areas + mesh_locate_walk": 0.00939052000000004, + "inversion_other + mesh_construction + mesh_seed_argmin + regularization_H": 0.007291344999999993, + "inversion_other + mesh_construction + regularization_H": 0.006517565000000003, + "inversion_other + ray_trace_data_grid": 0.0053705450000000165, + "inversion_other + mapped_reconstruction + pdip_solve + reconstruction_scatter": 0.004874084999999997, + "inversion_other + mapped_reconstruction": 0.0037905350000000007, + "mapping_matrix + regularization_H": 0.003419349999999996, + "inversion_other + mesh_construction + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin": 0.0031858950000000015, + "inversion_other + mesh_construction + mesh_dual_areas + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin": 0.0029827000000000065, + "inversion_other + pdip_solve": 0.0028899249999999976, + "inversion_other + mesh_locate_walk + mesh_seed_argmin": 0.002527329999999996, + "inversion_other + mesh_interpolation_weights": 0.0022097499999999934, + "chi_squared_evidence + inversion_other": 0.0019017450000000029, + "grids_and_structures + mass_profile_deflections": 0.0013417450000000018 + }, + "example_kernels": { + "curvature_matrix_F + psf_convolution_mapping_matrix": [ + "loop_divide_gather_fusion" + ], + "curvature_reg_reduce_gather + inversion_other + mapped_reconstruction + pdip_solve + reconstruction_scatter + regularization_H": [ + "input_add_multiply_transpose_fusion" + ], + "inversion_other + regularization_H": [ + "loop_reduce_slice_fusion", + "loop_reduce_fusion.1", + "loop_reduce_fusion.2", + "input_transpose_fusion.3" + ], + "inversion_other + mesh_construction + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin + regularization_H": [ + "input_reduce_fusion.24", + "loop_select_fusion.4", + "input_scatter_fusion.2" + ], + "border_relocator + ray_trace_data_grid": [ + "input_reduce_fusion.16", + "input_concatenate_fusion.12", + "input_reduce_fusion.15", + "loop_add_fusion.5" + ], + "inversion_other + mapping_matrix + mesh_construction + mesh_dual_areas + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin": [ + "input_scatter_fusion.6", + "input_scatter_fusion.3" + ], + "inversion_other + mesh_construction + mesh_dual_areas + mesh_interpolation_weights + regularization_H": [ + "loop_abs_fusion" + ], + "inversion_other + mapping_matrix + mesh_construction + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin": [ + "input_scatter_fusion.4" + ], + "grids_and_structures + mass_profile_deflections + ray_trace_data_grid": [ + "loop_subtract_fusion.1" + ], + "inversion_other + mesh_dual_areas + mesh_locate_walk": [ + "loop_select_fusion.6", + "input_scatter_fusion.9", + "input_scatter_fusion.8", + "input_scatter_fusion.7" + ] + }, + "prorated_estimate_ms": { + "curvature_matrix_F": 0.5115226650000002, + "psf_convolution_mapping_matrix": 0.5115226650000002, + "inversion_other": 0.05472717369047624, + "regularization_H": 0.03706525725000003, + "mesh_construction": 0.0166546449404762, + "ray_trace_data_grid": 0.016479267500000006, + "mesh_interpolation_weights": 0.013764162023809534, + "mesh_locate_walk": 0.013686857690476215, + "mapped_reconstruction": 0.013301072083333332, + "pdip_solve": 0.01285076708333333, + "mesh_seed_argmin": 0.012379520607142867, + "reconstruction_scatter": 0.011405804583333332, + "border_relocator": 0.010606594999999998, + "curvature_reg_reduce_gather": 0.010187283333333333, + "mesh_dual_areas": 0.009592988857142874, + "mapping_matrix": 0.0066745828571428585, + "grids_and_structures": 0.0038582725000000004, + "mass_profile_deflections": 0.0038582725000000004, + "chi_squared_evidence": 0.0009508725000000014 + }, + "prorated_note": "ESTIMATE ONLY \u2014 a mixed fusion's time split equally across the stages its constituents span. Never summed into the measured table, never reconciled." + }, + "other_sources_ms": { + "copy.72": 0.04222511500000095, + "copy.35": 0.014779059999999924, + "loop_broadcast_fusion.1": 0.0019825650000000043, + "copy.40": 0.001971185000000003, + "loop_broadcast_fusion.2": 0.0017951949999999957, + "copy.20": 0.001671215, + "copy.71": 0.0016487949999999991, + "copy.52": 0.001648469999999997, + "copy.70": 0.001609909999999998 + }, + "device_span_ms": 51.395114955, + "device_busy_ms": 43.86577693, + "device_idle_ms": 7.529338024999994, + "largest_idle_gaps": [ + { + "gap_ms": 5.342053, + "after": "pure_callback.4", + "before": "pure_callback.4" + }, + { + "gap_ms": 0.046111, + "after": "input_concatenate_fusion.7", + "before": "pure_callback.4" + }, + { + "gap_ms": 0.033919, + "after": "pure_callback.4", + "before": "copy.71" + }, + { + "gap_ms": 0.033567, + "after": "input_reduce_fusion.1", + "before": "input_reduce_fusion.2" + }, + { + "gap_ms": 0.024608, + "after": "loop_add_fusion", + "before": "copy.72" + }, + { + "gap_ms": 0.022879, + "after": "input_reduce_fusion.26", + "before": "loop_broadcast_fusion.4" + }, + { + "gap_ms": 0.02064, + "after": "eigh.45", + "before": "eigh.45" + }, + { + "gap_ms": 0.019999, + "after": "loop_reduce_fusion.1", + "before": "loop_reduce_fusion.2" + } + ], + "kernel_ms": 41.51535250000005, + "sum_ms": 49.04469052500004, + "wall_ms": 51.40007197500381, + "host_outside_span_ms": 0.004957020003814705, + "reconciliation_pct": -4.582447766122208, + "unjoined_ms": 0.0, + "unjoined_pct": 0.0, + "other_ms": 0.0693135, + "other_pct": 0.13485097848444183, + "note": "Stage rows attribute the command-buffers-OFF program (see the module docstring): kernel times are the same, the launch overhead the CUDA graphs remove is not. sum_ms = kernel rows + device_idle_ms; the residual against wall_ms is host_outside_span_ms (dispatch before the first kernel, teardown after the last).", + "per_stage_ms_per_lane": { + "border_relocator": 0.09679900000000002, + "chi_squared_evidence": 0.010624000000000001, + "curvature_matrix_F": 4.2269015, + "data_vector_D": 0.12531350000000002, + "grids_and_structures": 0.001312, + "inversion_other": 1.8232705, + "mapped_reconstruction": 0.115197, + "mapping_matrix": 0.11632100000000001, + "memset": 0.04812800000000002, + "mesh_construction": 0.00208, + "mesh_locate_walk": 0.134049, + "mesh_qhull_callback": 0.01056, + "mesh_seed_argmin": 0.2235865000000001, + "mixed_fusion": 1.2709775, + "other": 0.0693135, + "pdip_solve": 25.848196000000044, + "psf_convolution_mapping_matrix": 7.3480195, + "ray_trace_data_grid": 0.013696, + "regularization_H": 0.031008 + }, + "per_lane_divisor": 1, + "host_callback": { + "pure_callback_span_ms": 100.77607629999997, + "qhull_ms": 93.95979960000003, + "callback_body_ms_note": "the OUTERMOST matching body event, not a sum: under the probe the body appears twice (the wrapper and the timed re-implementation it calls) and summing them would count the same work twice", + "events_by_name": { + "pure_callback.4": { + "count": 200, + "ms": 100.77607629999997 + }, + "$callback.py:815 _wrapped_callback": { + "count": 200, + "ms": 99.01275000000007 + }, + "$callback.py:224 _callback": { + "count": 200, + "ms": 98.54368509999999 + }, + "$callback.py:74 pure_callback_impl": { + "count": 200, + "ms": 98.36677370000001 + }, + "$callback.py:69 __call__": { + "count": 200, + "ms": 94.27812700000001 + }, + "$delaunay.py:162 ": { + "count": 200, + "ms": 94.14547370000003 + }, + "$host_callback_probe.py:225 wrapped": { + "count": 200, + "ms": 93.95979960000003 + }, + "$host_callback_probe.py:160 _timed_tri_only": { + "count": 200, + "ms": 93.7995406 + }, + "ThenExecuteCallback:GetEventForComputeStreamSyncPoint": { + "count": 200, + "ms": 0.3638613000000001 + }, + "$callback.py:822 ": { + "count": 800, + "ms": 0.28749589999999947 + }, + "$__init__.py:132 _xla_gc_callback": { + "count": 2, + "ms": 0.000366 + } + }, + "note": "HOST milliseconds per traced BATCH (the whole invocation), aggregated by name because the events nest. Not a row of the device table: the device pays for them as the idle gaps largest_idle_gaps names." + }, + "host_callback_ms": 100.77607629999997 + }, + "hlo_census": { + "status": "excluded", + "reason": "The legacy census anchors PyAutoArray source line numbers that moved after the phase-1 run. No batched attribution is published from unsupported anchors; the device-event table and wall reconciliation remain valid." + }, + "trace_split": { + "expected_calls": 200, + "executions_per_invocation": 20, + "method": "per-call (first-instruction recurrence)", + "note": "DECIDED IN CODE: the scalar arm's trace is split by trace_calls * B, so every lane's execution is its own block and the per-stage median is taken over all of them. The vmap arm's is split by trace_calls, one block per batched execution, and per_stage_ms_per_lane divides those rows by B." + } + } + }, + "certification_report": { + "source": "vmap arm, library solve observed through its stats= out-dict (PyAutoArray #566) and jax.debug.callback(..., ordered=True); ordered because the unordered batching rule returns the lanes permuted. Untimed, separately compiled; max rel diff of its log likelihoods vs the timed arm's: 4.123e-07", + "rows": 0, + "pdip_iter": "NOT AVAILABLE per lane without changing library numerics. The fallback branch calls the library's own reconstruction_positive_only_from, which returns the solution alone \u2014 jax_nnls.solve_nnls' iteration count is discarded inside the library's custom_vjp primal. The PDIP while_loop's cost is in the pdip_solve stage row of each arm's device table instead, which is a max-over-lanes quantity under vmap because every lane runs the same fixed kernel sequence.", + "passes_semantics": "library `passes`: restricted active-set passes run (jax_active_set.solve_certified)" + }, + "lane_construction": { + "draws_sha256": "8793f501adc86a80ee673986f87d36fdfb1b77bce5635352ee2c467783acb150", + "lane_rows": [ + 160, + 161, + 162, + 163, + 164, + 165, + 166, + 167, + 168, + 169, + 170, + 171, + 172, + 173, + 174, + 175, + 176, + 177, + 178, + 179 + ], + "calls": [ + 8 + ], + "stage": "pix2", + "regularization_range": { + "galaxies.source.pixelization.regularization.inner_coefficient": { + "min": 1.0566389768329418e-06, + "max": 229.37837836630266 + }, + "galaxies.source.pixelization.regularization.outer_coefficient": { + "min": 2.4574595034239785e-06, + "max": 30.026999055831187 + }, + "galaxies.source.pixelization.regularization.signal_scale": { + "min": 0.07341166691553269, + "max": 0.8809562507227594 + } + }, + "phases": [ + "exploration" + ], + "window_rule": "nautilus_batches.timed_window: consecutive captured calls, in call order, from the FIRST call that is not a prior batch, concatenated and truncated to B; at B == n_batch exactly one real Nautilus batch. Falls back to the latest B lanes if the post-prior lanes run out; never repeats a lane.", + "note": "Lane k is captured lane lane_rows[k]: the mass AND shear of a real Nautilus proposal (nautilus_batch_capture.py), lens light fixed at S3, the S3 light-subtracted dataset shared by every lane. `offsets` in the lane table are the mass offsets from the fiducial; the shear is in the capture file." + }, + "captured": { + "batches_path": "/mnt/ral/jnightin/autolens_profiling_wt/certified-solver-phase-c1-lane-rate/results/breakdown/imaging/nautilus_batches_delaunay_pix2.npz", + "batches_sha256": "90f4640a92f9b1c60ca3fceca7b484aa8215970489f8e7daf5430b8460d171d5", + "schema_version": 2, + "n_calls": 84, + "n_lanes": 1680, + "call_sizes_seen": [ + 20 + ], + "calls_by_phase": { + "prior": 8, + "exploration": 72, + "sampling": 4 + }, + "parameter_paths": [ + "galaxies.source.pixelization.regularization.inner_coefficient", + "galaxies.source.pixelization.regularization.outer_coefficient", + "galaxies.source.pixelization.regularization.signal_scale" + ], + "stage": "pix2", + "regularization": { + "class": "AdaptSplit", + "free": true, + "priors": { + "inner_coefficient": [ + "LogUniform", + 1e-06, + 1000000.0 + ], + "outer_coefficient": [ + "LogUniform", + 1e-06, + 1000000.0 + ], + "signal_scale": [ + "Uniform", + 0.0, + 1.0 + ] + }, + "priors_source": "PyAutoGalaxy packaged config/priors/regularization (adapt_split.yaml / constant.yaml); adapt_split.yaml is identical to euclid_strong_lens_modeling_pipeline/config/priors/regularization/adapt_split.yaml" + }, + "nautilus": { + "departures_from_production": [ + "mass/shear fixed at the S3 fiducial, not at a source_pix_1 result", + "no positions likelihood", + "the cell's mesh (Hilbert 1500, weight_power 1) in both stages; source_pix_2 redraws a 500-vertex Hilbert grid at weight_power 3.5", + "seeded (production passes no seed)", + "quick updates disabled (iterations_per_quick_update=1e12; render-only)", + "NullPaths: no output directory, so no checkpoint and one Sampler.run call", + "post-fit perform_update skipped (samples / latent variables never built)" + ], + "n_batch": 20, + "n_like_max": 40000, + "n_live": 75, + "number_of_cores": 1, + "production_reference": "euclid_strong_lens_modeling_pipeline/scripts/full_model.py source_pix_1 (n_live=150) / source_pix_2 (n_live=75): af.Nautilus(n_batch=20, **SettingsSearch.search_dict) with use_jax_vmap=True and number_of_cores=1 (SettingsSearch defaults)", + "production_stage": "source_pix_2", + "seed": 1, + "stage": "pix2", + "use_jax_vmap": true, + "version": "1.0.5" + }, + "capture_fit_status": "sampling complete (n_like_max or convergence); post-fit result skipped", + "capture_library_revisions": { + "PyAutoArray": { + "head": "7fa8d2714f7da43fec2b23c31bff580764831670", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoArray" + }, + "PyAutoFit": { + "head": "a736840127be7a3c21e15a5c945e94d8f1082983", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoFit" + }, + "PyAutoGalaxy": { + "head": "70a61e26cd715cefe7012a38285698091246a8a4", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy" + }, + "PyAutoLens": { + "head": "86054bbc19baa2f710a12e04a94fa27ab37cc354", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoLens" + }, + "PyAutoNerves": { + "head": "1fa613aa8d89a79613009fb66f5b4e2d21deb57a", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoNerves" + } + }, + "fingerprint_check": { + "fields": [ + "mesh", + "source_pixels", + "dataset_sha256", + "regularization_class", + "regularization_s0_fiducial", + "border_relocator", + "use_mixed_precision", + "log_evidence_s3_library" + ], + "not_identity": "the regularization coefficients: free per lane since the capture frees them", + "log_evidence_s3_library_rel_diff": 0.0, + "passed": true + }, + "timed_window_vs_capture_pdip": { + "reference": "the capture's own figure of merit (library PDIP, Fitness.call_wrap jax.jit(jax.vmap(call)) over parameter vectors) for the same lanes", + "compared_against": "this cell's jit(vmap) library-PDIP reference", + "n_compared": 20, + "max_rel_diff": 3.745673786670123e-07, + "max_abs_diff_nats": 0.05191313708201051, + "gated": false, + "note": "RECORDED, NOT GATED: proves the lane trees rebuilt here are the models the sampler evaluated (a wrong parameter mapping shows up as nats, not 1e-10)." + } + }, + "matched": { + "vmap_wall_per_lane_ms": 22.847947945010674, + "scalar_wall_per_lane_ms": 49.51313981000567, + "speedup_vmap_over_scalar": 2.1670716306414683, + "note": "Both walls are the PRODUCTION nesting of their arm, measured in one process on the same B lanes with the SAME library Settings (no injection). A speedup below 1 means the batch is slower per lane than B sequential jitted calls." + }, + "solver_source": "library", + "solver": "pdip", + "certified_fallback": "pdip", + "certified_pass_budget": 16, + "certified_pass_budget_basis": "config default (Settings().certified_pass_budget)", + "certified_tau_rel": 1e-09, + "solver_used": "pdip", + "solver_check": { + "solver_used": "pdip", + "solver_used_source": "AbstractInversion.positive_only_solver_used on the fiducial S3 inversion, built eagerly on the JAX backend (AnalysisImaging(use_jax=True).fit_from) with the arms' Settings", + "reference_solver_used": "pdip", + "traced_solver_kwargs_jax": [ + "pdip" + ], + "observed_calls_jax": 1, + "report_rows": 0, + "report_vs_timed_arm_max_rel_diff": 4.123155750436712e-07 + }, + "lanes_certified": [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null + ], + "lanes_passes": [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null + ], + "uncertified_lanes": null, + "per_lane_certification_note": "Not applicable: a library-PDIP row has no certificate or pass count.", + "gate": { + "pre_registered": true, + "gated": [ + "per lane: jit(vmap) arm vs jit(vmap) library PDIP <= lane_rtol relative", + "per lane: scalar jit arm vs scalar jit library PDIP <= lane_rtol relative" + ], + "recorded_not_gated": [ + "per lane: jit(vmap) arm vs scalar jit arm (rel_diff, abs_diff_nats)", + "per lane: jit(vmap) library PDIP vs scalar jit library PDIP", + "uncertified_lanes (certified_fallback=none rows)" + ], + "lanes_failed": 5, + "passed": false, + "policy_eligible": false, + "note": "Pre-registered before submission (module docstring; submit header). Phase 3 (results/notes/hst_gpu_residue_phase3_psf_2026_09.md) placed phase 2's ~2.5e-9 certified-vs-PDIP residual BETWEEN the jit(vmap) and scalar-jit compositions, not in the solver \u2014 so each arm is gated against the library-PDIP reference of its OWN composition, and the cross-composition difference is recorded with its nats. A certified_fallback=none row is policy-eligible only if every lane certifies AND passes the gate. Timing is never gated." + }, + "library_revisions": { + "PyAutoArray": { + "head": "3de624b5b91a4efa130dc3cb0a3a0f06f85025a3", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoArray", + "module_file": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/__init__.py" + }, + "PyAutoFit": { + "head": "dd9fbe0aab60c4a57702b1444ca031b317c91331", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoFit", + "module_file": "/mnt/ral/jnightin/PyAuto/PyAutoFit/autofit/__init__.py" + }, + "PyAutoGalaxy": { + "head": "70a61e26cd715cefe7012a38285698091246a8a4", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy", + "module_file": "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/__init__.py" + }, + "PyAutoLens": { + "head": "86054bbc19baa2f710a12e04a94fa27ab37cc354", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoLens", + "module_file": "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/__init__.py" + }, + "autoarray_file": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/__init__.py" + } + }, + "headline_arm_note": "`trace`, `hlo_census`, `command_buffers` and `trace_timing` above describe the scalar arm \u2014 the program phase 1 traced. Both arms' full blocks, the lane table and the matched comparison are under `vmap`." +} \ No newline at end of file diff --git a/results/breakdown/imaging/fixed_light_trace_delaunay_jitvmap20_captured_pix2_libpdip_fbon_b16_hpc_a100_fp64_fixed_light_trace.png b/results/breakdown/imaging/fixed_light_trace_delaunay_jitvmap20_captured_pix2_libpdip_fbon_b16_hpc_a100_fp64_fixed_light_trace.png new file mode 100644 index 0000000000000000000000000000000000000000..837fcfdf2d2f28131d80e9fee9943c2b0831a565 GIT binary patch literal 172886 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�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 Q6#k4JKGrtgdZzFH0-vo;kN^Mx literal 0 HcmV?d00001 diff --git a/results/breakdown/imaging/fixed_light_trace_delaunay_jitvmap20_captured_pix1_libcertified_fboff_b16_hpc_a100_fp64_fixed_light_trace.json b/results/breakdown/imaging/fixed_light_trace_delaunay_jitvmap20_captured_pix1_libcertified_fboff_b16_hpc_a100_fp64_fixed_light_trace.json new file mode 100644 index 000000000..46681866a --- /dev/null +++ b/results/breakdown/imaging/fixed_light_trace_delaunay_jitvmap20_captured_pix1_libcertified_fboff_b16_hpc_a100_fp64_fixed_light_trace.json @@ -0,0 +1,6130 @@ +{ + "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": null, + "cpu_count": 124, + "jax_compilation_cache_dir": "/mnt/ral/jnightin/autolens_profiling_wt/certified-solver-phase-c1-lane-rate/output/jax_cache/fixed_light_lanerate_delaunay_pix1_time_20_certified_off_350768_13", + "autotune_cache_entries_at_start": 0, + "cache_fresh": true, + "nvidia_smi": "NVIDIA A100 80GB PCIe, 35457 MiB, 81920 MiB" + }, + "machine": { + "cpu_model": "AMD EPYC 7702 64-Core Processor", + "cpu_count_os": 124, + "nproc": 4, + "nproc_all": 124, + "nproc_note": "GNU nproc honours OMP_NUM_THREADS, so `nproc` can print 1 on a multi-core host; `nproc_all` is the core count.", + "ram_total": "928298200 kB", + "kernel": "5.14.0-687.50.1.el9_8.x86_64", + "platform": "Linux-5.14.0-687.50.1.el9_8.x86_64-x86_64-with-glibc2.34", + "python": "3.12.4", + "jax_thread_env": { + "NPROC": null + }, + "blas_thread_env": { + "OMP_NUM_THREADS": null, + "OPENBLAS_NUM_THREADS": null, + "MKL_NUM_THREADS": null, + "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" + }, + "precision": "fp64", + "configuration": { + "pixel_scale_arcsec": 0.05, + "mask_radius_arcsec": 3.5, + "image_pixels_masked": 15361, + "over_sampled_pixels": 62752, + "mesh": "delaunay", + "mesh_shape": null, + "source_pixels": 1500, + "source_pixels_requested": null, + "dataset": "hst", + "dataset_sha256": { + "data.fits": "e4e833a28e9c6f6fb023cd85c0d3dde74068720256bc77a240633500e5b04fac", + "noise_map.fits": "315c6266a0acd3ac9c8da82fcd2b45a08697362481fd7a35072bab1658530ba3", + "psf.fits": "8389ba0e8bf4a09b4a561cfc246181a2fb944ed396754cd0ff76fdd22910d303" + }, + "cell_source_sha256": "06a162fcdae6b329384ec33322f443df07215d86e56f0505ac15b3d3473eb432", + "inversion_path": "dense", + "pass_budget": 7, + "pass_budget_basis": "phase 3 (autolens_profiling#255): the smallest ZERO-fallback budget per mesh, the budget a production run fixes. NOT phase 0's certifying budget (2 for Delaunay), which falls back on 67.5 % of a graded draw set and is not a production cost.", + "border_relocator_mode": "cell", + "border_relocator": true, + "border_relocator_note": "'cell' is use_border_relocator=True, which every profiling cell in this family forces; 'library' passes None and takes the shipped config default, which is what production runs. The resolved boolean is what this leg actually ran.", + "routes_selected": [ + "b", + "d" + ], + "trace_calls": 10, + "command_buffers_traced": "off", + "use_mixed_precision": false, + "tau_rel": 1e-09, + "regularization": { + "scheme": "adapt_split", + "inner_coefficient": 0.1, + "outer_coefficient": 10.0, + "signal_scale": 0.1 + }, + "thread_env": { + "n_threads": null, + "vars": [ + "OPENBLAS_NUM_THREADS", + "MKL_NUM_THREADS", + "OMP_NUM_THREADS", + "VECLIB_MAXIMUM_THREADS", + "NUMEXPR_NUM_THREADS" + ], + "set_to": null, + "preexisting": {}, + "overridden": {}, + "note": "Not pinned (legacy variant): recorded as found." + }, + "over_sample_size_lp_rule": { + "sub_size_list": [ + 4, + 2, + 2 + ], + "radial_list": [ + 0.3, + 0.6 + ], + "centre": [ + 0.0, + 0.0 + ] + }, + "vmap_batch": 20, + "lanes": "captured", + "arms": [ + "vmap", + "scalar" + ], + "fallback": "off", + "draw_seed": 0, + "vmap_composition": "jax.jit(jax.vmap(fn))", + "lane_rtol": 1e-09, + "vmap_flags_note": "Strict ProfileCLI.parse_cell_args rejects unknown flags. These keys record the exact batching program and prevent historical vmap(jit) artifacts from being mistaken for current jit(vmap) measurements.", + "solver_source": "library", + "solver": "certified", + "certified_fallback": "none", + "certified_pass_budget": 16, + "captured_pass": "time", + "batches": "/mnt/ral/jnightin/autolens_profiling_wt/certified-solver-phase-c1-lane-rate/results/breakdown/imaging/nautilus_batches_delaunay_pix1.npz" + }, + "solver_injection": { + "patched": null, + "part_v": "none \u2014 library mode selects the solver through al.Settings", + "part_b_route_d": { + "patched": "autoarray.inversion.inversion.inversion_util.reconstruction_positive_only_from", + "pass_budget": 7, + "fallback": true + }, + "note": "Library mode (phase B, #300): PART V's arms and references run the library's own positive-only solve, selected by Settings(positive_only_solver, certified_fallback, certified_pass_budget); nothing is injected. PART B's single-call route d (the fiducial d == b pin) still uses the phase-1 harness injection at the phase-3 budget and is not a phase-B row. The untimed certification report observes the library solve (library_solver_observed) without changing it." + }, + "routes": { + "b_s3_pdip": { + "label": "S3 PDIP (source-only)", + "status": "ok", + "solver": "library", + "ms": 50.878148099945975, + "log_likelihood": 29155.000174252804 + }, + "d_s3_certified_fallback": { + "label": "S3 certified active set, budget 7, PDIP fallback", + "status": "ok", + "solver": "harness-injected certified active set", + "pass_budget": 7, + "fallback": true, + "injected_solver_calls_jax": 1, + "injected_solver_calls_numpy": 0, + "ms": 31.497855800262187, + "log_likelihood": 29155.000173664765 + } + }, + "equivalence_pins": [ + { + "pin": "route d (certified, fallback) == route b (library PDIP)", + "route": "d_s3_certified_fallback", + "reference": "b_s3_pdip", + "expectation": "the certified active set returns the library's own positive solution", + "rtol": 1e-09, + "got": 29155.000173664765, + "reference_value": 29155.000174252804, + "rel_diff": 2.0169413578628726e-11, + "status": "PASS" + } + ], + "equivalence_rtol": 1e-09, + "reference": { + "log_evidence_s0_library": 29155.00017433923, + "log_evidence_s3_library": 29155.000174339304, + "s3": { + "n_params": 1500, + "n_mapper": 1500, + "n_funcs": 0, + "edge_zeroed_pixels": 0, + "subtracted_light_flux": 5105.448603818575 + } + }, + "command_buffers": { + "wall_on_ms": 686.2691859001643, + "wall_off_ms": 691.6505541001243, + "command_buffer_delta_ms": 5.381368199959979, + "command_buffer_delta_pct": 0.7841483066009085, + "traced": "off", + "compiler_option": "xla_gpu_enable_command_buffer", + "probe": { + "note": "Not taken in --vmap-batch mode: the CUPTI-inside-a-CUDA-graph probe is a phase-1 diagnostic about the JOIN, and this mode already compiles and times both the command-buffers ON and OFF executable of every arm." + }, + "note": "ONE lowering, TWO compilations, one process. wall_on_ms is the PRODUCTION program (CUDA graphs as XLA ships them) and is the number comparable to phase 5's row; wall_off_ms is the graph-less program the stage rows attribute. The delta is the launch overhead the graphs remove \u2014 it lands in device_idle and host_outside_span, not in any stage. Reconciliation is computed against wall_off_ms." + }, + "trace": { + "parser": "ProfileData.from_file(xplane) + as_text() + stack_frame_index(proto field 17)", + "stage_audit": { + "mixed_fusion": [ + { + "instruction": "loop_divide_gather_fusion", + "ms": 1.014830575, + "opcode": "fusion", + "shape": "(f64[15361,1,1,1500]{3,2,1,0}, f64[15361,1,1,1500]{3,2,1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:133", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:133 (curvature_matrix_via_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:93 (InversionImagingMapping.curvature_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:389 (AbstractInversion.curvature_reg_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "loop_broadcast_fusion.4", + "ms": 0.22561039500000007, + "opcode": "fusion", + "shape": "f64[1500,180,180]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "input_reduce_fusion.5", + "ms": 0.12116068500000002, + "opcode": "fusion", + "shape": "f64[92,1500]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/inversion_imaging_util.py:123", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/inversion_imaging_util.py:123 (data_vector_via_blurred_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:67 (InversionImagingMapping.data_vector)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:699 (AbstractInversion.reconstruction)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "input_reduce_fusion.9", + "ms": 0.11469936500000001, + "opcode": "fusion", + "shape": "f64[15361]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:163", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:163 (mapped_reconstructed_data_via_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:120 (InversionImagingMapping._mapped_reconstructed_data_dict_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:196 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "loop_broadcast_fusion.2", + "ms": 0.11041876500000011, + "opcode": "fusion", + "shape": "f64[15361,1500]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:342", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:342 (mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/abstract.py:283 (Mapper.mapping_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:91 (AbstractInversionImaging._mapping_matrix_for_convolution_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:137 (AbstractInversionImaging.operated_mapping_matrix_list)" + ] + }, + { + "instruction": "input_multiply_transpose_fusion", + "ms": 0.10953336000000004, + "opcode": "fusion", + "shape": "(f64[1500,1500]{1,0}, f64[1500,1500]{1,0}, f64[1500,1500]{1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:237 (active_set_search)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:293 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:274 (_certified_positive_only_from)" + ] + } + ], + "border_relocator": [ + { + "instruction": "eigh.45", + "ms": 0.0745658599999995, + "opcode": "custom-call", + "shape": "(f64[2,2]{0,1}, f64[2]{0}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:245", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:245 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:454 (BorderRelocator.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:176 (AbstractMesh.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:214 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "custom-call.2", + "ms": 0.007951620000000019, + "opcode": "custom-call", + "shape": "(f64[2,2]{1,0}, s8[4194304]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:242", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:242 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:454 (BorderRelocator.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:176 (AbstractMesh.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:214 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "input_reduce_fusion.10", + "ms": 0.005889879999999996, + "opcode": "fusion", + "shape": "(f64[], f64[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:269", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:269 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:454 (BorderRelocator.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:176 (AbstractMesh.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:214 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "loop_add_fusion.3", + "ms": 0.003586034999999997, + "opcode": "fusion", + "shape": "f64[15361]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:308", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:308 (relocated_grid_via_ellipse_border_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:423 (BorderRelocator.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:83 (AbstractMesh.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:208 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "loop_add_fusion.5", + "ms": 0.003427964999999993, + "opcode": "fusion", + "shape": "f64[1500]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:308", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:308 (relocated_grid_via_ellipse_border_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:458 (BorderRelocator.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:176 (AbstractMesh.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:214 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "input_concatenate_fusion.12", + "ms": 0.0024041449999999977, + "opcode": "fusion", + "shape": "f64[392,2]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:238", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:238 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:454 (BorderRelocator.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:176 (AbstractMesh.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:214 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + } + ], + "mesh_construction": [ + { + "instruction": "input_concatenate_fusion.7", + "ms": 0.001939029999999998, + "opcode": "fusion", + "shape": "f64[1500,2]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:820", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:820 (InterpolatorDelaunay.mesh_grid_xy)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:847 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + } + ], + "mesh_qhull_callback": [ + { + "instruction": "pure_callback.4", + "ms": 0.010609819999999987, + "opcode": "custom-call", + "shape": "(s32[3000,3]{1,0}, s32[3000,3]{1,0}, s32[1500]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:161", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:161 (_jax_delaunay_tables)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:405 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + } + ], + "other": [ + { + "instruction": "copy.80", + "ms": 0.0416873749999986, + "opcode": "copy", + "shape": "f64[1,1024,2]{2,1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "copy.48", + "ms": 0.01709492000000022, + "opcode": "copy", + "shape": "s32[21361]{0}", + "source": "", + "stack": [] + }, + { + "instruction": "copy.53", + "ms": 0.002002704999999998, + "opcode": "copy", + "shape": "s64[1500]{0}", + "source": "", + "stack": [] + }, + { + "instruction": "copy.79", + "ms": 0.0017998299999999966, + "opcode": "copy", + "shape": "s32[]", + "source": "", + "stack": [] + }, + { + "instruction": "copy.78", + "ms": 0.0017754899999999996, + "opcode": "copy", + "shape": "s64[]", + "source": "", + "stack": [] + }, + { + "instruction": "copy.39", + "ms": 0.0016524749999999953, + "opcode": "copy", + "shape": "s32[]", + "source": "", + "stack": [] + } + ], + "mesh_seed_argmin": [ + { + "instruction": "input_reduce_fusion", + "ms": 0.14850283000000372, + "opcode": "fusion", + "shape": "(f64[1024]{0}, s64[1024]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:191", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:191 (_nearest_vertex_seed_from..argmin_chunk)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204 (_nearest_vertex_seed_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:351 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)" + ] + }, + { + "instruction": "loop_dynamic_update_slice_fusion", + "ms": 0.04091853499999826, + "opcode": "fusion", + "shape": "s32[21,1024]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204 (_nearest_vertex_seed_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:351 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "loop_add_fusion", + "ms": 0.031879360000000044, + "opcode": "fusion", + "shape": "s64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204 (_nearest_vertex_seed_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:351 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "loop_broadcast_fusion", + "ms": 0.0019465549999999965, + "opcode": "fusion", + "shape": "s32[21,1024]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204 (_nearest_vertex_seed_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:351 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "pdip_solve": [ + { + "instruction": "cholesky.50", + "ms": 7.571322239999946, + "opcode": "custom-call", + "shape": "(f64[1500,1500]{0,1}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:252 (active_set_search..body_fun)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:262 (active_set_search)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:293 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)" + ] + }, + { + "instruction": "triangular-solve.1", + "ms": 1.3521416300000395, + "opcode": "custom-call", + "shape": "(f64[1500,1]{0,1}, s8[0]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:154", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:154 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:252 (active_set_search..body_fun)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:262 (active_set_search)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:293 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)" + ] + }, + { + "instruction": "triangular-solve", + "ms": 1.1715294199999895, + "opcode": "custom-call", + "shape": "(f64[1500,1]{0,1}, s8[0]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:154", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:154 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:252 (active_set_search..body_fun)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:262 (active_set_search)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:293 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)" + ] + }, + { + "instruction": "cholesky.70", + "ms": 0.8921585999999985, + "opcode": "custom-call", + "shape": "(f64[1500,1500]{0,1}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:297 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:274 (_certified_positive_only_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:496 (reconstruction_positive_only_from)" + ] + }, + { + "instruction": "cholesky.60", + "ms": 0.8642273799999994, + "opcode": "custom-call", + "shape": "(f64[1500,1500]{0,1}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:237 (active_set_search)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:293 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:274 (_certified_positive_only_from)" + ] + }, + { + "instruction": "input_transpose_fusion", + "ms": 0.2996470950000008, + "opcode": "fusion", + "shape": "f64[1500,1500]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:252 (active_set_search..body_fun)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:262 (active_set_search)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:293 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)" + ] + } + ], + "regularization_H": [ + { + "instruction": "input_scatter_fusion.10", + "ms": 0.0020590249999999947, + "opcode": "fusion", + "shape": "f64[1500,1500]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:615", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:615 (pixel_splitted_regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt_split.py:137 (AdaptSplit.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:332 (AbstractInversion.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "input_concatenate_fusion.8", + "ms": 0.0018705649999999972, + "opcode": "fusion", + "shape": "pred[3]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:93", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:93 (split_points_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:410 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + }, + { + "instruction": "input_concatenate_fusion.9", + "ms": 0.0018559750000000012, + "opcode": "fusion", + "shape": "pred[3]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:91", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:91 (split_points_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:410 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + }, + { + "instruction": "input_concatenate_fusion.10", + "ms": 0.0018550400000000016, + "opcode": "fusion", + "shape": "pred[3]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:90", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:90 (split_points_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:410 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + }, + { + "instruction": "input_concatenate_fusion", + "ms": 0.0017529450000000014, + "opcode": "fusion", + "shape": "s32[1500,2]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:615", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:615 (pixel_splitted_regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt_split.py:137 (AdaptSplit.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:332 (AbstractInversion.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "input_concatenate_fusion.11", + "ms": 0.0015462449999999988, + "opcode": "fusion", + "shape": "pred[3]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:88", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:88 (split_points_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:410 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + } + ], + "mesh_locate_walk": [ + { + "instruction": "input_reduce_fusion.1", + "ms": 0.025416295000000685, + "opcode": "fusion", + "shape": "pred[196]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:288", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:288 (_walk_from_seed..cond)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:353 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)" + ] + }, + { + "instruction": "loop_reduce_fusion", + "ms": 0.025351530000000278, + "opcode": "fusion", + "shape": "(f64[21361]{0}, s64[21361]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:264", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:264 (_walk_from_seed..walk_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:292 (_walk_from_seed..body)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:264 (_walk_from_seed..walk_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:292 (_walk_from_seed..body)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)" + ] + }, + { + "instruction": "loop_or_select_fusion", + "ms": 0.022417385000000328, + "opcode": "fusion", + "shape": "(s32[21361]{0}, pred[21361]{0}, pred[21361]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:270", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:270 (_walk_from_seed..walk_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:292 (_walk_from_seed..body)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:353 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)" + ] + }, + { + "instruction": "loop_select_fusion", + "ms": 0.020096609999999963, + "opcode": "fusion", + "shape": "s32[21361]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:242", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:242 (_walk_from_seed..weights_of)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:262 (_walk_from_seed..walk_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:292 (_walk_from_seed..body)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:353 (pix_indexes_delaunay_walk_from)" + ] + }, + { + "instruction": "input_reduce_fusion.2", + "ms": 0.016372954999999835, + "opcode": "fusion", + "shape": "pred[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:288", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:288 (_walk_from_seed..cond)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:353 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)" + ] + }, + { + "instruction": "while.20", + "ms": 0.014597884999999899, + "opcode": "while", + "shape": "(s32[], s32[21361]{0}, pred[21361]{0}, pred[21361]{0}, s32[3000,3]{1,0}, /*index=5*/f64[1500,2]{1,0}, f64[21361,2]{1,0}, s32[3000,3]{1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:353 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "psf_convolution_mapping_matrix": [ + { + "instruction": "input_scatter_fusion", + "ms": 1.97975727, + "opcode": "fusion", + "shape": "f64[1500,180,180]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "fft.19.0", + "ms": 1.7551799450000005, + "opcode": "fft", + "shape": "f64[1500,180,180]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "fft.15.0", + "ms": 1.3641246450000013, + "opcode": "fft", + "shape": "c128[1500,180,91]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "fft.17.0", + "ms": 0.9786353050000003, + "opcode": "fft", + "shape": "c128[1500,91,180]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "input_transpose_fusion.2", + "ms": 0.5137602899999998, + "opcode": "fusion", + "shape": "c128[1500,91,180]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "wrapped_transpose", + "ms": 0.4983216949999999, + "opcode": "fusion", + "shape": "c128[1500,180,91]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + } + ], + "inversion_other": [ + { + "instruction": "cholesky.80", + "ms": 0.8954901000000013, + "opcode": "custom-call", + "shape": "(f64[1500,1500]{0,1}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986 (AbstractInversion._log_det_symmetric_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:1078 (AbstractInversion.log_det_curvature_reg_matrix_term)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:347 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/model/analysis.py:135 (AnalysisImaging.log_likelihood_function)" + ] + }, + { + "instruction": "cholesky.90", + "ms": 0.8914510800000003, + "opcode": "custom-call", + "shape": "(f64[1500,1500]{0,1}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986 (AbstractInversion._log_det_symmetric_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:1157 (AbstractInversion.log_det_regularization_matrix_term)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:348 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/model/analysis.py:135 (AnalysisImaging.log_likelihood_function)" + ] + }, + { + "instruction": "loop_reduce_window_fusion.1", + "ms": 0.002767499999999998, + "opcode": "fusion", + "shape": "s64[94,16]{1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "loop_reduce_window_fusion", + "ms": 0.0026879849999999956, + "opcode": "fusion", + "shape": "s64[6,16]{1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "loop_broadcast_convert_fusion", + "ms": 0.002175330000000001, + "opcode": "fusion", + "shape": "(s32[1500]{0}, s64[1500]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:527", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:527 (AbstractInversion.zeroed_ids_to_keep)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:567 (AbstractInversion.solve_ids_to_keep)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:684 (AbstractInversion.reconstruction)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "input_scatter_fusion.5", + "ms": 0.001927665000000001, + "opcode": "fusion", + "shape": "s64[1500]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:527", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:527 (AbstractInversion.zeroed_ids_to_keep)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:567 (AbstractInversion.solve_ids_to_keep)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:684 (AbstractInversion.reconstruction)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "mapping_matrix": [ + { + "instruction": "input_reduce_fusion.23", + "ms": 0.0028863699999999914, + "opcode": "fusion", + "shape": "f64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:93", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:93 (adaptive_pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/abstract.py:507 (Mapper.pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt.py:339 (Adapt.regularization_weights_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt_split.py:120 (AdaptSplit.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)" + ] + } + ], + "curvature_matrix_F": [ + { + "instruction": "cublas-lt-matmul.2", + "ms": 4.198070774999998, + "opcode": "custom-call", + "shape": "(f64[1500,1500]{1,0}, s8[4194304]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:134", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:134 (curvature_matrix_via_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:93 (InversionImagingMapping.curvature_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:389 (AbstractInversion.curvature_reg_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "chi_squared_evidence": [ + { + "instruction": "loop_multiply_fusion", + "ms": 0.003009435000000001, + "opcode": "fusion", + "shape": "f64[15361]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/abstract_ndarray.py:300", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/abstract_ndarray.py:300 (AbstractNDArray.__pow__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/abstract_ndarray.py:60 (unwrap_array..wrapper)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/abstract_ndarray.py:35 (to_new_array..wrapper)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_util.py:78 (chi_squared_map_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:78 (AbstractFit.chi_squared_map)" + ] + } + ] + }, + "stage_audit_note": "The HLO instructions that contributed most of each stage's milliseconds, with their full source stack. A stage row is only as good as the rules that built it; this is how a reader checks a row against the HLO instead of trusting it.", + "untraced_wall_ms": 34.56384598001023, + "reconciliation_vs_untraced_pct": 6.815444572783263, + "wall_basis": "wall_ms is the TRACED run's wall, the run these kernel durations came from. untraced_wall_ms is the same executable without the profiler; the difference is the profiler's overhead and belongs in neither the stages nor the idle row.", + "calls": 200, + "call_split": "per-call (first-instruction recurrence)", + "call_blocks": 200, + "events": 99770, + "streams": [ + "Stream #14(MemcpyD2H,Compute,MemcpyH2D,Memset,MemcpyD2D)" + ], + "per_stage_ms": { + "border_relocator": { + "median_ms": 0.10128100000000001, + "min_ms": 0.10073700000000002, + "max_ms": 0.10217800000000002 + }, + "chi_squared_evidence": { + "median_ms": 0.003008, + "min_ms": 0.002816, + "max_ms": 0.003392 + }, + "curvature_matrix_F": { + "median_ms": 4.196892500000001, + "min_ms": 4.178059, + "max_ms": 4.24619 + }, + "inversion_other": { + "median_ms": 1.7981955, + "min_ms": 1.778524, + "max_ms": 1.816411 + }, + "mapping_matrix": { + "median_ms": 0.00288, + "min_ms": 0.002879, + "max_ms": 0.002912 + }, + "memset": { + "median_ms": 0.0345595, + "min_ms": 0.010112999999999999, + "max_ms": 0.05388700000000001 + }, + "mesh_construction": { + "median_ms": 0.001952, + "min_ms": 0.001919, + "max_ms": 0.001953 + }, + "mesh_locate_walk": { + "median_ms": 0.14809750000000002, + "min_ms": 0.13023799999999996, + "max_ms": 0.18329300000000004 + }, + "mesh_qhull_callback": { + "median_ms": 0.01056, + "min_ms": 0.010495, + "max_ms": 0.011104 + }, + "mesh_seed_argmin": { + "median_ms": 0.22323500000000007, + "min_ms": 0.22285000000000008, + "max_ms": 0.22374600000000014 + }, + "mixed_fusion": { + "median_ms": 1.9799594999999997, + "min_ms": 1.9719579999999992, + "max_ms": 1.9930169999999996 + }, + "other": { + "median_ms": 0.065728, + "min_ms": 0.063329, + "max_ms": 0.070016 + }, + "pdip_solve": { + "median_ms": 14.683332, + "min_ms": 2.4254860000000003, + "max_ms": 23.052538000000023 + }, + "psf_convolution_mapping_matrix": { + "median_ms": 7.089918000000001, + "min_ms": 7.074800000000001, + "max_ms": 7.103885 + }, + "regularization_H": { + "median_ms": 0.010912, + "min_ms": 0.010784, + "max_ms": 0.011296 + } + }, + "stage_order": [ + "border_relocator", + "mesh_qhull_callback", + "mesh_seed_argmin", + "mesh_locate_walk", + "mesh_construction", + "mapping_matrix", + "psf_convolution_mapping_matrix", + "curvature_matrix_F", + "regularization_H", + "pdip_solve", + "chi_squared_evidence", + "inversion_other", + "mixed_fusion", + "other", + "memset" + ], + "mixed_fusion": { + "ms": 1.9799594999999997, + "constituent_stage_sets": { + "curvature_matrix_F + psf_convolution_mapping_matrix": 1.014830575, + "pdip_solve + psf_convolution_mapping_matrix": 0.22561039500000007, + "data_vector_D + pdip_solve": 0.12483967000000015, + "mapped_reconstruction + pdip_solve": 0.11469936500000001, + "mapping_matrix + pdip_solve": 0.11277122500000009, + "curvature_reg_reduce_gather + inversion_other + mapped_reconstruction + pdip_solve + reconstruction_scatter": 0.10953336000000004, + "pdip_solve + regularization_H": 0.045041625000000016, + "inversion_other + pdip_solve + regularization_H": 0.024227685000000013, + "inversion_other + pdip_solve": 0.02283095499999999, + "inversion_other + mapping_matrix + mesh_construction + mesh_dual_areas + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin + pdip_solve": 0.021145820000000003, + "inversion_other + mesh_construction + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin + pdip_solve + regularization_H": 0.019092000000000015, + "inversion_other + mesh_construction + mesh_dual_areas + mesh_interpolation_weights + pdip_solve + regularization_H": 0.014647434999999995, + "pdip_solve + ray_trace_data_grid": 0.013688684999999956, + "border_relocator + pdip_solve": 0.013573504999999991, + "inversion_other + mapping_matrix + mesh_construction + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin": 0.011668704999999996, + "grids_and_structures + mass_profile_deflections + pdip_solve": 0.010161980000000003, + "grids_and_structures + mass_profile_deflections + pdip_solve + ray_trace_data_grid": 0.009011490000000004, + "chi_squared_evidence + pdip_solve": 0.007725344999999981, + "inversion_other + mesh_construction + mesh_seed_argmin + pdip_solve + regularization_H": 0.006955930000000005, + "inversion_other + mesh_dual_areas + mesh_locate_walk": 0.006663660000000058, + "inversion_other + mesh_construction + pdip_solve + regularization_H": 0.006492274999999981, + "grids_and_structures + mass_profile_deflections + ray_trace_data_grid": 0.0054911500000000045, + "inversion_other + pdip_solve + ray_trace_data_grid": 0.005259500000000019, + "inversion_other + regularization_H": 0.005234534999999999, + "inversion_other + mapped_reconstruction + pdip_solve + reconstruction_scatter": 0.004753875, + "inversion_other + mapped_reconstruction + pdip_solve": 0.0037404800000000035, + "mapping_matrix + pdip_solve + regularization_H": 0.003474379999999996, + "inversion_other + mesh_construction + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin": 0.00310092, + "inversion_other + mesh_construction + mesh_dual_areas + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin": 0.002918069999999999, + "inversion_other + mesh_construction + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin + regularization_H": 0.0026831799999999986, + "inversion_other + mesh_dual_areas + mesh_locate_walk + pdip_solve": 0.0025835149999999946, + "inversion_other + mesh_locate_walk + mesh_seed_argmin": 0.0024814150000000037, + "inversion_other + mesh_interpolation_weights": 0.0021529750000000053, + "chi_squared_evidence + inversion_other": 0.0019567950000000003 + }, + "example_kernels": { + "curvature_matrix_F + psf_convolution_mapping_matrix": [ + "loop_divide_gather_fusion" + ], + "pdip_solve + psf_convolution_mapping_matrix": [ + "loop_broadcast_fusion.4" + ], + "data_vector_D + pdip_solve": [ + "input_reduce_fusion.5", + "input_reduce_fusion.21" + ], + "mapped_reconstruction + pdip_solve": [ + "input_reduce_fusion.9" + ], + "mapping_matrix + pdip_solve": [ + "loop_broadcast_fusion.2", + "loop_divide_fusion" + ], + "curvature_reg_reduce_gather + inversion_other + mapped_reconstruction + pdip_solve + reconstruction_scatter": [ + "input_multiply_transpose_fusion" + ], + "pdip_solve + regularization_H": [ + "loop_select_fusion.2", + "input_transpose_fusion.3" + ], + "inversion_other + pdip_solve + regularization_H": [ + "input_transpose_fusion.4" + ], + "inversion_other + pdip_solve": [ + "input_reduce_fusion.7", + "loop_log_fusion", + "input_reduce_fusion.8", + "input_reduce_fusion.12" + ], + "inversion_other + mapping_matrix + mesh_construction + mesh_dual_areas + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin + pdip_solve": [ + "input_scatter_fusion.6", + "input_scatter_fusion.3" + ] + }, + "prorated_estimate_ms": { + "psf_convolution_mapping_matrix": 0.620220485, + "curvature_matrix_F": 0.5074152875, + "pdip_solve": 0.39283176865476194, + "mapped_reconstruction": 0.08169164991666669, + "inversion_other": 0.06827755598809528, + "data_vector_D": 0.062419835000000076, + "mapping_matrix": 0.062131750833333374, + "regularization_H": 0.04300222082142858, + "reconstruction_scatter": 0.02309514075000001, + "curvature_reg_reduce_gather": 0.02190667200000001, + "mesh_construction": 0.01432465982142857, + "ray_trace_data_grid": 0.012680764999999986, + "mesh_locate_walk": 0.01256340298809526, + "mesh_interpolation_weights": 0.012386892571428575, + "mesh_seed_argmin": 0.011087490238095243, + "mesh_dual_areas": 0.008437910416666684, + "grids_and_structures": 0.007470582500000003, + "mass_profile_deflections": 0.007470582500000003, + "border_relocator": 0.0067867524999999955, + "chi_squared_evidence": 0.004841069999999991 + }, + "prorated_note": "ESTIMATE ONLY \u2014 a mixed fusion's time split equally across the stages its constituents span. Never summed into the measured table, never reconciled." + }, + "other_sources_ms": { + "copy.80": 0.0416873749999986, + "copy.48": 0.01709492000000022, + "copy.53": 0.002002704999999998, + "copy.79": 0.0017998299999999966, + "copy.78": 0.0017754899999999996, + "copy.39": 0.0016524749999999953 + }, + "device_span_ms": 35.60909475, + "device_busy_ms": 29.040079504999998, + "device_idle_ms": 6.569015244999999, + "largest_idle_gaps": [ + { + "gap_ms": 5.50344, + "after": "pure_callback.4", + "before": "pure_callback.4" + }, + { + "gap_ms": 0.140541, + "after": "input_transpose_fusion", + "before": "triangular-solve" + }, + { + "gap_ms": 0.031455, + "after": "pure_callback.4", + "before": "copy.79" + }, + { + "gap_ms": 0.028447, + "after": "while.20", + "before": "loop_add_fusion.4" + }, + { + "gap_ms": 0.028351, + "after": "input_concatenate_fusion.7", + "before": "pure_callback.4" + }, + { + "gap_ms": 0.028319, + "after": "input_reduce_fusion.20", + "before": "loop_broadcast_fusion.4" + }, + { + "gap_ms": 0.023904, + "after": "copy.48", + "before": "input_reduce_fusion.1" + }, + { + "gap_ms": 0.019039, + "after": "input_scatter_fusion.7", + "before": "loop_reduce_fusion.1" + } + ], + "kernel_ms": 30.350510500000002, + "sum_ms": 36.919525745, + "wall_ms": 35.613951534996886, + "host_outside_span_ms": 0.004856784996889019, + "reconciliation_pct": 3.6659066285305695, + "unjoined_ms": 0.0, + "unjoined_pct": 0.0, + "other_ms": 0.065728, + "other_pct": 0.1845568861838059, + "note": "Stage rows attribute the command-buffers-OFF program (see the module docstring): kernel times are the same, the launch overhead the CUDA graphs remove is not. sum_ms = kernel rows + device_idle_ms; the residual against wall_ms is host_outside_span_ms (dispatch before the first kernel, teardown after the last).", + "per_stage_ms_per_lane": { + "border_relocator": 0.10128100000000001, + "chi_squared_evidence": 0.003008, + "curvature_matrix_F": 4.196892500000001, + "inversion_other": 1.7981955, + "mapping_matrix": 0.00288, + "memset": 0.0345595, + "mesh_construction": 0.001952, + "mesh_locate_walk": 0.14809750000000002, + "mesh_qhull_callback": 0.01056, + "mesh_seed_argmin": 0.22323500000000007, + "mixed_fusion": 1.9799594999999997, + "other": 0.065728, + "pdip_solve": 14.683332, + "psf_convolution_mapping_matrix": 7.089918000000001, + "regularization_H": 0.010912 + }, + "per_lane_divisor": 1, + "host_callback": { + "pure_callback_span_ms": 99.9314493, + "qhull_ms": 93.31271309999998, + "callback_body_ms_note": "the OUTERMOST matching body event, not a sum: under the probe the body appears twice (the wrapper and the timed re-implementation it calls) and summing them would count the same work twice", + "events_by_name": { + "pure_callback.4": { + "count": 200, + "ms": 99.9314493 + }, + "$callback.py:815 _wrapped_callback": { + "count": 200, + "ms": 98.30340699999998 + }, + "$callback.py:224 _callback": { + "count": 200, + "ms": 97.8397079 + }, + "$callback.py:74 pure_callback_impl": { + "count": 200, + "ms": 97.6615542 + }, + "$callback.py:69 __call__": { + "count": 200, + "ms": 93.62564410000006 + }, + "$delaunay.py:162 ": { + "count": 200, + "ms": 93.48909439999997 + }, + "$host_callback_probe.py:225 wrapped": { + "count": 200, + "ms": 93.31271309999998 + }, + "$host_callback_probe.py:160 _timed_tri_only": { + "count": 200, + "ms": 93.15025310000003 + }, + "ThenExecuteCallback:GetEventForComputeStreamSyncPoint": { + "count": 200, + "ms": 0.36440779999999984 + }, + "$callback.py:822 ": { + "count": 800, + "ms": 0.2796993999999996 + }, + "$__init__.py:132 _xla_gc_callback": { + "count": 2, + "ms": 0.00037200000000000004 + } + }, + "note": "HOST milliseconds per traced BATCH (the whole invocation), aggregated by name because the events nest. Not a row of the device table: the device pays for them as the idle gaps largest_idle_gaps names." + }, + "host_callback_ms": 99.9314493 + }, + "hlo_census": { + "status": "excluded", + "reason": "The legacy census anchors PyAutoArray source line numbers that moved after the phase-1 run. No batched attribution is published from unsupported anchors; the device-event table and wall reconciliation remain valid." + }, + "stage_map_provenance": [ + { + "label": "log_det_curvature_reg", + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 850, + 882 + ], + "requires": { + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 884, + 896 + ] + }, + "function": null + }, + { + "label": "log_det_regularization", + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 850, + 882 + ], + "requires": { + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 897, + 943 + ] + }, + "function": null + }, + { + "label": "curvature_reg_add", + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 359, + 372 + ], + "requires": null, + "function": null + }, + { + "label": "curvature_reg_reduce_gather", + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 374, + 398 + ], + "requires": null, + "function": null + }, + { + "label": "edge_subset_gather", + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 606, + 614 + ], + "requires": null, + "function": null + }, + { + "label": "regularization_term", + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 786, + 849 + ], + "requires": null, + "function": null + }, + { + "label": "mapped_reconstruction", + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 722, + 785 + ], + "requires": null, + "function": null + }, + { + "label": "reconstruction_scatter", + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 583, + 605 + ], + "requires": null, + "function": null + }, + { + "label": "reconstruction_scatter", + "path": "PyAutoArray/autoarray/inversion/inversion/abstract.py", + "lines": [ + 615, + 721 + ], + "requires": null, + "function": null + }, + { + "label": "certified_active_set_solve", + "path": "likelihood_breakdown/active_set_steps.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "certified_active_set_solve", + "path": "likelihood_breakdown/library_solver_injection.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "pdip_solve", + "path": "PyAutoArray/autoarray/util/jax_nnls.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "pdip_solve", + "path": "PyAutoArray/autoarray/inversion/inversion/inversion_util.py", + "lines": [ + 256, + 488 + ], + "requires": null, + "function": null + }, + { + "label": "mapped_reconstruction", + "path": "PyAutoArray/autoarray/inversion/inversion/inversion_util.py", + "lines": [ + 156, + 200 + ], + "requires": null, + "function": null + }, + { + "label": "curvature_matrix_F", + "path": "PyAutoArray/autoarray/inversion/inversion/inversion_util.py", + "lines": [ + 12, + 155 + ], + "requires": null, + "function": null + }, + { + "label": "reconstruction_scatter", + "path": "PyAutoArray/autoarray/inversion/inversion/inversion_util.py", + "lines": [ + 201, + 255 + ], + "requires": null, + "function": null + }, + { + "label": "data_vector_D", + "path": "PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py", + "lines": [ + 54, + 73 + ], + "requires": null, + "function": null + }, + { + "label": "curvature_matrix_F", + "path": "PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py", + "lines": [ + 74, + 110 + ], + "requires": null, + "function": null + }, + { + "label": "data_vector_D", + "path": "PyAutoArray/autoarray/inversion/inversion/imaging/inversion_imaging_util.py", + "lines": null, + "requires": null, + "function": "data_vector_via_blurred_mapping_matrix_from" + }, + { + "label": "curvature_matrix_F", + "path": "PyAutoArray/autoarray/inversion/inversion/imaging/inversion_imaging_util.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "psf_convolution_mapping_matrix", + "path": "likelihood_breakdown/psf_cube_injection.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "psf_convolution_mapping_matrix", + "path": "PyAutoArray/autoarray/operators/convolver.py", + "lines": [ + 1086, + 1300 + ], + "requires": null, + "function": null + }, + { + "label": "psf_convolution_mapping_matrix", + "path": "PyAutoArray/autoarray/operators/convolver.py", + "lines": [ + 632, + 642 + ], + "requires": null, + "function": null + }, + { + "label": "psf_convolution_mapping_matrix", + "path": "PyAutoArray/autoarray/operators/convolver.py", + "lines": [ + 670, + 691 + ], + "requires": null, + "function": null + }, + { + "label": "psf_convolution_mapping_matrix", + "path": "PyAutoArray/autoarray/operators/convolver.py", + "lines": null, + "requires": { + "path": "PyAutoArray/autoarray/operators/convolver.py", + "lines": [ + 1086, + 1300 + ] + }, + "function": null + }, + { + "label": "psf_convolution_mapping_matrix", + "path": "PyAutoArray/autoarray/operators/convolver.py", + "lines": null, + "requires": { + "path": "PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py", + "lines": [ + 119, + 150 + ] + }, + "function": null + }, + { + "label": "psf_convolution_image", + "path": "PyAutoArray/autoarray/operators/convolver.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "psf_convolution_mapping_matrix", + "path": "PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py", + "lines": [ + 119, + 150 + ], + "requires": null, + "function": null + }, + { + "label": "mesh_qhull_callback", + "path": "PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py", + "lines": [ + 139, + 172 + ], + "requires": null, + "function": null + }, + { + "label": "mesh_seed_argmin", + "path": "PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py", + "lines": [ + 173, + 207 + ], + "requires": null, + "function": null + }, + { + "label": "mesh_locate_walk", + "path": "PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py", + "lines": [ + 208, + 372 + ], + "requires": null, + "function": null + }, + { + "label": "mesh_dual_areas", + "path": "PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py", + "lines": [ + 373, + 396 + ], + "requires": null, + "function": null + }, + { + "label": "mesh_dual_areas", + "path": "PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py", + "lines": [ + 437, + 494 + ], + "requires": null, + "function": null + }, + { + "label": "mesh_dual_areas", + "path": "PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py", + "lines": [ + 605, + 615 + ], + "requires": null, + "function": null + }, + { + "label": "mesh_interpolation_weights", + "path": "PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py", + "lines": [ + 616, + 695 + ], + "requires": null, + "function": null + }, + { + "label": "mesh_interpolation_weights", + "path": "PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py", + "lines": [ + 896, + 1000 + ], + "requires": null, + "function": null + }, + { + "label": "mesh_construction", + "path": "PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "border_relocator", + "path": "PyAutoArray/autoarray/inversion/mesh/border_relocator.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "mesh_construction", + "path": "PyAutoArray/autoarray/inversion/mesh/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "mapping_matrix", + "path": "PyAutoArray/autoarray/inversion/mappers/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "mapping_matrix", + "path": "PyAutoArray/autoarray/inversion/mappings/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "mapping_matrix", + "path": "PyAutoArray/autoarray/inversion/linear_obj/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "regularization_H", + "path": "PyAutoArray/autoarray/inversion/regularization/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "chi_squared_evidence", + "path": "PyAutoArray/autoarray/fit/fit_util.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "chi_squared_evidence", + "path": "PyAutoArray/autoarray/fit/fit_dataset.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "ray_trace_mesh_grid", + "path": "PyAutoLens/autolens/lens/to_inversion.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "ray_trace_mesh_grid", + "path": "PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "mass_profile_deflections", + "path": "PyAutoGalaxy/autogalaxy/profiles/mass/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "light_profile_image", + "path": "PyAutoGalaxy/autogalaxy/profiles/light/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "light_profile_image", + "path": "PyAutoGalaxy/autogalaxy/operate/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "ray_trace_data_grid", + "path": "PyAutoLens/autolens/lens/tracer.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "ray_trace_data_grid", + "path": "PyAutoLens/autolens/lens/tracer_util.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "grids_and_structures", + "path": "PyAutoArray/autoarray/structures/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "grids_and_structures", + "path": "PyAutoArray/autoarray/operators/over_sampling/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "grids_and_structures", + "path": "PyAutoArray/autoarray/geometry/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "inversion_other", + "path": "PyAutoArray/autoarray/inversion/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "fit_imaging_other", + "path": "PyAutoLens/autolens/imaging/fit_imaging.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "fit_imaging_other", + "path": "PyAutoGalaxy/autogalaxy/imaging/fit_imaging.py", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "fit_imaging_other", + "path": "PyAutoArray/autoarray/fit/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "analysis_other", + "path": "PyAutoLens/autolens/analysis/", + "lines": null, + "requires": null, + "function": null + }, + { + "label": "analysis_other", + "path": "PyAutoGalaxy/autogalaxy/analysis/", + "lines": null, + "requires": null, + "function": null + } + ], + "trace_timing": { + "traced_wall_ms": 35.613951534996886, + "untraced_wall_ms": 34.56384598001023, + "profiler_overhead_ms": 1.0501055549866578, + "profiler_overhead_pct": 3.0381617705216586 + }, + "jit_phases": { + "b_s3_pdip_library_likelihood_jit": { + "lower_s": 1.4973016289986845, + "compile_s": 4.446675585000776, + "first_call_s": 0.15088251099950867, + "steady_per_call_s": 0.05087814809994597 + }, + "d_s3_certified_fallback_library_likelihood_jit": { + "lower_s": 0.4865443349990528, + "compile_s": 4.247194718001992, + "first_call_s": 0.06678787000055308, + "steady_per_call_s": 0.03149785580026219 + } + }, + "peak_bytes": { + "after_setup": 85108992, + "after_routes": 1181653248, + "after_all": 23614093824, + "note": "jax.devices()[0].memory_stats()['peak_bytes_in_use']; None on a backend that does not report it (CPU). Process-wide high-water marks." + }, + "note": "Every stage row is a MEASURED sum of GPU kernel durations joined to library source through the optimized HLO of ONE program \u2014 not arithmetic across compilations. The rows attribute the command-buffers-OFF program: kernel time is the same as production, the launch overhead the CUDA graphs remove is not, and command_buffers.* carries both walls and their delta. sum_ms = kernel rows + measured device_idle_ms; the residual against the wall is host_outside_span_ms and is reported, not absorbed. mixed_fusion.prorated_estimate_ms is an ESTIMATE and is never part of the table. No row may be quoted if reconciliation_pct is outside 5 % or unjoined_ms is non-zero.", + "vmap": { + "batch": 20, + "lanes_mode": "captured", + "arms": [ + "vmap", + "scalar" + ], + "draw_seed": 0, + "fallback": false, + "composition": "jax.jit(jax.vmap(fn))", + "composition_provenance": "Current Fitness._vmap after PyAutoFit#1638. Array 343376 used the retired jax.vmap(jax.jit(fn)) composition and is historical evidence only.", + "headline_arm": "scalar", + "lane_rtol": 1e-09, + "lanes": [ + { + "lane": 0, + "draw_name": "call00015_lane00", + "draw_kind": "captured", + "offsets": { + "centre_0": -0.0033655095107821688, + "centre_1": 0.004631951955766499, + "ell_comps_0": 0.000564301988937442, + "ell_comps_1": -0.00879076787683888, + "einstein_radius": 0.018337010967920175 + }, + "log_likelihood_vmap": 24758.506194309342, + "log_likelihood_scalar": 24758.506194309346, + "log_likelihood_library_pdip": 24758.50619430915, + "log_likelihood_library_pdip_scalar": 24758.506194309153, + "rel_diff_vmap_vs_library_pdip": 7.787742736279448e-15, + "rel_diff_scalar_vs_library_pdip_scalar": 7.787742736279447e-15, + "abs_diff_nats": 3.637978807091713e-12, + "rel_diff": 1.4693854219395068e-16, + "rel_diff_scalar_vs_library_pdip": 7.9346812784734e-15, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 3.637978807091713e-12, + "rel_diff_library_pdip_vmap_vs_scalar": 1.4693854219395182e-16, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": true, + "passes": 10, + "pdip_iter": null + }, + { + "lane": 1, + "draw_name": "call00015_lane01", + "draw_kind": "captured", + "offsets": { + "centre_0": -0.004311760382151672, + "centre_1": 0.0027192789928108052, + "ell_comps_0": 0.0061667694809026535, + "ell_comps_1": 0.003465536775180321, + "einstein_radius": -0.05732579988501185 + }, + "log_likelihood_vmap": 20552.706459415946, + "log_likelihood_scalar": 20552.706459415127, + "log_likelihood_library_pdip": 20551.00488777265, + "log_likelihood_library_pdip_scalar": 20551.004887772448, + "rel_diff_vmap_vs_library_pdip": 8.279749105148112e-05, + "rel_diff_scalar_vs_library_pdip_scalar": 8.279749102156523e-05, + "abs_diff_nats": 8.185452315956354e-10, + "rel_diff": 3.982663953343539e-14, + "rel_diff_scalar_vs_library_pdip": 8.279749101165118e-05, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 2.0372681319713593e-10, + "rel_diff_library_pdip_vmap_vs_scalar": 9.913228784172517e-15, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "FAIL", + "certified": false, + "passes": 16, + "pdip_iter": null + }, + { + "lane": 2, + "draw_name": "call00015_lane02", + "draw_kind": "captured", + "offsets": { + "centre_0": 0.0002796502552123051, + "centre_1": 0.0016003321376979894, + "ell_comps_0": -0.002094430657472772, + "ell_comps_1": 0.006146479068253558, + "einstein_radius": -0.025968910196758177 + }, + "log_likelihood_vmap": -189709.75922536693, + "log_likelihood_scalar": -189709.0677186827, + "log_likelihood_library_pdip": -189709.78218648065, + "log_likelihood_library_pdip_scalar": -189709.0679785746, + "rel_diff_vmap_vs_library_pdip": 1.2103284002386354e-07, + "rel_diff_scalar_vs_library_pdip_scalar": 1.3699498492651947e-09, + "abs_diff_nats": 0.6915066842339002, + "rel_diff": 3.6450903088055186e-06, + "rel_diff_scalar_vs_library_pdip": 3.7661094210204296e-06, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 0.714207906043157, + "rel_diff_library_pdip_vmap_vs_scalar": 3.7647536496453525e-06, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "FAIL", + "certified": true, + "passes": 0, + "pdip_iter": null + }, + { + "lane": 3, + "draw_name": "call00015_lane03", + "draw_kind": "captured", + "offsets": { + "centre_0": 0.004594602299816973, + "centre_1": 0.004924922434755804, + "ell_comps_0": 0.028601845732661953, + "ell_comps_1": 0.003760187047606014, + "einstein_radius": -0.03088526730480501 + }, + "log_likelihood_vmap": -141741.98025945516, + "log_likelihood_scalar": -141741.96681345947, + "log_likelihood_library_pdip": -141741.9783256529, + "log_likelihood_library_pdip_scalar": -141741.96788141696, + "rel_diff_vmap_vs_library_pdip": 1.3643116113597083e-08, + "rel_diff_scalar_vs_library_pdip_scalar": 7.534518587376962e-09, + "abs_diff_nats": 0.0134459956898354, + "rel_diff": 9.486248845079946e-08, + "rel_diff_scalar_vs_library_pdip": 8.121936463253133e-08, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 0.010444235929753631, + "rel_diff_library_pdip_vmap_vs_scalar": 7.368485202979124e-08, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "FAIL", + "certified": true, + "passes": 0, + "pdip_iter": null + }, + { + "lane": 4, + "draw_name": "call00015_lane04", + "draw_kind": "captured", + "offsets": { + "centre_0": -0.0060950290987001, + "centre_1": -0.0006121094560707545, + "ell_comps_0": 0.009637314264800585, + "ell_comps_1": 0.006641580028105454, + "einstein_radius": -0.03125810931551931 + }, + "log_likelihood_vmap": 24880.545932988687, + "log_likelihood_scalar": 24880.545932988724, + "log_likelihood_library_pdip": 24880.545932988694, + "log_likelihood_library_pdip_scalar": 24880.545932988734, + "rel_diff_vmap_vs_library_pdip": 2.92435609483004e-16, + "rel_diff_scalar_vs_library_pdip_scalar": 4.386534142245053e-16, + "abs_diff_nats": 3.637978807091713e-11, + "rel_diff": 1.4621780474150184e-15, + "rel_diff_scalar_vs_library_pdip": 1.169742437932016e-15, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 4.001776687800884e-11, + "rel_diff_library_pdip_vmap_vs_scalar": 1.6083958521565195e-15, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": true, + "passes": 10, + "pdip_iter": null + }, + { + "lane": 5, + "draw_name": "call00015_lane05", + "draw_kind": "captured", + "offsets": { + "centre_0": -0.008435952123169364, + "centre_1": -0.007849511137408794, + "ell_comps_0": -0.01598149485178925, + "ell_comps_1": 0.01654417876136871, + "einstein_radius": 0.014294380855379263 + }, + "log_likelihood_vmap": 25472.519186602753, + "log_likelihood_scalar": 25472.519186788293, + "log_likelihood_library_pdip": 25472.51918660039, + "log_likelihood_library_pdip_scalar": 25472.519186778263, + "rel_diff_vmap_vs_library_pdip": 9.269001736760028e-14, + "rel_diff_scalar_vs_library_pdip_scalar": 3.9375404912278817e-13, + "abs_diff_nats": 1.8554055714048445e-07, + "rel_diff": 7.283950039645778e-12, + "rel_diff_scalar_vs_library_pdip": 7.37664005706711e-12, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 1.7787169781513512e-07, + "rel_diff_library_pdip_vmap_vs_scalar": 6.982886007892812e-12, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": true, + "passes": 4, + "pdip_iter": null + }, + { + "lane": 6, + "draw_name": "call00015_lane06", + "draw_kind": "captured", + "offsets": { + "centre_0": 0.0031698313356290646, + "centre_1": -0.0038584140676992847, + "ell_comps_0": 0.01810147576636289, + "ell_comps_1": -0.011577480306416508, + "einstein_radius": 0.016136835525067283 + }, + "log_likelihood_vmap": -83383.91630840673, + "log_likelihood_scalar": -83383.91546882152, + "log_likelihood_library_pdip": -83383.91627984545, + "log_likelihood_library_pdip_scalar": -83383.9154780034, + "rel_diff_vmap_vs_library_pdip": 3.425274096446194e-10, + "rel_diff_scalar_vs_library_pdip_scalar": 1.1011572323832307e-10, + "abs_diff_nats": 0.000839585205540061, + "rel_diff": 1.0068910782367785e-08, + "rel_diff_scalar_vs_library_pdip": 9.72638327478908e-09, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 0.0008018420485313982, + "rel_diff_library_pdip_vmap_vs_scalar": 9.616267645082262e-09, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": true, + "passes": 0, + "pdip_iter": null + }, + { + "lane": 7, + "draw_name": "call00015_lane07", + "draw_kind": "captured", + "offsets": { + "centre_0": 0.006158729760195174, + "centre_1": 0.004883559265258847, + "ell_comps_0": 0.007613883677130215, + "ell_comps_1": -0.005800175617006949, + "einstein_radius": 0.0662922007765554 + }, + "log_likelihood_vmap": -11960.284433131557, + "log_likelihood_scalar": -11960.284429709114, + "log_likelihood_library_pdip": -11960.284432895794, + "log_likelihood_library_pdip_scalar": -11960.284429695843, + "rel_diff_vmap_vs_library_pdip": 1.9712144464051283e-11, + "rel_diff_scalar_vs_library_pdip_scalar": 1.1096179832746727e-12, + "abs_diff_nats": 3.4224431146867573e-06, + "rel_diff": 2.861506458981423e-10, + "rel_diff_scalar_vs_library_pdip": 2.6643850135784944e-10, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 3.1999516068026423e-06, + "rel_diff_library_pdip_vmap_vs_scalar": 2.675481194124092e-10, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": true, + "passes": 1, + "pdip_iter": null + }, + { + "lane": 8, + "draw_name": "call00015_lane08", + "draw_kind": "captured", + "offsets": { + "centre_0": 0.0030335293924908615, + "centre_1": 0.0012117081273721316, + "ell_comps_0": 0.0008852687687036301, + "ell_comps_1": -0.0027113633212058814, + "einstein_radius": -0.03873713959923952 + }, + "log_likelihood_vmap": 23223.550391412093, + "log_likelihood_scalar": 23223.550391493583, + "log_likelihood_library_pdip": 23223.55039142327, + "log_likelihood_library_pdip_scalar": 23223.550391499484, + "rel_diff_vmap_vs_library_pdip": 4.812300749463839e-13, + "rel_diff_scalar_vs_library_pdip_scalar": 2.5408697316421647e-13, + "abs_diff_nats": 8.149072527885437e-08, + "rel_diff": 3.508969296473425e-12, + "rel_diff_scalar_vs_library_pdip": 3.0277392215376652e-12, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 7.621565600857139e-08, + "rel_diff_library_pdip_vmap_vs_scalar": 3.281826194691945e-12, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": true, + "passes": 4, + "pdip_iter": null + }, + { + "lane": 9, + "draw_name": "call00015_lane09", + "draw_kind": "captured", + "offsets": { + "centre_0": -0.0008035510098975272, + "centre_1": 0.005559773241319952, + "ell_comps_0": -0.003701655436278317, + "ell_comps_1": -0.012378591445614512, + "einstein_radius": 0.032284336889985665 + }, + "log_likelihood_vmap": NaN, + "log_likelihood_scalar": -177117.66925439955, + "log_likelihood_library_pdip": -177119.62523776368, + "log_likelihood_library_pdip_scalar": -177117.7627973323, + "rel_diff_vmap_vs_library_pdip": NaN, + "rel_diff_scalar_vs_library_pdip_scalar": 5.281397601695954e-07, + "abs_diff_nats": NaN, + "rel_diff": NaN, + "rel_diff_scalar_vs_library_pdip": 1.1043289875495109e-05, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 1.8624404313741252, + "rel_diff_library_pdip_vmap_vs_scalar": 1.0515266238458702e-05, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "FAIL", + "certified": true, + "passes": 0, + "pdip_iter": null + }, + { + "lane": 10, + "draw_name": "call00015_lane10", + "draw_kind": "captured", + "offsets": { + "centre_0": -0.008473569241265282, + "centre_1": -0.0051993251621340235, + "ell_comps_0": -0.0031466996514049606, + "ell_comps_1": -0.0076036423480284636, + "einstein_radius": 0.08283321334626792 + }, + "log_likelihood_vmap": -101745.38562719991, + "log_likelihood_scalar": -101745.38342286281, + "log_likelihood_library_pdip": -101745.38537429697, + "log_likelihood_library_pdip_scalar": -101745.38336786059, + "rel_diff_vmap_vs_library_pdip": 2.4856453529471607e-09, + "rel_diff_scalar_vs_library_pdip_scalar": 5.405869181873643e-10, + "abs_diff_nats": 0.0022043370991013944, + "rel_diff": 2.1665229663934477e-08, + "rel_diff_scalar_vs_library_pdip": 1.9179583895457225e-08, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 0.002006436377996579, + "rel_diff_library_pdip_vmap_vs_scalar": 1.9720171191869267e-08, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "FAIL", + "certified": true, + "passes": 2, + "pdip_iter": null + }, + { + "lane": 11, + "draw_name": "call00015_lane11", + "draw_kind": "captured", + "offsets": { + "centre_0": 0.001017060353322001, + "centre_1": 0.003035861051809724, + "ell_comps_0": 0.0014054844842678396, + "ell_comps_1": -0.00019678252877009805, + "einstein_radius": -0.04179610309843307 + }, + "log_likelihood_vmap": 18959.672781157926, + "log_likelihood_scalar": 18959.672780987996, + "log_likelihood_library_pdip": 18957.52834991362, + "log_likelihood_library_pdip_scalar": 18957.528349751083, + "rel_diff_vmap_vs_library_pdip": 0.0001131176598934229, + "rel_diff_scalar_vs_library_pdip_scalar": 0.00011311765950444882, + "abs_diff_nats": 1.699299900792539e-07, + "rel_diff": 8.962706901231594e-12, + "rel_diff_scalar_vs_library_pdip": 0.00011311765092970216, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 1.6253761714324355e-07, + "rel_diff_library_pdip_vmap_vs_scalar": 8.573776820720288e-12, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "FAIL", + "certified": false, + "passes": 16, + "pdip_iter": null + }, + { + "lane": 12, + "draw_name": "call00015_lane12", + "draw_kind": "captured", + "offsets": { + "centre_0": -0.0012508260776529923, + "centre_1": -0.0075763258203543175, + "ell_comps_0": -0.0003476568325791879, + "ell_comps_1": 0.0070528223693464365, + "einstein_radius": -0.005182936058341969 + }, + "log_likelihood_vmap": 24810.04966019512, + "log_likelihood_scalar": 24810.04966019512, + "log_likelihood_library_pdip": 24810.049660194898, + "log_likelihood_library_pdip_scalar": 24810.0496601949, + "rel_diff_vmap_vs_library_pdip": 8.944629707397821e-15, + "rel_diff_scalar_vs_library_pdip_scalar": 8.797996433506052e-15, + "abs_diff_nats": 0.0, + "rel_diff": 0.0, + "rel_diff_scalar_vs_library_pdip": 8.944629707397821e-15, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 3.637978807091713e-12, + "rel_diff_library_pdip_vmap_vs_scalar": 1.4663327389176753e-16, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": true, + "passes": 9, + "pdip_iter": null + }, + { + "lane": 13, + "draw_name": "call00015_lane13", + "draw_kind": "captured", + "offsets": { + "centre_0": 0.0039046265841316857, + "centre_1": 0.008586063066835778, + "ell_comps_0": 0.01612319103606081, + "ell_comps_1": -0.006478405394829051, + "einstein_radius": -0.06420305523683667 + }, + "log_likelihood_vmap": -3605.706216699764, + "log_likelihood_scalar": -3605.7062158882327, + "log_likelihood_library_pdip": -3605.7062167850163, + "log_likelihood_library_pdip_scalar": -3605.7062158904737, + "rel_diff_vmap_vs_library_pdip": 2.3643744176529572e-11, + "rel_diff_scalar_vs_library_pdip_scalar": 6.215134597744962e-13, + "abs_diff_nats": 8.115312084555626e-07, + "rel_diff": 2.2506858847224449e-10, + "rel_diff_scalar_vs_library_pdip": 2.4871233259279675e-10, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 8.945426088757813e-07, + "rel_diff_library_pdip_vmap_vs_scalar": 2.4809081919472546e-10, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": true, + "passes": 2, + "pdip_iter": null + }, + { + "lane": 14, + "draw_name": "call00015_lane14", + "draw_kind": "captured", + "offsets": { + "centre_0": 0.007195835212073937, + "centre_1": -0.0022675171274400335, + "ell_comps_0": 0.004220685262914858, + "ell_comps_1": 0.006581974817750368, + "einstein_radius": 0.08589577997501685 + }, + "log_likelihood_vmap": 11129.438563023068, + "log_likelihood_scalar": 11129.43856306804, + "log_likelihood_library_pdip": 11126.92147574079, + "log_likelihood_library_pdip_scalar": 11126.921475785763, + "rel_diff_vmap_vs_library_pdip": 0.00022621596528438225, + "rel_diff_scalar_vs_library_pdip_scalar": 0.00022621596528346792, + "abs_diff_nats": 4.4972694013267756e-08, + "rel_diff": 4.040877152824695e-12, + "rel_diff_scalar_vs_library_pdip": 0.00022621596932617352, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 4.4972694013267756e-08, + "rel_diff_library_pdip_vmap_vs_scalar": 4.041791263750414e-12, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "FAIL", + "certified": false, + "passes": 16, + "pdip_iter": null + }, + { + "lane": 15, + "draw_name": "call00015_lane15", + "draw_kind": "captured", + "offsets": { + "centre_0": 0.0024446743118905125, + "centre_1": 0.0028324231769206983, + "ell_comps_0": -0.017159158004659933, + "ell_comps_1": 0.008265799441903459, + "einstein_radius": -0.03860302877433641 + }, + "log_likelihood_vmap": 20407.780654997303, + "log_likelihood_scalar": 20407.780654984555, + "log_likelihood_library_pdip": 20410.343973733576, + "log_likelihood_library_pdip_scalar": 20410.343973722494, + "rel_diff_vmap_vs_library_pdip": 0.00012558919827963488, + "rel_diff_scalar_vs_library_pdip_scalar": 0.00012558919836133786, + "abs_diff_nats": 1.2747477740049362e-08, + "rel_diff": 6.246381199190231e-13, + "rel_diff_scalar_vs_library_pdip": 0.00012558919890419455, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 1.1081283446401358e-08, + "rel_diff_library_pdip_vmap_vs_scalar": 5.429248747923146e-13, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "FAIL", + "certified": false, + "passes": 16, + "pdip_iter": null + }, + { + "lane": 16, + "draw_name": "call00015_lane16", + "draw_kind": "captured", + "offsets": { + "centre_0": 0.00546338030193603, + "centre_1": 0.0029217319844296002, + "ell_comps_0": 0.018887239108742314, + "ell_comps_1": 0.01610145140759906, + "einstein_radius": 0.09308737119031596 + }, + "log_likelihood_vmap": 9734.862241685194, + "log_likelihood_scalar": 9734.862241686911, + "log_likelihood_library_pdip": 9734.862241684299, + "log_likelihood_library_pdip_scalar": 9734.86224168189, + "rel_diff_vmap_vs_library_pdip": 9.193173609714284e-14, + "rel_diff_scalar_vs_library_pdip_scalar": 5.157146171304411e-13, + "abs_diff_nats": 1.7171259969472885e-09, + "rel_diff": 1.7638934730829178e-13, + "rel_diff_scalar_vs_library_pdip": 2.6832108340548195e-13, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 2.408341970294714e-09, + "rel_diff_library_pdip_vmap_vs_scalar": 2.473935337248928e-13, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "PASS", + "certified": true, + "passes": 16, + "pdip_iter": null + }, + { + "lane": 17, + "draw_name": "call00015_lane17", + "draw_kind": "captured", + "offsets": { + "centre_0": -0.0033403521024317102, + "centre_1": -0.004078467297591464, + "ell_comps_0": -0.01076606265657356, + "ell_comps_1": 0.014404445881011321, + "einstein_radius": -0.016103243806114165 + }, + "log_likelihood_vmap": 19481.580998496996, + "log_likelihood_scalar": 19481.580996516812, + "log_likelihood_library_pdip": 19481.557219621747, + "log_likelihood_library_pdip_scalar": 19481.557217641563, + "rel_diff_vmap_vs_library_pdip": 1.2205839082161961e-06, + "rel_diff_scalar_vs_library_pdip_scalar": 1.2205839083402613e-06, + "abs_diff_nats": 1.980184606509283e-06, + "rel_diff": 1.016439377719564e-10, + "rel_diff_scalar_vs_library_pdip": 1.2204822641543697e-06, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 1.980184606509283e-06, + "rel_diff_library_pdip_vmap_vs_scalar": 1.0164406183691123e-10, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "FAIL", + "certified": false, + "passes": 16, + "pdip_iter": null + }, + { + "lane": 18, + "draw_name": "call00015_lane18", + "draw_kind": "captured", + "offsets": { + "centre_0": -0.0036504937209151113, + "centre_1": -0.0003963555596475738, + "ell_comps_0": -0.008227000946306733, + "ell_comps_1": -0.02487475830854786, + "einstein_radius": -0.0327871904693704 + }, + "log_likelihood_vmap": 18817.121700992862, + "log_likelihood_scalar": 18817.121698566574, + "log_likelihood_library_pdip": 18812.94686042335, + "log_likelihood_library_pdip_scalar": 18812.946857997056, + "rel_diff_vmap_vs_library_pdip": 0.000221913164401335, + "rel_diff_scalar_vs_library_pdip_scalar": 0.00022191316443034178, + "abs_diff_nats": 2.4262881197500974e-06, + "rel_diff": 1.2894044894947582e-10, + "rel_diff_scalar_vs_library_pdip": 0.0002219130354322725, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 2.4262953957077116e-06, + "rel_diff_library_pdip_vmap_vs_scalar": 1.2896944928520519e-10, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "FAIL", + "certified": false, + "passes": 16, + "pdip_iter": null + }, + { + "lane": 19, + "draw_name": "call00015_lane19", + "draw_kind": "captured", + "offsets": { + "centre_0": 0.00840275144875603, + "centre_1": -0.003628185056462521, + "ell_comps_0": 0.005265994929748281, + "ell_comps_1": 0.009958068668923414, + "einstein_radius": -0.06501253116347949 + }, + "log_likelihood_vmap": 16927.8572292553, + "log_likelihood_scalar": 16927.857229255565, + "log_likelihood_library_pdip": 16927.632549569396, + "log_likelihood_library_pdip_scalar": 16927.632549568654, + "rel_diff_vmap_vs_library_pdip": 1.327295386673867e-05, + "rel_diff_scalar_vs_library_pdip_scalar": 1.3272953926270324e-05, + "abs_diff_nats": 2.6557245291769505e-10, + "rel_diff": 1.5688486104355814e-14, + "rel_diff_scalar_vs_library_pdip": 1.3272953882427364e-05, + "abs_diff_library_pdip_vmap_vs_scalar_nats": 7.421476766467094e-10, + "rel_diff_library_pdip_vmap_vs_scalar": 4.384237869492392e-14, + "gated": [ + "rel_diff_vmap_vs_library_pdip", + "rel_diff_scalar_vs_library_pdip_scalar" + ], + "status": "FAIL", + "certified": false, + "passes": 16, + "pdip_iter": null + } + ], + "lane_pins": [ + { + "pin": "lane 0: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 24758.506194309342, + "reference_value": 24758.50619430915, + "rel_diff": 7.787742736279448e-15, + "abs_diff_nats": 1.9281287677586079e-10, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 0: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 24758.506194309346, + "reference_value": 24758.506194309153, + "rel_diff": 7.787742736279447e-15, + "abs_diff_nats": 1.9281287677586079e-10, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 0: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 24758.506194309342, + "reference_value": 24758.506194309346, + "rel_diff": 1.4693854219395068e-16, + "abs_diff_nats": 3.637978807091713e-12, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 0: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 24758.50619430915, + "reference_value": 24758.506194309153, + "rel_diff": 1.4693854219395182e-16, + "abs_diff_nats": 3.637978807091713e-12, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 1: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 20552.706459415946, + "reference_value": 20551.00488777265, + "rel_diff": 8.279749105148112e-05, + "abs_diff_nats": 1.7015716432943009, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 1: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 20552.706459415127, + "reference_value": 20551.004887772448, + "rel_diff": 8.279749102156523e-05, + "abs_diff_nats": 1.7015716426794825, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 1: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 20552.706459415946, + "reference_value": 20552.706459415127, + "rel_diff": 3.982663953343539e-14, + "abs_diff_nats": 8.185452315956354e-10, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 1: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 20551.00488777265, + "reference_value": 20551.004887772448, + "rel_diff": 9.913228784172517e-15, + "abs_diff_nats": 2.0372681319713593e-10, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 2: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -189709.75922536693, + "reference_value": -189709.78218648065, + "rel_diff": 1.2103284002386354e-07, + "abs_diff_nats": 0.02296111371833831, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 2: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -189709.0677186827, + "reference_value": -189709.0679785746, + "rel_diff": 1.3699498492651947e-09, + "abs_diff_nats": 0.00025989190908148885, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 2: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -189709.75922536693, + "reference_value": -189709.0677186827, + "rel_diff": 3.6450903088055186e-06, + "abs_diff_nats": 0.6915066842339002, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 2: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -189709.78218648065, + "reference_value": -189709.0679785746, + "rel_diff": 3.7647536496453525e-06, + "abs_diff_nats": 0.714207906043157, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 3: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -141741.98025945516, + "reference_value": -141741.9783256529, + "rel_diff": 1.3643116113597083e-08, + "abs_diff_nats": 0.0019338022684678435, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 3: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -141741.96681345947, + "reference_value": -141741.96788141696, + "rel_diff": 7.534518587376962e-09, + "abs_diff_nats": 0.0010679574916139245, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 3: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -141741.98025945516, + "reference_value": -141741.96681345947, + "rel_diff": 9.486248845079946e-08, + "abs_diff_nats": 0.0134459956898354, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 3: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -141741.9783256529, + "reference_value": -141741.96788141696, + "rel_diff": 7.368485202979124e-08, + "abs_diff_nats": 0.010444235929753631, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 4: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 24880.545932988687, + "reference_value": 24880.545932988694, + "rel_diff": 2.92435609483004e-16, + "abs_diff_nats": 7.275957614183426e-12, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 4: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 24880.545932988724, + "reference_value": 24880.545932988734, + "rel_diff": 4.386534142245053e-16, + "abs_diff_nats": 1.0913936421275139e-11, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 4: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 24880.545932988687, + "reference_value": 24880.545932988724, + "rel_diff": 1.4621780474150184e-15, + "abs_diff_nats": 3.637978807091713e-11, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 4: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 24880.545932988694, + "reference_value": 24880.545932988734, + "rel_diff": 1.6083958521565195e-15, + "abs_diff_nats": 4.001776687800884e-11, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 5: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 25472.519186602753, + "reference_value": 25472.51918660039, + "rel_diff": 9.269001736760028e-14, + "abs_diff_nats": 2.3610482458025217e-09, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 5: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 25472.519186788293, + "reference_value": 25472.519186778263, + "rel_diff": 3.9375404912278817e-13, + "abs_diff_nats": 1.0029907571151853e-08, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 5: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 25472.519186602753, + "reference_value": 25472.519186788293, + "rel_diff": 7.283950039645778e-12, + "abs_diff_nats": 1.8554055714048445e-07, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 5: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 25472.51918660039, + "reference_value": 25472.519186778263, + "rel_diff": 6.982886007892812e-12, + "abs_diff_nats": 1.7787169781513512e-07, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 6: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -83383.91630840673, + "reference_value": -83383.91627984545, + "rel_diff": 3.425274096446194e-10, + "abs_diff_nats": 2.8561276849359274e-05, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 6: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -83383.91546882152, + "reference_value": -83383.9154780034, + "rel_diff": 1.1011572323832307e-10, + "abs_diff_nats": 9.181880159303546e-06, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 6: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -83383.91630840673, + "reference_value": -83383.91546882152, + "rel_diff": 1.0068910782367785e-08, + "abs_diff_nats": 0.000839585205540061, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 6: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -83383.91627984545, + "reference_value": -83383.9154780034, + "rel_diff": 9.616267645082262e-09, + "abs_diff_nats": 0.0008018420485313982, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 7: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -11960.284433131557, + "reference_value": -11960.284432895794, + "rel_diff": 1.9712144464051283e-11, + "abs_diff_nats": 2.3576285457238555e-07, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 7: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -11960.284429709114, + "reference_value": -11960.284429695843, + "rel_diff": 1.1096179832746727e-12, + "abs_diff_nats": 1.3271346688270569e-08, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 7: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -11960.284433131557, + "reference_value": -11960.284429709114, + "rel_diff": 2.861506458981423e-10, + "abs_diff_nats": 3.4224431146867573e-06, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 7: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -11960.284432895794, + "reference_value": -11960.284429695843, + "rel_diff": 2.675481194124092e-10, + "abs_diff_nats": 3.1999516068026423e-06, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 8: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 23223.550391412093, + "reference_value": 23223.55039142327, + "rel_diff": 4.812300749463839e-13, + "abs_diff_nats": 1.1175870895385742e-08, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 8: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 23223.550391493583, + "reference_value": 23223.550391499484, + "rel_diff": 2.5408697316421647e-13, + "abs_diff_nats": 5.900801625102758e-09, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 8: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 23223.550391412093, + "reference_value": 23223.550391493583, + "rel_diff": 3.508969296473425e-12, + "abs_diff_nats": 8.149072527885437e-08, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 8: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 23223.55039142327, + "reference_value": 23223.550391499484, + "rel_diff": 3.281826194691945e-12, + "abs_diff_nats": 7.621565600857139e-08, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 9: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": NaN, + "reference_value": -177119.62523776368, + "rel_diff": NaN, + "abs_diff_nats": NaN, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 9: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -177117.66925439955, + "reference_value": -177117.7627973323, + "rel_diff": 5.281397601695954e-07, + "abs_diff_nats": 0.09354293276555836, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 9: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": NaN, + "reference_value": -177117.66925439955, + "rel_diff": NaN, + "abs_diff_nats": NaN, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 9: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -177119.62523776368, + "reference_value": -177117.7627973323, + "rel_diff": 1.0515266238458702e-05, + "abs_diff_nats": 1.8624404313741252, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 10: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -101745.38562719991, + "reference_value": -101745.38537429697, + "rel_diff": 2.4856453529471607e-09, + "abs_diff_nats": 0.00025290294433943927, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 10: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -101745.38342286281, + "reference_value": -101745.38336786059, + "rel_diff": 5.405869181873643e-10, + "abs_diff_nats": 5.500222323462367e-05, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 10: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -101745.38562719991, + "reference_value": -101745.38342286281, + "rel_diff": 2.1665229663934477e-08, + "abs_diff_nats": 0.0022043370991013944, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 10: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -101745.38537429697, + "reference_value": -101745.38336786059, + "rel_diff": 1.9720171191869267e-08, + "abs_diff_nats": 0.002006436377996579, + "within_rtol": false, + "status": "RECORDED" + }, + { + "pin": "lane 11: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 18959.672781157926, + "reference_value": 18957.52834991362, + "rel_diff": 0.0001131176598934229, + "abs_diff_nats": 2.1444312443054514, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 11: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 18959.672780987996, + "reference_value": 18957.528349751083, + "rel_diff": 0.00011311765950444882, + "abs_diff_nats": 2.1444312369130785, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 11: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 18959.672781157926, + "reference_value": 18959.672780987996, + "rel_diff": 8.962706901231594e-12, + "abs_diff_nats": 1.699299900792539e-07, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 11: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 18957.52834991362, + "reference_value": 18957.528349751083, + "rel_diff": 8.573776820720288e-12, + "abs_diff_nats": 1.6253761714324355e-07, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 12: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 24810.04966019512, + "reference_value": 24810.049660194898, + "rel_diff": 8.944629707397821e-15, + "abs_diff_nats": 2.219167072325945e-10, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 12: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 24810.04966019512, + "reference_value": 24810.0496601949, + "rel_diff": 8.797996433506052e-15, + "abs_diff_nats": 2.1827872842550278e-10, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 12: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 24810.04966019512, + "reference_value": 24810.04966019512, + "rel_diff": 0.0, + "abs_diff_nats": 0.0, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 12: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 24810.049660194898, + "reference_value": 24810.0496601949, + "rel_diff": 1.4663327389176753e-16, + "abs_diff_nats": 3.637978807091713e-12, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 13: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -3605.706216699764, + "reference_value": -3605.7062167850163, + "rel_diff": 2.3643744176529572e-11, + "abs_diff_nats": 8.52523953653872e-08, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 13: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": -3605.7062158882327, + "reference_value": -3605.7062158904737, + "rel_diff": 6.215134597744962e-13, + "abs_diff_nats": 2.240994945168495e-09, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 13: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -3605.706216699764, + "reference_value": -3605.7062158882327, + "rel_diff": 2.2506858847224449e-10, + "abs_diff_nats": 8.115312084555626e-07, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 13: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": -3605.7062167850163, + "reference_value": -3605.7062158904737, + "rel_diff": 2.4809081919472546e-10, + "abs_diff_nats": 8.945426088757813e-07, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 14: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 11129.438563023068, + "reference_value": 11126.92147574079, + "rel_diff": 0.00022621596528438225, + "abs_diff_nats": 2.5170872822782258, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 14: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 11129.43856306804, + "reference_value": 11126.921475785763, + "rel_diff": 0.00022621596528346792, + "abs_diff_nats": 2.5170872822782258, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 14: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 11129.438563023068, + "reference_value": 11129.43856306804, + "rel_diff": 4.040877152824695e-12, + "abs_diff_nats": 4.4972694013267756e-08, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 14: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 11126.92147574079, + "reference_value": 11126.921475785763, + "rel_diff": 4.041791263750414e-12, + "abs_diff_nats": 4.4972694013267756e-08, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 15: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 20407.780654997303, + "reference_value": 20410.343973733576, + "rel_diff": 0.00012558919827963488, + "abs_diff_nats": 2.5633187362727767, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 15: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 20407.780654984555, + "reference_value": 20410.343973722494, + "rel_diff": 0.00012558919836133786, + "abs_diff_nats": 2.563318737938971, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 15: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 20407.780654997303, + "reference_value": 20407.780654984555, + "rel_diff": 6.246381199190231e-13, + "abs_diff_nats": 1.2747477740049362e-08, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 15: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 20410.343973733576, + "reference_value": 20410.343973722494, + "rel_diff": 5.429248747923146e-13, + "abs_diff_nats": 1.1081283446401358e-08, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 16: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 9734.862241685194, + "reference_value": 9734.862241684299, + "rel_diff": 9.193173609714284e-14, + "abs_diff_nats": 8.949427865445614e-10, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 16: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 9734.862241686911, + "reference_value": 9734.86224168189, + "rel_diff": 5.157146171304411e-13, + "abs_diff_nats": 5.020410753786564e-09, + "within_rtol": true, + "status": "PASS" + }, + { + "pin": "lane 16: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 9734.862241685194, + "reference_value": 9734.862241686911, + "rel_diff": 1.7638934730829178e-13, + "abs_diff_nats": 1.7171259969472885e-09, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 16: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 9734.862241684299, + "reference_value": 9734.86224168189, + "rel_diff": 2.473935337248928e-13, + "abs_diff_nats": 2.408341970294714e-09, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 17: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 19481.580998496996, + "reference_value": 19481.557219621747, + "rel_diff": 1.2205839082161961e-06, + "abs_diff_nats": 0.023778875249263365, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 17: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 19481.580996516812, + "reference_value": 19481.557217641563, + "rel_diff": 1.2205839083402613e-06, + "abs_diff_nats": 0.023778875249263365, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 17: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 19481.580998496996, + "reference_value": 19481.580996516812, + "rel_diff": 1.016439377719564e-10, + "abs_diff_nats": 1.980184606509283e-06, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 17: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 19481.557219621747, + "reference_value": 19481.557217641563, + "rel_diff": 1.0164406183691123e-10, + "abs_diff_nats": 1.980184606509283e-06, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 18: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 18817.121700992862, + "reference_value": 18812.94686042335, + "rel_diff": 0.000221913164401335, + "abs_diff_nats": 4.174840569510707, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 18: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 18817.121698566574, + "reference_value": 18812.946857997056, + "rel_diff": 0.00022191316443034178, + "abs_diff_nats": 4.174840569517983, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 18: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 18817.121700992862, + "reference_value": 18817.121698566574, + "rel_diff": 1.2894044894947582e-10, + "abs_diff_nats": 2.4262881197500974e-06, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 18: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 18812.94686042335, + "reference_value": 18812.946857997056, + "rel_diff": 1.2896944928520519e-10, + "abs_diff_nats": 2.4262953957077116e-06, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 19: jit(vmap) arm == jit(vmap) library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 16927.8572292553, + "reference_value": 16927.632549569396, + "rel_diff": 1.327295386673867e-05, + "abs_diff_nats": 0.22467968590353848, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 19: scalar jit arm == scalar jit library PDIP", + "rtol": 1e-09, + "gated": true, + "got": 16927.857229255565, + "reference_value": 16927.632549568654, + "rel_diff": 1.3272953926270324e-05, + "abs_diff_nats": 0.2246796869112586, + "within_rtol": false, + "status": "FAIL" + }, + { + "pin": "lane 19: jit(vmap) arm vs scalar jit arm (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 16927.8572292553, + "reference_value": 16927.857229255565, + "rel_diff": 1.5688486104355814e-14, + "abs_diff_nats": 2.6557245291769505e-10, + "within_rtol": true, + "status": "RECORDED" + }, + { + "pin": "lane 19: jit(vmap) library PDIP vs scalar jit library PDIP (cross-composition)", + "rtol": 1e-09, + "gated": false, + "got": 16927.632549569396, + "reference_value": 16927.632549568654, + "rel_diff": 4.384237869492392e-14, + "abs_diff_nats": 7.421476766467094e-10, + "within_rtol": true, + "status": "RECORDED" + } + ], + "lanes_failed": 11, + "arm_rows": { + "vmap": { + "arm": "vmap", + "program": "jax.jit(jax.vmap(fn))", + "stands_for": "Nautilus(use_jax_vmap=True) \u2014 Fitness._vmap", + "hlo_source": "jax.jit(jax.vmap(fn)).lower(batched_tree) \u2014 the exact current Fitness._vmap composition (PyAutoFit#1638)", + "batch_wall_ms": 609.7379776998423, + "wall_production_nesting_ms": 609.7379776998423, + "wall_aot_command_buffers_on_ms": 613.7196075000247, + "wall_aot_command_buffers_off_ms": 612.5688400999934, + "command_buffer_delta_ms": -1.1507674000313273, + "production_nesting_vs_aot_on_delta_ms": -3.981629800182418, + "production_nesting_vs_aot_on_delta_pct": -0.6487701796593256, + "wall_per_lane_ms": 30.486898884992115, + "wall_per_lane_command_buffers_off_ms": 30.62844200499967, + "traced_batch_wall_ms": 619.0847408000991, + "untraced_batch_wall_ms": 613.6301525002636, + "traced_wall_per_lane_ms": 30.954237040004955, + "callback_count_per_call": 20.0, + "callback_count_per_lane": 1.0, + "callback_expectation": "B per batched call \u2014 the qhull pure_callback is vmap_method='sequential'", + "host_qhull_ms": 89.4914611002605, + "host_tables_ms": 2.3100747021089774, + "host_qhull_ms_per_lane": 4.474573055013025, + "host_tables_ms_per_lane": 0.11550373510544887, + "host_callback_probe": { + "calls": 200, + "qhull_ms_total": 894.9146110026049, + "tables_ms_total": 23.100747021089774, + "total_ms_total": 918.0153580236947, + "qhull_ms_mean": 4.474573055013025, + "tables_ms_mean": 0.11550373510544887, + "total_ms_mean": 4.590076790118474, + "non_finite_calls": 0, + "n_points": [ + 1500 + ] + }, + "host_callback_records_first": [ + { + "n_points": 1500, + "qhull_ms": 4.750485000840854, + "tables_ms": 0.17348699839203618, + "total_ms": 4.92397199923289, + "finite": true + }, + { + "n_points": 1500, + "qhull_ms": 4.4675770004687365, + "tables_ms": 0.11075799920945428, + "total_ms": 4.578334999678191, + "finite": true + }, + { + "n_points": 1500, + "qhull_ms": 4.47029799761367, + "tables_ms": 0.11890899986610748, + "total_ms": 4.589206997479778, + "finite": true + }, + { + "n_points": 1500, + "qhull_ms": 4.459747000510106, + "tables_ms": 0.110348999442067, + "total_ms": 4.570095999952173, + "finite": true + } + ], + "device_idle_ms": 111.85677179999999, + "device_idle_ms_per_lane": 5.5928385899999995, + "trace": { + "parser": "ProfileData.from_file(xplane) + as_text() + stack_frame_index(proto field 17)", + "stage_audit": { + "mixed_fusion": [ + { + "instruction": "loop_divide_gather_fusion", + "ms": 21.0109305, + "opcode": "fusion", + "shape": "(f64[15361,20,1,1,1500]{4,3,2,1,0}, f64[15361,20,1,1,1500]{4,3,2,1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:133", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:133 (curvature_matrix_via_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:93 (InversionImagingMapping.curvature_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:389 (AbstractInversion.curvature_reg_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "input_multiply_transpose_fusion", + "ms": 8.1490747, + "opcode": "fusion", + "shape": "(f64[20,1500,1500]{2,1,0}, f64[20,1500,1500]{2,1,0}, f64[20,1500,1500]{2,1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:237 (active_set_search)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:293 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:274 (_certified_positive_only_from)" + ] + }, + { + "instruction": "loop_broadcast_fusion.6", + "ms": 5.0197235, + "opcode": "fusion", + "shape": "f64[20,1500,180,180]{3,2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "input_reduce_fusion.7", + "ms": 2.6090508999999997, + "opcode": "fusion", + "shape": "f64[92,20,1500]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/inversion_imaging_util.py:123", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/inversion_imaging_util.py:123 (data_vector_via_blurred_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:67 (InversionImagingMapping.data_vector)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:699 (AbstractInversion.reconstruction)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "input_reduce_fusion.11", + "ms": 2.188721, + "opcode": "fusion", + "shape": "f64[15361,20]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:163", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:163 (mapped_reconstructed_data_via_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:120 (InversionImagingMapping._mapped_reconstructed_data_dict_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:196 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "loop_broadcast_fusion.8", + "ms": 2.1188957000000004, + "opcode": "fusion", + "shape": "f64[15361,20,1500]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:353", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:353 (mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/abstract.py:283 (Mapper.mapping_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:91 (AbstractInversionImaging._mapping_matrix_for_convolution_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:137 (AbstractInversionImaging.operated_mapping_matrix_list)" + ] + } + ], + "other": [ + { + "instruction": "copy.113", + "ms": 0.048160299999999885, + "opcode": "copy", + "shape": "f64[1,20,1024,2]{3,2,1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "copy.115", + "ms": 0.04006430000000008, + "opcode": "copy", + "shape": "s32[1,3000,3]{2,1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "copy.117", + "ms": 0.03996200000000011, + "opcode": "copy", + "shape": "f64[1,1500,2]{2,1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "copy.116", + "ms": 0.039757400000000116, + "opcode": "copy", + "shape": "s32[1,3000,3]{2,1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "copy.114", + "ms": 0.0392327, + "opcode": "copy", + "shape": "s32[1,1500]{1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "copy.98", + "ms": 0.0384193, + "opcode": "copy", + "shape": "s32[20]{0}", + "source": "", + "stack": [] + } + ], + "mesh_qhull_callback": [ + { + "instruction": "pure_callback.0", + "ms": 0.21414550000000102, + "opcode": "custom-call", + "shape": "(s32[3000,3]{1,0}, s32[3000,3]{1,0}, s32[1500]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:161", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:161 (_jax_delaunay_tables)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:405 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + }, + { + "instruction": "loop_add_fusion.1", + "ms": 0.030595499999999914, + "opcode": "fusion", + "shape": "s64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:161", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:161 (_jax_delaunay_tables)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:405 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + }, + { + "instruction": "loop_broadcast_fusion.2", + "ms": 0.0020032, + "opcode": "fusion", + "shape": "s32[20,1500]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:161", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:161 (_jax_delaunay_tables)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:405 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + } + ], + "border_relocator": [ + { + "instruction": "custom-call.2", + "ms": 0.042138, + "opcode": "custom-call", + "shape": "(f64[20,2,2]{2,1,0}, s8[4194304]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:242", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:242 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:454 (BorderRelocator.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:176 (AbstractMesh.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:214 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "loop_add_rsqrt_fusion", + "ms": 0.015254600000000002, + "opcode": "fusion", + "shape": "(f64[20,15361]{1,0}, f64[20,15361]{1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:311", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:311 (relocated_grid_via_ellipse_border_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:423 (BorderRelocator.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:83 (AbstractMesh.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:208 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "eigh.34", + "ms": 0.0146179, + "opcode": "custom-call", + "shape": "(f64[20,2,2]{1,2,0}, f64[20,2]{1,0}, s32[20]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:245", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:245 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:454 (BorderRelocator.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:176 (AbstractMesh.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:214 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "loop_add_fusion.3", + "ms": 0.0037953000000000006, + "opcode": "fusion", + "shape": "f64[20,1500]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:308", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:308 (relocated_grid_via_ellipse_border_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:458 (BorderRelocator.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:176 (AbstractMesh.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:214 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "input_reduce_fusion.12", + "ms": 0.003327999999999999, + "opcode": "fusion", + "shape": "f64[20]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:270", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:270 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:454 (BorderRelocator.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:176 (AbstractMesh.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:214 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "input_reduce_fusion.13", + "ms": 0.003315199999999999, + "opcode": "fusion", + "shape": "f64[20]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:269", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:269 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:454 (BorderRelocator.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:176 (AbstractMesh.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:214 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + } + ], + "mesh_construction": [ + { + "instruction": "loop_compare_fusion.4", + "ms": 0.00424, + "opcode": "fusion", + "shape": "pred[20,6000,3]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:736", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:736 (DelaunayInterface.splitted_sizes)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:997 (InterpolatorDelaunay._mappings_sizes_weights_split)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt_split.py:124 (AdaptSplit.regularization_matrix_from)" + ] + }, + { + "instruction": "loop_multiply_fusion.2", + "ms": 0.0023936, + "opcode": "fusion", + "shape": "f64[20,1500]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:412", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:412 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "input_concatenate_fusion.9", + "ms": 0.002368, + "opcode": "fusion", + "shape": "f64[20,1500,2]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:820", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:820 (InterpolatorDelaunay.mesh_grid_xy)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:847 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + } + ], + "mesh_seed_argmin": [ + { + "instruction": "input_reduce_fusion", + "ms": 1.6191096000000005, + "opcode": "fusion", + "shape": "(f64[20,1024]{1,0}, s64[20,1024]{1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:191", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:191 (_nearest_vertex_seed_from..argmin_chunk)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204 (_nearest_vertex_seed_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:351 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)" + ] + }, + { + "instruction": "loop_dynamic_update_slice_fusion", + "ms": 0.0474273999999999, + "opcode": "fusion", + "shape": "s32[21,20,1024]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204 (_nearest_vertex_seed_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:351 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "loop_add_fusion", + "ms": 0.03188519999999995, + "opcode": "fusion", + "shape": "s64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204 (_nearest_vertex_seed_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:351 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "loop_broadcast_fusion.3", + "ms": 0.002656, + "opcode": "fusion", + "shape": "s32[21,20,1024]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204 (_nearest_vertex_seed_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:351 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "pdip_solve": [ + { + "instruction": "cholesky.50", + "ms": 113.97560059999603, + "opcode": "custom-call", + "shape": "(f64[20,1500,1500]{1,2,0}, s32[20]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:252 (active_set_search..body_fun)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:262 (active_set_search)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:293 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)" + ] + }, + { + "instruction": "triangular-solve", + "ms": 29.233365500000577, + "opcode": "custom-call", + "shape": "(f64[20,1500,1]{1,2,0}, s8[320]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:154", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:154 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:252 (active_set_search..body_fun)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:262 (active_set_search)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:293 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)" + ] + }, + { + "instruction": "triangular-solve.1", + "ms": 27.535786700000997, + "opcode": "custom-call", + "shape": "(f64[20,1500,1]{1,2,0}, s8[320]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:154", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:154 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:252 (active_set_search..body_fun)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:262 (active_set_search)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:293 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)" + ] + }, + { + "instruction": "input_transpose_fusion", + "ms": 14.327704499999996, + "opcode": "fusion", + "shape": "f64[20,1500,1500]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:252 (active_set_search..body_fun)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:262 (active_set_search)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:293 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)" + ] + }, + { + "instruction": "input_transpose_fusion.1", + "ms": 9.48304, + "opcode": "fusion", + "shape": "f64[20,1500,1500]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:252 (active_set_search..body_fun)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:262 (active_set_search)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:293 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)" + ] + }, + { + "instruction": "cholesky.60", + "ms": 7.453225799999942, + "opcode": "custom-call", + "shape": "(f64[20,1500,1500]{1,2,0}, s32[20]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:237 (active_set_search)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:293 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:274 (_certified_positive_only_from)" + ] + } + ], + "mesh_dual_areas": [ + { + "instruction": "input_scatter_fusion.9", + "ms": 0.0032736000000000006, + "opcode": "fusion", + "shape": "f64[20,1500]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:393", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:393 (_dual_areas_padded_jnp)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:408 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + }, + { + "instruction": "input_scatter_fusion.7", + "ms": 0.0032384000000000002, + "opcode": "fusion", + "shape": "f64[20,1500]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:393", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:393 (_dual_areas_padded_jnp)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:408 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + } + ], + "mesh_locate_walk": [ + { + "instruction": "loop_slice_subtract_fusion", + "ms": 0.3236666, + "opcode": "fusion", + "shape": "(f64[20,21361,1]{2,1,0}, f64[20,21361,1]{2,1,0}, f64[20,21361,1]{2,1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:236", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:236 (_walk_from_seed..cross)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:250 (_walk_from_seed..weights_of)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:262 (_walk_from_seed..walk_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:292 (_walk_from_seed..body)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)" + ] + }, + { + "instruction": "loop_reduce_fusion", + "ms": 0.15157530000000005, + "opcode": "fusion", + "shape": "(f64[20,21361]{1,0}, s64[20,21361]{1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:264", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:264 (_walk_from_seed..walk_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:292 (_walk_from_seed..body)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:264 (_walk_from_seed..walk_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:292 (_walk_from_seed..body)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)" + ] + }, + { + "instruction": "loop_select_fusion", + "ms": 0.1280649, + "opcode": "fusion", + "shape": "(pred[20,21361]{1,0}, pred[20,21361]{1,0}, s32[20,21361]{1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:353 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "loop_gather_fusion.1", + "ms": 0.08310179999999999, + "opcode": "fusion", + "shape": "s32[427220,1,1,3]{3,2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:239", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:239 (_walk_from_seed..weights_of)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:262 (_walk_from_seed..walk_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:292 (_walk_from_seed..body)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:353 (pix_indexes_delaunay_walk_from)" + ] + }, + { + "instruction": "loop_gather_fusion", + "ms": 0.062279100000000004, + "opcode": "fusion", + "shape": "s32[427220,1,1,1]{3,2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:267", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:267 (_walk_from_seed..walk_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:292 (_walk_from_seed..body)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:353 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)" + ] + }, + { + "instruction": "input_concatenate_fusion.1", + "ms": 0.045324999999999976, + "opcode": "fusion", + "shape": "s32[20,21361,2]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:244", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:244 (_walk_from_seed..weights_of)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:262 (_walk_from_seed..walk_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:292 (_walk_from_seed..body)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:353 (pix_indexes_delaunay_walk_from)" + ] + } + ], + "psf_convolution_mapping_matrix": [ + { + "instruction": "input_scatter_fusion", + "ms": 40.28684, + "opcode": "fusion", + "shape": "f64[20,1500,180,180]{3,2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "fft.29.0", + "ms": 35.087115299999994, + "opcode": "fft", + "shape": "f64[20,1500,180,180]{3,2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "fft.25.0", + "ms": 26.871073199999998, + "opcode": "fft", + "shape": "c128[20,1500,180,91]{3,2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "fft.27.0", + "ms": 19.3917665, + "opcode": "fft", + "shape": "c128[20,1500,91,180]{3,2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "input_transpose_fusion.3", + "ms": 10.544244500000001, + "opcode": "fusion", + "shape": "c128[20,1500,91,180]{3,2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "wrapped_transpose", + "ms": 9.8484988, + "opcode": "fusion", + "shape": "c128[20,1500,180,91]{3,2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + } + ], + "mapping_matrix": [ + { + "instruction": "input_scatter_fusion.3", + "ms": 0.0591847, + "opcode": "fusion", + "shape": "f64[20,1500]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:71", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:71 (adaptive_pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/abstract.py:507 (Mapper.pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt.py:339 (Adapt.regularization_weights_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt_split.py:120 (AdaptSplit.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)" + ] + }, + { + "instruction": "input_reduce_fusion.34", + "ms": 0.0037216, + "opcode": "fusion", + "shape": "f64[20]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:93", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:93 (adaptive_pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/abstract.py:507 (Mapper.pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt.py:339 (Adapt.regularization_weights_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt_split.py:120 (AdaptSplit.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)" + ] + } + ], + "regularization_H": [ + { + "instruction": "input_scatter_fusion.10", + "ms": 0.0035488000000000004, + "opcode": "fusion", + "shape": "f64[20,1500,1500]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:615", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:615 (pixel_splitted_regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt_split.py:137 (AdaptSplit.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:332 (AbstractInversion.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "curvature_matrix_F": [ + { + "instruction": "cublas-lt-matmul.2", + "ms": 81.0935818, + "opcode": "custom-call", + "shape": "(f64[20,1500,1500]{2,1,0}, s8[4194304]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:134", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:134 (curvature_matrix_via_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:93 (InversionImagingMapping.curvature_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:389 (AbstractInversion.curvature_reg_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "inversion_other": [ + { + "instruction": "cholesky.80", + "ms": 7.757765500000026, + "opcode": "custom-call", + "shape": "(f64[20,1500,1500]{1,2,0}, s32[20]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986 (AbstractInversion._log_det_symmetric_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:1078 (AbstractInversion.log_det_curvature_reg_matrix_term)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:347 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/model/analysis.py:135 (AnalysisImaging.log_likelihood_function)" + ] + }, + { + "instruction": "cholesky.90", + "ms": 7.5585414999999605, + "opcode": "custom-call", + "shape": "(f64[20,1500,1500]{1,2,0}, s32[20]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986 (AbstractInversion._log_det_symmetric_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:1157 (AbstractInversion.log_det_regularization_matrix_term)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:348 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/model/analysis.py:135 (AnalysisImaging.log_likelihood_function)" + ] + }, + { + "instruction": "loop_reduce_window_fusion", + "ms": 0.0031072, + "opcode": "fusion", + "shape": "s64[94,16]{1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "loop_broadcast_convert_fusion", + "ms": 0.0025856000000000004, + "opcode": "fusion", + "shape": "(s32[1500]{0}, s64[1500]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:527", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:527 (AbstractInversion.zeroed_ids_to_keep)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:567 (AbstractInversion.solve_ids_to_keep)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:684 (AbstractInversion.reconstruction)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "input_scatter_fusion.5", + "ms": 0.002176, + "opcode": "fusion", + "shape": "s64[1500]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:527", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:527 (AbstractInversion.zeroed_ids_to_keep)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:567 (AbstractInversion.solve_ids_to_keep)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:684 (AbstractInversion.reconstruction)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "loop_reduce_window_fusion.1", + "ms": 0.0021536, + "opcode": "fusion", + "shape": "s64[6,16]{1,0}", + "source": "", + "stack": [] + } + ], + "chi_squared_evidence": [ + { + "instruction": "loop_divide_fusion", + "ms": 0.0050848, + "opcode": "fusion", + "shape": "f64[15361,20]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/abstract_ndarray.py:352", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/abstract_ndarray.py:352 (AbstractNDArray.__truediv__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/abstract_ndarray.py:57 (unwrap_array..wrapper)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/abstract_ndarray.py:35 (to_new_array..wrapper)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_util.py:78 (chi_squared_map_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:78 (AbstractFit.chi_squared_map)" + ] + } + ] + }, + "stage_audit_note": "The HLO instructions that contributed most of each stage's milliseconds, with their full source stack. A stage row is only as good as the rules that built it; this is how a reader checks a row against the HLO instead of trusting it.", + "untraced_wall_ms": 613.6301525002636, + "reconciliation_vs_untraced_pct": 0.892494815879428, + "wall_basis": "wall_ms is the TRACED run's wall, the run these kernel durations came from. untraced_wall_ms is the same executable without the profiler; the difference is the profiler's overhead and belongs in neither the stages nor the idle row.", + "calls": 10, + "call_split": "per-call (first-instruction recurrence)", + "call_blocks": 10, + "events": 98600, + "streams": [ + "Stream #14(MemcpyH2D,MemcpyD2D,Compute,MemcpyD2H)" + ], + "per_stage_ms": { + "border_relocator": { + "median_ms": 0.0915045, + "min_ms": 0.091201, + "max_ms": 0.09174500000000001 + }, + "chi_squared_evidence": { + "median_ms": 0.005072, + "min_ms": 0.004928, + "max_ms": 0.005248 + }, + "curvature_matrix_F": { + "median_ms": 81.08069449999999, + "min_ms": 80.577891, + "max_ms": 81.581507 + }, + "inversion_other": { + "median_ms": 15.332442999999996, + "min_ms": 15.092703999999987, + "max_ms": 15.574853000000006 + }, + "mapping_matrix": { + "median_ms": 0.0630885, + "min_ms": 0.060577, + "max_ms": 0.065793 + }, + "mesh_construction": { + "median_ms": 0.008992, + "min_ms": 0.008864, + "max_ms": 0.009215999999999998 + }, + "mesh_dual_areas": { + "median_ms": 0.006512, + "min_ms": 0.006464, + "max_ms": 0.00656 + }, + "mesh_locate_walk": { + "median_ms": 1.0009050000000004, + "min_ms": 0.9965819999999999, + "max_ms": 1.0042619999999998 + }, + "mesh_qhull_callback": { + "median_ms": 0.24676950000000009, + "min_ms": 0.24589000000000005, + "max_ms": 0.24761599999999998 + }, + "mesh_seed_argmin": { + "median_ms": 1.7011029999999998, + "min_ms": 1.6961709999999999, + "max_ms": 1.7059049999999996 + }, + "mixed_fusion": { + "median_ms": 43.4708965, + "min_ms": 43.25550799999998, + "max_ms": 43.88580900000001 + }, + "other": { + "median_ms": 0.32461300000000004, + "min_ms": 0.323396, + "max_ms": 0.32560499999999987 + }, + "pdip_solve": { + "median_ms": 221.8421115000016, + "min_ms": 221.26421800000227, + "max_ms": 222.2356290000012 + }, + "psf_convolution_mapping_matrix": { + "median_ms": 142.071821, + "min_ms": 141.76865099999998, + "max_ms": 142.18634899999998 + }, + "regularization_H": { + "median_ms": 0.0034720000000000003, + "min_ms": 0.003424, + "max_ms": 0.003872 + } + }, + "stage_order": [ + "border_relocator", + "mesh_qhull_callback", + "mesh_seed_argmin", + "mesh_locate_walk", + "mesh_dual_areas", + "mesh_construction", + "mapping_matrix", + "psf_convolution_mapping_matrix", + "curvature_matrix_F", + "regularization_H", + "pdip_solve", + "chi_squared_evidence", + "inversion_other", + "mixed_fusion", + "other" + ], + "mixed_fusion": { + "ms": 43.4708965, + "constituent_stage_sets": { + "curvature_matrix_F + psf_convolution_mapping_matrix": 21.0109305, + "curvature_reg_reduce_gather + inversion_other + mapped_reconstruction + pdip_solve + reconstruction_scatter": 8.1490747, + "pdip_solve + psf_convolution_mapping_matrix": 5.0197235, + "data_vector_D + pdip_solve": 2.630171, + "mapped_reconstruction + pdip_solve": 2.188721, + "mapping_matrix + pdip_solve": 2.1220413000000002, + "pdip_solve + regularization_H": 0.9421704, + "inversion_other + pdip_solve + regularization_H": 0.5515274000000001, + "inversion_other + pdip_solve": 0.23193460000000005, + "inversion_other + regularization_H": 0.19064779999999992, + "inversion_other + mapping_matrix + mesh_construction + mesh_interpolation_weights + pdip_solve": 0.07794949999999999, + "mapping_matrix + mesh_interpolation_weights + pdip_solve": 0.07699539999999999, + "grids_and_structures + mass_profile_deflections + ray_trace_data_grid": 0.0345057, + "inversion_other + mesh_construction + mesh_interpolation_weights": 0.025264099999999998, + "inversion_other + mesh_construction + mesh_dual_areas + mesh_interpolation_weights": 0.024495999999999997, + "grids_and_structures + mass_profile_deflections + pdip_solve + ray_trace_data_grid": 0.0241891, + "inversion_other + mesh_construction + mesh_dual_areas + mesh_interpolation_weights + pdip_solve + regularization_H": 0.0238757, + "border_relocator + pdip_solve": 0.020390400000000003, + "inversion_other + mapping_matrix + mesh_construction + mesh_interpolation_weights": 0.016192099999999997, + "pdip_solve + ray_trace_data_grid": 0.013238499999999993, + "mesh_construction + pdip_solve + regularization_H": 0.0123904, + "mesh_dual_areas + mesh_interpolation_weights": 0.0109058, + "mesh_construction + mesh_seed_argmin + pdip_solve + regularization_H": 0.010268800000000002, + "inversion_other + mapped_reconstruction": 0.009689600000000001, + "chi_squared_evidence + pdip_solve": 0.0096706, + "inversion_other + mapped_reconstruction + reconstruction_scatter + regularization_H": 0.009229, + "inversion_other + mapped_reconstruction + reconstruction_scatter": 0.008998399999999998, + "mesh_locate_walk + mesh_seed_argmin": 0.008918500000000001, + "inversion_other + mesh_dual_areas + mesh_locate_walk": 0.0083714, + "mesh_construction + mesh_dual_areas + mesh_interpolation_weights + pdip_solve + regularization_H": 0.006624, + "inversion_other + pdip_solve + ray_trace_data_grid": 0.0046625, + "grids_and_structures + mass_profile_deflections + pdip_solve": 0.0045088, + "mapping_matrix + pdip_solve + regularization_H": 0.004220799999999999, + "inversion_other + mesh_locate_walk + mesh_seed_argmin": 0.0039073, + "inversion_other + mesh_dual_areas + mesh_locate_walk + pdip_solve": 0.0038176000000000004, + "inversion_other + mesh_interpolation_weights": 0.0037503999999999997, + "inversion_other + mesh_construction + mesh_interpolation_weights + pdip_solve + regularization_H": 0.0032896, + "inversion_other + mesh_construction + regularization_H": 0.0027745, + "chi_squared_evidence + inversion_other": 0.0023648000000000002, + "inversion_other + mapping_matrix": 0.0020961 + }, + "example_kernels": { + "curvature_matrix_F + psf_convolution_mapping_matrix": [ + "loop_divide_gather_fusion" + ], + "curvature_reg_reduce_gather + inversion_other + mapped_reconstruction + pdip_solve + reconstruction_scatter": [ + "input_multiply_transpose_fusion" + ], + "pdip_solve + psf_convolution_mapping_matrix": [ + "loop_broadcast_fusion.6" + ], + "data_vector_D + pdip_solve": [ + "input_reduce_fusion.7", + "input_reduce_fusion.32" + ], + "mapped_reconstruction + pdip_solve": [ + "input_reduce_fusion.11" + ], + "mapping_matrix + pdip_solve": [ + "loop_broadcast_fusion.8", + "loop_divide_fusion.1" + ], + "pdip_solve + regularization_H": [ + "loop_broadcast_fusion", + "input_transpose_fusion.4" + ], + "inversion_other + pdip_solve + regularization_H": [ + "input_transpose_fusion.5", + "loop_log_fusion" + ], + "inversion_other + pdip_solve": [ + "input_reduce_fusion.9", + "input_reduce_fusion.10", + "input_transpose_fusion.2", + "input_reduce_fusion.15" + ], + "inversion_other + regularization_H": [ + "input_reduce_fusion.29", + "input_reduce_fusion.22", + "input_reduce_fusion.23", + "input_reduce_fusion.24" + ] + }, + "prorated_estimate_ms": { + "psf_convolution_mapping_matrix": 13.015327, + "curvature_matrix_F": 10.50546525, + "pdip_solve": 8.468068135000001, + "mapped_reconstruction": 2.734326956666667, + "inversion_other": 2.085552568333333, + "reconstruction_scatter": 1.6351216566666666, + "curvature_reg_reduce_gather": 1.62981494, + "data_vector_D": 1.3150855, + "mapping_matrix": 1.1087786916666666, + "regularization_H": 0.76754992, + "mesh_interpolation_weights": 0.07313852833333333, + "mesh_construction": 0.047767461666666663, + "ray_trace_data_grid": 0.025722591666666666, + "mesh_dual_areas": 0.02062585, + "grids_and_structures": 0.019052108333333335, + "mass_profile_deflections": 0.019052108333333335, + "border_relocator": 0.010195200000000001, + "mesh_locate_walk": 0.00950655, + "mesh_seed_argmin": 0.008328883333333335, + "chi_squared_evidence": 0.0060177 + }, + "prorated_note": "ESTIMATE ONLY \u2014 a mixed fusion's time split equally across the stages its constituents span. Never summed into the measured table, never reconciled." + }, + "other_sources_ms": { + "copy.113": 0.048160299999999885, + "copy.115": 0.04006430000000008, + "copy.117": 0.03996200000000011, + "copy.116": 0.039757400000000116, + "copy.114": 0.0392327, + "copy.98": 0.0384193, + "copy.99": 0.03582759999999998, + "copy.97": 0.032233900000000024, + "loop_broadcast_fusion.1": 0.0028095999999999998, + "copy.112": 0.0022848, + "copy.89": 0.0022688, + "copy.50": 0.0021344, + "loop_broadcast_fusion.4": 0.0014049 + }, + "device_span_ms": 618.9797929, + "device_busy_ms": 507.1230211, + "device_idle_ms": 111.85677179999999, + "largest_idle_gaps": [ + { + "gap_ms": 5.485891, + "after": "pure_callback.0", + "before": "pure_callback.0" + }, + { + "gap_ms": 5.048097, + "after": "pure_callback.0", + "before": "pure_callback.0" + }, + { + "gap_ms": 4.939648, + "after": "pure_callback.0", + "before": "pure_callback.0" + }, + { + "gap_ms": 4.919775, + "after": "pure_callback.0", + "before": "pure_callback.0" + }, + { + "gap_ms": 4.878335, + "after": "pure_callback.0", + "before": "pure_callback.0" + }, + { + "gap_ms": 4.871359, + "after": "pure_callback.0", + "before": "pure_callback.0" + }, + { + "gap_ms": 4.850975, + "after": "pure_callback.0", + "before": "pure_callback.0" + }, + { + "gap_ms": 4.837407, + "after": "pure_callback.0", + "before": "pure_callback.0" + } + ], + "kernel_ms": 507.2499980000016, + "sum_ms": 619.1067698000015, + "wall_ms": 619.0847408000991, + "host_outside_span_ms": 0.10494790009909138, + "reconciliation_pct": 0.0035583173757378697, + "unjoined_ms": 0.0, + "unjoined_pct": 0.0, + "other_ms": 0.32461300000000004, + "other_pct": 0.052434340342563335, + "note": "Stage rows attribute the command-buffers-OFF program (see the module docstring): kernel times are the same, the launch overhead the CUDA graphs remove is not. sum_ms = kernel rows + device_idle_ms; the residual against wall_ms is host_outside_span_ms (dispatch before the first kernel, teardown after the last).", + "per_stage_ms_per_lane": { + "border_relocator": 0.0045752250000000005, + "chi_squared_evidence": 0.0002536, + "curvature_matrix_F": 4.054034724999999, + "inversion_other": 0.7666221499999998, + "mapping_matrix": 0.003154425, + "mesh_construction": 0.0004496, + "mesh_dual_areas": 0.0003256, + "mesh_locate_walk": 0.05004525000000002, + "mesh_qhull_callback": 0.012338475000000005, + "mesh_seed_argmin": 0.08505515, + "mixed_fusion": 2.173544825, + "other": 0.016230650000000003, + "pdip_solve": 11.09210557500008, + "psf_convolution_mapping_matrix": 7.10359105, + "regularization_H": 0.00017360000000000002 + }, + "per_lane_divisor": 20, + "host_callback": { + "pure_callback_span_ms": 105.14257829999998, + "qhull_ms": 91.97451589999999, + "callback_body_ms_note": "the OUTERMOST matching body event, not a sum: under the probe the body appears twice (the wrapper and the timed re-implementation it calls) and summing them would count the same work twice", + "events_by_name": { + "pure_callback.0": { + "count": 200, + "ms": 105.14257829999998 + }, + "$callback.py:815 _wrapped_callback": { + "count": 200, + "ms": 96.74478699999999 + }, + "$callback.py:224 _callback": { + "count": 200, + "ms": 96.29638380000007 + }, + "$callback.py:74 pure_callback_impl": { + "count": 200, + "ms": 96.12194259999993 + }, + "$callback.py:69 __call__": { + "count": 200, + "ms": 92.28282549999999 + }, + "$delaunay.py:162 ": { + "count": 200, + "ms": 92.14507390000001 + }, + "$host_callback_probe.py:225 wrapped": { + "count": 200, + "ms": 91.97451589999999 + }, + "$host_callback_probe.py:160 _timed_tri_only": { + "count": 200, + "ms": 91.82591640000001 + }, + "$callback.py:822 ": { + "count": 800, + "ms": 0.27534069999999966 + }, + "ThenExecuteCallback:GetEventForComputeStreamSyncPoint": { + "count": 10, + "ms": 0.021091699999999998 + }, + "$__init__.py:132 _xla_gc_callback": { + "count": 2, + "ms": 0.000496 + } + }, + "note": "HOST milliseconds per traced BATCH (the whole invocation), aggregated by name because the events nest. Not a row of the device table: the device pays for them as the idle gaps largest_idle_gaps names." + }, + "host_callback_ms": 105.14257829999998 + }, + "hlo_census": { + "status": "excluded", + "reason": "The legacy census anchors PyAutoArray source line numbers that moved after the phase-1 run. No batched attribution is published from unsupported anchors; the device-event table and wall reconciliation remain valid." + }, + "trace_split": { + "expected_calls": 10, + "executions_per_invocation": 1, + "method": "per-call (first-instruction recurrence)", + "note": "DECIDED IN CODE: the scalar arm's trace is split by trace_calls * B, so every lane's execution is its own block and the per-stage median is taken over all of them. The vmap arm's is split by trace_calls, one block per batched execution, and per_stage_ms_per_lane divides those rows by B." + } + }, + "scalar": { + "arm": "scalar", + "program": "jax.jit(fn), called B times", + "stands_for": "Nautilus(use_jax_vmap=False, use_jax_jit=True). Plain use_jax_vmap=False is UNJITTED and is NOT this arm", + "hlo_source": "jax.jit(fn).lower(lane_trees[0]) \u2014 the same program phase 1 traced", + "batch_wall_ms": 685.8309781000571, + "wall_production_nesting_ms": 685.8309781000571, + "wall_aot_command_buffers_on_ms": 686.2691859001643, + "wall_aot_command_buffers_off_ms": 691.6505541001243, + "command_buffer_delta_ms": 5.381368199959979, + "production_nesting_vs_aot_on_delta_ms": -0.4382078001071932, + "production_nesting_vs_aot_on_delta_pct": -0.06385363194362363, + "wall_per_lane_ms": 34.291548905002855, + "wall_per_lane_command_buffers_off_ms": 34.582527705006214, + "traced_batch_wall_ms": 712.2790306999377, + "untraced_batch_wall_ms": 691.2769196002046, + "traced_wall_per_lane_ms": 35.613951534996886, + "callback_count_per_call": 20.0, + "callback_count_per_lane": 1.0, + "callback_expectation": "1 per likelihood evaluation, B per batch", + "host_qhull_ms": 90.7679644991731, + "host_tables_ms": 2.3583559992403025, + "host_qhull_ms_per_lane": 4.538398224958655, + "host_tables_ms_per_lane": 0.11791779996201512, + "host_callback_probe": { + "calls": 200, + "qhull_ms_total": 907.679644991731, + "tables_ms_total": 23.583559992403025, + "total_ms_total": 931.2632049841341, + "qhull_ms_mean": 4.538398224958655, + "tables_ms_mean": 0.11791779996201512, + "total_ms_mean": 4.65631602492067, + "non_finite_calls": 0, + "n_points": [ + 1500 + ] + }, + "host_callback_records_first": [ + { + "n_points": 1500, + "qhull_ms": 4.801352999493247, + "tables_ms": 0.17543799913255498, + "total_ms": 4.976790998625802, + "finite": true + }, + { + "n_points": 1500, + "qhull_ms": 4.6091959993646014, + "tables_ms": 0.12426800094544888, + "total_ms": 4.73346400031005, + "finite": true + }, + { + "n_points": 1500, + "qhull_ms": 4.555195999273565, + "tables_ms": 0.11976800306001678, + "total_ms": 4.6749640023335814, + "finite": true + }, + { + "n_points": 1500, + "qhull_ms": 4.538047000096412, + "tables_ms": 0.11796800026786514, + "total_ms": 4.6560150003642775, + "finite": true + } + ], + "device_idle_ms": 6.569015244999999, + "device_idle_ms_per_lane": 6.569015244999999, + "trace": { + "parser": "ProfileData.from_file(xplane) + as_text() + stack_frame_index(proto field 17)", + "stage_audit": { + "mixed_fusion": [ + { + "instruction": "loop_divide_gather_fusion", + "ms": 1.014830575, + "opcode": "fusion", + "shape": "(f64[15361,1,1,1500]{3,2,1,0}, f64[15361,1,1,1500]{3,2,1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:133", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:133 (curvature_matrix_via_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:93 (InversionImagingMapping.curvature_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:389 (AbstractInversion.curvature_reg_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "loop_broadcast_fusion.4", + "ms": 0.22561039500000007, + "opcode": "fusion", + "shape": "f64[1500,180,180]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "input_reduce_fusion.5", + "ms": 0.12116068500000002, + "opcode": "fusion", + "shape": "f64[92,1500]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/inversion_imaging_util.py:123", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/inversion_imaging_util.py:123 (data_vector_via_blurred_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:67 (InversionImagingMapping.data_vector)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:699 (AbstractInversion.reconstruction)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "input_reduce_fusion.9", + "ms": 0.11469936500000001, + "opcode": "fusion", + "shape": "f64[15361]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:163", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:163 (mapped_reconstructed_data_via_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:120 (InversionImagingMapping._mapped_reconstructed_data_dict_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:196 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "loop_broadcast_fusion.2", + "ms": 0.11041876500000011, + "opcode": "fusion", + "shape": "f64[15361,1500]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:342", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:342 (mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/abstract.py:283 (Mapper.mapping_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:91 (AbstractInversionImaging._mapping_matrix_for_convolution_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:137 (AbstractInversionImaging.operated_mapping_matrix_list)" + ] + }, + { + "instruction": "input_multiply_transpose_fusion", + "ms": 0.10953336000000004, + "opcode": "fusion", + "shape": "(f64[1500,1500]{1,0}, f64[1500,1500]{1,0}, f64[1500,1500]{1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:237 (active_set_search)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:293 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:274 (_certified_positive_only_from)" + ] + } + ], + "border_relocator": [ + { + "instruction": "eigh.45", + "ms": 0.0745658599999995, + "opcode": "custom-call", + "shape": "(f64[2,2]{0,1}, f64[2]{0}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:245", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:245 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:454 (BorderRelocator.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:176 (AbstractMesh.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:214 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "custom-call.2", + "ms": 0.007951620000000019, + "opcode": "custom-call", + "shape": "(f64[2,2]{1,0}, s8[4194304]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:242", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:242 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:454 (BorderRelocator.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:176 (AbstractMesh.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:214 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "input_reduce_fusion.10", + "ms": 0.005889879999999996, + "opcode": "fusion", + "shape": "(f64[], f64[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:269", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:269 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:454 (BorderRelocator.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:176 (AbstractMesh.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:214 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "loop_add_fusion.3", + "ms": 0.003586034999999997, + "opcode": "fusion", + "shape": "f64[15361]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:308", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:308 (relocated_grid_via_ellipse_border_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:423 (BorderRelocator.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:83 (AbstractMesh.relocated_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:208 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "loop_add_fusion.5", + "ms": 0.003427964999999993, + "opcode": "fusion", + "shape": "f64[1500]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:308", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:308 (relocated_grid_via_ellipse_border_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:458 (BorderRelocator.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:176 (AbstractMesh.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:214 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + }, + { + "instruction": "input_concatenate_fusion.12", + "ms": 0.0024041449999999977, + "opcode": "fusion", + "shape": "f64[392,2]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:238", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:238 (ellipse_params_via_border_pca_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/border_relocator.py:454 (BorderRelocator.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/abstract.py:176 (AbstractMesh.relocated_mesh_grid_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/mesh/delaunay.py:214 (Delaunay.interpolator_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/galaxy/to_inversion.py:489 (GalaxiesToInversion.mapper_from)" + ] + } + ], + "mesh_construction": [ + { + "instruction": "input_concatenate_fusion.7", + "ms": 0.001939029999999998, + "opcode": "fusion", + "shape": "f64[1500,2]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:820", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:820 (InterpolatorDelaunay.mesh_grid_xy)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:847 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + } + ], + "mesh_qhull_callback": [ + { + "instruction": "pure_callback.4", + "ms": 0.010609819999999987, + "opcode": "custom-call", + "shape": "(s32[3000,3]{1,0}, s32[3000,3]{1,0}, s32[1500]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:161", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:161 (_jax_delaunay_tables)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:405 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + } + ], + "other": [ + { + "instruction": "copy.80", + "ms": 0.0416873749999986, + "opcode": "copy", + "shape": "f64[1,1024,2]{2,1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "copy.48", + "ms": 0.01709492000000022, + "opcode": "copy", + "shape": "s32[21361]{0}", + "source": "", + "stack": [] + }, + { + "instruction": "copy.53", + "ms": 0.002002704999999998, + "opcode": "copy", + "shape": "s64[1500]{0}", + "source": "", + "stack": [] + }, + { + "instruction": "copy.79", + "ms": 0.0017998299999999966, + "opcode": "copy", + "shape": "s32[]", + "source": "", + "stack": [] + }, + { + "instruction": "copy.78", + "ms": 0.0017754899999999996, + "opcode": "copy", + "shape": "s64[]", + "source": "", + "stack": [] + }, + { + "instruction": "copy.39", + "ms": 0.0016524749999999953, + "opcode": "copy", + "shape": "s32[]", + "source": "", + "stack": [] + } + ], + "mesh_seed_argmin": [ + { + "instruction": "input_reduce_fusion", + "ms": 0.14850283000000372, + "opcode": "fusion", + "shape": "(f64[1024]{0}, s64[1024]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:191", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:191 (_nearest_vertex_seed_from..argmin_chunk)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204 (_nearest_vertex_seed_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:351 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)" + ] + }, + { + "instruction": "loop_dynamic_update_slice_fusion", + "ms": 0.04091853499999826, + "opcode": "fusion", + "shape": "s32[21,1024]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204 (_nearest_vertex_seed_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:351 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "loop_add_fusion", + "ms": 0.031879360000000044, + "opcode": "fusion", + "shape": "s64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204 (_nearest_vertex_seed_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:351 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "loop_broadcast_fusion", + "ms": 0.0019465549999999965, + "opcode": "fusion", + "shape": "s32[21,1024]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:204 (_nearest_vertex_seed_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:351 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "pdip_solve": [ + { + "instruction": "cholesky.50", + "ms": 7.571322239999946, + "opcode": "custom-call", + "shape": "(f64[1500,1500]{0,1}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:252 (active_set_search..body_fun)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:262 (active_set_search)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:293 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)" + ] + }, + { + "instruction": "triangular-solve.1", + "ms": 1.3521416300000395, + "opcode": "custom-call", + "shape": "(f64[1500,1]{0,1}, s8[0]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:154", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:154 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:252 (active_set_search..body_fun)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:262 (active_set_search)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:293 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)" + ] + }, + { + "instruction": "triangular-solve", + "ms": 1.1715294199999895, + "opcode": "custom-call", + "shape": "(f64[1500,1]{0,1}, s8[0]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:154", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:154 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:252 (active_set_search..body_fun)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:262 (active_set_search)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:293 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)" + ] + }, + { + "instruction": "cholesky.70", + "ms": 0.8921585999999985, + "opcode": "custom-call", + "shape": "(f64[1500,1500]{0,1}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:297 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:274 (_certified_positive_only_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:496 (reconstruction_positive_only_from)" + ] + }, + { + "instruction": "cholesky.60", + "ms": 0.8642273799999994, + "opcode": "custom-call", + "shape": "(f64[1500,1500]{0,1}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:237 (active_set_search)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:293 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:274 (_certified_positive_only_from)" + ] + }, + { + "instruction": "input_transpose_fusion", + "ms": 0.2996470950000008, + "opcode": "fusion", + "shape": "f64[1500,1500]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:153 (masked_solve)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:252 (active_set_search..body_fun)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:262 (active_set_search)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:293 (solve_certified)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/util/jax_active_set.py:341 (solve_certified_with_fallback)" + ] + } + ], + "regularization_H": [ + { + "instruction": "input_scatter_fusion.10", + "ms": 0.0020590249999999947, + "opcode": "fusion", + "shape": "f64[1500,1500]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:615", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:615 (pixel_splitted_regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt_split.py:137 (AdaptSplit.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:332 (AbstractInversion.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "input_concatenate_fusion.8", + "ms": 0.0018705649999999972, + "opcode": "fusion", + "shape": "pred[3]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:93", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:93 (split_points_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:410 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + }, + { + "instruction": "input_concatenate_fusion.9", + "ms": 0.0018559750000000012, + "opcode": "fusion", + "shape": "pred[3]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:91", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:91 (split_points_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:410 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + }, + { + "instruction": "input_concatenate_fusion.10", + "ms": 0.0018550400000000016, + "opcode": "fusion", + "shape": "pred[3]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:90", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:90 (split_points_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:410 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + }, + { + "instruction": "input_concatenate_fusion", + "ms": 0.0017529450000000014, + "opcode": "fusion", + "shape": "s32[1500,2]{1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:615", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:615 (pixel_splitted_regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt_split.py:137 (AdaptSplit.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:332 (AbstractInversion.regularization_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "input_concatenate_fusion.11", + "ms": 0.0015462449999999988, + "opcode": "fusion", + "shape": "pred[3]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:88", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/regularization_util.py:88 (split_points_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:410 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:957 (InterpolatorDelaunay._mappings_sizes_weights)" + ] + } + ], + "mesh_locate_walk": [ + { + "instruction": "input_reduce_fusion.1", + "ms": 0.025416295000000685, + "opcode": "fusion", + "shape": "pred[196]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:288", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:288 (_walk_from_seed..cond)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:353 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)" + ] + }, + { + "instruction": "loop_reduce_fusion", + "ms": 0.025351530000000278, + "opcode": "fusion", + "shape": "(f64[21361]{0}, s64[21361]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:264", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:264 (_walk_from_seed..walk_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:292 (_walk_from_seed..body)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:264 (_walk_from_seed..walk_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:292 (_walk_from_seed..body)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)" + ] + }, + { + "instruction": "loop_or_select_fusion", + "ms": 0.022417385000000328, + "opcode": "fusion", + "shape": "(s32[21361]{0}, pred[21361]{0}, pred[21361]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:270", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:270 (_walk_from_seed..walk_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:292 (_walk_from_seed..body)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:353 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)" + ] + }, + { + "instruction": "loop_select_fusion", + "ms": 0.020096609999999963, + "opcode": "fusion", + "shape": "s32[21361]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:242", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:242 (_walk_from_seed..weights_of)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:262 (_walk_from_seed..walk_step)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:292 (_walk_from_seed..body)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:353 (pix_indexes_delaunay_walk_from)" + ] + }, + { + "instruction": "input_reduce_fusion.2", + "ms": 0.016372954999999835, + "opcode": "fusion", + "shape": "pred[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:288", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:288 (_walk_from_seed..cond)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:353 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)" + ] + }, + { + "instruction": "while.20", + "ms": 0.014597884999999899, + "opcode": "while", + "shape": "(s32[], s32[21361]{0}, pred[21361]{0}, pred[21361]{0}, s32[3000,3]{1,0}, /*index=5*/f64[1500,2]{1,0}, f64[21361,2]{1,0}, s32[3000,3]{1,0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:295 (_walk_from_seed)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:353 (pix_indexes_delaunay_walk_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:423 (jax_delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mesh/interpolator/delaunay.py:846 (InterpolatorDelaunay.delaunay)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "psf_convolution_mapping_matrix": [ + { + "instruction": "input_scatter_fusion", + "ms": 1.97975727, + "opcode": "fusion", + "shape": "f64[1500,180,180]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "fft.19.0", + "ms": 1.7551799450000005, + "opcode": "fft", + "shape": "f64[1500,180,180]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "fft.15.0", + "ms": 1.3641246450000013, + "opcode": "fft", + "shape": "c128[1500,180,91]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1228 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "fft.17.0", + "ms": 0.9786353050000003, + "opcode": "fft", + "shape": "c128[1500,91,180]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "input_transpose_fusion.2", + "ms": 0.5137602899999998, + "opcode": "fusion", + "shape": "c128[1500,91,180]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + }, + { + "instruction": "wrapped_transpose", + "ms": 0.4983216949999999, + "opcode": "fusion", + "shape": "c128[1500,180,91]{2,1,0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/operators/convolver.py:1232 (Convolver.convolved_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/abstract.py:136 (AbstractInversionImaging.operated_mapping_matrix_list)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:197 (InversionImagingMapping.mapped_reconstructed_operated_data_dict)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:856 (AbstractInversion.mapped_reconstructed_operated_data)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/fit_imaging.py:199 (FitImaging.model_data)" + ] + } + ], + "inversion_other": [ + { + "instruction": "cholesky.80", + "ms": 0.8954901000000013, + "opcode": "custom-call", + "shape": "(f64[1500,1500]{0,1}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986 (AbstractInversion._log_det_symmetric_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:1078 (AbstractInversion.log_det_curvature_reg_matrix_term)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:347 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/model/analysis.py:135 (AnalysisImaging.log_likelihood_function)" + ] + }, + { + "instruction": "cholesky.90", + "ms": 0.8914510800000003, + "opcode": "custom-call", + "shape": "(f64[1500,1500]{0,1}, s32[])", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:986 (AbstractInversion._log_det_symmetric_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:1157 (AbstractInversion.log_det_regularization_matrix_term)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:348 (FitDataset.log_evidence)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:360 (FitDataset.figure_of_merit)", + "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/imaging/model/analysis.py:135 (AnalysisImaging.log_likelihood_function)" + ] + }, + { + "instruction": "loop_reduce_window_fusion.1", + "ms": 0.002767499999999998, + "opcode": "fusion", + "shape": "s64[94,16]{1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "loop_reduce_window_fusion", + "ms": 0.0026879849999999956, + "opcode": "fusion", + "shape": "s64[6,16]{1,0}", + "source": "", + "stack": [] + }, + { + "instruction": "loop_broadcast_convert_fusion", + "ms": 0.002175330000000001, + "opcode": "fusion", + "shape": "(s32[1500]{0}, s64[1500]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:527", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:527 (AbstractInversion.zeroed_ids_to_keep)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:567 (AbstractInversion.solve_ids_to_keep)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:684 (AbstractInversion.reconstruction)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + }, + { + "instruction": "input_scatter_fusion.5", + "ms": 0.001927665000000001, + "opcode": "fusion", + "shape": "s64[1500]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:527", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:527 (AbstractInversion.zeroed_ids_to_keep)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:567 (AbstractInversion.solve_ids_to_keep)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:684 (AbstractInversion.reconstruction)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "mapping_matrix": [ + { + "instruction": "input_reduce_fusion.23", + "ms": 0.0028863699999999914, + "opcode": "fusion", + "shape": "f64[]", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:93", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/mapper_util.py:93 (adaptive_pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/mappers/abstract.py:507 (Mapper.pixel_signals_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt.py:339 (Adapt.regularization_weights_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/regularization/adapt_split.py:120 (AdaptSplit.regularization_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/linear_obj/linear_obj.py:171 (LinearObj.regularization_matrix)" + ] + } + ], + "curvature_matrix_F": [ + { + "instruction": "cublas-lt-matmul.2", + "ms": 4.198070774999998, + "opcode": "custom-call", + "shape": "(f64[1500,1500]{1,0}, s8[4194304]{0})", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:134", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/inversion_util.py:134 (curvature_matrix_via_mapping_matrix_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/imaging/mapping.py:93 (InversionImagingMapping.curvature_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/inversion/inversion/abstract.py:389 (AbstractInversion.curvature_reg_matrix)", + "/mnt/ral/jnightin/PyAuto/PyAutoNerves/autonerves/tools/decorators.py:22 (CachedProperty.__get__)" + ] + } + ], + "chi_squared_evidence": [ + { + "instruction": "loop_multiply_fusion", + "ms": 0.003009435000000001, + "opcode": "fusion", + "shape": "f64[15361]{0}", + "source": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/abstract_ndarray.py:300", + "stack": [ + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/abstract_ndarray.py:300 (AbstractNDArray.__pow__)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/abstract_ndarray.py:60 (unwrap_array..wrapper)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/abstract_ndarray.py:35 (to_new_array..wrapper)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_util.py:78 (chi_squared_map_from)", + "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/fit/fit_dataset.py:78 (AbstractFit.chi_squared_map)" + ] + } + ] + }, + "stage_audit_note": "The HLO instructions that contributed most of each stage's milliseconds, with their full source stack. A stage row is only as good as the rules that built it; this is how a reader checks a row against the HLO instead of trusting it.", + "untraced_wall_ms": 34.56384598001023, + "reconciliation_vs_untraced_pct": 6.815444572783263, + "wall_basis": "wall_ms is the TRACED run's wall, the run these kernel durations came from. untraced_wall_ms is the same executable without the profiler; the difference is the profiler's overhead and belongs in neither the stages nor the idle row.", + "calls": 200, + "call_split": "per-call (first-instruction recurrence)", + "call_blocks": 200, + "events": 99770, + "streams": [ + "Stream #14(MemcpyD2H,Compute,MemcpyH2D,Memset,MemcpyD2D)" + ], + "per_stage_ms": { + "border_relocator": { + "median_ms": 0.10128100000000001, + "min_ms": 0.10073700000000002, + "max_ms": 0.10217800000000002 + }, + "chi_squared_evidence": { + "median_ms": 0.003008, + "min_ms": 0.002816, + "max_ms": 0.003392 + }, + "curvature_matrix_F": { + "median_ms": 4.196892500000001, + "min_ms": 4.178059, + "max_ms": 4.24619 + }, + "inversion_other": { + "median_ms": 1.7981955, + "min_ms": 1.778524, + "max_ms": 1.816411 + }, + "mapping_matrix": { + "median_ms": 0.00288, + "min_ms": 0.002879, + "max_ms": 0.002912 + }, + "memset": { + "median_ms": 0.0345595, + "min_ms": 0.010112999999999999, + "max_ms": 0.05388700000000001 + }, + "mesh_construction": { + "median_ms": 0.001952, + "min_ms": 0.001919, + "max_ms": 0.001953 + }, + "mesh_locate_walk": { + "median_ms": 0.14809750000000002, + "min_ms": 0.13023799999999996, + "max_ms": 0.18329300000000004 + }, + "mesh_qhull_callback": { + "median_ms": 0.01056, + "min_ms": 0.010495, + "max_ms": 0.011104 + }, + "mesh_seed_argmin": { + "median_ms": 0.22323500000000007, + "min_ms": 0.22285000000000008, + "max_ms": 0.22374600000000014 + }, + "mixed_fusion": { + "median_ms": 1.9799594999999997, + "min_ms": 1.9719579999999992, + "max_ms": 1.9930169999999996 + }, + "other": { + "median_ms": 0.065728, + "min_ms": 0.063329, + "max_ms": 0.070016 + }, + "pdip_solve": { + "median_ms": 14.683332, + "min_ms": 2.4254860000000003, + "max_ms": 23.052538000000023 + }, + "psf_convolution_mapping_matrix": { + "median_ms": 7.089918000000001, + "min_ms": 7.074800000000001, + "max_ms": 7.103885 + }, + "regularization_H": { + "median_ms": 0.010912, + "min_ms": 0.010784, + "max_ms": 0.011296 + } + }, + "stage_order": [ + "border_relocator", + "mesh_qhull_callback", + "mesh_seed_argmin", + "mesh_locate_walk", + "mesh_construction", + "mapping_matrix", + "psf_convolution_mapping_matrix", + "curvature_matrix_F", + "regularization_H", + "pdip_solve", + "chi_squared_evidence", + "inversion_other", + "mixed_fusion", + "other", + "memset" + ], + "mixed_fusion": { + "ms": 1.9799594999999997, + "constituent_stage_sets": { + "curvature_matrix_F + psf_convolution_mapping_matrix": 1.014830575, + "pdip_solve + psf_convolution_mapping_matrix": 0.22561039500000007, + "data_vector_D + pdip_solve": 0.12483967000000015, + "mapped_reconstruction + pdip_solve": 0.11469936500000001, + "mapping_matrix + pdip_solve": 0.11277122500000009, + "curvature_reg_reduce_gather + inversion_other + mapped_reconstruction + pdip_solve + reconstruction_scatter": 0.10953336000000004, + "pdip_solve + regularization_H": 0.045041625000000016, + "inversion_other + pdip_solve + regularization_H": 0.024227685000000013, + "inversion_other + pdip_solve": 0.02283095499999999, + "inversion_other + mapping_matrix + mesh_construction + mesh_dual_areas + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin + pdip_solve": 0.021145820000000003, + "inversion_other + mesh_construction + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin + pdip_solve + regularization_H": 0.019092000000000015, + "inversion_other + mesh_construction + mesh_dual_areas + mesh_interpolation_weights + pdip_solve + regularization_H": 0.014647434999999995, + "pdip_solve + ray_trace_data_grid": 0.013688684999999956, + "border_relocator + pdip_solve": 0.013573504999999991, + "inversion_other + mapping_matrix + mesh_construction + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin": 0.011668704999999996, + "grids_and_structures + mass_profile_deflections + pdip_solve": 0.010161980000000003, + "grids_and_structures + mass_profile_deflections + pdip_solve + ray_trace_data_grid": 0.009011490000000004, + "chi_squared_evidence + pdip_solve": 0.007725344999999981, + "inversion_other + mesh_construction + mesh_seed_argmin + pdip_solve + regularization_H": 0.006955930000000005, + "inversion_other + mesh_dual_areas + mesh_locate_walk": 0.006663660000000058, + "inversion_other + mesh_construction + pdip_solve + regularization_H": 0.006492274999999981, + "grids_and_structures + mass_profile_deflections + ray_trace_data_grid": 0.0054911500000000045, + "inversion_other + pdip_solve + ray_trace_data_grid": 0.005259500000000019, + "inversion_other + regularization_H": 0.005234534999999999, + "inversion_other + mapped_reconstruction + pdip_solve + reconstruction_scatter": 0.004753875, + "inversion_other + mapped_reconstruction + pdip_solve": 0.0037404800000000035, + "mapping_matrix + pdip_solve + regularization_H": 0.003474379999999996, + "inversion_other + mesh_construction + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin": 0.00310092, + "inversion_other + mesh_construction + mesh_dual_areas + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin": 0.002918069999999999, + "inversion_other + mesh_construction + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin + regularization_H": 0.0026831799999999986, + "inversion_other + mesh_dual_areas + mesh_locate_walk + pdip_solve": 0.0025835149999999946, + "inversion_other + mesh_locate_walk + mesh_seed_argmin": 0.0024814150000000037, + "inversion_other + mesh_interpolation_weights": 0.0021529750000000053, + "chi_squared_evidence + inversion_other": 0.0019567950000000003 + }, + "example_kernels": { + "curvature_matrix_F + psf_convolution_mapping_matrix": [ + "loop_divide_gather_fusion" + ], + "pdip_solve + psf_convolution_mapping_matrix": [ + "loop_broadcast_fusion.4" + ], + "data_vector_D + pdip_solve": [ + "input_reduce_fusion.5", + "input_reduce_fusion.21" + ], + "mapped_reconstruction + pdip_solve": [ + "input_reduce_fusion.9" + ], + "mapping_matrix + pdip_solve": [ + "loop_broadcast_fusion.2", + "loop_divide_fusion" + ], + "curvature_reg_reduce_gather + inversion_other + mapped_reconstruction + pdip_solve + reconstruction_scatter": [ + "input_multiply_transpose_fusion" + ], + "pdip_solve + regularization_H": [ + "loop_select_fusion.2", + "input_transpose_fusion.3" + ], + "inversion_other + pdip_solve + regularization_H": [ + "input_transpose_fusion.4" + ], + "inversion_other + pdip_solve": [ + "input_reduce_fusion.7", + "loop_log_fusion", + "input_reduce_fusion.8", + "input_reduce_fusion.12" + ], + "inversion_other + mapping_matrix + mesh_construction + mesh_dual_areas + mesh_interpolation_weights + mesh_locate_walk + mesh_seed_argmin + pdip_solve": [ + "input_scatter_fusion.6", + "input_scatter_fusion.3" + ] + }, + "prorated_estimate_ms": { + "psf_convolution_mapping_matrix": 0.620220485, + "curvature_matrix_F": 0.5074152875, + "pdip_solve": 0.39283176865476194, + "mapped_reconstruction": 0.08169164991666669, + "inversion_other": 0.06827755598809528, + "data_vector_D": 0.062419835000000076, + "mapping_matrix": 0.062131750833333374, + "regularization_H": 0.04300222082142858, + "reconstruction_scatter": 0.02309514075000001, + "curvature_reg_reduce_gather": 0.02190667200000001, + "mesh_construction": 0.01432465982142857, + "ray_trace_data_grid": 0.012680764999999986, + "mesh_locate_walk": 0.01256340298809526, + "mesh_interpolation_weights": 0.012386892571428575, + "mesh_seed_argmin": 0.011087490238095243, + "mesh_dual_areas": 0.008437910416666684, + "grids_and_structures": 0.007470582500000003, + "mass_profile_deflections": 0.007470582500000003, + "border_relocator": 0.0067867524999999955, + "chi_squared_evidence": 0.004841069999999991 + }, + "prorated_note": "ESTIMATE ONLY \u2014 a mixed fusion's time split equally across the stages its constituents span. Never summed into the measured table, never reconciled." + }, + "other_sources_ms": { + "copy.80": 0.0416873749999986, + "copy.48": 0.01709492000000022, + "copy.53": 0.002002704999999998, + "copy.79": 0.0017998299999999966, + "copy.78": 0.0017754899999999996, + "copy.39": 0.0016524749999999953 + }, + "device_span_ms": 35.60909475, + "device_busy_ms": 29.040079504999998, + "device_idle_ms": 6.569015244999999, + "largest_idle_gaps": [ + { + "gap_ms": 5.50344, + "after": "pure_callback.4", + "before": "pure_callback.4" + }, + { + "gap_ms": 0.140541, + "after": "input_transpose_fusion", + "before": "triangular-solve" + }, + { + "gap_ms": 0.031455, + "after": "pure_callback.4", + "before": "copy.79" + }, + { + "gap_ms": 0.028447, + "after": "while.20", + "before": "loop_add_fusion.4" + }, + { + "gap_ms": 0.028351, + "after": "input_concatenate_fusion.7", + "before": "pure_callback.4" + }, + { + "gap_ms": 0.028319, + "after": "input_reduce_fusion.20", + "before": "loop_broadcast_fusion.4" + }, + { + "gap_ms": 0.023904, + "after": "copy.48", + "before": "input_reduce_fusion.1" + }, + { + "gap_ms": 0.019039, + "after": "input_scatter_fusion.7", + "before": "loop_reduce_fusion.1" + } + ], + "kernel_ms": 30.350510500000002, + "sum_ms": 36.919525745, + "wall_ms": 35.613951534996886, + "host_outside_span_ms": 0.004856784996889019, + "reconciliation_pct": 3.6659066285305695, + "unjoined_ms": 0.0, + "unjoined_pct": 0.0, + "other_ms": 0.065728, + "other_pct": 0.1845568861838059, + "note": "Stage rows attribute the command-buffers-OFF program (see the module docstring): kernel times are the same, the launch overhead the CUDA graphs remove is not. sum_ms = kernel rows + device_idle_ms; the residual against wall_ms is host_outside_span_ms (dispatch before the first kernel, teardown after the last).", + "per_stage_ms_per_lane": { + "border_relocator": 0.10128100000000001, + "chi_squared_evidence": 0.003008, + "curvature_matrix_F": 4.196892500000001, + "inversion_other": 1.7981955, + "mapping_matrix": 0.00288, + "memset": 0.0345595, + "mesh_construction": 0.001952, + "mesh_locate_walk": 0.14809750000000002, + "mesh_qhull_callback": 0.01056, + "mesh_seed_argmin": 0.22323500000000007, + "mixed_fusion": 1.9799594999999997, + "other": 0.065728, + "pdip_solve": 14.683332, + "psf_convolution_mapping_matrix": 7.089918000000001, + "regularization_H": 0.010912 + }, + "per_lane_divisor": 1, + "host_callback": { + "pure_callback_span_ms": 99.9314493, + "qhull_ms": 93.31271309999998, + "callback_body_ms_note": "the OUTERMOST matching body event, not a sum: under the probe the body appears twice (the wrapper and the timed re-implementation it calls) and summing them would count the same work twice", + "events_by_name": { + "pure_callback.4": { + "count": 200, + "ms": 99.9314493 + }, + "$callback.py:815 _wrapped_callback": { + "count": 200, + "ms": 98.30340699999998 + }, + "$callback.py:224 _callback": { + "count": 200, + "ms": 97.8397079 + }, + "$callback.py:74 pure_callback_impl": { + "count": 200, + "ms": 97.6615542 + }, + "$callback.py:69 __call__": { + "count": 200, + "ms": 93.62564410000006 + }, + "$delaunay.py:162 ": { + "count": 200, + "ms": 93.48909439999997 + }, + "$host_callback_probe.py:225 wrapped": { + "count": 200, + "ms": 93.31271309999998 + }, + "$host_callback_probe.py:160 _timed_tri_only": { + "count": 200, + "ms": 93.15025310000003 + }, + "ThenExecuteCallback:GetEventForComputeStreamSyncPoint": { + "count": 200, + "ms": 0.36440779999999984 + }, + "$callback.py:822 ": { + "count": 800, + "ms": 0.2796993999999996 + }, + "$__init__.py:132 _xla_gc_callback": { + "count": 2, + "ms": 0.00037200000000000004 + } + }, + "note": "HOST milliseconds per traced BATCH (the whole invocation), aggregated by name because the events nest. Not a row of the device table: the device pays for them as the idle gaps largest_idle_gaps names." + }, + "host_callback_ms": 99.9314493 + }, + "hlo_census": { + "status": "excluded", + "reason": "The legacy census anchors PyAutoArray source line numbers that moved after the phase-1 run. No batched attribution is published from unsupported anchors; the device-event table and wall reconciliation remain valid." + }, + "trace_split": { + "expected_calls": 200, + "executions_per_invocation": 20, + "method": "per-call (first-instruction recurrence)", + "note": "DECIDED IN CODE: the scalar arm's trace is split by trace_calls * B, so every lane's execution is its own block and the per-stage median is taken over all of them. The vmap arm's is split by trace_calls, one block per batched execution, and per_stage_ms_per_lane divides those rows by B." + } + } + }, + "certification_report": { + "source": "vmap arm, library solve observed through its stats= out-dict (PyAutoArray #566) and jax.debug.callback(..., ordered=True); ordered because the unordered batching rule returns the lanes permuted. Untimed, separately compiled; max rel diff of its log likelihoods vs the timed arm's: nan", + "rows": 20, + "pdip_iter": "NOT AVAILABLE per lane without changing library numerics. The fallback branch calls the library's own reconstruction_positive_only_from, which returns the solution alone \u2014 jax_nnls.solve_nnls' iteration count is discarded inside the library's custom_vjp primal. The PDIP while_loop's cost is in the pdip_solve stage row of each arm's device table instead, which is a max-over-lanes quantity under vmap because every lane runs the same fixed kernel sequence.", + "passes_semantics": "library `passes`: restricted active-set passes run (jax_active_set.solve_certified)" + }, + "lane_construction": { + "draws_sha256": "2ef9de62dd3cb04c203df7c6177baeafe26acbe41f5db2137c5891526b265fcf", + "lane_rows": [ + 300, + 301, + 302, + 303, + 304, + 305, + 306, + 307, + 308, + 309, + 310, + 311, + 312, + 313, + 314, + 315, + 316, + 317, + 318, + 319 + ], + "calls": [ + 15 + ], + "stage": "pix1", + "regularization_range": { + "galaxies.source.pixelization.regularization.inner_coefficient": { + "min": 2.161360256524811e-06, + "max": 609.7498208301598 + }, + "galaxies.source.pixelization.regularization.outer_coefficient": { + "min": 3.4330906156470037e-06, + "max": 159.11676392313697 + }, + "galaxies.source.pixelization.regularization.signal_scale": { + "min": 0.12452271846719754, + "max": 0.9404155018121758 + } + }, + "phases": [ + "exploration" + ], + "window_rule": "nautilus_batches.timed_window: consecutive captured calls, in call order, from the FIRST call that is not a prior batch, concatenated and truncated to B; at B == n_batch exactly one real Nautilus batch. Falls back to the latest B lanes if the post-prior lanes run out; never repeats a lane.", + "note": "Lane k is captured lane lane_rows[k]: the mass AND shear of a real Nautilus proposal (nautilus_batch_capture.py), lens light fixed at S3, the S3 light-subtracted dataset shared by every lane. `offsets` in the lane table are the mass offsets from the fiducial; the shear is in the capture file." + }, + "captured": { + "batches_path": "/mnt/ral/jnightin/autolens_profiling_wt/certified-solver-phase-c1-lane-rate/results/breakdown/imaging/nautilus_batches_delaunay_pix1.npz", + "batches_sha256": "e71a5e23026b342d1ff4359b8fb914a87980d8aea0060659d2334dcfa3215c00", + "schema_version": 2, + "n_calls": 932, + "n_lanes": 18640, + "call_sizes_seen": [ + 20 + ], + "calls_by_phase": { + "prior": 15, + "exploration": 917 + }, + "parameter_paths": [ + "galaxies.source.pixelization.regularization.inner_coefficient", + "galaxies.source.pixelization.regularization.outer_coefficient", + "galaxies.source.pixelization.regularization.signal_scale", + "galaxies.lens.mass.centre.centre_0", + "galaxies.lens.mass.centre.centre_1", + "galaxies.lens.mass.einstein_radius", + "galaxies.lens.mass.ell_comps.ell_comps_0", + "galaxies.lens.mass.ell_comps.ell_comps_1", + "galaxies.lens.shear.gamma_1", + "galaxies.lens.shear.gamma_2" + ], + "stage": "pix1", + "regularization": { + "class": "AdaptSplit", + "free": true, + "priors": { + "inner_coefficient": [ + "LogUniform", + 1e-06, + 1000000.0 + ], + "outer_coefficient": [ + "LogUniform", + 1e-06, + 1000000.0 + ], + "signal_scale": [ + "Uniform", + 0.0, + 1.0 + ] + }, + "priors_source": "PyAutoGalaxy packaged config/priors/regularization (adapt_split.yaml / constant.yaml); adapt_split.yaml is identical to euclid_strong_lens_modeling_pipeline/config/priors/regularization/adapt_split.yaml" + }, + "nautilus": { + "departures_from_production": [ + "mass/shear priors are the phase-B cell's Gaussians, not chained from source_lp", + "no positions likelihood", + "the cell's mesh (Hilbert 1500, weight_power 1) in both stages; source_pix_2 redraws a 500-vertex Hilbert grid at weight_power 3.5", + "seeded (production passes no seed)", + "quick updates disabled (iterations_per_quick_update=1e12; render-only)", + "NullPaths: no output directory, so no checkpoint and one Sampler.run call", + "post-fit perform_update skipped (samples / latent variables never built)" + ], + "n_batch": 20, + "n_like_max": 40000, + "n_live": 150, + "number_of_cores": 1, + "production_reference": "euclid_strong_lens_modeling_pipeline/scripts/full_model.py source_pix_1 (n_live=150) / source_pix_2 (n_live=75): af.Nautilus(n_batch=20, **SettingsSearch.search_dict) with use_jax_vmap=True and number_of_cores=1 (SettingsSearch defaults)", + "production_stage": "source_pix_1", + "seed": 1, + "stage": "pix1", + "use_jax_vmap": true, + "version": "1.0.5" + }, + "capture_fit_status": "sampling complete (n_like_max or convergence); post-fit result skipped", + "capture_library_revisions": { + "PyAutoArray": { + "head": "7fa8d2714f7da43fec2b23c31bff580764831670", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoArray" + }, + "PyAutoFit": { + "head": "a736840127be7a3c21e15a5c945e94d8f1082983", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoFit" + }, + "PyAutoGalaxy": { + "head": "70a61e26cd715cefe7012a38285698091246a8a4", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy" + }, + "PyAutoLens": { + "head": "86054bbc19baa2f710a12e04a94fa27ab37cc354", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoLens" + }, + "PyAutoNerves": { + "head": "1fa613aa8d89a79613009fb66f5b4e2d21deb57a", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoNerves" + } + }, + "fingerprint_check": { + "fields": [ + "mesh", + "source_pixels", + "dataset_sha256", + "regularization_class", + "regularization_s0_fiducial", + "border_relocator", + "use_mixed_precision", + "log_evidence_s3_library" + ], + "not_identity": "the regularization coefficients: free per lane since the capture frees them", + "log_evidence_s3_library_rel_diff": 0.0, + "passed": true + }, + "timed_window_vs_capture_pdip": { + "reference": "the capture's own figure of merit (library PDIP, Fitness.call_wrap jax.jit(jax.vmap(call)) over parameter vectors) for the same lanes", + "compared_against": "this cell's jit(vmap) library-PDIP reference", + "n_compared": 20, + "max_rel_diff": 3.0218732230460707e-06, + "max_abs_diff_nats": 0.5352314353804104, + "gated": false, + "note": "RECORDED, NOT GATED: proves the lane trees rebuilt here are the models the sampler evaluated (a wrong parameter mapping shows up as nats, not 1e-10)." + } + }, + "matched": { + "vmap_wall_per_lane_ms": 30.486898884992115, + "scalar_wall_per_lane_ms": 34.291548905002855, + "speedup_vmap_over_scalar": 1.124796229172514, + "note": "Both walls are the PRODUCTION nesting of their arm, measured in one process on the same B lanes with the SAME library Settings (no injection). A speedup below 1 means the batch is slower per lane than B sequential jitted calls." + }, + "solver_source": "library", + "solver": "certified", + "certified_fallback": "none", + "certified_pass_budget": 16, + "certified_pass_budget_basis": "config default (Settings().certified_pass_budget)", + "certified_tau_rel": 1e-09, + "solver_used": "certified", + "solver_check": { + "solver_used": "certified", + "solver_used_source": "AbstractInversion.positive_only_solver_used on the fiducial S3 inversion, built eagerly on the JAX backend (AnalysisImaging(use_jax=True).fit_from) with the arms' Settings", + "reference_solver_used": "pdip", + "traced_solver_kwargs_jax": [ + "certified" + ], + "observed_calls_jax": 1, + "report_rows": 20, + "report_vs_timed_arm_max_rel_diff": NaN + }, + "lanes_certified": [ + true, + false, + true, + true, + true, + true, + true, + true, + true, + true, + true, + false, + true, + true, + false, + false, + true, + false, + false, + false + ], + "lanes_passes": [ + 10, + 16, + 0, + 0, + 10, + 4, + 0, + 1, + 4, + 0, + 2, + 16, + 9, + 2, + 16, + 16, + 16, + 16, + 16, + 16 + ], + "uncertified_lanes": 7, + "per_lane_certification_note": "certified / passes come from the library's own solve through its stats= out-dict (PyAutoArray #566): passes is the number of restricted active-set passes the library ran (0 when the unconstrained solve was already non-negative), certified is its KKT certificate. With certified_fallback=pdip a False lane returned the PDIP solution; with none it returned the last uncertified iterate. null for a library-PDIP row (no certificate).", + "gate": { + "pre_registered": true, + "gated": [ + "per lane: jit(vmap) arm vs jit(vmap) library PDIP <= lane_rtol relative", + "per lane: scalar jit arm vs scalar jit library PDIP <= lane_rtol relative" + ], + "recorded_not_gated": [ + "per lane: jit(vmap) arm vs scalar jit arm (rel_diff, abs_diff_nats)", + "per lane: jit(vmap) library PDIP vs scalar jit library PDIP", + "uncertified_lanes (certified_fallback=none rows)" + ], + "lanes_failed": 11, + "passed": false, + "policy_eligible": false, + "note": "Pre-registered before submission (module docstring; submit header). Phase 3 (results/notes/hst_gpu_residue_phase3_psf_2026_09.md) placed phase 2's ~2.5e-9 certified-vs-PDIP residual BETWEEN the jit(vmap) and scalar-jit compositions, not in the solver \u2014 so each arm is gated against the library-PDIP reference of its OWN composition, and the cross-composition difference is recorded with its nats. A certified_fallback=none row is policy-eligible only if every lane certifies AND passes the gate. Timing is never gated." + }, + "library_revisions": { + "PyAutoArray": { + "head": "3de624b5b91a4efa130dc3cb0a3a0f06f85025a3", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoArray", + "module_file": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/__init__.py" + }, + "PyAutoFit": { + "head": "dd9fbe0aab60c4a57702b1444ca031b317c91331", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoFit", + "module_file": "/mnt/ral/jnightin/PyAuto/PyAutoFit/autofit/__init__.py" + }, + "PyAutoGalaxy": { + "head": "70a61e26cd715cefe7012a38285698091246a8a4", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy", + "module_file": "/mnt/ral/jnightin/PyAuto/PyAutoGalaxy/autogalaxy/__init__.py" + }, + "PyAutoLens": { + "head": "86054bbc19baa2f710a12e04a94fa27ab37cc354", + "path": "/mnt/ral/jnightin/PyAuto/PyAutoLens", + "module_file": "/mnt/ral/jnightin/PyAuto/PyAutoLens/autolens/__init__.py" + }, + "autoarray_file": "/mnt/ral/jnightin/PyAuto/PyAutoArray/autoarray/__init__.py" + } + }, + "headline_arm_note": "`trace`, `hlo_census`, `command_buffers` and `trace_timing` above describe the scalar arm \u2014 the program phase 1 traced. Both arms' full blocks, the lane table and the matched comparison are under `vmap`." +} \ No newline at end of file diff --git a/results/breakdown/imaging/fixed_light_trace_delaunay_jitvmap20_captured_pix1_libcertified_fboff_b16_hpc_a100_fp64_fixed_light_trace.png b/results/breakdown/imaging/fixed_light_trace_delaunay_jitvmap20_captured_pix1_libcertified_fboff_b16_hpc_a100_fp64_fixed_light_trace.png new file mode 100644 index 0000000000000000000000000000000000000000..ab0b1bb55dcd8c4dd271662b3ad2d5fe3cc90bde GIT binary patch literal 154132 zcmeFZX*`$R+dg_JQHCf=DUn2mOi>a-D9V_rB9V%OC^D1GL&*>+WyoBikXb}U!)+!) zNoC9!$+VAk|DONe&;R-Cz2EG&`^9f4`Civ|t#zK~aUREUu3#Ol!^{kv3=~B%s~=I( zqbRy^ilP-;O^3h9y0LQ?{%8MHRpYD2?ayDmX6|^7(loz%`I7zBOV$=V&gUGjSlip} z5#28;CBkEM_3Gs-vSMPk|K~ptwRgNAwk@K^3LmoO@{to)D2ih}`47#7hfR7E4MnM| zDCxW0AL+hk%--HkKR(tJ+jCEkU3G+4NJz+7X_b;}vhU8Bjna3lE=fpSvF=uH^iwrK$sLcM?pUIaoi8c{~Uda2QHBaP8M;_kTvh!h%+ZNxa^4 z_P_m?XU(+60h<5z7ytfz!v^~D|LvbiyzV%B>&EH-@$W`b-YALv@1G|z)A%ishY&=C4RA3QBHQ2Rfgq2RW4+TwpagIj*B+yD60yj$D;|JVC}Ts_0bmXdcnD-#oW zsFy_!-*}?x#=Gn*V=lTeHtjSO6cmi8vpk}uWf-@Fzg6OoGXGrUpsHo$V3#f9;^wBz zAGN{tK-T2V%scn*i=5WZsvmq6$g(}E?#tld30~_X+S+gWYC{_c`YTtibaZwm zYu?){b9Er%Y2f1N)$Ju|?J7Dttd^3S_4M@k(tj>DH#gsS@?^KKuWznp-TJ!GHBM)i z4xT-G*2Tpo@$8$MGFN^aOR|=A9*HaZ<+p}SO2d2U;GR8u^fUEV9SUHoiW1PSIhU?^ zkM8cV0JU(=>p}W6@$O!}cu=M2VgGV-dwXC?%8rvS?80}SDva)^=q+=-@q4&E<*eo`5jJWlzH%XnwIm{ ztX&)M{P`a0OLytDBIi-gnP1(Zjh@#0_;9Z=%Ro40-lWVW@6YnlSkc-ziL?0{KX1^pkT*MaZ!fd3;p3N$DTj5_ zj%{YzD#Q9NR_smH4f=_1w+<%bJ7{zjdoL>lFmIt-xpL(KzIf!hp+i%MgCu;|rUTB8 z+pgcaz2mS&+v5`%I!P-m&Ym^5wB&p6f~EV;?o+uJ{@M2af&7-&uU|7vo&R`0Sgdkk zJx+O0SeRdM@ET6(i~1UZ=SC_scR6Y6cG6TXOftI7{$l1;Ui|yJvB=@9oZIy3bnS<) zn^KQ9rXJ;RI8khJ)BII{`S_Qrj&k>X*xa;ch0XIhYZw@+d&=D%zP)Bn;C2iR3Gpp1 z-tSX(rlmHNBhPc*`BHBMR}{Zybhe@aS9Q%P-iq4)gEZnaz6!b_ZnlWn^SYaLv6X6K4zPJ7+#O`JJLJT)1FT;jtON;$K-=X*lRH{)HxfpZ(2H4l#?7 zjywx$xZTX#|KUS!wVPXmb92RuN=t<=rJGfHkt3-Vwu#2f%&cI3!8ls*I30)BX}`?O z%%(Cd%OTO&Z!MX}`wF)I!7JU4iTPa-nOX49!R4)M*RCDtDKGu^U#+BO#(Kpzx10}) z5k_$(f9=v`NY;qWbspm#UTdwp|<3wGyfmm2QmB zk5vjkHd=2xzyHdQFCP;QAWqNcZQXLV1dF!U_r{Hh?rXi~UtV6%eg0f{lyC9E_%QS4 zvtcm|?(Xh?{``4aU!Rp9rDyT@@#8PwzP(ZsGvsyqJ+z8PY}a%JePMZ7+4wuL%ESx* zJRqOO#LRru^5EUOcmI41c7Hq<&TGvY13e*2cf{$-^PcA&bkQCINGs(#aS?xCD)mThuDcx_%$(Y0!7Y8q2x zJ>`tl)^UrGm8mud61|s~P)&?Wou5?u?4veq-mI?hm?!q#x(yrrQJ%iy0Mtf$y^hOQ z@cjGo!w2RQCr-$C{JETGe^5|x&B5h`=S{!I@TQ-hUsy@CJv9x*Ui;7OY%F}Z=fc`c zwzlgyIkVm+i5p%*g$qKKJ@d8NKQ$qGnf+fFB)may%(17$Nf_m_49h;$D(wF~cy(1( z6<#S$$~v;T?B_oZ&-TB)ouQY?fJBTPYj}KO&!wKS6W^Ei*?kV8W9EF>(!%cS>>Lyl zQjNSF`g>EWCrAHabNWDc={^%v)9tbEbf27*Cb>>Uf8a%&U2jGBS}xg_RaG>O#ao?* zTB_1C@3G%e*V0l$A)%oV{Q52zO4D)v0t6& zQ{@v7c=h3f=7QEC50A3`=F+T3X=x~nv`5sm$U`Kyr>NH9<99#b5qi%$Id#Ae^Dy)m|K7P^y$cz=G8Xqr(%~;i${9OPnmm}4=;$VKfNU? zA>qk{?8lEE`(q~`ni`dCPcC^k_KAs!UB}ayNcqQ3qi&t;DRb3$SK&HEhs^DplOy*2 z!v}LayPJQ14`+{LFgUrLKhMv9ERN#l=H9er%MM;%We?fS)azT^IXXs+vxhV7H?Qth z-og91#ObKH{Phyq2}JNfdk!~_z!?h*-nD--=0#uQ%j#wu?tc5-QRcvb9Y}sG+zKKh zHaizl=qMjQKU)7m*|hi4riF!tFJHb;z*x~@X4^dfPFF3? z&pK(`5<=Eh*4Jkr85tq?1HpEwyTrip6F>?{*%>Cqk|Miz*V;#WEdFlS=oNXVeeapT zcR)UJ_;5ngj@{K8n4B96{O94p!w4d*#tJ+{Kig1qbg`dgb`}3 zva8FH>0B4Dff5Eh@b$+JIyN>o{ii0Io71%q+u1#BdN$N~VW`ssyRC%GMqc{(@#BBy z<}w$aCiBS4bL~(I^GQz^0ASKdQeNdT_dWJ)eZ8K$txf#3_!jxv(JxguaClY#Tk4d% zIX!6`ZAe<_Q)a(+qXFs&pmMHl*WS9h{rmSLr2^`$dm!&lr#MmKy6{H=MUxJNBku0q zB;6D>2B)9e2N(TN^%X^9aju!ay$+8O(Vm|jJ6!3tsFR|`+|kiNe)Q%IJzh%j;>E0{ z$+>0}`;{aR>gv`YmXOL`C#!}^eO&o<%U$4XqvB&&Z7kegyU)9{N}Yx`5(HsyZyy&Q zU)|QW(IDGU^`8gw28CA`d3gye3g?vejf!H!*ZuP2N5ID2Cxeu3`MwiF*~b?7B_wc> zp9~HL1E?>|{d~yqZs;Tn$D^Y_onnBPY?aGP2Zq{nSP)s^UapTmEcxxN0`#DvzSqY@ zU0TWRFKS!Ur}O;0Cgp0+!TMA_(Xw*}c%l|4k#)m{R7tCc4<6jCixNoDN|3d1ot&6Z z>aFnH@S3@&!ZQ?ke8bnTUw4^R$dNSkb@ZrF7dGLu&au(@>U66@y8 z!QM-Ahs|9zheoO^)Z;6|7$#pxG&ePgyNsWS7B*TN5D-ABTG8h~nI63skM{gAu?`e~ z&O+PlhMBE$F1gAlHdvlN-}i>wTcx|i33-Gb#{%sPuauO&q%9CZ#JlgDFBanhg3w9| zt5HXyy54oVPWB+j=U7hk`^R*7MjFI zkNErt88?dXP*MP7{)5^NDp7PN~?Ii=UqD+|0?@gyX)3a&>VzVkayp7`&B> ztM1*q(7wLD45b@%v_8|*(^kkueUno^KBRp4a%P1hQdx9#G~d#bQ!k!2oW(KWlD7LC zM@58(Gpnkp>2(#_s*A=RH#Xi>Tv~ec!B1eZ+j)5sG>HJ_x>v7C&CSn89pm4DRq8Cg zmZRqS0_T3>e&MB0dUA&NLXvmGycT~OrFy!%xMYa9XU#-KN2^d)IK7W@a#a>$4KyT0T5s8Bx0NOlXiwv#*pVYs=okl)Y51b*-gb8< z;D8B;P9YBJ9QF0E(tIb{7*{CH%*;qR^r;LrrqBZn1Z@;GIf4ovX>z*g*I5e-zMu9z zWp^o^`I*sLYXm+o)&J!SPw~g$_MBSB#qIUpPi%O_#UrQ&#H&=imP&L?j4D=$)@QGM z&tq}zjC-jc&)M0D-i?c6rApj>XEiOfwCGDpNNnG+V~5+!$mVtHq%U>g*I$QkDbP5$ zt`YcoH5Ie_l%aLc(&D^2f7I>ra(Q{Lg}9PyV_H-OP*&u;?uFN3n;)g8AEw^^^Utlm zZ{IRiLpSyh3>+~uG-PXTJ3zY!p8Z#|lNX1IIfRD90;TQre!J zin@DubAfepfQ5xc2B3eW1yKBCUQ#BF(LQAOn{a`p({UM?G?a!wXHgT z{yf9*8vWMbz_nbwTefUjp%^1%ko@-Tk&B;;BsOo_6oE>(+pNOGI^pZ9KsHKJO6n0x zm+rA+O#5YJBTGvU`1|{3$^~Z0$jC&Ph^9Y&EaE>%P8JTUq1O+9cgPWY5=A-)i`jlsXbw|n3uNpp->9OtWaSc=Ndn7lfarXnu;4eTXW<%fiCa z)ZU(sGMZU$x2k$kTu$zOS$TO~YikTy8tdjXa`Gs?7X>a877kvDid5~JH=(l{0s;ah zE)&U?3Ku)=)>(DkZ1BJQ3#URG-HfHJt>*39x7j&4H5`jg&T&2dRgsnT;o9O~Cr4*z zeoDW>!!_jAt#s@;LLtR#@vr)wD)g*+*q}Akr_N42j>x)}0U3!jophhRN^m zYHdtH8a^V`vZb$S*F?F=@R*zI|N2$Q!NH+_Y)qSa+tL#K@!>)3m2^xz#U@&|o%u-( z4LZ+qb9ty~ByZu-H@&?Nk=hr0(O#o7m;xpn;juE=wDmqf~}PZ3y{5Unjdmkv=e@NxHLMi)o@5|FJr57L zRkXAbSSJ6#Kw*&_TX~cFi>yiV%_)ajnwpzau)v|#yTkU*yHED7*|~G)ZJY?2#Egtx zb$fkemAM>ox>H@n%qrO5jm}N|labx`yFjA^D|Fm%K18Hl=lPUW%e(ixE^oK zGN>I5@b@Q43?T0w$&7!e2m79(4`ZMIjjkdUnV5lziSN*%Low~C4FSW==`3}Yl3Ax- zh~mf`N2IK#a8w%scx%5)XFfOR4y0Ay{K31&f8M;@?RN$u#q#XgLs$%UKzo$+9m!4H z_PVX7g*7T{nr8+6zTmoKX{ka(L&MI+wfp8z7gyIt)b0&;Zr!}ePg$CqD`Dr>jV&S# zXuR3Z`ug-!)6z8EirngdIZ)%g6(Jj^-KKsp8$30+OEqK}WCsNejC^`-dFj$I{L0m- zADRxIMn*1Wp?{%C6g-}`i}ux1lVW9*O6+)*RdHk(W06jQy=!x`gnMH4q_Sl zra`YnWM^mhyH+@SqeJI*89334=_MiU! zdnf(H)P5H9=_pj|sd#z!!lJN}#MlV!&V>zoDC}73o_j;OiB9(H`<~8~=a@3T3Y;QNRrjD34 z*dR^O`XG<&q_6Xu`_ADYZaNN zO+z%h9^peWzrX*g#fdlE3{%gZJ+neEFf@~NPFbN@W>_f+jQvQ~X^52q7`az1tGqu4 z#8G#-yOAKXKeJxO&+lz;nmjHhWHElq?~?zKCxZ=g>^GOQmFuHd+L>9uSK_1rTP4PDF$Zdom4&=Cx6$@ zJLSHvj(s(294}wy0Ukg3{Cs$mL^khd78)J&X3G0dzp&$?;kkD0n!gj8KTXHt``9*X zWbnS}`}enUN?EbeB;rf&dYp2!R5jMwPt@-Uiw~;Zb~^pwpr@zHg$l1QDDXY{<#ybO zE6~r6l^W_S$W}hlS>%wiNkzn%4&2z$JUjP^K7ZvB|Lbr1tZr;DoV7X><*bNYLgPx4 zs1YM1Sg`7IclRJ7L#TarYH9~{6?vIA_4kK+`$&vo*`gmjcq(PKDdNL2rMNVlhE~&p zCupE|{yakbZELH+*Q5vl+?u`TnC)P(3q)fYv0nkFO#IJAZ6ckpK7S^oR9voW_Ai`H@Ml){aMQ^F2q=*$ELJI zlH~X9N$_ZbdTl+m+p4qdOEd^%tyPdbGmG z|2BhLx$9H_9;5W+WWoCR%vIlW+NBqdOTQFTb@37Oet9A~Zj1vasIU4PI*_74uKySce({8S(KhbFQ3%FmEy5bd?pQG7Ie zo8aS*q8d0I(pC+MUmqNrHV=D|aWQAZ&fbE-`5cqtNJ^*RV(S1J=f3IBpH1>khlPe7 z@2G4z{r2EZ&RpnStRepYc zly$LB>YJr6M)xO%43*V^<`pP)^p^)Y;Ek|}QL^6Yrl z*-VY9#CAY)gqrSM$#XSTN1c>%Ktb-31>vW};CJ<*b zTAXzev;CjJFtOiR?vK)5O`(O+aCA3%YOx0UxFdc11(R^Fu z3z7`KK}bIlW$)-OvE92h%_&g-zb`s!oCJ@xhVn!X_ZJnGvo?8QXX>w2`K7-uDzg1~ zM8(2fWbZta+nOrEtsZ&0$F@^yg(9dLwsd3&)Euzp(RY@?2x1Y`?2Z6U9Df?ab;!Srb)2x8*Zr3uieU;KHOy2n97wD zx^Tk-!lZt@SpF4|uTRBIyMOaLaha7mYreP1{Hwj|=&E;#mv2S>t!)Ka5%Pq2rsBrw z>Mg68n3ysyeR`IUXm$e~3vu%%B3ST8jy_LFP)$`+@&oT=?=C%L>f><_9z4)Ora;0- zVwJ1&?q+|?p?Cavt=o94nU`*-5!#7@tR3itcPzzAAKcE2AeshSyX%PnQ}ngrHqDg9 z)juo2YHCaY{bcFWq4#|+4f31vd-? zMMyZeKRyvf?V_EbEiNtw$+8<|fP*`6UA?x7ir?$O4-bDVxYmWdrl7DIuQ{Tj5qaOv z&hGR;Nkv6PoQwl6bddlgl^wfxGp|{*=E$*Q`o?yMS;_~EMct^B-RDiz<&h2vhfcIa zG!!^4jdxw2J|zKt8drLGCRw+%qT?e{U`vjf*<>jzaP6O=>>T~4+#v4JX!%>Cm)K?W zbgR|_xnQhnRc&qR5$iI~`MoGI%!dyjo+v#tx08=A5p`UnS$aQrulKV2O|An0z^NSZ zH&J;AhXLV`b(@?EPetf5au&n#?zPBrdhtI-N0})X@O-zM+p>+s-akCZjgIEfv14H} zrY`o^K(Jrca{oQlx{ix09B*t6NpPUIva<6#q{&kWvj+OBDqYEviJZ(|jaB*ccQ{7^ zXu$zeeGbp3R1s6AxXMy3aU(sVab8GswoC}ri$%;03AqCz`89eprd#N(UrvixCiR_v3h`Rucv z&rvippq*(wRCwaR>1Ut+siVWHOiKxb(JP=nhouEqFs{4;0`ycwOpHG^;44Bqx1gZa zbzZT@Q%NWsyKbCk;U6b9XIkvI3fg0BYqrsCP&}v$6Q{!G#u$Md7Qjsf0b+v(Ge;Ui z)B3=0m=O$Ojs5iZpQEGU==#2a5wJL*D%0jWDo%;--K&PqlPG40fE_$Mislu2NAL96 z9cF(GP76epe!OV@6)?_2Xr4af|JUrnSG9l|TLC4~P2U&;u1Bt}l{YrNNFzxwUw$hf#5 zK*Tzc{v4_j^#$rsAbRwZ`Bq84XZLV%ap@LbI&ojYlao+|IIA@af&)2~OUf57 z3IPMI@%Hu(pG~rsH`!!5za6-|*@e3{uQC|~{`&bJpFVvma-S7l%dHTGF1ZR+Bt$?1 z;|h?Jk-znH7xAnCbmu{d4lryxTUho8B2??Cdd(NK$Be65`=c;1p*eHn_%?AS}HkwYFHdicv zdvnX-$NSCtkB!%1500Na%pbL#hle7XClUiIA_(+0IW|bmak5TA>)F`84h@|gaA5x_ zfAjl)aK(DvmRo07HcQeHAs4^(1^hX;_kynV=C3;*qqIk^l<>s|hAfMDTX74! zOvRRcy&fsk5+}YMYVKUmsf*~1oa*lGZhdNoMXeiDzF~6jmQ=Q$@iugQRh^wD2X}N; z&w-y0>m2=gkUQ&hxjRQvQW9(hVfE(#N(=^^rFO>TWKHVF=C?w|BqS|f;W|jIM3Z7i zm+66ZW6J1M7%Rs*lQSSm!77b!*uMJ`m%(tRuWUs&NA>OOnyI^AE(;kP0Ls3+i&Kp1(h7`4Mz2eW<_n0)$ zL_*(>TC?6vI&&tO$9C*qCvExZ3Xe64&xf_^@y#31+M^vj`CSquoseTgcCNE;gczl$ zvPt&pt~Bk3qHCXOq^c*{etIV+B&5LH(e61qPb-kXimgzKawEGazV;;g8JR^259MV|piC#+!n{h(&^dW}f zcN=DxLi%7bFvtqD>nRHc<(Y`wIzBzEg8UHTSvd!o$+CU>c9)61Rdg)d!mh8R7utRN zv+aC!=XNCASTQqRNy+u3@hc9?nldtJzoMHd^kU4WOqD~m?waQOQuTycv7@S_V*JAh z`a5^-#O<@+<~BWWotO(ca?QtQW{6JLn0Z_v#&*1~>`k8Bzb>m8r4lG1Ae>lu>@N?1 zQOGdJzEdq(-5h~;f&8IYyxZMyOn{hNk{)@o47B0wEB7xfZny@9*xRM@bTjZQU8P$D(F6bZBA>aD={e#}ykbz&a99&4uT>x!OL%}emq5TMi z>k0}mBoH5`?(EA*_mlhqMEt@`m%UY2;qK&=6es!57CTyYAd;F~cvKQco5y#m$^;Ay zSQT8aj;!dR>82aE>n`!{@3*90hHc){P-uG!{sFZGRW-z{!=G{UC%;%~&7n^BMNJU7 z>joV&(YF8~A#GH5bQE!9@c;E3(n*oqZy^x!Vfagu9YZ(nu7>(W&JA$J@Kur8 z6D%C5+{y12D~jgjRlg1n3ND2#;Xy`48`o}?@iFt7Q_UXDbk~^%Zn0|3+CY|5)U+hS zV~eW8i_y@gwYMc9v_sY10e&)I~gzqPKn z&bt2Vz#F+S^{e{;A3uK|!hqCSkUPF;_3z6#C?_fL%Oy3JyI)gLRkhBy1y>6ma}Bry zWnhNrA4i$(7;|`p)>faX7^gj{E} z)b%O|hXfEYtTwImGIf;y+O7oZ!jO|z+Xn}hM=)3Ygm-FZlXQ=I;`sFL+_i!7=yDQ=6Jb?2R;)B*K*!VTfv<8J4^bz zYXRv7Fm2X*Z0%}Re`j|nfSfrBWnXp{!#AJ;5bu4^PoP0RYx1xiW<&o#x!y4C?8H|E zy)A+IT9;nc+FI4A=VVeny^xc20<0Ew=HvbS2w2-B>!!ky?=Q|&t?2LX{{lF87=M|E zo-)B}FoW61$S7}Azu=-l>RkL%eTH~#>&=E1yz0($#?h_CCQmQh0TCH2RqJFW=o-6g zTy!%ZtwFYlvD)&OZ|?8k71Zf6m+kw_GT8K2Ir{(Jx^-*FPI;gg5_@DR5PKF_zqcPh zs(E;Lj z&Z{f-xPq0d#V$wOxf1}pm^pZGB9rzHd!`bj#G$~o1S@q|}J#r9d?#YB>2@4OOE)A9`NmlmHX&i?p9``UY<*s44;lU_`|MdYa3r7ELw-5t`^%@)(QbGMIRS)lKAEaKGQf0k zO87R?Coi0p!1I58+_SG4JbFijCSq1t+2Gs}7Z*iiLpD?dUsxyc4$0Hq_xcjSoZT4( z-M6vC!=cq-)!<2^;pC#Rd&>(`w+wUk(k?NdH-k4O`?rrbJ?*2@M~RmTCd4Ddwpq`R z+3LRdUS@f}9IECt7+Js1_TA|!Cyw1G{r>!M8R>e#0z`b#Y)*fxpJeW(Pm-ywfQ%NV z!XoL}ktMJ7T_Kq+Elg>r4p#5CYe>9aUEWh$yNWcLKwi;p>ndoX9_pwS+V_eobZjqp zxF9DdrvqY1&f^a&6idB$F(B{~0rn7DpKH^f8 z{N*0^)$c!l(xYYADs!2FE+;zO8c?flnvi#~Rj8nnVZZ0!{Qi}~dQQj9Nq54=c7vFu zz>l5$c|A3CCr}pc-DCU}NryOK%sUJQk5c@66U`T#2&791_qFb9dzHnW`XqqmA(M28x7Cc zgY;hp^}djvUN$x9O>W8ekCD%utG>oUQ#)Lod*$gD*OaqUEOSqa<>nDnC$P|aYc}O0GFV$ z0}sI8Ml$MS(^5n0B|ylxrVGm^Om+sq~fkD_|I3un&oP-mJR zsY9n&mkvA1F~>wLj*>LZ22eB9OJe0q?5M0H`U`4vHnUsI9faaHC?XooQ{JU1APX6$ zz}q)~2XQ#PG<*eVf~12LD_6#ND#wkdRJoKT`pc33mhlRQ{wO~pyQ*Ui}w1?%~%}$I0bwoM4+N|7y254x|-n2v3$$w zUs#9oYe1Ll_e>6doNzj<*wZ{w`-#r|p%Y8Q>?04n@c7@~HcXqu6+M3Mj+jkIC-?=> z$iv^-3p-qk%mvpH{}O|0L}cU&@)Fl9zzHa+fFfOwc8nIWAMU;C6uWZ51d_UtNAobk zhMcfYCwv()gy4T>mT-;;3Pt{?U|SbWr;(0ziaj>WvAa*v$;->v&CdbF?_7Bb#eLgrzNieinh(X~Q!C)f!`1sC%C9#6v0v=9bx+^V$zY5D)<8BY#YsofZL6NORxq(4| zC3WIDfhwPiuk=;I1wGMM%a}@^j~@ByRd2BY*nZ*;dRJ8ELssZRd53#4p!yY`f5H^h zs%rQ&@#4p=Yz}(6c^RCaFi2U4pc;{)KeHbTyc_*|39pR5yAK#3rrJMiFBkE%&8`{V{^a1BjAN z4*a{Z-pYsg12L`u_wi~~ddx|}@pY4mz>GqHRim%$)d5A2uDpO;&=u0PjXK)UF)31* z4!H$q9Wj6)Rn^tkhhRHnnhfIP-Dg-S4Gj&wxC#KS6^g_a8n*EBrfXN(qZ%@gr!#yg z1@H=?h-IeW(x*sRu87$Sf%AK`%Scjen}Wv?*dG2Bkp*RC<3Y!%BjSiKt?^3$RxN5* z%sv_l)~{WTos%{lx!Y-Y&`s3Cby$2~NI4$0L1cd=sJA{RWAV{iL0(?pg~i1>I5|Fl z{#-LDax63`DB{?Q7cce|*!Mm_5NDz}vpD(f+c!bvE9-;c8UJGrsjcB9?u>!MPCdTF) zH*TP%4aP`F241QqS(S0(zt;i3SJ&8h8`fj?JD#A+ zfQZ*q&k76EFbFdQL|S0mWmvX$lAHVXRe8PfP5$!+s25IyP5xwC=~=e%@g{?8%aBuZ z>Y5oJk9eF8k^LA9VzfS3vkZK{7IZn-h|MR60U*`J5-^w62Pi;LMkWr6R99CQ4DDDD zto!Kx=*au`k5MGhPNps*h6t+9TN@q{k_>AD@%F&^rSsT~v4=5rQr)0};hd0!1bKBd z7LM%P+}da*E%x8tXaAsD78z}QPPULiR?w_Gu*Hvr7T2b<5%urthK3teRaMtf7aNmT zowKw&^5cS6*00hP2D7!Wgn>Zc2B`<~_&TyUsTwh>DOAcvH1a#Abi15G3rAP;CWE18 zqfS1vR8M-NJv~;8rcQy_TYy#sB_$)PtE+1~uZ?u*T9<=fk1`Pzpomxz5)#4-cWC6h z?=9)t+;!i|F;9b!4tBDGj*d>t50hXW=XV*?!QgllTP8qRUbt|$v9XbT<3=@b8ZA#v z4>(@CCIF5hb=vygHUCz5|HeWtMV09Icn!2~0#yI6Us~``>8ERP<(VS(dFwoh8G_aa z_Wx9=F?4Y3w@#dbEuXDxJ2ilAGuq^7?y#Ccf+}D4PuIWGg8L5~V55W}`qaLDt%r{P zZ9_u@_#M6%0*|&!NkwBrNuD7mTY;A1ly}Q-a|IhG{ELN>w(l`|s--dIq-hg!5DNAc>bu0^}R`w0GJ-Meg&-U?}zJ7EE zgo|U3KzqUJ#7pVtoR-Jej%j4O=AtWU>fg9`KvjjfUI=Q!35f#5K+n=z^ zWRpP1!r&0Bo)K{F7-Z=OqlvUew>=G>#^Hq1jn$Y}-~-txDJ{M8z<~n{EG+35*~|D4 zis>Ic)D5gh1WcJEe4NL6o;V&X+3Vq?e(wy%Z)klm5R~b-*@=PC4HB6@7L}39N-S$( zC7+)6s@ZbDM2%y|_<&oG?MOa$yn6K!P*O99sFq*DSoG;y4zq~ZSPrE1+i2zBIc^4L z-13wV5tDGaz_ddWC7Ob8`YDZ2odAY;wx_?VeNV4ih89mY^7T!wqcF?qcUJN%<>195 z{$u042>$u??|O*BwQHZVj_(#BD~u5$wg`?gu?!jC(<&-x8&Uurefa213`FAe?4(ojo7ZumFAoaZ zCg-9E`Z5JykmS<4@$r%PcJKi<17q>;Z@?4evUF4EU?e2Z1w6Zr{@=(-Ug$d-6x4@VMQNThd+ zJl2jxic}v4^j!xBCCCwLh`U0wVh#Btne|aHw@R>f*dh|uF zp0jgde+k$cQrO6Gg0_HtkWNtWJUKc6c{qw7B~027CkN~h$>7N}M++9=?Bd*eDXxP~ z80L70Y5_TQJ}9Up}y`6VKBOJ!5_S6gE=vK&AbXNM@<%b@YJtYMxh}b8!1=B%EXljnTxs^1@q7+R-_s~UxMh_Z7yr+Ox$n`Np zg0}zKCD?Zkq`q4U3IZI~La1(s87+MNi%L`bQ=Dq7W){jI9-x`|beCxL??meZFB1DM zb%864f-F>jR`cl5lr?PpI-n|#h{i_2v^e+Yj}GQ9h@FYyo!zHr{upo2-neli@dAU@ zO@vz|{BI)8O)`=vv8+NE(nVrgM5shs3qAh$@xzBylodUHh7F`tfp|QMsbbwvYE66t zs`@40b`LcfM|;F3|LQ5YHg-BBICwj_LSpnqDj^4*pjV8v3X9Id;T{iHg|tmu82J>E zt@`_kZB)v8$)o=Ld;QKCu-~gG&)M#4oZr_p<6P19uvL?h_yiHNimi}723oUY|F|8V z=~Yqz9FY_?s|Z7iP6nxvn!txah7E9T5bgID=F`re{nn(lcK!&=gX>{_CWa1_JA=+T zK?iX9m?B_ig^UHyaE!BKPbl=?qLPy8uC7xa()wN~6|W%KJHUHtY-}8@%+Pxa3ngXS z$*!)hE?Zt7C6Q(Y76RlVE1BfY$jF#28H11^Vp7EFJ~JXXVK4BU#q9Fs+&`Y`2M&}r zX?^sj^KK>+|H7;EdhNi(>?RhvJnh3#42(a;1d~z9wsKl$IIScZWLY> zL&H1uPFEZq#XbLC1vcaYD~?VvC_KCt70F2h5l@E+k(Fe83rDTBbpxmVkdy!eiL8it&N=X+CZyk{!gSe7EXEb&}_AewCly-YgQ8|yHW zjZxfP`Bsf9K%1q?etZtcFfAQjbyL%N$j5LZRO6qtJbiw3P>+_D_GNYT3V7%;;Gc&` zOwX%#at65q&mCw^zxC1jbD`}P`0v(0XTy{lIsTX;59yoM*2p;b3=Ppa0h1Gvt7|>~ zFe#$-xeOl=_*XJ%Li|OrA?4b2%RV-%+y;666^68<+e)F30@(P#;*yLPB=i!w0pVDj zI1QXf0)%tNe5lR+n;1Aq!K@4hZWS@JKt}w~i+pX?K3I#vL}wk*q{qQ(kbHqk=>tfP8U0|0t6u`Ay)O6J>jbD~C* zBv>*3>i`*g1b=}`G4%5KH#8?4^=j9tq3e*bR9m2F_FB8_!zqGVeW)XpIg+87r&fpgNkU|ZO z?J?qG4Ea#V@Np1KY-D_s%02&qQ|0hsLZ_2E0Ipv@-`z`o;lEvQpwJ=-Y{mpT6GCv2 z$6I3D4CC{}DYPBYi>U6KCge4Cuo}W`BQCeV_fj=4M`@J<7?< zV?He0yY>zO3hf&(;Tcfle=r|GLxD0-!#B@`Jd%%rvKy;LZa|Wh$7LDo;Ak5=SI*M< zNIgm%MhgG=`asgoG_<$B!E=uu5R}C=6J)|f7kxeeKJj#p$upx!llL;ebSaFScwh+1 z2kICR^vNTMEe5Pw(7%)Q2N$Q=K*8l=Q!$Q9^LAd^h`bEu4X}|rwr^K5H$$HQqISVY ztm4lKXxI%h;csqnzrk{uTUiC6>;=`mSF9=APPO&HZGz0Q8Cv^rox5Z1w zw_C#CDCdIHJp>)NRdfKksR8^m3lsEk7CvGf zU*QAgHyMiyU8D*v3HuM&DVV@``Jp$$ur#mMK5_Av_xE2pgB2O8T;7I_=S(#R=?RsW z4vd!|T^aQfd0u1-u?0L0eB0rE_TohbG@MW9)tpSn4&e@j75G!C*_zlip#L-Qz#^tZ z@0hvb1Tqs9Eg;(ZCvLZ>#l{lupOG%!$CoP?gOLldyM}T zj$%Yq)Q;jMSTf;Ntw}V3>4~^|QqA&Coj75Rz@jF-@;u=0^q(u~$M(S+KRz*``!}W+ zY#oi_O}umLQX(64yF9%2057ZH0FjigX-jQ7uvT+<_;*r52r zb{c?Hg?8<*@W&zb+?4kLSZtXgk*Q%w5eu9#eli;7>Mej+xp{flK^DNMO}r`Dn)}w7 ze|mO~Bz7F>n*3YHq7VRdPbw_CyLscj6&Rek(NyFX7K%#Unyk#3MPah5pJvVU8z~7nCPy}7*yK?x-E0_KXV-8stof!G$Q>U^&R~+MK^Hy(#d&z(7-1lWy z7r2FS+E*Psco4%E=i5@P8z2KdjWC=mJpYiWX4N zCO|ONeJ58pVMnVlg7!F&pyV{|dH{?@FztDEOl#M^hA3npY8FSL^Q8|Ba9x0jXdp}; z7%9I2js^C6O_N{v4ZtV{2%cmjV-qIidzm6HYL~H~Ciq~->CGP@%@PEQ0V#^Ti_8ve z!WAocKS;H@7}&kknXhhg4Gx3x*;%qd_wU~qKl748$=Ege?f>oGhnPEJ9c@i%n(0q) z>Bb5lJz3Hkfg4j6jZH!Os4=X1`0z>}Wv`4Y|JSV=IIny&}=;K>} z%nKk6{&Piy`r{}#G9FFJh?x}mpxozi8{sg(40B>oj*;)5ESHBTvHSmw+Zs$p>N+HT`E9>jPX)`6pqqO zK7l}1va<+`p|U5lPh^G}oSX`?+zWNQkCb!D!7Pg*8_eRk z-xI$~Fw8v%1xtl^$|b$eoKK4_Tr^dDA)#x#AvM8qe#Z9dK!ei4>x&7pPAzwu5ez@N zD{+-X&vWQhtQ29X=H}*Z<6L8;m2k+o7HfqfX-I|>su1bBj0#l&O< zxD`2{X_T`Kn;%NlOAy_tR@S(W4G**r0yA%12Mo>KPM+k% z7Y-(=;5ameI*^xCgAdKh=%#DSOP*Qq@Y3+$UIM5JDKNlh;Zi6f+92!Ho)bG=c7!5C zDqxicra0K~x}*gdRM*hp6%!L%p$Prp->WU;T_0_oxUIa(S0=#S}SKiU&6n_*-X98W`L)`iYK{ z_%c^0!W7$5;pu*{x1!v*r~Sz(0nyTbZ_vp9kAzHa?Z9;xNBE-}F~*UV?`iNx;C__v zIR*-hbEwlf91)xp!nD&QqG3D^BDq=?J)HpV-atW3M^b^dmkeMN+8(MCIN{a7bqG+-=E+@CkTF#U}SNF0wN+K?gbgleDfEh za}y7~jf@;4*Bc-yh7L~;w`*G`V2f`nOTr+Fw~Ne@bI0`bXF*mk$89uQ%AE)MExc8A}-rzWPM|l zb?jeFL*zg8j~w-C07SLc$_LW1Nkm)6s2wKxHI+l4EmEivw-P`kciDd_nvg7BO-- z;h^^eDk3K*M{WKtY@jrW$f9*~=u_ffi=;@ z4Kvt)^XJtN9OPCGL?{VjjC8Qaet7$qb?ga=^r9jeNYMTrh7qy?S-+x6OvF?(53~kD zC8ngHA^Hy@3}}52=(~#_Tpqi-|4N$LJnppNr%8lE=*UNok6qAzq_j%WQX9?|!^9Yc zQ$v%8`)bHt82Gk$e=%s;{_~>i$Sn^4`@J4@uU`jHxGm^I^snIRIcP9@$R!#`bAqCx zH?xd#L}ykKxrj(OP$0?u3Xn4aj%j@`D3Bff1FIYSf3WwSQB`MI*Y7baW)yQ4lwd&1 zh=Q02Dw0irSy3^gfD+13DkeOFn3X6&L=h8$m;*+VSfD5>N+=US6h!WCVO2lf&-1=_ zykp!C_kOr`k8aD7bN*rPwda~^uDL2sVs|M)R5Th_uX?dD9XZw8bsn*2&Ag*q^T@_q zRcw~(CHHzp|ILRF6A=ekO|cI$+6An?%@&^y$owdbMk7#&$$c7PeA9FtGHpkliB1pe*FQYgem^-ymSE3Wh}n znYN#7eQ0`Er2GZ3&k$D@%5t~P&*FZy1`oE)`Bqt3iTg-amL(fh6T=iLMMeOrX)itj z5JxL~KSpkb2n`@{l+w=4mEHH=)6~_SJlr!R7Yth4F#o6Z8CzainJKB<~Q&&ho?Y-}#hLwxp{@?|Q8#N83rnJyO zKC19AP*!I`hDLN+^UU8feJih*=UO;@{Na?%rrN_Qk$1Lyxo)+?4yIVXDd%JJGgNa+ zkJRvCC*uz?88=avkDz|vkKISTz_9X|W=R>vc2nq_*Xto+Hpi_&F{r(p6QokR!i5fk zp55{dhU{5dX=itPO`3W7;FNPml=u*_U*G2DYV0~wzj9jmpgh3l%`c`>tIi&l^G6-= zAqddbU5oM@izVy08oBS@c^^5=v8y$}07690I4M?_eR}Et+zgs354Kh%A04n-z0M8S z9EDKqeQNsY4ab1rHIDNJH;*g_N17wsudis_*kdV4Cxzd2^KhN6=GYOJL?`c;@ugJ5VE><9MX1?DP>&lxj%{ zsha7mBY}r^Z`iadNINfNQRleY36j7U3U#5=jGP}BU*6So!FXMYUSFp5O{sjeJYBQ+6Ymo}wr&-*L0Z7$zpXud$`q44;$rhx zr;|D28dXtdyWaqF)S6cH0;GriQDP5+$`VT?86M?$;~>Lpq2Nq9zoy>gs}##_RXpR5 z)ZQUSg6Y}PGPHry1FAz$ph?x<>97Ch17+Rq=P(_e?VM33Cf93`o4)7zz)NiV&947C zI;_dbBZh1>Kb@dcJIAU{fao&}vo{Vt*sSiX;7*OYc7v<-NxEii9oyJV>e!0>Ep_G2 zt(p>e?6sEDn9w78FX%B$*KEj3#X@P{7)lZm0>O!GQG`_hi&)F|0?FR!n99oKbT&?j3g)BD&AoH^~8+t~cIs2jA?7K3D8*E(s@bW3=kY5UWs zkNczJkW$X;5^Qm{UPBV~!}9PI`k-nSb&9#`IcaOrsoys^@71PLvKzNXP)h$CR$Tsu zjwzwhwz^IZx6qJEv6xb?Jo00nMd}Erg76Ik8n~&gwG*v6A9TffZ2fM>^w-%O?h$KN zbiqu-_AQEoX1ca|mX(Ek=8VPA$zwGO>r}KG<63&ES!_rAeo}s5|IkbkvL;>|DpK9> z%Sf$mFN#f$lyxjoO|t!Y{5focG0^}HM6En4^Xp=qEQ}59U%h9iRC|GZIohFh>l3GU z{;1TqzLt6Yl#aD~BWL&F*3K8nj_mGK$7F4jVe=@gs#Ffksc~+@@9#;7L_NbhONH(c zwr*Wj(aX~+P0lw*h3E*J0(#X-eeuFByq4J*aad9;#1K|lac{&k%jJitjM}{qe8#nErkdgn;v`L#fW~Ugo15pwps*ItD>OkiLobGlmah5n4vLiA*2xj4`~%aDSa4QA zS&UQGnlz@$fOf=X%`2ySdH^okeK7l0$MEOK=pUOZ%BlE;eCfBaeMte`4b|G!#qqmZ z2E>CswI{TGv=)HrS8j9ts-~hGb12{QTD992XKcBy@J;jTot#+XFhsYb?^37x>uDlv zpxD`AsD)!TFX^Viq@Q|LVXHzsW?i0jqpn}+VyIV;8zSa_QP~ZgCX3)t;ce&=CO+=3 z2jqA>J3g}3y*H}aSNDt<(&c$Z@r9RGS|5+wnwQ&II2XYGoa;0>Jw$)TlqZYDFE&fH z=KAl2V*-v0U-+cU&QzVTVO0$c*4sRxR`2-ruRleO_~jx;VK_P4YL1#wWvl4B+w9=K zu;@fVyQiDbhrK?f0|NpbfC5O{zkwJFu7TYd*CQl# z>GH|{OC9t+CeIxx?D@W~$h`S16F=*4mm4A+)~0{vy7&%Gnt99b3&d1htz8^wkq5b{(?fb#0LQ zWC~^9zJ1et_$e*C1yU6+>I&ZPbIBnTKK{0u>o0yqaBO63e2sd)SfVuB^UWZaFI*UZ zgtST;`IawVZb*g9_uZC1{NV3&Cw%|ALCT?NnyHz-PR^9O{6aTlrvbGs z2HIR|%j~kBPW&(2asg+hab8EF6b$&+TFW9x%`oTF4qE&et=X)UHFo(bw{ z-8bj%4BfOc3zBkYhAZZ$^qTFW`kRCC!rccCYAX&?={B?%yl?mBgBtak5kfOWI@6HQ z&*O*74-SGh1hpZR?~V>x!qsSFSQ`cklLl;7?;ulHN}SlRl8{a*NbX3ZlkNf6~&N9C9@1#-5)e! zHR=e3m$cBrSV+MdsdCz>Rk=xOQdH;0$I^hvTE4aHaG2gp$PE*Bod6GAG}k|VP7tCT z0%bTH*N^jyR$MSY*Sq+-y9ROJ@hC+zvfs^|DzA`env`{Nb`G|xjEIirLYvaoToY=@ zy8QMecDir5m!ZA;5NcMNe@4Wuu4M>76V=mSFB2VR+@>FsS2_j(*Jo6(S06t%I}v9+ zee8#|YHK?iW_>-acQ7=H1o%m6>J6wxgz;))#*L$HFsU$hgvXCIikY1BD-U3cHwW#R z3ojV~VRI@WWG_Li4dt7zSWm8xE&rHS@wscsf*La^0EuB+gUL&TlL- z9DYIKM8==rwB`x1Y(S<1f=*p@$}+x!jdr`W!}=Qa>eZ9Cz^1jiln7CpLwO3Bi&;R0 zoW$%z(cd&`H=sVu@l#Ew&MkN(_sXpc+|olGD%dP!D0Nx$W5oOF-Tk@!kP*)Ma9zGw9D`SG(!_H!?#j%{>+}Fl2{%vw{Y*@Z z6ia~nQtecW0eGF5P{m*&MlEgy~B=)Bwye2ywB8qN$}|ripg1?+Py|rvJ-kLbpxO zw(E}qs?`btp;_c~B5^$TrK!!o?- z{(Y^S?tdk#!N=ZPbk#G)9g2za{=8zU7DZXHxWGQC@1P$fJ3FDD&vlIXk)QJQVjav! z#ODYjSkbIU%2bQAlI%lhJhn*;0l(uvnlBXsSaI|nZ}pl0fjr>`@Dy!PI%-D&5v-+llpi15iT>p|75?}1Od*KwS_ z^zo5lTad47t?zRA`0I=I=d91n9-D^ii%1iQTsOO1$77{NSf`e~r`Xp)2BrPJVX?~7 z%dkeHIUaAG-|Wj))2fp|0^#_E;DDp~cx<|^;M&Ek4Ex+OT;;fx?MWIG$G_YddMiQS z8X{ZTsX4K0i6jDQ;uW?@(6)heCSGNM4;_?$y+Up1cY><(>IS`;mdy`42hQ z7akmh`c14`kXDT0d5OM&#+Akpc;i>Dl%AM?TdHD8Q4Qqd96P3;r;t9bsDyMwb#tx8o;F=EdC06+T%n$LN*uKXu`B<(`qVMt?8Y% z$lwL2h_N)jx9V%Z1Bz#RF=SIipoz3+I(kCT)|~7zITyBlVQOe&F=l~~U5^&m-ti`9It*q^(!yMAsF2~oS9#cCx6xBXOtOg%4Lte8vZ@R7iWLt7UaUR=A1X(?Zi z9shXS>Tu&K)ENpx)Wa%HVaARBYN^rNqEIEj-{8UH=_ko7<;0IDzEUT%(Ls~82J45& zE`a0R(RqYafi|+&Aw0!^M%*ak8x$0{`|W(4y=D2*5IMk&ex^*GxolZ=GuiaFw zwLMKNfyj~~;xHjzFET8sSFc_olVR}&in7!Gd_$??ftOyhRoeVEzmdpaa&l^1n$d)c zI%UL}?A}|-Q@Ff|77b=<9K@op$0c1ZrQs4|C)zfqV$=8u}jh(a|7@dX* z76n49%O}Z0Q)0`^Z51Jw<4uy^>8TZ+2c1u=XKGrjdDlUMT2Y@GLmDirKn4x4otRqj z4S{<#a71zG6iVcoZ`U>*Bov zz17{IcjoC?qdOR^|CW&ZkaHSeT^;sCO=#88@QE7!E$X&IC9N~mVgIT8zQNw>))mmg zd7Snvo?0ytx)JkV1N&}sqVAxyVcKMx<80V?dcWJkUGJj#^Eh!rlp^#Eh!PvwgyZT? z+uagcp8NO%Rh-N+LC!IYC&lof4R2Q>WEsLDJ+tq3j=@)eH08!;x2D#$N=9}?hA2v` zCC^UF{1?##objykSdXJ4u0+G&eCsQ)VyiX!voLWWYduV@%vMF2` zbg@t+=V&D-8ub>_rIyx5UeJReYI6YcO&9=CB2yI;wZZGYkF0hE)c@TSd8zZ3NO@rb z*QBW#&^j7R8*s`PiW70G^SfP22sVv*_`nyOWnZe208coT4(tl>@$4c=YV+atJ&F|MAWyqmA9&|cCXzISJrDC zZJpCVJ!haPF*tQ$XNqfv-H%G>wAsAH^_~q zlC-(*P(k}UPo?GVvHIDvr&H1z5FKl<4xZ;&?u^P0Uuc(fUK@J;DqR8U$F8&}u*!*( z=5Pw$Vmw4xv3GP0U+uVVVndlNhJ*mYqPTj<;W4C*tq&RpT2#CU0ty9$;08jVjLG2! z#}Xh1WS*!#Y|(67=Z|Cc&IfA$HSJ!N-r3iux^FIag$izFzNhmHpKfoRewnodChOg@ z+kKIxhOY4%d6|m4Mvg23^0zhAqCaU zj4oh4%kza>cOaH-{vH1hOpp2lvstONsmGr6~0~P%4t8}bjC3MHVBmbNk zD5|z%=dr7;&-XlO>vKL!XUG5EbVMhDSZukj;oXW{`)f4@I3>9_+V=%DjHli>YtbTa zN@B->r`rBeRLF1&oV?`yNrYAS#5IEY)^at|{@DNcE(&6F9Q9lJd`K`7R%-X+@q$`O z{mM_%AumzRjpT?@d+O=nJdH5B0;U8zvQg^?2I-;FSX3)IbDt~X27a#AzkGoTQ*6`x z29>$nRb0d{la_nGZ_}>uN&-00WKtN2Xb0h_WqzCB^+uKKSuYK7{evMMPpI2N%w!J* zfnLS11QFGYyvj^uw}#o#y{#M(M2Wz-v&Xj@ushd8LM<*w&(72$8uRq^C81{XMRsWE z@$GZK+^a?%n>O98+E}>AS%_)@*3YlFx0kLAm4h!Yt*S>hK)cr#i>!8cbs~j}z8*_+ ziFg^JkbAB3s-YX0&ntf2#X)Eso?wg^l263>gQi#+5>VZJ{| zOiVVLmYFxa{me5PIQ^N3u04@`$N;rJj_SJf8t!-&ee9Pk)$hHh#*CRYbYlJcr*Mrd za#Zcw@w>SF0glD&EOT5z#cXUzsQ>U@jo*a~!r>BSm1H;f%JNlQJ2Y$7Wzfm#;sUa4 z^4J%VKDF70UU=Wm?Y>Bq9fkFG268tcuABnWjY7(yzT1=4E)bX^!RKoUO-3!8Nl(>O z$7~j`M!lt*K84iZ`A5p}`_4f+&aM=pPtDHS-7;WF6$B0W)nB|-s#Mi(HCLG=5&7(~ zf7&^5auL@g{$=apiFrGW6I5TpBq`@jIP|7Z7y)p~rIi}AdC6cUGMzC&rF2B?#<{V^ z-S)9h{|I$WMmZ=3Ss?1ygCAzM4j(Xo!GbwdlN86F_8an}@h5N2Ed@w+QG_z}9o~GnQHr~EBE?!1BiB5E-om1xOgTdX0 z3~3`g15zwGRL=jbnaF21U$Gl`H(JVV z2|Ye=*h-LOIjX#vbnSz2W%)Poq#P?qa&4AGS0?)s7k?SZgf36)b*k8|<*gUv($7C= zSf&t^6uR2$84v&4HADWdiK(_gjV#*Z?0=lr?@KD}{sahdt;bBkog6~*LUgKVxos4rn>ng`@ms+#>9v5Kph!eWDPR(NW;mAg)Q= zi|{`BgB7hEMWajYZYc$3FCv$0A8lN+AU*xhxaVhaVA)+#vYNBkxG2lWFne@YYT;p+ zV>QvTiJf=9l}zcQZmsfi=?kofp&qP4k8FLy9Kt2fFE%G#m6i{c$~rSwy!Y#qR{Dhw z)00IbwVfPOqltsP$g`K{T(5I)wc2LLO&jN^Q>*hoU5P$(q%3`s)|5mU7ibd!mh=X3 zZmW_Z0y51?k(YHLdWgQJW_?ih9Z+OH5h0v#=iO}KY~ZBszyeKo5q1KBubdaU%z)YK z%8ButI9$f=LUM^D;SX}GuKoL46oqdRiA8+SrC`n^68~BzXgnpH z%nz_F5-iy*V+rQB%7)f*-PyG3Zg{#blcG^vQHJ#Z#IsXuYEBjX%L8 zaIUmBGd+8C$pfizb5*p6@2p_wZ}xjprw zP%tE;MPe>fGm<#Jla~?ViV@)Us$JW*NoyZ3tmRR|9^Lvai%llgq=GevLlRf=KT=v; zqgk=}h;|OR_vYp2&mz51sbvYlJ(j$|`@`@1UTx!Xi)_EuD91zV@F$k4cA6&~y6v|~ z6OI3yZIR>WUc-j9C%8TNmIIHop4}5bE-9@DbQ$^&(Fc+V&LB=hhMilwAg`M=Oj4U( z_(`b25kEfHqOf&6dN?eujJ`#nq^WAXcme!w;B6nuONaG5lXmZOI6rm2;2+%@3)aCn;q1JeNh&MN9XIpwF zgje|d?qU1&OvOaf9r|`-=gtQye0at8KLM8jBr(njxJ+vCio(+dw%puH4;*aki}y48 z>sofUebL0WhS`0$2x>-1>sUJNGTDsgIrFASY^4Jafi6^s<$js0!J^cv>_1MIl1#6u zF|~R4a4sjtC5B}TjP|zVs1fK$;*uk?S4v>t0*P3+zP7F9RB`U#Eqk7%63kU9ZT7VU z{tZV`@a9uuzR7=K8cMfJj}xa)22J)h#1!u+5=R_x=)|h_TX6a{+z2BNNY2_`WX@r+ z*{Bj^ypLkCsIC~=!_uj*K*sijd{ey)WoTIc-fXb0JkXkkY>g941(d-!Xu1kmST(B0 zl{s@dh&fDcFBzSIEE2*%Oh~}XCKUeY6bL^(3CETi$Ek}fJmSFV%VZJMiGKItrnbOf zpmvS4*~tnK<(JsqRO>@w7H;OY?lr|wA-3u&S;nTO-I29cd)GdxypYQ8Y@eSp7 z0|h3BmMj6W8903SaP_<-Om`I3eo2L_!vioxJ&y*7h!XAuBV8LA1g2E*C{}`TFsyeGTHz$+1RrDw2A^8iSaHOR+aSq0Iwl%FY0C2nS z(qGYQF~FhP3y8Q*!)9|uJ524a>mgNZ{b@R4z1L?bH>FTt4lFH=V|??O?7n|H(Eu)8 zmYN;W)99nK#DQnW`6KR5yxhCl*+*$((zqWRQD|Y^w)v@@8{V6?;Pg?=8m*uScB%5d z+S5noYdb6T{HaT}xPOAzgbu}=j}ZR}(d$V?KJ(})Cp~M)1ox$r;7qo#P`-5-$-ynU z;hKgxO#Cf66`gP&|5Q40tls@@^%KF44?~HkGzGtTSFKsTTqbR5MHPb#RTcPUZ5Vea zj+5!khZHfj!JdZR74O_3cpc694(#~S0q|ok;$Rkrm>;mVR5G4%6y7Sl&zw4WE4;GW zhVh=QhA*|wxX>rV)VyF)KqsEe;iTdb5Yr*0&|AH}wt)7Ugg{&7q}4R!mVDzA>t}4W zYG1)2r4AROr;R)j?_gv&$iSJ-X>%u+gopFbZbL$)w7 z+UnxaDpQN{qRkYk(1_^~b`;92X^9>Q&n7WbB_ydLmz2ZrX}U(VRr6D`oU$$hN)a9- zcNF2Vs_H1#Z5mALB3wU{zJ^A`jk0z>H8FAD);ttYJryFL2E~WMBO!e40o#rwvL|tN zb8f@-Z@QFU=*$urDyx>#L^Af*H@`;|7&&LzILF78taWaiWj;Q_zW25@-Vy7kgXj}0 zHFsJ*#M42&s=|fcRaJ*^7W09`!g-FmlOX4S@iL9Mu~5*olJ&|Az&SbhnC!am#(Z^N+VS&-Pkr zVWG-kPLZ)nl!T`bXGg}up>BS3DX#rpqK)H^Z(pof(0|W@605IDD$LqtNA~R-hlut# zidY6M_M~5fA*lguh-9+emir_X6H_ZF`@5N$2kBuOiK=u_F{0Ez>1y36HL$2rJU zix-zxjdwgk;$zNU6`MiIec`m~(?QhrNOT6P#gfD1X3zzRll}TS z9A)77B*K_7OULBUB=6-fT7K<0c1SdDQ?1Y+Lf9|kU>s}OzViG3u%R;DH!sk$-X7BS zcYAZ+VXUQCtOuetsAU3M$|%j5O7ev zo&X|8Hm>bao_|83h={h?&ZY1oa16_)8`PX|R?B@fK=J9NmDTpxd}Q0Q?M09ygNLuj9AvNv5>2w2?i9MfoRjr-y>8^z-0|g0 zjTH9@R^AbA=PqX9+20!uD1;KV&tFx8A7PSorV8*kvYM-HT6=MKC}Z~YSPP4k@fFRd ze9d9%8VVlGFQ1y|-cGxWH#Z1<3tRM_ZLg}njn6i{>$cEt}V{q(Z4WV@J>P44xwv5wZL zVLpZWU%S3uMk9iFIPpJvWE0nrsp^95o4D{NsdwoK5Cdt+RYQ)n3=P0)3Q3#UkNJ+q z;RIE*;)j~*y}I>m%cJA5Ew29kIXm1>l2n=gsFlmd{+v#<|AR@rq62{V*ccQv$Fb+O za4C*Z+HQSpeNhA2Pptwgn58^^+tOoas_InF`}pUocAP1biM8}@dN}sn=qMfPEUl0u zjc)J%qk5zP)BRdtytCwGy*U%q`pntk-iDa_-EHoUe#_f`bI%z*e@DO22G!nxbE<9t zm9Y`95{Dpeu;MYrg~^URf9Ll)HY_yh^hV=tjSl}M-{`Gag z{-VhX*b;h;|DX`js^a{2fBPN%Y&Ov2LuC~wl$llLz;rAcw8ZJCOP}c{)mMC8#`!TN1matOPoHgh!YzIf4*pZ-P{4Za$GjmU#Z zR4A|_v6$4LB04ALmWir=UmJ^yOU@{-&)e>&-pAo&@bW)rYizsUS|@@xyYJbr>-o1^ zYBT4rpgYyJ;Qw~-{k|r@kx7jIeqU`W@~UUd{70|H1R!y^+WD z|6ksJK7#+_)%pKFz5mm-mtA#c?aMDi9jdDC9J8Ii{%761IY`}t(*FonWJZIj1K>)UyEOPbU=@F3x&tGe;p&h}>S zjeP#pz2LL2f6|Zs&z{|LzxteiFF)$jNIgOEs*dis@ye1>5x-@Q8}akO^HJJ!mUiu( zpi-=(r#DRm4?uUR#cEN6EYAztU4qx0MrIGrIk=H?nlBmSL-){wBz*iMkQf($b}