[{"data":1,"prerenderedAt":766},["ShallowReactive",2],{"navigation":3,"\u002Falgorithms\u002Ftransport":174,"\u002Falgorithms\u002Ftransport-surround":761},[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":59,"api":176,"body":177,"description":755,"extension":756,"links":176,"meta":757,"navigation":758,"path":60,"seo":759,"stem":61,"__hash__":760},"docs\u002F2.algorithms\u002F2.transport\u002Findex.md",null,{"type":178,"value":179,"toc":744},"minimark",[180,228,231,361,366,379,384,395,401,405,408,432,436,442,445,449,452,465,488,491,502,506,578,585,588,593,683,687,733,740],[181,182,183,184,188,189,192,193,196,197,200,201,204,205,209,210,213,214,217,218,221,222,224,225,227],"p",{},"The ",[185,186,187],"strong",{},"transport"," family solves the ",[185,190,191],{},"optimal transport (OT) problem",": given a cost function\nbetween two sets of points or distributions, find the minimum-cost way to move mass from one\nto the other. Unlike hard one-to-one assignment (where each item is matched to exactly one other), transport handles ",[185,194,195],{},"continuous distributions",",\n",[185,198,199],{},"unequal total mass",", and returns ",[185,202,203],{},"soft, differentiable plans"," (matrices ",[206,207,208],"code",{},"P"," where\n",[206,211,212],{},"P[i,j]"," is the fraction of mass moved from source ",[206,215,216],{},"i"," to target ",[206,219,220],{},"j","; \"soft\" means entries\nare fractional values in (0,1) rather than hard 0\u002F1 assignments) rather than hard integer\nindices (where row ",[206,223,216],{}," is mapped to a single column ",[206,226,220],{},").",[181,229,230],{},"torchmatch exposes two surfaces:",[232,233,238],"pre",{"className":234,"code":235,"language":236,"meta":237,"style":237},"language-python shiki shiki-themes material-theme-lighter github-light github-dark","import torchmatch\n\n# Matrix face: precomputed cost matrix in, log-plan or divergence out\nlog_plan = torchmatch.transport.matrix.solve(cost)        # (B, N, M)\n\n# Samples face: raw point clouds in, scalar loss out (CUDA only)\nloss = torchmatch.transport.samples.loss(x, y)            # scalar\n","python","",[206,239,240,253,260,267,310,315,321],{"__ignoreMap":237},[241,242,245,249],"span",{"class":243,"line":244},"line",1,[241,246,248],{"class":247},"sVHd0","import",[241,250,252],{"class":251},"su5hD"," torchmatch\n",[241,254,256],{"class":243,"line":255},2,[241,257,259],{"emptyLinePlaceholder":258},true,"\n",[241,261,263],{"class":243,"line":262},3,[241,264,266],{"class":265},"sutJx","# Matrix face: precomputed cost matrix in, log-plan or divergence out\n",[241,268,270,273,277,280,284,287,289,292,294,298,301,304,307],{"class":243,"line":269},4,[241,271,272],{"class":251},"log_plan ",[241,274,276],{"class":275},"smGrS","=",[241,278,279],{"class":251}," torchmatch",[241,281,283],{"class":282},"sP7_E",".",[241,285,187],{"class":286},"skxfh",[241,288,283],{"class":282},[241,290,291],{"class":286},"matrix",[241,293,283],{"class":282},[241,295,297],{"class":296},"slqww","solve",[241,299,300],{"class":282},"(",[241,302,303],{"class":296},"cost",[241,305,306],{"class":282},")",[241,308,309],{"class":265},"        # (B, N, M)\n",[241,311,313],{"class":243,"line":312},5,[241,314,259],{"emptyLinePlaceholder":258},[241,316,318],{"class":243,"line":317},6,[241,319,320],{"class":265},"# Samples face: raw point clouds in, scalar loss out (CUDA only)\n",[241,322,324,327,329,331,333,335,337,340,342,345,347,350,353,356,358],{"class":243,"line":323},7,[241,325,326],{"class":251},"loss ",[241,328,276],{"class":275},[241,330,279],{"class":251},[241,332,283],{"class":282},[241,334,187],{"class":286},[241,336,283],{"class":282},[241,338,339],{"class":286},"samples",[241,341,283],{"class":282},[241,343,344],{"class":296},"loss",[241,346,300],{"class":282},[241,348,349],{"class":296},"x",[241,351,352],{"class":282},",",[241,354,355],{"class":296}," y",[241,357,306],{"class":282},[241,359,360],{"class":265},"            # scalar\n",[362,363,365],"h2",{"id":364},"when-transport-is-the-right-tool","When transport is the right tool",[181,367,368,369,372,373,375,376,378],{},"Transport is the right tool when you need a ",[185,370,371],{},"continuous, differentiable, or partial\nmatching"," between distributions — when the right answer is not a hard integer index\n(row ",[206,374,216],{}," assigned to exactly one column ",[206,377,220],{},") but a soft plan, a distance, or a soft plan (called a coupling) that admits gradients.",[380,381,383],"h3",{"id":382},"geometric-learning-and-3d-shape","Geometric learning and 3D shape",[181,385,386,387,390,391,394],{},"Point clouds lack a fixed pairing: two clouds representing the same shape may have\ntheir points in different orders, at different densities, and with noise. A naive\nper-point L2 loss requires a predetermined one-to-one correspondence; the Wasserstein loss does not. ",[206,388,389],{},"samples.loss","\ncomputes ",[206,392,393],{},"W_2^2"," between two point sets on the fly — no cost matrix, no pre-sorting — and\ngradients flow back through both sets. This makes it a natural training objective for\nshape autoencoders, deformable registration networks, and any model whose output is an\nunordered set of 3D coordinates.",[181,396,397,398,400],{},"The squared-2-Wasserstein distance also has favourable geometry: it measures how far apart two point distributions are in a way that tracks the actual spatial distances between points, so a model\nminimising ",[206,399,393],{}," is directly optimised for the perceptual task of producing the right\nshape, not just the right pixel values.",[380,402,404],{"id":403},"soft-differentiable-set-matching","Soft, differentiable set-matching",[181,406,407],{},"Some detection models use a one-to-one matching step (called the Hungarian algorithm) to assign each predicted bounding box to one ground-truth\ntarget. This step is non-differentiable: picking the single best match is a discrete (hard) decision, so no gradient can flow backward through that choice into the prediction network.",[181,409,410,411,414,415,418,419,421,422,424,425,427,428,431],{},"Replacing the Hungarian step with a Sinkhorn plan gives a ",[185,412,413],{},"soft matching"," that\ninterpolates between all possible pairings. Each plan entry ",[206,416,417],{},"P_ij ∈ [0,1]"," is the\nprobability that prediction ",[206,420,216],{}," matches target ",[206,423,220],{},". The per-pair loss is a\nweighted sum over the plan, and gradients flow smoothly through ",[206,426,208],{}," back to the cost matrix\nand hence to the network. Reducing the regularisation ",[206,429,430],{},"ε"," toward 0 sharpens the plan toward a hard one-to-one matching; raising it softens the plan toward equal weight on every possible pairing.",[380,433,435],{"id":434},"domain-adaptation","Domain adaptation",[181,437,438,439,441],{},"A model trained on labelled source data and deployed on shifted target data can fail\nbecause the feature distributions differ. Optimal transport provides a coupling between\nsource and target feature clouds that quantifies and corrects for this shift: the plan ",[206,440,208],{},"\nmaps source samples to their closest counterparts in the target distribution (in transport\ndistance), which can then be used to re-weight, interpolate, or align the representations.",[181,443,444],{},"The Sinkhorn divergence between source and target feature distributions is also a\ndifferentiable domain-discrepancy loss: minimising it drives the encoder to produce features\nthat are transport-close across domains, without needing an adversarial training loop.",[380,446,448],{"id":447},"robust-partial-matching","Robust partial matching",[181,450,451],{},"Balanced OT requires that the total weight of the source points equals the total weight of the target points (in the simplest case, both sides have the same number of equally-weighted points). In practice,\nthis fails when:",[453,454,455,459,462],"ul",{},[456,457,458],"li",{},"Detections include false positives with no ground-truth counterpart.",[456,460,461],{},"Two distributions have genuinely different total counts (e.g. the number of cells in two\nbiological conditions).",[456,463,464],{},"One side has outliers that should be ignored rather than forced into the coupling.",[181,466,467,468,471,472,475,476,478,479,481,482,484,485,487],{},"Unbalanced OT (the ",[206,469,470],{},"UNBALANCED_SINKHORN"," backend and the ",[206,473,474],{},"reach"," kwargs on ",[206,477,389],{},")\nrelaxes the requirement that all mass must be exactly matched, adding a penalty (called KL divergence) for any unmatched portion. Points that cannot be matched cheaply\nare allowed to \"disappear\" — contributing to the marginal residual (the unmatched portion\nof each distribution's total mass) rather than to the plan.\nThe ",[206,480,474],{}," parameter controls the tolerance: small ",[206,483,474],{}," is permissive; large ",[206,486,474],{},"\napproaches balanced OT.",[489,490],"hr",{},[181,492,493,494,497,498,501],{},"If the problem requires a ",[185,495,496],{},"hard, integer-valued, one-to-one matching"," with no\nregularisation, look at ",[499,500,16],"a",{"href":17}," instead.",[362,503,505],{"id":504},"two-surfaces","Two surfaces",[507,508,509,528],"table",{},[510,511,512],"thead",{},[513,514,515,519,522,525],"tr",{},[516,517,518],"th",{},"Surface",[516,520,521],{},"Input",[516,523,524],{},"Output",[516,526,527],{},"Hardware",[529,530,531,555],"tbody",{},[513,532,533,539,549,552],{},[534,535,536],"td",{},[206,537,538],{},"transport.matrix",[534,540,541,542,545,546],{},"cost matrix ",[206,543,544],{},"(N, M)"," or ",[206,547,548],{},"(B, N, M)",[534,550,551],{},"log-plan or scalar divergence",[534,553,554],{},"CPU and CUDA",[513,556,557,562,572,575],{},[534,558,559],{},[206,560,561],{},"transport.samples",[534,563,564,565,568,569],{},"point clouds ",[206,566,567],{},"(N, D)"," and ",[206,570,571],{},"(M, D)",[534,573,574],{},"scalar Sinkhorn loss",[534,576,577],{},"CUDA only",[181,579,580,581,584],{},"The matrix surface requires a cost matrix you construct yourself. The samples surface\ncomputes squared-Euclidean costs on the fly inside Triton kernels — no ",[206,582,583],{},"N × M"," allocation.",[362,586,51],{"id":587},"backends",[181,589,183,590,592],{},[206,591,538],{}," dispatcher accepts four backends:",[507,594,595,611],{},[510,596,597],{},[513,598,599,602,605,608],{},[516,600,601],{},"Backend",[516,603,604],{},"Returns",[516,606,607],{},"Differentiable",[516,609,610],{},"Notes",[529,612,613,632,650,665],{},[513,614,615,621,626,629],{},[534,616,617,620],{},[206,618,619],{},"LOG_SINKHORN"," (default)",[534,622,623,624],{},"log-plan ",[206,625,548],{},[534,627,628],{},"yes",[534,630,631],{},"log-plan (the transport plan stored in log-space for numerical stability); entropic regularisation",[513,633,634,639,645,647],{},[534,635,636],{},[206,637,638],{},"SINKHORN_DIVERGENCE",[534,640,641,642],{},"scalar ",[206,643,644],{},"(B,)",[534,646,628],{},[534,648,649],{},"debiased; zero when distributions match",[513,651,652,656,660,662],{},[534,653,654],{},[206,655,470],{},[534,657,623,658],{},[206,659,548],{},[534,661,628],{},[534,663,664],{},"KL-relaxed marginals; handles outliers",[513,666,667,672,677,680],{},[534,668,669],{},[206,670,671],{},"EXACT_EMD",[534,673,674,675],{},"plan ",[206,676,548],{},[534,678,679],{},"no",[534,681,682],{},"network simplex; exact; CPU only",[362,684,686],{"id":685},"in-this-section","In this section",[453,688,689,699,704,709,718,723,728],{},[456,690,691,693,694,568,697],{},[499,692,22],{"href":65}," — first use of ",[206,695,696],{},"matrix.solve",[206,698,389],{},[456,700,701,703],{},[499,702,68],{"href":69}," — end-to-end Wasserstein training loss",[456,705,706,708],{},[499,707,9],{"href":72}," — Sinkhorn, debiasing, unbalanced OT, network simplex",[456,710,711,713,714,568,716],{},[499,712,33],{"href":75}," — full signatures for ",[206,715,696],{},[206,717,389],{},[456,719,720,722],{},[499,721,37],{"href":78}," — which backend to use and when",[456,724,725,727],{},[499,726,81],{"href":82}," — wheel vs JIT runtime paths, build-time and\nruntime environment variables",[456,729,730,732],{},[499,731,41],{"href":85}," — deeper notebook-based walkthroughs, from the\nearth-mover intuition through point clouds",[181,734,735,736,739],{},"See also the ",[499,737,738],{"href":153},"history of applications"," — generative models, domain adaptation, geometric learning, and more.",[741,742,743],"style",{},"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 .su5hD, html code.shiki .su5hD{--shiki-light:#90A4AE;--shiki-default:#24292E;--shiki-dark:#E1E4E8}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 .smGrS, html code.shiki .smGrS{--shiki-light:#39ADB5;--shiki-default:#D73A49;--shiki-dark:#F97583}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 .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);}",{"title":237,"searchDepth":262,"depth":262,"links":745},[746,752,753,754],{"id":364,"depth":255,"text":365,"children":747},[748,749,750,751],{"id":382,"depth":262,"text":383},{"id":403,"depth":262,"text":404},{"id":434,"depth":262,"text":435},{"id":447,"depth":262,"text":448},{"id":504,"depth":255,"text":505},{"id":587,"depth":255,"text":51},{"id":685,"depth":255,"text":686},"Optimal transport solvers — Sinkhorn, Sinkhorn divergence, unbalanced OT, and exact EMD — registered as PyTorch custom ops.","md",{},{"title":59},{"title":59,"description":755},"4E16wMikjqFUBRvinwOkuM8TSYUgJrW0SIqnM9h7PKM",[762,764],{"title":55,"path":56,"stem":57,"description":763,"children":-1},"Building a SORT-style multi-object tracker step by step using torchmatch.assignment.solve and IoU cost matrices.",{"title":22,"path":65,"stem":66,"description":765,"children":-1},"First use of transport.matrix.solve and transport.samples.loss — install, import, and compute your first OT plan.",1785218159644]