"""CIS 6270 Lecture 7. Small, executable OT and bridge calculations. Run: python ot_sbm_examples.py --output results The examples use synthetic distributions. Paper-scale benchmarks remain in original repositories. Every displayed numerical result is recomputed here. """ from pathlib import Path import argparse,itertools,json import numpy as np from scipy.special import logsumexp from scipy.optimize import linprog from scipy.linalg import expm def sinkhorn(a,b,log_kernel,iterations=2000,tol=1e-12): """Scale a positive kernel to prescribed marginals in log space.""" a,b=np.asarray(a,float),np.asarray(b,float) if np.any(a<=0) or np.any(b<=0):raise ValueError('Use positive marginals on the retained support.') if not np.isclose(a.sum(),b.sum()):raise ValueError('Marginals must have equal mass.') log_v=np.zeros_like(b);history=[] for k in range(iterations): log_u=np.log(a)-logsumexp(log_kernel+log_v[None,:],axis=1) log_v=np.log(b)-logsumexp(log_kernel+log_u[:,None],axis=0) pi=np.exp(log_u[:,None]+log_kernel+log_v[None,:]) error=max(abs(pi.sum(1)-a).max(),abs(pi.sum(0)-b).max()) history.append(float(error)) if error