def test_emd_equivalence(M1, M2, norm, R): gdim = 2 events1 = np.random.rand(nev, M1, gdim + 1) events2 = np.random.rand(nev, M2, gdim + 1) # test two different sets emds1 = np.zeros((nev, nev)) for i, ev1 in enumerate(events1): for j, ev2 in enumerate(events2): emds1[i, j] = emd.emd(ev1, ev2, R=R, norm=norm, gdim=gdim) emds2 = emd.emds(events1, events2, R=R, norm=norm, verbose=0, n_jobs=1, gdim=gdim) assert epsilon_diff(emds1, emds2, 10**-12) # test same set emds1 = np.zeros((nev, nev)) for i, ev1 in enumerate(events1): for j in range(i): emds1[i, j] = emd.emd(ev1, events1[j], R=R, norm=norm, gdim=gdim) emds1 += emds1.T emds2 = emd.emds(events1, R=R, norm=norm, verbose=0, n_jobs=1, gdim=gdim) assert epsilon_diff(emds1, emds2, 10**-12)
def test_periodic_phi(gdim, M): events = np.random.rand(nev, M, 1 + gdim) for phi_col in range(1, gdim + 1): emds1 = emd.emds(events, R=1.0, gdim=gdim, n_jobs=1, verbose=0) events_c = np.copy(events) events_c[:, :, phi_col] += 2 * np.pi * np.random.randint( -10, 10, size=(nev, M)) emds2 = emd.emds(events_c, R=1.0, gdim=gdim, periodic_phi=True, phi_col=phi_col, n_jobs=1, verbose=0) assert epsilon_diff(emds1, emds2, 10**-12) ev1 = np.random.rand(10, 1 + gdim) * 4 * np.pi ev2 = np.random.rand(20, 1 + gdim) * 4 * np.pi thetaw = np.zeros((len(ev1), len(ev2))) thetar = np.zeros((len(ev1), len(ev2))) for i, p1 in enumerate(ev1): for j, p2 in enumerate(ev2): dw, dr = 0., 0. for m, (k1, k2) in enumerate(zip(p1, p2)): if m == 0: continue elif m == phi_col: dw += (k1 - k2)**2 dr += np.min([ abs(k1 - (k2 + 2 * np.pi * n)) for n in range(-3, 3) ])**2 else: dw += (k1 - k2)**2 dr += (k1 - k2)**2 thetaw[i, j] = np.sqrt(dw) thetar[i, j] = np.sqrt(dr) zs1 = np.ascontiguousarray(ev1[:, 0] / np.sum(ev1[:, 0])) zs2 = np.ascontiguousarray(ev2[:, 0] / np.sum(ev2[:, 0])) ot_w, ot_r = ot.emd2(zs1, zs2, thetaw), ot.emd2(zs1, zs2, thetar) ef_w = emd.emd(ev1, ev2, norm=True, gdim=gdim, periodic_phi=False, phi_col=phi_col) ef_r = emd.emd(ev1, ev2, norm=True, gdim=gdim, periodic_phi=True, phi_col=phi_col) assert epsilon_diff(ot_w, ef_w, 10**-14) assert epsilon_diff(ot_r, ef_r, 10**-14)
def test_emde(M, R, beta): events1 = np.random.rand(nev, M, 3) events2 = np.random.rand(nev, M, 3) for ev1 in events1: for ev2 in events2: ef_emd = emd.emd(ev1, ev2, R=R, beta=beta) emde_emd = emde(ev1, ev2, R=R, beta=beta) / R**beta assert abs(ef_emd - emde_emd) < 10**-14 for i, ev1 in enumerate(events1): for j in range(i): ef_emd = emd.emd(ev1, events1[j], R=R, beta=beta) emde_emd = emde(ev1, events1[j], R=R, beta=beta) / R**beta assert abs(ef_emd - emde_emd) < 10**-14
def test_emd_return_flow(dt, M, R): events1 = np.random.rand(nev, M, 3) events2 = np.random.rand(nev, M, 3) for ev1 in events1: for ev2 in events2: if dt == 'eq': s1, s2 = ev1[:, 0].sum(), ev2[:, 0].sum() if s1 < s2: ev1 = np.vstack( (ev1, [s2 - s1, np.random.rand(), np.random.rand()])) else: ev2 = np.vstack( (ev2, [s1 - s2, np.random.rand(), np.random.rand()])) s1, s2 = ev1[:, 0].sum(), ev2[:, 0].sum() if dt == 'nt': Gshape = (M, M) elif s2 - s1 == 0: Gshape = (len(ev1), len(ev2)) elif s2 - s1 > 0: Gshape = (len(ev1) + 1, len(ev2)) else: Gshape = (len(ev1), len(ev2) + 1) cost, G = emd.emd(ev1, ev2, R=R, norm=(dt == 'nt'), return_flow=True) assert G.shape == Gshape or emd._EMD.weightdiff() < 1e-13
def test_n_jobs(n_jobs, M, norm, R): events = np.random.rand(nev, M, 3) emds1 = np.zeros((nev, nev)) for i, ev1 in enumerate(events): for j in range(i): emds1[i, j] = emd.emd(ev1, events[j], R=R, norm=norm) emds1 += emds1.T emds2 = emd.emds(events, R=R, norm=norm, verbose=0, n_jobs=n_jobs) assert epsilon_diff(emds1, emds2, 10**-12)
def test_emd_byhand_1_1(gdim, norm, R): for i in range(nev): ev1 = np.random.rand(1 + gdim) for j in range(nev): ev2 = np.random.rand(1 + gdim) ef_emd = emd.emd(ev1, ev2, norm=norm, R=R, gdim=gdim) if norm: byhand_emd = np.linalg.norm(ev1[1:] - ev2[1:]) / R else: byhand_emd = min(ev1[0], ev2[0]) * np.linalg.norm( ev1[1:] - ev2[1:]) / R + abs(ev1[0] - ev2[0]) assert abs(ef_emd - byhand_emd) < 10**-15
def calc_emd(j1, j2): ''' calculating emds for input jets arrray with 4-vec formatting len(j1) should be equal to len(j2) ''' # translate 4-vec [E, px, py, pz] into [pt, eta, phi, m] j1_trans = [] j2_trans = [] for i in range(len(j1)): j1_trans.append(jet_4v_translate_py3(j1[i])) for i in range(len(j2)): j2_trans.append(jet_4v_translate_py3(j2[i])) # reshape and extract [pt, eta, phi] j1_emd = [] j2_emd = [] for i in range(len(j1)): j1_emd.append(j1_trans[i].reshape(-1, 4)[:, 0:3]) for i in range(len(j2)): j2_emd.append(j2_trans[i].reshape(-1, 4)[:, 0:3]) emds_array = [] for i in range(len(j1)): emds_array.append( emd.emd(j1_emd[i], j2_emd[i], R=1.0, norm=True, measure='euclidean', coords='hadronic', return_flow=False, gdim=None, mask=False, n_iter_max=100000, periodic_phi=False, phi_col=2, empty_policy='error')) emds_array = np.array(emds_array) return emds_array
def calc_emd(img1, img2): return emd(img1, img2, R=1.0, norm=False, beta=1.0, measure='euclidean', coords='hadronic', return_flow=False, gdim=None, mask=False, n_iter_max=100000, periodic_phi=False, phi_col=2, empty_policy='error')