[{"data":1,"prerenderedAt":2901},["ShallowReactive",2],{"navigation":3,"\u002Fresources\u002Ftutorials\u002Fassignment\u002F02_backends_and_batching":174,"\u002Fresources\u002Ftutorials\u002Fassignment\u002F02_backends_and_batching-surround":2898},[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":123,"api":176,"body":177,"description":190,"extension":2893,"links":176,"meta":2894,"navigation":2895,"path":124,"seo":2896,"stem":125,"__hash__":2897},"docs\u002F3.resources\u002F1.tutorials\u002Fassignment\u002F02_backends_and_batching.md",null,{"type":178,"value":179,"toc":2883},"minimark",[180,184,191,207,218,491,496,501,511,597,605,861,864,868,875,1044,1047,1050,1054,1065,1713,1719,1723,1737,1912,1915,1920,1923,1935,1941,2180,2183,2311,2314,2318,2331,2337,2828,2831,2835,2868,2879],[181,182,123],"h1",{"id":183},"tutorial-2-backends-and-batching",[185,186,187],"p",{},[188,189,190],"strong",{},"What you will learn",[192,193,194,198,201,204],"ul",{},[195,196,197],"li",{},"The different solvers (backends) torchmatch ships and when each wins",[195,199,200],{},"How to solve a batch of problems at once with a 3-D cost tensor",[195,202,203],{},"The unpacked output format for tracking pipelines",[195,205,206],{},"GPU vs CPU: when crossing the device boundary is worth it",[185,208,209,212,213,217],{},[188,210,211],{},"Prerequisites"," — Tutorial 1, or familiarity with ",[214,215,216],"code",{},"torchmatch.assignment.solve",".",[219,220,225],"pre",{"className":221,"code":222,"language":223,"meta":224,"style":224},"language-python shiki shiki-themes material-theme-lighter github-light github-dark","%matplotlib inline\nimport time\n\nimport matplotlib.pyplot as plt\nimport numpy as np\nimport torch\nimport torchmatch\nfrom torchmatch.assignment import Backend\n\nplt.rcParams.update({\"figure.dpi\": 120, \"font.size\": 11})\nCUDA = torch.cuda.is_available()\ndevice_label = \"CUDA\" if CUDA else \"CPU only\"\nprint(f\"torchmatch {torchmatch.__version__}  |  CUDA available: {CUDA}\")\n","python","",[214,226,227,240,250,257,278,292,300,308,327,332,388,414,446],{"__ignoreMap":224},[228,229,232,236],"span",{"class":230,"line":231},"line",1,[228,233,235],{"class":234},"smGrS","%",[228,237,239],{"class":238},"su5hD","matplotlib inline\n",[228,241,243,247],{"class":230,"line":242},2,[228,244,246],{"class":245},"sVHd0","import",[228,248,249],{"class":238}," time\n",[228,251,253],{"class":230,"line":252},3,[228,254,256],{"emptyLinePlaceholder":255},true,"\n",[228,258,260,262,265,268,272,275],{"class":230,"line":259},4,[228,261,246],{"class":245},[228,263,264],{"class":238}," matplotlib",[228,266,217],{"class":267},"sP7_E",[228,269,271],{"class":270},"skxfh","pyplot",[228,273,274],{"class":245}," as",[228,276,277],{"class":238}," plt\n",[228,279,281,283,286,289],{"class":230,"line":280},5,[228,282,246],{"class":245},[228,284,285],{"class":238}," numpy ",[228,287,288],{"class":245},"as",[228,290,291],{"class":238}," np\n",[228,293,295,297],{"class":230,"line":294},6,[228,296,246],{"class":245},[228,298,299],{"class":238}," torch\n",[228,301,303,305],{"class":230,"line":302},7,[228,304,246],{"class":245},[228,306,307],{"class":238}," torchmatch\n",[228,309,311,314,317,319,322,324],{"class":230,"line":310},8,[228,312,313],{"class":245},"from",[228,315,316],{"class":238}," torchmatch",[228,318,217],{"class":267},[228,320,321],{"class":238},"assignment ",[228,323,246],{"class":245},[228,325,326],{"class":238}," Backend\n",[228,328,330],{"class":230,"line":329},9,[228,331,256],{"emptyLinePlaceholder":255},[228,333,335,338,340,343,345,349,352,356,360,362,365,369,372,375,378,380,382,385],{"class":230,"line":334},10,[228,336,337],{"class":238},"plt",[228,339,217],{"class":267},[228,341,342],{"class":270},"rcParams",[228,344,217],{"class":267},[228,346,348],{"class":347},"slqww","update",[228,350,351],{"class":267},"({",[228,353,355],{"class":354},"sjJ54","\"",[228,357,359],{"class":358},"s_sjI","figure.dpi",[228,361,355],{"class":354},[228,363,364],{"class":267},":",[228,366,368],{"class":367},"srdBf"," 120",[228,370,371],{"class":267},",",[228,373,374],{"class":354}," \"",[228,376,377],{"class":358},"font.size",[228,379,355],{"class":354},[228,381,364],{"class":267},[228,383,384],{"class":367}," 11",[228,386,387],{"class":267},"})\n",[228,389,391,395,398,401,403,406,408,411],{"class":230,"line":390},11,[228,392,394],{"class":393},"s_hVV","CUDA",[228,396,397],{"class":234}," =",[228,399,400],{"class":238}," torch",[228,402,217],{"class":267},[228,404,405],{"class":270},"cuda",[228,407,217],{"class":267},[228,409,410],{"class":347},"is_available",[228,412,413],{"class":267},"()\n",[228,415,417,420,423,425,427,429,432,435,438,440,443],{"class":230,"line":416},12,[228,418,419],{"class":238},"device_label ",[228,421,422],{"class":234},"=",[228,424,374],{"class":354},[228,426,394],{"class":358},[228,428,355],{"class":354},[228,430,431],{"class":245}," if",[228,433,434],{"class":393}," CUDA",[228,436,437],{"class":245}," else",[228,439,374],{"class":354},[228,441,442],{"class":358},"CPU only",[228,444,445],{"class":354},"\"\n",[228,447,449,453,456,460,463,466,469,471,474,477,480,482,484,486,488],{"class":230,"line":448},13,[228,450,452],{"class":451},"sptTA","print",[228,454,455],{"class":267},"(",[228,457,459],{"class":458},"sbsja","f",[228,461,462],{"class":358},"\"torchmatch ",[228,464,465],{"class":367},"{",[228,467,468],{"class":347},"torchmatch",[228,470,217],{"class":267},[228,472,473],{"class":393},"__version__",[228,475,476],{"class":367},"}",[228,478,479],{"class":358},"  |  CUDA available: ",[228,481,465],{"class":367},[228,483,394],{"class":451},[228,485,476],{"class":367},[228,487,355],{"class":358},[228,489,490],{"class":267},")\n",[492,493],"docyard-notebook-output",{"data":494,"kind":495},"dG9yY2htYXRjaCAxLjAuMCAgfCAgQ1VEQSBhdmFpbGFibGU6IFRydWUK","stream",[497,498,500],"h2",{"id":499},"_1-the-auto-dispatcher","1  The AUTO dispatcher",[185,502,503,506,507,510],{},[214,504,505],{},"torchmatch.assignment.solve(cost)"," uses ",[214,508,509],{},"Backend.AUTO"," by default.\nAUTO inspects the input at call time — device, shape, problem size — and\npicks the fastest registered op.",[512,513,514,527],"table",{},[515,516,517],"thead",{},[518,519,520,524],"tr",{},[521,522,523],"th",{},"Situation",[521,525,526],{},"AUTO picks",[528,529,530,542,553,564,575,586],"tbody",{},[518,531,532,536],{},[533,534,535],"td",{},"CPU, N×M ≤ 64",[533,537,538,541],{},[214,539,540],{},"jonker_scalar"," (sequential, zero overhead)",[518,543,544,547],{},[533,545,546],{},"CPU, square, smooth",[533,548,549,552],{},[214,550,551],{},"jonker_compact"," (AVX2-gather)",[518,554,555,558],{},[533,556,557],{},"CPU, rectangular or large",[533,559,560,563],{},[214,561,562],{},"jonker_dense"," (AVX2 flat-pointer)",[518,565,566,569],{},[533,567,568],{},"CUDA, N \u003C 32",[533,570,571,574],{},[214,572,573],{},"munkres"," (single-path Hungarian)",[518,576,577,580],{},[533,578,579],{},"CUDA, N ≥ 32",[533,581,582,585],{},[214,583,584],{},"lawler"," (parallel BFS Hungarian)",[518,587,588,591],{},[533,589,590],{},"CUDA, batched, K ≤ 64",[533,592,593,596],{},[214,594,595],{},"jonker_dense_batch"," CUDA backend",[185,598,599,600,604],{},"You rarely need to specify a backend explicitly.  The sections below show\n",[601,602,603],"em",{},"when"," explicit pinning is useful (benchmarking, debugging, or overriding a\nheuristic for a specific distribution).",[219,606,608],{"className":221,"code":607,"language":223,"meta":224,"style":224},"rng = np.random.default_rng(0)\nN = 64\n\ncost_cpu = torch.tensor(rng.random((N, N), dtype=np.float32))\n\n# AUTO selects the backend; solve() returns int64 row→col indices\nrow_to_col = torchmatch.assignment.solve(cost_cpu)\nprint(\"Shape:\", row_to_col.shape, \"  dtype:\", row_to_col.dtype)\ntotal_cost = cost_cpu[torch.arange(N), row_to_col].sum().item()\nprint(f\"Total cost (N={N}): {total_cost:.4f}\")\n",[214,609,610,637,647,651,705,709,715,741,784,827],{"__ignoreMap":224},[228,611,612,615,617,620,622,625,627,630,632,635],{"class":230,"line":231},[228,613,614],{"class":238},"rng ",[228,616,422],{"class":234},[228,618,619],{"class":238}," np",[228,621,217],{"class":267},[228,623,624],{"class":270},"random",[228,626,217],{"class":267},[228,628,629],{"class":347},"default_rng",[228,631,455],{"class":267},[228,633,634],{"class":367},"0",[228,636,490],{"class":267},[228,638,639,642,644],{"class":230,"line":242},[228,640,641],{"class":238},"N ",[228,643,422],{"class":234},[228,645,646],{"class":367}," 64\n",[228,648,649],{"class":230,"line":252},[228,650,256],{"emptyLinePlaceholder":255},[228,652,653,656,658,660,662,665,667,670,672,674,677,680,682,685,688,692,694,697,699,702],{"class":230,"line":259},[228,654,655],{"class":238},"cost_cpu ",[228,657,422],{"class":234},[228,659,400],{"class":238},[228,661,217],{"class":267},[228,663,664],{"class":347},"tensor",[228,666,455],{"class":267},[228,668,669],{"class":347},"rng",[228,671,217],{"class":267},[228,673,624],{"class":347},[228,675,676],{"class":267},"((",[228,678,679],{"class":347},"N",[228,681,371],{"class":267},[228,683,684],{"class":347}," N",[228,686,687],{"class":267},"),",[228,689,691],{"class":690},"s99_P"," dtype",[228,693,422],{"class":234},[228,695,696],{"class":347},"np",[228,698,217],{"class":267},[228,700,701],{"class":270},"float32",[228,703,704],{"class":267},"))\n",[228,706,707],{"class":230,"line":280},[228,708,256],{"emptyLinePlaceholder":255},[228,710,711],{"class":230,"line":294},[228,712,714],{"class":713},"sutJx","# AUTO selects the backend; solve() returns int64 row→col indices\n",[228,716,717,720,722,724,726,729,731,734,736,739],{"class":230,"line":302},[228,718,719],{"class":238},"row_to_col ",[228,721,422],{"class":234},[228,723,316],{"class":238},[228,725,217],{"class":267},[228,727,728],{"class":270},"assignment",[228,730,217],{"class":267},[228,732,733],{"class":347},"solve",[228,735,455],{"class":267},[228,737,738],{"class":347},"cost_cpu",[228,740,490],{"class":267},[228,742,743,745,747,749,752,754,756,759,761,764,766,768,771,773,775,777,779,782],{"class":230,"line":310},[228,744,452],{"class":451},[228,746,455],{"class":267},[228,748,355],{"class":354},[228,750,751],{"class":358},"Shape:",[228,753,355],{"class":354},[228,755,371],{"class":267},[228,757,758],{"class":347}," row_to_col",[228,760,217],{"class":267},[228,762,763],{"class":270},"shape",[228,765,371],{"class":267},[228,767,374],{"class":354},[228,769,770],{"class":358},"  dtype:",[228,772,355],{"class":354},[228,774,371],{"class":267},[228,776,758],{"class":347},[228,778,217],{"class":267},[228,780,781],{"class":270},"dtype",[228,783,490],{"class":267},[228,785,786,789,791,794,797,800,802,805,807,809,811,813,816,819,822,825],{"class":230,"line":329},[228,787,788],{"class":238},"total_cost ",[228,790,422],{"class":234},[228,792,793],{"class":238}," cost_cpu",[228,795,796],{"class":267},"[",[228,798,799],{"class":238},"torch",[228,801,217],{"class":267},[228,803,804],{"class":347},"arange",[228,806,455],{"class":267},[228,808,679],{"class":347},[228,810,687],{"class":267},[228,812,758],{"class":238},[228,814,815],{"class":267},"].",[228,817,818],{"class":347},"sum",[228,820,821],{"class":267},"().",[228,823,824],{"class":347},"item",[228,826,413],{"class":267},[228,828,829,831,833,835,838,840,842,844,847,849,852,855,857,859],{"class":230,"line":334},[228,830,452],{"class":451},[228,832,455],{"class":267},[228,834,459],{"class":458},[228,836,837],{"class":358},"\"Total cost (N=",[228,839,465],{"class":367},[228,841,679],{"class":347},[228,843,476],{"class":367},[228,845,846],{"class":358},"): ",[228,848,465],{"class":367},[228,850,851],{"class":347},"total_cost",[228,853,854],{"class":458},":.4f",[228,856,476],{"class":367},[228,858,355],{"class":358},[228,860,490],{"class":267},[492,862],{"data":863,"kind":495},"U2hhcGU6IHRvcmNoLlNpemUoWzY0XSkgICBkdHlwZTogdG9yY2guaW50NjQKVG90YWwgY29zdCAoTj02NCk6IDEuNTAzMwo=",[497,865,867],{"id":866},"_2-calling-a-backend-directly","2  Calling a backend directly",[185,869,870,871,874],{},"Every backend is also accessible via ",[214,872,873],{},"torchmatch.assignment.ops.\u003Cname>",".\nUse it to pin a specific variant for benchmarking or to exploit a known property of your cost distribution.",[219,876,878],{"className":221,"code":877,"language":223,"meta":224,"style":224},"# All three CPU JV variants produce the same optimal cost\nfor op_name in (\"jonker_scalar\", \"jonker_dense\", \"jonker_compact\"):\n    op = getattr(torchmatch.assignment.ops, op_name)\n    result = op(cost_cpu)\n    cost = cost_cpu[torch.arange(N), result].sum().item()\n    print(f\"{op_name:20s}  total cost = {cost:.6f}\")\n",[214,879,880,885,924,954,970,1006],{"__ignoreMap":224},[228,881,882],{"class":230,"line":231},[228,883,884],{"class":713},"# All three CPU JV variants produce the same optimal cost\n",[228,886,887,890,893,896,899,901,903,905,907,909,911,913,915,917,919,921],{"class":230,"line":242},[228,888,889],{"class":245},"for",[228,891,892],{"class":238}," op_name ",[228,894,895],{"class":245},"in",[228,897,898],{"class":267}," (",[228,900,355],{"class":354},[228,902,540],{"class":358},[228,904,355],{"class":354},[228,906,371],{"class":267},[228,908,374],{"class":354},[228,910,562],{"class":358},[228,912,355],{"class":354},[228,914,371],{"class":267},[228,916,374],{"class":354},[228,918,551],{"class":358},[228,920,355],{"class":354},[228,922,923],{"class":267},"):\n",[228,925,926,929,931,934,936,938,940,942,944,947,949,952],{"class":230,"line":252},[228,927,928],{"class":238},"    op ",[228,930,422],{"class":234},[228,932,933],{"class":451}," getattr",[228,935,455],{"class":267},[228,937,468],{"class":347},[228,939,217],{"class":267},[228,941,728],{"class":270},[228,943,217],{"class":267},[228,945,946],{"class":270},"ops",[228,948,371],{"class":267},[228,950,951],{"class":347}," op_name",[228,953,490],{"class":267},[228,955,956,959,961,964,966,968],{"class":230,"line":259},[228,957,958],{"class":238},"    result ",[228,960,422],{"class":234},[228,962,963],{"class":347}," op",[228,965,455],{"class":267},[228,967,738],{"class":347},[228,969,490],{"class":267},[228,971,972,975,977,979,981,983,985,987,989,991,993,996,998,1000,1002,1004],{"class":230,"line":280},[228,973,974],{"class":238},"    cost ",[228,976,422],{"class":234},[228,978,793],{"class":238},[228,980,796],{"class":267},[228,982,799],{"class":238},[228,984,217],{"class":267},[228,986,804],{"class":347},[228,988,455],{"class":267},[228,990,679],{"class":347},[228,992,687],{"class":267},[228,994,995],{"class":238}," result",[228,997,815],{"class":267},[228,999,818],{"class":347},[228,1001,821],{"class":267},[228,1003,824],{"class":347},[228,1005,413],{"class":267},[228,1007,1008,1011,1013,1015,1017,1019,1022,1025,1027,1030,1032,1035,1038,1040,1042],{"class":230,"line":294},[228,1009,1010],{"class":451},"    print",[228,1012,455],{"class":267},[228,1014,459],{"class":458},[228,1016,355],{"class":358},[228,1018,465],{"class":367},[228,1020,1021],{"class":347},"op_name",[228,1023,1024],{"class":458},":20s",[228,1026,476],{"class":367},[228,1028,1029],{"class":358},"  total cost = ",[228,1031,465],{"class":367},[228,1033,1034],{"class":347},"cost",[228,1036,1037],{"class":458},":.6f",[228,1039,476],{"class":367},[228,1041,355],{"class":358},[228,1043,490],{"class":267},[492,1045],{"data":1046,"kind":495},"am9ua2VyX3NjYWxhciAgICAgICAgIHRvdGFsIGNvc3QgPSAxLjUwMzI2Mwpqb25rZXJfZGVuc2UgICAgICAgICAgdG90YWwgY29zdCA9IDEuNTAzMjYzCmpvbmtlcl9jb21wYWN0ICAgICAgICB0b3RhbCBjb3N0ID0gMS41MDMyNjMK",[185,1048,1049],{},"On tied cost matrices multiple optimal assignments exist; the specific\nindices may differ between backends but the total cost is always the same.",[497,1051,1053],{"id":1052},"_3-performance-by-problem-size","3  Performance by problem size",[185,1055,1056,1058,1059,1061,1062,1064],{},[214,1057,551],{}," is 20–30 % faster than ",[214,1060,562],{}," for small, square,\nsmooth-cost problems; ",[214,1063,562],{}," wins for rectangular inputs or very\nlarge N.  Below we time both on random uniform costs.",[219,1066,1068],{"className":221,"code":1067,"language":223,"meta":224,"style":224},"def time_op(op, cost, n_repeats=50):\n    # warm-up\n    for _ in range(5):\n        op(cost)\n    t0 = time.perf_counter()\n    for _ in range(n_repeats):\n        op(cost)\n    return (time.perf_counter() - t0) \u002F n_repeats * 1e3  # ms\n\n\nsizes = [32, 64, 128, 256, 512]\nresults_dense = []\nresults_compact = []\n\nfor n in sizes:\n    c = torch.tensor(rng.random((n, n), dtype=np.float32))\n    results_dense.append(time_op(torchmatch.assignment.ops.jonker_dense, c))\n    results_compact.append(time_op(torchmatch.assignment.ops.jonker_compact, c))\n\nfig, ax = plt.subplots(figsize=(7, 4))\nax.plot(sizes, results_dense, \"o-\", label=\"jonker_dense\", color=\"#1a6daf\")\nax.plot(sizes, results_compact, \"s-\", label=\"jonker_compact\", color=\"#E03520\")\nax.set_xlabel(\"Problem size N  (N × N square cost matrix)\")\nax.set_ylabel(\"Median time per solve (ms)\")\nax.set_title(\"CPU JV variants — uniform random cost, float32\")\nax.legend()\nax.grid(True, alpha=0.3)\nplt.tight_layout()\nplt.show()\n",[214,1069,1070,1102,1107,1127,1138,1155,1172,1182,1223,1227,1231,1267,1277,1286,1291,1307,1353,1392,1428,1433,1473,1532,1586,1607,1628,1649,1661,1689,1701],{"__ignoreMap":224},[228,1071,1072,1075,1079,1081,1085,1087,1090,1092,1095,1097,1100],{"class":230,"line":231},[228,1073,1074],{"class":458},"def",[228,1076,1078],{"class":1077},"sGLFI"," time_op",[228,1080,455],{"class":267},[228,1082,1084],{"class":1083},"sFwrP","op",[228,1086,371],{"class":267},[228,1088,1089],{"class":1083}," cost",[228,1091,371],{"class":267},[228,1093,1094],{"class":1083}," n_repeats",[228,1096,422],{"class":234},[228,1098,1099],{"class":367},"50",[228,1101,923],{"class":267},[228,1103,1104],{"class":230,"line":242},[228,1105,1106],{"class":713},"    # warm-up\n",[228,1108,1109,1112,1115,1117,1120,1122,1125],{"class":230,"line":252},[228,1110,1111],{"class":245},"    for",[228,1113,1114],{"class":238}," _ ",[228,1116,895],{"class":245},[228,1118,1119],{"class":451}," range",[228,1121,455],{"class":267},[228,1123,1124],{"class":367},"5",[228,1126,923],{"class":267},[228,1128,1129,1132,1134,1136],{"class":230,"line":259},[228,1130,1131],{"class":347},"        op",[228,1133,455],{"class":267},[228,1135,1034],{"class":347},[228,1137,490],{"class":267},[228,1139,1140,1143,1145,1148,1150,1153],{"class":230,"line":280},[228,1141,1142],{"class":238},"    t0 ",[228,1144,422],{"class":234},[228,1146,1147],{"class":238}," time",[228,1149,217],{"class":267},[228,1151,1152],{"class":347},"perf_counter",[228,1154,413],{"class":267},[228,1156,1157,1159,1161,1163,1165,1167,1170],{"class":230,"line":294},[228,1158,1111],{"class":245},[228,1160,1114],{"class":238},[228,1162,895],{"class":245},[228,1164,1119],{"class":451},[228,1166,455],{"class":267},[228,1168,1169],{"class":347},"n_repeats",[228,1171,923],{"class":267},[228,1173,1174,1176,1178,1180],{"class":230,"line":302},[228,1175,1131],{"class":347},[228,1177,455],{"class":267},[228,1179,1034],{"class":347},[228,1181,490],{"class":267},[228,1183,1184,1187,1189,1192,1194,1196,1199,1202,1205,1208,1211,1214,1217,1220],{"class":230,"line":310},[228,1185,1186],{"class":245},"    return",[228,1188,898],{"class":267},[228,1190,1191],{"class":238},"time",[228,1193,217],{"class":267},[228,1195,1152],{"class":347},[228,1197,1198],{"class":267},"()",[228,1200,1201],{"class":234}," -",[228,1203,1204],{"class":238}," t0",[228,1206,1207],{"class":267},")",[228,1209,1210],{"class":234}," \u002F",[228,1212,1213],{"class":238}," n_repeats ",[228,1215,1216],{"class":234},"*",[228,1218,1219],{"class":367}," 1e3",[228,1221,1222],{"class":713},"  # ms\n",[228,1224,1225],{"class":230,"line":329},[228,1226,256],{"emptyLinePlaceholder":255},[228,1228,1229],{"class":230,"line":334},[228,1230,256],{"emptyLinePlaceholder":255},[228,1232,1233,1236,1238,1241,1244,1246,1249,1251,1254,1256,1259,1261,1264],{"class":230,"line":390},[228,1234,1235],{"class":238},"sizes ",[228,1237,422],{"class":234},[228,1239,1240],{"class":267}," [",[228,1242,1243],{"class":367},"32",[228,1245,371],{"class":267},[228,1247,1248],{"class":367}," 64",[228,1250,371],{"class":267},[228,1252,1253],{"class":367}," 128",[228,1255,371],{"class":267},[228,1257,1258],{"class":367}," 256",[228,1260,371],{"class":267},[228,1262,1263],{"class":367}," 512",[228,1265,1266],{"class":267},"]\n",[228,1268,1269,1272,1274],{"class":230,"line":416},[228,1270,1271],{"class":238},"results_dense ",[228,1273,422],{"class":234},[228,1275,1276],{"class":267}," []\n",[228,1278,1279,1282,1284],{"class":230,"line":448},[228,1280,1281],{"class":238},"results_compact ",[228,1283,422],{"class":234},[228,1285,1276],{"class":267},[228,1287,1289],{"class":230,"line":1288},14,[228,1290,256],{"emptyLinePlaceholder":255},[228,1292,1294,1296,1299,1301,1304],{"class":230,"line":1293},15,[228,1295,889],{"class":245},[228,1297,1298],{"class":238}," n ",[228,1300,895],{"class":245},[228,1302,1303],{"class":238}," sizes",[228,1305,1306],{"class":267},":\n",[228,1308,1310,1313,1315,1317,1319,1321,1323,1325,1327,1329,1331,1334,1336,1339,1341,1343,1345,1347,1349,1351],{"class":230,"line":1309},16,[228,1311,1312],{"class":238},"    c ",[228,1314,422],{"class":234},[228,1316,400],{"class":238},[228,1318,217],{"class":267},[228,1320,664],{"class":347},[228,1322,455],{"class":267},[228,1324,669],{"class":347},[228,1326,217],{"class":267},[228,1328,624],{"class":347},[228,1330,676],{"class":267},[228,1332,1333],{"class":347},"n",[228,1335,371],{"class":267},[228,1337,1338],{"class":347}," n",[228,1340,687],{"class":267},[228,1342,691],{"class":690},[228,1344,422],{"class":234},[228,1346,696],{"class":347},[228,1348,217],{"class":267},[228,1350,701],{"class":270},[228,1352,704],{"class":267},[228,1354,1356,1359,1361,1364,1366,1369,1371,1373,1375,1377,1379,1381,1383,1385,1387,1390],{"class":230,"line":1355},17,[228,1357,1358],{"class":238},"    results_dense",[228,1360,217],{"class":267},[228,1362,1363],{"class":347},"append",[228,1365,455],{"class":267},[228,1367,1368],{"class":347},"time_op",[228,1370,455],{"class":267},[228,1372,468],{"class":347},[228,1374,217],{"class":267},[228,1376,728],{"class":270},[228,1378,217],{"class":267},[228,1380,946],{"class":270},[228,1382,217],{"class":267},[228,1384,562],{"class":270},[228,1386,371],{"class":267},[228,1388,1389],{"class":347}," c",[228,1391,704],{"class":267},[228,1393,1395,1398,1400,1402,1404,1406,1408,1410,1412,1414,1416,1418,1420,1422,1424,1426],{"class":230,"line":1394},18,[228,1396,1397],{"class":238},"    results_compact",[228,1399,217],{"class":267},[228,1401,1363],{"class":347},[228,1403,455],{"class":267},[228,1405,1368],{"class":347},[228,1407,455],{"class":267},[228,1409,468],{"class":347},[228,1411,217],{"class":267},[228,1413,728],{"class":270},[228,1415,217],{"class":267},[228,1417,946],{"class":270},[228,1419,217],{"class":267},[228,1421,551],{"class":270},[228,1423,371],{"class":267},[228,1425,1389],{"class":347},[228,1427,704],{"class":267},[228,1429,1431],{"class":230,"line":1430},19,[228,1432,256],{"emptyLinePlaceholder":255},[228,1434,1436,1439,1441,1444,1446,1449,1451,1454,1456,1459,1461,1463,1466,1468,1471],{"class":230,"line":1435},20,[228,1437,1438],{"class":238},"fig",[228,1440,371],{"class":267},[228,1442,1443],{"class":238}," ax ",[228,1445,422],{"class":234},[228,1447,1448],{"class":238}," plt",[228,1450,217],{"class":267},[228,1452,1453],{"class":347},"subplots",[228,1455,455],{"class":267},[228,1457,1458],{"class":690},"figsize",[228,1460,422],{"class":234},[228,1462,455],{"class":267},[228,1464,1465],{"class":367},"7",[228,1467,371],{"class":267},[228,1469,1470],{"class":367}," 4",[228,1472,704],{"class":267},[228,1474,1476,1479,1481,1484,1486,1489,1491,1494,1496,1498,1501,1503,1505,1508,1510,1512,1514,1516,1518,1521,1523,1525,1528,1530],{"class":230,"line":1475},21,[228,1477,1478],{"class":238},"ax",[228,1480,217],{"class":267},[228,1482,1483],{"class":347},"plot",[228,1485,455],{"class":267},[228,1487,1488],{"class":347},"sizes",[228,1490,371],{"class":267},[228,1492,1493],{"class":347}," results_dense",[228,1495,371],{"class":267},[228,1497,374],{"class":354},[228,1499,1500],{"class":358},"o-",[228,1502,355],{"class":354},[228,1504,371],{"class":267},[228,1506,1507],{"class":690}," label",[228,1509,422],{"class":234},[228,1511,355],{"class":354},[228,1513,562],{"class":358},[228,1515,355],{"class":354},[228,1517,371],{"class":267},[228,1519,1520],{"class":690}," color",[228,1522,422],{"class":234},[228,1524,355],{"class":354},[228,1526,1527],{"class":358},"#1a6daf",[228,1529,355],{"class":354},[228,1531,490],{"class":267},[228,1533,1535,1537,1539,1541,1543,1545,1547,1550,1552,1554,1557,1559,1561,1563,1565,1567,1569,1571,1573,1575,1577,1579,1582,1584],{"class":230,"line":1534},22,[228,1536,1478],{"class":238},[228,1538,217],{"class":267},[228,1540,1483],{"class":347},[228,1542,455],{"class":267},[228,1544,1488],{"class":347},[228,1546,371],{"class":267},[228,1548,1549],{"class":347}," results_compact",[228,1551,371],{"class":267},[228,1553,374],{"class":354},[228,1555,1556],{"class":358},"s-",[228,1558,355],{"class":354},[228,1560,371],{"class":267},[228,1562,1507],{"class":690},[228,1564,422],{"class":234},[228,1566,355],{"class":354},[228,1568,551],{"class":358},[228,1570,355],{"class":354},[228,1572,371],{"class":267},[228,1574,1520],{"class":690},[228,1576,422],{"class":234},[228,1578,355],{"class":354},[228,1580,1581],{"class":358},"#E03520",[228,1583,355],{"class":354},[228,1585,490],{"class":267},[228,1587,1589,1591,1593,1596,1598,1600,1603,1605],{"class":230,"line":1588},23,[228,1590,1478],{"class":238},[228,1592,217],{"class":267},[228,1594,1595],{"class":347},"set_xlabel",[228,1597,455],{"class":267},[228,1599,355],{"class":354},[228,1601,1602],{"class":358},"Problem size N  (N × N square cost matrix)",[228,1604,355],{"class":354},[228,1606,490],{"class":267},[228,1608,1610,1612,1614,1617,1619,1621,1624,1626],{"class":230,"line":1609},24,[228,1611,1478],{"class":238},[228,1613,217],{"class":267},[228,1615,1616],{"class":347},"set_ylabel",[228,1618,455],{"class":267},[228,1620,355],{"class":354},[228,1622,1623],{"class":358},"Median time per solve (ms)",[228,1625,355],{"class":354},[228,1627,490],{"class":267},[228,1629,1631,1633,1635,1638,1640,1642,1645,1647],{"class":230,"line":1630},25,[228,1632,1478],{"class":238},[228,1634,217],{"class":267},[228,1636,1637],{"class":347},"set_title",[228,1639,455],{"class":267},[228,1641,355],{"class":354},[228,1643,1644],{"class":358},"CPU JV variants — uniform random cost, float32",[228,1646,355],{"class":354},[228,1648,490],{"class":267},[228,1650,1652,1654,1656,1659],{"class":230,"line":1651},26,[228,1653,1478],{"class":238},[228,1655,217],{"class":267},[228,1657,1658],{"class":347},"legend",[228,1660,413],{"class":267},[228,1662,1664,1666,1668,1671,1673,1677,1679,1682,1684,1687],{"class":230,"line":1663},27,[228,1665,1478],{"class":238},[228,1667,217],{"class":267},[228,1669,1670],{"class":347},"grid",[228,1672,455],{"class":267},[228,1674,1676],{"class":1675},"s39Yj","True",[228,1678,371],{"class":267},[228,1680,1681],{"class":690}," alpha",[228,1683,422],{"class":234},[228,1685,1686],{"class":367},"0.3",[228,1688,490],{"class":267},[228,1690,1692,1694,1696,1699],{"class":230,"line":1691},28,[228,1693,337],{"class":238},[228,1695,217],{"class":267},[228,1697,1698],{"class":347},"tight_layout",[228,1700,413],{"class":267},[228,1702,1704,1706,1708,1711],{"class":230,"line":1703},29,[228,1705,337],{"class":238},[228,1707,217],{"class":267},[228,1709,1710],{"class":347},"show",[228,1712,413],{"class":267},[185,1714,1715],{},[1716,1717],"img",{"alt":224,"src":1718},"\u002F_nb\u002Fe760f955a19724a9.png",[497,1720,1722],{"id":1721},"_4-batched-solving","4  Batched solving",[185,1724,1725,1726,1729,1730,1732,1733,1736],{},"A 3-D tensor ",[214,1727,1728],{},"(B, N, M)"," stacks B independent problems.  ",[214,1731,733],{}," distributes\nthem across CPU threads (via ",[214,1734,1735],{},"at::parallel_for",") or launches a single tiled\nCUDA kernel.  This is the main entry point for tracking pipelines where you\nneed to solve one assignment per video frame per mini-batch.",[219,1738,1740],{"className":221,"code":1739,"language":223,"meta":224,"style":224},"B, N = 32, 48  # 32 frames, 48 tracks\u002Fdetections each\ncosts_batch = torch.rand(B, N, N)\n\n# returns shape (B, N)\nassignments = torchmatch.assignment.solve(costs_batch)\nprint(\"Batch input:\", costs_batch.shape)\nprint(\"Output    :\", assignments.shape)\nprint(\"All rows matched:\", (assignments >= 0).all().item())\n",[214,1741,1742,1765,1793,1797,1802,1826,1850,1874],{"__ignoreMap":224},[228,1743,1744,1747,1749,1752,1754,1757,1759,1762],{"class":230,"line":231},[228,1745,1746],{"class":238},"B",[228,1748,371],{"class":267},[228,1750,1751],{"class":238}," N ",[228,1753,422],{"class":234},[228,1755,1756],{"class":367}," 32",[228,1758,371],{"class":267},[228,1760,1761],{"class":367}," 48",[228,1763,1764],{"class":713},"  # 32 frames, 48 tracks\u002Fdetections each\n",[228,1766,1767,1770,1772,1774,1776,1779,1781,1783,1785,1787,1789,1791],{"class":230,"line":242},[228,1768,1769],{"class":238},"costs_batch ",[228,1771,422],{"class":234},[228,1773,400],{"class":238},[228,1775,217],{"class":267},[228,1777,1778],{"class":347},"rand",[228,1780,455],{"class":267},[228,1782,1746],{"class":347},[228,1784,371],{"class":267},[228,1786,684],{"class":347},[228,1788,371],{"class":267},[228,1790,684],{"class":347},[228,1792,490],{"class":267},[228,1794,1795],{"class":230,"line":252},[228,1796,256],{"emptyLinePlaceholder":255},[228,1798,1799],{"class":230,"line":259},[228,1800,1801],{"class":713},"# returns shape (B, N)\n",[228,1803,1804,1807,1809,1811,1813,1815,1817,1819,1821,1824],{"class":230,"line":280},[228,1805,1806],{"class":238},"assignments ",[228,1808,422],{"class":234},[228,1810,316],{"class":238},[228,1812,217],{"class":267},[228,1814,728],{"class":270},[228,1816,217],{"class":267},[228,1818,733],{"class":347},[228,1820,455],{"class":267},[228,1822,1823],{"class":347},"costs_batch",[228,1825,490],{"class":267},[228,1827,1828,1830,1832,1834,1837,1839,1841,1844,1846,1848],{"class":230,"line":294},[228,1829,452],{"class":451},[228,1831,455],{"class":267},[228,1833,355],{"class":354},[228,1835,1836],{"class":358},"Batch input:",[228,1838,355],{"class":354},[228,1840,371],{"class":267},[228,1842,1843],{"class":347}," costs_batch",[228,1845,217],{"class":267},[228,1847,763],{"class":270},[228,1849,490],{"class":267},[228,1851,1852,1854,1856,1858,1861,1863,1865,1868,1870,1872],{"class":230,"line":302},[228,1853,452],{"class":451},[228,1855,455],{"class":267},[228,1857,355],{"class":354},[228,1859,1860],{"class":358},"Output    :",[228,1862,355],{"class":354},[228,1864,371],{"class":267},[228,1866,1867],{"class":347}," assignments",[228,1869,217],{"class":267},[228,1871,763],{"class":270},[228,1873,490],{"class":267},[228,1875,1876,1878,1880,1882,1885,1887,1889,1891,1893,1896,1899,1902,1905,1907,1909],{"class":230,"line":310},[228,1877,452],{"class":451},[228,1879,455],{"class":267},[228,1881,355],{"class":354},[228,1883,1884],{"class":358},"All rows matched:",[228,1886,355],{"class":354},[228,1888,371],{"class":267},[228,1890,898],{"class":267},[228,1892,1806],{"class":347},[228,1894,1895],{"class":234},">=",[228,1897,1898],{"class":367}," 0",[228,1900,1901],{"class":267},").",[228,1903,1904],{"class":347},"all",[228,1906,821],{"class":267},[228,1908,824],{"class":347},[228,1910,1911],{"class":267},"())\n",[492,1913],{"data":1914,"kind":495},"QmF0Y2ggaW5wdXQ6IHRvcmNoLlNpemUoWzMyLCA0OCwgNDhdKQpPdXRwdXQgICAgOiB0b3JjaC5TaXplKFszMiwgNDhdKQpBbGwgcm93cyBtYXRjaGVkOiBUcnVlCg==",[1916,1917,1919],"h3",{"id":1918},"unpacked-output","Unpacked output",[185,1921,1922],{},"Tracker pipelines need three things after assignment:",[1924,1925,1926,1929,1932],"ol",{},[195,1927,1928],{},"The matched (track, detection) pairs",[195,1930,1931],{},"Which tracks have no matching detection (lost tracks)",[195,1933,1934],{},"Which detections have no matching track (new objects)",[185,1936,1937,1940],{},[214,1938,1939],{},"unpack=True"," returns all three directly, avoiding a Python loop over the\nrow-to-col index tensor.",[219,1942,1944],{"className":221,"code":1943,"language":223,"meta":224,"style":224},"matches, unmatched_rows, unmatched_cols, n_matched = torchmatch.assignment.solve(\n    costs_batch, unpack=True\n)\nprint(\"matches shape      :\", matches.shape, \"  (B, N, 2) — padded (row, col) pairs\")\nprint(\"unmatched_rows     :\", unmatched_rows.shape, \"  (B, N) — padded row indices\")\nprint(\"unmatched_cols     :\", unmatched_cols.shape, \"  (B, M)\")\nprint(\"n_matched          :\", n_matched.shape, \"  (B,) — valid entries per batch\")\nprint(\"First batch: matched\", n_matched[0].item(), \"of\", N, \"pairs\")\n",[214,1945,1946,1981,1996,2000,2033,2065,2097,2130],{"__ignoreMap":224},[228,1947,1948,1951,1953,1956,1958,1961,1963,1966,1968,1970,1972,1974,1976,1978],{"class":230,"line":231},[228,1949,1950],{"class":238},"matches",[228,1952,371],{"class":267},[228,1954,1955],{"class":238}," unmatched_rows",[228,1957,371],{"class":267},[228,1959,1960],{"class":238}," unmatched_cols",[228,1962,371],{"class":267},[228,1964,1965],{"class":238}," n_matched ",[228,1967,422],{"class":234},[228,1969,316],{"class":238},[228,1971,217],{"class":267},[228,1973,728],{"class":270},[228,1975,217],{"class":267},[228,1977,733],{"class":347},[228,1979,1980],{"class":267},"(\n",[228,1982,1983,1986,1988,1991,1993],{"class":230,"line":242},[228,1984,1985],{"class":347},"    costs_batch",[228,1987,371],{"class":267},[228,1989,1990],{"class":690}," unpack",[228,1992,422],{"class":234},[228,1994,1995],{"class":1675},"True\n",[228,1997,1998],{"class":230,"line":252},[228,1999,490],{"class":267},[228,2001,2002,2004,2006,2008,2011,2013,2015,2018,2020,2022,2024,2026,2029,2031],{"class":230,"line":259},[228,2003,452],{"class":451},[228,2005,455],{"class":267},[228,2007,355],{"class":354},[228,2009,2010],{"class":358},"matches shape      :",[228,2012,355],{"class":354},[228,2014,371],{"class":267},[228,2016,2017],{"class":347}," matches",[228,2019,217],{"class":267},[228,2021,763],{"class":270},[228,2023,371],{"class":267},[228,2025,374],{"class":354},[228,2027,2028],{"class":358},"  (B, N, 2) — padded (row, col) pairs",[228,2030,355],{"class":354},[228,2032,490],{"class":267},[228,2034,2035,2037,2039,2041,2044,2046,2048,2050,2052,2054,2056,2058,2061,2063],{"class":230,"line":280},[228,2036,452],{"class":451},[228,2038,455],{"class":267},[228,2040,355],{"class":354},[228,2042,2043],{"class":358},"unmatched_rows     :",[228,2045,355],{"class":354},[228,2047,371],{"class":267},[228,2049,1955],{"class":347},[228,2051,217],{"class":267},[228,2053,763],{"class":270},[228,2055,371],{"class":267},[228,2057,374],{"class":354},[228,2059,2060],{"class":358},"  (B, N) — padded row indices",[228,2062,355],{"class":354},[228,2064,490],{"class":267},[228,2066,2067,2069,2071,2073,2076,2078,2080,2082,2084,2086,2088,2090,2093,2095],{"class":230,"line":294},[228,2068,452],{"class":451},[228,2070,455],{"class":267},[228,2072,355],{"class":354},[228,2074,2075],{"class":358},"unmatched_cols     :",[228,2077,355],{"class":354},[228,2079,371],{"class":267},[228,2081,1960],{"class":347},[228,2083,217],{"class":267},[228,2085,763],{"class":270},[228,2087,371],{"class":267},[228,2089,374],{"class":354},[228,2091,2092],{"class":358},"  (B, M)",[228,2094,355],{"class":354},[228,2096,490],{"class":267},[228,2098,2099,2101,2103,2105,2108,2110,2112,2115,2117,2119,2121,2123,2126,2128],{"class":230,"line":302},[228,2100,452],{"class":451},[228,2102,455],{"class":267},[228,2104,355],{"class":354},[228,2106,2107],{"class":358},"n_matched          :",[228,2109,355],{"class":354},[228,2111,371],{"class":267},[228,2113,2114],{"class":347}," n_matched",[228,2116,217],{"class":267},[228,2118,763],{"class":270},[228,2120,371],{"class":267},[228,2122,374],{"class":354},[228,2124,2125],{"class":358},"  (B,) — valid entries per batch",[228,2127,355],{"class":354},[228,2129,490],{"class":267},[228,2131,2132,2134,2136,2138,2141,2143,2145,2147,2149,2151,2153,2155,2158,2160,2163,2165,2167,2169,2171,2173,2176,2178],{"class":230,"line":310},[228,2133,452],{"class":451},[228,2135,455],{"class":267},[228,2137,355],{"class":354},[228,2139,2140],{"class":358},"First batch: matched",[228,2142,355],{"class":354},[228,2144,371],{"class":267},[228,2146,2114],{"class":347},[228,2148,796],{"class":267},[228,2150,634],{"class":367},[228,2152,815],{"class":267},[228,2154,824],{"class":347},[228,2156,2157],{"class":267},"(),",[228,2159,374],{"class":354},[228,2161,2162],{"class":358},"of",[228,2164,355],{"class":354},[228,2166,371],{"class":267},[228,2168,684],{"class":347},[228,2170,371],{"class":267},[228,2172,374],{"class":354},[228,2174,2175],{"class":358},"pairs",[228,2177,355],{"class":354},[228,2179,490],{"class":267},[492,2181],{"data":2182,"kind":495},"bWF0Y2hlcyBzaGFwZSAgICAgIDogdG9yY2guU2l6ZShbMzIsIDQ4LCAyXSkgICAoQiwgTiwgMikg4oCUIHBhZGRlZCAocm93LCBjb2wpIHBhaXJzCnVubWF0Y2hlZF9yb3dzICAgICA6IHRvcmNoLlNpemUoWzMyLCA0OF0pICAgKEIsIE4pIOKAlCBwYWRkZWQgcm93IGluZGljZXMKdW5tYXRjaGVkX2NvbHMgICAgIDogdG9yY2guU2l6ZShbMzIsIDQ4XSkgICAoQiwgTSkKbl9tYXRjaGVkICAgICAgICAgIDogdG9yY2guU2l6ZShbMzJdKSAgIChCLCkg4oCUIHZhbGlkIGVudHJpZXMgcGVyIGJhdGNoCkZpcnN0IGJhdGNoOiBtYXRjaGVkIDQ4IG9mIDQ4IHBhaXJzCg==",[219,2184,2186],{"className":221,"code":2185,"language":223,"meta":224,"style":224},"# Reconstruct per-batch pairs manually to verify\nb = 0\nk = n_matched[b].item()\nvalid_matches = matches[b, :k]  # shape (k, 2)\nprint(f\"Batch {b}: {k} matched pairs\")\nprint(\"First 5 pairs (track_idx, det_idx):\", valid_matches[:5].tolist())\n",[214,2187,2188,2193,2203,2223,2250,2281],{"__ignoreMap":224},[228,2189,2190],{"class":230,"line":231},[228,2191,2192],{"class":713},"# Reconstruct per-batch pairs manually to verify\n",[228,2194,2195,2198,2200],{"class":230,"line":242},[228,2196,2197],{"class":238},"b ",[228,2199,422],{"class":234},[228,2201,2202],{"class":367}," 0\n",[228,2204,2205,2208,2210,2212,2214,2217,2219,2221],{"class":230,"line":252},[228,2206,2207],{"class":238},"k ",[228,2209,422],{"class":234},[228,2211,2114],{"class":238},[228,2213,796],{"class":267},[228,2215,2216],{"class":238},"b",[228,2218,815],{"class":267},[228,2220,824],{"class":347},[228,2222,413],{"class":267},[228,2224,2225,2228,2230,2232,2234,2236,2238,2241,2244,2247],{"class":230,"line":259},[228,2226,2227],{"class":238},"valid_matches ",[228,2229,422],{"class":234},[228,2231,2017],{"class":238},[228,2233,796],{"class":267},[228,2235,2216],{"class":238},[228,2237,371],{"class":267},[228,2239,2240],{"class":267}," :",[228,2242,2243],{"class":238},"k",[228,2245,2246],{"class":267},"]",[228,2248,2249],{"class":713},"  # shape (k, 2)\n",[228,2251,2252,2254,2256,2258,2261,2263,2265,2267,2270,2272,2274,2276,2279],{"class":230,"line":280},[228,2253,452],{"class":451},[228,2255,455],{"class":267},[228,2257,459],{"class":458},[228,2259,2260],{"class":358},"\"Batch ",[228,2262,465],{"class":367},[228,2264,2216],{"class":347},[228,2266,476],{"class":367},[228,2268,2269],{"class":358},": ",[228,2271,465],{"class":367},[228,2273,2243],{"class":347},[228,2275,476],{"class":367},[228,2277,2278],{"class":358}," matched pairs\"",[228,2280,490],{"class":267},[228,2282,2283,2285,2287,2289,2292,2294,2296,2299,2302,2304,2306,2309],{"class":230,"line":294},[228,2284,452],{"class":451},[228,2286,455],{"class":267},[228,2288,355],{"class":354},[228,2290,2291],{"class":358},"First 5 pairs (track_idx, det_idx):",[228,2293,355],{"class":354},[228,2295,371],{"class":267},[228,2297,2298],{"class":347}," valid_matches",[228,2300,2301],{"class":267},"[:",[228,2303,1124],{"class":367},[228,2305,815],{"class":267},[228,2307,2308],{"class":347},"tolist",[228,2310,1911],{"class":267},[492,2312],{"data":2313,"kind":495},"QmF0Y2ggMDogNDggbWF0Y2hlZCBwYWlycwpGaXJzdCA1IHBhaXJzICh0cmFja19pZHgsIGRldF9pZHgpOiBbWzAsIDM0XSwgWzEsIDQyXSwgWzIsIDMxXSwgWzMsIDEyXSwgWzQsIDI5XV0K",[497,2315,2317],{"id":2316},"_5-when-to-use-cuda","5  When to use CUDA",[185,2319,2320,2321,2323,2324,2326,2327,2330],{},"The CUDA Hungarian ops (",[214,2322,573],{},", ",[214,2325,584],{},") are faster than the CPU JV ops\n",[188,2328,2329],{},"only"," in the regime of integer-tied (quantised) costs at large N.  For\nsmooth floating-point costs the CPU AVX2 kernels typically win by 10–100×\nbecause the CUDA ops synchronise with the host mid-execution.",[185,2332,2333,2334,2336],{},"The CUDA backend of ",[214,2335,595],{}," is the exception: it runs a\nshared-memory tiled kernel with no host syncs, so it wins for batches of\nsmall square problems (K ≤ 64).",[219,2338,2340],{"className":221,"code":2339,"language":223,"meta":224,"style":224},"if CUDA:\n    K = 48  # must be ≤ 64 for the CUDA tiled kernel\n    B_large = 128\n\n    costs_gpu = torch.rand(B_large, K, K, device=\"cuda\")\n\n    def timed_cuda(fn, *args, n=20):\n        # warm-up\n        for _ in range(5):\n            fn(*args)\n        torch.cuda.synchronize()\n        t0 = time.perf_counter()\n        for _ in range(n):\n            fn(*args)\n        torch.cuda.synchronize()\n        return (time.perf_counter() - t0) \u002F n * 1e3\n\n    costs_cpu_b = costs_gpu.cpu()\n\n    t_gpu = timed_cuda(torchmatch.assignment.solve, costs_gpu)\n    t_cpu = time_op(torchmatch.assignment.solve, costs_cpu_b)\n\n    print(f\"Batched solve  B={B_large} K={K}:\")\n    print(f\"  CUDA jonker_dense_batch : {t_gpu:.2f} ms\")\n    print(f\"  CPU  jonker_dense_batch : {t_cpu:.2f} ms\")\n    print(f\"  GPU speedup: {t_cpu \u002F t_gpu:.1f}×\")\nelse:\n    print(\"CUDA not available — GPU comparison skipped.\")\n    print(\"On a typical GPU the CUDA tiled kernel is 3–10× faster for B=128, K=48.\")\n",[214,2341,2342,2351,2363,2373,2377,2419,2423,2455,2460,2477,2490,2506,2521,2537,2549,2563,2593,2597,2614,2618,2645,2673,2677,2709,2735,2759,2791,2798,2813],{"__ignoreMap":224},[228,2343,2344,2347,2349],{"class":230,"line":231},[228,2345,2346],{"class":245},"if",[228,2348,434],{"class":393},[228,2350,1306],{"class":267},[228,2352,2353,2356,2358,2360],{"class":230,"line":242},[228,2354,2355],{"class":238},"    K ",[228,2357,422],{"class":234},[228,2359,1761],{"class":367},[228,2361,2362],{"class":713},"  # must be ≤ 64 for the CUDA tiled kernel\n",[228,2364,2365,2368,2370],{"class":230,"line":252},[228,2366,2367],{"class":238},"    B_large ",[228,2369,422],{"class":234},[228,2371,2372],{"class":367}," 128\n",[228,2374,2375],{"class":230,"line":259},[228,2376,256],{"emptyLinePlaceholder":255},[228,2378,2379,2382,2384,2386,2388,2390,2392,2395,2397,2400,2402,2404,2406,2409,2411,2413,2415,2417],{"class":230,"line":280},[228,2380,2381],{"class":238},"    costs_gpu ",[228,2383,422],{"class":234},[228,2385,400],{"class":238},[228,2387,217],{"class":267},[228,2389,1778],{"class":347},[228,2391,455],{"class":267},[228,2393,2394],{"class":347},"B_large",[228,2396,371],{"class":267},[228,2398,2399],{"class":347}," K",[228,2401,371],{"class":267},[228,2403,2399],{"class":347},[228,2405,371],{"class":267},[228,2407,2408],{"class":690}," device",[228,2410,422],{"class":234},[228,2412,355],{"class":354},[228,2414,405],{"class":358},[228,2416,355],{"class":354},[228,2418,490],{"class":267},[228,2420,2421],{"class":230,"line":294},[228,2422,256],{"emptyLinePlaceholder":255},[228,2424,2425,2428,2431,2433,2436,2438,2441,2444,2446,2448,2450,2453],{"class":230,"line":302},[228,2426,2427],{"class":458},"    def",[228,2429,2430],{"class":1077}," timed_cuda",[228,2432,455],{"class":267},[228,2434,2435],{"class":1083},"fn",[228,2437,371],{"class":267},[228,2439,2440],{"class":234}," *",[228,2442,2443],{"class":1083},"args",[228,2445,371],{"class":267},[228,2447,1338],{"class":1083},[228,2449,422],{"class":234},[228,2451,2452],{"class":367},"20",[228,2454,923],{"class":267},[228,2456,2457],{"class":230,"line":310},[228,2458,2459],{"class":713},"        # warm-up\n",[228,2461,2462,2465,2467,2469,2471,2473,2475],{"class":230,"line":329},[228,2463,2464],{"class":245},"        for",[228,2466,1114],{"class":238},[228,2468,895],{"class":245},[228,2470,1119],{"class":451},[228,2472,455],{"class":267},[228,2474,1124],{"class":367},[228,2476,923],{"class":267},[228,2478,2479,2482,2484,2486,2488],{"class":230,"line":334},[228,2480,2481],{"class":347},"            fn",[228,2483,455],{"class":267},[228,2485,1216],{"class":234},[228,2487,2443],{"class":347},[228,2489,490],{"class":267},[228,2491,2492,2495,2497,2499,2501,2504],{"class":230,"line":390},[228,2493,2494],{"class":238},"        torch",[228,2496,217],{"class":267},[228,2498,405],{"class":270},[228,2500,217],{"class":267},[228,2502,2503],{"class":347},"synchronize",[228,2505,413],{"class":267},[228,2507,2508,2511,2513,2515,2517,2519],{"class":230,"line":416},[228,2509,2510],{"class":238},"        t0 ",[228,2512,422],{"class":234},[228,2514,1147],{"class":238},[228,2516,217],{"class":267},[228,2518,1152],{"class":347},[228,2520,413],{"class":267},[228,2522,2523,2525,2527,2529,2531,2533,2535],{"class":230,"line":448},[228,2524,2464],{"class":245},[228,2526,1114],{"class":238},[228,2528,895],{"class":245},[228,2530,1119],{"class":451},[228,2532,455],{"class":267},[228,2534,1333],{"class":347},[228,2536,923],{"class":267},[228,2538,2539,2541,2543,2545,2547],{"class":230,"line":1288},[228,2540,2481],{"class":347},[228,2542,455],{"class":267},[228,2544,1216],{"class":234},[228,2546,2443],{"class":347},[228,2548,490],{"class":267},[228,2550,2551,2553,2555,2557,2559,2561],{"class":230,"line":1293},[228,2552,2494],{"class":238},[228,2554,217],{"class":267},[228,2556,405],{"class":270},[228,2558,217],{"class":267},[228,2560,2503],{"class":347},[228,2562,413],{"class":267},[228,2564,2565,2568,2570,2572,2574,2576,2578,2580,2582,2584,2586,2588,2590],{"class":230,"line":1309},[228,2566,2567],{"class":245},"        return",[228,2569,898],{"class":267},[228,2571,1191],{"class":238},[228,2573,217],{"class":267},[228,2575,1152],{"class":347},[228,2577,1198],{"class":267},[228,2579,1201],{"class":234},[228,2581,1204],{"class":238},[228,2583,1207],{"class":267},[228,2585,1210],{"class":234},[228,2587,1298],{"class":238},[228,2589,1216],{"class":234},[228,2591,2592],{"class":367}," 1e3\n",[228,2594,2595],{"class":230,"line":1355},[228,2596,256],{"emptyLinePlaceholder":255},[228,2598,2599,2602,2604,2607,2609,2612],{"class":230,"line":1394},[228,2600,2601],{"class":238},"    costs_cpu_b ",[228,2603,422],{"class":234},[228,2605,2606],{"class":238}," costs_gpu",[228,2608,217],{"class":267},[228,2610,2611],{"class":347},"cpu",[228,2613,413],{"class":267},[228,2615,2616],{"class":230,"line":1430},[228,2617,256],{"emptyLinePlaceholder":255},[228,2619,2620,2623,2625,2627,2629,2631,2633,2635,2637,2639,2641,2643],{"class":230,"line":1435},[228,2621,2622],{"class":238},"    t_gpu ",[228,2624,422],{"class":234},[228,2626,2430],{"class":347},[228,2628,455],{"class":267},[228,2630,468],{"class":347},[228,2632,217],{"class":267},[228,2634,728],{"class":270},[228,2636,217],{"class":267},[228,2638,733],{"class":270},[228,2640,371],{"class":267},[228,2642,2606],{"class":347},[228,2644,490],{"class":267},[228,2646,2647,2650,2652,2654,2656,2658,2660,2662,2664,2666,2668,2671],{"class":230,"line":1475},[228,2648,2649],{"class":238},"    t_cpu ",[228,2651,422],{"class":234},[228,2653,1078],{"class":347},[228,2655,455],{"class":267},[228,2657,468],{"class":347},[228,2659,217],{"class":267},[228,2661,728],{"class":270},[228,2663,217],{"class":267},[228,2665,733],{"class":270},[228,2667,371],{"class":267},[228,2669,2670],{"class":347}," costs_cpu_b",[228,2672,490],{"class":267},[228,2674,2675],{"class":230,"line":1534},[228,2676,256],{"emptyLinePlaceholder":255},[228,2678,2679,2681,2683,2685,2688,2690,2692,2694,2697,2699,2702,2704,2707],{"class":230,"line":1588},[228,2680,1010],{"class":451},[228,2682,455],{"class":267},[228,2684,459],{"class":458},[228,2686,2687],{"class":358},"\"Batched solve  B=",[228,2689,465],{"class":367},[228,2691,2394],{"class":347},[228,2693,476],{"class":367},[228,2695,2696],{"class":358}," K=",[228,2698,465],{"class":367},[228,2700,2701],{"class":347},"K",[228,2703,476],{"class":367},[228,2705,2706],{"class":358},":\"",[228,2708,490],{"class":267},[228,2710,2711,2713,2715,2717,2720,2722,2725,2728,2730,2733],{"class":230,"line":1609},[228,2712,1010],{"class":451},[228,2714,455],{"class":267},[228,2716,459],{"class":458},[228,2718,2719],{"class":358},"\"  CUDA jonker_dense_batch : ",[228,2721,465],{"class":367},[228,2723,2724],{"class":347},"t_gpu",[228,2726,2727],{"class":458},":.2f",[228,2729,476],{"class":367},[228,2731,2732],{"class":358}," ms\"",[228,2734,490],{"class":267},[228,2736,2737,2739,2741,2743,2746,2748,2751,2753,2755,2757],{"class":230,"line":1630},[228,2738,1010],{"class":451},[228,2740,455],{"class":267},[228,2742,459],{"class":458},[228,2744,2745],{"class":358},"\"  CPU  jonker_dense_batch : ",[228,2747,465],{"class":367},[228,2749,2750],{"class":347},"t_cpu",[228,2752,2727],{"class":458},[228,2754,476],{"class":367},[228,2756,2732],{"class":358},[228,2758,490],{"class":267},[228,2760,2761,2763,2765,2767,2770,2772,2775,2778,2781,2784,2786,2789],{"class":230,"line":1651},[228,2762,1010],{"class":451},[228,2764,455],{"class":267},[228,2766,459],{"class":458},[228,2768,2769],{"class":358},"\"  GPU speedup: ",[228,2771,465],{"class":367},[228,2773,2774],{"class":347},"t_cpu ",[228,2776,2777],{"class":234},"\u002F",[228,2779,2780],{"class":347}," t_gpu",[228,2782,2783],{"class":458},":.1f",[228,2785,476],{"class":367},[228,2787,2788],{"class":358},"×\"",[228,2790,490],{"class":267},[228,2792,2793,2796],{"class":230,"line":1663},[228,2794,2795],{"class":245},"else",[228,2797,1306],{"class":267},[228,2799,2800,2802,2804,2806,2809,2811],{"class":230,"line":1691},[228,2801,1010],{"class":451},[228,2803,455],{"class":267},[228,2805,355],{"class":354},[228,2807,2808],{"class":358},"CUDA not available — GPU comparison skipped.",[228,2810,355],{"class":354},[228,2812,490],{"class":267},[228,2814,2815,2817,2819,2821,2824,2826],{"class":230,"line":1703},[228,2816,1010],{"class":451},[228,2818,455],{"class":267},[228,2820,355],{"class":354},[228,2822,2823],{"class":358},"On a typical GPU the CUDA tiled kernel is 3–10× faster for B=128, K=48.",[228,2825,355],{"class":354},[228,2827,490],{"class":267},[492,2829],{"data":2830,"kind":495},"QmF0Y2hlZCBzb2x2ZSAgQj0xMjggSz00ODoKICBDVURBIGpvbmtlcl9kZW5zZV9iYXRjaCA6IDIuNjEgbXMKICBDUFUgIGpvbmtlcl9kZW5zZV9iYXRjaCA6IDQuMTMgbXMKICBHUFUgc3BlZWR1cDogMS42w5cK",[497,2832,2834],{"id":2833},"summary","Summary",[192,2836,2837,2842,2854,2863],{},[195,2838,2839,2841],{},[214,2840,509],{}," picks the right solver for device, shape, and size.\nExplicit backend pinning is for benchmarking or special distributions.",[195,2843,2844,2845,2847,2848,2850,2851,2853],{},"Three CPU JV variants: ",[214,2846,540],{}," (sequential), ",[214,2849,562],{},"\n(AVX2 rectangular), ",[214,2852,551],{}," (AVX2 square, 20–30 % faster at N ≤ 256).",[195,2855,2856,2857,506,2860,2862],{},"Batched 3-D input: ",[214,2858,2859],{},"solve(costs)",[214,2861,1735],{}," on CPU or a\ntiled CUDA kernel when data is on GPU and K ≤ 64.",[195,2864,2865,2867],{},[214,2866,1939],{}," returns matched pairs, unmatched rows, and unmatched\ncolumns without Python-level iteration.",[185,2869,2870,2269,2873,2878],{},[188,2871,2872],{},"Next",[2874,2875,2877],"a",{"href":2876},"03_object_tracking.ipynb","Tutorial 3 — Object Tracking"," builds a\ncomplete SORT-style multi-object tracker on synthetic video data.",[2880,2881,2882],"style",{},"html pre.shiki code .smGrS, html code.shiki .smGrS{--shiki-light:#39ADB5;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .su5hD, html code.shiki .su5hD{--shiki-light:#90A4AE;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sVHd0, html code.shiki .sVHd0{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#D73A49;--shiki-default-font-style:inherit;--shiki-dark:#F97583;--shiki-dark-font-style:inherit}html pre.shiki code .sP7_E, html code.shiki .sP7_E{--shiki-light:#39ADB5;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .skxfh, html code.shiki .skxfh{--shiki-light:#E53935;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .slqww, html code.shiki .slqww{--shiki-light:#6182B8;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sjJ54, html code.shiki .sjJ54{--shiki-light:#39ADB5;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .s_sjI, html code.shiki .s_sjI{--shiki-light:#91B859;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .srdBf, html code.shiki .srdBf{--shiki-light:#F76D47;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .s_hVV, html code.shiki .s_hVV{--shiki-light:#90A4AE;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sptTA, html code.shiki .sptTA{--shiki-light:#6182B8;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sbsja, html code.shiki .sbsja{--shiki-light:#9C3EDA;--shiki-default:#D73A49;--shiki-dark:#F97583}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 .s99_P, html code.shiki .s99_P{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#E36209;--shiki-default-font-style:inherit;--shiki-dark:#FFAB70;--shiki-dark-font-style:inherit}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 pre.shiki code .sGLFI, html code.shiki .sGLFI{--shiki-light:#6182B8;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sFwrP, html code.shiki .sFwrP{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#24292E;--shiki-default-font-style:inherit;--shiki-dark:#E1E4E8;--shiki-dark-font-style:inherit}html pre.shiki code .s39Yj, html code.shiki .s39Yj{--shiki-light:#39ADB5;--shiki-default:#005CC5;--shiki-dark:#79B8FF}",{"title":224,"searchDepth":252,"depth":252,"links":2884},[2885,2886,2887,2888,2891,2892],{"id":499,"depth":242,"text":500},{"id":866,"depth":242,"text":867},{"id":1052,"depth":242,"text":1053},{"id":1721,"depth":242,"text":1722,"children":2889},[2890],{"id":1918,"depth":252,"text":1919},{"id":2316,"depth":242,"text":2317},{"id":2833,"depth":242,"text":2834},"md",{"notebook":255},{"icon":121},{"title":123,"description":190},"sm8l4w3IY3S87RjcslKhBPuSc1WYhG9Iy8DYW9_GBg0",[2899,2900],{"title":118,"path":119,"stem":120,"description":190,"icon":121,"children":-1},{"title":127,"path":128,"stem":129,"description":190,"icon":121,"children":-1},1785218166011]