In [9]:
from scipy.io import loadmat
import os,sys,glob,copy
import numpy as np
MAINFOLDER = '/data/ml2/rahul/fw-inference/RBM_cor1/'
TCNAME = 'rbm_20';N=40
#TCNAME = 'rbm_21';N=42
#TCNAME = 'rbm_22';N=44
comparison_idx = range(2*N)[1::2]
EXACTDIR = MAINFOLDER+'/mat_out'
folder = {}
plotname = 'Exact MAP $\mathcal{M}_{\delta}$'
if 'cor' in MAINFOLDER:
folder[plotname] = MAINFOLDER + '/resultsSpanning_cor3_MAPsolver/TRW/'
else:
folder[plotname] = MAINFOLDER + '/resultsSpanning_MAPsolver/TRW/'
plotname = 'Approx MAP $\mathcal{M}_{\delta}$'
if 'cor' in MAINFOLDER:
folder[plotname] = MAINFOLDER + '/resultsSpanningapprox_cor3_approxMAPsolver/TRW/'
else:
folder[plotname] = MAINFOLDER + '/resultsSpanningapprox_approxMAPsolver/TRW/'
#plotname = 'TRBP'
#folder[plotname] = MAINFOLDER+ '/TRWBP_opt/'
plotname = '$\mathbb{L}_{\delta}$'
folder[plotname] = MAINFOLDER+ '/resultsSpanning_lpLOCAL/TRW'
#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())
In [10]:
#Initialize L1 & LogZ
plot_data_l1 = {}
plot_data_logz={}
plot_marker ={}
for plotname in folder:
plot_data_l1[plotname] = np.zeros(1,)
plot_data_logz[plotname] = np.zeros(1,)
plot_marker[plotname] = []
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]+TCNAME+'*.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]+'/'+TCNAME+'*-sp0.mat'):
logz_err = None
l1_err = None
cur_markers = []
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)
print 'Reading ',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)
l1_err = append_vec(l1_err,np.abs(marginals-exact_marginals).mean(1))
print np.abs(marginals-exact_marginals).mean(1)[-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]))
#logz_err = append_vec(logz_err,((-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]))
#logz_err = append_vec(logz_err,((-1*mat['Obj_Val']+mat['gap_full']).ravel()-exact['log_partition'][0][0]))
cur_markers.append(logz_err.shape[0]-1)
plot_marker[plotname] = copy.deepcopy(cur_markers)
assert len(plot_marker[plotname])==10,'10 markers should be found'
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
In [11]:
print plot_marker
In [15]:
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,1)#10)
Y = plot_data_l1[plottype]#[np.arange(0,L)]#,10)]
plot(X,Y,label=plottype,color=colors[idx],marker = markers[idx])
for m in plot_marker[plottype]:
markat = np.floor(m)
#plt.axvline(m,color=colors[idx],linewidth=2,linestyle='--')
#print markat,plot_data_l1[plottype].shape
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.8])
xlim([0,150])
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))
yscale('log')
for idx,plottype in enumerate(folder):
L = plot_data_logz[plottype].ravel().shape[0]
X = np.arange(1,L+1)
Y = plot_data_logz[plottype]
plot(X,Y,label=plottype,color=colors[idx],marker = markers[idx])
print Y.shape,X.shape,Y[-5:]
for m in plot_marker[plottype]:
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')
xlim([0,100])
ylabel('Error in LogZ $(\zeta_{\mathrm{\log Z}})$')
legend(bbox_to_anchor=(0.9, 0.45),bbox_transform=plt.gcf().transFigure)
if os.path.exists('./plots/'+TCNAME+'-l1-unrolled.pdf'):
os.remove('./plots/'+TCNAME+'-l1-unrolled.pdf')
if os.path.exists('./plots/'+TCNAME+'-logz-unrolled.pdf'):
os.remove('./plots/'+TCNAME+'-logz-unrolled.pdf')
figure(1)
plt.savefig('./plots/'+TCNAME+'-l1-unrolled.pdf',bbox_inches='tight')
figure(2)
plt.savefig('./plots/'+TCNAME+'-logz-unrolled.pdf',bbox_inches='tight')