In [107]:
from scipy.io import loadmat
import os,sys,glob
#Setup directories to be used
TCNAME = 'SyntheticGrids_5x5_cor1';name = 'gridWi5Tr';N = 25
#TCNAME = 'SyntheticGrids_5x5';name = 'gridWi5Tr';N = 25
TCNAME = 'SyntheticGrids_10x10';name = 'gridWi10Tr';N = 100
MAINFOLDER = '/data/ml2/rahul/fw-inference/'
comparison_idx = range(2*N)[1::2]
EXACTDIR = MAINFOLDER+TCNAME+'/mat_out'
folder = {}
plotname = 'Exact MAP $\mathcal{M}_{\delta}$'
if 'cor' in TCNAME:
folder[plotname] = MAINFOLDER + TCNAME+ '/resultsSpanning_cor3_MAPsolver/TRW'
else:
folder[plotname] = MAINFOLDER + TCNAME+ '/resultsSpanning_MAPsolver/TRW'
plotname = 'Approx MAP $\mathcal{M}_{\delta}$'
if 'cor' in TCNAME:
folder[plotname] = MAINFOLDER + TCNAME+ '/resultsSpanningapprox_cor3_approxMAPsolver/TRW'
else:
folder[plotname] = MAINFOLDER + TCNAME+ '/resultsSpanningapprox_approxMAPsolver/TRW'
plotname = '$\mathbb{L}_{\delta}$'
folder[plotname] = MAINFOLDER + TCNAME+ '/resultsSpanning_lpLOCAL/TRW'
#plotname = 'TRBP'
#folder[plotname] = MAINFOLDER+ TCNAME+ '/TRWBP_opt/'
#Function to add two vectors
def add_vec(v1,v2):
assert len(v1.shape)==1 and len(v2.shape)==1,'v1 and v2 must be of dimension 1'
diff = np.abs(len(v2)-len(v1))
if len(v1)==len(v2):
return v1+v2
elif len(v1)<len(v2):
return np.append(v1,np.zeros(diff,)+v1[-1])+v2
elif len(v2)<len(v1):
return np.append(v2,np.zeros(diff,)+v2[-1])+v1
else:
assert False,'This should not happen'
def append_vec(v1,v2):
if v1 == None:
return v2
elif v2== None:
return v1
else:
return np.append(v1.ravel(),v2.ravel())
def removeIfExists(fname):
if os.path.exists(fname):
os.remove(fname)
def createIfAbsent(dirname):
if not os.path.exists(dirname):
os.mkdir(dirname)
In [108]:
#Initialize L1 & LogZ
plot_data_l1 = {}
plot_data_logz={}
marker = {}
for plotname in folder:
plot_data_l1[plotname] = np.zeros(1,)
plot_data_logz[plotname] = np.zeros(1,)
marker[plotname] = np.zeros(1,)
rhoit = 9
for plotname in folder:
print "Processing : ",plotname
print "Looking for files: ",folder[plotname]+'/*-sp0.mat'
ctr = 1
#Handle TRBP
if plotname=='TRBP':
logz_err = 0
l1_err = 0
ctr = 0
for f in glob.glob(folder[plotname]+'/*.mat'):
mat = loadmat(f)
exact = loadmat(EXACTDIR+'/'+os.path.basename(f.split('_rho')[0]).replace('-sp'+str(rhoit)+'.mat','')+'.mat')
l1_err += np.abs(mat['trwbp_opt_marg'].ravel()[comparison_idx]-exact['exact_node_marginals'].ravel()[comparison_idx]).mean()
logz_err+= np.abs(mat['trwbp_opt_logz'].ravel()[0]-exact['log_partition'].ravel()[0])
ctr +=1
print l1_err,logz_err,ctr
plot_data_l1[plotname] = np.ones(400,)*(l1_err/float(ctr))
plot_data_logz[plotname] = np.ones(400,)*(logz_err/float(ctr))
continue
#Handle FW
for f in glob.glob(folder[plotname]+'/*-sp0.mat'):
logz_err = None
l1_err = None
marker_line = None
print os.path.basename(f)
for rhoit in range(10):
f_rho = f.replace('-sp0','-sp'+str(rhoit))
exact = loadmat(EXACTDIR+'/'+os.path.basename(f_rho).replace('-sp'+str(rhoit)+'.mat','')+'.mat')
mat = loadmat(f_rho)
#L1 marginals
marginals = mat['IterSet'][:,comparison_idx]
numIts = marginals.shape[0]
dim = marginals.shape[1]
exact_marginals = exact['exact_node_marginals'].ravel()[comparison_idx].reshape(1,dim).repeat(numIts,0)
#print rhoit,np.abs(marginals-exact_marginals).mean(1).shape
l1_err = append_vec(l1_err,np.abs(marginals-exact_marginals).mean(1))
#Log Z
if 'gap_full' not in mat:
logz_err = append_vec(logz_err,np.abs((-1*mat['Obj_Val']+mat['Dual_Gap']).ravel()-exact['log_partition'][0][0]))
else:
logz_err = append_vec(logz_err,np.abs((-1*mat['Obj_Val']+mat['gap_full']).ravel()-exact['log_partition'][0][0]))
assert logz_err.shape[0]==l1_err.shape[0],'Shapes do not match. check this'
marker_line = append_vec(marker_line,np.array(l1_err.shape[0]-1))
marker[plotname] = marker_line + marker[plotname]
plot_data_l1[plotname] = add_vec(l1_err,plot_data_l1[plotname])
plot_data_logz[plotname] = add_vec(logz_err,plot_data_logz[plotname])
ctr +=1
plot_data_l1[plotname] /= float(ctr)
plot_data_logz[plotname] /= float(ctr)
marker[plotname] /= float(ctr)
In [109]:
for p in marker:
print marker[p],plot_data_l1[p].shape,plot_data_logz[p].shape
In [111]:
import matplotlib as mpl
mpl.rcParams['lines.linewidth']=4.5
mpl.rcParams['lines.markersize']=12
mpl.rcParams['text.usetex']=True
mpl.rcParams['text.latex.unicode']=True
mpl.rcParams['font.family'] = 'serif'
mpl.rcParams['font.serif'] = 'Times New Roman'
mpl.rcParams['text.latex.preamble']= '\usepackage{amsfonts}'
mpl.rcParams['font.size'] = 40
mpl.rcParams['axes.labelsize']=40
mpl.rcParams['legend.fontsize']=33
figure(1,figsize=(10,10))
colors = ['r','b','g','k','c']
markers= ['*','v','<','>','|']
for idx,plottype in enumerate(folder):
L = plot_data_l1[plottype].ravel().shape[0]
X = np.arange(1,L+1,20)
Y = plot_data_l1[plottype][np.arange(0,L,20)]
plot(X,Y,label=plottype,color=colors[idx],marker = markers[idx])
all_markers = marker[plottype].tolist()
for m in all_markers:
markat = np.floor(m)
#plt.axvline(m,color=colors[idx],linewidth=2,linestyle='--')
y_pt = plot_data_l1[plottype][markat]
#plt.plot([markat,markat],[y_pt,y_pt+0.1],marker = markers[idx],color=colors[idx],linewidth=2,linestyle='--')
xlabel('MAP calls')
ylim([0,0.5])
#xlim([0,500])
ylabel('Error in Marginals $(\zeta_{\mu})$')
legend(bbox_to_anchor=(0.9, 0.9),bbox_transform=plt.gcf().transFigure)
f2 = figure(2,figsize=(10,10))
for idx,plottype in enumerate(folder):
L = plot_data_logz[plottype].ravel().shape[0]
X = np.arange(1,L+1,5)
Y = plot_data_logz[plottype][np.arange(0,L,5)]
plot(X,Y,label=plottype,color=colors[idx],marker = markers[idx])
all_markers = marker[plottype].tolist()
for m in all_markers:
markat = np.floor(m)
y_pt = plot_data_logz[plottype][markat]
#plt.plot([m,m],[y_pt,y_pt+(y_pt*10*0.5)],marker = markers[idx],color=colors[idx],linewidth=2,linestyle='--')
xlabel('MAP calls')
yscale('log')
ylim([0.1,10**4])
ylabel('Error in LogZ $(\zeta_{\mathrm{\log Z}})$')
legend(bbox_to_anchor=(0.9, 0.9),bbox_transform=plt.gcf().transFigure)
if os.path.exists('./plots/'+name+'_approxVsExact_l1.pdf'):
os.remove('./plots/'+name+'_approxVsExact_l1.pdf')
if os.path.exists('./plots/'+name+'_approxVsExact_logz.pdf'):
os.remove('./plots/'+name+'_approxVsExact_logz.pdf')
figure(1)
plt.savefig('./plots/'+name+'_approxVsExact_l1.pdf',bbox_inches='tight')
figure(2)
plt.savefig('./plots/'+name+'_approxVsExact_logz.pdf',bbox_inches='tight')
In [110]: