cg.run()
                print('number of rvs in cg', len(cg.rvs))
                print('number of factors in cg', len(cg.factors))
                if algo_name == 'LOSI':
                    vi = LiftedOneShot(g=cg, K=K, T=T, seed=seed)
                else:
                    vi = LiftedNPVI(g=cg, K=K, T=T, seed=seed)
            if cond:  # clean up; only needed cond_g.init_nb() for defining symbolic objective
                for i, rv in enumerate(g.rvs_list):
                    rv.nb = g_rv_nbs[
                        i]  # restore; undo possible mutation from cond_g.init_nb()

            start_time = time.process_time()
            start_wall_time = time.time()
            res = vi.run(lr=lr,
                         its=its,
                         fix_mix_its=fix_mix_its,
                         logging_itv=logging_itv)
            cpu_time = time.process_time() - start_time
            wall_time = time.time() - start_wall_time
            obj = res['record']['obj'][-1]

            for i, rv in enumerate(query_rvs):
                if cond:
                    m = vi.map(obs_rvs=[], query_rv=rv)
                else:
                    m = vi.map(obs_rvs=obs_rvs, query_rv=rv)
                mmap[i] = m
                assert rv.domain_type[
                    0] == 'c', 'only looking at kl for cnode queries for now'
                crv_marg_params = vi.params['w'], rv.belief_params[
                    'mu'], rv.belief_params['var']
for i, rv in enumerate(rvs):
    mmap_res[algo, i] = bp.map(rv)

algo += 1
name = names[algo]
utils.set_log_potential_funs(
    g.factors_list)  # OSI assumes factors have callable .log_potential_fun
K = 2
T = 10
lr = 0.2
its = 10
fix_mix_its = int(its * 0.8)
osi = OneShot(
    g, K,
    T)  # can be moved outside of all loops if the ground MRF doesn't change
osi.run(its, lr=lr)
for i, rv in enumerate(rvs):
    mmap_res[algo, i] = osi.map(rv)

# ground truth
# first, need to convert factor.log_potential_funs to one of (LogTable, LogQuadratic, LogHybridQuadratic);
# this can be done by first converting the corresponding potentials to one of (TablePotential, QuadraticPotential,
# HybridQuadraticPotential), then calling the .to_log_potential method on the potential objects
# manual conversion here:
# factors[0].potential = HybridQuadraticPotential(
#     A=-factors[0].potential.w * np.array([np.array([[1., 0], [0, 0]]), np.array([[1., 0.], [0., 0.]])]),
#     b=-factors[0].potential.w * np.array([[-16., 0], [14., 0.]]),
#     c=-factors[0].potential.w * np.array([64., 49.])
# )

# sampling baseline:
示例#3
0
    err_var[name] = np.average(np.average(
        res**2, axis=1)) / num_test + err_var.get(name, 0)
    print(name, 'diff', np.average(np.average(abs(res), axis=1)))
    print(
        name, 'var',
        np.average(np.average(res**2, axis=1)) -
        np.average(np.average(abs(res), axis=1))**2)

    name = 'OSI'
    res = np.zeros((len(key_list), 5))
    osi = OneShot(
        g, num_mixtures=1, num_quadrature_points=2
    )  # can be moved outside of all loops, as the ground MRF doesn't change
    for j in range(5):
        start_time = time.process_time()
        osi.run(200, lr=2)
        time_cost[name] = (time.process_time() -
                           start_time) / 5 / num_test + time_cost.get(name, 0)
        print(name, f'time {time.process_time() - start_time}')
        for i, key in enumerate(key_list):
            res[i, j] = osi.map(rvs_table[key])
    for i, key in enumerate(key_list):
        res[i, :] -= ans[key]
    avg_diff[name] = np.average(np.average(
        abs(res), axis=1)) / num_test + avg_diff.get(name, 0)
    err_var[name] = np.average(np.average(
        res**2, axis=1)) / num_test + err_var.get(name, 0)
    print(name, 'diff', np.average(np.average(abs(res), axis=1)))
    print(
        name, 'var',
        np.average(np.average(res**2, axis=1)) -
示例#4
0
        np.average(np.average(res**2, axis=1)) -
        np.average(np.average(abs(res), axis=1))**2)

    name = 'OSI'
    K = 5
    T = 20
    lr = 0.1
    its = 200
    fix_mix_its = int(its * 0.)
    res = np.zeros((len(key_list), num_runs))
    osi = OneShot(
        g=g, K=K, T=T, seed=seed
    )  # can be moved outside of all loops if the ground MRF doesn't change
    for j in range(num_runs):
        start_time = time.process_time()
        osi.run(lr=lr, its=its, fix_mix_its=fix_mix_its)
        time_cost[name] = (time.process_time() -
                           start_time) / num_runs / num_tests + time_cost.get(
                               name, 0)
        print(name, f'time {time.process_time() - start_time}')
        for i, key in enumerate(key_list):
            res[i, j] = osi.map(rvs_table[key])
        print(res[:, j])
        # print(osi.params)
        print('Mu =\n', osi.params['Mu'], '\nVar =\n', osi.params['Var'])
    for i, key in enumerate(key_list):
        res[i, :] -= ans[key]
    avg_diff[name] = np.average(np.average(
        abs(res), axis=1)) / num_tests + avg_diff.get(name, 0)
    err_var[name] = np.average(np.average(
        res**2, axis=1)) / num_tests + err_var.get(name, 0)
示例#5
0
rel_g.data = data
g, rvs_table = rel_g.grounded_graph()

from OneShot import OneShot

utils.set_log_potential_funs(
    g.factors_list)  # OSI assumes factors have callable .log_potential_fun
grad_check = False
if not grad_check:
    K = 3
    T = 20
    lr = 1e-2
    its = 500
    osi = OneShot(g=g, K=K, T=T, seed=seed)
    res = osi.run(lr=lr, its=its)
    record = res['record']
    del res['record']
    print(res)
    for key, rv in rvs_table.items():
        if rv.value is None:  # only test non-evidence nodes
            print(rv, key, osi.map(obs_rvs=[], query_rv=rv))

    import matplotlib.pyplot as plt

    for key in record:
        plt.plot(record[key], label=key)
    plt.legend(loc='best')
    save_name = __file__.split('.py')[0]
    plt.savefig('%s.png' % save_name)
示例#6
0
rel_g.atoms = (atom_friend, atom_smoke_x, atom_cancer)
rel_g.param_factors = (f1, f2)
rel_g.init_nb()

rel_g.data = data
g, rvs_table = rel_g.grounded_graph()

print(rvs_table)

from OneShot import OneShot

utils.set_log_potential_funs(g.factors_list)
K = 4
T = 8
osi = OneShot(g=g, K=K, T=T, seed=seed)
res = osi.run(lr=1e-1, its=200)
for key, rv in sorted(rvs_table.items()):
    if rv.value is None:  # only test non-evidence nodes
        print(key, osi.map(obs_rvs=[], query_rv=rv))

import matplotlib.pyplot as plt

record = res['record']
for key in record:
    plt.plot(record[key], label=key)
plt.legend(loc='best')
save_name = __file__.split('.py')[0]
plt.savefig('%s.png' % save_name)

# EPBP inference
from EPBPLogVersion import EPBP