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)


Processing :  Exact MAP $\mathcal{M}_{\delta}$
Looking for files:  /data/ml2/rahul/fw-inference/SyntheticGrids_10x10/resultsSpanning_MAPsolver/TRW/*-sp0.mat
gridWi10Tr6-sp0.mat
gridWi10Tr2-sp0.mat
gridWi10Tr12-sp0.mat
gridWi10Tr13-sp0.mat
gridWi10Tr7-sp0.mat
gridWi10Tr3-sp0.mat
gridWi10Tr11-sp0.mat
gridWi10Tr15-sp0.mat
gridWi10Tr5-sp0.mat
gridWi10Tr1-sp0.mat
gridWi10Tr9-sp0.mat
gridWi10Tr8-sp0.mat
gridWi10Tr4-sp0.mat
gridWi10Tr10-sp0.mat
gridWi10Tr14-sp0.mat
Processing :  $\mathbb{L}_{\delta}$
Looking for files:  /data/ml2/rahul/fw-inference/SyntheticGrids_10x10/resultsSpanning_lpLOCAL/TRW/*-sp0.mat
gridWi10Tr13-sp0.mat
gridWi10Tr4-sp0.mat
gridWi10Tr8-sp0.mat
gridWi10Tr9-sp0.mat
gridWi10Tr1-sp0.mat
gridWi10Tr5-sp0.mat
gridWi10Tr12-sp0.mat
gridWi10Tr3-sp0.mat
gridWi10Tr7-sp0.mat
gridWi10Tr10-sp0.mat
gridWi10Tr14-sp0.mat
gridWi10Tr11-sp0.mat
gridWi10Tr15-sp0.mat
gridWi10Tr2-sp0.mat
gridWi10Tr6-sp0.mat
Processing :  Approx MAP $\mathcal{M}_{\delta}$
Looking for files:  /data/ml2/rahul/fw-inference/SyntheticGrids_10x10/resultsSpanningapprox_approxMAPsolver/TRW/*-sp0.mat
gridWi10Tr9-sp0.mat
gridWi10Tr1-sp0.mat
gridWi10Tr5-sp0.mat
gridWi10Tr11-sp0.mat
gridWi10Tr15-sp0.mat
gridWi10Tr10-sp0.mat
gridWi10Tr14-sp0.mat
gridWi10Tr4-sp0.mat
gridWi10Tr8-sp0.mat
gridWi10Tr12-sp0.mat
gridWi10Tr2-sp0.mat
gridWi10Tr6-sp0.mat
gridWi10Tr3-sp0.mat
gridWi10Tr7-sp0.mat
gridWi10Tr13-sp0.mat

In [109]:
for p in marker:
    print marker[p],plot_data_l1[p].shape,plot_data_logz[p].shape


[ 172.4375  293.3125  390.75    469.5625  546.6875  608.6875  661.625
  707.4375  747.5     780.375 ] (945,) (945,)
[  27.125    46.5625   84.125   124.375   160.9375  192.5     224.0625
  250.1875  277.      304.25  ] (429,) (429,)
[ 17.875   30.4375  42.4375  48.625   56.9375  60.9375  65.625   69.1875
  73.      76.9375] (100,) (100,)

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]: