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:
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)) -
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)
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)
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