def runMAP(marg_vec,N,List,Cardinality,graphType,uai_fname = './temp.uai',timer=-1): #TOULBAR_BIN = '/home/rahul/Research/opt/fw-python/toulbar2/bin/toulbar2-mod' TOULBAR_BIN = '../toulbar2.0.9.7.0-Release-sources/build/bin/Linux/toulbar2' if not os.path.exists(TOULBAR_BIN): assert False,"toulbar2 binary not found at :"+TOULBAR_BIN #write evidence file f = open(uai_fname+'.evid','w') f.write('0') f.close() #write file #Convert marg_vec to potentials nEdges = List.shape[0] EdgeList = List[:nEdges,:2].astype(int) util.writeToUAI(uai_fname,np.exp(marg_vec),N,Cardinality,EdgeList) soln_fname = uai_fname.split('.uai')[0]+'.sol' #Run MAP inference cmd = TOULBAR_BIN + ' '+uai_fname+' -w='+soln_fname if timer>0: cmd += ' -timer='+str(timer) #Must run from run directory run_dir = uai_fname.rsplit('/',1)[0] run_dir += '/' result = subprocess.check_output(cmd,stderr=subprocess.STDOUT, shell=True) #Write stdout to logfile resultfile = uai_fname.split('.uai')[0]+'.log' f_log = open(resultfile,'w') f_log.write(result+'\n') f_log.close() #Get solution MAPsoln = np.loadtxt(soln_fname) os.unlink(soln_fname) if os.path.exists(soln_fname): assert False,"sol file not deleted" os.unlink(uai_fname+'.evid') os.unlink(uai_fname) assert max(MAPsoln.shape)==max(Cardinality.shape),"All vertices not present in MAP solution"+str(MAPsoln.shape)+" vs "+str(Cardinality.shape) vertex_marg_polytope= [] for i in xrange(N): v_card = Cardinality[i] for j in xrange(v_card): if j==MAPsoln[i]: vertex_marg_polytope.append(1) else: vertex_marg_polytope.append(0) for ei in xrange(EdgeList.shape[0]): v1 = EdgeList[ei,0] v2 = EdgeList[ei,1] card_edge = Cardinality[v1]*Cardinality[v2] ctr = 0 for i in xrange(Cardinality[v1]): for j in xrange(Cardinality[v2]): if MAPsoln[v1]==i and MAPsoln[v2]==j: vertex_marg_polytope.append(1) else: vertex_marg_polytope.append(0) ctr +=1 assert ctr == card_edge,"Edge cardinality does not match up"+str(ctr)+str(card_edge) return np.array(vertex_marg_polytope),result,MAPsoln
def runMAP(pot,N,List, Cardinality,graphType, uai_fname = './temp.uai',mapsolver = 'lazyflipper',initLabelling = None,logf = None): #ICM/Lazyflipper require an initial labelling if initLabelling is None and (mapsolver=='lazyflipper' or mapsolver == 'icm'): assert False,'icm/lazyflipper require initial labelling' CONVERTER_BIN = '../opengm-tools/uai2opengm' MAP_BIN = '../opengm-tools/map_solver' assert os.path.exists(CONVERTER_BIN),'Converter not found' assert os.path.exists(MAP_BIN),'map solver not found' assert mapsolver=='lazyflipper' or mapsolver=='qpbo' or mapsolver=='trws' or mapsolver=='all'\ or mapsolver=='lsatr' or mapsolver=='dualdecomposition' or mapsolver=='icm'\ ,'Invalid map solver specified' fxn_start_marker = time.time() #Bookkeeping dir = os.path.dirname(uai_fname) base= os.path.basename(uai_fname) evidfile = uai_fname+'.evid' logfile = dir+'/'+base+'.log' solfile = uai_fname+'.MPE' gm_fname = uai_fname.replace('uai','gm') initfname = uai_fname.replace('uai','init') outputfile= dir+'/'+base+'.out' #Write UAI file nEdges = List.shape[0] EdgeList = List[:nEdges,:2].astype('int') util.writeToUAI(uai_fname,np.exp(pot),N,Cardinality,EdgeList) f = open(evidfile,'w') f.write('0') f.close() #Convert to GM format cmd = CONVERTER_BIN + ' ' +uai_fname+ ' ' + gm_fname start =time.time() os.system(cmd) converter_time = time.time()-start #Run TRWS,QPBO and DualDecomposition in parallel and take #best result if mapsolver=='all': cmd_qpbo = MAP_BIN + ' ' +gm_fname + ' ' + solfile+'.qpbo' + ' ' + 'qpbo >'+logfile cmd_trws = MAP_BIN + ' ' +gm_fname + ' ' + solfile+'.trws' + ' ' + 'trws >'+logfile cmd_dd = MAP_BIN + ' ' +gm_fname + ' ' + solfile+'.dualdecomposition' + ' ' + 'dualdecomposition >'+logfile cmd_icm = MAP_BIN + ' ' +gm_fname + ' ' + solfile+'.icm' + ' ' + 'icm '+initfname+' >'+logfile if initLabelling is None: initLabelling = np.zeros(pot.shape) with open(initfname,'w') as f: f.write(" ".join([str(int(t)) for t in initLabelling[:(2*N)].reshape(N,2)[:,1].ravel().tolist()])) args = [('qpbo',cmd_qpbo), ('trws',cmd_trws), ('icm',cmd_icm)] pool = Pool(processes = 3) results = pool.map(runPAR,args) pool.close() pool.join() maxEnergy = -1*np.inf best_marginal_vec = None best_MAPsoln = None best_MAPsolver = '' for r in results: name,time_taken = r print name,' took ',time_taken,' seconds' MAPsoln = np.loadtxt(solfile+'.'+name).astype('int') marg_vec = util.createMarginalVector(MAPsoln,List) energy = np.dot(pot,marg_vec) print name,' Energy:',energy if energy>maxEnergy: maxEnergy = energy best_marginal_vec = marg_vec best_MAPsoln = MAPsoln print 'Updating best to ',name best_MAPsolver = name if logf is not None: logf.write('MAPsolver chosen: '+best_MAPsolver+' Energy: '+str(maxEnergy)+' Time Taken:' +str(time.time()-start)+'seconds \n') return best_marginal_vec,best_MAPsolver,best_MAPsoln else: #Run Map Solver if mapsolver=='lazyflipper' or mapsolver=='icm': with open(initfname,'w') as f: f.write(" ".join([str(int(t)) for t in initLabelling[:(2*N)].reshape(N,2)[:,1].ravel().tolist()])) solfile += '.'+mapsolver cmd = MAP_BIN + ' ' +gm_fname + ' ' + solfile + ' ' + mapsolver + ' ' + initfname +' 2' start = time.time() subprocess.check_output(cmd,shell=True,stderr = subprocess.STDOUT) maptime=time.time()-start #Get MAP solution MAPsoln = np.loadtxt(solfile).astype('int') #Get the marginal vector start = time.time() marg_vec = util.createMarginalVector(MAPsoln,List) margvectime = time.time()-start totaltime = time.time()-fxn_start_marker timeString = '[ConversionTime '+str(converter_time)+' MAPtime: '+str(maptime)+' MargVec Time:'+str(margvectime)+' Total: '+str(totaltime)+']' if logf is not None: logf.write(timeString+'\n') return marg_vec,timeString,MAPsoln