-
Notifications
You must be signed in to change notification settings - Fork 27
Open
Description
Whipped this together earlier. Not sure on the stopping criterion, but it seems reasonable...
using ProximalOperators
# Define solvers
function NNLS_admm(A, b, x; tol = 1e-9, maxit = 50000, α = 1.0)
u = zero(x)
#Constraint dictates that x = z
z = @view x[:]
lastx = deepcopy(z)
f = LeastSquares(A, b)
g = IndNonnegative()
for it = 1:maxit
# perform f-update step
prox!(x, f, x - z + u, α)
# perform g-update step
prox!(z, g, x + u, α)
# stopping criterion
if norm(lastx .- x, 2) <= tol
println(it)
break
end
# dual update
u .+= x - z
lastx[:] = z[:]
end
return z
end
m, n, k, sig = 200, 50, 100, 1e-3
A = rand(m, n)
x_true = rand(n)
b = A*x_true
x_admm = NNLS_admm(A, b, zeros(n))
println("ADMM")
println(" nnz(x) = $(norm(x_admm, 0))")
println(" obj value = $(0.5*norm(A*x_admm-b)^2 + lam*norm(x_admm, 1))")
(x_admm .- x_true)
plot(x_admm)
plot!(x_true)Metadata
Metadata
Assignees
Labels
No labels