Constrained Total Variation Projection with ADDM

Test for ADMM algorithm convergence on a randomized example.

addpath('../');
addpath('../toolbox/');

We want to solve a problem of the form

 |min_{x in C, norm(K*x,1)<=1} -<x,w> + epsilon/2*norm(x)^2

Here K is some sort of "gradient" operator (here we use a random matrix) and C

This can be written as

 |min_x F(K*x) + G(x)|

where F(u) = i_{norm(u,1)<=1} and G(x) = i_{C}(x) - f,w + epsilon/2*norm(f)^2.

Inner product shortcut.

dotp = @(u,v)sum(u(:).*v(:));

Dimension of the problem.

n = 300;

Number of computed "gradient".

p = 500;

Number of affine constraint

r = 10;

Regularization.

epsilon = .1;

Gradient operator.

K = randn(p,n);

Linear function to optimize.

w = randn(n,1);

Constraint operator.

A = randn(r,n);
y = randn(r,1)*0;

Projector on A*f=y.

pA = A'*(A*A')^(-1);
ProjC = @(f)f + pA*(y-A*f);

Projection on L1 ball.

ProxF = @(u,rho)perform_l1ball_projection(u,1);
ProxFS = compute_dual_prox(ProxF);

Proximal operator of G.

ProxG = @(x,tau)ProjC( (x+tau*w)/(1+tau*epsilon) );

Callback to record information during the iterations.

F = @(x)-dotp(x,w) + epsilon/2*norm(x(:))^2;
Constr = @(x)norm(K*x,1);
options.report = @(x)struct('F', F(x), 'Constr', Constr(x));

Run the algorihtm.

options.niter = 5000;
[f,R] = perform_admm(zeros(n,1), K, K', ProxFS, ProxG, options);
[********************]

Retrieve the F and constraint function values.

f = s2v(R,'F');
constr = s2v(R,'Constr');

Display.

clf;
subplot(2,1,1);
plot(f);
title('Energy');
subplot(2,1,2);
plot(log10(abs(constr-1)));
title('Constraint');