[{"data":1,"prerenderedAt":4248},["ShallowReactive",2],{"navigation":3,"\u002Fresources\u002Ftutorials\u002Ftransport\u002F01_optimal_transport":174,"\u002Fresources\u002Ftutorials\u002Ftransport\u002F01_optimal_transport-surround":4245},[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":136,"api":176,"body":177,"description":190,"extension":4240,"links":176,"meta":4241,"navigation":4242,"path":137,"seo":4243,"stem":138,"__hash__":4244},"docs\u002F3.resources\u002F1.tutorials\u002Ftransport\u002F01_optimal_transport.md",null,{"type":178,"value":179,"toc":4230},"minimark",[180,184,191,214,220,436,441,446,452,455,482,486,495,1158,1164,1169,1183,1375,1380,1384,1409,1431,1441,1458,1840,1843,2554,2559,2562,2566,2573,3173,3176,3186,3190,3196,3201,3204,4179,4184,4188,4216,4226],[181,182,136],"h1",{"id":183},"tutorial-1-what-is-optimal-transport",[185,186,187],"p",{},[188,189,190],"strong",{},"What you will learn",[192,193,194,198,201,204,207],"ul",{},[195,196,197],"li",{},"The intuition behind optimal transport (OT) as \"moving mass at minimum cost\"",[195,199,200],{},"How discrete OT relates to the assignment problem",[195,202,203],{},"The Kantorovich formulation: a linear program over transport plans",[195,205,206],{},"What a transport plan looks like and how to read it",[195,208,209,210],{},"How to compute your first OT plan with ",[211,212,213],"code",{},"torchmatch.transport.matrix.solve",[185,215,216,219],{},[188,217,218],{},"Prerequisites"," — Basic probability (distributions, histograms) and\nfamiliarity with NumPy arrays.  No prior knowledge of OT is assumed.",[221,222,227],"pre",{"className":223,"code":224,"language":225,"meta":226,"style":226},"language-python shiki shiki-themes material-theme-lighter github-light github-dark","%matplotlib inline\nimport matplotlib.pyplot as plt\nimport matplotlib.gridspec as gridspec\nimport numpy as np\nimport torch\nimport torchmatch\n\nplt.rcParams.update({\"figure.dpi\": 120, \"font.size\": 11})\nrng = np.random.default_rng(42)\nprint(\"torchmatch\", torchmatch.__version__)\n","python","",[211,228,229,242,266,283,297,305,313,320,376,407],{"__ignoreMap":226},[230,231,234,238],"span",{"class":232,"line":233},"line",1,[230,235,237],{"class":236},"smGrS","%",[230,239,241],{"class":240},"su5hD","matplotlib inline\n",[230,243,245,249,252,256,260,263],{"class":232,"line":244},2,[230,246,248],{"class":247},"sVHd0","import",[230,250,251],{"class":240}," matplotlib",[230,253,255],{"class":254},"sP7_E",".",[230,257,259],{"class":258},"skxfh","pyplot",[230,261,262],{"class":247}," as",[230,264,265],{"class":240}," plt\n",[230,267,269,271,273,275,278,280],{"class":232,"line":268},3,[230,270,248],{"class":247},[230,272,251],{"class":240},[230,274,255],{"class":254},[230,276,277],{"class":258},"gridspec",[230,279,262],{"class":247},[230,281,282],{"class":240}," gridspec\n",[230,284,286,288,291,294],{"class":232,"line":285},4,[230,287,248],{"class":247},[230,289,290],{"class":240}," numpy ",[230,292,293],{"class":247},"as",[230,295,296],{"class":240}," np\n",[230,298,300,302],{"class":232,"line":299},5,[230,301,248],{"class":247},[230,303,304],{"class":240}," torch\n",[230,306,308,310],{"class":232,"line":307},6,[230,309,248],{"class":247},[230,311,312],{"class":240}," torchmatch\n",[230,314,316],{"class":232,"line":315},7,[230,317,319],{"emptyLinePlaceholder":318},true,"\n",[230,321,323,326,328,331,333,337,340,344,348,350,353,357,360,363,366,368,370,373],{"class":232,"line":322},8,[230,324,325],{"class":240},"plt",[230,327,255],{"class":254},[230,329,330],{"class":258},"rcParams",[230,332,255],{"class":254},[230,334,336],{"class":335},"slqww","update",[230,338,339],{"class":254},"({",[230,341,343],{"class":342},"sjJ54","\"",[230,345,347],{"class":346},"s_sjI","figure.dpi",[230,349,343],{"class":342},[230,351,352],{"class":254},":",[230,354,356],{"class":355},"srdBf"," 120",[230,358,359],{"class":254},",",[230,361,362],{"class":342}," \"",[230,364,365],{"class":346},"font.size",[230,367,343],{"class":342},[230,369,352],{"class":254},[230,371,372],{"class":355}," 11",[230,374,375],{"class":254},"})\n",[230,377,379,382,385,388,390,393,395,398,401,404],{"class":232,"line":378},9,[230,380,381],{"class":240},"rng ",[230,383,384],{"class":236},"=",[230,386,387],{"class":240}," np",[230,389,255],{"class":254},[230,391,392],{"class":258},"random",[230,394,255],{"class":254},[230,396,397],{"class":335},"default_rng",[230,399,400],{"class":254},"(",[230,402,403],{"class":355},"42",[230,405,406],{"class":254},")\n",[230,408,410,414,416,418,421,423,425,428,430,434],{"class":232,"line":409},10,[230,411,413],{"class":412},"sptTA","print",[230,415,400],{"class":254},[230,417,343],{"class":342},[230,419,420],{"class":346},"torchmatch",[230,422,343],{"class":342},[230,424,359],{"class":254},[230,426,427],{"class":335}," torchmatch",[230,429,255],{"class":254},[230,431,433],{"class":432},"s_hVV","__version__",[230,435,406],{"class":254},[437,438],"docyard-notebook-output",{"data":439,"kind":440},"dG9yY2htYXRjaCAxLjAuMAo=","stream",[442,443,445],"h2",{"id":444},"_1-the-earth-mover-intuition","1  The earth-mover intuition",[185,447,448,449,451],{},"Imagine two piles of sand on a table.  You want to rearrange the first pile\nso it looks like the second.  Moving a grain of sand costs in proportion to the distance it travels.  ",[188,450,90],{}," finds the cheapest way to\nmove sand from the source pile to match the target pile.",[185,453,454],{},"In ML contexts:",[192,456,457,460,471],{},[195,458,459],{},"\"Sand\" is probability mass (or feature vectors, or pixels).",[195,461,462,463,466,467,470],{},"The two piles are probability distributions ",[211,464,465],{},"a"," (source) and ",[211,468,469],{},"b"," (target).",[195,472,473,474,477,478,481],{},"The cost of moving unit mass from point ",[211,475,476],{},"x_i"," to point ",[211,479,480],{},"y_j"," is given by\na cost function (often squared Euclidean distance).",[442,483,485],{"id":484},"_2-a-1-d-example-two-histograms","2  A 1-D example: two histograms",[185,487,488,489,491,492,494],{},"Start with the simplest possible case: two discrete distributions over a\n1-D grid.  The source ",[211,490,465],{}," puts mass on the left; the target ",[211,493,469],{}," puts mass\non the right.  The optimal transport plan says exactly how to move mass.",[221,496,498],{"className":223,"code":497,"language":225,"meta":226,"style":226},"N_BINS = 8  # grid points\ngrid = np.arange(N_BINS, dtype=np.float32)\n\n# Source: mass concentrated on the left\na = np.array([0.30, 0.25, 0.20, 0.15, 0.05, 0.03, 0.01, 0.01], dtype=np.float32)\n# Target: mass concentrated on the right\nb = np.array([0.01, 0.01, 0.03, 0.05, 0.15, 0.20, 0.25, 0.30], dtype=np.float32)\nassert np.isclose(a.sum(), 1.0) and np.isclose(b.sum(), 1.0)\n\n# Cost matrix: squared Euclidean distance between grid points\nC = (grid[:, None] - grid[None, :]) ** 2  # (8, 8)\n\nfig, axes = plt.subplots(1, 2, figsize=(10, 3))\nfor ax, dist, title, color in zip(\n    axes,\n    [a, b],\n    [\"Source distribution a\", \"Target distribution b\"],\n    [\"#1a6daf\", \"#E03520\"],\n):\n    ax.bar(grid, dist, color=color, alpha=0.8, edgecolor=\"white\")\n    ax.set_xlabel(\"Grid position\")\n    ax.set_ylabel(\"Probability mass\")\n    ax.set_title(title)\n    ax.set_ylim(0, 0.35)\n    ax.grid(True, alpha=0.3)\nplt.tight_layout()\nplt.show()\n",[211,499,500,515,551,555,560,629,634,695,748,752,757,807,812,862,895,904,920,943,966,972,1027,1048,1069,1086,1108,1133,1146],{"__ignoreMap":226},[230,501,502,505,508,511],{"class":232,"line":233},[230,503,504],{"class":432},"N_BINS",[230,506,507],{"class":236}," =",[230,509,510],{"class":355}," 8",[230,512,514],{"class":513},"sutJx","  # grid points\n",[230,516,517,520,522,524,526,529,531,533,535,539,541,544,546,549],{"class":232,"line":244},[230,518,519],{"class":240},"grid ",[230,521,384],{"class":236},[230,523,387],{"class":240},[230,525,255],{"class":254},[230,527,528],{"class":335},"arange",[230,530,400],{"class":254},[230,532,504],{"class":412},[230,534,359],{"class":254},[230,536,538],{"class":537},"s99_P"," dtype",[230,540,384],{"class":236},[230,542,543],{"class":335},"np",[230,545,255],{"class":254},[230,547,548],{"class":258},"float32",[230,550,406],{"class":254},[230,552,553],{"class":232,"line":268},[230,554,319],{"emptyLinePlaceholder":318},[230,556,557],{"class":232,"line":285},[230,558,559],{"class":513},"# Source: mass concentrated on the left\n",[230,561,562,565,567,569,571,574,577,580,582,585,587,590,592,595,597,600,602,605,607,610,612,614,617,619,621,623,625,627],{"class":232,"line":299},[230,563,564],{"class":240},"a ",[230,566,384],{"class":236},[230,568,387],{"class":240},[230,570,255],{"class":254},[230,572,573],{"class":335},"array",[230,575,576],{"class":254},"([",[230,578,579],{"class":355},"0.30",[230,581,359],{"class":254},[230,583,584],{"class":355}," 0.25",[230,586,359],{"class":254},[230,588,589],{"class":355}," 0.20",[230,591,359],{"class":254},[230,593,594],{"class":355}," 0.15",[230,596,359],{"class":254},[230,598,599],{"class":355}," 0.05",[230,601,359],{"class":254},[230,603,604],{"class":355}," 0.03",[230,606,359],{"class":254},[230,608,609],{"class":355}," 0.01",[230,611,359],{"class":254},[230,613,609],{"class":355},[230,615,616],{"class":254},"],",[230,618,538],{"class":537},[230,620,384],{"class":236},[230,622,543],{"class":335},[230,624,255],{"class":254},[230,626,548],{"class":258},[230,628,406],{"class":254},[230,630,631],{"class":232,"line":307},[230,632,633],{"class":513},"# Target: mass concentrated on the right\n",[230,635,636,639,641,643,645,647,649,652,654,656,658,660,662,664,666,668,670,672,674,676,678,681,683,685,687,689,691,693],{"class":232,"line":315},[230,637,638],{"class":240},"b ",[230,640,384],{"class":236},[230,642,387],{"class":240},[230,644,255],{"class":254},[230,646,573],{"class":335},[230,648,576],{"class":254},[230,650,651],{"class":355},"0.01",[230,653,359],{"class":254},[230,655,609],{"class":355},[230,657,359],{"class":254},[230,659,604],{"class":355},[230,661,359],{"class":254},[230,663,599],{"class":355},[230,665,359],{"class":254},[230,667,594],{"class":355},[230,669,359],{"class":254},[230,671,589],{"class":355},[230,673,359],{"class":254},[230,675,584],{"class":355},[230,677,359],{"class":254},[230,679,680],{"class":355}," 0.30",[230,682,616],{"class":254},[230,684,538],{"class":537},[230,686,384],{"class":236},[230,688,543],{"class":335},[230,690,255],{"class":254},[230,692,548],{"class":258},[230,694,406],{"class":254},[230,696,697,700,702,704,707,709,711,713,716,719,722,725,728,730,732,734,736,738,740,742,744,746],{"class":232,"line":322},[230,698,699],{"class":247},"assert",[230,701,387],{"class":240},[230,703,255],{"class":254},[230,705,706],{"class":335},"isclose",[230,708,400],{"class":254},[230,710,465],{"class":335},[230,712,255],{"class":254},[230,714,715],{"class":335},"sum",[230,717,718],{"class":254},"(),",[230,720,721],{"class":355}," 1.0",[230,723,724],{"class":254},")",[230,726,727],{"class":236}," and",[230,729,387],{"class":240},[230,731,255],{"class":254},[230,733,706],{"class":335},[230,735,400],{"class":254},[230,737,469],{"class":335},[230,739,255],{"class":254},[230,741,715],{"class":335},[230,743,718],{"class":254},[230,745,721],{"class":355},[230,747,406],{"class":254},[230,749,750],{"class":232,"line":378},[230,751,319],{"emptyLinePlaceholder":318},[230,753,754],{"class":232,"line":409},[230,755,756],{"class":513},"# Cost matrix: squared Euclidean distance between grid points\n",[230,758,760,763,765,768,771,774,778,781,784,787,790,793,795,798,801,804],{"class":232,"line":759},11,[230,761,762],{"class":240},"C ",[230,764,384],{"class":236},[230,766,767],{"class":254}," (",[230,769,770],{"class":240},"grid",[230,772,773],{"class":254},"[:,",[230,775,777],{"class":776},"s39Yj"," None",[230,779,780],{"class":254},"]",[230,782,783],{"class":236}," -",[230,785,786],{"class":240}," grid",[230,788,789],{"class":254},"[",[230,791,792],{"class":776},"None",[230,794,359],{"class":254},[230,796,797],{"class":254}," :])",[230,799,800],{"class":236}," **",[230,802,803],{"class":355}," 2",[230,805,806],{"class":513},"  # (8, 8)\n",[230,808,810],{"class":232,"line":809},12,[230,811,319],{"emptyLinePlaceholder":318},[230,813,815,818,820,823,825,828,830,833,835,838,840,842,844,847,849,851,854,856,859],{"class":232,"line":814},13,[230,816,817],{"class":240},"fig",[230,819,359],{"class":254},[230,821,822],{"class":240}," axes ",[230,824,384],{"class":236},[230,826,827],{"class":240}," plt",[230,829,255],{"class":254},[230,831,832],{"class":335},"subplots",[230,834,400],{"class":254},[230,836,837],{"class":355},"1",[230,839,359],{"class":254},[230,841,803],{"class":355},[230,843,359],{"class":254},[230,845,846],{"class":537}," figsize",[230,848,384],{"class":236},[230,850,400],{"class":254},[230,852,853],{"class":355},"10",[230,855,359],{"class":254},[230,857,858],{"class":355}," 3",[230,860,861],{"class":254},"))\n",[230,863,865,868,871,873,876,878,881,883,886,889,892],{"class":232,"line":864},14,[230,866,867],{"class":247},"for",[230,869,870],{"class":240}," ax",[230,872,359],{"class":254},[230,874,875],{"class":240}," dist",[230,877,359],{"class":254},[230,879,880],{"class":240}," title",[230,882,359],{"class":254},[230,884,885],{"class":240}," color ",[230,887,888],{"class":247},"in",[230,890,891],{"class":412}," zip",[230,893,894],{"class":254},"(\n",[230,896,898,901],{"class":232,"line":897},15,[230,899,900],{"class":335},"    axes",[230,902,903],{"class":254},",\n",[230,905,907,910,912,914,917],{"class":232,"line":906},16,[230,908,909],{"class":254},"    [",[230,911,465],{"class":335},[230,913,359],{"class":254},[230,915,916],{"class":335}," b",[230,918,919],{"class":254},"],\n",[230,921,923,925,927,930,932,934,936,939,941],{"class":232,"line":922},17,[230,924,909],{"class":254},[230,926,343],{"class":342},[230,928,929],{"class":346},"Source distribution a",[230,931,343],{"class":342},[230,933,359],{"class":254},[230,935,362],{"class":342},[230,937,938],{"class":346},"Target distribution b",[230,940,343],{"class":342},[230,942,919],{"class":254},[230,944,946,948,950,953,955,957,959,962,964],{"class":232,"line":945},18,[230,947,909],{"class":254},[230,949,343],{"class":342},[230,951,952],{"class":346},"#1a6daf",[230,954,343],{"class":342},[230,956,359],{"class":254},[230,958,362],{"class":342},[230,960,961],{"class":346},"#E03520",[230,963,343],{"class":342},[230,965,919],{"class":254},[230,967,969],{"class":232,"line":968},19,[230,970,971],{"class":254},"):\n",[230,973,975,978,980,983,985,987,989,991,993,996,998,1001,1003,1006,1008,1011,1013,1016,1018,1020,1023,1025],{"class":232,"line":974},20,[230,976,977],{"class":240},"    ax",[230,979,255],{"class":254},[230,981,982],{"class":335},"bar",[230,984,400],{"class":254},[230,986,770],{"class":335},[230,988,359],{"class":254},[230,990,875],{"class":335},[230,992,359],{"class":254},[230,994,995],{"class":537}," color",[230,997,384],{"class":236},[230,999,1000],{"class":335},"color",[230,1002,359],{"class":254},[230,1004,1005],{"class":537}," alpha",[230,1007,384],{"class":236},[230,1009,1010],{"class":355},"0.8",[230,1012,359],{"class":254},[230,1014,1015],{"class":537}," edgecolor",[230,1017,384],{"class":236},[230,1019,343],{"class":342},[230,1021,1022],{"class":346},"white",[230,1024,343],{"class":342},[230,1026,406],{"class":254},[230,1028,1030,1032,1034,1037,1039,1041,1044,1046],{"class":232,"line":1029},21,[230,1031,977],{"class":240},[230,1033,255],{"class":254},[230,1035,1036],{"class":335},"set_xlabel",[230,1038,400],{"class":254},[230,1040,343],{"class":342},[230,1042,1043],{"class":346},"Grid position",[230,1045,343],{"class":342},[230,1047,406],{"class":254},[230,1049,1051,1053,1055,1058,1060,1062,1065,1067],{"class":232,"line":1050},22,[230,1052,977],{"class":240},[230,1054,255],{"class":254},[230,1056,1057],{"class":335},"set_ylabel",[230,1059,400],{"class":254},[230,1061,343],{"class":342},[230,1063,1064],{"class":346},"Probability mass",[230,1066,343],{"class":342},[230,1068,406],{"class":254},[230,1070,1072,1074,1076,1079,1081,1084],{"class":232,"line":1071},23,[230,1073,977],{"class":240},[230,1075,255],{"class":254},[230,1077,1078],{"class":335},"set_title",[230,1080,400],{"class":254},[230,1082,1083],{"class":335},"title",[230,1085,406],{"class":254},[230,1087,1089,1091,1093,1096,1098,1101,1103,1106],{"class":232,"line":1088},24,[230,1090,977],{"class":240},[230,1092,255],{"class":254},[230,1094,1095],{"class":335},"set_ylim",[230,1097,400],{"class":254},[230,1099,1100],{"class":355},"0",[230,1102,359],{"class":254},[230,1104,1105],{"class":355}," 0.35",[230,1107,406],{"class":254},[230,1109,1111,1113,1115,1117,1119,1122,1124,1126,1128,1131],{"class":232,"line":1110},25,[230,1112,977],{"class":240},[230,1114,255],{"class":254},[230,1116,770],{"class":335},[230,1118,400],{"class":254},[230,1120,1121],{"class":776},"True",[230,1123,359],{"class":254},[230,1125,1005],{"class":537},[230,1127,384],{"class":236},[230,1129,1130],{"class":355},"0.3",[230,1132,406],{"class":254},[230,1134,1136,1138,1140,1143],{"class":232,"line":1135},26,[230,1137,325],{"class":240},[230,1139,255],{"class":254},[230,1141,1142],{"class":335},"tight_layout",[230,1144,1145],{"class":254},"()\n",[230,1147,1149,1151,1153,1156],{"class":232,"line":1148},27,[230,1150,325],{"class":240},[230,1152,255],{"class":254},[230,1154,1155],{"class":335},"show",[230,1157,1145],{"class":254},[185,1159,1160],{},[1161,1162],"img",{"alt":226,"src":1163},"\u002F_nb\u002F0028ff2598265636.png",[1165,1166,1168],"h3",{"id":1167},"the-cost-matrix","The cost matrix",[185,1170,1171,1174,1175,1178,1179,1182],{},[211,1172,1173],{},"C[i, j]"," = cost of moving one unit of mass from source bin ",[211,1176,1177],{},"i"," to target\nbin ",[211,1180,1181],{},"j",".  Here cost = squared distance, so moving mass far costs more.",[221,1184,1186],{"className":223,"code":1185,"language":225,"meta":226,"style":226},"fig, ax = plt.subplots(figsize=(5, 4))\nim = ax.imshow(C, cmap=\"Blues\")\nax.set_xlabel(\"Target bin j\")\nax.set_ylabel(\"Source bin i\")\nax.set_title(\"Cost matrix  C[i, j] = (i − j)²\")\nplt.colorbar(im, ax=ax, label=\"Squared distance\")\nplt.tight_layout()\nplt.show()\n",[211,1187,1188,1224,1259,1279,1298,1317,1355,1365],{"__ignoreMap":226},[230,1189,1190,1192,1194,1197,1199,1201,1203,1205,1207,1210,1212,1214,1217,1219,1222],{"class":232,"line":233},[230,1191,817],{"class":240},[230,1193,359],{"class":254},[230,1195,1196],{"class":240}," ax ",[230,1198,384],{"class":236},[230,1200,827],{"class":240},[230,1202,255],{"class":254},[230,1204,832],{"class":335},[230,1206,400],{"class":254},[230,1208,1209],{"class":537},"figsize",[230,1211,384],{"class":236},[230,1213,400],{"class":254},[230,1215,1216],{"class":355},"5",[230,1218,359],{"class":254},[230,1220,1221],{"class":355}," 4",[230,1223,861],{"class":254},[230,1225,1226,1229,1231,1233,1235,1238,1240,1243,1245,1248,1250,1252,1255,1257],{"class":232,"line":244},[230,1227,1228],{"class":240},"im ",[230,1230,384],{"class":236},[230,1232,870],{"class":240},[230,1234,255],{"class":254},[230,1236,1237],{"class":335},"imshow",[230,1239,400],{"class":254},[230,1241,1242],{"class":335},"C",[230,1244,359],{"class":254},[230,1246,1247],{"class":537}," cmap",[230,1249,384],{"class":236},[230,1251,343],{"class":342},[230,1253,1254],{"class":346},"Blues",[230,1256,343],{"class":342},[230,1258,406],{"class":254},[230,1260,1261,1264,1266,1268,1270,1272,1275,1277],{"class":232,"line":268},[230,1262,1263],{"class":240},"ax",[230,1265,255],{"class":254},[230,1267,1036],{"class":335},[230,1269,400],{"class":254},[230,1271,343],{"class":342},[230,1273,1274],{"class":346},"Target bin j",[230,1276,343],{"class":342},[230,1278,406],{"class":254},[230,1280,1281,1283,1285,1287,1289,1291,1294,1296],{"class":232,"line":285},[230,1282,1263],{"class":240},[230,1284,255],{"class":254},[230,1286,1057],{"class":335},[230,1288,400],{"class":254},[230,1290,343],{"class":342},[230,1292,1293],{"class":346},"Source bin i",[230,1295,343],{"class":342},[230,1297,406],{"class":254},[230,1299,1300,1302,1304,1306,1308,1310,1313,1315],{"class":232,"line":299},[230,1301,1263],{"class":240},[230,1303,255],{"class":254},[230,1305,1078],{"class":335},[230,1307,400],{"class":254},[230,1309,343],{"class":342},[230,1311,1312],{"class":346},"Cost matrix  C[i, j] = (i − j)²",[230,1314,343],{"class":342},[230,1316,406],{"class":254},[230,1318,1319,1321,1323,1326,1328,1331,1333,1335,1337,1339,1341,1344,1346,1348,1351,1353],{"class":232,"line":307},[230,1320,325],{"class":240},[230,1322,255],{"class":254},[230,1324,1325],{"class":335},"colorbar",[230,1327,400],{"class":254},[230,1329,1330],{"class":335},"im",[230,1332,359],{"class":254},[230,1334,870],{"class":537},[230,1336,384],{"class":236},[230,1338,1263],{"class":335},[230,1340,359],{"class":254},[230,1342,1343],{"class":537}," label",[230,1345,384],{"class":236},[230,1347,343],{"class":342},[230,1349,1350],{"class":346},"Squared distance",[230,1352,343],{"class":342},[230,1354,406],{"class":254},[230,1356,1357,1359,1361,1363],{"class":232,"line":315},[230,1358,325],{"class":240},[230,1360,255],{"class":254},[230,1362,1142],{"class":335},[230,1364,1145],{"class":254},[230,1366,1367,1369,1371,1373],{"class":232,"line":322},[230,1368,325],{"class":240},[230,1370,255],{"class":254},[230,1372,1155],{"class":335},[230,1374,1145],{"class":254},[185,1376,1377],{},[1161,1378],{"alt":226,"src":1379},"\u002F_nb\u002Fd7cefaa37911d074.png",[442,1381,1383],{"id":1382},"_3-the-transport-plan","3  The transport plan",[185,1385,1386,1387,1390,1391,1394,1395,1398,1399,1402,1403,1405,1406,1408],{},"A ",[188,1388,1389],{},"transport plan"," ",[211,1392,1393],{},"P"," is an ",[211,1396,1397],{},"N × M"," matrix where ",[211,1400,1401],{},"P[i, j]"," is the\namount of mass moved from source bin ",[211,1404,1177],{}," to target bin ",[211,1407,1181],{},".  It must\nsatisfy two constraints:",[192,1410,1411,1421],{},[195,1412,1413,1416,1417,1420],{},[188,1414,1415],{},"Source marginal",": every row sums to ",[211,1418,1419],{},"a[i]","  (all source mass is shipped)",[195,1422,1423,1426,1427,1430],{},[188,1424,1425],{},"Target marginal",": every column sums to ",[211,1428,1429],{},"b[j]","  (target receives the right mass)",[185,1432,1433,1434,1437,1438,255],{},"The ",[188,1435,1436],{},"optimal"," plan minimises the total transport cost ",[211,1439,1440],{},"sum_{ij} P[i,j] * C[i,j]",[185,1442,1443,1444,1447,1448,1450,1451,1453,1454,1457],{},"OT is a ",[188,1445,1446],{},"generalisation of the assignment problem",": when ",[211,1449,465],{}," and ",[211,1452,469],{}," are\nboth uniform (",[211,1455,1456],{},"a[i] = b[j] = 1\u002FN","), the cheapest plan is always a\npermutation matrix — exactly the assignment problem solution.",[221,1459,1461],{"className":223,"code":1460,"language":225,"meta":226,"style":226},"# Solve with torchmatch (default: entropic regularisation, reg=0.1)\ncost_t = torch.tensor(C).unsqueeze(0)  # (1, 8, 8) — batch dimension required\na_t = torch.tensor(a).unsqueeze(0)  # (1, 8)\nb_t = torch.tensor(b).unsqueeze(0)  # (1, 8)\n\nlog_plan = torchmatch.transport.matrix.solve(cost_t, a=a_t, b=b_t, reg=0.01, n_iter=500)\nP = log_plan.exp().squeeze(0).numpy()  # (8, 8)\n\nprint(f\"Plan shape: {P.shape}\")\nprint(f\"Row sums (should ≈ a): {P.sum(axis=1).round(3)}\")\nprint(f\"Col sums (should ≈ b): {P.sum(axis=0).round(3)}\")\ntransport_cost = (P * C).sum()\nprint(f\"Total transport cost: {transport_cost:.4f}\")\n",[211,1462,1463,1468,1502,1532,1561,1565,1634,1669,1673,1703,1749,1792,1815],{"__ignoreMap":226},[230,1464,1465],{"class":232,"line":233},[230,1466,1467],{"class":513},"# Solve with torchmatch (default: entropic regularisation, reg=0.1)\n",[230,1469,1470,1473,1475,1478,1480,1483,1485,1487,1490,1493,1495,1497,1499],{"class":232,"line":244},[230,1471,1472],{"class":240},"cost_t ",[230,1474,384],{"class":236},[230,1476,1477],{"class":240}," torch",[230,1479,255],{"class":254},[230,1481,1482],{"class":335},"tensor",[230,1484,400],{"class":254},[230,1486,1242],{"class":335},[230,1488,1489],{"class":254},").",[230,1491,1492],{"class":335},"unsqueeze",[230,1494,400],{"class":254},[230,1496,1100],{"class":355},[230,1498,724],{"class":254},[230,1500,1501],{"class":513},"  # (1, 8, 8) — batch dimension required\n",[230,1503,1504,1507,1509,1511,1513,1515,1517,1519,1521,1523,1525,1527,1529],{"class":232,"line":268},[230,1505,1506],{"class":240},"a_t ",[230,1508,384],{"class":236},[230,1510,1477],{"class":240},[230,1512,255],{"class":254},[230,1514,1482],{"class":335},[230,1516,400],{"class":254},[230,1518,465],{"class":335},[230,1520,1489],{"class":254},[230,1522,1492],{"class":335},[230,1524,400],{"class":254},[230,1526,1100],{"class":355},[230,1528,724],{"class":254},[230,1530,1531],{"class":513},"  # (1, 8)\n",[230,1533,1534,1537,1539,1541,1543,1545,1547,1549,1551,1553,1555,1557,1559],{"class":232,"line":285},[230,1535,1536],{"class":240},"b_t ",[230,1538,384],{"class":236},[230,1540,1477],{"class":240},[230,1542,255],{"class":254},[230,1544,1482],{"class":335},[230,1546,400],{"class":254},[230,1548,469],{"class":335},[230,1550,1489],{"class":254},[230,1552,1492],{"class":335},[230,1554,400],{"class":254},[230,1556,1100],{"class":355},[230,1558,724],{"class":254},[230,1560,1531],{"class":513},[230,1562,1563],{"class":232,"line":299},[230,1564,319],{"emptyLinePlaceholder":318},[230,1566,1567,1570,1572,1574,1576,1579,1581,1584,1586,1589,1591,1594,1596,1599,1601,1604,1606,1608,1610,1613,1615,1618,1620,1622,1624,1627,1629,1632],{"class":232,"line":307},[230,1568,1569],{"class":240},"log_plan ",[230,1571,384],{"class":236},[230,1573,427],{"class":240},[230,1575,255],{"class":254},[230,1577,1578],{"class":258},"transport",[230,1580,255],{"class":254},[230,1582,1583],{"class":258},"matrix",[230,1585,255],{"class":254},[230,1587,1588],{"class":335},"solve",[230,1590,400],{"class":254},[230,1592,1593],{"class":335},"cost_t",[230,1595,359],{"class":254},[230,1597,1598],{"class":537}," a",[230,1600,384],{"class":236},[230,1602,1603],{"class":335},"a_t",[230,1605,359],{"class":254},[230,1607,916],{"class":537},[230,1609,384],{"class":236},[230,1611,1612],{"class":335},"b_t",[230,1614,359],{"class":254},[230,1616,1617],{"class":537}," reg",[230,1619,384],{"class":236},[230,1621,651],{"class":355},[230,1623,359],{"class":254},[230,1625,1626],{"class":537}," n_iter",[230,1628,384],{"class":236},[230,1630,1631],{"class":355},"500",[230,1633,406],{"class":254},[230,1635,1636,1639,1641,1644,1646,1649,1652,1655,1657,1659,1661,1664,1667],{"class":232,"line":315},[230,1637,1638],{"class":240},"P ",[230,1640,384],{"class":236},[230,1642,1643],{"class":240}," log_plan",[230,1645,255],{"class":254},[230,1647,1648],{"class":335},"exp",[230,1650,1651],{"class":254},"().",[230,1653,1654],{"class":335},"squeeze",[230,1656,400],{"class":254},[230,1658,1100],{"class":355},[230,1660,1489],{"class":254},[230,1662,1663],{"class":335},"numpy",[230,1665,1666],{"class":254},"()",[230,1668,806],{"class":513},[230,1670,1671],{"class":232,"line":322},[230,1672,319],{"emptyLinePlaceholder":318},[230,1674,1675,1677,1679,1683,1686,1689,1691,1693,1696,1699,1701],{"class":232,"line":378},[230,1676,413],{"class":412},[230,1678,400],{"class":254},[230,1680,1682],{"class":1681},"sbsja","f",[230,1684,1685],{"class":346},"\"Plan shape: ",[230,1687,1688],{"class":355},"{",[230,1690,1393],{"class":335},[230,1692,255],{"class":254},[230,1694,1695],{"class":258},"shape",[230,1697,1698],{"class":355},"}",[230,1700,343],{"class":346},[230,1702,406],{"class":254},[230,1704,1705,1707,1709,1711,1714,1716,1718,1720,1722,1724,1727,1729,1731,1733,1736,1738,1741,1743,1745,1747],{"class":232,"line":409},[230,1706,413],{"class":412},[230,1708,400],{"class":254},[230,1710,1682],{"class":1681},[230,1712,1713],{"class":346},"\"Row sums (should ≈ a): ",[230,1715,1688],{"class":355},[230,1717,1393],{"class":335},[230,1719,255],{"class":254},[230,1721,715],{"class":335},[230,1723,400],{"class":254},[230,1725,1726],{"class":537},"axis",[230,1728,384],{"class":236},[230,1730,837],{"class":355},[230,1732,1489],{"class":254},[230,1734,1735],{"class":335},"round",[230,1737,400],{"class":254},[230,1739,1740],{"class":355},"3",[230,1742,724],{"class":254},[230,1744,1698],{"class":355},[230,1746,343],{"class":346},[230,1748,406],{"class":254},[230,1750,1751,1753,1755,1757,1760,1762,1764,1766,1768,1770,1772,1774,1776,1778,1780,1782,1784,1786,1788,1790],{"class":232,"line":759},[230,1752,413],{"class":412},[230,1754,400],{"class":254},[230,1756,1682],{"class":1681},[230,1758,1759],{"class":346},"\"Col sums (should ≈ b): ",[230,1761,1688],{"class":355},[230,1763,1393],{"class":335},[230,1765,255],{"class":254},[230,1767,715],{"class":335},[230,1769,400],{"class":254},[230,1771,1726],{"class":537},[230,1773,384],{"class":236},[230,1775,1100],{"class":355},[230,1777,1489],{"class":254},[230,1779,1735],{"class":335},[230,1781,400],{"class":254},[230,1783,1740],{"class":355},[230,1785,724],{"class":254},[230,1787,1698],{"class":355},[230,1789,343],{"class":346},[230,1791,406],{"class":254},[230,1793,1794,1797,1799,1801,1803,1806,1809,1811,1813],{"class":232,"line":809},[230,1795,1796],{"class":240},"transport_cost ",[230,1798,384],{"class":236},[230,1800,767],{"class":254},[230,1802,1638],{"class":240},[230,1804,1805],{"class":236},"*",[230,1807,1808],{"class":240}," C",[230,1810,1489],{"class":254},[230,1812,715],{"class":335},[230,1814,1145],{"class":254},[230,1816,1817,1819,1821,1823,1826,1828,1831,1834,1836,1838],{"class":232,"line":814},[230,1818,413],{"class":412},[230,1820,400],{"class":254},[230,1822,1682],{"class":1681},[230,1824,1825],{"class":346},"\"Total transport cost: ",[230,1827,1688],{"class":355},[230,1829,1830],{"class":335},"transport_cost",[230,1832,1833],{"class":1681},":.4f",[230,1835,1698],{"class":355},[230,1837,343],{"class":346},[230,1839,406],{"class":254},[437,1841],{"data":1842,"kind":440},"UGxhbiBzaGFwZTogKDgsIDgpClJvdyBzdW1zIChzaG91bGQg4omIIGEpOiBbMC4wNSAgMC4xMTEgMC4wODkgMC4zMzggMC4xMTIgMC4xOCAgMC4wNiAgMC4wNiBdCkNvbCBzdW1zIChzaG91bGQg4omIIGIpOiBbMC4wMSAwLjAxIDAuMDMgMC4wNSAwLjE1IDAuMiAgMC4yNSAwLjMgXQpUb3RhbCB0cmFuc3BvcnQgY29zdDogNC41MDMwCg==",[221,1844,1846],{"className":223,"code":1845,"language":225,"meta":226,"style":226},"fig, axes = plt.subplots(1, 2, figsize=(12, 4))\n\n# Left: the plan as a heatmap\nax = axes[0]\nim = ax.imshow(P, cmap=\"Reds\", vmin=0)\nax.set_xlabel(\"Target bin j\")\nax.set_ylabel(\"Source bin i\")\nax.set_title(\"Transport plan  P[i, j]\")\nplt.colorbar(im, ax=ax, label=\"Mass transported\")\n\n# Right: the plan as flow arrows\nax = axes[1]\nax.bar(grid - 0.2, a, width=0.35, label=\"Source a\", color=\"#1a6daf\", alpha=0.7)\nax.bar(grid + 0.2, b, width=0.35, label=\"Target b\", color=\"#E03520\", alpha=0.7)\n\n# Draw arrows proportional to mass moved\nfor i in range(N_BINS):\n    for j in range(N_BINS):\n        if P[i, j] > 0.005:\n            ax.annotate(\n                \"\",\n                xy=(j + 0.2, 0),\n                xytext=(i - 0.2, 0),\n                arrowprops=dict(\n                    arrowstyle=\"-|>\",\n                    color=\"#555555\",\n                    lw=P[i, j] * 8,\n                    alpha=0.5,\n                ),\n            )\n\nax.set_xlabel(\"Grid position\")\nax.set_ylabel(\"Probability mass\")\nax.set_title(\"Mass flows  (arrow width ∝ amount moved)\")\nax.legend()\nax.grid(True, alpha=0.3)\nplt.tight_layout()\nplt.show()\n",[211,1847,1848,1889,1893,1898,1915,1955,1973,1991,2010,2045,2049,2054,2068,2136,2200,2204,2209,2227,2245,2273,2285,2292,2316,2338,2351,2367,2383,2409,2422,2428,2434,2439,2458,2477,2497,2509,2532,2543],{"__ignoreMap":226},[230,1849,1850,1852,1854,1856,1858,1860,1862,1864,1866,1868,1870,1872,1874,1876,1878,1880,1883,1885,1887],{"class":232,"line":233},[230,1851,817],{"class":240},[230,1853,359],{"class":254},[230,1855,822],{"class":240},[230,1857,384],{"class":236},[230,1859,827],{"class":240},[230,1861,255],{"class":254},[230,1863,832],{"class":335},[230,1865,400],{"class":254},[230,1867,837],{"class":355},[230,1869,359],{"class":254},[230,1871,803],{"class":355},[230,1873,359],{"class":254},[230,1875,846],{"class":537},[230,1877,384],{"class":236},[230,1879,400],{"class":254},[230,1881,1882],{"class":355},"12",[230,1884,359],{"class":254},[230,1886,1221],{"class":355},[230,1888,861],{"class":254},[230,1890,1891],{"class":232,"line":244},[230,1892,319],{"emptyLinePlaceholder":318},[230,1894,1895],{"class":232,"line":268},[230,1896,1897],{"class":513},"# Left: the plan as a heatmap\n",[230,1899,1900,1903,1905,1908,1910,1912],{"class":232,"line":285},[230,1901,1902],{"class":240},"ax ",[230,1904,384],{"class":236},[230,1906,1907],{"class":240}," axes",[230,1909,789],{"class":254},[230,1911,1100],{"class":355},[230,1913,1914],{"class":254},"]\n",[230,1916,1917,1919,1921,1923,1925,1927,1929,1931,1933,1935,1937,1939,1942,1944,1946,1949,1951,1953],{"class":232,"line":299},[230,1918,1228],{"class":240},[230,1920,384],{"class":236},[230,1922,870],{"class":240},[230,1924,255],{"class":254},[230,1926,1237],{"class":335},[230,1928,400],{"class":254},[230,1930,1393],{"class":335},[230,1932,359],{"class":254},[230,1934,1247],{"class":537},[230,1936,384],{"class":236},[230,1938,343],{"class":342},[230,1940,1941],{"class":346},"Reds",[230,1943,343],{"class":342},[230,1945,359],{"class":254},[230,1947,1948],{"class":537}," vmin",[230,1950,384],{"class":236},[230,1952,1100],{"class":355},[230,1954,406],{"class":254},[230,1956,1957,1959,1961,1963,1965,1967,1969,1971],{"class":232,"line":307},[230,1958,1263],{"class":240},[230,1960,255],{"class":254},[230,1962,1036],{"class":335},[230,1964,400],{"class":254},[230,1966,343],{"class":342},[230,1968,1274],{"class":346},[230,1970,343],{"class":342},[230,1972,406],{"class":254},[230,1974,1975,1977,1979,1981,1983,1985,1987,1989],{"class":232,"line":315},[230,1976,1263],{"class":240},[230,1978,255],{"class":254},[230,1980,1057],{"class":335},[230,1982,400],{"class":254},[230,1984,343],{"class":342},[230,1986,1293],{"class":346},[230,1988,343],{"class":342},[230,1990,406],{"class":254},[230,1992,1993,1995,1997,1999,2001,2003,2006,2008],{"class":232,"line":322},[230,1994,1263],{"class":240},[230,1996,255],{"class":254},[230,1998,1078],{"class":335},[230,2000,400],{"class":254},[230,2002,343],{"class":342},[230,2004,2005],{"class":346},"Transport plan  P[i, j]",[230,2007,343],{"class":342},[230,2009,406],{"class":254},[230,2011,2012,2014,2016,2018,2020,2022,2024,2026,2028,2030,2032,2034,2036,2038,2041,2043],{"class":232,"line":378},[230,2013,325],{"class":240},[230,2015,255],{"class":254},[230,2017,1325],{"class":335},[230,2019,400],{"class":254},[230,2021,1330],{"class":335},[230,2023,359],{"class":254},[230,2025,870],{"class":537},[230,2027,384],{"class":236},[230,2029,1263],{"class":335},[230,2031,359],{"class":254},[230,2033,1343],{"class":537},[230,2035,384],{"class":236},[230,2037,343],{"class":342},[230,2039,2040],{"class":346},"Mass transported",[230,2042,343],{"class":342},[230,2044,406],{"class":254},[230,2046,2047],{"class":232,"line":409},[230,2048,319],{"emptyLinePlaceholder":318},[230,2050,2051],{"class":232,"line":759},[230,2052,2053],{"class":513},"# Right: the plan as flow arrows\n",[230,2055,2056,2058,2060,2062,2064,2066],{"class":232,"line":809},[230,2057,1902],{"class":240},[230,2059,384],{"class":236},[230,2061,1907],{"class":240},[230,2063,789],{"class":254},[230,2065,837],{"class":355},[230,2067,1914],{"class":254},[230,2069,2070,2072,2074,2076,2078,2080,2083,2086,2088,2090,2092,2095,2097,2100,2102,2104,2106,2108,2111,2113,2115,2117,2119,2121,2123,2125,2127,2129,2131,2134],{"class":232,"line":814},[230,2071,1263],{"class":240},[230,2073,255],{"class":254},[230,2075,982],{"class":335},[230,2077,400],{"class":254},[230,2079,519],{"class":335},[230,2081,2082],{"class":236},"-",[230,2084,2085],{"class":355}," 0.2",[230,2087,359],{"class":254},[230,2089,1598],{"class":335},[230,2091,359],{"class":254},[230,2093,2094],{"class":537}," width",[230,2096,384],{"class":236},[230,2098,2099],{"class":355},"0.35",[230,2101,359],{"class":254},[230,2103,1343],{"class":537},[230,2105,384],{"class":236},[230,2107,343],{"class":342},[230,2109,2110],{"class":346},"Source a",[230,2112,343],{"class":342},[230,2114,359],{"class":254},[230,2116,995],{"class":537},[230,2118,384],{"class":236},[230,2120,343],{"class":342},[230,2122,952],{"class":346},[230,2124,343],{"class":342},[230,2126,359],{"class":254},[230,2128,1005],{"class":537},[230,2130,384],{"class":236},[230,2132,2133],{"class":355},"0.7",[230,2135,406],{"class":254},[230,2137,2138,2140,2142,2144,2146,2148,2151,2153,2155,2157,2159,2161,2163,2165,2167,2169,2171,2173,2176,2178,2180,2182,2184,2186,2188,2190,2192,2194,2196,2198],{"class":232,"line":864},[230,2139,1263],{"class":240},[230,2141,255],{"class":254},[230,2143,982],{"class":335},[230,2145,400],{"class":254},[230,2147,519],{"class":335},[230,2149,2150],{"class":236},"+",[230,2152,2085],{"class":355},[230,2154,359],{"class":254},[230,2156,916],{"class":335},[230,2158,359],{"class":254},[230,2160,2094],{"class":537},[230,2162,384],{"class":236},[230,2164,2099],{"class":355},[230,2166,359],{"class":254},[230,2168,1343],{"class":537},[230,2170,384],{"class":236},[230,2172,343],{"class":342},[230,2174,2175],{"class":346},"Target b",[230,2177,343],{"class":342},[230,2179,359],{"class":254},[230,2181,995],{"class":537},[230,2183,384],{"class":236},[230,2185,343],{"class":342},[230,2187,961],{"class":346},[230,2189,343],{"class":342},[230,2191,359],{"class":254},[230,2193,1005],{"class":537},[230,2195,384],{"class":236},[230,2197,2133],{"class":355},[230,2199,406],{"class":254},[230,2201,2202],{"class":232,"line":897},[230,2203,319],{"emptyLinePlaceholder":318},[230,2205,2206],{"class":232,"line":906},[230,2207,2208],{"class":513},"# Draw arrows proportional to mass moved\n",[230,2210,2211,2213,2216,2218,2221,2223,2225],{"class":232,"line":922},[230,2212,867],{"class":247},[230,2214,2215],{"class":240}," i ",[230,2217,888],{"class":247},[230,2219,2220],{"class":412}," range",[230,2222,400],{"class":254},[230,2224,504],{"class":412},[230,2226,971],{"class":254},[230,2228,2229,2232,2235,2237,2239,2241,2243],{"class":232,"line":945},[230,2230,2231],{"class":247},"    for",[230,2233,2234],{"class":240}," j ",[230,2236,888],{"class":247},[230,2238,2220],{"class":412},[230,2240,400],{"class":254},[230,2242,504],{"class":412},[230,2244,971],{"class":254},[230,2246,2247,2250,2253,2255,2257,2259,2262,2264,2267,2270],{"class":232,"line":968},[230,2248,2249],{"class":247},"        if",[230,2251,2252],{"class":240}," P",[230,2254,789],{"class":254},[230,2256,1177],{"class":240},[230,2258,359],{"class":254},[230,2260,2261],{"class":240}," j",[230,2263,780],{"class":254},[230,2265,2266],{"class":236}," >",[230,2268,2269],{"class":355}," 0.005",[230,2271,2272],{"class":254},":\n",[230,2274,2275,2278,2280,2283],{"class":232,"line":974},[230,2276,2277],{"class":240},"            ax",[230,2279,255],{"class":254},[230,2281,2282],{"class":335},"annotate",[230,2284,894],{"class":254},[230,2286,2287,2290],{"class":232,"line":1029},[230,2288,2289],{"class":342},"                \"\"",[230,2291,903],{"class":254},[230,2293,2294,2297,2299,2301,2304,2306,2308,2310,2313],{"class":232,"line":1050},[230,2295,2296],{"class":537},"                xy",[230,2298,384],{"class":236},[230,2300,400],{"class":254},[230,2302,2303],{"class":335},"j ",[230,2305,2150],{"class":236},[230,2307,2085],{"class":355},[230,2309,359],{"class":254},[230,2311,2312],{"class":355}," 0",[230,2314,2315],{"class":254},"),\n",[230,2317,2318,2321,2323,2325,2328,2330,2332,2334,2336],{"class":232,"line":1071},[230,2319,2320],{"class":537},"                xytext",[230,2322,384],{"class":236},[230,2324,400],{"class":254},[230,2326,2327],{"class":335},"i ",[230,2329,2082],{"class":236},[230,2331,2085],{"class":355},[230,2333,359],{"class":254},[230,2335,2312],{"class":355},[230,2337,2315],{"class":254},[230,2339,2340,2343,2345,2349],{"class":232,"line":1088},[230,2341,2342],{"class":537},"                arrowprops",[230,2344,384],{"class":236},[230,2346,2348],{"class":2347},"sZMiF","dict",[230,2350,894],{"class":254},[230,2352,2353,2356,2358,2360,2363,2365],{"class":232,"line":1110},[230,2354,2355],{"class":537},"                    arrowstyle",[230,2357,384],{"class":236},[230,2359,343],{"class":342},[230,2361,2362],{"class":346},"-|>",[230,2364,343],{"class":342},[230,2366,903],{"class":254},[230,2368,2369,2372,2374,2376,2379,2381],{"class":232,"line":1135},[230,2370,2371],{"class":537},"                    color",[230,2373,384],{"class":236},[230,2375,343],{"class":342},[230,2377,2378],{"class":346},"#555555",[230,2380,343],{"class":342},[230,2382,903],{"class":254},[230,2384,2385,2388,2390,2392,2394,2396,2398,2400,2402,2405,2407],{"class":232,"line":1148},[230,2386,2387],{"class":537},"                    lw",[230,2389,384],{"class":236},[230,2391,1393],{"class":335},[230,2393,789],{"class":254},[230,2395,1177],{"class":335},[230,2397,359],{"class":254},[230,2399,2261],{"class":335},[230,2401,780],{"class":254},[230,2403,2404],{"class":236}," *",[230,2406,510],{"class":355},[230,2408,903],{"class":254},[230,2410,2412,2415,2417,2420],{"class":232,"line":2411},28,[230,2413,2414],{"class":537},"                    alpha",[230,2416,384],{"class":236},[230,2418,2419],{"class":355},"0.5",[230,2421,903],{"class":254},[230,2423,2425],{"class":232,"line":2424},29,[230,2426,2427],{"class":254},"                ),\n",[230,2429,2431],{"class":232,"line":2430},30,[230,2432,2433],{"class":254},"            )\n",[230,2435,2437],{"class":232,"line":2436},31,[230,2438,319],{"emptyLinePlaceholder":318},[230,2440,2442,2444,2446,2448,2450,2452,2454,2456],{"class":232,"line":2441},32,[230,2443,1263],{"class":240},[230,2445,255],{"class":254},[230,2447,1036],{"class":335},[230,2449,400],{"class":254},[230,2451,343],{"class":342},[230,2453,1043],{"class":346},[230,2455,343],{"class":342},[230,2457,406],{"class":254},[230,2459,2461,2463,2465,2467,2469,2471,2473,2475],{"class":232,"line":2460},33,[230,2462,1263],{"class":240},[230,2464,255],{"class":254},[230,2466,1057],{"class":335},[230,2468,400],{"class":254},[230,2470,343],{"class":342},[230,2472,1064],{"class":346},[230,2474,343],{"class":342},[230,2476,406],{"class":254},[230,2478,2480,2482,2484,2486,2488,2490,2493,2495],{"class":232,"line":2479},34,[230,2481,1263],{"class":240},[230,2483,255],{"class":254},[230,2485,1078],{"class":335},[230,2487,400],{"class":254},[230,2489,343],{"class":342},[230,2491,2492],{"class":346},"Mass flows  (arrow width ∝ amount moved)",[230,2494,343],{"class":342},[230,2496,406],{"class":254},[230,2498,2500,2502,2504,2507],{"class":232,"line":2499},35,[230,2501,1263],{"class":240},[230,2503,255],{"class":254},[230,2505,2506],{"class":335},"legend",[230,2508,1145],{"class":254},[230,2510,2512,2514,2516,2518,2520,2522,2524,2526,2528,2530],{"class":232,"line":2511},36,[230,2513,1263],{"class":240},[230,2515,255],{"class":254},[230,2517,770],{"class":335},[230,2519,400],{"class":254},[230,2521,1121],{"class":776},[230,2523,359],{"class":254},[230,2525,1005],{"class":537},[230,2527,384],{"class":236},[230,2529,1130],{"class":355},[230,2531,406],{"class":254},[230,2533,2535,2537,2539,2541],{"class":232,"line":2534},37,[230,2536,325],{"class":240},[230,2538,255],{"class":254},[230,2540,1142],{"class":335},[230,2542,1145],{"class":254},[230,2544,2546,2548,2550,2552],{"class":232,"line":2545},38,[230,2547,325],{"class":240},[230,2549,255],{"class":254},[230,2551,1155],{"class":335},[230,2553,1145],{"class":254},[185,2555,2556],{},[1161,2557],{"alt":226,"src":2558},"\u002F_nb\u002F4df544d4e8aa649e.png",[185,2560,2561],{},"The plan moves mass from the left bins to the right bins in a \"diagonal\"\npattern: nearby bins exchange more mass than distant ones, matching the\nsquared-distance cost.",[442,2563,2565],{"id":2564},"_4-ot-vs-assignment-when-they-coincide","4  OT vs assignment: when they coincide",[185,2567,2568,2569,2572],{},"When both distributions are uniform (every bin has weight ",[211,2570,2571],{},"1\u002FN",") and the\noptimal plan turns out to be a permutation matrix, OT and LAP give the\nsame answer.",[221,2574,2576],{"className":223,"code":2575,"language":225,"meta":226,"style":226},"N = 5\na_unif = np.ones(N, dtype=np.float32) \u002F N\nb_unif = np.ones(N, dtype=np.float32) \u002F N\n\n# Cost: random non-symmetric\nC_lap = rng.random((N, N)).astype(np.float32)\nprint(\"Cost matrix:\")\nprint(C_lap.round(3))\n\n# Solve as OT (should recover the same optimal permutation as LAP)\ncost_lap = torch.tensor(C_lap).unsqueeze(0)\na_t_u = torch.tensor(a_unif).unsqueeze(0)\nb_t_u = torch.tensor(b_unif).unsqueeze(0)\n\nlog_plan_unif = torchmatch.transport.matrix.solve(\n    cost_lap, a=a_t_u, b=b_t_u, reg=0.001, n_iter=1000\n)\nP_unif = log_plan_unif.exp().squeeze(0).numpy()\n\n# Also solve as LAP\nassignment = torchmatch.assignment.solve(torch.tensor(C_lap))\n\nprint(\"\\nOT plan (thresholded at 0.05):\")\nprint((P_unif * N > 0.5).astype(int))  # permutation matrix\n\nprint(\"\\nLAP assignment:\", assignment.tolist())\nprint(\"LAP as permutation matrix:\")\nperm_matrix = np.zeros((N, N), dtype=int)\nfor i, j in enumerate(assignment.tolist()):\n    perm_matrix[i, j] = 1\nprint(perm_matrix)\n",[211,2577,2578,2588,2627,2662,2666,2671,2711,2726,2745,2749,2754,2781,2809,2837,2841,2864,2905,2909,2937,2941,2946,2979,2983,3001,3035,3039,3067,3082,3115,3142,3162],{"__ignoreMap":226},[230,2579,2580,2583,2585],{"class":232,"line":233},[230,2581,2582],{"class":240},"N ",[230,2584,384],{"class":236},[230,2586,2587],{"class":355}," 5\n",[230,2589,2590,2593,2595,2597,2599,2602,2604,2607,2609,2611,2613,2615,2617,2619,2621,2624],{"class":232,"line":244},[230,2591,2592],{"class":240},"a_unif ",[230,2594,384],{"class":236},[230,2596,387],{"class":240},[230,2598,255],{"class":254},[230,2600,2601],{"class":335},"ones",[230,2603,400],{"class":254},[230,2605,2606],{"class":335},"N",[230,2608,359],{"class":254},[230,2610,538],{"class":537},[230,2612,384],{"class":236},[230,2614,543],{"class":335},[230,2616,255],{"class":254},[230,2618,548],{"class":258},[230,2620,724],{"class":254},[230,2622,2623],{"class":236}," \u002F",[230,2625,2626],{"class":240}," N\n",[230,2628,2629,2632,2634,2636,2638,2640,2642,2644,2646,2648,2650,2652,2654,2656,2658,2660],{"class":232,"line":268},[230,2630,2631],{"class":240},"b_unif ",[230,2633,384],{"class":236},[230,2635,387],{"class":240},[230,2637,255],{"class":254},[230,2639,2601],{"class":335},[230,2641,400],{"class":254},[230,2643,2606],{"class":335},[230,2645,359],{"class":254},[230,2647,538],{"class":537},[230,2649,384],{"class":236},[230,2651,543],{"class":335},[230,2653,255],{"class":254},[230,2655,548],{"class":258},[230,2657,724],{"class":254},[230,2659,2623],{"class":236},[230,2661,2626],{"class":240},[230,2663,2664],{"class":232,"line":285},[230,2665,319],{"emptyLinePlaceholder":318},[230,2667,2668],{"class":232,"line":299},[230,2669,2670],{"class":513},"# Cost: random non-symmetric\n",[230,2672,2673,2676,2678,2681,2683,2685,2688,2690,2692,2695,2698,2701,2703,2705,2707,2709],{"class":232,"line":307},[230,2674,2675],{"class":240},"C_lap ",[230,2677,384],{"class":236},[230,2679,2680],{"class":240}," rng",[230,2682,255],{"class":254},[230,2684,392],{"class":335},[230,2686,2687],{"class":254},"((",[230,2689,2606],{"class":335},[230,2691,359],{"class":254},[230,2693,2694],{"class":335}," N",[230,2696,2697],{"class":254},")).",[230,2699,2700],{"class":335},"astype",[230,2702,400],{"class":254},[230,2704,543],{"class":335},[230,2706,255],{"class":254},[230,2708,548],{"class":258},[230,2710,406],{"class":254},[230,2712,2713,2715,2717,2719,2722,2724],{"class":232,"line":315},[230,2714,413],{"class":412},[230,2716,400],{"class":254},[230,2718,343],{"class":342},[230,2720,2721],{"class":346},"Cost matrix:",[230,2723,343],{"class":342},[230,2725,406],{"class":254},[230,2727,2728,2730,2732,2735,2737,2739,2741,2743],{"class":232,"line":322},[230,2729,413],{"class":412},[230,2731,400],{"class":254},[230,2733,2734],{"class":335},"C_lap",[230,2736,255],{"class":254},[230,2738,1735],{"class":335},[230,2740,400],{"class":254},[230,2742,1740],{"class":355},[230,2744,861],{"class":254},[230,2746,2747],{"class":232,"line":378},[230,2748,319],{"emptyLinePlaceholder":318},[230,2750,2751],{"class":232,"line":409},[230,2752,2753],{"class":513},"# Solve as OT (should recover the same optimal permutation as LAP)\n",[230,2755,2756,2759,2761,2763,2765,2767,2769,2771,2773,2775,2777,2779],{"class":232,"line":759},[230,2757,2758],{"class":240},"cost_lap ",[230,2760,384],{"class":236},[230,2762,1477],{"class":240},[230,2764,255],{"class":254},[230,2766,1482],{"class":335},[230,2768,400],{"class":254},[230,2770,2734],{"class":335},[230,2772,1489],{"class":254},[230,2774,1492],{"class":335},[230,2776,400],{"class":254},[230,2778,1100],{"class":355},[230,2780,406],{"class":254},[230,2782,2783,2786,2788,2790,2792,2794,2796,2799,2801,2803,2805,2807],{"class":232,"line":809},[230,2784,2785],{"class":240},"a_t_u ",[230,2787,384],{"class":236},[230,2789,1477],{"class":240},[230,2791,255],{"class":254},[230,2793,1482],{"class":335},[230,2795,400],{"class":254},[230,2797,2798],{"class":335},"a_unif",[230,2800,1489],{"class":254},[230,2802,1492],{"class":335},[230,2804,400],{"class":254},[230,2806,1100],{"class":355},[230,2808,406],{"class":254},[230,2810,2811,2814,2816,2818,2820,2822,2824,2827,2829,2831,2833,2835],{"class":232,"line":814},[230,2812,2813],{"class":240},"b_t_u ",[230,2815,384],{"class":236},[230,2817,1477],{"class":240},[230,2819,255],{"class":254},[230,2821,1482],{"class":335},[230,2823,400],{"class":254},[230,2825,2826],{"class":335},"b_unif",[230,2828,1489],{"class":254},[230,2830,1492],{"class":335},[230,2832,400],{"class":254},[230,2834,1100],{"class":355},[230,2836,406],{"class":254},[230,2838,2839],{"class":232,"line":864},[230,2840,319],{"emptyLinePlaceholder":318},[230,2842,2843,2846,2848,2850,2852,2854,2856,2858,2860,2862],{"class":232,"line":897},[230,2844,2845],{"class":240},"log_plan_unif ",[230,2847,384],{"class":236},[230,2849,427],{"class":240},[230,2851,255],{"class":254},[230,2853,1578],{"class":258},[230,2855,255],{"class":254},[230,2857,1583],{"class":258},[230,2859,255],{"class":254},[230,2861,1588],{"class":335},[230,2863,894],{"class":254},[230,2865,2866,2869,2871,2873,2875,2878,2880,2882,2884,2887,2889,2891,2893,2896,2898,2900,2902],{"class":232,"line":906},[230,2867,2868],{"class":335},"    cost_lap",[230,2870,359],{"class":254},[230,2872,1598],{"class":537},[230,2874,384],{"class":236},[230,2876,2877],{"class":335},"a_t_u",[230,2879,359],{"class":254},[230,2881,916],{"class":537},[230,2883,384],{"class":236},[230,2885,2886],{"class":335},"b_t_u",[230,2888,359],{"class":254},[230,2890,1617],{"class":537},[230,2892,384],{"class":236},[230,2894,2895],{"class":355},"0.001",[230,2897,359],{"class":254},[230,2899,1626],{"class":537},[230,2901,384],{"class":236},[230,2903,2904],{"class":355},"1000\n",[230,2906,2907],{"class":232,"line":922},[230,2908,406],{"class":254},[230,2910,2911,2914,2916,2919,2921,2923,2925,2927,2929,2931,2933,2935],{"class":232,"line":945},[230,2912,2913],{"class":240},"P_unif ",[230,2915,384],{"class":236},[230,2917,2918],{"class":240}," log_plan_unif",[230,2920,255],{"class":254},[230,2922,1648],{"class":335},[230,2924,1651],{"class":254},[230,2926,1654],{"class":335},[230,2928,400],{"class":254},[230,2930,1100],{"class":355},[230,2932,1489],{"class":254},[230,2934,1663],{"class":335},[230,2936,1145],{"class":254},[230,2938,2939],{"class":232,"line":968},[230,2940,319],{"emptyLinePlaceholder":318},[230,2942,2943],{"class":232,"line":974},[230,2944,2945],{"class":513},"# Also solve as LAP\n",[230,2947,2948,2951,2953,2955,2957,2960,2962,2964,2966,2969,2971,2973,2975,2977],{"class":232,"line":1029},[230,2949,2950],{"class":240},"assignment ",[230,2952,384],{"class":236},[230,2954,427],{"class":240},[230,2956,255],{"class":254},[230,2958,2959],{"class":258},"assignment",[230,2961,255],{"class":254},[230,2963,1588],{"class":335},[230,2965,400],{"class":254},[230,2967,2968],{"class":335},"torch",[230,2970,255],{"class":254},[230,2972,1482],{"class":335},[230,2974,400],{"class":254},[230,2976,2734],{"class":335},[230,2978,861],{"class":254},[230,2980,2981],{"class":232,"line":1050},[230,2982,319],{"emptyLinePlaceholder":318},[230,2984,2985,2987,2989,2991,2994,2997,2999],{"class":232,"line":1071},[230,2986,413],{"class":412},[230,2988,400],{"class":254},[230,2990,343],{"class":342},[230,2992,2993],{"class":432},"\\n",[230,2995,2996],{"class":346},"OT plan (thresholded at 0.05):",[230,2998,343],{"class":342},[230,3000,406],{"class":254},[230,3002,3003,3005,3007,3009,3011,3014,3017,3020,3022,3024,3026,3029,3032],{"class":232,"line":1088},[230,3004,413],{"class":412},[230,3006,2687],{"class":254},[230,3008,2913],{"class":335},[230,3010,1805],{"class":236},[230,3012,3013],{"class":335}," N ",[230,3015,3016],{"class":236},">",[230,3018,3019],{"class":355}," 0.5",[230,3021,1489],{"class":254},[230,3023,2700],{"class":335},[230,3025,400],{"class":254},[230,3027,3028],{"class":2347},"int",[230,3030,3031],{"class":254},"))",[230,3033,3034],{"class":513},"  # permutation matrix\n",[230,3036,3037],{"class":232,"line":1110},[230,3038,319],{"emptyLinePlaceholder":318},[230,3040,3041,3043,3045,3047,3049,3052,3054,3056,3059,3061,3064],{"class":232,"line":1135},[230,3042,413],{"class":412},[230,3044,400],{"class":254},[230,3046,343],{"class":342},[230,3048,2993],{"class":432},[230,3050,3051],{"class":346},"LAP assignment:",[230,3053,343],{"class":342},[230,3055,359],{"class":254},[230,3057,3058],{"class":335}," assignment",[230,3060,255],{"class":254},[230,3062,3063],{"class":335},"tolist",[230,3065,3066],{"class":254},"())\n",[230,3068,3069,3071,3073,3075,3078,3080],{"class":232,"line":1148},[230,3070,413],{"class":412},[230,3072,400],{"class":254},[230,3074,343],{"class":342},[230,3076,3077],{"class":346},"LAP as permutation matrix:",[230,3079,343],{"class":342},[230,3081,406],{"class":254},[230,3083,3084,3087,3089,3091,3093,3096,3098,3100,3102,3104,3107,3109,3111,3113],{"class":232,"line":2411},[230,3085,3086],{"class":240},"perm_matrix ",[230,3088,384],{"class":236},[230,3090,387],{"class":240},[230,3092,255],{"class":254},[230,3094,3095],{"class":335},"zeros",[230,3097,2687],{"class":254},[230,3099,2606],{"class":335},[230,3101,359],{"class":254},[230,3103,2694],{"class":335},[230,3105,3106],{"class":254},"),",[230,3108,538],{"class":537},[230,3110,384],{"class":236},[230,3112,3028],{"class":2347},[230,3114,406],{"class":254},[230,3116,3117,3119,3122,3124,3126,3128,3131,3133,3135,3137,3139],{"class":232,"line":2424},[230,3118,867],{"class":247},[230,3120,3121],{"class":240}," i",[230,3123,359],{"class":254},[230,3125,2234],{"class":240},[230,3127,888],{"class":247},[230,3129,3130],{"class":412}," enumerate",[230,3132,400],{"class":254},[230,3134,2959],{"class":335},[230,3136,255],{"class":254},[230,3138,3063],{"class":335},[230,3140,3141],{"class":254},"()):\n",[230,3143,3144,3147,3149,3151,3153,3155,3157,3159],{"class":232,"line":2430},[230,3145,3146],{"class":240},"    perm_matrix",[230,3148,789],{"class":254},[230,3150,1177],{"class":240},[230,3152,359],{"class":254},[230,3154,2261],{"class":240},[230,3156,780],{"class":254},[230,3158,507],{"class":236},[230,3160,3161],{"class":355}," 1\n",[230,3163,3164,3166,3168,3171],{"class":232,"line":2436},[230,3165,413],{"class":412},[230,3167,400],{"class":254},[230,3169,3170],{"class":335},"perm_matrix",[230,3172,406],{"class":254},[437,3174],{"data":3175,"kind":440},"Q29zdCBtYXRyaXg6CltbMC43NzQgMC40MzkgMC44NTkgMC42OTcgMC4wOTRdCiBbMC45NzYgMC43NjEgMC43ODYgMC4xMjggMC40NSBdCiBbMC4zNzEgMC45MjcgMC42NDQgMC44MjMgMC40NDNdCiBbMC4yMjcgMC41NTUgMC4wNjQgMC44MjggMC42MzJdCiBbMC43NTggMC4zNTUgMC45NzEgMC44OTMgMC43NzhdXQoKT1QgcGxhbiAodGhyZXNob2xkZWQgYXQgMC4wNSk6CltbMCAwIDAgMCAxXQogWzAgMCAwIDEgMF0KIFsxIDAgMCAwIDBdCiBbMCAwIDEgMCAwXQogWzAgMSAwIDAgMF1dCgpMQVAgYXNzaWdubWVudDogWzQsIDMsIDAsIDIsIDFdCkxBUCBhcyBwZXJtdXRhdGlvbiBtYXRyaXg6CltbMCAwIDAgMCAxXQogWzAgMCAwIDEgMF0KIFsxIDAgMCAwIDBdCiBbMCAwIDEgMCAwXQogWzAgMSAwIDAgMF1dCg==",[185,3177,3178,3179,3182,3183,255],{},"With very small regularisation (",[211,3180,3181],{},"reg=0.001","), the OT plan approaches the\nexact LAP solution.  This is the key connection: ",[188,3184,3185],{},"assignment is OT between\nuniform distributions with zero regularisation",[442,3187,3189],{"id":3188},"_5-the-wasserstein-distance","5  The Wasserstein distance",[185,3191,1433,3192,3195],{},[188,3193,3194],{},"Wasserstein distance"," (or earth mover's distance) is the minimum\ntransport cost:",[185,3197,3198],{},[211,3199,3200],{},"W(a, b) = min_P  sum_{ij} P[i, j] * C[i, j]",[185,3202,3203],{},"Unlike the KL divergence or total variation, the Wasserstein distance respects the geometry of the underlying space: transporting mass farther costs more.  This makes it a meaningful distance for comparing distributions over continuous spaces.",[221,3205,3207],{"className":223,"code":3206,"language":225,"meta":226,"style":226},"# Compare two pairs of distributions: one nearby, one far apart\ndef make_gaussian_hist(mean, std, n=8):\n    grid = np.arange(n, dtype=np.float32)\n    w = np.exp(-0.5 * ((grid - mean) \u002F std) ** 2)\n    return (w \u002F w.sum()).astype(np.float32)\n\n\npairs = [\n    (\n        make_gaussian_hist(3.0, 0.8, N_BINS),\n        make_gaussian_hist(4.0, 0.8, N_BINS),\n        \"nearby\",\n    ),\n    (\n        make_gaussian_hist(1.5, 0.8, N_BINS),\n        make_gaussian_hist(6.5, 0.8, N_BINS),\n        \"far apart\",\n    ),\n]\n\nfig, axes = plt.subplots(2, 2, figsize=(11, 6))\nfor row, (ai, bi, label) in enumerate(pairs):\n    cost_pair = torch.tensor(C).unsqueeze(0)\n    log_p = torchmatch.transport.matrix.solve(\n        cost_pair,\n        a=torch.tensor(ai).unsqueeze(0),\n        b=torch.tensor(bi).unsqueeze(0),\n        reg=0.02,\n        n_iter=300,\n    )\n    Pi = log_p.exp().squeeze(0).numpy()\n    w_dist = (Pi * C).sum()\n\n    axes[row, 0].bar(grid, ai, color=\"#1a6daf\", alpha=0.7, label=\"Source\")\n    axes[row, 0].bar(grid, bi, color=\"#E03520\", alpha=0.7, label=\"Target\")\n    axes[row, 0].set_title(f\"Distributions — {label}\\nW = {w_dist:.3f}\")\n    axes[row, 0].legend(fontsize=9)\n    axes[row, 0].set_ylim(0, 0.55)\n\n    im = axes[row, 1].imshow(Pi, cmap=\"Reds\", vmin=0)\n    axes[row, 1].set_title(\"Transport plan\")\n    plt.colorbar(im, ax=axes[row, 1])\n\nplt.suptitle(\"Wasserstein distance grows with distributional shift\", y=1.02)\nplt.tight_layout()\nplt.show()\n",[211,3208,3209,3214,3246,3278,3323,3358,3362,3366,3376,3381,3403,3422,3434,3439,3443,3462,3481,3492,3496,3500,3504,3547,3584,3611,3634,3641,3668,3696,3708,3720,3725,3753,3775,3779,3841,3900,3949,3977,4004,4009,4059,4087,4121,4126,4157,4168],{"__ignoreMap":226},[230,3210,3211],{"class":232,"line":233},[230,3212,3213],{"class":513},"# Compare two pairs of distributions: one nearby, one far apart\n",[230,3215,3216,3219,3223,3225,3229,3231,3234,3236,3239,3241,3244],{"class":232,"line":244},[230,3217,3218],{"class":1681},"def",[230,3220,3222],{"class":3221},"sGLFI"," make_gaussian_hist",[230,3224,400],{"class":254},[230,3226,3228],{"class":3227},"sFwrP","mean",[230,3230,359],{"class":254},[230,3232,3233],{"class":3227}," std",[230,3235,359],{"class":254},[230,3237,3238],{"class":3227}," n",[230,3240,384],{"class":236},[230,3242,3243],{"class":355},"8",[230,3245,971],{"class":254},[230,3247,3248,3251,3253,3255,3257,3259,3261,3264,3266,3268,3270,3272,3274,3276],{"class":232,"line":268},[230,3249,3250],{"class":240},"    grid ",[230,3252,384],{"class":236},[230,3254,387],{"class":240},[230,3256,255],{"class":254},[230,3258,528],{"class":335},[230,3260,400],{"class":254},[230,3262,3263],{"class":335},"n",[230,3265,359],{"class":254},[230,3267,538],{"class":537},[230,3269,384],{"class":236},[230,3271,543],{"class":335},[230,3273,255],{"class":254},[230,3275,548],{"class":258},[230,3277,406],{"class":254},[230,3279,3280,3283,3285,3287,3289,3291,3293,3295,3297,3299,3302,3304,3306,3309,3311,3313,3315,3317,3319,3321],{"class":232,"line":285},[230,3281,3282],{"class":240},"    w ",[230,3284,384],{"class":236},[230,3286,387],{"class":240},[230,3288,255],{"class":254},[230,3290,1648],{"class":335},[230,3292,400],{"class":254},[230,3294,2082],{"class":236},[230,3296,2419],{"class":355},[230,3298,2404],{"class":236},[230,3300,3301],{"class":254}," ((",[230,3303,519],{"class":335},[230,3305,2082],{"class":236},[230,3307,3308],{"class":335}," mean",[230,3310,724],{"class":254},[230,3312,2623],{"class":236},[230,3314,3233],{"class":335},[230,3316,724],{"class":254},[230,3318,800],{"class":236},[230,3320,803],{"class":355},[230,3322,406],{"class":254},[230,3324,3325,3328,3330,3333,3336,3339,3341,3343,3346,3348,3350,3352,3354,3356],{"class":232,"line":299},[230,3326,3327],{"class":247},"    return",[230,3329,767],{"class":254},[230,3331,3332],{"class":240},"w ",[230,3334,3335],{"class":236},"\u002F",[230,3337,3338],{"class":240}," w",[230,3340,255],{"class":254},[230,3342,715],{"class":335},[230,3344,3345],{"class":254},"()).",[230,3347,2700],{"class":335},[230,3349,400],{"class":254},[230,3351,543],{"class":335},[230,3353,255],{"class":254},[230,3355,548],{"class":258},[230,3357,406],{"class":254},[230,3359,3360],{"class":232,"line":307},[230,3361,319],{"emptyLinePlaceholder":318},[230,3363,3364],{"class":232,"line":315},[230,3365,319],{"emptyLinePlaceholder":318},[230,3367,3368,3371,3373],{"class":232,"line":322},[230,3369,3370],{"class":240},"pairs ",[230,3372,384],{"class":236},[230,3374,3375],{"class":254}," [\n",[230,3377,3378],{"class":232,"line":378},[230,3379,3380],{"class":254},"    (\n",[230,3382,3383,3386,3388,3391,3393,3396,3398,3401],{"class":232,"line":409},[230,3384,3385],{"class":335},"        make_gaussian_hist",[230,3387,400],{"class":254},[230,3389,3390],{"class":355},"3.0",[230,3392,359],{"class":254},[230,3394,3395],{"class":355}," 0.8",[230,3397,359],{"class":254},[230,3399,3400],{"class":412}," N_BINS",[230,3402,2315],{"class":254},[230,3404,3405,3407,3409,3412,3414,3416,3418,3420],{"class":232,"line":759},[230,3406,3385],{"class":335},[230,3408,400],{"class":254},[230,3410,3411],{"class":355},"4.0",[230,3413,359],{"class":254},[230,3415,3395],{"class":355},[230,3417,359],{"class":254},[230,3419,3400],{"class":412},[230,3421,2315],{"class":254},[230,3423,3424,3427,3430,3432],{"class":232,"line":809},[230,3425,3426],{"class":342},"        \"",[230,3428,3429],{"class":346},"nearby",[230,3431,343],{"class":342},[230,3433,903],{"class":254},[230,3435,3436],{"class":232,"line":814},[230,3437,3438],{"class":254},"    ),\n",[230,3440,3441],{"class":232,"line":864},[230,3442,3380],{"class":254},[230,3444,3445,3447,3449,3452,3454,3456,3458,3460],{"class":232,"line":897},[230,3446,3385],{"class":335},[230,3448,400],{"class":254},[230,3450,3451],{"class":355},"1.5",[230,3453,359],{"class":254},[230,3455,3395],{"class":355},[230,3457,359],{"class":254},[230,3459,3400],{"class":412},[230,3461,2315],{"class":254},[230,3463,3464,3466,3468,3471,3473,3475,3477,3479],{"class":232,"line":906},[230,3465,3385],{"class":335},[230,3467,400],{"class":254},[230,3469,3470],{"class":355},"6.5",[230,3472,359],{"class":254},[230,3474,3395],{"class":355},[230,3476,359],{"class":254},[230,3478,3400],{"class":412},[230,3480,2315],{"class":254},[230,3482,3483,3485,3488,3490],{"class":232,"line":922},[230,3484,3426],{"class":342},[230,3486,3487],{"class":346},"far apart",[230,3489,343],{"class":342},[230,3491,903],{"class":254},[230,3493,3494],{"class":232,"line":945},[230,3495,3438],{"class":254},[230,3497,3498],{"class":232,"line":968},[230,3499,1914],{"class":254},[230,3501,3502],{"class":232,"line":974},[230,3503,319],{"emptyLinePlaceholder":318},[230,3505,3506,3508,3510,3512,3514,3516,3518,3520,3522,3525,3527,3529,3531,3533,3535,3537,3540,3542,3545],{"class":232,"line":1029},[230,3507,817],{"class":240},[230,3509,359],{"class":254},[230,3511,822],{"class":240},[230,3513,384],{"class":236},[230,3515,827],{"class":240},[230,3517,255],{"class":254},[230,3519,832],{"class":335},[230,3521,400],{"class":254},[230,3523,3524],{"class":355},"2",[230,3526,359],{"class":254},[230,3528,803],{"class":355},[230,3530,359],{"class":254},[230,3532,846],{"class":537},[230,3534,384],{"class":236},[230,3536,400],{"class":254},[230,3538,3539],{"class":355},"11",[230,3541,359],{"class":254},[230,3543,3544],{"class":355}," 6",[230,3546,861],{"class":254},[230,3548,3549,3551,3554,3556,3558,3561,3563,3566,3568,3570,3572,3575,3577,3579,3582],{"class":232,"line":1050},[230,3550,867],{"class":247},[230,3552,3553],{"class":240}," row",[230,3555,359],{"class":254},[230,3557,767],{"class":254},[230,3559,3560],{"class":240},"ai",[230,3562,359],{"class":254},[230,3564,3565],{"class":240}," bi",[230,3567,359],{"class":254},[230,3569,1343],{"class":240},[230,3571,724],{"class":254},[230,3573,3574],{"class":247}," in",[230,3576,3130],{"class":412},[230,3578,400],{"class":254},[230,3580,3581],{"class":335},"pairs",[230,3583,971],{"class":254},[230,3585,3586,3589,3591,3593,3595,3597,3599,3601,3603,3605,3607,3609],{"class":232,"line":1071},[230,3587,3588],{"class":240},"    cost_pair ",[230,3590,384],{"class":236},[230,3592,1477],{"class":240},[230,3594,255],{"class":254},[230,3596,1482],{"class":335},[230,3598,400],{"class":254},[230,3600,1242],{"class":335},[230,3602,1489],{"class":254},[230,3604,1492],{"class":335},[230,3606,400],{"class":254},[230,3608,1100],{"class":355},[230,3610,406],{"class":254},[230,3612,3613,3616,3618,3620,3622,3624,3626,3628,3630,3632],{"class":232,"line":1088},[230,3614,3615],{"class":240},"    log_p ",[230,3617,384],{"class":236},[230,3619,427],{"class":240},[230,3621,255],{"class":254},[230,3623,1578],{"class":258},[230,3625,255],{"class":254},[230,3627,1583],{"class":258},[230,3629,255],{"class":254},[230,3631,1588],{"class":335},[230,3633,894],{"class":254},[230,3635,3636,3639],{"class":232,"line":1110},[230,3637,3638],{"class":335},"        cost_pair",[230,3640,903],{"class":254},[230,3642,3643,3646,3648,3650,3652,3654,3656,3658,3660,3662,3664,3666],{"class":232,"line":1135},[230,3644,3645],{"class":537},"        a",[230,3647,384],{"class":236},[230,3649,2968],{"class":335},[230,3651,255],{"class":254},[230,3653,1482],{"class":335},[230,3655,400],{"class":254},[230,3657,3560],{"class":335},[230,3659,1489],{"class":254},[230,3661,1492],{"class":335},[230,3663,400],{"class":254},[230,3665,1100],{"class":355},[230,3667,2315],{"class":254},[230,3669,3670,3673,3675,3677,3679,3681,3683,3686,3688,3690,3692,3694],{"class":232,"line":1148},[230,3671,3672],{"class":537},"        b",[230,3674,384],{"class":236},[230,3676,2968],{"class":335},[230,3678,255],{"class":254},[230,3680,1482],{"class":335},[230,3682,400],{"class":254},[230,3684,3685],{"class":335},"bi",[230,3687,1489],{"class":254},[230,3689,1492],{"class":335},[230,3691,400],{"class":254},[230,3693,1100],{"class":355},[230,3695,2315],{"class":254},[230,3697,3698,3701,3703,3706],{"class":232,"line":2411},[230,3699,3700],{"class":537},"        reg",[230,3702,384],{"class":236},[230,3704,3705],{"class":355},"0.02",[230,3707,903],{"class":254},[230,3709,3710,3713,3715,3718],{"class":232,"line":2424},[230,3711,3712],{"class":537},"        n_iter",[230,3714,384],{"class":236},[230,3716,3717],{"class":355},"300",[230,3719,903],{"class":254},[230,3721,3722],{"class":232,"line":2430},[230,3723,3724],{"class":254},"    )\n",[230,3726,3727,3730,3732,3735,3737,3739,3741,3743,3745,3747,3749,3751],{"class":232,"line":2436},[230,3728,3729],{"class":240},"    Pi ",[230,3731,384],{"class":236},[230,3733,3734],{"class":240}," log_p",[230,3736,255],{"class":254},[230,3738,1648],{"class":335},[230,3740,1651],{"class":254},[230,3742,1654],{"class":335},[230,3744,400],{"class":254},[230,3746,1100],{"class":355},[230,3748,1489],{"class":254},[230,3750,1663],{"class":335},[230,3752,1145],{"class":254},[230,3754,3755,3758,3760,3762,3765,3767,3769,3771,3773],{"class":232,"line":2441},[230,3756,3757],{"class":240},"    w_dist ",[230,3759,384],{"class":236},[230,3761,767],{"class":254},[230,3763,3764],{"class":240},"Pi ",[230,3766,1805],{"class":236},[230,3768,1808],{"class":240},[230,3770,1489],{"class":254},[230,3772,715],{"class":335},[230,3774,1145],{"class":254},[230,3776,3777],{"class":232,"line":2460},[230,3778,319],{"emptyLinePlaceholder":318},[230,3780,3781,3783,3785,3788,3790,3792,3795,3797,3799,3801,3803,3806,3808,3810,3812,3814,3816,3818,3820,3822,3824,3826,3828,3830,3832,3834,3837,3839],{"class":232,"line":2479},[230,3782,900],{"class":240},[230,3784,789],{"class":254},[230,3786,3787],{"class":240},"row",[230,3789,359],{"class":254},[230,3791,2312],{"class":355},[230,3793,3794],{"class":254},"].",[230,3796,982],{"class":335},[230,3798,400],{"class":254},[230,3800,770],{"class":335},[230,3802,359],{"class":254},[230,3804,3805],{"class":335}," ai",[230,3807,359],{"class":254},[230,3809,995],{"class":537},[230,3811,384],{"class":236},[230,3813,343],{"class":342},[230,3815,952],{"class":346},[230,3817,343],{"class":342},[230,3819,359],{"class":254},[230,3821,1005],{"class":537},[230,3823,384],{"class":236},[230,3825,2133],{"class":355},[230,3827,359],{"class":254},[230,3829,1343],{"class":537},[230,3831,384],{"class":236},[230,3833,343],{"class":342},[230,3835,3836],{"class":346},"Source",[230,3838,343],{"class":342},[230,3840,406],{"class":254},[230,3842,3843,3845,3847,3849,3851,3853,3855,3857,3859,3861,3863,3865,3867,3869,3871,3873,3875,3877,3879,3881,3883,3885,3887,3889,3891,3893,3896,3898],{"class":232,"line":2499},[230,3844,900],{"class":240},[230,3846,789],{"class":254},[230,3848,3787],{"class":240},[230,3850,359],{"class":254},[230,3852,2312],{"class":355},[230,3854,3794],{"class":254},[230,3856,982],{"class":335},[230,3858,400],{"class":254},[230,3860,770],{"class":335},[230,3862,359],{"class":254},[230,3864,3565],{"class":335},[230,3866,359],{"class":254},[230,3868,995],{"class":537},[230,3870,384],{"class":236},[230,3872,343],{"class":342},[230,3874,961],{"class":346},[230,3876,343],{"class":342},[230,3878,359],{"class":254},[230,3880,1005],{"class":537},[230,3882,384],{"class":236},[230,3884,2133],{"class":355},[230,3886,359],{"class":254},[230,3888,1343],{"class":537},[230,3890,384],{"class":236},[230,3892,343],{"class":342},[230,3894,3895],{"class":346},"Target",[230,3897,343],{"class":342},[230,3899,406],{"class":254},[230,3901,3902,3904,3906,3908,3910,3912,3914,3916,3918,3920,3923,3925,3928,3930,3932,3935,3937,3940,3943,3945,3947],{"class":232,"line":2511},[230,3903,900],{"class":240},[230,3905,789],{"class":254},[230,3907,3787],{"class":240},[230,3909,359],{"class":254},[230,3911,2312],{"class":355},[230,3913,3794],{"class":254},[230,3915,1078],{"class":335},[230,3917,400],{"class":254},[230,3919,1682],{"class":1681},[230,3921,3922],{"class":346},"\"Distributions — ",[230,3924,1688],{"class":355},[230,3926,3927],{"class":335},"label",[230,3929,1698],{"class":355},[230,3931,2993],{"class":432},[230,3933,3934],{"class":346},"W = ",[230,3936,1688],{"class":355},[230,3938,3939],{"class":335},"w_dist",[230,3941,3942],{"class":1681},":.3f",[230,3944,1698],{"class":355},[230,3946,343],{"class":346},[230,3948,406],{"class":254},[230,3950,3951,3953,3955,3957,3959,3961,3963,3965,3967,3970,3972,3975],{"class":232,"line":2534},[230,3952,900],{"class":240},[230,3954,789],{"class":254},[230,3956,3787],{"class":240},[230,3958,359],{"class":254},[230,3960,2312],{"class":355},[230,3962,3794],{"class":254},[230,3964,2506],{"class":335},[230,3966,400],{"class":254},[230,3968,3969],{"class":537},"fontsize",[230,3971,384],{"class":236},[230,3973,3974],{"class":355},"9",[230,3976,406],{"class":254},[230,3978,3979,3981,3983,3985,3987,3989,3991,3993,3995,3997,3999,4002],{"class":232,"line":2545},[230,3980,900],{"class":240},[230,3982,789],{"class":254},[230,3984,3787],{"class":240},[230,3986,359],{"class":254},[230,3988,2312],{"class":355},[230,3990,3794],{"class":254},[230,3992,1095],{"class":335},[230,3994,400],{"class":254},[230,3996,1100],{"class":355},[230,3998,359],{"class":254},[230,4000,4001],{"class":355}," 0.55",[230,4003,406],{"class":254},[230,4005,4007],{"class":232,"line":4006},39,[230,4008,319],{"emptyLinePlaceholder":318},[230,4010,4012,4015,4017,4019,4021,4023,4025,4028,4030,4032,4034,4037,4039,4041,4043,4045,4047,4049,4051,4053,4055,4057],{"class":232,"line":4011},40,[230,4013,4014],{"class":240},"    im ",[230,4016,384],{"class":236},[230,4018,1907],{"class":240},[230,4020,789],{"class":254},[230,4022,3787],{"class":240},[230,4024,359],{"class":254},[230,4026,4027],{"class":355}," 1",[230,4029,3794],{"class":254},[230,4031,1237],{"class":335},[230,4033,400],{"class":254},[230,4035,4036],{"class":335},"Pi",[230,4038,359],{"class":254},[230,4040,1247],{"class":537},[230,4042,384],{"class":236},[230,4044,343],{"class":342},[230,4046,1941],{"class":346},[230,4048,343],{"class":342},[230,4050,359],{"class":254},[230,4052,1948],{"class":537},[230,4054,384],{"class":236},[230,4056,1100],{"class":355},[230,4058,406],{"class":254},[230,4060,4062,4064,4066,4068,4070,4072,4074,4076,4078,4080,4083,4085],{"class":232,"line":4061},41,[230,4063,900],{"class":240},[230,4065,789],{"class":254},[230,4067,3787],{"class":240},[230,4069,359],{"class":254},[230,4071,4027],{"class":355},[230,4073,3794],{"class":254},[230,4075,1078],{"class":335},[230,4077,400],{"class":254},[230,4079,343],{"class":342},[230,4081,4082],{"class":346},"Transport plan",[230,4084,343],{"class":342},[230,4086,406],{"class":254},[230,4088,4090,4093,4095,4097,4099,4101,4103,4105,4107,4110,4112,4114,4116,4118],{"class":232,"line":4089},42,[230,4091,4092],{"class":240},"    plt",[230,4094,255],{"class":254},[230,4096,1325],{"class":335},[230,4098,400],{"class":254},[230,4100,1330],{"class":335},[230,4102,359],{"class":254},[230,4104,870],{"class":537},[230,4106,384],{"class":236},[230,4108,4109],{"class":335},"axes",[230,4111,789],{"class":254},[230,4113,3787],{"class":335},[230,4115,359],{"class":254},[230,4117,4027],{"class":355},[230,4119,4120],{"class":254},"])\n",[230,4122,4124],{"class":232,"line":4123},43,[230,4125,319],{"emptyLinePlaceholder":318},[230,4127,4129,4131,4133,4136,4138,4140,4143,4145,4147,4150,4152,4155],{"class":232,"line":4128},44,[230,4130,325],{"class":240},[230,4132,255],{"class":254},[230,4134,4135],{"class":335},"suptitle",[230,4137,400],{"class":254},[230,4139,343],{"class":342},[230,4141,4142],{"class":346},"Wasserstein distance grows with distributional shift",[230,4144,343],{"class":342},[230,4146,359],{"class":254},[230,4148,4149],{"class":537}," y",[230,4151,384],{"class":236},[230,4153,4154],{"class":355},"1.02",[230,4156,406],{"class":254},[230,4158,4160,4162,4164,4166],{"class":232,"line":4159},45,[230,4161,325],{"class":240},[230,4163,255],{"class":254},[230,4165,1142],{"class":335},[230,4167,1145],{"class":254},[230,4169,4171,4173,4175,4177],{"class":232,"line":4170},46,[230,4172,325],{"class":240},[230,4174,255],{"class":254},[230,4176,1155],{"class":335},[230,4178,1145],{"class":254},[185,4180,4181],{},[1161,4182],{"alt":226,"src":4183},"\u002F_nb\u002F32191486a013d19a.png",[442,4185,4187],{"id":4186},"summary","Summary",[192,4189,4190,4195,4208,4211],{},[195,4191,4192,4194],{},[188,4193,90],{}," finds the minimum-cost way to \"move\" one\nprobability distribution to match another.",[195,4196,4197,4198,1390,4200,4202,4203,4205,4206,255],{},"The solution is a ",[188,4199,1389],{},[211,4201,1401],{},": the fraction of mass\nmoved from source ",[211,4204,1177],{}," to target ",[211,4207,1181],{},[195,4209,4210],{},"OT generalises the assignment problem: with uniform distributions and\nzero regularisation, the optimal plan is a permutation matrix.",[195,4212,1433,4213,4215],{},[188,4214,3194],{}," measures how far apart two distributions\nare in a way that respects the geometry of the underlying space.",[185,4217,4218,4221,4222,4225],{},[188,4219,4220],{},"Next",": ",[465,4223,140],{"href":4224},"02_sinkhorn_algorithm.ipynb","\nexplains why exact OT is expensive and how entropic regularisation makes\nlarge-scale OT practical.",[4227,4228,4229],"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 .sptTA, html code.shiki .sptTA{--shiki-light:#6182B8;--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 .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 .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 .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 .s39Yj, html code.shiki .s39Yj{--shiki-light:#39ADB5;--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 pre.shiki code .sZMiF, html code.shiki .sZMiF{--shiki-light:#E2931D;--shiki-default:#005CC5;--shiki-dark:#79B8FF}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}",{"title":226,"searchDepth":268,"depth":268,"links":4231},[4232,4233,4236,4237,4238,4239],{"id":444,"depth":244,"text":445},{"id":484,"depth":244,"text":485,"children":4234},[4235],{"id":1167,"depth":268,"text":1168},{"id":1382,"depth":244,"text":1383},{"id":2564,"depth":244,"text":2565},{"id":3188,"depth":244,"text":3189},{"id":4186,"depth":244,"text":4187},"md",{"notebook":318},{"icon":121},{"title":136,"description":190},"1SJxWjInCA_iJk3Gt6xBVlCA-zJ5g8fMEyOeY7LDFP8",[4246,4247],{"title":127,"path":128,"stem":129,"description":190,"icon":121,"children":-1},{"title":140,"path":141,"stem":142,"description":190,"icon":121,"children":-1},1785218166199]