Esempio n. 1
0
def runInference(args):
	pid = os.getpid()
	#Unpack args 
	matf,gfile,alg_params,spanning_tree_params = args
	print pid,"| Running on ",matf, " graphFile: ",gfile
	#Setup objective function
	alg_params['objective_fxn'] = obj_fxn.TRW
	N_n,Nodes_n,Edges_n,Cardinality_n,mode_n = util.loadUAIfromMAT(matf)
	start_time = time.time()
	G = util.Graph(N=N_n,graphFile = gfile, type=alg_params['graphType'],
			Edges=Edges_n,Nodes=Nodes_n,Cardinality=Cardinality_n,
			mode='UAI',weighted=True)
	spanning_tree_params['alg_params']=alg_params
	inf.optSpanningTree(G,spanning_tree_params)
	print pid,"| Completed  ",matf," time elapsed: "
	time_taken = time.time()-start_time
	return (pid,time_taken,os.path.basename(matf).replace('.mat',''))
def runPerturbAndMAP(folder,numSamples):
	#raw_input("WARNING: PerturbAndMAP ONLY TESTED FOR BINARY RANDOM VARIABLES. PRESS A KEY TO CONTINUE")
	print "Running perturbMAP"
	inputfolder  = folder + '/uai_mat'
	matfolder = folder+'/mat_out'
	print inputfolder,matfolder
	if not os.path.exists(inputfolder):
		assert "Input folder not found. Investigate"
	if not os.path.exists(matfolder):
		os.mkdir(matfolder)
	for root, dirs, files in os.walk(inputfolder): # Walk directory tree
			for f in files:
				if f.endswith("mat"):
					print "Processing : ",f
					basename = re.split('.uai',f)[0]
					inputfilename = root+'/'+f
					N,Nodes,Edges,Cardinality,mode = util.loadUAIfromMAT(inputfilename)
					G = util.Graph(N=N,Edges=Edges,Nodes=Nodes,Cardinality=Cardinality,
							mode=mode,weighted=True,type='undir')
					start = timeit.default_timer()
					logZ,mus,time_marg,time_logz = inferenceAlg.doInferencePerturbMAP(G,numSamples)
					stop = timeit.default_timer()
					print stop-start," seconds taken"
					print "Saving marginals: ",mus
					assert mus.shape[0]==np.sum(G.Cardinality),"Marginal vector not as expected"
					matfile= matfolder+'/'+basename
					if os.path.exists(matfile):
						mat = loadmat(matfile)
						print "Appending ",matfile
					else:
						mat = {}
						print "Creating new mat file, ",matfile
					mat['perturbMAP_node_marginals_ub'] = np.reshape(mus,(len(mus),1))
					mat['perturbMAP_log_partition_ub'] = logZ
					mat['perturbMAP_runtime_ub_logz'] = time_logz
					mat['perturbMAP_runtime_ub_marg'] = time_marg
					mat['perturbMAP_runtime_ub_total'] = stop-start
					savemat(matfile, mat)
Esempio n. 3
0
	if not quiet:
		print "Step 2: MAP inference with toulbar2"
	marginal_polytope_vertex,toulbar2Output,MAPsoln = MAPsolver.runMAP(np.array(theta_expanded),
			inflated_nVertices,inflated_List,inflated_Cardinality,
			'undir',uai_fname = './temp.uai',timer=-1)
	#Delete all temporary files
	print "Deleting: ",
	for f in glob.glob("temp*"):
		print f,
		os.unlink(f)
	#Step 3] Compute the energy of the MAP solution as the estimate of logZ
	if not quiet:
		print "Step 3: Energy of MAP solution is estimate of logZ"
	energyEstimate = np.dot(marginal_polytope_vertex,theta_expanded)
	if not quiet:
		print "Computing energy estimate"
	return energyEstimate

if __name__ == '__main__':
	print "10 Node Complete"
	inputfilename = '/data/ml2/rahul/FrankWolfeMarginalInf/Synthetic/uai_mat/810.mat'
	N,Nodes,Edges,Cardinality,mode = util.loadUAIfromMAT(inputfilename)
	G = util.Graph(N=N,Edges=Edges,Nodes=Nodes,Cardinality=Cardinality,mode=mode,weighted=True,type='undir')
	print doInferencePerturbMAP(G,numSamples = 10)
	print ubLogZ(20,G,quiet = True)
#	print "Debug 3 node"
#	inputfilename = '/data/ml2/rahul/FrankWolfeMarginalInf/Debug/uai_mat/grid3x3.mat'
#	N,Nodes,Edges,Cardinality,mode = util.loadUAIfromMAT(inputfilename)
#	G = util.Graph(N=N,Edges=Edges,Nodes=Nodes,Cardinality=Cardinality,mode=mode,weighted=True,type='undir')
#	print doInferencePerturbMAP(G,10)