コード例 #1
0
ファイル: test_emd.py プロジェクト: sznajder/EnergyFlow
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)
コード例 #2
0
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)
コード例 #3
0
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
コード例 #4
0
ファイル: test_emd.py プロジェクト: sznajder/EnergyFlow
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
コード例 #5
0
ファイル: test_emd.py プロジェクト: sznajder/EnergyFlow
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)
コード例 #6
0
ファイル: test_emd.py プロジェクト: sznajder/EnergyFlow
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
コード例 #7
0
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
コード例 #8
0
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')