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