Parallel CSC with a Spatial Mask

This example compares the use of parcbpdn.ParConvBPDN with cbpdn.ConvBPDNMaskDcpl for convolutional sparse coding with a spatial mask [50]. The example problem is inpainting of randomly distributed corruption of a greyscale image.

from __future__ import print_function
from builtins import input

import pyfftw   # See https://github.com/pyFFTW/pyFFTW/issues/40
import numpy as np

from sporco.admm import tvl2
from sporco.admm import cbpdn
from sporco.admm import parcbpdn
from sporco import util
from sporco import metric
from sporco import plot
plot.config_notebook_plotting()

Load a reference image.

img = util.ExampleImages().image('monarch.png', zoom=0.25, scaled=True,
                                 gray=True, idxexp=np.s_[:, 160:672])

Create random mask and apply to reference image to obtain test image. (The call to numpy.random.seed ensures that the pseudo-random noise is reproducible.)

t = 0.5
np.random.seed(12345)
msk = np.random.randn(*(img.shape))
msk[np.abs(msk) > t] = 1
msk[np.abs(msk) < t] = 0
imgw = msk * img

Define pad and crop functions.

pn = 8
spad = lambda x:  np.pad(x, pn, mode='symmetric')
zpad = lambda x:  np.pad(x, pn, mode='constant')
crop = lambda x: x[pn:-pn, pn:-pn]

Construct padded mask and test image.

mskp = zpad(msk)
imgwp = spad(imgw)

\(\ell_2\)-TV denoising with a spatial mask as a non-linear lowpass filter. The highpass component is the difference between the test image and the lowpass component, multiplied by the mask for faster convergence of the convolutional sparse coding (see [60]).

lmbda = 0.05
opt = tvl2.TVL2Denoise.Options({'Verbose': False, 'MaxMainIter': 200,
                                'DFidWeight': mskp, 'gEvalY': False,
                                'AutoRho': {'Enabled': True}})
b = tvl2.TVL2Denoise(imgwp, lmbda, opt)
sl = b.solve()
sh = mskp * (imgwp - sl)

Load dictionary.

D = util.convdicts()['G:12x12x216']
plot.imview(util.tiledict(D), fgsz=(7, 7))

lmbda = 2e-2
../../_images/parcbpdn_md_gry_13_0.png

The RelStopTol was chosen for the two different methods to stop with similar functional values

Initialise and run serial CSC solver using masked decoupling [28].

opt = cbpdn.ConvBPDNMaskDcpl.Options({'Verbose': True, 'MaxMainIter': 200,
                            'HighMemSolve': True, 'RelStopTol': 5e-2,
                            'AuxVarObj': False, 'RelaxParam': 1.8,
                            'rho': 5e1*lmbda + 1e-1, 'AutoRho':
                            {'Enabled': False, 'StdResiduals': False}})
b = cbpdn.ConvBPDNMaskDcpl(D, sh, lmbda, mskp, opt=opt)
X = b.solve()
Itn   Fnc       DFid      Regℓ1     r         s
------------------------------------------------------
   0  1.20e+01  5.44e-03  5.98e+02  1.06e-01  9.64e-01
   1  1.09e+01  3.73e-02  5.44e+02  9.75e-02  1.16e+00
   2  1.01e+01  7.97e-02  5.00e+02  9.15e-02  1.16e+00
   3  9.65e+00  1.15e-01  4.77e+02  8.79e-02  1.05e+00
   4  9.54e+00  1.37e-01  4.70e+02  8.57e-02  9.00e-01
   5  9.55e+00  1.50e-01  4.70e+02  8.35e-02  7.61e-01
   6  9.50e+00  1.59e-01  4.67e+02  7.97e-02  6.53e-01
   7  9.39e+00  1.66e-01  4.61e+02  7.59e-02  5.76e-01
   8  9.27e+00  1.73e-01  4.55e+02  7.26e-02  5.16e-01
   9  9.20e+00  1.81e-01  4.51e+02  6.98e-02  4.62e-01
  10  9.20e+00  1.89e-01  4.51e+02  6.73e-02  4.13e-01
  11  9.17e+00  1.98e-01  4.49e+02  6.48e-02  3.72e-01
  12  9.15e+00  2.07e-01  4.47e+02  6.24e-02  3.39e-01
  13  9.11e+00  2.14e-01  4.45e+02  6.02e-02  3.13e-01
  14  9.06e+00  2.18e-01  4.42e+02  5.81e-02  2.93e-01
  15  9.00e+00  2.21e-01  4.39e+02  5.62e-02  2.80e-01
  16  8.90e+00  2.22e-01  4.34e+02  5.43e-02  2.72e-01
  17  8.78e+00  2.22e-01  4.28e+02  5.26e-02  2.67e-01
  18  8.63e+00  2.22e-01  4.21e+02  5.09e-02  2.63e-01
  19  8.52e+00  2.22e-01  4.15e+02  4.96e-02  2.58e-01
  20  8.40e+00  2.24e-01  4.09e+02  4.82e-02  2.52e-01
  21  8.28e+00  2.26e-01  4.03e+02  4.69e-02  2.46e-01
  22  8.17e+00  2.30e-01  3.97e+02  4.58e-02  2.41e-01
  23  8.07e+00  2.33e-01  3.92e+02  4.47e-02  2.35e-01
  24  7.98e+00  2.36e-01  3.87e+02  4.37e-02  2.30e-01
  25  7.91e+00  2.40e-01  3.83e+02  4.28e-02  2.26e-01
  26  7.84e+00  2.43e-01  3.80e+02  4.20e-02  2.22e-01
  27  7.77e+00  2.46e-01  3.76e+02  4.11e-02  2.18e-01
  28  7.70e+00  2.49e-01  3.73e+02  4.03e-02  2.15e-01
  29  7.63e+00  2.52e-01  3.69e+02  3.95e-02  2.12e-01
  30  7.55e+00  2.54e-01  3.65e+02  3.88e-02  2.08e-01
  31  7.46e+00  2.57e-01  3.60e+02  3.81e-02  2.04e-01
  32  7.37e+00  2.60e-01  3.55e+02  3.74e-02  2.00e-01
  33  7.27e+00  2.64e-01  3.50e+02  3.67e-02  1.96e-01
  34  7.18e+00  2.67e-01  3.46e+02  3.60e-02  1.92e-01
  35  7.10e+00  2.70e-01  3.41e+02  3.54e-02  1.87e-01
  36  7.02e+00  2.73e-01  3.37e+02  3.47e-02  1.83e-01
  37  6.97e+00  2.76e-01  3.35e+02  3.41e-02  1.78e-01
  38  6.93e+00  2.79e-01  3.32e+02  3.36e-02  1.73e-01
  39  6.89e+00  2.81e-01  3.31e+02  3.30e-02  1.69e-01
  40  6.86e+00  2.83e-01  3.29e+02  3.24e-02  1.65e-01
  41  6.82e+00  2.85e-01  3.27e+02  3.19e-02  1.62e-01
  42  6.78e+00  2.87e-01  3.25e+02  3.14e-02  1.59e-01
  43  6.75e+00  2.89e-01  3.23e+02  3.09e-02  1.56e-01
  44  6.72e+00  2.90e-01  3.21e+02  3.04e-02  1.53e-01
  45  6.68e+00  2.92e-01  3.19e+02  2.99e-02  1.50e-01
  46  6.64e+00  2.93e-01  3.17e+02  2.95e-02  1.48e-01
  47  6.59e+00  2.94e-01  3.15e+02  2.91e-02  1.46e-01
  48  6.53e+00  2.95e-01  3.12e+02  2.86e-02  1.44e-01
  49  6.48e+00  2.96e-01  3.09e+02  2.82e-02  1.42e-01
  50  6.41e+00  2.97e-01  3.06e+02  2.78e-02  1.41e-01
  51  6.36e+00  2.98e-01  3.03e+02  2.74e-02  1.39e-01
  52  6.30e+00  3.00e-01  3.00e+02  2.70e-02  1.38e-01
  53  6.25e+00  3.01e-01  2.97e+02  2.66e-02  1.37e-01
  54  6.20e+00  3.03e-01  2.95e+02  2.62e-02  1.36e-01
  55  6.16e+00  3.05e-01  2.93e+02  2.59e-02  1.34e-01
  56  6.11e+00  3.06e-01  2.90e+02  2.55e-02  1.33e-01
  57  6.07e+00  3.08e-01  2.88e+02  2.52e-02  1.32e-01
  58  6.03e+00  3.09e-01  2.86e+02  2.49e-02  1.31e-01
  59  5.99e+00  3.11e-01  2.84e+02  2.45e-02  1.29e-01
  60  5.97e+00  3.12e-01  2.83e+02  2.42e-02  1.28e-01
  61  5.94e+00  3.13e-01  2.81e+02  2.39e-02  1.26e-01
  62  5.92e+00  3.14e-01  2.80e+02  2.36e-02  1.24e-01
  63  5.90e+00  3.15e-01  2.79e+02  2.33e-02  1.23e-01
  64  5.87e+00  3.16e-01  2.78e+02  2.31e-02  1.21e-01
  65  5.85e+00  3.17e-01  2.76e+02  2.28e-02  1.19e-01
  66  5.82e+00  3.18e-01  2.75e+02  2.25e-02  1.18e-01
  67  5.80e+00  3.19e-01  2.74e+02  2.23e-02  1.16e-01
  68  5.77e+00  3.19e-01  2.73e+02  2.20e-02  1.14e-01
  69  5.75e+00  3.20e-01  2.72e+02  2.17e-02  1.13e-01
  70  5.73e+00  3.20e-01  2.71e+02  2.15e-02  1.12e-01
  71  5.71e+00  3.21e-01  2.69e+02  2.12e-02  1.10e-01
  72  5.68e+00  3.21e-01  2.68e+02  2.10e-02  1.09e-01
  73  5.65e+00  3.21e-01  2.67e+02  2.07e-02  1.08e-01
  74  5.63e+00  3.22e-01  2.65e+02  2.05e-02  1.07e-01
  75  5.60e+00  3.22e-01  2.64e+02  2.02e-02  1.06e-01
  76  5.58e+00  3.22e-01  2.63e+02  2.00e-02  1.05e-01
  77  5.56e+00  3.23e-01  2.62e+02  1.98e-02  1.03e-01
  78  5.54e+00  3.23e-01  2.61e+02  1.97e-02  1.02e-01
  79  5.52e+00  3.24e-01  2.60e+02  1.95e-02  1.01e-01
  80  5.50e+00  3.24e-01  2.59e+02  1.93e-02  9.95e-02
  81  5.47e+00  3.25e-01  2.57e+02  1.91e-02  9.83e-02
  82  5.44e+00  3.25e-01  2.56e+02  1.89e-02  9.73e-02
  83  5.41e+00  3.26e-01  2.54e+02  1.87e-02  9.64e-02
  84  5.38e+00  3.27e-01  2.52e+02  1.86e-02  9.56e-02
  85  5.35e+00  3.27e-01  2.51e+02  1.84e-02  9.49e-02
  86  5.32e+00  3.28e-01  2.50e+02  1.82e-02  9.42e-02
  87  5.30e+00  3.29e-01  2.48e+02  1.80e-02  9.36e-02
  88  5.28e+00  3.30e-01  2.47e+02  1.79e-02  9.30e-02
  89  5.26e+00  3.30e-01  2.46e+02  1.77e-02  9.24e-02
  90  5.24e+00  3.31e-01  2.45e+02  1.76e-02  9.17e-02
  91  5.22e+00  3.31e-01  2.44e+02  1.74e-02  9.11e-02
  92  5.20e+00  3.32e-01  2.44e+02  1.73e-02  9.04e-02
  93  5.19e+00  3.32e-01  2.43e+02  1.71e-02  8.96e-02
  94  5.18e+00  3.33e-01  2.42e+02  1.70e-02  8.89e-02
  95  5.17e+00  3.33e-01  2.42e+02  1.69e-02  8.81e-02
  96  5.15e+00  3.34e-01  2.41e+02  1.67e-02  8.72e-02
  97  5.14e+00  3.34e-01  2.40e+02  1.66e-02  8.64e-02
  98  5.13e+00  3.35e-01  2.40e+02  1.65e-02  8.56e-02
  99  5.11e+00  3.35e-01  2.39e+02  1.64e-02  8.49e-02
 100  5.09e+00  3.36e-01  2.38e+02  1.62e-02  8.42e-02
 101  5.07e+00  3.36e-01  2.37e+02  1.61e-02  8.36e-02
 102  5.05e+00  3.37e-01  2.36e+02  1.60e-02  8.30e-02
 103  5.03e+00  3.38e-01  2.35e+02  1.59e-02  8.25e-02
 104  5.01e+00  3.38e-01  2.34e+02  1.57e-02  8.19e-02
 105  4.99e+00  3.39e-01  2.33e+02  1.56e-02  8.14e-02
 106  4.97e+00  3.39e-01  2.32e+02  1.55e-02  8.08e-02
 107  4.96e+00  3.40e-01  2.31e+02  1.53e-02  8.03e-02
 108  4.94e+00  3.40e-01  2.30e+02  1.52e-02  7.97e-02
 109  4.93e+00  3.41e-01  2.29e+02  1.51e-02  7.91e-02
 110  4.91e+00  3.41e-01  2.29e+02  1.50e-02  7.86e-02
 111  4.90e+00  3.41e-01  2.28e+02  1.48e-02  7.81e-02
 112  4.88e+00  3.42e-01  2.27e+02  1.47e-02  7.76e-02
 113  4.87e+00  3.42e-01  2.26e+02  1.46e-02  7.71e-02
 114  4.85e+00  3.42e-01  2.25e+02  1.45e-02  7.66e-02
 115  4.84e+00  3.43e-01  2.25e+02  1.44e-02  7.62e-02
 116  4.82e+00  3.43e-01  2.24e+02  1.43e-02  7.58e-02
 117  4.81e+00  3.43e-01  2.23e+02  1.41e-02  7.54e-02
 118  4.79e+00  3.43e-01  2.22e+02  1.40e-02  7.50e-02
 119  4.78e+00  3.44e-01  2.22e+02  1.39e-02  7.45e-02
 120  4.77e+00  3.44e-01  2.21e+02  1.38e-02  7.40e-02
 121  4.76e+00  3.44e-01  2.21e+02  1.37e-02  7.35e-02
 122  4.75e+00  3.44e-01  2.20e+02  1.36e-02  7.29e-02
 123  4.74e+00  3.45e-01  2.20e+02  1.35e-02  7.22e-02
 124  4.73e+00  3.45e-01  2.19e+02  1.34e-02  7.15e-02
 125  4.72e+00  3.45e-01  2.19e+02  1.33e-02  7.07e-02
 126  4.71e+00  3.45e-01  2.18e+02  1.32e-02  6.99e-02
 127  4.71e+00  3.45e-01  2.18e+02  1.31e-02  6.92e-02
 128  4.70e+00  3.46e-01  2.18e+02  1.30e-02  6.84e-02
 129  4.68e+00  3.46e-01  2.17e+02  1.29e-02  6.77e-02
 130  4.67e+00  3.46e-01  2.16e+02  1.29e-02  6.71e-02
 131  4.66e+00  3.46e-01  2.16e+02  1.28e-02  6.65e-02
 132  4.65e+00  3.47e-01  2.15e+02  1.27e-02  6.60e-02
 133  4.63e+00  3.47e-01  2.14e+02  1.26e-02  6.55e-02
 134  4.62e+00  3.47e-01  2.14e+02  1.25e-02  6.52e-02
 135  4.61e+00  3.47e-01  2.13e+02  1.24e-02  6.49e-02
 136  4.59e+00  3.47e-01  2.12e+02  1.23e-02  6.46e-02
 137  4.58e+00  3.47e-01  2.11e+02  1.22e-02  6.44e-02
 138  4.56e+00  3.48e-01  2.11e+02  1.21e-02  6.42e-02
 139  4.55e+00  3.48e-01  2.10e+02  1.21e-02  6.39e-02
 140  4.54e+00  3.48e-01  2.09e+02  1.20e-02  6.37e-02
 141  4.53e+00  3.48e-01  2.09e+02  1.19e-02  6.34e-02
 142  4.52e+00  3.49e-01  2.08e+02  1.18e-02  6.31e-02
 143  4.51e+00  3.49e-01  2.08e+02  1.18e-02  6.27e-02
 144  4.50e+00  3.49e-01  2.08e+02  1.17e-02  6.23e-02
 145  4.50e+00  3.49e-01  2.07e+02  1.16e-02  6.18e-02
 146  4.49e+00  3.50e-01  2.07e+02  1.15e-02  6.13e-02
 147  4.49e+00  3.50e-01  2.07e+02  1.15e-02  6.08e-02
 148  4.48e+00  3.50e-01  2.07e+02  1.14e-02  6.03e-02
 149  4.48e+00  3.50e-01  2.06e+02  1.13e-02  5.98e-02
 150  4.47e+00  3.50e-01  2.06e+02  1.13e-02  5.94e-02
 151  4.46e+00  3.50e-01  2.05e+02  1.12e-02  5.90e-02
 152  4.45e+00  3.50e-01  2.05e+02  1.11e-02  5.87e-02
 153  4.44e+00  3.51e-01  2.04e+02  1.10e-02  5.85e-02
 154  4.42e+00  3.51e-01  2.04e+02  1.10e-02  5.83e-02
 155  4.41e+00  3.51e-01  2.03e+02  1.09e-02  5.82e-02
 156  4.40e+00  3.51e-01  2.02e+02  1.08e-02  5.81e-02
 157  4.38e+00  3.51e-01  2.02e+02  1.07e-02  5.80e-02
 158  4.37e+00  3.51e-01  2.01e+02  1.07e-02  5.79e-02
 159  4.36e+00  3.52e-01  2.01e+02  1.06e-02  5.78e-02
 160  4.35e+00  3.52e-01  2.00e+02  1.05e-02  5.76e-02
 161  4.34e+00  3.52e-01  2.00e+02  1.05e-02  5.74e-02
 162  4.34e+00  3.52e-01  1.99e+02  1.04e-02  5.71e-02
 163  4.33e+00  3.52e-01  1.99e+02  1.04e-02  5.68e-02
 164  4.32e+00  3.53e-01  1.98e+02  1.03e-02  5.65e-02
 165  4.31e+00  3.53e-01  1.98e+02  1.03e-02  5.62e-02
 166  4.31e+00  3.53e-01  1.98e+02  1.02e-02  5.58e-02
 167  4.30e+00  3.53e-01  1.97e+02  1.01e-02  5.55e-02
 168  4.29e+00  3.53e-01  1.97e+02  1.01e-02  5.53e-02
 169  4.28e+00  3.54e-01  1.96e+02  1.00e-02  5.50e-02
 170  4.27e+00  3.54e-01  1.96e+02  9.97e-03  5.48e-02
 171  4.26e+00  3.54e-01  1.95e+02  9.91e-03  5.46e-02
 172  4.25e+00  3.54e-01  1.95e+02  9.86e-03  5.43e-02
 173  4.24e+00  3.54e-01  1.94e+02  9.80e-03  5.41e-02
 174  4.24e+00  3.54e-01  1.94e+02  9.74e-03  5.38e-02
 175  4.23e+00  3.55e-01  1.94e+02  9.69e-03  5.36e-02
 176  4.22e+00  3.55e-01  1.93e+02  9.63e-03  5.33e-02
 177  4.22e+00  3.55e-01  1.93e+02  9.58e-03  5.29e-02
 178  4.21e+00  3.55e-01  1.93e+02  9.53e-03  5.26e-02
 179  4.21e+00  3.55e-01  1.93e+02  9.48e-03  5.22e-02
 180  4.20e+00  3.55e-01  1.92e+02  9.44e-03  5.19e-02
 181  4.20e+00  3.55e-01  1.92e+02  9.39e-03  5.15e-02
 182  4.19e+00  3.56e-01  1.92e+02  9.34e-03  5.12e-02
 183  4.19e+00  3.56e-01  1.92e+02  9.29e-03  5.08e-02
 184  4.18e+00  3.56e-01  1.91e+02  9.24e-03  5.05e-02
 185  4.18e+00  3.56e-01  1.91e+02  9.19e-03  5.02e-02
 186  4.17e+00  3.56e-01  1.91e+02  9.14e-03  4.98e-02
------------------------------------------------------

Initialise and run parallel CSC solver using an ADMM dictionary partition [42].

opt_par = parcbpdn.ParConvBPDN.Options({'Verbose': True, 'MaxMainIter': 200,
                            'HighMemSolve': True, 'RelStopTol': 1e-2,
                            'AuxVarObj': False, 'RelaxParam': 1.8,
                            'rho': 5e1*lmbda + 1e-1, 'alpha': 1.5,
                            'AutoRho': {'Enabled': False,
                            'StdResiduals': False}})
b_par = parcbpdn.ParConvBPDN(D, sh, lmbda, mskp, opt=opt_par)
X_par = b_par.solve()
Itn   Fnc       DFid      Regl1     r         s
------------------------------------------------------
   0  5.80e+01  3.10e+01  1.35e+03  1.19e+00  1.19e+00
   1  2.01e+01  1.35e+00  9.35e+02  9.84e-01  8.14e-01
   2  3.60e+01  1.52e+01  1.04e+03  8.17e-01  6.34e-01
   3  1.50e+01  3.53e-01  7.32e+02  7.28e-01  5.97e-01
   4  2.47e+01  7.06e+00  8.82e+02  6.43e-01  5.43e-01
   5  1.49e+01  1.03e+00  6.92e+02  6.03e-01  5.24e-01
   6  1.89e+01  3.71e+00  7.60e+02  5.57e-01  5.45e-01
   7  1.41e+01  1.13e+00  6.51e+02  5.33e-01  5.85e-01
   8  1.52e+01  1.80e+00  6.69e+02  5.07e-01  6.23e-01
   9  1.38e+01  1.08e+00  6.34e+02  4.90e-01  6.41e-01
  10  1.40e+01  1.15e+00  6.42e+02  4.73e-01  6.34e-01
  11  1.40e+01  1.10e+00  6.44e+02  4.57e-01  6.04e-01
  12  1.39e+01  1.04e+00  6.43e+02  4.41e-01  5.64e-01
  13  1.39e+01  1.12e+00  6.39e+02  4.25e-01  5.26e-01
  14  1.35e+01  1.02e+00  6.23e+02  4.09e-01  4.98e-01
  15  1.31e+01  1.02e+00  6.04e+02  3.94e-01  4.82e-01
  16  1.25e+01  8.76e-01  5.80e+02  3.80e-01  4.73e-01
  17  1.20e+01  7.96e-01  5.59e+02  3.65e-01  4.65e-01
  18  1.15e+01  6.66e-01  5.40e+02  3.52e-01  4.55e-01
  19  1.11e+01  5.90e-01  5.24e+02  3.40e-01  4.44e-01
  20  1.07e+01  5.11e-01  5.11e+02  3.29e-01  4.30e-01
  21  1.05e+01  4.70e-01  5.00e+02  3.18e-01  4.15e-01
  22  1.03e+01  4.33e-01  4.92e+02  3.08e-01  4.00e-01
  23  1.01e+01  4.21e-01  4.84e+02  2.99e-01  3.86e-01
  24  9.96e+00  4.13e-01  4.77e+02  2.91e-01  3.74e-01
  25  9.83e+00  4.20e-01  4.71e+02  2.84e-01  3.64e-01
  26  9.73e+00  4.32e-01  4.65e+02  2.77e-01  3.55e-01
  27  9.66e+00  4.52e-01  4.60e+02  2.70e-01  3.47e-01
  28  9.59e+00  4.72e-01  4.56e+02  2.64e-01  3.40e-01
  29  9.53e+00  4.94e-01  4.52e+02  2.58e-01  3.33e-01
  30  9.47e+00  5.11e-01  4.48e+02  2.52e-01  3.26e-01
  31  9.41e+00  5.24e-01  4.44e+02  2.47e-01  3.18e-01
  32  9.33e+00  5.31e-01  4.40e+02  2.42e-01  3.11e-01
  33  9.23e+00  5.33e-01  4.35e+02  2.37e-01  3.05e-01
  34  9.12e+00  5.28e-01  4.30e+02  2.32e-01  2.99e-01
  35  9.01e+00  5.19e-01  4.24e+02  2.27e-01  2.93e-01
  36  8.89e+00  5.07e-01  4.19e+02  2.22e-01  2.86e-01
  37  8.76e+00  4.92e-01  4.13e+02  2.18e-01  2.80e-01
  38  8.61e+00  4.76e-01  4.06e+02  2.14e-01  2.75e-01
  39  8.46e+00  4.60e-01  4.00e+02  2.09e-01  2.71e-01
  40  8.32e+00  4.43e-01  3.94e+02  2.05e-01  2.67e-01
  41  8.19e+00  4.27e-01  3.88e+02  2.02e-01  2.62e-01
  42  8.08e+00  4.12e-01  3.84e+02  1.98e-01  2.57e-01
  43  7.99e+00  4.00e-01  3.79e+02  1.94e-01  2.51e-01
  44  7.90e+00  3.90e-01  3.75e+02  1.91e-01  2.46e-01
  45  7.81e+00  3.82e-01  3.71e+02  1.87e-01  2.40e-01
  46  7.71e+00  3.75e-01  3.67e+02  1.84e-01  2.36e-01
  47  7.62e+00  3.70e-01  3.62e+02  1.81e-01  2.32e-01
  48  7.54e+00  3.66e-01  3.59e+02  1.78e-01  2.29e-01
  49  7.48e+00  3.63e-01  3.56e+02  1.75e-01  2.26e-01
  50  7.43e+00  3.63e-01  3.53e+02  1.72e-01  2.22e-01
  51  7.37e+00  3.64e-01  3.50e+02  1.69e-01  2.18e-01
  52  7.31e+00  3.66e-01  3.47e+02  1.67e-01  2.14e-01
  53  7.25e+00  3.70e-01  3.44e+02  1.64e-01  2.11e-01
  54  7.20e+00  3.74e-01  3.41e+02  1.61e-01  2.09e-01
  55  7.16e+00  3.78e-01  3.39e+02  1.59e-01  2.05e-01
  56  7.12e+00  3.81e-01  3.37e+02  1.57e-01  2.02e-01
  57  7.07e+00  3.84e-01  3.34e+02  1.54e-01  1.99e-01
  58  7.02e+00  3.86e-01  3.32e+02  1.52e-01  1.96e-01
  59  6.97e+00  3.87e-01  3.29e+02  1.50e-01  1.93e-01
  60  6.92e+00  3.87e-01  3.26e+02  1.48e-01  1.90e-01
  61  6.86e+00  3.87e-01  3.24e+02  1.46e-01  1.87e-01
  62  6.80e+00  3.87e-01  3.21e+02  1.43e-01  1.85e-01
  63  6.74e+00  3.85e-01  3.18e+02  1.41e-01  1.82e-01
  64  6.68e+00  3.83e-01  3.15e+02  1.39e-01  1.80e-01
  65  6.63e+00  3.81e-01  3.12e+02  1.38e-01  1.78e-01
  66  6.58e+00  3.78e-01  3.10e+02  1.36e-01  1.75e-01
  67  6.53e+00  3.75e-01  3.08e+02  1.34e-01  1.73e-01
  68  6.48e+00  3.72e-01  3.05e+02  1.32e-01  1.70e-01
  69  6.43e+00  3.70e-01  3.03e+02  1.30e-01  1.68e-01
  70  6.38e+00  3.68e-01  3.01e+02  1.29e-01  1.65e-01
  71  6.33e+00  3.67e-01  2.98e+02  1.27e-01  1.63e-01
  72  6.29e+00  3.67e-01  2.96e+02  1.25e-01  1.61e-01
  73  6.25e+00  3.67e-01  2.94e+02  1.24e-01  1.59e-01
  74  6.21e+00  3.67e-01  2.92e+02  1.22e-01  1.57e-01
  75  6.18e+00  3.68e-01  2.90e+02  1.20e-01  1.55e-01
  76  6.14e+00  3.68e-01  2.89e+02  1.19e-01  1.53e-01
  77  6.10e+00  3.68e-01  2.87e+02  1.17e-01  1.51e-01
  78  6.06e+00  3.69e-01  2.85e+02  1.16e-01  1.49e-01
  79  6.02e+00  3.69e-01  2.83e+02  1.15e-01  1.48e-01
  80  5.99e+00  3.69e-01  2.81e+02  1.13e-01  1.46e-01
  81  5.95e+00  3.69e-01  2.79e+02  1.12e-01  1.44e-01
  82  5.92e+00  3.69e-01  2.78e+02  1.10e-01  1.43e-01
  83  5.89e+00  3.69e-01  2.76e+02  1.09e-01  1.41e-01
  84  5.86e+00  3.69e-01  2.74e+02  1.08e-01  1.39e-01
  85  5.83e+00  3.68e-01  2.73e+02  1.07e-01  1.37e-01
  86  5.79e+00  3.68e-01  2.71e+02  1.05e-01  1.35e-01
  87  5.76e+00  3.68e-01  2.70e+02  1.04e-01  1.34e-01
  88  5.73e+00  3.68e-01  2.68e+02  1.03e-01  1.32e-01
  89  5.69e+00  3.68e-01  2.66e+02  1.02e-01  1.31e-01
  90  5.65e+00  3.67e-01  2.64e+02  1.01e-01  1.29e-01
  91  5.62e+00  3.67e-01  2.62e+02  9.95e-02  1.28e-01
  92  5.59e+00  3.66e-01  2.61e+02  9.84e-02  1.27e-01
  93  5.56e+00  3.66e-01  2.60e+02  9.73e-02  1.26e-01
  94  5.54e+00  3.66e-01  2.59e+02  9.62e-02  1.24e-01
  95  5.52e+00  3.66e-01  2.58e+02  9.51e-02  1.22e-01
  96  5.49e+00  3.67e-01  2.56e+02  9.41e-02  1.21e-01
  97  5.46e+00  3.68e-01  2.55e+02  9.30e-02  1.19e-01
  98  5.43e+00  3.69e-01  2.53e+02  9.20e-02  1.18e-01
  99  5.40e+00  3.69e-01  2.51e+02  9.11e-02  1.17e-01
 100  5.38e+00  3.70e-01  2.50e+02  9.01e-02  1.16e-01
 101  5.36e+00  3.71e-01  2.49e+02  8.91e-02  1.15e-01
 102  5.34e+00  3.71e-01  2.49e+02  8.82e-02  1.14e-01
 103  5.32e+00  3.72e-01  2.47e+02  8.73e-02  1.12e-01
 104  5.29e+00  3.71e-01  2.46e+02  8.63e-02  1.11e-01
 105  5.27e+00  3.71e-01  2.45e+02  8.54e-02  1.10e-01
 106  5.23e+00  3.70e-01  2.43e+02  8.46e-02  1.09e-01
 107  5.20e+00  3.70e-01  2.42e+02  8.37e-02  1.08e-01
 108  5.17e+00  3.69e-01  2.40e+02  8.28e-02  1.07e-01
 109  5.15e+00  3.68e-01  2.39e+02  8.20e-02  1.06e-01
 110  5.13e+00  3.67e-01  2.38e+02  8.11e-02  1.05e-01
 111  5.12e+00  3.66e-01  2.38e+02  8.03e-02  1.03e-01
 112  5.10e+00  3.65e-01  2.37e+02  7.95e-02  1.02e-01
 113  5.08e+00  3.64e-01  2.36e+02  7.87e-02  1.00e-01
 114  5.04e+00  3.63e-01  2.34e+02  7.79e-02  9.93e-02
 115  5.01e+00  3.63e-01  2.32e+02  7.71e-02  9.86e-02
 116  4.98e+00  3.62e-01  2.31e+02  7.64e-02  9.82e-02
 117  4.96e+00  3.62e-01  2.30e+02  7.56e-02  9.76e-02
 118  4.94e+00  3.61e-01  2.29e+02  7.49e-02  9.68e-02
 119  4.92e+00  3.61e-01  2.28e+02  7.41e-02  9.58e-02
 120  4.91e+00  3.61e-01  2.28e+02  7.34e-02  9.45e-02
 121  4.90e+00  3.60e-01  2.27e+02  7.27e-02  9.32e-02
 122  4.88e+00  3.60e-01  2.26e+02  7.20e-02  9.20e-02
 123  4.85e+00  3.60e-01  2.25e+02  7.13e-02  9.11e-02
 124  4.83e+00  3.60e-01  2.23e+02  7.06e-02  9.04e-02
 125  4.81e+00  3.61e-01  2.22e+02  7.00e-02  8.98e-02
 126  4.79e+00  3.61e-01  2.22e+02  6.93e-02  8.91e-02
 127  4.78e+00  3.62e-01  2.21e+02  6.87e-02  8.84e-02
 128  4.76e+00  3.63e-01  2.20e+02  6.80e-02  8.76e-02
 129  4.75e+00  3.64e-01  2.19e+02  6.74e-02  8.68e-02
 130  4.73e+00  3.64e-01  2.18e+02  6.68e-02  8.59e-02
 131  4.72e+00  3.65e-01  2.18e+02  6.62e-02  8.51e-02
 132  4.70e+00  3.66e-01  2.17e+02  6.56e-02  8.43e-02
 133  4.68e+00  3.66e-01  2.16e+02  6.50e-02  8.35e-02
 134  4.67e+00  3.66e-01  2.15e+02  6.44e-02  8.27e-02
 135  4.65e+00  3.67e-01  2.14e+02  6.38e-02  8.20e-02
 136  4.64e+00  3.67e-01  2.14e+02  6.32e-02  8.12e-02
 137  4.63e+00  3.67e-01  2.13e+02  6.27e-02  8.04e-02
 138  4.61e+00  3.67e-01  2.12e+02  6.21e-02  7.96e-02
 139  4.60e+00  3.67e-01  2.11e+02  6.15e-02  7.89e-02
 140  4.58e+00  3.67e-01  2.10e+02  6.10e-02  7.83e-02
 141  4.56e+00  3.67e-01  2.10e+02  6.04e-02  7.78e-02
 142  4.54e+00  3.67e-01  2.09e+02  5.99e-02  7.73e-02
 143  4.53e+00  3.67e-01  2.08e+02  5.94e-02  7.66e-02
 144  4.52e+00  3.67e-01  2.08e+02  5.89e-02  7.58e-02
 145  4.51e+00  3.67e-01  2.07e+02  5.84e-02  7.49e-02
 146  4.50e+00  3.67e-01  2.07e+02  5.78e-02  7.40e-02
 147  4.48e+00  3.67e-01  2.06e+02  5.73e-02  7.32e-02
 148  4.47e+00  3.67e-01  2.05e+02  5.68e-02  7.26e-02
 149  4.45e+00  3.67e-01  2.04e+02  5.64e-02  7.21e-02
 150  4.43e+00  3.67e-01  2.03e+02  5.59e-02  7.17e-02
 151  4.42e+00  3.67e-01  2.03e+02  5.54e-02  7.12e-02
 152  4.41e+00  3.67e-01  2.02e+02  5.49e-02  7.07e-02
 153  4.40e+00  3.67e-01  2.01e+02  5.45e-02  7.01e-02
 154  4.38e+00  3.68e-01  2.01e+02  5.40e-02  6.95e-02
 155  4.37e+00  3.68e-01  2.00e+02  5.35e-02  6.89e-02
 156  4.36e+00  3.68e-01  2.00e+02  5.31e-02  6.83e-02
 157  4.35e+00  3.68e-01  1.99e+02  5.26e-02  6.77e-02
 158  4.34e+00  3.68e-01  1.98e+02  5.22e-02  6.71e-02
 159  4.32e+00  3.68e-01  1.98e+02  5.18e-02  6.65e-02
 160  4.31e+00  3.68e-01  1.97e+02  5.13e-02  6.59e-02
 161  4.30e+00  3.67e-01  1.97e+02  5.09e-02  6.53e-02
 162  4.29e+00  3.67e-01  1.96e+02  5.05e-02  6.47e-02
 163  4.28e+00  3.67e-01  1.95e+02  5.01e-02  6.42e-02
 164  4.26e+00  3.67e-01  1.95e+02  4.97e-02  6.37e-02
 165  4.25e+00  3.66e-01  1.94e+02  4.93e-02  6.32e-02
 166  4.23e+00  3.66e-01  1.93e+02  4.89e-02  6.28e-02
 167  4.22e+00  3.66e-01  1.93e+02  4.85e-02  6.24e-02
 168  4.21e+00  3.66e-01  1.92e+02  4.81e-02  6.20e-02
------------------------------------------------------

Report runtimes of different methods of solving the same problem.

print("ConvBPDNMaskDcpl solve time: %.2fs" % b.timer.elapsed('solve_wo_rsdl'))
print("ParConvBPDN solve time: %.2fs" % b_par.timer.elapsed('solve_wo_rsdl'))
print("ParConvBPDN was %.2f times faster than ConvBPDNMaskDcpl\n" %
      (b.timer.elapsed('solve_wo_rsdl')/b_par.timer.elapsed('solve_wo_rsdl')))
ConvBPDNMaskDcpl solve time: 80.13s
ParConvBPDN solve time: 9.94s
ParConvBPDN was 8.06 times faster than ConvBPDNMaskDcpl

Reconstruct images from sparse representations.

imgr = crop(sl + b.reconstruct().squeeze())
imgr_par = crop(sl + b_par.reconstruct().squeeze())

Report performances of different methods of solving the same problem.

print("Corrupted image PSNR: %5.2f dB" % metric.psnr(img, imgw))
print("Serial Reconstruction PSNR: %5.2f dB" % metric.psnr(img, imgr))
print("Parallel Reconstruction PSNR: %5.2f dB\n" % metric.psnr(img, imgr_par))
Corrupted image PSNR: 10.07 dB
Serial Reconstruction PSNR: 21.82 dB
Parallel Reconstruction PSNR: 21.82 dB

Display reference, test, and reconstructed images

fig = plot.figure(figsize=(14, 14))
plot.subplot(2, 2, 1)
plot.imview(img, fig=fig, title='Reference Image')
plot.subplot(2, 2, 2)
plot.imview(imgw, fig=fig, title=('Corrupted Image PSNR: %5.2f dB' %
            metric.psnr(img, imgw)))
plot.subplot(2, 2, 3)
plot.imview(imgr, fig=fig, title=('Serial reconstruction PSNR: %5.2f dB' %
            metric.psnr(img, imgr)))
plot.subplot(2, 2, 4)
plot.imview(imgr_par, fig=fig, title=('Parallel reconstruction PSNR: %5.2f dB' %
            metric.psnr(img, imgr_par)))
fig.show()
../../_images/parcbpdn_md_gry_26_0.png

Display lowpass component and sparse representation

fig = plot.figure(figsize=(21, 7))
plot.subplot(1, 3, 1)
plot.imview(sl, fig=fig, cmap=plot.cm.Blues, title='Lowpass component')
plot.subplot(1, 3, 2)
plot.imview(np.squeeze(np.sum(abs(X), axis=b.cri.axisM)), fig=fig,
            cmap=plot.cm.Blues, title='Serial sparse representation')
plot.subplot(1, 3, 3)
plot.imview(np.squeeze(np.sum(abs(X_par), axis=b.cri.axisM)), fig=fig,
            cmap=plot.cm.Blues, title='Parallel sparse representation')
fig.show()
../../_images/parcbpdn_md_gry_28_0.png