Mercurial > hg > absrec
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)