changeset 21:d395461b92ae tip

Lots and lots of modifications. Approximate recovery script working.
author Nic Cleju <nikcleju@gmail.com>
date Mon, 23 Apr 2012 10:54:57 +0300
parents eccc7a5b9ee3
children
files ABSlambda.py ABSmixed.py stdparams_approx.py test_approx.py utils.py
diffstat 5 files changed, 227 insertions(+), 38 deletions(-) [+]
line wrap: on
line diff
--- a/ABSlambda.py	Thu Apr 05 14:00:13 2012 +0300
+++ b/ABSlambda.py	Mon Apr 23 10:54:57 2012 +0300
@@ -30,7 +30,8 @@
   aggD = numpy.vstack((aggDupper, lbd * aggDlower))
   aggy = numpy.concatenate((y, numpy.zeros(N-n)))
   
-  return numpy.dot(D, pyCSalgos.SL0.SL0_approx.SL0_approx(aggD,aggy,epsilon,sigma_min,sigma_decrease_factor,mu_0,L,A_pinv,true_s))
+  #return numpy.dot(D, pyCSalgos.SL0.SL0_approx.SL0_approx(aggD,aggy,epsilon,sigma_min,sigma_decrease_factor,mu_0,L,A_pinv,true_s))
+  return numpy.dot(D, pyCSalgos.SL0.SL0_approx.SL0_approx_dai(aggD,aggy,epsilon,sigma_min,sigma_decrease_factor,mu_0,L,A_pinv,true_s))
   
 def bp(y,M,Omega,epsilon,lbd, x0, lbtol=1e-3, mu=10, cgtol=1e-8, cgmaxiter=200, verbose=False):
   """
@@ -55,7 +56,7 @@
   U,S,Vt = numpy.linalg.svd(D)
   aggDupper = numpy.dot(M,D)
   aggDlower = Vt[-(N-n):,:]
-  aggD = numpy.hstack((aggDupper, lbd * aggDlower))
+  aggD = numpy.vstack((aggDupper, lbd * aggDlower))
   aggy = numpy.concatenate((y, numpy.zeros(N-n)))
   
   opts = dict()
@@ -76,5 +77,5 @@
   aggy = numpy.concatenate((y, numpy.zeros(N-n)))
   
   tol = epsilon / numpy.linalg.norm(aggy)
-  return numpy.dot(D, pyCSalgos.RecomTST.RecommendedTST.RecommendedTST(aggD, aggy, nsweep, tol, xinitial, ro))
+  return numpy.dot(D, pyCSalgos.TST.RecommendedTST.RecommendedTST(aggD, aggy, nsweep, tol, xinitial, ro))
   
\ No newline at end of file
--- a/ABSmixed.py	Thu Apr 05 14:00:13 2012 +0300
+++ b/ABSmixed.py	Mon Apr 23 10:54:57 2012 +0300
@@ -38,5 +38,8 @@
   Aeps = numpy.dot(M,D)
   Aexact = Vt[-(N-n):,:]
   
-  return numpy.dot(D, pyCSalgos.SL0.SL0_approx.SL0_approx_analysis(Aeps,Aexact,y,epsilon,sigma_min,sigma_decrease_factor,mu_0,L,Aeps_pinv,Aexact_pinv,true_s))
+  #return numpy.dot(D, pyCSalgos.SL0.SL0_approx.SL0_approx_analysis(Aeps,Aexact,y,epsilon,sigma_min,sigma_decrease_factor,mu_0,L,Aeps_pinv,Aexact_pinv,true_s))
+  #return numpy.dot(D, pyCSalgos.SL0.SL0_approx.SL0_robust_analysis(Aeps,Aexact,y,epsilon,sigma_min,sigma_decrease_factor,mu_0,L,Aeps_pinv,Aexact_pinv,true_s))
+  #return numpy.dot(D, pyCSalgos.SL0.SL0_approx.SL0_approx_analysis_unconstrained(Aeps,Aexact,y,epsilon,sigma_min,sigma_decrease_factor,mu_0,L,Aeps_pinv,Aexact_pinv,true_s))
+  return numpy.dot(D, pyCSalgos.SL0.SL0_approx.SL0_approx_analysis_dai(Aeps,Aexact,y,epsilon,sigma_min,sigma_decrease_factor,mu_0,L,Aeps_pinv,Aexact_pinv,true_s))
   
\ No newline at end of file
--- a/stdparams_approx.py	Thu Apr 05 14:00:13 2012 +0300
+++ b/stdparams_approx.py	Mon Apr 23 10:54:57 2012 +0300
@@ -15,8 +15,10 @@
 
 # Test parameters
 paramstest = dict()
-paramstest['algosN'] = nesta,      # tuple of algorithms not depending on lambda
-paramstest['algosL'] = lambda_sl0,  # tuple of algorithms depending on lambda (ABS-lambda)
+#paramstest['algosN'] = nesta,      # tuple of algorithms not depending on lambda
+#paramstest['algosL'] = lambda_sl0,  # tuple of algorithms depending on lambda (ABS-lambda)
+paramstest['algosN'] = gap,mixed_sl0,mixed_bp,nesta      # tuple of algorithms not depending on lambda
+paramstest['algosL'] = lambda_sl0,lambda_bp,lambda_ompeps,lambda_tst 
 paramstest['d'] = 50.0
 paramstest['sigma'] = 2.0
 paramstest['deltas'] = numpy.array([0.05, 0.45, 0.95])
@@ -25,7 +27,7 @@
 #deltas = numpy.arange(0.05,1.,0.05)
 #rhos = numpy.array([0.05])
 paramstest['numvects'] = 10;  # Number of vectors to generate
-paramstest['SNRdb'] = 20.;    # This is norm(signal)/norm(noise), so power, not energy
+paramstest['SNRdb'] = 40.;    # This is norm(signal)/norm(noise), so power, not energy
 # Values for lambda
 #lambdas = [0 10.^linspace(-5, 4, 10)];
 paramstest['lambdas'] = numpy.array([0., 0.0001, 0.01, 1, 100, 10000])
@@ -34,7 +36,7 @@
 paramstest['saveplotexts'] = ('png','pdf','eps')
 
 
-# Test parameters
+# Prove 11 convergence
 paramsl1prove = dict()
 paramsl1prove['algosN'] = nesta,      # tuple of algorithms not depending on lambda
 paramsl1prove['algosL'] = lambda_bp,  # tuple of algorithms depending on lambda (ABS-lambda)
@@ -58,14 +60,14 @@
 params1['algosN'] = gap,mixed_sl0,mixed_bp,nesta      # tuple of algorithms not depending on lambda
 params1['algosL'] = lambda_sl0,lambda_bp,lambda_ompeps,lambda_tst  # tuple of algorithms depending on lambda (ABS-lambda)
 params1['d'] = 50.0
-params1['sigma'] = 2.0
+params1['sigma'] = 1.2
 params1['deltas'] = numpy.arange(0.05,1.,0.05)
 params1['rhos'] = numpy.arange(0.05,1.,0.05)
-params1['numvects'] = 10;  # Number of vectors to generate
+params1['numvects'] = 100;  # Number of vectors to generate
 params1['SNRdb'] = 40.;    # This is norm(signal)/norm(noise), so power, not energy
 params1['lambdas'] = numpy.array([0., 0.0001, 0.01, 1, 100, 10000])
-params1['savedataname'] = 'approx_pt_stdtest.mat'
-params1['saveplotbase'] = 'approx_pt_stdtest_'
+params1['savedataname'] = 'approx_pt_params1.mat'
+params1['saveplotbase'] = 'approx_pt_params1_'
 params1['saveplotexts'] = ('png','pdf','eps')
 
 # Standard parameters 2
@@ -75,15 +77,15 @@
 params2 = dict()
 params2['algosN'] = gap,mixed_sl0,mixed_bp,nesta      # tuple of algorithms not depending on lambda
 params2['algosL'] = lambda_sl0,lambda_bp,lambda_ompeps,lambda_tst  # tuple of algorithms depending on lambda (ABS-lambda)
-params2['d'] = 20.0
-params2['sigma'] = 10.0
+params2['d'] = 50.0
+params2['sigma'] = 2
 params2['deltas'] = numpy.arange(0.05,1.,0.05)
 params2['rhos'] = numpy.arange(0.05,1.,0.05)
-params2['numvects'] = 10;  # Number of vectors to generate
+params2['numvects'] = 100;  # Number of vectors to generate
 params2['SNRdb'] = 40.;    # This is norm(signal)/norm(noise), so power, not energy
 params2['lambdas'] = numpy.array([0., 0.0001, 0.01, 1, 100, 10000])
-params2['savedataname'] = 'approx_pt_stdtest.mat'
-params2['saveplotbase'] = 'approx_pt_stdtest_'
+params2['savedataname'] = 'approx_pt_params2.mat'
+params2['saveplotbase'] = 'approx_pt_params2_'
 params2['saveplotexts'] = ('png','pdf','eps')
   
   
@@ -95,14 +97,15 @@
 params3['algosN'] = gap,mixed_sl0,mixed_bp,nesta      # tuple of algorithms not depending on lambda
 params3['algosL'] = lambda_sl0,lambda_bp,lambda_ompeps,lambda_tst  # tuple of algorithms depending on lambda (ABS-lambda)
 params3['d'] = 50.0
-params3['sigma'] = 2.0
+params3['sigma'] = 1.2
 params3['deltas'] = numpy.arange(0.05,1.,0.05)
 params3['rhos'] = numpy.arange(0.05,1.,0.05)
-params3['numvects'] = 10;  # Number of vectors to generate
+params3['numvects'] = 100;  # Number of vectors to generate
 params3['SNRdb'] = 20.;    # This is norm(signal)/norm(noise), so power, not energy
 params3['lambdas'] = numpy.array([0., 0.0001, 0.01, 1, 100, 10000])
-params3['savedataname'] = 'approx_pt_stdtest.mat'
-params3['saveplotbase'] = 'approx_pt_stdtest_'
+#params3['lambdas'] = numpy.array([0., 0.01, 0.1, 1, 10, 100])
+params3['savedataname'] = 'approx_pt_params3.mat'
+params3['saveplotbase'] = 'approx_pt_params3_'
 params3['saveplotexts'] = ('png','pdf','eps')
           
 # Standard parameters 4
@@ -112,13 +115,50 @@
 params4 = dict()
 params4['algosN'] = gap,mixed_sl0,mixed_bp,nesta      # tuple of algorithms not depending on lambda
 params4['algosL'] = lambda_sl0,lambda_bp,lambda_ompeps,lambda_tst  # tuple of algorithms depending on lambda (ABS-lambda)
-params4['d'] = 20.0
-params4['sigma'] = 10.0
+params4['d'] = 50.0
+params4['sigma'] = 2.0
 params4['deltas'] = numpy.arange(0.05,1.,0.05)
 params4['rhos'] = numpy.arange(0.05,1.,0.05)
-params4['numvects'] = 10;  # Number of vectors to generate
+params4['numvects'] = 100;  # Number of vectors to generate
 params4['SNRdb'] = 20.;    # This is norm(signal)/norm(noise), so power, not energy
 params4['lambdas'] = numpy.array([0., 0.0001, 0.01, 1, 100, 10000])
-params4['savedataname'] = 'approx_pt_stdtest.mat'
-params4['saveplotbase'] = 'approx_pt_stdtest_'
+#params4['lambdas'] = numpy.array([0., 0.01, 0.1, 1, 10, 100])
+params4['savedataname'] = 'approx_pt_params4.mat'
+params4['saveplotbase'] = 'approx_pt_params4_'
 params4['saveplotexts'] = ('png','pdf','eps')
+
+
+# Standard parameters 5
+# All algorithms, 100 vectors
+# d = 50, sigma = 2, delta and rho full resolution (0.05 step), lambdas = 0, 1e-4, 1e-2, 1, 100, 10000
+# VIRTUALLY NO NOISE, Noise 200db
+params5 = dict()
+params5['algosN'] = gap,mixed_sl0,mixed_bp,nesta      # tuple of algorithms not depending on lambda
+params5['algosL'] = lambda_sl0,lambda_bp,lambda_ompeps,lambda_tst  # tuple of algorithms depending on lambda (ABS-lambda)
+params5['d'] = 50.0
+params5['sigma'] = 1.2
+params5['deltas'] = numpy.arange(0.05,1.,0.05)
+params5['rhos'] = numpy.arange(0.05,1.,0.05)
+params5['numvects'] = 10;  # Number of vectors to generate
+params5['SNRdb'] = 200.;    # This is norm(signal)/norm(noise), so power, not energy
+params5['lambdas'] = numpy.array([0., 0.0001, 0.01, 1, 100, 10000])
+params5['savedataname'] = 'approx_pt_params5.mat'
+params5['saveplotbase'] = 'approx_pt_params5_'
+params5['saveplotexts'] = ('png','pdf','eps')
+
+params3sl0 = dict()
+params3sl0['algosN'] = mixed_sl0,      # tuple of algorithms not depending on lambda
+params3sl0['algosL'] = lambda_sl0,  # tuple of algorithms depending on lambda (ABS-lambda)
+params3sl0['d'] = 50.0
+params3sl0['sigma'] = 1.2
+params3sl0['deltas'] = numpy.arange(0.05,1.,0.25)
+params3sl0['rhos'] = numpy.arange(0.05,1.,0.25)
+#params3sl0['deltas'] = numpy.array([0.85])
+#params3sl0['rhos'] = numpy.array([0.15])
+params3sl0['numvects'] = 10;  # Number of vectors to generate
+params3sl0['SNRdb'] = 20.;    # This is norm(signal)/norm(noise), so power, not energy
+#params3sl0['lambdas'] = numpy.array([0., 0.01, 0.1, 1, 10, 100])
+params3sl0['lambdas'] = numpy.array([0.0001, 10000])
+params3sl0['savedataname'] = 'approx_pt_params3sl0.mat'
+params3sl0['saveplotbase'] = 'approx_pt_params3sl0_'
+params3sl0['saveplotexts'] = ('png','pdf','eps')
\ No newline at end of file
--- a/test_approx.py	Thu Apr 05 14:00:13 2012 +0300
+++ b/test_approx.py	Mon Apr 23 10:54:57 2012 +0300
@@ -48,6 +48,7 @@
 import pyCSalgos.BP.l1qec
 import pyCSalgos.BP.l1qc
 import pyCSalgos.NESTA.NESTA
+import pyCSalgos.SL0.EllipseProj
 
 # For plotting with right axes
 import utils
@@ -64,7 +65,7 @@
     currmodule = sys.modules[__name__]
     currmodule.proccount = share
     currmodule.ntasks = ntasks
-    currmodule._printLock = printLock
+    currmodule.printLock = printLock
 
 def generateTaskParams(globalparams):
   """
@@ -82,7 +83,8 @@
   lambdas = globalparams['lambdas']
   
   # Process parameters
-  noiselevel = 1.0 / (10.0**(SNRdb/10.0));
+  # noiselevel = norm(noise)/norm(signal) = SNR**(-1/2) = 10**-(SNRdb/20)
+  noiselevel = 1.0 / (10.0**(SNRdb/20.0));
   
   for delta in deltas:
       for rho in rhos:
@@ -368,6 +370,8 @@
     currmodule.printLock = multiprocessing.Lock()
     pool = multiprocessing.Pool(ncpus,initializer=initProcess,initargs=(currmodule.proccount,currmodule.ntasks,currmodule.printLock))
     taskresults = pool.map(run_once_tuple, taskparams)
+    pool.close()
+    pool.join()
   else:
     for taskparam in taskparams:
       taskresults.append(run_once_tuple(taskparam))
@@ -434,6 +438,8 @@
         print "Caught exception when running algorithm",strname," :",e.message
       except pyCSalgos.NESTA.NESTA.NestaError as e:
         print "Caught exception when running algorithm",strname," :",e.message
+      except pyCSalgos.SL0.EllipseProj.EllipseProjDaiError as e:
+        print "Caught exception when running algorithm",strname," :",e.message
 
   # Run algorithms with Lambda
   for ilbd,lbd in zip(numpy.arange(lambdas.size),lambdas):
@@ -449,6 +455,9 @@
           elapsed[strname][ilbd] = elapsed[strname][ilbd] + (time.time() - timestart)
         except pyCSalgos.BP.l1qc.l1qcInputValueError as e:
           print "Caught exception when running algorithm",strname," :",e.message
+        except pyCSalgos.SL0.EllipseProj.EllipseProjDaiError as e:
+          print "Caught exception when running algorithm",strname," :",e.message
+          
 
   return xrec, elapsed
 
@@ -459,17 +468,55 @@
   """
   #paramsl1prove['reference_signal'] = nesta[1] # 'NESTA'
   run(stdparams_approx.paramsl1prove)
-  plotProveEll1(stdparams_approx.paramsl1prove['savedataname'])
-
+  #plotProveEll1(stdparams_approx.paramsl1prove['savedataname'])
+  utils.replot_ProveEll1(stdparams_approx.paramsl1prove['savedataname'],
+                     algonames = None, # will read them from mat file
+                     doshow=False,
+                     dosave=True,
+                     saveplotbase=stdparams_approx.paramsl1prove['saveplotbase'],
+                     saveplotexts=stdparams_approx.paramsl1prove['saveplotexts'])  
 
 def generateFig():
   """
   Generates figures. 
   Figures are saved in the current folder.
   """
-  run(stdparams_exact.std1)
-  plot(stdparams_exact.std1['savedataname'])
- 
+  #stdparams_approx.params1['ncpus'] = 1
+  run(stdparams_approx.params1)
+  utils.replot_approx(stdparams_approx.params1['savedataname'],
+                     algonames = None, # will read them from mat file
+                     doshow=False,
+                     dosave=True,
+                     saveplotbase=stdparams_approx.params1['saveplotbase'],
+                     saveplotexts=stdparams_approx.params1['saveplotexts'])
+
+  #stdparams_approx.params2['ncpus'] = 1
+  run(stdparams_approx.params2)
+  utils.replot_approx(stdparams_approx.params2['savedataname'],
+                     algonames = None, # will read them from mat file
+                     doshow=False,
+                     dosave=True,
+                     saveplotbase=stdparams_approx.params2['saveplotbase'],
+                     saveplotexts=stdparams_approx.params2['saveplotexts'])
+                     
+  #stdparams_approx.params3['ncpus'] = 1
+  run(stdparams_approx.params3)
+  utils.replot_approx(stdparams_approx.params3['savedataname'],
+                     algonames = None, # will read them from mat file
+                     doshow=False,
+                     dosave=True,
+                     saveplotbase=stdparams_approx.params3['saveplotbase'],
+                     saveplotexts=stdparams_approx.params3['saveplotexts'])
+
+  #stdparams_approx.params4['ncpus'] = 1
+  run(stdparams_approx.params4)
+  utils.replot_approx(stdparams_approx.params4['savedataname'],
+                     algonames = None, # will read them from mat file
+                     doshow=False,
+                     dosave=True,
+                     saveplotbase=stdparams_approx.params4['saveplotbase'],
+                     saveplotexts=stdparams_approx.params4['saveplotexts'])                     
+
 # Script main
 if __name__ == "__main__":
 
@@ -482,9 +529,40 @@
   #stdparams_approx.paramstest['ncpus'] = 1
   #run(stdparams_approx.paramstest)
   #plot(stdparams_approx.paramstest['savedataname'])
-  utils.replot_approx(stdparams_approx.paramstest['savedataname'],
+  #utils.replot_approx(stdparams_approx.paramstest['savedataname'], algonames = None,doshow=False,dosave=True,saveplotbase=stdparams_approx.paramstest['saveplotbase'],saveplotexts=stdparams_approx.paramstest['saveplotexts'])
+  
+  #stdparams_approx.params5['ncpus'] = 3
+  #run(stdparams_approx.params5)
+  #utils.replot_approx(stdparams_approx.params5['savedataname'],
+  #                   algonames = None, # will read them from mat file
+  #                   doshow=False,
+  #                   dosave=True,
+  #                   saveplotbase=stdparams_approx.params5['saveplotbase'],
+  #                   saveplotexts=stdparams_approx.params5['saveplotexts'])  
+
+#  stdparams_approx.params3sl0['ncpus'] = 1
+#  run(stdparams_approx.params3sl0)
+#  utils.replot_approx(stdparams_approx.params3sl0['savedataname'],
+#                     algonames = None, # will read them from mat file
+#                     doshow=False,
+#                     dosave=True,
+#                     saveplotbase=stdparams_approx.params3sl0['saveplotbase'],
+#                     saveplotexts=stdparams_approx.params3sl0['saveplotexts'])  
+
+  #stdparams_approx.params3['ncpus'] = 1
+  run(stdparams_approx.params3)
+  utils.replot_approx(stdparams_approx.params3['savedataname'],
                      algonames = None, # will read them from mat file
                      doshow=False,
                      dosave=True,
-                     saveplotbase=stdparams_approx.paramstest['saveplotbase'],
-                     saveplotexts=stdparams_approx.paramstest['saveplotexts'])
+                     saveplotbase=stdparams_approx.params3['saveplotbase'],
+                     saveplotexts=stdparams_approx.params3['saveplotexts'])  
+                     
+  #stdparams_approx.params4['ncpus'] = 1
+  run(stdparams_approx.params4)
+  utils.replot_approx(stdparams_approx.params4['savedataname'],
+                     algonames = None, # will read them from mat file
+                     doshow=False,
+                     dosave=True,
+                     saveplotbase=stdparams_approx.params4['saveplotbase'],
+                     saveplotexts=stdparams_approx.params4['saveplotexts'])                      
--- a/utils.py	Thu Apr 05 14:00:13 2012 +0300
+++ b/utils.py	Mon Apr 23 10:54:57 2012 +0300
@@ -30,7 +30,9 @@
         print "Exiting."
         return
  
-    loadshowmatrices_multipixels(filename, algonames, [], [], algonames, [], doshow, dosave, saveplotbase, saveplotexts)
+    withticks = ['GAP']
+    withnoaxes = [algoname[0][0] for algoname in algonames if algoname not in withticks]
+    loadshowmatrices_multipixels(filename, algonames, [], [], withticks, withnoaxes, doshow, dosave, saveplotbase, saveplotexts)
       
 def replot_approx(filename, algonames = None, doshow=True, dosave=False, saveplotbase=None, saveplotexts=None):
     """
@@ -42,7 +44,13 @@
 
     if algonames == None:
       if 'algosNnames' in mdict and 'algosLnames' in mdict:
-        algonames = numpy.vstack((mdict['algosNnames'], mdict['algosLnames']))
+        
+        if mdict['algosLnames'].size is 0:
+          algonames = mdict['algosNnames']
+        elif mdict['algosNnames'].size is 0:
+          algonames = mdict['algosLnames']
+        else:
+          algonames = numpy.vstack((mdict['algosNnames'], mdict['algosLnames']))
       else:
         print "No algonames given, and couldn't find them in mat file."
         print "Exiting."
@@ -167,6 +175,65 @@
     if doshow:
       plt.show()
     print "Finished."    
+
+def replot_ProveEll1(filename, algonames=None, doshow=True, dosave=False, saveplotbase=None, saveplotexts=None):
+
+  """
+  Plot ...
+  The files are saved in the current folder.
+  """
+
+  mdict = scipy.io.loadmat(filename)
+
+  if algonames == None:
+    if 'algosNnames' in mdict and 'algosLnames' in mdict:
+      algonames = numpy.vstack((mdict['algosNnames'], mdict['algosLnames']))
+    else:
+      print "No algonames given, and couldn't find them in mat file."
+      print "Exiting."
+      return
+
+  lambdas = mdict['lambdas']
+
+  toplot = numpy.zeros((len(lambdas),len(algonames)))
+  
+  idxcol = 0
+  for algonameobj in algonames:
+    algoname = algonameobj[0][0]
+    if mdict['meanmatrix'][algoname][0,0].ndim == 2:
+      toplot[:,idxcol] = (1 - mdict['meanmatrix'][algoname][0,0]) * numpy.ones(len(lambdas))
+    elif mdict['meanmatrix'][algoname][0,0].ndim == 3:
+      for ilbd in numpy.arange(len(lambdas)):
+        toplot[ilbd,idxcol] = 1 - mdict['meanmatrix'][algoname][0,0][ilbd][0,0]
+    idxcol = idxcol + 1
+
+  plt.figure()
+  plt.plot(toplot)
+  #plt.legend([algonameobj[0][0] for algonameobj in algonames])
+  plt.legend(['NESTA', r'ABS-$\lambda$: BP'])
+
+  ax = plt.gca()
+
+  fewerticks = [0,3,6,9]
+  xticklabels = []
+  for i in range(lambdas.size):
+    if i in fewerticks:
+      xticklabels.append('{:g}'.format(lambdas[i,0]))
+    else:
+      xticklabels.append('')
+  ax.set_xticklabels(xticklabels)
+  #ax.set_xlabel(r'Value of $\lambda$', size=60)
+  ax.set_xlabel(r'$\lambda$', size=40)
+  for label in ax.get_xticklabels():
+    label.set_fontsize(20) 
+  for label in ax.get_yticklabels():
+    label.set_fontsize(20)
+  for ext in saveplotexts:
+    plt.savefig(saveplotbase + '.' + ext, bbox_inches='tight')
+
+  if doshow:
+    plt.show()
+  print "Finished."   
     
 def appendtomatfile(filename, toappend, toappendname):
   mdict = scipy.io.loadmat(filename)