view algos.py @ 13:a2d881253324

In working, not debugged yet
author Nic Cleju <nikcleju@gmail.com>
date Mon, 12 Mar 2012 17:04:00 +0200
parents cd7cbcb03d49
children f2eb027ed101
line wrap: on
line source
# -*- coding: utf-8 -*-
"""
Define simple wrappers for algorithms

Created on Wed Dec 07 14:06:13 2011

@author: ncleju
"""

import numpy
import pyCSalgos
import pyCSalgos.GAP.GAP
import ABSexact
import ABSmixed
import ABSlambda
#import pyCSalgos.BP.l1qc
#import pyCSalgos.BP.l1qec
#import pyCSalgos.SL0.SL0_approx
#import pyCSalgos.OMP.omp_QR
#import pyCSalgos.RecomTST.RecommendedTST
#import pyCSalgos.NESTA.NESTA

###---------------------------------
### Exact reconstruction algorithms
###---------------------------------
def run_exact_gap(y,M,Omega):
  """
  Wrapper for GAP algorithm for exact analysis recovery
  """
  gapparams = {"num_iteration" : 1000,\
                   "greedy_level" : 0.9,\
                   "stopping_coefficient_size" : 1e-4,\
                   "l2solver" : 'pseudoinverse',\
                   "noise_level": 1e-10}
  return pyCSalgos.GAP.GAP.GAP(y,M,M.T,Omega,Omega.T,gapparams,numpy.zeros(Omega.shape[1]))[0]
    
def run_exact_bp(y,M,Omega):
  """
  Wrapper for BP algorithm for exact analysis recovery
  Algorithm implementation is l1eq_pd() from l1-magic toolbox
  """
  return ABSexact.bp(y,M,Omega,numpy.zeros(Omega.shape[0]))

def run_exact_ompeps(y,M,Omega):
  """
  Wrapper for OMP algorithm for exact analysis recovery, with stopping criterion = epsilon
  """
  return ABSexact.ompeps(y,M,Omega,1e-9)
  
#def run_exact_ompk(y,M,Omega)
#  """
#  Wrapper for OMP algorithm for exact analysis recovery, with stopping criterion = fixed no. of atoms
#  """

def run_exact_sl0(y,M,Omega):
  """
  Wrapper for SL0 algorithm for exact analysis recovery
  """
  sigma_min = 1e-12
  sigma_decrease_factor = 0.5
  mu_0 = 2
  L = 20
  return ABSexact.sl0(y,M,Omega, sigma_min, sigma_decrease_factor, mu_0, L)

def run_exact_tst(y,M,Omega):
  """
  Wrapper for TST algorithm (with default optimized params) for exact analysis recovery
  """
  nsweep = 300
  tol = 1e-5
  return ABSexact.tst_recom(y,M,Omega, nsweep, tol)


###---------------------------------------
### Approximate reconstruction algorithms
###---------------------------------------
#  1. Native

def run_gap(y,M,Omega,epsilon):
  """
  Wrapper for GAP algorithm for approximate analysis recovery
  """
  gapparams = {"num_iteration" : 1000,\
                   "greedy_level" : 0.9,\
                   "stopping_coefficient_size" : 1e-4,\
                   "l2solver" : 'pseudoinverse',\
                   "noise_level": epsilon}
  return pyCSalgos.GAP.GAP.GAP(y,M,M.T,Omega,Omega.T,gapparams,numpy.zeros(Omega.shape[1]))[0]

def run_nesta(y,M,Omega,epsilon):
  """
  Wrapper for NESTA algorithm for approximate analysis recovery
  """  
  U,S,V = numpy.linalg.svd(M, full_matrices = True)
  V = V.T         # Make like Matlab
  m,n = M.shape   # Make like Matlab
  S = numpy.hstack((numpy.diag(S), numpy.zeros((m,n-m))))  

  opt_muf = 1e-3
  optsUSV = {'U':U, 'S':S, 'V':V}
  opts = {'U':Omega, 'Ut':Omega.T.copy(), 'USV':optsUSV, 'TolVar':1e-5, 'Verbose':0}
  return pyCSalgos.NESTA.NESTA.NESTA(M, None, y, opt_muf, epsilon, opts)[0]

#  2. ABS-mixed

def run_mixed_sl0(y,M,Omega,epsilon):
  """
  Wrapper for SL0-mixed algorithm for approximate analysis recovery
  """ 
  sigma_min = 0.001
  sigma_decrease_factor = 0.5
  mu_0 = 2
  L = 10
  return ABSmixed.sl0(y,M,Omega,epsilon,sigma_min, sigma_decrease_factor, mu_0, L)

def run_mixed_bp(y,M,Omega,epsilon):
  """
  Wrapper for BP-mixed algorithm for approximate analysis recovery
  """   
  return ABSmixed.bp(y,M,Omega,epsilon, numpy.zeros(Omega.shape[0]))

#  3. ABS-lambda

def run_lambda_sl0(y,M,Omega,epsilon,lbd):
  """
  Wrapper for SL0 algorithm within ABS-lambda approach for approximate analysis recovery
  """    
  sigma_min = 0.001
  sigma_decrease_factor = 0.5
  mu_0 = 2
  L = 10
  return ABSlambda.sl0(y,M,Omega,epsilon, lbd, sigma_min, sigma_decrease_factor, mu_0, L)

def run_lambda_bp(y,M,Omega,epsilon,lbd):
  """
  Wrapper for BP algorithm within ABS-lambda approach for approximate analysis recovery
  """     
  return ABSlambda.bp(y,M,Omega,epsilon,lbd,numpy.zeros(Omega.shape[0]))

def run_lambda_ompeps(y,M,Omega,epsilon,lbd):
  """
  Wrapper for OMP algorithm, with stopping criterion = epsilon,
  for approximate analysis recovery within ABS-lambda approach
  """     
  return ABSlambda.ompeps(y,M,Omega,epsilon,lbd)

def run_lambda_tst(y,M,Omega,epsilon,lbd):
  """
  Wrapper for TST algorithm (with default optimized params)
  for approximate analysis recovery within ABS-lambda approach
  """
  nsweep = 300
  return ABSlambda.tst_recom(y,M,Omega,epsilon,lbd, nsweep)
  
  
### Algorithm tuples
## Exact recovery
exact_gap = (run_exact_gap, 'GAP')
exact_bp = (run_exact_bp, 'ABS-exact: BP')
exact_ompeps = (run_exact_ompeps, 'ABS-exact: OMP-eps')
exact_sl0 = (run_exact_sl0, 'ABS-exact: SL0')
exact_tst = (run_exact_tst, 'ABS-exact: TST')
## Approximate recovery
# Native
gap = (run_gap, 'GAP')
nesta = (run_nesta, 'NESTA')
# ABS-mixed
mixed_sl0 = (run_mixed_sl0, 'ABS-mixed: SL0')
mixed_bp = (run_mixed_bp, 'ABS-mixed: BP')
# ABS-lambda
lambda_sl0 = (run_lambda_sl0, 'ABS-lambda: SL0')
lambda_bp = (run_lambda_bp, 'ABS-lambda: BP')
lambda_ompeps = (run_lambda_ompeps, 'ABS-lambda: OMP-eps')
lambda_tst = (run_lambda_tst, 'ABS-lambda: TST')

##==========================
## Algorithm functions
##==========================
#def run_gap(y,M,Omega,epsilon):
#  gapparams = {"num_iteration" : 1000,\
#                   "greedy_level" : 0.9,\
#                   "stopping_coefficient_size" : 1e-4,\
#                   "l2solver" : 'pseudoinverse',\
#                   "noise_level": epsilon}
#  return pyCSalgos.GAP.GAP.GAP(y,M,M.T,Omega,Omega.T,gapparams,numpy.zeros(Omega.shape[1]))[0]
#
#def run_bp_analysis(y,M,Omega,epsilon):
#  
#  N,n = Omega.shape
#  D = numpy.linalg.pinv(Omega)
#  U,S,Vt = numpy.linalg.svd(D)
#  Aeps = numpy.dot(M,D)
#  Aexact = Vt[-(N-n):,:]
#  # We don't ned any aggregate matrices anymore
#  
#  x0 = numpy.zeros(N)
#  return numpy.dot(D , pyCSalgos.BP.l1qec.l1qec_logbarrier(x0,Aeps,Aeps.T,y,epsilon,Aexact,Aexact.T,numpy.zeros(N-n)))
#
#def run_sl0_analysis(y,M,Omega,epsilon):
#  
#  N,n = Omega.shape
#  D = numpy.linalg.pinv(Omega)
#  U,S,Vt = numpy.linalg.svd(D)
#  Aeps = numpy.dot(M,D)
#  Aexact = Vt[-(N-n):,:]
#  # We don't ned any aggregate matrices anymore
#  
#  sigmamin = 0.001
#  sigma_decrease_factor = 0.5
#  mu_0 = 2
#  L = 10
#  return numpy.dot(D , pyCSalgos.SL0.SL0_approx.SL0_approx_analysis(Aeps,Aexact,y,epsilon,sigmamin,sigma_decrease_factor,mu_0,L))
#
#def run_nesta(y,M,Omega,epsilon):
#  
#  U,S,V = numpy.linalg.svd(M, full_matrices = True)
#  V = V.T         # Make like Matlab
#  m,n = M.shape   # Make like Matlab
#  S = numpy.hstack((numpy.diag(S), numpy.zeros((m,n-m))))  
#
#  opt_muf = 1e-3
#  optsUSV = {'U':U, 'S':S, 'V':V}
#  opts = {'U':Omega, 'Ut':Omega.T.copy(), 'USV':optsUSV, 'TolVar':1e-5, 'Verbose':0}
#  return pyCSalgos.NESTA.NESTA.NESTA(M, None, y, opt_muf, epsilon, opts)[0]
#
#
#def run_sl0(y,M,Omega,D,U,S,Vt,epsilon,lbd):
#  
#  N,n = Omega.shape
#  #D = numpy.linalg.pinv(Omega)
#  #U,S,Vt = numpy.linalg.svd(D)
#  aggDupper = numpy.dot(M,D)
#  aggDlower = Vt[-(N-n):,:]
#  aggD = numpy.concatenate((aggDupper, lbd * aggDlower))
#  aggy = numpy.concatenate((y, numpy.zeros(N-n)))
#  
#  sigmamin = 0.001
#  sigma_decrease_factor = 0.5
#  mu_0 = 2
#  L = 10
#  return pyCSalgos.SL0.SL0_approx.SL0_approx(aggD,aggy,epsilon,sigmamin,sigma_decrease_factor,mu_0,L)
#  
#def run_bp(y,M,Omega,D,U,S,Vt,epsilon,lbd):
#  
#  N,n = Omega.shape
#  #D = numpy.linalg.pinv(Omega)
#  #U,S,Vt = numpy.linalg.svd(D)
#  aggDupper = numpy.dot(M,D)
#  aggDlower = Vt[-(N-n):,:]
#  aggD = numpy.concatenate((aggDupper, lbd * aggDlower))
#  aggy = numpy.concatenate((y, numpy.zeros(N-n)))
#
#  x0 = numpy.zeros(N)
#  return pyCSalgos.BP.l1qc.l1qc_logbarrier(x0,aggD,aggD.T,aggy,epsilon)
#
#def run_ompeps(y,M,Omega,D,U,S,Vt,epsilon,lbd):
#  
#  N,n = Omega.shape
#  #D = numpy.linalg.pinv(Omega)
#  #U,S,Vt = numpy.linalg.svd(D)
#  aggDupper = numpy.dot(M,D)
#  aggDlower = Vt[-(N-n):,:]
#  aggD = numpy.concatenate((aggDupper, lbd * aggDlower))
#  aggy = numpy.concatenate((y, numpy.zeros(N-n)))
#  
#  opts = dict()
#  opts['stopCrit'] = 'mse'
#  opts['stopTol'] = epsilon**2 / aggy.size
#  return pyCSalgos.OMP.omp_QR.greed_omp_qr(aggy,aggD,aggD.shape[1],opts)[0]
#  
#def run_tst(y,M,Omega,D,U,S,Vt,epsilon,lbd):
#  
#  N,n = Omega.shape
#  #D = numpy.linalg.pinv(Omega)
#  #U,S,Vt = numpy.linalg.svd(D)
#  aggDupper = numpy.dot(M,D)
#  aggDlower = Vt[-(N-n):,:]
#  aggD = numpy.concatenate((aggDupper, lbd * aggDlower))
#  aggy = numpy.concatenate((y, numpy.zeros(N-n)))
#  
#  nsweep = 300
#  tol = epsilon / numpy.linalg.norm(aggy)
#  return pyCSalgos.RecomTST.RecommendedTST.RecommendedTST(aggD, aggy, nsweep=nsweep, tol=tol)
#
##==========================
## Define tuples (algorithm function, name)
##==========================
#gap = (run_gap, 'GAP')
#sl0 = (run_sl0, 'SL0a')
#sl0analysis = (run_sl0_analysis, 'SL0a2')
#bpanalysis = (run_bp_analysis, 'BPa2')
#nesta = (run_nesta, 'NESTA')
#bp  = (run_bp, 'BP')
#ompeps = (run_ompeps, 'OMPeps')
#tst = (run_tst, 'TST')