From ec1f7b00f05a79286dd139b92a5dffab6cf6e3b5 Mon Sep 17 00:00:00 2001 From: Ola Skavhaug Date: Sun, 27 Sep 2026 10:40:38 +0200 Subject: [PATCH 1/7] serial-phase profile: serial part is 34 % of 1-thread refine, flips dominate it, scan stops near 5x Measurement only, battery, d6d6beb, 1 m benchmark on the quarter circle. - Phase timers: scan 0.303 s, split 0.127 s, rest 0.029 s of 0.462 s at 1 thread; Amdahl ceiling 2.9x; measured best 2.03x at 16 threads. - sample(1) + atos on an -O3 -g -flto build: flip test 13.2 % of refine (exact incircle 5.0 %: 9.1 % of tests, all exactly cocircular), legalise loop 6.3 %, topology writes 7.3 %, active sort 3.6 %, allocation 1.5 %, no locking. - Scan 4.95x at 8 threads: chunk imbalance 16.5 ms of 61.8 ms. - Per round (local instrumentation patch, not applied to the tree): 95 % of insertions share a footprint slot with another in the same round, 65 % a written slot; 51 % of marked triangles are deferred by the loop. Also the first stored bench.py battery run for the quarter at d6d6beb. Co-Authored-By: Claude Opus 5.5 --- .../2026-09-27/serial-profile-bench/README.md | 38 + .../2026-09-27/serial-profile-bench/raw.tsv | 50 + .../2026-09-27/serial-profile-bench/run.json | 763 +++++++++++ .../2026-09-27/serial-profile/README.md | 357 +++++ .../serial-profile/data/attribution_t1.txt | 73 ++ .../serial-profile/data/chunks_sweep.pmset | 4 + .../serial-profile/data/chunks_sweep.tsv | 27 + .../serial-profile/data/chunks_t8.md | 44 + .../serial-profile/data/instr_t1_rounds.txt | 123 ++ .../serial-profile/data/instr_t8_rounds.txt | 405 ++++++ .../data/phases_sweep1_battery.pmset | 4 + .../data/phases_sweep1_battery.txt | 180 +++ .../data/phases_sweep2_battery.pmset | 4 + .../data/phases_sweep2_battery.txt | 180 +++ .../serial-profile/data/rounds_t1.md | 48 + .../serial-profile/data/sample_t1.pmset | 2 + .../serial-profile/data/sample_t1.txt | 1155 +++++++++++++++++ .../data/sample_t1_driver_phases.txt | 45 + .../serial-profile/scripts/analyse.py | 137 ++ .../serial-profile/scripts/attribute.py | 139 ++ .../serial-profile/scripts/chunksum.py | 17 + .../serial-profile/scripts/instrument.patch | 240 ++++ .../serial-profile/scripts/instrument.py | 181 +++ .../serial-profile/scripts/prof_driver.py | 51 + .../2026-09-27/serial-profile/scripts/summ.py | 15 + .../serial-profile/scripts/sweep.sh | 16 + 26 files changed, 4298 insertions(+) create mode 100644 docs/benchmarks/2026-09-27/serial-profile-bench/README.md create mode 100644 docs/benchmarks/2026-09-27/serial-profile-bench/raw.tsv create mode 100644 docs/benchmarks/2026-09-27/serial-profile-bench/run.json create mode 100644 docs/benchmarks/2026-09-27/serial-profile/README.md create mode 100644 docs/benchmarks/2026-09-27/serial-profile/data/attribution_t1.txt create mode 100644 docs/benchmarks/2026-09-27/serial-profile/data/chunks_sweep.pmset create mode 100644 docs/benchmarks/2026-09-27/serial-profile/data/chunks_sweep.tsv create mode 100644 docs/benchmarks/2026-09-27/serial-profile/data/chunks_t8.md create mode 100644 docs/benchmarks/2026-09-27/serial-profile/data/instr_t1_rounds.txt create mode 100644 docs/benchmarks/2026-09-27/serial-profile/data/instr_t8_rounds.txt create mode 100644 docs/benchmarks/2026-09-27/serial-profile/data/phases_sweep1_battery.pmset create mode 100644 docs/benchmarks/2026-09-27/serial-profile/data/phases_sweep1_battery.txt create mode 100644 docs/benchmarks/2026-09-27/serial-profile/data/phases_sweep2_battery.pmset create mode 100644 docs/benchmarks/2026-09-27/serial-profile/data/phases_sweep2_battery.txt create mode 100644 docs/benchmarks/2026-09-27/serial-profile/data/rounds_t1.md create mode 100644 docs/benchmarks/2026-09-27/serial-profile/data/sample_t1.pmset create mode 100644 docs/benchmarks/2026-09-27/serial-profile/data/sample_t1.txt create mode 100644 docs/benchmarks/2026-09-27/serial-profile/data/sample_t1_driver_phases.txt create mode 100644 docs/benchmarks/2026-09-27/serial-profile/scripts/analyse.py create mode 100644 docs/benchmarks/2026-09-27/serial-profile/scripts/attribute.py create mode 100644 docs/benchmarks/2026-09-27/serial-profile/scripts/chunksum.py create mode 100644 docs/benchmarks/2026-09-27/serial-profile/scripts/instrument.patch create mode 100644 docs/benchmarks/2026-09-27/serial-profile/scripts/instrument.py create mode 100644 docs/benchmarks/2026-09-27/serial-profile/scripts/prof_driver.py create mode 100644 docs/benchmarks/2026-09-27/serial-profile/scripts/summ.py create mode 100755 docs/benchmarks/2026-09-27/serial-profile/scripts/sweep.sh diff --git a/docs/benchmarks/2026-09-27/serial-profile-bench/README.md b/docs/benchmarks/2026-09-27/serial-profile-bench/README.md new file mode 100644 index 00000000..9c9a24d5 --- /dev/null +++ b/docs/benchmarks/2026-09-27/serial-profile-bench/README.md @@ -0,0 +1,38 @@ +# Benchmark run `serial-profile-bench` + +Generated by `tools/bench.py`. + +## Verdict + +- NO BASELINE: no comparable stored run + +Time threshold: 5.0 %. + +## Method + +- Started 2026-09-27T10:34:35.755087+02:00; tree `d6d6bebe4425df21ec758fc5377b4fc5f4b780f2` (dirty); bench.py blob `77765b181714c31714da476c2335c799c6a84021`. Build: Release, AppleClang 21.0.0.21000101, `-O3 -DNDEBUG`, _core sha256 `c1d29205fcc4b51a86b315b219de15456001e1837c16248dd380e0e655c4279a`. +- Apple M1 Max, 8 P + 2 E cores, 32 GiB, macOS 27.0, Python 3.14.7, numpy 2.5.3. +- Power **battery** (84%), `pmset -g batt` before and after (in run.json). +- DEM `/Users/skavhaug/projects/rasputin/tests/fixtures/dem_archive/7908_3_10m_z33.tif` (sha256 `aabd0cbc28471ce8593e4c278381811bec3fbf4e1194058b3b4888d00c3af575`), tolerance 1.0, extra mesh args ``; domains: `quarter` (/Users/skavhaug/projects/rasputin/docs/benchmarks/2026-09-26/quarter.geojson). +- One child per sample, `/Users/skavhaug/projects/rasputin/.venv/bin/python /Users/skavhaug/projects/rasputin/tools/bench.py _child --pkg /Users/skavhaug/projects/rasputin/build-bench/pkg --threads -- mesh --dem /Users/skavhaug/projects/rasputin/tests/fixtures/dem_archive/7908_3_10m_z33.tif --tolerance 1 --out --binary`, repeats interleaved over thread counts; t=0 is the CLI's default, other counts are forced into `refine`. Quality: one `--ascii` run per domain at t=0, kept out of the repository; rerun the child with `--ascii --out PATH` to regenerate it. + +## `quarter` + +| threads | n | median s | min s | max s | +|---:|---:|---:|---:|---:| +| 0 | 5 | 0.2398 | 0.2332 | 0.2423 | +| 1 | 5 | 0.4662 | 0.4636 | 0.4674 | +| 2 | 5 | 0.3354 | 0.3343 | 0.3386 | +| 4 | 5 | 0.2699 | 0.2693 | 0.2762 | +| 6 | 5 | 0.2416 | 0.2408 | 0.2518 | +| 8 | 5 | 0.2320 | 0.2305 | 0.2325 | +| 10 | 5 | 0.2415 | 0.2396 | 0.2494 | +| 12 | 5 | 0.2394 | 0.2382 | 0.2439 | +| 16 | 5 | 0.2306 | 0.2294 | 0.2411 | +| 20 | 5 | 0.2351 | 0.2271 | 0.2369 | + +Ceiling: 1.98x at 20 threads over 1, best 2.02x at 16; 2026-09-26: about 2.2x, flat from about 7. + +Quality: worst angle 0.3955 deg, median 45.00, share under 1 deg 0.00003, max degree 18, within tolerance True, Delaunay 0 violations of 641791 edges (80136 decided exactly), mesh sha256 `1e531976f33b38dd883f9cf1945f6303dbac94c92f30b52b8bd7b46db7eab9ee`. + + diff --git a/docs/benchmarks/2026-09-27/serial-profile-bench/raw.tsv b/docs/benchmarks/2026-09-27/serial-profile-bench/raw.tsv new file mode 100644 index 00000000..59b3e412 --- /dev/null +++ b/docs/benchmarks/2026-09-27/serial-profile-bench/raw.tsv @@ -0,0 +1,50 @@ +quarter 0 0 0.238149 battery +quarter 1 0 0.464229 battery +quarter 2 0 0.334424 battery +quarter 4 0 0.276165 battery +quarter 6 0 0.241329 battery +quarter 8 0 0.230470 battery +quarter 10 0 0.241540 battery +quarter 12 0 0.238213 battery +quarter 16 0 0.241120 battery +quarter 20 0 0.235054 battery +quarter 0 1 0.239837 battery +quarter 1 1 0.463626 battery +quarter 2 1 0.334267 battery +quarter 4 1 0.269896 battery +quarter 6 1 0.240825 battery +quarter 8 1 0.232145 battery +quarter 10 1 0.249413 battery +quarter 12 1 0.239442 battery +quarter 16 1 0.230285 battery +quarter 20 1 0.236204 battery +quarter 0 2 0.240615 battery +quarter 1 2 0.466478 battery +quarter 2 2 0.337431 battery +quarter 4 2 0.269493 battery +quarter 6 2 0.251845 battery +quarter 8 2 0.231956 battery +quarter 10 2 0.246728 battery +quarter 12 2 0.238936 battery +quarter 16 2 0.232863 battery +quarter 20 2 0.227131 battery +quarter 0 3 0.242317 battery +quarter 1 3 0.467371 battery +quarter 2 3 0.335420 battery +quarter 4 3 0.269319 battery +quarter 6 3 0.242405 battery +quarter 8 3 0.232472 battery +quarter 10 3 0.241090 battery +quarter 12 3 0.239928 battery +quarter 16 3 0.229365 battery +quarter 20 3 0.232811 battery +quarter 0 4 0.233192 battery +quarter 1 4 0.466176 battery +quarter 2 4 0.338617 battery +quarter 4 4 0.270899 battery +quarter 6 4 0.241555 battery +quarter 8 4 0.231848 battery +quarter 10 4 0.239570 battery +quarter 12 4 0.243907 battery +quarter 16 4 0.230588 battery +quarter 20 4 0.236879 battery diff --git a/docs/benchmarks/2026-09-27/serial-profile-bench/run.json b/docs/benchmarks/2026-09-27/serial-profile-bench/run.json new file mode 100644 index 00000000..4eebca4b --- /dev/null +++ b/docs/benchmarks/2026-09-27/serial-profile-bench/run.json @@ -0,0 +1,763 @@ +{ + "label": "serial-profile-bench", + "started": "2026-09-27T10:34:35.755087+02:00", + "tree": { + "commit": "d6d6bebe4425df21ec758fc5377b4fc5f4b780f2", + "dirty": true + }, + "bench_blob": "77765b181714c31714da476c2335c799c6a84021", + "child_argv": [ + "/Users/skavhaug/projects/rasputin/.venv/bin/python", + "/Users/skavhaug/projects/rasputin/tools/bench.py", + "_child", + "--pkg", + "/Users/skavhaug/projects/rasputin/build-bench/pkg", + "--threads", + "", + "--", + "mesh", + "--dem", + "/Users/skavhaug/projects/rasputin/tests/fixtures/dem_archive/7908_3_10m_z33.tif", + "--tolerance", + "1", + "--out", + "", + "--binary" + ], + "build": { + "no_build": false, + "type": "Release", + "cxx_flags_release": "-O3 -DNDEBUG", + "compiler": "AppleClang 21.0.0.21000101", + "so_sha256": "c1d29205fcc4b51a86b315b219de15456001e1837c16248dd380e0e655c4279a" + }, + "machine": { + "cpu_brand": "Apple M1 Max", + "p_cores": 8, + "e_cores": 2, + "memory_bytes": 34359738368, + "macos": "27.0", + "python": "3.14.7", + "numpy": "2.5.3" + }, + "power": { + "state": "battery", + "percent": 84, + "raw": "Now drawing from 'Battery Power'\n -InternalBattery-0 (id=7929955)\t84%; discharging; 6:25 remaining present: true\n--- after ---\nNow drawing from 'Battery Power'\n -InternalBattery-0 (id=7929955)\t84%; discharging; 6:25 remaining present: true\n" + }, + "inputs": { + "dem": "/Users/skavhaug/projects/rasputin/tests/fixtures/dem_archive/7908_3_10m_z33.tif", + "dem_sha256": "aabd0cbc28471ce8593e4c278381811bec3fbf4e1194058b3b4888d00c3af575", + "domains": [ + { + "name": "quarter", + "path": "/Users/skavhaug/projects/rasputin/docs/benchmarks/2026-09-26/quarter.geojson", + "sha256": "b7f7bbe96848383c77863ce29ee28c45bce087601a1738ee82ddb4ffb8279d1e" + } + ], + "tolerance": 1.0, + "extra_args": [] + }, + "samples": [ + { + "domain": "quarter", + "threads": 0, + "repeat": 0, + "refine_s": 0.23814937501447275, + "app_s": 0.3466679999837652, + "proc_s": 1.080649166018702, + "max_error": 0.9999796549479072, + "rounds": 41, + "inserted": 213464, + "flips": 445657 + }, + { + "domain": "quarter", + "threads": 1, + "repeat": 0, + "refine_s": 0.4642291250056587, + "app_s": 0.5663558749947697, + "proc_s": 0.816757791035343, + "max_error": 0.9999796549479072, + "rounds": 41, + "inserted": 213464, + "flips": 445657 + }, + { + "domain": "quarter", + "threads": 2, + "repeat": 0, + "refine_s": 0.33442400000058115, + "app_s": 0.4333924590027891, + "proc_s": 0.6759055840084329, + "max_error": 0.9999796549479072, + "rounds": 41, + "inserted": 213464, + "flips": 445657 + }, + { + "domain": "quarter", + "threads": 4, + "repeat": 0, + "refine_s": 0.2761647080187686, + "app_s": 0.3757862910279073, + "proc_s": 0.6183809170033783, + "max_error": 0.9999796549479072, + "rounds": 41, + "inserted": 213464, + "flips": 445657 + }, + { + "domain": "quarter", + "threads": 6, + "repeat": 0, + "refine_s": 0.24132899998221546, + "app_s": 0.34080374997574836, + "proc_s": 0.5876433749799617, + "max_error": 0.9999796549479072, + "rounds": 41, + "inserted": 213464, + "flips": 445657 + }, + { + "domain": "quarter", + "threads": 8, + "repeat": 0, + "refine_s": 0.23047020798549056, + "app_s": 0.3327333750203252, + "proc_s": 0.5773683750303462, + "max_error": 0.9999796549479072, + "rounds": 41, + "inserted": 213464, + "flips": 445657 + }, + { + "domain": "quarter", + "threads": 10, + "repeat": 0, + "refine_s": 0.24154016701504588, + "app_s": 0.3402866249671206, + "proc_s": 0.584436375007499, + "max_error": 0.9999796549479072, + "rounds": 41, + "inserted": 213464, + "flips": 445657 + }, + { + "domain": "quarter", + "threads": 12, + "repeat": 0, + "refine_s": 0.23821316700195894, + "app_s": 0.3387784590013325, + "proc_s": 0.5844985829899088, + "max_error": 0.9999796549479072, + "rounds": 41, + "inserted": 213464, + "flips": 445657 + }, + { + "domain": "quarter", + "threads": 16, + "repeat": 0, + "refine_s": 0.2411199589841999, + "app_s": 0.33970895799575374, + "proc_s": 0.5828278749831952, + "max_error": 0.9999796549479072, + "rounds": 41, + "inserted": 213464, + "flips": 445657 + }, + { + "domain": "quarter", + "threads": 20, + "repeat": 0, + "refine_s": 0.23505420796573162, + "app_s": 0.3374120839871466, + "proc_s": 0.5830653330194764, + "max_error": 0.9999796549479072, + "rounds": 41, + "inserted": 213464, + "flips": 445657 + }, + { + "domain": "quarter", + "threads": 0, + "repeat": 1, + "refine_s": 0.23983691696776077, + "app_s": 0.3393913329928182, + "proc_s": 0.5833009580383077, + "max_error": 0.9999796549479072, + "rounds": 41, + "inserted": 213464, + "flips": 445657 + }, + { + "domain": "quarter", + "threads": 1, + "repeat": 1, + "refine_s": 0.4636262909625657, + "app_s": 0.564821791020222, + "proc_s": 0.8109932499937713, + "max_error": 0.9999796549479072, + "rounds": 41, + "inserted": 213464, + "flips": 445657 + }, + { + "domain": "quarter", + "threads": 2, + "repeat": 1, + "refine_s": 0.334267208003439, + "app_s": 0.43342724995454773, + "proc_s": 0.6760752919944935, + "max_error": 0.9999796549479072, + "rounds": 41, + "inserted": 213464, + "flips": 445657 + }, + { + "domain": "quarter", + "threads": 4, + "repeat": 1, + "refine_s": 0.26989629201125354, + "app_s": 0.36875700001837686, + "proc_s": 0.6110361669561826, + "max_error": 0.9999796549479072, + "rounds": 41, + "inserted": 213464, + "flips": 445657 + }, + { + "domain": "quarter", + "threads": 6, + "repeat": 1, + "refine_s": 0.24082524998812005, + "app_s": 0.34159841696964577, + "proc_s": 0.584965167043265, + "max_error": 0.9999796549479072, + "rounds": 41, + "inserted": 213464, + "flips": 445657 + }, + { + "domain": "quarter", + "threads": 8, + "repeat": 1, + "refine_s": 0.23214512498816475, + "app_s": 0.33256870799232274, + "proc_s": 0.5764001249917783, + "max_error": 0.9999796549479072, + "rounds": 41, + "inserted": 213464, + "flips": 445657 + }, + { + "domain": "quarter", + "threads": 10, + "repeat": 1, + "refine_s": 0.24941349995788187, + "app_s": 0.34929974999977276, + "proc_s": 0.5940562500036322, + "max_error": 0.9999796549479072, + "rounds": 41, + "inserted": 213464, + "flips": 445657 + }, + { + "domain": "quarter", + "threads": 12, + "repeat": 1, + "refine_s": 0.23944224999286234, + "app_s": 0.338705999951344, + "proc_s": 0.5821347910095938, + "max_error": 0.9999796549479072, + "rounds": 41, + "inserted": 213464, + "flips": 445657 + }, + { + "domain": "quarter", + "threads": 16, + "repeat": 1, + "refine_s": 0.2302846250240691, + "app_s": 0.33160325000062585, + "proc_s": 0.5746996250236407, + "max_error": 0.9999796549479072, + "rounds": 41, + "inserted": 213464, + "flips": 445657 + }, + { + "domain": "quarter", + "threads": 20, + "repeat": 1, + "refine_s": 0.23620358301559463, + "app_s": 0.3367980829789303, + "proc_s": 0.5813691670191474, + "max_error": 0.9999796549479072, + "rounds": 41, + "inserted": 213464, + "flips": 445657 + }, + { + "domain": "quarter", + "threads": 0, + "repeat": 2, + "refine_s": 0.2406151659670286, + "app_s": 0.3401798749691807, + "proc_s": 0.5852144590462558, + "max_error": 0.9999796549479072, + "rounds": 41, + "inserted": 213464, + "flips": 445657 + }, + { + "domain": "quarter", + "threads": 1, + "repeat": 2, + "refine_s": 0.46647762501379475, + "app_s": 0.5666403340292163, + "proc_s": 0.8111530829919502, + "max_error": 0.9999796549479072, + "rounds": 41, + "inserted": 213464, + "flips": 445657 + }, + { + "domain": "quarter", + "threads": 2, + "repeat": 2, + "refine_s": 0.33743108296766877, + "app_s": 0.43682612502016127, + "proc_s": 0.682247125019785, + "max_error": 0.9999796549479072, + "rounds": 41, + "inserted": 213464, + "flips": 445657 + }, + { + "domain": "quarter", + "threads": 4, + "repeat": 2, + "refine_s": 0.26949337497353554, + "app_s": 0.369783541013021, + "proc_s": 0.6127248749835417, + "max_error": 0.9999796549479072, + "rounds": 41, + "inserted": 213464, + "flips": 445657 + }, + { + "domain": "quarter", + "threads": 6, + "repeat": 2, + "refine_s": 0.25184541603084654, + "app_s": 0.34966654202435166, + "proc_s": 0.5953117920435034, + "max_error": 0.9999796549479072, + "rounds": 41, + "inserted": 213464, + "flips": 445657 + }, + { + "domain": "quarter", + "threads": 8, + "repeat": 2, + "refine_s": 0.2319562080083415, + "app_s": 0.3308679169858806, + "proc_s": 0.5743917920044623, + "max_error": 0.9999796549479072, + "rounds": 41, + "inserted": 213464, + "flips": 445657 + }, + { + "domain": "quarter", + "threads": 10, + "repeat": 2, + "refine_s": 0.24672816699603572, + "app_s": 0.3460935420007445, + "proc_s": 0.5883208329905756, + "max_error": 0.9999796549479072, + "rounds": 41, + "inserted": 213464, + "flips": 445657 + }, + { + "domain": "quarter", + "threads": 12, + "repeat": 2, + "refine_s": 0.23893641598988324, + "app_s": 0.3388367500156164, + "proc_s": 0.5824374579824507, + "max_error": 0.9999796549479072, + "rounds": 41, + "inserted": 213464, + "flips": 445657 + }, + { + "domain": "quarter", + "threads": 16, + "repeat": 2, + "refine_s": 0.23286345903761685, + "app_s": 0.3332886249991134, + "proc_s": 0.5807576669612899, + "max_error": 0.9999796549479072, + "rounds": 41, + "inserted": 213464, + "flips": 445657 + }, + { + "domain": "quarter", + "threads": 20, + "repeat": 2, + "refine_s": 0.227130708983168, + "app_s": 0.3260585839743726, + "proc_s": 0.5681280829594471, + "max_error": 0.9999796549479072, + "rounds": 41, + "inserted": 213464, + "flips": 445657 + }, + { + "domain": "quarter", + "threads": 0, + "repeat": 3, + "refine_s": 0.2423165420186706, + "app_s": 0.3418199580046348, + "proc_s": 0.58356829197146, + "max_error": 0.9999796549479072, + "rounds": 41, + "inserted": 213464, + "flips": 445657 + }, + { + "domain": "quarter", + "threads": 1, + "repeat": 3, + "refine_s": 0.4673712910152972, + "app_s": 0.5675870839622803, + "proc_s": 0.8099945840076543, + "max_error": 0.9999796549479072, + "rounds": 41, + "inserted": 213464, + "flips": 445657 + }, + { + "domain": "quarter", + "threads": 2, + "repeat": 3, + "refine_s": 0.3354202499613166, + "app_s": 0.4355389170232229, + "proc_s": 0.6766786250518635, + "max_error": 0.9999796549479072, + "rounds": 41, + "inserted": 213464, + "flips": 445657 + }, + { + "domain": "quarter", + "threads": 4, + "repeat": 3, + "refine_s": 0.2693193329614587, + "app_s": 0.36987137503456324, + "proc_s": 0.6120501250261441, + "max_error": 0.9999796549479072, + "rounds": 41, + "inserted": 213464, + "flips": 445657 + }, + { + "domain": "quarter", + "threads": 6, + "repeat": 3, + "refine_s": 0.24240512499818578, + "app_s": 0.34144987497711554, + "proc_s": 0.5849800829892047, + "max_error": 0.9999796549479072, + "rounds": 41, + "inserted": 213464, + "flips": 445657 + }, + { + "domain": "quarter", + "threads": 8, + "repeat": 3, + "refine_s": 0.23247200000332668, + "app_s": 0.33315579197369516, + "proc_s": 0.588465791021008, + "max_error": 0.9999796549479072, + "rounds": 41, + "inserted": 213464, + "flips": 445657 + }, + { + "domain": "quarter", + "threads": 10, + "repeat": 3, + "refine_s": 0.2410902910050936, + "app_s": 0.3423722499865107, + "proc_s": 0.5924768339609727, + "max_error": 0.9999796549479072, + "rounds": 41, + "inserted": 213464, + "flips": 445657 + }, + { + "domain": "quarter", + "threads": 12, + "repeat": 3, + "refine_s": 0.239928291994147, + "app_s": 0.34009599999990314, + "proc_s": 0.5922628749976866, + "max_error": 0.9999796549479072, + "rounds": 41, + "inserted": 213464, + "flips": 445657 + }, + { + "domain": "quarter", + "threads": 16, + "repeat": 3, + "refine_s": 0.22936487500555813, + "app_s": 0.32955458300421014, + "proc_s": 0.5727674999507144, + "max_error": 0.9999796549479072, + "rounds": 41, + "inserted": 213464, + "flips": 445657 + }, + { + "domain": "quarter", + "threads": 20, + "repeat": 3, + "refine_s": 0.2328109170193784, + "app_s": 0.3310880000353791, + "proc_s": 0.573532916023396, + "max_error": 0.9999796549479072, + "rounds": 41, + "inserted": 213464, + "flips": 445657 + }, + { + "domain": "quarter", + "threads": 0, + "repeat": 4, + "refine_s": 0.23319162498228252, + "app_s": 0.33324995799921453, + "proc_s": 0.5760237500071526, + "max_error": 0.9999796549479072, + "rounds": 41, + "inserted": 213464, + "flips": 445657 + }, + { + "domain": "quarter", + "threads": 1, + "repeat": 4, + "refine_s": 0.46617554198019207, + "app_s": 0.5644539580098353, + "proc_s": 0.8081312919966877, + "max_error": 0.9999796549479072, + "rounds": 41, + "inserted": 213464, + "flips": 445657 + }, + { + "domain": "quarter", + "threads": 2, + "repeat": 4, + "refine_s": 0.3386174169718288, + "app_s": 0.43809491698630154, + "proc_s": 0.6848158339853399, + "max_error": 0.9999796549479072, + "rounds": 41, + "inserted": 213464, + "flips": 445657 + }, + { + "domain": "quarter", + "threads": 4, + "repeat": 4, + "refine_s": 0.2708993330015801, + "app_s": 0.3713522500474937, + "proc_s": 0.6140189580037259, + "max_error": 0.9999796549479072, + "rounds": 41, + "inserted": 213464, + "flips": 445657 + }, + { + "domain": "quarter", + "threads": 6, + "repeat": 4, + "refine_s": 0.2415553749888204, + "app_s": 0.34105491603258997, + "proc_s": 0.5884577090037055, + "max_error": 0.9999796549479072, + "rounds": 41, + "inserted": 213464, + "flips": 445657 + }, + { + "domain": "quarter", + "threads": 8, + "repeat": 4, + "refine_s": 0.23184758302522823, + "app_s": 0.332258417038247, + "proc_s": 0.5757445840281434, + "max_error": 0.9999796549479072, + "rounds": 41, + "inserted": 213464, + "flips": 445657 + }, + { + "domain": "quarter", + "threads": 10, + "repeat": 4, + "refine_s": 0.2395702910143882, + "app_s": 0.33861733303638175, + "proc_s": 0.5822296250262298, + "max_error": 0.9999796549479072, + "rounds": 41, + "inserted": 213464, + "flips": 445657 + }, + { + "domain": "quarter", + "threads": 12, + "repeat": 4, + "refine_s": 0.24390695901820436, + "app_s": 0.34370108298026025, + "proc_s": 0.5868218749528751, + "max_error": 0.9999796549479072, + "rounds": 41, + "inserted": 213464, + "flips": 445657 + }, + { + "domain": "quarter", + "threads": 16, + "repeat": 4, + "refine_s": 0.2305878329789266, + "app_s": 0.3295878749922849, + "proc_s": 0.5736127500422299, + "max_error": 0.9999796549479072, + "rounds": 41, + "inserted": 213464, + "flips": 445657 + }, + { + "domain": "quarter", + "threads": 20, + "repeat": 4, + "refine_s": 0.23687875003088266, + "app_s": 0.33634412504034117, + "proc_s": 0.5794730420457199, + "max_error": 0.9999796549479072, + "rounds": 41, + "inserted": 213464, + "flips": 445657 + } + ], + "stats": [ + { + "domain": "quarter", + "threads": 0, + "n": 5, + "median": 0.23983691696776077, + "min": 0.23319162498228252, + "max": 0.2423165420186706 + }, + { + "domain": "quarter", + "threads": 1, + "n": 5, + "median": 0.46617554198019207, + "min": 0.4636262909625657, + "max": 0.4673712910152972 + }, + { + "domain": "quarter", + "threads": 2, + "n": 5, + "median": 0.3354202499613166, + "min": 0.334267208003439, + "max": 0.3386174169718288 + }, + { + "domain": "quarter", + "threads": 4, + "n": 5, + "median": 0.26989629201125354, + "min": 0.2693193329614587, + "max": 0.2761647080187686 + }, + { + "domain": "quarter", + "threads": 6, + "n": 5, + "median": 0.2415553749888204, + "min": 0.24082524998812005, + "max": 0.25184541603084654 + }, + { + "domain": "quarter", + "threads": 8, + "n": 5, + "median": 0.2319562080083415, + "min": 0.23047020798549056, + "max": 0.23247200000332668 + }, + { + "domain": "quarter", + "threads": 10, + "n": 5, + "median": 0.24154016701504588, + "min": 0.2395702910143882, + "max": 0.24941349995788187 + }, + { + "domain": "quarter", + "threads": 12, + "n": 5, + "median": 0.23944224999286234, + "min": 0.23821316700195894, + "max": 0.24390695901820436 + }, + { + "domain": "quarter", + "threads": 16, + "n": 5, + "median": 0.2305878329789266, + "min": 0.22936487500555813, + "max": 0.2411199589841999 + }, + { + "domain": "quarter", + "threads": 20, + "n": 5, + "median": 0.23505420796573162, + "min": 0.227130708983168, + "max": 0.23687875003088266 + } + ], + "quality": { + "quarter": { + "worst_angle": 0.3955267116350698, + "angle_median": 45.0, + "share_under_1": 0.000028023175165862168, + "max_degree": 18, + "within_tolerance": true, + "delaunay_checked": 641791, + "delaunay_ambiguous": 80136, + "delaunay_violations": 0, + "mesh_sha256": "1e531976f33b38dd883f9cf1945f6303dbac94c92f30b52b8bd7b46db7eab9ee" + } + }, + "accept_quality": false, + "threshold_pct": 5.0, + "verdict": [ + "NO BASELINE: no comparable stored run" + ] +} diff --git a/docs/benchmarks/2026-09-27/serial-profile/README.md b/docs/benchmarks/2026-09-27/serial-profile/README.md new file mode 100644 index 00000000..80931ff4 --- /dev/null +++ b/docs/benchmarks/2026-09-27/serial-profile/README.md @@ -0,0 +1,357 @@ +# Serial-phase profile of refine, 2026-09-27 + +Status: done (@perf). Measurement and analysis only: no fix, no design, no +production code changed. Every figure below is from **battery** power +(`pmset -g batt` beside each data file); no AC run was made. + +The ask (Ola, 2026-09-27): profile refine's serial phase before anyone designs +a fix. "Some of the serial parts could be parallelised by multicolouring/DD +techniques, but let's wait for the analysis before we get ahead of ourselves." + +## Findings + +1. **About a third of single-thread refine does not parallelise, not half.** + The serial part is 34 % (0.159 s of 0.462 s): the split + flip phase (27 %) + plus the between-round work outside both timers (6 %). Amdahl's law with a + perfectly parallel scan gives a ceiling of 2.9x. Adding the scan's measured + scaling predicts 2.10x at 8 threads, and 2.02x was measured. The rest of + the gap is measured too: the split phase runs about 8 % slower after a + multi-threaded scan. +2. **Inside the serial phase, Lawson legalisation costs more than insertion.** + The flip test (`must_flip` plus predicates) is 13.2 % of refine. Of that, + 5.0 % is the exact incircle fallback. It fires on 9.1 % of incircle tests, + and every one of those tests was exactly cocircular. The legalise_around + loop is 6.3 %, and topology writes (split, flip, put and repoint) are 7.3 %. + Allocation is 1.5 % and locking is 0 %: the serial phase takes no lock. The + `active` sort between rounds is 3.6 %. +3. **The scan speeds up about 5x at 8 threads (4.95x), not 8x, and flattens + from about 8.** Load imbalance across the contiguous chunks costs 16.5 ms of + the 61.8 ms. A quarter of that imbalance is round 1 alone. Thread start + costs 3.8 ms, and each worker is about 9 % slower than a lone thread. Above + 10 threads (8 P + 2 E cores) the last chunk starts about 30 ms late. The + bytes read (2.6 GB/s at 8 threads) show no sign of a memory-bandwidth limit. + That is inferred from byte counts; no hardware counters were read. +4. **Insertions in the same round are dense and overlap.** 41 rounds; 77 % of + the 213,464 insertions fall in rounds 9-19, at 9,000-18,700 per round. In + rounds 5-21 each round touches 69-93 % of the domain's 64×64-node blocks. + From round 11 on, the median distance to the nearest same-round insertion + is 3 nodes. An insertion writes 5.5 triangle slots on average (p99 9) and + reads or writes 11.0 (p99 18). 95 % of insertions share a slot, read or + written, with another insertion of the same round; 65 % share a written + slot. The serial loop already defers 51 % of marked triangles because an + earlier insertion in the same round rewrote their slot. + +The 2026-09-26 README said the serial part was "thought to be the serial +insert and flip phase" and "roughly half". The profile confirms the phase and +corrects the share: 34 % at one thread. The low ceiling comes from that 34 % +together with a scan that stops at about 5x. + +## Method + +- **Commit** `d6d6beb` (branch `serial-profile`), clean apart from this + directory. The 1 m benchmark: DEM + `tests/fixtures/dem_archive/7908_3_10m_z33.tif` (5051 × 5051 nodes, 10 m), + domain `docs/benchmarks/2026-09-26/quarter.geojson`, tolerance 1, all other + CLI defaults. Every run gave the same output: 41 rounds, 213,464 inserted, + 445,657 flips, 428,217 triangles, and the same mesh sha256 for the plain, + profiled and instrumented builds (`ff705683…` over the binary VTK). +- **Machine**: Apple M1 Max, 8 P + 2 E cores, 32 GiB, macOS 27.0, AppleClang + 21.0.0, Python 3.14.7. **Power: battery**, 83-86 %, throughout + (`data/*.pmset`, and `run.json` of the bench.py run). `powermode 0`. +- **Builds** (all scratch, in gitignored `build-*` directories): + - `build-prof`: `CMAKE_BUILD_TYPE=Release`, `CMAKE_CXX_FLAGS=-g`, which + gives `-g -O3 -DNDEBUG … -flto`. Used for the phase sweeps. pybind11 strips + Release modules, so it has no symbols. + - `build-prof-lto`: `RelWithDebInfo` with + `CMAKE_CXX_FLAGS_RELWITHDEBINFO="-O3 -g -DNDEBUG -flto"` and + `CMAKE_MODULE_LINKER_FLAGS="-flto -Wl,-object_path_lto,/lto.o"`, then + `dsymutil`. It is unstripped and has line tables, and runs as fast as the + Release bench build: 0.456 s against 0.460 s, and 0.455 s against 0.462 s, + in back-to-back pairs of 5 calls. Used for the profile. A first attempt + without `-flto` was 16 % slower in the scan, so it was not used. + - `build-instr`: Release (as bench.py builds it) in a scratch worktree of + `d6d6beb` with `scripts/instrument.patch` applied. That is a **local patch, + never committed**, generated by `scripts/instrument.py`. It adds counters + and per-round records only. Used for questions 2 and 3. Its split-phase + timings are inflated by its own logging and are not reported. +- **Timing harness**: `scripts/prof_driver.py`, bench.py's child technique + (the build's `pkg/` first on `sys.path`, and `cli.refine` wrapped with + threads forced). It calls refine K times with the same arguments and prints + `RefineOutcome`'s phase seconds (increment 17) per call. `rest` is the + wrapper's wall time minus the four phase timers: setup, the between-round + `active` rebuild, output and the pybind return. + `scripts/sweep.sh` makes 3 interleaved passes over thread counts + 1-8, 10, 12, 16, 20, with 5 calls per process: 15 samples, reported as the + median (`scripts/summ.py`). +- **Profiler**: `/usr/bin/sample` at 1 ms, attached for 18 s to a driver that + was making 45 single-thread calls (`xctrace` is not installed: Command Line + Tools only). `scripts/attribute.py` computes each call-graph node's self + count and resolves every `_core` address with `atos -i` against the dSYM to + its inline chain. It files each sample under the innermost frame that + matches a category. The matching ignores template arguments, which would + otherwise match on type names. Sampling slowed the calls by about 10 % + (0.510 s, `data/sample_t1_driver_phases.txt`). The profile's scan share + (66.0 %) matches the timer's (64 %). +- **bench.py cross-check**: `tools/bench.py run --label serial-profile-bench + --domain docs/benchmarks/2026-09-26/quarter.geojson --threads + 1,2,4,6,8,10,12,16,20 --repeats 5`. Its evidence is in + `../serial-profile-bench/`. It is the first stored battery run for the + quarter at `d6d6beb`. It records `dirty` only because this directory was + untracked at the time. + +## 1. Where single-thread refine time goes + +### Phase timers (RefineOutcome, increment 17), battery + +Sweep 2 (`data/phases_sweep2_battery.txt`), 15 samples per row, medians: + +| threads | refine s | speed-up | scan s | scan speed-up | split s | rest s | serial share | +|---|---|---|---|---|---|---|---| +| 1 | 0.462 | 1.00x | 0.303 | 1.00x | 0.127 | 0.029 | 34 % | +| 2 | 0.332 | 1.39x | 0.174 | 1.74x | 0.126 | 0.029 | 47 % | +| 3 | 0.283 | 1.63x | 0.124 | 2.44x | 0.128 | 0.029 | 56 % | +| 4 | 0.266 | 1.74x | 0.100 | 3.03x | 0.136 | 0.030 | 63 % | +| 5 | 0.251 | 1.84x | 0.083 | 3.68x | 0.136 | 0.030 | 67 % | +| 6 | 0.238 | 1.94x | 0.071 | 4.30x | 0.136 | 0.030 | 70 % | +| 7 | 0.232 | 1.99x | 0.065 | 4.66x | 0.136 | 0.029 | 72 % | +| 8 | 0.229 | 2.02x | 0.061 | 5.00x | 0.137 | 0.030 | 74 % | +| 10 | 0.236 | 1.96x | 0.063 | 4.82x | 0.142 | 0.030 | 73 % | +| 12 | 0.235 | 1.97x | 0.062 | 4.90x | 0.142 | 0.030 | 74 % | +| 16 | 0.227 | 2.03x | 0.054 | 5.63x | 0.143 | 0.030 | 76 % | +| 20 | 0.230 | 2.00x | 0.057 | 5.33x | 0.142 | 0.030 | 75 % | + +`legalise` (start mesh) is under 0.1 ms and `quality` about 1 ms at every +count. "Serial share" is (refine - scan) / refine. + +Sweep 1 (`data/phases_sweep1_battery.txt`) ran 20 minutes earlier, also on +battery, with the same build. Every 1-thread figure was 14-15 % slower +(refine 0.527 s, scan 0.348 s, split 0.146 s), and the serial share was the +same, 34 %. Its ceiling was 2.25x at 20. The cause of the session-to-session +difference was not found. The bench.py run, made between the two sweeps, +agrees with sweep 2: 0.466 s at 1 thread, best 2.02x at 16. So sweep 2 is the +one reported. Compare figures only within one sweep. + +### Amdahl + +- Serial part at 1 thread: 0.462 - 0.303 = **0.159 s, 34 %**. With a scan + of zero cost the ceiling would be 0.462 / 0.159 = **2.9x**. +- With the scan's measured 8-thread time (0.061 s) and the 1-thread serial + part: 0.159 + 0.061 = 0.220 s, a predicted **2.10x**. Measured: 2.02x + (0.229 s). The difference is measured: split takes 0.127 s at 1-3 threads + and 0.136-0.143 s at 4 or more. Why is not measured; it is thought to be + cache locality, since the scan's results and the mesh lines were last + touched by other cores. +- The measured ceiling today is **2.03x at 16 threads** (bench.py: 2.02x at + 16), against the 2026-09-26 figure of about 2.2x. That older run was at + 8f47e7e in a different harness and is not a baseline for this one + (`docs/increments/README.md`). + +### Profile of the single-thread call, battery + +Taken from `data/attribution_t1.txt` (from `data/sample_t1.txt`): 13,079 self +samples inside `refine`, at 1 ms each. The shares are of the whole refine +call. + +| where | samples | share of refine | phase | +|---|---|---|---| +| scan (`scan<>`, row spans, row segments, the chunk lambda) | 8,634 | 66.0 % | parallel | +| legalise_around loop (stack push/pop, neighbour lookups, `touched` marks) | 825 | 6.3 % | split | +| `must_flip` itself (edge lookup in the neighbour, frame points) | 718 | 5.5 % | split | +| exact incircle fallback (`incircleadapt`, expansions) | 653 | 5.0 % | split | +| filtered orient2d/incircle | 349 | 2.7 % | split | +| `LatticeMesh::put` / `repoint` (shared by split and flip) | 339 | 2.6 % | split | +| `LatticeMesh::flip` | 330 | 2.5 % | split | +| `split_inside` / `split_edge` / `add_vertex` | 284 | 2.2 % | split | +| refine body without line info (line 0 in the line table) | 208 | 1.6 % | split, mostly (not resolvable) | +| allocation (malloc/free/memmove) | 198 | 1.5 % | split, mostly | +| split loop bookkeeping (result read, `touched`, `skipped`) | 10 | 0.1 % | split | +| rebuild `active`: collect, `std::sort`, `unique` | 466 | 3.6 % | between rounds (in `rest`) | +| output (vertices, z, triangles, constraint edges) | 39 | 0.3 % | after the loop (in `rest`) | +| pybind conversion inside the call | 18 | 0.1 % | | +| start quality, setup (`to_lattice`, `LatticeMesh::build`) | 8 | 0.1 % | | + +Grouped over the split phase, which is about 30 % of refine: + +- **Lawson flips dominate insertion.** Flip test 13.2 % (must_flip 5.5, exact + 5.0, filtered 2.7). The legalise_around loop is 6.3 % and flip writes + 2.5 %. Insertion (`split_*`) is 2.2 %. `put`/`repoint` (2.6 %) serves both. +- **Exact predicates on the lattice.** Instrumented counts + (`data/instr_t1_rounds.txt`, the `S` records) for the split phase: 1,615,895 + incircle tests, of which **146,962 (9.1 %) took the exact path, and all + 146,962 returned Cocircular**. orient2d: 3,232,783 tests, 527 exact. So 9 % + of the incircle tests cost 38 % of flip-test time (653 of 1,720 samples), + and every one of them was an exact tie. That fits cocircular DEM nodes (a + grid rectangle's four corners), but the quads themselves were not + classified, so that remains an inference. +- **Allocation**: 1.5 % in total. Charged to its owner, 0.7 % is + under legalise_around, whose only allocation is its per-call `std::vector` stack, and 0.4 % sits under + must_flip; the remainder is under 0.2 %. +- **Locking**: no sample in any mutex, lock or `psynch` frame. The serial + phase takes no lock, and at one thread `for_each_chunk` runs inline with no + thread. +- **Rescans**: the rescan is the next round's scan of every touched slot, so + it is inside the scan share. Over the run, the scan visits 39,502,901 DEM + nodes. Round 1 visits 7,078,976, about the whole domain. So each domain node + is scanned **5.6 times** on average (`data/chunks_t8.md`, nodes column). + +## 2. The parallel phase on its own + +Scan only, from the instrumented build's per-chunk records +(`data/chunks_sweep.tsv`). Medians of 3 runs, battery. Each figure is summed +over the 41 rounds. + +| threads | scan ms | scan speed-up | ideal ms (1-thread / N) | busy thread-ms | sum of mean chunk ms | sum of max chunk ms | imbalance ms (max - mean) | last chunk start ms | join tail ms | +|---|---|---|---|---|---|---|---|---|---| +| 1 | 306.0 | 1.00x | 306.0 | 306 | 306.0 | 306.0 | 0.0 | 0.0 | 0.04 | +| 2 | 177.1 | 1.73x | 153.0 | 315 | 157.3 | 174.7 | 17.4 | 1.6 | 0.82 | +| 4 | 101.2 | 3.02x | 76.5 | 327 | 81.7 | 98.4 | 16.7 | 2.3 | 0.84 | +| 6 | 72.7 | 4.21x | 51.0 | 334 | 55.7 | 69.4 | 13.7 | 3.1 | 0.99 | +| 8 | 61.8 | 4.95x | 38.2 | 334 | 41.8 | 58.3 | 16.5 | 3.8 | 1.05 | +| 10 | 64.2 | 4.77x | 30.6 | 387 | 38.7 | 58.8 | 20.1 | 5.0 | 1.32 | +| 12 | 62.2 | 4.92x | 25.5 | 377 | 31.4 | 53.3 | 21.9 | 29.9 | 1.48 | +| 16 | 54.8 | 5.58x | 19.1 | 372 | 23.2 | 43.7 | 20.5 | 28.8 | 1.69 | +| 20 | 57.8 | 5.29x | 15.3 | 382 | 19.1 | 44.6 | 25.5 | 36.9 | 2.01 | + +At 8 threads, the 61.8 ms breaks down into the ideal 38.2 ms plus four +measured losses: + +- **Per-thread slowdown: +3.6 ms.** Busy thread-time is 334 ms against + 306 ms alone, so each worker runs 9 % slower. The cause is not measured. It + is thought to be P-cluster clock or shared-L2 effects. +- **Load imbalance: +16.5 ms, the largest loss.** `for_each_chunk` splits the + sorted `active` list into equal counts, not equal work. In the single run of `data/chunks_t8.md`, round 1 alone + accounts for 6.1 ms of it: its slowest chunk took 9.7 ms against a mean of + 3.6 ms (`data/chunks_t8.md`). The imbalance is already 17 ms at 2 threads. +- **Thread start: about 1.8 ms** until the first chunk runs, and 3.8 ms until + the last one starts (41 spawns of 8 `jthread`s; about 90 µs per round). +- **Join: 1.0 ms.** + +Rounds 30-41 each scan fewer than 1,200 triangles, in 0.07-0.17 ms, most of +which is spawn cost. + +**Is the scan flat after about 7 threads?** Nearly: 4.95x at 8, 4.8-4.9x at +10-12, 5.3-5.6x at 16-20. From 10 threads on, the busy time rises to +372-387 ms. The two E cores are thought to account for this, but no core +affinity was recorded. From 12 threads on (more threads than cores), the last +chunk starts about 30 ms late. Refine as a whole is flat from about 7 because +the serial part is 70-76 % of the multi-thread time. + +**Memory bandwidth**: the scan reads 39.5 M float32 nodes, 158 MB, in +61.8 ms at 8 threads. That is 2.6 GB/s, far below this machine's memory +bandwidth. There is no sign of a bandwidth limit. This is an inference from +byte counts; no hardware counters were read. + +## 3. Data bearing on multicolouring or domain decomposition + +This section designs neither. The data comes from the local patch +(`scripts/instrument.patch`) at 1 thread. `data/rounds_t1.md` holds all 41 +rounds. Selected rounds are shown here, all battery. + +Definitions, from the code as instrumented: + +- **Write set**: the slots an insertion writes. That is the split triangle + `t`, the appended slots, the edge neighbour `u` if any, and every slot + legalise_around's `on_write` reports. +- **Footprint**: the write set plus every slot legalise_around reads, meaning + each popped triangle and its neighbour across the tested edge. The slots + `repoint` rewrites are all among these. +- **Conflict**: two insertions of the same round share a slot. The + footprints are measured in the serial order, so a later insertion's + footprint is taken on the mesh as earlier ones left it. +- **Nearest-neighbour distance**: between the insertion points of one round, + in DEM nodes (1 node = 10 m). +- **Blocks**: a 64×64-node partition used only to describe spread. The + domain's insertions touch 382 of these blocks over the whole run. + +| round | active | marked | inserted | deferred (slot touched) | deferred (edge) | flips/ins | footprint mean (p99, max) | write set mean | ins. in a footprint conflict | ins. in a write-write conflict | mean/max conflict degree | median NN dist (nodes) | blocks hit | max ins/block | +|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---| +| 1 | 1,822 | 480 | 231 | 244 | 5 | 2.18 | 9.9 (15, 16) | 5.2 | 100 % | 96 % | 6.5/15 | 26.9 | 116 | 5 | +| 5 | 5,437 | 4,997 | 2,063 | 2,717 | 217 | 2.42 | 11.0 (18, 24) | 5.5 | 100 % | 89 % | 7.7/21 | 7.8 | 264 | 50 | +| 10 | 44,913 | 29,273 | 11,769 | 15,412 | 2,092 | 2.23 | 11.1 (18, 28) | 5.5 | 99 % | 76 % | 6.1/22 | 3.6 | 344 | 169 | +| 14 | 89,510 | 45,306 | 18,714 | 23,137 | 3,455 | 2.08 | 11.0 (18, 36) | 5.5 | 97 % | 66 % | 4.7/23 | 3.0 | 354 | 237 | +| 20 | 56,930 | 19,662 | 8,675 | 9,570 | 1,417 | 1.89 | 10.8 (18, 26) | 5.4 | 89 % | 50 % | 3.0/17 | 3.0 | 303 | 189 | +| 25 | 11,418 | 3,036 | 1,430 | 1,437 | 169 | 1.85 | 10.7 (18, 28) | 5.4 | 78 % | 38 % | 2.0/13 | 3.2 | 173 | 51 | +| 30 | 1,103 | 217 | 108 | 93 | 16 | 1.95 | 10.8 (22, 22) | 5.4 | 62 % | 27 % | 1.3/7 | 4.1 | 31 | 21 | +| 35 | 59 | 15 | 9 | 5 | 1 | 2.33 | 10.9 (14, 14) | 5.4 | 56 % | 44 % | 1.1/3 | 8.6 | 3 | 7 | + +Conflict degree is per footprint conflict: the number of other insertions of +the round an insertion shares a footprint slot with. + +Over all rounds: + +- **Insertions per round**: 231 in round 1, peaking at 18,714 in round 14, + then one each in rounds 39-40. Rounds 9-19 hold 164,608 of the 213,464 + insertions (77 %). +- **Spread**: in rounds 5-25 each round touches 173-355 of the 382 blocks + (45-93 %; 69-93 % in rounds 5-21). In the big rounds a block receives at + most 154-248 insertions. From round 11 on, the median nearest-neighbour + distance is about 3 nodes (30 m); in round 1 it is 27 nodes. Insertions are + spread over the whole domain at once, and they are close together. +- **Footprint size**: write set mean 5.49 slots (p50 5, p90 7, p99 9, + max 18). Footprint mean 10.96 (p50 10, p90 14, p99 18, max 36). Flips per + insertion 2.09 (445,657 / 213,464). +- **Overlap within a round**: 202,927 insertions (95 %) share a footprint + slot with at least one other insertion of the round, in 495,188 pairs. + 138,637 (65 %) share a written slot (111,952 pairs). 76 % overlap an + insertion earlier in the serial order. +- **The loop's own deferral**: of 509,029 marked (non-converged) triangle + occurrences, **259,051 (51 %)** were skipped because an earlier insertion + of the same round had already rewritten their slot. 36,514 (7 %) were + edge-split deferrals (the neighbour was touched). 213,464 (42 %) were + inserted. Every deferred triangle is rescanned the next round, which adds + to the 5.6× scan amplification in section 1. + +Not measured here: the geometric extent of a footprint (vertex positions) and +how many footprints would cross a partition boundary of a given size. The +patch records slots, not coordinates. + +## What is measured and what is inferred + +Measured: every timing and count in the tables; the profile attribution +(which rests on sample's 1 ms sampling and on `atos` line tables, where 1.6 % +had no line); the predicate counts; the chunk timings; the footprint and +conflict counts; and that the split phase takes no lock. + +Inferred, and worded that way above: + +- that the exact-path incircle ties are cocircular lattice quads; +- the cause of the split phase's slowdown after a parallel scan; +- the cause of the 9 % per-worker slowdown; +- that E cores cause the busy-time rise from 10 threads; +- that there is no bandwidth limit (from byte counts, not counters); +- the cause of sweep 1's 14-15 % slower single-thread figures. + +## Regenerating + +The scripts are dated one-off evidence, kept verbatim, like `2026-09-26/`. +They hard-code this session's scratchpad path (`S=` / `R=` at the top of +`sweep.sh`; the driver takes absolute `--pkg` and DEM paths). Fix those +paths before rerunning. + +1. Phase sweep: configure `build-prof` as above, then assemble + `build-prof/pkg/tin_engine/` the way bench.py's `build()` does (symlinks + to `src_python/tin_engine/*`, plus a copy of the `.so`). Then run + `scripts/sweep.sh --domain ` and + `scripts/summ.py `. +2. Profile: configure `build-prof-lto` as above, run `dsymutil` and assemble + the pkg. Start `prof_driver.py --threads 1 --repeat 45 --pause 3 -- mesh …`, + attach `sample 18 1 -mayDie -file s.txt` once it prints `PID`, then + run `scripts/attribute.py s.txt `. +3. Instrumented: `git worktree add --detach d6d6beb`, then + `python scripts/instrument.py ` (or `git apply + scripts/instrument.patch`). Build Release in `/build-instr`, run the + driver with `RASPUTIN_PROF_OUT=`, then `scripts/analyse.py ` + (rounds) or `--chunks` (per-chunk scan). `scripts/chunksum.py` sums the + per-chunk records. + +Not in the repository: + +- the raw instrumented logs with per-insertion `I` records (about 32 MB per + run); +- the meshes; +- the builds and dSYMs. + +All of these were in the session scratchpad +(`/private/tmp/claude-501/…/scratchpad`), which does not survive the session. +Steps 1-3 regenerate them. The `R`, `C` and `S` records of the 1- and 8-thread +instrumented runs are kept in `data/instr_t*_rounds.txt`. diff --git a/docs/benchmarks/2026-09-27/serial-profile/data/attribution_t1.txt b/docs/benchmarks/2026-09-27/serial-profile/data/attribution_t1.txt new file mode 100644 index 00000000..cc5ea048 --- /dev/null +++ b/docs/benchmarks/2026-09-27/serial-profile/data/attribution_t1.txt @@ -0,0 +1,73 @@ +self samples under refine: 13079 (1 sample = 1 ms) + 8634 66.0 % scan (parallel phase) + 825 6.3 % legalise_around loop (stack, touched marks) + 718 5.5 % must_flip (edge lookup, frame points) + 653 5.0 % exact incircle (adaptive fallback) + 466 3.6 % rebuild active: collect+sort+unique + 349 2.7 % filtered predicates (incircle/orient2d) + 339 2.6 % topology writes: put/repoint (callers above) + 330 2.5 % topology writes: flip + 284 2.2 % topology writes: split + 208 1.6 % refine body, no line info (refine.hpp:0) + 198 1.5 % allocation (malloc/free/memmove) + 39 0.3 % output: vertices, z, triangles, constraint_edges + 18 0.1 % pybind: outcome conversion + 10 0.1 % split loop bookkeeping (results read, touched, skipped) + 6 0.0 % start quality (improve) + 2 0.0 % setup: to_lattice, LatticeMesh::build + +allocation charged to its owner: + 86 0.7 % legalise_around loop (stack, touched marks) + 55 0.4 % must_flip (edge lookup, frame points) + 14 0.1 % results.resize / round setup + 11 0.1 % output: vertices, z, triangles, constraint_edges + 10 0.1 % topology writes: put/repoint (callers above) + 7 0.1 % split loop bookkeeping (results read, touched, skipped) + 4 0.0 % topology writes: split + 4 0.0 % pybind: outcome conversion + 2 0.0 % start quality (improve) + 2 0.0 % setup: to_lattice, LatticeMesh::build + 2 0.0 % refine body, no line info (refine.hpp:0) + 1 0.0 % rebuild active: collect+sort+unique + +top innermost frames: + 8329 63.7 % terrain::refinement::scan>(terrain::raster::RasterView const&, terrain::mesh::LatticeMesh const&, unsigned int) + 1076 8.2 % decltype(auto) std::__variant_detail::__visitation::__base::__dispatcher<0ul>::__dispatch[abi:nqe210106]>(terrain::mesh::LatticeMesh const&, unsigned int, unsigned int, terra + 331 2.5 % std::__bitset_partition[abi:nqe220106](unsigned int*, unsigned int*, std::ranges::less) + 305 2.3 % terrain::mesh::LatticeMesh::flip(unsigned int, unsigned int) + 296 2.3 % std::__1::vector>::data[abi:nqe210106]() const (in _core.cpython-314-darwin.so) (vecto + 291 2.2 % terrain::pred::FilteredKernel::incircle_ccw(terrain::Point2 const&, terrain::Point2 const&, terrain::Point2 const&, terrain::Point2 + 246 1.9 % terrain::mesh::LatticeMesh::put(unsigned int, std::array, std::array) + 226 1.7 % detria::predicates::incircleadapt(double*, double*, double*, double*, double) + 178 1.4 % detria::predicates::fast_expansion_sum_zeroelim(int, double const*, int, double const*, double*) + 146 1.1 % terrain::refinement::ScanResult terrain::refinement::scan>(terrain::raster::RasterView const&, terrain::mesh::LatticeM + 128 1.0 % terrain::mesh::LatticeMesh::split_edge(unsigned int, unsigned int, terrain::mesh::MeshVertex) + 106 0.8 % std::__introsort(unsigned int*, unsigned int*, std::ranges::less, std::iterator_traits, std::__1::array) (in _core.cpython-314- + 55 0.4 % _xzm_free_tc + 48 0.4 % std::__1::optional terrain::refinement::vertex_z>(terrain::raster::RasterView const&, terrain::mesh::MeshVerte + 41 0.3 % terrain::pred::incircle_of_sign(double) (in _core.cpython-314-darwin.so) (orientation.hpp:57) + 38 0.3 % int detria::predicates::scale_expansion_zeroelim(int, double const*, double, double*) (in _core.cpython-314-darwin.so) (detria.hpp:488) + 37 0.3 % _xzm_malloc_tc + 32 0.2 % terrain::raster::RasterView::value_at(terrain::raster::CellIndex const&) const (in _core.cpython-314-darwin.so) (view.hpp:27) + 31 0.2 % terrain::mesh::MeshVertex::is_node() const (in _core.cpython-314-darwin.so) (lattice_mesh.hpp:71) + 27 0.2 % terrain::pred::DetriaExact::incircle_ccw(terrain::Point2 const&, terrain::Point2 const&, terrain::Point2 const&, terrain::Point2 const&) + 26 0.2 % terrain::refinement::RefineOutcome terrain::refinement::refine>(terrain::raster::RasterView const&, terrain::IndexedMe + 26 0.2 % double detria::predicates::incircleadapt(double*, double*, double*, double*, double) (in _core.cpython-314-darwin.so) (detria.hpp:0) + 21 0.2 % std::__1::array& std::__1::vector, std::__1::allocator>>::emplace_back< + 20 0.2 % detria::predicates::scale_expansion_zeroelim(int, double const*, double, double*) + 15 0.1 % std::__1::__optional_storage_base::has_value[abi:nqe210106]() const (in _core.cpython-314-darwin.so) (optional:361) + 15 0.1 % terrain::pred::FilteredKernel::incircle(terrain::Point2 const&, terrain::Point2 const&, terrain::Point2 const&, terrain::Point2 cons + 15 0.1 % malloc_type_malloc + 14 0.1 % bool terrain::mesh::detail::must_flip>(terrain::mesh::LatticeMesh const&, unsigned int, unsigned int, + 13 0.1 % std::__partial_sort_impl[abi:nqe220106](unsigned int*, unsigned int*, unsigned int*, s + 12 0.1 % terrain::mesh::LatticeMesh::flip(unsigned int, unsigned int) (in _core.cpython-314-darwin.so) (lattice_mesh.hpp:232) + 12 0.1 % _free + 9 0.1 % int detria::predicates::fast_expansion_sum_zeroelim(int, double const*, int, double const*, double*) (in _core.cpython-314-darwin.so) (detria.hpp:353) + 9 0.1 % std::__1::vector, std::__1::allocator>>::operator[][abi:nqe210106](unsigned long) (in _cor + 8 0.1 % int detria::predicates::fast_expansion_sum_zeroelim(int, double const*, int, double const*, double*) (in _core.cpython-314-darwin.so) (detria.hpp:385) + 8 0.1 % int detria::predicates::scale_expansion_zeroelim(int, double const*, double, double*) (in _core.cpython-314-darwin.so) (detria.hpp:512) + 8 0.1 % double detria::predicates::incircleadapt(double*, double*, double*, double*, double) (in _core.cpython-314-darwin.so) (detria.hpp:600) diff --git a/docs/benchmarks/2026-09-27/serial-profile/data/chunks_sweep.pmset b/docs/benchmarks/2026-09-27/serial-profile/data/chunks_sweep.pmset new file mode 100644 index 00000000..ec96bcd4 --- /dev/null +++ b/docs/benchmarks/2026-09-27/serial-profile/data/chunks_sweep.pmset @@ -0,0 +1,4 @@ +Now drawing from 'Battery Power' + -InternalBattery-0 (id=7929955) 84%; discharging; 6:05 remaining present: true +Now drawing from 'Battery Power' + -InternalBattery-0 (id=7929955) 84%; discharging; 6:05 remaining present: true diff --git a/docs/benchmarks/2026-09-27/serial-profile/data/chunks_sweep.tsv b/docs/benchmarks/2026-09-27/serial-profile/data/chunks_sweep.tsv new file mode 100644 index 00000000..7fb4f7a3 --- /dev/null +++ b/docs/benchmarks/2026-09-27/serial-profile/data/chunks_sweep.tsv @@ -0,0 +1,27 @@ +cs_t1_r1.rc scan_ms=305.5 sum_max_chunk_ms=305.4 sum_mean_chunk_ms=305.4 thread_busy_ms=305.4 first_start_ms=0.00 last_start_ms=0.00 join_tail_ms=0.04 +cs_t1_r2.rc scan_ms=306.0 sum_max_chunk_ms=306.0 sum_mean_chunk_ms=306.0 thread_busy_ms=306.0 first_start_ms=0.00 last_start_ms=0.00 join_tail_ms=0.03 +cs_t1_r3.rc scan_ms=306.0 sum_max_chunk_ms=306.0 sum_mean_chunk_ms=306.0 thread_busy_ms=306.0 first_start_ms=0.00 last_start_ms=0.00 join_tail_ms=0.05 +cs_t10_r1.rc scan_ms=63.8 sum_max_chunk_ms=58.4 sum_mean_chunk_ms=38.7 thread_busy_ms=387.0 first_start_ms=1.66 last_start_ms=6.54 join_tail_ms=1.21 +cs_t10_r2.rc scan_ms=66.4 sum_max_chunk_ms=59.2 sum_mean_chunk_ms=38.4 thread_busy_ms=384.3 first_start_ms=1.90 last_start_ms=4.95 join_tail_ms=3.11 +cs_t10_r3.rc scan_ms=64.2 sum_max_chunk_ms=58.8 sum_mean_chunk_ms=38.8 thread_busy_ms=388.0 first_start_ms=1.76 last_start_ms=4.99 join_tail_ms=1.32 +cs_t12_r1.rc scan_ms=62.2 sum_max_chunk_ms=54.3 sum_mean_chunk_ms=31.6 thread_busy_ms=379.0 first_start_ms=1.69 last_start_ms=29.93 join_tail_ms=1.46 +cs_t12_r2.rc scan_ms=63.0 sum_max_chunk_ms=53.2 sum_mean_chunk_ms=31.4 thread_busy_ms=377.2 first_start_ms=1.90 last_start_ms=29.98 join_tail_ms=1.55 +cs_t12_r3.rc scan_ms=61.5 sum_max_chunk_ms=53.3 sum_mean_chunk_ms=30.7 thread_busy_ms=368.7 first_start_ms=1.87 last_start_ms=28.77 join_tail_ms=1.48 +cs_t16_r1.rc scan_ms=54.5 sum_max_chunk_ms=44.3 sum_mean_chunk_ms=23.2 thread_busy_ms=372.0 first_start_ms=1.74 last_start_ms=28.77 join_tail_ms=1.69 +cs_t16_r2.rc scan_ms=54.8 sum_max_chunk_ms=43.5 sum_mean_chunk_ms=23.4 thread_busy_ms=373.7 first_start_ms=1.89 last_start_ms=28.91 join_tail_ms=1.81 +cs_t16_r3.rc scan_ms=54.9 sum_max_chunk_ms=43.7 sum_mean_chunk_ms=23.1 thread_busy_ms=370.3 first_start_ms=1.76 last_start_ms=28.73 join_tail_ms=1.69 +cs_t2_r1.rc scan_ms=177.8 sum_max_chunk_ms=175.5 sum_mean_chunk_ms=158.3 thread_busy_ms=316.6 first_start_ms=1.14 last_start_ms=1.45 join_tail_ms=0.82 +cs_t2_r2.rc scan_ms=175.9 sum_max_chunk_ms=173.4 sum_mean_chunk_ms=156.5 thread_busy_ms=313.0 first_start_ms=1.33 last_start_ms=1.65 join_tail_ms=0.84 +cs_t2_r3.rc scan_ms=177.1 sum_max_chunk_ms=174.7 sum_mean_chunk_ms=157.3 thread_busy_ms=314.6 first_start_ms=1.31 last_start_ms=1.63 join_tail_ms=0.77 +cs_t20_r1.rc scan_ms=57.2 sum_max_chunk_ms=42.2 sum_mean_chunk_ms=18.8 thread_busy_ms=375.3 first_start_ms=1.86 last_start_ms=36.44 join_tail_ms=1.94 +cs_t20_r2.rc scan_ms=57.8 sum_max_chunk_ms=44.7 sum_mean_chunk_ms=19.1 thread_busy_ms=381.6 first_start_ms=1.85 last_start_ms=36.91 join_tail_ms=2.52 +cs_t20_r3.rc scan_ms=58.1 sum_max_chunk_ms=44.6 sum_mean_chunk_ms=19.3 thread_busy_ms=386.7 first_start_ms=1.74 last_start_ms=37.01 join_tail_ms=2.01 +cs_t4_r1.rc scan_ms=101.1 sum_max_chunk_ms=98.3 sum_mean_chunk_ms=81.7 thread_busy_ms=326.8 first_start_ms=1.66 last_start_ms=2.15 join_tail_ms=0.82 +cs_t4_r2.rc scan_ms=101.2 sum_max_chunk_ms=98.4 sum_mean_chunk_ms=81.4 thread_busy_ms=325.6 first_start_ms=1.74 last_start_ms=2.43 join_tail_ms=0.84 +cs_t4_r3.rc scan_ms=101.7 sum_max_chunk_ms=98.8 sum_mean_chunk_ms=82.0 thread_busy_ms=327.8 first_start_ms=1.73 last_start_ms=2.32 join_tail_ms=0.86 +cs_t6_r1.rc scan_ms=73.9 sum_max_chunk_ms=70.6 sum_mean_chunk_ms=56.0 thread_busy_ms=335.8 first_start_ms=1.83 last_start_ms=3.11 join_tail_ms=0.99 +cs_t6_r2.rc scan_ms=71.9 sum_max_chunk_ms=68.6 sum_mean_chunk_ms=55.2 thread_busy_ms=331.3 first_start_ms=1.82 last_start_ms=3.26 join_tail_ms=1.00 +cs_t6_r3.rc scan_ms=72.7 sum_max_chunk_ms=69.4 sum_mean_chunk_ms=55.7 thread_busy_ms=334.5 first_start_ms=1.78 last_start_ms=2.94 join_tail_ms=0.96 +cs_t8_r1.rc scan_ms=62.3 sum_max_chunk_ms=59.1 sum_mean_chunk_ms=42.6 thread_busy_ms=340.9 first_start_ms=1.70 last_start_ms=3.60 join_tail_ms=0.93 +cs_t8_r2.rc scan_ms=61.8 sum_max_chunk_ms=58.3 sum_mean_chunk_ms=41.8 thread_busy_ms=334.4 first_start_ms=1.81 last_start_ms=3.92 join_tail_ms=1.05 +cs_t8_r3.rc scan_ms=60.7 sum_max_chunk_ms=57.2 sum_mean_chunk_ms=41.5 thread_busy_ms=332.4 first_start_ms=1.79 last_start_ms=3.83 join_tail_ms=1.06 diff --git a/docs/benchmarks/2026-09-27/serial-profile/data/chunks_t8.md b/docs/benchmarks/2026-09-27/serial-profile/data/chunks_t8.md new file mode 100644 index 00000000..ba003f73 --- /dev/null +++ b/docs/benchmarks/2026-09-27/serial-profile/data/chunks_t8.md @@ -0,0 +1,44 @@ +| round | active | nodes scanned | scan ms | chunks | max chunk ms | mean chunk ms | imbalance max/mean | last start ms | join tail ms | +|---|---|---|---|---|---|---|---|---|---| +| 1 | 1822 | 7078976 | 9.85 | 8 | 9.74 | 3.60 | 2.70 | 0.152 | 0.042 | +| 2 | 955 | 2472987 | 2.33 | 8 | 2.22 | 0.91 | 2.44 | 0.105 | 0.046 | +| 3 | 1711 | 2420366 | 1.54 | 8 | 1.47 | 0.94 | 1.58 | 0.100 | 0.022 | +| 4 | 3114 | 2493343 | 1.71 | 8 | 1.64 | 1.08 | 1.52 | 0.112 | 0.018 | +| 5 | 5437 | 2308017 | 1.64 | 8 | 1.56 | 1.17 | 1.33 | 0.101 | 0.026 | +| 6 | 9262 | 2289511 | 1.83 | 8 | 1.76 | 1.36 | 1.30 | 0.103 | 0.019 | +| 7 | 14987 | 2166841 | 2.28 | 8 | 2.22 | 1.55 | 1.43 | 0.101 | 0.014 | +| 8 | 22884 | 2073544 | 2.01 | 8 | 1.95 | 1.68 | 1.16 | 0.100 | 0.015 | +| 9 | 33030 | 1942812 | 2.44 | 8 | 2.38 | 1.96 | 1.22 | 0.099 | 0.020 | +| 10 | 44913 | 1985318 | 2.55 | 8 | 2.49 | 2.14 | 1.17 | 0.086 | 0.014 | +| 11 | 57303 | 1836822 | 2.68 | 8 | 2.60 | 2.28 | 1.14 | 0.107 | 0.019 | +| 12 | 69879 | 1642042 | 3.03 | 8 | 2.94 | 2.49 | 1.18 | 0.137 | 0.022 | +| 13 | 81365 | 1381540 | 3.08 | 8 | 3.02 | 2.63 | 1.15 | 0.092 | 0.019 | +| 14 | 89510 | 1346846 | 3.32 | 8 | 3.23 | 2.82 | 1.15 | 0.096 | 0.022 | +| 15 | 93887 | 1173339 | 3.22 | 8 | 3.13 | 2.65 | 1.18 | 0.159 | 0.023 | +| 16 | 93260 | 1006953 | 3.14 | 8 | 3.07 | 2.54 | 1.21 | 0.109 | 0.022 | +| 17 | 88732 | 840586 | 2.66 | 8 | 2.59 | 2.31 | 1.12 | 0.097 | 0.018 | +| 18 | 79861 | 664784 | 2.50 | 8 | 2.39 | 2.15 | 1.11 | 0.097 | 0.028 | +| 19 | 68793 | 560922 | 1.91 | 8 | 1.83 | 1.66 | 1.10 | 0.100 | 0.019 | +| 20 | 56930 | 403078 | 1.53 | 8 | 1.45 | 1.29 | 1.12 | 0.101 | 0.021 | +| 21 | 44385 | 337765 | 1.40 | 8 | 1.32 | 0.98 | 1.35 | 0.102 | 0.017 | +| 22 | 33292 | 274115 | 0.91 | 8 | 0.85 | 0.72 | 1.19 | 0.100 | 0.007 | +| 23 | 24437 | 214174 | 0.91 | 8 | 0.83 | 0.57 | 1.46 | 0.111 | 0.020 | +| 24 | 17063 | 154655 | 0.70 | 8 | 0.64 | 0.39 | 1.63 | 0.102 | 0.016 | +| 25 | 11418 | 111525 | 0.42 | 8 | 0.32 | 0.27 | 1.20 | 0.098 | 0.028 | +| 26 | 7397 | 70875 | 0.31 | 8 | 0.20 | 0.17 | 1.16 | 0.105 | 0.025 | +| 27 | 4656 | 82547 | 0.25 | 8 | 0.17 | 0.12 | 1.49 | 0.089 | 0.029 | +| 28 | 2960 | 27162 | 0.18 | 8 | 0.09 | 0.07 | 1.32 | 0.079 | 0.026 | +| 29 | 1926 | 17336 | 0.16 | 8 | 0.11 | 0.05 | 2.04 | 0.084 | 0.034 | +| 30 | 1103 | 46378 | 0.14 | 8 | 0.10 | 0.04 | 2.49 | 0.085 | 0.018 | +| 31 | 570 | 9581 | 0.17 | 8 | 0.03 | 0.02 | 1.77 | 0.122 | 0.033 | +| 32 | 317 | 22140 | 0.12 | 8 | 0.04 | 0.02 | 2.56 | 0.080 | 0.032 | +| 33 | 188 | 43044 | 0.15 | 8 | 0.05 | 0.02 | 2.06 | 0.089 | 0.026 | +| 34 | 119 | 2317 | 0.12 | 8 | 0.01 | 0.00 | 2.19 | 0.094 | 0.027 | +| 35 | 59 | 173 | 0.12 | 8 | 0.00 | 0.00 | 1.78 | 0.090 | 0.024 | +| 36 | 47 | 178 | 0.12 | 8 | 0.00 | 0.00 | 1.74 | 0.094 | 0.028 | +| 37 | 38 | 183 | 0.13 | 8 | 0.00 | 0.00 | 1.90 | 0.104 | 0.023 | +| 38 | 32 | 95 | 0.10 | 8 | 0.00 | 0.00 | 1.40 | 0.079 | 0.024 | +| 39 | 9 | 7 | 0.11 | 8 | 0.00 | 0.00 | 1.65 | 0.080 | 0.031 | +| 40 | 5 | 11 | 0.07 | 5 | 0.00 | 0.00 | 1.54 | 0.050 | 0.015 | +| 41 | 6 | 13 | 0.10 | 6 | 0.00 | 0.00 | 1.66 | 0.069 | 0.032 | +| sum | | 39502901 | 62.0 | | 58.5 | 42.7 | 1.37 | 4.06 | 0.96 | diff --git a/docs/benchmarks/2026-09-27/serial-profile/data/instr_t1_rounds.txt b/docs/benchmarks/2026-09-27/serial-profile/data/instr_t1_rounds.txt new file mode 100644 index 00000000..4a190939 --- /dev/null +++ b/docs/benchmarks/2026-09-27/serial-profile/data/instr_t1_rounds.txt @@ -0,0 +1,123 @@ +R 1 1822 0.021533708 1 +C 0 1822 0.000000041 0.021532750 7078976 +S 480 244 5 2279 0.000575666 1581 1 1 3219 5 +R 2 955 0.006429084 1 +C 0 955 0.000000042 0.006428625 2472987 +S 915 499 18 3054 0.000914667 2975 2 2 6026 21 +R 3 1711 0.006707333 1 +C 0 1711 0.000000083 0.006707291 2420366 +S 1648 887 37 4467 0.001600583 5614 6 6 11316 35 +R 4 3114 0.007820459 1 +C 0 3114 0.000000000 0.007820000 2493343 +S 2940 1615 94 6892 0.002704084 9655 38 38 19394 37 +R 5 5437 0.008338833 1 +C 0 5437 0.000002791 0.008338416 2308017 +S 4997 2717 217 10963 0.004641833 16286 133 133 32669 54 +R 6 9262 0.009541459 1 +C 0 9262 0.000000042 0.009540875 2289511 +S 8056 4393 386 17452 0.007533250 26184 384 384 52476 63 +R 7 14987 0.010777292 1 +C 0 14987 0.000000042 0.010777000 2166841 +S 12089 6503 681 27192 0.011260041 38754 1006 1006 77627 69 +R 8 22884 0.012428500 1 +C 0 22884 0.000000042 0.012428042 2073544 +S 17301 9262 1113 40984 0.015795417 54884 1908 1908 109873 59 +R 9 33030 0.013978584 1 +C 0 33030 0.000000042 0.013977709 1942812 +S 23224 12384 1546 59507 0.021025500 73150 3410 3410 146395 64 +R 10 44913 0.016065000 1 +C 0 44913 0.000000042 0.016064334 1985318 +S 29273 15412 2092 83005 0.027486625 91460 5134 5134 182981 40 +R 11 57303 0.018381500 1 +C 0 57303 0.000000125 0.018380291 1836822 +S 35323 18466 2633 111418 0.034630292 110234 7306 7306 220514 35 +R 12 69879 0.019041833 1 +C 0 69879 0.000000083 0.019041041 1642042 +S 40312 20889 3049 144145 0.040227375 126549 9563 9563 253124 21 +R 13 81365 0.019737000 1 +C 0 81365 0.000000041 0.019735541 1381540 +S 43799 22560 3321 179971 0.044343667 137068 11666 11666 274151 10 +R 14 89510 0.020168708 1 +C 0 89510 0.000000166 0.020167791 1346846 +S 45306 23137 3455 217394 0.047998709 141748 13363 13363 283501 5 +R 15 93887 0.019721750 1 +C 0 93887 0.000000292 0.019720708 1173339 +S 44302 22420 3394 254367 0.046133375 139340 14165 14165 278684 3 +R 16 93260 0.019054209 1 +C 0 93260 0.000000000 0.019052750 1006953 +S 41514 20810 3168 289434 0.047140375 131303 14424 14424 262611 5 +R 17 88732 0.017500292 1 +C 0 88732 0.000000000 0.017498750 840586 +S 36897 18403 2819 320783 0.039067625 116258 13562 13562 232518 1 +R 18 79861 0.016075708 1 +C 0 79861 0.000000083 0.016074250 664784 +S 31082 15279 2323 347743 0.037353250 99255 12076 12076 198510 0 +R 19 68793 0.012689750 1 +C 0 68793 0.000000125 0.012688542 560922 +S 25393 12409 1848 370015 0.027959583 81694 10416 10416 163388 0 +R 20 56930 0.009510875 1 +C 0 56930 0.000000000 0.009509792 403078 +S 19662 9570 1417 387365 0.023392542 63157 8394 8394 126314 0 +R 21 44385 0.007493208 1 +C 0 44385 0.000000125 0.007489875 337765 +S 14497 7002 1033 400289 0.016131000 47021 6368 6368 94042 0 +R 22 33292 0.005415125 1 +C 0 33292 0.000000125 0.005415000 274115 +S 10461 5035 686 409769 0.011748792 34540 4816 4816 69080 0 +R 23 24437 0.003930792 1 +C 0 24437 0.000000042 0.003930292 214174 +S 7146 3396 472 416325 0.008108750 23876 3263 3263 47752 0 +R 24 17063 0.002708250 1 +C 0 17063 0.000000042 0.002707709 154655 +S 4712 2216 289 420739 0.005369208 16033 2144 2144 32066 0 +R 25 11418 0.001879667 1 +C 0 11418 0.000000125 0.001876833 111525 +S 3036 1437 169 423599 0.003405458 10322 1392 1392 20644 0 +R 26 7397 0.001164459 1 +C 0 7397 0.000000000 0.001164167 70875 +S 1806 822 83 425401 0.002147625 6580 840 840 13160 0 +R 27 4656 0.000811000 1 +C 0 4656 0.000000000 0.000810958 82547 +S 1154 522 71 426523 0.001320666 4165 478 478 8330 0 +R 28 2960 0.000484709 1 +C 0 2960 0.000000042 0.000484667 27162 +S 746 332 38 427275 0.000878625 2679 338 338 5358 0 +R 29 1926 0.000297833 1 +C 0 1926 0.000000042 0.000297667 17336 +S 422 187 23 427699 0.000492584 1546 149 149 3092 0 +R 30 1103 0.000263000 1 +C 0 1103 0.000000000 0.000262959 46378 +S 217 93 16 427915 0.000264875 793 110 110 1586 0 +R 31 570 0.000113209 1 +C 0 570 0.000000000 0.000113084 9581 +S 124 58 5 428037 0.000162625 465 47 47 930 0 +R 32 317 0.000101500 1 +C 0 317 0.000000000 0.000101458 22140 +S 72 35 5 428101 0.000097459 274 20 20 548 0 +R 33 188 0.000140791 1 +C 0 188 0.000000083 0.000140750 43044 +S 44 19 3 428145 0.000068375 176 16 16 352 0 +R 34 119 0.000022333 1 +C 0 119 0.000000041 0.000022291 2317 +S 26 13 2 428167 0.000037042 79 7 7 158 0 +R 35 59 0.000006916 1 +C 0 59 0.000000041 0.000006833 173 +S 15 5 1 428185 0.000039458 70 6 6 140 0 +R 36 47 0.000006500 1 +C 0 47 0.000000041 0.000006416 178 +S 19 12 1 428197 0.000029958 57 2 2 114 0 +R 37 38 0.000006000 1 +C 0 38 0.000000042 0.000005959 183 +S 13 6 1 428209 0.000027167 44 6 6 88 0 +R 38 32 0.000003792 1 +C 0 32 0.000000000 0.000003750 95 +S 4 2 0 428213 0.000022083 10 1 1 20 0 +R 39 9 0.000000834 1 +C 0 9 0.000000042 0.000000750 7 +S 1 0 0 428215 0.000016834 7 1 1 14 0 +R 40 5 0.000000708 1 +C 0 5 0.000000000 0.000000667 11 +S 1 0 0 428217 0.000017042 9 1 1 18 0 +R 41 6 0.000000833 1 +C 0 6 0.000000000 0.000000750 13 +S 0 0 0 428217 0.000006792 0 0 0 0 0 diff --git a/docs/benchmarks/2026-09-27/serial-profile/data/instr_t8_rounds.txt b/docs/benchmarks/2026-09-27/serial-profile/data/instr_t8_rounds.txt new file mode 100644 index 00000000..ed29d794 --- /dev/null +++ b/docs/benchmarks/2026-09-27/serial-profile/data/instr_t8_rounds.txt @@ -0,0 +1,405 @@ +R 1 1822 0.009849583 8 +C 0 228 0.000054583 0.004162500 1175275 +C 228 456 0.000069958 0.004154500 1064598 +C 456 684 0.000070208 0.009807875 3496478 +C 684 912 0.000066250 0.003632167 751169 +C 912 1140 0.000090708 0.002361292 273062 +C 1140 1368 0.000107542 0.001961167 148528 +C 1368 1595 0.000109292 0.001787875 94683 +C 1595 1822 0.000152458 0.001682792 75183 +S 480 244 5 2279 0.000582458 1581 1 1 3219 5 +R 2 955 0.002331833 8 +C 0 120 0.000046375 0.001174458 397308 +C 120 240 0.000063708 0.002286292 862816 +C 240 360 0.000063750 0.000606208 116489 +C 360 479 0.000061250 0.000270167 34697 +C 479 598 0.000087833 0.000943500 272039 +C 598 717 0.000104292 0.000889000 266267 +C 717 836 0.000105250 0.001411625 489304 +C 836 955 0.000092000 0.000323167 34067 +S 915 499 18 3054 0.000996959 2975 2 2 6026 21 +R 3 1711 0.001539042 8 +C 0 214 0.000042584 0.001517542 512767 +C 214 428 0.000060417 0.000585834 112344 +C 428 642 0.000060709 0.000966084 274940 +C 642 856 0.000054625 0.000956375 288645 +C 856 1070 0.000082292 0.001245750 418734 +C 1070 1284 0.000099125 0.001494125 524197 +C 1284 1498 0.000099709 0.000445334 70057 +C 1498 1711 0.000087667 0.000864625 218682 +S 1648 887 37 4467 0.001656250 5614 6 6 11316 35 +R 4 3114 0.001714625 8 +C 0 390 0.000058041 0.001696250 501175 +C 390 780 0.000066916 0.001134500 287842 +C 780 1169 0.000067666 0.001112416 294396 +C 1169 1558 0.000071041 0.001303125 390788 +C 1558 1947 0.000095250 0.001164916 312962 +C 1947 2336 0.000111875 0.001208583 347764 +C 2336 2725 0.000112458 0.000877333 197607 +C 2725 3114 0.000096375 0.000806416 160809 +S 2940 1615 94 6892 0.002849000 9655 38 38 19394 37 +R 5 5437 0.001638750 8 +C 0 680 0.000045166 0.001450750 338751 +C 680 1360 0.000057125 0.001548541 373893 +C 1360 2040 0.000057833 0.001613125 422479 +C 2040 2720 0.000062208 0.000947000 209523 +C 2720 3400 0.000083666 0.001504958 403482 +C 3400 4079 0.000100250 0.001042333 209671 +C 4079 4758 0.000100916 0.000972750 182943 +C 4758 5437 0.000085625 0.000880166 167275 +S 4997 2717 217 10963 0.004780708 16286 133 133 32669 54 +R 6 9262 0.001830042 8 +C 0 1158 0.000049042 0.001810625 347909 +C 1158 2316 0.000058250 0.001590000 325881 +C 2316 3474 0.000058959 0.001488125 276795 +C 3474 4632 0.000065750 0.001374000 316586 +C 4632 5790 0.000088417 0.001327167 249101 +C 5790 6948 0.000102250 0.001384917 320644 +C 6948 8105 0.000103459 0.001233500 229857 +C 8105 9262 0.000094459 0.001275042 222738 +S 8056 4393 386 17452 0.007897625 26184 384 384 52476 63 +R 7 14987 0.002277667 8 +C 0 1874 0.000045167 0.002263208 359412 +C 1874 3748 0.000061917 0.001765292 258860 +C 3748 5622 0.000062167 0.001931917 420969 +C 5622 7495 0.000056042 0.001643833 279207 +C 7495 9368 0.000084125 0.001536875 262584 +C 9368 11241 0.000100708 0.001360792 224207 +C 11241 13114 0.000101333 0.001231833 168409 +C 13114 14987 0.000088500 0.001294125 193193 +S 12089 6503 681 27192 0.011986333 38754 1006 1006 77627 69 +R 8 22884 0.002006750 8 +C 0 2861 0.000046250 0.001991958 285448 +C 2861 5722 0.000063416 0.001912958 269968 +C 5722 8583 0.000063500 0.001936708 305557 +C 8583 11444 0.000056125 0.001611250 230620 +C 11444 14304 0.000082083 0.001848708 276471 +C 14304 17164 0.000098708 0.001935958 394479 +C 17164 20024 0.000099625 0.001320041 152957 +C 20024 22884 0.000085958 0.001445750 158044 +S 17301 9262 1113 40984 0.016807584 54884 1908 1908 109873 59 +R 9 33030 0.002444167 8 +C 0 4129 0.000044750 0.002424417 281127 +C 4129 8258 0.000062167 0.002079375 208984 +C 8258 12387 0.000062667 0.002257375 315136 +C 12387 16516 0.000057125 0.002012542 265360 +C 16516 20645 0.000083292 0.002002459 248053 +C 20645 24774 0.000098209 0.001877292 194443 +C 24774 28902 0.000098875 0.001850459 278482 +C 28902 33030 0.000091542 0.001753875 151227 +S 23224 12384 1546 59507 0.022583042 73150 3410 3410 146395 64 +R 10 44913 0.002550625 8 +C 0 5615 0.000043083 0.002536667 260823 +C 5615 11229 0.000060500 0.002515208 336588 +C 11229 16843 0.000060833 0.002345167 257943 +C 16843 22457 0.000048750 0.002224083 285721 +C 22457 28071 0.000069458 0.002075583 216389 +C 28071 33685 0.000085667 0.002023625 233200 +C 33685 39299 0.000086292 0.001755208 132575 +C 39299 44913 0.000069667 0.002130708 262079 +S 29273 15412 2092 83005 0.028544916 91460 5134 5134 182981 40 +R 11 57303 0.002684916 8 +C 0 7163 0.000051208 0.002608916 253365 +C 7163 14326 0.000068083 0.002665708 297716 +C 14326 21489 0.000068166 0.002578958 243035 +C 21489 28652 0.000064666 0.002318083 227758 +C 28652 35815 0.000090375 0.002287791 213275 +C 35815 42978 0.000105875 0.002023291 159616 +C 42978 50141 0.000106625 0.001954208 147559 +C 50141 57303 0.000089541 0.002453916 294498 +S 35323 18466 2633 111418 0.037159125 110234 7306 7306 220514 35 +R 12 69879 0.003029125 8 +C 0 8735 0.000063458 0.003007000 300456 +C 8735 17470 0.000063292 0.002886250 191283 +C 17470 26205 0.000070250 0.002735583 203501 +C 26205 34940 0.000101542 0.002475250 190283 +C 34940 43675 0.000119375 0.002656417 250118 +C 43675 52410 0.000136083 0.002390833 226938 +C 52410 61145 0.000136917 0.002291667 151765 +C 61145 69879 0.000122083 0.002315125 127698 +S 40312 20889 3049 144145 0.042954750 126549 9563 9563 253124 21 +R 13 81365 0.003084958 8 +C 0 10171 0.000049375 0.003065916 187242 +C 10171 20342 0.000062291 0.002932791 178691 +C 20342 30513 0.000062583 0.003010916 218731 +C 30513 40684 0.000050250 0.002678958 182297 +C 40684 50855 0.000074875 0.002651333 176413 +C 50855 61025 0.000091333 0.002440833 167458 +C 61025 71195 0.000092416 0.002226666 123600 +C 71195 81365 0.000073166 0.002573833 147108 +S 43799 22560 3321 179971 0.046376333 137068 11666 11666 274151 10 +R 14 89510 0.003320417 8 +C 0 11189 0.000061583 0.003146917 197939 +C 11189 22378 0.000061583 0.002881875 133152 +C 22378 33567 0.000067417 0.003298250 269002 +C 33567 44756 0.000088708 0.003003625 161949 +C 44756 55945 0.000088750 0.003040833 184799 +C 55945 67134 0.000091333 0.002578500 117386 +C 67134 78322 0.000094125 0.002693042 167007 +C 78322 89510 0.000096292 0.002552375 115612 +S 45306 23137 3455 217394 0.053838000 141748 13363 13363 283501 5 +R 15 93887 0.003216500 8 +C 0 11736 0.000063167 0.003193625 159844 +C 11736 23472 0.000076000 0.003133333 213200 +C 23472 35208 0.000076250 0.003041208 189771 +C 35208 46944 0.000068208 0.002710083 144694 +C 46944 58680 0.000093625 0.002777625 180534 +C 58680 70416 0.000158458 0.002449083 103383 +C 70416 82152 0.000159208 0.002238333 90988 +C 82152 93887 0.000152083 0.002523125 90925 +S 44302 22420 3394 254367 0.049198458 139340 14165 14165 278684 3 +R 16 93260 0.003138833 8 +C 0 11658 0.000051792 0.003117208 164358 +C 11658 23316 0.000062833 0.002821292 144441 +C 23316 34974 0.000063667 0.002845333 135308 +C 34974 46632 0.000066333 0.002524458 121268 +C 46632 58289 0.000093458 0.002522208 107013 +C 58289 69946 0.000108917 0.002439333 150892 +C 69946 81603 0.000109417 0.002147042 72884 +C 81603 93260 0.000097500 0.002568500 110789 +S 41514 20810 3168 289434 0.049060500 131303 14424 14424 262611 5 +R 17 88732 0.002664959 8 +C 0 11092 0.000052709 0.002647209 122918 +C 11092 22184 0.000069625 0.002621334 101367 +C 22184 33276 0.000070000 0.002556584 100933 +C 33276 44368 0.000057667 0.002458542 126844 +C 44368 55459 0.000079584 0.002424584 140627 +C 55459 66550 0.000095917 0.002149834 87452 +C 66550 77641 0.000096959 0.001959500 73017 +C 77641 88732 0.000077084 0.002263750 87428 +S 36897 18403 2819 320783 0.041955250 116258 13562 13562 232518 1 +R 18 79861 0.002500541 8 +C 0 9983 0.000052333 0.002405291 86583 +C 9983 19966 0.000069208 0.002313291 85382 +C 19966 29949 0.000070583 0.002334375 78898 +C 29949 39932 0.000086666 0.002472291 131805 +C 39932 49915 0.000086625 0.002184958 77627 +C 49915 59897 0.000088541 0.002132625 77455 +C 59897 69879 0.000096541 0.001848083 51867 +C 69879 79861 0.000085583 0.002121583 75167 +S 31082 15279 2323 347743 0.039372833 99255 12076 12076 198510 0 +R 19 68793 0.001908167 8 +C 0 8600 0.000032000 0.001850625 106692 +C 8600 17199 0.000056584 0.001889209 64105 +C 17199 25798 0.000062375 0.001757917 58456 +C 25798 34397 0.000084500 0.001813750 64831 +C 34397 42996 0.000062500 0.001804500 55832 +C 42996 51595 0.000099792 0.001692667 90949 +C 51595 60194 0.000100167 0.001436625 41549 +C 60194 68793 0.000092375 0.001660417 78508 +S 25393 12409 1848 370015 0.030270291 81694 10416 10416 163388 0 +R 20 56930 0.001533167 8 +C 0 7117 0.000051500 0.001497500 50367 +C 7117 14234 0.000070417 0.001480000 49373 +C 14234 21350 0.000070500 0.001512458 47549 +C 21350 28466 0.000060833 0.001390417 72107 +C 28466 35582 0.000083542 0.001302417 53817 +C 35582 42698 0.000099917 0.001309042 57140 +C 42698 49814 0.000100708 0.001083042 30154 +C 49814 56930 0.000085250 0.001407625 42571 +S 19662 9570 1417 387365 0.024984958 63157 8394 8394 126314 0 +R 21 44385 0.001396375 8 +C 0 5549 0.000058333 0.001379083 46043 +C 5549 11097 0.000070833 0.001115417 35810 +C 11097 16645 0.000071417 0.001083917 28853 +C 16645 22193 0.000059500 0.001011417 47786 +C 22193 27741 0.000085125 0.000975750 38894 +C 27741 33289 0.000101250 0.000939583 41197 +C 33289 38837 0.000102042 0.000831292 24633 +C 38837 44385 0.000085750 0.001119875 74549 +S 14497 7002 1033 400289 0.017773125 47021 6368 6368 94042 0 +R 22 33292 0.000912084 8 +C 0 4162 0.000052250 0.000904834 30876 +C 4162 8324 0.000067500 0.000841667 22396 +C 8324 12486 0.000067917 0.000885875 37132 +C 12486 16648 0.000057334 0.000746792 36651 +C 16648 20809 0.000082792 0.000817542 62323 +C 20809 24970 0.000099084 0.000673375 26834 +C 24970 29131 0.000099625 0.000680167 19962 +C 29131 33292 0.000093834 0.000813459 37941 +S 10461 5035 686 409769 0.013070375 34540 4816 4816 69080 0 +R 23 24437 0.000907958 8 +C 0 3055 0.000058916 0.000888041 21598 +C 3055 6110 0.000074875 0.000671375 17928 +C 6110 9165 0.000074958 0.000698208 27371 +C 9165 12220 0.000071416 0.000553125 20700 +C 12220 15275 0.000094833 0.000600041 26982 +C 15275 18329 0.000110958 0.000551208 19911 +C 18329 21383 0.000111416 0.000564125 19010 +C 21383 24437 0.000095958 0.000724666 60674 +S 7146 3396 472 416325 0.009371500 23876 3263 3263 47752 0 +R 24 17063 0.000704125 8 +C 0 2133 0.000045125 0.000687750 31528 +C 2133 4266 0.000061084 0.000457584 12456 +C 4266 6399 0.000061375 0.000475667 17392 +C 6399 8532 0.000056167 0.000400917 14340 +C 8532 10665 0.000084875 0.000447709 21869 +C 10665 12798 0.000101042 0.000403709 14997 +C 12798 14931 0.000101959 0.000380084 10714 +C 14931 17063 0.000087500 0.000500917 31359 +S 4712 2216 289 420739 0.006110250 16033 2144 2144 32066 0 +R 25 11418 0.000416791 8 +C 0 1428 0.000042791 0.000366458 15562 +C 1428 2856 0.000059125 0.000349041 9977 +C 2856 4283 0.000059416 0.000336416 10647 +C 4283 5710 0.000053041 0.000330708 23812 +C 5710 7137 0.000080583 0.000388666 24513 +C 7137 8564 0.000097375 0.000303708 5916 +C 8564 9991 0.000097958 0.000316125 11342 +C 9991 11418 0.000081750 0.000345791 9756 +S 3036 1437 169 423599 0.004259709 10322 1392 1392 20644 0 +R 26 7397 0.000305958 8 +C 0 925 0.000034708 0.000233292 4826 +C 925 1850 0.000054625 0.000231583 9847 +C 1850 2775 0.000069833 0.000231583 6382 +C 2775 3700 0.000070542 0.000262167 16737 +C 3700 4625 0.000086208 0.000281167 12803 +C 4625 5549 0.000103458 0.000257250 9414 +C 5549 6473 0.000104750 0.000241875 5226 +C 6473 7397 0.000094917 0.000252708 5640 +S 1806 822 83 425401 0.002556625 6580 840 840 13160 0 +R 27 4656 0.000251916 8 +C 0 582 0.000023583 0.000157708 4453 +C 582 1164 0.000048916 0.000220833 35088 +C 1164 1746 0.000066166 0.000181333 9856 +C 1746 2328 0.000066708 0.000162458 3783 +C 2328 2910 0.000072458 0.000174500 4546 +C 2910 3492 0.000087333 0.000172583 3010 +C 3492 4074 0.000088708 0.000166333 2504 +C 4074 4656 0.000079791 0.000223166 19307 +S 1154 522 71 426523 0.001562916 4165 478 478 8330 0 +R 28 2960 0.000175875 8 +C 0 370 0.000023833 0.000117625 3307 +C 370 740 0.000046292 0.000136042 7405 +C 740 1110 0.000063958 0.000122167 1856 +C 1110 1480 0.000064375 0.000130417 2844 +C 1480 1850 0.000069792 0.000149500 4392 +C 1850 2220 0.000077042 0.000128292 1475 +C 2220 2590 0.000078542 0.000138542 2744 +C 2590 2960 0.000069500 0.000139417 3139 +S 746 332 38 427275 0.001132458 2679 338 338 5358 0 +R 29 1926 0.000160167 8 +C 0 241 0.000014458 0.000126167 1487 +C 241 482 0.000044458 0.000111250 6190 +C 482 723 0.000044542 0.000086250 1141 +C 723 964 0.000043500 0.000091292 2106 +C 964 1205 0.000066792 0.000109375 1694 +C 1205 1446 0.000083792 0.000120042 1068 +C 1446 1686 0.000083792 0.000120917 963 +C 1686 1926 0.000067375 0.000120958 2687 +S 422 187 23 427699 0.000688750 1546 149 149 3092 0 +R 30 1103 0.000144583 8 +C 0 138 0.000028458 0.000126791 22472 +C 138 276 0.000051291 0.000114750 16385 +C 276 414 0.000068958 0.000098333 2069 +C 414 552 0.000069375 0.000097875 1914 +C 552 690 0.000075166 0.000109666 1701 +C 690 828 0.000083958 0.000104666 627 +C 828 966 0.000084708 0.000103208 371 +C 966 1103 0.000076291 0.000098833 839 +S 217 93 16 427915 0.000342666 793 110 110 1586 0 +R 31 570 0.000166875 8 +C 0 72 0.000039709 0.000071334 4026 +C 72 144 0.000086209 0.000104375 836 +C 144 215 0.000090625 0.000116125 2411 +C 215 286 0.000107375 0.000121125 459 +C 286 357 0.000108042 0.000119917 291 +C 357 428 0.000118084 0.000132834 504 +C 428 499 0.000122000 0.000134334 671 +C 499 570 0.000118667 0.000133500 383 +S 124 58 5 428037 0.000182292 465 47 47 930 0 +R 32 317 0.000122875 8 +C 0 40 0.000025208 0.000036042 728 +C 40 80 0.000046667 0.000061417 411 +C 80 120 0.000049333 0.000089833 15483 +C 120 160 0.000064500 0.000074625 387 +C 160 200 0.000071083 0.000080667 278 +C 200 239 0.000065625 0.000090917 4440 +C 239 278 0.000078625 0.000084583 130 +C 278 317 0.000079500 0.000089042 283 +S 72 35 5 428101 0.000143417 274 20 20 548 0 +R 33 188 0.000152458 8 +C 0 24 0.000041083 0.000079708 7025 +C 24 48 0.000059875 0.000075208 2046 +C 48 72 0.000061291 0.000097333 12304 +C 72 96 0.000052750 0.000063208 693 +C 96 119 0.000075291 0.000101083 4344 +C 119 142 0.000077500 0.000126166 16024 +C 142 165 0.000088916 0.000098083 577 +C 165 188 0.000077958 0.000082500 31 +S 44 19 3 428145 0.000079000 176 16 16 352 0 +R 34 119 0.000123792 8 +C 0 15 0.000026209 0.000032375 285 +C 15 30 0.000046625 0.000056000 1296 +C 30 45 0.000047459 0.000050417 51 +C 45 60 0.000065084 0.000068459 117 +C 60 75 0.000065750 0.000068542 62 +C 75 90 0.000067459 0.000070750 412 +C 90 105 0.000081875 0.000085167 68 +C 105 119 0.000093875 0.000096875 26 +S 26 13 2 428167 0.000049750 79 7 7 158 0 +R 35 59 0.000115333 8 +C 0 8 0.000027833 0.000031042 37 +C 8 16 0.000044292 0.000046542 17 +C 16 24 0.000051500 0.000053125 19 +C 24 31 0.000058042 0.000059500 21 +C 31 38 0.000064875 0.000066292 32 +C 38 45 0.000068250 0.000069708 20 +C 45 52 0.000073250 0.000074750 25 +C 52 59 0.000089792 0.000091333 2 +S 15 5 1 428185 0.000042084 70 6 6 140 0 +R 36 47 0.000123416 8 +C 0 6 0.000033000 0.000035666 26 +C 6 12 0.000054458 0.000055791 11 +C 12 18 0.000051500 0.000052875 15 +C 18 24 0.000065958 0.000067125 6 +C 24 30 0.000067916 0.000069791 61 +C 30 36 0.000069625 0.000070625 6 +C 36 42 0.000081000 0.000082416 13 +C 42 47 0.000094291 0.000095750 40 +S 19 12 1 428197 0.000047500 57 2 2 114 0 +R 37 38 0.000127625 8 +C 0 5 0.000045959 0.000047167 13 +C 5 10 0.000058667 0.000061834 37 +C 10 15 0.000062209 0.000063375 11 +C 15 20 0.000058500 0.000061834 21 +C 20 25 0.000062334 0.000064042 20 +C 25 30 0.000075959 0.000078209 65 +C 30 34 0.000089459 0.000090042 13 +C 34 38 0.000103542 0.000104167 3 +S 13 6 1 428209 0.000032917 44 6 6 88 0 +R 38 32 0.000104083 8 +C 0 4 0.000041916 0.000043083 15 +C 4 8 0.000054458 0.000055958 7 +C 8 12 0.000059208 0.000060541 14 +C 12 16 0.000050875 0.000052750 33 +C 16 20 0.000067791 0.000069125 8 +C 20 24 0.000059750 0.000060708 4 +C 24 28 0.000070958 0.000072500 2 +C 28 32 0.000079083 0.000080083 12 +S 4 2 0 428213 0.000019667 10 1 1 20 0 +R 39 9 0.000112167 8 +C 0 2 0.000038500 0.000039000 0 +C 2 3 0.000055125 0.000056750 3 +C 3 4 0.000055500 0.000056625 0 +C 4 5 0.000050792 0.000051917 1 +C 5 6 0.000056708 0.000057208 0 +C 6 7 0.000060292 0.000060667 0 +C 7 8 0.000072458 0.000073792 3 +C 8 9 0.000079542 0.000080833 0 +S 1 0 0 428215 0.000017416 7 1 1 14 0 +R 40 5 0.000066333 5 +C 0 1 0.000037291 0.000038333 0 +C 1 2 0.000049833 0.000050875 2 +C 2 3 0.000050375 0.000051416 2 +C 3 4 0.000042500 0.000044125 7 +C 4 5 0.000042250 0.000042791 0 +S 1 0 0 428217 0.000019750 9 1 1 18 0 +R 41 6 0.000102500 6 +C 0 1 0.000042917 0.000043500 4 +C 1 2 0.000054167 0.000054459 3 +C 2 3 0.000055459 0.000056000 0 +C 3 4 0.000056334 0.000056875 1 +C 4 5 0.000060667 0.000061875 2 +C 5 6 0.000069125 0.000070334 3 +S 0 0 0 428217 0.000007041 0 0 0 0 0 diff --git a/docs/benchmarks/2026-09-27/serial-profile/data/phases_sweep1_battery.pmset b/docs/benchmarks/2026-09-27/serial-profile/data/phases_sweep1_battery.pmset new file mode 100644 index 00000000..62a5b129 --- /dev/null +++ b/docs/benchmarks/2026-09-27/serial-profile/data/phases_sweep1_battery.pmset @@ -0,0 +1,4 @@ +Now drawing from 'Battery Power' + -InternalBattery-0 (id=7929955) 86%; discharging; 4:25 remaining present: true +Now drawing from 'Battery Power' + -InternalBattery-0 (id=7929955) 85%; discharging; 4:05 remaining present: true diff --git a/docs/benchmarks/2026-09-27/serial-profile/data/phases_sweep1_battery.txt b/docs/benchmarks/2026-09-27/serial-profile/data/phases_sweep1_battery.txt new file mode 100644 index 00000000..1a79abc5 --- /dev/null +++ b/docs/benchmarks/2026-09-27/serial-profile/data/phases_sweep1_battery.txt @@ -0,0 +1,180 @@ +1 {"call": 0, "threads": 1, "refine_s": 0.5444039170397446, "legalise_s": 2.2917e-05, "quality_s": 0.000884542, "scan_s": 0.360415006, "split_s": 0.15058146199999997, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.0324999900397446} +1 {"call": 1, "threads": 1, "refine_s": 0.5189719160553068, "legalise_s": 7.2417e-05, "quality_s": 0.000903917, "scan_s": 0.3443618320000001, "split_s": 0.143035002, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.03059874805530663} +1 {"call": 2, "threads": 1, "refine_s": 0.5223240829654969, "legalise_s": 2.3125e-05, "quality_s": 0.000914708, "scan_s": 0.347831212, "split_s": 0.14358491799999998, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.029970119965496894} +1 {"call": 3, "threads": 1, "refine_s": 0.5211930410005152, "legalise_s": 2.2e-05, "quality_s": 0.000887333, "scan_s": 0.3447507939999999, "split_s": 0.14533191899999992, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.03020099500051543} +1 {"call": 4, "threads": 1, "refine_s": 0.5172080000047572, "legalise_s": 2.0416e-05, "quality_s": 0.000875834, "scan_s": 0.3429942910000001, "split_s": 0.14398679300000003, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.029330666004757006} +1 {"call": 0, "threads": 2, "refine_s": 0.3704864159808494, "legalise_s": 2.4041e-05, "quality_s": 0.000924, "scan_s": 0.1923447490000001, "split_s": 0.14504087199999993, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.032152753980849436} +1 {"call": 1, "threads": 2, "refine_s": 0.3710424170130864, "legalise_s": 2.1584e-05, "quality_s": 0.000889875, "scan_s": 0.19615241600000005, "split_s": 0.14370624899999992, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.0302722930130864} +1 {"call": 2, "threads": 2, "refine_s": 0.3666272910195403, "legalise_s": 2.3958e-05, "quality_s": 0.0008855, "scan_s": 0.19386016800000003, "split_s": 0.14226883200000004, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.02958883301954024} +1 {"call": 3, "threads": 2, "refine_s": 0.3701082909828983, "legalise_s": 2.2125e-05, "quality_s": 0.000916625, "scan_s": 0.19667254300000006, "split_s": 0.14300925000000006, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.029487747982898216} +1 {"call": 4, "threads": 2, "refine_s": 0.3702815000433475, "legalise_s": 2.3e-05, "quality_s": 0.000901042, "scan_s": 0.199481499, "split_s": 0.140439874, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.029436085043347465} +1 {"call": 0, "threads": 3, "refine_s": 0.31449562497437, "legalise_s": 2.225e-05, "quality_s": 0.000934167, "scan_s": 0.136016374, "split_s": 0.145097129, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.03242570497437003} +1 {"call": 1, "threads": 3, "refine_s": 0.3077679999987595, "legalise_s": 2.2958e-05, "quality_s": 0.00087925, "scan_s": 0.13479920599999998, "split_s": 0.14115291999999996, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.030913665998759526} +1 {"call": 2, "threads": 3, "refine_s": 0.3076044999761507, "legalise_s": 2.2416e-05, "quality_s": 0.000918083, "scan_s": 0.13500462500000004, "split_s": 0.14216083200000004, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.029498543976150565} +1 {"call": 3, "threads": 3, "refine_s": 0.3096846250118688, "legalise_s": 2.125e-05, "quality_s": 0.000885792, "scan_s": 0.136441543, "split_s": 0.14244545600000008, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.029890584011868726} +1 {"call": 4, "threads": 3, "refine_s": 0.30750279198400676, "legalise_s": 2.45e-05, "quality_s": 0.000905917, "scan_s": 0.13497466700000002, "split_s": 0.14171604000000002, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.029881667984006766} +1 {"call": 0, "threads": 4, "refine_s": 0.2886243329849094, "legalise_s": 2.2208e-05, "quality_s": 0.000893875, "scan_s": 0.10608521299999998, "split_s": 0.14854329000000002, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.0330797469849094} +1 {"call": 1, "threads": 4, "refine_s": 0.2781729170237668, "legalise_s": 2.1958e-05, "quality_s": 0.000912875, "scan_s": 0.10587787500000001, "split_s": 0.14098408100000007, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.03037612802376674} +1 {"call": 2, "threads": 4, "refine_s": 0.27939754200633615, "legalise_s": 2.575e-05, "quality_s": 0.000885875, "scan_s": 0.105353498, "split_s": 0.14379021099999997, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.029342208006336218} +1 {"call": 3, "threads": 4, "refine_s": 0.2760612500132993, "legalise_s": 2.0083e-05, "quality_s": 0.000889542, "scan_s": 0.10650945900000001, "split_s": 0.13912575200000002, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.029516414013299214} +1 {"call": 4, "threads": 4, "refine_s": 0.2867140840389766, "legalise_s": 2.1334e-05, "quality_s": 0.000914875, "scan_s": 0.108047873, "split_s": 0.14699100099999995, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.030739001038976643} +1 {"call": 0, "threads": 5, "refine_s": 0.2648858329630457, "legalise_s": 2.2458e-05, "quality_s": 0.000900917, "scan_s": 0.089353209, "split_s": 0.14271583399999996, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.031893414963045735} +1 {"call": 1, "threads": 5, "refine_s": 0.26128366601187736, "legalise_s": 2.2125e-05, "quality_s": 0.000931875, "scan_s": 0.08780116800000001, "split_s": 0.14148675000000002, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.031041748011877313} +1 {"call": 2, "threads": 5, "refine_s": 0.26087116700364277, "legalise_s": 2.2708e-05, "quality_s": 0.000916792, "scan_s": 0.08926637700000002, "split_s": 0.1410393769999999, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.029625913003642868} +1 {"call": 3, "threads": 5, "refine_s": 0.26057549996767193, "legalise_s": 2.1417e-05, "quality_s": 0.000886292, "scan_s": 0.08915516799999999, "split_s": 0.14071070800000005, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.029801914967671844} +1 {"call": 4, "threads": 5, "refine_s": 0.2652488329913467, "legalise_s": 2.725e-05, "quality_s": 0.000914708, "scan_s": 0.08921225299999995, "split_s": 0.14373562699999998, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.03135899499134681} +1 {"call": 0, "threads": 6, "refine_s": 0.2623575839679688, "legalise_s": 2.1125e-05, "quality_s": 0.000885875, "scan_s": 0.08014925100000002, "split_s": 0.14854329199999994, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.03275804096796886} +1 {"call": 1, "threads": 6, "refine_s": 0.2551959589472972, "legalise_s": 2.1375e-05, "quality_s": 0.000893542, "scan_s": 0.07839237700000001, "split_s": 0.14468279400000006, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.0312058709472971} +1 {"call": 2, "threads": 6, "refine_s": 0.24945845897309482, "legalise_s": 2.2125e-05, "quality_s": 0.000898667, "scan_s": 0.07657320699999996, "split_s": 0.14193033300000002, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.03003412697309482} +1 {"call": 3, "threads": 6, "refine_s": 0.2518337909714319, "legalise_s": 2.1042e-05, "quality_s": 0.000887125, "scan_s": 0.07800628800000001, "split_s": 0.14306599599999995, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.029853339971431914} +1 {"call": 4, "threads": 6, "refine_s": 0.24976091599091887, "legalise_s": 2.0792e-05, "quality_s": 0.000908583, "scan_s": 0.07595912399999999, "split_s": 0.14333891599999998, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.02953350099091892} +1 {"call": 0, "threads": 7, "refine_s": 0.24643479101359844, "legalise_s": 1.9875e-05, "quality_s": 0.00090225, "scan_s": 0.068505959, "split_s": 0.144998546, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.032008161013598435} +1 {"call": 1, "threads": 7, "refine_s": 0.24678199994377792, "legalise_s": 2.5e-05, "quality_s": 0.000889875, "scan_s": 0.072037668, "split_s": 0.14332437399999998, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.030505082943777934} +1 {"call": 2, "threads": 7, "refine_s": 0.2415045829839073, "legalise_s": 2.3292e-05, "quality_s": 0.0008905, "scan_s": 0.06844695799999999, "split_s": 0.14269437400000004, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.0294494589839073} +1 {"call": 3, "threads": 7, "refine_s": 0.24712766596348956, "legalise_s": 2.2458e-05, "quality_s": 0.00088525, "scan_s": 0.07166166400000001, "split_s": 0.1449853689999999, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.02957292496348965} +1 {"call": 4, "threads": 7, "refine_s": 0.24020737496903166, "legalise_s": 2.25e-05, "quality_s": 0.000918667, "scan_s": 0.069155208, "split_s": 0.14010412199999997, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.030006877969031676} +1 {"call": 0, "threads": 8, "refine_s": 0.24245000001974404, "legalise_s": 2.2667e-05, "quality_s": 0.000889041, "scan_s": 0.06519579299999997, "split_s": 0.14421657699999996, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.032125922019744096} +1 {"call": 1, "threads": 8, "refine_s": 0.24058416695334017, "legalise_s": 2.3167e-05, "quality_s": 0.00088525, "scan_s": 0.064957171, "split_s": 0.144326833, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.03039174595334021} +1 {"call": 2, "threads": 8, "refine_s": 0.23885191703448072, "legalise_s": 2.3958e-05, "quality_s": 0.001093542, "scan_s": 0.06461208900000003, "split_s": 0.14288566500000002, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.030236663034480665} +1 {"call": 3, "threads": 8, "refine_s": 0.2363142090034671, "legalise_s": 2.425e-05, "quality_s": 0.0009525, "scan_s": 0.06464991999999999, "split_s": 0.14054250300000004, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.030145036003467074} +1 {"call": 4, "threads": 8, "refine_s": 0.23374979197978973, "legalise_s": 2.0625e-05, "quality_s": 0.000884792, "scan_s": 0.06454212299999999, "split_s": 0.138790543, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.029511708979789775} +1 {"call": 0, "threads": 10, "refine_s": 0.24732566700549796, "legalise_s": 2.2083e-05, "quality_s": 0.00088825, "scan_s": 0.06803187899999998, "split_s": 0.14665854500000003, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.03172491000549793} +1 {"call": 1, "threads": 10, "refine_s": 0.23787591699510813, "legalise_s": 2.3125e-05, "quality_s": 0.000878375, "scan_s": 0.06711291200000001, "split_s": 0.139506791, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.030354713995108112} +1 {"call": 2, "threads": 10, "refine_s": 0.23916749999625608, "legalise_s": 2.3292e-05, "quality_s": 0.000935916, "scan_s": 0.067428921, "split_s": 0.14105925200000002, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.02972011899625604} +1 {"call": 3, "threads": 10, "refine_s": 0.23955291701713577, "legalise_s": 2.3083e-05, "quality_s": 0.000933291, "scan_s": 0.067133461, "split_s": 0.141943127, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.02951995501713575} +1 {"call": 4, "threads": 10, "refine_s": 0.24195945903193206, "legalise_s": 2.1125e-05, "quality_s": 0.000889875, "scan_s": 0.06898704300000001, "split_s": 0.14282375300000008, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.029237663031931954} +1 {"call": 0, "threads": 12, "refine_s": 0.24292604200309142, "legalise_s": 1.9958e-05, "quality_s": 0.000887042, "scan_s": 0.06486470700000002, "split_s": 0.144942333, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.032212002003091406} +1 {"call": 1, "threads": 12, "refine_s": 0.2335302909486927, "legalise_s": 2.1625e-05, "quality_s": 0.000980125, "scan_s": 0.06450275199999998, "split_s": 0.13797162599999996, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.030054162948692786} +1 {"call": 2, "threads": 12, "refine_s": 0.238992957980372, "legalise_s": 2.1334e-05, "quality_s": 0.000895167, "scan_s": 0.06761012499999998, "split_s": 0.14086004100000002, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.029606290980372013} +1 {"call": 3, "threads": 12, "refine_s": 0.23565758299082518, "legalise_s": 2.0458e-05, "quality_s": 0.000880416, "scan_s": 0.065582002, "split_s": 0.13952870699999997, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.029645999990825206} +1 {"call": 4, "threads": 12, "refine_s": 0.23403079097624868, "legalise_s": 2.0875e-05, "quality_s": 0.000886583, "scan_s": 0.06530550299999999, "split_s": 0.13835958199999995, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.02945824797624874} +1 {"call": 0, "threads": 16, "refine_s": 0.24047466600313783, "legalise_s": 1.9833e-05, "quality_s": 0.00090925, "scan_s": 0.062040965, "split_s": 0.14512999699999998, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.03237462100313784} +1 {"call": 1, "threads": 16, "refine_s": 0.23317991697695106, "legalise_s": 2.0917e-05, "quality_s": 0.000881792, "scan_s": 0.05946091899999998, "split_s": 0.14254825299999996, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.03026803597695113} +1 {"call": 2, "threads": 16, "refine_s": 0.23211454099509865, "legalise_s": 2.1041e-05, "quality_s": 0.000928792, "scan_s": 0.05881254100000002, "split_s": 0.14264070399999998, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.029711462995098636} +1 {"call": 3, "threads": 16, "refine_s": 0.23055441700853407, "legalise_s": 2.0709e-05, "quality_s": 0.000878666, "scan_s": 0.057673291999999994, "split_s": 0.14244428699999998, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.029537463008534104} +1 {"call": 4, "threads": 16, "refine_s": 0.2328947500209324, "legalise_s": 2.0291e-05, "quality_s": 0.000882167, "scan_s": 0.05925020899999999, "split_s": 0.142938749, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.02980333402093241} +1 {"call": 0, "threads": 20, "refine_s": 0.2357371249818243, "legalise_s": 2e-05, "quality_s": 0.000962542, "scan_s": 0.060979750000000006, "split_s": 0.14160212299999997, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.03217270998182434} +1 {"call": 1, "threads": 20, "refine_s": 0.23394479200942442, "legalise_s": 2.2125e-05, "quality_s": 0.000882875, "scan_s": 0.061474124, "split_s": 0.14080145499999996, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.030764213009424446} +1 {"call": 2, "threads": 20, "refine_s": 0.23432783398311585, "legalise_s": 2.0208e-05, "quality_s": 0.00089375, "scan_s": 0.06289274799999997, "split_s": 0.13993383199999995, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.030587295983115936} +1 {"call": 3, "threads": 20, "refine_s": 0.23636608303058892, "legalise_s": 2.3208e-05, "quality_s": 0.000898208, "scan_s": 0.061332414999999994, "split_s": 0.14230682800000002, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.03180542403058889} +1 {"call": 4, "threads": 20, "refine_s": 0.23012858303263783, "legalise_s": 2.0125e-05, "quality_s": 0.000887, "scan_s": 0.060902543999999996, "split_s": 0.13861229099999997, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.029706623032637852} +2 {"call": 0, "threads": 1, "refine_s": 0.5299567920155823, "legalise_s": 2.3e-05, "quality_s": 0.000900125, "scan_s": 0.3472242859999999, "split_s": 0.149668419, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.03214096201558242} +2 {"call": 1, "threads": 1, "refine_s": 0.5276282079867087, "legalise_s": 2.3208e-05, "quality_s": 0.000909458, "scan_s": 0.3483700010000001, "split_s": 0.14774391699999997, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.03058162398670869} +2 {"call": 2, "threads": 1, "refine_s": 0.5199134169961326, "legalise_s": 2.1625e-05, "quality_s": 0.000879375, "scan_s": 0.34584262300000007, "split_s": 0.1436985, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.029471293996132464} +2 {"call": 3, "threads": 1, "refine_s": 0.5270498750032857, "legalise_s": 2.6542e-05, "quality_s": 0.000885209, "scan_s": 0.348743457, "split_s": 0.147645457, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.02974921000328576} +2 {"call": 4, "threads": 1, "refine_s": 0.5153904579929076, "legalise_s": 2.0666e-05, "quality_s": 0.000886208, "scan_s": 0.34324783400000003, "split_s": 0.141907499, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.02932825099290759} +2 {"call": 0, "threads": 2, "refine_s": 0.3769702500430867, "legalise_s": 2e-05, "quality_s": 0.000895583, "scan_s": 0.197737416, "split_s": 0.14604557699999998, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.03227167404308673} +2 {"call": 1, "threads": 2, "refine_s": 0.36667666700668633, "legalise_s": 2.0416e-05, "quality_s": 0.000877334, "scan_s": 0.19362120900000004, "split_s": 0.141808708, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.03034900000668625} +2 {"call": 2, "threads": 2, "refine_s": 0.36839850002434105, "legalise_s": 2.1208e-05, "quality_s": 0.000891458, "scan_s": 0.19408374900000003, "split_s": 0.143838167, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.029563918024341024} +2 {"call": 3, "threads": 2, "refine_s": 0.37057787500089034, "legalise_s": 2.05e-05, "quality_s": 0.000884833, "scan_s": 0.19536816099999998, "split_s": 0.14432196099999997, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.029982420000890436} +2 {"call": 4, "threads": 2, "refine_s": 0.36456850002286956, "legalise_s": 2.3417e-05, "quality_s": 0.000884583, "scan_s": 0.19423724900000003, "split_s": 0.14020445900000003, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.029218792022869478} +2 {"call": 0, "threads": 3, "refine_s": 0.3095701250131242, "legalise_s": 2.05e-05, "quality_s": 0.000942583, "scan_s": 0.13301858499999997, "split_s": 0.14360687800000002, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.031981579013124234} +2 {"call": 1, "threads": 3, "refine_s": 0.3024892500252463, "legalise_s": 2.1083e-05, "quality_s": 0.000898791, "scan_s": 0.13390124799999994, "split_s": 0.137202377, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.030465751025246374} +2 {"call": 2, "threads": 3, "refine_s": 0.3076800829730928, "legalise_s": 2.1042e-05, "quality_s": 0.000904334, "scan_s": 0.13507012699999998, "split_s": 0.142191414, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.02949316597309279} +2 {"call": 3, "threads": 3, "refine_s": 0.30320458399364725, "legalise_s": 2.1208e-05, "quality_s": 0.0009225, "scan_s": 0.13399066600000004, "split_s": 0.13824778899999998, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.030022420993647242} +2 {"call": 4, "threads": 3, "refine_s": 0.3065178749966435, "legalise_s": 2.0958e-05, "quality_s": 0.000881083, "scan_s": 0.13329641599999995, "split_s": 0.14282303799999993, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.029496379996643618} +2 {"call": 0, "threads": 4, "refine_s": 0.2828412079834379, "legalise_s": 1.9584e-05, "quality_s": 0.000889833, "scan_s": 0.106014504, "split_s": 0.144021293, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.0318959939834379} +2 {"call": 1, "threads": 4, "refine_s": 0.2811894580372609, "legalise_s": 2.2334e-05, "quality_s": 0.000925042, "scan_s": 0.10514633700000002, "split_s": 0.144621705, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.030474040037260897} +2 {"call": 2, "threads": 4, "refine_s": 0.2756259169545956, "legalise_s": 2.1625e-05, "quality_s": 0.000904042, "scan_s": 0.10522637599999998, "split_s": 0.13957470500000005, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.029899168954595545} +2 {"call": 3, "threads": 4, "refine_s": 0.27492795803118497, "legalise_s": 2.2167e-05, "quality_s": 0.000906333, "scan_s": 0.10626999800000002, "split_s": 0.138222623, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.02950683703118495} +2 {"call": 4, "threads": 4, "refine_s": 0.2757488749921322, "legalise_s": 2.175e-05, "quality_s": 0.000886625, "scan_s": 0.10579929300000002, "split_s": 0.13987650200000004, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.029164704992132168} +2 {"call": 0, "threads": 5, "refine_s": 0.26832254097098485, "legalise_s": 2.0042e-05, "quality_s": 0.000892542, "scan_s": 0.089752999, "split_s": 0.14515566600000004, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.03250129197098481} +2 {"call": 1, "threads": 5, "refine_s": 0.2608690420165658, "legalise_s": 2.1625e-05, "quality_s": 0.000944042, "scan_s": 0.087967458, "split_s": 0.1414425430000001, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.03049337401656571} +2 {"call": 2, "threads": 5, "refine_s": 0.2598731250036508, "legalise_s": 2.175e-05, "quality_s": 0.000884041, "scan_s": 0.08859866300000004, "split_s": 0.14080924700000005, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.02955942400365072} +2 {"call": 3, "threads": 5, "refine_s": 0.25881612504599616, "legalise_s": 2.1042e-05, "quality_s": 0.000969416, "scan_s": 0.08859858500000001, "split_s": 0.139535294, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.02969178804599612} +2 {"call": 4, "threads": 5, "refine_s": 0.2622214159928262, "legalise_s": 2.0584e-05, "quality_s": 0.000884917, "scan_s": 0.08746520800000003, "split_s": 0.1436580849999999, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.030192621992826324} +2 {"call": 0, "threads": 6, "refine_s": 0.25471062504220754, "legalise_s": 2.075e-05, "quality_s": 0.000947708, "scan_s": 0.07535820700000001, "split_s": 0.14639204000000003, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.031991920042207495} +2 {"call": 1, "threads": 6, "refine_s": 0.24962829099968076, "legalise_s": 2.0542e-05, "quality_s": 0.000889292, "scan_s": 0.07595004100000002, "split_s": 0.14187162500000003, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.03089679099968068} +2 {"call": 2, "threads": 6, "refine_s": 0.24672562500927597, "legalise_s": 2.45e-05, "quality_s": 0.000922292, "scan_s": 0.07469562199999999, "split_s": 0.14145703999999995, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.02962617100927603} +2 {"call": 3, "threads": 6, "refine_s": 0.24479787499876693, "legalise_s": 2.0167e-05, "quality_s": 0.000909667, "scan_s": 0.07493220300000003, "split_s": 0.13941812699999998, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.029517710998766933} +2 {"call": 4, "threads": 6, "refine_s": 0.24720866698771715, "legalise_s": 2.0917e-05, "quality_s": 0.000898166, "scan_s": 0.07517725000000003, "split_s": 0.14165633299999997, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.02945600098771714} +2 {"call": 0, "threads": 7, "refine_s": 0.24403666699072346, "legalise_s": 2.0083e-05, "quality_s": 0.000886875, "scan_s": 0.06852112499999999, "split_s": 0.14272675199999996, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.0318818319907235} +2 {"call": 1, "threads": 7, "refine_s": 0.2386484579765238, "legalise_s": 2.1708e-05, "quality_s": 0.000877709, "scan_s": 0.06790720700000002, "split_s": 0.13944837900000007, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.03039345497652368} +2 {"call": 2, "threads": 7, "refine_s": 0.2415291250217706, "legalise_s": 2.2541e-05, "quality_s": 0.000931167, "scan_s": 0.07034991300000004, "split_s": 0.14064662700000005, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.029578877021770505} +2 {"call": 3, "threads": 7, "refine_s": 0.25173437502235174, "legalise_s": 2.2667e-05, "quality_s": 0.000902, "scan_s": 0.07477291300000001, "split_s": 0.146047542, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.029989253022351753} +2 {"call": 4, "threads": 7, "refine_s": 0.2424327089684084, "legalise_s": 2.1541e-05, "quality_s": 0.000883292, "scan_s": 0.071204082, "split_s": 0.140547042, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.02977675196840837} +2 {"call": 0, "threads": 8, "refine_s": 0.24293254100484774, "legalise_s": 1.9917e-05, "quality_s": 0.000896166, "scan_s": 0.06388695700000005, "split_s": 0.14630137300000004, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.03182812800484763} +2 {"call": 1, "threads": 8, "refine_s": 0.236474042001646, "legalise_s": 2.1791e-05, "quality_s": 0.000882042, "scan_s": 0.06471383500000001, "split_s": 0.140387206, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.030469168001646008} +2 {"call": 2, "threads": 8, "refine_s": 0.23483583302004263, "legalise_s": 2.0666e-05, "quality_s": 0.000897167, "scan_s": 0.064910542, "split_s": 0.13922633500000006, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.02978112302004257} +2 {"call": 3, "threads": 8, "refine_s": 0.23453954100841656, "legalise_s": 2.0792e-05, "quality_s": 0.000892375, "scan_s": 0.06313699900000001, "split_s": 0.140662, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.029827375008416535} +2 {"call": 4, "threads": 8, "refine_s": 0.23925362498266622, "legalise_s": 2.3459e-05, "quality_s": 0.00088375, "scan_s": 0.068111499, "split_s": 0.14043408199999996, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.02980083498266628} +2 {"call": 0, "threads": 10, "refine_s": 0.24120529199717566, "legalise_s": 2.0084e-05, "quality_s": 0.0009285, "scan_s": 0.06666808099999999, "split_s": 0.141909418, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.03167920899717566} +2 {"call": 1, "threads": 10, "refine_s": 0.23635491699678823, "legalise_s": 2.3083e-05, "quality_s": 0.00088125, "scan_s": 0.06781279200000001, "split_s": 0.13729303799999998, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.030344753996788237} +2 {"call": 2, "threads": 10, "refine_s": 0.23635395895689726, "legalise_s": 2.125e-05, "quality_s": 0.000893542, "scan_s": 0.06634154299999996, "split_s": 0.13969803699999997, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.029399586956897344} +2 {"call": 3, "threads": 10, "refine_s": 0.2334012920036912, "legalise_s": 2.0209e-05, "quality_s": 0.000883417, "scan_s": 0.06655212399999999, "split_s": 0.136478086, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.029467456003691217} +2 {"call": 4, "threads": 10, "refine_s": 0.23872245900565758, "legalise_s": 2.0583e-05, "quality_s": 0.000886208, "scan_s": 0.06738199800000001, "split_s": 0.14116120599999996, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.02927246400565761} +2 {"call": 0, "threads": 12, "refine_s": 0.24378854205133393, "legalise_s": 2.0166e-05, "quality_s": 0.0008815, "scan_s": 0.06789212699999998, "split_s": 0.14308074999999998, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.03191399905133396} +2 {"call": 1, "threads": 12, "refine_s": 0.2374076250125654, "legalise_s": 2.5042e-05, "quality_s": 0.000879333, "scan_s": 0.065779745, "split_s": 0.13994020300000004, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.03078330201256535} +2 {"call": 2, "threads": 12, "refine_s": 0.23709174996474758, "legalise_s": 2.15e-05, "quality_s": 0.000905708, "scan_s": 0.06440625100000001, "split_s": 0.142238584, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.02951970696474754} +2 {"call": 3, "threads": 12, "refine_s": 0.23947941698133945, "legalise_s": 2.1583e-05, "quality_s": 0.000881125, "scan_s": 0.06619821100000002, "split_s": 0.14278383099999992, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.0295946669813395} +2 {"call": 4, "threads": 12, "refine_s": 0.2374046670156531, "legalise_s": 2.1042e-05, "quality_s": 0.000905, "scan_s": 0.06529091499999999, "split_s": 0.1415979139999999, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.02958979601565323} +2 {"call": 0, "threads": 16, "refine_s": 0.23820558399893343, "legalise_s": 2.0708e-05, "quality_s": 0.000883625, "scan_s": 0.05802824899999999, "split_s": 0.14655565999999995, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.032717341998933475} +2 {"call": 1, "threads": 16, "refine_s": 0.23718758398899809, "legalise_s": 2.2834e-05, "quality_s": 0.000920208, "scan_s": 0.060579166000000004, "split_s": 0.14454537699999995, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.031119998988998115} +2 {"call": 2, "threads": 16, "refine_s": 0.24283174995798618, "legalise_s": 2.0458e-05, "quality_s": 0.000883833, "scan_s": 0.06211179600000001, "split_s": 0.14659974700000006, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.03321591595798612} +2 {"call": 3, "threads": 16, "refine_s": 0.235731124994345, "legalise_s": 2.1834e-05, "quality_s": 0.000891666, "scan_s": 0.05980708400000001, "split_s": 0.144795084, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.030215456994344997} +2 {"call": 4, "threads": 16, "refine_s": 0.2408996670274064, "legalise_s": 2.125e-05, "quality_s": 0.001022458, "scan_s": 0.06474066399999996, "split_s": 0.145028001, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.030087294027406425} +2 {"call": 0, "threads": 20, "refine_s": 0.23925454204436392, "legalise_s": 2.3042e-05, "quality_s": 0.000903667, "scan_s": 0.061258748999999994, "split_s": 0.14507912200000003, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.031989962044363884} +2 {"call": 1, "threads": 20, "refine_s": 0.22892974998103455, "legalise_s": 2.0875e-05, "quality_s": 0.000901375, "scan_s": 0.059730459, "split_s": 0.13790337800000008, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.030373662981034444} +2 {"call": 2, "threads": 20, "refine_s": 0.23219220800092444, "legalise_s": 2.3916e-05, "quality_s": 0.000981708, "scan_s": 0.06102617, "split_s": 0.14016187700000002, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.02999853700092442} +2 {"call": 3, "threads": 20, "refine_s": 0.23343750002095476, "legalise_s": 2.4e-05, "quality_s": 0.000879541, "scan_s": 0.060989875, "split_s": 0.14186850099999998, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.02967558302095477} +2 {"call": 4, "threads": 20, "refine_s": 0.23048691701842472, "legalise_s": 2.3542e-05, "quality_s": 0.000898166, "scan_s": 0.059049501, "split_s": 0.14115733700000002, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.0293583710184247} +3 {"call": 0, "threads": 1, "refine_s": 0.5320520420209505, "legalise_s": 2.025e-05, "quality_s": 0.000899125, "scan_s": 0.350397713, "split_s": 0.14877633400000004, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.03195862002095037} +3 {"call": 1, "threads": 1, "refine_s": 0.526735584018752, "legalise_s": 2.4709e-05, "quality_s": 0.000883834, "scan_s": 0.3480764549999999, "split_s": 0.14606545899999995, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.031685127018752146} +3 {"call": 2, "threads": 1, "refine_s": 0.5343048750073649, "legalise_s": 2.0917e-05, "quality_s": 0.000889208, "scan_s": 0.35600616999999996, "split_s": 0.147121754, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.030266826007364966} +3 {"call": 3, "threads": 1, "refine_s": 0.5341673330403864, "legalise_s": 2.1667e-05, "quality_s": 0.000887458, "scan_s": 0.35639408399999994, "split_s": 0.14643738000000003, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.030426744040386505} +3 {"call": 4, "threads": 1, "refine_s": 0.5536822499707341, "legalise_s": 2.4208e-05, "quality_s": 0.000953375, "scan_s": 0.37243454200000004, "split_s": 0.15071329, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.029556834970734025} +3 {"call": 0, "threads": 2, "refine_s": 0.3776389170088805, "legalise_s": 2.3208e-05, "quality_s": 0.000935875, "scan_s": 0.199934044, "split_s": 0.14465941199999996, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.03208637800888059} +3 {"call": 1, "threads": 2, "refine_s": 0.37105724995490164, "legalise_s": 2.175e-05, "quality_s": 0.000914625, "scan_s": 0.19453158300000006, "split_s": 0.14493454200000003, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.030654749954901556} +3 {"call": 2, "threads": 2, "refine_s": 0.3646139170159586, "legalise_s": 3.9291e-05, "quality_s": 0.000884833, "scan_s": 0.1940959189999999, "split_s": 0.13984549600000004, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.02974837801595867} +3 {"call": 3, "threads": 2, "refine_s": 0.37299208401236683, "legalise_s": 2.0916e-05, "quality_s": 0.000888667, "scan_s": 0.19884587399999995, "split_s": 0.143058332, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.03017829501236688} +3 {"call": 4, "threads": 2, "refine_s": 0.3849135829950683, "legalise_s": 2.4292e-05, "quality_s": 0.000890416, "scan_s": 0.20357228899999996, "split_s": 0.15011171199999995, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.03031487399506838} +3 {"call": 0, "threads": 3, "refine_s": 0.3107717499951832, "legalise_s": 2.1416e-05, "quality_s": 0.000939417, "scan_s": 0.136489709, "split_s": 0.14106520399999997, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.03225600399518325} +3 {"call": 1, "threads": 3, "refine_s": 0.3166477079503238, "legalise_s": 2.0334e-05, "quality_s": 0.000944291, "scan_s": 0.13876149899999998, "split_s": 0.14598254400000005, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.030939039950323793} +3 {"call": 2, "threads": 3, "refine_s": 0.3078584590111859, "legalise_s": 1.9875e-05, "quality_s": 0.000889833, "scan_s": 0.13802466700000007, "split_s": 0.13879100099999994, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.03013308301118589} +3 {"call": 3, "threads": 3, "refine_s": 0.308394874969963, "legalise_s": 2.5375e-05, "quality_s": 0.00088575, "scan_s": 0.137424458, "split_s": 0.14090632900000002, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.029152962969962948} +3 {"call": 4, "threads": 3, "refine_s": 0.3074566660216078, "legalise_s": 2.1208e-05, "quality_s": 0.000889917, "scan_s": 0.13596462799999998, "split_s": 0.14109941600000003, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.029481497021607794} +3 {"call": 0, "threads": 4, "refine_s": 0.2883382079889998, "legalise_s": 2.1416e-05, "quality_s": 0.000887625, "scan_s": 0.10740312600000002, "split_s": 0.14761316800000002, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.03241287298899975} +3 {"call": 1, "threads": 4, "refine_s": 0.29452933301217854, "legalise_s": 2.475e-05, "quality_s": 0.000946875, "scan_s": 0.11077304500000003, "split_s": 0.15117362299999995, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.03161104001217854} +3 {"call": 2, "threads": 4, "refine_s": 0.29108449997147545, "legalise_s": 2.1875e-05, "quality_s": 0.000921666, "scan_s": 0.112764795, "split_s": 0.14683595600000002, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.03054020797147544} +3 {"call": 3, "threads": 4, "refine_s": 0.2813508329563774, "legalise_s": 2.0459e-05, "quality_s": 0.000890792, "scan_s": 0.106165543, "split_s": 0.143932081, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.03034195795637748} +3 {"call": 4, "threads": 4, "refine_s": 0.28010999999241903, "legalise_s": 2.2541e-05, "quality_s": 0.00096825, "scan_s": 0.106259835, "split_s": 0.14350250000000003, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.029356873992419014} +3 {"call": 0, "threads": 5, "refine_s": 0.2653885419713333, "legalise_s": 2.7792e-05, "quality_s": 0.000902625, "scan_s": 0.09080708400000002, "split_s": 0.14154520499999992, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.032105835971333346} +3 {"call": 1, "threads": 5, "refine_s": 0.27080641698557884, "legalise_s": 2.15e-05, "quality_s": 0.000894625, "scan_s": 0.093616125, "split_s": 0.14525399699999997, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.031020169985578883} +3 {"call": 2, "threads": 5, "refine_s": 0.26740220800274983, "legalise_s": 2.1708e-05, "quality_s": 0.000887791, "scan_s": 0.09319258500000004, "split_s": 0.143276503, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.030023621002749745} +3 {"call": 3, "threads": 5, "refine_s": 0.259410958038643, "legalise_s": 2.0916e-05, "quality_s": 0.000891709, "scan_s": 0.08996716699999999, "split_s": 0.138947168, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.029583998038643006} +3 {"call": 4, "threads": 5, "refine_s": 0.26616574998479337, "legalise_s": 2.1625e-05, "quality_s": 0.000887666, "scan_s": 0.09127191800000001, "split_s": 0.14387178900000006, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.030112751984793268} +3 {"call": 0, "threads": 6, "refine_s": 0.25751787499757484, "legalise_s": 1.9875e-05, "quality_s": 0.00089425, "scan_s": 0.07699983100000005, "split_s": 0.14715170800000002, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.03245221099757478} +3 {"call": 1, "threads": 6, "refine_s": 0.25026449997676536, "legalise_s": 2.2625e-05, "quality_s": 0.000881666, "scan_s": 0.07667670399999998, "split_s": 0.142516329, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.03016717597676538} +3 {"call": 2, "threads": 6, "refine_s": 0.26021487498655915, "legalise_s": 2.1083e-05, "quality_s": 0.000890917, "scan_s": 0.08168487599999999, "split_s": 0.14733950300000004, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.030278495986559156} +3 {"call": 3, "threads": 6, "refine_s": 0.25688204198377207, "legalise_s": 2.1625e-05, "quality_s": 0.000895458, "scan_s": 0.08097533000000003, "split_s": 0.14428641699999994, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.030703211983772072} +3 {"call": 4, "threads": 6, "refine_s": 0.24943883303785697, "legalise_s": 2.1125e-05, "quality_s": 0.000884875, "scan_s": 0.07743674800000001, "split_s": 0.14084562800000003, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.03025045703785692} +3 {"call": 0, "threads": 7, "refine_s": 0.2619702079682611, "legalise_s": 2.15e-05, "quality_s": 0.000878625, "scan_s": 0.07813437500000003, "split_s": 0.15080437699999996, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.03213133096826107} +3 {"call": 1, "threads": 7, "refine_s": 0.24731000000610948, "legalise_s": 2.6917e-05, "quality_s": 0.000972208, "scan_s": 0.070722583, "split_s": 0.14462900499999998, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.030959287006109504} +3 {"call": 2, "threads": 7, "refine_s": 0.24948800000129268, "legalise_s": 2.1166e-05, "quality_s": 0.000889125, "scan_s": 0.07044008400000003, "split_s": 0.147299497, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.030838128001292653} +3 {"call": 3, "threads": 7, "refine_s": 0.2494779999833554, "legalise_s": 2.1541e-05, "quality_s": 0.000890375, "scan_s": 0.07168725599999999, "split_s": 0.14660229100000002, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.03027653698335539} +3 {"call": 4, "threads": 7, "refine_s": 0.24604112497763708, "legalise_s": 2.1625e-05, "quality_s": 0.000885583, "scan_s": 0.07231662599999998, "split_s": 0.143225542, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.029591748977637083} +3 {"call": 0, "threads": 8, "refine_s": 0.24425758403958753, "legalise_s": 2.1791e-05, "quality_s": 0.000951459, "scan_s": 0.06531695899999998, "split_s": 0.14570045999999995, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.03226691503958762} +3 {"call": 1, "threads": 8, "refine_s": 0.2417855000239797, "legalise_s": 2.175e-05, "quality_s": 0.000878167, "scan_s": 0.06747574900000002, "split_s": 0.14346396299999997, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.02994587102397972} +3 {"call": 2, "threads": 8, "refine_s": 0.23796570801641792, "legalise_s": 2.1417e-05, "quality_s": 0.000877, "scan_s": 0.06696978600000002, "split_s": 0.14030204000000004, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.02979546501641786} +3 {"call": 3, "threads": 8, "refine_s": 0.23979470902122557, "legalise_s": 2.1083e-05, "quality_s": 0.000932625, "scan_s": 0.06608945899999999, "split_s": 0.14289612699999998, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.0298554150212256} +3 {"call": 4, "threads": 8, "refine_s": 0.2430724169826135, "legalise_s": 2.1542e-05, "quality_s": 0.000885667, "scan_s": 0.07027916299999999, "split_s": 0.141286047, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.030599997982613508} +3 {"call": 0, "threads": 10, "refine_s": 0.24490391701692715, "legalise_s": 2.1708e-05, "quality_s": 0.000929, "scan_s": 0.06861308599999999, "split_s": 0.14281208399999998, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.03252803901692716} +3 {"call": 1, "threads": 10, "refine_s": 0.24567999999271706, "legalise_s": 2.6167e-05, "quality_s": 0.000893167, "scan_s": 0.07043262499999997, "split_s": 0.142918166, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.03140987499271708} +3 {"call": 2, "threads": 10, "refine_s": 0.24125149997416884, "legalise_s": 2.2041e-05, "quality_s": 0.000883333, "scan_s": 0.068896295, "split_s": 0.14172842, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.029721410974168833} +3 {"call": 3, "threads": 10, "refine_s": 0.2410844159894623, "legalise_s": 2.1959e-05, "quality_s": 0.000891708, "scan_s": 0.06858625000000003, "split_s": 0.14215608299999996, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.029428415989462303} +3 {"call": 4, "threads": 10, "refine_s": 0.24476708297152072, "legalise_s": 2.5083e-05, "quality_s": 0.000930292, "scan_s": 0.07194283100000001, "split_s": 0.14247604099999994, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.02939283597152076} +3 {"call": 0, "threads": 12, "refine_s": 0.2571136250044219, "legalise_s": 2.3667e-05, "quality_s": 0.000921416, "scan_s": 0.06682258200000002, "split_s": 0.15730450000000004, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.032041460004421846} +3 {"call": 1, "threads": 12, "refine_s": 0.2497299580136314, "legalise_s": 2.1042e-05, "quality_s": 0.000903709, "scan_s": 0.06965503600000003, "split_s": 0.14852270900000003, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.03062746201363134} +3 {"call": 2, "threads": 12, "refine_s": 0.24408079200657085, "legalise_s": 2.1666e-05, "quality_s": 0.000895375, "scan_s": 0.06698633100000001, "split_s": 0.146154164, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.030023256006570825} +3 {"call": 3, "threads": 12, "refine_s": 0.24248583300504833, "legalise_s": 2.1333e-05, "quality_s": 0.000917834, "scan_s": 0.066336916, "split_s": 0.14510011900000003, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.030109631005048293} +3 {"call": 4, "threads": 12, "refine_s": 0.2405865829787217, "legalise_s": 2.1458e-05, "quality_s": 0.000895042, "scan_s": 0.06714033300000004, "split_s": 0.14270004299999997, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.0298297069787217} +3 {"call": 0, "threads": 16, "refine_s": 0.23866275005275384, "legalise_s": 2.3541e-05, "quality_s": 0.000905375, "scan_s": 0.060047498, "split_s": 0.14538304500000007, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.03230329105275376} +3 {"call": 1, "threads": 16, "refine_s": 0.23589675000403076, "legalise_s": 2.1125e-05, "quality_s": 0.000897458, "scan_s": 0.05815853900000001, "split_s": 0.146081548, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.03073808000403075} +3 {"call": 2, "threads": 16, "refine_s": 0.2387392080272548, "legalise_s": 2.3042e-05, "quality_s": 0.000892417, "scan_s": 0.060996796, "split_s": 0.14693733300000003, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.02988962002725476} +3 {"call": 3, "threads": 16, "refine_s": 0.23674025002401322, "legalise_s": 2.2042e-05, "quality_s": 0.000875166, "scan_s": 0.059896792000000004, "split_s": 0.14570850000000002, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.030237750024013188} +3 {"call": 4, "threads": 16, "refine_s": 0.23524224996799603, "legalise_s": 2.1292e-05, "quality_s": 0.000887125, "scan_s": 0.05770720699999998, "split_s": 0.14695904099999998, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.02966758496799607} +3 {"call": 0, "threads": 20, "refine_s": 0.25150975002907217, "legalise_s": 1.9916e-05, "quality_s": 0.000895, "scan_s": 0.06764587499999998, "split_s": 0.150805959, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.03214300002907222} +3 {"call": 1, "threads": 20, "refine_s": 0.2348791669937782, "legalise_s": 2.3208e-05, "quality_s": 0.000880625, "scan_s": 0.06064646400000002, "split_s": 0.14279583199999993, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.030533037993778267} +3 {"call": 2, "threads": 20, "refine_s": 0.23168766597518697, "legalise_s": 2.075e-05, "quality_s": 0.000879708, "scan_s": 0.061526919000000006, "split_s": 0.139394293, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.029865995975186937} +3 {"call": 3, "threads": 20, "refine_s": 0.23525329196127132, "legalise_s": 2.0667e-05, "quality_s": 0.000878917, "scan_s": 0.06274278900000001, "split_s": 0.14198571000000001, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.02962520896127127} +3 {"call": 4, "threads": 20, "refine_s": 0.2378742080181837, "legalise_s": 2.2e-05, "quality_s": 0.000924833, "scan_s": 0.061732751, "split_s": 0.14536083000000002, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.029833794018183674} diff --git a/docs/benchmarks/2026-09-27/serial-profile/data/phases_sweep2_battery.pmset b/docs/benchmarks/2026-09-27/serial-profile/data/phases_sweep2_battery.pmset new file mode 100644 index 00000000..0bfd9d9c --- /dev/null +++ b/docs/benchmarks/2026-09-27/serial-profile/data/phases_sweep2_battery.pmset @@ -0,0 +1,4 @@ +Now drawing from 'Battery Power' + -InternalBattery-0 (id=7929955) 84%; discharging; 6:25 remaining present: true +Now drawing from 'Battery Power' + -InternalBattery-0 (id=7929955) 83%; discharging; 6:25 remaining present: true diff --git a/docs/benchmarks/2026-09-27/serial-profile/data/phases_sweep2_battery.txt b/docs/benchmarks/2026-09-27/serial-profile/data/phases_sweep2_battery.txt new file mode 100644 index 00000000..ee41b3f4 --- /dev/null +++ b/docs/benchmarks/2026-09-27/serial-profile/data/phases_sweep2_battery.txt @@ -0,0 +1,180 @@ +1 {"call": 0, "threads": 1, "refine_s": 0.4615750419907272, "legalise_s": 2.0042e-05, "quality_s": 0.000920041, "scan_s": 0.30173233299999996, "split_s": 0.12796241899999997, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.030940206990727276} +1 {"call": 1, "threads": 1, "refine_s": 0.4652271250379272, "legalise_s": 2.1959e-05, "quality_s": 0.00088875, "scan_s": 0.305904335, "split_s": 0.12823079200000004, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.030181289037927106} +1 {"call": 2, "threads": 1, "refine_s": 0.4595770830055699, "legalise_s": 2.1834e-05, "quality_s": 0.000887291, "scan_s": 0.303479502, "split_s": 0.125998667, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.029189789005569844} +1 {"call": 3, "threads": 1, "refine_s": 0.4576998749980703, "legalise_s": 2.1125e-05, "quality_s": 0.0008765, "scan_s": 0.301962373, "split_s": 0.12611262599999995, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.02872725099807033} +1 {"call": 4, "threads": 1, "refine_s": 0.46068862499669194, "legalise_s": 2.1541e-05, "quality_s": 0.000883875, "scan_s": 0.30364620800000003, "split_s": 0.127793337, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.028343663996691915} +1 {"call": 0, "threads": 2, "refine_s": 0.3439762080088258, "legalise_s": 2.0208e-05, "quality_s": 0.000880459, "scan_s": 0.181891671, "split_s": 0.1299837070000001, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.031200163008825665} +1 {"call": 1, "threads": 2, "refine_s": 0.3305475839879364, "legalise_s": 2.0625e-05, "quality_s": 0.000881208, "scan_s": 0.17415324999999995, "split_s": 0.12626633799999998, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.029226162987936427} +1 {"call": 2, "threads": 2, "refine_s": 0.32988270797068253, "legalise_s": 2.0417e-05, "quality_s": 0.000879167, "scan_s": 0.174172915, "split_s": 0.12611920899999998, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.02869099997068253} +1 {"call": 3, "threads": 2, "refine_s": 0.3310227500041947, "legalise_s": 2.0542e-05, "quality_s": 0.00088025, "scan_s": 0.17442670799999999, "split_s": 0.12651774600000001, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.029177504004194638} +1 {"call": 4, "threads": 2, "refine_s": 0.3319471249706112, "legalise_s": 2.0958e-05, "quality_s": 0.000891542, "scan_s": 0.17545416900000002, "split_s": 0.12636116700000002, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.0292192889706111} +1 {"call": 0, "threads": 3, "refine_s": 0.29033295897534117, "legalise_s": 2.0042e-05, "quality_s": 0.0008835, "scan_s": 0.12711845500000005, "split_s": 0.130925461, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.03138550097534115} +1 {"call": 1, "threads": 3, "refine_s": 0.2791232090094127, "legalise_s": 2.2167e-05, "quality_s": 0.000877333, "scan_s": 0.12265650099999997, "split_s": 0.12613649399999996, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.029430714009412745} +1 {"call": 2, "threads": 3, "refine_s": 0.27761391701642424, "legalise_s": 2.0417e-05, "quality_s": 0.000877917, "scan_s": 0.12264075099999999, "split_s": 0.12537075000000006, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.028704082016424187} +1 {"call": 3, "threads": 3, "refine_s": 0.3074773330008611, "legalise_s": 2.0666e-05, "quality_s": 0.000870083, "scan_s": 0.135147542, "split_s": 0.14179246000000004, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.029646582000861038} +1 {"call": 4, "threads": 3, "refine_s": 0.28597462497418746, "legalise_s": 2.0833e-05, "quality_s": 0.000885958, "scan_s": 0.12728175400000002, "split_s": 0.12883567000000004, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.02895040997418738} +1 {"call": 0, "threads": 4, "refine_s": 0.27553816698491573, "legalise_s": 4.4959e-05, "quality_s": 0.000898209, "scan_s": 0.10417029300000001, "split_s": 0.13902829100000005, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.03139641498491566} +1 {"call": 1, "threads": 4, "refine_s": 0.2680640839971602, "legalise_s": 2.4583e-05, "quality_s": 0.000936083, "scan_s": 0.10038604300000001, "split_s": 0.13627945700000002, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.03043791799716017} +1 {"call": 2, "threads": 4, "refine_s": 0.26461812504567206, "legalise_s": 2.0833e-05, "quality_s": 0.000912625, "scan_s": 0.09904933199999998, "split_s": 0.134844748, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.029790587045672084} +1 {"call": 3, "threads": 4, "refine_s": 0.2693302920088172, "legalise_s": 2.1458e-05, "quality_s": 0.000891625, "scan_s": 0.102453459, "split_s": 0.135788915, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.030174835008817208} +1 {"call": 4, "threads": 4, "refine_s": 0.2654842500342056, "legalise_s": 2.075e-05, "quality_s": 0.00089475, "scan_s": 0.10040274799999999, "split_s": 0.13515962799999995, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.029006374034205668} +1 {"call": 0, "threads": 5, "refine_s": 0.25246879196492955, "legalise_s": 2.1208e-05, "quality_s": 0.000891417, "scan_s": 0.08174804, "split_s": 0.138072128, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.03173599896492957} +1 {"call": 1, "threads": 5, "refine_s": 0.24935733299935237, "legalise_s": 2.2959e-05, "quality_s": 0.000889125, "scan_s": 0.082313289, "split_s": 0.13609112599999998, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.030040833999352395} +1 {"call": 2, "threads": 5, "refine_s": 0.2559714579838328, "legalise_s": 2.1625e-05, "quality_s": 0.000889542, "scan_s": 0.08736574899999998, "split_s": 0.13700687399999997, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.030687667983832795} +1 {"call": 3, "threads": 5, "refine_s": 0.2508187920320779, "legalise_s": 2.1208e-05, "quality_s": 0.000914625, "scan_s": 0.08255700099999998, "split_s": 0.13756149799999998, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.029764460032077972} +1 {"call": 4, "threads": 5, "refine_s": 0.24719408300006762, "legalise_s": 2.0459e-05, "quality_s": 0.000889334, "scan_s": 0.08235862399999999, "split_s": 0.13489958200000007, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.029026084000067565} +1 {"call": 0, "threads": 6, "refine_s": 0.24029158300254494, "legalise_s": 1.9959e-05, "quality_s": 0.000901917, "scan_s": 0.070189004, "split_s": 0.13757495799999997, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.031605745002544955} +1 {"call": 1, "threads": 6, "refine_s": 0.23772554198512807, "legalise_s": 2.2625e-05, "quality_s": 0.00090425, "scan_s": 0.07050383400000002, "split_s": 0.13626621100000005, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.030028621985128012} +1 {"call": 2, "threads": 6, "refine_s": 0.23596954200183973, "legalise_s": 2.1667e-05, "quality_s": 0.000878291, "scan_s": 0.070164538, "split_s": 0.135677918, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.029227128001839714} +1 {"call": 3, "threads": 6, "refine_s": 0.23899174999678507, "legalise_s": 2.0833e-05, "quality_s": 0.000893375, "scan_s": 0.071249747, "split_s": 0.13662712100000002, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.030200673996785055} +1 {"call": 4, "threads": 6, "refine_s": 0.23843333398690447, "legalise_s": 2.1875e-05, "quality_s": 0.000887041, "scan_s": 0.070612376, "split_s": 0.1372944990000001, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.02961754298690436} +1 {"call": 0, "threads": 7, "refine_s": 0.23552591702900827, "legalise_s": 2.0792e-05, "quality_s": 0.000884209, "scan_s": 0.064367212, "split_s": 0.13878045900000005, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.03147324502900825} +1 {"call": 1, "threads": 7, "refine_s": 0.23944070801371709, "legalise_s": 2.2292e-05, "quality_s": 0.000889458, "scan_s": 0.07009296000000001, "split_s": 0.137939292, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.030496706013717068} +1 {"call": 2, "threads": 7, "refine_s": 0.23284129198873416, "legalise_s": 2.0542e-05, "quality_s": 0.00090375, "scan_s": 0.06562229199999998, "split_s": 0.13670483499999997, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.029589872988734167} +1 {"call": 3, "threads": 7, "refine_s": 0.23174966702936217, "legalise_s": 2.025e-05, "quality_s": 0.000901833, "scan_s": 0.06538241700000003, "split_s": 0.13634841700000008, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.029096750029362073} +1 {"call": 4, "threads": 7, "refine_s": 0.23058195802150294, "legalise_s": 2.0041e-05, "quality_s": 0.00089225, "scan_s": 0.06490820799999998, "split_s": 0.13576820499999998, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.02899325402150299} +1 {"call": 0, "threads": 8, "refine_s": 0.23202716698870063, "legalise_s": 2.1542e-05, "quality_s": 0.000888291, "scan_s": 0.06027145599999999, "split_s": 0.13907008599999995, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.03177579198870065} +1 {"call": 1, "threads": 8, "refine_s": 0.2287233749520965, "legalise_s": 2.4375e-05, "quality_s": 0.000887917, "scan_s": 0.06053733099999997, "split_s": 0.137374791, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.029898960952096543} +1 {"call": 2, "threads": 8, "refine_s": 0.22708195797167718, "legalise_s": 2.45e-05, "quality_s": 0.000903625, "scan_s": 0.060798709000000006, "split_s": 0.13634149799999998, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.029013625971677198} +1 {"call": 3, "threads": 8, "refine_s": 0.23520008299965411, "legalise_s": 2.1875e-05, "quality_s": 0.000888375, "scan_s": 0.064617125, "split_s": 0.13955754199999998, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.030115165999654137} +1 {"call": 4, "threads": 8, "refine_s": 0.22810624999692664, "legalise_s": 2.3042e-05, "quality_s": 0.000906875, "scan_s": 0.060910999999999986, "split_s": 0.136384248, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.029881084996926627} +1 {"call": 0, "threads": 10, "refine_s": 0.24039783305488527, "legalise_s": 2.1459e-05, "quality_s": 0.000876542, "scan_s": 0.062414120999999996, "split_s": 0.14517000399999994, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.031915707054885334} +1 {"call": 1, "threads": 10, "refine_s": 0.2347222090465948, "legalise_s": 2.225e-05, "quality_s": 0.000890625, "scan_s": 0.06292428600000001, "split_s": 0.140675996, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.03020905204659477} +1 {"call": 2, "threads": 10, "refine_s": 0.2364597080159001, "legalise_s": 2.1375e-05, "quality_s": 0.000874792, "scan_s": 0.06319358200000003, "split_s": 0.14247895600000002, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.02989100301590006} +1 {"call": 3, "threads": 10, "refine_s": 0.2369808749645017, "legalise_s": 2.3417e-05, "quality_s": 0.000895959, "scan_s": 0.06356592300000001, "split_s": 0.14302991400000004, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.029465661964501677} +1 {"call": 4, "threads": 10, "refine_s": 0.2359141670167446, "legalise_s": 2.3583e-05, "quality_s": 0.000893042, "scan_s": 0.06381858500000002, "split_s": 0.14164458099999994, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.029534376016744635} +1 {"call": 0, "threads": 12, "refine_s": 0.23899833299219608, "legalise_s": 3.3208e-05, "quality_s": 0.000913666, "scan_s": 0.06150616499999999, "split_s": 0.14514504200000009, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.03140025199219601} +1 {"call": 1, "threads": 12, "refine_s": 0.2366345840273425, "legalise_s": 2.075e-05, "quality_s": 0.000888584, "scan_s": 0.061922831999999976, "split_s": 0.14366649799999995, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.030135920027342555} +1 {"call": 2, "threads": 12, "refine_s": 0.23450233304174617, "legalise_s": 2.0708e-05, "quality_s": 0.000887625, "scan_s": 0.06217641499999999, "split_s": 0.14189545999999997, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.0295221250417462} +1 {"call": 3, "threads": 12, "refine_s": 0.23230654204962775, "legalise_s": 2.1e-05, "quality_s": 0.000891792, "scan_s": 0.061723956, "split_s": 0.13967225300000002, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.029997541049627735} +1 {"call": 4, "threads": 12, "refine_s": 0.23536020901519805, "legalise_s": 2.2666e-05, "quality_s": 0.000895042, "scan_s": 0.062313625000000004, "split_s": 0.142275835, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.029853041015198034} +1 {"call": 0, "threads": 16, "refine_s": 0.2322447079932317, "legalise_s": 2.025e-05, "quality_s": 0.00088375, "scan_s": 0.05476971, "split_s": 0.14469162700000002, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.03187937099323171} +1 {"call": 1, "threads": 16, "refine_s": 0.22964375000447035, "legalise_s": 2.35e-05, "quality_s": 0.000901708, "scan_s": 0.05410138399999999, "split_s": 0.14412746, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.03048969800447035} +1 {"call": 2, "threads": 16, "refine_s": 0.22719762497581542, "legalise_s": 2.1208e-05, "quality_s": 0.000892167, "scan_s": 0.05375125000000001, "split_s": 0.14259733300000002, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.0299356669758154} +1 {"call": 3, "threads": 16, "refine_s": 0.22790125000756234, "legalise_s": 2.0625e-05, "quality_s": 0.000895542, "scan_s": 0.054681501000000014, "split_s": 0.14297629199999995, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.029327290007562373} +1 {"call": 4, "threads": 16, "refine_s": 0.22710162500152364, "legalise_s": 2.1083e-05, "quality_s": 0.000891166, "scan_s": 0.054474291, "split_s": 0.14268358499999997, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.029031500001523658} +1 {"call": 0, "threads": 20, "refine_s": 0.23617254197597504, "legalise_s": 2.0084e-05, "quality_s": 0.000886209, "scan_s": 0.05750916300000001, "split_s": 0.14561008400000006, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.032147001975974976} +1 {"call": 1, "threads": 20, "refine_s": 0.23235595895675942, "legalise_s": 2.2e-05, "quality_s": 0.000885166, "scan_s": 0.057623875000000005, "split_s": 0.143371293, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.030453624956759406} +1 {"call": 2, "threads": 20, "refine_s": 0.22895079100271687, "legalise_s": 2.2292e-05, "quality_s": 0.000901167, "scan_s": 0.056930375, "split_s": 0.14165853600000003, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.02943842100271682} +1 {"call": 3, "threads": 20, "refine_s": 0.22853837499860674, "legalise_s": 2.0541e-05, "quality_s": 0.000881125, "scan_s": 0.05696562399999999, "split_s": 0.14127249999999997, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.029398584998606758} +1 {"call": 4, "threads": 20, "refine_s": 0.23049350001383573, "legalise_s": 2.1084e-05, "quality_s": 0.000891666, "scan_s": 0.05780937299999999, "split_s": 0.14227358000000004, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.029497797013835675} +2 {"call": 0, "threads": 1, "refine_s": 0.4665846669813618, "legalise_s": 2.075e-05, "quality_s": 0.000887625, "scan_s": 0.30489799700000003, "split_s": 0.12952458199999992, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.03125371298136184} +2 {"call": 1, "threads": 1, "refine_s": 0.46602029202040285, "legalise_s": 2.3875e-05, "quality_s": 0.000891334, "scan_s": 0.30596975, "split_s": 0.129724371, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.02941096202040283} +2 {"call": 2, "threads": 1, "refine_s": 0.4623513330006972, "legalise_s": 2.1042e-05, "quality_s": 0.000885625, "scan_s": 0.30739949900000013, "split_s": 0.125287916, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.028757251000697037} +2 {"call": 3, "threads": 1, "refine_s": 0.4624757500132546, "legalise_s": 2.1584e-05, "quality_s": 0.000878417, "scan_s": 0.305010623, "split_s": 0.12716929200000004, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.029395834013254518} +2 {"call": 4, "threads": 1, "refine_s": 0.45756049995543435, "legalise_s": 2.075e-05, "quality_s": 0.000899833, "scan_s": 0.3020984979999998, "split_s": 0.12578837599999995, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.028753042955434543} +2 {"call": 0, "threads": 2, "refine_s": 0.33475491602439433, "legalise_s": 2.0417e-05, "quality_s": 0.000895166, "scan_s": 0.17445304400000003, "split_s": 0.12870566599999997, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.030680623024394338} +2 {"call": 1, "threads": 2, "refine_s": 0.33215841598575935, "legalise_s": 2.2791e-05, "quality_s": 0.000880042, "scan_s": 0.17397874700000004, "split_s": 0.12721775, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.030059085985759265} +2 {"call": 2, "threads": 2, "refine_s": 0.3325220000115223, "legalise_s": 2.1125e-05, "quality_s": 0.000874125, "scan_s": 0.176312292, "split_s": 0.12611783200000004, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.02919662601152226} +2 {"call": 3, "threads": 2, "refine_s": 0.32991404202766716, "legalise_s": 2.1125e-05, "quality_s": 0.00090125, "scan_s": 0.17419229100000003, "split_s": 0.12580912500000002, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.028990251027667086} +2 {"call": 4, "threads": 2, "refine_s": 0.3285255830269307, "legalise_s": 2.1084e-05, "quality_s": 0.000877958, "scan_s": 0.17356954300000005, "split_s": 0.12558458300000006, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.02847241502693057} +2 {"call": 0, "threads": 3, "refine_s": 0.282797040999867, "legalise_s": 2.025e-05, "quality_s": 0.000882208, "scan_s": 0.12229991500000002, "split_s": 0.128919923, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.030674744999867} +2 {"call": 1, "threads": 3, "refine_s": 0.28037487500114366, "legalise_s": 2.0417e-05, "quality_s": 0.000881375, "scan_s": 0.12262916500000004, "split_s": 0.127293168, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.0295507500011436} +2 {"call": 2, "threads": 3, "refine_s": 0.2888080829870887, "legalise_s": 2.0959e-05, "quality_s": 0.0008855, "scan_s": 0.13019229200000004, "split_s": 0.12801845800000003, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.029690873987088667} +2 {"call": 3, "threads": 3, "refine_s": 0.2853393330005929, "legalise_s": 2.025e-05, "quality_s": 0.000900625, "scan_s": 0.12498974999999998, "split_s": 0.13016408300000004, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.029264625000592875} +2 {"call": 4, "threads": 3, "refine_s": 0.27993474999675527, "legalise_s": 2.0709e-05, "quality_s": 0.000912667, "scan_s": 0.123301041, "split_s": 0.12690308500000003, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.02879724799675526} +2 {"call": 0, "threads": 4, "refine_s": 0.27590224996674806, "legalise_s": 2.2708e-05, "quality_s": 0.000899625, "scan_s": 0.10605850000000001, "split_s": 0.13721316899999997, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.03170824796674809} +2 {"call": 1, "threads": 4, "refine_s": 0.26596887496998534, "legalise_s": 2.2042e-05, "quality_s": 0.000887625, "scan_s": 0.09960291400000001, "split_s": 0.13561587200000003, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.029840421969985292} +2 {"call": 2, "threads": 4, "refine_s": 0.26386937499046326, "legalise_s": 2.1208e-05, "quality_s": 0.000885667, "scan_s": 0.09884541800000002, "split_s": 0.134923789, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.029193292990463277} +2 {"call": 3, "threads": 4, "refine_s": 0.2644589169649407, "legalise_s": 2.0625e-05, "quality_s": 0.000880416, "scan_s": 0.09857921100000001, "split_s": 0.135881001, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.029097663964940734} +2 {"call": 4, "threads": 4, "refine_s": 0.26471045799553394, "legalise_s": 2.0834e-05, "quality_s": 0.000923, "scan_s": 0.09929033399999998, "split_s": 0.135313748, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.02916254199553392} +2 {"call": 0, "threads": 5, "refine_s": 0.2518885000026785, "legalise_s": 2.0542e-05, "quality_s": 0.000884125, "scan_s": 0.08200475000000003, "split_s": 0.137463335, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.03151574800267845} +2 {"call": 1, "threads": 5, "refine_s": 0.2533547499915585, "legalise_s": 2.0792e-05, "quality_s": 0.000917208, "scan_s": 0.084664457, "split_s": 0.13719108500000002, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.03056120799155848} +2 {"call": 2, "threads": 5, "refine_s": 0.2505539170233533, "legalise_s": 2.0583e-05, "quality_s": 0.000895, "scan_s": 0.08401942000000003, "split_s": 0.13587499900000002, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.02974391502335319} +2 {"call": 3, "threads": 5, "refine_s": 0.2476296669919975, "legalise_s": 2.0541e-05, "quality_s": 0.000888708, "scan_s": 0.08267970699999995, "split_s": 0.134977916, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.02906279499199757} +2 {"call": 4, "threads": 5, "refine_s": 0.2465227910433896, "legalise_s": 2.0917e-05, "quality_s": 0.000902625, "scan_s": 0.08240241899999996, "split_s": 0.13417171000000003, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.029025120043389613} +2 {"call": 0, "threads": 6, "refine_s": 0.24213445896748453, "legalise_s": 2.15e-05, "quality_s": 0.000896208, "scan_s": 0.070456875, "split_s": 0.13872466300000003, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.03203521296748449} +2 {"call": 1, "threads": 6, "refine_s": 0.23689558397745714, "legalise_s": 2.7209e-05, "quality_s": 0.000897833, "scan_s": 0.07007070799999998, "split_s": 0.13566624900000002, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.03023358497745715} +2 {"call": 2, "threads": 6, "refine_s": 0.2353702500113286, "legalise_s": 2.0584e-05, "quality_s": 0.000901334, "scan_s": 0.070751162, "split_s": 0.13428179199999998, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.029415378011328625} +2 {"call": 3, "threads": 6, "refine_s": 0.23899320903001353, "legalise_s": 2.0625e-05, "quality_s": 0.000894917, "scan_s": 0.071702749, "split_s": 0.13647079100000004, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.029904127030013494} +2 {"call": 4, "threads": 6, "refine_s": 0.23737104202155024, "legalise_s": 2.3375e-05, "quality_s": 0.000896333, "scan_s": 0.071147123, "split_s": 0.13586362300000007, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.029440588021550168} +2 {"call": 0, "threads": 7, "refine_s": 0.23560545803047717, "legalise_s": 2.0958e-05, "quality_s": 0.000898333, "scan_s": 0.06437774900000003, "split_s": 0.13873741899999997, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.031570999030477165} +2 {"call": 1, "threads": 7, "refine_s": 0.23471379198599607, "legalise_s": 2.0833e-05, "quality_s": 0.000881291, "scan_s": 0.06561707900000001, "split_s": 0.137556502, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.030638086985996044} +2 {"call": 2, "threads": 7, "refine_s": 0.2313125419896096, "legalise_s": 2.2875e-05, "quality_s": 0.000895417, "scan_s": 0.06508141900000003, "split_s": 0.13585716300000003, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.029455667989609524} +2 {"call": 3, "threads": 7, "refine_s": 0.23001045803539455, "legalise_s": 2.1125e-05, "quality_s": 0.000896916, "scan_s": 0.06466766699999998, "split_s": 0.135343127, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.02908162303539455} +2 {"call": 4, "threads": 7, "refine_s": 0.22957745904568583, "legalise_s": 2.1375e-05, "quality_s": 0.00088675, "scan_s": 0.06469691599999998, "split_s": 0.13507491199999994, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.028897506045685917} +2 {"call": 0, "threads": 8, "refine_s": 0.23198575002606958, "legalise_s": 1.9958e-05, "quality_s": 0.000892375, "scan_s": 0.060627916999999996, "split_s": 0.13912954500000002, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.03131595502606957} +2 {"call": 1, "threads": 8, "refine_s": 0.22814858303172514, "legalise_s": 2.1e-05, "quality_s": 0.000899875, "scan_s": 0.060303459000000004, "split_s": 0.13693429, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.02998995903172516} +2 {"call": 2, "threads": 8, "refine_s": 0.2259831249830313, "legalise_s": 2.075e-05, "quality_s": 0.00089875, "scan_s": 0.060862207999999994, "split_s": 0.13505241899999998, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.029148997983031305} +2 {"call": 3, "threads": 8, "refine_s": 0.23034075001487508, "legalise_s": 2.3375e-05, "quality_s": 0.000880166, "scan_s": 0.060984836, "split_s": 0.138589875, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.02986249801487509} +2 {"call": 4, "threads": 8, "refine_s": 0.22706887498497963, "legalise_s": 2.1292e-05, "quality_s": 0.000898625, "scan_s": 0.06070616700000002, "split_s": 0.13590525, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.0295375409849796} +2 {"call": 0, "threads": 10, "refine_s": 0.23814800003310665, "legalise_s": 2.0084e-05, "quality_s": 0.000888041, "scan_s": 0.062830922, "split_s": 0.14235346200000004, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.03205549103310662} +2 {"call": 1, "threads": 10, "refine_s": 0.2353200830402784, "legalise_s": 2.325e-05, "quality_s": 0.000893833, "scan_s": 0.064606792, "split_s": 0.139294165, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.030502043040278398} +2 {"call": 2, "threads": 10, "refine_s": 0.23186591599369422, "legalise_s": 2.1125e-05, "quality_s": 0.00088875, "scan_s": 0.06455196300000002, "split_s": 0.136717248, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.02968682999369418} +2 {"call": 3, "threads": 10, "refine_s": 0.22831187502015382, "legalise_s": 2.0917e-05, "quality_s": 0.000887167, "scan_s": 0.061685331999999996, "split_s": 0.136385917, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.029332542020153812} +2 {"call": 4, "threads": 10, "refine_s": 0.22772212495328858, "legalise_s": 2.1125e-05, "quality_s": 0.000883958, "scan_s": 0.062737001, "split_s": 0.13493683000000006, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.029143210953288534} +2 {"call": 0, "threads": 12, "refine_s": 0.2340913750231266, "legalise_s": 1.9667e-05, "quality_s": 0.000889416, "scan_s": 0.062119542999999985, "split_s": 0.13899808700000005, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.03206466202312658} +2 {"call": 1, "threads": 12, "refine_s": 0.229110624990426, "legalise_s": 2.1416e-05, "quality_s": 0.000891292, "scan_s": 0.061307378, "split_s": 0.13669958200000004, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.030190956990425982} +2 {"call": 2, "threads": 12, "refine_s": 0.23273270798381418, "legalise_s": 2.0625e-05, "quality_s": 0.000882958, "scan_s": 0.062943621, "split_s": 0.13889483499999994, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.02999066898381425} +2 {"call": 3, "threads": 12, "refine_s": 0.23343095800373703, "legalise_s": 2.0375e-05, "quality_s": 0.000891541, "scan_s": 0.06230912199999999, "split_s": 0.140259123, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.02995079700373704} +2 {"call": 4, "threads": 12, "refine_s": 0.23466762504540384, "legalise_s": 2.1833e-05, "quality_s": 0.000887542, "scan_s": 0.06277196099999997, "split_s": 0.14171787799999994, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.029268411045403925} +2 {"call": 0, "threads": 16, "refine_s": 0.2296333749545738, "legalise_s": 2.025e-05, "quality_s": 0.000888, "scan_s": 0.05369174999999999, "split_s": 0.143571461, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.03146191395457382} +2 {"call": 1, "threads": 16, "refine_s": 0.22205983300227672, "legalise_s": 2.15e-05, "quality_s": 0.000879167, "scan_s": 0.053316252, "split_s": 0.1380117499999999, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.02983116400227681} +2 {"call": 2, "threads": 16, "refine_s": 0.2251115419785492, "legalise_s": 2.1208e-05, "quality_s": 0.000885708, "scan_s": 0.05356474800000001, "split_s": 0.14087154199999996, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.02976833597854922} +2 {"call": 3, "threads": 16, "refine_s": 0.2278490000171587, "legalise_s": 2.1125e-05, "quality_s": 0.000879125, "scan_s": 0.053857124000000006, "split_s": 0.14371420700000004, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.029377419017158624} +2 {"call": 4, "threads": 16, "refine_s": 0.22679941600654274, "legalise_s": 2.0541e-05, "quality_s": 0.000885042, "scan_s": 0.054560500000000005, "split_s": 0.14185024999999996, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.02948308300654276} +2 {"call": 0, "threads": 20, "refine_s": 0.2345334580168128, "legalise_s": 2.4208e-05, "quality_s": 0.000898958, "scan_s": 0.05650770999999999, "split_s": 0.144802956, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.0322996260168128} +2 {"call": 1, "threads": 20, "refine_s": 0.23182345897657797, "legalise_s": 2.0292e-05, "quality_s": 0.000885292, "scan_s": 0.05623333300000001, "split_s": 0.14445558600000002, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.03022895597657793} +2 {"call": 2, "threads": 20, "refine_s": 0.22997562505770475, "legalise_s": 2.0375e-05, "quality_s": 0.000891041, "scan_s": 0.05677579400000001, "split_s": 0.14273575099999997, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.029552664057704764} +2 {"call": 3, "threads": 20, "refine_s": 0.22738816699711606, "legalise_s": 2.0375e-05, "quality_s": 0.000880167, "scan_s": 0.05676545599999998, "split_s": 0.14049337200000003, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.029228796997116085} +2 {"call": 4, "threads": 20, "refine_s": 0.22966579196508974, "legalise_s": 2.0167e-05, "quality_s": 0.000900417, "scan_s": 0.05707012499999999, "split_s": 0.141096248, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.030578834965089757} +3 {"call": 0, "threads": 1, "refine_s": 0.46378079196438193, "legalise_s": 2.0458e-05, "quality_s": 0.000896, "scan_s": 0.30279967000000013, "split_s": 0.1292550819999999, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.030809581964381882} +3 {"call": 1, "threads": 1, "refine_s": 0.4717817499767989, "legalise_s": 2.1542e-05, "quality_s": 0.000893291, "scan_s": 0.3107984180000001, "split_s": 0.12989924900000002, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.03016924997679879} +3 {"call": 2, "threads": 1, "refine_s": 0.458836333011277, "legalise_s": 2.1667e-05, "quality_s": 0.000901417, "scan_s": 0.302605835, "split_s": 0.126152212, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.029155202011277} +3 {"call": 3, "threads": 1, "refine_s": 0.4592493330128491, "legalise_s": 2.075e-05, "quality_s": 0.000895125, "scan_s": 0.30320024799999995, "split_s": 0.12649800100000005, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.028635209012849078} +3 {"call": 4, "threads": 1, "refine_s": 0.4592897500260733, "legalise_s": 2.0709e-05, "quality_s": 0.000885792, "scan_s": 0.302991838, "split_s": 0.126431667, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.028959744026073292} +3 {"call": 0, "threads": 2, "refine_s": 0.34135162498569116, "legalise_s": 1.9875e-05, "quality_s": 0.000884541, "scan_s": 0.17654337900000003, "split_s": 0.13189029200000002, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.03201353798569109} +3 {"call": 1, "threads": 2, "refine_s": 0.3320862500113435, "legalise_s": 2.1292e-05, "quality_s": 0.000880416, "scan_s": 0.17432149999999993, "split_s": 0.127495834, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.02936720801134357} +3 {"call": 2, "threads": 2, "refine_s": 0.3344186249887571, "legalise_s": 2.1167e-05, "quality_s": 0.000887042, "scan_s": 0.176994992, "split_s": 0.12737249899999994, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.029142924988757146} +3 {"call": 3, "threads": 2, "refine_s": 0.33069650002289563, "legalise_s": 2.1208e-05, "quality_s": 0.000889541, "scan_s": 0.17440666300000005, "split_s": 0.126240835, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.029138253022895605} +3 {"call": 4, "threads": 2, "refine_s": 0.3332385420217179, "legalise_s": 2.1e-05, "quality_s": 0.000882208, "scan_s": 0.177336708, "split_s": 0.12631253999999997, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.028686086021717905} +3 {"call": 0, "threads": 3, "refine_s": 0.2839579579886049, "legalise_s": 2.2291e-05, "quality_s": 0.00089775, "scan_s": 0.124192996, "split_s": 0.128236293, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.03060862798860492} +3 {"call": 1, "threads": 3, "refine_s": 0.27958541695261374, "legalise_s": 2.2041e-05, "quality_s": 0.000886792, "scan_s": 0.12250566299999996, "split_s": 0.12668891500000004, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.029482005952613743} +3 {"call": 2, "threads": 3, "refine_s": 0.28272225003456697, "legalise_s": 2.2083e-05, "quality_s": 0.000888084, "scan_s": 0.125470914, "split_s": 0.12750637700000003, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.02883479203456693} +3 {"call": 3, "threads": 3, "refine_s": 0.2851672079996206, "legalise_s": 2.2333e-05, "quality_s": 0.000910208, "scan_s": 0.12516991399999997, "split_s": 0.12879949699999999, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.030265255999620627} +3 {"call": 4, "threads": 3, "refine_s": 0.27877670800080523, "legalise_s": 2.0833e-05, "quality_s": 0.000881833, "scan_s": 0.12299858400000001, "split_s": 0.12573078999999998, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.02914466800080523} +3 {"call": 0, "threads": 4, "refine_s": 0.2724482499761507, "legalise_s": 2.0375e-05, "quality_s": 0.000888209, "scan_s": 0.10205032700000005, "split_s": 0.13784391700000004, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.03164542197615061} +3 {"call": 1, "threads": 4, "refine_s": 0.2665680830250494, "legalise_s": 2.1917e-05, "quality_s": 0.000890875, "scan_s": 0.099884957, "split_s": 0.13578525, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.02998508402504943} +3 {"call": 2, "threads": 4, "refine_s": 0.263807250012178, "legalise_s": 2.0083e-05, "quality_s": 0.000883375, "scan_s": 0.09912512400000002, "split_s": 0.13483325, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.028945418012177954} +3 {"call": 3, "threads": 4, "refine_s": 0.2675882910261862, "legalise_s": 2.5792e-05, "quality_s": 0.000881666, "scan_s": 0.10136645500000002, "split_s": 0.13597937300000004, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.029335005026186106} +3 {"call": 4, "threads": 4, "refine_s": 0.2644432920496911, "legalise_s": 2.0417e-05, "quality_s": 0.000892125, "scan_s": 0.100247, "split_s": 0.13414608400000005, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.029137666049691008} +3 {"call": 0, "threads": 5, "refine_s": 0.2529825000092387, "legalise_s": 2.2875e-05, "quality_s": 0.000891083, "scan_s": 0.08242875100000002, "split_s": 0.13824225000000004, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.031397541009238666} +3 {"call": 1, "threads": 5, "refine_s": 0.25305170798674226, "legalise_s": 2.1167e-05, "quality_s": 0.000884791, "scan_s": 0.08374695799999998, "split_s": 0.13811159000000003, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.030287201986742257} +3 {"call": 2, "threads": 5, "refine_s": 0.25059833395062014, "legalise_s": 2.6625e-05, "quality_s": 0.000906208, "scan_s": 0.08348629299999999, "split_s": 0.136430331, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.029748876950620173} +3 {"call": 3, "threads": 5, "refine_s": 0.24825733300531283, "legalise_s": 2.6e-05, "quality_s": 0.00090175, "scan_s": 0.08234516400000001, "split_s": 0.1358906679999999, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.02909375100531289} +3 {"call": 4, "threads": 5, "refine_s": 0.24790925002889708, "legalise_s": 2.0042e-05, "quality_s": 0.000872542, "scan_s": 0.08290395800000001, "split_s": 0.13520183400000005, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.028910874028897} +3 {"call": 0, "threads": 6, "refine_s": 0.24146824999479577, "legalise_s": 2e-05, "quality_s": 0.000882208, "scan_s": 0.07028232899999996, "split_s": 0.13871691499999997, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.031566797994795864} +3 {"call": 1, "threads": 6, "refine_s": 0.23781675001373515, "legalise_s": 2.125e-05, "quality_s": 0.000890209, "scan_s": 0.07060471100000003, "split_s": 0.13634966599999998, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.02995091401373512} +3 {"call": 2, "threads": 6, "refine_s": 0.23516179103171453, "legalise_s": 2.1e-05, "quality_s": 0.000879916, "scan_s": 0.070237291, "split_s": 0.134887791, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.029135793031714513} +3 {"call": 3, "threads": 6, "refine_s": 0.23892654199153185, "legalise_s": 2.1125e-05, "quality_s": 0.000882166, "scan_s": 0.07119462500000001, "split_s": 0.13706445400000003, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.029764171991531807} +3 {"call": 4, "threads": 6, "refine_s": 0.23728787497384474, "legalise_s": 2.0959e-05, "quality_s": 0.000896875, "scan_s": 0.07130250100000003, "split_s": 0.135490252, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.029577287973844707} +3 {"call": 0, "threads": 7, "refine_s": 0.2352980420109816, "legalise_s": 2.0375e-05, "quality_s": 0.0008945, "scan_s": 0.064540293, "split_s": 0.13819641500000002, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.03164645901098159} +3 {"call": 1, "threads": 7, "refine_s": 0.23594595800386742, "legalise_s": 2.85e-05, "quality_s": 0.000897667, "scan_s": 0.065567294, "split_s": 0.13860800000000004, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.030844497003867405} +3 {"call": 2, "threads": 7, "refine_s": 0.230860042036511, "legalise_s": 2.1875e-05, "quality_s": 0.000890333, "scan_s": 0.06514445699999999, "split_s": 0.13532083500000008, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.029482542036510934} +3 {"call": 3, "threads": 7, "refine_s": 0.23162095801671967, "legalise_s": 2.1333e-05, "quality_s": 0.000888, "scan_s": 0.06530458299999999, "split_s": 0.136192835, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.029214207016719673} +3 {"call": 4, "threads": 7, "refine_s": 0.23046599997906014, "legalise_s": 2.1666e-05, "quality_s": 0.000885584, "scan_s": 0.06519028699999997, "split_s": 0.13547603999999996, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.028892422979060195} +3 {"call": 0, "threads": 8, "refine_s": 0.23259995802072808, "legalise_s": 2.0209e-05, "quality_s": 0.000920709, "scan_s": 0.060071875999999996, "split_s": 0.14022450000000009, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.031362664020728015} +3 {"call": 1, "threads": 8, "refine_s": 0.23011187504744157, "legalise_s": 2.0667e-05, "quality_s": 0.00089, "scan_s": 0.06033454299999997, "split_s": 0.138892206, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.029974459047441615} +3 {"call": 2, "threads": 8, "refine_s": 0.22660287498729303, "legalise_s": 2.1375e-05, "quality_s": 0.000887791, "scan_s": 0.060096168, "split_s": 0.13672941899999996, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.028868121987293077} +3 {"call": 3, "threads": 8, "refine_s": 0.23060350003652275, "legalise_s": 2.1208e-05, "quality_s": 0.00088375, "scan_s": 0.061597456999999974, "split_s": 0.138446666, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.0296544190365228} +3 {"call": 4, "threads": 8, "refine_s": 0.2283104169764556, "legalise_s": 2.025e-05, "quality_s": 0.000893791, "scan_s": 0.060744962000000007, "split_s": 0.13729499499999998, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.029356418976455606} +3 {"call": 0, "threads": 10, "refine_s": 0.23939054197398946, "legalise_s": 2.0333e-05, "quality_s": 0.000897666, "scan_s": 0.061625162000000004, "split_s": 0.14487600299999995, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.031971377973989495} +3 {"call": 1, "threads": 10, "refine_s": 0.23791016597533599, "legalise_s": 2.1875e-05, "quality_s": 0.000890792, "scan_s": 0.06302724600000001, "split_s": 0.14337283000000003, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.030597422975335936} +3 {"call": 2, "threads": 10, "refine_s": 0.23585200001252815, "legalise_s": 2.7083e-05, "quality_s": 0.000919917, "scan_s": 0.062833666, "split_s": 0.14212000199999994, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.029951332012528226} +3 {"call": 3, "threads": 10, "refine_s": 0.23488895798800513, "legalise_s": 2.0958e-05, "quality_s": 0.000881958, "scan_s": 0.062534415, "split_s": 0.141570416, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.02988121098800514} +3 {"call": 4, "threads": 10, "refine_s": 0.23556437494698912, "legalise_s": 2.0916e-05, "quality_s": 0.000882917, "scan_s": 0.06323870799999999, "split_s": 0.14211645799999992, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.029305375946989204} +3 {"call": 0, "threads": 12, "refine_s": 0.238871332956478, "legalise_s": 2.1083e-05, "quality_s": 0.000878125, "scan_s": 0.06162704299999999, "split_s": 0.144684046, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.031661035956477984} +3 {"call": 1, "threads": 12, "refine_s": 0.23589524999260902, "legalise_s": 2.075e-05, "quality_s": 0.000889459, "scan_s": 0.06137391999999999, "split_s": 0.14314932899999996, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.03046179199260904} +3 {"call": 2, "threads": 12, "refine_s": 0.2337174159474671, "legalise_s": 2.1542e-05, "quality_s": 0.000894041, "scan_s": 0.061762539, "split_s": 0.14169741700000005, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.02934187694746701} +3 {"call": 3, "threads": 12, "refine_s": 0.2336065000272356, "legalise_s": 2.1083e-05, "quality_s": 0.00091525, "scan_s": 0.06162850200000001, "split_s": 0.14135733300000003, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.029684332027235555} +3 {"call": 4, "threads": 12, "refine_s": 0.23535408300813287, "legalise_s": 2.2125e-05, "quality_s": 0.000894375, "scan_s": 0.062191456, "split_s": 0.14233608500000006, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.029910042008132798} +3 {"call": 0, "threads": 16, "refine_s": 0.23140070895897225, "legalise_s": 2.0667e-05, "quality_s": 0.000884875, "scan_s": 0.05332917000000002, "split_s": 0.14548183399999995, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.03168416295897228} +3 {"call": 1, "threads": 16, "refine_s": 0.23060816701035947, "legalise_s": 2.2084e-05, "quality_s": 0.000888416, "scan_s": 0.05509633300000002, "split_s": 0.144083, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.030518334010359444} +3 {"call": 2, "threads": 16, "refine_s": 0.227152792038396, "legalise_s": 2.1834e-05, "quality_s": 0.000905416, "scan_s": 0.054422039, "split_s": 0.14224633100000003, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.029557172038395974} +3 {"call": 3, "threads": 16, "refine_s": 0.22747454198542982, "legalise_s": 2.3958e-05, "quality_s": 0.000889375, "scan_s": 0.05382979099999999, "split_s": 0.143378086, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.02935333198542986} +3 {"call": 4, "threads": 16, "refine_s": 0.22574133303714916, "legalise_s": 2.3541e-05, "quality_s": 0.000886833, "scan_s": 0.053708168, "split_s": 0.1418474970000001, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.02927529403714907} +3 {"call": 0, "threads": 20, "refine_s": 0.23078745900420472, "legalise_s": 2.0375e-05, "quality_s": 0.000892041, "scan_s": 0.056599544, "split_s": 0.14150016799999995, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.031775331004204765} +3 {"call": 1, "threads": 20, "refine_s": 0.2228740830323659, "legalise_s": 2.1792e-05, "quality_s": 0.000882916, "scan_s": 0.05653512599999999, "split_s": 0.13554537899999997, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.029888870032365927} +3 {"call": 2, "threads": 20, "refine_s": 0.22279516700655222, "legalise_s": 2.1792e-05, "quality_s": 0.000888208, "scan_s": 0.057040668000000024, "split_s": 0.135485211, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.029359288006552214} +3 {"call": 3, "threads": 20, "refine_s": 0.23134787497110665, "legalise_s": 2.075e-05, "quality_s": 0.00090175, "scan_s": 0.05739791499999999, "split_s": 0.14339320999999997, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.02963424997110667} +3 {"call": 4, "threads": 20, "refine_s": 0.23816108400933444, "legalise_s": 2.175e-05, "quality_s": 0.000887292, "scan_s": 0.06237579500000001, "split_s": 0.14388091699999997, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.030995330009334465} diff --git a/docs/benchmarks/2026-09-27/serial-profile/data/rounds_t1.md b/docs/benchmarks/2026-09-27/serial-profile/data/rounds_t1.md new file mode 100644 index 00000000..1b4cbcea --- /dev/null +++ b/docs/benchmarks/2026-09-27/serial-profile/data/rounds_t1.md @@ -0,0 +1,48 @@ +| round | active | marked | inserted | deferred (touched) | deferred (edge) | flips/ins mean | footprint mean | p50 | p99 | max | write set mean | ins. conflicting (fp) | conflict pairs (fp) | mean/max conflict degree (fp) | ins. conflicting (write-write) | earlier-overlap (fp) | median NN dist (nodes) | 64-blocks hit | max ins/block | +|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---| +| 1 | 1822 | 480 | 231 | 244 | 5 | 2.18 | 9.9 | 10 | 15 | 16 | 5.2 | 100 % | 747 | 6.5/15 | 96 % | 91 % | 26.9 | 116 | 5 | +| 2 | 955 | 915 | 398 | 499 | 18 | 2.38 | 10.4 | 10 | 16 | 20 | 5.4 | 100 % | 1369 | 6.9/14 | 89 % | 91 % | 19.1 | 152 | 9 | +| 3 | 1711 | 1648 | 724 | 887 | 37 | 2.44 | 10.7 | 10 | 18 | 20 | 5.5 | 100 % | 2745 | 7.6/16 | 91 % | 91 % | 13.9 | 194 | 17 | +| 4 | 3114 | 2940 | 1231 | 1615 | 94 | 2.43 | 10.9 | 10 | 20 | 22 | 5.5 | 100 % | 4739 | 7.7/18 | 91 % | 90 % | 10.0 | 219 | 25 | +| 5 | 5437 | 4997 | 2063 | 2717 | 217 | 2.42 | 11.0 | 10 | 18 | 24 | 5.5 | 100 % | 7908 | 7.7/21 | 89 % | 89 % | 7.8 | 264 | 50 | +| 6 | 9262 | 8056 | 3277 | 4393 | 386 | 2.44 | 11.1 | 10 | 20 | 26 | 5.6 | 100 % | 12354 | 7.5/21 | 88 % | 88 % | 6.3 | 287 | 69 | +| 7 | 14987 | 12089 | 4905 | 6503 | 681 | 2.36 | 11.1 | 10 | 18 | 26 | 5.6 | 100 % | 17581 | 7.2/21 | 84 % | 87 % | 5.1 | 303 | 91 | +| 8 | 22884 | 17301 | 6926 | 9262 | 1113 | 2.35 | 11.2 | 10 | 18 | 28 | 5.6 | 100 % | 23667 | 6.8/23 | 82 % | 87 % | 4.5 | 322 | 121 | +| 9 | 33030 | 23224 | 9294 | 12384 | 1546 | 2.30 | 11.1 | 10 | 20 | 26 | 5.6 | 100 % | 29911 | 6.4/24 | 80 % | 86 % | 4.1 | 331 | 154 | +| 10 | 44913 | 29273 | 11769 | 15412 | 2092 | 2.23 | 11.1 | 10 | 18 | 28 | 5.5 | 99 % | 35618 | 6.1/22 | 76 % | 84 % | 3.6 | 344 | 169 | +| 11 | 57303 | 35323 | 14224 | 18466 | 2633 | 2.20 | 11.1 | 10 | 18 | 28 | 5.5 | 99 % | 41018 | 5.8/21 | 75 % | 82 % | 3.2 | 339 | 173 | +| 12 | 69879 | 40312 | 16374 | 20889 | 3049 | 2.18 | 11.1 | 10 | 18 | 28 | 5.6 | 98 % | 44274 | 5.4/21 | 72 % | 81 % | 3.2 | 347 | 181 | +| 13 | 81365 | 43799 | 17918 | 22560 | 3321 | 2.13 | 11.0 | 10 | 18 | 30 | 5.5 | 98 % | 45078 | 5.0/21 | 69 % | 80 % | 3.2 | 355 | 214 | +| 14 | 89510 | 45306 | 18714 | 23137 | 3455 | 2.08 | 11.0 | 10 | 18 | 36 | 5.5 | 97 % | 43666 | 4.7/23 | 66 % | 78 % | 3.0 | 354 | 237 | +| 15 | 93887 | 44302 | 18488 | 22420 | 3394 | 2.05 | 11.0 | 10 | 18 | 32 | 5.5 | 96 % | 40826 | 4.4/21 | 64 % | 76 % | 3.0 | 354 | 225 | +| 16 | 93260 | 41514 | 17536 | 20810 | 3168 | 2.02 | 10.9 | 10 | 18 | 30 | 5.5 | 95 % | 35913 | 4.1/22 | 61 % | 74 % | 3.0 | 354 | 191 | +| 17 | 88732 | 36897 | 15675 | 18403 | 2819 | 1.98 | 10.9 | 10 | 18 | 32 | 5.4 | 94 % | 29091 | 3.7/18 | 57 % | 71 % | 3.0 | 347 | 214 | +| 18 | 79861 | 31082 | 13480 | 15279 | 2323 | 1.94 | 10.8 | 10 | 18 | 26 | 5.4 | 92 % | 23333 | 3.5/18 | 55 % | 69 % | 3.0 | 336 | 248 | +| 19 | 68793 | 25393 | 11136 | 12409 | 1848 | 1.92 | 10.8 | 10 | 18 | 26 | 5.4 | 91 % | 17891 | 3.2/16 | 52 % | 67 % | 2.8 | 330 | 239 | +| 20 | 56930 | 19662 | 8675 | 9570 | 1417 | 1.89 | 10.8 | 10 | 18 | 26 | 5.4 | 89 % | 12991 | 3.0/17 | 50 % | 65 % | 3.0 | 303 | 189 | +| 21 | 44385 | 14497 | 6462 | 7002 | 1033 | 1.88 | 10.8 | 10 | 18 | 28 | 5.4 | 88 % | 8858 | 2.7/18 | 47 % | 63 % | 3.0 | 280 | 152 | +| 22 | 33292 | 10461 | 4740 | 5035 | 686 | 1.90 | 10.8 | 10 | 18 | 26 | 5.4 | 86 % | 6022 | 2.5/12 | 45 % | 60 % | 3.0 | 254 | 107 | +| 23 | 24437 | 7146 | 3278 | 3396 | 472 | 1.89 | 10.8 | 10 | 18 | 26 | 5.4 | 83 % | 3686 | 2.2/12 | 42 % | 57 % | 3.0 | 223 | 89 | +| 24 | 17063 | 4712 | 2207 | 2216 | 289 | 1.87 | 10.8 | 10 | 18 | 24 | 5.4 | 82 % | 2371 | 2.1/10 | 43 % | 55 % | 3.2 | 204 | 71 | +| 25 | 11418 | 3036 | 1430 | 1437 | 169 | 1.85 | 10.7 | 10 | 18 | 28 | 5.4 | 78 % | 1457 | 2.0/13 | 38 % | 53 % | 3.2 | 173 | 51 | +| 26 | 7397 | 1806 | 901 | 822 | 83 | 1.91 | 10.8 | 10 | 16 | 24 | 5.4 | 79 % | 901 | 2.0/10 | 39 % | 53 % | 3.6 | 138 | 40 | +| 27 | 4656 | 1154 | 561 | 522 | 71 | 1.98 | 10.9 | 10 | 18 | 26 | 5.4 | 77 % | 486 | 1.7/7 | 38 % | 49 % | 3.6 | 105 | 30 | +| 28 | 2960 | 746 | 376 | 332 | 38 | 1.82 | 10.6 | 10 | 18 | 22 | 5.3 | 73 % | 321 | 1.7/8 | 36 % | 48 % | 3.2 | 76 | 24 | +| 29 | 1926 | 422 | 212 | 187 | 23 | 1.90 | 10.8 | 10 | 18 | 28 | 5.4 | 70 % | 168 | 1.6/11 | 38 % | 44 % | 3.6 | 50 | 25 | +| 30 | 1103 | 217 | 108 | 93 | 16 | 1.95 | 10.8 | 10 | 22 | 22 | 5.4 | 62 % | 71 | 1.3/7 | 27 % | 39 % | 4.1 | 31 | 21 | +| 31 | 570 | 124 | 61 | 58 | 5 | 2.07 | 11.1 | 10 | 19 | 20 | 5.6 | 75 % | 60 | 2.0/8 | 39 % | 51 % | 4.0 | 20 | 21 | +| 32 | 317 | 72 | 32 | 35 | 5 | 2.59 | 11.9 | 10 | 27 | 30 | 6.0 | 81 % | 24 | 1.5/4 | 38 % | 53 % | 3.2 | 11 | 15 | +| 33 | 188 | 44 | 22 | 19 | 3 | 2.32 | 11.3 | 10 | 18 | 18 | 5.7 | 82 % | 20 | 1.8/4 | 59 % | 59 % | 2.2 | 5 | 14 | +| 34 | 119 | 26 | 11 | 13 | 2 | 1.91 | 10.5 | 10 | 14 | 14 | 5.3 | 45 % | 3 | 0.5/2 | 18 % | 18 % | 6.3 | 4 | 8 | +| 35 | 59 | 15 | 9 | 5 | 1 | 2.33 | 10.9 | 10 | 14 | 14 | 5.4 | 56 % | 5 | 1.1/3 | 44 % | 33 % | 8.6 | 3 | 7 | +| 36 | 47 | 19 | 6 | 12 | 1 | 3.00 | 13.0 | 12 | 18 | 18 | 6.5 | 83 % | 6 | 2.0/3 | 33 % | 50 % | 3.4 | 2 | 5 | +| 37 | 38 | 13 | 6 | 6 | 1 | 1.83 | 11.0 | 10 | 14 | 14 | 5.5 | 100 % | 8 | 2.7/4 | 33 % | 67 % | 2.2 | 1 | 6 | +| 38 | 32 | 4 | 2 | 2 | 0 | 0.50 | 9.0 | 9 | 10 | 10 | 4.5 | 100 % | 1 | 1.0/1 | 0 % | 50 % | 2.0 | 1 | 2 | +| 39 | 9 | 1 | 1 | 0 | 0 | 2.00 | 10.0 | 10 | 10 | 10 | 5.0 | 0 % | 0 | 0.0/0 | 0 % | 0 % | nan | 1 | 1 | +| 40 | 5 | 1 | 1 | 0 | 0 | 3.00 | 12.0 | 12 | 12 | 12 | 6.0 | 0 % | 0 | 0.0/0 | 0 % | 0 % | nan | 1 | 1 | +| 41 | 6 | 0 | 0 | | | | | | | | | | | | | | | | | + +Totals: marked 509029, inserted 213464 (42 %), deferred touched 259051 (51 %), deferred edge 36514 (7 %); insertions in >=1 conflict 202927 (95 %), conflict pairs 495188, write-write: insertions in >=1 conflict 138637 (65 %), pairs 111952; overlap an earlier insertion 161508 (76 %) +write set slots over all insertions: mean 5.49, p50 5, p90 7, p99 9, max 18 +footprint slots over all insertions: mean 10.96, p50 10, p90 14, p99 18, max 36 +split-phase predicates: incircle 1615895 (exact fallback 146962 = 9.1 %, of which cocircular 146962), orient2d 3232783 (exact 527); flips 445657 diff --git a/docs/benchmarks/2026-09-27/serial-profile/data/sample_t1.pmset b/docs/benchmarks/2026-09-27/serial-profile/data/sample_t1.pmset new file mode 100644 index 00000000..deaba57e --- /dev/null +++ b/docs/benchmarks/2026-09-27/serial-profile/data/sample_t1.pmset @@ -0,0 +1,2 @@ +Now drawing from 'Battery Power' + -InternalBattery-0 (id=7929955) 85%; discharging; 4:25 remaining present: true diff --git a/docs/benchmarks/2026-09-27/serial-profile/data/sample_t1.txt b/docs/benchmarks/2026-09-27/serial-profile/data/sample_t1.txt new file mode 100644 index 00000000..a3ae3e63 --- /dev/null +++ b/docs/benchmarks/2026-09-27/serial-profile/data/sample_t1.txt @@ -0,0 +1,1155 @@ +Analysis of sampling Python (pid 94069) every 1 millisecond +Process: Python [94069] +Path: /opt/homebrew/*/Python.framework/Versions/3.14/Resources/Python.app/Contents/MacOS/Python +Load Address: 0x100b80000 +Identifier: org.python.python +Version: 3.14.7 (3.14.7) +Code Type: ARM64 +Platform: macOS +Parent Process: launchd [1] +Target Type: live task (Roots Present) + +Date/Time: 2026-09-27 10:23:40.677 +0200 +Launch Time: 2026-09-27 10:23:36.053 +0200 +OS Version: macOS 27.0 (26A428) +Report Version: 7 +Analysis Tool: /usr/bin/sample + +Physical footprint: 325.1M +Physical footprint (peak): 325.1M +Idle exit: untracked +---- + +Call graph: + 13132 Thread_9851299 DispatchQueue_1: com.apple.main-thread (serial) + 13132 start (in dyld) + 6688 [0x19192be80] + 13132 Py_BytesMain (in Python) + 44 [0x10183a14c] + 13132 pymain_main (in Python) + 236 [0x10183a0ac] + 13132 Py_RunMain (in Python) + 888 [0x101839c5c] + 13132 pymain_run_file (in Python) + 76 [0x10183a554] + 13132 pymain_run_file_obj (in Python) + 164 [0x10183a794] + 13132 _PyRun_AnyFile (in Python) + 80 [0x10180be7c] + 13132 _PyRun_SimpleFile (in Python) + 260 [0x10180c210] + 13132 _PyRun_File (in Python) + 176 [0x10180ccf4] + 13132 run_mod (in Python) + 172 [0x10180e2d8] + 13132 PyEval_EvalCode (in Python) + 248 [0x1017947a4] + 13132 _PyEval_EvalFrameDefault (in Python) + 18704 [0x101799600] + 13132 _PyObject_MakeTpCall (in Python) + 120 [0x101667158] + 13132 call_method (in Python) + 204 [0x1017093e4] + 13132 _PyObject_VectorcallDictTstate (in Python) + 200 [0x101666ffc] + 13132 _PyEval_Vector (in Python) + 264 [0x101794998] + 13132 _PyEval_EvalFrameDefault (in Python) + 16204 [0x101798c3c] + 13132 _PyObject_Call (in Python) + 116 [0x101668074] + 13132 call_method (in Python) + 204 [0x1017093e4] + 13132 _PyObject_VectorcallDictTstate (in Python) + 200 [0x101666ffc] + 13132 _PyEval_Vector (in Python) + 264 [0x101794998] + 13132 _PyEval_EvalFrameDefault (in Python) + 16204 [0x101798c3c] + 13132 _PyVectorcall_Call (in Python) + 152 [0x101667e0c] + 13132 _PyObject_VectorcallPrepend (in Python) + 440 [0x1016693d0] + 13132 _PyEval_Vector (in Python) + 264 [0x101794998] + 13132 _PyEval_EvalFrameDefault (in Python) + 16204 [0x101798c3c] + 13132 _PyVectorcall_Call (in Python) + 152 [0x101667e0c] + 13132 _PyObject_VectorcallPrepend (in Python) + 440 [0x1016693d0] + 13132 _PyEval_Vector (in Python) + 264 [0x101794998] + 13130 _PyEval_EvalFrameDefault (in Python) + 16204 [0x101798c3c] + + 13130 _PyVectorcall_Call (in Python) + 152 [0x101667e0c] + + 13130 pybind11::cpp_function::dispatcher(_object*, _object* const*, unsigned long, _object*) (in _core.cpython-314-darwin.so) + 4076 [0x105ff24c0] pybind11.h:1236 + + 13129 pybind11::cpp_function::initialize(pybind11_init__core(pybind11::module_&)::$_1&&, terrain::refinement::RefineOutcome (*)((anonymous namespace)::BoundRasterView const&, terrain::IndexedMesh2 const&, pybind11::object const&, pybind11::object const&, double, unsigned int, double, bool), pybind11::name const&, pybind11::scope const&, pybind11::sibling const&, pybind11::arg const&, pybind11::arg const&, pybind11::arg const&, pybind11::arg const&, pybind11::kw_only const&, pybind11::arg const&, pybind11::arg_v const&, pybind11::arg_v const&, pybind11::arg_v const&, char const (&) [815])::'lambda'(pybind11::detail::function_call&)::__invoke(pybind11::detail::function_call&) (in _core.cpython-314-darwin.so) + 700 [0x105fac640] pybind11.h:587 + + ! 13129 std::enable_if::value, terrain::refinement::RefineOutcome>::type pybind11::detail::argument_loader<(anonymous namespace)::BoundRasterView const&, terrain::IndexedMesh2 const&, pybind11::object const&, pybind11::object const&, double, unsigned int, double, bool>::call&>(pybind11::detail::function_ref&) && (in _core.cpython-314-darwin.so) + 308 [0x105fad4a4] cast.h:2168 + + ! 8624 decltype(auto) std::__variant_detail::__visitation::__base::__dispatcher<0ul>::__dispatch[abi:nqe210106]&&, std::__variant_detail::__base<(std::__variant_detail::_Trait)0, terrain::raster::RasterView, terrain::raster::RasterView> const&>(auto, std::__variant_detail::__base<(std::__variant_detail::_Trait)0, terrain::raster::RasterView, terrain::raster::RasterView> const&) (in _core.cpython-314-darwin.so) + 2308 [0x105fb3b90] variant:534 + + ! : 8171 ??? (in ) [0x16f27aa30] + + ! : | 8030 terrain::refinement::scan>(terrain::raster::RasterView const&, terrain::mesh::LatticeMesh const&, unsigned int) (in _core.cpython-314-darwin.so) + 3564,1048,... [0x105fc07d8,0x105fbfe04,...] scan.hpp:157 + + ! : | 54 terrain::refinement::scan>(terrain::raster::RasterView const&, terrain::mesh::LatticeMesh const&, unsigned int) (in _core.cpython-314-darwin.so) + 4424,4648 [0x105fc0b34,0x105fc0c14] kernel.hpp:0 + + ! : | 22 terrain::refinement::scan>(terrain::raster::RasterView const&, terrain::mesh::LatticeMesh const&, unsigned int) (in _core.cpython-314-darwin.so) + 4040,3980,... [0x105fc09b4,0x105fc0978,...] scan.hpp:197 + + ! : | 20 terrain::refinement::scan>(terrain::raster::RasterView const&, terrain::mesh::LatticeMesh const&, unsigned int) (in _core.cpython-314-darwin.so) + 3888 [0x105fc091c] optional:0 + + ! : | 19 terrain::refinement::scan>(terrain::raster::RasterView const&, terrain::mesh::LatticeMesh const&, unsigned int) (in _core.cpython-314-darwin.so) + 3972,3952,... [0x105fc0970,0x105fc095c,...] scan.hpp:196 + + ! : | 15 terrain::refinement::scan>(terrain::raster::RasterView const&, terrain::mesh::LatticeMesh const&, unsigned int) (in _core.cpython-314-darwin.so) + 3892 [0x105fc0920] scan.hpp:195 + + ! : | 5 terrain::refinement::scan>(terrain::raster::RasterView const&, terrain::mesh::LatticeMesh const&, unsigned int) (in _core.cpython-314-darwin.so) + 4776,4780 [0x105fc0c94,0x105fc0c98] scan.hpp:201 + + ! : | 4 terrain::refinement::scan>(terrain::raster::RasterView const&, terrain::mesh::LatticeMesh const&, unsigned int) (in _core.cpython-314-darwin.so) + 3912 [0x105fc0934] scan.hpp:0 + + ! : | 2 terrain::refinement::scan>(terrain::raster::RasterView const&, terrain::mesh::LatticeMesh const&, unsigned int) (in _core.cpython-314-darwin.so) + 4044,4084 [0x105fc09b8,0x105fc09e0] scan.hpp:198 + + ! : 254 terrain::refinement::scan>(terrain::raster::RasterView const&, terrain::mesh::LatticeMesh const&, unsigned int) (in _core.cpython-314-darwin.so) + 188 [0x105fbfaa8] scan.hpp:96 + + ! : | 119 terrain::refinement::scan>(terrain::raster::RasterView const&, terrain::mesh::LatticeMesh const&, unsigned int) (in _core.cpython-314-darwin.so) + 780,756,... [0x105fbfcf8,0x105fbfce0,...] scan.hpp:157 + + ! : | 21 terrain::refinement::scan>(terrain::raster::RasterView const&, terrain::mesh::LatticeMesh const&, unsigned int) (in _core.cpython-314-darwin.so) + 236,232,... [0x105fbfad8,0x105fbfad4,...] scan.hpp:97 + + ! : | 17 terrain::refinement::scan>(terrain::raster::RasterView const&, terrain::mesh::LatticeMesh const&, unsigned int) (in _core.cpython-314-darwin.so) + 444,600,... [0x105fbfba8,0x105fbfc44,...] scan.hpp:0 + + ! : | 16 terrain::refinement::scan>(terrain::raster::RasterView const&, terrain::mesh::LatticeMesh const&, unsigned int) (in _core.cpython-314-darwin.so) + 344,348 [0x105fbfb44,0x105fbfb48] scan.hpp:100 + + ! : | 14 terrain::refinement::vertex_z>(terrain::raster::RasterView const&, terrain::mesh::MeshVertex) (in _core.cpython-314-darwin.so) + 132,136 [0x105fbf45c,0x105fbf460] scan.hpp:87 + + ! : | 13 terrain::refinement::vertex_z>(terrain::raster::RasterView const&, terrain::mesh::MeshVertex) (in _core.cpython-314-darwin.so) + 84,72 [0x105fbf42c,0x105fbf420] scan.hpp:75 + + ! : | 8 terrain::refinement::scan>(terrain::raster::RasterView const&, terrain::mesh::LatticeMesh const&, unsigned int) (in _core.cpython-314-darwin.so) + 260 [0x105fbfaf0] scan.hpp:98 + + ! : | 7 terrain::refinement::vertex_z>(terrain::raster::RasterView const&, terrain::mesh::MeshVertex) (in _core.cpython-314-darwin.so) + 0,16 [0x105fbf3d8,0x105fbf3e8] scan.hpp:74 + + ! : | 6 terrain::refinement::scan>(terrain::raster::RasterView const&, terrain::mesh::LatticeMesh const&, unsigned int) (in _core.cpython-314-darwin.so) + 552,576,... [0x105fbfc14,0x105fbfc2c,...] scan.hpp:123 + + ! : | 6 terrain::refinement::scan>(terrain::raster::RasterView const&, terrain::mesh::LatticeMesh const&, unsigned int) (in _core.cpython-314-darwin.so) + 624 [0x105fbfc5c] scan.hpp:149 + + ! : | 5 terrain::refinement::scan>(terrain::raster::RasterView const&, terrain::mesh::LatticeMesh const&, unsigned int) (in _core.cpython-314-darwin.so) + 476,472 [0x105fbfbc8,0x105fbfbc4] scan.hpp:120 + + ! : | 5 terrain::refinement::scan>(terrain::raster::RasterView const&, terrain::mesh::LatticeMesh const&, unsigned int) (in _core.cpython-314-darwin.so) + 496 [0x105fbfbdc] scan.hpp:121 + + ! : | 5 terrain::refinement::scan>(terrain::raster::RasterView const&, terrain::mesh::LatticeMesh const&, unsigned int) (in _core.cpython-314-darwin.so) + 524 [0x105fbfbf8] scan.hpp:124 + + ! : | 4 terrain::refinement::scan>(terrain::raster::RasterView const&, terrain::mesh::LatticeMesh const&, unsigned int) (in _core.cpython-314-darwin.so) + 352,456 [0x105fbfb4c,0x105fbfbb4] scan.hpp:116 + + ! : | 3 terrain::refinement::scan>(terrain::raster::RasterView const&, terrain::mesh::LatticeMesh const&, unsigned int) (in _core.cpython-314-darwin.so) + 612,608 [0x105fbfc50,0x105fbfc4c] scan.hpp:134 + + ! : | 2 terrain::refinement::scan>(terrain::raster::RasterView const&, terrain::mesh::LatticeMesh const&, unsigned int) (in _core.cpython-314-darwin.so) + 360,364 [0x105fbfb54,0x105fbfb58] scan.hpp:117 + + ! : | 2 terrain::refinement::scan>(terrain::raster::RasterView const&, terrain::mesh::LatticeMesh const&, unsigned int) (in _core.cpython-314-darwin.so) + 592 [0x105fbfc3c] scan.hpp:125 + + ! : | 1 terrain::refinement::scan>(terrain::raster::RasterView const&, terrain::mesh::LatticeMesh const&, unsigned int) (in _core.cpython-314-darwin.so) + 620 [0x105fbfc58] scan.hpp:142 + + ! : 46 terrain::refinement::scan>(terrain::raster::RasterView const&, terrain::mesh::LatticeMesh const&, unsigned int) (in _core.cpython-314-darwin.so) + 4820,4808,... [0x105fc0cc0,0x105fc0cb4,...] scan.hpp:201 + + ! : 46 terrain::refinement::scan>(terrain::raster::RasterView const&, terrain::mesh::LatticeMesh const&, unsigned int) (in _core.cpython-314-darwin.so) + 120 [0x105fbfa64] scan.hpp:95 + + ! : | 15 terrain::refinement::vertex_z>(terrain::raster::RasterView const&, terrain::mesh::MeshVertex) (in _core.cpython-314-darwin.so) + 84,60 [0x105fbf42c,0x105fbf414] scan.hpp:75 + + ! : | 14 terrain::refinement::vertex_z>(terrain::raster::RasterView const&, terrain::mesh::MeshVertex) (in _core.cpython-314-darwin.so) + 132,136 [0x105fbf45c,0x105fbf460] scan.hpp:87 + + ! : | 11 terrain::refinement::vertex_z>(terrain::raster::RasterView const&, terrain::mesh::MeshVertex) (in _core.cpython-314-darwin.so) + 0 [0x105fbf3d8] scan.hpp:74 + + ! : | 6 terrain::refinement::scan>(terrain::raster::RasterView const&, terrain::mesh::LatticeMesh const&, unsigned int) (in _core.cpython-314-darwin.so) + 132 [0x105fbfa70] scan.hpp:95 + + ! : 38 terrain::refinement::scan>(terrain::raster::RasterView const&, terrain::mesh::LatticeMesh const&, unsigned int) (in _core.cpython-314-darwin.so) + 152 [0x105fbfa84] scan.hpp:95 + + ! : | 16 terrain::refinement::vertex_z>(terrain::raster::RasterView const&, terrain::mesh::MeshVertex) (in _core.cpython-314-darwin.so) + 84 [0x105fbf42c] scan.hpp:75 + + ! : | 9 terrain::refinement::vertex_z>(terrain::raster::RasterView const&, terrain::mesh::MeshVertex) (in _core.cpython-314-darwin.so) + 132,136 [0x105fbf45c,0x105fbf460] scan.hpp:87 + + ! : | 8 terrain::refinement::vertex_z>(terrain::raster::RasterView const&, terrain::mesh::MeshVertex) (in _core.cpython-314-darwin.so) + 0 [0x105fbf3d8] scan.hpp:74 + + ! : | 4 terrain::refinement::scan>(terrain::raster::RasterView const&, terrain::mesh::LatticeMesh const&, unsigned int) (in _core.cpython-314-darwin.so) + 172 [0x105fbfa98] scan.hpp:96 + + ! : | 1 terrain::refinement::vertex_z>(terrain::raster::RasterView const&, terrain::mesh::MeshVertex) (in _core.cpython-314-darwin.so) + 20 [0x105fbf3ec] scan.hpp:76 + + ! : 32 decltype(auto) std::__variant_detail::__visitation::__base::__dispatcher<0ul>::__dispatch[abi:nqe210106]&&, std::__variant_detail::__base<(std::__variant_detail::_Trait)0, terrain::raster::RasterView, terrain::raster::RasterView> const&>(auto, std::__variant_detail::__base<(std::__variant_detail::_Trait)0, terrain::raster::RasterView, terrain::raster::RasterView> const&) (in _core.cpython-314-darwin.so) + 2308 [0x105fb3b90] variant:534 + + ! : | 32 terrain::refinement::scan>(terrain::raster::RasterView const&, terrain::mesh::LatticeMesh const&, unsigned int) (in _core.cpython-314-darwin.so) + 100,76,... [0x105fbfa50,0x105fbfa38,...] scan.hpp:94 + + ! : 20 decltype(auto) std::__variant_detail::__visitation::__base::__dispatcher<0ul>::__dispatch[abi:nqe210106]&&, std::__variant_detail::__base<(std::__variant_detail::_Trait)0, terrain::raster::RasterView, terrain::raster::RasterView> const&>(auto, std::__variant_detail::__base<(std::__variant_detail::_Trait)0, terrain::raster::RasterView, terrain::raster::RasterView> const&) (in _core.cpython-314-darwin.so) + 2276,2296 [0x105fb3b70,0x105fb3b84] variant:534 + + ! : 17 terrain::refinement::scan>(terrain::raster::RasterView const&, terrain::mesh::LatticeMesh const&, unsigned int) (in _core.cpython-314-darwin.so) + 16,4,... [0x105fbf9fc,0x105fbf9f0,...] scan.hpp:90 + + ! 2176 decltype(auto) std::__variant_detail::__visitation::__base::__dispatcher<0ul>::__dispatch[abi:nqe210106]&&, std::__variant_detail::__base<(std::__variant_detail::_Trait)0, terrain::raster::RasterView, terrain::raster::RasterView> const&>(auto, std::__variant_detail::__base<(std::__variant_detail::_Trait)0, terrain::raster::RasterView, terrain::raster::RasterView> const&) (in _core.cpython-314-darwin.so) + 5792 [0x105fb492c] variant:534 + + ! : 983 terrain::mesh::detail::must_flip>(terrain::mesh::LatticeMesh const&, unsigned int, unsigned int, terrain::mesh::LatticeFrame const&) (in _core.cpython-314-darwin.so) + 1184 [0x105fbbae4] lawson.hpp:0 + + ! : | 623 terrain::pred::DetriaExact::incircle_ccw(terrain::Point2 const&, terrain::Point2 const&, terrain::Point2 const&, terrain::Point2 const&) (in _core.cpython-314-darwin.so) + 328 [0x106004158] detria_exact.cpp:97 + + ! : | + 117 detria::predicates::incircleadapt(double*, double*, double*, double*, double) (in _core.cpython-314-darwin.so) + 2976 [0x105ffeb00] detria.hpp:616 + + ! : | + ! 51 detria::predicates::fast_expansion_sum_zeroelim(int, double const*, int, double const*, double*) (in _core.cpython-314-darwin.so) + 40,60,... [0x106003d38,0x106003d4c,...] detria.hpp:0 + + ! : | + ! 34 detria::predicates::incircleadapt(double*, double*, double*, double*, double) (in _core.cpython-314-darwin.so) + 3628,3208,... [0x105ffed8c,0x105ffebe8,...] detria.hpp:622 + + ! : | + ! 14 detria::predicates::incircleadapt(double*, double*, double*, double*, double) (in _core.cpython-314-darwin.so) + 3048,3024,... [0x105ffeb48,0x105ffeb30,...] detria.hpp:0 + + ! : | + ! 6 detria::predicates::fast_expansion_sum_zeroelim(int, double const*, int, double const*, double*) (in _core.cpython-314-darwin.so) + 180 [0x106003dc4] detria.hpp:353 + + ! : | + ! 6 detria::predicates::incircleadapt(double*, double*, double*, double*, double) (in _core.cpython-314-darwin.so) + 3076,3104 [0x105ffeb64,0x105ffeb80] detria.hpp:620 + + ! : | + ! 2 detria::predicates::incircleadapt(double*, double*, double*, double*, double) (in _core.cpython-314-darwin.so) + 3040,3044 [0x105ffeb40,0x105ffeb44] detria.hpp:619 + + ! : | + ! 1 detria::predicates::fast_expansion_sum_zeroelim(int, double const*, int, double const*, double*) (in _core.cpython-314-darwin.so) + 32 [0x106003d30] detria.hpp:298 + + ! : | + ! 1 detria::predicates::fast_expansion_sum_zeroelim(int, double const*, int, double const*, double*) (in _core.cpython-314-darwin.so) + 68 [0x106003d54] detria.hpp:306 + + ! : | + ! 1 detria::predicates::fast_expansion_sum_zeroelim(int, double const*, int, double const*, double*) (in _core.cpython-314-darwin.so) + 244 [0x106003e04] detria.hpp:363 + + ! : | + ! 1 detria::predicates::fast_expansion_sum_zeroelim(int, double const*, int, double const*, double*) (in _core.cpython-314-darwin.so) + 396 [0x106003e9c] detria.hpp:385 + + ! : | + 116 detria::predicates::incircleadapt(double*, double*, double*, double*, double) (in _core.cpython-314-darwin.so) + 1572 [0x105ffe584] detria.hpp:606 + + ! : | + ! 55 detria::predicates::fast_expansion_sum_zeroelim(int, double const*, int, double const*, double*) (in _core.cpython-314-darwin.so) + 40,60,... [0x106003d38,0x106003d4c,...] detria.hpp:0 + + ! : | + ! 28 detria::predicates::incircleadapt(double*, double*, double*, double*, double) (in _core.cpython-314-darwin.so) + 1904,2056,... [0x105ffe6d0,0x105ffe768,...] detria.hpp:612 + + ! : | + ! 14 detria::predicates::incircleadapt(double*, double*, double*, double*, double) (in _core.cpython-314-darwin.so) + 1688,1660,... [0x105ffe5f8,0x105ffe5dc,...] detria.hpp:610 + + ! : | + ! 5 detria::predicates::fast_expansion_sum_zeroelim(int, double const*, int, double const*, double*) (in _core.cpython-314-darwin.so) + 392 [0x106003e98] detria.hpp:385 + + ! : | + ! 4 detria::predicates::incircleadapt(double*, double*, double*, double*, double) (in _core.cpython-314-darwin.so) + 1740 [0x105ffe62c] detria.hpp:0 + + ! : | + ! 3 detria::predicates::incircleadapt(double*, double*, double*, double*, double) (in _core.cpython-314-darwin.so) + 2356 [0x105ffe894] detria.hpp:613 + + ! : | + ! 2 detria::predicates::fast_expansion_sum_zeroelim(int, double const*, int, double const*, double*) (in _core.cpython-314-darwin.so) + 32 [0x106003d30] detria.hpp:298 + + ! : | + ! 2 detria::predicates::fast_expansion_sum_zeroelim(int, double const*, int, double const*, double*) (in _core.cpython-314-darwin.so) + 244 [0x106003e04] detria.hpp:363 + + ! : | + ! 1 detria::predicates::fast_expansion_sum_zeroelim(int, double const*, int, double const*, double*) (in _core.cpython-314-darwin.so) + 68 [0x106003d54] detria.hpp:306 + + ! : | + ! 1 detria::predicates::fast_expansion_sum_zeroelim(int, double const*, int, double const*, double*) (in _core.cpython-314-darwin.so) + 204 [0x106003ddc] detria.hpp:357 + + ! : | + ! 1 detria::predicates::fast_expansion_sum_zeroelim(int, double const*, int, double const*, double*) (in _core.cpython-314-darwin.so) + 320 [0x106003e50] detria.hpp:372 + + ! : | + 72 detria::predicates::incircleadapt(double*, double*, double*, double*, double) (in _core.cpython-314-darwin.so) + 4316 [0x105fff03c] detria.hpp:626 + + ! : | + ! 54 detria::predicates::fast_expansion_sum_zeroelim(int, double const*, int, double const*, double*) (in _core.cpython-314-darwin.so) + 60,40,... [0x106003d4c,0x106003d38,...] detria.hpp:0 + + ! : | + ! 5 detria::predicates::fast_expansion_sum_zeroelim(int, double const*, int, double const*, double*) (in _core.cpython-314-darwin.so) + 360 [0x106003e78] detria.hpp:378 + + ! : | + ! 5 detria::predicates::incircleadapt(double*, double*, double*, double*, double) (in _core.cpython-314-darwin.so) + 4344 [0x105fff058] detria.hpp:628 + + ! : | + ! 3 detria::predicates::fast_expansion_sum_zeroelim(int, double const*, int, double const*, double*) (in _core.cpython-314-darwin.so) + 296 [0x106003e38] detria.hpp:368 + + ! : | + ! 2 detria::predicates::fast_expansion_sum_zeroelim(int, double const*, int, double const*, double*) (in _core.cpython-314-darwin.so) + 32 [0x106003d30] detria.hpp:298 + + ! : | + ! 1 detria::predicates::fast_expansion_sum_zeroelim(int, double const*, int, double const*, double*) (in _core.cpython-314-darwin.so) + 68 [0x106003d54] detria.hpp:306 + + ! : | + ! 1 detria::predicates::fast_expansion_sum_zeroelim(int, double const*, int, double const*, double*) (in _core.cpython-314-darwin.so) + 204 [0x106003ddc] detria.hpp:357 + + ! : | + ! 1 detria::predicates::fast_expansion_sum_zeroelim(int, double const*, int, double const*, double*) (in _core.cpython-314-darwin.so) + 392 [0x106003e98] detria.hpp:385 + + ! : | + 56 detria::predicates::incircleadapt(double*, double*, double*, double*, double) (in _core.cpython-314-darwin.so) + 980 [0x105ffe334] detria.hpp:603 + + ! : | + ! 44 detria::predicates::incircleadapt(double*, double*, double*, double*, double) (in _core.cpython-314-darwin.so) + 1384,1260,... [0x105ffe4c8,0x105ffe44c,...] detria.hpp:604 + + ! : | + ! 8 detria::predicates::incircleadapt(double*, double*, double*, double*, double) (in _core.cpython-314-darwin.so) + 1168,1292 [0x105ffe3f0,0x105ffe46c] detria.hpp:0 + + ! : | + ! 3 detria::predicates::scale_expansion_zeroelim(int, double const*, double, double*) (in _core.cpython-314-darwin.so) + 60 [0x106003c30] detria.hpp:488 + + ! : | + ! 1 detria::predicates::scale_expansion_zeroelim(int, double const*, double, double*) (in _core.cpython-314-darwin.so) + 260 [0x106003cf8] detria.hpp:512 + + ! : | + 48 detria::predicates::incircleadapt(double*, double*, double*, double*, double) (in _core.cpython-314-darwin.so) + 60 [0x105ffdf9c] detria.hpp:522 + + ! : | + ! 25 detria::predicates::incircleadapt(double*, double*, double*, double*, double) (in _core.cpython-314-darwin.so) + 660,544,... [0x105ffe1f4,0x105ffe180,...] detria.hpp:602 + + ! : | + ! 8 detria::predicates::incircleadapt(double*, double*, double*, double*, double) (in _core.cpython-314-darwin.so) + 332,304 [0x105ffe0ac,0x105ffe090] detria.hpp:600 + + ! : | + ! 6 detria::predicates::incircleadapt(double*, double*, double*, double*, double) (in _core.cpython-314-darwin.so) + 160,572,... [0x105ffe000,0x105ffe19c,...] detria.hpp:0 + + ! : | + ! 5 ___chkstk_darwin (in libsystem_pthread.dylib) + 4 [0x191cfccf4] + + ! : | + ! 2 detria::predicates::incircleadapt(double*, double*, double*, double*, double) (in _core.cpython-314-darwin.so) + 112 [0x105ffdfd0] detria.hpp:591 + + ! : | + ! 2 detria::predicates::incircleadapt(double*, double*, double*, double*, double) (in _core.cpython-314-darwin.so) + 972 [0x105ffe32c] detria.hpp:603 + + ! : | + 46 detria::predicates::incircleadapt(double*, double*, double*, double*, double) (in _core.cpython-314-darwin.so) + 3784 [0x105ffee28] detria.hpp:623 + + ! : | + ! 27 detria::predicates::incircleadapt(double*, double*, double*, double*, double) (in _core.cpython-314-darwin.so) + 4144,4040,... [0x105ffef90,0x105ffef28,...] detria.hpp:624 + + ! : | + ! 8 detria::predicates::incircleadapt(double*, double*, double*, double*, double) (in _core.cpython-314-darwin.so) + 4072,3944 [0x105ffef48,0x105ffeec8] detria.hpp:0 + + ! : | + ! 5 detria::predicates::incircleadapt(double*, double*, double*, double*, double) (in _core.cpython-314-darwin.so) + 4276,4256 [0x105fff014,0x105fff000] detria.hpp:625 + + ! : | + ! 3 detria::predicates::scale_expansion_zeroelim(int, double const*, double, double*) (in _core.cpython-314-darwin.so) + 60,32 [0x106003c30,0x106003c14] detria.hpp:488 + + ! : | + ! 1 detria::predicates::scale_expansion_zeroelim(int, double const*, double, double*) (in _core.cpython-314-darwin.so) + 108 [0x106003c60] detria.hpp:495 + + ! : | + ! 1 detria::predicates::scale_expansion_zeroelim(int, double const*, double, double*) (in _core.cpython-314-darwin.so) + 260 [0x106003cf8] detria.hpp:512 + + ! : | + ! 1 detria::predicates::scale_expansion_zeroelim(int, double const*, double, double*) (in _core.cpython-314-darwin.so) + 272 [0x106003d04] detria.hpp:514 + + ! : | + 41 detria::predicates::incircleadapt(double*, double*, double*, double*, double) (in _core.cpython-314-darwin.so) + 2364 [0x105ffe89c] detria.hpp:613 + + ! : | + ! 26 detria::predicates::incircleadapt(double*, double*, double*, double*, double) (in _core.cpython-314-darwin.so) + 2784,2500,... [0x105ffea40,0x105ffe924,...] detria.hpp:614 + + ! : | + ! 5 detria::predicates::incircleadapt(double*, double*, double*, double*, double) (in _core.cpython-314-darwin.so) + 2532,2672 [0x105ffe944,0x105ffe9d0] detria.hpp:0 + + ! : | + ! 4 detria::predicates::scale_expansion_zeroelim(int, double const*, double, double*) (in _core.cpython-314-darwin.so) + 60 [0x106003c30] detria.hpp:488 + + ! : | + ! 2 detria::predicates::scale_expansion_zeroelim(int, double const*, double, double*) (in _core.cpython-314-darwin.so) + 260 [0x106003cf8] detria.hpp:512 + + ! : | + ! 2 detria::predicates::scale_expansion_zeroelim(int, double const*, double, double*) (in _core.cpython-314-darwin.so) + 272 [0x106003d04] detria.hpp:514 + + ! : | + ! 1 detria::predicates::incircleadapt(double*, double*, double*, double*, double) (in _core.cpython-314-darwin.so) + 2928 [0x105ffead0] detria.hpp:615 + + ! : | + ! 1 detria::predicates::scale_expansion_zeroelim(int, double const*, double, double*) (in _core.cpython-314-darwin.so) + 76 [0x106003c40] detria.hpp:490 + + ! : | + 28 detria::predicates::incircleadapt(double*, double*, double*, double*, double) (in _core.cpython-314-darwin.so) + 4356 [0x105fff064] detria.hpp:628 + + ! : | + ! 18 detria::predicates::fast_expansion_sum_zeroelim(int, double const*, int, double const*, double*) (in _core.cpython-314-darwin.so) + 40,144,... [0x106003d38,0x106003da0,...] detria.hpp:0 + + ! : | + ! 2 detria::predicates::fast_expansion_sum_zeroelim(int, double const*, int, double const*, double*) (in _core.cpython-314-darwin.so) + 20,36 [0x106003d24,0x106003d34] detria.hpp:298 + + ! : | + ! 2 detria::predicates::fast_expansion_sum_zeroelim(int, double const*, int, double const*, double*) (in _core.cpython-314-darwin.so) + 180,200 [0x106003dc4,0x106003dd8] detria.hpp:353 + + ! : | + ! 2 detria::predicates::fast_expansion_sum_zeroelim(int, double const*, int, double const*, double*) (in _core.cpython-314-darwin.so) + 244 [0x106003e04] detria.hpp:363 + + ! : | + ! 1 detria::predicates::fast_expansion_sum_zeroelim(int, double const*, int, double const*, double*) (in _core.cpython-314-darwin.so) + 204 [0x106003ddc] detria.hpp:357 + + ! : | + ! 1 detria::predicates::fast_expansion_sum_zeroelim(int, double const*, int, double const*, double*) (in _core.cpython-314-darwin.so) + 296 [0x106003e38] detria.hpp:368 + + ! : | + ! 1 detria::predicates::fast_expansion_sum_zeroelim(int, double const*, int, double const*, double*) (in _core.cpython-314-darwin.so) + 380 [0x106003e8c] detria.hpp:383 + + ! : | + ! 1 detria::predicates::incircleadapt(double*, double*, double*, double*, double) (in _core.cpython-314-darwin.so) + 4384 [0x105fff080] detria.hpp:629 + + ! : | + 28 detria::predicates::incircleadapt(double*, double*, double*, double*, double) (in _core.cpython-314-darwin.so) + 4388 [0x105fff084] detria.hpp:629 + + ! : | + ! 8 detria::predicates::incircleadapt(double*, double*, double*, double*, double) (in _core.cpython-314-darwin.so) + 4580,4636,... [0x105fff144,0x105fff17c,...] detria.hpp:0 + + ! : | + ! 5 detria::predicates::incircleadapt(double*, double*, double*, double*, double) (in _core.cpython-314-darwin.so) + 4736,4724 [0x105fff1e0,0x105fff1d4] detria.hpp:645 + + ! : | + ! 3 detria::predicates::fast_expansion_sum_zeroelim(int, double const*, int, double const*, double*) (in _core.cpython-314-darwin.so) + 8 [0x106003d18] detria.hpp:296 + + ! : | + ! 2 detria::predicates::fast_expansion_sum_zeroelim(int, double const*, int, double const*, double*) (in _core.cpython-314-darwin.so) + 76,144 [0x106003d5c,0x106003da0] detria.hpp:0 + + ! : | + ! 2 detria::predicates::fast_expansion_sum_zeroelim(int, double const*, int, double const*, double*) (in _core.cpython-314-darwin.so) + 296 [0x106003e38] detria.hpp:368 + + ! : | + ! 2 detria::predicates::fast_expansion_sum_zeroelim(int, double const*, int, double const*, double*) (in _core.cpython-314-darwin.so) + 360 [0x106003e78] detria.hpp:378 + + ! : | + ! 2 detria::predicates::incircleadapt(double*, double*, double*, double*, double) (in _core.cpython-314-darwin.so) + 4680,4688 [0x105fff1a8,0x105fff1b0] detria.hpp:638 + + ! : | + ! 1 detria::predicates::fast_expansion_sum_zeroelim(int, double const*, int, double const*, double*) (in _core.cpython-314-darwin.so) + 152 [0x106003da8] detria.hpp:353 + + ! : | + ! 1 detria::predicates::fast_expansion_sum_zeroelim(int, double const*, int, double const*, double*) (in _core.cpython-314-darwin.so) + 320 [0x106003e50] detria.hpp:372 + + ! : | + ! 1 detria::predicates::fast_expansion_sum_zeroelim(int, double const*, int, double const*, double*) (in _core.cpython-314-darwin.so) + 380 [0x106003e8c] detria.hpp:383 + + ! : | + ! 1 detria::predicates::fast_expansion_sum_zeroelim(int, double const*, int, double const*, double*) (in _core.cpython-314-darwin.so) + 392 [0x106003e98] detria.hpp:385 + + ! : | + 24 detria::predicates::incircleadapt(double*, double*, double*, double*, double) (in _core.cpython-314-darwin.so) + 1536 [0x105ffe560] detria.hpp:605 + + ! : | + ! 22 detria::predicates::scale_expansion_zeroelim(int, double const*, double, double*) (in _core.cpython-314-darwin.so) + 60,32 [0x106003c30,0x106003c14] detria.hpp:488 + + ! : | + ! 1 detria::predicates::incircleadapt(double*, double*, double*, double*, double) (in _core.cpython-314-darwin.so) + 1564 [0x105ffe57c] detria.hpp:606 + + ! : | + ! 1 detria::predicates::scale_expansion_zeroelim(int, double const*, double, double*) (in _core.cpython-314-darwin.so) + 268 [0x106003d00] detria.hpp:512 + + ! : | + 22 detria::predicates::incircleadapt(double*, double*, double*, double*, double) (in _core.cpython-314-darwin.so) + 4280 [0x105fff018] detria.hpp:625 + + ! : | + ! 20 detria::predicates::scale_expansion_zeroelim(int, double const*, double, double*) (in _core.cpython-314-darwin.so) + 60,32,... [0x106003c30,0x106003c14,...] detria.hpp:488 + + ! : | + ! 1 detria::predicates::incircleadapt(double*, double*, double*, double*, double) (in _core.cpython-314-darwin.so) + 4308 [0x105fff034] detria.hpp:626 + + ! : | + ! 1 detria::predicates::scale_expansion_zeroelim(int, double const*, double, double*) (in _core.cpython-314-darwin.so) + 108 [0x106003c60] detria.hpp:495 + + ! : | + 16 detria::predicates::incircleadapt(double*, double*, double*, double*, double) (in _core.cpython-314-darwin.so) + 2940 [0x105ffeadc] detria.hpp:615 + + ! : | + ! 6 detria::predicates::scale_expansion_zeroelim(int, double const*, double, double*) (in _core.cpython-314-darwin.so) + 60,64 [0x106003c30,0x106003c34] detria.hpp:488 + + ! : | + ! 3 detria::predicates::scale_expansion_zeroelim(int, double const*, double, double*) (in _core.cpython-314-darwin.so) + 72 [0x106003c3c] detria.hpp:490 + + ! : | + ! 3 detria::predicates::scale_expansion_zeroelim(int, double const*, double, double*) (in _core.cpython-314-darwin.so) + 260 [0x106003cf8] detria.hpp:512 + + ! : | + ! 2 detria::predicates::scale_expansion_zeroelim(int, double const*, double, double*) (in _core.cpython-314-darwin.so) + 272 [0x106003d04] detria.hpp:514 + + ! : | + ! 1 detria::predicates::incircleadapt(double*, double*, double*, double*, double) (in _core.cpython-314-darwin.so) + 2968 [0x105ffeaf8] detria.hpp:616 + + ! : | + ! 1 detria::predicates::scale_expansion_zeroelim(int, double const*, double, double*) (in _core.cpython-314-darwin.so) + 100 [0x106003c58] detria.hpp:0 + + ! : | + 3 detria::predicates::incircleadapt(double*, double*, double*, double*, double) (in _core.cpython-314-darwin.so) + 23692,23680 [0x106003bec,0x106003be0] detria.hpp:1050 + + ! : | + 3 detria::predicates::incircleadapt(double*, double*, double*, double*, double) (in _core.cpython-314-darwin.so) + 16 [0x105ffdf70] detria.hpp:522 + + ! : | + 3 terrain::pred::DetriaExact::incircle_ccw(terrain::Point2 const&, terrain::Point2 const&, terrain::Point2 const&, terrain::Point2 const&) (in _core.cpython-314-darwin.so) + 328 [0x106004158] detria_exact.cpp:97 + + ! : | + 3 detria::predicates::incircleadapt(double*, double*, double*, double*, double) (in _core.cpython-314-darwin.so) + 52 [0x105ffdf94] detria.hpp:522 + + ! : | 152 terrain::pred::FilteredKernel::incircle_ccw(terrain::Point2 const&, terrain::Point2 const&, terrain::Point2 const&, terrain::Point2 const&) (in _core.cpython-314-darwin.so) + 216 [0x105fbc2a8] kernel.hpp:177 + + ! : | 59 terrain::pred::FilteredKernel::incircle_ccw(terrain::Point2 const&, terrain::Point2 const&, terrain::Point2 const&, terrain::Point2 const&) (in _core.cpython-314-darwin.so) + 124,152,... [0x105fbc24c,0x105fbc268,...] kernel.hpp:172 + + ! : | 48 terrain::pred::FilteredKernel::incircle_ccw(terrain::Point2 const&, terrain::Point2 const&, terrain::Point2 const&, terrain::Point2 const&) (in _core.cpython-314-darwin.so) + 96,72,... [0x105fbc230,0x105fbc218,...] kernel.hpp:171 + + ! : | 41 terrain::pred::FilteredKernel::incircle_ccw(terrain::Point2 const&, terrain::Point2 const&, terrain::Point2 const&, terrain::Point2 const&) (in _core.cpython-314-darwin.so) + 200,204 [0x105fbc298,0x105fbc29c] kernel.hpp:175 + + ! : | 32 terrain::pred::FilteredKernel::incircle_ccw(terrain::Point2 const&, terrain::Point2 const&, terrain::Point2 const&, terrain::Point2 const&) (in _core.cpython-314-darwin.so) + 184,196,... [0x105fbc288,0x105fbc294,...] kernel.hpp:174 + + ! : | 27 terrain::pred::DetriaExact::incircle_ccw(terrain::Point2 const&, terrain::Point2 const&, terrain::Point2 const&, terrain::Point2 const&) (in _core.cpython-314-darwin.so) + 148,64,... [0x1060040a4,0x106004050,...] detria_exact.cpp:97 + + ! : | 1 terrain::pred::DetriaExact::incircle_ccw(terrain::Point2 const&, terrain::Point2 const&, terrain::Point2 const&, terrain::Point2 const&) (in _core.cpython-314-darwin.so) + 0 [0x106004010] detria_exact.cpp:96 + + ! : 481 decltype(auto) std::__variant_detail::__visitation::__base::__dispatcher<0ul>::__dispatch[abi:nqe210106]&&, std::__variant_detail::__base<(std::__variant_detail::_Trait)0, terrain::raster::RasterView, terrain::raster::RasterView> const&>(auto, std::__variant_detail::__base<(std::__variant_detail::_Trait)0, terrain::raster::RasterView, terrain::raster::RasterView> const&) (in _core.cpython-314-darwin.so) + 5796,5692,... [0x105fb4930,0x105fb48c8,...] variant:534 + + ! : 296 terrain::mesh::detail::must_flip>(terrain::mesh::LatticeMesh const&, unsigned int, unsigned int, terrain::mesh::LatticeFrame const&) (in _core.cpython-314-darwin.so) + 160 [0x105fbb6e4] lawson.hpp:59 + + ! : 218 terrain::mesh::detail::must_flip>(terrain::mesh::LatticeMesh const&, unsigned int, unsigned int, terrain::mesh::LatticeFrame const&) (in _core.cpython-314-darwin.so) + 144,148,... [0x105fbb6d4,0x105fbb6d8,...] lawson.hpp:57 + + ! : 71 terrain::mesh::detail::must_flip>(terrain::mesh::LatticeMesh const&, unsigned int, unsigned int, terrain::mesh::LatticeFrame const&) (in _core.cpython-314-darwin.so) + 320,300,... [0x105fbb784,0x105fbb770,...] lawson.hpp:70 + + ! : 42 terrain::mesh::detail::must_flip>(terrain::mesh::LatticeMesh const&, unsigned int, unsigned int, terrain::mesh::LatticeFrame const&) (in _core.cpython-314-darwin.so) + 272,236,... [0x105fbb754,0x105fbb730,...] lawson.hpp:60 + + ! : 27 terrain::mesh::detail::must_flip>(terrain::mesh::LatticeMesh const&, unsigned int, unsigned int, terrain::mesh::LatticeFrame const&) (in _core.cpython-314-darwin.so) + 44,24,... [0x105fbb670,0x105fbb65c,...] lawson.hpp:52 + + ! : 15 terrain::mesh::detail::must_flip>(terrain::mesh::LatticeMesh const&, unsigned int, unsigned int, terrain::mesh::LatticeFrame const&) (in _core.cpython-314-darwin.so) + 1180 [0x105fbbae0] lawson.hpp:0 + + ! : 15 terrain::mesh::detail::must_flip>(terrain::mesh::LatticeMesh const&, unsigned int, unsigned int, terrain::mesh::LatticeFrame const&) (in _core.cpython-314-darwin.so) + 356,364,... [0x105fbb7a8,0x105fbb7b0,...] lawson.hpp:71 + + ! : 8 terrain::mesh::detail::must_flip>(terrain::mesh::LatticeMesh const&, unsigned int, unsigned int, terrain::mesh::LatticeFrame const&) (in _core.cpython-314-darwin.so) + 64,48 [0x105fbb684,0x105fbb674] lawson.hpp:53 + + ! : 8 terrain::mesh::detail::must_flip>(terrain::mesh::LatticeMesh const&, unsigned int, unsigned int, terrain::mesh::LatticeFrame const&) (in _core.cpython-314-darwin.so) + 80 [0x105fbb694] lawson.hpp:74 + + ! : 7 terrain::mesh::detail::must_flip>(terrain::mesh::LatticeMesh const&, unsigned int, unsigned int, terrain::mesh::LatticeFrame const&) (in _core.cpython-314-darwin.so) + 260,204,... [0x105fbb748,0x105fbb710,...] lawson.hpp:61 + + ! : 5 terrain::mesh::detail::must_flip>(terrain::mesh::LatticeMesh const&, unsigned int, unsigned int, terrain::mesh::LatticeFrame const&) (in _core.cpython-314-darwin.so) + 92,120 [0x105fbb6a0,0x105fbb6bc] lawson.hpp:55 + + ! 487 decltype(auto) std::__variant_detail::__visitation::__base::__dispatcher<0ul>::__dispatch[abi:nqe210106]&&, std::__variant_detail::__base<(std::__variant_detail::_Trait)0, terrain::raster::RasterView, terrain::raster::RasterView> const&>(auto, std::__variant_detail::__base<(std::__variant_detail::_Trait)0, terrain::raster::RasterView, terrain::raster::RasterView> const&) (in _core.cpython-314-darwin.so) + 5844 [0x105fb4960] variant:534 + + ! : 224 terrain::mesh::LatticeMesh::flip(unsigned int, unsigned int) (in _core.cpython-314-darwin.so) + 504,508,... [0x105fbbd5c,0x105fbbd60,...] lattice_mesh.hpp:241 + + ! : 54 terrain::mesh::LatticeMesh::flip(unsigned int, unsigned int) (in _core.cpython-314-darwin.so) + 472 [0x105fbbd3c] lattice_mesh.hpp:240 + + ! : | 15 terrain::mesh::LatticeMesh::put(unsigned int, std::array, std::array) (in _core.cpython-314-darwin.so) + 72,68,... [0x105fbbe30,0x105fbbe2c,...] lattice_mesh.hpp:287 + + ! : | 14 terrain::mesh::LatticeMesh::put(unsigned int, std::array, std::array) (in _core.cpython-314-darwin.so) + 824,832,... [0x105fbc120,0x105fbc128,...] lattice_mesh.hpp:297 + + ! : | 11 terrain::mesh::LatticeMesh::put(unsigned int, std::array, std::array) (in _core.cpython-314-darwin.so) + 860,868,... [0x105fbc144,0x105fbc14c,...] lattice_mesh.hpp:296 + + ! : | 10 terrain::mesh::LatticeMesh::put(unsigned int, std::array, std::array) (in _core.cpython-314-darwin.so) + 948,896,... [0x105fbc19c,0x105fbc168,...] lattice_mesh.hpp:298 + + ! : | 3 terrain::mesh::LatticeMesh::put(unsigned int, std::array, std::array) (in _core.cpython-314-darwin.so) + 20,40 [0x105fbbdfc,0x105fbbe10] lattice_mesh.hpp:286 + + ! : | 1 terrain::mesh::LatticeMesh::put(unsigned int, std::array, std::array) (in _core.cpython-314-darwin.so) + 960 [0x105fbc1a8] lattice_mesh.hpp:300 + + ! : 37 terrain::mesh::LatticeMesh::put(unsigned int, std::array, std::array) (in _core.cpython-314-darwin.so) + 980,972,... [0x105fbc1bc,0x105fbc1b4,...] lattice_mesh.hpp:300 + + ! : 36 terrain::mesh::LatticeMesh::flip(unsigned int, unsigned int) (in _core.cpython-314-darwin.so) + 416 [0x105fbbd04] lattice_mesh.hpp:239 + + ! : | 12 terrain::mesh::LatticeMesh::put(unsigned int, std::array, std::array) (in _core.cpython-314-darwin.so) + 824,928,... [0x105fbc120,0x105fbc188,...] lattice_mesh.hpp:297 + + ! : | 9 terrain::mesh::LatticeMesh::put(unsigned int, std::array, std::array) (in _core.cpython-314-darwin.so) + 868,912,... [0x105fbc14c,0x105fbc178,...] lattice_mesh.hpp:296 + + ! : | 6 terrain::mesh::LatticeMesh::put(unsigned int, std::array, std::array) (in _core.cpython-314-darwin.so) + 60,64,... [0x105fbbe24,0x105fbbe28,...] lattice_mesh.hpp:287 + + ! : | 6 terrain::mesh::LatticeMesh::put(unsigned int, std::array, std::array) (in _core.cpython-314-darwin.so) + 956,944,... [0x105fbc1a4,0x105fbc198,...] lattice_mesh.hpp:298 + + ! : | 3 terrain::mesh::LatticeMesh::put(unsigned int, std::array, std::array) (in _core.cpython-314-darwin.so) + 960 [0x105fbc1a8] lattice_mesh.hpp:300 + + ! : 30 decltype(auto) std::__variant_detail::__visitation::__base::__dispatcher<0ul>::__dispatch[abi:nqe210106]&&, std::__variant_detail::__base<(std::__variant_detail::_Trait)0, terrain::raster::RasterView, terrain::raster::RasterView> const&>(auto, std::__variant_detail::__base<(std::__variant_detail::_Trait)0, terrain::raster::RasterView, terrain::raster::RasterView> const&) (in _core.cpython-314-darwin.so) + 5772,5856,... [0x105fb4918,0x105fb496c,...] variant:534 + + ! : 26 terrain::mesh::LatticeMesh::flip(unsigned int, unsigned int) (in _core.cpython-314-darwin.so) + 580,576,... [0x105fbbda8,0x105fbbda4,...] lattice_mesh.hpp:242 + + ! : 14 terrain::mesh::LatticeMesh::flip(unsigned int, unsigned int) (in _core.cpython-314-darwin.so) + 392,412,... [0x105fbbcec,0x105fbbd00,...] lattice_mesh.hpp:239 + + ! : 14 terrain::mesh::LatticeMesh::flip(unsigned int, unsigned int) (in _core.cpython-314-darwin.so) + 448,416,... [0x105fbbd24,0x105fbbd04,...] lattice_mesh.hpp:240 + + ! : 12 terrain::mesh::LatticeMesh::flip(unsigned int, unsigned int) (in _core.cpython-314-darwin.so) + 152 [0x105fbbbfc] lattice_mesh.hpp:232 + + ! : 12 terrain::mesh::LatticeMesh::flip(unsigned int, unsigned int) (in _core.cpython-314-darwin.so) + 228,212,... [0x105fbbc48,0x105fbbc38,...] lattice_mesh.hpp:237 + + ! : 8 terrain::mesh::LatticeMesh::flip(unsigned int, unsigned int) (in _core.cpython-314-darwin.so) + 292,324,... [0x105fbbc88,0x105fbbca8,...] lattice_mesh.hpp:238 + + ! : 7 terrain::mesh::LatticeMesh::flip(unsigned int, unsigned int) (in _core.cpython-314-darwin.so) + 540,144,... [0x105fbbd80,0x105fbbbf4,...] lattice_mesh.hpp:0 + + ! : 7 terrain::mesh::LatticeMesh::flip(unsigned int, unsigned int) (in _core.cpython-314-darwin.so) + 60,44 [0x105fbbba0,0x105fbbb90] lattice_mesh.hpp:228 + + ! : 3 terrain::mesh::LatticeMesh::flip(unsigned int, unsigned int) (in _core.cpython-314-darwin.so) + 112,100 [0x105fbbbd4,0x105fbbbc8] lattice_mesh.hpp:229 + + ! : 2 terrain::mesh::LatticeMesh::flip(unsigned int, unsigned int) (in _core.cpython-314-darwin.so) + 24 [0x105fbbb7c] lattice_mesh.hpp:227 + + ! : 1 terrain::mesh::LatticeMesh::flip(unsigned int, unsigned int) (in _core.cpython-314-darwin.so) + 120 [0x105fbbbdc] lattice_mesh.hpp:230 + + ! 463 decltype(auto) std::__variant_detail::__visitation::__base::__dispatcher<0ul>::__dispatch[abi:nqe210106]&&, std::__variant_detail::__base<(std::__variant_detail::_Trait)0, terrain::raster::RasterView, terrain::raster::RasterView> const&>(auto, std::__variant_detail::__base<(std::__variant_detail::_Trait)0, terrain::raster::RasterView, terrain::raster::RasterView> const&) (in _core.cpython-314-darwin.so) + 7044 [0x105fb4e10] variant:534 + + ! : 431 std::__introsort(unsigned int*, unsigned int*, std::ranges::less, std::iterator_traits::difference_type, bool) (in libc++.1.dylib) + 664 [0x191c17408] + + ! : | 389 std::__introsort(unsigned int*, unsigned int*, std::ranges::less, std::iterator_traits::difference_type, bool) (in libc++.1.dylib) + 664 [0x191c17408] + + ! : | + 367 std::__introsort(unsigned int*, unsigned int*, std::ranges::less, std::iterator_traits::difference_type, bool) (in libc++.1.dylib) + 664 [0x191c17408] + + ! : | + ! 320 std::__introsort(unsigned int*, unsigned int*, std::ranges::less, std::iterator_traits::difference_type, bool) (in libc++.1.dylib) + 664 [0x191c17408] + + ! : | + ! : 276 std::__introsort(unsigned int*, unsigned int*, std::ranges::less, std::iterator_traits::difference_type, bool) (in libc++.1.dylib) + 664 [0x191c17408] + + ! : | + ! : | 233 std::__introsort(unsigned int*, unsigned int*, std::ranges::less, std::iterator_traits::difference_type, bool) (in libc++.1.dylib) + 664 [0x191c17408] + + ! : | + ! : | + 185 std::__introsort(unsigned int*, unsigned int*, std::ranges::less, std::iterator_traits::difference_type, bool) (in libc++.1.dylib) + 664 [0x191c17408] + + ! : | + ! : | + ! 149 std::__introsort(unsigned int*, unsigned int*, std::ranges::less, std::iterator_traits::difference_type, bool) (in libc++.1.dylib) + 664 [0x191c17408] + + ! : | + ! : | + ! : 121 std::__introsort(unsigned int*, unsigned int*, std::ranges::less, std::iterator_traits::difference_type, bool) (in libc++.1.dylib) + 664 [0x191c17408] + + ! : | + ! : | + ! : | 99 std::__introsort(unsigned int*, unsigned int*, std::ranges::less, std::iterator_traits::difference_type, bool) (in libc++.1.dylib) + 664 [0x191c17408] + + ! : | + ! : | + ! : | + 75 std::__introsort(unsigned int*, unsigned int*, std::ranges::less, std::iterator_traits::difference_type, bool) (in libc++.1.dylib) + 664 [0x191c17408] + + ! : | + ! : | + ! : | + ! 61 std::__introsort(unsigned int*, unsigned int*, std::ranges::less, std::iterator_traits::difference_type, bool) (in libc++.1.dylib) + 664 [0x191c17408] + + ! : | + ! : | + ! : | + ! : 53 std::__introsort(unsigned int*, unsigned int*, std::ranges::less, std::iterator_traits::difference_type, bool) (in libc++.1.dylib) + 664 [0x191c17408] + + ! : | + ! : | + ! : | + ! : | 48 std::__introsort(unsigned int*, unsigned int*, std::ranges::less, std::iterator_traits::difference_type, bool) (in libc++.1.dylib) + 664 [0x191c17408] + + ! : | + ! : | + ! : | + ! : | + 39 std::__introsort(unsigned int*, unsigned int*, std::ranges::less, std::iterator_traits::difference_type, bool) (in libc++.1.dylib) + 664 [0x191c17408] + + ! : | + ! : | + ! : | + ! : | + ! 33 std::__introsort(unsigned int*, unsigned int*, std::ranges::less, std::iterator_traits::difference_type, bool) (in libc++.1.dylib) + 664 [0x191c17408] + + ! : | + ! : | + ! : | + ! : | + ! : 29 std::__introsort(unsigned int*, unsigned int*, std::ranges::less, std::iterator_traits::difference_type, bool) (in libc++.1.dylib) + 664 [0x191c17408] + + ! : | + ! : | + ! : | + ! : | + ! : | 26 std::__introsort(unsigned int*, unsigned int*, std::ranges::less, std::iterator_traits::difference_type, bool) (in libc++.1.dylib) + 664 [0x191c17408] + + ! : | + ! : | + ! : | + ! : | + ! : | + 22 std::__introsort(unsigned int*, unsigned int*, std::ranges::less, std::iterator_traits::difference_type, bool) (in libc++.1.dylib) + 664 [0x191c17408] + + ! : | + ! : | + ! : | + ! : | + ! : | + ! 20 std::__introsort(unsigned int*, unsigned int*, std::ranges::less, std::iterator_traits::difference_type, bool) (in libc++.1.dylib) + 664 [0x191c17408] + + ! : | + ! : | + ! : | + ! : | + ! : | + ! : 19 std::__introsort(unsigned int*, unsigned int*, std::ranges::less, std::iterator_traits::difference_type, bool) (in libc++.1.dylib) + 664 [0x191c17408] + + ! : | + ! : | + ! : | + ! : | + ! : | + ! : | 16 std::__introsort(unsigned int*, unsigned int*, std::ranges::less, std::iterator_traits::difference_type, bool) (in libc++.1.dylib) + 664 [0x191c17408] + + ! : | + ! : | + ! : | + ! : | + ! : | + ! : | + 13 std::__introsort(unsigned int*, unsigned int*, std::ranges::less, std::iterator_traits::difference_type, bool) (in libc++.1.dylib) + 664 [0x191c17408] + + ! : | + ! : | + ! : | + ! : | + ! : | + ! : | + ! 6 std::__introsort(unsigned int*, unsigned int*, std::ranges::less, std::iterator_traits::difference_type, bool) (in libc++.1.dylib) + 664 [0x191c17408] + + ! : | + ! : | + ! : | + ! : | + ! : | + ! : | + ! : 4 std::__introsort(unsigned int*, unsigned int*, std::ranges::less, std::iterator_traits::difference_type, bool) (in libc++.1.dylib) + 664 [0x191c17408] + + ! : | + ! : | + ! : | + ! : | + ! : | + ! : | + ! : | 2 std::__introsort(unsigned int*, unsigned int*, std::ranges::less, std::iterator_traits::difference_type, bool) (in libc++.1.dylib) + 1280 [0x191c17670] + + ! : | + ! : | + ! : | + ! : | + ! : | + ! : | + ! : | + 2 std::__partial_sort_impl[abi:nqe220106](unsigned int*, unsigned int*, unsigned int*, std::ranges::less&) (in libc++.1.dylib) + 340,408 [0x191c1dad8,0x191c1db1c] + + ! : | + ! : | + ! : | + ! : | + ! : | + ! : | + ! : | 1 std::__introsort(unsigned int*, unsigned int*, std::ranges::less, std::iterator_traits::difference_type, bool) (in libc++.1.dylib) + 664 [0x191c17408] + + ! : | + ! : | + ! : | + ! : | + ! : | + ! : | + ! : | + 1 std::__introsort(unsigned int*, unsigned int*, std::ranges::less, std::iterator_traits::difference_type, bool) (in libc++.1.dylib) + 1280 [0x191c17670] + + ! : | + ! : | + ! : | + ! : | + ! : | + ! : | + ! : | + 1 std::__partial_sort_impl[abi:nqe220106](unsigned int*, unsigned int*, unsigned int*, std::ranges::less&) (in libc++.1.dylib) + 304 [0x191c1dab4] + + ! : | + ! : | + ! : | + ! : | + ! : | + ! : | + ! : | 1 std::__introsort(unsigned int*, unsigned int*, std::ranges::less, std::iterator_traits::difference_type, bool) (in libc++.1.dylib) + 128 [0x191c171f0] + + ! : | + ! : | + ! : | + ! : | + ! : | + ! : | + ! : 2 std::__introsort(unsigned int*, unsigned int*, std::ranges::less, std::iterator_traits::difference_type, bool) (in libc++.1.dylib) + 1280 [0x191c17670] + + ! : | + ! : | + ! : | + ! : | + ! : | + ! : | + ! : 2 std::__partial_sort_impl[abi:nqe220106](unsigned int*, unsigned int*, unsigned int*, std::ranges::less&) (in libc++.1.dylib) + 332,380 [0x191c1dad0,0x191c1db00] + + ! : | + ! : | + ! : | + ! : | + ! : | + ! : | + ! 5 std::__introsort(unsigned int*, unsigned int*, std::ranges::less, std::iterator_traits::difference_type, bool) (in libc++.1.dylib) + 1280 [0x191c17670] + + ! : | + ! : | + ! : | + ! : | + ! : | + ! : | + ! : 5 std::__partial_sort_impl[abi:nqe220106](unsigned int*, unsigned int*, unsigned int*, std::ranges::less&) (in libc++.1.dylib) + 304,340,... [0x191c1dab4,0x191c1dad8,...] + + ! : | + ! : | + ! : | + ! : | + ! : | + ! : | + ! 2 std::__introsort(unsigned int*, unsigned int*, std::ranges::less, std::iterator_traits::difference_type, bool) (in libc++.1.dylib) + 592 [0x191c173c0] + + ! : | + ! : | + ! : | + ! : | + ! : | + ! : | + ! 2 std::__bitset_partition[abi:nqe220106](unsigned int*, unsigned int*, std::ranges::less) (in libc++.1.dylib) + 636,892 [0x191c1d584,0x191c1d684] + + ! : | + ! : | + ! : | + ! : | + ! : | + ! : | + 2 std::__introsort(unsigned int*, unsigned int*, std::ranges::less, std::iterator_traits::difference_type, bool) (in libc++.1.dylib) + 1280 [0x191c17670] + + ! : | + ! : | + ! : | + ! : | + ! : | + ! : | + ! 2 std::__partial_sort_impl[abi:nqe220106](unsigned int*, unsigned int*, unsigned int*, std::ranges::less&) (in libc++.1.dylib) + 324,380 [0x191c1dac8,0x191c1db00] + + ! : | + ! : | + ! : | + ! : | + ! : | + ! : | + 1 std::__introsort(unsigned int*, unsigned int*, std::ranges::less, std::iterator_traits::difference_type, bool) (in libc++.1.dylib) + 592 [0x191c173c0] + + ! : | + ! : | + ! : | + ! : | + ! : | + ! : | + 1 std::__bitset_partition[abi:nqe220106](unsigned int*, unsigned int*, std::ranges::less) (in libc++.1.dylib) + 948 [0x191c1d6bc] + + ! : | + ! : | + ! : | + ! : | + ! : | + ! : | 2 std::__introsort(unsigned int*, unsigned int*, std::ranges::less, std::iterator_traits::difference_type, bool) (in libc++.1.dylib) + 592 [0x191c173c0] + + ! : | + ! : | + ! : | + ! : | + ! : | + ! : | + 2 std::__bitset_partition[abi:nqe220106](unsigned int*, unsigned int*, std::ranges::less) (in libc++.1.dylib) + 636,708 [0x191c1d584,0x191c1d5cc] + + ! : | + ! : | + ! : | + ! : | + ! : | + ! : | 1 std::__introsort(unsigned int*, unsigned int*, std::ranges::less, std::iterator_traits::difference_type, bool) (in libc++.1.dylib) + 1280 [0x191c17670] + + ! : | + ! : | + ! : | + ! : | + ! : | + ! : | 1 std::__partial_sort_impl[abi:nqe220106](unsigned int*, unsigned int*, unsigned int*, std::ranges::less&) (in libc++.1.dylib) + 372 [0x191c1daf8] + + ! : | + ! : | + ! : | + ! : | + ! : | + ! : 1 std::__introsort(unsigned int*, unsigned int*, std::ranges::less, std::iterator_traits::difference_type, bool) (in libc++.1.dylib) + 592 [0x191c173c0] + + ! : | + ! : | + ! : | + ! : | + ! : | + ! : 1 std::__bitset_partition[abi:nqe220106](unsigned int*, unsigned int*, std::ranges::less) (in libc++.1.dylib) + 892 [0x191c1d684] + + ! : | + ! : | + ! : | + ! : | + ! : | + ! 1 std::__introsort(unsigned int*, unsigned int*, std::ranges::less, std::iterator_traits::difference_type, bool) (in libc++.1.dylib) + 592 [0x191c173c0] + + ! : | + ! : | + ! : | + ! : | + ! : | + ! : 1 std::__bitset_partition[abi:nqe220106](unsigned int*, unsigned int*, std::ranges::less) (in libc++.1.dylib) + 636 [0x191c1d584] + + ! : | + ! : | + ! : | + ! : | + ! : | + ! 1 std::__introsort(unsigned int*, unsigned int*, std::ranges::less, std::iterator_traits::difference_type, bool) (in libc++.1.dylib) + 644 [0x191c173f4] + + ! : | + ! : | + ! : | + ! : | + ! : | + 3 std::__introsort(unsigned int*, unsigned int*, std::ranges::less, std::iterator_traits::difference_type, bool) (in libc++.1.dylib) + 64,748,... [0x191c171b0,0x191c1745c,...] + + ! : | + ! : | + ! : | + ! : | + ! : | + 1 std::__introsort(unsigned int*, unsigned int*, std::ranges::less, std::iterator_traits::difference_type, bool) (in libc++.1.dylib) + 592 [0x191c173c0] + + ! : | + ! : | + ! : | + ! : | + ! : | + 1 std::__bitset_partition[abi:nqe220106](unsigned int*, unsigned int*, std::ranges::less) (in libc++.1.dylib) + 932 [0x191c1d6ac] + + ! : | + ! : | + ! : | + ! : | + ! : | 3 std::__introsort(unsigned int*, unsigned int*, std::ranges::less, std::iterator_traits::difference_type, bool) (in libc++.1.dylib) + 592 [0x191c173c0] + + ! : | + ! : | + ! : | + ! : | + ! : | 3 std::__bitset_partition[abi:nqe220106](unsigned int*, unsigned int*, std::ranges::less) (in libc++.1.dylib) + 892,980 [0x191c1d684,0x191c1d6dc] + + ! : | + ! : | + ! : | + ! : | + ! : 3 std::__introsort(unsigned int*, unsigned int*, std::ranges::less, std::iterator_traits::difference_type, bool) (in libc++.1.dylib) + 592 [0x191c173c0] + + ! : | + ! : | + ! : | + ! : | + ! : | 3 std::__bitset_partition[abi:nqe220106](unsigned int*, unsigned int*, std::ranges::less) (in libc++.1.dylib) + 708,932 [0x191c1d5cc,0x191c1d6ac] + + ! : | + ! : | + ! : | + ! : | + ! : 1 std::__introsort(unsigned int*, unsigned int*, std::ranges::less, std::iterator_traits::difference_type, bool) (in libc++.1.dylib) + 1288 [0x191c17678] + + ! : | + ! : | + ! : | + ! : | + ! 4 std::__introsort(unsigned int*, unsigned int*, std::ranges::less, std::iterator_traits::difference_type, bool) (in libc++.1.dylib) + 592 [0x191c173c0] + + ! : | + ! : | + ! : | + ! : | + ! : 4 std::__bitset_partition[abi:nqe220106](unsigned int*, unsigned int*, std::ranges::less) (in libc++.1.dylib) + 68,636,... [0x191c1d34c,0x191c1d584,...] + + ! : | + ! : | + ! : | + ! : | + ! 2 std::__introsort(unsigned int*, unsigned int*, std::ranges::less, std::iterator_traits::difference_type, bool) (in libc++.1.dylib) + 1304,1352 [0x191c17688,0x191c176b8] + + ! : | + ! : | + ! : | + ! : | + 8 std::__introsort(unsigned int*, unsigned int*, std::ranges::less, std::iterator_traits::difference_type, bool) (in libc++.1.dylib) + 592 [0x191c173c0] + + ! : | + ! : | + ! : | + ! : | + ! 8 std::__bitset_partition[abi:nqe220106](unsigned int*, unsigned int*, std::ranges::less) (in libc++.1.dylib) + 20,708,... [0x191c1d31c,0x191c1d5cc,...] + + ! : | + ! : | + ! : | + ! : | + 1 std::__introsort(unsigned int*, unsigned int*, std::ranges::less, std::iterator_traits::difference_type, bool) (in libc++.1.dylib) + 1316 [0x191c17694] + + ! : | + ! : | + ! : | + ! : | 4 std::__introsort(unsigned int*, unsigned int*, std::ranges::less, std::iterator_traits::difference_type, bool) (in libc++.1.dylib) + 592 [0x191c173c0] + + ! : | + ! : | + ! : | + ! : | + 4 std::__bitset_partition[abi:nqe220106](unsigned int*, unsigned int*, std::ranges::less) (in libc++.1.dylib) + 644,636,... [0x191c1d58c,0x191c1d584,...] + + ! : | + ! : | + ! : | + ! : | 1 std::__introsort(unsigned int*, unsigned int*, std::ranges::less, std::iterator_traits::difference_type, bool) (in libc++.1.dylib) + 1332 [0x191c176a4] + + ! : | + ! : | + ! : | + ! : 6 std::__introsort(unsigned int*, unsigned int*, std::ranges::less, std::iterator_traits::difference_type, bool) (in libc++.1.dylib) + 592 [0x191c173c0] + + ! : | + ! : | + ! : | + ! : | 6 std::__bitset_partition[abi:nqe220106](unsigned int*, unsigned int*, std::ranges::less) (in libc++.1.dylib) + 948,624,... [0x191c1d6bc,0x191c1d578,...] + + ! : | + ! : | + ! : | + ! : 2 std::__introsort(unsigned int*, unsigned int*, std::ranges::less, std::iterator_traits::difference_type, bool) (in libc++.1.dylib) + 52,1320 [0x191c171a4,0x191c17698] + + ! : | + ! : | + ! : | + ! 10 std::__introsort(unsigned int*, unsigned int*, std::ranges::less, std::iterator_traits::difference_type, bool) (in libc++.1.dylib) + 592 [0x191c173c0] + + ! : | + ! : | + ! : | + ! : 10 std::__bitset_partition[abi:nqe220106](unsigned int*, unsigned int*, std::ranges::less) (in libc++.1.dylib) + 644,892,... [0x191c1d58c,0x191c1d684,...] + + ! : | + ! : | + ! : | + ! 3 std::__introsort(unsigned int*, unsigned int*, std::ranges::less, std::iterator_traits::difference_type, bool) (in libc++.1.dylib) + 560,1304,... [0x191c173a0,0x191c17688,...] + + ! : | + ! : | + ! : | + ! 1 std::__introsort(unsigned int*, unsigned int*, std::ranges::less, std::iterator_traits::difference_type, bool) (in libc++.1.dylib) + 612 [0x191c173d4] + + ! : | + ! : | + ! : | + ! 1 std::__insertion_sort_incomplete[abi:nqe220106](unsigned int*, unsigned int*, std::ranges::less) (in libc++.1.dylib) + 448 [0x191c1d8c4] + + ! : | + ! : | + ! : | + 12 std::__introsort(unsigned int*, unsigned int*, std::ranges::less, std::iterator_traits::difference_type, bool) (in libc++.1.dylib) + 592 [0x191c173c0] + + ! : | + ! : | + ! : | + ! 12 std::__bitset_partition[abi:nqe220106](unsigned int*, unsigned int*, std::ranges::less) (in libc++.1.dylib) + 716,892,... [0x191c1d5d4,0x191c1d684,...] + + ! : | + ! : | + ! : | + 12 std::__introsort(unsigned int*, unsigned int*, std::ranges::less, std::iterator_traits::difference_type, bool) (in libc++.1.dylib) + 1320,96,... [0x191c17698,0x191c171d0,...] + + ! : | + ! : | + ! : | 15 std::__introsort(unsigned int*, unsigned int*, std::ranges::less, std::iterator_traits::difference_type, bool) (in libc++.1.dylib) + 592 [0x191c173c0] + + ! : | + ! : | + ! : | + 15 std::__bitset_partition[abi:nqe220106](unsigned int*, unsigned int*, std::ranges::less) (in libc++.1.dylib) + 20,644,... [0x191c1d31c,0x191c1d58c,...] + + ! : | + ! : | + ! : | 7 std::__introsort(unsigned int*, unsigned int*, std::ranges::less, std::iterator_traits::difference_type, bool) (in libc++.1.dylib) + 1320,1332,... [0x191c17698,0x191c176a4,...] + + ! : | + ! : | + ! : 19 std::__introsort(unsigned int*, unsigned int*, std::ranges::less, std::iterator_traits::difference_type, bool) (in libc++.1.dylib) + 592 [0x191c173c0] + + ! : | + ! : | + ! : | 19 std::__bitset_partition[abi:nqe220106](unsigned int*, unsigned int*, std::ranges::less) (in libc++.1.dylib) + 708,784,... [0x191c1d5cc,0x191c1d618,...] + + ! : | + ! : | + ! : 9 std::__introsort(unsigned int*, unsigned int*, std::ranges::less, std::iterator_traits::difference_type, bool) (in libc++.1.dylib) + 1320,1292,... [0x191c17698,0x191c1767c,...] + + ! : | + ! : | + ! 25 std::__introsort(unsigned int*, unsigned int*, std::ranges::less, std::iterator_traits::difference_type, bool) (in libc++.1.dylib) + 592 [0x191c173c0] + + ! : | + ! : | + ! : 25 std::__bitset_partition[abi:nqe220106](unsigned int*, unsigned int*, std::ranges::less) (in libc++.1.dylib) + 20,32,... [0x191c1d31c,0x191c1d328,...] + + ! : | + ! : | + ! 11 std::__introsort(unsigned int*, unsigned int*, std::ranges::less, std::iterator_traits::difference_type, bool) (in libc++.1.dylib) + 1320,1308,... [0x191c17698,0x191c1768c,...] + + ! : | + ! : | + 29 std::__introsort(unsigned int*, unsigned int*, std::ranges::less, std::iterator_traits::difference_type, bool) (in libc++.1.dylib) + 592 [0x191c173c0] + + ! : | + ! : | + ! 29 std::__bitset_partition[abi:nqe220106](unsigned int*, unsigned int*, std::ranges::less) (in libc++.1.dylib) + 636,32,... [0x191c1d584,0x191c1d328,...] + + ! : | + ! : | + 19 std::__introsort(unsigned int*, unsigned int*, std::ranges::less, std::iterator_traits::difference_type, bool) (in libc++.1.dylib) + 1320,1336,... [0x191c17698,0x191c176a8,...] + + ! : | + ! : | 35 std::__introsort(unsigned int*, unsigned int*, std::ranges::less, std::iterator_traits::difference_type, bool) (in libc++.1.dylib) + 592 [0x191c173c0] + + ! : | + ! : | + 35 std::__bitset_partition[abi:nqe220106](unsigned int*, unsigned int*, std::ranges::less) (in libc++.1.dylib) + 372,32,... [0x191c1d47c,0x191c1d328,...] + + ! : | + ! : | 6 std::__introsort(unsigned int*, unsigned int*, std::ranges::less, std::iterator_traits::difference_type, bool) (in libc++.1.dylib) + 1352,128,... [0x191c176b8,0x191c171f0,...] + + ! : | + ! : | 1 std::__introsort(unsigned int*, unsigned int*, std::ranges::less, std::iterator_traits::difference_type, bool) (in libc++.1.dylib) + 612 [0x191c173d4] + + ! : | + ! : | + 1 std::__insertion_sort_incomplete[abi:nqe220106](unsigned int*, unsigned int*, std::ranges::less) (in libc++.1.dylib) + 416 [0x191c1d8a4] + + ! : | + ! : | 1 std::__introsort(unsigned int*, unsigned int*, std::ranges::less, std::iterator_traits::difference_type, bool) (in libc++.1.dylib) + 632 [0x191c173e8] + + ! : | + ! : | 1 std::__insertion_sort_incomplete[abi:nqe220106](unsigned int*, unsigned int*, std::ranges::less) (in libc++.1.dylib) + 484 [0x191c1d8e8] + + ! : | + ! : 31 std::__introsort(unsigned int*, unsigned int*, std::ranges::less, std::iterator_traits::difference_type, bool) (in libc++.1.dylib) + 592 [0x191c173c0] + + ! : | + ! : | 31 std::__bitset_partition[abi:nqe220106](unsigned int*, unsigned int*, std::ranges::less) (in libc++.1.dylib) + 20,372,... [0x191c1d31c,0x191c1d47c,...] + + ! : | + ! : 11 std::__introsort(unsigned int*, unsigned int*, std::ranges::less, std::iterator_traits::difference_type, bool) (in libc++.1.dylib) + 52,1320,... [0x191c171a4,0x191c17698,...] + + ! : | + ! : 2 std::__introsort(unsigned int*, unsigned int*, std::ranges::less, std::iterator_traits::difference_type, bool) (in libc++.1.dylib) + 612 [0x191c173d4] + + ! : | + ! : 2 std::__insertion_sort_incomplete[abi:nqe220106](unsigned int*, unsigned int*, std::ranges::less) (in libc++.1.dylib) + 484,624 [0x191c1d8e8,0x191c1d974] + + ! : | + ! 35 std::__introsort(unsigned int*, unsigned int*, std::ranges::less, std::iterator_traits::difference_type, bool) (in libc++.1.dylib) + 592 [0x191c173c0] + + ! : | + ! : 35 std::__bitset_partition[abi:nqe220106](unsigned int*, unsigned int*, std::ranges::less) (in libc++.1.dylib) + 464,372,... [0x191c1d4d8,0x191c1d47c,...] + + ! : | + ! 12 std::__introsort(unsigned int*, unsigned int*, std::ranges::less, std::iterator_traits::difference_type, bool) (in libc++.1.dylib) + 472,1308,... [0x191c17348,0x191c1768c,...] + + ! : | + 21 std::__introsort(unsigned int*, unsigned int*, std::ranges::less, std::iterator_traits::difference_type, bool) (in libc++.1.dylib) + 592 [0x191c173c0] + + ! : | + ! 21 std::__bitset_partition[abi:nqe220106](unsigned int*, unsigned int*, std::ranges::less) (in libc++.1.dylib) + 248,20,... [0x191c1d400,0x191c1d31c,...] + + ! : | + 1 std::__introsort(unsigned int*, unsigned int*, std::ranges::less, std::iterator_traits::difference_type, bool) (in libc++.1.dylib) + 1352 [0x191c176b8] + + ! : | 40 std::__introsort(unsigned int*, unsigned int*, std::ranges::less, std::iterator_traits::difference_type, bool) (in libc++.1.dylib) + 592 [0x191c173c0] + + ! : | + 40 std::__bitset_partition[abi:nqe220106](unsigned int*, unsigned int*, std::ranges::less) (in libc++.1.dylib) + 372,20,... [0x191c1d47c,0x191c1d31c,...] + + ! : | 1 std::__introsort(unsigned int*, unsigned int*, std::ranges::less, std::iterator_traits::difference_type, bool) (in libc++.1.dylib) + 632 [0x191c173e8] + + ! : | + 1 std::__insertion_sort_incomplete[abi:nqe220106](unsigned int*, unsigned int*, std::ranges::less) (in libc++.1.dylib) + 416 [0x191c1d8a4] + + ! : | 1 std::__introsort(unsigned int*, unsigned int*, std::ranges::less, std::iterator_traits::difference_type, bool) (in libc++.1.dylib) + 112 [0x191c171e0] + + ! : 22 std::__introsort(unsigned int*, unsigned int*, std::ranges::less, std::iterator_traits::difference_type, bool) (in libc++.1.dylib) + 592 [0x191c173c0] + + ! : | 22 std::__bitset_partition[abi:nqe220106](unsigned int*, unsigned int*, std::ranges::less) (in libc++.1.dylib) + 372,20,... [0x191c1d47c,0x191c1d31c,...] + + ! : 10 decltype(auto) std::__variant_detail::__visitation::__base::__dispatcher<0ul>::__dispatch[abi:nqe210106]&&, std::__variant_detail::__base<(std::__variant_detail::_Trait)0, terrain::raster::RasterView, terrain::raster::RasterView> const&>(auto, std::__variant_detail::__base<(std::__variant_detail::_Trait)0, terrain::raster::RasterView, terrain::raster::RasterView> const&) (in _core.cpython-314-darwin.so) + 7096,7112 [0x105fb4e44,0x105fb4e54] variant:534 + + ! 345 decltype(auto) std::__variant_detail::__visitation::__base::__dispatcher<0ul>::__dispatch[abi:nqe210106]&&, std::__variant_detail::__base<(std::__variant_detail::_Trait)0, terrain::raster::RasterView, terrain::raster::RasterView> const&>(auto, std::__variant_detail::__base<(std::__variant_detail::_Trait)0, terrain::raster::RasterView, terrain::raster::RasterView> const&) (in _core.cpython-314-darwin.so) + 6132 [0x105fb4a80] variant:534 + + ! : 301 decltype(auto) std::__variant_detail::__visitation::__base::__dispatcher<0ul>::__dispatch[abi:nqe210106]&&, std::__variant_detail::__base<(std::__variant_detail::_Trait)0, terrain::raster::RasterView, terrain::raster::RasterView> const&>(auto, std::__variant_detail::__base<(std::__variant_detail::_Trait)0, terrain::raster::RasterView, terrain::raster::RasterView> const&) (in _core.cpython-314-darwin.so) + 3440,3380,... [0x105fb3ffc,0x105fb3fc0,...] variant:534 + + ! : 34 _xzm_free_tc (in libsystem_malloc.dylib) + 292,308,... [0x191b2599c,0x191b259ac,...] + + ! : 8 _free (in libsystem_malloc.dylib) + 36,12,... [0x191b29134,0x191b2911c,...] + + ! : 2 DYLD-STUB$$operator delete(void*) (in _core.cpython-314-darwin.so) + 4 [0x106004ad4] + + ! 278 decltype(auto) std::__variant_detail::__visitation::__base::__dispatcher<0ul>::__dispatch[abi:nqe210106]&&, std::__variant_detail::__base<(std::__variant_detail::_Trait)0, terrain::raster::RasterView, terrain::raster::RasterView> const&>(auto, std::__variant_detail::__base<(std::__variant_detail::_Trait)0, terrain::raster::RasterView, terrain::raster::RasterView> const&) (in _core.cpython-314-darwin.so) + 5380 [0x105fb4790] variant:534 + + ! : 67 terrain::mesh::LatticeMesh::split_inside(unsigned int, terrain::mesh::LatticeVertex) (in _core.cpython-314-darwin.so) + 376 [0x105fba388] lattice_mesh.hpp:182 + + ! : | 13 terrain::mesh::LatticeMesh::put(unsigned int, std::array, std::array) (in _core.cpython-314-darwin.so) + 824,832,... [0x105fbc120,0x105fbc128,...] lattice_mesh.hpp:297 + + ! : | 12 terrain::mesh::LatticeMesh::put(unsigned int, std::array, std::array) (in _core.cpython-314-darwin.so) + 48,64,... [0x105fbbe18,0x105fbbe28,...] lattice_mesh.hpp:287 + + ! : | 11 terrain::mesh::LatticeMesh::put(unsigned int, std::array, std::array) (in _core.cpython-314-darwin.so) + 260 [0x105fbbeec] lattice_mesh.hpp:289 + + ! : | 8 terrain::mesh::LatticeMesh::put(unsigned int, std::array, std::array) (in _core.cpython-314-darwin.so) + 844,948,... [0x105fbc134,0x105fbc19c,...] lattice_mesh.hpp:298 + + ! : | 7 terrain::mesh::LatticeMesh::put(unsigned int, std::array, std::array) (in _core.cpython-314-darwin.so) + 812,816,... [0x105fbc114,0x105fbc118,...] lattice_mesh.hpp:296 + + ! : | 5 terrain::mesh::LatticeMesh::put(unsigned int, std::array, std::array) (in _core.cpython-314-darwin.so) + 584 [0x105fbc030] lattice_mesh.hpp:291 + + ! : | 4 terrain::mesh::LatticeMesh::put(unsigned int, std::array, std::array) (in _core.cpython-314-darwin.so) + 440 [0x105fbbfa0] lattice_mesh.hpp:290 + + ! : | 3 terrain::mesh::LatticeMesh::put(unsigned int, std::array, std::array) (in _core.cpython-314-darwin.so) + 220 [0x105fbbec4] lattice_mesh.hpp:288 + + ! : | + 3 _platform_memmove (in libsystem_platform.dylib) + 88 [0x191d0bdb8] + + ! : | 2 terrain::mesh::LatticeMesh::put(unsigned int, std::array, std::array) (in _core.cpython-314-darwin.so) + 960 [0x105fbc1a8] lattice_mesh.hpp:300 + + ! : | 1 terrain::mesh::LatticeMesh::put(unsigned int, std::array, std::array) (in _core.cpython-314-darwin.so) + 32 [0x105fbbe08] lattice_mesh.hpp:286 + + ! : | 1 terrain::mesh::LatticeMesh::put(unsigned int, std::array, std::array) (in _core.cpython-314-darwin.so) + 800 [0x105fbc108] lattice_mesh.hpp:293 + + ! : 61 terrain::mesh::LatticeMesh::split_inside(unsigned int, terrain::mesh::LatticeVertex) (in _core.cpython-314-darwin.so) + 412,432,... [0x105fba3ac,0x105fba3c0,...] lattice_mesh.hpp:183 + + ! : 39 terrain::mesh::LatticeMesh::split_inside(unsigned int, terrain::mesh::LatticeVertex) (in _core.cpython-314-darwin.so) + 308 [0x105fba344] lattice_mesh.hpp:181 + + ! : | 9 terrain::mesh::LatticeMesh::put(unsigned int, std::array, std::array) (in _core.cpython-314-darwin.so) + 924,832,... [0x105fbc184,0x105fbc128,...] lattice_mesh.hpp:297 + + ! : | 6 terrain::mesh::LatticeMesh::put(unsigned int, std::array, std::array) (in _core.cpython-314-darwin.so) + 860,912,... [0x105fbc144,0x105fbc178,...] lattice_mesh.hpp:296 + + ! : | 5 terrain::mesh::LatticeMesh::put(unsigned int, std::array, std::array) (in _core.cpython-314-darwin.so) + 56,72 [0x105fbbe20,0x105fbbe30] lattice_mesh.hpp:287 + + ! : | 3 terrain::mesh::LatticeMesh::put(unsigned int, std::array, std::array) (in _core.cpython-314-darwin.so) + 220 [0x105fbbec4] lattice_mesh.hpp:288 + + ! : | + 3 _platform_memmove (in libsystem_platform.dylib) + 88 [0x191d0bdb8] + + ! : | 3 terrain::mesh::LatticeMesh::put(unsigned int, std::array, std::array) (in _core.cpython-314-darwin.so) + 848,892,... [0x105fbc138,0x105fbc164,...] lattice_mesh.hpp:298 + + ! : | 2 terrain::mesh::LatticeMesh::put(unsigned int, std::array, std::array) (in _core.cpython-314-darwin.so) + 416 [0x105fbbf88] lattice_mesh.hpp:289 + + ! : | + 2 _platform_memmove (in libsystem_platform.dylib) + 88 [0x191d0bdb8] + + ! : | 2 terrain::mesh::LatticeMesh::put(unsigned int, std::array, std::array) (in _core.cpython-314-darwin.so) + 756 [0x105fbc0dc] lattice_mesh.hpp:291 + + ! : | + 2 _platform_memmove (in libsystem_platform.dylib) + 88,108 [0x191d0bdb8,0x191d0bdcc] + + ! : | 2 terrain::mesh::LatticeMesh::put(unsigned int, std::array, std::array) (in _core.cpython-314-darwin.so) + 808 [0x105fbc110] lattice_mesh.hpp:294 + + ! : | 2 terrain::mesh::LatticeMesh::put(unsigned int, std::array, std::array) (in _core.cpython-314-darwin.so) + 960 [0x105fbc1a8] lattice_mesh.hpp:300 + + ! : | 1 terrain::mesh::LatticeMesh::put(unsigned int, std::array, std::array) (in _core.cpython-314-darwin.so) + 20 [0x105fbbdfc] lattice_mesh.hpp:286 + + ! : | 1 terrain::mesh::LatticeMesh::put(unsigned int, std::array, std::array) (in _core.cpython-314-darwin.so) + 104 [0x105fbbe50] lattice_mesh.hpp:288 + + ! : | 1 terrain::mesh::LatticeMesh::put(unsigned int, std::array, std::array) (in _core.cpython-314-darwin.so) + 260 [0x105fbbeec] lattice_mesh.hpp:289 + + ! : | 1 terrain::mesh::LatticeMesh::put(unsigned int, std::array, std::array) (in _core.cpython-314-darwin.so) + 584 [0x105fbc030] lattice_mesh.hpp:291 + + ! : | 1 terrain::mesh::LatticeMesh::put(unsigned int, std::array, std::array) (in _core.cpython-314-darwin.so) + 796 [0x105fbc104] lattice_mesh.hpp:293 + + ! : 32 terrain::mesh::LatticeMesh::split_inside(unsigned int, terrain::mesh::LatticeVertex) (in _core.cpython-314-darwin.so) + 484,480,... [0x105fba3f4,0x105fba3f0,...] lattice_mesh.hpp:184 + + ! : 20 terrain::mesh::LatticeMesh::split_inside(unsigned int, terrain::mesh::LatticeVertex) (in _core.cpython-314-darwin.so) + 244 [0x105fba304] lattice_mesh.hpp:180 + + ! : | 6 terrain::mesh::LatticeMesh::put(unsigned int, std::array, std::array) (in _core.cpython-314-darwin.so) + 824,880,... [0x105fbc120,0x105fbc158,...] lattice_mesh.hpp:297 + + ! : | 5 terrain::mesh::LatticeMesh::put(unsigned int, std::array, std::array) (in _core.cpython-314-darwin.so) + 48,72,... [0x105fbbe18,0x105fbbe30,...] lattice_mesh.hpp:287 + + ! : | 4 terrain::mesh::LatticeMesh::put(unsigned int, std::array, std::array) (in _core.cpython-314-darwin.so) + 868,912 [0x105fbc14c,0x105fbc178] lattice_mesh.hpp:296 + + ! : | 3 terrain::mesh::LatticeMesh::put(unsigned int, std::array, std::array) (in _core.cpython-314-darwin.so) + 956,948 [0x105fbc1a4,0x105fbc19c] lattice_mesh.hpp:298 + + ! : | 2 terrain::mesh::LatticeMesh::put(unsigned int, std::array, std::array) (in _core.cpython-314-darwin.so) + 960 [0x105fbc1a8] lattice_mesh.hpp:300 + + ! : 17 terrain::mesh::LatticeMesh::put(unsigned int, std::array, std::array) (in _core.cpython-314-darwin.so) + 980,964,... [0x105fbc1bc,0x105fbc1ac,...] lattice_mesh.hpp:300 + + ! : 8 terrain::mesh::LatticeMesh::split_inside(unsigned int, terrain::mesh::LatticeVertex) (in _core.cpython-314-darwin.so) + 56 [0x105fba248] lattice_mesh.hpp:176 + + ! : | 3 terrain::mesh::LatticeMesh::add_vertex(terrain::mesh::MeshVertex) (in _core.cpython-314-darwin.so) + 140 [0x105fbc338] lattice_mesh.hpp:280 + + ! : | + 3 operator new(unsigned long) (in libc++abi.dylib) + 52 [0x191cb83c0] + + ! : | + 3 _xzm_malloc_large_huge (in libsystem_malloc.dylib) + 968 [0x191b1c4ac] + + ! : | + 2 xzm_segment_group_alloc_chunk (in libsystem_malloc.dylib) + 564 [0x191afc92c] + + ! : | + ! 2 _xzm_segment_group_find_and_allocate_chunk (in libsystem_malloc.dylib) + 508 [0x191afcf9c] + + ! : | + ! 2 _xzm_segment_group_span_mark_smaller (in libsystem_malloc.dylib) + 156 [0x191afe3c8] + + ! : | + 1 xzm_segment_group_alloc_chunk (in libsystem_malloc.dylib) + 276 [0x191afc80c] + + ! : | 3 terrain::mesh::LatticeMesh::add_vertex(terrain::mesh::MeshVertex) (in _core.cpython-314-darwin.so) + 40 [0x105fbc2d4] lattice_mesh.hpp:280 + + ! : | 2 terrain::mesh::LatticeMesh::add_vertex(terrain::mesh::MeshVertex) (in _core.cpython-314-darwin.so) + 176 [0x105fbc35c] lattice_mesh.hpp:280 + + ! : | 2 _platform_memmove (in libsystem_platform.dylib) + 88 [0x191d0bdb8] + + ! : 8 terrain::mesh::LatticeMesh::split_inside(unsigned int, terrain::mesh::LatticeVertex) (in _core.cpython-314-darwin.so) + 348,344 [0x105fba36c,0x105fba368] lattice_mesh.hpp:182 + + ! : 6 terrain::mesh::LatticeMesh::add_vertex(terrain::mesh::MeshVertex) (in _core.cpython-314-darwin.so) + 240,232 [0x105fbc39c,0x105fbc394] lattice_mesh.hpp:281 + + ! : 6 terrain::mesh::LatticeMesh::split_inside(unsigned int, terrain::mesh::LatticeVertex) (in _core.cpython-314-darwin.so) + 308,160,... [0x105fba344,0x105fba2b0,...] lattice_mesh.hpp:0 + + ! : 5 terrain::mesh::LatticeMesh::split_inside(unsigned int, terrain::mesh::LatticeVertex) (in _core.cpython-314-darwin.so) + 216,192 [0x105fba2e8,0x105fba2d0] lattice_mesh.hpp:180 + + ! : 4 decltype(auto) std::__variant_detail::__visitation::__base::__dispatcher<0ul>::__dispatch[abi:nqe210106]&&, std::__variant_detail::__base<(std::__variant_detail::_Trait)0, terrain::raster::RasterView, terrain::raster::RasterView> const&>(auto, std::__variant_detail::__base<(std::__variant_detail::_Trait)0, terrain::raster::RasterView, terrain::raster::RasterView> const&) (in _core.cpython-314-darwin.so) + 5420,5436 [0x105fb47b8,0x105fb47c8] variant:534 + + ! : 3 terrain::mesh::LatticeMesh::split_inside(unsigned int, terrain::mesh::LatticeVertex) (in _core.cpython-314-darwin.so) + 284 [0x105fba32c] lattice_mesh.hpp:181 + + ! : 2 terrain::mesh::LatticeMesh::split_inside(unsigned int, terrain::mesh::LatticeVertex) (in _core.cpython-314-darwin.so) + 48 [0x105fba240] lattice_mesh.hpp:176 + + ! 235 decltype(auto) std::__variant_detail::__visitation::__base::__dispatcher<0ul>::__dispatch[abi:nqe210106]&&, std::__variant_detail::__base<(std::__variant_detail::_Trait)0, terrain::raster::RasterView, terrain::raster::RasterView> const&>(auto, std::__variant_detail::__base<(std::__variant_detail::_Trait)0, terrain::raster::RasterView, terrain::raster::RasterView> const&) (in _core.cpython-314-darwin.so) + 3844 [0x105fb4190] variant:534 + + ! : 51 terrain::mesh::LatticeMesh::split_edge(unsigned int, unsigned int, terrain::mesh::MeshVertex) (in _core.cpython-314-darwin.so) + 440,460,... [0x105fba5f0,0x105fba604,...] lattice_mesh.hpp:206 + + ! : 47 terrain::mesh::LatticeMesh::split_edge(unsigned int, unsigned int, terrain::mesh::MeshVertex) (in _core.cpython-314-darwin.so) + 832,860,... [0x105fba778,0x105fba794,...] lattice_mesh.hpp:217 + + ! : 28 terrain::mesh::LatticeMesh::split_edge(unsigned int, unsigned int, terrain::mesh::MeshVertex) (in _core.cpython-314-darwin.so) + 408 [0x105fba5d0] lattice_mesh.hpp:204 + + ! : | 7 terrain::mesh::LatticeMesh::put(unsigned int, std::array, std::array) (in _core.cpython-314-darwin.so) + 812,856,... [0x105fbc114,0x105fbc140,...] lattice_mesh.hpp:296 + + ! : | 6 terrain::mesh::LatticeMesh::put(unsigned int, std::array, std::array) (in _core.cpython-314-darwin.so) + 888,824,... [0x105fbc160,0x105fbc120,...] lattice_mesh.hpp:297 + + ! : | 6 terrain::mesh::LatticeMesh::put(unsigned int, std::array, std::array) (in _core.cpython-314-darwin.so) + 944,852,... [0x105fbc198,0x105fbc13c,...] lattice_mesh.hpp:298 + + ! : | 3 terrain::mesh::LatticeMesh::put(unsigned int, std::array, std::array) (in _core.cpython-314-darwin.so) + 960 [0x105fbc1a8] lattice_mesh.hpp:300 + + ! : | 2 terrain::mesh::LatticeMesh::put(unsigned int, std::array, std::array) (in _core.cpython-314-darwin.so) + 52,76 [0x105fbbe1c,0x105fbbe34] lattice_mesh.hpp:287 + + ! : | 1 terrain::mesh::LatticeMesh::put(unsigned int, std::array, std::array) (in _core.cpython-314-darwin.so) + 260 [0x105fbbeec] lattice_mesh.hpp:289 + + ! : | 1 terrain::mesh::LatticeMesh::put(unsigned int, std::array, std::array) (in _core.cpython-314-darwin.so) + 440 [0x105fbbfa0] lattice_mesh.hpp:290 + + ! : | 1 terrain::mesh::LatticeMesh::put(unsigned int, std::array, std::array) (in _core.cpython-314-darwin.so) + 584 [0x105fbc030] lattice_mesh.hpp:291 + + ! : | 1 terrain::mesh::LatticeMesh::put(unsigned int, std::array, std::array) (in _core.cpython-314-darwin.so) + 796 [0x105fbc104] lattice_mesh.hpp:293 + + ! : 27 terrain::mesh::LatticeMesh::split_edge(unsigned int, unsigned int, terrain::mesh::MeshVertex) (in _core.cpython-314-darwin.so) + 540,520,... [0x105fba654,0x105fba640,...] lattice_mesh.hpp:0 + + ! : 16 terrain::mesh::LatticeMesh::split_edge(unsigned int, unsigned int, terrain::mesh::MeshVertex) (in _core.cpython-314-darwin.so) + 740 [0x105fba71c] lattice_mesh.hpp:215 + + ! : | 5 terrain::mesh::LatticeMesh::put(unsigned int, std::array, std::array) (in _core.cpython-314-darwin.so) + 812,856 [0x105fbc114,0x105fbc140] lattice_mesh.hpp:296 + + ! : | 4 terrain::mesh::LatticeMesh::put(unsigned int, std::array, std::array) (in _core.cpython-314-darwin.so) + 824,872 [0x105fbc120,0x105fbc150] lattice_mesh.hpp:297 + + ! : | 3 terrain::mesh::LatticeMesh::put(unsigned int, std::array, std::array) (in _core.cpython-314-darwin.so) + 48,72 [0x105fbbe18,0x105fbbe30] lattice_mesh.hpp:287 + + ! : | 2 terrain::mesh::LatticeMesh::put(unsigned int, std::array, std::array) (in _core.cpython-314-darwin.so) + 844,904 [0x105fbc134,0x105fbc170] lattice_mesh.hpp:298 + + ! : | 1 terrain::mesh::LatticeMesh::put(unsigned int, std::array, std::array) (in _core.cpython-314-darwin.so) + 28 [0x105fbbe04] lattice_mesh.hpp:286 + + ! : | 1 terrain::mesh::LatticeMesh::put(unsigned int, std::array, std::array) (in _core.cpython-314-darwin.so) + 960 [0x105fbc1a8] lattice_mesh.hpp:300 + + ! : 12 terrain::mesh::LatticeMesh::put(unsigned int, std::array, std::array) (in _core.cpython-314-darwin.so) + 980,972,... [0x105fbc1bc,0x105fbc1b4,...] lattice_mesh.hpp:300 + + ! : 12 terrain::mesh::LatticeMesh::split_edge(unsigned int, unsigned int, terrain::mesh::MeshVertex) (in _core.cpython-314-darwin.so) + 336 [0x105fba588] lattice_mesh.hpp:203 + + ! : | 4 terrain::mesh::LatticeMesh::put(unsigned int, std::array, std::array) (in _core.cpython-314-darwin.so) + 920,908 [0x105fbc180,0x105fbc174] lattice_mesh.hpp:296 + + ! : | 3 terrain::mesh::LatticeMesh::put(unsigned int, std::array, std::array) (in _core.cpython-314-darwin.so) + 56,60,... [0x105fbbe20,0x105fbbe24,...] lattice_mesh.hpp:287 + + ! : | 3 terrain::mesh::LatticeMesh::put(unsigned int, std::array, std::array) (in _core.cpython-314-darwin.so) + 844,848,... [0x105fbc134,0x105fbc138,...] lattice_mesh.hpp:298 + + ! : | 2 terrain::mesh::LatticeMesh::put(unsigned int, std::array, std::array) (in _core.cpython-314-darwin.so) + 888,940 [0x105fbc160,0x105fbc194] lattice_mesh.hpp:297 + + ! : 10 terrain::mesh::LatticeMesh::split_edge(unsigned int, unsigned int, terrain::mesh::MeshVertex) (in _core.cpython-314-darwin.so) + 796 [0x105fba754] lattice_mesh.hpp:216 + + ! : | 3 terrain::mesh::LatticeMesh::put(unsigned int, std::array, std::array) (in _core.cpython-314-darwin.so) + 48,72,... [0x105fbbe18,0x105fbbe30,...] lattice_mesh.hpp:287 + + ! : | 3 terrain::mesh::LatticeMesh::put(unsigned int, std::array, std::array) (in _core.cpython-314-darwin.so) + 812,920 [0x105fbc114,0x105fbc180] lattice_mesh.hpp:296 + + ! : | 3 terrain::mesh::LatticeMesh::put(unsigned int, std::array, std::array) (in _core.cpython-314-darwin.so) + 888,880 [0x105fbc160,0x105fbc158] lattice_mesh.hpp:297 + + ! : | 1 terrain::mesh::LatticeMesh::put(unsigned int, std::array, std::array) (in _core.cpython-314-darwin.so) + 948 [0x105fbc19c] lattice_mesh.hpp:298 + + ! : 7 terrain::mesh::LatticeMesh::split_edge(unsigned int, unsigned int, terrain::mesh::MeshVertex) (in _core.cpython-314-darwin.so) + 712,720 [0x105fba700,0x105fba708] lattice_mesh.hpp:215 + + ! : 4 terrain::mesh::LatticeMesh::split_edge(unsigned int, unsigned int, terrain::mesh::MeshVertex) (in _core.cpython-314-darwin.so) + 240,248 [0x105fba528,0x105fba530] lattice_mesh.hpp:201 + + ! : 4 terrain::mesh::LatticeMesh::split_edge(unsigned int, unsigned int, terrain::mesh::MeshVertex) (in _core.cpython-314-darwin.so) + 384 [0x105fba5b8] lattice_mesh.hpp:205 + + ! : 4 terrain::mesh::LatticeMesh::split_edge(unsigned int, unsigned int, terrain::mesh::MeshVertex) (in _core.cpython-314-darwin.so) + 588,572 [0x105fba684,0x105fba674] lattice_mesh.hpp:213 + + ! : 3 terrain::mesh::LatticeMesh::split_edge(unsigned int, unsigned int, terrain::mesh::MeshVertex) (in _core.cpython-314-darwin.so) + 208,160 [0x105fba508,0x105fba4d8] lattice_mesh.hpp:197 + + ! : 3 terrain::mesh::LatticeMesh::split_edge(unsigned int, unsigned int, terrain::mesh::MeshVertex) (in _core.cpython-314-darwin.so) + 616,628,... [0x105fba6a0,0x105fba6ac,...] lattice_mesh.hpp:214 + + ! : 2 terrain::mesh::LatticeMesh::add_vertex(terrain::mesh::MeshVertex) (in _core.cpython-314-darwin.so) + 240 [0x105fbc39c] lattice_mesh.hpp:281 + + ! : 2 terrain::mesh::LatticeMesh::split_edge(unsigned int, unsigned int, terrain::mesh::MeshVertex) (in _core.cpython-314-darwin.so) + 8,24 [0x105fba440,0x105fba450] lattice_mesh.hpp:193 + + ! : 1 terrain::mesh::LatticeMesh::split_edge(unsigned int, unsigned int, terrain::mesh::MeshVertex) (in _core.cpython-314-darwin.so) + 48 [0x105fba468] lattice_mesh.hpp:194 + + ! : | 1 terrain::mesh::LatticeMesh::add_vertex(terrain::mesh::MeshVertex) (in _core.cpython-314-darwin.so) + 40 [0x105fbc2d4] lattice_mesh.hpp:280 + + ! : 1 terrain::mesh::LatticeMesh::split_edge(unsigned int, unsigned int, terrain::mesh::MeshVertex) (in _core.cpython-314-darwin.so) + 368 [0x105fba5a8] lattice_mesh.hpp:204 + + ! : 1 terrain::mesh::LatticeMesh::split_edge(unsigned int, unsigned int, terrain::mesh::MeshVertex) (in _core.cpython-314-darwin.so) + 772 [0x105fba73c] lattice_mesh.hpp:216 + + ! 205 decltype(auto) std::__variant_detail::__visitation::__base::__dispatcher<0ul>::__dispatch[abi:nqe210106]&&, std::__variant_detail::__base<(std::__variant_detail::_Trait)0, terrain::raster::RasterView, terrain::raster::RasterView> const&>(auto, std::__variant_detail::__base<(std::__variant_detail::_Trait)0, terrain::raster::RasterView, terrain::raster::RasterView> const&) (in _core.cpython-314-darwin.so) + 6732 [0x105fb4cd8] variant:534 + + ! : 204 decltype(auto) std::__variant_detail::__visitation::__base::__dispatcher<0ul>::__dispatch[abi:nqe210106]&&, std::__variant_detail::__base<(std::__variant_detail::_Trait)0, terrain::raster::RasterView, terrain::raster::RasterView> const&>(auto, std::__variant_detail::__base<(std::__variant_detail::_Trait)0, terrain::raster::RasterView, terrain::raster::RasterView> const&) (in _core.cpython-314-darwin.so) + 6820,6848,... [0x105fb4d30,0x105fb4d4c,...] variant:534 + + ! : 1 std::chrono::steady_clock::now() (in libc++.1.dylib) + 28 [0x191c115d4] + + ! : 1 clock_gettime (in libsystem_c.dylib) + 60 [0x191b98100] + + ! : 1 clock_gettime_nsec_np (in libsystem_c.dylib) + 240 [0x191b8a11c] + + ! : 1 mach_timebase_info (in libsystem_kernel.dylib) + 0 [0x191cbcfb8] + + ! 52 decltype(auto) std::__variant_detail::__visitation::__base::__dispatcher<0ul>::__dispatch[abi:nqe210106]&&, std::__variant_detail::__base<(std::__variant_detail::_Trait)0, terrain::raster::RasterView, terrain::raster::RasterView> const&>(auto, std::__variant_detail::__base<(std::__variant_detail::_Trait)0, terrain::raster::RasterView, terrain::raster::RasterView> const&) (in _core.cpython-314-darwin.so) + 5640 [0x105fb4894] variant:534 + + ! : 42 operator new(unsigned long) (in libc++abi.dylib) + 52 [0x191cb83c0] + + ! : | 30 _xzm_malloc_tc (in libsystem_malloc.dylib) + 276,92,... [0x191b23aa4,0x191b239ec,...] + + ! : | 12 malloc_type_malloc (in libsystem_malloc.dylib) + 28,16,... [0x191b07758,0x191b0774c,...] + + ! : 5 ??? (in ) [0x1995504f8] + + ! : 3 DYLD-STUB$$operator new(unsigned long) (in _core.cpython-314-darwin.so) + 4,8 [0x106004af8,0x106004afc] + + ! : 2 operator new(unsigned long) (in libc++abi.dylib) + 36 [0x191cb83b0] + + ! 47 decltype(auto) std::__variant_detail::__visitation::__base::__dispatcher<0ul>::__dispatch[abi:nqe210106]&&, std::__variant_detail::__base<(std::__variant_detail::_Trait)0, terrain::raster::RasterView, terrain::raster::RasterView> const&>(auto, std::__variant_detail::__base<(std::__variant_detail::_Trait)0, terrain::raster::RasterView, terrain::raster::RasterView> const&) (in _core.cpython-314-darwin.so) + 7556 [0x105fb5010] variant:534 + + ! : 37 decltype(auto) std::__variant_detail::__visitation::__base::__dispatcher<0ul>::__dispatch[abi:nqe210106]&&, std::__variant_detail::__base<(std::__variant_detail::_Trait)0, terrain::raster::RasterView, terrain::raster::RasterView> const&>(auto, std::__variant_detail::__base<(std::__variant_detail::_Trait)0, terrain::raster::RasterView, terrain::raster::RasterView> const&) (in _core.cpython-314-darwin.so) + 7548,7340,... [0x105fb5008,0x105fb4f38,...] variant:534 + + ! : 5 terrain::refinement::vertex_z>(terrain::raster::RasterView const&, terrain::mesh::MeshVertex) (in _core.cpython-314-darwin.so) + 0 [0x105fbf3d8] scan.hpp:74 + + ! : 3 terrain::refinement::vertex_z>(terrain::raster::RasterView const&, terrain::mesh::MeshVertex) (in _core.cpython-314-darwin.so) + 132 [0x105fbf45c] scan.hpp:87 + + ! : 2 terrain::refinement::vertex_z>(terrain::raster::RasterView const&, terrain::mesh::MeshVertex) (in _core.cpython-314-darwin.so) + 84 [0x105fbf42c] scan.hpp:75 + + ! 30 decltype(auto) std::__variant_detail::__visitation::__base::__dispatcher<0ul>::__dispatch[abi:nqe210106]&&, std::__variant_detail::__base<(std::__variant_detail::_Trait)0, terrain::raster::RasterView, terrain::raster::RasterView> const&>(auto, std::__variant_detail::__base<(std::__variant_detail::_Trait)0, terrain::raster::RasterView, terrain::raster::RasterView> const&) (in _core.cpython-314-darwin.so) + 8088 [0x105fb5224] variant:534 + + ! : 19 terrain::mesh::LatticeMesh::constraint_edges() const (in _core.cpython-314-darwin.so) + 120,92 [0x105fbb264,0x105fbb248] lattice_mesh.hpp:250 + + ! : 11 terrain::mesh::LatticeMesh::constraint_edges() const (in _core.cpython-314-darwin.so) + 184,180 [0x105fbb2a4,0x105fbb2a0] lattice_mesh.hpp:253 + + ! 27 decltype(auto) std::__variant_detail::__visitation::__base::__dispatcher<0ul>::__dispatch[abi:nqe210106]&&, std::__variant_detail::__base<(std::__variant_detail::_Trait)0, terrain::raster::RasterView, terrain::raster::RasterView> const&>(auto, std::__variant_detail::__base<(std::__variant_detail::_Trait)0, terrain::raster::RasterView, terrain::raster::RasterView> const&) (in _core.cpython-314-darwin.so) + 6116 [0x105fb4a70] variant:534 + + ! : 19 _xzm_free_tc (in libsystem_malloc.dylib) + 104,308,... [0x191b258e0,0x191b259ac,...] + + ! : 4 DYLD-STUB$$operator delete(void*) (in _core.cpython-314-darwin.so) + 4 [0x106004ad4] + + ! : 4 _free (in libsystem_malloc.dylib) + 0,12,... [0x191b29110,0x191b2911c,...] + + ! 24 decltype(auto) std::__variant_detail::__visitation::__base::__dispatcher<0ul>::__dispatch[abi:nqe210106]&&, std::__variant_detail::__base<(std::__variant_detail::_Trait)0, terrain::raster::RasterView, terrain::raster::RasterView> const&>(auto, std::__variant_detail::__base<(std::__variant_detail::_Trait)0, terrain::raster::RasterView, terrain::raster::RasterView> const&) (in _core.cpython-314-darwin.so) + 1672 [0x105fb3914] variant:534 + + ! : 7 terrain::mesh::improve>(terrain::mesh::LatticeMesh&, terrain::mesh::LatticeFrame const&, terrain::mesh::QualityOptions const&) (in _core.cpython-314-darwin.so) + 3288 [0x105fb984c] quality.hpp:177 + + ! : | 4 terrain::mesh::legalise_around, terrain::mesh::QualityOutcome terrain::mesh::improve>(terrain::mesh::LatticeMesh&, terrain::mesh::LatticeFrame const&, terrain::mesh::QualityOptions const&)::'lambda0'(unsigned int)>(terrain::mesh::LatticeMesh&, unsigned int, std::span, terrain::mesh::LatticeFrame const&, terrain::mesh::QualityOutcome terrain::mesh::improve>(terrain::mesh::LatticeMesh&, terrain::mesh::LatticeFrame const&, terrain::mesh::QualityOptions const&)::'lambda0'(unsigned int)&&) (in _core.cpython-314-darwin.so) + 256 [0x105fbe69c] lawson.hpp:93 + + ! : | + 1 terrain::mesh::detail::must_flip>(terrain::mesh::LatticeMesh const&, unsigned int, unsigned int, terrain::mesh::LatticeFrame const&) (in _core.cpython-314-darwin.so) + 1184 [0x105fbbae4] lawson.hpp:0 + + ! : | + ! 1 terrain::pred::DetriaExact::incircle_ccw(terrain::Point2 const&, terrain::Point2 const&, terrain::Point2 const&, terrain::Point2 const&) (in _core.cpython-314-darwin.so) + 328 [0x106004158] detria_exact.cpp:97 + + ! : | + ! 1 detria::predicates::incircleadapt(double*, double*, double*, double*, double) (in _core.cpython-314-darwin.so) + 1572 [0x105ffe584] detria.hpp:606 + + ! : | + ! 1 detria::predicates::incircleadapt(double*, double*, double*, double*, double) (in _core.cpython-314-darwin.so) + 1612 [0x105ffe5ac] detria.hpp:0 + + ! : | + 1 terrain::mesh::detail::must_flip>(terrain::mesh::LatticeMesh const&, unsigned int, unsigned int, terrain::mesh::LatticeFrame const&) (in _core.cpython-314-darwin.so) + 148 [0x105fbb6d8] lawson.hpp:57 + + ! : | + 1 terrain::mesh::detail::must_flip>(terrain::mesh::LatticeMesh const&, unsigned int, unsigned int, terrain::mesh::LatticeFrame const&) (in _core.cpython-314-darwin.so) + 364 [0x105fbb7b0] lawson.hpp:71 + + ! : | + 1 terrain::mesh::detail::must_flip>(terrain::mesh::LatticeMesh const&, unsigned int, unsigned int, terrain::mesh::LatticeFrame const&) (in _core.cpython-314-darwin.so) + 80 [0x105fbb694] lawson.hpp:74 + + ! : | 1 terrain::mesh::legalise_around, terrain::mesh::QualityOutcome terrain::mesh::improve>(terrain::mesh::LatticeMesh&, terrain::mesh::LatticeFrame const&, terrain::mesh::QualityOptions const&)::'lambda0'(unsigned int)>(terrain::mesh::LatticeMesh&, unsigned int, std::span, terrain::mesh::LatticeFrame const&, terrain::mesh::QualityOutcome terrain::mesh::improve>(terrain::mesh::LatticeMesh&, terrain::mesh::LatticeFrame const&, terrain::mesh::QualityOptions const&)::'lambda0'(unsigned int)&&) (in _core.cpython-314-darwin.so) + 848 [0x105fbe8ec] lawson.hpp:101 + + ! : | + 1 operator new(unsigned long) (in libc++abi.dylib) + 52 [0x191cb83c0] + + ! : | + 1 _xzm_malloc_tc (in libsystem_malloc.dylib) + 276 [0x191b23aa4] + + ! : | 1 terrain::mesh::legalise_around, terrain::mesh::QualityOutcome terrain::mesh::improve>(terrain::mesh::LatticeMesh&, terrain::mesh::LatticeFrame const&, terrain::mesh::QualityOptions const&)::'lambda0'(unsigned int)>(terrain::mesh::LatticeMesh&, unsigned int, std::span, terrain::mesh::LatticeFrame const&, terrain::mesh::QualityOutcome terrain::mesh::improve>(terrain::mesh::LatticeMesh&, terrain::mesh::LatticeFrame const&, terrain::mesh::QualityOptions const&)::'lambda0'(unsigned int)&&) (in _core.cpython-314-darwin.so) + 260 [0x105fbe6a0] lawson.hpp:95 + + ! : | 1 terrain::mesh::legalise_around, terrain::mesh::QualityOutcome terrain::mesh::improve>(terrain::mesh::LatticeMesh&, terrain::mesh::LatticeFrame const&, terrain::mesh::QualityOptions const&)::'lambda0'(unsigned int)>(terrain::mesh::LatticeMesh&, unsigned int, std::span, terrain::mesh::LatticeFrame const&, terrain::mesh::QualityOutcome terrain::mesh::improve>(terrain::mesh::LatticeMesh&, terrain::mesh::LatticeFrame const&, terrain::mesh::QualityOptions const&)::'lambda0'(unsigned int)&&) (in _core.cpython-314-darwin.so) + 308 [0x105fbe6d0] lawson.hpp:96 + + ! : | 1 terrain::mesh::LatticeMesh::flip(unsigned int, unsigned int) (in _core.cpython-314-darwin.so) + 416 [0x105fbbd04] lattice_mesh.hpp:239 + + ! : | 1 terrain::mesh::LatticeMesh::put(unsigned int, std::array, std::array) (in _core.cpython-314-darwin.so) + 824 [0x105fbc120] lattice_mesh.hpp:297 + + ! : 6 terrain::mesh::improve>(terrain::mesh::LatticeMesh&, terrain::mesh::LatticeFrame const&, terrain::mesh::QualityOptions const&) (in _core.cpython-314-darwin.so) + 3492 [0x105fb9918] quality.hpp:183 + + ! : | 6 terrain::mesh::improve>(terrain::mesh::LatticeMesh&, terrain::mesh::LatticeFrame const&, terrain::mesh::QualityOptions const&) (in _core.cpython-314-darwin.so) + 444,536,... [0x105fb8d30,0x105fb8d8c,...] quality.hpp:111 + + ! : 3 terrain::mesh::improve>(terrain::mesh::LatticeMesh&, terrain::mesh::LatticeFrame const&, terrain::mesh::QualityOptions const&) (in _core.cpython-314-darwin.so) + 3308 [0x105fb9860] quality.hpp:179 + + ! : | 1 std::__introsort(unsigned int*, unsigned int*, std::ranges::less, std::iterator_traits::difference_type, bool) (in libc++.1.dylib) + 592 [0x191c173c0] + + ! : | + 1 std::__bitset_partition[abi:nqe220106](unsigned int*, unsigned int*, std::ranges::less) (in libc++.1.dylib) + 612 [0x191c1d56c] + + ! : | 1 std::__introsort(unsigned int*, unsigned int*, std::ranges::less, std::iterator_traits::difference_type, bool) (in libc++.1.dylib) + 664 [0x191c17408] + + ! : | + 1 std::__introsort(unsigned int*, unsigned int*, std::ranges::less, std::iterator_traits::difference_type, bool) (in libc++.1.dylib) + 664 [0x191c17408] + + ! : | + 1 std::__introsort(unsigned int*, unsigned int*, std::ranges::less, std::iterator_traits::difference_type, bool) (in libc++.1.dylib) + 664 [0x191c17408] + + ! : | + 1 std::__introsort(unsigned int*, unsigned int*, std::ranges::less, std::iterator_traits::difference_type, bool) (in libc++.1.dylib) + 664 [0x191c17408] + + ! : | + 1 std::__introsort(unsigned int*, unsigned int*, std::ranges::less, std::iterator_traits::difference_type, bool) (in libc++.1.dylib) + 664 [0x191c17408] + + ! : | + 1 std::__introsort(unsigned int*, unsigned int*, std::ranges::less, std::iterator_traits::difference_type, bool) (in libc++.1.dylib) + 664 [0x191c17408] + + ! : | + 1 std::__introsort(unsigned int*, unsigned int*, std::ranges::less, std::iterator_traits::difference_type, bool) (in libc++.1.dylib) + 1284 [0x191c17674] + + ! : | 1 std::__introsort(unsigned int*, unsigned int*, std::ranges::less, std::iterator_traits::difference_type, bool) (in libc++.1.dylib) + 1224 [0x191c17638] + + ! : 2 terrain::mesh::improve>(terrain::mesh::LatticeMesh&, terrain::mesh::LatticeFrame const&, terrain::mesh::QualityOptions const&) (in _core.cpython-314-darwin.so) + 256 [0x105fb8c74] quality.hpp:106 + + ! : | 1 terrain::mesh::improve>(terrain::mesh::LatticeMesh&, terrain::mesh::LatticeFrame const&, terrain::mesh::QualityOptions const&)::'lambda'(unsigned int)::operator()(unsigned int) const (in _core.cpython-314-darwin.so) + 252 [0x105fbe268] quality.hpp:102 + + ! : | + 1 terrain::mesh::improve>(terrain::mesh::LatticeMesh&, terrain::mesh::LatticeFrame const&, terrain::mesh::QualityOptions const&)::'lambda'(unsigned int)::operator()(unsigned int) const (in _core.cpython-314-darwin.so) + 732 [0x105fbe448] quality.hpp:103 + + ! : | 1 terrain::mesh::improve>(terrain::mesh::LatticeMesh&, terrain::mesh::LatticeFrame const&, terrain::mesh::QualityOptions const&)::'lambda'(unsigned int)::operator()(unsigned int) const (in _core.cpython-314-darwin.so) + 508 [0x105fbe368] quality.hpp:103 + + ! : | 1 _platform_memmove (in libsystem_platform.dylib) + 180 [0x191d0be14] + + ! : 2 terrain::mesh::improve>(terrain::mesh::LatticeMesh&, terrain::mesh::LatticeFrame const&, terrain::mesh::QualityOptions const&) (in _core.cpython-314-darwin.so) + 3164 [0x105fb97d0] quality.hpp:165 + + ! : | 2 terrain::mesh::improve>(terrain::mesh::LatticeMesh&, terrain::mesh::LatticeFrame const&, terrain::mesh::QualityOptions const&) (in _core.cpython-314-darwin.so) + 3204 [0x105fb97f8] quality.hpp:176 + + ! : 2 terrain::mesh::improve>(terrain::mesh::LatticeMesh&, terrain::mesh::LatticeFrame const&, terrain::mesh::QualityOptions const&) (in _core.cpython-314-darwin.so) + 3220 [0x105fb9808] quality.hpp:176 + + ! : | 1 ??? (in ) [0x1995504f8] + + ! : | 1 operator new(unsigned long) (in libc++abi.dylib) + 52 [0x191cb83c0] + + ! : | 1 _xzm_malloc_tc (in libsystem_malloc.dylib) + 276 [0x191b23aa4] + + ! : 2 terrain::mesh::improve>(terrain::mesh::LatticeMesh&, terrain::mesh::LatticeFrame const&, terrain::mesh::QualityOptions const&) (in _core.cpython-314-darwin.so) + 3476 [0x105fb9908] quality.hpp:182 + + ! : 1 terrain::mesh::improve>(terrain::mesh::LatticeMesh&, terrain::mesh::LatticeFrame const&, terrain::mesh::QualityOptions const&)::'lambda'(unsigned int)::operator()(unsigned int) const (in _core.cpython-314-darwin.so) + 200 [0x105fbe234] quality.hpp:102 + + ! : + 1 hypot (in libsystem_m.dylib) + 128 [0x1a2873580] + + ! : 1 terrain::mesh::improve>(terrain::mesh::LatticeMesh&, terrain::mesh::LatticeFrame const&, terrain::mesh::QualityOptions const&)::'lambda'(unsigned int)::operator()(unsigned int) const (in _core.cpython-314-darwin.so) + 252 [0x105fbe268] quality.hpp:102 + + ! : 1 terrain::mesh::improve>(terrain::mesh::LatticeMesh&, terrain::mesh::LatticeFrame const&, terrain::mesh::QualityOptions const&)::'lambda'(unsigned int)::operator()(unsigned int) const (in _core.cpython-314-darwin.so) + 776 [0x105fbe474] push_heap.h:0 + + ! 22 decltype(auto) std::__variant_detail::__visitation::__base::__dispatcher<0ul>::__dispatch[abi:nqe210106]&&, std::__variant_detail::__base<(std::__variant_detail::_Trait)0, terrain::raster::RasterView, terrain::raster::RasterView> const&>(auto, std::__variant_detail::__base<(std::__variant_detail::_Trait)0, terrain::raster::RasterView, terrain::raster::RasterView> const&) (in _core.cpython-314-darwin.so) + 5656 [0x105fb48a4] variant:534 + + ! : 11 _platform_memmove (in libsystem_platform.dylib) + 420,460,... [0x191d0bf04,0x191d0bf2c,...] + + ! : 11 decltype(auto) std::__variant_detail::__visitation::__base::__dispatcher<0ul>::__dispatch[abi:nqe210106]&&, std::__variant_detail::__base<(std::__variant_detail::_Trait)0, terrain::raster::RasterView, terrain::raster::RasterView> const&>(auto, std::__variant_detail::__base<(std::__variant_detail::_Trait)0, terrain::raster::RasterView, terrain::raster::RasterView> const&) (in _core.cpython-314-darwin.so) + 5704,5716,... [0x105fb48d4,0x105fb48e0,...] variant:534 + + ! 14 decltype(auto) std::__variant_detail::__visitation::__base::__dispatcher<0ul>::__dispatch[abi:nqe210106]&&, std::__variant_detail::__base<(std::__variant_detail::_Trait)0, terrain::raster::RasterView, terrain::raster::RasterView> const&>(auto, std::__variant_detail::__base<(std::__variant_detail::_Trait)0, terrain::raster::RasterView, terrain::raster::RasterView> const&) (in _core.cpython-314-darwin.so) + 6104 [0x105fb4a64] variant:534 + + ! : 10 _platform_memmove (in libsystem_platform.dylib) + 444,452,... [0x191d0bf1c,0x191d0bf24,...] + + ! : 4 decltype(auto) std::__variant_detail::__visitation::__base::__dispatcher<0ul>::__dispatch[abi:nqe210106]&&, std::__variant_detail::__base<(std::__variant_detail::_Trait)0, terrain::raster::RasterView, terrain::raster::RasterView> const&>(auto, std::__variant_detail::__base<(std::__variant_detail::_Trait)0, terrain::raster::RasterView, terrain::raster::RasterView> const&) (in _core.cpython-314-darwin.so) + 6104 [0x105fb4a64] variant:534 + + ! 14 decltype(auto) std::__variant_detail::__visitation::__base::__dispatcher<0ul>::__dispatch[abi:nqe210106]&&, std::__variant_detail::__base<(std::__variant_detail::_Trait)0, terrain::raster::RasterView, terrain::raster::RasterView> const&>(auto, std::__variant_detail::__base<(std::__variant_detail::_Trait)0, terrain::raster::RasterView, terrain::raster::RasterView> const&) (in _core.cpython-314-darwin.so) + 7204 [0x105fb4eb0] variant:534 + + ! : 12 decltype(auto) std::__variant_detail::__visitation::__base::__dispatcher<0ul>::__dispatch[abi:nqe210106]&&, std::__variant_detail::__base<(std::__variant_detail::_Trait)0, terrain::raster::RasterView, terrain::raster::RasterView> const&>(auto, std::__variant_detail::__base<(std::__variant_detail::_Trait)0, terrain::raster::RasterView, terrain::raster::RasterView> const&) (in _core.cpython-314-darwin.so) + 7236,7248,... [0x105fb4ed0,0x105fb4edc,...] variant:534 + + ! : 2 xzm_segment_group_free_chunk (in libsystem_malloc.dylib) + 624 [0x191afd6c8] + + ! : 2 _xzm_segment_group_segment_span_free_coalesce (in libsystem_malloc.dylib) + 248 [0x191afdccc] + + ! : 2 _xzm_segment_group_span_mark_used (in libsystem_malloc.dylib) + 124 [0x191aff718] + + ! : 2 _xzm_reclaim_mark_used (in libsystem_malloc.dylib) + 72 [0x191afc2e4] + + ! 12 decltype(auto) std::__variant_detail::__visitation::__base::__dispatcher<0ul>::__dispatch[abi:nqe210106]&&, std::__variant_detail::__base<(std::__variant_detail::_Trait)0, terrain::raster::RasterView, terrain::raster::RasterView> const&>(auto, std::__variant_detail::__base<(std::__variant_detail::_Trait)0, terrain::raster::RasterView, terrain::raster::RasterView> const&) (in _core.cpython-314-darwin.so) + 6072 [0x105fb4a44] variant:534 + + ! : 10 operator new(unsigned long) (in libc++abi.dylib) + 52 [0x191cb83c0] + + ! : | 5 _xzm_malloc_tc (in libsystem_malloc.dylib) + 276,0,... [0x191b23aa4,0x191b23990,...] + + ! : | 3 malloc_type_malloc (in libsystem_malloc.dylib) + 28,84 [0x191b07758,0x191b07790] + + ! : | 1 _xzm_xzone_malloc_tiny (in libsystem_malloc.dylib) + 548 [0x191b1cc70] + + ! : | 1 xzm_malloc_zone_malloc_type_malloc_tc (in libsystem_malloc.dylib) + 0 [0x191b233cc] + + ! : 2 ??? (in ) [0x1995504f8] + + ! 12 terrain::mesh::LatticeMesh::flip(unsigned int, unsigned int) (in _core.cpython-314-darwin.so) + 632,640,... [0x105fbbddc,0x105fbbde4,...] lattice_mesh.hpp:243 + + ! 11 decltype(auto) std::__variant_detail::__visitation::__base::__dispatcher<0ul>::__dispatch[abi:nqe210106]&&, std::__variant_detail::__base<(std::__variant_detail::_Trait)0, terrain::raster::RasterView, terrain::raster::RasterView> const&>(auto, std::__variant_detail::__base<(std::__variant_detail::_Trait)0, terrain::raster::RasterView, terrain::raster::RasterView> const&) (in _core.cpython-314-darwin.so) + 2112 [0x105fb3acc] variant:534 + + ! : 11 _platform_memmove (in libsystem_platform.dylib) + 88 [0x191d0bdb8] + + ! 9 decltype(auto) std::__variant_detail::__visitation::__base::__dispatcher<0ul>::__dispatch[abi:nqe210106]&&, std::__variant_detail::__base<(std::__variant_detail::_Trait)0, terrain::raster::RasterView, terrain::raster::RasterView> const&>(auto, std::__variant_detail::__base<(std::__variant_detail::_Trait)0, terrain::raster::RasterView, terrain::raster::RasterView> const&) (in _core.cpython-314-darwin.so) + 5592 [0x105fb4864] variant:534 + + ! : 6 decltype(auto) std::__variant_detail::__visitation::__base::__dispatcher<0ul>::__dispatch[abi:nqe210106]&&, std::__variant_detail::__base<(std::__variant_detail::_Trait)0, terrain::raster::RasterView, terrain::raster::RasterView> const&>(auto, std::__variant_detail::__base<(std::__variant_detail::_Trait)0, terrain::raster::RasterView, terrain::raster::RasterView> const&) (in _core.cpython-314-darwin.so) + 5612,5628 [0x105fb4878,0x105fb4888] variant:534 + + ! : 2 _platform_memset (in libsystem_platform.dylib) + 180,208 [0x191d0bb44,0x191d0bb60] + + ! : 1 DYLD-STUB$$memset (in _core.cpython-314-darwin.so) + 4 [0x106004c0c] + + ! 7 decltype(auto) std::__variant_detail::__visitation::__base::__dispatcher<0ul>::__dispatch[abi:nqe210106]&&, std::__variant_detail::__base<(std::__variant_detail::_Trait)0, terrain::raster::RasterView, terrain::raster::RasterView> const&>(auto, std::__variant_detail::__base<(std::__variant_detail::_Trait)0, terrain::raster::RasterView, terrain::raster::RasterView> const&) (in _core.cpython-314-darwin.so) + 7696 [0x105fb509c] variant:534 + + ! : 7 _platform_memmove (in libsystem_platform.dylib) + 88 [0x191d0bdb8] + + ! 5 terrain::mesh::LatticeMesh::split_inside(unsigned int, terrain::mesh::LatticeVertex) (in _core.cpython-314-darwin.so) + 540,532 [0x105fba42c,0x105fba424] lattice_mesh.hpp:185 + + ! 4 decltype(auto) std::__variant_detail::__visitation::__base::__dispatcher<0ul>::__dispatch[abi:nqe210106]&&, std::__variant_detail::__base<(std::__variant_detail::_Trait)0, terrain::raster::RasterView, terrain::raster::RasterView> const&>(auto, std::__variant_detail::__base<(std::__variant_detail::_Trait)0, terrain::raster::RasterView, terrain::raster::RasterView> const&) (in _core.cpython-314-darwin.so) + 292 [0x105fb33b0] variant:534 + + ! : 2 terrain::refinement::detail::to_lattice(terrain::raster::RasterGeometry const&, terrain::IndexedMesh2 const&, std::span const, 18446744073709551615ul>, std::span) (in _core.cpython-314-darwin.so) + 2408 [0x105fb84c4] refine.hpp:160 + + ! : | 1 std::__hash_table>::__emplace_unique_key_args(unsigned long long const&, unsigned long long&&, unsigned int&) (in _core.cpython-314-darwin.so) + 248 [0x105fbf034] __hash_table:1586 + + ! : | + 1 operator new(unsigned long) (in libc++abi.dylib) + 52 [0x191cb83c0] + + ! : | + 1 _xzm_xzone_malloc_tiny (in libsystem_malloc.dylib) + 260 [0x191b1cb50] + + ! : | 1 std::__hash_table>::__emplace_unique_key_args(unsigned long long const&, unsigned long long&&, unsigned int&) (in _core.cpython-314-darwin.so) + 524 [0x105fbf148] __hash_table:1588 + + ! : 1 terrain::refinement::detail::to_lattice(terrain::raster::RasterGeometry const&, terrain::IndexedMesh2 const&, std::span const, 18446744073709551615ul>, std::span) (in _core.cpython-314-darwin.so) + 1268 [0x105fb8050] refine.hpp:153 + + ! : 1 terrain::refinement::detail::to_lattice(terrain::raster::RasterGeometry const&, terrain::IndexedMesh2 const&, std::span const, 18446744073709551615ul>, std::span) (in _core.cpython-314-darwin.so) + 3036 [0x105fb8738] refine.hpp:160 + + ! : 1 _xzm_free_tc (in libsystem_malloc.dylib) + 188 [0x191b25934] + + ! 4 decltype(auto) std::__variant_detail::__visitation::__base::__dispatcher<0ul>::__dispatch[abi:nqe210106]&&, std::__variant_detail::__base<(std::__variant_detail::_Trait)0, terrain::raster::RasterView, terrain::raster::RasterView> const&>(auto, std::__variant_detail::__base<(std::__variant_detail::_Trait)0, terrain::raster::RasterView, terrain::raster::RasterView> const&) (in _core.cpython-314-darwin.so) + 5552 [0x105fb483c] variant:534 + + ! : 4 _platform_memmove (in libsystem_platform.dylib) + 88 [0x191d0bdb8] + + ! 3 ??? (in ) [0x1995503d8] + + ! 3 decltype(auto) std::__variant_detail::__visitation::__base::__dispatcher<0ul>::__dispatch[abi:nqe210106]&&, std::__variant_detail::__base<(std::__variant_detail::_Trait)0, terrain::raster::RasterView, terrain::raster::RasterView> const&>(auto, std::__variant_detail::__base<(std::__variant_detail::_Trait)0, terrain::raster::RasterView, terrain::raster::RasterView> const&) (in _core.cpython-314-darwin.so) + 2176 [0x105fb3b0c] variant:534 + + ! : 3 __bzero (in libsystem_platform.dylib) + 68 [0x191d0ba74] + + ! 3 decltype(auto) std::__variant_detail::__visitation::__base::__dispatcher<0ul>::__dispatch[abi:nqe210106]&&, std::__variant_detail::__base<(std::__variant_detail::_Trait)0, terrain::raster::RasterView, terrain::raster::RasterView> const&>(auto, std::__variant_detail::__base<(std::__variant_detail::_Trait)0, terrain::raster::RasterView, terrain::raster::RasterView> const&) (in _core.cpython-314-darwin.so) + 4104 [0x105fb4294] variant:534 + + ! : 1 _xzm_free_outlined (in libsystem_malloc.dylib) + 76 [0x191b20ef8] + + ! : 1 _xzm_free_tc (in libsystem_malloc.dylib) + 260 [0x191b2597c] + + ! : 1 decltype(auto) std::__variant_detail::__visitation::__base::__dispatcher<0ul>::__dispatch[abi:nqe210106]&&, std::__variant_detail::__base<(std::__variant_detail::_Trait)0, terrain::raster::RasterView, terrain::raster::RasterView> const&>(auto, std::__variant_detail::__base<(std::__variant_detail::_Trait)0, terrain::raster::RasterView, terrain::raster::RasterView> const&) (in _core.cpython-314-darwin.so) + 3380 [0x105fb3fc0] variant:534 + + ! 3 decltype(auto) std::__variant_detail::__visitation::__base::__dispatcher<0ul>::__dispatch[abi:nqe210106]&&, std::__variant_detail::__base<(std::__variant_detail::_Trait)0, terrain::raster::RasterView, terrain::raster::RasterView> const&>(auto, std::__variant_detail::__base<(std::__variant_detail::_Trait)0, terrain::raster::RasterView, terrain::raster::RasterView> const&) (in _core.cpython-314-darwin.so) + 7864 [0x105fb5144] variant:534 + + ! : 3 _platform_memmove (in libsystem_platform.dylib) + 88 [0x191d0bdb8] + + ! 2 decltype(auto) std::__variant_detail::__visitation::__base::__dispatcher<0ul>::__dispatch[abi:nqe210106]&&, std::__variant_detail::__base<(std::__variant_detail::_Trait)0, terrain::raster::RasterView, terrain::raster::RasterView> const&>(auto, std::__variant_detail::__base<(std::__variant_detail::_Trait)0, terrain::raster::RasterView, terrain::raster::RasterView> const&) (in _core.cpython-314-darwin.so) + 1432 [0x105fb3824] variant:534 + + ! : 1 terrain::mesh::detail::must_flip>(terrain::mesh::LatticeMesh const&, unsigned int, unsigned int, terrain::mesh::LatticeFrame const&) (in _core.cpython-314-darwin.so) + 1184 [0x105fbbae4] lawson.hpp:0 + + ! : | 1 terrain::pred::DetriaExact::incircle_ccw(terrain::Point2 const&, terrain::Point2 const&, terrain::Point2 const&, terrain::Point2 const&) (in _core.cpython-314-darwin.so) + 328 [0x106004158] detria_exact.cpp:97 + + ! : | 1 detria::predicates::incircleadapt(double*, double*, double*, double*, double) (in _core.cpython-314-darwin.so) + 1572 [0x105ffe584] detria.hpp:606 + + ! : | 1 detria::predicates::incircleadapt(double*, double*, double*, double*, double) (in _core.cpython-314-darwin.so) + 2056 [0x105ffe768] detria.hpp:612 + + ! : 1 terrain::mesh::detail::must_flip>(terrain::mesh::LatticeMesh const&, unsigned int, unsigned int, terrain::mesh::LatticeFrame const&) (in _core.cpython-314-darwin.so) + 332 [0x105fbb790] lawson.hpp:70 + + ! 2 decltype(auto) std::__variant_detail::__visitation::__base::__dispatcher<0ul>::__dispatch[abi:nqe210106]&&, std::__variant_detail::__base<(std::__variant_detail::_Trait)0, terrain::raster::RasterView, terrain::raster::RasterView> const&>(auto, std::__variant_detail::__base<(std::__variant_detail::_Trait)0, terrain::raster::RasterView, terrain::raster::RasterView> const&) (in _core.cpython-314-darwin.so) + 3288 [0x105fb3f64] variant:534 + + ! : 2 operator new(unsigned long) (in libc++abi.dylib) + 52 [0x191cb83c0] + + ! : 2 _xzm_malloc_large_huge (in libsystem_malloc.dylib) + 968 [0x191b1c4ac] + + ! : 2 xzm_segment_group_alloc_chunk (in libsystem_malloc.dylib) + 564 [0x191afc92c] + + ! : 1 _xzm_segment_group_find_and_allocate_chunk (in libsystem_malloc.dylib) + 768 [0x191afd0a0] + + ! : | 1 _xzm_segment_group_segment_span_free (in libsystem_malloc.dylib) + 84 [0x191aff78c] + + ! : 1 _xzm_segment_group_find_and_allocate_chunk (in libsystem_malloc.dylib) + 320 [0x191afcee0] + + ! 1 decltype(auto) std::__variant_detail::__visitation::__base::__dispatcher<0ul>::__dispatch[abi:nqe210106]&&, std::__variant_detail::__base<(std::__variant_detail::_Trait)0, terrain::raster::RasterView, terrain::raster::RasterView> const&>(auto, std::__variant_detail::__base<(std::__variant_detail::_Trait)0, terrain::raster::RasterView, terrain::raster::RasterView> const&) (in _core.cpython-314-darwin.so) + 3308 [0x105fb3f78] variant:534 + + ! : 1 __bzero (in libsystem_platform.dylib) + 68 [0x191d0ba74] + + ! 1 decltype(auto) std::__variant_detail::__visitation::__base::__dispatcher<0ul>::__dispatch[abi:nqe210106]&&, std::__variant_detail::__base<(std::__variant_detail::_Trait)0, terrain::raster::RasterView, terrain::raster::RasterView> const&>(auto, std::__variant_detail::__base<(std::__variant_detail::_Trait)0, terrain::raster::RasterView, terrain::raster::RasterView> const&) (in _core.cpython-314-darwin.so) + 5504 [0x105fb480c] variant:534 + + ! : 1 operator new(unsigned long) (in libc++abi.dylib) + 52 [0x191cb83c0] + + ! : 1 _xzm_malloc_large_huge (in libsystem_malloc.dylib) + 968 [0x191b1c4ac] + + ! : 1 xzm_segment_group_alloc_chunk (in libsystem_malloc.dylib) + 564 [0x191afc92c] + + ! : 1 _xzm_segment_group_find_and_allocate_chunk (in libsystem_malloc.dylib) + 508 [0x191afcf9c] + + ! : 1 _xzm_segment_group_span_mark_smaller (in libsystem_malloc.dylib) + 220 [0x191afe408] + + ! : 1 _xzm_reclaim_mark_used_locked (in libsystem_malloc.dylib) + 60 [0x191afee24] + + ! : 1 mach_vm_reclaim_try_cancel (in libsystem_kernel.dylib) + 260 [0x191cd06b8] + + ! : 1 mach_absolute_time (in libsystem_kernel.dylib) + 108 [0x191cbd0f8] + + ! 1 decltype(auto) std::__variant_detail::__visitation::__base::__dispatcher<0ul>::__dispatch[abi:nqe210106]&&, std::__variant_detail::__base<(std::__variant_detail::_Trait)0, terrain::raster::RasterView, terrain::raster::RasterView> const&>(auto, std::__variant_detail::__base<(std::__variant_detail::_Trait)0, terrain::raster::RasterView, terrain::raster::RasterView> const&) (in _core.cpython-314-darwin.so) + 6972 [0x105fb4dc8] variant:534 + + ! : 1 _platform_memmove (in libsystem_platform.dylib) + 88 [0x191d0bdb8] + + ! 1 decltype(auto) std::__variant_detail::__visitation::__base::__dispatcher<0ul>::__dispatch[abi:nqe210106]&&, std::__variant_detail::__base<(std::__variant_detail::_Trait)0, terrain::raster::RasterView, terrain::raster::RasterView> const&>(auto, std::__variant_detail::__base<(std::__variant_detail::_Trait)0, terrain::raster::RasterView, terrain::raster::RasterView> const&) (in _core.cpython-314-darwin.so) + 7520 [0x105fb4fec] variant:534 + + ! : 1 terrain::raster::bilinear>(terrain::raster::RasterView const&, terrain::Point2 const&) (in _core.cpython-314-darwin.so) + 48 [0x105fbf5fc] sample.hpp:50 + + ! 1 decltype(auto) std::__variant_detail::__visitation::__base::__dispatcher<0ul>::__dispatch[abi:nqe210106]&&, std::__variant_detail::__base<(std::__variant_detail::_Trait)0, terrain::raster::RasterView, terrain::raster::RasterView> const&>(auto, std::__variant_detail::__base<(std::__variant_detail::_Trait)0, terrain::raster::RasterView, terrain::raster::RasterView> const&) (in _core.cpython-314-darwin.so) + 7660 [0x105fb5078] variant:534 + + ! : 1 operator new(unsigned long) (in libc++abi.dylib) + 52 [0x191cb83c0] + + ! : 1 _xzm_malloc_large_huge (in libsystem_malloc.dylib) + 968 [0x191b1c4ac] + + ! : 1 xzm_segment_group_alloc_chunk (in libsystem_malloc.dylib) + 264 [0x191afc800] + + ! 1 decltype(auto) std::__variant_detail::__visitation::__base::__dispatcher<0ul>::__dispatch[abi:nqe210106]&&, std::__variant_detail::__base<(std::__variant_detail::_Trait)0, terrain::raster::RasterView, terrain::raster::RasterView> const&>(auto, std::__variant_detail::__base<(std::__variant_detail::_Trait)0, terrain::raster::RasterView, terrain::raster::RasterView> const&) (in _core.cpython-314-darwin.so) + 8076 [0x105fb5218] variant:534 + + ! 1 std::vector>::__assign_with_size[abi:nqe210106] const*>, std::__wrap_iter const*>>(std::__wrap_iter const*>, std::__wrap_iter const*>, long) (in _core.cpython-314-darwin.so) + 260 [0x105fbaf54] vector.h:1075 + + ! 1 _platform_memmove (in libsystem_platform.dylib) + 88 [0x191d0bdb8] + + 1 pybind11::cpp_function::initialize(pybind11_init__core(pybind11::module_&)::$_1&&, terrain::refinement::RefineOutcome (*)((anonymous namespace)::BoundRasterView const&, terrain::IndexedMesh2 const&, pybind11::object const&, pybind11::object const&, double, unsigned int, double, bool), pybind11::name const&, pybind11::scope const&, pybind11::sibling const&, pybind11::arg const&, pybind11::arg const&, pybind11::arg const&, pybind11::arg const&, pybind11::kw_only const&, pybind11::arg const&, pybind11::arg_v const&, pybind11::arg_v const&, pybind11::arg_v const&, char const (&) [815])::'lambda'(pybind11::detail::function_call&)::__invoke(pybind11::detail::function_call&) (in _core.cpython-314-darwin.so) + 724 [0x105fac658] pybind11.h:587 + + 1 pybind11::detail::get_type_info(std::type_info const&, bool) (in _core.cpython-314-darwin.so) + 64 [0x105fad650] type_caster_base.h:285 + + 1 (in _core.cpython-314-darwin.so) + 0 [0x105faf8e0] + 2 _PyEval_EvalFrameDefault (in Python) + 23876 [0x10179aa34] + 2 _PyObject_MakeTpCall (in Python) + 120 [0x101667158] + 2 encoder_call (in _json.cpython-314-darwin.so) + 140 [0x10104397c] + 1 encoder_listencode_obj (in _json.cpython-314-darwin.so) + 1152 [0x101044338] + ! 1 encoder_encode_key_value (in _json.cpython-314-darwin.so) + 240 [0x101044bf4] + ! 1 encoder_listencode_obj (in _json.cpython-314-darwin.so) + 752 [0x1010441a8] + ! 1 float_repr (in Python) + 60 [0x10168d3a0] + ! 1 _platform_strlen (in libsystem_platform.dylib) + 48 [0x191d08b70] + 1 encoder_listencode_obj (in _json.cpython-314-darwin.so) + 1572 [0x1010444dc] + 1 PyDict_DelItem (in Python) + 76 [0x1016b937c] + +Total number in stack (recursive counted multiple, when >=5): + 32 std::__introsort(unsigned int*, unsigned int*, std::ranges::less, std::iterator_traits::difference_type, bool) (in libc++.1.dylib) + 664 [0x191c17408] + 25 std::__bitset_partition[abi:nqe220106](unsigned int*, unsigned int*, std::ranges::less) (in libc++.1.dylib) + 0 [0x191c1d308] + 25 std::__introsort(unsigned int*, unsigned int*, std::ranges::less, std::iterator_traits::difference_type, bool) (in libc++.1.dylib) + 592 [0x191c173c0] + 21 std::__introsort(unsigned int*, unsigned int*, std::ranges::less, std::iterator_traits::difference_type, bool) (in libc++.1.dylib) + 0 [0x191c17170] + 14 _platform_memmove (in libsystem_platform.dylib) + 0 [0x191d0bd60] + 13 decltype(auto) std::__variant_detail::__visitation::__base::__dispatcher<0ul>::__dispatch[abi:nqe210106]&&, std::__variant_detail::__base<(std::__variant_detail::_Trait)0, terrain::raster::RasterView, terrain::raster::RasterView> const&>(auto, std::__variant_detail::__base<(std::__variant_detail::_Trait)0, terrain::raster::RasterView, terrain::raster::RasterView> const&) (in _core.cpython-314-darwin.so) + 0 [0x105fb328c] variant:534 + 10 terrain::mesh::LatticeMesh::put(unsigned int, std::array, std::array) (in _core.cpython-314-darwin.so) + 0 [0x105fbbde8] lattice_mesh.hpp:297 + 10 terrain::mesh::LatticeMesh::put(unsigned int, std::array, std::array) (in _core.cpython-314-darwin.so) + 0 [0x105fbbde8] lattice_mesh.hpp:300 + 9 operator new(unsigned long) (in libc++abi.dylib) + 52 [0x191cb83c0] + 9 terrain::mesh::LatticeMesh::put(unsigned int, std::array, std::array) (in _core.cpython-314-darwin.so) + 0 [0x105fbbde8] lattice_mesh.hpp:287 + 9 terrain::mesh::LatticeMesh::put(unsigned int, std::array, std::array) (in _core.cpython-314-darwin.so) + 0 [0x105fbbde8] lattice_mesh.hpp:296 + 9 terrain::mesh::LatticeMesh::put(unsigned int, std::array, std::array) (in _core.cpython-314-darwin.so) + 0 [0x105fbbde8] lattice_mesh.hpp:298 + 8 detria::predicates::incircleadapt(double*, double*, double*, double*, double) (in _core.cpython-314-darwin.so) + 0 [0x105ffdf60] detria.hpp:0 + 6 detria::predicates::scale_expansion_zeroelim(int, double const*, double, double*) (in _core.cpython-314-darwin.so) + 0 [0x106003bf4] detria.hpp:488 + 6 std::__introsort(unsigned int*, unsigned int*, std::ranges::less, std::iterator_traits::difference_type, bool) (in libc++.1.dylib) + 1280 [0x191c17670] + 6 std::__partial_sort_impl[abi:nqe220106](unsigned int*, unsigned int*, unsigned int*, std::ranges::less&) (in libc++.1.dylib) + 0 [0x191c1d984] + 5 detria::predicates::fast_expansion_sum_zeroelim(int, double const*, int, double const*, double*) (in _core.cpython-314-darwin.so) + 0 [0x106003d10] detria.hpp:0 + 5 detria::predicates::scale_expansion_zeroelim(int, double const*, double, double*) (in _core.cpython-314-darwin.so) + 0 [0x106003bf4] detria.hpp:512 + 5 std::__insertion_sort_incomplete[abi:nqe220106](unsigned int*, unsigned int*, std::ranges::less) (in libc++.1.dylib) + 0 [0x191c1d704] + +Sort by top of stack, same collapsed (when >= 5): + terrain::refinement::scan>(terrain::raster::RasterView const&, terrain::mesh::LatticeMesh const&, unsigned int) (in _core.cpython-314-darwin.so) 8496 + decltype(auto) std::__variant_detail::__visitation::__base::__dispatcher<0ul>::__dispatch[abi:nqe210106]&&, std::__variant_detail::__base<(std::__variant_detail::_Trait)0, terrain::raster::RasterView, terrain::raster::RasterView> const&>(auto, std::__variant_detail::__base<(std::__variant_detail::_Trait)0, terrain::raster::RasterView, terrain::raster::RasterView> const&) (in _core.cpython-314-darwin.so) 1121 + terrain::mesh::detail::must_flip>(terrain::mesh::LatticeMesh const&, unsigned int, unsigned int, terrain::mesh::LatticeFrame const&) (in _core.cpython-314-darwin.so) 716 + terrain::mesh::LatticeMesh::flip(unsigned int, unsigned int) (in _core.cpython-314-darwin.so) 342 + terrain::mesh::LatticeMesh::put(unsigned int, std::array, std::array) (in _core.cpython-314-darwin.so) 339 + terrain::pred::FilteredKernel::incircle_ccw(terrain::Point2 const&, terrain::Point2 const&, terrain::Point2 const&, terrain::Point2 const&) (in _core.cpython-314-darwin.so) 332 + std::__bitset_partition[abi:nqe220106](unsigned int*, unsigned int*, std::ranges::less) (in libc++.1.dylib) 331 + detria::predicates::incircleadapt(double*, double*, double*, double*, double) (in _core.cpython-314-darwin.so) 307 + detria::predicates::fast_expansion_sum_zeroelim(int, double const*, int, double const*, double*) (in _core.cpython-314-darwin.so) 235 + terrain::mesh::LatticeMesh::split_edge(unsigned int, unsigned int, terrain::mesh::MeshVertex) (in _core.cpython-314-darwin.so) 154 + terrain::mesh::LatticeMesh::split_inside(unsigned int, terrain::mesh::LatticeVertex) (in _core.cpython-314-darwin.so) 122 + terrain::refinement::vertex_z>(terrain::raster::RasterView const&, terrain::mesh::MeshVertex) (in _core.cpython-314-darwin.so) 118 + std::__introsort(unsigned int*, unsigned int*, std::ranges::less, std::iterator_traits::difference_type, bool) (in libc++.1.dylib) 106 + detria::predicates::scale_expansion_zeroelim(int, double const*, double, double*) (in _core.cpython-314-darwin.so) 78 + _platform_memmove (in libsystem_platform.dylib) 61 + _xzm_free_tc (in libsystem_malloc.dylib) 55 + _xzm_malloc_tc (in libsystem_malloc.dylib) 37 + terrain::mesh::LatticeMesh::constraint_edges() const (in _core.cpython-314-darwin.so) 30 + terrain::pred::DetriaExact::incircle_ccw(terrain::Point2 const&, terrain::Point2 const&, terrain::Point2 const&, terrain::Point2 const&) (in _core.cpython-314-darwin.so) 28 + malloc_type_malloc (in libsystem_malloc.dylib) 15 + std::__partial_sort_impl[abi:nqe220106](unsigned int*, unsigned int*, unsigned int*, std::ranges::less&) (in libc++.1.dylib) 13 + _free (in libsystem_malloc.dylib) 12 + terrain::mesh::LatticeMesh::add_vertex(terrain::mesh::MeshVertex) (in _core.cpython-314-darwin.so) 12 + ??? (in ) [0x1995504f8] 8 + terrain::mesh::improve>(terrain::mesh::LatticeMesh&, terrain::mesh::LatticeFrame const&, terrain::mesh::QualityOptions const&) (in _core.cpython-314-darwin.so) 8 + DYLD-STUB$$operator delete(void*) (in _core.cpython-314-darwin.so) 6 + std::__insertion_sort_incomplete[abi:nqe220106](unsigned int*, unsigned int*, std::ranges::less) (in libc++.1.dylib) 6 + ___chkstk_darwin (in libsystem_pthread.dylib) 5 + +Binary Images: + 0x100b80000 - 0x100b8115f +org.python.python (3.14.7 - 3.14.7) <5DCA660D-E773-319E-ABE8-E96240774B3C> /opt/homebrew/*/Python.framework/Versions/3.14/Resources/Python.app/Contents/MacOS/Python + 0x100df0000 - 0x100df7fff libffi-trampolines.dylib (40) <856BEF9A-9E68-3864-80EB-C3ADE42C0A6F> /usr/lib/libffi-trampolines.dylib + 0x101040000 - 0x101045d17 +_json.cpython-314-darwin.so (0) <68462E5A-DD0F-3953-8AA6-730508150599> /opt/homebrew/*/Python.framework/Versions/3.14/lib/python3.14/lib-dynload/_json.cpython-314-darwin.so + 0x101550000 - 0x101551b63 +grp.cpython-314-darwin.so (0) /opt/homebrew/*/Python.framework/Versions/3.14/lib/python3.14/lib-dynload/grp.cpython-314-darwin.so + 0x101560000 - 0x101562f5b +fcntl.cpython-314-darwin.so (0) <0A4EF48E-25FD-3D88-B36F-64772D41DDFE> /opt/homebrew/*/Python.framework/Versions/3.14/lib/python3.14/lib-dynload/fcntl.cpython-314-darwin.so + 0x101570000 - 0x101573da3 +binascii.cpython-314-darwin.so (0) <9B55BD3F-4829-3F6C-8C19-C3C80868E0FA> /opt/homebrew/*/Python.framework/Versions/3.14/lib/python3.14/lib-dynload/binascii.cpython-314-darwin.so + 0x101580000 - 0x101586f47 +zlib.cpython-314-darwin.so (0) /opt/homebrew/*/Python.framework/Versions/3.14/lib/python3.14/lib-dynload/zlib.cpython-314-darwin.so + 0x101594000 - 0x101596e9b +_bz2.cpython-314-darwin.so (0) <728DA51A-F405-3216-9724-48FF0B117534> /opt/homebrew/*/Python.framework/Versions/3.14/lib/python3.14/lib-dynload/_bz2.cpython-314-darwin.so + 0x1015a4000 - 0x1015a9433 +_lzma.cpython-314-darwin.so (0) <7227AA66-40B5-38DE-BA1C-1E9E94DE6BF7> /opt/homebrew/*/Python.framework/Versions/3.14/lib/python3.14/lib-dynload/_lzma.cpython-314-darwin.so + 0x1015b8000 - 0x1015c08ab +_zstd.cpython-314-darwin.so (0) /opt/homebrew/*/Python.framework/Versions/3.14/lib/python3.14/lib-dynload/_zstd.cpython-314-darwin.so + 0x1015d0000 - 0x1015d669f +_struct.cpython-314-darwin.so (0) /opt/homebrew/*/Python.framework/Versions/3.14/lib/python3.14/lib-dynload/_struct.cpython-314-darwin.so + 0x1015e4000 - 0x1015ee0b7 +math.cpython-314-darwin.so (0) /opt/homebrew/*/Python.framework/Versions/3.14/lib/python3.14/lib-dynload/math.cpython-314-darwin.so + 0x1015fc000 - 0x1019c303b +org.python.python (3.14.7 - 3.14.7) /opt/homebrew/*/Python.framework/Versions/3.14/Python + 0x105ea4000 - 0x105ec1a3f +liblzma.5.dylib (0) /opt/homebrew/*/liblzma.5.dylib + 0x105ed0000 - 0x105ed24c3 +_bisect.cpython-314-darwin.so (0) <63E84417-A03E-3B17-8D95-88B8567EBE3B> /opt/homebrew/*/Python.framework/Versions/3.14/lib/python3.14/lib-dynload/_bisect.cpython-314-darwin.so + 0x105ee0000 - 0x105ee1e2f +_random.cpython-314-darwin.so (0) /opt/homebrew/*/Python.framework/Versions/3.14/lib/python3.14/lib-dynload/_random.cpython-314-darwin.so + 0x105f00000 - 0x105f02adb +_posixsubprocess.cpython-314-darwin.so (0) /opt/homebrew/*/Python.framework/Versions/3.14/lib/python3.14/lib-dynload/_posixsubprocess.cpython-314-darwin.so + 0x105f18000 - 0x105f2cb13 +_pickle.cpython-314-darwin.so (0) <27D8B45E-21A6-3A26-9E1D-4CD07CDC6E7F> /opt/homebrew/*/Python.framework/Versions/3.14/lib/python3.14/lib-dynload/_pickle.cpython-314-darwin.so + 0x105f40000 - 0x105f54c3f +_ctypes.cpython-314-darwin.so (0) /opt/homebrew/*/Python.framework/Versions/3.14/lib/python3.14/lib-dynload/_ctypes.cpython-314-darwin.so + 0x105f68000 - 0x105f68b6b +_uuid.cpython-314-darwin.so (0) /opt/homebrew/*/Python.framework/Versions/3.14/lib/python3.14/lib-dynload/_uuid.cpython-314-darwin.so + 0x105f78000 - 0x105f7ba4f +_heapq.cpython-314-darwin.so (0) /opt/homebrew/*/Python.framework/Versions/3.14/lib/python3.14/lib-dynload/_heapq.cpython-314-darwin.so + 0x105f8c000 - 0x10601afff +_core.cpython-314-darwin.so (0) <0706C091-8ED3-3A3F-BC8E-120B37C00BCC> /Users/*/_core.cpython-314-darwin.so + 0x106274000 - 0x1062fb44f +libzstd.1.5.7.dylib (0) <1CE1197A-4A2B-3036-984E-95599210332B> /opt/homebrew/*/libzstd.1.5.7.dylib + 0x106718000 - 0x10672fff3 +_umath_linalg.cpython-314-darwin.so (0) <744167CE-FC38-3B32-B07D-18C58C5EEF47> /Users/*/_umath_linalg.cpython-314-darwin.so + 0x106740000 - 0x106744bcf +select.cpython-314-darwin.so (0) <7339F994-A372-373D-9DB8-2D97AFAC14E6> /opt/homebrew/*/Python.framework/Versions/3.14/lib/python3.14/lib-dynload/select.cpython-314-darwin.so + 0x106754000 - 0x106755adf +_scproxy.cpython-314-darwin.so (0) <7079EDBC-DE20-344F-8677-2B0D96D023E5> /opt/homebrew/*/Python.framework/Versions/3.14/lib/python3.14/lib-dynload/_scproxy.cpython-314-darwin.so + 0x10676c000 - 0x1067744af +array.cpython-314-darwin.so (0) <73F0A1DC-C5DC-3BD2-9D92-C85F5F2380D3> /opt/homebrew/*/Python.framework/Versions/3.14/lib/python3.14/lib-dynload/array.cpython-314-darwin.so + 0x106784000 - 0x106788e5b +_zoneinfo.cpython-314-darwin.so (0) /opt/homebrew/*/Python.framework/Versions/3.14/lib/python3.14/lib-dynload/_zoneinfo.cpython-314-darwin.so + 0x106798000 - 0x1067c3fff +lib.cpython-314-darwin.so (0) /Users/*/lib.cpython-314-darwin.so + 0x1067dc000 - 0x1067ddfa3 +_queue.cpython-314-darwin.so (0) <1B0EB104-55B6-36BE-9645-B62AE2B591A8> /opt/homebrew/*/Python.framework/Versions/3.14/lib/python3.14/lib-dynload/_queue.cpython-314-darwin.so + 0x1067ec000 - 0x106b1bfff +_multiarray_umath.cpython-314-darwin.so (0) /Users/*/_multiarray_umath.cpython-314-darwin.so + 0x106ed8000 - 0x106eebfff +_geos.cpython-314-darwin.so (0) /Users/*/_geos.cpython-314-darwin.so + 0x106f00000 - 0x106f03ffb +libsharpyuv.0.1.2.dylib (0) /Users/*/libsharpyuv.0.1.2.dylib + 0x106f14000 - 0x106f17fff +_version.cpython-314-darwin.so (0) /Users/*/_version.cpython-314-darwin.so + 0x106f30000 - 0x106f5ffff +libgeos_c.1.19.2.dylib (0) <012755D3-1639-311F-B2AC-6CBF84C38C2C> /Users/*/libgeos_c.1.19.2.dylib + 0x106f88000 - 0x106fa438f +_decimal.cpython-314-darwin.so (0) <70A0E068-789D-3D8C-9BAA-AC37E13316B3> /opt/homebrew/*/Python.framework/Versions/3.14/lib/python3.14/lib-dynload/_decimal.cpython-314-darwin.so + 0x106fb8000 - 0x106fd34e7 +libmpdec.4.0.1.dylib (0) /opt/homebrew/*/libmpdec.4.0.1.dylib + 0x106fe8000 - 0x106feffff +_compat.cpython-314-darwin.so (0) /Users/*/_compat.cpython-314-darwin.so + 0x107004000 - 0x107063ffb +_geometry_helpers.cpython-314-darwin.so (0) /Users/*/_geometry_helpers.cpython-314-darwin.so + 0x107280000 - 0x10728fffb +_context.cpython-314-darwin.so (0) <7F7522BF-220F-35C7-A940-37A72C00720A> /Users/*/_context.cpython-314-darwin.so + 0x1072a4000 - 0x107487ffb +libgeos.3.13.1.dylib (0) <76DB2B6E-3601-3C37-A311-4780A6B1CB20> /Users/*/libgeos.3.13.1.dylib + 0x1077c0000 - 0x1077dffff +liblzma.5.dylib (0) <12313148-5E51-380A-8C6F-B7BE179754D9> /Users/*/liblzma.5.dylib + 0x1077f0000 - 0x1077f7fff +_network.cpython-314-darwin.so (0) /Users/*/_network.cpython-314-darwin.so + 0x10780c000 - 0x1078136d3 +_hashlib.cpython-314-darwin.so (0) <002E772A-9AB7-367E-B16E-7752CCEEEC3B> /opt/homebrew/*/Python.framework/Versions/3.14/lib/python3.14/lib-dynload/_hashlib.cpython-314-darwin.so + 0x107828000 - 0x10782ffff +list.cpython-314-darwin.so (0) <9C8CE880-DFC0-3E4E-9D4C-074C0541FC64> /Users/*/list.cpython-314-darwin.so + 0x107848000 - 0x1078afff7 +libtiff.6.dylib (0) <9E604587-B9DE-3B4F-9F67-CA228489B074> /Users/*/libtiff.6.dylib + 0x1078d0000 - 0x10790ffff +libwebp.7.2.0.dylib (0) <1BAF7F67-3BEB-3DBB-800D-35C98A2D38EB> /Users/*/libwebp.7.2.0.dylib + 0x107928000 - 0x10793fffb +_geod.cpython-314-darwin.so (0) /Users/*/_geod.cpython-314-darwin.so + 0x107954000 - 0x10795acff +_blake2.cpython-314-darwin.so (0) <29158C26-92C8-3CD9-BD9A-E381879358D5> /opt/homebrew/*/Python.framework/Versions/3.14/lib/python3.14/lib-dynload/_blake2.cpython-314-darwin.so + 0x10797c000 - 0x10798fffb +database.cpython-314-darwin.so (0) <5C1686B3-D6B2-35F0-8C42-5452F49D8B22> /Users/*/database.cpython-314-darwin.so + 0x1079b0000 - 0x107d55b77 +_pydantic_core.cpython-314-darwin.so (0) <55FB9994-49B8-346C-89E3-456FF3104124> /Users/*/_pydantic_core.cpython-314-darwin.so + 0x107da0000 - 0x107dfbfe7 +libjpeg.8.3.2.dylib (0) <02FDF09D-3434-39AA-99E5-009183BBE870> /Users/*/libjpeg.8.3.2.dylib + 0x107e28000 - 0x107e2fffb +_sync.cpython-314-darwin.so (0) <7F70A486-1C3D-3A1D-A5D4-CDD5391E64F2> /Users/*/_sync.cpython-314-darwin.so + 0x107e44000 - 0x107ecffff +libzstd.1.5.7.dylib (0) /Users/*/libzstd.1.5.7.dylib + 0x107eec000 - 0x107f3fff3 +_crs.cpython-314-darwin.so (0) <7F6F19C8-6900-376D-86A2-5C1528449A95> /Users/*/_crs.cpython-314-darwin.so + 0x108068000 - 0x108075fef +_socket.cpython-314-darwin.so (0) <08A4E0E5-6A41-3863-94F9-85D1CD54FDAE> /opt/homebrew/*/Python.framework/Versions/3.14/lib/python3.14/lib-dynload/_socket.cpython-314-darwin.so + 0x1080a8000 - 0x1080cfffb +_transformer.cpython-314-darwin.so (0) <5DE58715-1DEC-3B5E-9872-13F580886E29> /Users/*/_transformer.cpython-314-darwin.so + 0x1081e8000 - 0x1081ec627 +_interpreters.cpython-314-darwin.so (0) /opt/homebrew/*/Python.framework/Versions/3.14/lib/python3.14/lib-dynload/_interpreters.cpython-314-darwin.so + 0x108210000 - 0x108567ff7 +libproj.25.9.8.1.dylib (0) /Users/*/libproj.25.9.8.1.dylib + 0x108680000 - 0x108699ed3 +_ssl.cpython-314-darwin.so (0) <537F06E7-795A-3FD8-BA74-5FCDDE24F530> /opt/homebrew/*/Python.framework/Versions/3.14/lib/python3.14/lib-dynload/_ssl.cpython-314-darwin.so + 0x108724000 - 0x10873a65b +_shared_cython.abi3.so (0) <17E21161-655D-39B7-8F27-1A3337E3A974> /Users/*/_shared_cython.abi3.so + 0x108754000 - 0x108769ca3 +_shared.abi3.so (0) <9AA32050-2AA1-35DF-9BC7-636F8BD4E82E> /Users/*/_shared.abi3.so + 0x108790000 - 0x1088201b3 +libssl.3.dylib (0) <1B8AB7A7-AD95-3B41-85F2-FB21B66B6423> /opt/homebrew/*/libssl.3.dylib + 0x108a6c000 - 0x108a9dac3 +_imcd.abi3.so (0) <029F8F37-FBF4-38B1-B7D8-65C450AC7F85> /Users/*/_imcd.abi3.so + 0x108b28000 - 0x108e6825f +libcrypto.3.dylib (0) /opt/homebrew/*/libcrypto.3.dylib + 0x191878000 - 0x1918c75f7 libobjc.A.dylib (973.1) /usr/lib/libobjc.A.dylib + 0x1918c8000 - 0x1918d223f libsharedcache.dylib (0) <117C1ED6-AE11-3D9E-B05B-844F35395552> /usr/lib/libsharedcache.dylib + 0x1918d3000 - 0x1918f9d3b libdyld.dylib (27062) <62863BCA-DD60-3D32-A9DB-89099BA6F3D7> /usr/lib/system/libdyld.dylib + 0x1918fa000 - 0x1919b96e3 dyld (1.0.0 - 27062) /usr/lib/dyld + 0x1919ba000 - 0x1919bd01f libsystem_blocks.dylib (98.1) <6F304731-D95D-3501-B4AD-F2934F7F2446> /usr/lib/system/libsystem_blocks.dylib + 0x1919be000 - 0x191a130df libxpc.dylib (3298.1.1) <0791121F-B5FC-3F84-BF04-115E86D2D882> /usr/lib/system/libxpc.dylib + 0x191a14000 - 0x191a33c13 libsystem_trace.dylib (1966.1.1) /usr/lib/system/libsystem_trace.dylib + 0x191a34000 - 0x191ae8f27 libcorecrypto.dylib (2109.0.22) <807AA6C9-5D8A-3CA5-B4CE-FACE5296EF6A> /usr/lib/system/libcorecrypto.dylib + 0x191ae9000 - 0x191b3ec5f libsystem_malloc.dylib (886.0.8) <2339CB57-FE5A-3154-A206-A76059C749EB> /usr/lib/system/libsystem_malloc.dylib + 0x191b3f000 - 0x191b8519f libdispatch.dylib (1605.0.2) <022BF08F-0B3A-3225-9E65-16D1553CE90D> /usr/lib/system/libdispatch.dylib + 0x191b86000 - 0x191b88d2b libsystem_featureflags.dylib (108) <20C1CAB2-1F13-3426-8146-9CAE9FF2A33D> /usr/lib/system/libsystem_featureflags.dylib + 0x191b89000 - 0x191c0bca3 libsystem_c.dylib (1786.0.3) /usr/lib/system/libsystem_c.dylib + 0x191c0c000 - 0x191ca1033 libc++.1.dylib (2200.27) <1E9BA4AA-B5DA-3CF3-80AC-4B880049573F> /usr/lib/libc++.1.dylib + 0x191ca2000 - 0x191cbbeff libc++abi.dylib (2200.27) /usr/lib/libc++abi.dylib + 0x191cbc000 - 0x191cfa9ab libsystem_kernel.dylib (13432.1.9) /usr/lib/system/libsystem_kernel.dylib + 0x191cfb000 - 0x191d0791b libsystem_pthread.dylib (553.0.1) <5A1828C3-CBC2-3B85-BD07-C8ED10021A41> /usr/lib/system/libsystem_pthread.dylib + 0x191d08000 - 0x191d114f3 libsystem_platform.dylib (402.0.1.0.1) <080E4444-A0FB-3913-9756-4E470015F32F> /usr/lib/system/libsystem_platform.dylib + 0x191d12000 - 0x191d40903 libsystem_info.dylib (603) /usr/lib/system/libsystem_info.dylib + 0x191d41000 - 0x1921d1e9f com.apple.CoreFoundation (6.9 - 5027.0.69) <727E905E-F344-3823-8E13-E7A096388321> /System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation + 0x1921d2000 - 0x1924d1ae7 com.apple.LaunchServices (1141.1 - 1141.1) <00ED6A89-5E67-37AA-9342-51EB93F68EE5> /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/LaunchServices.framework/Versions/A/LaunchServices + 0x1924d2000 - 0x1926804f3 com.apple.gpusw.MetalTools (1.0 - 1) <8317EBC9-11A1-3C21-B224-FF97B6275A67> /System/Library/PrivateFrameworks/MetalTools.framework/Versions/A/MetalTools + 0x192681000 - 0x192e547df libBLAS.dylib (1617.1.1) <31104D4F-4A7E-3FA7-9E18-55937B2011F2> /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libBLAS.dylib + 0x192e55000 - 0x192f663db com.apple.Lexicon-framework (1.0 - 216) <15A671C9-C620-33E0-9813-D5746EC5ECEF> /System/Library/PrivateFrameworks/Lexicon.framework/Versions/A/Lexicon + 0x192f67000 - 0x1930d3107 libSparse.dylib (196.0.1) <5375A133-2487-3429-B891-9917A51A23B9> /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libSparse.dylib + 0x1930d4000 - 0x193165193 com.apple.SystemConfiguration (1.21 - 1.21) <10869E21-4B5A-3D06-9A03-F0BA544A6DC8> /System/Library/Frameworks/SystemConfiguration.framework/Versions/A/SystemConfiguration + 0x193166000 - 0x19319a52f libCRFSuite.dylib (55) <2D2C2F35-AB83-332B-88F0-F3BC4A3D8463> /usr/lib/libCRFSuite.dylib + 0x19346b000 - 0x194728287 com.apple.Foundation (6.9 - 5027.0.69) <4317F7C6-73D2-3BE9-B010-F318F1198A1B> /System/Library/Frameworks/Foundation.framework/Versions/C/Foundation + 0x1948d7000 - 0x1949eeafb com.apple.CoreDisplay (291.4 - 291.4) /System/Library/Frameworks/CoreDisplay.framework/Versions/A/CoreDisplay + 0x1949ef000 - 0x194db46e3 com.apple.audio.AudioToolboxCore (1.0 - 1638.104.3) <49229A03-C7B7-38DE-99D1-C8A923169FAB> /System/Library/PrivateFrameworks/AudioToolboxCore.framework/Versions/A/AudioToolboxCore + 0x194db5000 - 0x194fd85ff com.apple.CoreText (904 - 904) /System/Library/Frameworks/CoreText.framework/Versions/A/CoreText + 0x194fd9000 - 0x195776633 com.apple.audio.CoreAudio (5.0 - 5.0) <3AB8F076-7437-38AA-9F5B-B083CF020ADA> /System/Library/Frameworks/CoreAudio.framework/Versions/A/CoreAudio + 0x195777000 - 0x195b865cf com.apple.security (7.0 - 62460.1.3) <7B094BB2-DD4D-3A81-8C29-5879451255F5> /System/Library/Frameworks/Security.framework/Versions/A/Security + 0x195b87000 - 0x195e697e5 libicucore.A.dylib (78132) <7C675D41-84B1-395F-80CA-4FF1837F0DA0> /usr/lib/libicucore.A.dylib + 0x195e6a000 - 0x195e73b13 libsystem_darwin.dylib (1786.0.3) <4E66C888-993C-3E6A-A8DA-A949C01C5B67> /usr/lib/system/libsystem_darwin.dylib + 0x195e74000 - 0x196164f23 com.apple.CoreServices.CarbonCore (1333 - 1333) /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/CarbonCore.framework/Versions/A/CarbonCore + 0x196165000 - 0x1961a33a3 com.apple.CoreServicesInternal (505 - 505) <6F8147E6-5C1E-3606-94D8-E74383900808> /System/Library/PrivateFrameworks/CoreServicesInternal.framework/Versions/A/CoreServicesInternal + 0x1961a4000 - 0x1961dd507 com.apple.CSStore (1141.1 - 1141.1) /System/Library/PrivateFrameworks/CoreServicesStore.framework/Versions/A/CoreServicesStore + 0x1961de000 - 0x1962c3707 com.apple.framework.IOKit (2.0.2 - 100288.0.9) <0E4CF3E4-B0C2-312A-B147-0BD4978EF0B7> /System/Library/Frameworks/IOKit.framework/Versions/A/IOKit + 0x1962c4000 - 0x1962d5b8b libsystem_notify.dylib (368) <58FD36D8-37A7-311C-80F2-8E64DD8710CF> /usr/lib/system/libsystem_notify.dylib + 0x197af8000 - 0x197b0b1df com.apple.UniformTypeIdentifiers (709 - 709) <7EEC2F07-8F37-3EAB-94C9-9625F7AF5532> /System/Library/Frameworks/UniformTypeIdentifiers.framework/Versions/A/UniformTypeIdentifiers + 0x197fcf000 - 0x1980a4cff libboringssl.dylib (583) /usr/lib/libboringssl.dylib + 0x1980a5000 - 0x1984200f7 com.apple.CFNetwork (1.0 - 3896.100.1.1.1) /System/Library/Frameworks/CFNetwork.framework/Versions/A/CFNetwork + 0x198421000 - 0x19843bd93 libsystem_networkextension.dylib (2340.1.2) <22E1D190-486F-324F-ABA4-F36AB841BFE9> /usr/lib/system/libsystem_networkextension.dylib + 0x19843c000 - 0x19843cee7 libenergytrace.dylib (23) <09E921A2-6FB1-33A4-8DB0-2BB45A8DBBE2> /usr/lib/libenergytrace.dylib + 0x19843d000 - 0x1984c8277 libMobileGestalt.dylib (1622.0.5) /usr/lib/libMobileGestalt.dylib + 0x1984c9000 - 0x1984e0247 libsystem_asl.dylib (409) /usr/lib/system/libsystem_asl.dylib + 0x1984e1000 - 0x198506f0f com.apple.TCC (1.0 - 1) <6EB227C1-E59C-35DD-B07F-888EABAFD85F> /System/Library/PrivateFrameworks/TCC.framework/Versions/A/TCC + 0x198507000 - 0x198b4277f com.apple.SkyLight (1.600.0 - 953.5.5) <8A3B348E-4637-3685-92D0-6CBC2F36A234> /System/Library/PrivateFrameworks/SkyLight.framework/Versions/A/SkyLight + 0x198b43000 - 0x1992f7357 com.apple.CoreGraphics (2.0 - 2050) /System/Library/Frameworks/CoreGraphics.framework/Versions/A/CoreGraphics + 0x199416000 - 0x19942c57f com.apple.ProtocolBuffer (1 - 325.20.6.4.1) <02B6311A-FAEA-3D68-BCEA-466709877974> /System/Library/PrivateFrameworks/ProtocolBuffer.framework/Versions/A/ProtocolBuffer + 0x19942d000 - 0x19943e877 libdns_services.dylib (3111.0.5.0.1) /usr/lib/libdns_services.dylib + 0x199474000 - 0x199474f2f libobjcMsgSend.dylib (973.1) <41179EDE-DC97-3BBE-8848-6400D12C1436> /usr/lib/objc/libobjcMsgSend.dylib + 0x199878000 - 0x199a2b75f com.apple.ColorSync (4.13.0 - 3929) <2EAFBBEE-E9E2-33FA-BDF4-1A4F3C60334E> /System/Library/Frameworks/ColorSync.framework/Versions/A/ColorSync + 0x199d46000 - 0x19a184c7f com.apple.CoreData (120 - 1629.1) <0D53CA68-008E-3228-8AE7-8738FA67143C> /System/Library/Frameworks/CoreData.framework/Versions/A/CoreData + 0x19a185000 - 0x19a37f057 libsqlite3.dylib (406) <73D616F2-7B6C-3046-8DE6-656F74793D5F> /usr/lib/libsqlite3.dylib + 0x19a41f000 - 0x19a4f3d13 com.apple.BaseBoard (827 - 827) <56EC64E5-6042-3349-B16D-BD9331FE2EE2> /System/Library/PrivateFrameworks/BaseBoard.framework/Versions/A/BaseBoard + 0x19a4f4000 - 0x19a54cd83 com.apple.RunningBoardServices (1.0 - 1080) /System/Library/PrivateFrameworks/RunningBoardServices.framework/Versions/A/RunningBoardServices + 0x19a54d000 - 0x19a5bf1d7 com.apple.AE (944 - 944) <75E434BB-9CD3-39A5-9BB9-87BBD3A2BC3B> /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/AE.framework/Versions/A/AE + 0x19a5c0000 - 0x19a5c7edf libsystem_symptoms.dylib (2394.0.4) <60EE7884-9F4E-3184-A6AC-FA40A7A0297D> /usr/lib/system/libsystem_symptoms.dylib + 0x19a5c8000 - 0x19beb4187 com.apple.Network (1.0 - 6681.1.1) <174B455B-2DE6-3364-BFF6-3802CFA599CE> /System/Library/Frameworks/Network.framework/Versions/A/Network + 0x19beb5000 - 0x19beeba1f com.apple.analyticsd (1.0 - 1) /System/Library/PrivateFrameworks/CoreAnalytics.framework/Versions/A/CoreAnalytics + 0x19beec000 - 0x19beed643 libDiagnosticMessagesClient.dylib (113) /usr/lib/libDiagnosticMessagesClient.dylib + 0x19beee000 - 0x19bf74c73 com.apple.spotlight.metadata.utilities (1.0 - 2459.405) <86E8A8A2-12CC-3F59-8EFD-074A26A19E5A> /System/Library/PrivateFrameworks/MetadataUtilities.framework/Versions/A/MetadataUtilities + 0x19bf75000 - 0x19bff5427 com.apple.Metadata (27.0 - 2459.405) /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/Metadata.framework/Versions/A/Metadata + 0x19bff6000 - 0x19bfff513 com.apple.DiskArbitration (2.7 - 2.7) /System/Library/Frameworks/DiskArbitration.framework/Versions/A/DiskArbitration + 0x19c000000 - 0x19c44438b com.apple.vImage (8.1 - 650.0.1) <54CF15B0-6AB6-360D-A4BE-F3130D8EEEDB> /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vImage.framework/Versions/A/vImage + 0x19c445000 - 0x19c8b5b47 com.apple.QuartzCore (1223.2.3 - 1223.2.3) <216F70F6-AEF9-3D60-942B-F64C636DEF69> /System/Library/Frameworks/QuartzCore.framework/Versions/A/QuartzCore + 0x19c8b6000 - 0x19c906683 libFontRegistry.dylib (424) <6744349A-6836-3ED2-A2A2-9BCD309D768F> /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/ATS.framework/Versions/A/Resources/libFontRegistry.dylib + 0x19cb85000 - 0x19cb8e70b com.apple.OpenDirectory (27.0 - 737) /System/Library/Frameworks/OpenDirectory.framework/Versions/A/OpenDirectory + 0x19cb8f000 - 0x19cbf3357 com.apple.CFOpenDirectory (27.0 - 737) <537D9D7D-9092-3692-BE4D-447AFB0465F7> /System/Library/Frameworks/OpenDirectory.framework/Versions/A/Frameworks/CFOpenDirectory.framework/Versions/A/CFOpenDirectory + 0x19cbf4000 - 0x19cbffbdb com.apple.CoreServices.FSEvents (1433 - 1433) <43D6AFA4-5794-3DC0-AC1F-6EB406B5E1DE> /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/FSEvents.framework/Versions/A/FSEvents + 0x19cc00000 - 0x19cc213c3 com.apple.coreservices.SharedFileList (225 - 225) <81C1A25D-B0A6-39F3-9872-8472670F05FD> /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/SharedFileList.framework/Versions/A/SharedFileList + 0x19cc22000 - 0x19cc24e47 libapp_launch_measurement.dylib (17) <7815B21D-226C-3E90-83AE-77E0623B1737> /usr/lib/libapp_launch_measurement.dylib + 0x19cc25000 - 0x19cc634e7 com.apple.CoreAutoLayout (1.0 - 35) <759521BC-E562-3BE6-8AA2-3248573B8E1E> /System/Library/PrivateFrameworks/CoreAutoLayout.framework/Versions/A/CoreAutoLayout + 0x19cc64000 - 0x19cd4a5bb libxml2.2.dylib (40.1) /usr/lib/libxml2.2.dylib + 0x19cd4b000 - 0x19cdefbc3 com.apple.CoreVideo (1.8 - 758.27) <2DD9BDAC-2339-34E3-B1D4-3C6680F85485> /System/Library/Frameworks/CoreVideo.framework/Versions/A/CoreVideo + 0x19cdf0000 - 0x19cdf2ba3 com.apple.loginsupport (3.0 - 273) /System/Library/PrivateFrameworks/login.framework/Versions/A/Frameworks/loginsupport.framework/Versions/A/loginsupport + 0x19ce28000 - 0x19ce4ee9f com.apple.UserManagement (1.0 - 1) /System/Library/PrivateFrameworks/UserManagement.framework/Versions/A/UserManagement + 0x19e958000 - 0x19e992aeb libsystem_containermanager.dylib (833.0.8.0.1) <08A57205-555D-3792-8931-9D5B585AF326> /usr/lib/system/libsystem_containermanager.dylib + 0x19e993000 - 0x19e9ab6af com.apple.IOSurface (402.5 - 402.5) /System/Library/Frameworks/IOSurface.framework/Versions/A/IOSurface + 0x19e9ac000 - 0x19e9b55c3 com.apple.IOAccelerator (491 - 491) /System/Library/PrivateFrameworks/IOAccelerator.framework/Versions/A/IOAccelerator + 0x19e9b6000 - 0x19ec3bd77 com.apple.Metal (382.5.3 - 382.5.3) /System/Library/Frameworks/Metal.framework/Versions/A/Metal + 0x19ec3c000 - 0x19ec66053 com.apple.audio.caulk (1.0 - 247) /System/Library/PrivateFrameworks/caulk.framework/Versions/A/caulk + 0x19ec67000 - 0x19ee986d7 com.apple.CoreMedia (1.0 - 3350.77.5.6) <976829D2-C1F5-35E4-9FDE-3CCCAF19ED9C> /System/Library/Frameworks/CoreMedia.framework/Versions/A/CoreMedia + 0x19ee99000 - 0x19f138e87 libFontParser.dylib (459) <6B07DF95-1102-3971-A1B0-F92CD10792EF> /System/Library/PrivateFrameworks/FontServices.framework/libFontParser.dylib + 0x19f472000 - 0x19f939b8b com.apple.ImageIO (3.3.0 - 2851) <9F466BFF-CD36-33EB-9240-A9DC03202193> /System/Library/Frameworks/ImageIO.framework/Versions/A/ImageIO + 0x19f93a000 - 0x19fef8027 com.apple.CoreImage (27.0.0 - 1667.21.2) <374BB926-BF7C-3439-843C-D6E5F0D518F6> /System/Library/Frameworks/CoreImage.framework/Versions/A/CoreImage + 0x19fef9000 - 0x19ffaa2c7 com.apple.MetalPerformanceShaders.MPSCore (1.0 - 130.0.19) <95E809A5-CD68-36B9-8C22-5B11055368D4> /System/Library/Frameworks/MetalPerformanceShaders.framework/Versions/A/Frameworks/MPSCore.framework/Versions/A/MPSCore + 0x19ffab000 - 0x19ffaf317 libsystem_configuration.dylib (1446) /usr/lib/system/libsystem_configuration.dylib + 0x19ffb0000 - 0x19ffb6e03 libsystem_sandbox.dylib (3051.0.52) <1E892B56-092E-3832-BDE3-DCE356D7A4FA> /usr/lib/system/libsystem_sandbox.dylib + 0x19ffb7000 - 0x19ffb8043 com.apple.AggregateDictionary (1.0 - 1) /System/Library/PrivateFrameworks/AggregateDictionary.framework/Versions/A/AggregateDictionary + 0x19ffb9000 - 0x19ffbcf8b com.apple.AppleSystemInfo (3.1.5 - 3.1.5) <0C53A195-E323-368E-9A0A-88AABFB4AF66> /System/Library/PrivateFrameworks/AppleSystemInfo.framework/Versions/A/AppleSystemInfo + 0x19ffbd000 - 0x19ffbe35b liblangid.dylib (140) /usr/lib/liblangid.dylib + 0x19ffbf000 - 0x1a00da5c3 com.apple.CoreNLP (1.0 - 313) /System/Library/PrivateFrameworks/CoreNLP.framework/Versions/A/CoreNLP + 0x1a00db000 - 0x1a00e0d6b com.apple.LinguisticData (1.0 - 483.10) <35CC48A6-0E31-368D-944C-2248C8B34CB7> /System/Library/PrivateFrameworks/LinguisticData.framework/Versions/A/LinguisticData + 0x1a00e1000 - 0x1a13168f7 libBNNS.dylib (2212.1.1) <21ACE428-0EFB-3080-AFE4-A86EF66D84C6> /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libBNNS.dylib + 0x1a134a000 - 0x1a1391c13 com.apple.IOMobileFramebuffer (343.0.0 - 343.0.0) /System/Library/PrivateFrameworks/IOMobileFramebuffer.framework/Versions/A/IOMobileFramebuffer + 0x1a13fe000 - 0x1a141309f com.apple.MobileKeyBag (2.0 - 1.0) <3E21D7E4-5C92-3781-940A-F1D90D3E7501> /System/Library/PrivateFrameworks/MobileKeyBag.framework/Versions/A/MobileKeyBag + 0x1a1414000 - 0x1a141e35b com.apple.AssertionServices (1.0 - 1080) /System/Library/PrivateFrameworks/AssertionServices.framework/Versions/A/AssertionServices + 0x1a141f000 - 0x1a14465cb com.apple.coreservices.BackgroundTaskManagement (1.0 - 104) <1A1A491B-B068-3842-B7E6-2DF944B668FA> /System/Library/PrivateFrameworks/BackgroundTaskManagement.framework/Versions/A/BackgroundTaskManagement + 0x1a1474000 - 0x1a1474f2f libobjcMsgSend1.dylib (973.1) /usr/lib/objc/libobjcMsgSend1.dylib + 0x1a1878000 - 0x1a19b44eb libvDSP.dylib (1155) <0826F134-170A-3E0B-A99F-B2CF01A56680> /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libvDSP.dylib + 0x1a1b0b000 - 0x1a1b8a307 com.apple.securityfoundation (6.0 - 55294.0.2) /System/Library/Frameworks/SecurityFoundation.framework/Versions/A/SecurityFoundation + 0x1a1b94000 - 0x1a1b96f93 libquarantine.dylib (217.0.4) <7FD4AE22-86EF-382B-83F5-ADF9336C1160> /usr/lib/system/libquarantine.dylib + 0x1a1b97000 - 0x1a1ba30a7 libCheckFix.dylib (33) /usr/lib/libCheckFix.dylib + 0x1a1ba4000 - 0x1a1bbb16b libcoretls.dylib (189) <431C2F12-0081-3638-8B2F-D1F650B40942> /usr/lib/libcoretls.dylib + 0x1a1bbc000 - 0x1a1bccfb3 libbsm.0.dylib (91.0.1) /usr/lib/libbsm.0.dylib + 0x1a1bcd000 - 0x1a1c2d2ff libmecab.dylib (1159) /usr/lib/libmecab.dylib + 0x1a1c2e000 - 0x1a1c302fb libgermantok.dylib (31) <66456142-BA99-3D22-9E97-0EAD77D8FE5F> /usr/lib/libgermantok.dylib + 0x1a1c31000 - 0x1a1c44a6b libLinearAlgebra.dylib (1617.1.1) <34C0511A-9A4D-3302-9E1D-0DD4ABD6E9D1> /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libLinearAlgebra.dylib + 0x1a1c45000 - 0x1a1e61dbf com.apple.MetalPerformanceShaders.MPSNeuralNetwork (1.0 - 130.0.19) <532F2FFA-8383-3586-973A-910FF82F7F40> /System/Library/Frameworks/MetalPerformanceShaders.framework/Versions/A/Frameworks/MPSNeuralNetwork.framework/Versions/A/MPSNeuralNetwork + 0x1a1e62000 - 0x1a1eb553f com.apple.MetalPerformanceShaders.MPSRayIntersector (1.0 - 130.0.19) /System/Library/Frameworks/MetalPerformanceShaders.framework/Versions/A/Frameworks/MPSRayIntersector.framework/Versions/A/MPSRayIntersector + 0x1a1ffd000 - 0x1a202b167 com.apple.MetalPerformanceShaders.MPSMatrix (1.0 - 130.0.19) /System/Library/Frameworks/MetalPerformanceShaders.framework/Versions/A/Frameworks/MPSMatrix.framework/Versions/A/MPSMatrix + 0x1a202c000 - 0x1a21fe757 com.apple.MetalPerformanceShaders.MPSNDArray (1.0 - 130.0.19) <556369D5-2B69-3CD5-8383-54A36A42ED24> /System/Library/Frameworks/MetalPerformanceShaders.framework/Versions/A/Frameworks/MPSNDArray.framework/Versions/A/MPSNDArray + 0x1a21ff000 - 0x1a228d4df com.apple.MetalPerformanceShaders.MPSImage (1.0 - 130.0.19) /System/Library/Frameworks/MetalPerformanceShaders.framework/Versions/A/Frameworks/MPSImage.framework/Versions/A/MPSImage + 0x1a228e000 - 0x1a2298d63 com.apple.AppleFSCompression (182 - 1.0) <3B5065D1-5D8A-3443-B4B8-293DA9FE47C3> /System/Library/PrivateFrameworks/AppleFSCompression.framework/Versions/A/AppleFSCompression + 0x1a2299000 - 0x1a22a548b libbz2.1.0.dylib (49) /usr/lib/libbz2.1.0.dylib + 0x1a22a6000 - 0x1a22ac1e7 libsystem_coreservices.dylib (203) <57248E07-11A5-3857-918E-4A3A63B69FE8> /usr/lib/system/libsystem_coreservices.dylib + 0x1a22ad000 - 0x1a22dddb7 com.apple.CoreServices.OSServices (1141.1 - 1141.1) /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/OSServices.framework/Versions/A/OSServices + 0x1a285f000 - 0x1a286db87 libz.1.dylib (105) <09881E57-159D-3E5F-B9EB-B708249AC31E> /usr/lib/libz.1.dylib + 0x1a286e000 - 0x1a28abb27 libsystem_m.dylib (3326.0.1) /usr/lib/system/libsystem_m.dylib + 0x1a28ac000 - 0x1a28acb47 libcharset.1.dylib (121) <3C9B584E-740A-3664-A1B0-52E561EA4B0B> /usr/lib/libcharset.1.dylib + 0x1a28ad000 - 0x1a28b04f7 libmacho.dylib (27062) <50DEADEC-3E99-3519-AFC3-4A3FEB3F14C3> /usr/lib/system/libmacho.dylib + 0x1a28b1000 - 0x1a28c9c4f libkxld.dylib (13432.1.9) /usr/lib/system/libkxld.dylib + 0x1a28ca000 - 0x1a28d6707 libcommonCrypto.dylib (600041) <41C99F45-C5E6-39DB-B1F2-A1BEA9D242A4> /usr/lib/system/libcommonCrypto.dylib + 0x1a28d7000 - 0x1a28e0c87 libunwind.dylib (2200.5) <3070AB81-B082-39E8-8A00-EF88DDE9AC47> /usr/lib/system/libunwind.dylib + 0x1a28e1000 - 0x1a28e7fe5 liboah.dylib (385) /usr/lib/liboah.dylib + 0x1a28e8000 - 0x1a28f27eb libcopyfile.dylib (260.0.3) <72D95AF9-BF5E-3A84-81A6-BCC5BDB99857> /usr/lib/system/libcopyfile.dylib + 0x1a28f3000 - 0x1a28f68bf libcompiler_rt.dylib (103.4) /usr/lib/system/libcompiler_rt.dylib + 0x1a28f7000 - 0x1a28fc077 libsystem_collections.dylib (1786.0.3) <1E8022D4-5A37-3A7A-8936-603E6FA88358> /usr/lib/system/libsystem_collections.dylib + 0x1a28fd000 - 0x1a28fff1f libsystem_secinit.dylib (182) /usr/lib/system/libsystem_secinit.dylib + 0x1a2900000 - 0x1a290297f libremovefile.dylib (96) /usr/lib/system/libremovefile.dylib + 0x1a2903000 - 0x1a2903e27 libkeymgr.dylib (31) <5EC997EF-3ADA-360B-9FCD-5F940C83FA4E> /usr/lib/system/libkeymgr.dylib + 0x1a2904000 - 0x1a290caf7 libsystem_dnssd.dylib (3111.0.5.0.1) /usr/lib/system/libsystem_dnssd.dylib + 0x1a290d000 - 0x1a2911f1b libcache.dylib (95) <80BAE197-E285-3F6E-A1EE-B77FE37D7E5D> /usr/lib/system/libcache.dylib + 0x1a2912000 - 0x1a29138f3 libSystem.B.dylib (1359) <4FDC9AA6-B344-37FE-B8C6-A4C94A038F57> /usr/lib/libSystem.B.dylib + 0x1a2914000 - 0x1a2915df7 libfakelink.dylib (5) <76412133-41DC-3EE8-9AC1-12441AB8EE4E> /usr/lib/libfakelink.dylib + 0x1a2916000 - 0x1a2916963 com.apple.SoftLinking (1.0 - 72) <467A5BB5-639E-31D1-8582-D5B0AB28D1F5> /System/Library/PrivateFrameworks/SoftLinking.framework/Versions/A/SoftLinking + 0x1a294c000 - 0x1a29530a3 libiconv.2.dylib (121) /usr/lib/libiconv.2.dylib + 0x1a2967000 - 0x1a2a5e8c7 libarchive.2.dylib (182.0.1) <2869F71C-09C9-3037-B209-F5EE4ED7B73E> /usr/lib/libarchive.2.dylib + 0x1a2a5f000 - 0x1a2ac3ca7 com.apple.SearchKit (1.4.2 - 1.4.2) /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/SearchKit.framework/Versions/A/SearchKit + 0x1a2ac4000 - 0x1a2acbed7 libThaiTokenizer.dylib (28) /usr/lib/libThaiTokenizer.dylib + 0x1a2acc000 - 0x1a2aef52f com.apple.applesauce (1.0 - 17.7) /System/Library/PrivateFrameworks/AppleSauce.framework/Versions/A/AppleSauce + 0x1a2af0000 - 0x1a2b08803 libapple_nghttp2.dylib (42) <6486CF8F-DC50-35BF-A36C-080D6E27965D> /usr/lib/libapple_nghttp2.dylib + 0x1a2b09000 - 0x1a2bb20b7 libSparseBLAS.dylib (196.0.1) /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libSparseBLAS.dylib + 0x1a2bb3000 - 0x1a2bb43d3 com.apple.MetalPerformanceShaders.MetalPerformanceShaders (1.0 - 130.0.19) /System/Library/Frameworks/MetalPerformanceShaders.framework/Versions/A/MetalPerformanceShaders + 0x1a2bb5000 - 0x1a2bbad0f libpam.2.dylib (35) /usr/lib/libpam.2.dylib + 0x1a2bbb000 - 0x1a2c9885f libcompression.dylib (212.0.1) /usr/lib/libcompression.dylib + 0x1a2c99000 - 0x1a2c9d437 libQuadrature.dylib (10) <6BA9713A-AEBB-3AFF-84F9-7E1F25BA9563> /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libQuadrature.dylib + 0x1a2c9e000 - 0x1a3f5f76f libLAPACK.dylib (1617.1.1) <8A02E4DB-01CA-32D3-9384-DC2AF9FAE7C0> /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libLAPACK.dylib + 0x1a3f60000 - 0x1a3fb585f com.apple.DictionaryServices (1.2 - 383.7) <769713A5-4C54-3A47-A3A2-042FE798DD5D> /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/DictionaryServices.framework/Versions/A/DictionaryServices + 0x1a3fb6000 - 0x1a3fd4617 liblzma.5.dylib (21) <2B34F3EF-C505-3D29-9656-E7CEE143585C> /usr/lib/liblzma.5.dylib + 0x1a3fd5000 - 0x1a3fd653f libcoretls_cfhelpers.dylib (189) <290FBB06-5D27-3C11-96B7-21D9770E7D8A> /usr/lib/libcoretls_cfhelpers.dylib + 0x1a3fd7000 - 0x1a4047c4f com.apple.APFS (3288.1.3 - 3288.1.3) <207380E2-6E65-3463-89A3-52B3A82FFD24> /System/Library/PrivateFrameworks/APFS.framework/Versions/A/APFS + 0x1a4048000 - 0x1a40560eb libxar.1.dylib (514.0.1) /usr/lib/libxar.1.dylib + 0x1a4057000 - 0x1a405a2bb libutil.dylib (76) <38245F99-D78C-38F1-94EE-22DF75E72ADE> /usr/lib/libutil.dylib + 0x1a405b000 - 0x1a40850b7 libxslt.1.dylib (22) <993E7F4A-90F1-35C1-BD90-84203244D58A> /usr/lib/libxslt.1.dylib + 0x1a408d000 - 0x1a4106d07 libvMisc.dylib (1155) <8E6D9B3D-641B-3BB7-ABA2-1A5F55E21535> /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libvMisc.dylib + 0x1a4107000 - 0x1a41973a7 libate.dylib (3.0.11) <693A742F-B963-3654-B3E7-F7BAA5B9582F> /usr/lib/libate.dylib + 0x1a41a1000 - 0x1a41b20a7 com.apple.CrashReporterSupport (10.13 - 15146) <94F81559-B4AD-3BDD-A37B-75E023A5C9B9> /System/Library/PrivateFrameworks/CrashReporterSupport.framework/Versions/A/CrashReporterSupport + 0x1a42d9000 - 0x1a430b193 com.apple.pluginkit.framework (1.0 - 1) /System/Library/PrivateFrameworks/PlugInKit.framework/Versions/A/PlugInKit + 0x1a4382000 - 0x1a43cb0cf com.apple.AppleVAFramework (6.2.10 - 6.2.10) <77418C1A-1CB1-3C54-A10D-B2B87798ACA7> /System/Library/PrivateFrameworks/AppleVA.framework/Versions/A/AppleVA + 0x1a43cc000 - 0x1a43e6eb7 libexpat.1.dylib (47) <1A30E0DE-A426-3209-A3B4-2675027F2CF9> /usr/lib/libexpat.1.dylib + 0x1a43e7000 - 0x1a43f0bb3 libheimdal-asn1.dylib (725.0.12) <3AB630AA-8755-33C3-B955-A3CECEBBFA4B> /usr/lib/libheimdal-asn1.dylib + 0x1a44e6000 - 0x1a45a6b4f com.apple.MediaExperience (1.0 - 1) /System/Library/PrivateFrameworks/MediaExperience.framework/Versions/A/MediaExperience + 0x1a45c9000 - 0x1a45dfc87 com.apple.GraphVisualizer (1.0 - 310) <3ED4C650-0272-38D7-9EAC-BEFE69696E71> /System/Library/PrivateFrameworks/GraphVisualizer.framework/Versions/A/GraphVisualizer + 0x1a45e0000 - 0x1a4618e73 com.apple.OTSVG (1.0 - 904) <4E0C0BF7-EA1C-3CBA-B7B1-7E0AC107A174> /System/Library/PrivateFrameworks/OTSVG.framework/Versions/A/OTSVG + 0x1a4619000 - 0x1a462405f com.apple.xpc.AppServerSupport (1.0 - 3298.1.1) <0EA6AF48-F033-31DB-AE1B-4729F37CF2E5> /System/Library/PrivateFrameworks/AppServerSupport.framework/Versions/A/AppServerSupport + 0x1a4625000 - 0x1a462b48b libspindump.dylib (448) /usr/lib/libspindump.dylib + 0x1a462c000 - 0x1a46eb343 com.apple.Heimdal (4.0 - 2.0) <61DDDEF4-D205-362E-B7C2-63DC75F3AFF5> /System/Library/PrivateFrameworks/Heimdal.framework/Versions/A/Heimdal + 0x1a49dd000 - 0x1a4a2204f com.apple.AppleJPEG (1.0 - 1) <453D6AE3-2DBA-3BD6-9CD7-82B023C2556E> /System/Library/PrivateFrameworks/AppleJPEG.framework/Versions/A/AppleJPEG + 0x1a4a23000 - 0x1a4b29347 libJP2.dylib (2851) <8C641091-4DF4-3BE2-BCE5-E38F88B81FC7> /System/Library/Frameworks/ImageIO.framework/Versions/A/Resources/libJP2.dylib + 0x1a4b2a000 - 0x1a4b2bc67 com.apple.WatchdogClient.framework (1.0 - 334.0.4) <02171A1C-6E1D-3348-B7DB-CA81F61BD3AB> /System/Library/PrivateFrameworks/WatchdogClient.framework/Versions/A/WatchdogClient + 0x1a4b2c000 - 0x1a4b6f6b7 com.apple.MultitouchSupport.framework (10400.44 - 10400.44) /System/Library/PrivateFrameworks/MultitouchSupport.framework/Versions/A/MultitouchSupport + 0x1a4b70000 - 0x1a50f976f com.apple.VideoToolbox (1.0 - 3350.77.5.6) <6EDC2F05-B68B-3810-9103-16B2DCE770B4> /System/Library/Frameworks/VideoToolbox.framework/Versions/A/VideoToolbox + 0x1a50fa000 - 0x1a512409f libPng.dylib (2851) <2D9734E3-0991-3823-875A-A7A1ABDC63B4> /System/Library/Frameworks/ImageIO.framework/Versions/A/Resources/libPng.dylib + 0x1a5125000 - 0x1a518634f libTIFF.dylib (2851) <2FF49954-B5F5-3CD4-A4C7-39948EB833A7> /System/Library/Frameworks/ImageIO.framework/Versions/A/Resources/libTIFF.dylib + 0x1a5187000 - 0x1a51a556f com.apple.IOPresentment (67 - 67) /System/Library/PrivateFrameworks/IOPresentment.framework/Versions/A/IOPresentment + 0x1a51a6000 - 0x1a51aa3a7 com.apple.GPUWrangler (8.1.12 - 8.1.12) /System/Library/PrivateFrameworks/GPUWrangler.framework/Versions/A/GPUWrangler + 0x1a51ab000 - 0x1a51ad2bf libRadiance.dylib (2851) <447C6D93-DA95-3A0A-975B-F9BE9095CC28> /System/Library/Frameworks/ImageIO.framework/Versions/A/Resources/libRadiance.dylib + 0x1a51ae000 - 0x1a51b2b13 com.apple.DSExternalDisplay (3.1 - 380) /System/Library/PrivateFrameworks/DSExternalDisplay.framework/Versions/A/DSExternalDisplay + 0x1a51b3000 - 0x1a51ddf47 libJPEG.dylib (2851) /System/Library/Frameworks/ImageIO.framework/Versions/A/Resources/libJPEG.dylib + 0x1a520b000 - 0x1a5210c27 libGIF.dylib (2851) <6830CD73-C87E-3B59-AD95-FEE4ECC0B759> /System/Library/Frameworks/ImageIO.framework/Versions/A/Resources/libGIF.dylib + 0x1a5211000 - 0x1a5222cd3 com.apple.CMCaptureCore (1.0 - 764.21.3) /System/Library/PrivateFrameworks/CMCaptureCore.framework/Versions/A/CMCaptureCore + 0x1a61fe000 - 0x1a626b0d7 libusrtcp.dylib (6681.1.1) /usr/lib/libusrtcp.dylib + 0x1a626c000 - 0x1a6804e2f libswiftCore.dylib (6.4.0 - 6.4.0.31.5) /usr/lib/swift/libswiftCore.dylib + 0x1a6895000 - 0x1a68e79eb libSessionUtility.dylib (449.108) <2D305F72-8E2A-3B72-8617-4278A3D605A4> /System/Library/PrivateFrameworks/AudioSession.framework/libSessionUtility.dylib + 0x1a68e8000 - 0x1a6ac1fb3 com.apple.audio.toolbox.AudioToolbox (1.14 - 1.14) /System/Library/Frameworks/AudioToolbox.framework/Versions/A/AudioToolbox + 0x1a6ac2000 - 0x1a6b2cfe3 com.apple.audio.AudioSession (1.0 - 449.108) <51EBB45A-C823-3BCA-8A5B-5321EA1D636A> /System/Library/PrivateFrameworks/AudioSession.framework/Versions/A/AudioSession + 0x1a6b2d000 - 0x1a6b2f23b libAudioStatistics.dylib (300) /usr/lib/libAudioStatistics.dylib + 0x1a6b5b000 - 0x1a6b76c23 libresolv.9.dylib (96) <7D890D7A-3C34-3E74-BBB6-83FA14A6BE0A> /usr/lib/libresolv.9.dylib + 0x1a6b77000 - 0x1a6b8957f libsasl2.2.dylib (219) /usr/lib/libsasl2.2.dylib + 0x1a6d3f000 - 0x1a6e1eeaf libSMC.dylib (40) /usr/lib/libSMC.dylib + 0x1a6e7d000 - 0x1a6e89db7 com.apple.NetAuth (6.2 - 6.2) <6C13E8AF-2D7F-33FF-9BCB-D23227F8ADD8> /System/Library/PrivateFrameworks/NetAuth.framework/Versions/A/NetAuth + 0x1a6e98000 - 0x1a6ea26f3 com.apple.perfdata (1.0 - 135.0.1) <5F510E06-26BE-33D3-8072-B516312A9FE4> /System/Library/PrivateFrameworks/perfdata.framework/Versions/A/perfdata + 0x1a6ea3000 - 0x1a6eaf977 libperfcheck.dylib (46) /usr/lib/libperfcheck.dylib + 0x1a6eb0000 - 0x1a6ec03f7 com.apple.Kerberos (3.0 - 1) /System/Library/Frameworks/Kerberos.framework/Versions/A/Kerberos + 0x1a6ec1000 - 0x1a6f10b6f com.apple.GSS (4.0 - 2.0) /System/Library/Frameworks/GSS.framework/Versions/A/GSS + 0x1a6f11000 - 0x1a6f21a1f com.apple.CommonAuth (4.0 - 2.0) <08F95713-D604-382B-B59F-0BD5D92E72E6> /System/Library/PrivateFrameworks/CommonAuth.framework/Versions/A/CommonAuth + 0x1a6f22000 - 0x1a6fe4aa7 com.apple.MobileAssets (1.0 - 2215.0.20) <242D2797-AA04-34DF-9308-70C298E0778A> /System/Library/PrivateFrameworks/MobileAsset.framework/Versions/A/MobileAsset + 0x1a7064000 - 0x1a7072ef7 com.apple.CorePhoneNumbers (1.0 - 1) <696A225A-F3BC-383E-A1DB-F8B793B1AA9A> /System/Library/PrivateFrameworks/CorePhoneNumbers.framework/Versions/A/CorePhoneNumbers + 0x1a7199000 - 0x1a71ab1cf libffi.dylib (40) /usr/lib/libffi.dylib + 0x1a8a98000 - 0x1a8b84367 com.apple.combine (1.0 - 3023) <1D189755-83EB-3FC1-A86A-23A60CDAB34A> /System/Library/Frameworks/Combine.framework/Versions/A/Combine + 0x1a8f3d000 - 0x1a8f3d86f com.apple.Accelerate.vecLib (3.11 - vecLib 3.11) /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/vecLib + 0x1a8f5a000 - 0x1a8f5a98f com.apple.CoreServices (1226 - 1226) <92E25F67-1006-322C-B4B8-9F3840F8D9B3> /System/Library/Frameworks/CoreServices.framework/Versions/A/CoreServices + 0x1a9167000 - 0x1a9167417 com.apple.Accelerate (1.11 - Accelerate 1.11) /System/Library/Frameworks/Accelerate.framework/Versions/A/Accelerate + 0x1a9474000 - 0x1a9474f2f libobjcMsgSend2.dylib (973.1) /usr/lib/objc/libobjcMsgSend2.dylib + 0x1ad701000 - 0x1ad70dafb com.apple.SymptomDiagnosticReporter (1.0 - 469) <049798AF-EDA0-3108-9CF8-373B605AB558> /System/Library/PrivateFrameworks/SymptomDiagnosticReporter.framework/Versions/A/SymptomDiagnosticReporter + 0x1ad70e000 - 0x1ad733443 com.apple.PowerLog (1.0 - 1) <5AE600A4-1463-3080-A50C-33517AA61B91> /System/Library/PrivateFrameworks/PowerLog.framework/Versions/A/PowerLog + 0x1ad73f000 - 0x1ad7e88b3 com.apple.DiscRecording (9.0.3 - 9030.4.5) /System/Library/Frameworks/DiscRecording.framework/Versions/A/DiscRecording + 0x1ad7e9000 - 0x1ad819687 com.apple.MediaKit (16 - 944) /System/Library/PrivateFrameworks/MediaKit.framework/Versions/A/MediaKit + 0x1ae20a000 - 0x1ae22021f libswiftDispatch.dylib (1605.0.2) /usr/lib/swift/libswiftDispatch.dylib + 0x1ae4f7000 - 0x1ae59f64f com.apple.BoardServices (1.0 - 827) /System/Library/PrivateFrameworks/BoardServices.framework/Versions/A/BoardServices + 0x1ae5cf000 - 0x1ae5dbc0f com.apple.GraphicsServices (1.0 - 1.0) /System/Library/PrivateFrameworks/GraphicsServices.framework/Versions/A/GraphicsServices + 0x1ae87c000 - 0x1ae89c6a7 com.apple.DebugSymbols (219 - 219) /System/Library/PrivateFrameworks/DebugSymbols.framework/Versions/A/DebugSymbols + 0x1ae89d000 - 0x1aea04e0b com.apple.CoreSymbolication (16.0 - 64578.82.2) /System/Library/PrivateFrameworks/CoreSymbolication.framework/Versions/A/CoreSymbolication + 0x1aea05000 - 0x1aea0ea73 com.apple.CoreTime (340.0.14 - 340.0.14) <090BF232-5377-30C2-A128-C72DC9152EBB> /System/Library/PrivateFrameworks/CoreTime.framework/Versions/A/CoreTime + 0x1b02b2000 - 0x1b032476f com.apple.BackBoardServices (1.0 - 1.0) /System/Library/PrivateFrameworks/BackBoardServices.framework/Versions/A/BackBoardServices + 0x1b0325000 - 0x1b035fa4f com.apple.LDAPFramework (2.4.28 - 194.5) /System/Library/Frameworks/LDAP.framework/Versions/A/LDAP + 0x1b0360000 - 0x1b0361637 com.apple.TrustEvaluationAgent (2.0 - 38) <8CB2434F-FFBE-3D9F-ABB0-24FA33527AB6> /System/Library/PrivateFrameworks/TrustEvaluationAgent.framework/Versions/A/TrustEvaluationAgent + 0x1b048e000 - 0x1b0543f87 com.apple.DiskImagesFramework (704 - 704) <6FC7DD54-CE06-30B3-9231-123022BF8CF8> /System/Library/PrivateFrameworks/DiskImages.framework/Versions/A/DiskImages + 0x1b0581000 - 0x1b0596093 com.apple.RemoteServiceDiscovery (1.0 - 245.0.7) /System/Library/PrivateFrameworks/RemoteServiceDiscovery.framework/Versions/A/RemoteServiceDiscovery + 0x1b0597000 - 0x1b05aa807 com.apple.xpc.RemoteXPC (1.0 - 3298.1.1) <1C3FDABA-4DCB-3557-8126-5B437D640F24> /System/Library/PrivateFrameworks/RemoteXPC.framework/Versions/A/RemoteXPC + 0x1b062f000 - 0x1b06ae96b libcurl.4.dylib (168.0.2) /usr/lib/libcurl.4.dylib + 0x1b06b5000 - 0x1b06ef1f3 com.apple.AppSupport (1.0.0 - 29) <10780E13-654E-39C1-879A-B994F5B2990F> /System/Library/PrivateFrameworks/AppSupport.framework/Versions/A/AppSupport + 0x1b0961000 - 0x1b0963943 com.apple.InternationalTextSearch (1.0 - 1) <5B798ABD-BB61-3D16-BB42-0167B3C55A0A> /System/Library/PrivateFrameworks/InternationalTextSearch.framework/Versions/A/InternationalTextSearch + 0x1b0fad000 - 0x1b0fad3f7 libHeimdalProxy.dylib (88) <6341E9AF-9CD5-3A7A-ACD4-829EE3E79A6D> /System/Library/Frameworks/Kerberos.framework/Versions/A/Libraries/libHeimdalProxy.dylib + 0x1b0fd0000 - 0x1b0fec973 com.apple.StreamingZip (1.0 - 1) <5651DFE8-5C8C-3921-8CC7-A62F564577C9> /System/Library/PrivateFrameworks/StreamingZip.framework/Versions/A/StreamingZip + 0x1b103c000 - 0x1b103f397 libswiftObjectiveC.dylib (973.1) <3143A5EB-68CA-37E3-B414-98792711FF44> /usr/lib/swift/libswiftObjectiveC.dylib + 0x1b1040000 - 0x1b105c257 libswiftos.dylib (1090) <010A7F00-D6F4-3E94-918D-39EF4E33EF95> /usr/lib/swift/libswiftos.dylib + 0x1b1145000 - 0x1b11bbf2f com.apple.proactive.support.ProactiveSupport (1.0 - 423.0.1) <620CAB1D-5B4C-3449-AF3B-5D18989B8D76> /System/Library/PrivateFrameworks/ProactiveSupport.framework/Versions/A/ProactiveSupport + 0x1b1287000 - 0x1b12aee6f com.apple.ASEProcessing (1.59.0 - 1.59.0) <6A028F2D-5B7E-324E-BE22-B589F34B1925> /System/Library/PrivateFrameworks/ASEProcessing.framework/Versions/A/ASEProcessing + 0x1b1474000 - 0x1b1474f2f libobjcMsgSend3.dylib (973.1) /usr/lib/objc/libobjcMsgSend3.dylib + 0x1b3696000 - 0x1b375c353 com.apple.audio.midi.CoreMIDI (2.0 - 88) /System/Library/Frameworks/CoreMIDI.framework/Versions/A/CoreMIDI + 0x1b4310000 - 0x1b431459f com.apple.IOSurfaceAccelerator (1.0.0 - 1.0.0) <0499772A-AB15-393F-B655-6DB5E6D24755> /System/Library/PrivateFrameworks/IOSurfaceAccelerator.framework/Versions/A/IOSurfaceAccelerator + 0x1b93c1000 - 0x1b93db1ef com.apple.HID (1.0 - 1) /System/Library/PrivateFrameworks/HID.framework/Versions/A/HID + 0x1b9474000 - 0x1b9474f2f libobjcMsgSend4.dylib (973.1) /usr/lib/objc/libobjcMsgSend4.dylib + 0x1beb3b000 - 0x1beb48d1b com.apple.NetFS (6.0 - 4.0) /System/Library/Frameworks/NetFS.framework/Versions/A/NetFS + 0x1beffb000 - 0x1beffd807 libswiftDarwin.dylib (428.0.10) /usr/lib/swift/libswiftDarwin.dylib + 0x1c12bd000 - 0x1c13aa9e3 libquic.dylib (6681.1.1) /usr/lib/libquic.dylib + 0x1c13b4000 - 0x1c13d3953 com.apple.private.SystemPolicy (1.0 - 1) /System/Library/PrivateFrameworks/SystemPolicy.framework/Versions/A/SystemPolicy + 0x1c1474000 - 0x1c1474f2f libobjcMsgSend5.dylib (973.1) <3913A71C-B29A-3AEA-820B-BEC40AC1861A> /usr/lib/objc/libobjcMsgSend5.dylib + 0x1c277d000 - 0x1c27f639b com.apple.LoggingSupport (1.0 - 1966.1.1) <1F7476AA-2F22-3C20-8FCA-C8B0E47ABB21> /System/Library/PrivateFrameworks/LoggingSupport.framework/Versions/A/LoggingSupport + 0x1c27f7000 - 0x1c2803437 com.apple.MallocStackLogging (1.0 - 65000) /System/Library/PrivateFrameworks/MallocStackLogging.framework/Versions/A/MallocStackLogging + 0x1c281f000 - 0x1c2880ea3 libmis.dylib (487.0.2) <4A873AE2-BD1A-38D5-B98E-AAF4039D4133> /usr/lib/libmis.dylib + 0x1c2881000 - 0x1c288388f com.apple.gpusw.GPURawCounter (35 - 35) <2383C07B-9F0E-3CAC-9C5A-5272664B255C> /System/Library/PrivateFrameworks/GPURawCounter.framework/Versions/A/GPURawCounter + 0x1c2884000 - 0x1c28a2c13 libswiftCoreAudio.dylib (482.102.10) <2F5D4013-D077-34C3-821E-9A376638588D> /usr/lib/swift/libswiftCoreAudio.dylib + 0x1c28a3000 - 0x1c28a8caf libswiftCoreFoundation.dylib (2412) <45079B74-1B3F-3EE0-8331-5A36B71C3530> /usr/lib/swift/libswiftCoreFoundation.dylib + 0x1c28b2000 - 0x1c28fba9f libswiftXPC.dylib (167.0.2) /usr/lib/swift/libswiftXPC.dylib + 0x1c28fd000 - 0x1c28fd8a3 libswiftIOKit.dylib (1) <125C8CC5-3CFC-3F43-9C25-5DD08C2E4BBD> /usr/lib/swift/libswiftIOKit.dylib + 0x1c4655000 - 0x1c469c2cf libbootpolicy.dylib (304) <528B381C-8756-328F-BE20-8B9573A7EC3A> /usr/lib/libbootpolicy.dylib + 0x1c6017000 - 0x1c602e4a3 libswiftsimd.dylib (25) /usr/lib/swift/libswiftsimd.dylib + 0x1c7557000 - 0x1c755e9fb com.apple.IOAccelMemoryInfo (1.0 - 1) <3E60AA32-713B-3346-B95D-E97E10193F0F> /System/Library/PrivateFrameworks/IOAccelMemoryInfo.framework/Versions/A/IOAccelMemoryInfo + 0x1c8d67000 - 0x1c8d6fdc7 libswiftCoreMIDI.dylib (6) /usr/lib/swift/libswiftCoreMIDI.dylib + 0x1c9474000 - 0x1c9474f2f libobjcMsgSend6.dylib (973.1) <9BC523A3-E167-3F6C-8CAE-0F3EBA671791> /usr/lib/objc/libobjcMsgSend6.dylib + 0x1c996f000 - 0x1c997471b com.apple.MSUDataAccessor (1.0 - 1) /System/Library/PrivateFrameworks/MSUDataAccessor.framework/Versions/A/MSUDataAccessor + 0x1c9e1a000 - 0x1c9e65bcb com.apple.SoftwareUpdateCoreSupport (1.0 - 1) /System/Library/PrivateFrameworks/SoftwareUpdateCoreSupport.framework/Versions/A/SoftwareUpdateCoreSupport + 0x1cd80f000 - 0x1cd856a7b com.apple.biome.BiomeFoundation (1.0 - 250.0.0.3) <85B9EA77-DAE9-3AAD-BD96-D90DE71BE680> /System/Library/PrivateFrameworks/BiomeFoundation.framework/Versions/A/BiomeFoundation + 0x1d00f3000 - 0x1d00faf5f libswiftMetal.dylib (382.5.3) /usr/lib/swift/libswiftMetal.dylib + 0x1d00fb000 - 0x1d01016df libswiftCompression.dylib (18) /usr/lib/swift/libswiftCompression.dylib + 0x1d0f2b000 - 0x1d0fddbf3 libFDR.dylib (1636.0.17) <921820A7-BFA7-3D97-A82D-4276C08554C0> /usr/lib/libFDR.dylib + 0x1d0fde000 - 0x1d10528ef com.apple.TimeSync (1.0 - 1501.7) <04424CE0-D831-3898-81A1-1E7E4FF2FE92> /System/Library/PrivateFrameworks/TimeSync.framework/Versions/A/TimeSync + 0x1d1474000 - 0x1d1474f2f libobjcMsgSend7.dylib (973.1) <248B7BCE-5B4C-34C7-A340-43D5228628C5> /usr/lib/objc/libobjcMsgSend7.dylib + 0x1d1878000 - 0x1d1dc3e37 com.apple.biome.BiomeStreams (1.0 - 250.0.0.3) /System/Library/PrivateFrameworks/BiomeStreams.framework/Versions/A/BiomeStreams + 0x1d1f94000 - 0x1d1fa405b com.apple.SoftwareUpdateCoreConnect (1.0 - 1) /System/Library/PrivateFrameworks/SoftwareUpdateCoreConnect.framework/Versions/A/SoftwareUpdateCoreConnect + 0x1d32b5000 - 0x1d32bc2bb com.apple.audio.IOKitten (300.1 - 300.1) <6B3DA7ED-00EF-31BB-894E-48B53F7C4593> /System/Library/PrivateFrameworks/IOKitten.framework/Versions/A/IOKitten + 0x1d4b15000 - 0x1d4b72d7f com.apple.osanalytics.OSAnalytics (1.0 - 1) /System/Library/PrivateFrameworks/OSAnalytics.framework/Versions/A/OSAnalytics + 0x1d5efc000 - 0x1d5efddeb libswiftQuartzCore.dylib (5) <303BA471-C8BD-3A89-B8AD-A54C26D39328> /usr/lib/swift/libswiftQuartzCore.dylib + 0x1d6244000 - 0x1d624966f com.apple.kperf (1.0 - 1) /System/Library/PrivateFrameworks/kperf.framework/Versions/A/kperf + 0x1d6356000 - 0x1d6359ebf com.apple.MobileSystemServices (1.0 - 1) /System/Library/PrivateFrameworks/MobileSystemServices.framework/Versions/A/MobileSystemServices + 0x1d785c000 - 0x1d78816bb libamsupport.dylib (475.0.9) <53C7DA2C-3ACC-36FE-863A-2FC6D5902000> /usr/lib/libamsupport.dylib + 0x1d7c3a000 - 0x1d7c8a8c7 com.apple.biome.BiomePubSub (1.0 - 250.0.0.3) <3A1E7EDF-3D89-362E-876E-53D841BCB6BC> /System/Library/PrivateFrameworks/BiomePubSub.framework/Versions/A/BiomePubSub + 0x1d7c8b000 - 0x1d7cc0d97 com.apple.biome.BiomeStorage (1.0 - 250.0.0.3) <34109228-69B3-359F-A58D-2930545A9651> /System/Library/PrivateFrameworks/BiomeStorage.framework/Versions/A/BiomeStorage + 0x1d9474000 - 0x1d9474f2f libobjcMsgSend8.dylib (973.1) <3E041BAD-A8E8-3069-B741-78CD1A45B176> /usr/lib/objc/libobjcMsgSend8.dylib + 0x1da6e4000 - 0x1da6f14f7 libswiftUniformTypeIdentifiers.dylib (917.0.1.403) <9C27643C-CAC9-3687-A19B-0F3F40F9CAB1> /usr/lib/swift/libswiftUniformTypeIdentifiers.dylib + 0x1da6f2000 - 0x1da7b20bb libswiftAccelerate.dylib (82) /usr/lib/swift/libswiftAccelerate.dylib + 0x1da8f2000 - 0x1da900f03 libpartition2_dynamic.dylib (3696.0.12.0.3) <25AEE4A8-7C62-3A7F-A279-A3BB6F14E569> /usr/lib/libpartition2_dynamic.dylib + 0x1dada7000 - 0x1dadb094f com.apple.AFKUser (1) <43A2F367-7736-3AE3-AA92-118D27D4DACF> /System/Library/PrivateFrameworks/AFKUser.framework/Versions/A/AFKUser + 0x1e0483000 - 0x1e04848e7 libswiftOSLog.dylib (10) <2243B3A2-A831-3F96-8D1B-29ACF2FD7FDE> /usr/lib/swift/libswiftOSLog.dylib + 0x1e0e2d000 - 0x1e0f189bf com.apple.Symbolication (16.0 - 64578.100.1) <8797C0C4-4EB6-3BA7-BA93-4F41FFAC09F7> /System/Library/PrivateFrameworks/Symbolication.framework/Versions/A/Symbolication + 0x1e1474000 - 0x1e1474f2f libobjcMsgSend9.dylib (973.1) <34A67969-21A0-39D6-BB81-8FDA5A2409DB> /usr/lib/objc/libobjcMsgSend9.dylib + 0x1e9205000 - 0x1e9212b8f com.apple.OSLog (1.0 - 1966.1.1) <21AB9089-83D7-3BAC-8191-B2694336154A> /System/Library/Frameworks/OSLog.framework/Versions/A/OSLog + 0x1e92d5000 - 0x1e93dc76f com.apple.InternalSwiftProtobuf (1.0 - 1.26.0) <48D97BB1-9659-3732-94E3-AE6A574300CC> /System/Library/PrivateFrameworks/InternalSwiftProtobuf.framework/Versions/A/InternalSwiftProtobuf + 0x1e93de000 - 0x1e93e715f com.apple.HIDDisplay (1.0 - 1) <3494AB7C-6C5A-3B1A-AA34-E93D7EF29852> /System/Library/PrivateFrameworks/HIDDisplay.framework/Versions/A/HIDDisplay + 0x1e9474000 - 0x1e9474f2f libobjcMsgSend10.dylib (973.1) <678186C0-8EAD-3B35-8CBB-00285B41E4A0> /usr/lib/objc/libobjcMsgSend10.dylib + 0x1f1474000 - 0x1f1474f2f libobjcMsgSend11.dylib (973.1) /usr/lib/objc/libobjcMsgSend11.dylib + 0x212185000 - 0x212185ae3 com.apple.FeatureFlags (1.0 - 108) <6A89074E-FDB5-3D09-8E6B-349D0EC61D9D> /System/Library/PrivateFrameworks/FeatureFlags.framework/Versions/A/FeatureFlags + 0x219474000 - 0x219474f2f libobjcMsgSend12.dylib (973.1) <10AB03AA-FF1F-3FDC-9DFB-BFC40042C501> /usr/lib/objc/libobjcMsgSend12.dylib + 0x21b77c000 - 0x21b77e067 com.apple.ConfigProfileHelper (18.0 - 1800) /System/Library/PrivateFrameworks/ConfigProfileHelper.framework/Versions/A/ConfigProfileHelper + 0x21fa81000 - 0x21fa87c43 libCoreFSCache.dylib (404) /System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libCoreFSCache.dylib + 0x21fa88000 - 0x21fa8d627 libCoreVMClient.dylib (404) /System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libCoreVMClient.dylib + 0x21fa8e000 - 0x21fa9d857 com.apple.opengl (24.0.2 - 24.0.2) <1DD82D16-39F7-3822-998C-F8DE41F9BD6A> /System/Library/Frameworks/OpenGL.framework/Versions/A/OpenGL + 0x21fa9e000 - 0x21faa069f libCVMSPluginSupport.dylib (24.0.2) /System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libCVMSPluginSupport.dylib + 0x21faa1000 - 0x21faa917f libGFXShared.dylib (24.0.2) /System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libGFXShared.dylib + 0x21faaa000 - 0x21fadd78b libGLImage.dylib (24.0.2) <3D0C3F87-6ECC-390D-B26B-5BB17F8EE6C0> /System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libGLImage.dylib + 0x21fade000 - 0x21fb1726f libGLU.dylib (24.0.2) <4B9B9DFD-36B5-3E59-A0F7-9711B7FF0961> /System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libGLU.dylib + 0x21fc6d000 - 0x21fc76bc7 libGL.dylib (24.0.2) /System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libGL.dylib + 0x221474000 - 0x221474f2f libobjcMsgSend13.dylib (973.1) /usr/lib/objc/libobjcMsgSend13.dylib + 0x229474000 - 0x229474f2f libobjcMsgSend14.dylib (973.1) <9A844C46-A6DA-34D4-8EBF-2AD775C30684> /usr/lib/objc/libobjcMsgSend14.dylib + 0x22ded6000 - 0x22e0262f7 com.apple.ExtensionFoundation (97 - 97) <231850D6-9680-3AED-890A-484D2BBEFC28> /System/Library/Frameworks/ExtensionFoundation.framework/Versions/A/ExtensionFoundation + 0x22fd35000 - 0x22fd75387 com.apple.LightweightCodeRequirements (1.0 - 1) /System/Library/Frameworks/LightweightCodeRequirements.framework/Versions/A/LightweightCodeRequirements + 0x230c4a000 - 0x230c5b207 com.apple.MPSBenchmarkLoop (1.0 - 130.0.19) <00087510-13F7-342F-B967-49761B4306C8> /System/Library/Frameworks/MetalPerformanceShaders.framework/Versions/A/Frameworks/MPSBenchmarkLoop.framework/Versions/A/MPSBenchmarkLoop + 0x230c5c000 - 0x230c6e6bf com.apple.MPSFunctions (1.0 - 130.0.19) <18D723C8-6584-3F46-AD20-843C1FD0CCB9> /System/Library/Frameworks/MetalPerformanceShaders.framework/Versions/A/Frameworks/MPSFunctions.framework/Versions/A/MPSFunctions + 0x230c6f000 - 0x230c73813 com.apple.MPSHost (1.0 - 130.0.19) /System/Library/Frameworks/MetalPerformanceShaders.framework/Versions/A/Frameworks/MPSHost.framework/Versions/A/MPSHost + 0x231474000 - 0x231474f2f libobjcMsgSend15.dylib (973.1) <7C995666-2B2D-3284-AA0A-EBF7C922838E> /usr/lib/objc/libobjcMsgSend15.dylib + 0x2356af000 - 0x23585997b com.apple.SwiftData (1.0 - 180) <80467BD4-1405-3400-9475-B5BFCE896E12> /System/Library/Frameworks/SwiftData.framework/Versions/A/SwiftData + 0x239474000 - 0x239474f2f libobjcMsgSend16.dylib (973.1) /usr/lib/objc/libobjcMsgSend16.dylib + 0x23d16f000 - 0x23d1818f7 com.apple.AppleDeviceQuerySupport (1.0 - 459.0.15) <5E705AD8-327F-3FE0-9A83-173570CE79AC> /System/Library/PrivateFrameworks/AppleDeviceQuerySupport.framework/Versions/A/AppleDeviceQuerySupport + 0x23d997000 - 0x23da2483f com.apple.AppleKeyStore (1.0 - 1.0) <7965DCDE-5074-391F-A878-324D84651857> /System/Library/PrivateFrameworks/AppleKeyStore.framework/Versions/A/AppleKeyStore + 0x23e4d8000 - 0x23e4ecbe3 com.apple.private.AppleMobileFileIntegrity-fmk (1.0 - 1) <76DA48C4-9F86-3D4B-BAE4-82B436938ABD> /System/Library/PrivateFrameworks/AppleMobileFileIntegrity.framework/Versions/A/AppleMobileFileIntegrity + 0x23e4ed000 - 0x23e506633 com.apple.AppleMSG (1.0 - 1) <41BF3334-137D-3619-B482-1FB98C162FDA> /System/Library/PrivateFrameworks/AppleMSG.framework/Versions/A/AppleMSG + 0x24023f000 - 0x240250b9f com.apple.AtomicsInternal (1.1.0 - 5027.0.64) <3B48B13C-EC92-3B98-A685-E7AF32FD42F3> /System/Library/PrivateFrameworks/AtomicsInternal.framework/Versions/A/AtomicsInternal + 0x2402e8000 - 0x240305fef com.apple.imgaudio.AudioAnalytics (1.0 - 1) /System/Library/PrivateFrameworks/AudioAnalytics.framework/Versions/A/AudioAnalytics + 0x240c11000 - 0x240c617a7 com.apple.BackBoardHIDEventFoundation (1.0 - 1) /System/Library/PrivateFrameworks/BackBoardHIDEventFoundation.framework/Versions/A/BackBoardHIDEventFoundation + 0x240c62000 - 0x240cad78f com.apple.BackBoardHIDTouchEventProcessor (1.0 - 1) /System/Library/PrivateFrameworks/BackBoardHIDTouchEventProcessor.framework/Versions/A/BackBoardHIDTouchEventProcessor + 0x240d58000 - 0x240d6b933 com.apple.biome.BiomeDSL (1.0 - 250.0.0.3) /System/Library/PrivateFrameworks/BiomeDSL.framework/Versions/A/BiomeDSL + 0x240d6c000 - 0x240d7163b com.apple.biome.BiomeSync (1.0 - 250.0.0.3) /System/Library/PrivateFrameworks/BiomeSync.framework/Versions/A/BiomeSync + 0x241474000 - 0x241474f2f libobjcMsgSend17.dylib (973.1) <07B4CF85-251B-301B-832B-20B315A59E19> /usr/lib/objc/libobjcMsgSend17.dylib + 0x241878000 - 0x2420d062f com.apple.BiomeLibrary (436.6) <0042911B-273E-30D9-B87D-8F143EF1EBE6> /System/Library/PrivateFrameworks/BiomeLibrary.framework/Versions/A/BiomeLibrary + 0x243093000 - 0x24316c957 com.apple.biome.CascadeSets (1.0 - 250.0.0.3) /System/Library/PrivateFrameworks/CascadeSets.framework/Versions/A/CascadeSets + 0x245194000 - 0x2452e52c3 com.apple.CollectionsInternal (1.2.0 - 5027.0.64) <42FFA870-2B08-331F-9B93-8D67E4A9AA1E> /System/Library/PrivateFrameworks/CollectionsInternal.framework/Versions/A/CollectionsInternal + 0x24567a000 - 0x2456877a7 com.apple.ConnectedMode (1.0 - 1) /System/Library/PrivateFrameworks/ConnectedMode.framework/Versions/A/ConnectedMode + 0x249474000 - 0x249474f2f libobjcMsgSend18.dylib (973.1) <43E575B7-04DB-3999-A633-1A3B638BA6E3> /usr/lib/objc/libobjcMsgSend18.dylib + 0x250f1a000 - 0x250f2ef4b com.apple.DeviceRecovery (1.0 - 1) <1A71D6DD-CAEC-393C-A79A-8CB6FB1A7E6E> /System/Library/PrivateFrameworks/DeviceRecovery.framework/Versions/A/DeviceRecovery + 0x251474000 - 0x251474f2f libobjcMsgSend19.dylib (973.1) <736F4D85-76F7-3B28-8D87-C07E8F7A0EF4> /usr/lib/objc/libobjcMsgSend19.dylib + 0x25774a000 - 0x257858a3f libXTFontStaticRegistryData.dylib (351) <5EB06DF3-EA80-3B1A-9EE4-87170C7D2EC9> /System/Library/PrivateFrameworks/FontServices.framework/libXTFontStaticRegistryData.dylib + 0x257859000 - 0x25785bbaf com.apple.FontServices (1.0 - 1) <1095A112-9900-3801-AE96-12DDB7CBE5EC> /System/Library/PrivateFrameworks/FontServices.framework/Versions/A/FontServices + 0x25785d000 - 0x2578996b7 com.apple.FramePacing (1.0 - 1) <7E7531CC-3812-331E-BC31-4FD430AC45DA> /System/Library/PrivateFrameworks/FramePacing.framework/Versions/A/FramePacing + 0x259474000 - 0x259474f2f libobjcMsgSend20.dylib (973.1) <74E67C8B-6BCA-3184-A18E-A97F370052C6> /usr/lib/objc/libobjcMsgSend20.dylib + 0x25b954000 - 0x25be967b7 com.apple.Gestures (9127.0.84 - 9127.0.84) <722C0EA0-8210-3433-8D57-B9092BE776E2> /System/Library/PrivateFrameworks/Gestures.framework/Versions/A/Gestures + 0x25cd1e000 - 0x25cd23fb7 libGPUCompilerUtils.dylib (32023.921.5) /System/Library/PrivateFrameworks/GPUCompiler.framework/Versions/32023/Libraries/libGPUCompilerUtils.dylib + 0x25cd24000 - 0x25cd646ff libllvm-flatbuffers.dylib (32023.921.5) <613BEB0E-CB65-30BB-AF95-50F06C817D39> /System/Library/PrivateFrameworks/GPUCompiler.framework/Versions/32023/Libraries/libllvm-flatbuffers.dylib + 0x261474000 - 0x261474f2f libobjcMsgSend21.dylib (973.1) /usr/lib/objc/libobjcMsgSend21.dylib + 0x269474000 - 0x269474f2f libobjcMsgSend22.dylib (973.1) <85A60286-5DE3-32BA-B18C-2A498B065C88> /usr/lib/objc/libobjcMsgSend22.dylib + 0x26a8ff000 - 0x26a9f200f com.apple.InstalledContentLibrary (1.0 - 1.0) <271E80B3-4E8C-3652-9B73-EF9CBEF8D7F7> /System/Library/PrivateFrameworks/InstalledContentLibrary.framework/Versions/A/InstalledContentLibrary + 0x26f75a000 - 0x26ffed4bf com.apple.IntelligencePlatformLibrary (436.6) <9431DC2E-DC4F-3A48-BEE1-4BACF5B13FEE> /System/Library/PrivateFrameworks/IntelligencePlatformLibrary.framework/Versions/A/IntelligencePlatformLibrary + 0x271474000 - 0x271474f2f libobjcMsgSend23.dylib (973.1) <5452A0D2-6B19-39BE-ADDD-80B7BCDE3A98> /usr/lib/objc/libobjcMsgSend23.dylib + 0x275eba000 - 0x275f16bb7 com.apple.MessageSecurity (1.0 - 341.0.17) <030ECE37-158D-3E06-89F2-9D3CC3A18D39> /System/Library/PrivateFrameworks/MessageSecurity.framework/Versions/A/MessageSecurity + 0x2765d5000 - 0x276c92107 com.apple.MIL (3600.16 - 3600.16.1) /System/Library/PrivateFrameworks/MIL.framework/Versions/A/MIL + 0x27921a000 - 0x27922532b com.apple.gpusw.MTL3On4 (1.0 - 1) <5738514A-41DE-3AEB-A3FE-767D60C8B457> /System/Library/PrivateFrameworks/MTL3On4.framework/Versions/A/MTL3On4 + 0x279474000 - 0x279474f2f libobjcMsgSend24.dylib (973.1) <94BBF2D6-722B-350D-8557-4D25A8E8D53A> /usr/lib/objc/libobjcMsgSend24.dylib + 0x280049000 - 0x280052f6b com.apple.sear.NSPredicateSecurityPolicy (1.0 - 1) <031A156F-8BB6-36B2-96D2-4CCFF1D3174C> /System/Library/PrivateFrameworks/NSPredicateSecurityPolicy.framework/Versions/A/NSPredicateSecurityPolicy + 0x2813fa000 - 0x281425067 com.apple.OSEligibility (446.1.3) /System/Library/PrivateFrameworks/OSEligibility.framework/Versions/A/OSEligibility + 0x281474000 - 0x281474f2f libobjcMsgSend25.dylib (973.1) <35481387-5A8E-3AE4-86A6-94CEB3CC8726> /usr/lib/objc/libobjcMsgSend25.dylib + 0x2923ca000 - 0x292422357 com.apple.ParsingInternal (0.0.1 - 5027.0.64) <408A4BEF-67E6-3328-8017-54F85C8B6C74> /System/Library/PrivateFrameworks/ParsingInternal.framework/Versions/A/ParsingInternal + 0x294f3e000 - 0x294f513af com.apple.accessibility.PhotosensitivityProcessing (1.0 - 1) <5378D4F0-1832-3522-8FE3-25D775DF12BA> /System/Library/PrivateFrameworks/PhotosensitivityProcessing.framework/Versions/A/PhotosensitivityProcessing + 0x296617000 - 0x29669600f com.apple.PoirotSchematizer (1.0 - 1) <8F63B1C9-E53A-3D4F-8B12-665FCF11937E> /System/Library/PrivateFrameworks/PoirotSchematizer.framework/Versions/A/PoirotSchematizer + 0x296697000 - 0x2966d3abf com.apple.PoirotSQLite (1.0 - 1) /System/Library/PrivateFrameworks/PoirotSQLite.framework/Versions/A/PoirotSQLite + 0x2966d4000 - 0x2967076e7 com.apple.PoirotUDFs (1.0 - 1) /System/Library/PrivateFrameworks/PoirotUDFs.framework/Versions/A/PoirotUDFs + 0x2980b4000 - 0x29821229b com.apple.ProDisplayLibrary (11.0.21 - 11.0.21) /System/Library/PrivateFrameworks/ProDisplayLibrary.framework/Versions/A/ProDisplayLibrary + 0x298d82000 - 0x298d8a023 com.apple.ReflectionInternal (1.0.0 - 5027.0.64) <84A8F5C2-03F0-378B-BDA5-7670124DCA98> /System/Library/PrivateFrameworks/ReflectionInternal.framework/Versions/A/ReflectionInternal + 0x29942d000 - 0x2994403c7 com.apple.RuntimeInternal (1.0.0 - 5027.0.64) <4E29AB5B-73BC-35D0-942E-066A3B19ABC6> /System/Library/PrivateFrameworks/RuntimeInternal.framework/Versions/A/RuntimeInternal + 0x299474000 - 0x299474f2f libobjcMsgSend26.dylib (973.1) <9E0C8664-E7F4-39D1-AAFC-BD92B255E4E8> /usr/lib/objc/libobjcMsgSend26.dylib + 0x29d7e2000 - 0x29d85621f com.apple.SILManager (67.13 - 67.13) <42D7A7C9-BB41-3A05-BD71-72D9809D1002> /System/Library/PrivateFrameworks/SILManager.framework/Versions/A/SILManager + 0x2a1474000 - 0x2a1474f2f libobjcMsgSend27.dylib (973.1) /usr/lib/objc/libobjcMsgSend27.dylib + 0x2a9474000 - 0x2a9474f2f libobjcMsgSend28.dylib (973.1) <09BA7B97-7DF7-3C7F-932A-B6847662FC49> /usr/lib/objc/libobjcMsgSend28.dylib + 0x2aa4cb000 - 0x2aa4facbf com.apple.security.SwiftASN1Internal (1.0 - 1) /System/Library/PrivateFrameworks/SwiftASN1Internal.framework/Versions/A/SwiftASN1Internal + 0x2add74000 - 0x2addc476f com.apple.tightbeam (1.0 - 631.0.5) <1B7DA405-96F3-3EFA-9653-3DE645E0E097> /System/Library/PrivateFrameworks/Tightbeam.framework/Versions/A/Tightbeam + 0x2b1474000 - 0x2b1474f2f libobjcMsgSend29.dylib (973.1) <36D5BA3F-2139-30B0-8558-556764BE9813> /usr/lib/objc/libobjcMsgSend29.dylib + 0x2b3efd000 - 0x2b3efe0ff com.apple.VideoToolboxParavirtualizationSupport (71.0.14 - 71.0.14) <310A3A22-A78C-3557-8CCE-A975490C1D02> /System/Library/PrivateFrameworks/VideoToolboxParavirtualizationSupport.framework/Versions/A/VideoToolboxParavirtualizationSupport + 0x2b9474000 - 0x2b9474f2f libobjcMsgSend30.dylib (973.1) <9F05564A-9D12-372C-98FC-E9F0E6BE4F04> /usr/lib/objc/libobjcMsgSend30.dylib + 0x2bc9d5000 - 0x2bca6f033 libAppleArchive.dylib (469) /usr/lib/libAppleArchive.dylib + 0x2bd15f000 - 0x2bd16900b libCoreEntitlements.dylib (94) <8F204F37-23D4-3AAB-AD38-57B3D8CB73EC> /usr/lib/libCoreEntitlements.dylib + 0x2bd2c2000 - 0x2bd3d426f libcrypto.46.dylib (111.0.5) /usr/lib/libcrypto.46.dylib + 0x2bd66e000 - 0x2bd688aff libhvf.dylib (14) /usr/lib/libhvf.dylib + 0x2be187000 - 0x2be18d2bb libReverseProxyDevice.dylib (114) <9227B01D-28CA-380B-B95A-8C1B10AEAC73> /usr/lib/libReverseProxyDevice.dylib + 0x2be18e000 - 0x2be194fe5 libRosetta.dylib (385) /usr/lib/libRosetta.dylib + 0x2be279000 - 0x2be2b000f libssl.48.dylib (111.0.5) <563A2AF9-97E5-3D1E-80B8-954B9DC97E59> /usr/lib/libssl.48.dylib + 0x2be2ea000 - 0x2be322007 libswiftPrespecialized.dylib (0) <13BA7326-3B46-3349-A093-3FA9E6F00CF2> /usr/lib/libswiftPrespecialized.dylib + 0x2be36f000 - 0x2be377ad3 libTLE.dylib (94) <6968082F-CBF6-356D-9B29-82B9FEC2FC2D> /usr/lib/libTLE.dylib + 0x2be5f0000 - 0x2be5f0669 libswift_Builtin_float.dylib (6.4.0.31.5) <9CB6F7D2-F14F-3C51-9E30-EDCB674B970E> /usr/lib/swift/libswift_Builtin_float.dylib + 0x2be5f1000 - 0x2be67d9c7 libswift_Concurrency.dylib (6.4.0 - 6.4.0.31.5) /usr/lib/swift/libswift_Concurrency.dylib + 0x2be67e000 - 0x2be680ab3 libswift_DarwinFoundation1.dylib (428.0.10) <8C802776-95AE-3ED7-BF1C-D9EB9A7DB358> /usr/lib/swift/libswift_DarwinFoundation1.dylib + 0x2be681000 - 0x2be681d2b libswift_DarwinFoundation2.dylib (428.0.10) /usr/lib/swift/libswift_DarwinFoundation2.dylib + 0x2be682000 - 0x2be68279f libswift_DarwinFoundation3.dylib (428.0.10) <48A04494-256B-3CE1-88A6-79E4B8E9E7B8> /usr/lib/swift/libswift_DarwinFoundation3.dylib + 0x2be685000 - 0x2be71d8b7 libswift_RegexParser.dylib (6.4.0 - 6.4.0.31.5) <1E7009E2-B2B6-3A40-99BC-4C2D9DF18C76> /usr/lib/swift/libswift_RegexParser.dylib + 0x2be720000 - 0x2be7ae4ef libswift_StringProcessing.dylib (6.4.0 - 6.4.0.31.5) /usr/lib/swift/libswift_StringProcessing.dylib + 0x2be811000 - 0x2be822837 libswiftDistributed.dylib (6.4.0 - 6.4.0.31.5) /usr/lib/swift/libswiftDistributed.dylib + 0x2be837000 - 0x2be85012f libswiftObservation.dylib (6.4.0 - 6.4.0.31.5) <01EDB949-A7D9-361F-812D-4C21E3F6537E> /usr/lib/swift/libswiftObservation.dylib + 0x2be85c000 - 0x2be866427 libswiftRegexBuilder.dylib (6.4.0 - 6.4.0.31.5) /usr/lib/swift/libswiftRegexBuilder.dylib + 0x2be9e0000 - 0x2be9f2f0f libswiftSynchronization.dylib (6.4.0 - 6.4.0.31.5) <523DD911-05CA-39CE-A98A-27EAB3BA63A4> /usr/lib/swift/libswiftSynchronization.dylib + 0x2be9f4000 - 0x2bea11ea7 libswiftSystem.dylib (5027.0.67) <8131BBA8-DF06-3EA3-97AE-E7A0646F18BB> /usr/lib/swift/libswiftSystem.dylib + 0x2beb7d000 - 0x2beb8075b libsystem_darwindirectory.dylib (129.0.1) <61264923-2AA5-3658-B8C4-550C71E9D4B3> /usr/lib/system/libsystem_darwindirectory.dylib + 0x2beb81000 - 0x2beb8bd9b libsystem_eligibility.dylib (446.1.3) /usr/lib/system/libsystem_eligibility.dylib + 0x2beb8c000 - 0x2beb9542b libsystem_sanitizers.dylib (32) <7138ED99-7AA0-34EA-B35B-20EF6ADB1EED> /usr/lib/system/libsystem_sanitizers.dylib + 0x2beb96000 - 0x2beb96a13 libsystem_trial.dylib (511) <6AE48824-EC44-3A8C-B501-BE57DBE892E7> /usr/lib/system/libsystem_trial.dylib + 0x2c1474000 - 0x2c1474f2f libobjcMsgSend31.dylib (973.1) <0985E20F-78C3-3466-A2B2-DBB95F7104A3> /usr/lib/objc/libobjcMsgSend31.dylib + 0x2c9474000 - 0x2c9474f2f libobjcMsgSend32.dylib (973.1) <0D309D58-D576-3E5D-AD4B-6D55AB491702> /usr/lib/objc/libobjcMsgSend32.dylib + 0x2d1474000 - 0x2d1474f2f libobjcMsgSend33.dylib (973.1) <346E0484-48FA-369B-8A64-93B5F5341CFE> /usr/lib/objc/libobjcMsgSend33.dylib + 0x2d9474000 - 0x2d9474f2f libobjcMsgSend34.dylib (973.1) <6A31F809-BCBE-3E01-A367-E91FDACCE324> /usr/lib/objc/libobjcMsgSend34.dylib diff --git a/docs/benchmarks/2026-09-27/serial-profile/data/sample_t1_driver_phases.txt b/docs/benchmarks/2026-09-27/serial-profile/data/sample_t1_driver_phases.txt new file mode 100644 index 00000000..d05ff106 --- /dev/null +++ b/docs/benchmarks/2026-09-27/serial-profile/data/sample_t1_driver_phases.txt @@ -0,0 +1,45 @@ +PHASES {"call": 0, "threads": 1, "refine_s": 0.5104450409999117, "legalise_s": 0.000158958, "quality_s": 0.004720333, "scan_s": 0.34237908499999997, "split_s": 0.13042704499999996, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.03275961999991184} +PHASES {"call": 1, "threads": 1, "refine_s": 0.45740345801459625, "legalise_s": 2.2125e-05, "quality_s": 0.0008975, "scan_s": 0.29913208299999994, "split_s": 0.12788095599999996, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.029470794014596374} +PHASES {"call": 2, "threads": 1, "refine_s": 0.5070541250170209, "legalise_s": 2.1125e-05, "quality_s": 0.0008825, "scan_s": 0.33192658299999994, "split_s": 0.1434849229999999, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.030738994017021043} +PHASES {"call": 3, "threads": 1, "refine_s": 0.5213379169581458, "legalise_s": 2.2791e-05, "quality_s": 0.000910125, "scan_s": 0.33638266599999983, "split_s": 0.14155774699999998, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.04246458795814598} +PHASES {"call": 4, "threads": 1, "refine_s": 0.5120812919922173, "legalise_s": 2.3042e-05, "quality_s": 0.000912958, "scan_s": 0.326205003, "split_s": 0.14476354199999997, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.040176746992217294} +PHASES {"call": 5, "threads": 1, "refine_s": 0.5163254999788478, "legalise_s": 2.2583e-05, "quality_s": 0.000970333, "scan_s": 0.3306394579999999, "split_s": 0.14353220400000005, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.0411609219788478} +PHASES {"call": 6, "threads": 1, "refine_s": 0.5071192079922184, "legalise_s": 2.2166e-05, "quality_s": 0.001871667, "scan_s": 0.32499975200000003, "split_s": 0.13992879500000002, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.04029682799221837} +PHASES {"call": 7, "threads": 1, "refine_s": 0.5183523339801468, "legalise_s": 0.000104, "quality_s": 0.000877709, "scan_s": 0.3303492089999999, "split_s": 0.144438249, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.04258316698014694} +PHASES {"call": 8, "threads": 1, "refine_s": 0.5192097080289386, "legalise_s": 2.2791e-05, "quality_s": 0.001025417, "scan_s": 0.329480077, "split_s": 0.145138415, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.043543008028938596} +PHASES {"call": 9, "threads": 1, "refine_s": 0.5143210409441963, "legalise_s": 0.000114083, "quality_s": 0.000888333, "scan_s": 0.32740249699999985, "split_s": 0.14647620599999997, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.039439921944196404} +PHASES {"call": 10, "threads": 1, "refine_s": 0.5058157499879599, "legalise_s": 2.3125e-05, "quality_s": 0.000911333, "scan_s": 0.32525942100000005, "split_s": 0.14220245599999998, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.03741941498795981} +PHASES {"call": 11, "threads": 1, "refine_s": 0.5104079169686884, "legalise_s": 2.3791e-05, "quality_s": 0.001749958, "scan_s": 0.3260184589999999, "split_s": 0.14419666800000006, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.03841904096868834} +PHASES {"call": 12, "threads": 1, "refine_s": 0.5186771659646183, "legalise_s": 2.2667e-05, "quality_s": 0.001031167, "scan_s": 0.32973633299999977, "split_s": 0.14539379400000008, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.04249320496461845} +PHASES {"call": 13, "threads": 1, "refine_s": 0.5390596659854054, "legalise_s": 2.2709e-05, "quality_s": 0.000876792, "scan_s": 0.34546745600000006, "split_s": 0.149053622, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.04363908698540536} +PHASES {"call": 14, "threads": 1, "refine_s": 0.5095614579622634, "legalise_s": 2.2667e-05, "quality_s": 0.001024875, "scan_s": 0.32641575399999995, "split_s": 0.142111252, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.03998690996226342} +PHASES {"call": 15, "threads": 1, "refine_s": 0.5139541670214385, "legalise_s": 2.2167e-05, "quality_s": 0.001013916, "scan_s": 0.32829008400000004, "split_s": 0.14286720899999997, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.041760791021438454} +PHASES {"call": 16, "threads": 1, "refine_s": 0.506772417051252, "legalise_s": 2.2209e-05, "quality_s": 0.000872875, "scan_s": 0.32413546, "split_s": 0.14343345700000004, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.0383084160512519} +PHASES {"call": 17, "threads": 1, "refine_s": 0.5138655420159921, "legalise_s": 2.2292e-05, "quality_s": 0.001985167, "scan_s": 0.327760996, "split_s": 0.14421425399999993, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.03988283301599216} +PHASES {"call": 18, "threads": 1, "refine_s": 0.5115051669999957, "legalise_s": 2.35e-05, "quality_s": 0.000969834, "scan_s": 0.327231707, "split_s": 0.14443788200000002, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.03884224399999581} +PHASES {"call": 19, "threads": 1, "refine_s": 0.5113389170146547, "legalise_s": 2.2125e-05, "quality_s": 0.0009665, "scan_s": 0.32799283300000004, "split_s": 0.14199854099999992, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.0403589180146548} +PHASES {"call": 20, "threads": 1, "refine_s": 0.5057096249656752, "legalise_s": 2.175e-05, "quality_s": 0.000962542, "scan_s": 0.325259498, "split_s": 0.14042591599999998, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.03903991896567516} +PHASES {"call": 21, "threads": 1, "refine_s": 0.5094540000427514, "legalise_s": 2.2167e-05, "quality_s": 0.00192, "scan_s": 0.32727375599999997, "split_s": 0.14137491499999996, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.03886316204275145} +PHASES {"call": 22, "threads": 1, "refine_s": 0.5091770840226673, "legalise_s": 2.2333e-05, "quality_s": 0.001026667, "scan_s": 0.32660120599999987, "split_s": 0.14161012299999998, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.03991675502266745} +PHASES {"call": 23, "threads": 1, "refine_s": 0.508739750017412, "legalise_s": 2.1834e-05, "quality_s": 0.0016395, "scan_s": 0.32521558600000017, "split_s": 0.14104724700000001, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.04081558301741181} +PHASES {"call": 24, "threads": 1, "refine_s": 0.506640708015766, "legalise_s": 2.4917e-05, "quality_s": 0.000869916, "scan_s": 0.32360828599999997, "split_s": 0.14221100199999998, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.039926587015766124} +PHASES {"call": 25, "threads": 1, "refine_s": 0.5093241250142455, "legalise_s": 2.2375e-05, "quality_s": 0.000960625, "scan_s": 0.32701553899999997, "split_s": 0.142663833, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.03866175301424549} +PHASES {"call": 26, "threads": 1, "refine_s": 0.5079290419816971, "legalise_s": 2.3709e-05, "quality_s": 0.000887542, "scan_s": 0.324670835, "split_s": 0.142151834, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.040195121981697085} +PHASES {"call": 27, "threads": 1, "refine_s": 0.5104393750079907, "legalise_s": 2.3875e-05, "quality_s": 0.000968375, "scan_s": 0.32534895699999994, "split_s": 0.14356362299999995, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.040534545007990835} +PHASES {"call": 28, "threads": 1, "refine_s": 0.5081575840013102, "legalise_s": 2.3e-05, "quality_s": 0.000949459, "scan_s": 0.324373504, "split_s": 0.14387349800000002, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.03893812300131019} +PHASES {"call": 29, "threads": 1, "refine_s": 0.5185662909643725, "legalise_s": 2.2458e-05, "quality_s": 0.000973875, "scan_s": 0.333033377, "split_s": 0.14342062600000005, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.04111595496437237} +PHASES {"call": 30, "threads": 1, "refine_s": 0.5137958340346813, "legalise_s": 2.2333e-05, "quality_s": 0.001857333, "scan_s": 0.3277819160000001, "split_s": 0.144483041, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.039651211034681194} +PHASES {"call": 31, "threads": 1, "refine_s": 0.5115374579909258, "legalise_s": 2.1666e-05, "quality_s": 0.000987917, "scan_s": 0.32634216799999993, "split_s": 0.14354463000000003, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.04064107699092581} +PHASES {"call": 32, "threads": 1, "refine_s": 0.5068692499771714, "legalise_s": 2.2416e-05, "quality_s": 0.000967042, "scan_s": 0.325916333, "split_s": 0.13976008000000004, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.04020337897717144} +PHASES {"call": 33, "threads": 1, "refine_s": 0.5438026660121977, "legalise_s": 2.2875e-05, "quality_s": 0.00100575, "scan_s": 0.353647711, "split_s": 0.14574729699999997, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.04337903301219778} +PHASES {"call": 34, "threads": 1, "refine_s": 0.5452499579987489, "legalise_s": 2.2875e-05, "quality_s": 0.001694125, "scan_s": 0.34708449800000013, "split_s": 0.154680961, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.041767498998748764} +PHASES {"call": 35, "threads": 1, "refine_s": 0.5149605420301668, "legalise_s": 2.4083e-05, "quality_s": 0.000875875, "scan_s": 0.330697958, "split_s": 0.14381362399999995, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.039549002030166897} +PHASES {"call": 36, "threads": 1, "refine_s": 0.5436214579967782, "legalise_s": 2.2958e-05, "quality_s": 0.000873625, "scan_s": 0.3452767070000001, "split_s": 0.15365625200000008, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.043791915996778036} +PHASES {"call": 37, "threads": 1, "refine_s": 0.5217214170261286, "legalise_s": 2.2667e-05, "quality_s": 0.000996041, "scan_s": 0.33662854200000014, "split_s": 0.14406466400000006, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.04000950302612849} +PHASES {"call": 38, "threads": 1, "refine_s": 0.47361545800231397, "legalise_s": 2.2333e-05, "quality_s": 0.00092875, "scan_s": 0.31409516700000006, "split_s": 0.12963896100000005, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.02893024700231389} +PHASES {"call": 39, "threads": 1, "refine_s": 0.45458812499418855, "legalise_s": 2.1208e-05, "quality_s": 0.000885667, "scan_s": 0.29929837600000003, "split_s": 0.12583608199999993, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.02854679199418861} +PHASES {"call": 40, "threads": 1, "refine_s": 0.4672810420161113, "legalise_s": 2.1625e-05, "quality_s": 0.000877291, "scan_s": 0.30821512300000004, "split_s": 0.12942012599999994, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.02874687701611131} +PHASES {"call": 41, "threads": 1, "refine_s": 0.4539961660047993, "legalise_s": 2.0667e-05, "quality_s": 0.000876, "scan_s": 0.2983404980000002, "split_s": 0.126236667, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.02852233400479917} +PHASES {"call": 42, "threads": 1, "refine_s": 0.45673658297164366, "legalise_s": 2.1291e-05, "quality_s": 0.000875125, "scan_s": 0.29965374699999986, "split_s": 0.12752604399999998, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.028660375971643864} +PHASES {"call": 43, "threads": 1, "refine_s": 0.453522875031922, "legalise_s": 2.1666e-05, "quality_s": 0.000876792, "scan_s": 0.29781437899999996, "split_s": 0.126227, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.028583038031922053} +PHASES {"call": 44, "threads": 1, "refine_s": 0.4532630000030622, "legalise_s": 2.1792e-05, "quality_s": 0.000890916, "scan_s": 0.298009793, "split_s": 0.12582725300000003, "rounds": 41, "inserted": 213464, "flips": 445657, "max_error": 0.9999796549479072, "triangles": 428217, "vertices": 214644, "rest_s": 0.028513246003062098} diff --git a/docs/benchmarks/2026-09-27/serial-profile/scripts/analyse.py b/docs/benchmarks/2026-09-27/serial-profile/scripts/analyse.py new file mode 100644 index 00000000..c00e99dc --- /dev/null +++ b/docs/benchmarks/2026-09-27/serial-profile/scripts/analyse.py @@ -0,0 +1,137 @@ +"""analyse.py INSTR_TXT [--chunks]: per-round tables from the instrumented run. + +Record lines (instrument.patch): R round active scan_s nchunks; C begin end +start stop nodes; I col row on_edge flips | written | read; S marked +deferred_touched deferred_edge triangles split_s incircle exact exact_zero +orient orient_exact. + +Footprint of an insertion = written slots (t, appended slots, u) plus every +slot legalise_around read (each popped triangle and its neighbour across the +tested edge; a flip writes exactly such a pair). Two insertions of the same +round conflict when their footprints share a slot. +""" +import sys +from collections import defaultdict + +import numpy as np + +path = sys.argv[1] +rounds = [] +cur = None +for line in open(path): + tag = line[0] + if tag == "R": + _, r, active, scan_s, nch = line.split() + cur = dict(round=int(r), active=int(active), scan_s=float(scan_s), chunks=[], ins=[]) + rounds.append(cur) + elif tag == "C": + _, b, e, s0, s1, nodes = line.split() + cur["chunks"].append((int(b), int(e), float(s0), float(s1), int(nodes))) + elif tag == "I": + head, written, read, fw = line[2:].split("|") + col, row, on_edge, flips = head.split() + cur["ins"].append((float(col), float(row), int(on_edge), int(flips), + [int(x) for x in written.split()], [int(x) for x in read.split()], + [int(x) for x in fw.split()])) + elif tag == "S": + f = line.split()[1:] + cur.update(marked=int(f[0]), def_touched=int(f[1]), def_edge=int(f[2]), tris=int(f[3]), + split_s=float(f[4]), inc=int(f[5]), inc_exact=int(f[6]), inc_zero=int(f[7]), + ori=int(f[8]), ori_exact=int(f[9])) + +if "--chunks" in sys.argv: + print("| round | active | nodes scanned | scan ms | chunks | max chunk ms | mean chunk ms | imbalance max/mean | last start ms | join tail ms |") + print("|---|---|---|---|---|---|---|---|---|---|") + tot = defaultdict(float) + for r in rounds: + ch = r["chunks"] + durs = [c[3] - c[2] for c in ch] + nodes = sum(c[4] for c in ch) + mx, mean = max(durs), sum(durs) / len(durs) + last_start = max(c[2] for c in ch) + tail = r["scan_s"] - max(c[3] for c in ch) + tot["scan"] += r["scan_s"]; tot["max"] += mx; tot["mean"] += mean + tot["start"] += last_start; tot["tail"] += tail; tot["nodes"] += nodes + print(f"| {r['round']} | {r['active']} | {nodes} | {1e3*r['scan_s']:.2f} | {len(ch)} | {1e3*mx:.2f} | {1e3*mean:.2f} | {mx/mean:.2f} | {1e3*last_start:.3f} | {1e3*tail:.3f} |") + print(f"| sum | | {tot['nodes']:.0f} | {1e3*tot['scan']:.1f} | | {1e3*tot['max']:.1f} | {1e3*tot['mean']:.1f} | {tot['max']/tot['mean']:.2f} | {1e3*tot['start']:.2f} | {1e3*tot['tail']:.2f} |") + sys.exit(0) + +BLOCK = 64 # nodes; a coarse partition only to describe spatial spread +print("| round | active | marked | inserted | deferred (touched) | deferred (edge) | flips/ins mean | footprint mean | p50 | p99 | max | write set mean | ins. conflicting (fp) | conflict pairs (fp) | mean/max conflict degree (fp) | ins. conflicting (write-write) | earlier-overlap (fp) | median NN dist (nodes) | 64-blocks hit | max ins/block |") +print("|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|") +T = defaultdict(float) +allfp = [] +allw = [] +for r in rounds: + ins = r["ins"] + if not ins: + print(f"| {r['round']} | {r['active']} | {r['marked']} | 0 |" + " |" * 16) + continue + fps = [set(w) | set(rd) for (_, _, _, _, w, rd, _) in ins] + wps = [set(w) | set(fw) for (_, _, _, _, w, _, fw) in ins] + sizes = np.array([len(f) for f in fps]) + allfp += list(sizes) + flips = np.array([x[3] for x in ins]) + def conflicts(sets): + owners = defaultdict(list) + for k, f in enumerate(sets): + for x in f: + owners[x].append(k) + pairs = set() + for lst in owners.values(): + for i1 in range(len(lst)): + for i2 in range(i1 + 1, len(lst)): + pairs.add((lst[i1], lst[i2])) + deg = np.zeros(len(sets), int) + for i1, i2 in pairs: + deg[i1] += 1 + deg[i2] += 1 + return pairs, deg + pairs, deg = conflicts(fps) + wpairs, wdeg = conflicts(wps) + involved = deg > 0 + wsizes = np.array([len(w) for w in wps]) + # overlap with an earlier insertion of the round, in the serial order + seen, earlier = set(), 0 + for f in fps: + earlier += 1 if f & seen else 0 + seen |= f + pts = np.array([(x[0], x[1]) for x in ins]) + # nearest-neighbour distance by a grid hash (no scipy in the venv) + cell = 16.0 + grid = defaultdict(list) + for k, (c, rw) in enumerate(pts): + grid[(int(c // cell), int(rw // cell))].append(k) + nn = np.full(len(pts), np.inf) + for k, (c, rw) in enumerate(pts): + gx, gy = int(c // cell), int(rw // cell) + best = np.inf + for ring in range(0, 400): + # every point in rings > ring is at least ring * cell away + if best <= ring * cell: + break + cand = [j for dx in range(-ring, ring + 1) for dy in range(-ring, ring + 1) + if max(abs(dx), abs(dy)) == ring for j in grid.get((gx + dx, gy + dy), []) if j != k] + if cand: + best = min(best, float(np.min(np.hypot(pts[cand, 0] - c, pts[cand, 1] - rw)))) + nn[k] = best + blocks = defaultdict(int) + for c, rw in pts: + blocks[(int(c // BLOCK), int(rw // BLOCK))] += 1 + n = len(ins) + T["marked"] += r["marked"]; T["ins"] += n; T["dt"] += r["def_touched"]; T["de"] += r["def_edge"] + T["pairs"] += len(pairs); T["winv"] += (wdeg > 0).sum(); T["wpairs"] += len(wpairs); allw.extend(wsizes); T["inv"] += involved.sum(); T["earlier"] += earlier + print(f"| {r['round']} | {r['active']} | {r['marked']} | {n} | {r['def_touched']} | {r['def_edge']} | {flips.mean():.2f} | {sizes.mean():.1f} | {np.percentile(sizes,50):.0f} | {np.percentile(sizes,99):.0f} | {sizes.max()} | {wsizes.mean():.1f} | {100*involved.mean():.0f} % | {len(pairs)} | {deg.mean():.1f}/{deg.max()} | {100*(wdeg>0).mean():.0f} % | {100*earlier/n:.0f} % | {np.median(nn[np.isfinite(nn)]) if np.isfinite(nn).any() else float('nan'):.1f} | {len(blocks)} | {max(blocks.values())} |") +allfp = np.array(allfp) +print(f"\nTotals: marked {T['marked']:.0f}, inserted {T['ins']:.0f} ({100*T['ins']/T['marked']:.0f} %), " + f"deferred touched {T['dt']:.0f} ({100*T['dt']/T['marked']:.0f} %), deferred edge {T['de']:.0f} ({100*T['de']/T['marked']:.0f} %); " + f"insertions in >=1 conflict {T['inv']:.0f} ({100*T['inv']/T['ins']:.0f} %), conflict pairs {T['pairs']:.0f}, " + f"write-write: insertions in >=1 conflict {T['winv']:.0f} ({100*T['winv']/T['ins']:.0f} %), pairs {T['wpairs']:.0f}; " + f"overlap an earlier insertion {T['earlier']:.0f} ({100*T['earlier']/T['ins']:.0f} %)") +allw = np.array(allw) +print(f"write set slots over all insertions: mean {allw.mean():.2f}, p50 {np.percentile(allw,50):.0f}, p90 {np.percentile(allw,90):.0f}, p99 {np.percentile(allw,99):.0f}, max {allw.max()}") +print(f"footprint slots over all insertions: mean {allfp.mean():.2f}, p50 {np.percentile(allfp,50):.0f}, p90 {np.percentile(allfp,90):.0f}, p99 {np.percentile(allfp,99):.0f}, max {allfp.max()}") +inc = sum(r.get("inc", 0) for r in rounds); ie = sum(r.get("inc_exact", 0) for r in rounds) +iz = sum(r.get("inc_zero", 0) for r in rounds); oc = sum(r.get("ori", 0) for r in rounds); oe = sum(r.get("ori_exact", 0) for r in rounds) +fl = sum(x[3] for r in rounds for x in r["ins"]) +print(f"split-phase predicates: incircle {inc} (exact fallback {ie} = {100*ie/inc:.1f} %, of which cocircular {iz}), orient2d {oc} (exact {oe}); flips {fl}") diff --git a/docs/benchmarks/2026-09-27/serial-profile/scripts/attribute.py b/docs/benchmarks/2026-09-27/serial-profile/scripts/attribute.py new file mode 100644 index 00000000..2566a368 --- /dev/null +++ b/docs/benchmarks/2026-09-27/serial-profile/scripts/attribute.py @@ -0,0 +1,139 @@ +"""attribute.py SAMPLE_TXT DSYM : self-sample attribution of a sample(1) report. + +Parses sample(1)'s call graph, computes each node's self count (its count +minus its children's), and resolves every _core address with `atos -i` +against the dSYM to its inline chain (innermost first, with file:line). Each +self sample inside the refine call is put in one category: frames are walked +innermost to outermost (inline chain, then the sampled stack) and the first +frame that matches a rule decides. Allocation (malloc/free/memmove) is its +own category, and is also charged to the next matching frame as its owner. +Samples not under refine (Python, idle threads) are dropped. +""" +import re +import subprocess +import sys +from collections import Counter, defaultdict + +path, dsym = sys.argv[1], sys.argv[2] +text = open(path).read() +lines = text.split("\n") +start = next(i for i, l in enumerate(lines) if l.startswith("Call graph:")) + 1 +end = next(i for i, l in enumerate(lines[start:], start) if not l.strip()) +load = int(re.search(r"(0x[0-9a-f]+) -\s+0x[0-9a-f]+ \+_core\.cpython", text).group(1), 16) + +node_re = re.compile(r"^([ +!:|]*)(\d+) (.*)$") +nodes = [] # depth, count, name, addrs, parent, in_core, self +stack = [] +for l in lines[start:end]: + mm = node_re.match(l) + if not mm: + continue + depth, count, rest = len(mm.group(1)), int(mm.group(2)), mm.group(3) + am = re.search(r"\[([0-9a-fx,]+)\]", rest) + addrs = [int(a, 16) for a in am.group(1).split(",")] if am else [] + while stack and nodes[stack[-1]][0] >= depth: + stack.pop() + parent = stack[-1] if stack else None + nodes.append([depth, count, rest.split(" (in ")[0], addrs, parent, "(in _core." in rest, 0]) + stack.append(len(nodes) - 1) +child_sum = defaultdict(int) +for n in nodes: + if n[4] is not None: + child_sum[n[4]] += n[1] +for i, n in enumerate(nodes): + n[6] = n[1] - child_sum[i] + +chains = {} +for a in sorted({a for n in nodes if n[5] for a in n[3]}): + out = subprocess.run(["atos", "-i", "-o", dsym, "-l", hex(load), hex(a)], + capture_output=True, text=True).stdout + chains[a] = [x.strip() for x in out.split("\n") if x.strip()] + + +def frames_of(i): + """Every frame from node i to the root, innermost first: a _core node + contributes the full inline chain of its first address.""" + out = [] + while i is not None: + n = nodes[i] + out += chains.get(n[3][0], [n[2]]) if n[5] and n[3] else [n[2]] + i = n[4] + return out + + +ALLOC = r"malloc|_free\b|free_tc|memmove|memset|bzero|operator new|operator delete|_xzm|madvise|vm_" +RULES = [ + ("exact incircle (adaptive fallback)", r"incircleadapt|expansion_|DetriaExact::incircle"), + ("filtered predicates (incircle/orient2d)", r"FilteredKernel|orient2d|incircle|orient_sign"), + ("must_flip (edge lookup, frame points)", r"must_flip|lawson\.hpp:(5\d|6\d|7\d|8\d)\)"), + ("topology writes: flip", r"LatticeMesh::flip"), + ("topology writes: split", r"split_inside|split_edge|add_vertex"), + ("topology writes: put/repoint (callers above)", r"LatticeMesh::put|repoint"), + ("legalise_around loop (stack, touched marks)", r"legalise_around|lawson\.hpp:1[0-2]\d\)"), + ("legalise_all (start mesh)", r"legalise_all"), + ("start quality (improve)", r"improve<|quality\.hpp"), + ("scan (parallel phase)", r"refinement::scan<|for_each_row|row_spans|row_segments|scan\.hpp|refine\.hpp:29[0-4]\)|chunks\.hpp"), + ("rebuild active: collect+sort+unique", r"__introsort|__bitset_partition|__partial_sort|__insertion_sort|__sort|refine\.hpp:36[0-6]\)"), + ("split loop bookkeeping (results read, touched, skipped)", r"refine\.hpp:(30\d|31\d|32\d|33\d|34[0-6]|35\d)\)"), + ("results.resize / round setup", r"refine\.hpp:28[6-9]\)"), + ("refine body, no line info (refine.hpp:0)", r"refine\.hpp:0\)"), + ("output: vertices, z, triangles, constraint_edges", r"constraint_edges|refine\.hpp:3[7-9]\d\)|bilinear"), + ("setup: to_lattice, LatticeMesh::build", r"to_lattice|LatticeMesh::build|__hash_table|__tree|refine\.hpp:(9\d|1[0-3]\d|2[4-6]\d|28[0-4])\)"), + ("pybind: outcome conversion", r"pybind11::|type_caster|cast_op") +] + + +def strip(frame): + """A frame reduced to its function name and file:line: balanced <...> + and (...) groups removed, so template arguments cannot match a rule.""" + loc = re.search(r"\(([\w.+-]+:\d+)\)$", frame) + name = frame.split(" (in ")[0] + out, depth = [], 0 + for ch in name: + if ch in "<(": + depth += 1 + elif ch in ">)" and depth: + depth -= 1 + elif depth == 0: + out.append(ch) + return "".join(out) + (f" ({loc.group(1)})" if loc else "") + + +def classify(frames): + for f in frames: + s = strip(f) + for name, rx in RULES: + if re.search(rx, s): + return name + return "other: " + (strip(frames[0])[:80] if frames else "?") + + +cats, owners, leaves = Counter(), Counter(), Counter() +total = 0.0 +for i, n in enumerate(nodes): + if n[6] <= 0: + continue + rest = frames_of(n[4]) if n[4] is not None else [] + if not any("refinement::refine<" in f for f in rest + [n[2]]): + continue + addrs = n[3] if (n[5] and n[3]) else [None] + per = n[6] / len(addrs) + for a in addrs: + frames = (chains.get(a, [n[2]]) if a is not None else [n[2]]) + rest + total += per + if re.search(ALLOC, strip(frames[0])): + cats["allocation (malloc/free/memmove)"] += per + owners[classify(frames[1:])] += per + else: + cats[classify(frames)] += per + leaves[frames[0][:160]] += per + +print(f"self samples under refine: {total:.0f} (1 sample = 1 ms)") +for c, v in cats.most_common(): + print(f"{v:8.0f} {100 * v / total:5.1f} % {c}") +print("\nallocation charged to its owner:") +for c, v in owners.most_common(): + print(f"{v:8.0f} {100 * v / total:5.1f} % {c}") +print("\ntop innermost frames:") +for c, v in leaves.most_common(40): + print(f"{v:8.0f} {100 * v / total:5.1f} % {c}") diff --git a/docs/benchmarks/2026-09-27/serial-profile/scripts/chunksum.py b/docs/benchmarks/2026-09-27/serial-profile/scripts/chunksum.py new file mode 100644 index 00000000..0bbb3b77 --- /dev/null +++ b/docs/benchmarks/2026-09-27/serial-profile/scripts/chunksum.py @@ -0,0 +1,17 @@ +"""chunksum.py FILES...: per file, scan totals from the R and C records.""" +import sys +for path in sys.argv[1:]: + rounds = [] + for line in open(path): + if line[0] == "R": + f = line.split(); rounds.append([float(f[3]), []]) + elif line[0] == "C": + f = line.split(); rounds[-1][1].append((float(f[3]), float(f[4]), int(f[5]))) + scan = sum(r[0] for r in rounds) + mx = sum(max(c[1] - c[0] for c in r[1]) for r in rounds) + busy = sum(sum(c[1] - c[0] for c in r[1]) for r in rounds) + mean = sum(sum(c[1] - c[0] for c in r[1]) / len(r[1]) for r in rounds) + start = sum(max(c[0] for c in r[1]) for r in rounds) + first = sum(min(c[0] for c in r[1]) for r in rounds) + tail = sum(r[0] - max(c[1] for c in r[1]) for r in rounds) + print(f"{path}\tscan_ms={1e3*scan:.1f}\tsum_max_chunk_ms={1e3*mx:.1f}\tsum_mean_chunk_ms={1e3*mean:.1f}\tthread_busy_ms={1e3*busy:.1f}\tfirst_start_ms={1e3*first:.2f}\tlast_start_ms={1e3*start:.2f}\tjoin_tail_ms={1e3*tail:.2f}") diff --git a/docs/benchmarks/2026-09-27/serial-profile/scripts/instrument.patch b/docs/benchmarks/2026-09-27/serial-profile/scripts/instrument.patch new file mode 100644 index 00000000..71c15b49 --- /dev/null +++ b/docs/benchmarks/2026-09-27/serial-profile/scripts/instrument.patch @@ -0,0 +1,240 @@ +diff --git a/include/terrain/mesh/lawson.hpp b/include/terrain/mesh/lawson.hpp +index 68165b0..5aa8d8a 100644 +--- a/include/terrain/mesh/lawson.hpp ++++ b/include/terrain/mesh/lawson.hpp +@@ -32,6 +32,12 @@ + + namespace terrain::mesh { + ++// PROFILE-ONLY: when set, legalise_around appends every slot it reads (the ++// popped triangle and its neighbour across the tested edge). Serial use only. ++namespace prof { ++inline std::vector* reads = nullptr; ++} // namespace prof ++ + struct LatticeFrame { + double dx = 1.0; + double dy = 1.0; +@@ -90,6 +96,11 @@ std::size_t legalise_around(LatticeMesh& m, std::uint32_t q, std::spanpush_back(t); ++ if (i < 3 && m.neighbours(t)[(i + 1) % 3] != kNoNeighbour) ++ prof::reads->push_back(m.neighbours(t)[(i + 1) % 3]); ++ } + if (i == 3 || !detail::must_flip(m, t, (i + 1) % 3, f)) + continue; + const auto u = m.neighbours(t)[(i + 1) % 3]; +diff --git a/include/terrain/predicates/kernel.hpp b/include/terrain/predicates/kernel.hpp +index b794353..1a23f56 100644 +--- a/include/terrain/predicates/kernel.hpp ++++ b/include/terrain/predicates/kernel.hpp +@@ -19,6 +19,12 @@ + + namespace terrain::pred { + ++// PROFILE-ONLY (serial-profile, 2026-09-27): predicate counters, not committed. ++namespace prof { ++inline unsigned long long orient_calls = 0, orient_exact = 0, orient_exact_zero = 0; ++inline unsigned long long incircle_calls = 0, incircle_exact = 0, incircle_exact_zero = 0; ++} // namespace prof ++ + // Qualified static calls, for the same reason as `ExactPredicates`: a model + // must be usable without an instance. + // +@@ -121,10 +127,14 @@ struct FilteredKernel { + const double det = detleft - detright; + const double permanent = std::fabs(detleft) + std::fabs(detright); + ++ ++prof::orient_calls; + if (std::fabs(det) > orient2d_bound_a * permanent) { + return orientation_of_sign(det); + } +- return E::orient2d(a, b, c); ++ ++prof::orient_exact; ++ const auto o = E::orient2d(a, b, c); ++ prof::orient_exact_zero += o == Orientation::Collinear ? 1 : 0; ++ return o; + } + + // Total and precondition-free, unlike the backend's `incircle_ccw`. +@@ -171,10 +181,14 @@ private: + const double det = detail::incircle_det(a, b, c, d); + const double permanent = detail::incircle_permanent(a, b, c, d); + ++ ++prof::incircle_calls; + if (std::fabs(det) > incircle_bound_a * permanent) { + return incircle_of_sign(det); + } +- return E::incircle_ccw(a, b, c, d); ++ ++prof::incircle_exact; ++ const auto r = E::incircle_ccw(a, b, c, d); ++ prof::incircle_exact_zero += r == Incircle::Cocircular ? 1 : 0; ++ return r; + } + }; + +diff --git a/include/terrain/refinement/refine.hpp b/include/terrain/refinement/refine.hpp +index 7605f75..4626fcf 100644 +--- a/include/terrain/refinement/refine.hpp ++++ b/include/terrain/refinement/refine.hpp +@@ -50,6 +50,9 @@ + #include + + #include ++#include ++#include ++#include + #include + #include + #include +@@ -277,6 +280,10 @@ template + + q.skipped_blocked + q.walk_bound_hits; + out.quality_seconds = since(t0); + } ++ // PROFILE-ONLY: RASPUTIN_PROF_OUT names a file for per-round records. ++ std::FILE* prof_out = nullptr; ++ if (const char* path = std::getenv("RASPUTIN_PROF_OUT")) ++ prof_out = std::fopen(path, "w"); + std::vector results; + std::set> footed; // (row, col), R2 step 5 + std::vector active(m.triangle_count()); +@@ -287,12 +294,34 @@ template + ++out.rounds; + results.resize(m.triangle_count()); + t0 = clock::now(); ++ struct ChunkRec { std::size_t begin, end; double start, stop; unsigned long long nodes; }; ++ std::vector chunk_recs; ++ std::mutex chunk_mu; + parallel_util::for_each_chunk(active.size(), options.threads, + [&](std::size_t begin, std::size_t end) { ++ const double c0 = since(t0); ++ const auto n0 = prof::scan_nodes; + for (std::size_t i = begin; i < end; ++i) + results[active[i]] = scan(dem, m, active[i]); ++ const double c1 = since(t0); ++ const std::lock_guard lock{chunk_mu}; ++ chunk_recs.push_back({begin, end, c0, c1, prof::scan_nodes - n0}); + }); +- out.scan_seconds += since(t0); ++ const double scan_round = since(t0); ++ out.scan_seconds += scan_round; ++ if (prof_out) { ++ std::fprintf(prof_out, "R %zu %zu %.9f %zu\n", out.rounds, active.size(), scan_round, chunk_recs.size()); ++ std::sort(chunk_recs.begin(), chunk_recs.end(), [](auto& a, auto& b) { return a.begin < b.begin; }); ++ for (const auto& c : chunk_recs) ++ std::fprintf(prof_out, "C %zu %zu %.9f %.9f %llu\n", c.begin, c.end, c.start, c.stop, c.nodes); ++ } ++ const auto pc0 = pred::prof::incircle_calls, pe0 = pred::prof::incircle_exact, ++ pz0 = pred::prof::incircle_exact_zero, oc0 = pred::prof::orient_calls, ++ oe0 = pred::prof::orient_exact; ++ std::size_t marked = 0, deferred_touched = 0, deferred_edge = 0; ++ std::vector reads, flip_writes; ++ if (prof_out) ++ mesh::prof::reads = &reads; + t0 = clock::now(); + + // `touched` is every slot a split or a flip wrote this round. A marked triangle +@@ -306,8 +335,14 @@ template + if (!detail::needs_split(r, options.tolerance)) + continue; + any = true; +- if (touched[t] != 0) ++ ++marked; ++ if (touched[t] != 0) { ++ ++deferred_touched; + continue; ++ } ++ const std::size_t flips_before = out.flips; ++ reads.clear(); ++ flip_writes.clear(); + const auto before = static_cast(m.triangle_count()); + std::array seeds{t, before, before + 1, before + 1}; + std::size_t n_seeds = 3; +@@ -333,6 +368,7 @@ template + const std::uint32_t u = m.neighbours(t)[e]; + if (u != mesh::kNoNeighbour && touched[u] != 0) { + skipped.push_back(t); ++ ++deferred_edge; + continue; + } + q = m.split_edge(t, e, p); +@@ -346,15 +382,41 @@ template + touched[seeds[3]] = 1; + out.flips += mesh::legalise_around( + m, q, std::span{seeds.data(), n_seeds}, frame, +- [&](std::uint32_t s) { touched[s] = 1; }); ++ [&](std::uint32_t s) { touched[s] = 1; if (prof_out) flip_writes.push_back(s); }); + ++out.inserted; ++ if (prof_out) { ++ // I col row on_edge flips | written slots | read slots | flip-written slots. ++ // Written: t, the appended slots [before, count), u; flipped ++ // slots are in the read list (a flip writes the pair it tested). ++ std::fprintf(prof_out, "I %.3f %.3f %d %zu | %u", p.col, p.row, edge ? 1 : 0, ++ out.flips - flips_before, t); ++ for (auto s2 = before; s2 < m.triangle_count(); ++s2) ++ std::fprintf(prof_out, " %u", s2); ++ if (n_seeds == 4) ++ std::fprintf(prof_out, " %u", seeds[3]); ++ std::fprintf(prof_out, " |"); ++ for (auto x : reads) ++ std::fprintf(prof_out, " %u", x); ++ std::fprintf(prof_out, " |"); ++ for (auto x : flip_writes) ++ std::fprintf(prof_out, " %u", x); ++ std::fprintf(prof_out, "\n"); ++ } + out.carved += r.is_void ? 1 : 0; + out.feet += foot ? 1 : 0; + out.feet_refused += refused ? 1 : 0; + if (foot) + footed.insert({r.node->row, r.node->col}); + } +- out.split_seconds += since(t0); ++ const double split_round = since(t0); ++ out.split_seconds += split_round; ++ mesh::prof::reads = nullptr; ++ if (prof_out) ++ std::fprintf(prof_out, "S %zu %zu %zu %zu %.9f %llu %llu %llu %llu %llu\n", marked, deferred_touched, ++ deferred_edge, m.triangle_count(), split_round, ++ pred::prof::incircle_calls - pc0, pred::prof::incircle_exact - pe0, ++ pred::prof::incircle_exact_zero - pz0, pred::prof::orient_calls - oc0, ++ pred::prof::orient_exact - oe0); + if (!any) + break; + active.clear(); +@@ -366,6 +428,8 @@ template + active.erase(std::unique(active.begin(), active.end()), active.end()); + } + ++ if (prof_out) ++ std::fclose(prof_out); + // By the stopping rule a void triangle holds no valid node, so `uncovered` + // sums zeros unless that rule changes; it is reported so a change shows. + for (const ScanResult& r : results) { +diff --git a/include/terrain/refinement/scan.hpp b/include/terrain/refinement/scan.hpp +index ab526a9..ddc4ed6 100644 +--- a/include/terrain/refinement/scan.hpp ++++ b/include/terrain/refinement/scan.hpp +@@ -50,6 +50,11 @@ + + namespace terrain::refinement { + ++// PROFILE-ONLY: nodes visited by scan on this thread. ++namespace prof { ++inline thread_local unsigned long long scan_nodes = 0; ++} // namespace prof ++ + enum class NodeLocation : std::uint8_t { Inside, Edge0, Edge1, Edge2 }; + + struct ScanResult { +@@ -157,6 +162,7 @@ template + mesh::for_each_row_span(v, [&](mesh::RowSpan span) { + raster::for_each_row_segment(dem, span.row, span.c0, span.c1, [&](raster::RowSegment s) { + const std::uint32_t row = span.row, c = s.first_col; ++ prof::scan_nodes += s.values.size(); + if (r.is_void) { + for (std::uint32_t j = 0; j < s.values.size(); ++j) { + if (missing(s.values[j])) diff --git a/docs/benchmarks/2026-09-27/serial-profile/scripts/instrument.py b/docs/benchmarks/2026-09-27/serial-profile/scripts/instrument.py new file mode 100644 index 00000000..ff18abdf --- /dev/null +++ b/docs/benchmarks/2026-09-27/serial-profile/scripts/instrument.py @@ -0,0 +1,181 @@ +import sys +root = sys.argv[1] +def patch(rel, pairs): + p = f"{root}/{rel}" + s = open(p).read() + for old, new in pairs: + assert s.count(old) == 1, (rel, old[:60]) + s = s.replace(old, new) + open(p, "w").write(s) + +patch("include/terrain/predicates/kernel.hpp", [ +("namespace terrain::pred {\n", """namespace terrain::pred { + +// PROFILE-ONLY (serial-profile, 2026-09-27): predicate counters, not committed. +namespace prof { +inline unsigned long long orient_calls = 0, orient_exact = 0, orient_exact_zero = 0; +inline unsigned long long incircle_calls = 0, incircle_exact = 0, incircle_exact_zero = 0; +} // namespace prof +"""), +(""" if (std::fabs(det) > orient2d_bound_a * permanent) { + return orientation_of_sign(det); + } + return E::orient2d(a, b, c); + } + + // Total and precondition-free""", """ ++prof::orient_calls; + if (std::fabs(det) > orient2d_bound_a * permanent) { + return orientation_of_sign(det); + } + ++prof::orient_exact; + const auto o = E::orient2d(a, b, c); + prof::orient_exact_zero += o == Orientation::Collinear ? 1 : 0; + return o; + } + + // Total and precondition-free"""), +(""" if (std::fabs(det) > incircle_bound_a * permanent) { + return incircle_of_sign(det); + } + return E::incircle_ccw(a, b, c, d);""", """ ++prof::incircle_calls; + if (std::fabs(det) > incircle_bound_a * permanent) { + return incircle_of_sign(det); + } + ++prof::incircle_exact; + const auto r = E::incircle_ccw(a, b, c, d); + prof::incircle_exact_zero += r == Incircle::Cocircular ? 1 : 0; + return r;"""), +]) + +patch("include/terrain/mesh/lawson.hpp", [ +("namespace terrain::mesh {\n", """namespace terrain::mesh { + +// PROFILE-ONLY: when set, legalise_around appends every slot it reads (the +// popped triangle and its neighbour across the tested edge). Serial use only. +namespace prof { +inline std::vector* reads = nullptr; +} // namespace prof +"""), +(""" if (i == 3 || !detail::must_flip(m, t, (i + 1) % 3, f)) + continue;""", """ if (prof::reads) { + prof::reads->push_back(t); + if (i < 3 && m.neighbours(t)[(i + 1) % 3] != kNoNeighbour) + prof::reads->push_back(m.neighbours(t)[(i + 1) % 3]); + } + if (i == 3 || !detail::must_flip(m, t, (i + 1) % 3, f)) + continue;"""), +]) + +patch("include/terrain/refinement/scan.hpp", [ +("namespace terrain::refinement {\n", """namespace terrain::refinement { + +// PROFILE-ONLY: nodes visited by scan on this thread. +namespace prof { +inline thread_local unsigned long long scan_nodes = 0; +} // namespace prof +"""), +(""" const std::uint32_t row = span.row, c = s.first_col;""", """ const std::uint32_t row = span.row, c = s.first_col; + prof::scan_nodes += s.values.size();"""), +]) + +patch("include/terrain/refinement/refine.hpp", [ +("#include \n", "#include \n#include \n#include \n#include \n"), +(""" t0 = clock::now(); + parallel_util::for_each_chunk(active.size(), options.threads, + [&](std::size_t begin, std::size_t end) { + for (std::size_t i = begin; i < end; ++i) + results[active[i]] = scan(dem, m, active[i]); + }); + out.scan_seconds += since(t0);""", """ t0 = clock::now(); + struct ChunkRec { std::size_t begin, end; double start, stop; unsigned long long nodes; }; + std::vector chunk_recs; + std::mutex chunk_mu; + parallel_util::for_each_chunk(active.size(), options.threads, + [&](std::size_t begin, std::size_t end) { + const double c0 = since(t0); + const auto n0 = prof::scan_nodes; + for (std::size_t i = begin; i < end; ++i) + results[active[i]] = scan(dem, m, active[i]); + const double c1 = since(t0); + const std::lock_guard lock{chunk_mu}; + chunk_recs.push_back({begin, end, c0, c1, prof::scan_nodes - n0}); + }); + const double scan_round = since(t0); + out.scan_seconds += scan_round; + if (prof_out) { + std::fprintf(prof_out, "R %zu %zu %.9f %zu\\n", out.rounds, active.size(), scan_round, chunk_recs.size()); + std::sort(chunk_recs.begin(), chunk_recs.end(), [](auto& a, auto& b) { return a.begin < b.begin; }); + for (const auto& c : chunk_recs) + std::fprintf(prof_out, "C %zu %zu %.9f %.9f %llu\\n", c.begin, c.end, c.start, c.stop, c.nodes); + } + const auto pc0 = pred::prof::incircle_calls, pe0 = pred::prof::incircle_exact, + pz0 = pred::prof::incircle_exact_zero, oc0 = pred::prof::orient_calls, + oe0 = pred::prof::orient_exact; + std::size_t marked = 0, deferred_touched = 0, deferred_edge = 0; + std::vector reads, flip_writes; + if (prof_out) + mesh::prof::reads = &reads;"""), +(""" std::vector results; + std::set results; + std::set + +bench.py's child technique (pkg first on sys.path, wrap cli.refine), but the +wrapped refine is called K times with the same arguments, each timed, and the +RefineOutcome phase seconds printed per call as one JSON line (PHASES ...). +--pause S sleeps S seconds before the first call and prints the pid, so +`sample` can attach to a steady window of refine calls. +""" +import json +import os +import sys +import time + +argv = sys.argv[1:] +split = argv.index("--") +own, rasputin = argv[:split], argv[split + 1 :] +pkg = own[own.index("--pkg") + 1] +threads = int(own[own.index("--threads") + 1]) +repeat = int(own[own.index("--repeat") + 1]) +pause = float(own[own.index("--pause") + 1]) if "--pause" in own else 0.0 +sys.meta_path[:] = [f for f in sys.meta_path if "ScikitBuild" not in type(f).__name__] +sys.path.insert(0, pkg) +import tin_engine._core as core # noqa: E402 +import tin_engine.cli as cli # noqa: E402 + +assert core.__file__.startswith(pkg), core.__file__ +real = vars(cli)["refine"] + + +def refine(*args, **kwargs): + kwargs["threads"] = threads + if pause: + print(f"PID {os.getpid()}", file=sys.stderr, flush=True) + time.sleep(pause) + out = None + for i in range(repeat): + t0 = time.perf_counter() + out = real(*args, **kwargs) + wall = time.perf_counter() - t0 + rec = dict(call=i, threads=threads, refine_s=wall, legalise_s=out.legalise_seconds, + quality_s=out.quality_seconds, scan_s=out.scan_seconds, + split_s=out.split_seconds, rounds=out.rounds, inserted=out.inserted, + flips=out.flips, max_error=out.max_error, + triangles=len(out.triangles), vertices=len(out.vertices)) + rec["rest_s"] = wall - rec["legalise_s"] - rec["quality_s"] - rec["scan_s"] - rec["split_s"] + print("PHASES " + json.dumps(rec), file=sys.stderr, flush=True) + return out + + +vars(cli)["refine"] = refine +cli.app(args=rasputin, prog_name="rasputin", standalone_mode=False) diff --git a/docs/benchmarks/2026-09-27/serial-profile/scripts/summ.py b/docs/benchmarks/2026-09-27/serial-profile/scripts/summ.py new file mode 100644 index 00000000..59d54152 --- /dev/null +++ b/docs/benchmarks/2026-09-27/serial-profile/scripts/summ.py @@ -0,0 +1,15 @@ +import json, sys, statistics as st +from collections import defaultdict +d = defaultdict(list) +for line in open(sys.argv[1]): + p, js = line.split(" ", 1); r = json.loads(js); d[r["threads"]].append(r) +b = None +print("| threads | n | refine s | speed-up | scan s | scan speed-up | split s | rest s | serial share |") +print("|---|---|---|---|---|---|---|---|---|") +for t in sorted(d): + rs = d[t]; m = {k: st.median(x[k] for x in rs) for k in ("refine_s","scan_s","split_s","rest_s","legalise_s","quality_s")} + if b is None: b = m + ser = m["split_s"]+m["rest_s"]+m["legalise_s"]+m["quality_s"] + print(f"| {t} | {len(rs)} | {m['refine_s']:.3f} | {b['refine_s']/m['refine_s']:.2f}x | {m['scan_s']:.3f} | {b['scan_s']/m['scan_s']:.2f}x | {m['split_s']:.3f} | {m['rest_s']:.3f} | {ser/m['refine_s']*100:.0f} % |") +assert len({(r['inserted'], r['flips'], r['triangles']) for rs in d.values() for r in rs}) == 1, "output differs" +print("identical counts across all samples:", {(r['inserted'], r['flips'], r['triangles'], r['rounds']) for rs in d.values() for r in rs}) diff --git a/docs/benchmarks/2026-09-27/serial-profile/scripts/sweep.sh b/docs/benchmarks/2026-09-27/serial-profile/scripts/sweep.sh new file mode 100755 index 00000000..52cf0067 --- /dev/null +++ b/docs/benchmarks/2026-09-27/serial-profile/scripts/sweep.sh @@ -0,0 +1,16 @@ +#!/bin/zsh +# sweep.sh PKG OUT [domain-args...]: phase timings per thread count, +# 3 interleaved passes x 5 calls per process. +R=/Users/skavhaug/projects/rasputin +S=/private/tmp/claude-501/-Users-skavhaug-projects-rasputin/38487caf-f56e-46a3-b05b-867af1fb1619/scratchpad +PKG=$1; OUT=$2; shift 2 +pmset -g batt > $OUT.pmset_before +: > $OUT +for pass in 1 2 3; do + for t in 1 2 3 4 5 6 7 8 10 12 16 20; do + $R/.venv/bin/python $S/prof_driver.py --pkg $PKG --threads $t --repeat 5 -- mesh \ + --dem $R/tests/fixtures/dem_archive/7908_3_10m_z33.tif --tolerance 1 "$@" \ + --out $S/sweep.vtk --binary 2>&1 | grep PHASES | sed "s/^PHASES /$pass /" >> $OUT + done +done +pmset -g batt > $OUT.pmset_after From 5e721cb70a70c141b2cfc59867a4580d4db9cd6c Mon Sep 17 00:00:00 2001 From: Ola Skavhaug Date: Sun, 27 Sep 2026 10:41:29 +0200 Subject: [PATCH 2/7] Serial phase profiled: ROADMAP row and perf.md's 'about half' corrected to the measured third Co-Authored-By: Claude Opus 5.5 --- .claude/agents/perf.md | 8 +++++--- ROADMAP.md | 2 +- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/.claude/agents/perf.md b/.claude/agents/perf.md index 74df0a28..9c71e5b7 100644 --- a/.claude/agents/perf.md +++ b/.claude/agents/perf.md @@ -23,9 +23,11 @@ it is never unmeasured again. You report measured figures only. `docs/benchmarks/bench-py.md`. It is code under `tools/`, so a change to it follows the TDD loop: a failing test in `tests/python/test_bench.py` first, from `@tester`. -* **The serial-phase profile.** About half of single-thread refine time does not - parallelise, and the serial insert and flip phase is the suspected cause. It - has not been profiled. Profile it before anyone designs a fix for it. +* **The serial-phase profile.** Profiled on 2026-09-27 + (`docs/benchmarks/2026-09-27/serial-profile/README.md`): the serial part is + about a third of single-thread refine, mostly Lawson legalisation, and the + scan itself stops speeding up near 5× from load imbalance. Re-profile before + a design relies on those figures after refine changes. * **The scaling ceiling.** Refine speeds up at most about 2.2× from 1 to 20 threads, flat from about 7, on AC as on battery (`docs/benchmarks/2026-09-26/README.md`). Report each increment's ceiling diff --git a/ROADMAP.md b/ROADMAP.md index 86957f4a..ebfccfec 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -42,7 +42,7 @@ increment that most needs a picture to check against | 20 | Quality start: before DEM refinement, Steiner points at the DEM node nearest each bad triangle's circumcentre until the start mesh has a 25° minimum angle (`--start-min-angle`, 0 is off); geometry only, input segments not split, serial and deterministic. Removes increment 16's boundary fans | landed with 20b as interim (C1-C3 open, to 20c; C4 -> 20b) | `docs/increments/20-start-quality.md` | | 20b | Minimum insertion distance from constraints: when refinement's worst node lies within ε = clamp(tol / slope, cell/100, cell/2) of a constraint segment, insert the foot on the segment (off-node, bilinear z) instead; a footed node still above tolerance is inserted after all, so the tolerance guarantee is unchanged. Removes the 0.0117° needle at 1 m (increment 20's C4) | shipped with 20 (#97) | `docs/increments/20b-min-insertion-distance.md` | | — | `tools/bench.py`: the 1 m benchmark and the thread-scaling sweep from one checked-in command, with power state, quality and commit recorded per run; the one-off scripts in `docs/benchmarks/2026-09-26/` are its specification. Rule 2's acceptance run needs it | shipped with branch `tools-bench`'s PR | `docs/benchmarks/bench-py.md` | -| — | The serial phase: profile refine's serial insert-and-flip phase, then parallelise what the profile blames. Scaling tops out at about 2.2× from 1 to 20 threads | next (Ola, 2026-09-27: order bench.py, serial phase, 20c); `tools/bench.py`'s runs are its baseline | `docs/benchmarks/2026-09-26/README.md` | +| — | The serial phase: profile refine's serial insert-and-flip phase, then parallelise what the profile blames. Scaling tops out at about 2.0-2.2×. Profiled 2026-09-27: serial part about a third of 1-thread refine, mostly Lawson legalisation; the scan stops near 5× from load imbalance | profiled; the fix is to design (`@architect`), after Ola rules on the determinism contract | `docs/benchmarks/2026-09-27/serial-profile/README.md` | | 16b | Interior polygons and polylines as constraints ("terrain polygons": lakes, land cover, roads, rivers): `--features PATH`, a GeoJSON `FeatureCollection`, each feature naming a vocabulary property; closed or open `Breakline`s, crossings noded, off-node vertices with bilinear z. **Its working example is real data** (Ola, 2026-09-27): CORINE Land Cover 2018 over the benchmark tile `7908_3_10m_z33.tif`. The source is Ola's local copy, `rasputin_data/corine_sql/.../U2018_CLC2018_V2020_20u1.gpkg` (8.2 GB, EPSG:3035, a sibling of this repository, which also holds the 254-tile DTM10 archive for gap 6). It reads without GDAL: sqlite3 over its R-tree, the GeoPackage blob header stripped, `shapely.wkb`, then `pyproj` to 25833, so CRS stops in Python as before. Probed 2026-09-27 in 0.2 s: 60 polygons in 8 classes (heath, bare rock, sparse vegetation, bogs, intertidal flats, water, sea, urban), 11 068 vertices clipped to the tile, median segment 54 m against 10 m cells. The EEA's public ArcGIS service (`image.discomap.eea.europa.eu`, `Corine/CLC2018_WM`) returns the same 11 068 clipped vertices and is the route for anyone without the file. What it forces on 16b's design: neighbouring polygons share their boundaries, so each shared edge arrives twice; the polygons run past the domain and must be clipped; the extract is committed as a fixture with the Copernicus attribution. Placed before 20c because 20c may split constraint segments and should be designed and measured on inputs that have interior ones | designed in 16's R6, no increment file yet; after the serial phase, before 20c | `docs/increments/16-domain-polygon.md` (R6) | | 20c | Soft quality criterion: a penalty that each Steiner node or constraint split must pay for in angle gained, instead of 20's hard 25°; applied at the start and during DEM refinement; may split constraint segments when that improves the mesh. Ola's rulings on 20's C1-C3 | to design after 16b (`@architect` measures cost against 20 first) | `docs/increments/20-start-quality.md` (Ola's rulings) | | — | Auto-catchment: the watershed upstream of a coordinate, computed from the DEM and handed to `--domain`, so a catchment no longer has to be supplied as a file (Ola, 2026-09-27: "not far into the future"). The textbook route is depression handling (Priority-Flood, Barnes, Lehman and Mulla 2014), D8 flow directions (O'Callaghan and Mark 1984) and accumulation, the pour point snapped to the strongest flow nearby, the upstream cells traced and their outline turned into a polygon; the literature check is `@architect`'s. Open for its design: whether it runs in the C++ core (a 10 m tile is 25 M cells); how a stair-stepped cell outline becomes a domain polygon, which meets input coarsening; and that a real catchment crosses tile edges, so it needs gap 6 (a DEM in several tiles) first. Legacy has nothing on it (`grep -rliE "watershed|flow.?acc|flow.?dir|pour.?point|catchment" legacy` returns no files) | to design; after gap 6, which it needs; placed after 20c, can move ahead of it on Ola's word | none yet | From 7495fb6df242df9640f761c37868dcb088ba6312 Mon Sep 17 00:00:00 2001 From: Ola Skavhaug Date: Sun, 27 Sep 2026 11:24:39 +0200 Subject: [PATCH 3/7] Increment 21: design for parallel refine (prior art, rulings needed, options) Design only, no code or tests. Records Ola's 2026-09-27 ruling verbatim and what it leaves open (thread-count independence, one path or a size switch). - Prior art: legacy grep (nothing), literature from recall only, flagged for checking; no novelty claimed; the searches to run are listed. - Quick wins, all bit-identical: dynamic scan scheduling, an int64 incircle for all-node quads under an exact-frame condition, merge instead of sort for `active`; the tie classification to measure first. - Determinism levels L0-L3; recommends L1. - Serial-phase options: deterministic reservations, block colouring, batch insert plus parallel Lawson, DD (deferred to the mosaic work). - @perf's six questions answered or placed; 21c measurements specified. - LOC per increment 21a-21d and invariant-critical suites; five questions for Ola. Co-Authored-By: Claude Opus 5.5 --- docs/increments/21-parallel-refine.md | 792 ++++++++++++++++++++++++++ 1 file changed, 792 insertions(+) create mode 100644 docs/increments/21-parallel-refine.md diff --git a/docs/increments/21-parallel-refine.md b/docs/increments/21-parallel-refine.md new file mode 100644 index 00000000..5fbb4b03 --- /dev/null +++ b/docs/increments/21-parallel-refine.md @@ -0,0 +1,792 @@ +# Increment 21 — parallel refine: quick wins, then the serial phase + +Status: **design only, waiting on Ola** (section 8). Written by `@architect` +on 2026-09-27, on branch `serial-profile`, per `docs/increments/README.md` +step 1. No code and no tests exist for it. This file proposes a sequence of +small increments (21a to 21d, section 7); each gets its own Rulings and Tests +sections when Ola has answered section 8 and the measurements in section 6 +are in. + +**Closes, when all of it lands.** The ROADMAP row "The serial phase": refine +tops out at about 2.0x from 1 to 20 threads. **Not closed:** the scan's own +ceiling near 5x beyond what chunking recovers, E-core scheduling, and very +large areas that do not fit in memory (the virtual mosaic, increment 15 +refreshed, `18-row-span-scan.md` R6). + +**Non-negotiable, whatever Ola rules on determinism.** Every option below +keeps: + +- the sup-norm tolerance as a property of the delivered mesh: every triangle + is scanned in its final form and is within tolerance + (`14b-delaunay-insertion.md` R4, stop condition); +- constrained Delaunay output in the lattice frame, constraint edges never + flipped (14b R3, R5), with a Delaunay oracle on the output (14b R10); +- termination for every tolerance, 0 included (14 R3, 14b R4); +- the I/O boundary and the no-CGAL/no-GDAL mandates (`CLAUDE.md` §2). + +## Ola's rulings this design is built on + +Recorded verbatim, not paraphrased. + +- 2026-09-27, before the profile: some serial parts "could be parallelised by + multicolouring/DD techniques, but let's wait for the analysis before we get + ahead of ourselves." +- 2026-09-27, after the profile, on the determinism contract: **"I think that + when we are encountering geometries where this is important, ie very large + areas, we should not rely on bit-identical outputs."** + +**What the second ruling settles and what it does not.** It clearly allows +output that differs from today's mesh, which is fixed by triangle-index +order (`14-adaptive-refinement.md` R5, T6). It does **not** say whether the +output may then vary with the thread count, or from run to run. It also +leaves open whether "when we are encountering geometries where this is +important" means a switch (today's path for small inputs, a parallel path +for large ones) or one path for everything. Section 4 lays out the levels; +questions Q1 and Q2 in section 8 ask Ola to choose. + +## 1. Prior art: legacy and literature + +### Legacy + +```sh +$ grep -rliE 'std::thread|pthread|parallel|concurren|openmp|pragma omp|tbb|subdomain|independent.?set|multiprocessing|ThreadPool' legacy/ +legacy/rasputin/reader.py +``` + +The only hit is a false positive: `legacy/rasputin/reader.py:63-64` are the +GeoTIFF key names `ProjStdParallel1GeoKey` and `ProjStdParallel2GeoKey`. +The legacy tree called CGAL's `Delaunay_triangulation_2` and +`Constrained_Delaunay_triangulation_2` whole (14b, "Prior art in `legacy/`") +and ran nothing in parallel. **Nothing is carried across.** +`@migration-expert` is not needed. + +### Literature: what was searched + +**No literature database or web search was available in this session.** The +list below is from the architect's recall and from the citations already in +this repository (`docs/research/data-dependent-triangulation.md`, +`14b-delaunay-insertion.md` R7, `parallel_refinement.md`). Titles, venues and +years are given as recalled; **each must be checked against the paper before +it is used in a publication**, as `docs/research/data-dependent-triangulation.md` +already requires for its own list. Where the content of a paper is not +recalled with confidence, this file says so rather than quoting it. + +**No novelty is claimed in this file.** Section 1's last subsection lists the +searches to run before any claim. + +### The method we build on: greedy insertion on a height field + +- **De Floriani, Falcidieno and Pienovi, "Delaunay-based representation of + surfaces defined over arbitrarily shaped domains", Computer Vision, + Graphics and Image Processing 32 (1985).** Greedy insertion of the + worst-fitting data point into a Delaunay triangulation until an error + bound holds. Recalled as the origin of error-driven Delaunay refinement of + terrain; to be checked. +- **Garland and Heckbert, "Fast polygonal approximation of terrains and + height fields", CMU-CS-95-181 (1995).** Greedy insertion: one point at a + time, the globally worst, into a Delaunay triangulation with Lawson flips, + with each triangle's candidate (its worst point) recomputed only for + triangles that changed, and a heap over triangles. That is what increments + 14, 14b and 18 rebuilt + (`docs/retrospectives/2026-09-27-increments-14-to-20b.md`). +- **How we differ from Garland and Heckbert, today.** Our round inserts one + point *per unconverged triangle*, not the single global worst, in + triangle-index order, and skips a triangle whose slot an earlier insertion + of the same round rewrote (14 R5, 14b R2). That is a batched greedy, not + strict greedy. Whether the report discusses inserting several points per + pass has to be read in the report and is not quoted here. What the batching + costs in triangles against strict greedy has not been measured. It matters + here because every option in section 5 changes the batch. + +### Parallel Delaunay insertion and refinement with determinism + +- **Blelloch, Fineman, Gibbons and Shun, "Internally deterministic parallel + algorithms can be fast", PPoPP 2012.** Deterministic reservations: each + round, every pending item reserves the locations it will touch with a + priority-min write; an item holding all its reservations commits; losers + retry. The result depends only on the priorities, not on the thread count. + Delaunay triangulation and Delaunay refinement are among its benchmarks (the + PBBS suite). Already cited as the upgrade path in 14b R7. + **Difference from us:** their refinement inserts circumcentres to fix bad + angles, with no data; ours inserts DEM nodes chosen by a scan, with a + tolerance guarantee checked by rescans, and on constraints. +- **Blelloch, Gu, Shun and Sun, "Parallelism in randomized incremental + algorithms", SPAA 2016; J. ACM 67(5), 2020.** Shows that incremental + Delaunay triangulation in a *random* insertion order has shallow dependence + depth (recalled as O(log n) with high probability), and that the parallel + version gives exactly the sequential result for that order. **What it tells + us:** priority order matters. A random-like priority (for example a hash of + the inserted node) gives short dependence chains; a spatially correlated + order such as our triangle indices may not. Section 6, question 2, asks for + that depth to be measured. +- **Nguyen, Lenharth and Pingali, "Deterministic Galois: on-demand, portable + and parameterless", ASPLOS 2014.** Deterministic scheduling of irregular + programs, Delaunay mesh refinement among them, with output independent of + the thread count. Same level as Blelloch et al.; a runtime rather than a + per-algorithm design. +- **Kulkarni, Pingali, Walter, Ramanarayanan, Bala and Chew, "Optimistic + parallelism requires abstractions", PLDI 2007.** Galois. Delaunay mesh + refinement is the motivating example: speculative cavity insertion with + conflict detection and rollback. Nondeterministic. + +### Parallel Delaunay refinement by geometric scheduling and decomposition + +- **Chernikov and Chrisochoides, "Practical and efficient point insertion + scheduling method for parallel guaranteed quality Delaunay refinement", + ICS 2004.** Points whose insertion regions are far enough apart are + independent; a uniform grid or quadtree of cells is coloured so that cells + of one colour can be refined concurrently. This is the multicolouring Ola + named. **Difference:** their independence distance comes from the quality + bound of Ruppert/Chew refinement (circumradius bounds). Our insertions have + no such bound: a footprint's extent is data-dependent, so independence has + to be checked, not derived (section 5, option B). +- **Chernikov and Chrisochoides, "Generalized Delaunay mesh refinement: from + scalar to parallel", IMR 2006**, and **"Three-dimensional Delaunay + refinement for multi-core processors", ICS 2008.** Later work in the same + line. Recalled, not reread. +- **Spielman, Teng and Üngör, "Parallel Delaunay refinement: algorithms and + analyses", IJCGA 17(1), 2007 (IMR 2002).** Parallel Ruppert-style + refinement in rounds of independent insertions, with a polylogarithmic + round bound. Same difference as above: the independence argument rests on + the quality criterion. +- **Linardakis and Chrisochoides, "Delaunay decoupling method for parallel + guaranteed quality planar mesh refinement", SIAM J. Sci. Comput. 27(4), + 2006.** Domain decomposition: separators are pre-refined so that + subdomains refine with no communication, and the union is still Delaunay. + **Difference:** decoupling relies on knowing ahead how fine the separator + must be, from the quality criterion and a sizing function. Our refinement + is driven by DEM error, which is only known by scanning. +- **Galtier and George, "Prepartitioning as a way to mesh subdomains in + parallel", IMR 1996.** Partition first, then mesh each part; interfaces + fixed in advance. +- **Chrisochoides, "A survey of parallel mesh generation methods", in + Numerical Solution of PDEs on Parallel Computers, LNCSE 51, Springer + (2006).** The survey to read first; recalled as classifying methods into + tightly coupled (concurrent insertion with synchronisation), partially + coupled and decoupled (DD). +- **Antonopoulos, Blagojevic, Chernikov, Chrisochoides and Nikolopoulos, + "Multigrain parallel Delaunay mesh generation: challenges and opportunities + for multithreaded architectures", ICS 2005.** Fine-grained concurrent point + insertion within a subdomain. Recalled as finding that the finest grain + pays only with cheap synchronisation; to be checked, because it bears + directly on our density (section 2). + +### Parallel Lawson flipping + +- **Qi, Cao and Tan, "Computing 2D constrained Delaunay triangulation using + the GPU", I3D 2012 (IEEE TVCG 19(5), 2013).** Recalled as: insert points in + parallel, at most one per triangle per round, then restore the (constrained) + Delaunay property by rounds of parallel flips on edges that do not share a + triangle. **This is structurally close to our round**, which already takes + one point per triangle. The difference: we legalise after each insertion, + serially, and skip triangles an earlier insertion rewrote; they insert the + whole batch, then flip. Section 5, option C. +- **Navarro, Hitschfeld-Kahler and Mateu, "A parallel GPU-based algorithm for + Delaunay edge-flips", EuroCG 2011.** Parallel flipping of a whole + triangulation to Delaunay with conflict resolution between edges that share + a triangle. +- **Lawson, "Software for C1 surface interpolation", in Mathematical + Software III (1977).** The flip algorithm and its convergence: any sequence + of flips of locally non-Delaunay edges terminates at the Delaunay + triangulation, because each flip lowers the lifted surface. That argument + does not depend on flip order, which is what makes parallel flipping + terminate (14b R4, part 1). + +### Parallel Delaunay with locks (nondeterministic) + +- **Kohout, Kolingerová and Žára, "Parallel Delaunay triangulation in E2 and + E3 for computers with shared memory", Parallel Computing 31 (2005).** +- **Batista, Millman, Pion and Singler, "Parallel geometric algorithms for + multi-core computers", CGTA 43(8), 2010.** The CGAL parallel triangulation, + with per-vertex locks. CGAL itself is prohibited here; the method is only + a reference point. + +### Parallel greedy insertion on terrain + +**Not found from recall.** No paper on parallel greedy (error-driven) +insertion for height fields is known to the architect, and none is cited in +this repository. This is exactly the gap a novelty claim would sit in, so it +is not filled by guessing. + +### Searches to run before any novelty claim + +A claim is not made until these are run in a real database (Google Scholar, +ACM DL, IEEE Xplore, Scopus) and the results recorded here: + +- "parallel greedy insertion terrain", "parallel TIN generation DEM", + "parallel height field approximation", "GPU terrain triangulation error"; +- "deterministic parallel Delaunay refinement", "thread-count independent + mesh generation"; +- "parallel Delaunay refinement terrain", "sup-norm" or "L-infinity" with + "TIN" and "parallel"; +- forward citations of Garland and Heckbert 1995 and of Blelloch et al. 2012 + that mention terrain or height fields; +- venues: IMR, SoCG, SPAA, PPoPP, SIGSPATIAL, IJGIS, Computers & Geosciences. + +The candidate that might be ours, per the retrospective: a deterministic, +thread-count-independent parallel greedy refinement to an exact sup-norm +tolerance on a DEM lattice, with constraints, whose output is constrained +Delaunay. Blelloch et al. 2012 already makes deterministic parallel Delaunay +refinement not new in itself; only the combination could be, and that is +unchecked. + +## 2. What the profile says + +The evidence is `docs/benchmarks/2026-09-27/serial-profile/README.md` (commit +`ec1f7b0`, measured at `d6d6beb`, battery, the 1 m benchmark on the quarter +circle). It is not restated here. The design depends on these figures, and +on nothing else from it: + +| figure | value | used for | +|---|---|---| +| serial part of 1-thread refine | 34 % (0.159 of 0.462 s) | the Amdahl ceiling, 2.9x | +| split phase at 1 / 8 threads | 0.127 / 0.137 s | what options A-C must parallelise | +| exact incircle fallback | 5.0 % of refine; 9.1 % of incircle tests, all Cocircular | quick win 2 | +| `active` rebuild (collect, sort, unique) | 3.6 % | quick win 3 | +| scan imbalance at 8 threads | 16.5 of 61.8 ms | quick win 1 | +| thread start per round | about 90 µs, 3.8 ms over 41 rounds | why options A-C need a thread team, not a spawn per step | +| insertions per round | 77 % in rounds 9-19, 9,000-18,700 each | parallel slack per round | +| median distance to the nearest same-round insertion, round 11 on | about 3 nodes | independence at the finest grain is rare | +| footprint (slots read or written) | mean 11.0, p99 18, max 36 | the size of a reservation | +| write set | mean 5.5, p99 9 | slots appended and rewritten | +| footprint conflict degree, big rounds | mean 4.7-7.7 | expected winners per sub-round | +| marks deferred because their slot was rewritten | 51 % | the batch semantics every option must match or change on purpose | + +Two caveats carried from the evidence. The footprints were measured in the +serial order, on the mesh as earlier insertions left it, so they are not +exactly the footprints a parallel schedule would see. And the profile was +taken at one thread; the split phase is about 8 % slower after a +multi-threaded scan, cause not measured. + +## 3. Quick wins that need no new algorithm + +All four keep the output **bit-identical to today** at every thread count, so +none needs Ola's determinism ruling. Expected gains are arithmetic on the +profile's figures, not measurements. + +### QW1. Work-balanced scan scheduling + +- **What.** `for_each_chunk` splits `active` into equal counts + (`include/terrain/parallel_util/chunks.hpp`). Replace that, for the scan, + with dynamic scheduling: workers take blocks of `active` from a shared + atomic counter until it runs out. Block size about `n / (16 * threads)`, + at least 1. Rounds with few active triangles (the profile's rounds 30-41 + scan fewer than 1,200 each, mostly spawn cost) run inline below a + threshold to be set from the sweep. +- **Why dynamic and not cost-weighted static chunks.** A static weight (node + count from each triangle's integer area) needs a serial or prefix-sum pass + per round, and it cannot see the measured causes that are not work: the + per-worker slowdown, the E cores, and the late start above 10 threads. + Dynamic scheduling absorbs all three. +- **Determinism.** Unchanged. The scan is pure and writes one result slot per + triangle (14 R7, 18 R4), so which thread scans which triangle cannot change + a result. The atomic is a work counter only. This amends 14 R7's "no + atomics" in wording, not in substance: R7's point is no shared *result* + writes, which still holds. TSan sees a correctly synchronised atomic. +- **Expected gain.** Up to the 16.5 ms imbalance at 8 threads, less one + block's work per thread. Scan roughly 62 -> 47 ms; refine at 8 threads + roughly 0.229 -> 0.215 s (-6 %). Nothing at 1 thread. +- **Its own small increment:** yes, with QW3 (21a). + +### QW2. An integer incircle for quads whose four corners are DEM nodes + +- **What the profile shows.** 146,962 incircle tests took the exact path, and + all 146,962 returned Cocircular. The filter cannot certify a determinant + that is exactly zero, so every exact tie goes to the adaptive path. That + costs 5.0 % of refine and 38 % of flip-test time. +- **The inference to check first.** That these ties are cocircular lattice + quads (for example a grid rectangle's four corners) is inferred, not + measured (profile README, "What is measured and what is inferred"). + **Measurement, before 21b is designed in detail** (`@perf`, the existing + instrumentation patch, `scripts/instrument.patch`): at every exact-path + incircle call in `must_flip`, record + 1. whether all four vertices are nodes (`MeshVertex::is_node`); + 2. the int64 lattice determinant of the four (below), which should be 0; + 3. the shape: axis-aligned rectangle (two distinct rows and two distinct + columns), or another cocircular lattice quad. + + Also count the filtered-path calls whose four corners are all nodes, since + the integer path would take those too. Run on the quarter circle at 1 m and + on the full tile without a domain. The quarter circle has off-node arc + vertices (`16-domain-polygon.md` R2), and 20b's feet are off-node, so the + all-node share is not 100 % by construction. The gain scales with it. +- **The design.** A pure function in `mesh/`, beside `lawson.hpp`: + `lattice_incircle(a, b, c, d) -> std::optional`, called at the + top of `must_flip`. It answers only when + - all four vertices are nodes; + - `dx == dy`, so the frame is the lattice times one positive constant, and + the sign of the scaled determinant is the sign of the lattice one; + - every coordinate difference from `d` is at most 2^14 nodes. The + determinant is then at most 12 · 2^56 < 2^63, and exact in `int64`; + - **the frame is exact**: `col * dx` and `row * dy` are exactly + representable for every node of the grid. Sufficient: the significant bits + of `dx` plus `bit_width(max(rows, cols) - 1)` are at most 53. For the + benchmark's `dx = 10` (3 significant bits, 13 for 5051) that holds with + room to spare. It is decided once per refine call. + + Otherwise it returns `nullopt` and today's `FilteredKernel` + path runs. The mesh triangle `a, b, c` is counter-clockwise in integers + (`LatticeMesh` invariant), and under an exact frame it is so in the frame + too, so the integer path also skips `must_flip`'s frame `orient2d`. +- **Determinism.** Under the four conditions, `DetriaExact` on the frame + doubles computes the sign of the same exact number, so every flip decision + is the same and the output is bit-identical. The exact-frame condition is + what makes that true; without it (say `dx = 0.1`) the integer answer is the + *true* lattice answer and the rounded frame's answer can differ on a tie. + That would still terminate (an integer-strict Inside has a margin far above + the rounding, so it is also Inside on the rounded points, and every flip + still lowers the rounded lifted surface), but it would change output, so it + is excluded. +- **Expected gain.** Most of the 5.0 %, plus part of the 2.7 % filtered cost + for all-node quads, less the integer determinant's own cost. Roughly + 0.018 s at every thread count: -4 % at 1 thread, -8 % at 8. +- **Its own small increment:** yes (21b). It adds a predicate path, so its + suite is invariant-critical (section 7). + +### QW3. Rebuild `active` by merging, not sorting + +- **What.** `refine.hpp` rebuilds `active` each round by collecting touched + slots, appending `skipped`, then `std::sort` and `std::unique`. Both inputs + are already sorted: touched slots are collected by an ascending loop over + slots, and `skipped` is filled while iterating the sorted `active`. So a + linear `std::merge` plus `std::unique` gives the same vector. `unique` is + still needed: a skipped triangle can be touched later in the same round. +- **Determinism.** Same vector, so bit-identical. +- **Expected gain.** Most of 3.6 %: about 0.014 s at every thread count. +- **With QW1 in 21a.** + +### QW4 (conditional). Do not rescan a skipped triangle whose slot is still unwritten + +- **What.** A mark skipped because its edge neighbour was touched is itself + unchanged, and if nothing writes its slot later in the round, its stored + result is still exact (14b R2's invariant). Today it is rescanned anyway. + It can go to the next round's marks without a scan. +- **Determinism.** The scan is pure, so a rescan of an unwritten slot + returns the same result. Bit-identical. +- **Gain: unknown.** It saves the node visits of those triangles only (edge + deferrals are 7 % of mark occurrences). **Measurement:** in the + instrumented build, split each round's scanned nodes into slots written in + the previous round and slots skipped-and-unwritten. Build it only if the + second share is worth a few percent of the scan. + +### What the quick wins add up to + +Arithmetic, not measurement: 1-thread refine 0.462 -> about 0.43 s; 8 +threads 0.229 -> about 0.18 s, which is about 2.4x over the new 1-thread +time. The serial part is then still about three quarters of the 8-thread +time, so the ceiling moves only a little. The quick wins are worth doing +first because they are cheap and bit-identical, and because every option in +section 5 is measured against the mesh they leave. + +A smaller item folds into 21a: `legalise_around` allocates its stack per call +(0.7 % of refine); a caller-owned buffer removes it. + +## 4. Determinism levels + +Today's contract (14 R5, 14b R1, tested by 14's T6 and 18's T3 golden +digests) is the strongest level. Ola's ruling allows leaving it; how far is +the question. + +| level | what holds | what it buys | what it costs | +|---|---|---|---| +| **L0** bit-identical to today | same mesh as the serial triangle-index order, any thread count | every golden digest and T6 stay as they are | the parallel schedule must reproduce today's greedy order, including which marks are skipped and how appended slots and vertices are numbered (section 5, option A0). Expensive, and its parallelism depends on a dependence depth nobody has measured | +| **L1** deterministic, thread-count-independent, new order | same mesh for 1, 2, 7 or 20 threads, and on every run; different from today's | T6 keeps its meaning. A bug seen on one machine replays on another. A benchmark mesh can be hashed and cited, which the publication option needs. Golden digests re-recorded once | the order must come from the data (priorities, a fixed block grid), never from the thread count. Some bookkeeping to number new slots deterministically | +| **L2** deterministic per thread count | same mesh for the same `threads`; a different mesh for a different one | nothing over L1 for the options below; it would matter only for a DD with one subdomain per thread | the output depends on the machine. Reproducing a user's mesh needs their thread count, which the CLI does not expose (14, "Not in scope") and the output would then have to record. T6 weakens to "same threads, same mesh" | +| **L3** nondeterministic | tolerance and CDT only; the mesh varies run to run | the lock-based designs (Kohout et al.; Galois) become available | failures do not replay. Tests can only be property tests. Cocircular ties (9 % of incircle tests are exact ties) then resolve differently each run, so two runs differ even with no bug. TSan becomes the only race evidence | + +**Recommendation: L1.** Every option recommended in section 5 reaches L1 +at no extra cost over L2, because the schedule is keyed to the data (a hash +of the inserted node, or a fixed block grid in DEM nodes), not to the thread +count. L2 buys nothing those options need. L3 gives up replayable failures for +a speed-up no measurement says we need. L0 is possible in principle but costs +the most and promises the least (option A0). + +**One path, not a size switch.** One reading of the ruling is "keep today's +path for small inputs, a parallel path for very large ones". That keeps two +production refinement paths, which 18's C4 rejected for the scan on the same +grounds: two things to test, and a threshold to tune. Under L1 there is no +need: the 1-thread run of the parallel algorithm is itself deterministic. The +cost is that **every** mesh changes once, small ones included. Question Q2. + +## 5. Options for the serial phase + +Each option is judged against the measured density: insertions about 3 nodes +apart from round 11 on, each conflicting with 4.7-7.7 others in the big +rounds, footprints of about 11 slots (p99 18), 9,000-18,700 insertions in a +big round, 51 % of marks deferred by the serial loop. + +The ceilings below are arithmetic on the profile, after the quick wins +(1-thread refine about 0.43 s; scan about 47 ms at 8 threads; split +0.109 s at 1 thread, about 0.117 s at 8; rest about 0.015 s). They assume +the named parallel efficiency for the split phase and are not measurements. + +### What any option must get right + +- **Slot and vertex numbering.** `LatticeMesh` appends triangles and vertices + with `push_back` in the order insertions happen (`lattice_mesh.hpp`, + `next_slot`, `add_vertex`). In parallel, appended indices must come from a + prefix sum over the committed insertions in priority order, with the + vectors sized before the commit step. Otherwise the numbering, and so the + next round's order and the output, depend on thread timing. +- **The ring.** A split or flip rewrites the back-pointer in each outer + neighbour (`repoint`). Those slots are written, so they belong to the + footprint and must be reserved or owned. +- **The skip rule.** Today a mark whose slot was rewritten earlier in the + round is skipped and rescanned next round (51 % of marks). An option either + keeps that semantics under a new order, or changes the batch on purpose and + measures what it costs in triangles. 14b's C2 measured that less greedy + choices cost 6-27 % more triangles, so this is not a detail. +- **Constraint feet (20b).** The `footed` set is keyed by node. A node on a + shared edge can be the worst node of both triangles; the edge split + reserves both, so slot conflicts already serialise the two. No new rule, but + the suite must cover it. +- **Thread cost.** At about 90 µs per `for_each_chunk` spawn, any option with + more than a handful of synchronisation steps per round needs a thread team: + threads started once per `refine` call, synchronised by `std::barrier`, + joined at the end of the call. That keeps 14 R7's rule that no state + outlives a call; it is not a pool. + +### Option A. Deterministic reservations (Blelloch et al. 2012) + +Per round, after the scan, the marks go through sub-rounds: + +1. **Footprint, read-only, in parallel.** Each pending mark computes the + slots its insertion will read or write: the split triangle (and the edge + neighbour for an edge split), the cavity (triangles reached across + unconstrained edges for which `must_flip`'s test holds), and the ring. +2. **Reserve.** Each slot takes the minimum priority of the marks that want + it. No atomics are needed: emit `(slot, priority)` pairs per chunk and + reduce by slot; or use an atomic fetch-min, whose result is the same + whatever the timing. +3. **Commit, in parallel.** A mark holding every slot it asked for commits. + Slot numbers for its appended triangles and vertex come from a prefix sum + over committers in priority order. Commits touch disjoint slots. +4. **Skip or retry.** A mark whose own slot was written by a commit is skipped + and rescanned next round, as today. The rest retry. + +- **A0, priority = triangle index (L0).** Reproducing today exactly also + needs a mark to wait until every lower-index mark whose footprint overlaps + it has resolved, and slots renumbered at the end of the round into today's + order. Its parallelism is the dependence depth of the index order within a + round. Indices are spatially correlated (start slots in grid order, + appended slots at the end), so chains may be long. **Not recommended** + unless the depth measurement (section 6, question 2) comes back short. +- **A1, priority = a hash of the inserted node's `(row, col)` (L1).** The + order is random-like, so dependence is shallow (Blelloch, Gu, Shun and Sun). + The skip rule is kept, with "earlier" meaning lower priority, so the batch + per round should stay close to today's 42 % of marks. Mesh quality should + then be close to today's; that is to be measured, not assumed. +- **Expected parallelism.** With conflict degree d, a mark wins its first + sub-round with probability about 1/(d+1) under random priorities: 11-18 % + of 9,000-18,700 marks, that is 1,000-3,400 disjoint commits in the first + sub-round of a big round, shrinking after. That is ample for 8-16 threads; + the grain is fine but not too fine. The limit is synchronisation per + sub-round (two barriers), which a thread team keeps to microseconds. +- **The double-work problem.** Step 1 evaluates the same incircle tests that + Lawson would evaluate again at commit. The flip test is 13.2 % of refine. + The fix is to commit from the computed cavity directly (Bowyer-Watson + style: remove the cavity, fan from the new vertex, fix the ring), so each + test runs once. That makes the commit a new routine. `legalise_around` then + becomes its **oracle**: on the same mesh and point, the cavity insert and + split-then-Lawson must give the same triangulation. That equality is + expected (both remove exactly the triangles whose circle strictly contains + the point and that are reachable across unconstrained edges, and neither + acts on a cocircular tie), but it is a claim to test, not to assume, + including under `must_flip`'s frame-orientation branch (`lawson.hpp`). +- **Rough ceiling at 8 threads**, split phase at 50-70 % parallel efficiency: + scan 0.047 + split 0.021-0.029 + rest 0.015 + barriers about 0.005 = + about 0.09-0.10 s, that is 4.3-4.8x over 1 thread and about 2.3-2.5x + faster than today's 8-thread time. The scan's own 5x then limits. +- **Complexity:** high. Footprint walk, reservation, cavity commit with + constraints and edge splits, prefix-sum numbering, thread team. Probably two + PRs. +- **Level:** L1 (A1), or L0 (A0) at a higher cost. + +### Option B. Geometric multicolouring (Chernikov and Chrisochoides 2004) + +Ola's "multicolouring". Cut the lattice into fixed B x B-node blocks and +colour them in a 2 x 2 pattern, so blocks of one colour are at least B nodes +apart. Each round runs four colour phases. In a phase, blocks of that colour +are processed in parallel, each block's marks serially in index order, with +today's `split` plus `legalise_around`. + +- **Independence is not guaranteed; it must be checked.** Chernikov and + Chrisochoides derive a safe distance from the quality bound. Ours has none: + a footprint's extent depends on the data, and early rounds work on start + triangles up to 40 nodes across (stride 40, 14b C1), larger in flat sea. + So each insertion needs its footprint computed first (as in option A, step + 1) and must be deferred if it leaves its block's halo. Deferred marks go to + a serial tail after the four phases, or to the next round. +- **Against the density.** 382 64x64 blocks carry insertions over the run; + at B = 32 about four times as many, some 380 per colour, which is ample for + 16 threads with dynamic scheduling. Per-block load is uneven: in round 14 a + 64-block takes up to 237 insertions against a mean of about 53 (profile, + section 3). Dynamic scheduling across hundreds of blocks absorbs that. + What is **not** known is the share of footprints that leave a halo for a + given B (section 6, question 6). +- **Numbering.** Each block appends into a reserved range sized by its mark + count (at most two triangles and one vertex per insertion); ranges are + compacted at the end of the phase by a prefix sum, and references remapped + in the slots written that phase. +- **Rough ceiling:** similar to A if few footprints cross; worse if many do, + because the serial tail grows. Four barriers a round, so synchronisation is + cheap even with a spawn per phase (though a team is still better). +- **Complexity:** medium. The footprint walk is still needed to decide + deferral; the commit reuses today's code. Numbering and remap are new. +- **Level:** L1, because the blocks are fixed in DEM nodes and each block's + order is index order. Not L0: the colour-major order changes which marks + are skipped. + +### Option C. Batch insertion, then parallel Lawson flipping (Qi, Cao and Tan 2012) + +Our round already takes one point per triangle, which is the GPU methods' +insertion rule. Change the serial phase to: + +1. **Insert the batch.** A fan writes `T` and repoints `T`'s neighbours; an + edge split writes `T` and `U` and repoints theirs. So two marks collide + when one's split triangles are the other's split triangles *or its ring*: + two edge splits of the same edge, and also two fans in adjacent triangles + (each repoints the other's slot). Colliding marks are resolved by a fixed + rule (the lower key splits in this step, the other in a second step or + next round), or the repoints are deferred to a separate pass after all + splits. Slots are numbered by a prefix sum in index order. Which of these + is cheaper is a 21d design question. +2. **Flip to CDT in parallel rounds.** Collect the non-Delaunay edges among + those written. In each flip round, choose a set of edges no two of which + share a triangle, by a fixed rule (an edge flips if its key is the smallest + among candidate edges of its two triangles), and flip them in parallel. + Push the four outer edges of each flip for the next flip round. Repeat + until none remains. Termination is Lawson's argument, which does not depend + on order (14b R4, part 1). +3. Everything written is touched and rescanned next round, as today. + +- **Against the density.** Parallelism is per edge, not per insertion: + thousands of candidate edges per flip round, each flip about 250 ns with + its incircle test (14b M5). The unknowns are how many flip rounds a batch + needs, and how many more flips arbitrary-order flipping costs than Lawson + around each point. +- **The big risk: the batch changes.** Today 51 % of marks are skipped + because an earlier insertion rewrote their triangle; here nearly every mark + inserts. That is less greedy. By 14b's C2 evidence it may cost several + percent more triangles, and fewer rounds. It must be measured before being + chosen (section 6, question 6b). A thinning rule (defer a mark whose + triangle is adjacent to a lower-key mark's) moves it back towards today's + batch at little cost. +- **Rough ceiling:** if the batch costs nothing in triangles, the best of the + three. The predicate runs once per test, the commit is today's `flip`, and + the grain is finest. Same arithmetic as A with 60-80 % efficiency: about + 0.08-0.09 s at 8 threads. +- **Complexity:** medium. Batch split with numbering, a deterministic + parallel flip loop, a thread team. `split_*` and `flip` are reused. +- **Level:** L1. The final mesh is the CDT of the round's vertex set, which + is unique except at cocircular ties. A tie is never flipped, so which + diagonal survives is decided by the flip schedule, which is fixed by edge + keys, not by timing. Not L0. + +### Option D. Domain decomposition (Linardakis and Chrisochoides 2006; Galtier and George 1996) + +Cut the domain into subdomains along artificial constraint edges, refine each +as its own mesh, and merge. + +- **The Delaunay property across seams.** Artificial separators are + constraints, so the union is constrained Delaunay with respect to *them*, + not only to the input's constraints. Restoring the promise means removing + the separators after the merge, legalising across them, and rescanning what + changed: a serial or option-C step along every seam, followed by more + rounds. +- **Separator refinement.** A worst node on a separator splits that separator, + which the subdomain on the other side must see. Linardakis and Chrisochoides + avoid this by pre-refining separators from a sizing function; we have no + sizing function, only the DEM error, known after scanning. +- **Against the density.** DD's grain is coarse: few synchronisations, good + cache locality. The density data says finer grains have plenty of work, so + DD's advantage here is not parallelism. +- **Where DD does belong: very large areas.** Ola's ruling names them. When + the DEM (a mosaic of the 254-tile archive, `ROADMAP.md` 16b and 18 R6) does + not fit in memory, subdomains that are refined one or a few at a time are + the natural shape, and seams are the price. That is the parked mosaic + increment's problem, not this one's. +- **Level:** L1 if the partition is fixed in DEM nodes; L2 if one subdomain + per thread. +- **Complexity:** high (seams, merge, re-legalisation), for a gain the other + options reach more cheaply on one machine. + +### Others considered + +- **Lock-based concurrent insertion** (Kohout et al.; Batista et al.; + Galois). L3 only. Not recommended (section 4). +- **Pipelining the next round's scan with this round's splits.** A slot + written early in the round can be rewritten later in it, so its scan + cannot start before the round ends without the footprint machinery of + option A. No cheaper than A. +- **A cheaper serial insert** (Bowyer-Watson in place of split plus Lawson, + serially). It could cut writes, since a flip rewrites two slots and + repoints two, but the gain is not estimable from the profile. It is the + commit routine of option A anyway. + +### Recommended order + +1. **21a and 21b**, the quick wins. Bit-identical, no ruling needed, and they + set the baseline every option is measured against. +2. **21c, measurement only** (`@perf`, no production code): the questions in + section 6, especially footprint extents, the dependence depth of the index + order, and a scratch simulation of option C's batch (triangles, rounds, + flip rounds, flips) and of A1's (triangles, rounds, sub-rounds). +3. **21d, the parallel serial phase:** **option C if** 21c shows its batch + costs at most about 2 % more triangles at 1 m (or the thinning rule brings + it there); **otherwise option A1.** Option B is a scheduling variant of A + that still needs A's footprint walk, so it is chosen over A1 only if 21c + shows almost no footprint crosses a 32-node halo. Option D waits for the + mosaic. + +## 6. @perf's six questions + +The six questions are in `@perf`'s handback of the profile round +(2026-09-27), not in the committed README, so they are copied here verbatim. +Each is answered or placed. + +1. *"The determinism contract fixes the output by triangle-index order. Would + a different order be acceptable if it still does not depend on the thread + count? Any colouring or domain decomposition depends on that answer."* + **Placed with Ola.** His ruling allows a different order; whether + thread-count independence is required is Q1 in section 8. The architect + recommends L1 (section 4). + +2. *"Insertions are 3 nodes apart, and each conflicts with 4-8 others in a + round. What does the parallel Delaunay refinement literature say about the + granularity of independent sets at that density? Does lattice + cocircularity change the picture?"* + **Answered, with one measurement to add.** Deterministic reservations work + at this grain: with random-like priorities about 1/(d+1) of the pending + marks win a sub-round, which here is 1,000-3,400 disjoint commits in the + first sub-round of a big round (section 5, option A). The binding limit is + synchronisation per sub-round, not the supply of independent work, hence + the thread team. The geometric colouring literature (Chernikov and + Chrisochoides) works at a coarser grain and needs a distance bound we do + not have (option B). Cocircularity does not change the conflict counts + much (a tie is not flipped, so it stops propagation rather than extending + it). It matters for determinism: with ties, the triangulation of a vertex + set is not unique, so any change of order can change which diagonal + survives. That is why L0 is expensive and why L1 needs a fixed tie rule. + **Measurement (21c):** the dependence depth of today's index order within + each round. Build the DAG with an edge j -> i when j < i in index order and + their footprints share a slot, and report the longest path per round. A + short depth would make option A0 (L0) worth a second look; a long one + settles it. + +3. *"Every exact-path incircle test is a tie between DEM nodes. Is there a + cheaper exact decision for quads whose corners are all nodes? That is 5 % + of refine and about 17 % of the serial phase."* + **Answered: yes,** an int64 lattice incircle under four stated conditions, + bit-identical to today (QW2, 21b). The premise is still an inference; the + classification measurement in QW2 comes first. + +4. *"The scan loses 16.5 ms of 61.8 ms to imbalance at 8 threads. Is the + chunking free to change, given that results are written per slot? And does + the 5.6x rescan amplification come from the deferral rule?"* + **Chunking: yes, freely** (QW1). The scan is pure and each result slot has + one writer, so the partition cannot change a result. + **Amplification: partly, and mostly not avoidably.** A triangle an + insertion rewrites is a new triangle and must be scanned; that is most of + the 5.6x, and the deferral rule only moves it by a round. The avoidable + part is rescanning a skipped mark whose slot nobody wrote (QW4). + **Measurement:** per round, scanned nodes split into slots written in the + previous round and skipped-and-unwritten slots (QW4). + +5. *"The split phase slows by about 8 % after a multi-threaded scan. Should + that be profiled before any design relies on the 1-thread serial figure?"* + **No separate profile now; use the right figure instead.** The designs in + section 5 use the 8-thread split time (0.137 s), not the 1-thread one, so + they do not rely on the slowdown's cause. Profiling it without hardware + counters (no `xctrace`, profile README) would give another inference. + **Placed in 21c:** re-measure the split time at 1 and 8 threads after 21a + and 21b land, since both change what the split phase runs after. + +6. *"What partition-boundary data would a domain decomposition need? I could + measure footprint coordinates as a next step."* + **Yes, and for colouring as much as for DD.** Measurement for 21c, from the + instrumentation patch extended with vertex coordinates: + - (a) per insertion, the bounding box in nodes of all vertices of its + footprint slots; the distribution of its larger side (p50, p90, p99, + max) per round; + - per insertion, whether that box leaves its block's halo, for B = 16, 32, + 64 and 128 and a halo of B/2; the share per round; + - per round and B, insertions per block (max and mean), for load balance; + - (b) a scratch simulation (never in the tree) of option C's batch: for + the 1 m quarter circle, triangles, rounds, flips, flip rounds per refine + round, and achieved max error, against today's; the same with the + thinning rule; and option A1's batch (hashed priority, skip rule kept): + triangles, rounds, and sub-rounds per round. + +## 7. Proposed increments, LOC and invariant-critical suites + +Counted in `CLAUDE.md` §2's unit. Estimates, not measurements; the worst +overrun seen so far is +66 % (increment 17), so each is also given at that +bias against the 700 ceiling. + +| increment | what | est. | at +66 % | determinism | invariant-critical suite (mutation round) | +|---|---|---|---|---|---| +| **21a** | QW1 dynamic scan scheduling with a small-round inline threshold (`parallel_util/`), QW3 merge, `legalise_around`'s caller-owned stack; QW4 only if measured worth it (about +20) | ~60 | ~100 | bit-identical | `test_refinement_chunks`, extended to the dynamic scheduler: every index visited exactly once for every n, thread count and block size. A dropped or doubled block leaves a stale scan result, which breaks the tolerance guarantee silently, so this is where the guarantee is decided | +| **21b** | QW2 `lattice_incircle` in `mesh/`, the exact-frame check, the call in `must_flip` | ~50 | ~85 | bit-identical where it answers | a new `test_mesh_lattice_incircle`: agreement with `DetriaExact` on the frame doubles for random and adversarial node quads (grid rectangles, other cocircular lattice quads such as points on a circle of radius 5, near-overflow differences at 2^14, `dx != dy` and inexact `dx` returning `nullopt`, off-node corners returning `nullopt`). Mutants: bound at 2^15, `dx != dy` not refused, the exact-frame check dropped, a sign flip | +| **21c** | measurement only, `@perf`; evidence under `docs/benchmarks//` | 0 | 0 | — | none | +| **21d** (option C) | thread team (`std::barrier`, per call), batch split with prefix-sum numbering, deterministic parallel flip rounds, the round loop | ~320 | ~530 | L1 | a new `test_mesh_parallel_lawson`: CDT property, conformity and a flip-count bound on random lattice meshes with cocircular ties and constraints, and identical output for threads 1, 2, 7 and hardware concurrency. Plus `prop_refinement_refine`'s tolerance oracle re-run, with the mutant "a flipped slot not marked touched" | +| **21d** (option A1) | thread team, footprint walk, reservation, cavity commit, prefix-sum numbering, the round loop | ~450 | ~750 | L1 | a new `test_mesh_cavity_insert` with `legalise_around` as its oracle (same triangulation on the same mesh and point, ties included), plus the reservation's disjointness and the same determinism and tolerance suites. **Over the ceiling at the worst bias, so it would be cut in two**: the cavity insert serially first (bit-identical to split-plus-Lawson up to the equality claim), then reservations | + +Every 21d option changes the output once. What that does to the existing +suites: + +- **14's T6** (`prop_refinement_refine`, "T6: the output is bit-identical for + 1, 2, 7 and all threads", and T16 for off-node rings) compares thread + counts with each other, not with a stored mesh. **Under L1 it stays as it + is and becomes 21d's determinism test.** Under L2 or L3 it would have to be + weakened or dropped, which is a concrete cost of those levels. +- **18's T3 golden digests** (`tests/python/test_refine_golden.py`) say that + no commit may update them to agree with new code. 21d is the deliberate + exception: `@tester` retires them as "unchanged since increment 17" and + records new digests from 21d's reviewed output, in their own commit with + the reason, so they guard against the next unintended change. Q1 in + section 8 is what authorises that. +- Other tests that pin exact counts of a refined mesh (for example 14's T2 + under 14b's amendment) are for `@tester` to find in the red step. + +Every new suite joins the TSan job's list in `.github/workflows/main.yaml`. + +**Acceptance for 21a, 21b and 21d** is `@perf`'s run +(`docs/increments/README.md`, "Acceptance"): the 1 m benchmark and the thread +sweep from `tools/bench.py`, battery against battery. For 21a and 21b the mesh +hash must be unchanged. For 21d the mesh hash changes by design, so the +comparison is time, triangle count, worst angle and max degree (Q3). + +## 8. Questions for Ola + +**Q1. Which determinism level?** Your ruling allows leaving bit-identical +output. It does not say whether the mesh may then depend on the thread count +or vary between runs. The levels are in section 4. +*Recommendation: L1*, deterministic and independent of the thread count, in a +new order. It costs no speed in the recommended options, keeps failures +replayable, and keeps benchmark meshes citable for a publication. + +**Q2. One path for every input, or a switch for large areas?** "When we are +encountering geometries where this is important, ie very large areas" can be +read as keeping today's path for small inputs. +*Recommendation: one path.* Every mesh, small ones included, changes once +when 21d lands; after that there is one algorithm to test, and no threshold +to tune. With L1 the 1-thread run is as reproducible as today's. + +**Q3. How many more triangles may the parallel serial phase cost?** Option C +changes which points each round inserts, and that may cost triangles for the +same tolerance (14b's C2 saw 6-27 % for other less greedy rules). +*Recommendation:* at most 2 % more triangles at 1 m on the quarter circle, +with worst angle and max degree no worse, measured by `@perf` in 21c before +21d is chosen. If C misses it, option A1 keeps today's batch rule. + +**Q4. Go ahead with 21a and 21b now, before the answers above?** They are +bit-identical and need none of the rulings. +*Recommendation: yes.* 21b after the tie-classification measurement (QW2), +which is a short `@perf` task on the existing instrumentation patch. + +**Q5. Domain decomposition deferred to the large-area (mosaic) work?** DD's +advantage is coarse grain and memory, not parallel work, of which the +density data shows plenty at a finer grain. +*Recommendation: yes.* Design it with the refreshed increment 15, where the +DEM no longer fits in memory and subdomains are the natural unit. From 34e99271e302042192076c6b73c6a712a391e5ce Mon Sep 17 00:00:00 2001 From: Ola Skavhaug Date: Sun, 27 Sep 2026 11:25:56 +0200 Subject: [PATCH 4/7] 21: three core citations verified by web search; tile-parallel greedy insertion prior art for option D Co-Authored-By: Claude Opus 5.5 --- docs/increments/21-parallel-refine.md | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/docs/increments/21-parallel-refine.md b/docs/increments/21-parallel-refine.md index 5fbb4b03..3ea13b55 100644 --- a/docs/increments/21-parallel-refine.md +++ b/docs/increments/21-parallel-refine.md @@ -208,6 +208,31 @@ insertion for height fields is known to the architect, and none is cited in this repository. This is exactly the gap a novelty claim would sit in, so it is not filled by guessing. +### Checked by web search, 2026-09-27 (main session) + +The design was written from memory. Afterwards the main session checked the +three papers the options rest on, and ran one terrain query: + +- **Verified:** Blelloch, Fineman, Gibbons and Shun, "Internally deterministic + parallel algorithms can be fast", PPoPP 2012 + (doi:10.1145/2145816.2145840). Chernikov and Chrisochoides, "Practical and + efficient point insertion scheduling method for parallel guaranteed quality + Delaunay refinement", ICS 2004, pp. 48-57 (doi:10.1145/1006209.1006217); its + independence condition compares point distance with an upper bound on + triangle circumradius, as option B assumes. Qi, Cao and Tan, "Computing 2D + constrained Delaunay triangulation using the GPU", I3D 2012, extended in IEEE + TVCG 19(5):736-748, 2013; it flips all flippable pairs in parallel, as + option C assumes. +- **Found, not in the list above:** "3D Simplification Methods and Large Scale + Terrain Tiling", Remote Sensing 12(3):437, 2020 (mdpi.com/2072-4292/12/3/437). + It adapts greedy insertion, among other methods, to work tile by tile, in + parallel, keeping tile-border vertices shared between neighbours. That is + prior art for option D (domain decomposition by tiles) on terrain. Also "A + fast digital terrain simplification algorithm with a partitioning method", + IEEE, 2000 (ieeexplore.ieee.org/document/843506), not read. +- The other citations above are still unverified, and the searches below have + not been run in full. + ### Searches to run before any novelty claim A claim is not made until these are run in a real database (Google Scholar, From 4b41b744f6be82f52855e9cf78d937a3fc72294f Mon Sep 17 00:00:00 2001 From: Ola Skavhaug Date: Sun, 27 Sep 2026 11:34:36 +0200 Subject: [PATCH 5/7] 21: Ola's rulings on Q1-Q5 (L1, one path, 2 % triangles, 21a/21b now, DD deferred) Co-Authored-By: Claude Opus 5.5 --- ROADMAP.md | 2 +- docs/increments/21-parallel-refine.md | 14 +++++++++++++- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/ROADMAP.md b/ROADMAP.md index ebfccfec..65663300 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -42,7 +42,7 @@ increment that most needs a picture to check against | 20 | Quality start: before DEM refinement, Steiner points at the DEM node nearest each bad triangle's circumcentre until the start mesh has a 25° minimum angle (`--start-min-angle`, 0 is off); geometry only, input segments not split, serial and deterministic. Removes increment 16's boundary fans | landed with 20b as interim (C1-C3 open, to 20c; C4 -> 20b) | `docs/increments/20-start-quality.md` | | 20b | Minimum insertion distance from constraints: when refinement's worst node lies within ε = clamp(tol / slope, cell/100, cell/2) of a constraint segment, insert the foot on the segment (off-node, bilinear z) instead; a footed node still above tolerance is inserted after all, so the tolerance guarantee is unchanged. Removes the 0.0117° needle at 1 m (increment 20's C4) | shipped with 20 (#97) | `docs/increments/20b-min-insertion-distance.md` | | — | `tools/bench.py`: the 1 m benchmark and the thread-scaling sweep from one checked-in command, with power state, quality and commit recorded per run; the one-off scripts in `docs/benchmarks/2026-09-26/` are its specification. Rule 2's acceptance run needs it | shipped with branch `tools-bench`'s PR | `docs/benchmarks/bench-py.md` | -| — | The serial phase: profile refine's serial insert-and-flip phase, then parallelise what the profile blames. Scaling tops out at about 2.0-2.2×. Profiled 2026-09-27: serial part about a third of 1-thread refine, mostly Lawson legalisation; the scan stops near 5× from load imbalance | profiled; the fix is to design (`@architect`), after Ola rules on the determinism contract | `docs/benchmarks/2026-09-27/serial-profile/README.md` | +| — | The serial phase: profile refine's serial insert-and-flip phase, then parallelise what the profile blames. Scaling tops out at about 2.0-2.2×. Profiled 2026-09-27: serial part about a third of 1-thread refine, mostly Lawson legalisation; the scan stops near 5× from load imbalance | profiled; designed as increment 21 (Ola's rulings 2026-09-27: L1 determinism, one path, at most 2 % more triangles): 21a and 21b quick wins next, then 21c measurements, then 21d | `docs/increments/21-parallel-refine.md`, `docs/benchmarks/2026-09-27/serial-profile/README.md` | | 16b | Interior polygons and polylines as constraints ("terrain polygons": lakes, land cover, roads, rivers): `--features PATH`, a GeoJSON `FeatureCollection`, each feature naming a vocabulary property; closed or open `Breakline`s, crossings noded, off-node vertices with bilinear z. **Its working example is real data** (Ola, 2026-09-27): CORINE Land Cover 2018 over the benchmark tile `7908_3_10m_z33.tif`. The source is Ola's local copy, `rasputin_data/corine_sql/.../U2018_CLC2018_V2020_20u1.gpkg` (8.2 GB, EPSG:3035, a sibling of this repository, which also holds the 254-tile DTM10 archive for gap 6). It reads without GDAL: sqlite3 over its R-tree, the GeoPackage blob header stripped, `shapely.wkb`, then `pyproj` to 25833, so CRS stops in Python as before. Probed 2026-09-27 in 0.2 s: 60 polygons in 8 classes (heath, bare rock, sparse vegetation, bogs, intertidal flats, water, sea, urban), 11 068 vertices clipped to the tile, median segment 54 m against 10 m cells. The EEA's public ArcGIS service (`image.discomap.eea.europa.eu`, `Corine/CLC2018_WM`) returns the same 11 068 clipped vertices and is the route for anyone without the file. What it forces on 16b's design: neighbouring polygons share their boundaries, so each shared edge arrives twice; the polygons run past the domain and must be clipped; the extract is committed as a fixture with the Copernicus attribution. Placed before 20c because 20c may split constraint segments and should be designed and measured on inputs that have interior ones | designed in 16's R6, no increment file yet; after the serial phase, before 20c | `docs/increments/16-domain-polygon.md` (R6) | | 20c | Soft quality criterion: a penalty that each Steiner node or constraint split must pay for in angle gained, instead of 20's hard 25°; applied at the start and during DEM refinement; may split constraint segments when that improves the mesh. Ola's rulings on 20's C1-C3 | to design after 16b (`@architect` measures cost against 20 first) | `docs/increments/20-start-quality.md` (Ola's rulings) | | — | Auto-catchment: the watershed upstream of a coordinate, computed from the DEM and handed to `--domain`, so a catchment no longer has to be supplied as a file (Ola, 2026-09-27: "not far into the future"). The textbook route is depression handling (Priority-Flood, Barnes, Lehman and Mulla 2014), D8 flow directions (O'Callaghan and Mark 1984) and accumulation, the pour point snapped to the strongest flow nearby, the upstream cells traced and their outline turned into a polygon; the literature check is `@architect`'s. Open for its design: whether it runs in the C++ core (a 10 m tile is 25 M cells); how a stair-stepped cell outline becomes a domain polygon, which meets input coarsening; and that a real catchment crosses tile edges, so it needs gap 6 (a DEM in several tiles) first. Legacy has nothing on it (`grep -rliE "watershed|flow.?acc|flow.?dir|pour.?point|catchment" legacy` returns no files) | to design; after gap 6, which it needs; placed after 20c, can move ahead of it on Ola's word | none yet | diff --git a/docs/increments/21-parallel-refine.md b/docs/increments/21-parallel-refine.md index 3ea13b55..1596f377 100644 --- a/docs/increments/21-parallel-refine.md +++ b/docs/increments/21-parallel-refine.md @@ -44,6 +44,18 @@ important" means a switch (today's path for small inputs, a parallel path for large ones) or one path for everything. Section 4 lays out the levels; questions Q1 and Q2 in section 8 ask Ola to choose. +**Ruled by Ola, 2026-09-27: "yes to all"** to the recommendations in +section 8: + +- **Q1: L1.** Deterministic and independent of the thread count, in a new + order; T6 stays, increment 18's golden digests are re-recorded once. +- **Q2: one path** for every input; every mesh changes once when 21d lands. +- **Q3: at most 2 % more triangles** at 1 m on the quarter circle, worst angle + and max degree no worse, measured in 21c before choosing between C and A1. +- **Q4: 21a and 21b go ahead now**; 21b waits for the tie-classification + measurement. +- **Q5: domain decomposition is deferred** to the large-area (mosaic) work. + ## 1. Prior art: legacy and literature ### Legacy @@ -782,7 +794,7 @@ sweep from `tools/bench.py`, battery against battery. For 21a and 21b the mesh hash must be unchanged. For 21d the mesh hash changes by design, so the comparison is time, triangle count, worst angle and max degree (Q3). -## 8. Questions for Ola +## 8. Questions for Ola (ruled 2026-09-27; see "Ola's rulings") **Q1. Which determinism level?** Your ruling allows leaving bit-identical output. It does not say whether the mesh may then depend on the thread count From e5e7c5f18352e1b85168abcaeb46b1bd31737fdb Mon Sep 17 00:00:00 2001 From: Ola Skavhaug Date: Sun, 27 Sep 2026 11:43:27 +0200 Subject: [PATCH 6/7] Review fixes: Ola's words verbatim; 21 status, overrun bias, exception contract, conflict degree, frame orientation; profile README denominators and power records Co-Authored-By: Claude Opus 5.5 --- .claude/agents/perf.md | 9 +++-- .../2026-09-27/serial-profile/README.md | 24 ++++++----- docs/increments/21-parallel-refine.md | 40 ++++++++++++------- 3 files changed, 44 insertions(+), 29 deletions(-) diff --git a/.claude/agents/perf.md b/.claude/agents/perf.md index 9c71e5b7..ff415bf8 100644 --- a/.claude/agents/perf.md +++ b/.claude/agents/perf.md @@ -28,10 +28,11 @@ it is never unmeasured again. You report measured figures only. about a third of single-thread refine, mostly Lawson legalisation, and the scan itself stops speeding up near 5× from load imbalance. Re-profile before a design relies on those figures after refine changes. -* **The scaling ceiling.** Refine speeds up at most about 2.2× from 1 to 20 - threads, flat from about 7, on AC as on battery - (`docs/benchmarks/2026-09-26/README.md`). Report each increment's ceiling - against it. +* **The scaling ceiling.** Refine speeds up at most about 2.0-2.2× from 1 to + 20 threads, flat from about 7-8: 2.2× in the 2026-09-26 sweep (AC and + battery, `docs/benchmarks/2026-09-26/README.md`), 2.02-2.03× on battery on + 2026-09-27 (`docs/benchmarks/2026-09-27/serial-profile/README.md`). Report + each increment's ceiling against the matching power-state baseline. ## 2. How a run is made * **Release build, rebuilt.** `bench.py run` builds Release into diff --git a/docs/benchmarks/2026-09-27/serial-profile/README.md b/docs/benchmarks/2026-09-27/serial-profile/README.md index 80931ff4..d56c0eea 100644 --- a/docs/benchmarks/2026-09-27/serial-profile/README.md +++ b/docs/benchmarks/2026-09-27/serial-profile/README.md @@ -2,11 +2,14 @@ Status: done (@perf). Measurement and analysis only: no fix, no design, no production code changed. Every figure below is from **battery** power -(`pmset -g batt` beside each data file); no AC run was made. +(`pmset -g batt` beside each timing sweep: `data/*.pmset`). The instrumented runs +(`data/instr_t*_rounds.txt`, and `rounds_t1.md`, `chunks_t8.md` derived from +them) have no committed power record; they ran in the same battery session, +but that is not on disk. Their counts do not depend on power; their timings +do. No AC run was made. The ask (Ola, 2026-09-27): profile refine's serial phase before anyone designs -a fix. "Some of the serial parts could be parallelised by multicolouring/DD -techniques, but let's wait for the analysis before we get ahead of ourselves." +a fix. "Some of the serial parts could be parallellized by multicoloring/dd techniques, but let's wait for the analysis before we get ahead of ourselves." ## Findings @@ -26,15 +29,15 @@ techniques, but let's wait for the analysis before we get ahead of ourselves." `active` sort between rounds is 3.6 %. 3. **The scan speeds up about 5x at 8 threads (4.95x), not 8x, and flattens from about 8.** Load imbalance across the contiguous chunks costs 16.5 ms of - the 61.8 ms. A quarter of that imbalance is round 1 alone. Thread start + the 61.8 ms. Round 1 alone is 6.1 ms of it, about 39 % of that run's 15.8 ms (`data/chunks_t8.md`). Thread start costs 3.8 ms, and each worker is about 9 % slower than a lone thread. Above 10 threads (8 P + 2 E cores) the last chunk starts about 30 ms late. The bytes read (2.6 GB/s at 8 threads) show no sign of a memory-bandwidth limit. That is inferred from byte counts; no hardware counters were read. 4. **Insertions in the same round are dense and overlap.** 41 rounds; 77 % of the 213,464 insertions fall in rounds 9-19, at 9,000-18,700 per round. In - rounds 5-21 each round touches 69-93 % of the domain's 64×64-node blocks. - From round 11 on, the median distance to the nearest same-round insertion + rounds 5-21 each round touches 69-93 % of the 382 64×64-node blocks that ever receive an insertion (about 20 % of the quarter domain's ~1,776 blocks at most; the rest is flat sea or NoData, which refine never splits). + In rounds 11-29 the median distance to the nearest same-round insertion is 3 nodes. An insertion writes 5.5 triangle slots on average (p99 9) and reads or writes 11.0 (p99 18). 95 % of insertions share a slot, read or written, with another insertion of the same round; 65 % share a written @@ -57,7 +60,8 @@ together with a scan that stops at about 5x. profiled and instrumented builds (`ff705683…` over the binary VTK). - **Machine**: Apple M1 Max, 8 P + 2 E cores, 32 GiB, macOS 27.0, AppleClang 21.0.0, Python 3.14.7. **Power: battery**, 83-86 %, throughout - (`data/*.pmset`, and `run.json` of the bench.py run). `powermode 0`. + (`data/*.pmset`, and `run.json` of the bench.py run). `powermode 0` was + observed but is not recorded in any committed file. - **Builds** (all scratch, in gitignored `build-*` directories): - `build-prof`: `CMAKE_BUILD_TYPE=Release`, `CMAKE_CXX_FLAGS=-g`, which gives `-g -O3 -DNDEBUG … -flto`. Used for the phase sweeps. pybind11 strips @@ -284,9 +288,9 @@ Over all rounds: insertions (77 %). - **Spread**: in rounds 5-25 each round touches 173-355 of the 382 blocks (45-93 %; 69-93 % in rounds 5-21). In the big rounds a block receives at - most 154-248 insertions. From round 11 on, the median nearest-neighbour - distance is about 3 nodes (30 m); in round 1 it is 27 nodes. Insertions are - spread over the whole domain at once, and they are close together. + most 154-248 insertions. In rounds 11-29 the median nearest-neighbour + distance is about 3 nodes (30 m; 4.0-8.6 in rounds 30-35); in round 1 it is 27 nodes. Insertions are + spread over all of the domain that refine works on (the 382 blocks above) at once, and they are close together. - **Footprint size**: write set mean 5.49 slots (p50 5, p90 7, p99 9, max 18). Footprint mean 10.96 (p50 10, p90 14, p99 18, max 36). Flips per insertion 2.09 (445,657 / 213,464). diff --git a/docs/increments/21-parallel-refine.md b/docs/increments/21-parallel-refine.md index 1596f377..c287a356 100644 --- a/docs/increments/21-parallel-refine.md +++ b/docs/increments/21-parallel-refine.md @@ -1,6 +1,6 @@ # Increment 21 — parallel refine: quick wins, then the serial phase -Status: **design only, waiting on Ola** (section 8). Written by `@architect` +Status: **design only, ruled by Ola 2026-09-27** (section 8, "Ola's rulings"). Written by `@architect` on 2026-09-27, on branch `serial-profile`, per `docs/increments/README.md` step 1. No code and no tests exist for it. This file proposes a sequence of small increments (21a to 21d, section 7); each gets its own Rulings and Tests @@ -28,9 +28,8 @@ keeps: Recorded verbatim, not paraphrased. -- 2026-09-27, before the profile: some serial parts "could be parallelised by - multicolouring/DD techniques, but let's wait for the analysis before we get - ahead of ourselves." +- 2026-09-27, before the profile: + "Some of the serial parts could be parallellized by multicoloring/dd techniques, but let's wait for the analysis before we get ahead of ourselves." - 2026-09-27, after the profile, on the determinism contract: **"I think that when we are encountering geometries where this is important, ie very large areas, we should not rely on bit-identical outputs."** @@ -286,7 +285,7 @@ on nothing else from it: | median distance to the nearest same-round insertion, round 11 on | about 3 nodes | independence at the finest grain is rare | | footprint (slots read or written) | mean 11.0, p99 18, max 36 | the size of a reservation | | write set | mean 5.5, p99 9 | slots appended and rewritten | -| footprint conflict degree, big rounds | mean 4.7-7.7 | expected winners per sub-round | +| footprint conflict degree, big rounds 9-19 | mean 3.2-6.4 (7.7 in round 5) | expected winners per sub-round | | marks deferred because their slot was rewritten | 51 % | the batch semantics every option must match or change on purpose | Two caveats carried from the evidence. The footprints were measured in the @@ -320,6 +319,13 @@ profile's figures, not measurements. a result. The atomic is a work counter only. This amends 14 R7's "no atomics" in wording, not in substance: R7's point is no shared *result* writes, which still holds. TSan sees a correctly synchronised atomic. +- **Exceptions.** `for_each_chunk` promises that the exception of the + lowest-index chunk that threw is rethrown, "fixed by the chunking, not by + thread timing" (`include/terrain/parallel_util/chunks.hpp:10-13`, tested at + `tests/cpp/unit/test_refinement_chunks.cpp:79`). Dynamic scheduling keeps + that contract: each block records its exception by block index, and the + lowest block index that threw is rethrown after the join. Every block is + still run, as today, so which blocks throw does not depend on timing. - **Expected gain.** Up to the 16.5 ms imbalance at 8 threads, less one block's work per thread. Scan roughly 62 -> 47 ms; refine at 8 threads roughly 0.229 -> 0.215 s (-6 %). Nothing at 1 thread. @@ -352,7 +358,9 @@ profile's figures, not measurements. top of `must_flip`. It answers only when - all four vertices are nodes; - `dx == dy`, so the frame is the lattice times one positive constant, and - the sign of the scaled determinant is the sign of the lattice one; + the sign of the scaled determinant is the sign of the lattice one. The + integer determinant is taken on `(col, -row)`, as `MeshVertex::frame()` + orients the frame; on `(col, row)` the sign inverts; - every coordinate difference from `d` is at most 2^14 nodes. The determinant is then at most 12 · 2^56 < 2^63, and exact in `int64`; - **the frame is exact**: `col * dx` and `row * dy` are exactly @@ -370,10 +378,9 @@ profile's figures, not measurements. is the same and the output is bit-identical. The exact-frame condition is what makes that true; without it (say `dx = 0.1`) the integer answer is the *true* lattice answer and the rounded frame's answer can differ on a tie. - That would still terminate (an integer-strict Inside has a margin far above - the rounding, so it is also Inside on the rounded points, and every flip - still lowers the rounded lifted surface), but it would change output, so it - is excluded. + That would probably still terminate (unproven: an integer-strict Inside + seems to keep a margin far above the rounding), but it would change output, + so it is excluded and nothing rests on the argument. - **Expected gain.** Most of the 5.0 %, plus part of the 2.7 % filtered cost for all-node quads, less the integer determinant's own cost. Roughly 0.018 s at every thread count: -4 % at 1 thread, -8 % at 8. @@ -448,8 +455,8 @@ cost is that **every** mesh changes once, small ones included. Question Q2. ## 5. Options for the serial phase Each option is judged against the measured density: insertions about 3 nodes -apart from round 11 on, each conflicting with 4.7-7.7 others in the big -rounds, footprints of about 11 slots (p99 18), 9,000-18,700 insertions in a +apart in rounds 11-29, each conflicting with 3.2-6.4 others in the big +rounds 9-19 (7.7 in round 5, 2,063 insertions), footprints of about 11 slots (p99 18), 9,000-18,700 insertions in a big round, 51 % of marks deferred by the serial loop. The ceilings below are arithmetic on the profile, after the quick wins @@ -758,8 +765,9 @@ Each is answered or placed. ## 7. Proposed increments, LOC and invariant-critical suites Counted in `CLAUDE.md` §2's unit. Estimates, not measurements; the worst -overrun seen so far is +66 % (increment 17), so each is also given at that -bias against the 700 ceiling. +overrun recorded so far is +86 % (6a, `06-cdt-viewer.md`); the table gives +each at +66 % (increment 17). At +86 % the conclusions hold: A1 (~450) comes +to ~840 and is split in any case; C (~320) comes to ~595, still under 700. | increment | what | est. | at +66 % | determinism | invariant-critical suite (mutation round) | |---|---|---|---|---|---| @@ -774,7 +782,9 @@ suites: - **14's T6** (`prop_refinement_refine`, "T6: the output is bit-identical for 1, 2, 7 and all threads", and T16 for off-node rings) compares thread - counts with each other, not with a stored mesh. **Under L1 it stays as it + counts with each other, not with a stored mesh. So do + `prop_refinement_quality.cpp:233` and + `prop_refinement_constraint_feet.cpp:587`, which join the same contract. **Under L1 it stays as it is and becomes 21d's determinism test.** Under L2 or L3 it would have to be weakened or dropped, which is a concrete cost of those levels. - **18's T3 golden digests** (`tests/python/test_refine_golden.py`) say that From 267fc745a4b19233b97bd557836076033ca2b087 Mon Sep 17 00:00:00 2001 From: Ola Skavhaug Date: Sun, 27 Sep 2026 11:47:21 +0200 Subject: [PATCH 7/7] Review fixes, round 2: NN range, 6a overrun +99 %, battery ceiling 2.1x, block-count provenance; 09-26 README points at the profile Co-Authored-By: Claude Opus 5.5 --- .claude/agents/perf.md | 6 +++--- docs/benchmarks/2026-09-26/README.md | 3 ++- docs/benchmarks/2026-09-27/serial-profile/README.md | 4 ++-- docs/increments/21-parallel-refine.md | 12 ++++++++---- 4 files changed, 15 insertions(+), 10 deletions(-) diff --git a/.claude/agents/perf.md b/.claude/agents/perf.md index ff415bf8..143bacad 100644 --- a/.claude/agents/perf.md +++ b/.claude/agents/perf.md @@ -29,9 +29,9 @@ it is never unmeasured again. You report measured figures only. scan itself stops speeding up near 5× from load imbalance. Re-profile before a design relies on those figures after refine changes. * **The scaling ceiling.** Refine speeds up at most about 2.0-2.2× from 1 to - 20 threads, flat from about 7-8: 2.2× in the 2026-09-26 sweep (AC and - battery, `docs/benchmarks/2026-09-26/README.md`), 2.02-2.03× on battery on - 2026-09-27 (`docs/benchmarks/2026-09-27/serial-profile/README.md`). Report + 20 threads, flat from about 7-8. The 2026-09-26 sweep + (`docs/benchmarks/2026-09-26/scaling/`, medians per thread count) gives 2.2× + on AC and 2.1× on battery; 2026-09-27 gives 2.02-2.03× on battery (`docs/benchmarks/2026-09-27/serial-profile/README.md`). Report each increment's ceiling against the matching power-state baseline. ## 2. How a run is made diff --git a/docs/benchmarks/2026-09-26/README.md b/docs/benchmarks/2026-09-26/README.md index 90e19ac3..2573d38f 100644 --- a/docs/benchmarks/2026-09-26/README.md +++ b/docs/benchmarks/2026-09-26/README.md @@ -42,4 +42,5 @@ This measures the `_core.refine` call alone, with threads forced by Battery and AC agree to within about 7 % (the largest gap is the quarter circle at 7 threads: 0.258 s on AC against 0.241 s on battery), and they show the same ceiling. Roughly half of the single-thread refine time does not parallelise. That part is thought to be the serial insert -and flip phase, but it has not been profiled yet. +and flip phase, but it has not been profiled yet. (Later profiled: about a +third, mostly Lawson legalisation; `docs/benchmarks/2026-09-27/serial-profile/README.md`.) diff --git a/docs/benchmarks/2026-09-27/serial-profile/README.md b/docs/benchmarks/2026-09-27/serial-profile/README.md index d56c0eea..fde47030 100644 --- a/docs/benchmarks/2026-09-27/serial-profile/README.md +++ b/docs/benchmarks/2026-09-27/serial-profile/README.md @@ -36,7 +36,7 @@ a fix. "Some of the serial parts could be parallellized by multicoloring/dd tech That is inferred from byte counts; no hardware counters were read. 4. **Insertions in the same round are dense and overlap.** 41 rounds; 77 % of the 213,464 insertions fall in rounds 9-19, at 9,000-18,700 per round. In - rounds 5-21 each round touches 69-93 % of the 382 64×64-node blocks that ever receive an insertion (about 20 % of the quarter domain's ~1,776 blocks at most; the rest is flat sea or NoData, which refine never splits). + rounds 5-21 each round touches 69-93 % of the 382 64×64-node blocks that ever receive an insertion (about a fifth of the 64×64-node blocks that intersect `quarter.geojson`: 1,774-1,857 depending on the raster origin, counted by @reviewer with tifffile and shapely; that count is not committed. Refine never inserts into the rest; why, flat ground or NoData, is not checked). In rounds 11-29 the median distance to the nearest same-round insertion is 3 nodes. An insertion writes 5.5 triangle slots on average (p99 9) and reads or writes 11.0 (p99 18). 95 % of insertions share a slot, read or @@ -289,7 +289,7 @@ Over all rounds: - **Spread**: in rounds 5-25 each round touches 173-355 of the 382 blocks (45-93 %; 69-93 % in rounds 5-21). In the big rounds a block receives at most 154-248 insertions. In rounds 11-29 the median nearest-neighbour - distance is about 3 nodes (30 m; 4.0-8.6 in rounds 30-35); in round 1 it is 27 nodes. Insertions are + distance is about 3 nodes (30 m; 2.8-3.6 over those rounds, `data/rounds_t1.md`); in round 1 it is 27 nodes. Insertions are spread over all of the domain that refine works on (the 382 blocks above) at once, and they are close together. - **Footprint size**: write set mean 5.49 slots (p50 5, p90 7, p99 9, max 18). Footprint mean 10.96 (p50 10, p90 14, p99 18, max 36). Flips per diff --git a/docs/increments/21-parallel-refine.md b/docs/increments/21-parallel-refine.md index c287a356..bb61ac08 100644 --- a/docs/increments/21-parallel-refine.md +++ b/docs/increments/21-parallel-refine.md @@ -282,7 +282,7 @@ on nothing else from it: | scan imbalance at 8 threads | 16.5 of 61.8 ms | quick win 1 | | thread start per round | about 90 µs, 3.8 ms over 41 rounds | why options A-C need a thread team, not a spawn per step | | insertions per round | 77 % in rounds 9-19, 9,000-18,700 each | parallel slack per round | -| median distance to the nearest same-round insertion, round 11 on | about 3 nodes | independence at the finest grain is rare | +| median distance to the nearest same-round insertion, rounds 11-29 | about 3 nodes | independence at the finest grain is rare | | footprint (slots read or written) | mean 11.0, p99 18, max 36 | the size of a reservation | | write set | mean 5.5, p99 9 | slots appended and rewritten | | footprint conflict degree, big rounds 9-19 | mean 3.2-6.4 (7.7 in round 5) | expected winners per sub-round | @@ -765,9 +765,13 @@ Each is answered or placed. ## 7. Proposed increments, LOC and invariant-critical suites Counted in `CLAUDE.md` §2's unit. Estimates, not measurements; the worst -overrun recorded so far is +86 % (6a, `06-cdt-viewer.md`); the table gives -each at +66 % (increment 17). At +86 % the conclusions hold: A1 (~450) comes -to ~840 and is split in any case; C (~320) comes to ~595, still under 700. +overrun recorded so far is +99 % for a whole increment (6a shipped 467 lines +against ~235, `06-cdt-viewer.md:626`) and +116 % for one file (`scene.py`, +`05b-noder-driver.md:379-382`); the table gives each at +66 % (increment 17). +At +99 % the conclusions hold: A1 (~450) comes to ~895 and is split in any +case; C (~320) comes to ~636, under 700. The per-file factor does not apply to +a whole increment, but at +116 % C would be ~691, only just under, so 21d on C +is worth counting early. | increment | what | est. | at +66 % | determinism | invariant-critical suite (mutation round) | |---|---|---|---|---|---|