[{"data":1,"prerenderedAt":887},["ShallowReactive",2],{"navigation":3,"\u002Fresources\u002Fbenchmarks\u002Fcontributing":174,"\u002Fresources\u002Fbenchmarks\u002Fcontributing-surround":882},[4,8,101,165,170],{"title":5,"path":6,"stem":7},"Getting started","\u002Fgetting-started","1.getting-started",{"title":9,"path":10,"stem":11,"children":12},"Algorithms","\u002Falgorithms","2.algorithms",[13,15,58],{"title":9,"path":10,"stem":14},"2.algorithms\u002Findex",{"title":16,"path":17,"stem":18,"children":19},"Assignment","\u002Falgorithms\u002Fassignment","2.algorithms\u002F1.assignment\u002Findex",[20,21,25,29,32,36,40],{"title":16,"path":17,"stem":18},{"title":22,"path":23,"stem":24},"Quickstart","\u002Falgorithms\u002Fassignment\u002Fquickstart","2.algorithms\u002F1.assignment\u002F1.quickstart",{"title":26,"path":27,"stem":28},"Tracking","\u002Falgorithms\u002Fassignment\u002Ftracking","2.algorithms\u002F1.assignment\u002F2.tracking",{"title":9,"path":30,"stem":31},"\u002Falgorithms\u002Fassignment\u002Falgorithms","2.algorithms\u002F1.assignment\u002F3.algorithms",{"title":33,"path":34,"stem":35},"Reference","\u002Falgorithms\u002Fassignment\u002Freference","2.algorithms\u002F1.assignment\u002F4.reference",{"title":37,"path":38,"stem":39},"Choosing","\u002Falgorithms\u002Fassignment\u002Fchoosing","2.algorithms\u002F1.assignment\u002F5.choosing",{"title":41,"path":42,"stem":43,"children":44},"Tutorials","\u002Falgorithms\u002Fassignment\u002Ftutorials","2.algorithms\u002F1.assignment\u002F6.tutorials\u002Findex",[45,46,50,54],{"title":41,"path":42,"stem":43},{"title":47,"path":48,"stem":49},"Fundamentals","\u002Falgorithms\u002Fassignment\u002Ftutorials\u002Ffundamentals","2.algorithms\u002F1.assignment\u002F6.tutorials\u002F1.fundamentals",{"title":51,"path":52,"stem":53},"Backends","\u002Falgorithms\u002Fassignment\u002Ftutorials\u002Fbackends","2.algorithms\u002F1.assignment\u002F6.tutorials\u002F2.backends",{"title":55,"path":56,"stem":57},"Object tracking","\u002Falgorithms\u002Fassignment\u002Ftutorials\u002Ftracking","2.algorithms\u002F1.assignment\u002F6.tutorials\u002F3.tracking",{"title":59,"path":60,"stem":61,"children":62},"Transport","\u002Falgorithms\u002Ftransport","2.algorithms\u002F2.transport\u002Findex",[63,64,67,71,74,77,80,84],{"title":59,"path":60,"stem":61},{"title":22,"path":65,"stem":66},"\u002Falgorithms\u002Ftransport\u002Fquickstart","2.algorithms\u002F2.transport\u002F1.quickstart",{"title":68,"path":69,"stem":70},"Point-cloud tutorial","\u002Falgorithms\u002Ftransport\u002Fpoint-clouds","2.algorithms\u002F2.transport\u002F2.point-clouds",{"title":9,"path":72,"stem":73},"\u002Falgorithms\u002Ftransport\u002Falgorithms","2.algorithms\u002F2.transport\u002F3.algorithms",{"title":33,"path":75,"stem":76},"\u002Falgorithms\u002Ftransport\u002Freference","2.algorithms\u002F2.transport\u002F4.reference",{"title":37,"path":78,"stem":79},"\u002Falgorithms\u002Ftransport\u002Fchoosing","2.algorithms\u002F2.transport\u002F5.choosing",{"title":81,"path":82,"stem":83},"Building","\u002Falgorithms\u002Ftransport\u002Fbuilding","2.algorithms\u002F2.transport\u002F6.building",{"title":41,"path":85,"stem":86,"children":87},"\u002Falgorithms\u002Ftransport\u002Ftutorials","2.algorithms\u002F2.transport\u002F7.tutorials\u002Findex",[88,89,93,97],{"title":41,"path":85,"stem":86},{"title":90,"path":91,"stem":92},"Optimal transport","\u002Falgorithms\u002Ftransport\u002Ftutorials\u002Foptimal-transport","2.algorithms\u002F2.transport\u002F7.tutorials\u002F1.optimal-transport",{"title":94,"path":95,"stem":96},"Sinkhorn","\u002Falgorithms\u002Ftransport\u002Ftutorials\u002Fsinkhorn","2.algorithms\u002F2.transport\u002F7.tutorials\u002F2.sinkhorn",{"title":98,"path":99,"stem":100},"Point clouds","\u002Falgorithms\u002Ftransport\u002Ftutorials\u002Fpoint-clouds","2.algorithms\u002F2.transport\u002F7.tutorials\u002F3.point-clouds",{"title":102,"path":103,"stem":104,"children":105},"Resources","\u002Fresources","3.resources",[106,108,147,151,155],{"title":102,"path":103,"stem":107},"3.resources\u002Findex",{"title":41,"path":109,"stem":110,"children":111},"\u002Fresources\u002Ftutorials","3.resources\u002F1.tutorials\u002Findex",[112,113,131],{"title":41,"path":109,"stem":110},{"title":16,"path":114,"stem":115,"children":116,"page":130},"\u002Fresources\u002Ftutorials\u002Fassignment","3.resources\u002F1.tutorials\u002Fassignment",[117,122,126],{"title":118,"path":119,"stem":120,"icon":121},"Tutorial 1 — The Assignment Problem","\u002Fresources\u002Ftutorials\u002Fassignment\u002F01_the_assignment_problem","3.resources\u002F1.tutorials\u002Fassignment\u002F01_the_assignment_problem","i-lucide-notebook",{"title":123,"path":124,"stem":125,"icon":121},"Tutorial 2 — Backends and Batching","\u002Fresources\u002Ftutorials\u002Fassignment\u002F02_backends_and_batching","3.resources\u002F1.tutorials\u002Fassignment\u002F02_backends_and_batching",{"title":127,"path":128,"stem":129,"icon":121},"Tutorial 3 — Object Tracking with the Assignment Problem","\u002Fresources\u002Ftutorials\u002Fassignment\u002F03_object_tracking","3.resources\u002F1.tutorials\u002Fassignment\u002F03_object_tracking",false,{"title":59,"path":132,"stem":133,"children":134,"page":130},"\u002Fresources\u002Ftutorials\u002Ftransport","3.resources\u002F1.tutorials\u002Ftransport",[135,139,143],{"title":136,"path":137,"stem":138,"icon":121},"Tutorial 1 — What Is Optimal Transport?","\u002Fresources\u002Ftutorials\u002Ftransport\u002F01_optimal_transport","3.resources\u002F1.tutorials\u002Ftransport\u002F01_optimal_transport",{"title":140,"path":141,"stem":142,"icon":121},"Tutorial 2 — The Sinkhorn Algorithm","\u002Fresources\u002Ftutorials\u002Ftransport\u002F02_sinkhorn_algorithm","3.resources\u002F1.tutorials\u002Ftransport\u002F02_sinkhorn_algorithm",{"title":144,"path":145,"stem":146,"icon":121},"Tutorial 3 — Point-Cloud OT and Shape Learning","\u002Fresources\u002Ftutorials\u002Ftransport\u002F03_point_clouds","3.resources\u002F1.tutorials\u002Ftransport\u002F03_point_clouds",{"title":148,"path":149,"stem":150},"Assignment applications","\u002Fresources\u002Fassignment-applications","3.resources\u002F2.assignment-applications",{"title":152,"path":153,"stem":154},"Transport applications","\u002Fresources\u002Ftransport-applications","3.resources\u002F3.transport-applications",{"title":156,"path":157,"stem":158,"children":159},"Benchmarks","\u002Fresources\u002Fbenchmarks","3.resources\u002F4.benchmarks\u002Findex",[160,161],{"title":156,"path":157,"stem":158},{"title":162,"path":163,"stem":164},"Contributing benchmarks","\u002Fresources\u002Fbenchmarks\u002Fcontributing","3.resources\u002F4.benchmarks\u002Fcontributing",{"title":166,"path":167,"stem":168,"icon":169},"API Reference","\u002Fapi","4.api","i-lucide-package",{"title":171,"path":172,"stem":173},"References","\u002Freferences","5.references",{"id":175,"title":162,"api":176,"body":177,"description":877,"extension":878,"links":176,"meta":879,"navigation":176,"path":163,"seo":880,"stem":164,"__hash__":881},"docs\u002F3.resources\u002F4.benchmarks\u002Fcontributing.md",null,{"type":178,"value":179,"toc":868},"minimark",[180,184,187,214,223,228,250,285,296,317,321,345,377,384,406,409,413,433,444,452,471,474,478,495,501,504,577,580,624,638,642,645,685,692,706,710,783,797,800,846,857,861,864],[181,182,183],"p",{},"The benchmark page aggregates pytest-benchmark runs contributed by\nusers. If you have CPU or CUDA hardware not yet represented, running\nthe suite and opening a PR with the result is a useful contribution.\nThe contribution process requires no maintainer review beyond a quick sanity-check of the submitted JSON file.",[181,185,186],{},"The suite covers three files:",[188,189,190,198,204],"ul",{},[191,192,193,197],"li",{},[194,195,196],"code",{},"benchmark_single.py"," — single-problem assignment solvers (Jonker-Volgenant, Munkres, and Lawler variants)",[191,199,200,203],{},[194,201,202],{},"benchmark_batched.py"," — batched assignment ops",[191,205,206,209,210,213],{},[194,207,208],{},"benchmark_transport.py"," — optimal-transport solvers (Sinkhorn-family backends on CPU\u002FCUDA;\nthe ",[194,211,212],{},"samples.loss"," point-cloud solver, GPU only)",[181,215,216,217,222],{},"Two ways to run it: with Nix (below), or without Nix at all via a\nprebuilt container image — see ",[218,219,221],"a",{"href":220},"#without-nix-apptainer-hpc","Without Nix",",\nuseful on HPC login\u002Fcompute nodes where installing Nix isn't practical.",[224,225,227],"h2",{"id":226},"prerequisites","Prerequisites",[188,229,230,240,247],{},[191,231,232,233,239],{},"A clone of ",[218,234,238],{"href":235,"rel":236},"https:\u002F\u002Fgithub.com\u002Ftue-p8n\u002Ftorchmatch",[237],"nofollow","torchmatch",".",[191,241,242,243,246],{},"Python 3.13 and ",[194,244,245],{},"uv"," (or any virtualenv tool).",[191,248,249],{},"A working torchmatch install:",[251,252,257],"pre",{"className":253,"code":254,"language":255,"meta":256,"style":256},"language-bash shiki shiki-themes material-theme-lighter github-light github-dark","uv sync --extra cu128 --all-groups  # or --extra cpu \u002F cu126 \u002F cu130\n","bash","",[194,258,259],{"__ignoreMap":256},[260,261,264,267,271,275,278,281],"span",{"class":262,"line":263},"line",1,[260,265,245],{"class":266},"sbgvK",[260,268,270],{"class":269},"s_sjI"," sync",[260,272,274],{"class":273},"stzsN"," --extra",[260,276,277],{"class":269}," cu128",[260,279,280],{"class":273}," --all-groups",[260,282,284],{"class":283},"sutJx","  # or --extra cpu \u002F cu126 \u002F cu130\n",[181,286,287,288,291,292,295],{},"The ",[194,289,290],{},"bench"," dependency group includes ",[194,293,294],{},"py-cpuinfo",", which the machine-registration step uses to read your CPU model. Install it with:",[251,297,299],{"className":253,"code":298,"language":255,"meta":256,"style":256},"uv sync --extra cu128 --group bench\n",[194,300,301],{"__ignoreMap":256},[260,302,303,305,307,309,311,314],{"class":262,"line":263},[260,304,245],{"class":266},[260,306,270],{"class":269},[260,308,274],{"class":273},[260,310,277],{"class":269},[260,312,313],{"class":273}," --group",[260,315,316],{"class":269}," bench\n",[224,318,320],{"id":319},"one-time-register-your-machine","One-time: register your machine",[251,322,324],{"className":253,"code":323,"language":255,"meta":256,"style":256},"uv run python -m torchmatch.bench init-machine\n",[194,325,326],{"__ignoreMap":256},[260,327,328,330,333,336,339,342],{"class":262,"line":263},[260,329,245],{"class":266},[260,331,332],{"class":269}," run",[260,334,335],{"class":269}," python",[260,337,338],{"class":273}," -m",[260,340,341],{"class":269}," torchmatch.bench",[260,343,344],{"class":269}," init-machine\n",[181,346,347,348,351,352,355,356,355,359,355,362,365,366,355,369,372,373,376],{},"This auto-detects your CPU, GPU, and RAM, then prompts for a\n",[194,349,350],{},"machine_type"," (one of ",[194,353,354],{},"workstation",", ",[194,357,358],{},"server",[194,360,361],{},"hpc",[194,363,364],{},"laptop",",\n",[194,367,368],{},"mobile",[194,370,371],{},"edge",") and an optional GitHub handle (displayed next to your results on the benchmark page as credit). It writes\n",[194,374,375],{},"benchmarks\u002Fresults\u002F\u003Cslug>\u002Fmachine.json"," and prints the slug.",[181,378,379,380,383],{},"The slug is ",[194,381,382],{},"{machine_type}_{cpu}_{gpu}",", lowercased with spaces replaced by hyphens — for example:",[188,385,386,391,396,401],{},[191,387,388],{},[194,389,390],{},"laptop_intel-i7-12700h_nvidia-rtx-a1000",[191,392,393],{},[194,394,395],{},"workstation_amd-9950x_nvidia-rtx-4090",[191,397,398],{},[194,399,400],{},"server_intel-xeon-platinum-8480_nvidia-h100",[191,402,403],{},[194,404,405],{},"laptop_apple-m3-max_cpu-only",[181,407,408],{},"If someone has already submitted results for the same hardware, your new run is stored alongside theirs under the same slug directory; the timestamp in the filename keeps each run separate.",[224,410,412],{"id":411},"per-release-collect-a-run","Per-release: collect a run",[251,414,416],{"className":253,"code":415,"language":255,"meta":256,"style":256},"uv run python -m torchmatch.bench collect\n",[194,417,418],{"__ignoreMap":256},[260,419,420,422,424,426,428,430],{"class":262,"line":263},[260,421,245],{"class":266},[260,423,332],{"class":269},[260,425,335],{"class":269},[260,427,338],{"class":273},[260,429,341],{"class":269},[260,431,432],{"class":269}," collect\n",[181,434,435,436,439,440,443],{},"This runs ",[194,437,438],{},"tests\u002Fbenchmark_single.py"," + ",[194,441,442],{},"tests\u002Fbenchmark_batched.py","\nthrough pytest-benchmark, strips your hostname and OS kernel version string from the JSON, and writes the result to:",[251,445,450],{"className":446,"code":448,"language":449},[447],"language-text","benchmarks\u002Fresults\u002F\u003Cslug>\u002Ftorchmatch-\u003Cversion>+py\u003CX.Y>+torch\u003CX.Y>+\u003Cvariant>-\u003Cutc-timestamp>Z.json\n","text",[194,451,448],{"__ignoreMap":256},[181,453,454,457,458,355,461,355,464,355,467,470],{},[194,455,456],{},"\u003Cvariant>"," is one of ",[194,459,460],{},"cpu",[194,462,463],{},"cu126",[194,465,466],{},"cu128",[194,468,469],{},"cu130"," and matches\nyour installed PyTorch wheel.",[181,472,473],{},"A full sweep takes 10 to 30 minutes depending on the box.",[224,475,477],{"id":476},"without-nix-apptainer-hpc","Without Nix (Apptainer \u002F HPC)",[181,479,480,481,486,487,490,491,494],{},"On a shared HPC login\u002Fcompute node where installing Nix isn't practical,\npull the prebuilt image and run it with ",[218,482,485],{"href":483,"rel":484},"https:\u002F\u002Fapptainer.org",[237],"Apptainer","\ninstead — no Nix, no root, no daemon. The image is rebuilt from ",[194,488,489],{},"main","\non every push that touches the solver sources or tests (see\n",[194,492,493],{},".github\u002Fworkflows\u002Fbench-image.yml","), so pull again before a new run to\npick up changes.",[181,496,497,500],{},[194,498,499],{},"--pwd \u002Fapp"," is required on every invocation below: Apptainer preserves\nyour shell's own working directory by default, which silently writes\nresults outside the bind mount instead of into it.",[181,502,503],{},"One-time machine registration:",[251,505,507],{"className":253,"code":506,"language":255,"meta":256,"style":256},"mkdir -p benchmarks\u002Fresults\napptainer run --nv --pwd \u002Fapp \\\n  --bind \"$PWD\u002Fbenchmarks\u002Fresults:\u002Fapp\u002Fbenchmarks\u002Fresults\" \\\n  docker:\u002F\u002Fghcr.io\u002Ftue-p8n\u002Ftorchmatch\u002Fbench:latest \\\n  init-machine\n",[194,508,509,520,541,563,571],{"__ignoreMap":256},[260,510,511,514,517],{"class":262,"line":263},[260,512,513],{"class":266},"mkdir",[260,515,516],{"class":273}," -p",[260,518,519],{"class":269}," benchmarks\u002Fresults\n",[260,521,523,526,528,531,534,537],{"class":262,"line":522},2,[260,524,525],{"class":266},"apptainer",[260,527,332],{"class":269},[260,529,530],{"class":273}," --nv",[260,532,533],{"class":273}," --pwd",[260,535,536],{"class":269}," \u002Fapp",[260,538,540],{"class":539},"s_hVV"," \\\n",[260,542,544,547,551,555,558,561],{"class":262,"line":543},3,[260,545,546],{"class":273},"  --bind",[260,548,550],{"class":549},"sjJ54"," \"",[260,552,554],{"class":553},"su5hD","$PWD",[260,556,557],{"class":269},"\u002Fbenchmarks\u002Fresults:\u002Fapp\u002Fbenchmarks\u002Fresults",[260,559,560],{"class":549},"\"",[260,562,540],{"class":539},[260,564,566,569],{"class":262,"line":565},4,[260,567,568],{"class":269},"  docker:\u002F\u002Fghcr.io\u002Ftue-p8n\u002Ftorchmatch\u002Fbench:latest",[260,570,540],{"class":539},[260,572,574],{"class":262,"line":573},5,[260,575,576],{"class":269},"  init-machine\n",[181,578,579],{},"Per-release collection:",[251,581,583],{"className":253,"code":582,"language":255,"meta":256,"style":256},"apptainer run --nv --pwd \u002Fapp \\\n  --bind \"$PWD\u002Fbenchmarks\u002Fresults:\u002Fapp\u002Fbenchmarks\u002Fresults\" \\\n  docker:\u002F\u002Fghcr.io\u002Ftue-p8n\u002Ftorchmatch\u002Fbench:latest \\\n  collect\n",[194,584,585,599,613,619],{"__ignoreMap":256},[260,586,587,589,591,593,595,597],{"class":262,"line":263},[260,588,525],{"class":266},[260,590,332],{"class":269},[260,592,530],{"class":273},[260,594,533],{"class":273},[260,596,536],{"class":269},[260,598,540],{"class":539},[260,600,601,603,605,607,609,611],{"class":262,"line":522},[260,602,546],{"class":273},[260,604,550],{"class":549},[260,606,554],{"class":553},[260,608,557],{"class":269},[260,610,560],{"class":549},[260,612,540],{"class":539},[260,614,615,617],{"class":262,"line":543},[260,616,568],{"class":269},[260,618,540],{"class":539},[260,620,621],{"class":262,"line":565},[260,622,623],{"class":269},"  collect\n",[181,625,626,627,630,631,634,635,637],{},"Same CLI, same output layout, same scrubbing, same 10–30 minute\nruntime as the Nix path above — ",[194,628,629],{},"--nv"," maps the host's NVIDIA driver\ninto the container at runtime, so no CUDA toolkit install is needed on\nthe host itself. Docker with ",[194,632,633],{},"--gpus all"," works too, provided the\nNVIDIA Container Toolkit is set up on that host (Apptainer's ",[194,636,629],{},"\nneeds no such extra toolkit — it's the more portable option on a\ncluster you don't administer).",[224,639,641],{"id":640},"what-gets-scrubbed","What gets scrubbed",[181,643,644],{},"The CLI strips the following from the pytest-benchmark JSON before\nwriting:",[188,646,647,653,659,665,671],{},[191,648,649,652],{},[194,650,651],{},"machine_info.node"," (hostname).",[191,654,655,658],{},[194,656,657],{},"machine_info.release"," (kernel release; often unique per host).",[191,660,661,664],{},[194,662,663],{},"machine_info.cpu.hardware_raw"," (occasionally contains hostname-ish\ndata).",[191,666,667,668,239],{},"Any other string in the JSON that matches your hostname is rewritten\nto ",[194,669,670],{},"\u003Chost>",[191,672,673,676,677,680,681,684],{},[194,674,675],{},"commit_info"," block (present only if you ran pytest-benchmark with ",[194,678,679],{},"--benchmark-save"," directly, rather than through the ",[194,682,683],{},"torchmatch.bench collect"," wrapper).",[181,686,687,688,691],{},"The CPU brand (e.g. ",[194,689,690],{},"12th Gen Intel(R) Core(TM) i7-12700H","), Python\nversion, and PyTorch version are kept. They are not personally\nidentifying and they are necessary for the report.",[181,693,694,695,355,698,701,702,705],{},"You should inspect the JSON yourself before opening the PR. The\nvalidation CI run will also re-check that no ",[194,696,697],{},"node",[194,699,700],{},"release",",\nor ",[194,703,704],{},"\u002Fhome\u002F\u003Cuser>"," fragments remain.",[224,707,709],{"id":708},"commit-and-push","Commit and push",[251,711,713],{"className":253,"code":712,"language":255,"meta":256,"style":256},"git add benchmarks\u002Fresults\u002F\u003Cslug>\u002F\ngit commit -m \"bench: contribute results for \u003Cslug>\"\ngit fetch origin main\ngit push origin main\n",[194,714,715,742,759,772],{"__ignoreMap":256},[260,716,717,720,723,726,730,733,736,739],{"class":262,"line":263},[260,718,719],{"class":266},"git",[260,721,722],{"class":269}," add",[260,724,725],{"class":269}," benchmarks\u002Fresults\u002F",[260,727,729],{"class":728},"smGrS","\u003C",[260,731,732],{"class":269},"slu",[260,734,735],{"class":553},"g",[260,737,738],{"class":728},">",[260,740,741],{"class":269},"\u002F\n",[260,743,744,746,749,751,753,756],{"class":262,"line":522},[260,745,719],{"class":266},[260,747,748],{"class":269}," commit",[260,750,338],{"class":273},[260,752,550],{"class":549},[260,754,755],{"class":269},"bench: contribute results for \u003Cslug>",[260,757,758],{"class":549},"\"\n",[260,760,761,763,766,769],{"class":262,"line":543},[260,762,719],{"class":266},[260,764,765],{"class":269}," fetch",[260,767,768],{"class":269}," origin",[260,770,771],{"class":269}," main\n",[260,773,774,776,779,781],{"class":262,"line":565},[260,775,719],{"class":266},[260,777,778],{"class":269}," push",[260,780,768],{"class":269},[260,782,771],{"class":269},[181,784,785,786,788,789,792,793,796],{},"Push directly to ",[194,787,489],{}," — this repo doesn't use PRs for contributions.\nCommit only files under ",[194,790,791],{},"benchmarks\u002Fresults\u002F",". The benchmark page is\nrebuilt automatically on the next docs deploy, and ",[194,794,795],{},"benchmark-validate","\nruns on the push itself to catch scrubbing\u002Fformat mistakes.",[181,798,799],{},"Before pushing, double check:",[188,801,804,817,827,836],{"className":802},[803],"contains-task-list",[191,805,808,813,814,239],{"className":806},[807],"task-list-item",[809,810],"input",{"disabled":811,"type":812},true,"checkbox"," All new files are under ",[194,815,816],{},"benchmarks\u002Fresults\u002F\u003Cexisting-or-new-slug>\u002F",[191,818,820,822,823,826],{"className":819},[807],[809,821],{"disabled":811,"type":812}," If a new slug appears, it ships a ",[194,824,825],{},"machine.json"," alongside.",[191,828,830,832,833,239],{"className":829},[807],[809,831],{"disabled":811,"type":812}," Filename matches\n",[194,834,835],{},"torchmatch-\u003CX.Y.Z>+py\u003CX.Y>+torch\u003CX.Y>+\u003Cvariant>-\u003CYYYYMMDDTHHMMSSZ>.json",[191,837,839,841,842,845],{"className":838},[807],[809,840],{"disabled":811,"type":812}," No file outside ",[194,843,844],{},"benchmarks\u002Fresults\u002F**"," is staged.",[181,847,848,849,852,853,856],{},"Or just run ",[194,850,851],{},"nix run .#bench-validate"," (or, without Nix, ",[194,854,855],{},"python scripts\u002Fbenchmark_validate.py benchmarks\u002Fresults",") before committing —\nthe same check CI runs.",[224,858,860],{"id":859},"re-running-on-the-same-machine","Re-running on the same machine",[181,862,863],{},"Re-running after a torchmatch release simply produces a new\ntimestamped file under the same slug. Old runs are not deleted; the\naggregator picks all of them up and the charts show every run.",[865,866,867],"style",{},"html pre.shiki code .sbgvK, html code.shiki .sbgvK{--shiki-light:#E2931D;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .s_sjI, html code.shiki .s_sjI{--shiki-light:#91B859;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .stzsN, html code.shiki .stzsN{--shiki-light:#91B859;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sutJx, html code.shiki .sutJx{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#6A737D;--shiki-default-font-style:inherit;--shiki-dark:#6A737D;--shiki-dark-font-style:inherit}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .s_hVV, html code.shiki .s_hVV{--shiki-light:#90A4AE;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sjJ54, html code.shiki .sjJ54{--shiki-light:#39ADB5;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .su5hD, html code.shiki .su5hD{--shiki-light:#90A4AE;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .smGrS, html code.shiki .smGrS{--shiki-light:#39ADB5;--shiki-default:#D73A49;--shiki-dark:#F97583}",{"title":256,"searchDepth":543,"depth":543,"links":869},[870,871,872,873,874,875,876],{"id":226,"depth":522,"text":227},{"id":319,"depth":522,"text":320},{"id":411,"depth":522,"text":412},{"id":476,"depth":522,"text":477},{"id":640,"depth":522,"text":641},{"id":708,"depth":522,"text":709},{"id":859,"depth":522,"text":860},"Run the torchmatch benchmark suite on your hardware and submit the result via PR.","md",{},{"title":162,"description":877},"mfnAxyHNNEzorqcHzKpaeEroRzCb34n9L6WvKxB-FOM",[883,885],{"title":156,"path":157,"stem":158,"description":884,"children":-1},"Per-op benchmark sweep across problem sizes, dtypes, and devices — covering assignment (single-problem, batched) and transport (matrix-face Sinkhorn\u002FEMD, samples-face Triton) ops.",{"title":166,"path":167,"stem":168,"description":886,"icon":169,"children":-1},"Auto-generated API reference for the torchmatch package, generated directly from its docstrings and type hints.",1785218163176]