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