예제 #1
0
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
예제 #2
0
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