@@ -15,12 +15,14 @@ mutable struct FBSIterator{I <: Integer, R <: Real, T <: BlockArray{R}} <: Proxi
1515 fq
1616 Aq
1717 g
18+ cost:: R
1819 gamma:: R
1920 maxit:: I
2021 tol:: R
2122 adaptive:: Bool
2223 fast:: Bool
2324 verbose:: I
25+ verbose_freq:: I
2426 theta:: R # extrapolation parameter
2527 y # gradient step
2628 z # proximal-gradient step
4244# ###############################################################################
4345# Constructor
4446
45- function FBSIterator (x0:: T ; fs= Zero (), As= Identity (blocksize (x0)), fq= Zero (), Aq= Identity (blocksize (x0)), g= Zero (), gamma:: R = - 1.0 , maxit:: I = 10000 , tol:: R = 1e-4 , adaptive= false , fast= false , verbose= 2 ) where {I, R, T}
47+ function FBSIterator (x0:: T ; fs= Zero (), As= Identity (blocksize (x0)), fq= Zero (), Aq= Identity (blocksize (x0)), g= Zero (), gamma:: R = - 1.0 , maxit:: I = 10000 , tol:: R = 1e-4 , adaptive= false , fast= false , verbose= 1 , verbose_freq = 100 ) where {I, R, T}
4648 n = blocksize (x0)
4749 mq = size (Aq, 1 )
4850 ms = size (As, 1 )
@@ -59,7 +61,7 @@ function FBSIterator(x0::T; fs=Zero(), As=Identity(blocksize(x0)), fq=Zero(), Aq
5961 Aqz_prev = blockzeros (mq)
6062 Asz_prev = blockzeros (ms)
6163 gradfq_Aqz_prev = blockzeros (mq)
62- FBSIterator {I, R, T} (x, fs, As, fq, Aq, g, gamma, maxit, tol, adaptive, fast, verbose, 1.0 , y, z, z_prev, FPR_x, Aqx, Asx, gradfq_Aqx, gradfs_Asx, 0.0 , 0.0 , 0.0 , At_gradf_Ax, Aqz_prev, Asz_prev, gradfq_Aqz_prev)
64+ FBSIterator {I, R, T} (x, fs, As, fq, Aq, g, R ( Inf ), gamma, maxit, tol, adaptive, fast, verbose, verbose_freq , 1.0 , y, z, z_prev, FPR_x, Aqx, Asx, gradfq_Aqx, gradfs_Asx, 0.0 , 0.0 , 0.0 , At_gradf_Ax, Aqz_prev, Asz_prev, gradfq_Aqz_prev)
6365end
6466
6567# ###############################################################################
@@ -70,21 +72,22 @@ maxit(sol::FBSIterator) = sol.maxit
7072converged (sol:: FBSIterator , it) = blockmaxabs (sol. FPR_x)/ sol. gamma <= sol. tol
7173
7274verbose (sol:: FBSIterator ) = sol. verbose > 0
73- verbose (sol:: FBSIterator , it) = sol. verbose > 0 && (sol. verbose == 1 ? true : (it == 1 || it% 100 == 0 ))
75+ verbose (sol:: FBSIterator , it) = sol. verbose > 0 && (sol. verbose == 2 ? true : (it == 1 || it% sol . verbose_freq == 0 ))
7476
7577function display (sol:: FBSIterator )
76- @printf (" %6s | %10s | %10s |\n " , " it" , " gamma" , " fpr" )
77- @printf (" ------|------------|------------|\n " )
78+ @printf (" %6s | %10s | %10s | %10s | \n " , " it" , " gamma" , " fpr" , " cost " )
79+ @printf (" ------|------------|------------|------------| \n " )
7880end
7981
8082function display (sol:: FBSIterator , it)
81- @printf (" %6d | %7.4e | %7.4e | \n " , it, sol. gamma, blockmaxabs (sol. FPR_x)/ sol. gamma)
83+ @printf (" %6d | %7.4e | %7.4e | %7.4e | \n " , it, sol. gamma, blockmaxabs (sol. FPR_x)/ sol. gamma, sol . cost )
8284end
8385
8486function Base. show (io:: IO , sol:: FBSIterator )
8587 println (io, (sol. fast ? " Fast " : " " )* " Forward-Backward Splitting" )
8688 println (io, " fpr : $(blockmaxabs (sol. FPR_x)) " )
8789 println (io, " gamma : $(sol. gamma) " )
90+ print ( io, " cost : $(sol. cost) " )
8891end
8992
9093# ###############################################################################
@@ -117,8 +120,9 @@ function initialize(sol::FBSIterator)
117120 sol. gamma = 1.0 / L
118121 end
119122
123+ sol. cost = sol. fq_Aqx+ sol. fs_Asx
120124 blockaxpy! (sol. y, sol. x, - sol. gamma, sol. At_gradf_Ax)
121- prox! (sol. z, sol. g, sol. y, sol. gamma)
125+ sol . cost += prox! (sol. z, sol. g, sol. y, sol. gamma)
122126 blockaxpy! (sol. FPR_x, sol. x, - 1.0 , sol. z)
123127
124128end
@@ -207,7 +211,8 @@ function iterate(sol::FBSIterator{I, R, T}, it) where {I, R, T}
207211 sol. f_Ax = sol. fs_Asx + sol. fq_Aqx
208212 end
209213 blockaxpy! (sol. y, sol. x, - sol. gamma, sol. At_gradf_Ax)
210- prox! (sol. z, sol. g, sol. y, sol. gamma)
214+ sol. cost = sol. f_Ax
215+ sol. cost += prox! (sol. z, sol. g, sol. y, sol. gamma)
211216 blockaxpy! (sol. FPR_x, sol. x, - 1.0 , sol. z)
212217
213218 return sol. z
0 commit comments